A professional full-time programmer can do a great job by continuously learning from their work. How can an amateur programmer train to become a good programmer?

** If you like to play music or sing, you can do it because it is your hobby and you are interested, and you can become a good singer or music player. But you do not need to become a professional singer or do singing for a living. Is this also true for programmers ? Any amateur programmer who is famous?

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
If this question can be reworded to fit the rules in the help center, please edit the question.

3

Right. So Wozniak wasn't a good programmer until the first Apple was sold (and he thus became a "professional").
–
KeithSOct 24 '11 at 20:30

Define "good"..
–
user1249Oct 24 '11 at 22:59

2

Every "good" programmer was once an amateur.
–
spudwaffleOct 25 '11 at 5:44

15 Answers
15

The key to becoming really good is working in a good team. Many amateurs work alone, so they only get that far. In a team, you learn from others, and you become disciplined because your peers will hit you with whatever comes handy otherwise.

For that reason, I propose you join a team, e.g. an open source project, or make a hobby project with some friends.

The road to become good at programming is the same as for singing or playing music: practice, practice, practice. If you spend enough time regularly developing software for several years, chances are you will become good at it - be it inside or outside working hours.

Now, apart from spending more time practicing, there is another reason why professionals usually become better than amateurs in a certain sense (in music as well as in programming). If you are a professional, you have to do tasks which you don't necessarily like, but belong to the wider job of developing software (e.g. testing, discussions with customers, writing documentation, setting up dev/build environment, writing build scripts etc). And every now and then you are also pressed to step into unfamiliar areas, to learn new languages or platforms. As an amateur, you aren't forced to do anything you don't want to, which makes it likely that you stay within your comfort zone for most of your life. In other words, you can easily become limited to one or a few specific areas you are most fond of, and miss a lot of opportunities to learn and grow.

OTOH many professional developers fall into this as well, staying at the same company doing the same routine job hardly learning anything new for decades... So the key to become better is your attitude. If you keep learning, and consciously look for opportunities to move out of your comfort zone into new, unfamiliar territory, you will eventually outperform those swarms of slowly fossilizing "professionals". A good way to this may be contributing to some open source projects.

Although a professional has to do the unpleasant jobs, there's another side to that - those unpleasant jobs are often dull, tedious jobs that teach little. IOW the amateur can often learn more in the same time by choosing to develop interesting projects. BUT one important lesson is, of course, that you have to be prepared to do the dull and tedious work. I especially like your "contribute to open source projects" because that means working with someone elses code - learning by example, how to read unfamiliar code etc.
–
Steve314Oct 24 '11 at 12:28

@StuperUser your link is broken (second parenthesis not included in the hyperlink).
–
PaperjamOct 24 '11 at 16:39

Some of the best advice I ever read, "If you want to become a decent artist, draw. Every morning, do a sketch, you can't help but get better".. find a project.. there are plenty of non-profit's out there that need help.. ask for advice ("I'm building an invoicing system, where do I start?", "How do I handle contextual security?", etc).. the cost of failure is low, and you might just get a paying gig out of it..
–
Bobby DOct 24 '11 at 18:49

@Steve314, better professionals will write tools to automate mundane tedious tasks. By using the right tools for the right job, I've reduced the time for some tasks by factors of hundreds. (Even better tools might have been able to automate away that task completely, but I reached what felt like a good balance of tool-writing effort and time-saved.)
–
sarnoldOct 24 '11 at 22:43

But for an amateur programmer, how can train to become a good programmer?

You become better by learning, which is part doing, part reflecting over what was done.

So basically, theres no difference between hobbyist and professional, but the 'pitfalls' are arranged a little different.

Amateur Pitfalls are, imho

the need to finish your project, no matter what, is not as strong when you're not professional. This can be a good thing, because you will not get that used to cut corners when it comes to quality, but finishing (at all! on time is even better) is a very important skill, which is harder to train as an amateur, because it's easy just to let a project die and start another one.

the need to communicate well is not as strong. On a professional project, there is a strong incentive to really understand the customers, even if they are completely unable to form just one coherent sentence of what the problem is they want you to solve. If you misunderstand them, or (the usual case) don't notice, that they dont talk about something you need to understand, it will become your problem, sooner or later. An amateur project can easily loose all potential users, due to not solving their problems, and be 'finished' in a technical way.

Professional Pitfalls are

