Photo: Software Engineer
Photo by Christina @ wocintechchat.com on Unsplash

Knowledge is a fractal - you can infinitely zoom in and expand your knowledge of a topic, which then reveals an infinity of sub topics, thus creating a never-ending cycle...

DISCLAIMER: None of the content on this page is complete (nor could it ever be). Over time, I will develop this content further and further, keeping the advice practical and relevant to generalist software engineers.

Introduction

I believe every 'great' engineer should have a baseline knowledge of a few topics. Having a solid knowledge foundation enables one to excel in a (or more than a) niche of their choosing. Lacking that foundation can be detrimental to one's impact on the projects or organizations they're part of!

Full transparency: I am adept at some of the topics listed below, but not all... I aim to improve my knowledge in all these areas by writing about these over a few months or more!

An investment in knowledge pays the best interest. - Ben Franklin

Today this is a list; in the future, I will develop each section and add valuable links to other resources.

I am curious to know what other engineers think! Please DM me suggestions, ideas, skills I missed, and any feedback!

What does full stack mean?

Full stack development means writing both the client-side (frontend) and server-side (backend) parts of applications. The final outcome is building complete application and/or websites, as well as setting up any instrumentation such as automated testing (QA) via Continuous Integration (CI) and continuously deploying (CD) code changes to production environments.

Hardware

Von Neumann architecture

https://en.wikipedia.org/wiki/Von_Neumann_architecture

  • CPU (processing and control unit)
  • memory (RAM: random access memory)
  • mass storage
  • I/O

Stored programs keep program instructions / data in RAM

Von Neumann architecture

In contrast, the Harvard architecture is a computer architecture with separate storage and signal pathways for instructions and data.

Modern CPUs use aspects of both.

Graphics, GPUs, monitors

Power

Input/Output

Software and programming languages

Language Design

https://www.red-gate.com/simple-talk/opinion/geek-of-the-week/rich-hickey-geek-of-the-week/

  • pure functions
  • type safety vs. flexibility (think go's interfaces)
  • immutability
  • etc.

Programming Paradigms

Object Oriented Programming

Functional Programming

Imperative

Software architecture and design patterns

  • CQRS
  • Control theory

Domain-Driven Development

Compiled languages

Compilers

  • frontends
  • backends

Interpreted languages

Systems engineering

Operating systems

Filesystems

System calls (syscalls)

Schedulers

Memory management

  • paging
  • memory segmentation

Networking

  • sockets
  • selectors
  • etc.

OSI model

https://en.wikipedia.org/wiki/OSI_model

  • Physical
  • Data link
  • Network layer
  • Transport layer
  • Session layer
  • Presentation layer
  • Application layer

Useful networking protocols

  • TCP/IP
  • UDP
  • DNS
  • HTTP1.1/2
  • Web sockets
  • WebRTC
  • etc.

Generalist knowledge

Algorithms

Algorithmic complexity

Sorting Algorithms

Graph Algorithms

Finite state machines

Parallel programming

Data structures

Lists

  • backing mechanisms (arrays, linked lists, etc.)
  • O(N) iteration time, O(1)-O(N) access/modification time

Hashmaps/Hashtables

  • Map API:
    • get, put, containsKey, etc.
  • O(1) modification/access time, unless hash collisions

Sets

  • O(1) modification/access time
  • backing data structures: hashmaps, trees

Distributed hash tables

  • hash tables that are partitioned on multiple machines

Consistent hashing

  • mechanism to resize hash tables while having to remap only a small subset of keys (total number of keys / number of slots/buckets)

Security

  • OWASP Top 10

Cryptography

  • public/private keys
  • SSL/TLS

Observability, monitoring, telemetry

  • Logstash
  • Grafana
  • Opentracing
  • Apache Lucene
  • SOLR
  • ElasticSearch

Infrastructure and hosting

Self-hosted

  • Servers, VMs, Hypervisors, bare-metal, containers
  • EC2, VMs, VPSes, containers, cloud services
  • Kubernetes

Cloud services

  • Infrastructure-as-a-service
  • Platform-as-a-service
  • Kubernetes
  • AWS
  • GCP
  • Azure
  • other clouds

JAMstack

https://jamstack.org/

  • Javascript, API, and Markup
  • tools: GatsbyJS, Hugo, etc.
  • deploy to: Gatsby Cloud, Netlify, Vercel, AWS Amplify

Specializations

Backend software engineering

App Servers

Databases

  • relational vs. non-relational
  • SQL vs. NoSQL
  • popular databases

Caches

  • e.g., Redis

Message queues

CDNs

Performance/benchmarking

Concurrency

Parallelism

Distributed Systems

System Design and Scaling

API Design

Code Reviews

Production Support

  • support rotations
  • support engineer organizations

Debugging

Data science

Artificial Intelligence

Machine Learning

  • Supervised
  • Unsupervised

Computer vision

  • image processing

Neural Networks

Deep Learning

System/service reliability engineers (SREs)

  • automate everything
  • measure everything
  • manage incidents
  • use SLOs (measurements for your service from your user's point of view; pick a reasonable target!) e.g.: 99.5% of requests will complete without error within 2000ms
  • encourage and enable cross-team collaboration

Developer Productivity engineers

  • CI/CD
  • IDEs
  • vim vs. emacs
  • reproducible environments
  • Mac vs. Linux vs. Windows
  • fast-typing
  • shortcuts
  • IDEs
  • dev environments (Docker, Kind, devbox, etc.)
  • build systems and dependency managers (e.g. Bazel, Gradle, Pip, cargo, npm, etc.)

Network engineers

Security engineers

Frontend software engineering

The stack:

  • web apps
  • browser
  • Backend
  • OS
  • BIOS/UEFI

Mobile engineers

iOS

Android

Web/PWAs/native compilation

If you enjoyed this post, please share it with your friends!