September 29, 2009

Notes from the Software Craftsmanship North America Conference

(Note: Dang, I thought I already posted this but apparently have not. Oh well, better late than never.)

I attended the Software Craftsmanship North America (SCNA) Conference, had fun, and took a bunch of notes. A summary of my day follows.

Ken Auer delivered the opening keynote, Swimming Upstream, Sprouting Legs, and Running Free, where he described his technical and personal development over his career. He mentioned that modern American culture doesn't allow much overlap between work, learning, family, church, etc. Thus Auer started looking for ways to break the boundaries between the different aspects of his life in order to develop an integrated lifestyle. He then began describing his experience in mentoring an adolescent apprentice but unfortunately ran out of time before he could go into much detail. Nonetheless, Auer's talk was a great start to the day, being both motivating and full of interesting ideas and observations.

I then attended Michael Feathers's Self-Education and the Craftsman. In this talk Feathers opined that he was scared that the stuff he values and considers essential knowledge about our industry isn't as valued by others. He then proceeded to describe some of the concepts that he deems important - things like algorithmic complexity, covariance and contravariance, types, state machines, regular expressions and automata, worse is better (the best solution doesn't always win), and several more. He then mentioned a list of books to read. It was interesting to hear him state the importance of some things that I haven't even thought of since college, as well as mention some things that I haven't heard of. Staying true to the idea of continuous improvement, a theme of the conference, the session definitely gave me a list of topics to brush up on and learn more about.

Afterwards I went to Fred George's Observations From an Old Warhorse, where George described some of his observations of the software industry, drawing upon his decades of experience. Some of his more interesting comments included:

  • If is suspicious, and else is almost always wrong - meaning that if you're using a bunch of if/else statements, then you could probably find a better way to write your code.
  • Management should focus on feedback cycles and eliminating waste.
  • Status reports are a waste; use a visual wall instead.
  • Iterations are dead. In his experience, they keep getting smaller and smaller in duration (from Scrum to XP to his work with one week iterations at ThoughtWorks to incorporating iterations into the daily standups) to the point that there's really no reason to plan around and formalize the idea of an iteration.
  • His current company doesn't write unit tests. The units of code for their applications are small enough that if something doesn't work, they just throw it away and write something else. Furthermore, the company doesn't have testers. In fact, the team members really don't have rigid roles; they both write code and test - and if they find a bug, they don't log it; they fix it, as logging is a waste.

George's talk was amusing and thought-provoking. You could tell that he has loads of experience, is extremely knowledgeable, and is extremely practical.

The morning ended with Jim Weirich's talk on a Grand Unified Theory of Software Design. There are currently several varying opinions on what we should look for in a good software design, but could we come up with a more objective, unified idea of good design, similar to how physics is seeking a Grand Unified Theory? Weirich believes so and thinks connascence could be the start of such a theory. Two pieces of software share connascence when a change in one forces a corresponding change in the other. Weirich then described and provided examples of several types of connascence. He also mentioned a couple of rules: the rule of locality, which states that as the distance of locality increases, connascence should be weaker; and the rule of degree, which states that higher forms of connascence should be converted to lower forms of connascence. Weirich also mentioned the book that originally discusses connascence - What Every Programmer Should Know About Object Oriented Design by Melir Page-Jones. This topic was new to me, but I find it very interesting and hope to research it some more soon.

The afternoon kicked off with Ward Cunningham's talk, What If Bacteria Designed Computers? The talk was about his hobby wiring tiny computers together to make them work like bacteria/cells. It's doubtful that I'll ever practically apply anything Ward mentioned to my work, but the talk was nonetheless fascinating - plus I'm glad that I got to attend at least one of Ward's talks in my lifetime. And I think the talk fit perfectly into this conference, as Cunningham shows that, despite it being just a hobby, his eagerness to learn more and drive to keep at it lead him to accomplish some impressive stuff. These qualities are definitely needed in a craftsman.

I then attended a discussion on The Business of Craftsmanship, which included panelists Micah Martin, Kevin Taylor, and Carl Erickson, three entrepreneurs whose companies value craftsmanship and have some sort of apprenticeship. The panelists broached a variety of topics, but they talked a lot about their experiences working with apprentices and honing an apprenticeship program. A few of the comments I found interesting:

  • Making an apprentice find a master and having the master personally accept the responsibility of teaching them has been effective for the companies, as opposed to having the company accept the responsibility.
  • Passion and motivation in an apprentice is essential.
  • The panelists' felt that they had a definite competitive edge over companies that didn't practice craftsmanship and apprenticeship.

Then I went to Bobby Norton's session on Test-Driven Learning. Norton mentioned that seeing working code doesn't lead to mastery. Repeated study isn't enough. You need repeated practice, which requires recall coupled with active thinking. This approach leads to greater than 150% long-term retention. Unit testing is a great way to acquire this repeated practice, as you're working with the language or technology hands-on while using it in an engaged manner, as opposed to just copying example code from somewhere. Thus Norton devised an application called the shubox (found on GitHub) that creates a sandbox that you can use to write unit tests that explore a language.

The day concluded with Bob Martin's closing keynote, titled Craftsmanship Under Pressure. Martin's talk was good, and the entire crowd was entertained and engaged. I wrote the most notes during his talk, so I'm going to make a separate post for them.

The only other thing I want to mention is the book Structure and Interpretation of Computer Programs by Harold Abelson, Gerald Jay Sussman, and Julie Sussman. This book was named in multiple talks and was highly recommended, so I'm going to have to pick up a copy.

Overall, SCNA was a good conference - particularly for the price. I was exposed to a bunch of fascinating ideas and had fun. But more importantly, it was invigorating being around other people who share the same values that I do. At the onset of the day, we were asked why we were at the conference, and the answer was because we care about software. I was happy that I could show my support for this movement and am glad to see this attitude becoming more and more popular in our industry.


  1. Thanks for this, and I look forward to seeing your notes and thoughts from Bob Martin's talk.

    I know Michael Feathers has a list of recommended papers to read here, 10 Papers Every Programmer Should Read. I'd be interested to hear what some of the recommended books were, or was it the same list?

    It's also interesting to hear Fred George talking about feedback cycles, eliminating waste, and iterations being dead. I've been hearing a lot of similar stuff on this side of the pond, mostly focusing on lean and kanban. I was at a talk last night where the idea came up that the optimal or natural cadence for all your different activities--gathering requirements, developing, testing, and releasing--really might not all be the same, which makes some sense to me. Anyway, I should probably do a whole separate article on my own about that tonight. Here's to hoping I find time.

  2. Great write-up, Tom. I'm looking forward to reading your thoughts on Uncle Bob's talk. Thanks for coming to SCNA; we are looking forward to having another great one next year.

  3. Amy -

    I just posted my notes from Martin's talk. It was good, so I hope the video gets posted at some time so that you can watch it. Feathers actually had a different list than the papers he mentioned in that one post. The books were:

    *Structure and Interpretation of Computer Programs by Harold Abelson, Gerald Jay Sussman, and Julie Sussman (a book mentioned in multiple talks)
    *Designing Object Systems: Object-Oriented Modelling with Syntropy by Steve Cook and John Daniels
    *Graphs: Theory and Algorithms by K. Thulasiraman and M. N. S. Swamy
    *Compilers: Principles, Techniques, and Tools by Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman
    *Discrete Mathematics (not sure of the specific one he mentioned)
    *Introduction to the Theory of Computation by Michael Sipser

    Some pretty hefty books that seem to have a heavy emphasis on theory. Like I said before, I've kinda ignored some of these topics after college, but if someone like Feathers is saying they're important, then I'm going to brush up on them.

    And yeah, George's talk was fun. He was blunt and made some very compelling arguments that are making me reconsider my thoughts on certain topics. I'd love to talk to him in an informal setting, as I think I could learn a lot from him. The fact that you're hearing similar things lends more credibility to his comments, so I hope you have time to post your thoughts and observations.

    Corey -

    Thanks for the kind words, and thanks for organizing the conference. I'm excited for next year's!