Hacker News new | ask | show | jobs
by wiseleo 4370 days ago
I consider background completely irrelevant. With sites like c9.io, he can have a coding environment in the cloud and access it from any web browser, including a random library computer.

What needs to happen is inspiration. If you can inspire someone to believe in himself and show how comparatively easy current technologies are, you should be able to ignite the self-sustaining desire to get better.

My approach would be to pick a funded company that resonates with him and clone it. There are plenty of them that can be cloned in a day. This will demonstrate that building software capable of attracting funding is not difficult and that becoming an engineer on such a team is easier than pursuing professional sports.

Once you decide on the target, systematically disassemble the site and discuss what makes it work.

Install git, setup a local repo and a repo on bitbucket, and instruct the student to 'git commit' after substantial changes and 'git push' every so often. It's never too soon to introduce version control.

Starting with HTML, talk about DIVs and nothing else. There is no need to talk about other tags. Explain that DIVs are the building blocks and demonstrate a page built of just DIVs and no other tags. Fill it with Lorem and style with Bootstrap. Ignore AJAX until much later.

This will lead into CSS. Explain how CSS is used to style DIVs so each element looks different.

Now I would talk about Bootstrap and how it changed the way we build web apps.

Once CSS is a relatively clear concept, lead into jQuery but don't talk about JavaScript in general. jQuery would be introduced as a way to interact with DOM.

JavaScript is a confusing language to learn as a first language. It may make sense to shift gears and talk about Ruby and Python, whichever one is more familiar.

By now, this person should be ready to learn about control structures, loops, and other basics of programming. It is difficult to get motivation to learn that without a reason to learn it.

I would introduce real programming by following the BDD methodology. Teach the student to write tests before talking about how to make them pass. It is so unusual that it should be intriguing. I am not familiar enough, as of this writing, whether Ruby or Python have a better integrated testing frameworks, but I will explore that in detail later.

Once the student has a solid understanding of Ruby or Python, I would only then introduce JavaScript and map the concepts from Ruby or Python to JavaScript. By now prototypal inheritance will not seem as alien and brackets and semicolons will be just extra things to type.

AJAX and oAuth as well as the concept of REST APIs would be next.

Finally, let's go to the cutting edge and tie it all up with Meteor and Velocity testing. This will introduce nodejs, MongoDB and mobile app syncing.

Just say no to PHP. We thankfully have alternatives to it now.

As for books, I would advise the student to get a library card at a library that has access to either Safari Books Online or Books 24x7. He will then have access to the bulk of O'Reilly titles. I prefer the Headfirst series when getting started with a new language.

Little known fact: as a resident of the state you can get a library card from any library within that state and different libraries have different resources. This means he doesn't have to be limited to whatever library is local to his community. I have 7 library cards.

Hmm... this might inspire me to produce a video course based on this outline and test how well this theory might work. Lean startup methodology applied to teaching could be interesting. Saving this post for reference. :)

1 comments

Thanks for the well thought out reply! The course layout you have written out is quite thorough. The only thing is that for someone who does not have any programming background, they need to see immediate results to gain an understanding of how powerful code is. That is why I thought Html/CSS is a good starting point and then go in deeper.

I am open to other methodologies, and we can talk more on email if you would like. Would love to exchange ideas and resources (email in profile)

It's a bit radical, but I am tempted to test it. :)

I am wiseleo on just about every website and gmail, so feel free to send me an instant message.

For me, seeing an executable test spec for the first time was very surprising and revealing. There is an entire book "Refactoring: improving the design of existing code" that teaches you how to name functions so your code reads like English.

After all, this is valid Jasmine from near the beginning of my test suite:

it("should return an array containing at least one object", function() { expect(menu.length).toBeGreaterThan(0); });

It reads like English. If you can show that code can be written like this rather than like typical code, you will notice an immediate jump in confidence.

If you show that in Rspec, where the alien-looking

function ( ) { };

is replaced with

  do
end

and expect('should do something useful') becomes expect "should do something useful"

it becomes even more approachable.