Most apprentice software developers, especially those, who study in colleges, do not know how to develop their skills, and what they should know to work effectively. Surprisingly, everyday usage of products and technologies, invented by other developers and based on well-developed knowledge areas, does not give them an idea how they work, and how they are implemented.

Queueing theory and GSM-based mobile networks; PHP scripts, running at remote servers, transfering generated content through Ethernet using TCP/IP protocol to network cards with NDIS interface on user PCs; CPUs, reordering and speculatively executing instructions to compensate semiconductor electronics limitations on clock rate and light speed; computer-designed cars and planes, drugs and DNA sequenced by computers; computer games, where a tiny patch of reflected light need megabytes of scientific articles full of Fresnel integrals; electronic movies and books; NLP and TreeNet algorithms, retrieving search results from huge databases — these are the things we use every day, that were created by ingenious software developers, by virtue of their fundamental knowledge and talent, and, of course, software development and complexity management methodology, proven over the years.

My friends and I have taken the trouble of preparing a software developers' theoretical minimum based on remarkable IT areas, some parts of which are already included in CS university programmes, the others are taken from interviews and practical experience. Some items require only Wikipedia and take 5 minutes to learn, others would take up months, but this is exactly what you need to know and understand. You are welcome to suggest corrections and additions.

UPD: Some issues are very common, so it is a good idea to give answers in this post.

This list is rightly criticized for the lack of systematization and SUDDEN neighbourhood of highly diverse topics, different in their content and depth. This is a feature, not a bug! Writing a systematic programme for almost every item here would take up the same space as the contents of some great books, therefore, including book names/authors is better. So, how to use this list? You should read good books to gain understanding of the subjects mentioned. The authors did not even think that someone would decide that Duff's device is equal by complexity and size to the Holy Standard! However, our criteria is still applicable because reading a hundred beginner books in C++ will not give you an idea what Duff's device is, but if you know what to study (some parts of our list, for example, C++) you would meet every concept very quickly. The sense of the programme, caused by its size, is to assess how much knowledge you have gained by reading books.

We also receive lots of critical replies from those who consider themselves as programmers, but suppose that learning all these things is impossible, or there is no need to know it all because an ordinary developer would not use it in common practice. We believe these people do not see the difference between erudition/memory and knowledge. A valueable knowledge for a software developer is not exact NBNS packet format, but methods other developers used, in other words, his ability to reinvent or identify those methods in diverse domains. The ability to analyze and synthesize (which is achieved by hard work and study) distinguishes human from google, that will not be able to solve div2 250 even in the long term. This list is aimed at developing these abilities. Surely, you need to supplement abilities with domain-specific knowledge like game physics, java bullshit development or IC design.

The issue of those who do not consider themselves smart enough to master this list, or suppose that they will not be able to apply their knowledge and forget/lose it also needs a separate paragraph. In general the list is inferior to CS faculties' programmes in leading universities, so mastering it in 5 years is quite possible, even combining it with work. 1/3 to 2/3 of discussed issues are commonly used in game development, others can be used by answering questions at StackOverflow.

There is also a group of people who deny learning the specified subjects because they consider that programming is only for making money. These people do not really need this list, it does not address issues of stealing, cheating or forcing others to work instead of you.

Some people say «I get paid well without such education». They should note that after 45 brain degradation is easy to see, because most people find it troublesome to work with code even of ordinary cyclomatic complexity. Slow loss of ability to write code (accompanied by lack of analysis-synthesis activity) can lead to lack of professional work and other problems. Some people continue working actively in old age, but this is caused by their outstanding performance in the past. You can use TopCoder to assess your performance.

I am grateful to everyone who helped me fix all those annoying bugs, especially my colleagues, who have not only practically mastered this list, but also made very valuable comments.