(This is a snapshot of my old weblog. New posts and selected republished essays can be found at raganwald.com.)

Thursday, January 24, 2008
  It's fundamental: You are a programmer if you...

Write code that works.

That’s all, you write working code. And it doesn’t matter what degree you have, what courses you took, or whose blogs you read. It’s all about the code.

Joel, I hear what you’re saying about knowing what a pointer is and understanding the byzantine Windows API. But still, if someone write a program, I say he’s a programmer.

Steve, you’re preaching to the choir. Yeah boy, programming without understanding how programming languages really work is like painting with the brush held between the toes of one foot. But I think it’s still programming.

In Beautiful Code, great programmers share their thinking process with us. And that’s why this book transcends so many other books about programming: thinking and problem solving approaches are universal. This isn’t a book about programs, it’s a book about programming: every page turned will make you a better programmer.

And you over there, the one who just wants a job as a programmer, the one who wants to do whatever everybody is doing and wants to learn as little as possible to get things done. You’re a programmer, don’t let any Chablis-swilling pretentious art-house blogger tell you otherwise between their rants about why we should still be using Lisp or Smalltalk.

All these other things, be they type theory, agile practices, compilers, pointers, DSLs, or anything else… These are all tools. Ignorance of those tools is not helpful. I think you will be even better with more knowledge. I think you will be happier if you learn how to “cut with the grain” and work with the principles of software development instead of against them. But even if you decide you can’t be bothered with anything hard, the important thing is that you write programs, therefore you are a programmer.

I don’t want to wake up one day and find there’s a required reading course for being a programmer (even if my blog is on the list). I don’t want anyone deciding who is—and who isn’t—fit to be a programmer. I want everyone to be free to program. The price of that freedom is that yes, some people are going to do things I don’t like. But you can’t build a world with room for Ruby unless there’s room for PHP. You cannot build a world with room for Scala unless you build a world with room for Java.

Now, does that mean that when Steve Yegge talks about why you ought to know how compilers work, everyone ought to shout him down and say that compiler architecture and/or programming language implementation is bullshit? No. I will be the first to say that compilers and language implementation are important. I will rant.

I support your individual choice of what to learn and what to skip as a programmer. Agree or disagree with me, I say you’re a programmer and I measure how good you are by what you do with the knowledge you decide to acquire. But I still believe that there are such things as fundamentals. There are things that every programmer would do well to know. There are things that would make everybody’s lives easier if every programmer knew them.

Fundamentals matter, because although you are a programmer without them, you could be a much better programmer with them

I do say that you can program without the fundamentals, but I will never say that they are irrelevant, that we have passed the day when fundamentals matter. They do matter, because although you are a programmer without them, you could be a much better programmer with them.

But you will still be a programmer.

Elsewhere, I see some folks are arguing whether writing HTML is programming or not. To questions like that, I have but one response: give me an objective definition of what is and what isn’t a program, and I’ll give you an objective definition of what is and isn’t programming.

Comments on “It's fundamental: You are a programmer if you...:
I think I get your point, and even agree with it to some extent.

But let me play a little devil's advocate: if I change the oil in my car, does that make me a mechanic? If I build a doghouse, am I a construction worker or carpenter? If I get sick and diagnose myself with a cold, and prescribe rest and plenty of foods, does that make me a doctor?

What are the differences if you answer no to any of those questions?
"Plenty of foods" -- I must be hungry. I meant "fluids," not "foods."
I agree, but it's all relative. There's no prize for printing hello world, but it's the first step.
In Ontario, Doctors and Mechanics are legislated professions. But yes, anybody can build a dog house, and most anybody who needs one, does.
It's easy to say that there is no prize for printing hello world, but please remember that those who toe the line at the start of the competition have already beaten everyone who gave up before the entered.
I really like this post, nice & simple point made.
I see. I think my own view is starting to form in my mind now that you mentioned the legislated professions. Let me try again.

I may not accept someone telling me they are a programmer unless they demonstrate a certain proficiency in programming and/or peers would call them a programmer.

