How I Learned to Stop Worrying and Love a Career Change

One of the most pointless things a blogger can do is make a post saying “wow, it’s been a while, but I will update soon, promise!”. Still, it has been a while and a lot has happened in that time.

I hung up my community moderator hat and joined Stack Exchange as a community manager. I originally started part-time and kept my daytime software gig, but I went full-time at the beginning of May and it’s been an interesting experience. I like to describe the job as “equal parts social experiments and tech support”.

Are you happy?

My team and co-workers at my last workplace were great, but the job and I disagreed on what turned out to be a few very fundamental levels:

  • I love coding. I did primarily testing/integration work. Totally by choice, but turns out that’s not my thing.
  • I love being able to learn and contribute in various areas. The company was set up to strictly separate responsibilities.
  • I need to know that I’m making some sort of a difference and the things I do are being used out there. This was actually pretty well covered. The software we built does some really awesome stuff. But it still doesn’t compare with working on something like Stack Exchange where you get feedback (good and bad) daily and directly.

I look at my time in my last position as a great learning experience. It taught me a lot about what makes me tick. The job ultimately wasn’t doing it for me, though, so I quit.

The first question I always get when I tell someone this is “don’t you miss programming?”. The answer is “I don’t because I still do it!”. I don’t think a person is defined by their job. I may not be working as one, but I’m certainly still a developer. I’m still really into it. If anything, my interest and passion have been renewed! I have a backlog of projects that I’m finally getting around to and it’s been great. So far, I’ve got a few things in progress:

  1. There’s a little app I’m writing to extract SMS and iMessage records from an iPhone backup. Turns out all that is stored in a Sqlite database. The schema is a bit weird, but other than that, it’s pretty easy. Still got a lot of polishing and refactoring to do (and I don’t promise it won’t eat your computer or your backups somehow), but it works!
  2. I’ve been learning Django and catching up on my CSS, helping extend the website for a local Python group.
  3. I also finally started going through Seven Languages in Seven Weeks, among catching up on other reading.

Will I get back to programming for a living? Maybe. Probably. I’d like to, but for now I’m content to just go with the flow. Stack Exchange is basically my dream employer, and I’m using this time to beef up my skills and do a few things I’ve been meaning to do for a very long time, all while doing something I also enjoy during the day. It’s a fantastic spot to be in and my only plan right now is to see where this takes me.


SCNA 2011 Part 3: Gary Bernhardt, “Expansion and Contraction”

Also posted at

Gary Bernhardt took the stage to talk about the evolution of programming languages and technologies. He talked about the fact that languages and technologies evolve in waves: first there’s a wave of expansion where a new language comes along and increases the number of things we can do, and it is followed by a contraction that reduces the number of things we can do but also removes a lot of confusion and therefore enables us to deliver more reliable software with the new toolset.

So, expansion increases capability – our power to express an idea. Over time abundant resources and confusion drive change and we see a contraction that removes 5% of the capability and 85% of the confusion to enhance suitability – the power to deliver reliable software that works.

Many expansions are initially dismissed by the developer community. For example, looking back at Djikstra’s proposal for structured programming, it was met with the following review:

Structured programming is a nice academic exercise, which works well for small examples, but I doubt that any real-world program will ever be written in such a style.

The relational model was met with similar criticism and the same quote can be paraphrased and applied almost universally to new technologies coming out today. Instead of focusing on how something can’t possibly be workable, we should consider what larger purpose it may be serving: either by improving capability or suitability.

Here are some examples from history:

  • 1957: Fortran increases capability vs Assembly.
  • 1968: Structured programming increases suitability vs Fortran.
  • 1970: Relational model comes out as more suitable vs flat files.
  • 1985: C++ is more capable vs C by adding object-oriented concepts.
  • 1995: Java is more suitable vs C++ by removing some of the complexity and introducing automatic memory management.
  • 2004: Rails extends the capability vs existing ways to develop web applications.

Rails displays a culture of capability. The focus is on new gems and new features all the time and when something breaks, it’s easier to just move on to the new working thing than fix the broken one.

Gary made a point that capable systems generate a lot of activity (for example, the gem explosion in Rails), but then a contraction into more suitable tools creates suitable systems where the real progress happens. He described the difference between activity and progress as a developer who commits code lots of times a day but doesn’t necessarily produce a lot of value. That developer is certainly active but may not be making much progress.

So what happens after Rails? Gary suggested that there’s frustration building in the developer community and it’s likely going to lead to a contraction step. Up next are the functional revolution and outside-in top-down London style test-driven development. Which are, of course, impossible since they are nice academic exercises, which work well for small examples, but no real-world program would ever be written in such styles.

SCNA 2011 Part 2: Michael Feathers, “The Readability Gulf”

Also posted at

The second session of the first day was by Michael Feathers giving a demo of using functional approaches to different problems.

I took two main lessons out of it:
1. “Clever code” is relative.
2. Functional programming can help establish a common base of understanding that doesn’t vary from one problem domain to another.

