Responding to: Advice to Aimless, Excited Programmers

This is in response to this blog post:

In 2010, James Hague, a recovering programmer, gave some advice to new programmers.

He said, if you are someone who would write something like this:

Hey everyone! I just learned Erlang/Haskell/Python, and now I'm looking for a big project to write in it. If you've got ideas, let me know!

...then, you're doing it wrong. He went on:

There's nothing about solving a problem or overall usefulness or any relevant connection between the application and the interests of the original poster. Would you trust a music notation program developed by a non-musician? A Photoshop clone written by someone who has never used Photoshop professionally?

What he says is that it’s not worth learning a tool for the sake of it. He suggest to aimless, excited programmers: find a problem first and then figure out how to use tools to solve it. This way you become an expert [to a small, tightly-defined domain].

I don’t like this advice to aimless, excited programmers. It would have been fine if programming was just a tool. But it’s not. It’s also a craft and craft practicing is meaningful by itself.

My advice is:

You’ve chosen an extremely fun path! One thing only: don’t expect to find any projects to write the language you learned very soon. Write your own projects. Let them be pointless. Write an FTP server, write a BitTorrent client, write a PNG parser/library, build a Tetris game, and a Chess engine, and a Space Invaders clone.

All these might be pointless because there are already tons of high quality open source implementations of these programs. They might also be useless; maybe they will have only one user, you.

But this doesn’t really matter—as long as you’re writing code—that’s the fun part of it. Not only that but while you’re having all this fun, you’re actually learning a ton about building software in the language you’ve chosen. While coding, you may also check out other, existing, open source clones of what you’re making. This way you can see how different problems map to various designs. Through this you, also, learn how to read code. Whenever you see yet another open source chess engine, you learn to look for specific components and design choices. Eg: how has this programmer solved problem X and how problem Y?

All of this skill practicing on researching, designing interfaces, writing code, reading code, understanding trade-offs, touching a lot of different domains, will mainly be fun but, inadvertently, will also be extremely useful. Just not immediately. Personally, I insist on not caring about usefulness, but if you do, I think coding away pointlessly first is the way to go.

“What I’m really concerned about is reaching one person. And that person may be myself for all I know.”
— Jorge Luis Borges