Michael C. Feathers's Blog

September 7, 2016

The debate between proponents of static and dynamic typing never seems to die down, but it has matured. Most people I encounter seem to be ready to accede that people can do good work in a dynamically typed language. On the other side, it’s becoming more and more apparent that as type systems grow, the number of error classes we can eradicate grows as well. The fact that more people have experience with both static and dynamic languages today has certainly helped. I think we can thank JavaScr...

 •  0 comments  •  flag
Twitter icon
Published on September 07, 2016 12:16 • 11 views

August 8, 2016

I think that the most confusing thing about testing is the word testing. We use it for many things, from exploratory testing and manual testing to unit testing and other forms of automation. The core issue is that we need to know that our code works, and we’ve lumped together a variety of practices and put them under this banner. We can look for some common strands between them but they are hard to find.

Most types of testing have the quality of being about correctness. We test our code to se...

 •  0 comments  •  flag
Twitter icon
Published on August 08, 2016 06:13 • 20 views

February 3, 2016

Silvrback blog image

Economics is a great frame for understanding problems, but it can cloud many issues as well. The software development community has fought for years against the idea that IT should be viewed as a cost center. We’d like to see it as a value creating investment. Yet, as much as we’d like to see it that way, we speak about code as a liability. Experienced developers know that if we can deliver value with less code, we’re better off.

Much of the discussion around Technical Debt has this same iss...

 •  0 comments  •  flag
Twitter icon
Published on February 03, 2016 06:52 • 58 views

December 9, 2015

According to wikipedia, after Dijkstra’s letter Go To Statement Considered Harmful there were at least 65 papers published with titles like ‘X Considered Harmful’, most of them generating heat but little light. I’m using the convention ironically because, well, this is just a nit. It shouldn't be controversial all. :-)

Variable capture is the use of an externally defined variable inside of a closure or block. It's something you'll see in most code that uses closures, and often it&...

 •  0 comments  •  flag
Twitter icon
Published on December 09, 2015 06:55 • 30 views

September 21, 2015

Design is deep topic. One could say it’s the deepest. It’s about making decisions that affect choices in the world. When you design a chair, what you’ve really done is make a set of choices about how people using it will sit and what their experience will be like. People sitting on chairs have choices too. They can defy your expectations by turning the chair on its side and sitting on it that way. That makes them designers as well. Design is wonderful interactive game.

Below this game, there...

 •  0 comments  •  flag
Twitter icon
Published on September 21, 2015 06:20 • 43 views

July 1, 2015

I’m going to the Agile 2015 conference this year. It’ll be the first time I’ve been to that conference in about five years. Agile has been around for over 15 years now and at a certain point you feel like you’ve seen the important developments. In truth, I felt that way years ago but I kept going to agile conferences primarily to catch up with friends and colleagues and offer advice to people new to agility.

If I have to put my finger on it, though, I think that the main reason that I stopped...

 •  0 comments  •  flag
Twitter icon
Published on July 01, 2015 07:23 • 39 views

I’m going to the Agile 2015 conference this year. It’ll be the first time I’ve been to that conference in about five years. Agile has been around for over 15 years now and at a certain point you feel like you’ve seen the important developments. In truth, I felt that way about 10 years ago but I kept going to agile conferences primarily to catch up with friends and colleagues and offer advice to people new to Agile.

If I have to put my finger on it, though, the main reason that I stopped going...

 •  0 comments  •  flag
Twitter icon
Published on July 01, 2015 07:23 • 61 views

April 27, 2015

What do Ruby’s Enumerable module, .NET LINQ, and the new Java Stream package have in common? They are all there to facilitate functional programming. Here’s an example, pulled from Java 8’s docs because its support is the most recent.

int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum();

Chances are, you’ve been seeing a lot of this sort of code recently. I’m sure you’ll see more of it.

To me, its a very attractive style. It nearly eliminate...

 •  0 comments  •  flag
Twitter icon
Published on April 27, 2015 18:35 • 61 views

February 16, 2015

If you read my last blog you know that I’ve been pushing the idea of chained computation rather far. It’s been fun to just try to use it for all of my utility programming to see where it breaks down. When you build a program as a single expression in a single sequential flow, one of the things that you have to deal with is making sure that you have all of the information you need at each stage of the pipeline. If you don’t organize your design well, you’ll be passing along extra arguments tha...

 •  0 comments  •  flag
Twitter icon
Published on February 16, 2015 14:59 • 87 views

January 8, 2015

When you find a more powerful tool, it’s hard to avoid using it. We like to think of this as the ‘if all you have is a hammer, everything looks like a nail’ syndrome, but the fact of the matter is - I have plenty of tools. It’s just that some are more powerful and it's hard not to use them.



Last night, I was playing noise music at an art space with a friend, and I met a couple of other guys who were doing interesting work. One of them had done a bit of programming and was excited about the...

 •  0 comments  •  flag
Twitter icon
Published on January 08, 2015 15:52 • 67 views