Advice on How to Become a Programmer

A Software by Rob reader writes:

I want to learn to program computers:

  • What is your advice on becoming a good programmer?
  • How do you acquire the knowledge?
  • Is it necessary to know mathematics, specifically algebra, to be a good programmer?

I receive several emails per month along these lines, so I’ve decided to share my advice on the subject. Note that I said “my advice” and not “the one and only way”; there are too many paths for one person to know them all. Here are some thoughts based on my experience:

Q: What is your advice on becoming a good programmer?

Everyone I’ve talked to has taken a different path. Programming is different from other engineering disciplines; if you want to become an electrical engineer you go to school, graduate, work for an engineering firm, and one day take a test and get licensed. Programming is different because people do it as a hobby; no one designs electrical subsystems for fun. This creates more possibilities for learning how to code.

Here are the elements I think are key:

  • Learn, learn, learn. You must have an insatiable appetite for knowledge. This usually means reading a programming book every few weeks in the early days, and moving on to more conceptual books like The Pragmatic Programmer, Code Complete, and Facts and Fallacies after 6-12 months of full-time coding. I can’t stress enough the value of reading, nor the value of immersing yourself in code early in the process.
  • Transition into Concepts. Learning how to be a good programmer begins with learning logic concepts and language syntax; they are much easier to understand when taken together. But good developers quickly desire knowledge that transcends language syntax. Perl, PHP, Java, ColdFusion, ASP…all languages I used in my first 18 months as a professional programmer. What made me a good programmer was not my knowledge of each language, but my desire to understand and refine concepts like D.R.Y., the broken window theory, and code re-use.
  • Hang Out With Programmers Who Are Better Than You. As a guitar player, the most I ever learned about the craft of songwriting was when I was hanging out with people who were much better than I. The same goes for writing software. And due to this new-fangled internet thingy you don’t even have to be physically present to be a part of the community: read programming blogs from the heavy hitters (Scott Guthrie, Rocky Lhotka, Dino Esposito, Scott Mitchell, etc…), check out programming forums, and look at other peoples’ code. Reading source code can be a pain, but the more you see the more you will be able to identity code that’s easy to understand, and code that takes a PhD to figure out how they output “Hello World” to the screen.

Q: How do you acquire the necessary knowledge?

There are a number of possibilities:

  • A Software Apprenticeship. If you haven’t ready my article on Software Apprenticeships, I recommend you do. The best (and I would argue the quickest) way to become a good programmer is to write code under the wing of an experienced developer who will teach you not only the basics, but the in-depth knowledge that takes years of experience to learn. I consider this option leaps and bounds above all others.
  • Learning while Doing. Want to learn to code? Get a job writing code. I don’t care if you make $5 an hour; you will progress more in 1 month as a full-time developer than you will in a year of hobby programming. There’s no better way to learn to program than to write code.
  • Books & Mags. Books and magazines have been key in my quest for programming knowledge. When I’ve apprenticed developers in the past, I use books as their primary source of basic knowledge, having them read 1-2 programming books per month, while teaching them more advanced techniques in person.
  • College. Having gone this route myself I am well aware of the limitations of the U.S. College system in preparing students for a career in computer programming. Preparing them for a career in determining little-o and big-O notation, sure, but actually writing code from the get go? Nope. College is great for high-level theory, but work experience trounces it when it comes to learning software development.
  • Tech school. I’ve only worked with one programmer who went to a technical school and she had good knowledge of language and coding concepts, but not a ton of theory or design knowledge. As a result, her code was utilitarian and used a lot of brute-force, but was often not well-designed or easily maintainable. There’s obviously a balance between not enough practical knowledge (college) and not enough theoretical knowledge (tech school). I am using a very narrow sample, so don’t take this as a blanket judgment of tech schools. Perhaps an SbR reader with more experience in this area can enlighten us. As an aside, the network administrators I’ve worked with from tech school have been well-trained and great to work with. Perhaps the nuts and bolts of networking are better suited for such a practical teaching approach.

