Monday, December 17, 2012

Things to do in Ann Arbor

An out-of-town friend asked for suggestions about things to do during a visit to Ann Arbor. Here are my suggestions to him:

  • The University of Michigan Art Museum is very nice:
  • Ann Arbor has an iconic, world-class deli, Zingermans:
  • If it's a nice day, you might enjoy a walk in the Matthaei Botanical Gardens & Nichols Arboretum:
  • The downtown area, especially Main Street, has a many nice shops and restaurants.
  • If you want a fairly upscale dinner, the Earle is very good. And they have some nice specials during happy hour 5-8 weekdays.
  • Kerrytown is a nice indoor collection of shops and a market: There's a nice farmer's market there too Saturdays and Wednesdays from 7am-3pm.
  • If you're looking to see a show, you could check the Ark , the Kerrytown Concert House or Performance Network

Thursday, October 11, 2012

Preview of my "Refactor Your Software Career" talk

On Oct 24, 2012, I will be presenting a talk, "Refactor Your Software Career" to the Agile Groupies meeting in Ann Arbor at the Forge. I'll be sharing my journey from stagnant software developer to my current position at Pillar as a software craftsman and agile consultant, along with specific actions I took to get there, and strategies that anyone can apply to improve their career path. I'll also touch on barriers to taking this kind of action and what helps to get past those barriers.

But a key component to my talk will be what I'm calling "Transformative Networking". My idea is that you can simultaneously improve your marketability (raise your skills and experience) and increase the number of people who might want to hire you even while you continue to work at a job that doesn't offer growth or networking.

