== Notes to self ==
Not gold alone brought us hither

Career in software development: Building a foundation

One frequently asked question from programmers at the starting point of thier career as software developers is: I have a college degree and am ready to find a job or have just landed my first job. What are the skills I need in order to be succesfull on the job and in order to advance my career in this field? Here’s a list that is an attempt to answer this question.

  1. Programming languages: This is the basic tool in your toolkit that you will use in any role in a software development team. I recommend picking up proficiency in at least three languages:

    • The primary language that you will use every day at your job, e.g. Java
    • One additional language that will help you challenge your thinking outside of the primary programming language you use, e.g. C, Go, Smalltalk, etc. This will prevent you from getting in a frog-in-the-well situation where you know only one programming language and hence your thinking is constrained by the heuristics of that one language.
    • A scripting language which allows you to perform quick tasks with extreme ease, e.g. Perl. This is necessary to create tools for your development or testing environment which will dramatically improve your efficiency in getting things done.
  2. Source code control, a.k.a version or revision control. Though this belongs to the “software development tools” category, it is important enough to be dealt with separately. Be very comfortable working with two software version control products, and my recommendation is: Git (a distributed version control software that is gaining popularity at an amazing pace), and Subversion (a.k.a. svn, which is probably the most widely used revision control software by the open source community and at many software development companies). These two offer very different set of capabilities and hence knowing both will help you gain a good understanding of the basic concepts of version control and also expose you to unique challenges in maintaining revision history and how these two products address those challenges.

  3. Software development tools:

    • Operating systems: Again, being comfortable with at least two OSes is ideal, and the two should be Linux and Windows Server. You should be comfortable performing basic administrative tasks on both, and should be able to use debugging or troubleshooting tools on these platforms in order to troubleshoot issues with a program written in your language of choice.
    • IDE: Pick an IDE and learn it inside out. For e.g. Eclipse.
    • Text editor: Learn to use a good text editor (notepad is not enough) that will dramatically improve your efficiency of writing and manipulating large amounts of text. There are really only a few options here. vim and emacs are the two big options, and you will need to pick one now. I have chosen vim and I use gvim on Windows and Linux (http://www.vim.org) and it allows me to do magic with text.
  4. Software development methodology.

    • This one is something you will learn at any job but what you learn will most likely be a cheap knockoff of one of the popular methodologies. You should acquire theoretical knowledge in this area and also follow relevant blogs to keep tab on how great teams handle the process issue. This topic sounds more managerial than it should but getting this right or wrong will make or break the effectiveness of a software development team. An ineffective team even with great programmers will rarely produce great sustainable results. Read up on XP, Scrum and other Agile software development in general.
    • In addition, let me throw in TDD in this section. This actually belongs in section 1 above as it’s more about how you write and maintain code. Anyways, learn TDD (test driven development) and live and breath TDD at your work even if your company does not require you to develop tests as you write code.
  5. Write documentation. Practice writing documentation at all levels. Develop a habit of writing clearly in order to get the most out of your programming skills. Good programmers who are constrained by poor documentation skills find it difficult to put their software to good use due to their inability to articulate the capabilities of the software they create. You will need to write and explain at places like:

    • comments in code
    • requirements document
    • system test specifications
    • user manuals
    • command references or man pages
    • etc.
  6. Get involved in open source: The best way to learn good software development for a common programmer is to join one or two open source projects. Active participation is the key, just enrolling will not help. Any role in an open source community will put your learning on the fast track. There is so much happening out there and at such a rapid pace, you will probably love contributing to open source software. Being an active contributor to an open source project will improve your chances of being noticed by potential employers and will hone your programming skills in a way that will make your experience at any corporation look pale in comparison (most of the time).

We have not yet touched upon areas like domain knowledge and business acumen but the above is a good starting point for a programmer just starting out on his career.