Becoming an awesome programmer
September 15, 2012 3:21 PM   Subscribe

If I wanted to become a badass programmer, where would I start? Let's say I have no experience now, and by the end of this road, I want to be able to write code for anything - websites, iPhone apps, etc. Please map out a plan on how you'd do it - what you'd read, etc. Thanks!

I understand there are many types of programming languages and this is an incredibly broad question, but you still may have some good advice so let's hear it.
posted by rastapasta to Computers & Internet (17 answers total) 59 users marked this as a favorite
Peter Norvig gives this advice, and I endorse it:
posted by value of information at 3:28 PM on September 15, 2012 [15 favorites]

From the advice:

Get interested in programming, and do some because it is fun. Make sure that it keeps being enough fun so that you will be willing to put in your ten years/10,000 hours.

This is the number one thing I want to know about junior devs I interview. Certain people just love programming, certain people don't and see it as a career.

"Tell me about your personal projects"
posted by mattoxic at 4:37 PM on September 15, 2012 [3 favorites]

I don't know any programmer who can write code for anything and everything, at least not with great expertise. Programming is a huge field, with so many languages, frameworks, variants, complexities, etc. If you look at the StackOverflow website, you'll see a non-stop flood of questions from programmers around the world. Or look on Elance and see how many sub-categories of programming skills there are. Nobody can master all aspects of programming...the knowledge is much too vast and constantly evolving and growing.

The way you will be able to "write code for anything" is by spending a number of years learning and practicing programming, and then the situation you'll be in is you'll have a good foundation for learning anything new you need to learn in the future. You won't already know everything you need to know, but you'll be better able to learn whatever new knowledge you need to learn to write code for something new to you.
posted by Dansaman at 4:44 PM on September 15, 2012 [1 favorite]

I would get a computer science degree, which would have the dual purpose of giving me a solid theoretical background in programming and qualify me to much more easily get jobs where I could be paid to accrue my 10000 hours/broad experience/inspiring contacts/etc. Not sure why this is such unpopular advice these days.
posted by animalrainbow at 5:06 PM on September 15, 2012 [1 favorite]

Four years of undergraduate work in Computer Science. Five years of professional work at a big company where you can use those skills. Google. Microsoft. Amazon. Apple. Two more years of that while doing a part-time MS in Computer Science. Four years at a start-up that requires you to push the boundaries of what you know adding new platforms, new languages, new tools. Another year somewhere else really focusing on a hard problem. The whole time working on personal projects, reading books that range from abstract theory to practical cookbooks, discussion with other nerds, and eat lunch with people smarter than you.

At least, that's how I did it. People come to me and ask me to build whatever. I don't care what language, I don't care what platform. I guarantee if you do all that, at the end of it, neither will you. All I care is how much I'm going to get paid and if I have the 24hrs I need to go read up on it.
posted by jeffamaphone at 5:30 PM on September 15, 2012 [4 favorites]

I'd start by going through something like codeyear to get a very basic idea of programming. Then I'd choose something fun and not overly ambitious like tetris or a card game and try and program that in python, c# or maybe c++. Now you can expand on it, make your tetris program a "client" that contacts a server with a score and keep track of it. Make a website display the top 100 scores of players. Make an iOS tetris app that talks to your high score service. etc.
Now it's mostly about practice. Once you have enough experience programming, picking up a new technology (ie iOS) is not going to be so hard. You won't be the expert who's been programming in it for 10 years, but you can make an app, and after a few years of making even more apps, you'll know the iOS platform and pitfalls better - and soon enough become an expert.
To become "badass" make sure you're always doing something new and challenging for you. Learn a new language or technology. Try a new strategy - functional programming, unit testing etc. Or you can become an expert in a specific technology. Learn how the JVM is programmed from within. How different settings change the way it garbage collects. The different tools of java and what they help you do.
As long as you keep pushing out at your boundaries, and practice you are on the right path
posted by uncreative at 5:42 PM on September 15, 2012 [1 favorite]

