- Professional Programming
- Must read books
- Must-read articles
- Other general material and list of resources
- Topics
- Algorithm and data structures
- Attitude, habits, mindset
- Automation
- Biases
- Career growth
- Characters sets
- Coding & code quality
- Computer science
- Databases
- Data science
- Debugging
- Design (visual, UX, UI)
- Design (OO modeling, architecture, patterns, anti-patterns, etc.)
- Dev environment & tools
- Diversity & inclusion
- Documentation
- Dotfiles
- Editors & IDE
- Engineering management
- Incident response (alerting, outages, firefighting)
- Internet
- Interviewing
- JavaScript
- Learning
- Project management
- Programming language
- Over-engineering
- Reading
- Releasing & deploying
- Security
- Shell
- System architecture
- Site Reliability Engineering (SRE)
- Testing
- Tools
- Version control (Git)
- Work ethics & work/life balance
- Web development
- Writing for performance
- Concepts
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 been become timeless classics.
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 Programatic 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.
There are some free books available, including:
- 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.
- List of free programming books
- 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.
- Signs that you're a good programmer
- Signs that you're a bad programmer
- The Imposter's Handbook - $30. From the author: "Don't have a CS Degree? Neither do I - That's why I wrote this book."
- mr-mig/every-programmer-should-know: a collection of (mostly) technical things every software developer should know
- Read the CLRS. You can watch and download the course on OCW - there are newer courses as well.
- Or The Algorithm Design Manual
- Try out some algorithms on Project Euler
Let's be honest: algo can be a pretty dry topic. This quora question lists some funnier learning alternative, including:
- 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
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
- The Conjoined Triangles of Senior-Level Development looks into how to define a senior engineer.
- Ten Principles for Growth as an Engineer, Dan Heller.
- Write code that is easy to delete, not easy to extend
- Lessons learned writing highly available code
- 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 every computer science major should know
- Teach Yourself Computer Science: an opinionated set of the best CS resources.
- A plain english introduction to CAP Theorem
- NOSQL Patterns
- NoSQL Databases: a Survey and Decision Guidance
- Safe Operations For High Volume PostgreSQL (this is for PostgreSQL but works great for other db as well).
- Zero downtime database migrations (code examples are using Rails but this works great for any programming language)
- SQL styleguide
- Rubber Duck Problem Solving
- Rubber Ducking
- Five Whys
- The Infinite Hows: this provides a strong criticism of the five whys method.
- Linux Performance Analysis in 60,000 Milliseconds
I highly recommend reading The Non-Designer's Design Book. This is a pretty short book that will give you some very actionable design advices.
- If you're working on data, Edward Tufte's The Visual Display of Quantitative Information is considered a classic.
- The Universal Principles of Design will give you enough vocabulary and concepts to describe design challenges into words.
- Microsoft's Rest API guidelines
- Book recommendations from HackerNews
Here's a list of good books:
- Design Patterns: Elements of Reusable Object-Oriented Software: dubbed "the gang of four", this is almost a required reading for any developer. A lot of those are a bit overkill for Python (because everything is an object, and dynamic typing), but the main idea (composition is better than inheritance) definitely is a good philosophy.
- Patterns of Enterprise Application Architecture: learn about how database are used in real world applications. Mike Bayer's SQLAlchemy has been heavily influenced by this book.
- Domain-Driven Design: Tackling Complexity in the Heart of Software 📖, Eric Evans
- Clean Architecture 📖, Robert C. Martin. Uncle Bob proposes an architecture that leverages the Single Responsibility Principle to its fullest. A great way to start a new codebase. Also checkout the clean architecture cheatsheet.
Articles:
- 101 Design Patterns & Tips for Developers
- Python Design Patterns: For Sleek And Fashionable Code: a pretty simple introduction to common design patterns (Facade, Adapter, Decorator). A more complete list of design patterns implementation in Python on Github. Also a book here.
- SourceMaking's Design Patterns seems to be a good web resource too.
- O'Reilly's How to make mistakes in Python
- Education of a Programmer: a developer's thoughts after 35 years in the industry. There's a particularly good section about design & complexity (see "the end to end argument", "layering and componentization").
- Google's API Design Guide: a general guide to design networked API.
- Domain-driven design, Wikipedia.
I maintain a list of antipatterns on another repo. This is a highly recommended read.
- Inheritance vs. composition: a concrete example in Python. Another slightly longer one here. One last one, in Python 3.
- Composition Instead Of Inheritance
- Complexity and Strategy: interesting perspective on complexity and flexibility with really good examples (e.g. Google Apps Suite vs. Microsoft Office).
Tools
- Glances: An eye on your system
- HTTPie: a CLI, cURL-like tool for humans
- jq: command-line JSON processor
- tmux: terminal multiplexer
- htop: an interactive process viewer for Linux
Checkout my list of management resources.
- Documentation-Driven Development
- Writing automated tests for your documentation: this should be required, IMO. Testing code samples in your documentation ensures they never get outdated.
- Documentation is king, Kenneth Reitz
Articles
- Sublime Text essential plugins and resources
- vim-awesome
- Bram Moolenaar (Vim author), Seven habits of effective text editing (presentation).
Checkout my list of management resources.
- Incident Response at Heroku
- Blameless PostMortems and a Just Culture
- My Philosophy on Alerting
- A great example of notes taken during outage and postmortem from Gitlab (01/31/2017). This one's a tricky one because an engineer's action caused the irremediable loss of 6 hours of data.
Note: this is about you as an interviewee, not as an interviewer. To check out my list of resources for interviewers, go to my engineering-management repository.
- All the best advice we could find on how to get a job
- System design interview for IT company
- Technical Interview Megarepo: study materials for SE/CS technical interviews
- How to Win the Coding Interview
- The elevator programming game
- I spent 3 months applying to jobs after a coding bootcamp. Here’s what I learned.
- Top 10 algorithms in Interview Questions
- Questions to ask your interviewer
- Interactive Python coding interview challenges
- tech-interview-handbook/cheatsheet.md
JavaScript is such a pervasive language that it's almost required learning.
- mbeaudru/modern-js-cheatsheet: cheatsheet for the JavaScript knowledge you will frequently encounter in modern projects.
Learn how to learn!
- How I Rewired My Brain to Become Fluent in Math: subtitled the building blocks of understanding are memorization and repetition.
- One Sure-Fire Way to Improve Your Coding: reading code!
- Tips for learning programming
- You can increase your intelligence: 5 ways to maximize your cognitive potential: forgive the clickbait title, it’s actually a good article.
- How to ask good questions, Julia Evans.
See Project management section on my engineering-management list of resources.
This is language-specific, for instance, checkout my professional Python education doc.
I'd recommend learning:
- At least one dynamic language (Python, Ruby, JavaScript, etc.). Pretty useful for quick one-off automation scripts, and fastest to write for interviews.
- At least one compiled language (Java, C, C++, etc.)
- At least one more recent language to see where the industry is going (as of writing, Go, Swift, Rust, etc.)
- At least one language that has first-class support for functional programming (Haskell, Scala, etc.)
A bit more reading:
- A brief, incomplete, mostly wrong history of programming languages
- Types
- Resources To Help You To Create Programming Languages
- 10 modern software over-engineering mistakes
- A good example of over-engineering: the Juicero press (April 2017)
“A complex system that works is invariably found to have evolved from a simple system that worked. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over, beginning with a working simple system.”
John Gall, General systemantics, an essay on how systems work, and especially how they fail..., 1975 (this quote is sometime referred as "Galls' law")
- Papers we love: papers from the computer science community to read and discuss. Can be a good source of inspiration of solving your design problems.
- The morning paper: one CS research paper explained every morning.
- How We Release So Frequently
- How to deploy software, Zach Holman
- BlueGreenDeployment, Martin Fowler
- Move fast and break nothing, Zach Holman
- Flipping out, flickr. One of the first articles about feature flags.
- Penetration Testing Tools Cheat Sheet
- My First 10 Minutes On a Server - Primer for Securing Ubuntu
- A practical guide to securing macOS
- Web Developer Security Checklist
- Reckon you've seen some stupid security things?: everything not to do.
Resources
- High Scalability: great blog about system architecture, its weekly review article are packed with numerous insights and interesting technology reviews. Checkout the all-times favorites.
- 6 Rules of thumb to build blazing fast web server applications
- Deep Lessons From Google And EBay On Building Ecosystems Of Microservices
- Service oriented architecture: scaling the Uber engineering codebase as we grow
- The twelve-factor app
- Scalable Web Architecture and Distributed Systems
- Introduction to Architecting Systems for Scale
- A Distributed Systems Reading List
- Services Engineering Reading List
- System Design Cheatsheet
- The Log: What every software engineer should know about real-time data's unifying abstraction: one of those classical articles that everyone should read.
- Learn how to design large scale systems. Prep for the system design interview (Github repo)
- Turning the database outside-out with Apache Samza
- Building Microservices 📖, Sam Newman (quite complete discussion of microservices)
- I already mentioned the book Scalability rules above, but there's also a presentation about it.
- I already mentioned the book Release it! above. There's also a presentation from the author.
- The Walking Dead - A Survival Guide to Resilient Applications
- Defensive Programming & Resilient systems in Real World (TM)
- Full Stack Fest: Architectural Patterns of Resilient Distributed Systems
- Graduating from Bootcamp and interested in becoming a Site Reliability Engineer?: a great collection of resources to learn about SRE.
- Testing Strategies in a Microservices Architecture (Martin Fowler) is an awesome resources explaining how to test a service properly.
- A Quick Puzzle to Test Your Problem Solving... and a great way to learn about confirmation bias and why you're mostly writing positive test cases.
- The test pyramid
- Just Say No to More End-to-End Tests
- End-To-End Testing Considered Harmful
- Move fast and don't break things (presentation)
- Eradicating Non-Determinism in Tests, Martin Fowler
- Kent Beck : “I get paid for code that works, not for tests”
- DevDocs API Documentation: a repository for multiple API docs (see also Dash for macOS).
- Your non-linear problem of 90% utilization, Jason Cohen: why constantly running at 90% utilization is actually counter-productive.
- Evidence-based advice on how to be successful in any jobs: most self-help advices are not research-based. The ones listed in this article are.
- grab/front-end-guide: a study guide and introduction to the modern front end stack.
- Maintainable CSS