Q: Is it necessary to know mathematics, specifically algebra, to be a good programmer?

Quite simply, no; it’s not necessary to know math in order to be a programmer.

If you’re developing games, then mathematics and physics play a large part, but building an invoicing application does not require much beyond basic addition and subtraction.

However, from personal experience, people who have an easy time learning mathematics and enjoy solving logic problems (be they algebra or how to move Mount Fuji), tend to learn code quicker and enjoy it more in the long run. It takes a twisted mind, my friends.

==

If you are interested in reading more on the subject of becoming a programmer, I’ve written a totally free 33-page ebook titled How to Become a Programmer: Everything (Non-technical) You Need to Know. You can download it here.

Start Small, Get Big
Growth Secrets for Self-Funded Startups. It'll Change Your Life.
What you get for signing up:
  • A 170-page ebook collecting my best startup articles from the past 5 years
  • Previously unpublished startup-related screencasts
  • Exclusive revenue-growing techniques I don't publish on this blog
"The ideas and information Rob provides should be required reading for anyone that wants to create a successful business on the web." ~ Jeff Lewis
Startups for the Rest of Us...
If you're trying to grow your startup you've come to the right place. I'm a serial web entrepreneur here to share what I've learned in my 11 years as a self-funded startup founder. Luckily several thousand people have decided to stick around and join the conversation.

For more on why you should read this blog, go here.

15 comments ↓

#1 http:// on 03.20.07 at 8:38 pm

Saying that a programmer doesn’t need math, and algebra in particular, is a little misleading. And I say this as a person that thinks that CS students are given far, far too much math. The concepts embedded in modern programming are derived largely from algebraic thinking (functions, variables, order of operations, to name a few). Also there are concepts and terminology that just don’t make sense without some algebra background. (Even in non-mathematical applications.) It is easy to overlook the importance of that background when it is something most of us take for granted every day. Can you program without math? Sure. But I’ll bet a construction worker can build a house without a saw, too. :)

#2 Robert on 03.20.07 at 9:17 pm

I equate programming to art. Anyone can be taught how to paint but only a few can be artists. In other words if you want to be a programmer for your own sake by all means take whichever path you are comfortable with (college, books, internet research, etc.). If you are looking to be a really good programmer I would first ask yourself if you are truly analytical. If you can’t think and problem solve you aren’t going to go too far in software development. Oh you may be a job and be paid decent but you will stagnate quickly. As for math, I would say you don’t have to have math but it does teach you how to think and that is more valuable than being able to pass any course or certification.

#3 Mike on 03.20.07 at 10:09 pm

Algebra. For sure. No doubt.

#4 Tim Rowe on 03.20.07 at 10:16 pm

I agree with what’s been said previously, being a programmer is just one of those things which you either are or aren’t. It’s not something you can teach someone to be, at least not if you expect them to be in the very best. One piece of advice I’d give is “play around with things”. Especially things you don’t understand. I don’t like the whole learning from a book thing, and having to look through others code to see how things have been done can be extremely rewarding. Good ideas for this would be to open up and try to get your head around things like IRCDs, MUDs, lightweight HTTPDs etc – things which have specs and standards which are out there, which you can interact with and write tests/apps which use them, and you would also typically have a pretty good idea what’s going on from generally using them day to day as a client. This gets you exposed to others people code – some of which will be good, some of it will be terrible… and some of it will be so utterly brilliant you’ll be wishing you knew how they came up with that uncommented code block which just works. My other strong advice is to have a little hobby project of your own. Something which others use is better, but it has to be something you use and rely on. Something which when it breaks, you have only yourself to come back on to fix the problem (of course, you can and should ask for help). But make sure it’s something that interests you, because a boring application might just leave you disinterested, and then the project, which you’re using to learn with, just goes away.

#5 http:// on 03.21.07 at 3:02 am

