Being Professional

Care about the User Experience

A great user experience is an essential part of a successful project - whether you're talking about the next great website, a wonderful product or an internal bespoke system.

Mathias Meyer has a very interesting post comparing his experiences with good baristas with the software industry.

Well worth a read.

The secret to Awesome software

What is the secret to writing awesome software?

As an industry we're very good at gravitating to new techniques, new tools, even new languages as we aspire to write even better software. And it's pretty hard to argue against the results that are obtained by some - even if those results are sometimes harder for others to reproduce.

Solve the right problem

Over on Ryan Abrahamson's blog is a post entitled "Problem Solving vs. Solution Finding" that is, at best poorly thought through.

I think that Ryan is trying to point out the importance of keeping the end goal in mind when programming - that writing code isn't an end in it's own right, but instead merely a means to an end, and that it's import to be effective and efficient and to avoid wasting time. With this I have no problem - in fact, as regular readers and those who have heard my presentations will recognize, I'm 100% in agreement with the idea.

However, what Ryan actually says is something different, something dangerous.

Everything's broken but we can fix it

If you haven't read it already, go and read Scott Hanselman's post Everything's broken and nobody's upset". Do it now, I'll wait for you.

Like many of you, my initial reaction to Scott's post was to nod my head in understanding, with examples of my own frustrations hovering at the edges of my awareness.

Handling UAT if users constantly miss things

Scott Hanselman tweeted:

How do you handle user acceptance testing if the users consistently miss things?

Sometimes it takes more than 140 characters to give a decent reply.

At my work, we run two distinct phases of testing, System Testing and User Acceptance Testing.

Riding the Wave of Email

Staying on top of the never ending tsunami of email can be a significant challenge at the best of times, let alone when you work in an organisation that treats email as it's very lifeblood.

Inspired in part by a comment made by a friend, I though it might be useful for me to detail the techniques I've been using to stay productive and avoid burial by email. These techniques have been pulled from a wide variety of sources over the course of several years and are not presented as a prescriptive "You should do this" but rather as "I found these helpful - perhaps there's something here you can use".

Growing older and keeping it simple