I'll try to explain. I don't think you need a degree to be a programmer (or anyone's Official approval for that matter). I don't think you need a license to practice as a mechanic. And the list goes on.

Along those lines, I wouldn't call myself a mechanic if I only changed my oil. But if I did have enough experience changing various parts and diagnosing problems with the car, I might start to consider myself one.

Nailing some boards together into a box that I attach to the wall as a cabinet wouldn't make me a carpenter. I'd need to demonstrate some skill to call myself that.

So certainly I am programming when I puts "hello world", (among other things unrelated to typing), but am I a programmer?

I guess my view is more strict than your own, but it is much less strict than the posts you referenced.

If you read what I said, you will see that I say it is all about the working code.

My post makes it quite clear that the expression "a programmer" has a lot of room for varying degrees of greatness, that is why I talk about being a better programmer.

So in some way, everybody who makes something useful is “a” carpenter. But one of my deep values is that some carpenters are actually better than others.
Reg: Sorry, I guess I was thinking out loud on a tangent(or whatever the equivalent would be called with a keyboard).

I get what you are saying. I'm not trying to be elitist (that I know of), and I don't know if I'm coming across that way.

A programmer by dictionary definition is "one who programs" and I agree that a quality of a program would be that it works.

There can be no more liberal or inviting definition than that. I guess I was just exploring a different territory in the analogies.

I just wanted to make it clear that I'm liberal about who ought to program, even if I'm conservative about whom I hire to program ;-)
"...programming without understanding how programming languages really work is like painting with the brush held between the toes of one foot. But I think it’s still programming."

If that metaphor is valid, it's hard to see how you could proceed without the fundamentals and still manage to "write code that works" :-).
I think along with the different degree of skill in programmers you've also got the various interesting combinations of them.

You can build a doghouse by yourself (and it's still carpentry no matter what anybody says) but you can't build a skyscraper by yourself. You need a bunch of very specialised experts to bang their heads together to get a project like that off the ground.

It's not a boolean argument. You're not either a programmer or not a programmer.

You wouldn't hire Joe Bloggs the Backyard Doghouse Builder to make your skyscraper. But he's having fun and making stuff and being productive, don't belittle him.
I like this post. You made me happier. Tomorrow at work I will try to be a little less confronting and a little more helpful than usual.
I would venture that someone who enjoys writing WoW plugins and has written a few is a programmer. I would say that a second person who has written those same plugins but did so to improve their gaming experience with no real interest in the process itself probably isn't. The second person having written lots of plugins, but all with no enjoyment or caring except for the end result might be.
Reg: "I just wanted to make it clear that I'm liberal about who ought to program, even if I'm conservative about whom I hire to program ;-)"

I think that's the issue in many people's minds, we don't just want to talk about programming the activity that can be done either as leisure or as a professional practice, we want to talk about the development of professional practice.

I wonder if this is the issue the programming field has. For most professions, either licensed or not, there seems to be a fairly clear divide between professional and amateur: you are so good at what you do that other people are willing to pay you to do it for them. You are this good because you learned from others who have very well defined, effective techniques. It feels like in the programming field, having the most basic amateur skill level can still qualify you for professional status. I think many people are constantly thinking about this, are bothered by this, because we want to develop as professionals (skilled practitioners who do a good job) and we want to develop the profession. I think professional programmers (at least this professional programmer) wants their field to work more like that of a professional carpenter than of a desk clerk :-).

think many people are constantly thinking about this, are bothered by this, because we want to develop as professionals (skilled practitioners who do a good job) and we want to develop the profession.

I say with complete honesty that I have observed a wide variety of attitudes about this. Not everyone I meet is dedicated to improving their own skill or the profession as a whole.

And while you mention that the professional is someone good enough to be paid, I must add that it is not obvious to me that the market for programming is particularly informed: I see a lot of lemons getting sold, and it is also not obvious to me that many businesses want to employ skilled professionals.

The nice thing is, however, that there are economic opportunities for programmers who dedicate themselves to fulfilling their potential, and that's what really matters.
Turn down the expectations for "works" low enough and you are arguing for the past, current, and likely future state of our industry and profession. So two cheers for the status quo then?
Turn down the expectations for "works" low enough and you are arguing for the past, current, and likely future state of our industry and profession. So two cheers for the status quo then?

I don’t think so. I never said you should turn down the knob for what “works.”
There's a difference between "is a" and "knows how to." It's fundamental.

If I wanted to record a top notch guitar performance, I would look for a guitarist. I would not ask around for somebody who knows how to play guitar.

If I wanted somebody to fix my expensive car, I would look for a mechanic. I would not ask around for somebody who works on cars.

If I wanted a program to manage my business, I would look for a programmer. I would not ask around for somebody who knows how to program.

Context is everything. A mechanic is somebody who works on cars but somebody who works on cars is not necessarily a mechanic. A programmer is somebody who writes programs but somebody who writes programs is not necessarily a programmer.

This entire discussion is a bit juvenile though. It's pretty lame for anyone to attack somebody for not being a "programmer" (e.g. living up to the attacker's superior skills). Likewise, it's pretty lame for someone to insist that he be called a programmer if other people in the programming profession recognize that he is not a programmer by profession.

Introducing yourself with a professional title assumes that you are actively pursuing that profession. That doesn't mean that you have to be working in the profession, necessarily, but it does mean that you define yourself as a "programmer" or "mechanic" or "guitarist." If you aren't any good at the profession and/or aren't actively pursuing it with great passion, then everybody else will recognize that you're just full of yourself.

