Programmer sestina

I have taken up Geoffrey’s challenge on writing a sestina. Man it’s hard! If you love seeking patterns in things, then see if you can figure out what a sestina is. If you’re stuck, well, here’s a hint.

Of course, I cheated a bit, since we all know hit songs are nonsense lyrics strung together. So if you don’t understand any line, it’s because I ran out of inspiration and just plopped something to fill the void.

The programmer sestina

Just like the life giving warmth of the sun
You can create a better world through your code
Even something as simple and mundane as water
This element of old courses the veins of a tree
With earth and air, ancient elements the other two
They fuse together, becoming a beautiful force

As a programmer, you wield tremendous force
You are not as solitary as the sun
Close by you’ll always find a friend or two
Spurring one another to write better code
Solving the very root of the problem tree
And cleanse the ultimate source of foul water

Learn to calm your mind, like placid lake water
Only to turn in a moment’s notice to a tidal force
Be unyielding with the will to grow of a tree
Reaching for greatness, reaching skywards for the sun
Technology advances with the rising quality of code
Or retards with the bad, these consequences just two

Counting in numbers, arithmetic base two
Should be easy and fun, like playing in water
If ever you find it hard to produce code
‘Cause of meetings, deadlines, pressure and force
Just look out the window, to feel the sun
And listen to the rustling leaves of a tree

Many roles you fill, more than leaves on a tree
You wish there’re more of you, like at least two
Trapped in dingy cubicles away from the sun
With no coffee, no tea, or even cooler water
You buckle down under corporate bureaucratic force
Churning out line after line of uninteresting code

Programmers solve puzzles and enigmatic code
Or use the concept of graph nodes in a tree
Or implement the formula of gravitational force
You’re unique, like the only even prime that’s two
You’re adaptable, filling needs and voids like water
So go out there and shine more brightly than the sun

Climb a tree and reach for the sun
Smell the brine water and dig into your force
You’re better than two extreme programmers writing code

Math is good

According to this article,

mathematics help students to develop a quantitative sense as well as a strong analytical and logical reasoning skills, which will assist them in acquiring new knowledge, be innovative and take calculated risks with confidence.

Strong analytical and logical reasoning skills? Isn’t that what you need when programming?

Then in another article,

most of the major problems we face are math and science problems

Time to brush up on some algebra!

Fibonacci sequence and Golden Ratio

Baby rabbits by Wee Gan Peng @iStockphoto

I haven’t written a math-related article in a while, so in this article, I’ll tell you about the Fibonacci sequence, the golden ratio and some associated program code.

Say you’re given this math formula, and told to find what the nth term is.
F(n) = F(n-1) + F(n-2)
where F(1) = F(2) = 1

Wow, initial conditions are given, a formula is given. Functions! In fact, use recursive functions! That was easy to code, wasn’t it?

What if you’re given this sequence of numbers and told to find what the nth term is?
1,1,2,3,5,8,13,21 …

You would get exactly the same answer for both questions. Notice that each subsequent number is a sum of the previous two numbers (except the first two in the sequence). Once you find the pattern, you can make use of simple loops instead of recursive functions. Generally speaking, recursive functions are slower, and you would not have known the simpler loop solution if you hadn’t analysed the problem first.

Of course, if you knew the numbers form the Fibonacci sequence, you wouldn’t have much of a problem in the first place, would you? You might have heard of it in Da Vinci Code, where the sequence was used to decipher a password number.

Now, the interesting thing about this sequence is that Nature uses it. I haven’t personally verified this, but sunflowers, pineapples and daisies exhibit the use. If you count the number of bumps on them going to the left, and the number of bumps to the right, you’ll find that the numbers are right next to each other in the Fibonacci sequence. For example, sunflowers have 34 spirals to the left and 55 to the right.

The rabbits, man do they breed!

There’s actually a story about how the Fibonacci sequence came about. You might have guessed that Fibonacci is the name of a mathematician. Anyway, the story goes like this. Suppose there are 2 rabbits, one male and one female. Each month, they produce two rabbits, again, one male and one female. The baby rabbits take one month to grow, and become sexually reproductive in their second month. In this manner, how many rabbits are there at the end of 12 months?