Make a website. Then make an iPhone app. If you think that won't be enough, make two of each.
posted by michaelh at 5:51 PM on September 15, 2012

Write code. Lots of it. Like about a half million lines or so. There is no way around this.
posted by smcameron at 8:26 PM on September 15, 2012

Dansaman is right. You evidently don't realize just how big and varied computer software is. I'm retired now but I spent 25 years working as a software engineer -- and I don't know jack about how to write compilers, or how databases work, or how you write an SMP kernel, or any of fifty other things.

No One knows it all. After fifty years, software isn't one field. It's about thirty different fields which have little or nothing to do with one another.
posted by Chocolate Pickle at 8:40 PM on September 15, 2012 [1 favorite]

The question he was answering was different so his answer is a little harsh, but it also contains some good advice. From b1tr0t.
posted by mlis at 12:03 AM on September 16, 2012

Great advice up thread. This doesn't answer your question, but don't be afraid to move on if you do are not feeling it after getting your feet wet. Programming requires extremely good abstract thinking skills and many if not most people just are not wired that way.

If you are asking for career purposes then there are a lot of options working in Technology that do not require you to be a rock star programmer (although understanding the basics of coding will be helpful).
posted by seesom at 6:00 AM on September 16, 2012

Pick one thing you'd like to program. Doesn't matter what it is, just keep in mind it's probably not going to be the first thing you program. And it shouldn't be, because the first thing you program is going to have horrible, horrible code and your awesome dream project isn't going to be scalable on that horrible, horrible code. That's fine, don't worry about it.

Just pick something. Then learn the basics of programming in whatever language(s) are required to build that thing. You'll build other things along the way first, of course. You're not going to learn what one language is good or bad at, or how to optimize your code, without doing a bunch of stuff first. You're not going to realise that the first thing you made is made with horrible, horrible code until you look at it much later, after you've learnt more. Get used to that because you're probably always going to look back and what you did before and think "why did I do that?!" as long as you keep learning more about not only whatever language you used but also good programming practices in general.

There are tons of tutorials in a variety of languages all over the Internet. They're easy enough to find, hence why I'm not linking to anything. Plus there's TONS of programming languages.

You'll probably never get to a point where you could program anything off the top of your head but you can get to a point where you can feel extremely comfortable programming certain types of things (e.g., mobile apps, websites, self-driving cars) and understand enough about programming in general that picking up a new language should become a lot easier for you. You'll at least be able to cut down on the amount of time you write horrible, horrible code, although you'll still think of it that way when you look back.

That said, I don't think you'll get there without two things: One being that you have a natural knack for it to some degree. You need to be good at assembling the pieces of what you're building in your head. Some people aren't. It doesn't make them stupid, they're just not good at that particular thing.

The other thing: You need to really like doing it, not just the idea of doing it well. Programming needs to be something you enjoy on its own terms. If it's not something you particularly like, you're going to hate it by the time you get to being "bad-ass" at it.

Anyway, some other things to keep in mind:
  • No one is a "rock star" programmer. Rock stars play music and have sex with everyone. Some programmers might also do that but I doubt it has anything to do with them being programmers.
  • Enjoying programming doesn't mean you need to spend 20 hours a day in front of your computer programming. It'll probably happen from time to time if you love programming but you're not any less of a "bad-ass" programmer if you have other interests.
  • Being a bad-ass programmer doesn't mean you necessarily run the next billion-dollar start-up or come up with a revolutionary new concept that will take the Internet by storm or even design a web page that looks half-way decent. While there are programmers that can also do those things, they don't necessarily have anything to do with programming beyond what programming makes possible.
  • If you want to make a living out of this, you don't necessarily need a degree, but you do need to know how to communicate your understanding of languages and concepts. Make sure you know your terminology if you go looking for a job.

posted by DyRE at 6:46 AM on September 16, 2012 [4 favorites]

