In Response to a Letter from a Beginning Programmer

I received a heartfelt response from a new software developer in response to my “What Do You Need to Become an Elite Developer?” blog post. With his permission, I decided to post his letter and my response – with his name omitted.

Hi Aaron,

First, I want to thank-you for the article you wrote concerning becoming an elite programmer. I have not read it through entirely as of yet because I am overly tired making it difficult to process properly, so I will do so once I have had some rest. I did feel a sense of urgency to write this e-mail to you while I had it in my mind.

I made a career change to become a developer last December, and spent six months learning Ruby. I got my first position as a developer in July of 2014, and was in the position for six months.

I needed an entry level position, but the position was a little bit over my head in terms of the work I was required to do (Building REST APIs, Consuming with AngularJS, using Kendo Grid, all of which I had never done before. And in Java, a language I had never used). I learned to do the work, but I just was not fast enough to keep pace in an Agile environment with developers that had coded through high school and college, or who already had years of experience.

That position was in Java, using Spring and Hibernate, and AngularJS. I am currently unemployed and am looking for entry level positions in .NET. Since I left my last employer, a friend of mine who was always suggesting I learn to program suggested a tutorial in .Net for me to get started.

I rather enjoy C#, .NET, and the Entity Framework. Having never used visual studio before, it is a breath of fresh air to use, providing I have the memory resources to use it :) (which I do, finally).

One thing eats at me though, as I learn the language and the framework. I do not feel I am becoming any better as a programmer. My longing as a developer is to write code with the same mastery as I speak and write the English language. Therefore, I am really wondering what the next step is to become a stronger developer. It is a question that has been eating at me for months now.

I don't want to be a google coder, or tutorial coder, etc. To me, it is a big problem if every time I need to write an essay or a letter, I always have to have some grammar book showing me the structure of a sentence or paragraph to make sure I'm getting it right. I understand this is necessary when learning a new framework and new language, but it should not be necessary 75 percent of the time.

Anyways, I've made this e-mail long enough, and I'm sure you have plenty to do.

Any advice would be much appreciated.



Here’s what I wrote back.

Hi [Redacted],

I know a few friends who've gone through this journey - making the decision to change careers to programming sometime after graduating college. You actually remind me a lot of the cofounder of my new, yet-to-be-announced startup. Graduated from University in 2008, made the decision in 2011 to become a programmer after several years of being a marketer. I'm in the process of training him on .NET from the ground up now.

I can tell you first and foremost that based on your description of your learning process, you're on the right track. Most "google coders" stop once they reach the bare minimum to perform menial work and coast along from there. Org charts around the world are staffed with thousands of rank-and-file programmers who make it a goal to maintain the status quo and never learn anything new. This is why VB6 and Perl are still alive and well in the industry. The fact that you want to move beyond this from the onset immediately puts you in a more economically desirable group of programmers.

So let's talk about the role that tools and frameworks have in the course of learning how to be a developer. As you've mentioned, learning Java or .NET doesn't really feel like they're making you a "better" developer than you were when you just knew Ruby. You're not wrong for thinking this - knowing how to write a "Hello World" in three languages isn't much more useful than being able to write it in one language.

What will make you a better developer is learning some general principles and practices that are platform-agnostic, and then learning how these principles are applied on each platform becomes tremendously valuable. For instance, learning how to do "design by contract" is going to be radically different experience on Ruby than it is in .NET or Java - because the type system, the OO model, and the runtimes all have starkly different implementations. It's not important to understand why they're different now - but that should be a goal as part of your learning.

What are some of these platform-agnostic principles that you should learn? Here's a list of the ones I've prioritized in my own career:

None of these concepts are specific to any programming platform - they are universal skills. Once you learn these, you will discover how to take advantage of specific aspects of each programming language to do them better - Ruby's weak typing system makes it very easy to write testable code, for instance. Whereas C#'s strong typing system makes it very easy to enforce "design by contract." Don't worry about what these terms mean yet - you'll discover them with time.

You will be most successful in learning how to program if you begin by understanding what others have done. Do you think Hemmingway or Steinbeck became great writers by writing tons and tons of work from day one? No. They became great by reading tons and tons and tons of work from generations of great writers who preceded them. Programming is no different.

So find some successful .NET open source projects that you feel passionate about and attempt to understand what those developers have done - not merely what they did, but why and how. Then learn how to bring this knowledge to your own work. Eventually you will develop your own style, but it will be better served if you inform it with the best practices of people who were once in your shoes many years before your own time.

Best of luck!

Discussion, links, and tweets

I'm the CTO and founder of Petabridge, where I'm making distributed programming for .NET developers easy by working on Akka.NET, Phobos, and more..