there's often little motivation to get better. You're there 40h/week, no matter if you find the cure for cancer or just drink coffee in a way that looks productive. Learning is something you do mainly for yourself, and often, if you try to apply the things you learned, there are forces that work against that (conservative groupthink, hierarchies, even styleguides can be used as weapons against improvements). It takes a lot of love for the profession to not just give it up, hack down your hours, and look for alternate purposes in life.

there's often little to learn from. Yes, one CAN try to take everything as a challenge, but we have to be honest: after 1 Year of the Spaghetti code you aren't allow to refactor ("you're complicating it!") in a language you have more years of experience in than it will probably last, the only thing one learns is to build a tolerance against frustration and corporate politics.

If you play music, or singing, you can play it for interest, you can
still become a good singer or music player, but not need to
become a professional singer, or do singing for living.

You of course don't need to, but how many Musicians would turn down an opportunity to actually quit their job and make money with their music?

In IT, these opportunities are a little more probable than in Music, therefore i think, it's not that it is impossible to become a famous amateur, but oftentimes, the amateurs make their passion their job (with similar problems musicians have when they have to figure out their line between commerce and art)

This hurts my soul its so true for me atm, lol. 1 Year of the Spaghetti code you aren't allow to refactor ("you're complicating it!")
–
TerranceOct 24 '11 at 16:44

1

"there's often little motivation to get better." if I ever had any employee that treated software development in that manner, I'd rather fire them than a person who tries to do better even if they're breaking things inadvertently from their trying.
–
user7550Oct 24 '11 at 17:20

@Chris Marisic: then i would be happy to work with you. sadly, you would be the exception in the line of my employers
–
kepplaOct 25 '11 at 7:16

+1 for "It takes a lot of love for the profession..."
–
Joshua SmithMar 25 '13 at 19:30

I'm afraid there are more possibilities for learning for the amateurs than for the full time corporate drones. As an amateur you're not confined with any given technology, environment, design and development methodology. You can do whatever you find useful for your personal development. As a full time developer you'd likely be working on a same product for years, following the same routine, limited by the same corporate guidelines. For most of us it is nothing but a stagnation. A little can be learned from a corporate environment, once you're familiar with the common basics.

That's the reason why many full time developers are also amateurs, they keep coding after work, they're playing with their own toy projects - it is a bit of freedom necessary for a growth.

Read websites like http://programmers.stackexchange.com/. I have been doing this for the past few months while sitting in the metro / train. It certainly helps reading other peoples' questions and opinions.

Attend free lectures, courses or seminars. For instance you could attend Java User Groups. Sometimes there are also free seminars for students.

Check out OpenCourseWare and do some of the university's practical assignments!

Of course you also need to apply your knowledge. Do this through an internship, a project with friends or study course. There are many ways to improve yourself, you just have be willing to invest your free time. Also, have fun learning something new!

it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, telegraph operation, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again.

As an amateur you have more options to seek out better practices than many professionals. Professionals are often under pressure to "just get it done".

I haven't seen any courses like I learned programming from, but I learned from some short (1-3 hour) free courses presented by the University I was attending. They were intended to enable Business people to understand code being written for them. The courses presented very well written code (comments included) that solved a common real life problem. The code was then reviewed with an explanation of the language features and why they were used the way they where. None of the full language courses I have seen result in code anywhere near the quality of what I learned from that course. It was a couple of years before I switched to studying Computer Science.

The Internet and library provide lots of resources and examples. I find many of the examples aren't very good for anything but getting it done. When looking at examples, look at the code first. Can you understand it purpose and structure without the explanation? If so, you may have found a good example.

Some key practices you should should learn and apply:

DRY (Don't Repeat Yourself).

DRO (Don't Repeat Other); Use the standard language libraries, use other libraries.

Keep code simple. Elegant code tends to be harder to maintain. Even worse, optimizers often produce slower machine code, than for the simpler code.

Modules should have only one purpose. (It is better if that purpose is either to do work or make decisions.)

Use good names. Don't use short names to avoid typing, use an IDE with auto-complete instead. Understand the naming conventions of your language.

Don't optimize your code. Wait until you can measure its performance and know that optimizing it will have a noticeable effect.

Keep learning. Learn to identify resources which will provide useful information you can use now.

If you like to play music or sing, you can do it because it is your
hobby and you are interested, and you can become a good singer or
music player. But you do not need to become a professional singer or
do singing for a living. Is this also true for programmers ? Any
amateur programmer who is famous?

Not at all. It's software engineering. It's not based on "natural talent". Being great programmer is based on years of education and years of experience. You only get that working on real projects.

Actually it is, to a significant degree, a natural talent. You cannot train a poor software engineer to be great, but you can generally train anyone to be good. It's a lot like musical or artistic talent, you can train almost anyone to be pretty good but you cannot train anyone to be great, they train themselves and are probably better than ANY of their trainers. Also like world-class athletes few have ever met a world-class programming talent which may explain why most programmers don't know they exist :)
–
Bill KOct 24 '11 at 17:50

On job interviews I've been to (on employer's side), I've always asked for stuff the interviewee has been programming as an amateur (except school assignments) - having done that is a sure sign of genuine interest in the field and having passion to learn on one's own. It's not only possible, it's almost a requirement for becoming good.