There are indeed badass programmers. There are not many, but they exist. You usually don't hear about them because they are too head-down in a project that consumes them to get much notice. (They also don't get paid like rock stars, they usually get paid much less than specialized programmers because they love the work much more than the paycheck.) I am not a badass programmer, though I have professionally written code in over a dozen different languages. So that's where my bar is set for "badass".

Badass programmers don't really think in computer languages (Javascript, C, Haskell, Ruby, etc). They think in the ur-language of computers, in the capabilities. All languages ultimately do the same thing, just muck about with CPUs. Most languages have strengths and they all have weaknesses but they all have similarities. They all have ways to create or summon data, analyze and manipulate it, and act on that data. Languages (And the computers they run on) vary with their ability and ease that they do that stuff, but they all do it. They're really good at breaking a concept down into smaller and smaller chunks until they get a hunk small enough to hook some computer language on.

In fact calling them "languages" is a bit of a misnomer. A language is something that you have to study for years to be proficient in. Computer languages are more like recipes. Two recipes might be different, they might use metric vs imperial units, might have the ingredients and instructions in different orders, but at the end of both you'll get a chocolate cake. When you learn a new computer language you're really learning how to read and write a different recipe format. You already know what a cake is. You're just arranging it to use the units, ingredients, and tools that your computer understands. Some languages understand what "whisk into a foam" means, some don't so you either look it up and see that "froth" is a good substitute or you explain whisking with words it understands.

So learn a language, any language to start. Whatever looks like it lets you do something cool that keeps you interested and excited. (You can tell by looking at other people's projects and finding things that you'd like to different or better.) Make sure it has good documentation and a helpful community so you can get your questions answered. But while you're learning keep a steady eye on the big picture. Think about the ideas of things like conditionals, loops, data structures. Other languages have all of these things, but they might call them something different. Or they might implement the features differently. But there are things in common between them all, keep an eye out for that. After you've learned the basics of a few different languages you get a feel for these things and you can pretty easily jump into a new language with the basic reference guide and Google to answer the question of "How do I do X in language Y?" and you should become adequately proficient with only a few weeks study.

Look at other people's code. When you're learning, borrow liberally and tinker with it. See how it works, how that person solved the problem. Then repurpose it to solve a similar problem, or solve the original problem better or more gracefully or whatever.

Also spend some time early on, after you have the basics of two+ languages under your belt, studying Assembly Language. You will probably write little of it when working in your bigger projects, but it gets you very close to communicating directly with the CPU, which is what all of these languages ultimately do. It will be invaluable in understanding why languages do the things they do at a higher level, why some things work fast or slow, why two similar things take up ridiculous amounts of memory why others are lean, etc.

But I'll repeat the 10,000 hour advice up-thread. You really have to put in the time. And you constantly have to put in the time. You have to respond well to challenges and be willing, if not downright anxious to learn new things. The first 5 computer languages I learned in the 80's and 90's are now obsolete. Three others that I've used for gainful employment are rarely used any more. But there is new, wonderful stuff coming down the pipe all the time. Badass programmers spend more time looking at reference docs than programing. They do't memorize the specifics, because they have a feel for the lay of the land. If you're a programmer who never needs to look at the reference docs you're at a dead-end job.
posted by Ookseer at 12:54 PM on September 16, 2012 [3 favorites]

I realize the question is about becoming a "badass" programmer, but I have some more modest advice for becoming a competent programmer.

I didn't learn to program until I was 27 and wanted a new career. My degree was in Biology and I had spent a few years playing in bands and stuff. I didn't even know how to use a spreadsheet. A friend who was a programmer suggested it as a good self-starting career. His suggestion (keep in mind this was about 1997) was:

1) Learn SQL and about how databases work.
2) Learn a compiled language that's commonly used in businesses and learn how to use it to get data in and out of a database. I picked the old Windows Visual Basic but today I would suggest C# or Java. I'd skip C++ to get started.
3) Learn some front-end technology that lets you show the data and lets users add and update data. At the time it was VB forms apps but obviously today Web apps are the way to go, so you'll need to understand HTML, Javascript, and CSS and some server-side technology that spits that stuff out. I am a C# guy so that's ASP.NET for me.

