Friday, September 24, 2010

The Hacker, The Novice, The Artist, and The Craftsman.

In my last blog  "Too Small to Refactor", I made the statement:
"Clean code has always been about money, and has never been about art."  
Apparently this took a few people by surprise.  One person comented:
"...I thought we were talking about craft, and the cost-cutting as a subproduct..."
So what is the difference between a craftsman and an artist?  And just to add some spice, how do they differ from a hacker and a novice?

I realize that I am making a Myers-Briggs type error.  People cannot truly be classified using binary attributes.  A person classified by MBTI as an introvert, certainly has some extrovert characteristics.  By the same token a programmer who shows some attributes of a hacker, probably also shows some attributes of a craftsman.

Still, I think the definitions of these terms can be useful as a way to classify programmer behaviors.

What is the difference between the Hacker, the Novice, the Artist, and the Craftsman?  It's all about their personal definition of "Done".

The Artist is done when the structure and behavior of the artist's code has achieved perfection in the artist's eyes.  There is no consideration of money spent, or money to be earned.  The artist does not care about ROI.  The artist does not care how long it takes.  The artist cares only about the final result.

An artist will spend hours, days, even weeks, on a single line of code.  An artist will throw away whole functions and modules because they somehow don't feel right.  An artist polishes, and polishes, and polishes in pursuit of some elusive goal of perfection.  

The Hacker is done when the behavior of the code achieves some personal goal.  The Hacker is not concerned with ROI.  The Hacker does not care about the code at all.  The Hacker does not care about how much, or how little, is spent creating the code.  The Hacker does not care if anyone else ever uses the code.  The Hacker only cares about making it work -- once.  After that, the Hacker loses interest.

The Novice is done as soon as the code works "well enough".  The Novice strives to minimize initial coding time.   The Novice is not concerned about ROI.  The future cost of the code is of no concern to the Novice.  Nor does the Novice care about the number of hidden and/or subtle defects left in the code.  The Novice simply wants to get to the next task as soon as possible.  The Novice is driven by schedule; or rather, the Novice is driven by pleasing managers who are driven by schedule.

The Craftsman is done when ROI has been maximized.  The Craftsman strives to be a good steward of the monies being spent.  The Craftsman want to make sure that every dollar goes as far as it can, and earns as much as it can in return.  Therefore the Craftsman makes sure the code works, and can be kept working with minimum extra cost. 

The Craftsman understands that most defects in behavior and structure will be very expensive to repair later and very inexpensive to eliminate now.  So the Craftsman pushes towards a very clean implementation.  But the Craftsman also recognizes that some rare defects in behavior and structure are going to cost more to eliminate than to tolerate; and so the Craftsman uses judgment, acquired over years, to maximize ROI.

11 comments:

  1. In terms of furniture production, we know from the growth of cheap furniture companies that true craftsman become a rare and endangered species. This is not because the cheap furniture is as good, but because it's good *enough*.

    I like to be a craftsman for my private projects, but I need to exercise more restraint when working professionally simply because if I don't I'll be priced out of the market. Most customers I know what something that's good enough.

    Or maybe that's the artist in me speaking? I agree that these classifications are useful for identifying attitudes, even if we exhibit more than one, or change our behaviour based on external influences.

    ReplyDelete
  2. I do not for one second believe that "good enough" implies that you can not be a crafts-person. The crafts-people are doing things such that "good enough" doesn't slow down the entire companies development efforts over time ... they make sure that good enough is still unit tested, still has simplicity and still works as well as they can make it work. Those are the traits that make them a crafts-person and keep the company from suffering in the long run.

    ReplyDelete
  3. I am definitely an Artist with Craftsman leanings. However the fact that I am conscious of this, and have been for a long time, fact helps lean further & further towards craftsmanship.

    The Novice title though should be separated into 2 categories; Novice who doesn't *yet* know any better and the ???? who either doesn't care or doesn't care enough to know better.

    ReplyDelete
  4. ... you know what's interesting? How Unit Testing brings all these types in line.

    ReplyDelete
  5. I apply these case by case... Having a degree in Art and a self educated developer, I will build "novice projects" for myself or for artistic expression. Built to "just work" but also built using my "artist sense", or "emotion & feeling" of what should stay or go.

    I also consult for clients, which have to be built to max ROI. Which I do, and do well (Or I wouldn't be self employed). Oh, and I have always been a hacker, I love finding new or unusual ways to make things work. Just offering a different point of view from someone who aspires to do it all.

    ReplyDelete
  6. "People cannot truly be classified using binary attributes."

    But that's exactly what you are doing. You claim you are either a craftsman and care about ROI or you aren't a craftsman and don't care about ROI. Then you give some very broad reasons why you may not care about ROI, either by ignoring it or through ignorance. You are only acknowledging that there are many reasons that someone can disagree with you. But every time they are wrong while you remain right.

    I know a few management/lead types that are deeply concerned about ROI, and make the most breathtaking and boneheaded decisions because of it. They are not craftsman by any stretch of the imagination, except that they 1) aren't hackers, artists or n00bs and 2) "maximize" ROI.

    I remember when craftsmanship meant something other than "agreeing with the way I think".

    ReplyDelete
  7. The term hacker was defined perhaps before you were born. You should read up on it:

    http://www.catb.org/esr/faqs/hacker-howto.html

    ReplyDelete
  8. I feel like The Engineer should be in this list.

    ReplyDelete
  9. @blowmage
    Is it really all about being right?

    The Artist, who writes clean code for its beauty and elegance, is probably your best bet on an open source project where there is no monetary ROI to calculate.

    The Hacker is probably great at delivering a throw-away prototype, or researching a new technology and determining pitfalls before integrating it into a system.

    The Novice doesn't force you to explain why sometimes faster is better than better when you have a time-critical bug or feature request in a legacy system that is complex and untested.

    That's not to say the Craftsman's input isn't valuable in all of these situations. If I had to pick only one of those traits to fill an entire team, I'd prefer Craftsmen. But then, I once heard someone say, "When all you have is a hammer, every problem starts to look like your thumb."

    Never be ashamed of a diverse toolbox, even if you don't use your wire-cutters as often as your hammers or your screwdrivers.

    ReplyDelete
  10. Naive characterizations. Look at the any of the multiple models about stages of "expertise", such as Dreyfus. Although some characteristics you mention are more personality-based, and may exist across different stages of a career, the majority are simple stages in the advancement (or lack-there-of) within a craft.

    As for the "When ROI has been maximized", it is very Lean of you. And has about as much chance of existing in reality as a project without politics attached. And the sea being boiling hot. And pigs having wings (thank you Lewis Carroll).

    ReplyDelete
  11. In "Professional Software Development", Steve McConnell says:

    When interviewing candidates for programming jobs, one of my favorite interview questions is, "How would you describe your approach to software development?" I give them examples such as carpenter, fire fighter, architect, artist, author, explorer, scientist, and archeologist, and I invite them to come up with their own answers. Some candidates try to second-guess what I want to hear; they usually tell me they see themselves as "scientists." Hot-shot coders tell me they see themselves as commandos or swat-team members. My favorite answer came from a candidate who said, "During software design, I'm an architect. When I'm designing the user interface, I'm an artist. During construction, I'm a craftsman. And during unit testing, I'm one mean son of a bitch!"

    Seriously though, I guess a good interview process should try to establish in which quadrant(s) (Artist, Craftsman, Hacker, Novice) a candidate's behaviour falls.

    ReplyDelete