In the first month, there are 2.
At the end of the second month, there’s 4 (2 original, 2 babies).
At the end of the third month, there’s 6 (2 original, 2 from 2nd month, 2 babies from original).

At the end of the fourth month, there’s the original 2, the 2 from 2nd month, the 2 from 3rd month, 2 babies from the original 2, and 2 babies from the 2 of the 2nd month. Total rabbits: 10.

Just typing this out is confusing, but you can see a pattern emerging.
2, 4, 6, 10 …
Each subsequent term is a sum of the previous two terms.

Oh yes, the number of rabbits in the 12th month is 466.

Some obvious assumptions are

  • Rabbits never die
  • Babies are always produced in a pair, one male and one female
  • Moral values are not considered (incest shmincest!)

The golden ratio

There is another interesting thing. The ratio of F(n+1)/F(n) approaches a limit as n goes to infinity, which is approximately 1.618. This number is known as the golden ratio, with other names such as golden mean, divine proportion and others. Other than its mathematical relevance, I know it to be important as an aesthetic factor.

A rectangle with its sides in this ratio is thought of as aesthetically pleasing. This probably influenced the manufacture of computer screens. You have your standard 4:3s (1.333:1), the 800×600, 1024×768 and others. There are also some who tried the square root 2 ratio, 1.414:1 in computer applications. Then there’s the 16:9 (1.777:1) aspect ratios.

What’s the purpose of these aspect ratios? To approach the golden ratio 1.618:1. Of course, with widescreens, this point is probably moot nowadays. Still, it makes for interesting contemplation.

Ok, let’s do some coding, calculating the nth term using a loop, which I’ve hardcoded as 20. I’ll leave it to you as an exercise to write it as a function. The golden ratio is calculated as well. The first 2 terms are skipped, because they are equal to 1 (initial conditions).

int i;
int current, previous, next;
double phi = 0;
current = previous = 1;
for (i = 2; i < 20; ++i)
{
    next = current + previous;
    previous = current;
    current = next;
    phi = (double)current/(double)previous;
    Console.WriteLine("Term {0,0:d2} = {1,0:d5}, Phi = {2,0:f8}", i + 1, current, phi);
}

Fairly simple. The point is to convert a problem into a program solution. The difficult part isn’t the original problem, nor is it about coding skills. It’s about translating a problem into a program that’s difficult.

There you have it. Math theory and supporting program code. Hope you enjoyed it.

Update: Commenter Patrick pointed out the existence of the closed-form expression of the Fibonacci numbers. Thanks Patrick!

Exploits of a mom

Here’s a comic strip I recently read. I can’t remember whose RSS feed I read it from (sorry!), but I Googled, and found the original source (I hope). Here’s the link: http://xkcd.com/327/

Shrunk a little to fit into the width. Click to enlarge.
Exploits of a mom

When I read it, I laughed and laughed. I did LOLs and nearly did an ROTF. So I shared it with my fellow colleagues. As expected, no reply. However, one fellow asked me what the joke was.

So I explained it to him, giggling and excitedly. Now I don’t know whether I’m happy that I explained the joke to him, or that I’m sad because I had to explain the joke to him. Seems like I’ve got some work to do about creating awareness on SQL injection and other security issues…

Repeatedly shooting hoops

Shoot the hoop by Matthew Porter @iStockphoto

I was walking around the arcade. Fighting games, 2D or 3D, were the rage once. Then there’s those dancing games, where you step to the beat on one of 4 floor panels. Then there’s driving simulations, where players strive for beautiful exit curve lines and cool looking drift moves.

I was walking around the arcade. One of my favourites is the shooting games. Time Crisis, House of Dead and recently Silent Hill. Why? Because they’re the ones with a story plot. And if the players are moderately good, I get to see the story unfold. If they don’t shoot at the screen to skip the cut scenes of course…

I was walking around the arcade. Recently, two arcade centres I frequent did some major shifting of their machines. Both pushed the same game machine type to the forefront, visible immediately upon entering.

