Kurt’s Blog

September 10, 2009

Becoming a Software Maintainer

Filed under: Uncategorized — Kurt Häusler @ 6:56 am

I have been at my current employer for six months now, and it’s clear that it’s not a software development job at all. It’s a software maintenance job. I have noticed a lot of differences. There seems to be a lot less opportunities for creativity, or innovative ideas, as everything has already been decided. It reminds me a lot of the assignments we would set for the first year computer science students at uni. We provided the skeleton of the program, a bit more than method stubs, and allowed the students to fill in the gaps. In fact, in my job, even the gaps are filled in, and I just make a few changes here and there. Another difference is in the flow of delivering value. I am used to hammering out the tests, hammering out the code to make them pass, running all tests and checking everything in, and it all feels like delivering value. I hardly ever used the debugger, only in situations where something really weird was going on. Now, I basically start off in the debugger, spend a few days stepping through code, writing down notes, keeping a note of what methods and classes really do (as opposed to what they are called, which is more related to what they might have done some years ago), and trying to link things back to domain concepts if possible (although that’s not often so useful, another difference between development and maintenance seems to be that technical aspects of programming e.g. classes, xml, bytes, etc become the actual domain concepts rather than orders, customers, products etc). A lot of time is spent waiting for some expert, usually one of the other maintainers that developed the software, to explain something, and at the end of the week the change is perhaps less than 20 lines. I felt like something was wrong, as if such a small part of my time was spent truly delivering value. I was comparing apples to oranges again. Something that would have taken half a day in a development context, seems to take roughly 10 times as long in a maintenance context. But this is nothing new. Everyone knows that maintenance is more expensive than development, that is why software is often developed as projects, with fixed time-spans for development and maintenance before it is retired. But sometimes the business reality is that is in fact cheaper to continually develop something than start again from scratch. I have also heard it said that replacing a legacy system can also be expensive. So there is clearly a business case for extended maintenance of mature software products.

I wasn’t too interested at first, I wanted to be a craftsman, a creator of new software, a developer. I wanted to play a part in the high level architecture, and be involved in the decision making from a project’s very beginnings. However, software maintenance does have something to offer. It seems that there is huge money in it for a start. Customers see it as a lower risk, quicker turnaround alternative to developing a new solution. The fact that it is so expensive suggests to me that there are still some unsolved problems. Considering myself as a developer, yet engaging day-to-day in maintenance felt frustrating, so I am accepting reality, and am now considering myself a software maintainer.

However I am still a NNPP after six months, and that is unsatisfying. I take up more of the original developer’s time getting him to explain something than if he were to simply perform the maintenance himself. It is a classic case of Brook’s “Mythical Man Month”. An article in the BCS mentions “Whatever the maintenance required, it must be fully understood by the maintainer, including the impact of the maintenance in terms of cost and effort to implement.” Everything I read says it makes more sense to have the original developers perform the maintenance, and adding more developers simply makes it slower, and that if a company really feels that they have so much to do that they need new developers, then that new functionality, should be implemented by the new developers in a new project. However, the people who make decisions obviously have access to information that confirms that in this case, it does in fact make more financial sense to add new developers as maintainers, rather than start them on a new development effort.

So we can therefore assume that the company has done its risk management, weighed the pros and cons of both approaches, and decided on one. As a developer that aspires to craftsmanship principles it raises a few questions relating to optimizing my personal satisfaction with the job and ideally, mitigating some of the company’s risks in using new developers as maintainers.

  • As a software craftsman in a software maintainer role, what can I offer the company, that the original developers cannot?
  • How can I be just as valuable and productive to the company as the original developers?
  • According to one interpretation of the Pareto principle, 20% of employees are responsible for 80% of the value. How can I ensure that I am in that 20%?

You see, it is not, and should not, be sufficient for me to be a slightly less competent, less effective and less valuable version of the people who wrote the original software. For me the answer would seem to be, find a way to complement, rather than compete with the original developers. It does not make sense to perform the same actions in the same way as the original developers. We have different strengths and weaknesses. Strengths of the original developers, which can be seen as weaknesses of the new maintainers include:

  • Extensive domain understanding.
  • Extensive understanding of the code base.
  • Moral authority.
  • Embedded in company culture.

