Pante's Reading List
This is a curated list of programming & software engineering articles that I've personally found to be amusing and/or interesting over the years. I hope it proves useful to others too.
Company Blogs
- Cloudflare's blog
- Discord's Blog
- Facebook's blog
- Github's Blog
- Netflix Technology Blog
- Riot Game's Blog
- Shopify's Blog
Personal Blogs
- CodingHorror
- Joe Duffy's Blog
- Joelonsoftware
- Martin Fowler's blog
- The Pragmatic Engineer's blog (free) and newsletter (paid)
- Stephen Colebourne (creator of Joda Time)'s blog
- Steve Yegge's blog and medium
- stuffwithstuff
Uncategorized
- 10 Papers Every Developer Should Read (At Least Twice)
- A Conspiracy To Kill IE6
- Advantages of Function Programming
- Agile and the Long Crisis of Software
- Analyzing New Unique Identifier Formats (UUIDv6, UUIDv7, and UUIDv8)
- Cruise Ships
- Developer tools can be magic. Instead, they collect dust
- Down the ergonomic keyboard rabbit hole
- Falsehoods Programmers Believe About Email
- Falsehoods Programmers Believe About Names – With Examples
- Falsehoods programmers believe about time zones
- Faster Chrome - Let The Compiler do the work
- From Laptop to Lambda: Outsourcing Everyday Jobs to Thousands of Transient Functional Containers
- Go: the Good, the Bad and the Ugly
- Google's technical writing blog
- Here's a problem that sounded impossible...
- History and future of Infrastructure as Code
- How Did We Get Here? - Dive into HTML5
- How Did REST Come To Mean The Opposite of REST?
- How Rust went from a side project to the world’s most-loved programming language
- How to break everything by fuzz testing
- In praise of PostgreSQL
- It takes a PhD to develop that
- It's probably time to stop recommending Clean Code
- Lessons learnt while trying to modernize some C code
- Linguistic Antipatterns
- Nine ways to shoot yourself in the foot with PostgreSQL
- Patterns in confusing explanations
- Please Don't Learn to Code
- Programming in 1987 Versus Today
- Programming Sucks
- Prompt injection explained, with video, slides, and a transcript
- Recommended Reading for Developers
- Reflections on 10,000 Hours of Programming
- Relational Databases Aren’t Dinosaurs, They’re Sharks
- Saying Goodbye to the Best Gig I Ever Had
- Small Pleasures of Programming
- Semantic Versioning Will Not Save You
- Stop Optimizing for Tutorials
- Story: Redis and its creator antirez
- Stiff Asks, Great Programmers Answer
- Teach Yourself Programming in Ten Years
- The Fall of Stack Overflow, Explained
- The Non-Productive Programmer (NPP)
- The PGP Problem
- The rise and fall of InVision
- The silent majority
- The Two Generals Problem
- The untold Story of SQLite With Richard Hipp
- This is not your grandfather’s Perl
- Tools for better thinking
- Unladen Swallow Retrospective
- Using Rust at a startup: A cautionary tale
- Whatever happened to programming?
- What is Rust and why is it so popular?
- What we can learn from “_why”, the long lost open source developer
- What’s the difference between software engineering and computer science degrees?
- What’s the matter with PGP?
- When to use Bazel
- Where are IPv3 and IPv5?
- Why the C Language Will Never Stop You from Making Mistakes
- Why You Should Never Use MongoDB
- Write code that is easy to delete, not easy to extend.
Deep-dives/low-level
- A primer on Roaring bitmaps: what they are and how they work
- Beautiful Branchless Binary Search
- Building a Date-Time Library: Timezones (Disclaimer: written by me)
- C++ is faster and safer than Rust: benchmarked by Yandex
- Collection Pipelines
- Converting Integers to Floats Using Hyperfocus
- Discovering the Local Time Zone: Why It's a Hard Problem
- Donald Knuth's thoughts on ChatGPT
- Feature Toggles (aka Feature Flags)
- Flattening ASTs (and Other Compiler Data Structures)
- Gallery of Processor Cache Effects
- GCC undefined behaviors are getting wild
- Generics can make your Go code slower
- GPU programming
- GPS
- Handles are the better pointers
- How Doom Fire was Done
- How I cut GTA Online loading times by 70%
- How To Corrupt An SQLite Database File
- How to write really slow Rust code
- How we optimized PostgreSQL queries 100x
- I built a garbage collector for a language that doesn't need one
- I made JSON.parse() 2x faster
- Memory Safe Languages in Android 13
- Migrating a production database without any downtime
- Revisiting Prechelt’s paper and follow-ups comparing Java, Lisp, C/C++ and scripting languages
- SIMD accelerated sorting in Java - how it works and why it was 3x faster
- The 100% Markdown Expedition
- The Hardest Program I've Ever Written
- The HTTP QUERY Method
- The legend of "x86 CPUs decode instructions into RISC form internally"
- Towards Inserting One Billion Rows in SQLite Under A Minute
- Ubershaders: A Ridiculous Solution to an Impossible Problem
- Unicode is harder than you think
- WebAssembly's post-MVP future: A cartoon skill tree
- What a good debugger can do
- Why is DNS still hard to learn?
- Why is processing a sorted array faster than processing an unsorted array
- Why Twitter Didn’t Go Down: From a Real Twitter SRE
Distributed Systems/System Design
- 10 Tips for Building Resilient Payment Systems
- A Bluffers Guide to CRDTs in Riak
- Applied Monotonicity: A Brief History of CRDTs in Riak
- Cache made consistent
- Chain replication : how to build an effective KV-storage (part 1/2)
- Conflict-free Replicated Data Types
- CRDTs go brrr
- Distributed Counter System Design
- Garbage Collected CRDTs on the Web
- Microservice Architecture Pattern: Saga
- Modern-Day Architecture Design Patterns for Software Professionals
- Redis, Kafka or RabbitMQ: Which MicroServices Message Broker To Choose?
- Selected Sequence CRDTs
- The Inner Workings of Distributed Databases
- You Want Modules, Not Microservices
Humour/Satire/Rants
- A Collection of O'rly book Covers
- Dear Google Cloud: Your Deprecation Policy is Killing You
- Expert Excuses for Not Writing Unit Tests
- Golang is 𝘼𝙡𝙢𝙤𝙨𝙩 Perfect
- Golang is not a good language
- Haskell Researchers Announce Discovery of Industry Programmer Who Gives a Shit
- I Quit my Programmer Job to Become a Chicken
- I ****ing hate Science
- Introduction to Abject-Oriented Programming
- Nothing has ever angered me more than The Google Play Team
- Open Source is Not About You
- Manifesto for Half-Arsed Agile Software Development
- Re: clean up kernel_{read,write} & friends v2
- React I Love You, But You're Bringing Me Down
- The Future of discord.py
- This is my thinly veiled attempt to get you to use a library I wrote.
- Weird architectures weren't supported to begin with
- Why we at $FAMOUS_COMPANY Switched to $HYPED_TECHNOLOGY
Java/JVM
- Circumventing the JVM's bytecode verifier
- Don’t call it a comeback: Why Java is still champ
- Finalizing the Foreign APIs
- GraalVM at Facebook
- Isolates and Compressed References: More Flexible and Efficient Memory Management via GraalVM
- Overhead of Returning Optional Values in Java and Rust
- Java is Still Free
- Java Objects Inside Out
- JDK 17 G1/Parallel GC changes
- JVM Advent Calendar: A Beginner's Guide to Java Agents
- JVM Anatomy Quarks
- JVM Internals
- On the Performance of User-Mode Threads and Coroutine
- Phantom types in Java
- Pros and Cons for Using GraalVM Native-Images
- State of Valhalla
- String Tapas Redux
- Using Java's Project Loom to build more reliable distributed systems
- Virtual Threads: New Foundations for High-Scale Java Applications
- What About the Performance of Java 8 Lambdas
- What is JEP-303 or reinventing
invokedynamic
Software Engineering
- 10 Proven Techniques for More Effective Code Reviews
- 17 Mental Models, biases and fallacies that Software Developers should know
- 3 tribes of programming
- 20 Things I’ve Learned in my 20 Years as a Software Engineer
- A Generation Lost in the Bazaar
- A layman's guide to thinking like the self-aware smol brained
- Automating a software company with GitHub Actions
- Best Books For The Inquisitive Software Engineer
- Big Ball of Mud
- Bullshit Software Projects
- Cargo Cult Software Engineering
- CI/CD/CF? — The DevOps toolchain’s “missing-link”
- Common Bugs in Writing
- DevEx: What Actually Drives Productivity
- Documentation unit tests
- Evidence Based Scheduling
- Famous Laws of Software Development
- Five Worlds
- How does one get as close as possible to mastering software engineering?
- How I learned to turn Impostor Syndrome into an Advantage - The Impostor's Advantage
- How to Make Your Code Reviewer Fall in Love with You
- How to Thrive as an Average Programme
- Imaginary Problems Are the Root of Bad Software
- Investing in Internal Documentation: A Brick-by-Brick Guide for Startups
- New grad vs Senior Developer
- Lessons from 6 software rewrite stories
- Pair Programming
- Software engineering practices
- The 10x Programmer Myth
- The care and feeding of software engineers (or, why engineers are grumpy)
- The Differences Between a Junior, Mid-Level, and Senior Developer
- The forgotten mistake that killed Japan’s software industry
- The Power of Ten – Rules for Developing Safety Critical Code
- The Pragmatic Engineer Test: 12 Questions on Engineering Culture
- The Joel Test: 12 Steps to Better Code
- The Twelve-Factor App
- Things they didn’t teach you about Software Engineering
- Top Five (Wrong) Reasons You Don’t Have Testers
- What distinguishes great software engineers?
Career
- 16x Engineer
- 20 Questions a Software Engineer Should Ask When Joining a New Team
- 8 Hard Truths I learned when I got laid off from my SWE job
- An Engineering Team where Everyone is a Leader
- Engineering Ladders
- Hiring in Tech
- How to Lead a Project - as a Software Engineer
- How to mentor software engineers
- Level Up
- Principal / Staff Engineer Resources
- Reddit Interview Problems: The Game of Life
- Staff archetypes
- Software Engineer roadmap via books
- Tech Resume Advice
- The Two Tiers of Singapore's Tech Companies
- Things I've learned transitioning from engineer to engineering manager
- What I learned from Software Engineering at Google
- What is a Staff Engineer?
- What we look for in a resume
- What’s going on with Google and Facebook?
- What's it like as a Senior Engineer at Google?
- Why GitHub Won't Help You With Hiring
- Writing for Engineers
- Your 2020 Guide for Surviving Interviewing as a Software Engineer
Case Studies
- Cache made consistent
- How Discord Supercharges Network Disks for Extreme Low Latency
- How to shuffle songs
- How we store and process millions of orders daily
- Integrating Rust and C++ in Firefox
- Making Crash Bandicoot
- Post-Incident Review on the Atlassian April 2022 outage
- Ready for changes with Hexagonal Architecture
- Scaling GraphQL at PayPal
- Seeing through hardware counters: a journey to threefold performance increase
- Taming Go’s Memory Usage, or How We Avoided Rewriting Our Client in Rust
- The Story of the PS2’s Backwards Compatibility From the Engineer Who Built It
- Uber's rewrite story (from different perspectives)
- Upgrading GitHub to Ruby
- Why We Started Putting Unpopular Assets in Memory
Programming Languages/Theory
- Being Popular
- Beyond Exception Handling: Conditions and Restarts
- Blogging about Midori
- Challenging LR Parsing
- Compiler Optimizations Are Hard Because They Forget
- Considerations for programming language design: a rebuttal
- Crafting Interpreters
- C++ is the next C++
- I want off Mr. Golang's Wild Ride
- Literate programming: Knuth is doing it wrong
- Notes on structured concurrency, or: Go statement considered harmful
- My Reaction to Dr. Stroustrup’s Recent Memory Safety Comments
- Old Neglected Theorems Are Still Theorems
- Programming Paradigms for Dummies: What Every Programmer Should Know
- Reducing boilerplate in finally tagless style
- Representing Heterogeneous Data
- Rust has a small standard library (and that's ok)
- Should You Use Upper Bound Version Constraints?
- So, You Want To Write Your Own Language?
- Structured Concurrency Anniversary
- The Impoliteness of Overriding Methods
- What Color is Your Function?
- Why Functional Programming Matters
- Why nullable types