I see two kinds of programmers. Those who turn of their computer at 16:00 and go home and those who forget what time it is and just want to solve the problem and learn something in the process. I belong to the latter kind (as do you, or you would not be reading this blog) and I really have no problem with programmers working 8-16… except when I have to work with them or read their code. There is a price to having high standards and a desire (some would say need) to solve something in an elegant, refactored and perhaps optimized way using what you learned yesterday. I find that facilitating knowledge between people in such a vast domain can put you in quite a dilemma when a superset and a subset of knowledge meet but the subset is unaware of this or perhaps just a little naive. Does this sound familiar to anyone else and how do you deal with these issues? Is it an HR problem? Is it management? Or should one simply find somewhere else to work?

#6 http:// on 03.21.07 at 12:06 pm

Mostly, I agree with what you say. If you want to be a great programmer, and not simply a good one, I do think you need math. The more math you have the more problems you’ll be able to solve (and see.) Most of the really interesting problems involve math. After all, how many 3-tier accounting apps can you do before you pull your hair out?

#7 Rob Walling on 03.21.07 at 4:13 pm

I have to disagree with you, Matt (see the first comment). Equating math to a construction worker’s hammer seems a bit ambitious. A huge amount of people build software without any real knowledge of algebra. Sure, they learn about if-thens, while loops, and boolean logic and so indirectly are learning a form of math, but I’ve worked with plenty of good developers who are terrible at math. I think the two fields are related, but one does not require the other. And Dave, I would agree that the more math you know the more interesting the problems you can work on. But telling someone who has never written a line of code that they should go out and learn algebra before doing so would be poor advice. I don’t know much about this person’s background, but if he’s looking to break in to programming he’s probably going to start by building 3-tier applications. I’ll let him get a year or two into it and realize that there’s more to programming than CRUD.

#8 http:// on 03.22.07 at 1:01 am

I actually have a lot to say on this topic, but I don’t want to blow up your page with 100k of comments! I doubt we actually disagree all that much. That said, I would hate to have a 14 year old read your post and think they can blow off math because it doesn’t have anything to do with programming. For better or worse, the field of programming was built in large part by math nerds, and that is an obstacle no matter how you actually get the knowledge in your head. Oh, and I’m one of the developers you’ve worked with that is terrible at math, btw. :)

#9 http:// on 03.22.07 at 1:09 am

Oh, wait, you said you’ve worked with *good* developers who were bad at math. Maybe I’m overstepping myself here!!!

#10 Tim Weaver on 03.22.07 at 1:11 am

