# Table of Contents - [Professional Programming](#professional-programming) - [Must read books](#must-read-books) - [Must-read articles](#must-read-articles) - [Things to do](#things-to-do) - [Coding](#coding) - [Managing the database](#managing-the-database) - [Releasing](#releasing) - [Testing](#testing) - [Things to know](#things-to-know) - [Know your editor](#know-your-editor) - [Know your dev environment](#know-your-dev-environment) - [Know your shell](#know-your-shell) - [Know your dotfiles](#know-your-dotfiles) - [Know your git](#know-your-git) - [Know how to debug](#know-how-to-debug) - [Know how to architect systems](#know-how-to-architect-systems) - [Know your language](#know-your-language) - [Know your design patterns and anti-patterns](#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. ## Must read books I've found these books incredibly inspiring: * [The Pragmatic Programmer: From Journeyman to Master](http://www.amazon.com/The-Pragmatic-Programmer-Journeyman-Master/dp/020161622X): hands-on the most inspiring and useful book I've read about programming. * [Code Complete: A Practical Handbook of Software Construction](http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670): a nice addition to The Programatic Programmer, gives you the necessary framework to talk about code. * [Release It!](http://www.amazon.com/Release-It-Production-Ready-Pragmatic-Programmers/dp/0978739213): 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](http://www.amazon.com/Scalability-Rules-Principles-Scaling-Sites/dp/0321753887) * [The Linux Programming Interface: A Linux and UNIX System Programming Handbook](http://www.amazon.com/The-Linux-Programming-Interface-Handbook/dp/1593272200): 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](http://product.hubspot.com/blog/practical-advice-for-new-software-engineers) * [On Being A Senior Engineer](http://www.kitchensoap.com/2012/10/25/on-being-a-senior-engineer/) * [Lessons Learned in Software Development](http://henrikwarne.com/2015/04/16/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 to do ### Coding * [Write code that is easy to delete, not easy to extend](http://programmingisterrible.com/post/139222674273/write-code-that-is-easy-to-delete-not-easy-to) * [Lessons learned writing highly available code](https://medium.com/imgur-engineering/lessons-learned-writing-highly-available-code-7eaf3d7aae00#.u7c4j6hac) ### Managing the database * [Safe Operations For High Volume PostgreSQL](https://www.braintreepayments.com/blog/safe-operations-for-high-volume-postgresql/) (this is for PostgreSQL but works great for other db as well). * [Zero downtime database migrations](https://blog.rainforestqa.com/2014-06-27-zero-downtime-database-migrations/) (code examples are using Rails but this works great for any programming language) ### Releasing * [How We Release So Frequently](http://engineering.skybettingandgaming.com/2016/02/02/how-we-release-so-frequently/) ### Testing * [Testing Strategies in a Microservices Architecture](http://martinfowler.com/articles/microservice-testing/) (Martin Fowler) is an awesome resources explaining how to test a service properly. ## Things to know ### Know your editor * [Sublime Text essential plugins and resources](https://github.com/dreikanter/sublime-bookmarks) * [vim-awesome](http://vimawesome.com/) ### Know your dev environment * [Awesome Dev Env](https://github.com/jondot/awesome-devenv) Tools * [Glances: An eye on your system](https://github.com/nicolargo/glances) * [HTTPie: a CLI, cURL-like tool for humans](https://github.com/jkbrzt/httpie) * [jq: command-line JSON processor](https://stedolan.github.io/jq/) * [tmux: terminal multiplexer](http://tmux.github.io/) * [htop: an interactive process viewer for Linux](http://hisham.hm/htop/) ### Know your shell * [Awesome Shell](https://github.com/alebcay/awesome-shell) Resources * [Bash Hackers Wiki](http://wiki.bash-hackers.org/) * [Master the command line, in one page](https://github.com/jlevy/the-art-of-command-line) **must read** ### Know your dotfiles * [Awesome dotfiles](https://github.com/webpro/awesome-dotfiles) Articles * [Setting Up a Mac Dev Machine From Zero to Hero With Dotfiles](http://code.tutsplus.com/tutorials/setting-up-a-mac-dev-machine-from-zero-to-hero-with-dotfiles--net-35449) ### Know your git * [Git Cheat Sheet](https://github.com/arslanbilal/git-cheat-sheet) * [git-tips](https://github.com/git-tips/tips) ### Know how to debug * [Rubber Duck Problem Solving](http://blog.codinghorror.com/rubber-duck-problem-solving/) * [5 Whys](https://en.wikipedia.org/wiki/5_Whys) ### Know how to architect systems * [High Scalability](http://highscalability.com/): great blog about system architecture, its weekly review article are packed with numerous insights and interesting technology reviews. * [6 Rules of thumb to build blazing fast web server applications](http://loige.co/6-rules-of-thumb-to-build-blazing-fast-web-applications/) ### Know your language This is language-specific, for instance, checkout my [professional Python education doc](https://github.com/charlax/python-education). ### Know your design patterns and anti-patterns Here's a list of good books: * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/dp/0201633612/): 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](http://www.amazon.com/dp/0321127420/?tag=stackoverfl08-20): 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](https://sourcemaking.com/design_patterns) seems to be a good web resource too. * O'Reilly's [How to make mistakes in Python](http://www.oreilly.com/programming/free/files/how-to-make-mistakes-in-python.pdf) I maintain a [list of antipatterns](https://github.com/charlax/antipatterns) on another repo. This is a highly recommended read.