In various forums about software development one kind of question comes up over and over again: "What should I learn next and how". So here is my take on that question:

Phase 1: Getting started

  • learn a main stream language. Current best candidates in my opinion are C# or Java. Both are general purpose and not tuned towards a special kind of application. Don't worry to much about what kind of application you are going to write or what kind of company might become your employer. More important when choosing the first language is: What kind of community do you have access to? Do you have a friend who does PHP development and is willing to tutor you? Go with PHP. This is not about learning YOUR language, it is about learning programming. Get some kind of tutorial and work through it from start to finish. Find a second tutorial and do the same. Find a little program that is easy to implement and that is usefull for you. Implement it.
  • learn basic concepts from CS like algorithms. Do so by getting a book about algorithms and implementing them in the language of your choice. Don't just copy examples from books, but understand the algorithm and implement it from scratch.
  • find a friendly forum for the language of your choice and learn how to ask questions.
  • whatch the forum and answer questions you can answer. Find questions that you can't answer from the top of your head, but that you can find a solution to. Find the solution and answer the question.


Phase 2: Getting useful

  • Learn some kind of framework for the kind of application you try to develop. Today this probably means some kind of webframework.
  • Learn some auxiliary languages that are useful: HTML, JavaScript and SQL are obvious candidates. Whenever you search for a solution to a problem, don't be satisfied with the solution. Make sure you understand more about the solution than you need for just applying them.
  • Keep a list of things that you come across, which sound interesting, but which you don't understand or know yet. Look those up from time to time. Especially for your auxiliary languages make sure you get a solid understanding of those
  • You will learn more about your main language just by using it. Possibly you will need to learn a new language in order to use the framework of your choice.
  • learn how to use version control system. Use it.
  • learn how to work with an issue tracking system. Use it.
  • learn a testing framework like JUnit. Use it.


Phase 3: Getting dangerous

  • Pick a topic from Computer Science and learn about it. How about algorithms for compiler construction, raytracing, or relational theory (the basis for relational databases), neuronal networks, robotics or artificial intelligence. Chances are you won't use it on your day job. But it will train your abstract thinking skills.
  • Get the book Design Patterns by the Gang of Four. Read it. Understand it. Apply it.
  • Learn about TDD. Practice it.
  • Read Clean Code. Practice it.
  • Coach less experience developers
  • Learn a radical different programming language
  • Learn about design principles like SOLID
  • Join appropriate User Groups and participate in discussions.


Phase 4: Move on

  • Get into the details of the libraries and frameworks you are using. Implement a plugin, submit a bugfix, step through the source code for debugging problems with it.
  • Give talks at your local (Java/Oracle/.Net/You name it) User Group.
  • Give workshops at your company.


What would you add? What would you change?