Here is a hypothetical situation: I introduce you to a total n00b – some dude who is completely green, and has no programming experience whatsoever. Let’s give this hypothetical construct some generic name – for example Guy. I bring this guy into your office, sit both of you down and say that you have 3 months to make Guy into a kick ass Java programmer. Or Python programmer. Or Ruby. Whatever floats your bout. I’m going to use Java for the sake of consistency but feel free to mentally substitute it with your favorite language of the month. Either way, you have 3 months to take him from absolute zero to a point where he can be given a moderately challenging assignment to work on. He will be working on the back end, writing complex algorithms doing some sort scientific analysis or will end up writing some crazy GUI stuff. Here is the language, here is the deadline, make it happen! This is all you will be doing, and you are free of all your other obligations until this teaching project is done. Could you do it?
Let’s assume that Guy is fairly bright student who has a good grasp of technology in general, and is fairly good at abstracting ideas and thinking in abstract terms which is kinda required here. Other than that, he is a blank slate – he never programmed before but he is eager and excited to start learning. I think this could be done – I think you could take someone like that, and train him effectively in a relatively short amount of time.
Our aim is to teach him Java but we will really be teaching him programming from scratch. He will become a programmer, and once we are done he should be able to pick up another language an learn it on his own. But we have to start with something to teach him concepts so we pick one. Right from the get go we can build a consistent curriculum that will start with the simplest “Hello World” example and slowly build him up teaching him the basic, then advanced concepts. It would be a fairly linear progression in a consistent environment. We teach him a new concept, then augment it, add another one, tie them together and so on.
The only time you actually have to shift gears is when you teach him about databases. You have to briefly take him out of the Java context to teach him SQL syntax, but at this point he should be able to grasp it quickly. You have to take him out of the OO paradigm to teach him the relational model. But that’s about it. As long as Guy doesn’t have to do any front end stuff for the web, it’s all clear and consistent linear progression. It is by no means an easy or trivial task, but it is relatively straightforward. There are few variables to worry about, and you always know where you are and where you need to go. When you finish, Guy will learn all the important concepts, and develop all the programming good habits he ought to have.
Now if I turn around and say, make Guy into a Web Designer capable of creating dynamic Web 2.0 applications the story changes a little bit. It is not an outrageous request to begin with – at least not much worse than the Java programmer one. It is still doable, but I submit that it is much more haphazard and confusing process. Web design is one of those areas that looks deceptively simple from the outside. I mean, how hard can it be? You write a simple back-end, slap together some HTML templates, dump it all on the server and you are ready to go. And it’s true – a lot of web apps are relatively simple to build. But taking someone from zero to a competent Web 2.0 designer dude it is really quite complex because all of the variables involved. For example, where do you start?
You could start with teaching Guy HTML which is easy. Every semester I teach basic HTML to my CMPT-109 students and I can assure you that all of them are from the statistical 60% population sample that will never be good at programming. But they all can manage to write simple websites that usually do not validate but look fine on your screen. I joke around that I teach them the wrong way to use HTML, but it’s kinda true. I usually don’t touch CSS because of the lovely caveat of browser support.
Anyone can write down bunch of HTML tags, but it takes patience and perseverance to learn all the quirky ways in which different browsers render certain things, and work around them. So the whole HTML experience is like a ride on an escalator that terminates in a vertical wall that must be scaled to progress any further.
Then you have to make yet another huge leap and teach him server side stuff. We could do Java but we are on a deadline, right? And we still have a long way to go. So let’s pick something that is easier to pick up – a scripting language. PHP is a popular choice – mainly because it is deceptively easy to learn. Unfortunately writing good, maintainable code in PHP is actually a form of art in itself because similarly to Perl, PHP really makes it easy for you to develop really bad coding habits, and really ugly code. But you can probably take Guy from “Hello World” to dynamic HTML generation to DB access very rapidly so it’s good enough for our purposes.
In contrast, a Guy the Java dude who doesn’t work with web apps usually wears a single hat. When he finds a bug, he fires up the debugger in his Eclipse and steps through his code until he figures out what is wrong. It is a much more straightforward process which requires almost no context switching at all.
So can you take Guy from zero to Web 2.0 hero in 3 months? You probably could, only it is going to be messier, grittier and less elegant process. Unless of course you cheat and use a framework like Rails one of it’s many clones.
This is why Rails is just a huge hit these days. It’s because it automates a lot of this petty bullshit that web devs deal with on daily basis, and brings some consistency into the equation. It allows a single developer to whip out a decent, functional application using consistent methodology, without switching context every 5 minutes. 90% of the code he will write will be in Ruby. And while Rails does a lot of stuff behind the scenes, the programmer hardly ever has to deal with it. Nevertheless, Rails like frameworks are still just a crutch – they are code generators. They spit out relevant markup and sql when and where it is needed. The whole environment is still the same haphazard mess, it is just partially hidden from the developer. It is a step forward though.
[tags]web design, teaching, teaching programming, teaching web design[/tags]