Write the Test First

The TDD Zealot

On December 22, 2010 Mark Seemann published a blog post The TDD Apostate. Since then several friends and associates have sent me links to his post as if to say, “See, TDD is not all it is cracked up to be.” It is an excellent post and I agree with much of what the author …

Read More
Rants

Under-Design and Over-Design

One of the biggest challenges I’ve had in my career as a developer was over-design. I used to just dive in and code on projects but soon afterwords I would end up stuck. To compensate I would spend a lot of time in the design phase only to discover later that most of my concerns …

Read More
Bits and Pieces

Aggregation verses Composition

When teaching software design skills I often get asked what the difference is between aggregation and composition. My answer: parking lots. Parking lots aggregate cars. A parking is still a parking lot even if there are no cars on it. It is a zero-to-many relationship and what is being aggregated is optional. A car is …

Read More
Rants

First Seek to Understand

Sometimes I like to start a project by doing a few hours of design and then spend the rest of an iteration building a proof of concept. Oftentimes I can get a tremendous amount of functionality roughed out in a system very quickly and then spend the next several iterations making it supportable and maintainable. …

Read More
Build in Small Batches

Why Short Iterations Work

Software developers are infamous for not being good estimators. They say programmers have three timelines they work with: “done”, “not started” and “nearly finished”. It is easy to get caught up in the implementation details and not know exactly how long it will take to wrap up the task. Time boxing can be very helpful …

Read More
Rants

Don’t Forget to Wash Your Hands

Although his life came to a tragic end I have a great admiration for Ignaz Semmelweis. You’ve probably never heard of him but most of us owe our lives to him. He was the Australian physician who helped popularize sterilization practices that surgeons use today. I can’t even imagine how he must have been ridiculed …

Read More
Rants

Agile Prototyping on a Napkin

As an agile developer I still prototype but I tend to do it differently than in the past. I now make a distinction between a prototype and a proof-of-concept. A proof-of-concept is code that verifies an approach to solving a problem. I use a proof-of-concept as a sanity check to make sure I am taking …

Read More
Rants

Prototyping Caveat

I am a big believer in prototyping. The quicker I can get functionality to my users the better. I often find that it helps my users visualize how to use the system I am building and often this will lead to useful feedback. However, I do have a caveat when building prototypes for customers—make sure …

Read More
Rants

A Prototype is Not a Product

Sometimes I hear developers say that they are scared to build prototypes because their manager will make them ship it as a product. There is a big difference between a prototype and a product. A home builder wouldn’t mock up a house out of cardboard and then try to sell it so people could move …

Read More
Announcements

To Be Agile (Techniques of Design) now offers Certified Scrum Developer training!

We are proud to announce that Techniques of Design has become a Registered Education Provider (REP) for the Scrum Alliance and now offers training for Certified Scrum Developers: Our three-day Scrum Software Development Essentials course, combining lectures and hands-on coding exercises, fulfills the technical-training requirement for the Certified Scrum Developer track. Our Design Pattern Development …

Read More
Rants

Do You Believe in Coding Standards?

I am told that some developers don’t like coding standards imposed on them. I do not have that experience. In working with thousands of developers I notice that they prefer following standards as long as it supports them in doing a good job. We all hate busy work or pointless activities. If your coding standard …

Read More
Rants

Compromises on Quality

Far too often I hear managers say, “Just get it out the door.” I understand the perspective. We work in a world of constraints and the business needs to survive. Management often says this but really mean “I look to my developers to tell me what critical things must be there in order for the …

Read More
Rants

Who is Our Customer?

Have you ever stay up until three in the morning trying to track down a bug? Maybe it was code that you were charged with maintaining or maybe it’s something you just wrote. Remember how it felt trying to figure out what the author was doing? Who is our customer? You may think it is …

Read More
Create CLEAN Code

What is Quality?

How do you define quality? Ford says that quality is job one but what is it and how do we create quality? We all recognize quality service at a fine restaurant and a quality product like a fine piece of furniture but what is quality in software? I ask this question a lot to developers …

Read More
Rants

Is it a Good Design?

When I show students in my classes a particularly bad design and ask them to evaluate it, they feel uneasy but very few have language to describe what is bad (or good) about a design. Without a common language that distinguishes good code from bad code we have little power. Reviewing a design is like …

Read More
Refactor Legacy Code

Retrofitting Tests

Retrofitting tests into legacy code is difficult process but can give us the ability to redesign and improve the quality of that software as we go. It is generally a good idea to add tests before refactoring code. Tests serve as a safety net so if I make a mistake in refactoring the test will …

Read More
Specify Behaviors with Tests

Test Driven Documentation

Part of allowing change to happen during development is by building software with engineering practices that support change. The most important of these practices is correctly using unit tests. Tests represent a way to both embody understanding of the system and prove that the system works. Unit tests are really a form of specifications because …

Read More
Rants

Resistance to Change

The biggest impediment to change is a cultural one. Change means things are going to be different and human beings resist this at some level. Change requires being able to adapt and this can be difficult so as a result we tend to resist it. I often run an interesting experiment in some of my …

Read More
Rants

We Can’t Keep Starting Over

Back 25 years ago the way we started to write a new version of a successful product was that we deleted the previous version and started with a clean slate. Virtually all the code we wrote was thrown away and many new versions were started from scratch. But we can’t do that today. The systems …

Read More
Rants

The Limiting Factor

I’ve been a software developer for over a quarter of a century and I’ve seen software development change quite a lot in that time. When I started out writing code the main concern that I had was to make my software work. It was challenging to make software do what we wanted back then because …

Read More
Rants

Dolphins and Developers

In feedback learning timing is everything. I’ve had the good fortune of working with dolphins in research projects a few times in my life. When we train dolphins to learn a new behavior we use a “bridge”, which is a high pitched whistle that we sound at the moment they do the behavior we want. …

Read More
Rants

Software is Too Forgiving

I have a friend who is a hardware engineer. He says he hates software because it is too forgiving. When he designs electronics he has to follow strict engineering practices. One little mistake will likely make his whole design fail and cost his company over a $250,000 to “re-fab” the chip. He has to be …

Read More