This game machine was added quite a while ago, but from the rearrangement, I’m guessing it’s gaining popularity. And the arcades stack them side by side, 8 in a row. And the machine is one of the few that physically engages the player in the game.

It’s a basketball game machine.

Specifically, it’s a shoot-the-hoop game machine. There’s just enough space for one person to stand in front of it. What you do is simply, uh, shoot the hoop. Each machine has 6 basketballs, and at the start of the game, the basketballs roll downwards towards the player. I think an illustration is in order…
Basketball game machine side view
There’s a protruding panel that flips up and stops the basketballs from rolling down once the game ends. There’s also a metal grate to reduce the likelihood of basketballs bouncing out of the machine. Basketballs can bounce out very far if they hit the hoop at the correct angle…

I don’t know how many sets a player has in one game. Maybe 3, maybe more if there’s bonus sets. Anyway, each set lasts for 60 seconds. During those 60 seconds, the player simply try to score as many times as possible, throwing the ball and make it fall through the hoop. Each successful throw nets the player 2 points. During the last 15 seconds of each set, a successful throw is worth 3 points. If I understand it correctly, in the second and third set, the hoop will move from side to side, increasing the difficulty.

Why am I talking about this? Because I noticed a similarity among the good players. All of them had their eyes fixed on the hoop. Their hands just keep getting the balls in front of them and they just shoot. Their concentration is focused on the hoop, and they just keep shooting. And shooting. And shooting.

Basketball isn’t solely about shooting the hoop of course. There’s dribbling, there’s teamwork, there’s accurate passing. But this game machine allows you to practice the shooting, over and over again, in a very short amount of time.

I actually find watching the good players playing, rhythmically mesmerising. There’s something very elegant in the way they take up a basketball, hold it up, throw and score in one smooth motion. I’ve seen a player use both hands, as in right hand take up ball and throw. Then the left hand take another ball and throw. Left, right, left, right. How’s that for ambidexterity?

If you read this far, I appreciate your attention and time. And now for the crux of this entire story. If you find programming difficult, start small. Write small programs as proofs of concepts that you learn. Then write a lot of them. Write them in different ways. Rearrange code to test your understanding. Build on your understanding.

Say you just learned about arrays. Test your understanding. Write small programs iterating through them. Read values from them. Assign values to them. When you keep working with arrays, you get familiar with them. Then you get to the point where using them becomes natural to you. You know what you can and cannot do with them. Then you move on to another concept.

Programming is about putting together concepts and constructs. It’s when you’ve understood the basics, that you can think beyond them. That you can invent and write advanced software.

All software, great and small, are made up of the basic programming constructs. Variables, assignments, loops and more. All you need is practice. Practise writing code. It’s the same with learning a (human) language. The more you read and write it, the better you become at it.

The rapid repetition of just throwing basketballs and scoring, trains the player to become very good at it, in a very short amount of time. After one particular game, I checked a player’s scores. Close to 200 throws with 80 percent accuracy. That’s 200 throws in 3 sets, 180 seconds, which comes to about 1 throw per second. That’s fast. Not to mention tiring. Can you keep throwing basketballs non-stop for 3 minutes?

Becoming better at programming can mean just practising writing good code until it’s ingrained into you. Write more, write often and write small.

Chinese Lunar New Year office decoration

In a couple of weeks, the Chinese Lunar New Year will arrive. The exact date is on the 7 February (Thursday), and the 7th and 8th are public holidays in Singapore.

It’s a ritual. Once past their due, our unofficial office decorator will take down the Christmas decorations, and replace them with the Chinese New Year decorations. She even has a system for rotating decorations…

So along our partition walls, we have
Welcome spring
The four Chinese characters are (from the left), “welcome spring receive blessing” literally. Feel free to replace “blessing” with “fortune”. The last character is a bit ambiguous in meaning. In this context, it just means something good.

Then we have
Fortune god
It’s a traditional thing to have the typical picture of a boy and girl around somewhere in decorations. I’ll have to go look it up why… The two sets of 7 characters, one on each side, is a bit harder to translate. The rough translation for the left set is “lots of good fortune, happy every year”. It can also be “great fortune, prosperous every year”. Chinese characters pack a lot of meaning into one word… The right set translates to “God of fortune descend (arrive), meet (have) good fortune”.

