Michael Nygard.com

About Michael

I've been a professional programmer and architect for over 15 years. In that time, I've delivered systems to the U. S. Government, the military, banking, finance, agriculture, and retail industries. Along the way, I have shared my painfully-won experience by mentoring, writing, and speaking.

My work has spanned domains as diverse as B2B exchanges, retail commerce sites, travel and leisure sites, an information brokerage, and applications for the military and intelligence communities.

My Books

Books In My Library

Release It!

Release It!

Last spring, the Pragmatic Programmers published my new book Release It! Design and Deploy Production-Ready Software. This book comes from my extensive experience living with systems in production. I've often been the one to get woken up at three in the morning when some supposedly 24x7 system goes down.

Other books on design and architecture only tell you how to meet functional requirements. They help your software pass QA. In "Release It!", I'll show you how to make your software production ready. If you don't want to wear an electronic leash, you need this book.

Reviews

Now that Release It has been out for a few months, there are some reviews out there on the web. Here are some selected reviews:

Steve Vinoski says Release It! Is Truly Excellent.

Ted Neward calls Release It a book every developer must read.

Java Ranch gives it a perfect 10.

The venerable German magazine "c't" reviewed it over the summer. The review is paid content, but I'm told it was favorable.

Code

A number of readers have asked me for reference implementations of the stability and capacity patterns.

I've begun to create some free implementations to go along with Release It. As of today, it just includes a drop-in formatter that you can use in place of the java.util.logging default (which is horrible).

This formatter keeps all the fields lined up in columns, including truncating the logger name and method name if necessary. A columnar format is much easier for the human eye to scan. We all have great pattern-matching machinery in our heads. I can't for the life of me understand why so many vendors work so hard to defeat it. The one thing that doesn't get stuffed into a column is a stack trace. It's good for a stack trace to interrupt the flow of the log file... that's something that you really want to pop out when scanning the file.

It only takes a minute to plug in the SingleLineFormatter. Your admins will thank you for it.

Read about the library.

Download it as .zip or .tgz.

Articles

Agile, Architecture and the 5am Production Problem

This problem vexed me for several days. In this article, I ask whether we need to find new practices, consistent with agile values, that would let us prevent this type of problem. While the problem itself didn't arise from using agile methods---in fact, it was a distinctly non-agile project---I do wonder whether we can find an agile, pragmatic approach to architecture that would let us avoid this type of headache without incurring BAUF (Big Architecture Up Front).

Master Merlin's New I/O Classes

An introduction to the NIO classes added to Java 1.4 (which was code-named "Merlin"). A fun piece to write and an early source of information about this important package.

The "selector" architecture of asynchronous I/O in NIO was based on earlier UNIX constructs that I had used to multiplex keyboard, network, and inter-process communication in a single-threaded console application. This article let me dust off some of those old memories, while also appreciating how far we've come... that stuff was hard to do in straight UNIX/C programming!

The code in this article was written against the beta release of NIO. About three days after this article hit the front page, Sun released the GA version and broke all the sample code.

Test Infect Your Enterprise JavaBeans

This article presents a technique for what we now call in-container testing of EJBs, using a servlet to trigger the execution of unit tests.

This approach to unit testing worked for a time. Since J2EE 1.2, however, the separation of contexts between the container and the individual applications makes the specific configuration in the article ineffective.

Furthermore, I now believe that in-container testing is not a good approach. First, it requires too much startup and shutdown time, which makes you likely to run the tests less often. Second, it encourages context-dependence in both the unit tests and in the objects being tested.

From TheFeature.com

Mobile Devices Are Mobile Code
Interaction, Usability, and the Dancing Elephant
Credibility in Cooltown
Data Swarms
Who Owns the Digital You?

From WirelessDevNet.com

Are We There Yet?
The Winter of Their Content
Digital Divergence
Java 2 Micro Edition