Transformative Networking involves engaging in activities that share as many of the following attributes as possible:

  • creating real value (like volunteering or teaching)
  • in your desired field (volunteering is good, volunteer coding is better)
  • with others (solo coding a website for a charity isn't as good as being on a team doing it)
  • in person (there's no better way to present yourself than by working with someone in person)
  • with people in your target companies (if you want to work at a company, let their employees get to know you)
If you engage in activities like this (and my talk will include specific examples of ones I participated in), you can not help but increase your skill sets and get noticed.

Tuesday, May 15, 2012

UPDATE: The Forge Open House Date Moved

As I mentioned in a previous post, Pillar is holding an open house at our new facility in Ann Arbor called the Forge.

There is a new date for the open house: June 21, 6-9pm. If you already registered for the May date, you will receive updated information by email.

Please see my previous post for full details, or click here to register. (It may take a few days for the date change to appear on the registration site.)

Tuesday, April 17, 2012

Jenkins and Subversion and "Send separate e-mails to individuals who broke the build"

My current team wanted to use Jenkins' "Send separate e-mails to individuals who broke the build" feature. We use Subversion, and our Subversion usernames are not email addresses. And because my team members belong to different companies, we can't specify "Default user e-mail suffix" even if our Subversion usernames were the names of our email accounts.

For a while, I couldn't figure out how configure Jenkins to do what I want. I did a little googling and found out that Jenkins has a "People" page (for example, Apache's* People page is: ). Clicking on a person's User Id link takes you to their page. With our Jenkins configuration, a user's page has a "Configure" link on the right. Clicking that allows them to enter their name and a variety of other details, including Email address! That should allow me to use "Send separate e-mails to individuals who broke the build" the way my team asked.

* If you want to look at a big, vibrant Jenkins installation, check out the public Apache Jenkins machine: Obviously it is read-only, but it has lots of projects, so there is usually something building, and you can see lots of examples of different statuses.

Monday, April 2, 2012

Jenkins Violations plugin quirk

Now that I got OpenCover working with Jenkins, I decided to go after fxCop. Here's the command-line I settled on:

"C:\Program Files (x86)\Microsoft Fxcop 10.0\fxcopcmd.exe" /oxsl:none /igc /f:OurApp.AssemblyToCover1.dll  /f:OurApp.AssemblyToCover2.dll /out:fxcop_results.xml /d:"c:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies"

The /oxsl: argument specifies no xsl transformation on the output (I'm using the Violations plugin which reads the native xml).

The /d: argument points to where System.Web.Mvc.dll lives, which one of our assemblies depends on.

As I mentioned before, I want to exclude several assemblies from analysis, so I specified the ones I want included by using /f: arguments (one per assembly).

NOTE: Getting the Violations plugin to work was easy once I realized one thing: the "XML filename pattern" must either be a filename pattern only (in which case the file will be in the Jenkins build project's workspace directory) or it must be in a directory below the Jenkins build project's workspace directory (for example results\fxCop*.xml) Absolute paths and relative paths starting with "..\" do not work.

Sunday, April 1, 2012

I Got OpenCover to Work with Jenkins

As I mentioned before, a team that I am coaching is using Jenkins for CI. We wanted to automate code coverage measurements for the .Net code in specific assemblies of our solution. (Others are third-party or machine generated, so we don't have unit tests for them.) It took me longer than I would have liked, but I did get OpenCover running and generating reports as part of our Jenkins build.

One hurdle was that Jenkins seems to need to be run as user with administrator rights in order for OpenCover to work. So I created one and assigned it in the "Log On" tab.

In my Jenkins job, I opened "Add build step" and selected "Execute Windows batch command". In there, I gave the command line:

"C:\Program Files (x86)\OpenCover\OpenCover.Console.exe" -target:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest.exe" -targetargs:"/testcontainer:E:\Jenkins\jobs\BuildOurApp\workspace\TRUNK\OurApp.UnitTests\bin\release\OurApp.UnitTests.dll" -filter:"+[OurApp.AssemblyToCover1]* +[OurApp.AssemblyToCover2]*" -register:user -mergebyhash -output:E:\Jenkins\jobs\BuildOurApp\workspace\FilteredCodeCoverage.xml

As an aside, I often have Jenkins jobs with several batch command sections. I found it annoying to scroll up and down and quickly find the one I was looking to edit. So I've started marking the top of each script:
REM   _      ___  _  __ _____  
REM  | |    |_ _|| |/ /| ____| 
REM  | |     | | | ' / |  _|   
REM  | |___  | | | . \ | |___  
REM  |_____||___||_|\_\|_____| 
REM   _____  _   _  ___  ____  
REM  |_   _|| | | ||_ _|/ ___| 
REM    | |  | |_| | | | \___ \ 
REM    | |  |  _  | | |  ___) |
REM    |_|  |_| |_||___||____/ 
( , "Standard" font, unchecked "Smush Letters Together" )

I have the HTML Publisher plugin installed, so I enabled it, clicked Add to add a row and specified:
Code Coverage Report
as the arguments and it's all set! Now coverage is computed automatically and my team has a single URL for a summary report with drill-down details.

Saturday, March 31, 2012

Coding in the Clink - Another Success!

Today I again had the privilege of attending a Coding in the Clink , this time number 6. This was my third visit to Marion Correctional Institute. (Read about my first visit and my second visit.) The last time I went was June 2011. Since then, the Java Guys have definitely continued to improve, in TDD, pairing, and Java. And as before, the guys were curious, hard working, and fun to be around.

As always, Dan Wiebe did a great facilitation job, and this time added new twists. He had us break from CodeRetreat tradition in a couple of significant ways (besides the fact that prison lunch never qualifies as "something good, catered"): 
  • No GoL, instead Mancala  (We were all surprised at what a challenging problem Mancala is, given the fairly simple rules. I think it's more interesting than GoL.)
  • Instead of deleting our code after each round, we left it there for the next pair. And he asked us to not pair with the same person twice, and not work on the same code twice

In round 2, when I sat down at someone else's code for the first time, it took most of that round just for me and my pair to make sense out of what was there. (Most pairs experienced this too.) I found that each subsequent code base I visited was easier to understand (and most other devs found this too). It was cool to sit down to each subsequent code base and find something better than I had previously sat down to.

For our final round, everyone agreed to go back to the workstation where we started. I'm not sure there was any consensus around that experience. For me, I was sad to find there weren't many more tests 5 hours later than when my pair and I first left it. (Which seems odd, given the experience of improving codebases we had up until the last round. Maybe I was having some bias when looking at "what they did to my code"?)

I'll close with the logo for today's event, as created by one of the inmates, Mark Roberts:

Thursday, March 15, 2012

What is "The Forge, By Pillar"?

If you weren't at Agile and Beyond 2012, you may have missed the announcement by Pillar Technology (my employer) that we will be leasing a large space in Ann Arbor's Tech Brewery, a 1850's era building that started life as a brewery and is now a tech startup community with over 30 member companies. The space, and the activities there will be known as "The Forge, By Pillar".

My understanding of this new sub-brand its that it will a place where Pillar can:

  • bring client teams to to a space "away from home" to help them create software in ways radically different than what they are used to, while we provide coaching on principles and practices of Agile, Lean, Speed to Value, and others
  • bring clients to show them the exciting way our teams create software to generate business value and, if clients desire, quickly assemble team a of skilled software development practitioners to rapidly build valuable software for them
  • offer training courses on topics like: Writing User Stories, TDD, BDD/ATDD, enterprise transformation
  • host user groups, CodeRetreats, coding dojos, givecamps, etc

I've found that people often want to start writing software differently but feel held back by various forms of inertia in their company. I imagine The Forge being a place where people can come, individually or as part of a company team, for an afternoon visit, a training course or workshop, or for weeks of on-site coaching and development.

Please join us for an open house on May 17th (note the updated date:) Thursday, June 21from 6-9 pm at Tech Brewery and see for yourself what The Forge is about! (map)

Tuesday, March 6, 2012

Pair Programming Harmful? Says who?

There's been a lot of attention on Twitter to an article by Jon Evans at TechCrunch that takes a fairly broad attack on the agile practice of pair programming, only to advise readers to use their best judgement about it. I find the piece to be a sensationalist attack on a practice that the author doesn't seem to understand. He cites the ineffectiveness* of "brainstorming", which pairing is nothing like; and the dangers of allowing people to hide and let others do the work, which good pairing actually mitigates. Even if you grant his, in my estimation, weakly-supported hypothesis that it harms superstars, it completely misses the accelerated learning and distribution of knowledge that pairing affords agile developers and newbies. The article also misses the natural instinct that we developers have to work on what we find fun and interesting, even if it's not trying to solve the business problem at hand - how many times have you seen a cowboy rewrite working code because s/he didn't like it or because  it was a prime candidate for a flashy new technology? Waste like that doesn't happen in good pairs. Neither does finding yourself at the end of a couple of hours having achieved little besides some web surfing, a few personal calls, and having reduced the size of your inbox? Or haven't we all seen great, creative solo work, that isn't what the business needs?

Evans doesn't acknowledge that pairing is a skill that takes practice to get good at, and for some developers getting good at it requires some people to step out of their comfort zones. Rather than his arguments against pairing, I'd like to see an article discussing personal challenges that pairing poses for some developers and the courage that it will take for them to become good pairers, if they want to avail themselves of the benefits of pairing.

* This claim may not even withstand scrutiny:

Monday, March 5, 2012

A New Big Visible for the Card Wall - State Change Criteria

I have a team that's just starting agile. During Sprint 0, we decided on a Definition-of-Done, but the team also wanted a way to make the criteria for moving a story card from one column on the wall to another big and visible. Being new, they thought it would help them to see, as they move a card from one column to the next, what had better be complete at this stage. If they had missed something, they have a chance to catch up before they actually move the card. We came up with yellow boxes that sit on the physical boundaries between columns on our card wall (see right). I'm calling them State Change Criteria (since there's already been a CCC since early XP days). The team left room to hand-write new criteria as their understanding grows and their process improves.

We came up with two more big visibles (not shown) that address the flow of "defects". One says: "In-sprint defects are moved back into Sprint Backlog." This is to remind the team that we don't track problems with in-play cards, we just fix and finish them within the sprint. The other says: "Escaped defects are written as new user stories and moved back into the Release Backlog." This is to remind the team that the Product Owner may choose to prioritize new functionality above fixing the defect.

Thursday, February 2, 2012

Trying to get .Net Metrics Computed and Displayed with Jenkins

I'm helping a .Net team stand up Jenkins as their CI server. The build steps we have so far are building a solution and running fxCop against the debug build. Using the Jenkins Violations Plugin, which supports fxCop, we can display a nice trend chart and have hot links to drill down and see the violations in context.

My next goal was to run metrics that my team agreed on, specifically Cyclomatic Complexity and Coupling. I was hopeful because Visual Studio 2010 can already compute them. But I found out that Visual Studio's code metrics can't be called on the command line. 

Fortunately, I found Visual Studio Code Metrics PowerTool 10.0 for that purpose. There's lots of information already out about using it: Jeff Bramwell has a blog post about the PowerTool and Cameron Skinner wrote one about it.

Unfortunately, the Violations Plugin doesn't support the xml output, and the PowerTool doesn't have an option to output to HTML. Fortunately, though, Skinner also wrote a post that provides an xslt and a .css file that will turn the results into HTML.

So my next step was to make a build step that runs a command-line tool to apply the transform. I couldn’t figure out or find enough documentation on msxsl.exe, but I found this CodeProject project and it works. (Anyhow, it would only take a few lines to write your own in C# because you can use calls from MSXML.)

Now I need to figure out how to use the HTML report in Jenkins. I'll investigate the Jenkins HTML Publisher Plugin.