The ceiling wasn’t a problem for hanging Christmas decorations, so this is a cinch.
Hanging fish decor
Those 3 characters literally translates to “year year have”, or “every year have”. Have what? That fish under the three characters? In Chinese, “fish” sounds identical to “abundance” (or “extra” to be exact). So that decoration signifies abundance in every year. In the past, when people were poor, this used to mean abundance in food, particularly rice, the main staple. Now it just means anything you consider to be good, like money or fortune.

And where the Christmas tree used to stand, the brightly and auspiciously coloured vase took its place.
Auspicious flower vase
The two orangey things are Mandarin orange displays. During the New Year period, we Chinese exchange Mandarin oranges (real ones) with each other. Why? Well, in Cantonese, Mandarin oranges sound exactly like “gold”. So we exchange “gold” with each other. More to the point, we give “gold” to another, and receive “gold” from another.

I know the phonetic similarities stretches meanings a bit, but Chinese are like that… *smile*

Difficulty transitioning from academic to professional

Graduation by Baris Simsek @iStockphoto

For some time, my current employer had been sending work offshore. Specifically, sending some programming work to China. I’ve been tasked with handling these invisible developers on and off. These developers are mostly fresh graduates, with no experience and barely enough knowledge to write something in ASP.NET or C.

There’s also a high turnover rate, meaning there’s a lot of developers coming and going. Anything more than a few months, and you can consider giving that developer a long service award. I think the reason for this phenomenon is that the developers are finding it difficult to transition from an academic environment to a working professional environment.

In school, if they can’t solve a problem or do a task, so what? Now, they have to do it. They have to do it by themselves usually. The familiar teacher and fellow students are gone. Sure, we provide guidance and be mentors to them. But we actually expect them to perform and give results.

I have seen some seriously detailed specs to them for development work. My thoughts had always been that, by the time I wrote something that detailed in a Word document, I could have used the time to write the code. I’ve always believed that sufficient guidance is necessary, but if I had to think for them the programming logic, then their coding ability is up for question.

The points listed below summarise some of my observations. Take note that they’re based on typical education environments and typical work environments. “Typical” is also based on what I know. Feel free to let me know how your situation is like. I’d love to hear your side of the story.

Standard answers

In an academic environment, you were given standard questions with standard answers. Sure, the questions weren’t identical, but the differences were really minor substitutions. As such, the method of arriving at the answers were standard.

In Singapore, we have what’s known as the “ten-year-series”. As in, “Have you bought the ten-year-series for chemistry?” What’s a ten-year-series? It’s a compilation of questions from the past ten years. Of course, a more appropriate name would be 20-year-series (or more) now. Students would practice and excel on the questions in the compilation, and were almost guaranteed good grades.

My guess is that it’s hard to come up with new and challenging problems every year, so exams come mostly with standard questions, plus a few tough ones to find the brighter students. Any teachers or any readers associated with the pedagogical profession, please feel free to correct me.

The work environment is different. You’re thrown new problems everyday. There aren’t standard answers to these problems. Heck, there aren’t even standard consequences from your solutions, even if they are correct.

For example, you could have solved a difficult technical problem with a brilliant answer. If the customer suddenly didn’t want to do that project, you still failed. Or your superiors are unappreciative morons, and brushes your efforts aside. Be brilliant in the right areas.

Flexible hours

When you’re in university, your study hours were so fluid, you could have lessons packed one day, and be totally free the next. Some people took this uncertainty and developed self discipline. They were able to organise their time even though their timetables jumped all over the place from one semester to the next. Some people weren’t blessed with this fortitude, and whiled their time away.

Come working life, you’re expected to put in hours. You’re expected to be in the office at a certain time, and “allowed” to leave at a certain time. Googlers and other employees of companies with more open policies, you rock.

Suddenly, your freedom is gone. You feel chained, you feel like the creativity and the fire in you die… Stop that! You’ve obviously chosen a profession ill-suited to you. Take this opportunity to learn about what your work is, then move on to something better.