Personally, I wouldn't call myself a programmer unless I considered myself an expert or someone approaching expert level in at least one aspect of programming. That is, I would have to feel confident that I could not only solve most problems thrown my way, but that I could solve them efficiently and in a manner understandable by my colleagues.

Simply writing a program that works does not automatically grant one recognition as a programmer. If that was true, then I'm a programmer, designer, chef, guitarist, doctor, mechanic, carpenter, mason, farmer, writer, jockey, dog trainer, runner, teacher, student, weight lifter, diplomat, manager, critic, janitor, driver, biker, counselor, photographer, window washer, sinner, saint, consultant, lawyer, accountant, machine operator, bus boy, landscaper. I'm gonna need some new cards printed up.
ok, I'll bite. Can you post a list of what these fundamentals you're referring to are?

It would make for a good checklist for aspiring good programmers.

I wouldn't call myself a programmer unless I considered myself an expert or someone approaching expert level in at least one aspect of programming.

Call yourself whatever you like, but I am not comfortable with the idea of someone, anyone, you or I included, defining who is and who isn’t fit to be a programmer.

In theory it ought to be easy... these peopel are programmers, those aren’t. But you’d be amazed what happens in practice. take your nest sentance, for example:

I could solve them efficiently and in a manner understandable by my colleagues

This may come a surprise to you, but some people consider Java too encumbered by accidental complexity to be understandable. Are Java programmers not programmers? Or the converse: many people consider Ruby to be inefficient and ruby code to be write-only. If they were in change,. woudl we have to program in Java to be considered programmers?

It seems easy to say that there’s some minimum standard for professionalsim. But what is it? Who decides?
I'd say "you are a programmer if you are paid to program". A 'working' program is subjective, there is no clear definition for it.

If you only write code in your spare time for free, then it is a hobby, the same for writing and photography. Nothing wrong with that.

We so often define ourselves by how we earn our main livelihood, it is a reasonable way to approach it.

I don't mind people writing code for themselves, but the moment we all depend on this stuff for health or financial security, I'd really feel better if there was some level of professionalism.

It is easy to write code, it is hard to write it well.

I understand where you're coming from, but this is a problem of semantics. You can't simply decide to throw away all other interpretations of a word simply because it makes things easier. That would require that we all agree with your assessment, and we don't, and we're back to square one.

This problem has no solution. Even my argument is easily invalidated by you not agreeing with it.

Who gets to decide who's right? Everybody, nobody, me, you. This is a question that applies to every aspect of our lives. Who gets to make the rules, what does fair mean, what does competent mean, where do we draw all of our imaginary lines? There is no definitive answer that works for all cases, and you certainly won't find an answer by reducing all definitions to their most open interpretations and then claiming to do so because nobody has the right (another word open to interpretation) to do otherwise.

My solution to this problem is to define a programmer as someone who spends the majority of his time and passion writing programs and striving to improve his skills, including his ability to work with other programmers. Really this most likely means that the person writes software for a living. At any rate, this model seems to fit with most of the cases in which the title of programmer is used, in my own personal experience. If I told you that I was looking to hire a programmer, you would not assume that I would be considering somebody who has written a working "hello world."

Your argument about Java doesn't make much sense to me. When I speak of my colleagues, I'm not talking about every programmer in the world. It should not be expected that a programmer know the ins and outs of every single programming language. Besides the fact that a language is just one of many development tools, a person practicing in a field should not have to be an expert in all areas. People specialize.

Thus, if I wrote some Java code and my colleagues (e.g. co-developers and/or trusted reviewers) can't understand why the hell I implemented something in a certain way, then I probably wrote some bad code, regardless of whether it works given some input. This doesn't automatically exclude me from being a programmer, it just means that I did a poor job. If, on the other hand, most of my work was at this level, then perhaps I'm not qualified to be working as a programmer, and I've got some work to do to get up to par.

Cars are all fundamentally the same under the hood. Slightly different variations on the same theme. A mechanic can diagnose the majority of problems with any car, and knows when he needs to hand the job over or get advice from somebody with more experience in a particular aspect of the vehicle's implementation. He can solve most problems well enough, and doesn't use any bubble gum. When the next mechanic opens the hood, he's not going to say "what the hell is this??" The same is true of programmers and programming languages and computers themselves.

Anyhow, no, I can't restrict someone from calling himself a programmer. It's not morally or legally correct to do so. It wouldn't be worth my time anyhow. I am, however, going to maintain my standard and interpretation of the title of programmer because it fits best with my experiences and communication with others.

It's a matter of "I know it when I see it."
Definition of "writer": one who writes.

You can't simply decide to throw away all other interpretations of a word simply because it makes things easier.