Strengths of new maintainers, which could be seen as weaknesses of the original developers include:

  • More recent exposure to other domains.
  • More recent exposure to other coding styles and languages.
  • More recent exposure to different cultures and ideas in general.
  • Fresh start, no company history categorizing or constraining them.
  • Not so solidly embedded in the company culture, already liberated from their “comfort zone”.

I was looking for analogies, from historical craftsmanship, to see what general patterns I could notice, but nothing seemed to fit quite right. Usually the thing being designed or maintained exhibit much less complexity and variation than a million line software product, such as shoes, or fountain pen nibs. Often where the product really is complex, such as a car, we start to move away from craftsmanship, and we start looking at software mechanics. Even in this case, a car is still less varied than software, and the mechanic doesn’t have to play around with it for days to discover how it works, he just reads the manual, and looks up tables of symptoms and applies the solution suggested by the manufacturer. That is an idea that could be explored further in the context of software, but I think its usefulness is limited. I could definitely say that a little more documentation would make maintenance easier, but in this case it would cost more that it would bring to produce such documentation, and would suffer the classic disadvantage of always being more out of date than the software itself. It does lend itself to underscore the importance of design techniques such as Domain Driven Design, particularly the use of Ubiquitous Language, to enable source code to be a tool that aids in domain understanding, rather than requiring huge efforts to be understood for its own sake.

One useful analogy I did think of was the boiling frog analogy. The original developers are like frogs placed in cool water that is slowly brought to boil, and the new maintainers are like frogs placed directly in boiling water. The former experiences change slowly over time, and finds it difficult to notice such change occurring, and accepts the current situation as normal, because it is what they are accustomed to. The latter frog notices things straight away, anything that seems not quite right, is immediately apparent.

So I am lead to the following ideas about how and where new developers might get their chance to shine on a maintenance team, alongside the original developers:

  • Customer facing tasks and analysis. “I am still new to the travel industry, but in the automotive and health care industries we solve such problems by … have you ever thought of doing it that way?”
  • Change and risk management.
  • Retrospectives.
  • Architecture and software design. “Of course that is going to be difficult to solve in that iterative loop. In my last job we used a lot of LISP and recursion so I believe that if we used recursion here…”
  • Things independent of the domain, such as Quality Assurance (not QC/Testing but real QA), Technical Debt management, code reviews, optimization, porting, integration, deployment.
  • Representing the company at conferences, and in writing on blogs and in magazines and journals etc, on technical rather than domain related issues.

However, this is not a list that I would hand to the employer and demand that changes are made to suit me. If the employer felt that changes were necessary, he would make them himself. A software craftsman’s career is his own responsibility. He has to carve out his own role, and define the way he will deliver value, within the constraints he his given.

In my case, working within an agile/iterative development process, where we get stories, divide them up into tasks, and tackle them one after the other, it should prove to be somewhat challenging to carve out a role that allows me to answer my three questions above, but a rewarding challenge, one that I, as part of my recent acceptance of my role as maintainer, am quite excited and willing to take on, not so much as an obstacle, but as an opportunity to embrace change on a personal level, and most importantly, to increase the value that I can deliver for my employer.

August 25, 2009

A couple of my open source projects.

Filed under: Uncategorized — Kurt Häusler @ 6:18 am

I recently uploaded a couple of old, small, unimpressive open source projects to GitHub.

The first one, PolyDriver, I hacked together in 2003. It is a user space linux driver for PolyTrax powerline modems. I was pretty lucky to be able to convince the boss that Open Source was the way to go for the linux driver. It was a lot more straight-forward than the Windows 2000/XP one too. I don’t have a PolyModem lieing around to really test it, but maybe someone does, and the driver can be useful for them.

The other one, Kurts NetSend, (really needs a better name) is a replacement for the “net send” command that was removed in Vista. I wrote it because my employer at the time used that command to inform everyone of when morning tea was ready, and all the vista users were missing out. It was, and still is, also hosted on codeplex, and was a featured codeplex project on the MSDN Vista page for a while. I think it should work on Windows 7, but have not been able to test it out yet.

They both contain pretty ugly code, the NetSend one could probably be improved a bit, I would start by separating the gui and the backend, and perhaps doing a new WPF front end or something. Otherwise they are both pretty small and could be ideal starting points for someone who wants some practice with refactoring to clean code or something.