Or better yet, work with your employer and see if you can arrange something more flexible. Working from home or more flexible work hours are options you can ask for.

Theoretical

I don’t know about you, but much of my university days were spent proving some math problem. Or writing programs illustrating the use of some theorem (math or computational science). I didn’t know how injectivity and surjectivity was going to help me in life, but I learned them anyway.

Your job in a professional capacity is to solve problems. Real world practical problems. Your solution suddenly makes a difference, for better or worse. It doesn’t matter what your qualifications were, or how much experience you have. Real world practical problems require practical solutions that can stand the test of time (at least for a while). That piece of messy code you wrote? Go fix it.

Your education in academia should be treated as training your mind. You’re not so much learning those (boring) subjects as much as training your brain, forming new neural connections and creating new thought processes. Learning about injective functions and surjective functions made it easy for me to pick up the concept of joins in SQL. One-to-one and one-to-many relations between database tables became a snap to understand.

License to play truant

Do you skip classes? Watched a movie instead of attending a lecture? As a student, your grade was probably very much based on your exam results.

Not so when you work. Results still count, of course. Your attendance, your ability to come to work punctually now matters.

This really ties in with the flexible hours part. I agree some companies (alright, most companies) are still rigid in this area. Let me put this question to you. Can you go to work in the appointed period of time because you want to, and not because you have to?

I love my work. I love programming. Sometimes, I wake up and I can’t wait to get to work, to start on that code. I do it because I want to. It’s like playing. The standard working hours don’t really make much of a difference to me.

As usual, your ideas, thoughts and comments are most appreciated and welcome.

Enter the Entrecard

Entrecard

In line with learning the ropes of marketing this blog, I installed the BlogRush widget. There’s a major problem with the concept. To increase traffic (the aim), you need to already have some traffic (because the widget runs on page views), which increases the overall percentage of your posts being visible in the BlogRush network. Which increases your posts’ exposure on other people’s widgets. Which then might convince a visitor of theirs to visit yours. Assuming you wrote a compelling enough headline to encourage clicks.

Even though Ben’s results were bad, my results with the BlogRush widget were far more dismal. I’ve got tons of bonus credits, because I’m a smaller publisher, because I’m one of those “bloggers who most need the exposure”. I also felt pitied upon, which kinda suck. For comparison, the ratio of bonus credits to my own generated ones is on the order of about 20:1.

So I’m trying out another service, the business card 2.0 Entrecard. The “card” is basically a 125 by 125 pixel ad or representation of your blog/site. The service is free as well, and uses the concept of credits too. There are a few ways to rack up credits

  • Drop your card on other people’s Entrecard widget
  • Other people advertise on your blog (using credits)
  • “fall from the sky” credits (from contests, donation from other people)

You can find out more from the Entrecard site.

What I want to point out is how much more work you need to put in, compared to BlogRush. The BlogRush widget is an install-and-forget system. I’ve just installed the Entrecard last Friday, and my activities include

  • Approve/reject ads from advertisers
  • Process messages from other members
  • Process a recommendation for my blog (thanks Ben!)
  • Look through inbox with cards dropped by other members
  • Check out other members’ sites
  • Drop my own cards on other members’ blogs

I still haven’t done any active promoting since I want to slowly fit this into my schedule. The results seem more promising. If nothing else, I feel more involved.

You also get to learn how to handle advertisers, promote yourself and blog with ad campaigns and offer your services (in exchange for credits). The approving and rejection of ads is especially cool, even if it’s not real money. This gives you experience in moving on to a business setting, where real money is involved. Sort of like an internship.

There’s another difference between the two services. Entrecard allows you to see who else is on the system, whereas BlogRush doesn’t. In fact, for Entrecard to work effectively, you need to know who else is on the system. How else can you drop cards if you don’t know other members?

For this reason alone, there’s a community around the Entrecard system. Which encourages participation. Which increases exposure, and thus traffic.

Yet another difference, their credit systems. I’m going to use two math terms, unbounded and closed. BlogRush credits are unbounded. There’s no upper limit to the credits you can amass. You can go to your own blog, and keep clicking that browser refresh button, and you’ll keep gaining credits. If you have referral affiliates under you, you get to gain whatever credits they gain too. The percentage chance of your posts appearing on another widget is roughly
The number of credits you have / The total number of credits in system * 100

