16 KiB
Table of Contents
- Professional Programming
- Must read books
- Must-read articles
- Things to do
- Things to know
- List of things to know
- Know characters sets
- Know your algorithm and data structures
- Know your concepts
- Know your editor
- Know your database
- Know your dev environment
- Know your shell
- Know your webdesign
- Know your dotfiles
- Know your git
- Know how the Internet works
- Know how to debug
- Know how to design
- Know how to architect systems
- Know your programming language
- Know your design patterns and anti-patterns
Professional Programming
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.
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 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.
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.
- Signs that you're a good programmer
- Signs that you're a bad programmer
Things to do
Attitude & habits
- Mastering Programming, Kent Beck.
Coding
- Write code that is easy to delete, not easy to extend
- Lessons learned writing highly available code
- The Ten Commandments of Egoless Programming
Incident response (outages, firefighting)
Interviewing
- 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
Managing the database
- 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)
Reading
- 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.
Releasing & deploying
- 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.
Security
Testing
- 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.
Writing for performance
Things to know
List of things to know
Know characters sets
Know your algorithm and data structures
- Read the CLRS. You can watch and download the course on OCW - there are newer courses as well.
- Try out some algorithms on Project Euler
Let's be honest: algo can be a pretty dry topic. This quota question lists some funnier learning alternative, including:
Know your concepts
Know your editor
- Sublime Text essential plugins and resources
- vim-awesome
- Bram Moolenaar (Vim author), Seven habits of effective text editing (presentation).
Know your database
Know your dev environment
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
Know your shell
Resources
Know your webdesign
Know your dotfiles
Articles
Know your git
Know how the Internet works
Know how to debug
- Rubber Duck Problem Solving
- Five Whys
- The Infinite Hows: this provides a strong criticism of the five whys method.
- Linux Performance Analysis in 60,000 Milliseconds
Know how to design
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.
Know how to architect systems
- 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.
Know your programming language
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:
Know your design patterns and anti-patterns
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.
- SourceMaking's Design Patterns seems to be a good web resource too.
- O'Reilly's How to make mistakes in Python
- 101 Design Patterns & Tips for Developers
I maintain a list of antipatterns on another repo. This is a highly recommended read.