How to become a programmer in 10 days… LOL. There are lots of paths to becoming a good programmer. There are lots of different types of programmers. Those who say that someone who turns the computer off and goes home at 5pm aren’t good programmers are simply not correct. Being a good programmer isn’t about willingness to spent most of your waking time in front of a computer [I do agree that time in front of the computer helps but it isn't everything]. Having the ability to solve complex problems is very important. The desire and ability to constantly learn is important. Understanding that no matter how good you get someone is going to know more than you is important. You want one piece of advice I would repeat what someone else already wrote: Hang out with those that know more than you. That is the best way to get exposure. When they show you something or do something you don’t understand go find out how it works. If you can’t then ask!

#11 Dave Thieben on 03.22.07 at 5:40 pm

I would tell someone wants to be a programmer that the world has enough “programmers”. What we need, and what you want to be, is an “engineer.” I run into lots of “programmers”, folks who have read “Learn C# (or whatever) in 21 Days” and think they can program on 100k LOC systems. If I were guiding a young person looking to get into software, I would teach programming, yes, but only as a faceting of software engineering: – Learn how to gather requirements. – Learn how to design a system based on the requirements, and look for design patterns, such as n-tier, MVC, etc. – Write your code so that it is testable and maintainable. – Learn to WRITE TESTS!! – Learn to refactor. Honestly, programming *should* be about half of what an engineer does. Also, build a website. From scratch. Host it on your computer using something like No-IP or DynDNS. Keep it updated and add all sorts of dynamic content, like a blog. Read other’s blogs. d.

#12 http:// on 03.29.07 at 5:04 pm

Dear aspiring programmer, Before getting into programming, one must realize that it is shadow work. I’ve heard a lot of writers answer, when asked the same question, that the main requirements are to spend some time doing posture exercises. The same would apply to programming, except that most of the people you’ll work for won’t care for what you’ve written, only for what it looks like. If you want to be somewhat recognized for your work, it is therefore essential to work with a good graphic designer. Programming is more than a job, it is a vocation. Despite all your best intentions, you must understand that you will never get enough free time to write all the software you wish for, join all the user groups that will make you grow (professionally) and read all the blogs that will lead you towards an incredibly overwhelming skill level galore. Keep in mind, that even though you dance to the gospel of the pragmatic programmer, the smell of mediocrity will always follow you close. Don’t let yourself be impressed by the oversized egos of some of your playaholic pairs. They’ve worked so hard to get there, they’ve turned their skill set into an identity. My best advice to you would be to choose another field. Look within yourself and ask yourself what is it that inspires you about programming. Then, look for a field that will better satisfy your aim and jump heartily into it. Think of it. Becoming great at something requires a lot of practice. Would you rather invest decades of your life to become the best human-computer interface in your local company or would you prefer to develop an understanding some other field and gather the vision necessary to invent a revolutionary product which you could improvise by learning PHP by example in 24 hours? If it’s good software that you want, you can always hire programmers. They are easily replaceable and they come cheaper and cheaper, even really good ones. That’s because we are making so many of them and most of them aren’t very good at selling themselves. Just learn to recognize the good ones: they want to work for you because they wish to survive and prosper through coding.

#13 http:// on 03.30.07 at 2:31 am

Hi! Nice article, I really appreciate good writings like this. I will tell my story which is about what if you are not a good programmer. Me and 3 of my friends gone 3 different college in Europe, if you live in the USA you have to know that the education a way harder than there. The European education system don’t drop out thousands of graduated programmers every year, only a few percent. Nowadays you can stay in school as long as you want, it was different years ago. What you can expect here is very hard math for years, almost in all prog/math class. Anyway so I never had a good logic for programming or I never was good in math, my friends were. They were both kicked from their school after a year. So they started to work in real life but as I know only later in the IT. Today they are not rich but they can live from that. I finished my school after 8 years ( yep it would be 4 ). And I get job at a java developer company, but after I started I have had absolutely no clue about many things and they won’t be exactly helpful. I can’t hold the deadline I quit and I get other job. The others was entrants in the stuff but at least we helped each other but this was a small company and they hardly can get high profile jobs. So after months the two founder just quit and gone, they got jobs at another company. Till now I hardly get any money from it. After that I worked as php developer because as I thought it’s easier than the othe languages. Currently I’m unemployed. When I try to get some jobs (most of them c++ around here) they require 4 years of experience, and now I know it was a wrong decision to waste so much time from my life. I want to learn 3D stuff now, 3D studio, maya etc. So just a good advice for anyone who don’t have good problem solving, logic, math knowledge, learn for something else… Markie

#14 http:// on 03.30.07 at 3:08 am

In response to the CS student that complained about too much math – realize that Computer Science is NOT programming. That is like saying materials science is construction. Unfortunately, most students aren’t aware of this difference until halfway through their degree. If you like fairly abstract math theory, or want to deal with advanced models, do computer science. If you just want to write code, maybe take programming course, but then practice!

#15 http:// on 03.30.07 at 5:32 am

Tech Schools are a crap shoot. The one I attended was great. There were a couple instructors who were very accomplished practitioners and a couple classes were actually borrowed from the nearby university CS program. It could just as easily go the other way. What helped me even more was going straight to work in a shop that just adopted XP and teaming up with the senior engineer who was as good as they come. Couldn’t have worked out better for me.