Having recently experienced a significant milestone birthday (no, I'm not going to tell you which one), I've been thinking about the way my thought processes have changed since I started programming way back in 1982 on a ZX81.

On the one hand, I'm no longer convinced that I know the answer to every programming problem. As Phil Haack writes in his post Getting Older:

When a bomb beheld

Here's a puzzle for you all ...

Assume you're working with a complex system that's highly important for the business, one that is mission critical for some of the staff, where they are dependent of the system so they can do their jobs every day.

Further, lets assume the system has just been restarted after a major meltdown and you're investigating the cause of that failure.

When you think you've identified the sequence of actions that caused the system to go down, when you have a plausible theory of the crash that matches known information, what do you do next?

Coding Videos

Here are a couple of excellent videos, a 20 minute crash course on the essentials of computer programming ...

See http://hillelcoren.com/coder/

Looking forward to 2012

It's pretty traditional in some quarters to do a retrospective end of year post, recapping the highlights of a blog or community.

But, I've never been a great follower of fashion. Instead, let's focus on what's important for the year ahead, and on how can we improve as professional software developers so that 2012 is more successful, enjoyable, productive and rewarding than 2011.

Someone needs an intervention

While investigating a routine bug fix today, I came across some code that can only be described as a buried cry for help ...

Lessons learnt at TechEd

After my recent presentation at the recent Tech Ed conference in Auckland, I've spent a little time reflecting on the feedback received and identifying some lessons learnt. I thought that blogging these might prove useful for others as they work towards their conference debut.

Semantic Versioning

Scott Hanselman has an interesting note on product version numbering and naming. My response is too long for a tweet or a facebook comment, so I'm blogging it here and sending him a link ...

I'm all for semantic versioning - the SemVer website articulates well a good practice.

Where things fall down with Marketing is, almost certainly, for good reason - that they want to make it easy for people to identify what's compatible.

Reconsidering the Repository Pattern

I have long considered the repository pattern to be a foundational design pattern for database connected systems. Recently, however, I've started to reconsider this opinion. Read on to find out why.

Pay it forward

We developers are privileged to stand on the shoulders of giants. If I tried to list the names of all influential people who contributed to the current state of the art of computer science and software development, this would be one very long blog post.

Much of what I know as a software developer (and professional geek) is information freely shared by friends of mine, colleagues I've worked with and strangers I've never met, all of whom saw their knowledge not as treasure to be secreted away, but as wealth to be shared.

Reducing Software Defects

I saw a couple of disturbing statistics about software testing in the keynote at the recent New Zealand Application Lifecycle Management conference.

  • The best techniques for defect detection only identify around 75% of all defects.
  • The average detection rate is around 45% of all defects.

If there was a single technique that identified 97% of all defects, I'm sure we'd all be learning it tomorrow. But, when there is no "silver bullet" technique, what do we do?

Sharpening the Saw

Commuting by train and listening to Doc Norton talk about Sharpening the Saw on Dot Net Rocks episode 632 was really interesting the other day.

The whole show is interesting - if you enjoy listening to podcasts, this is one episode of Dot Net Rocks that I'd particularly recommend - but one real gem was when Doc talked about the Dreyfus model of skill aquisition.

Questions for Senior Software Engineers

Scott Hanselman has a great list of Interview Questions for Senior Software Engineers.

Some of my favourites from the list include:

  • Who are the Gang of Four? Why should you care?
  • Describe a pattern that is not the Factory Pattern? How is it used and when?
  • You have just been put in charge of a legacy code project with maintainability problems. What kind of things would you look to improve to get the project on a stable footing?

Strategies for becoming a better programmer

The start of a new year is a good time to review the year that's been, and to make plans for the year ahead. Over on his DevelopWithPasson.Com blog, Jean-Paul Boodhoo has a great post Strategies for becoming a better programmer:

Choose to Ride the Tiger

I saw a blog comment today that illustrates a pervasive problem in our industry:

The problem is, how much longer are you willing to invest on them and NOT forcing us to learn again something new ...

The exact source isn't relevant, because this is a widespread attitude.

Where does your challenge come from?

[img_assist|nid=377|title=|desc=|link=none|align=right|width=128|height=96]Like most developers, I relish any greenfields opportunity - a chance to build a new system from the ground up, unfettered by history and to be able to do things the best way I know how.

But how realistic is this?

It's a simple fact that not every project can be greenfield. I'd venture that most development work is brownfield, maintaining and enhancing existing systems.

What about the assertion by some developers that there's no challenge in a maintenance role?

Top 10 Mistakes to make in class

A recent post on Paul Randals blog lists the top 10 mistakes people make when attending a course:

  1. Take a phone call during class
  2. Sit at the back and do email/surf and then ask questions
  3. Persist with a tangential rat-hole
  4. Bring your smelly lunch into the classroom
  5. Come to a class where you don't understand the language it's being taught in
  6. Come to a class without the required experience and knowledge
  7. Don't take notes
  8. Ask questions to try to make it look like you know more than the instructor
  9. Argue that the instructor is wrong
  10. Come to class looking for "the answer"

Go read the entire list. Are you guilty of doing any of these? Do you want to change?

Specialist Classes

Sometimes, you can simplify a complex class by extracting out a specialist helper class to provide dedicated assistance. And, sometimes, old lessons turn out to be the most relevant.

Attack of the Lazy Coder

I'm having such a great time dealing with lazy code. Check out these gems I've found just today ...

var periodError 
    = string.Format(
        "The Survey Return does not contain a valid Reporting Period");

Why format something that with no parameters? I changed the code to this:

var periodError 
    = "The Survey Return does not contain a valid Reporting Period";

Simplicity

Listening to Udi Dahan on Deep Fried Bytes Episode 49, I heard Udi say something very simple, but very important.

When people hear the word "simple" they translate that in their head to easy. So when someone talks about "Keep it simple" they think the message is "Keep it Easy". But, keeping things simple is not easy at all.

Process Improvement

It's interesting to see how different people react to the idea of process improvement. Most people fall into one of two camps - I'll term these the Conservatives and the Radicals.

[img_assist|nid=259|title=|desc=|link=none|align=center|width=512|height=249]

Conservatives don't see any need for change at all: "That's just the way we do things around here, we get the job done, and I've got work to do anyway." They put no effort into process improvement, and therefore realise no improvements. They never make things worse - but they never make them better either.

A Boys Club?

You don't have to go very far to see the extent to which women are underrepresented in the IT industry - especially as software developers. Recently, I've started to ponder the reasons why - and, to quote Walt Kelly: We have met the enemy, and he is us

Sometimes, the answer is simple

Saw something interesting at church the other morning, as the speaker was preparing her message.

A set of PowerPoint slides, for display alongside the message itself had been saved on a USB key, and needed to be loaded on to the A/V computer used during the service. However, when the key was inserted, it didn't appear under My Computer, making it kinda difficult to access the files.

The immediate response of the person driving the computer was to dive into the control panel, clicking things at random, looking for something wrong.

Software Craftsmanship

Here's something more serious - a manifesto for software craftsmanship:

Not only working software,
but also well-crafted software
Not only responding to change,
but also steadily adding value
Not only individuals and interactions,
but also a community of professionals
Not only customer collaboration,
but also productive partnerships

The Art of Unit Testing

It appears there are those who think it's perfectly Ok to steal Roy Osherove's latest book, "The Art of Unit Testing".

Seems a bit rich to me - after three years of hard work, surely Roy deserves the small recompense he gets for each copy sold.

I wonder how many of those who cheerfully stole his work would be just as happy to have three years of their hard work stolen by people too lazy or too cheap to pay.

Two dangerous little words

There is a common two word phrase that needs to be purged from our vocabulary.

Best Practice.

Older Programmers

Just read an interesting article which included this comment:

There is also a belief that older programmers "lose the edge." That belief is mistaken in my opinion; older programmers may not burn as much midnight oil as younger ones, but that's not because they are old, but because they get the job done without having to stay up past midnight.
(Michi Henning, "API Design Matters", Communications of the ACM May 2009 Volume 52, Number 5)

Something to aspire to, perhaps ...

Quote of the Day

Quote of the day, from Matthew Hintzen's presentation on LINQ, Lambda and Extensions at the Wellington .NET Usergroup CodeCamp 2009:

If the code's not elegant, we're not done.
Don't accept an Ugly Betty or a Homely Bob.

Like Matthew, I'm a real believer in elegant code. Given a choice between code that is ugly and difficult to read, and code that is simple and easy to read, I'll choose the easy to read version every time.

Stages of Competence

Well over 10 years ago I learned of the so called Four stages of competence.

In short, these four stages identify the progression of skill adoption:
[img_assist|nid=238|title=|desc=|link=none|align=center|width=512|height=174]

Someone with Unconscious Incompetence doesn't even know that they don't know.

Someone who is Consciously Incompetent has some idea of what he doesn't know.

Someone who is Consciously Competent can get the job done, but has to work at it.

Listening time

Shorter than some, longer than many, my 1 hour commute to and from work each day used to be down time. Over the last three or four years, I’ve found that podcasts are a good way to fill the time.

Scott Hanselman has just posted Hanselman's Super Karate Death Car List of .NET and Software Podcasts and suggested that others do the same … here’s what occupies my commute.

Be A Better Developer

Leon Bambrick has an interesting post 8 ways to be a better programmer in 6 minutes. Even if you don’t agree with Leon’s tips, they’re interesting, and thought provoking.

In the same spirit, here’s some more tips for you … though some of these might take more than 6 minutes to do.

Learn the Keys

The importance of Attitude

I’m finding that attitude and intent make an important contribution to the code I write.

For example, though I currently use NUnit as my testing framework, and Rhino.Mocks for mocking, I’m not always using these to write tests or mocks.

Confused? Let me explain.

On NNPPs

Jay Fields has a recent post “The Cost of Net Negative Producing Programmers”, in which he laments the high impact of NNPPs and the lack of any industry structure that encourages them to leave the field.

I find it reasonably depressing to find that, in many ways, I agree with his argument.

Worse, I’d go so far as to suggest that a similar problem exists in other parts of the ICT industry.

Some examples from my own experience …

Being a Tidy Kiwi

Going through blog posts that I’ve flagged for follow-up, I found a gem from 2006, “On Graffiti and Broken Windows” by Stuart Caborn.

The psychological and sociological trends that Stuart references, from Malcolm Gladwells “Tipping Point”, as well as others I’ve read (such as “Freakonomics” by Stephen Dubner and Steven Levitt) all point to the value of taking the time to be tidy.

The right knowledge for each problem ...

A friend emailed me an interesting quote:

"... what little evidence we have about programmer productivity points to a productivity distribution that's skewed with a long tail of incompetence"

-- Larry O'Brien

However uncomfortable it might make you, I believe there's a certain amount of truth in this quote.

Foundations of Programming

Karl Seguin, one of the CodeBetter bloggers, has written a book on programming fundamentals, covering topics from "YAGNI" and Unit Testing, to Domain Driven Design and Dependency Injection.

The book is well written, engaging and informative - recommended.

Creative Discipline

Over on 43 Folders, Merlin Mann has posted a thought provoking article Attention & Ambiguity: The Non-Paradox of Creative Work

Go read it. I'll wait here.

Merlin has written about a important distinction, one that is critical to all creative endeavours - and I include Software Development as a profoundly creative endeavour.

NUnit Best Practices

I'm always looking to do things better tomorrow that I did yesterday - and to that end, I find other peoples "Best Practices" posts endlessly valuable ... not that I always agree with them of course, but I do enjoy being challenged to think.

Go read NUnit Best Practices, a fairly recent post by Scott White.

How many of Scott's 7 NUnit practices do you agree with? How many do you follow? Why?

Attitudes to Change

I was reading today about the so-called "awesome bar" included in the upcoming release of Firefox 3 and was struck by the observation that many commentators seem to be simply complaining about change.

Dealing with constant (and accelerating) change is part and parcel of working in the IT industry.

Continuous Integration with TeamCity

I've been spending some time recently setting up TeamCity, the Continuous Integration server from JetBrains.

Why TeamCity and not CruiseControl.NET?

In my opinion, TeamCity is far more approachable and usable right out of the box. Configuration is through a polished web-based front end. Documentation is pretty good, but most of the time you don't need any docs at all because the UI walks you through the process.

Creative Passion

I was listening today to a recent Hanselminutes podcast, where Scott Hanselman and Carl Franklin were discussing the Joy of Development.

Comfortable Clothes

This week, I've been doing some maintenance work on a Delphi application. So I'm spending a lot of time back in the Delphi IDE - a place that used to be the centre of my comfort zone.

A few years ago, while making the transition from Delphi to .NET, I was pretty vocal about the "sharp corners" I found in Visual Studio - things that were oh-so-simple in Delphi that were hard work in Visual Studio.

Studying on the Move

A friend recently asked me what podcasts I listen to on a regular basis - and I figured to share the list here as well.

The Curse of Remembered Pain

Barring a few unusual individuals, all of us are very good at remembering moments of pain. For the most part, these memories serve us well, helping us to avoid danger and make good judgements. Sometimes, though, remembered pain can blind us to changed circumstances.

Spec#

Spec# is a C# based language from Microsoft Research. It extends the language by adding comprehensive support for Contract Based Programming, with new keywords such as assume, require and expose.

NAnt Naming

I'm a firm believer in making the computer work harder than I do. The Pragmatic Programmers call this Ubiquitous Automation - whatever can be automated, should be automated.

While I love the fancy sound-bite, to me the idea is one of common sense - if something has to be done the same way every time, a computer is going to be much more reliable and predictable than a human.

YAGNI is no excuse to be lazy

There's one thing that really really bugs me about Agile development ... well, ok, there are several things, but today I'm focusing on just one ... and that's the thinking around YAGNI.

In case you're not familiar with the acronym, it stands for You Ain't Gonna Need It.

What makes a Professional Developer?

I've been thinking a lot over the last year or so about the differences between beginner developers and experienced developers - what it means to be a professional developer, and what differences will you see in professionally written code.

A lot of people have talked about the importance of writing maintainable code - with extensive commentary about the importance of coding standards, naming conventions and the like. These things are important - but I think there is something more fundamental to consider.