I don't throw your interpretation away because it makes things easier. I choose my interpretation because I am an egalitarian. It is not a case of my definition being the worst save for all other definitions. I like my definition just the way it is.

I meet someone at a climbing gym. They say they are a programmer. I say, "What do you program?" They tell me about something they do in their spare time, in a very amateurish way. Am I to say, Sorry, you are a dilettante, not a real programmer?

No. Instead, I choose to smile and say, "Ah! We have much in common." That is the road I walk. I agree that my definition is not much good for choosing who I will employ (or work for) on a particular project, but I have other tools that serve me in good stead, and I find that problem far too complex to try to reduce to a simple sentence or two.

Like you, I admire people who commit to life-long improvement in their field. But I don't try to bifurcate the world along those lines.
I haven't read all the comments, but I liken programming to any art. Just because I get up in front of a microphone does not make me a singer. Just because I sit in a coffee house with a laptop and write poetry does not make me a poet. Saying that there is no prerequisite for being a programmer is about as ridiculous as saying there is no prereq for anything else. I also fail to see how starting something makes you ahead of anybody who hasn't tried. That presupposes that just by trying something, it gives you innate talent. Do you watch American idol? Are those rejects singers because they tried? Are they more of a singer than me because they went on TV and made a fool of themselves? I guess your argument is that even though they suck, they got "experience" from the process. I still don't buy into that. I've watched many "programmers" get "experience" from all the wrong places and put crappy code into production. I think that makes them a worker whose job is to program...not a programmer.

Who anointed you fit to judge who can be a programmer? Hunh? Who put you on a pedestal? Who filled your britches with righteous indignation that all those lesser people are programming?

With that, comments are closed on this post. If you wish to carry on the debate, please do so from the comfort of your own weblogs.

As mentioned many, many times, I am an egalitarian. That does not mean I hire anyone, or use any piece of software. I own several Macintoshes, I am not the type of person to suffer poorly written operating systems without protest.

I understand where you are coming from, and it boils down to one of two things: By programmer, you really mean good programmer, or professional programmer. That I understand. Or, by programmer, you mean someone who you think is like you and not someone who is not like you. That I also understand.

However, I am closing the discussion because it is not actually interesting. I urge you to re-read the post and see if you can figure out what it is actually about. In your zeal to debate who is and who isn’t fit to program, you may have missed the thesis of the post.

<< Home
Reg Braithwaite

Recent Writing
Homoiconic Technical Writing / raganwald.posterous.com

What I‘ve Learned From Failure / Kestrels, Quirky Birds, and Hopeless Egocentricity

rewrite_rails / andand / unfold.rb / string_to_proc.rb / dsl_and_let.rb / comprehension.rb / lazy_lists.rb

IS-STRICTLY-EQUIVALENT-TO-A / Spaghetti-Western Coding / Golf is a good program spoiled / Programming conventions as signals / Not all functions should be object methods

The Not So Big Software Design / Writing programs for people to read / Why Why Functional Programming Matters Matters / But Y would I want to do a thing like this?

The single most important thing you must do to improve your programming career / The Naïve Approach to Hiring People / No Disrespect / Take control of your interview / Three tips for getting a job through a recruiter / My favourite interview question

Exception Handling in Software Development / What if powerful languages and idioms only work for small teams? / Bricks / Which theory fits the evidence? / Still failing, still learning / What I’ve learned from failure

The unary ampersand in Ruby / (1..100).inject(&:+) / The challenge of teaching yourself a programming language / The significance of the meta-circular interpreter / Block-Structured Javascript / Haskell, Ruby and Infinity / Closures and Higher-Order Functions

Why Apple is more expensive than Amazon / Why we are the biggest obstacles to our own growth / Is software the documentation of business process mistakes? / We have lost control of the apparatus / What I’ve Learned From Sales I, II, III

The Narcissism of Small Code Differences / Billy Martin’s Technique for Managing his Manager / Three stories about The Tao / Programming Language Stories / Why You Need a Degree to Work For BigCo

06/04 / 07/04 / 08/04 / 09/04 / 10/04 / 11/04 / 12/04 / 01/05 / 02/05 / 03/05 / 04/05 / 06/05 / 07/05 / 08/05 / 09/05 / 10/05 / 11/05 / 01/06 / 02/06 / 03/06 / 04/06 / 05/06 / 06/06 / 07/06 / 08/06 / 09/06 / 10/06 / 11/06 / 12/06 / 01/07 / 02/07 / 03/07 / 04/07 / 05/07 / 06/07 / 07/07 / 08/07 / 09/07 / 10/07 / 11/07 / 12/07 / 01/08 / 02/08 / 03/08 / 04/08 / 05/08 / 06/08 / 07/08 /