I can FizzBuzz! Where do I go from here?
May 6, 2013 8:26 AM   Subscribe

I am teaching myself how to program. But there seems to be a big gap between intro courses/resources (CodeCademy, O'Reilly books, Learn X the Hard Way) and Actually Doing Things. Help me figure out a road plan?

I know HTML and CSS pretty well. I know a teeny bit of PHP and JS and MySQL, and even less of AJAX/JSON, but enough to mess around with existing CMSes and hack together simple custom solutions from StackOverflow and Google. I'm starting to learn Python (I've gone through Zed Shaw's Learn Python the Hard Way). I've also done the Javascript track on CodeCademy, and I'm starting on the "build a search engine" CS 101 course on Udacity.

I'm finding that a lot of the recommended intro resources for these things kind of start off at the same place - basic logic, loops, conditionals, etc. - and then say "Okay, go do stuff". But the stuff I want to do tends to be several orders of magnitude beyond what the intro books have taught. Shaw's book is a good example of this: I can build a CYOA game in terminal! Great. How does this translate to...actually writing a program with a GUI and how do I integrate this with some form of data storage and oh god there's this thing called garbage collection that everyone talks about and ahh.

A lot of advice you see out there is "just start programming!" but I honestly don't even know where to begin. I see cool projects on Github and I can't begin to understand the source code. I also know enough to know that it's really easy to screw things up, and I feel like I don't know nearly enough (or anything at all) about best practices for writing secure code, minimizing run time.

What I'm looking for:
I do really well with structured/project-based learning, which is why the Udacity course seems promising. Just straight-up reading the documentation of the various languages tends to make my brain spin. Can you recommend a guide / a road plan for how to incrementally step up from FizzBuzz to something resembling Actual Skill? Maybe something like Project Euler that isn't quite as math based.

[Extraneous info, possibly useful]
What I'm already doing:
  1. Trying to work on personal projects that are just a little bit beyond what I feel comfortable with. This is fun, but I also can't help but think I'll have a lot of gaps in my knowledge if I only work on things that I can envision, and I can only envision things that are based on the skills I already know.
  2. Reading StackOverflow to see other people's code, posting stuff on CodeReview when relevant.
  3. Slowly (slowly) working my way through the Python Challenges.
What I would like to do with this skill:
  1. Professionally: be a kick-ass web developer. I work as a front-end dev now, but most of what I do is CMS customization (WP, Drupal) and while that is its own niche, it also seems very limited in terms of professional advancement.
  2. Personally: be one of those people encounters a problem / has an idea and can write a script to fix it. This might include stuff like "I need to find a way to integrate RSS content from disparate sources into a uniform-looking output" or "I want to interact with the Twitter API and do cool textual analysis with it" or anything else.
  3. Blue-sky thinking: get to a place where I could build a web-app/service that is actually helpful (or entertaining) for other people. Not because start-up VC blah, but because helping people is awesome. For example, a thing that I'm building for myself right now is a habit-tracker with lots of built-in data-wankery with respects to streaks, averages, trends, etc. It's just PHP and MySQL right now (I haven't gotten to the "graph this data" stage yet) but I could see this being something that people might want.
posted by Phire to Computers & Internet (16 answers total) 104 users marked this as a favorite
 
Identify a concrete task that you want to accomplish.

Break down that task into sub-components, and, if necessary, break those sub-components down further. Atomize the steps necessary to complete the task; that is, break it down into its smallest constituent parts.

Then master each part sequentially.

So, for example, you say you want to write a program with a GUI and integrate it with data storage, etc.

Write up a concrete description of this project: "I want to develop a piece of software with a GUI and a data storage component that does X. The GUI will have the following features:..."

Etc.

Then break this down into the smallest pieces you can: Step 1: learn how to program the GUI in Python. Step 2: ... etc.

Then build it all together.

Wash, rinse, repeat.
posted by dfriedman at 8:32 AM on May 6, 2013 [1 favorite]


I pretty much find it impossible to sit down and learn a skill, even if that skill is within my abilities (with programming as the best example-- I've programmed in the past, but don't know the newer languages in the least), is to figure out a project and make sure that project is within the scope of the time I'm allowing, and the skill level I can expect to achieve in that time.

To figure that out, in put my programming (e.g.) friends under a hot lamp and make them tell me about how easy or hard the project is, and let them use their judgment to guide me. This is not the same as asking them to teach, though I ask, and often they offer, to help find the right resources.
posted by Sunburnt at 8:41 AM on May 6, 2013


Get a job. Lots of small companies will hire people with limited experience, and you can start building your skills by solving work problems.

For example, in my career, working as the IT guy for a small law firm gave me opportunities to build things like a "Who's in the office?" webapp for our intranet, things like that.
posted by colin_l at 8:49 AM on May 6, 2013 [1 favorite]


I would pick up a book on Data Structures and/or Algorithms.

While it is pretty heavily math based, it'll give you the tools you need to solve bigger programming problems. CLRS is pretty much the standard for learning algorithms. I have yet to find a good data structures book, but the principles behind them have been around for decades, so finding a book that explains all of them shouldn't be too hard.
posted by hellojed at 8:50 AM on May 6, 2013 [1 favorite]


There is a website called 5 lifejackets to throw to the new coder which is aimed exactly at you right now -- what to do when you know the basics of programming, and want to actually do stuff.

It's by Lynn Root, who also gave a talk at PyCon US about it a couple of months ago.

She's actively looking for input on it, so if you have problems with it I bet she'd be stoked if you emailed her and told her what you had trouble with.
posted by oranger at 9:13 AM on May 6, 2013 [8 favorites]


You didn't mention if you have any experience with object oriented programming. OO is going to be a requirement to work on any serious programming project. Luckily, there are a zillion books on the subject.

Software archetecture (requirements, design, development lifecycle, testing, etc.) is a good thing to familiarize yourself with. At the very least, it will teach you some of the key words that the HR people were told to listen for :)

Learning about data structures is very abstract but it can help you write efficient algorithms. The book that I used (but neither recommend nor remember the name of) gave examples for sorting algorithms that could cut processing time from centuries to seconds. The math is heavy duty but if you remember calculus and linear algebra, you should be fine. I didn't, so had a hard time.

As you probably already know, programming is one of those things that can only be perfected through practice. The actual act of figuring out how to do something and working out the bugs is where the sausage gets made. It sounds like you are doing well with this part. That's why getting a job as a web developer is a very good idea. I work as a Ruby on Rails dev. I knew nothing about Ruby or Rails when I started. I fact, I knew about as much as you do now. Since I started last year, my skills have exploded with all of the practice I get.

Very few IT managers are going to realistically expect you to be a drop-in replacement, especially if you are honest about your skills at the outset. A lot of your OJT is going to be learning how your company's specific application(s) work. You'll hone your programming skills as you work through your expected learning curve.

It's great that you want to be a guru. We all do. Just keep in mind that competent programmers are a rare enough commodity.
posted by double block and bleed at 9:23 AM on May 6, 2013


Also, if you can't get a job as a developer (I freely admit that I was pretty lucky), look for an open-source project that interests you and throw yourself into it. I will help you with your skills and give you something to put on your resume.

Remember: everyone started somewhere.
posted by double block and bleed at 9:27 AM on May 6, 2013 [1 favorite]


Trying to work on personal projects that are just a little bit beyond what I feel comfortable with. This is fun, but I also can't help but think I'll have a lot of gaps in my knowledge if I only work on things that I can envision, and I can only envision things that are based on the skills I already know.

I wouldn't worry about that. You can't actually envision everything you need to do in the project (this is actually a major problem in the software engineering), and if you focus on finishing the project completely, you'll run into all sorts of problems you didn't anticipate, and you will grow. I think getting projects into an actually usable state rather than letting it go once you've gotten the gist of how X or Y is done has helped me become better more than anything else.

There are just so many different paths through programming and computer science that I don't think it's efficient to learn some principle, say sorting algorithms, in anticipation of running into it. I always used to think that it was nuts that people came out of college not having done any memory management. Now, I think it does help in some situations to understand that stuff, but I've run into plenty of capable developers that have never allocated memory directly. I'm not even sure traditional object-oriented programming is universally useful as it used to be, what with the rise in prototype-based programming.

However, definitely take the time to learn a few sorting algorithms if you sorted something yourself in a naive way and that turns out to be too slow. I think that you'll take learning a principle to heart if you've already experienced the problem it solves.

Whatever you do, I wouldn't expect a smooth path to skillfulness. While writing about programming emphasize how smooth and clean some technique or framework is, part of the reason this kind of writing is so appealing is because developers spend so much time suffering. So, things are not as neat and clean as the example code you see, and you're having a hard time, don't put that on yourself.
posted by ignignokt at 9:29 AM on May 6, 2013 [1 favorite]


Trying to work on personal projects that are just a little bit beyond what I feel comfortable with. This is fun, but I also can't help but think I'll have a lot of gaps in my knowledge if I only work on things that I can envision, and I can only envision things that are based on the skills I already know.
This is OK. Even if you were to do a four-year CS degree and then land a job at Google for several years, you would still have skill gaps that correspond to everything you haven't done. This is true for everyone. The only way to combat it is to identify gaps and go try and fill them. There are more things to know than you will ever have time to learn, so choose carefully.
Professionally: be a kick-ass web developer. I work as a front-end dev now, but most of what I do is CMS customization (WP, Drupal) and while that is its own niche, it also seems very limited in terms of professional advancement.
Start learning about scalability. Make sure you understand Complexity Theory - O(n) - and then learn how to apply it to actual web services. The trick is getting path the academic algebra and into rough empirical approximations. Reality is what matters here, not the Platonic ideal. Eventually, you will start to see where reality and the math meet.
Personally: be one of those people encounters a problem / has an idea and can write a script to fix it. This might include stuff like "I need to find a way to integrate RSS content from disparate sources into a uniform-looking output" or "I want to interact with the Twitter API and do cool textual analysis with it" or anything else.
The key to this skill is successful estimation. At first, everything is equally hard, so you just go after whatever you want. As you develop more experience, it will be clear which problems can be solved in an hour, an afternoon, a week, a month, or a year.
Blue-sky thinking: get to a place where I could build a web-app/service that is actually helpful (or entertaining) for other people. Not because start-up VC blah, but because helping people is awesome. For example, a thing that I'm building for myself right now is a habit-tracker with lots of built-in data-wankery with respects to streaks, averages, trends, etc. It's just PHP and MySQL right now (I haven't gotten to the "graph this data" stage yet) but I could see this being something that people might want.
Make up a list of Things Which You Think Might Be Helpful, and start working out how to solve them.

That said, if your goal is to help people rather than bang out code, you may want to look into developing project and program management skills rather than pure dev skills. Dev skills will certainly be helpful if you want to shift into a PM role, and may be a gating factor if you want to get into top companies like Google, so your coding work won't be wasted.
posted by b1tr0t at 9:36 AM on May 6, 2013 [1 favorite]


I'm going to disagree with b1tr0t and hellojed; while you should definitely learn about complexity theory/scalability/algorithms at some point, having been in exactly your shoes they're simply not necessary at this point. For me, what helped was looking at some task I performed on a regular basis and deciding that instead of doing it manually I wanted to write code to do it for me. If you've got a repetitive task at work, that would be a good candidate, but you could do something like "build a basic web app to check my Twitter feed and display it" instead.

(Also, when you say "I feel like I don't know nearly enough (or anything at all) about best practices for writing secure code, minimizing run time."... it's good that you're thinking about security already, but ignore run time for now! If you're not already, you soon will be familiar with Knuth's famous saying: "Premature optimization is the root of all evil.")
posted by asterix at 10:03 AM on May 6, 2013


Oh, and since you mention security as a concern, you might consider the Matasano crypto challenges. (Which I heard about from this Pinboard blog post.)
posted by asterix at 10:08 AM on May 6, 2013


Thanks for all the helpful answers, everyone! I'm resisting the urge to mark every answer here as a best answer because you've all helped me figure out how to think about how to proceed next - which will include reading up on at least the basics of algorithms and architecture so that I get a better idea of what's possible while continuing to poke away at my pet projects. I've signed up for the Matasano challenges, and 5 lifejackets to the new coder also looks exactly like what I'm looking for.

This has been extremely helpful and educational, so thanks again.

(If you have more to add, I'd love to hear from you!)
posted by Phire at 1:05 PM on May 6, 2013


Learning the brain teasers is challenging and fun, but actually making things work is where the rubber hits the road. At least for me and how I learn. Give me some problem to solve, and I find it much easier to be engaged and learn the material. There is a difference between theoretical knowledge and practical knowledge.

So write scripts to do stuff. I wrote a backup script for my computer because I didn't understand scripting, or backup software. So I figured out how to do both.

I wanted a way to unzip zipped files that automatically deleted the source file, so I wrote a script to do that.

Once you get the basics of actually processing real data, every new challenge becomes just a little bit easier.
posted by gjc at 5:04 PM on May 6, 2013


I wrote my first lines of Python in the same Udacity class about a year and a half ago, and started a job as a professional developer last week. Just keep practicing!

Since you've done some Python already, I recommend building a Django app and hosting it on Heroku. The official Django docs and the Django Book are great resources that won't make your head spin. Heroku also provides excellent docs, and will help you focus on building an app without all the extra work of managing and configuring your own server. Maybe also try the Rails Tutorial. Ruby is a lot like Python, and you might prefer one framework, language or tutorial.

Once you've worked through an example app and built a small project of your own, check out Udacity's web development course (one of the followups to CS101). You'll learn all the things you did wrong and how to fix them.
posted by ecmendenhall at 8:02 PM on May 6, 2013 [2 favorites]


Here's a possible concrete task for you in Python.


You can use httplib or http.client in Python to get pages from the web, and put all the text from a page into a string variable.

You can use "Inspect Element" in Google Chrome to look at HTML on Metafilter. For example, each comment has class="comments" on it.

You can use regular expressions to find stuff in that text you got from a webpage. So, you could count the number of comments to a metafilter post.

You could then go back a page, figure out a way to get the URL of every metafilter post for the last year or so. Maybe figure out how to get the day of the week.

Count the comments on all of them.

If you want the most responses to your post... what time of day, day of week, or week of year are the best for getting lots of comments? If you exclude the top 5% of commented posts (to cut out posts that were just best-of-the-year)... does the answer change?


You can also do this on EBay; to make the most money from a sale, which day of week/time of day should your auction end? Does the start time matter? Etc etc. Which auctions should you bid on, and which ones should you avoid?


Or, with basic python and maybe a week of tinkering, you can learn to mine the web directly for answers to questions that could be pretty darn awesome to have. After doing this two or three times, it becomes an hour of tinkering instead of a week.
posted by talldean at 8:27 AM on May 7, 2013 [4 favorites]


talldean's suggestion is a good one, although if you're going to go that route I'd suggest using Requests for the HTTP portion and Beautiful Soup for the parsing.
posted by asterix at 6:23 AM on May 8, 2013 [1 favorite]


« Older 3 Left Hands. Weird.   |   Audiobooks for the technologically illiterate Newer »
This thread is closed to new comments.