July 29, 2009

Software Development Videos

Filed under: Software Development, Uncategorized — Tags: , — Kurt Häusler @ 6:50 am

I had a chance on the weekend to catch up on some software development related videos, and thought I would share here what I watched and what I thought of what I watched.

Language Oriented Programming in F# – Roger Castillo

Up until now I had watched and enjoyed several F# related videos and screen casts, and played around with a few tutorials, and I checked this one out for some more deeper insight. It was interesting, but I think I would have gotten more out of it if I was actually working properly with F# rather than just playing around with it. I also don’t think I am such a fan of screen-casts unless I am really trying to learn something specific, and can go through it on my own machine while watching it.

On Being A Journeyman Software Craftsman: Road Thoughts – Visible Metrics

Next on my list was this Corey Haines video, unfortunately I haven’t been able to watch it yet, as I was only available as a streaming flash video. If I try and play any flash video in full screen, the quality is terrible, the CPU maxes out, overheats, and eventually crashes. I have a Firefox extension that can download and convert flash video, but it didn’t seem to work on this site. I do want to check it out, so I will leave it on my list, and see if I can work out some other way of downloading it.

WPF Videos

I still need to learn WPF properly, so I thought watching a few screen-casts might help. I watched one of the basic ones, but like I said above, I really need to go through and do it on my own machine at the same time to really learn anything from it. Also I think when it comes to specific technologies, I would prefer to learn things “just-in-time”, when I have a context in which to think about what I am learning. I think I am more interested in videos when it comes to learning more of the technology-independent fundamentals.

Virtual Alt.NET Videos

I try to attend most of the European VANs, but the classic VAN also has a lot of good guests that I mean to catch up on later. Looking at the Viddler page was quite surprising. Once you include the Aussie VANs and the Brown Bag meetings, there are a lot of videos there! Most of the ones that had guest names in the title I had seen, so I just picked a couple of random ones to skim through. There are definitely some good nuggets of information there, but it is not easy to find.

F# Webcast Series

I had seen part one of this series a while back, and made a note to watch the rest of it. I started to watch part two, but once again, for these technical how-to screen cast type things I think it really requires that we go through and do the exercise along with the screen cast to really learn anything.

But there are exceptions. Over a year ago, I remember watching the Hibernating Rhinos and Summer of NHibernate screen-cast series, and they were so good that I was able to learn a lot just by watching. I think the difference was that I was at the time actually working on a DDD .NET project at work, and was able to directly relate what I was seeing to how I could use it in that project.

I am sure if I was actually using F# or WPF at work I would be able to enjoy watching screen-casts on those topics without going through and doing it locally too.

Anyway, I have made a note to go back and look at these F# screen casts again while actually trying it out myself.

Project Natal

Not sure how this ended up on my list. I am not a gamer, and can’t imagine getting an xbox any time soon. Still its interesting seeing what new technologies are coming out. I remember hearing about it first on the Totally Rad Show, and thinking it was pretty much a gimmick.

The Myth of the Genius Programmer

Now this was great. This is the type of video I can actually sit there and enjoy. I think all developers should continually watch videos like these. It covered topics like working in a team, fear, dealing with mistakes etc. Definitely check this one out.

Artisanal Retro-Futurism crossed with Team-Scale Anarcho-Syndicalism

This video from Brian Marick was probably more entertaining than useful, but I enjoyed it immensely. On the surface it appears to be a plan for restoring the values in the agile world by using some crazy ideas from the past. Also worth checking out.

Videos from the Norwegian Developer’s Conference

I remember hearing a lot about the NDC, and wishing I was there. Now the videos are available. I checked out the The HaaHa Show, but ended up skimming through it as asp.net is not really my thing. I did watch Robert C. Martin – Clean Practice: Agility and Craftsmanship and enjoyed it a lot. He is really both an informative and entertaining speaker. I think I enjoyed his RailsConf “What Killed Smalltalk Could Kill Ruby, Too” talk a bit more. This NDC one seemed a bit rushed and tried to cover a little bit of too many things.

I intend to go back and check out more of the NDC videos.

Haskell and Erlang: growing up together

