Ask HN: How to fill this knowlegde gap?
1. Developer X knows how to write decent code. Readability, maintainability, dependency injection, good patterns, solid principles, etc.; his code is easy to read and elegant, and more importantly it works as expected (at least based on the tests on staging environments). Now, the code goes to production and fails because: the number of, let's say, customers the code was loading into memory was just too much for the server to handle (the code was using a simple `for` loop + array variable to keep the customers). The server's memory was exhausted. One solution was to use rabbitmq instead of a simple array.
2. Developer X writes a `select` query to perform a search. The query works fine and is fast... but in production it takes much more time than expected (because the database has to handle load coming from other parts of the system as well and because the tables in production are way bigger than on dev or staging). Besides, the `select` query wasn't being run against the slave database, but against master. Developer X didn't think about these two topics when writing the query.
Basically, developer X has read all the books that appear in Google when one types `Top 10 Books That Every Programmer Must Read` (and more), and has a solide background in theoretical computer science (networking/databases/operating systems/compilers/automata theory), but has a hard time dealing with so-called "common" patterns/solutions in the real world (master/slave replication, async task processing via queues, issues that appear in production due to a huge amount of data, etc.)
Developer X is learning the "hard way" (through experience at his work place), but he finds this way of learning really slow (that's why he read all the top +10 software engineer books in the past).
How can developer X learn faster the topics he lacks experience with? Any really good books out there?