That's enough to get you employed and keep you employed. Later you can start learning mobile apps or more hardcore languages, or specialize in some way. Nthing the idea of picking a simple project and going with that. Make sure you work deliberately through a book (or course) on the above items. I read "SQL For Dummies" like 15 years ago and I still get senior developer applicants for my team that don't know things from chapter 1 and 2 of that book ... it's good to know the theory and practice.

Also, I've been able to succeed without being much of a hobbyist programmer, mainly due to a few good habits:

1) Document your code. Many people don't.
2) Draw stuff out on a whiteboard or notepad and think about the way things fit together before getting into detail.
3) Communicate with users and don't adopt a "non-techies are dumb" attitude. Honestly, a lot of programmers and programs are pretty dumb in that they don't do what the users want in a straightforward way.
4) Be willing to ask people for help and listen to what they say.
5) Google everything.

Oh, one more thing - it helped that I was able to get temp jobs where I could work on my programming stuff at work. For example, I had a job doing Excel reports for a sales team and I just started writing VBA code, getting raw copies of the source data to run queries on, etc.

Good luck!
posted by freecellwizard at 8:42 AM on September 17, 2012 [2 favorites]

Learn one language.
Build things with it.
Learn where to ask questions.
Learn some theory.

Learn another language.
Build things with it.
Learn where to ask questions.
Learn more theory.

After two rounds of that, you'll do pretty well. I'd suggest Python as a first language, as it's very versatile and easy to learn. I'd suggestion either Java, C#, C++, or Objective-C as a second; they're all object oriented languages, and it's very good to know one of them. Alternatively, learn Java or Objective C first and work on smartphone apps. teaches Python and quite a bit of theory, and is probably a decent starting place.
posted by talldean at 2:18 PM on September 17, 2012

Just do it. In private at first. Don't be embarrassed. We were all horrible when we started. Just do something simple, then something more complicated, and more, and repeat.
posted by arantius at 8:15 PM on September 17, 2012

At the current job I hold, I have coded in html, css, javascript, jQuery (part of javascript, but frankly a language in its own right), PHP, Actionscript, MXML, R, Python, and recently cracked open some C#. This after no prior on the job experience, except for coding R for this same place, and coding R and html/css at an internship elsewhere between the last and current project(s) at my current employer.

Prior to those, I had taken courses in C++ and Java, which are fairly similar languages on the surface. And prior to THAT, I had taken courses in HIGH SCHOOL, on PASCAL and BASIC. I am approaching my 10 year anniversary of being introduced to programming (placing it about the Fall of 2003, but if I really think about it I was tinkering with LEGO Mindstorms RCX coding back in 2002, before High School).

Soo... what can I offer in terms of advice here?
  • A lot of programming is pattern recognition and creation.
    • So you might be interested in playing some semi-addictive puzzler games such as Tetris, Puzzle League, and some side scrolling action video games that you find interesting just to loosen the mind up a bit.

  • From there, dabble in a few languages, note similarities, differences, and the nature of those differences.

  • Do a few more languages to let this sink in, then you're pretty much good to go

The first answer's link had some very very good advice. In essence, if you ever get "the knack", remember where you came from as you make use of it. Make your code as easy to read as possible. Don't work too hard on that, however, because you'll eventually get there are a few crowds: those that get it, those that kind of get it but aren't ready, and those that certainly cannot get it.

Theory is useful in terms of memory management and speed issues you will encounter.

Top all of this off by getting in the habit of, somehow, tracking the latest trends in programming. Attend conferences and even some simple presentations should do, keep an eye on ArsTechnica, SlashDot, and other tech news sites, etc. That will give you incentive to stay nimble.

Best of luck and cheers!
posted by JoeXIII007 at 7:52 PM on September 19, 2012

« Older One hunts a squamp with bait.   |   Help me pick the right email address Newer »
This thread is closed to new comments.