Is it possible? Yes. However, the more time you spend programming the more time you have to get better at it. Its been said it takes 10 years / 10 000 hours of deliberative practice to develop expertise at a technical skill. That's not 10 000 hours of doing the same sort of coding in your comfort zone (e.g., writing simple jQuery code for different websites), but 10 000 hours of learning/reading about programming/reading source code/writing source code/learning other languages/working with others, etc.

If you are going to devote that level of time to it; you might as well get a job as programmer and drop the amateur status. (Unless you are independently wealthy).

Everyone is an amateur at everything at one point. If you want to become a good programmer and it's something you enjoy doing, you will. The key is programming on your own. School will teach you next to nothing. Most of your learning will be done on your own and at work. If you want to be good, go be good.

given the real original meaning of the word (French amateur "lover of", from Old French and ultimately from Latin amatorem nom. amator, "lover" - Wikipedia), one would like to believe that a great number of professionals are also amateurs. If you don't love your craft, would you be practicing it?

Of course it's possible - if you love programming, you'll practice it and, over time, you will become good at it. (Maybe never great, given personal talents or lack thereof), but at least good

The real meaning of amateur is the meaning you find in the OED or NOAD. A word's etymology does not dictate its meaning. "One who engages in a pursuit, study, science, or sport as a pastime rather than as a profession".
–
Django ReinhardtOct 24 '11 at 20:38

true. perhaps I should have written "original meaning" rather than "real meaning." It is unfortunate that our current language doesn't have a common word for "people who do something because they truly love to do it." I do think that would help answer the OP's question, "Is it possible for an amateur to become a good programmer?" Of course it's possible - if you love programming, you'll practice it and, over time, you will become good at it. (Maybe never great, given personal talents or lack thereof), but at least good.
–
StevenVOct 25 '11 at 16:05

I don't what it defines a good programmer. But learning something their own and working with a group of people is something different. The passionate amateur programmers really in to learning new things and hacking. There were they find things more interesting. But working with a group of people is slightly a disciplined act where you collaborate, communicate, share/gain information from the experts in that area.

But gaining knowledge is only matters of passion. There are people who spent nights to learn stuffs themselves and finally end up bringing in something new to the world like Bill G Mark Zuck etc. Can't easily compare. but if you want to be a better Software engineer (I won't call Programmer) join in a company or work for some good products which is used by others.

To the question, "have any amateur programmers become famous?" The answer is "Yes, but most did not stay that way." The most famous example I can think of is Roy Fielding who did some of his most important work while (I believe) unpaid at University (amateur means un-paid by definition).

The trick to being of professional quality is having a mentor or set of mentors (such as a team in an open source project) and serious time dedication to the topic. As a formerly professional musician, my experience is that both of these are necessary to be good either as a professional or an amateur. Some can be learned by books, but without consistent external critique it becomes very difficult to get through bad habits acquired as a novice.

That said, in the case of the programmer, it is substantially easier to learn than that of the musician — it was my experience that as a musician it is much harder as a musician to see your pedagogical errors than it is to see code which just doesn't work. On the other hand, it also requires a substantially greater time investment to be a good developer.

Like anything else the best way to get better at something is to immerse yourself in the environment in which you wish to become good, and surround yourself with people far superior to you who are willing to tolerate you and teach you. Not easy to do, but that's what I've found is the best way to learn to be good at something the fastest.

But when it comes to being a truly gifted programmer, you have to be just that, gifted. If you're not a naturally talented violin player, you will never be as good as the masters no matter how hard you try or what instrument you buy. Likewise, if you don't have that gift that makes programmers truly genius you will never be them either.