“Clever code” is something that’s often looked down uponbecause it can make it more difficult for multiple developers to maintain an application and read its code. But what is “clever”, exactly? Michael Feathers made the point that anything that’s unfamiliar to us will at first look as strange and weird. But if we take the time to learn new functions and patterns, they will quickly become familiar and comfortable instead of too clever and complicated.

Another way to mitigate the gap between unfamiliar and comfortable is to use common functions. Functional programming is a good example of that: it is more about manipulating data without worrying about setting up abstractions to model it first. Functions built into a functional language aren’t trying to represent the domain of the problem. Instead, they simply perform common operations that do the same thing regardless of what kind of problem they’re applied to.

For example, the zip function is the same in Ruby, Python, Scala, Haskell, and other languages. This means that you can learn how it works once and if you find yourself working in another language or another domain, you can easily apply it there.

The same holds true for design patterns and, to an extent, frameworks.

Establishing a common base of understanding is important for ensuring that we write the best code possible. Sometimes this requires compromises to favour readability over efficiency or style, but other times we’re better off using some clever code on the assumption that we and our fellow developers will learn how it works and become better for it.

SCNA 2011 Part 1: Opening Keynote

Also posted at

Craftsmanship is not about language or process. It’s about community and quality.

SCNA 2011 opened with a keynote by Corey Haines. He talked about the past and the future of software development as a profession, the trends that are emerging in the current economic climate and how that affects us as professional developers.

Where We Came From

Back in the 90s the tech sector virtually exploded and a lot of people got into software development with the help of all those “Learn X in 24 hours” books. This was great, but it did result in a lot of people quickly learning how to code and getting jobs without learning much about the profession overall.

That gave the impression that it was very easy to become a programmer. With the increasing numbers of new developers, there weren’t enough older, more experienced developers to train them. At the same time, companies employing developers at the time (and even now) just want results. They trust that the people they hire know what they’re doing, so it is rather up to us to self-organize and recognize that it’s relatively easy to learn how to program but there’s a difference between being able to write some code and developing maintainable software.

Where We Are Today

The tech bubble of the 90s is long gone and since then the economy has come down again. A lot of people got laid off from their jobs and either out of opportunity or necessity are starting up their own small businesses. Those businesses often need software, so developers are once again in demand. So are we doomed to repeat the mistakes of the past?

Well, maybe. But it doesn’t have to be that way.

What Next?

More and more trends are emerging that are promoting software development as a craft, something that needs to be practiced and learned and cannot be taught with a book and 24 hours.

Apprenticeship programs are starting up in various places and many companies are more open to the idea of hiring apprentices and having some of their developers spend time on training. There are also online organizations like Girl Develop It.

So, that’s all well and good, but why do we care? Didn’t the tech boom work out in the end? Aren’t we better for it?

Why Bother?

It turns out that software development is not easy. In fact, it’s quite hard. But companies are starting to wake up to that fact. As software becomes more and more ubiquitous every day, it’s easy to see good, maintainable applications and discover the badly written ones by  comparison.

For those of us who spend time practicing and learning new techniques, having untrained developers enter the workforce can be actively harmful.

So What Can One Person Do?

  • Learn as much as possible
  • Reclaim professional values:
    • build communities, connect with others
    • add value, do things that matter
  • Practice the craft
  • Be awesome.

SCNA 2011 Part 0: Introduction

Also posted at

Last week I had the opportunity to attend the Software Craftsmanship North America 2011 conference in Chicago, IL. I had a blast and I want to make a series of blog posts about my experiences. Since my attendance was very graciously sponsored by Stack Exchange, I will also try to link stuff I learned at the conference back to my “main” site – Programmers Stack Exchange.

I’ve been to two conferences so far: RallyON back in May and TechDays 2011 last month. I enjoyed RallyON, but I was largely in the company of project managers. TechDays was ostensibly of interest to developers, and I enjoyed some of the talks presented there, but the atmosphere was largely that of a sales conference and that made it difficult to connect with anybody. SCNA is the exact opposite from those experiences. It is a conference full of developers who actively want to be there. It’s amazing how much difference that makes.

The conference runs for two days and both days are pretty full of stuff to do. You’re on your own in the evenings, but I haven’t found that to be a problem — talking to a few people during the day more or less guarantees having company for dinner.

This year there were two tracks of talks with an unfortunate overlap between speakers. It wasn’t a problem for me for the most part, but I did have to leave a couple talks before they finished in order to get to the next one on time. There was also an “open space” room set up for hanging out, hacking on random things, and ad hoc pairing.

Despite the name, it wasn’t a traditional open space, well, space. Typically you’d see a board and some sticky notes for people to propose their own mini-sessions. This time, there were a few smaller groups getting together, but I found it difficult to figure out if there was anything special going on at a given time.

