A collection of learning resources for curious software engineers
Table of Contents
- Principles - Contributing to this list - Must-read books - Must-read articles - Other general material and list of resources - Other lists - Books - Articles - Axioms - Courses - Topics - Accounting - Agentic coding - Algorithm and data structures - API design & development - Attitude, habits, mindset - Procrastination - Authentication/authorization - Automation - Best practices - Beyond software engineering & random - Biases - Business - Buy vs. Build - Cache - Career growth - Choosing your next/first opportunity - Getting to Staff Eng - Characters sets - Chess - Clouds - Code reviews - Coding & code quality - Communication - Compilers - Configuration - Continuous Integration (CI) - Data analysis & data science - Databases - Internals - NoSQL - Postgres - Data formats - Data science/data engineering - Debugging - Design (visual, UX, UI, typography) - Design (OO modeling, architecture, patterns, anti-patterns, etc.) - Design: database schema - Design: patterns - Design: simplicity - Dev environment & tools - Docker - Documentation - Dotfiles - Editors & IDE - Vim - Email - Engineering management - Exercises - Experimentation - Fonts - Functional programming (FP) - Games development - Generative AI - Graphics - Hardware - HTTP - Humor - Incident response (oncall, alerting, outages, firefighting, postmortem) - Postmortem - Internet - Interviewing - Kubernetes - Large Language Model (LLM) - Learning & memorizing - Licenses (legal) - Linux (system management) - Low-code/no-code - Low-level, assembly - Machine learning/AI - Math - Marketing - Network - Observability (monitoring, logging, exception handling) - Logging - Error/exception handling - Metrics - Monitoring - Open source - Operating system (OS) - Over-engineering - Performance - Personal knowledge management (PKM) - Personal productivity - Perspective - Privacy - Problem solving - Product management for software engineers - Project management - Programming languages - Python - JavaScript - Garbage collection - Programming paradigm - Public speaking (presenting) - Reading - Refactoring - Regex - Releasing & deploying - Versioning - Checklists - Feature flags - Testing in production - Reliability - Integration patterns (dependency management) - Resiliency - Search - Security - Research papers - Shell (command line) - SQL - State - System administration - System architecture - Architecture patterns - Microservices/splitting a monolith - Scalability - Site Reliability Engineering (SRE) - Technical debt - Testing - Tools - Type system - Typography - Version control (Git) - Work ethics, productivity & work/life balance - Web development - Writing (communication, blogging) - Resources & inspiration for presentations - Keeping up-to-date - Concepts - My other listsProfessional Programming - about this list
Give me six hours to chop down a tree and I will spend the first four sharpening the axe. (Abraham Lincoln)
A collection of full-stack resources for programmers.
The goal of this page is to make you a more proficient developer. You'll find only resources that I've found truly inspiring, or that have become timeless classics.
Principles
- This page is not meant to be comprehensive. I am trying to keep it light and not too overwhelming.
- The selection of articles is opinionated.
- I don't necessarily agree with or endorse every single line that is written in every single one of those resources. The same applies to their authors: I don't endorse everything each of those authors has said and will ever say.
- 🧰 : list of resources
- 📖 : book
- 🎞 : video/movie extract/movie/talk
- 🏙 : slides/presentation
- ⭐️ : must-read
- 📃 : paper
Contributing to this list
Feel free to open a PR to contribute!
I will not be adding everything: as stated above, I am trying to keep the list concise.
Must-read books
I've found these books incredibly inspiring:
- 📖 The Pragmatic Programmer: From Journeyman to Master: hands-on the most inspiring and useful book I've read about programming.
- 📖 Code Complete: A Practical Handbook of Software Construction: a nice addition to The Pragmatic Programmer, gives you the necessary framework to talk about code.
- 📖 Release It!: this books goes beyond code and gives you best practices for building production-ready software. It will give you about 3 years worth of real-world experience.
- 📖 Scalability Rules: 50 Principles for Scaling Web Sites
- 📖 The Linux Programming Interface: A Linux and UNIX System Programming Handbook: outside of teaching you almost everything you need to know about Linux, this book will give you insights into how software evolves, and the value of having simple & elegant interfaces.
- 📖 Structure and interpretation of Computer Programs (free): One of the most influential textbooks in Computer Science (written and used at MIT), SICP has been influential in CS education. Byte>) recommended SICP "for professional programmers who are really interested in their profession".
- 📖 Professional software development: pretty complete and a good companion to this page. The free chapters are mostly focused on software development processes: design, testing, code writing, etc. - and not so much about tech itself.
- 🧰 vhf/free-programming-books
- 🧰 EbookFoundation/free-programming-books
Must-read articles
- Practical Advice for New Software Engineers
- On Being A Senior Engineer
- Lessons Learned in Software Development: one of those articles that give you years of hard-earned lessons, all in one short article. Must read.
- Things I Learnt The Hard Way
- Signs that you're a good programmer (not everything in here is great - some of the points are counterproductive)
- Expert Generalists, martinfowler.com, proposes an interesting take on the "T-shaped engineer"
Other general material and list of resources
Other lists
Books
- 📖 The Imposter's Handbook - \$30. From the author: "Don't have a CS Degree? Neither do I - That's why I wrote this book."
- 📖 The Computer Science Book
- 📖 The Software Engineer's Guidebook: Gergely Orosz's guidebook to the software engineering industry. Extremely complete.
Articles
- mr-mig/every-programmer-should-know: a collection of (mostly) technical things every software developer should know
- Famous Laws Of Software Development
- The Amazon Builders' Library
- kdeldycke/awesome-falsehood: Falsehoods Programmers Believe in
- hellerve/programming-talks
- TechYaks: list of talks
- Talks that changed the way I think about programming
- What every computer science major should know
- kamranahmedse/developer-roadmap
- mtdvio/every-programmer-should-know: a collection of (mostly) technical things every software developer should know about
- Mike Acton’s Expectations of Professional Software Engineers
- Things they didn't teach you about Software Engineering
- Teach Yourself Programming in Ten Years
- Mistakes You Apparently Just Have to Make Yourself
- The Best Programmers I Know
- Laws of Software Engineering
Axioms
- Data is better than code. - Correctness is more important than performance. - Deterministic beats heuristic. - One hundred lines of simplicity is better than twenty lines of complexity. - If your abstractions are leaking, it's not due to some law of the universe; you just suck at abstracting. Usually, you didn't specify the abstraction narrowly enough. - If you avoid changing a section of code for fear of awakening the demons therein, you are living in fear. If you stay in the comfortable confines of the small section of the code you wrote or know well, you will never write legendary code. All code was written by humans and can be mastered by humans. - If there's clearly a right way to do something and a wrong way, do it the right way. Coding requires incredible discipline. - The best way to get the right answer is to try it the wrong way. - Practice tells you that things are good or bad; theory tells you why. - Not being qualified to solve a problem is no reason not to solve it. - If you don't understand a system you're using, you don't control it. If nobody understands the system, the system is in control.- Embedded Rules of Thumb
- 50 Ideas That Changed My Life
- Reflections on 10,000 Hours of Programming
- 20 Things I've Learned in my 20 Years as a Software Engineer
Courses
- Google Tech Dev Guide
- The Missing Semester of Your CS Education, MIT. Includes lectures about the shell, editors, data wrangling, git, debugging and profiling, meta programming, security and cryptography.
- Mathematics for the adventurous self-learner, Neil Sainsbury
- jwasham/coding-interview-university: a complete computer science study plan to become a software engineer.
- Teach Yourself Computer Science: an opinionated set of the best CS resources.
- ossu/computer-science: free self-taught education in Computer Science!
Topics
Accounting
Agentic coding
Algorithm and data structures
- Read the CLRS. You can watch and download the course on OCW - there are newer courses as well.
- Or The Algorithm Design Manual (Skiena)
- Try out some algorithms on Project Euler
- CS 61B Spring 2023
- Algorithms, Jeff Erickson
- Grokking Algorithms
- Essential Algorithms
- Data Structure Visualization
- 🎞 15 Sorting Algorithms in 6 Minutes
- Hashing
- Visualizing Algorithms
- B-trees and database indexes
- Big O visualizations
- Algorithm explained like Ikea instructions
- Decision Trees
- trekhleb/javascript-algorithms: algorithms and data structures implemented in JavaScript
- The Algorithms
API design & development
General REST content:
- Architectural Styles and the Design of Network-based Software Architectures, Roy Fielding (the inventor of REST)
- A collection of useful resources for building RESTful HTTP+JSON APIs.
- Best practices for REST API design, Stack Overflow Blog
- 📖 Undisturbed REST: a guide to designing the perfect API: very complete book about RESTful API design.
- Microsoft's Rest API guidelines
- Zalando RESTful API and Event Scheme Guidelines
- Google's API Design Guide: a general guide to design networked API.
- AIP-1: AIP Purpose and Guidelines
More specific topics:
- Why you should use links, not keys, to represent relationships in APIs, Martin Nally, Google
Attitude, habits, mindset
- Mastering Programming, Kent Beck.
- The traits of a proficient programmer
- The tao of programming: a set of parables about programming.
- Taking Ownership Is The Most Effective Way to Get What You Want
- Finding Time to Become a Better Developer
- Ten minutes a day: how Alex Allain wrote a book in less than 200 hours, by writing 10 minutes every_ day.
- The care and feeding of software engineers (or, why engineers are grumpy)
- The Product-Minded Software Engineer, Gergely Orosz
- 40 Lessons From 40 Years, Steve Schlafman
- Fixed vs. Growth: The Two Basic Mindsets That Shape Our Lives
- What does a great software engineer look like?
- Good sleep, good learning, good life
- 🎞 Steve Jobs: if you don't ask for help, you won't get very far
- Programming quotes
- Be Kind
- Advice for new software devs who've read all those other advice essays
- Microservices aren't the problem. Incompetent people are
- High Agency (30-min read)
- What is "good taste" in software engineering?: it's all about contextual tradeoff.
Imposter syndrome is underrated: a lot of talk goes into overcoming imposter syndrome. I say embrace self-skepticism and doubt yourself every day. In a fast-moving industry where lots of your knowledge expires every year, even the most junior people around you constantly cook up skills you don't have; you stay competitive by applying with the determination (and even fear) of the novice. The upside of this treadmill is that every engineer is on it: just because you're an imposter doesn't mean that other people are more deserving than you, because they're imposters too. You should advocate for yourself, take risks, pat yourself on the back when things go well, and, as you start to build a track record of solving problems, trust your skills and adaptability. Just make no mistake: you're only as good as the last problem you solve.
Dan Heller, Building a Career in Software
I had learned already never to empty the well of my writing, but always to stop when there was still something there in the deep part of the well, and let it refill at night from the springs that fed it. -- Ernest Hemingway
- The Grug Brained Developer: habits of self-aware programmer. Like Tao of Programming, different style.
Good judgment comes from experience.
Experience comes from bad judgment.
Procrastination
- News misleads - News is irrelevant - News has no explanatory power - News is toxic to your body - News increases cognitive errors - News inhibits thinking - News works like a drug - News wastes time - News makes us passive - News kills creativityAuthentication/authorization
- Authorization in a microservices world
- Authorization Logic: Rules are hard because they evolve over time
- The Copenhagen Book provides a general guideline on implementing auth in web applications
Automation
Best practices
Beyond software engineering & random
Biases
Biases don't only apply to hiring. For instance, the fundamental attribution bias also applies when criticizing somebody's code written a long time ago, in a totally different context.
- Cognitive bias cheat sheet. #hiring
Business
- Payments 101 for a Developer
- The 4 biggest problems with homemade billing systems
- 🦑 The 14 pains of building your own billing system
Buy vs. Build
- The reason we want to buy as much as possible is that an organisation has a limited capacity for expertise, so we don’t want to have to become experts on things that don’t make up a competitive advantage. - If someone tells me they can build something cheaper than a vendor, I’m immediately skeptical because I don’t think most people can accurately forecast the actual cost of maintenance in the long term.Cache
- Caching challenges and strategies, Amazon Builders Library
Career growth
- The Conjoined Triangles of Senior-Level Development looks into how to define a senior engineer.
- Ten Principles for Growth as an Engineer, Dan Heller.
- Don't Call Yourself a Programmer, Patrick McKenzie.
- On being an Engineering Manager
- The career advice I wish I had at 25
- Why Good Developers are Promoted into Unhappiness, Rob Walling. Or why management might not be for you.
- A guide to using your career to help solve the world’s most pressing problems
- What's a senior engineer's job? You need to be more than just an individual contributor.
- From Coding Bootcamp Graduate to Building Distributed Databases
- 🏙 The Well Rounded Engineer includes lots of great book recommendations.
- Some career advice, Will Larson.
- Evil tip: avoid "easy" things
- The Ultimate Code Kata
- Traits of a senior software engineer: impact, perception, visibility, influence, mentoring
- Software Engineering - The Soft Parts
- Senior Engineers are Living in the Future
- What would a map of your career look like?
- How to be successful at Amazon (or any other large company for that matter)
- Being good isn’t enough
- Stop Avoiding Politics is a good contrarian take on the current (negative) connotation of the word "politics".
Choosing your next/first opportunity
Getting to Staff Eng
- Software engineering isn’t just coding. Actually, coding is a small part of it. - Pipeline your work - Be open to feedback and listen. Like, seriously, listen. - Great feedback is hard to find; treasure it. - Keep an eye on the horizon (but not both). - Figure out what matters and let the rest go. - Comparison really is the thief of joy. - Mentorship is a beautiful thing. - Good days, in general, don’t just “happen”. - Advice and guidance are just that; they aren’t rules.- Guides for reaching Staff-plus engineering roles, Will Larson
- Staff archetypes, Will Larson
Characters sets
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
- The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 (Still No Excuses!)
Chess
(yes - chess gets its own section :)
Clouds
- open-guides/og-aws: a practical guide to AWS
Code reviews
- How to do a code review, Google's engineering practices documentation.
- Post-Commit Reviews: an interesting idea to increase developer velocity (there are some caveats though).
- How to Make Your Code Reviewer Fall in Love with You
- How to Do Code Reviews Like a Human
- Ask HN: How do you review code?: great discussion on HackerNews, full of interesting ideas.
- Maslow's pyramid of code reviews
- Code review in remote teams: very complete set of rules.
- No code reviews by default
Coding & code quality
- Write code that is easy to delete, not easy to extend
- The Ten Commandments of Egoless Programming
- 📖 Clean Code: A Handbook of Agile Software Craftsmanship, Robert C. Martin. Describes numerous useful best practices. A bit long. There's also a clean code cheatsheet.
- What Software Craftsmanship is about
isEachUserLoggedIn is better than areUsersLoggedIn or isUsersLoggedIn)
- Avoid custom prefixes (isPaidFor is better than wasPaidFor)
- Avoid negatives (isEnabled is better than isDisabled)
- How To Write Unmaintainable Code
- kettanaito/naming-cheatsheet: : comprehensive language-agnostic guidelines on variables naming. Home of the A/HC/LC pattern.
- 🧰 Quality Engineering Guides
- What Makes Code Hard To Read: Visual Patterns of Complexity
- zakirullin/cognitive-load: 🧠 Cognitive Load is what matters
- How to create software quality
Communication
See also the Writing section
- Lots of concrete advice and examples for short, medium and long-form writingCompilers
- The Compiler Writer Resource Page
- kanaka/mal: mal - Make a Lisp
- Let's Build a Compiler, Jack W. Crenshaw, 1988
- Writing a C Compiler, in Zig
Configuration
- The downsides of JSON for config files, Martin Tournoij.
Continuous Integration (CI)
- Continuous Integration, MartinFowler.com
Data analysis & data science
- Don’t share the raw data - Don’t share your methodology - Don’t include confidence intervals - Don’t challenge your own data- 📖 Python Data Science Handbook, O'Reilly
Databases
See also the SQL section.
- A plain English introduction to CAP Theorem
- PACELC theorem: "in case of network partitioning (P) in a distributed computer system, one has to choose between availability (A) and consistency (C) (as per the CAP theorem), but else (E), even when the system is running normally in the absence of partitions, one has to choose between latency (L) and consistency (C)."
- Zero downtime database migrations (code examples are using Rails but this works great for any programming language)
- Readings in Database Systems, 5th Edition
- Comparing database types: how database types evolved to meet different needs
- How does a relational database work
- Use the index, Luke
- Course introduction — MySQL for Developers, PlanetScale
- Why you should probably be using SQLite | Epic Web Dev
- 📖 Database Internals
- How Figma's Databases Team Lived to Tell the Scale: interesting story about sharding
Internals
- How Query Engines Work
- Let's Build a Simple Database
- Algorithms Behind Modern Storage Systems, ACM Queue
- sorted string tables (SST) from first principles
NoSQL
- NOSQL Patterns
- NoSQL Databases: a Survey and Decision Guidance
- The DynamoDB docs has some great pages:
Postgres
- Safe Operations For High Volume PostgreSQL (this is for PostgreSQL but works great for other DBs as well).
- Transaction Isolation in Postgres, explained
- PostgreSQL exercises
- Postgres operations cheat sheet
- Postgres: don't Do This
- PostgreSQL and UUID as primary key
- Postgres lock explained
Data formats
- Falsehoods Programmers Believe About Phone Numbers, Google's
libphonenumber. - Rules for Autocomplete: rough specifications for autocomplete fields
- Falsehoods programmers believe about addresses
- Falsehoods Programmers Believe About Names
- kdeldycke/awesome-falsehood: falsehoods programmers believe in
- Understanding UUIDs, ULIDs and String Representations
- Falsehoods Programmers Believe About Falsehoods Lists
- Australia/LordHowe is the weirdest timezone
- A love letter to the CSV format
- Falsehoods Programmers Believe About Aviation
- Schemas - Schema.org
- ZIP Code First
- Fintech Engineering Handbook
Data science/data engineering
- A dirty dozen: twelve common metric interpretation pitfalls in online controlled experiments
- datastacktv/data-engineer-roadmap: roadmap to becoming a data engineer
- Awesome Data Engineering Learning Path
- Emerging Architectures for Modern Data Infrastructure
- How to Move Beyond a Monolithic Data Lake to a Distributed Data Mesh
- MLOps
- Uber's Big Data Platform: 100+ Petabytes with Minute Latency
- SQL should be the default choice for data transformation logic
Debugging
Also see the Incident Response section in this doc
- The real problem reveals itself when the technique becomes a part of a template. - Action items can be very distant from the root cause. - Related article: The Evolution of SRE at Google- The Infinite Hows criticizes the five whys method and advocates for a different set of questions to learn from the most from incidents.
README truncated. View on GitHub