This keynote from Simon Peyton-Jones was great. Unfortunately the quality is not that good, you can’t really see what is on the screen at all. Simon Peyton-Jones is both very clever and also a pretty funny guy. This video gives a bit of background to how both Haskell and Erlang came to be, a quick overview of how their type systems differ, and the bulk of the talk is about how concurrency works in each language.

I think Erlang might be my language to learn in 2010.

Oh and while we are on the topic of Microsoft Research staff and Haskell, check out some Brian Beckman videos. His video Don’t fear the Monads really helped clear up some of the confusion I had (still have) related to monads.

Software development with Real Options

I have been hearing a lot about “Real Options” on some of the lean development lists lately, so I was curious to see if it was just another way of talking about the “last responsible moment”. Turns out it is, but Real Options takes it a bit further, and helps bring in some ideas from handling risk in finance, and adapt them for software development. This video is a good overview of how Real Options applies to software development.

Windows 7 videos

Somehow these advertisements for windows 7 ended up on my list. I watched one, thought it was stupid. I think it should be sufficient to just read a list of what’s new in 7 and try them out once I guess.

Bindings, Platforms, and Innovation

I found this video to be disappointing. It was an incoherent ramble. Something about stories, and how we all don’t understand something because stories are dangerous, and how stupid we all are for not knowing the difference between the web and arpanet or something. I think he was going for a spontaneous, stream-of-conscious style, but it just came across as unplanned. He would start a sentence, and then restart it several times before actually finishing a sentence, and still not manage to actually say anything. I looked up Bob Frankston afterwards, and he sounded like someone I should be impressed by, but this video did not achieve that.

DDD in a distributed world video

This one from Gojko Adzic was great. I cannot get enough information about DDD. This video really emphasized the importance of aggregates as a business concept, and provided some good technical hints related to handling aggregates in a distributed system.

Project Tuva

This is not actually anything to do with software development at all. It is a collection of Richard Feynman videos about physics. I watched the first one, and it was enjoyable to watch because of Feynman’s personality and the way he puts things across. A lot of people seem to concentrate more an the video player aspect than the content itself, calling it some profound new way to learn or something. Well, the video player does have a lot of extra interactivity features, which is cool, but hardly a new paradigm shift. For me it is more about the content than the player. If I am ever in the right mood I shall go back and watch some more of the videos.

And that is basically all I had time for last Sunday. I did not get through my entire list. I still intend to watch:

Maybe next Sunday…

April 13, 2009

Agile Quality

Filed under: Uncategorized — Tags: , , , — Kurt Häusler @ 7:19 pm

I just set up a new google group/mailing list called agile-quality.

Check it out here: http://groups.google.com/group/agile-quality

My initial welcome email says:

I intend it to be a place to discuss all aspects of software quality,
particularly as relevant to or involving agile principles, values or
practices.
This includes things like:

  • What is quality?
  • Quality Control
  • Quality Assurance
  • Relevance of quality to project managers/product owners/scrum masters etc
  • Quality Management
  • Testing (even though there is already a great agile-testing group)
  • ISO 9001 Certification
  • ISO 9126 Software quality model
  • Other standards and models for software quality
  • Technical debt and the management thereof
  • Metrics for software quality
  • Customer involvement in quality issues
  • Discussing other “movements” or groups with a focus on software quality
  • and agile
  • Craftsmanship as it relates to software quality
  • Software design; how it relates to software quality
  • The Law as relevant to software quality.
  • Discussing books, magazines, websites, blogs, quotes etc about software
  • quality
  • Which agile methods and practices specifically address quality and how?

I expect it to cover technical aspects of interest mainly to developers,
such as clean code design, as well as more managery type topics, such as
QA, certification and legal aspects, and everything in between. Ideally
this could be one mailing list where the two groups can mix, and form
consensus etc.
About me: I am just a software developer (and project management
student) interested in software quality and agile. I am not an author or
consultant (yet/at the moment). I don’t really have much of an agenda to
push except to discuss and learn more about software quality in agile
environments. I do have opinions and they will pop up in later emails.

Currently the list is unmoderated, and I will only change that if
spammers attack. Personal disagreements, teasing, slightly off topic
messages and banter will probably not be moderated away (at least for
now), I think such things help build community. The moderation policy
will be pretty loose but I reserve the right to make changes if it seems
necessary.
Thanks for checking out the mailing list, and enjoy!

Blog at WordPress.com.