Thoughts on Software Development

I recently had my fifth anniversary at the software company I work for, and I also recently had the opportunity to interview some potential summer interns. I began to look back on my career and education and try to catalog everything I had learned. What have I learned? Was my formal education worth anything? Did I really learn anything “on the job” or “on the streets?” The conclusion I came to was that while my college education was certainly very valuable, it only offered about half of the insight and context I really needed to be successful. I wanted to squeeze in an analogy about about how majoring in music won’t make you a rock star (oops, I already did), but I’ve tried to condense everything into the points below.

  1. Becoming a software developer is difficult because the software industry hasn’t been around long enough for us to:
    • Know how to properly educate students
    • Know how to properly train employees

    To put it another way, software development has evolved from PhD-level math and physics research to something more on par with MTV in less than sixty years, and education simply hasn’t kept pace with industry. As a result, software professionals typically like to or are forced to learn on their own and do things their own way. While this soft of self-motivation seems inspiring, it often leads to very messy, buggy software and disgruntled, disillusioned employees.

  2. The best way to become successful in software development is to be born with a very high IQ and start writing C, C++, and assembly when you are eight years old. This may feel horribly unfair if you are already over four feet tall when reading this now, but that’s life. The second best way involves doing *a lot* of reading, study, and practice outside of school and work. There’s no way around it. I was a horrible programmer in college. I wasn’t much better after my first internship. Things didn’t magically, automatically improve when I started my first “real” job after college, either. I only realized that I had finally “made it” as a software developer when I noticed that I looked forward to writing code that did something useful and non-trivial for fun, outside of work and school, and sharing it with people.
  3. Unless you have a masters or PhD in math or computer science, while possible, it is unlikely you will spend a lot of time working on data structure or algorithm design or analysis. This is disappointing to many young software professionals (and a relief to many as well :)). However, studying data structures and algorithms is important so that you can appreciate the appropriate one for a given task, even if you use a library’s implementation. While libraries for searching, sorting, etc… offer enormous benefits that few can afford to ignore, failing to have at least basic understanding of the difference between a “brute-force” algorithm and one that is at least reasonably optimal will give rise to serious problems if left un-checked. To put it another way, you have to know “it” even if you don’t use “it”, because you will use “it,” perhaps indirectly, when you least expect “it.”On that note, most modern software development actually often consists of:
    1. Gathering data from various sources, lightly processing it, and putting it somewhere else.
    2. Organizing existing data structures and algorithms into objects.
    3. Making separate pieces of code communicate (building your own middleware)
    4. Fixing bugs or making minor tweaks
    5. Adding or changing user-interface
    6. Listening to and understanding requirements
    7. Re-doing what has already been done a slightly different way (legacy code maintenance)
    8. Writing and maintaining high-level scripts to automate mundane tasks.

    If you ever want to get to the algorithm/data structure level, be prepared to stay in school another few years or pay your dues with a lot of work on 1 through 8.

  4. One of the biggest Achilles-heels in software development is that computers allow to people quickly create systems that are more complicated than any one person could ever understand well. One of the biggest misconceptions about software is because computers are inherently logical, one can always find a concrete, correct answer for any problem. These two phenomena are not un-related. To put it another way: Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. ~Brian W. Kernighan
  5. One of the luxuries that a software developer often strives to have is the opportunity to work exclusively in programming languages or technology areas he or she is an expert in. Unfortunately, most real-world projects and bug-fixes require sparse bits of basic and advanced knowledge of many different topics. You will often find yourself reading single pages of many books and articles just to fix a single line of code. After working in industry for a few years, you are likely to find yourself a “Jack of all trades, master of none.” Consequently, a developer can potentially invest much time in his career in specific areas such as MFC, OLE, OpenGL, and still not have gathered enough skills to feel satisfied as comfortable or “proficient” in any of them. See the second part of item (2) for a possible solution.
  6. Learning to develop software without being overly dependent on a certain environment is another aspect of the real world that new software developers will need to get used to. There will be many times that for some reason, good, bad, artificial, or unfair, you will need to develop code without free, popular libraries (STL, Boost), without garbage collection (Java, C#, etc…), or without wizards or an IDE (Visual Studio). While it’s not much fun to parse a text file using little but C, fscanf(), emacs, and gcc, you should be able to do this to a reasonable degree upon request. No on expects you to be at your best here, but you can’t go to pieces without your favorite tools.A related point: Larger, older companies often have made investments in technologies years ago that are, by the popular software media’s standards, “obsolete.” While MSDN Magazine will tell you that COM, MFC, and Windows 2000 are dead and that .NET and web-services are what you need to know in today’s workplace, unless you’re working for a small startup company, you’ll likely find that many of the books you’ll need to buy for your job still have copyright dates from the nineties.
  7. Software development, if nothing else, will drill the idea into your head that everything works in theory, but in practice…do I really need to finish this sentence? :). While everything that you learned in your computer science degree is important, you will see your four years of study bastardized, satirized, perverted, and disregarded every day in most software-oriented workplaces. Your job is to make an attempt to use what you have learned as much as is practical while allowing for the reality of deadlines and customers. To put it another way, software development is not unlike your typical feel-good movie where a young, inexperienced teacher takes a job in a poorly funded, inner-city high school, is overwhelmed at first, but through charisma, dedication, and unorthodox techniques, ultimately makes a difference. Your mileage may vary on the “makes a difference” part.
  8. The best software developers are the ones who can cope with, in a diplomatic, team-friendly way, all of these frustrations, even if they are against them in principle.

8 Responses to “Thoughts on Software Development”

  1. 1 Allen Taylor April 19, 2008 at 2:01 pm

    Nice writing. You are on my RSS reader now so I can read more from you down the road.

    Allen Taylor

  2. 2 Dawn April 19, 2008 at 7:00 pm

    So, what you are telling me is that I should send Jacob to you in about 4 years to learn the skills he will need just in case he wants to be a software developer when he grows up? :).

  3. 3 Nancy April 22, 2008 at 8:56 am


    Excellent article – I really appreciate your great Thoughts on Software Development, I have bookmarked it for later viewing and forwarded it on.


  4. 4 matjew April 27, 2008 at 11:23 am

    a fun guide to the challenges of programming as a career….

    having been a manager of some pretty significant software development projects, i’d have to question the utility of computer science degrees.

    People who were trained as straight engineers, with degrees in Engineering, Mechanical Engineering, or even just straight Math or Physics majors, showed both an analytical mind and an ability to learn How Things Work, without much to UNlearn. CS majors, and the like, people with ‘certificates’ and such, thought they knew how to do things– but couldn’t get with the program easily, so to speak. Too many preconceived ideas. Combination detective/ engineer is the best.

    True engineers can figure out how ANYthing works, not just code: a spaceship, a satellite, a door lock, a coffee maker, a phone, etc. Familiarity with different codes or standard programs can be useful, but in my experience, nothing beats a good engineer.

  5. 5 Software Development April 28, 2008 at 12:37 pm

    Congratulations for the anniversary of your software company i think you was feeling very happy at that time……

  6. 6 Padameshwar Nongthombam August 23, 2008 at 7:45 am

    “Thoughts on Software Development” is unique in its own sense and you have highlighted every aspect of it.Great Work.

  1. 1 EquMath: Math Lessons » Blog Archive » Thoughts on Software Development Trackback on April 19, 2008 at 1:19 pm
  2. 2 Update on “Thoughts on Software Development” « Saag Monster Trackback on August 22, 2008 at 6:52 pm

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: