When a space is not a space

I only found today that Unicode (not just HTML) also has the concept of a non-breaking space character. If you ever find something that looks like ' ' but never quite equalling ' ' then I suggest you look at their char value. 32 is the normal space character, 160 is the non-breaking space one. A few other interesting notes:

  • A non breaking space is not considered white space (in java)
  • A non breaking space is considered white space (in .Net)
  • Space is part of the normal BASIC_LATIN Unicode Block, No Break space is part of LATIN_1_SUPPLEMENT

Evolving An Agile Architecture

Last week I heard that the project I just rolled off was a huge success, both for our UK office (in terms of significant wins and growth), as well as the development team (for the freedom of both process and technology choices). When I started work on the project, I was working with Joe Walnes, and one of the project’s foundation principles was about making technology and process decisions that helped to reduce the build time (and therefore delivery time). I have been on, and heard about, many other projects that end up with several staged builds, leading to the average developer build of around an hour. When I left, we had a sub-minute build (including end to end testing) and a deployable application with a dependency on only Java 5 and Ant (but okay, it’s not a huge system yet).

I’m posting this entry so that somewhere I hope that someone learns something which they apply in optimising their own build (or even sharing their strategies) to make their projects even more agile. What follows is a list of some of the more significant decisions we made, and more importantly, why we made them. Read more “Evolving An Agile Architecture”

Learning a new Language

All the projects I have ever worked on have never been technically difficult (in fact I think that most of them in the world are not). The biggest challenge I find is learning the language that all the people who work daily on the project speak in. To put this in context, after rolling onto my newest project, my biggest problem has been trying to understand what it is exactly that everyone speaks of because, to me, it almost seems like a completely different language. There are certain patterns that I am trying to use to come up to speed quicker. I am sure that there are established learning patterns, but I thought it might be useful to share some of the ones that I use.

Decode the Acronyms – Most languages have an abbreviation for extremely repetitive terms that are important to people in the domain. Decoding acronyms helps with the next pattern of Defining the Vocabulary.

Define the Vocabulary – Think of the ubiquitous language from Eric Evans’ Domain Driven Design and simply put, is used to translate special terms people involved with the domain into something a person who does not know anything about the domain can relate to. Fortunately for me, the Vocabulary on my current assignment has been documented pretty well. I find that repeating them in daily conversations with people who know about the domain (and can correct me) is a useful technique for truly understanding what they mean.

Adopt the Grammar – Common words are especially dangerous on a new project because they are things you assume mean one thing but when put together in a special way or in a different context, can mean something totally different. Adopting the grammar is a lot more readily accomplished once you have learned the vocabulary.

Discover the History – New languages emerge because once they are understood, they can be a more effective communications mechanism for operating in the same context. Discovering the history is about finding out where the vocabulary and terms come from, and why they are used in the way that they are. These factors can come from many sources including technical, political, environment or just conventional.

More Readable Test Names

We put in a JUnit hack into our latest project that allows us to produce more readable test names.

@Override public String getName() {
    return getClass().getSimpleName().replaceAll("Test$", "")
        + super.getName().substring(4).replaceAll("([A-Z])", " $1").toLowerCase();
}

Turning testTellsMeHowMuchInterestIEarnInAYear() from the BankManagerTest into Bank Manager tells me how much interest i earn in a year..

Note the disclaimer: Tests in IntelliJ are no longer clickable afterwards but the stack traces still are