Introduction
This book is just a dump of links I keep collecting as I progress as a software programmer. I use it to have a personal log of good stuff I discover while wandering about in the web.
While perusing the vast array of articles, books, videos, etc. linked, one must keep in mind that the focus of learning to code1 should always be on learning abstract concepts and their low-level implementation details, which underlie the tech stack used in modern software, rather than specific and ephemeral tools (e.g. libraries, frameworks, etc.):
Modern programming is becoming complex, uninteresting, full of layers that just need to be glued. It is losing most of its beauty. In that sense, most programming is no longer art nor high engineering (most programs written at big and small corporations are trivial: coders just need to understand certain ad-hoc abstractions, and write some logic and glue code). Only very few programmers are facing the artistic face of programming. Only very few programmers are facing high engineering in programming.
Salvatore Sanfilippo2
In fact, an application software usually consists of levels (or layers) of abstraction, wherein each level represents a different model of the same information and processes, but with varying amounts of detail. Each relatively abstract, higher level builds on a relatively concrete, lower level, which tends to provide an increasingly granular representation.
Abstractions are useful, but all non-trivial abstractions, to some degree, are leaky3. So, blindly ignoring what happens at lower levels can cause performance issues or (worst) unintended bugs which are hard to debug (e.g. inscrutable incidents in production4). Solving such issues thanks to Q&A websites like Stack Overflow does not help learning what actually went wrong leaving a certain sense of frustration (a common feeling for Linux users5).
Unfortunately, the enterprise software world is largely dominated by the use of frameworks (e.g. Spring vs Quarkus on the backend, Angular vs React on the frontend), an abstraction which is useful to avoid code bloat but limits the creative job of a programmer, making him just an expert user of a particular framework. These frameworks are also susceptible to be replaced by other competing frameworks, generically perceived as "innovative" for some reason. The only way to avoid to be forced to learn a framework every N years is to understand what happens behind the abstractions, which means to develop a good intuition of what happens at the hardware/software interface (getting closer to the metal, as the kool kids say). This is why so frequently people attempt to re-implement from scratch a good piece of software to understand "how things work"6.
Undoubtedly, this crafting or artistic view7 of the act of programming implies a longer (lifelong8?) and steeper learning curve than any fancy YouTube tutorial would commit to, but this is still better than getting stuck in a plateau after a brief exponential growth where developers end up acting merely as code monkeys or blue collars. Sometimes the working environment of IT companies with big moneys itself tricks you into:
voluntarily ceasing to improve because of a belief that expert status has been reached and thus further improvement is not possible.. This opting into indefinite mediocrity is the entry into an oblique phase in skills acquisition that I will call "Expert Beginner"[^10].
In this respect, the following chapters naturally derail from application programming to system programming, and finally to hardware stuff. The last chapters mostly deal with collateral and/or enjoyable aspects of programming.
Jamis Buck, LEGOs, Play-Doh, and Programming
Joel Spolsky, The Law of Leaky Abstractions
Andrew Doss, How Long is a Negative Timeout?
Fabien Sanglard, A Linux evening...
Julia Evans, Get better at programming by learning how things work
Peter Norvig, pytudes
Peter Norvig, Teach Yourself Programming in Ten Years
Erik Dietrich, How Developers Stop Learning: Rise of the Expert Beginner
Teaching Yourself CS
- Teach Yourself Programming in Ten Years
- Teach Yourself Computer Science
- Path to a free self-taught education in Computer Science!
- From the Transistor to the Web Browser
- Learn How Computers Work
Programming Languages
- C > C++ >
- Tcl > Lua
- Java >
- Python > Nim
- Ruby > Crystal
- Erlang > elixir > Gleam
- Lisp > Scheme >
- Haskell
- OCalm
Compilers
Algorithms & Data Structures
- Asymptotic notation
- Sedgewick & Wayne, Algorithms (https://algs4.cs.princeton.edu/home)
- Open Data Structures
- Data Structures & Algorithms I Used Working at Tech Companies
- Visualizing Algorithms
- Data Structure Visualizations
- Learn by means of deliberate practice:
- Data Structures:
- Algorithms:
- Patterns:
- The Algorithmic Beauty of Plants
- Dynamic Programming is not Black Magic
Software Design
- Ousterhout, A Philosophy of Software Design
- Software Design by Example
- Foote & Yoder, Big Ball of Mud
- Martin, Clean Code
- Hunt & Thomas, The Pragmatic Programmer: From Journeyman to Master
- Brooks, The Mythical Man-Month
- Fowler, Patterns of Enterprise Application Architecture
- GoF, Design Patterns: Elements of Reusable Object-Oriented Software
- Martin, Clean Code: A Handbook of Agile Software Craftsmanship
- Beck & Fowler, Refactoring: Improving the Design of Existing Code
- Winters et al., Software Engineering at Google: Lessons Learned from Programming Over Time
- Software Design Approaches:
- Test-driven development (TDD)
- Behavior-driven development (BDD)
- Domain-driven design (DDD)
- Norman, The Design of Everyday Things
- Alexander, A Pattern Language: Towns, Buildings Construction
- Meadows, Thinking in Systems: A Primer
- Hermans, The Programmer's Brain: What every programmer needs to know about cognition
- Worse is better
- My 10 Years of Programming Experience
Testing
- Software testing
- Testing Levels:
- Unit testing
- Mutation Testing
- Integration testing
- System testing
- Smoke testing
- Chaos engineering
- Acceptance testing
- Unit testing
- Software Testing Anti-patterns
- Test Fixture
- TestDouble
- Mocks Aren't Stubs
- Combining Object Mother and Fluent Builder for the Ultimate Test Data Factory
- Google Testing Blog
Inter-Process Communication (IPC)
- Inter-Process Communication in a Microservices Architecture
- Approaches:
- Legacy Technologies:
- Simple Object Access Protocol (SOAP)
- Remote Method Invocation (RMI)
- Common Object Request Broker Architecture (CORBA)
- Synchronous Communication:
- Asynchronous Communication:
- Message Queues
- Publish-Subscribe Pattern
- Protocols:
- Sockets:
- Network Sockets:
- TCP
- HTTP/1, HTTP/2 and HTTP/3
- HTTP/3 explained Real-time communication protocols:
- [UDP
- TCP
- Unix Domain Sockets
- Network Sockets:
- Messaging:
- AMQP
- MQTT
- STOMP
- Sockets:
- An introduction to APIs
- Difference between SPI and API
- Gough et al., Mastering API Architecture
- Free Public APIs for Developers
I/O
- Input/output
- Async IO fundamentals
- Asynchronous vs. non-blocking calls
- Asynchronous Programming Under Linux
- Explain non-blocking I/O like I’m five
- Nonblocking I/O
- epoll: The API that powers the modern internet
- The method to epoll’s madness
- Non-blocking I/O with regular files
- Why you should use io_uring for network I/O
- 5 Things to Know About Reactive Programming
- The introduction to Reactive Programming you've been missing
- Userland Disk I/O
- Introduction to Reed-Solomon
Databases
- Introduction to SQL
- ByteScout SQL Trainer
- 50 Years of Queries
- Intro to Database Systems (CMU 15-445/645)
- Readings in Database Systems ("Red Book")
- Petrov, Database Internals
- Petrov, What Every Programmer has to know about Database Storage
- Comparing Database Types
- Use the Index, Luke! A Guide to Database Performance for Developers
- Consistency Models
- The Querynomicon
- Things You Should Know About Databases
- Things I Wished More Developers Knew About Databases
- Database design basics
PostgreSQL
- Learning PostgreSQL Internals
- How Postgres Stores Data on Disk
- Understanding Postgres Performance
- The Part of PostgreSQL We Hate the Most
- Yes, PostgreSQL Has Problems. But We’re Sticking With It!
- Nine ways to shoot yourself in the foot with PostgreSQL
- Understanding the Postgres Hackers Mailing List Language
- What I Wish Someone Told Me About Postgres
- pgdoc ⚡ link
- psql tips
- Postgres Tips & Tricks
- Postgres for Everything
Data Management
- Data Lake vs. Data Warehouse vs. Data Lakehouse
- Data Mesh vs. Data Fabric vs. Data Lake
- Data Mesh Architecture
- Object Storage
- The Ultimate Guide to Table Format Internals
- Behind AWS S3’s Massive Scale
Microservices, Distributed Systems & System Design
- Learning about distributed systems: where to start?
- Microservices Patterns
- Patterns of Distributed Systems
- Vitillo, Understanding Distributed Systems. What every developer should know about large distributed applications
- Newman, Building Microservices (2nd ed.)
- Kleppmann, Designing Data-Intensive Applications
- Martin, The System Design Primer
- The Twelve Factors
- The Reactive Principles. Design Principles for Distributed Applications
- Testing Distributed Systems
- The System Design Template I Use
- The Architecture of Open Source Applications
- Architecture Playbook
- Jepsen
- ByteByteGo
- ByteByteGoHq/system-design-101
- System Design Interview
- MIT 6.824 Distributed Systems (Spring 2020)
- So you want to write a GUI framework
- The Raft Consensus Algorithm
- Retries. An interactive study of common retry methods
- Fly.io distributed systems challenges
- A Distributed Systems Reading List
- Raft. Understandable Distributed Consensus
- The Log: What every software engineer should know about real-time data's unifying abstraction
Cloud Computing, Containers & DevOps
- An Introduction to Kubernetes
- What is a Container Image?
- Container Image Formats Under the Hood
- A Practical Introduction to Container Terminology
- Learning Containers From The Bottom Up
- Containers Are Chroot with a Marketing Budget
- A Beginner's Guide to Building DevOps Pipelines With Open Source Tools
- The Cloudy Layers of Modern-Day Programming
- Free for Developers
Local-First
- The Cloud Is a Prison
- Local-first software
- Some notes on Local-First Development
- An Interactive Intro to CRDTs
- Local-first Web Development
Self-Hosting
Security
- API authentication and authorization
- HTTP Security Headers
- An Introduction to OAuth 2
- Identity, Claims, & Tokens. An OpenID Connect Primer: 1, 2, 3
- jwt.io
- Awesome Web Security Awesome
- McDonald, Web Security for Developers
- Zalewski, Tangled Web. A Guide to Securing Modern Web Applications
- OWASP Cheat Sheet Series
- Practical Cryptography for Developers
- Web Security Academy (n.b. this course is the updated version of the book 'The Web Application Hacker's Handbook')
- See this page fetch itself, byte by byte, over TLS
- The Illustrated TLS 1.3 Connection
- the cryptopals crypto challenges
- Flipper Zero
- HTB Cybersecurity Courses
- Anatomy of a GPG Key
- Mikko Hypponen, The History and the Evolution of Computer Viruses
Networking, Web & Browsers
- What is a network?
- Learn how the Internet works
- An Introduction to Networking Terminology, Interfaces, and Protocols
- Introduction to Networks
- Computer Networks: A Systems Approach
- Grigorik, High Performance Browser Networking: What every web developer should know about networking and web performance
- Computer Networking Fundamentals
- Daryl's TCP/IP Primer
- Packet Traveling
- Everything you never knew about NATs and wish you hadn't asked
- Beej's Guide to Network Programming
- Beej's Guide to Networking Concepts
- Beej's Guide to Unix Interprocess Communication
- Michael W. Lucas, Networking for System Administrators
- Sanders, Practical Packet Analysis
- Protohackers. Server programming challenge
- SRE books
- Web Technology for Developers
- Web Browser Engineering
- HTTP Toolkit
- SSL Termination
- Web Scraping
- Four Ways to Build Web Apps
- The Web's Next Transition
- The Future of Web Software Is HTML-over-WebSockets
- How to Port Forward on Your Router
- Self hosting in 2023
- All software is web software now
- How Did I Get Here?
- Who Controls the Internet? And should they?
- Web Development History. Internet history for the technically curious
- The Web’s Grain
- The small web is beautiful
- The "Cheap" Web
- Poor Man's Web
- Web Design Museum
- The Whimsical Web
- The Web Is Fucked
- The Web We Lost, and The Web We Must Rebuild
- Ethernet For Hackers: The Very Basics
- TCP Puzzlers
- The Copenhagen Book
HTML & CSS & JS
- HTML for people
- Learn to Code HTML & CSS
- 180 websites in 180 days
- htmldog
- Learn Web Development
- Responsive Web Design
- The Modern JavaScript Tutorial
- Four Eras of JavaScript Frameworks
- Move over JavaScript: Back-end languages are coming to the front-end
- Visual design rules you can safely follow every time
- CSS Selectors: A Visual Guide
- Can I use?
- SVG Tutorial
- ngrok, lvh.me and nip.io: A Trilogy for Local Development and Testing
- Weird HTML Hacks
- Web design inspiration catalog
- Learn CSS Layout
- JSON Canvas
- CSS for printing to paper
UNIX/Linux
- What is GNU/Linux?
- Unix wars
- Unix philosophy
- Introduction to Bash
- Bash Guide for Beginners
- Survival guide for Unix newbies
- Settling into Unix
- Shell programming with bash: by example, by counter-example
- Sculpting text with regex, grep, sed, awk, emacs and vim
- RegexOne. Learn Regular Expressions with simple, interactive exercises
- Vim for Humans
- Pro Git
- The Art Of Scripting HTTP Requests Using Curl
- How I use cron in Linux
- Getting started with tmux
- Tmux for mere mortals
- Hausenblas, Learning Modern Linux. A Handbook for the Cloud Native Practitioner
- Linux Hardening Guide
- Linux Survival
- Linux Journey
- Learn Git Branching
- Vim Adventures
- Unix for Poets
- The Unix Game
- Awesome UNIX®
- Cool, but obscure Unix tools
- Cool, but obscure X11 tools
- Linux Kernel Map
- Programming the Kernel with eBPF
- Introduction to immutable Linux systems
- An overview of Nix in practice
- Linux Network Performance Ultimate Guide
- Robert Elder's Guide To GNU Coreutils
- The Linux audio stack demystified
- Optimizing Linux for Slow Computers
- Searchable Linux Syscall Table
System Programming
- What Does It Take to Make a Kernel?
- Core Knowledge That Modern Linux Kernel Developer Should Have
- A Beginner’s Guide to Linux Kernel Development (LFD103)
- Getting started with Linux kernel development
- Linux From Scratch
- Beyond Linux® From Scratch (systemd Edition)
- Think OS. A Brief Introduction to Operating Systems
- Computer Systems: A Programmer's Perspective
- Dive into Systems
- Kernighan and Pike, The Unix Programming Environment
- Kerrisk, The Linux Programming Interface
- Rubini, Linux Device Drivers
- Love, Linux System Programming
- Bovet and Cesati, Understanding the Linux Kernel
- Kernelnewbies
- The Linux Kernel documentation
- The Linux Kernel Module Programming Guide
- Linux Kernel Teaching
- Learning operating system development using Linux kernel and Raspberry Pi
- Beej's Guide to C Programming
- Hack The Kernel
- Linux kernel system calls for all architectures
- OSDev.org
Terminal
- Terminal Guide
- What is the difference between Terminal, Console, Shell, and Command Line?
- A Brief Introduction to termios: termios(3) and stty
- Serial Programming/termios
- A Brief Introduction to termios: termios(3) and stty
- Terminal Control Commands
- infocmp - Compare or print the terminal description
- Anatomy of a Terminal Emulator
- ANSI escape code
- Want to create a TUI application? - The Basics of "Uncooked" Terminal IO
- A new way of drawing boxes in the terminal (possibly)
- Javascript Box Drawing Demo
- VT100.net
From Scratch
Tutorials:
- Build Your Own Text Editor
- Build Your Own Redis with C/C++
- Rebuilding Redis in Ruby
- Build Your Own Database From Scratch
- Build Your Own Search Engine
- A search engine in 80 lines of Python
- Build Your Own Docker
- The Ray Tracer Challenge
- Let's Build a Simple Database
- Write a Shell in C
- Crafting Interpreters
- Creating an Operating System
- Writing an OS in Rust
- Writing an Interpreter In Go + Writing a Compiler In Go
- Write a time-series database engine from scratch
- tinywm
- Rails Tutorial: A microblog web app
- Linux From Scratch
- Your First LTE
- Handmade Hero
- C++ Neural Network in a Weekend
- Transformers from Scratch
- Build Your Own Lisp
- Implementing a toy version of TLS 1.3
- Let's build a Full-Text Search engine
- Let's write a compiler
- Explaining event loop in 100 lines of code
- Implementing a distributed key-value store on top of implementing Raft in Go
- Learn x86-64 assembly by writing a GUI from scratch
- Writing a Linux Debugger
- Let's make a Teeny Tiny compiler
- How to build a window manager in Python
- Implementing cosine in C from scratch
- Let's Build a Simple Database. Writing a sqlite clone from scratch in C
- A Compiler Writing Journey
- Writing a C Compiler
- Writing a C compiler in 500 lines of Python
- Statically Recompiling NES Games into Native Executables with LLVM and Go
- A slack clone in 5 lines of bash
- NTP Implementation in Elixir
- A minimal operating system (2K LOC) on QEMU and a RISC-V board
- Writing a package manager
- Bare Metal Space Invaders
- Hypervisor From Scratch
- Writing a Debugger From Scratch
- Green Threads Explained
- Let’s Learn How Modern JavaScript Frameworks Work by Building One
- Writing a File System From Scratch
- Building Git
- Building an LLM from scratch
- Let's Build a Compiler by Jack Crenshaw
- Writing a simple JSON parser
- Let’s Build A Simple Interpreter
- Build Your Own SMTP Server in Go
- Build your own React
- Let's write a video game from scratch like it's 1987
- GameBoy Emulation in JavaScript
- Build nanoGPT from scratch
- Build Your Own Lisp
- Compiling to Assembly from Scratch
- 200 and change
- whorl - A single file, std only, async Rust executor
Other lists:
Playgrounds
- systemd by example
- TinyGo Playground
- JSFiddle
- Mess With DNS
- DNS lookup tool
- Nginx playground
- SQL playground
- sqlime
- regex101
- regexr
- Learn Git Branching
- wokwi
- Compiler Explorer
- shadertoy
- Unicode analyzer
- What unicode character is this?
- fffuel
- Float Exposed
- crontab guru
- Play with Kubernetes
- Hashing
Embedded Systems & Electronics
- A guide to getting started with embedded systems
- What is an Arduino?
- What is a Raspberry Pi?
- How Does an FPGA Work?
- FPGA vs. Microcontroller. What is the Difference?
- Arduino Starter Kit
- Basic knowledge about principles and techniques behind the Arduino ecosystem
- The Untold History of Arduino
- Learn electronics by practice
- Concise electronics for geeks
- Lessons in Electric Circuits
- Platt, Electronics: Learning by Discovery: A hands-on primer for the new electronics enthusiast
- LibrePCB
- Practical Guide to Radio-Frequency Analysis and Design
- Beginners Guide to Building a Hardware Hacking Lab
- SDR I/Q tools
- Intel HEX
- Microsoldering 101
- So you want to build an embedded Linux system?
- How a CPU works: Bare metal C on my RISC-V toy CPU
- ElectronicsNotes
- Hardware Hacking
- Assembly Language Adventures
- Post-apocalyptic programming
- A Journey in Creating an Operating System Kernel
- Game Boy Dev
- Game Boy / Color Architecture
- GB ASM Tutorial
- POKEGB: a gameboy emulator that only plays Pokémon blue
- Learning FPGA, yosys, nextpnr, and RISC-V
- The Retro Web
- Linux User/Kernel ABI: the realities of how C and C++ programs really talk to the OS
- Learning about PCI-e
- Introduction to Bluetooth Low Energy
- NASM Tutorial
- Operating Systems: Three Easy Pieces
- A friendly introduction to assembly for high-level programmers
- J. Clark Scott, But How Do it Know?: The Basic Principles of Computers for Everyone
- I don't know how CPUs work so I simulated one in code
- A bare metal programming guide
FOSS, DIY & Right to Repair
- What is Free Software?
- The Open Source Definition
- Pivotal moments in open source history
- Convivial software (or, why open source matters)
- What is open hardware?
- Open Source Ecology
- iFixit
- Repair Manifesto
- Right to Repair
- RepairCafé
- FOSDEM
- Don't sign a CLA
- The Good Parts of Open Source
- When Open Becomes Opaque: The Changing Face of Open-Source Hardware Companies
- "Open" "AI" isn't
- Protocols, Not Platforms
Reverse Engineering
In the wild:
- Reverse engineering Bluetooth LE LED light controllers, or How I Bricked My Christmas Lights
- Hacking my "smart" toothbrush
- Reversing UK mobile rail tickets
- How I Hacked My Car
- Discovering that your Bluetooth car battery monitor is siphoning up your location data
- Hacking IKEA
- Reverse engineering a car key fob signal
Math
- Mathematics I Use
- Kun, A Programmer's Introduction to Mathematics
- Mathematics for the adventurous self-learner
- 3Blue1Brown
- Khan Academy
- Interactive Linear Algebra
- Seeing Theory. A Visual Introduction to Probability and Statistics
- Fundamental Math for Game Developers
- Essential Math for Games Programmers
- Category Theory Illustrated
- Beautiful Symmetry. A Coloring Book About Math
- Arithmetic in Computer Hardware
- Geometry for Programmers
- Linear Algebra for Programmers
- Open Textbooks
- An animated introduction to Fourier Series
- Logic for Programmers
Music
Games
Machine Learning and Deep Learning
- A visual introduction to machine learning
- How I learn machine learning
- C++ Neural Network in a Weekend
- The Neural Network Zoo
- fast.ai — Making neural nets uncool again
- MIT Introduction to Deep Learning
- Dive into Deep Learning
- Manning & Schutze, Foundations of Statistical Natural Language Processing
- Jurafsky & Martin, Speech and Language Processing
- Eisenstein, Introduction to Natural Language Processing
- Molnar, Interpretable Machine Learning
- McKay, Information Theory, Inference and Learning Algorithms
- Hastie, Tibshirani & Friedman, The Elements of Statistical Learning
- Visualizing machine learning one concept at a time
- What are embeddings?
- A Very Gentle Introduction to Large Language Models without the Hype
- The Gradient
- ruder.io
- nlp-library
- Neural networks from scratch
- LLM Visualization
- The Annotated Transformer
- Markov Chains are the Original Language Models
- A Visual Guide to Vision Transformers
- Ilya Sutskever's Reading List
- The Pragmatic Programmer for Machine Learning
- The Little Book of Deep Learning
Best Practices, Common Pitfalls, Curious Stuff & Basic Things You Should Know
- Git:
- Shell Scripting
- Characters:
- 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!)
- The Great Newline Schism
- ASCII Table
- Invisible characters
- You can't just assume UTF-8
- Internationalization and localization (i18n)
- Dates:
- Numbers:
- RegEx:
- OS Interoperability:
- Linux:
- Testing:
- CLI:
- Anti-patterns:
- Code Formatting:
- HTTP:
- REST APIs:
- Web:
- Browser:
- Containers:
- Distributed Systems:
- Networks:
- Memory:
- Performance:
- Data Compression:
- Programming Languages and Compilers:
- Is every language written in C?
- Assembly code vs Machine code vs Object code?
- Introduction to Language Theory
- Syntax
- Syntax Design
- Backus-Naur form
- Resources for Amateur Compiler Writers
- Low-Code and the Democratization of Programming. Rethinking Where Programming Is Headed
- The faker's guide to reading (x86) assembly language
- Compiler Explorer
- Favorite compiler and interpreter resources
- Laws, Principles and Mantra:
- What Happens When:
- How Things Work:
- Hard Stuff:
- CS Theory:
- Miscellanea:
Classics & Bibles
- Petzold, Code: The Hidden Language of Computer Hardware and Software
- Hunt & Thomas, The Pragmatic Programmer
- Brooks, The Mythical Man-Month: Essays on Software Engineering
- C. Martin, Clean Code: A Handbook of Agile Software Craftsmanship
- Freeman & Pryce, Growing Object-Oriented Software, Guided by Tests (GOOS)
- Fowler & Beck, Refactoring
- Sussman & Abelson, Structure and Interpretation of Computer Programs (SICP)
- Jon Louis Bentley ,Programming Pearls
- Bryant, Computer Systems: A Programmer's Perspective (CS:APP3e)
- Patterson and Hennessy, Computer Organization and Design (MIPS Edition). The Hardware/Software Interface
- Dive into Systems
- Nisan and Schocken, Elements of Computing Systems (nand2tetris)
- Tanenbaum and Bos, Modern Operating Systems
- Larry Peterson and Bruce Davie, Computer Networks: A Systems Approach
- Ullman and Hopcroft, Introduction to Automata Theory, Languages, and Computations (Cinderella Book)
- Aho, Lam, Sethi, and Ullman, Compilers: Principles, Techniques, and Tools (Dragon Book)
- Nystrom, Crafting Interpreters
- Cormen, Leiserson, Rivest, and Stein, Introduction to Algorithms (The Big Book)
- Sedgewick and Wayne, Algorithms (4ed)
- Kernighan and Ritchie, The C Programming Language
- Kernighan and Pike, The Practice of Programming
- Kernighan and Pike, The Unix Programming Environment
- ESR, The Art of Unix Programming
- Rochkind, Advanced Unix Programming
- Stevens. Advanced Programming In The Unix Environment
- Bach, The Design Of The Unix Operating System
- Lyons, A Commentary on the UNIX Operating System
- Knuth, Patashnik, and Graham, Concrete Mathematics: A Foundation for Computer Science
- Knuth, The Art of Computer Programming
- Bishop, Pattern Recognition and Machine Learning
- Norvig, Paradigms of Artificial Intelligence Programming
- Jurafsky and Martin, Speech and Language Processing (3rd ed., draft) (SLP3)
- Norvig and Russel, Artificial Intelligence: A Modern Approach
- Snyder, Nemeth, Whaley, Hein, Mackin, UNIX and Linux System Administration Handbook
- Kerrisk, The Linux Programming Interface
- Brendan, Systems Performance: Enterprise and the Cloud
- Kleppmann, Designing Data-Intensive Applications
- Petrov, Database Internals: A Deep Dive Into How Distributed Data Systems Work
Essays
- LEGOs, Play-Doh, and Programming
- What Color is Your Function?
- Data Structures & Algorithms I Used Working at Tech Companies
- The Law of Leaky Abstractions
- Computers can be understood
- The Grug Brained Developer. A layman's guide to thinking like the self-aware smol brained
- Get better at programming by learning how things work
- Teach Yourself Programming in Ten Years
- A Linux evening
- Reflections on Trusting Trust
- Choose Boring Technology
- Programming as Theory Building
CS/FOSS History and Hacking/Cyberpunk Culture
- List of pioneers in computer science
- Computing History Hub
- Emerson, Reading Writing Interfaces. From the Digital to the Bookbound
- The Backbone
- The History of the Graphical User Interface - 1945 to 1980
- PAPERCRAFT MODELS
- Computer Science academic papers selected by the Fermat’s Library Journal Club
- Oral History of Federico Faggin
- Broca, Utopie du logiciel libre. Du bricolage informatique à la réinvention sociale (cfr. Utopia del Software Libero)
- Himanen, The Hacker Ethic and the Spirit of the Information Age
- ESR, How To Become A Hacker
- The Glider: A Universal Hacker Emblem
- The Conscience of a Hacker
- Whole Earth Index
- The Lonely Work of Moderating Hacker News
- Silicon Valley Old Map
- The Promise of IndyMedia
- ESR, The Cathedral & the Bazaar
- Kernighan, UNIX: A History and a Memoir
- Kernighan, Understanding the Digital World: What You Need to Know about Computers, the Internet, Privacy, and Security
- Williams, Free as in Freedom: Richard Stallman's Crusade for Free Software
- Torvalds, Just for Fun
- Knuth, Things a Computer Scientist Rarely Talks About
- Levy, Hackers: Heroes of the Computer Revolution
- Kidder, The Soul of a New Machine
- Hafner, Where wizards stay up late
- Waldrop, The Dream Machine: Licklider and the Revolution That Made Computing Personal
- Rheingold, Tools for Thought. The History and Future of Mind-Expanding Technology
- Bhattacharya, The Man from the Future: The Visionary Life of John von Neumann
- Soni & Goodman, A Mind at Play: How Claude Shannon Invented the Information Age
- Gleick, The Information: A History, a Theory, a Flood
- Hofstadter, Gödel, Escher, Bach: an Eternal Golden Braid
- Kushner, Masters of Doom: How Two Guys Created an Empire and Transformed Pop Culture
- Naitoh, How the ThinkPad Changed the World ― and Is Shaping the Future
- Mitnick &s Simon, Ghost in the Wires: My Adventures as the World's Most Wanted Hacker
- Erickson, Hacking: The Art of Exploitation
- Huang, The Hardware Hacker: Adventures in Making and Breaking Hardware
- Gibson, Neuromancer
- Dick, Do Androids Dream of Electric Sheep?
- Shirow, The Ghost in the Shell
- Otomo, Akira
Software Licenses
- Software Licenses: Overview and Recommendations for Developers
- Software Licenses in Plain English
- A Beginner's Guide to Open Source Software Development (LFD102)
Development and Team Organization
- Organization and Team Patterns
- Scrum vs Waterfall vs Agile vs Lean vs Kanban
- The Code Review Pyramid
- How Big Tech Runs Tech Projects and the Curious Absence of Scrum
Job Hunting & Career Advice
- Kanna, Job Hunting Resources for Developers
- How to Learn to Code & Get a Developer Job in 2023
- Reverse interview
- Questions I'm asking in interviews
- The Joel Test: 12 Steps to Better Code
- Cracking the Coding Interview
- LeetCode: Top Interview Questions
- Grokking Coding Interview Patterns in Go
- 14 Patterns to Ace Any Coding Interview Question
- Awesome Remote Job
- How Developers Stop Learning: Rise of the Expert Beginner
- A Senior Engineer’s Guide to FAANG Interviews
- Leveling Up in Job Interviews for Software Engineers
- interviewguide.dev
- Layoffs.fyi
- TechCompenso
Finest Sources of Geek Entertainment
- Hacker News
- Computerphile
- antirez
- jwz
- LWN.net
- Vicki Boykis
- Simon Willison
- Julia Evans
- Eli Bendersky's website
- Scott Hanselman's Blog
- Coding Horror
- Daniel Stenberg
- Martin Fowler
- Joel on Software
- fasterthanlime
- Happy Path Programming
- Oddly Influenced
- The Buckblog, assorted ramblings by Jamis Buck
- Gwern
- Math ∩ Programming
- Jon Skeet's coding blog
- The Pragmatic Engineer
- Ivan Velichko
- Martin Kleppmann
- lcamtuf
- Schneier on Security
- Peter Norvig
- hardmaru
- Andrej Karpathy blog
- Box of Cables
- Ben Eater
- Sam Zeloof
- FriendlyWire
- Paolo Aliverti
- The Lunduke Journal of Technology
- The History of the Web
- CoRecursive
- The Cloudflare Blog
- The Netflix Tech Blog
- Green Tea Press
- Opensource.com
- Explained from First Principles
- Let's read source code
- FOSDEM
- Strange Loop
- DEFCON
- Chaos Computer Club
- P99 CONF
- PoC||GTFO
- Phrack
You can subscribe to blog feeds via an RSS/Atom reader, as explained here.
Funny Things with Hack Value
- DNS Toys
- Should I Deploy Today?
- MatCaps Studio
- Life Universe
- Bubbles
- musicForProgramming();
- Park My Spaceship
- Townscaper
- Your World of Text
- After Dark in CSS
- Pimp My Microwave
- InternetOverSpaghetti
- Hello World in every computer language
- Winamp Skin Museum
- Bouncing DVD Logo
- WinXP in React
- Simone's Computer
- daedalOS
- Pokemon Cards V2
- Can it Run Doom?
- The Death Generator
- IMG_0001