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.
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!
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.
- CPU (processing and control unit)
- memory (RAM: random access memory)
- mass storage
Stored programs keep program instructions / data in RAM
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.
- pure functions
- type safety vs. flexibility (think go's interfaces)
- Control theory
- memory segmentation
- Data link
- Network layer
- Transport layer
- Session layer
- Presentation layer
- Application layer
- Web sockets
- backing mechanisms (arrays, linked lists, etc.)
- O(N) iteration time, O(1)-O(N) access/modification time
- Map API:
- get, put, containsKey, etc.
- O(1) modification/access time, unless hash collisions
- O(1) modification/access time
- backing data structures: hashmaps, trees
- hash tables that are partitioned on multiple machines
- mechanism to resize hash tables while having to remap only a small subset of keys (total number of keys / number of slots/buckets)
- OWASP Top 10
- public/private keys
- Apache Lucene
- Servers, VMs, Hypervisors, bare-metal, containers
- EC2, VMs, VPSes, containers, cloud services
- other clouds
- tools: GatsbyJS, Hugo, etc.
- deploy to: Gatsby Cloud, Netlify, Vercel, AWS Amplify
- relational vs. non-relational
- SQL vs. NoSQL
- popular databases
- e.g., Redis
- support rotations
- support engineer organizations
- image processing
- 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
- vim vs. emacs
- reproducible environments
- Mac vs. Linux vs. Windows
- dev environments (Docker, Kind, devbox, etc.)
- build systems and dependency managers (e.g. Bazel, Gradle, Pip, cargo, npm, etc.)
- web apps