A popular blogger will have many affiliates under him, perhaps several layers down. He’ll amass tons of credits, most of it not even generated by his blog. Imagine you, the small time blogger competing for attention. Even with the bonus credits, I doubt you can create much exposure.

Anyway, the Entrecard credit system is a closed system. Every time you drop a card, you get one credit, and the other blogger gets one credit too. When you advertise on another blog, you expend twice that blogger’s average number of cards received daily.

OK, so it’s not exactly closed, mathematically speaking. But gained credits are almost all expended through some other means. Entrecard can always hold some kind of contest or one-time unique service that’ll either inject credits into the system or flush away excess credits from the system.

A tip if you want to sign up: Get a 125 by 125 pixel graphic ready first! It doesn’t have to be flashy, just something more unique than the stock graphic options provided. You can always change it later, but it’d look better if you had something unique looking first. Paint.NET does this beautifully. A quick dash of colour here, some creative use of the effects, type in your text, and you have a unique looking graphic ready to go.

Another tip if you want to uphold the standard, quality and relevancy of your blog: Don’t approve every ad directed to you! When you first sign up, you’re “cheap”. Because you’re new, the cost of advertising on your blog is 2 credits. You’ll be barraged by an onslaught of members sending in their advertisement requests, some not even related to your topic.

I regretted approving every ad. Now I’ve got to go cancel some ads…

Now for a warning. Because of the credit system, some members simply come to your blog just to drop their card. That’s it. It’s not quality traffic. There’s no reading of your posts. There’s no exploration of your blog. There’s no commenting, no interacting, nothing from these visitors.

There’s even a term created. They’re called chain droppers, because they visit one blog, drop their card, then click on whatever’s on that blog’s widget to go to the next blog, then drop their card and so on and so forth. There’s a limit of 300 credits per day amassed in this method, each credit earned for every card dropped. That doesn’t really stop them though.

From some of the articles I read, there had been talk of abandoning BlogRush in favour of Entrecard. Since I’m still new with little results to show for it, take the next tip with a pinch of salt. Use both systems. You know those chain droppers? Leverage them. How? Chain droppers visit your blog to drop their card, thereby generating a page view. Which generates a BlogRush credit, since BlogRush runs on page views.

Now you just concentrate on your Entrecard activities, and BlogRush results should improve as well. Pure genius.

Are you a bug magnet?

Do you attract programming bugs like
A moth to a flame
A fly to rubbish
A cockroach the same
An ant to food dish

Are you a code bug magnet?

Recently, I was having dinner at a pasta restaurant. Now, when I ate at (fast food) restaurants, there seemed to be these unwelcome guests. They fly and they crawl.

Who were these guests? They’re bugs. And they bug me real good.

They linger on the table and test my patience as to how close they can get to my food. They scheme to land on my drinking straw just so I have to go get another straw. My only weapons were the blow (without expectorating my food), the wave (shoo shoo), and the ignore (hope you go away…). Generally, the better restaurants have fewer of these six-legged visitations.

Anyway, back to the pasta restaurant dinner. It came to my attention how fast the waiters and waitresses move to clean up the dishes. The moment you’re done, someone comes over to you and ask “Can I clear that for you?”. Well, it’s rhetorical, because they continue to take that plate from you anyway.

Now, for comparison, there’s another restaurant I visited. As I was eating, I saw a baby cockroach crawling around. Flies I can understand. Ants I can understand. But cockroaches were the last straw. I boycotted that restaurant.

On reflection, I realised this restaurant’s helpers were slower in cleaning up tables. As a result, the unfinished food in the dirty plates and bowls naturally attracted bugs. Slow business is not an excuse to take your time keeping the place (and tables) clean.

Now here’s the point: Once the bugs come, they are hard to get rid of. Even after you clean up, they’re still there (for a while at least). It’s like they have some memory of food being there, so even if the food isn’t there now, it’ll probably be there in a while. So the bugs stick around.