Many of the talks weren’t announced ahead of time, which made choosing ones to attend a bit odd. Still, a little mystery never hurt anyone, and I attended the following sessions:

  • The opening keynote by Corey Haines in which he talked about developers: where we came from, where we’re going, and whether or not we are about to repeat some of the mistakes of the past.
  • A demonstration of functional programming style by Michael Feathers.
  • An interesting look at the evolution of programming languages by Gary Bernhardt.
  • The apprenticeship panel that gathered several prominent developers and company owners to talk about why they take on apprentices and what they’re looking for when they do.
  • “Architecture: The Lost Years” by Robert “Uncle Bob” Martin.
  • A demonstration of the Roman Numerals kata in Ruby by Jim Weirich.
  • A discussion of parallels between learning and practicing a musical instrument vs practicing programming by David Chelimsky.
  • A critical look at software development education and propagation of popular methodologies by Zed Shaw.
  • The closing keynote by Chad Fowler in which he talked about the values held by passionate developers.

I’m going to aim to make a post every week or so to summarize and, where possible, interpret each of those talks along with some other stuff that I learned about at the conference that I think is pretty cool (Ruby Warrior!).

So, check back here periodically. I’ll do my best to update this post with links to future posts, but they shouldn’t be hard to find either way.

Achievement Unlocked: Stack Overflow Moderator

Back in February I decided to increase my Stack Overflow participation. Apparently what that turned into was a greater involvement in the Stack Exchange network in general over the past year and getting elected in the latest community moderator election on Stack Overflow.

I’m pretty excited about it. It’s pretty cool to be a moderator on two complementary sites. I’m looking forward to helping them both grow and become more awesome.

(Very Positive) Impressions of RallyON11

I had a great time at RallyON. My partner-in-crime Mark Phillips (@mpmobile) from Project Management Stack Exchange and I did a couple talks about Stack Exchange during the open space part of the conference on day 2. All time outside of that was spent talking to people coming from an incredible range of domains and experiences.

Here are my highlights from the whole affair, in no particular order:

  • Boulder, CO. Gorgeous to the point of making up for the crazy weather where one can get a sunburn one day and regret not packing a warm sweater the next.
  • Bringing StackExchange really worked. I wasn’t sure how it all was going to pan out, but we were able to take questions from the conference and put some of them up on SE (mostly on Project Management, though). I think we got more than a few folks interested in joining the fun.
  • Playing flow games early morning on Day 1. This is the kind of thing that always seems hokey, but turns out pretty fun when done with people who actually want to be there. My favourite was the “Pass the Penny” game and the somewhat unexpected conclusion that while individual efficiency may go down, overall system efficiency may go up for a given workflow.
  • Speaking of people, so many passionate and talented individuals, both from Rally and elsewhere.
  • Use of open space on Day 2. Proposing a topic is easy, watching to see if there’s community interest in it is nerve-wracking, and leading/participating in discussions is awesome.
  • Designated note-takers in each session — great idea, especially coupled with a designated site for posting said notes! Check them out here at the RallyON portal.

All in all, the whole thing was a lot of fun. Many thanks to Ryan Martens (@rallyon), Eric Willeke (@erwilleke), Mark Gammon (@markgammon) and many others from Rally for bringing together the vision, the passion, the knowledge, and the technology needed to make it all happen.

High signal, low noise, A+++, would go again.

On to RallyON!

I’ll be heading down to Boulder, CO next week to represent Programmers – Stack Exchange at RallyON 2011.

I’m very excited to be able to do this (and meet a few friends face to face for the first time while I’m down there!). Check out this post at Rally’s Coaching Blog that explains how we’re hoping to bridge the gap between a user conference and the virtual communities of programmers and project managers established on Stack Exchange.

We have created a special tag (RallyON11) on Programmers for the duration of the conference, so you can follow along and see how this experiment turns out. On Twitter, follow #rallyon11 for the latest and greatest micro-updates. And of course, if you’re attending, be sure to look me up and say hi. It’s gonna be a blast!

ASP.NET MVC 3 – NUnit test project template

Piotr Kwapin posted an NUnit-based test project template for MVC 2 back in July and I used it in my ASP.NET MVC 3 project. It turned out that the LogOn method tests are failing due to the Url property on the AccountController being null. So I fixed that.

I haven’t followed Piotr’s template installation instructions, since I’m using Visual Web Developer 2010 and it doesn’t have the same support for test projects as a paid-for version of Visual Studio does. If you’re in the same situation, you can simply unzip the template zip file and grab the project files out of that. There are also a few namespace placeholders that need to be fixed up. If you have a full version of Visual Studio on hand, you can follow the instructions in Piotr’s post for installing the template and skip a lot of that manual work.

Once you have the project set up, download, overwrite the AccountControllerTest.cs file you got from the template with the version from the zip file, and fix up the namespace placeholders again. All tests should pass now with MVC 3.

The gist of the changes is that I provided a mock dummy implementation of HttpResponse and HttpRequest, and changed the AccountController creation method to also instantiate a UrlHelper object.

Programmers.SE Moderator

I’m very happy to say that I’ve been elected as one of the three new community moderators on The voter turnout was pretty low, around 11% of the total userbase and 55% of those who visited the elections page, but that’s not entirely unexpected. It’s hard enough to convince people to vote in government elections, nevermind online.

I’m pretty excited about this, though. I’ve been getting more and more involved with the site over the last few months and I’m pleased to see that I can continue to be “more and more” involved. It sounds cheesy, but seriously. I’m psyched. Next goal – higher StackOverflow participation.