Moral of the story

Once you have messy code, you attract bugs. Once the bugs are there, it’s harder to get rid of them completely. Your best bet is to not attract them in the first place, by writing good code.

Since all humans are imperfect, therefore all code written by humans are imperfect*. That said, what you can do is write good code as best as you can. Just as restaurants (and food outlets in general) inevitably attract bugs, restaurants can still keep the place clean so as to attract less of them critters.

I don’t have a good definition of “good code”, but I do know that you need help if someone asks you (in resignation), “Are you a bug magnet?”.

P.S. Lately, I tried that restaurant that was boycotted. The place seemed better kept. My dining experience improved once those exoskeleton-donning buggers were out of my face.

* To forestall your question, no, code written by computers or robots are also imperfect. Who do you think created them computers and robots in the first place?

Well-rounded coding education

Michael Barnathan asked, on my 2008 introductory article, for my thoughts on

I’m [Michael] drawing up plans for a new type of university with a multidisciplinary curriculum that takes advantage of the fusion of principles from different disciplines.

His project’s web site is at http://www.projectpolymath.org/, aiming

to simultaneously acquire breadth and depth of knowledge in time comparable to that required to obtain a traditional single-subject university degree

I think his toughest challenge is actually convincing other people that his university degree offerings are on par with, and even better than, other conventional university degrees.

That said, my eye was caught by

Rather than studying individual majors, students focus on problems and concentrate on their primary approaches to these problems.

It’s problem-centric, so other skills come into play.

Say you’re an artist and you want to paint something. Just being a brilliant creative person isn’t enough. Do you want to use a particular type of brush? Do you know how to mix colours together to get that special hue and tone? Do you care about the quality of your painting canvas?

Joel Spolsky says there should be a degree program where it would

consist of a practical studio requirement developing significant works of software on teams with very experienced teachers, with a sprinkling of liberal arts classes for balance.

where

You might be able to major in Game Development and work on a significant game title, for example, and that’s how you spend most of your time, just like a film student spends a lot of time actually making films and the dance students spend most of their time dancing.

It’s similar to Michael’s idea of education. The other areas of your education enhance your primary focus. Just browse through some game development sites such as GameDev and MadMonkey. You’ll find many articles on game development that have little to do with coding itself, ranging from application of artificial intelligence to the physics in cloth simulation. And here you thought game developers were all about coding skills…

Then there’s Clayton Shier who wrote about the importance of math in computer science courses, of knowing a subject outside of programming.

And Bryan Hughes said that

Coding is actually a small part of the real software engineering package.

on a forum post discussing recognisable traits of a good programmer (look for Nova Dragoon near the end of the post).

Not convinced yet? Jeff Atwood talks about how we should teach computer science, with subjects such as project deployment and source control. Topics that have little to do with coding itself, yet make you a better programmer. There’s something important he mentioned too:

Today’s computer science students should develop software under conditions as close as possible to the real world, or the best available approximation thereof.

It’s something that on hindsight, I should have paid more attention to. In the academic environment,

  • I worked mostly alone (no people skills training for working in teams)
  • Collaboration was frowned upon (they think of it as copying or cheating)
  • Source control was non-existent (still is in my present employment…)
  • Deployment was non-existent (instructor/professor simply compiled your code and ran it)
  • Mostly theoretical or well-defined problems were given (real world problems are much more complicated, usually people-based)

The usual problems fall into topics like finding shortest path with Dijkstra, drawing the Sierpinski Triangle, or manipulating huge matrices for LU decomposition or QR decomposition (killed lots of brain cells too because of the math involved…).

During my university education, there was only 1 semester where I attended a specific course on programming, with C. Half my time was on math. The other half was on solving scientific problems with programming, using the knowledge I had on that one course in that one semester.

When I started working as a programmer, there were lots of programming stuff I needed to do and learn. Like SQL, VB.NET and Javascript. There were also a lot of non-programming stuff. Like writing documentation, talking with users and working with other team members.

Being a good programmer is more than just coding.

And that’s the point. That’s the whole point of this blog. Now, isn’t it time for you to get a well-rounded coding education?