Wednesday, May 28, 2008

Guys like us avoid monopolies

I just watched Bill Gates say this (look about 2m:30s into the second video stream):

"Guys like us avoid monopolies ... avoid them because we compete."

This comment is bookended by Steve Ballmer, sitting next to Bill, who has just finished explaining the perils of a potential advertising monopoly from Google.

Wow. What can you say to that?

M@

Sunday, May 25, 2008

SOA What?

I was asked recently to talk to some executives about Service Oriented Architecture. In doing some research for the conversation, I found that there was a lot of information about the technical aspects of SOA, but not so much about the business/technology crossover. So I decided to write a white paper: SOA What?

Click here to see it, and let me know what you think. I've also included a brief precis below.

Precis
: Describing technology from a business perspective can be a challenge. It is much easier to talk about or justify technology when it supports an existing business process because it is relatively straightforward to frame the benefits in terms of return on investment, time saved, or dollars spent. It is much more difficult when the technology provides support for other components, guides the way systems are built and integrated, or attempts to insulate pieces of infrastructure or application that face very different rates of change. In many ways, Service Oriented Architecture (SOA) falls into this second, intangible category. This paper attempts to demystify SOA by examining it from a business perspective. It presents some background and an executive definition, and then outlines some misconceptions before exploring the strategic business outcomes presented by SOA. It then looks at some of the headline business impacts, costs, and risks associated with SOA rollout, along with a real world example that highlights how SOA fits into and supports modern business architecture.

M@

Thursday, May 22, 2008

What I read last week 5.1

[1] Better than Free
Free is the new black

[2] A computer scientist who doesn't include 'give up' in his lexicon
Wow

[3] Google App Engine for Developers
If only they had a Grails version

[4] The technology that will save humanity
I wish I had a lazy bar or two to build a solar thermal power station on the farm

[5] Coal saver
Is it coal that it's saving? Or something bigger?

Wednesday, May 21, 2008

Murals and Skyscrapers

I think that everyone knows that the "like building a skyscraper" metaphor is thoroughly wrong for describing the process of building software. However, it doesn't seem to stop it being used again and again (and often clueless project managers are the worst offenders). I have a hunch that attachment to this metaphor might have something to do with why the same project managers have such a love affair with Microsoft Project. But that's another story altogether.

However, today I heard a thoroughly great metaphor for software, one that I haven't heard before, and it really resonated with my experiences building software. I really wish I could claim credit for coming up with this, but sadly, it was a colleague at my current consulting engagement. Tip o' the hat to Andrew. Nice work.

Anyway, the metaphor is a simple one and it goes like this: Software is like a bunch a people painting a mural. You all stand around for a while, maybe pencil out a rough outline, maybe mix some colours and sample how they look on the wall. Then you split up, and some of the team works on one part, and some on others, perhaps individually or in small teams. You come together regularly to assess progress and decide where to go next. There's generally someone in charge, in some form or other (or maybe not), and they might work on their own section, perhaps one of the most challenging bits. Every now and again, you take a step back, and there are some parts that you have to rub out, paint over and redo. It's collaborative and non-linear. Sure, you need an outline and some sort of plan to start, but the way it ends up is very much influenced by the process.

Not only is this a good metaphor for software in general, I think it's an espescially good metaphor for agile software development because it emphasises collaboration and iteration. I will be sure to use it next time I am trying to explain to someone why traditional project management tools are such crap for managing software development.

M@

Tuesday, May 20, 2008

Twitter?

I just hooked up with Twitter. I've heard a lot about it recently, in particular how it is written using Ruby on Rails (I need to confirm if that's true - yep, it is: [1]). It's an interesting idea, in a weird kind of way. I'm not at all sure if I get the process yet (if there is anything really to get about it), but two things stand out for me after about 14 hours of Tweeting, one very interesting and one a little bit left field.

Firstly, I love the fact that from within Twitter I can click a button that miraculously adds my current Twitter state of mind directly into my Blogspot blog. It's not actually the low level technical details of that that impress me (not to devalue them in any way), but what that action represents. What's intriguing is that when I make that connection between my tweets and my blog, I'm actually creating a semantic connection between Twitter and Blogspot. Ok, I know that's kind of stating the bloody obvious, but the point is simply that this connection is basically the Vic 20 of the Semantic Web, and it makes me really wonder what the 8-core MacPro version will look like!

The second thing I've noticed (and this really does have nothing to do with technology) is that Twitter reminds me of a peculiar idiom that pops up every now and again in conversations. Wierdly, this seems to occur most often with Americans. I'm not sure what it is about American sensibilities that makes this the case, but that just seems to be my experience. The idiom I'm referring to is the way some people vocalise their internal monologue. For example, if I am going to sit down on a chair, I simply sit down. I don't generally find the internal decision making process about which chair to sit on and when particularly relevant to anyone else. However, some people really do find it necessary to tell you about it. "I'm just going to sit down over here, Ok?" And like that last sentence, often ask innocent bystanders for approval or confirmation. Unfortunately, I get a little bit of that sense from Twitter.

M@

[1] Apparently, Twitter does use Rails. "By various metrics, Twitter is the biggest Rails site on the net right now," Alex Payne, Twitter Developer.

Monday, May 19, 2008

Wow, I am very impressed with Grails!

For those of you that have not come across the Grails platform, I would seriously encourage you to do so. Particularly if you are a web developer. If you're not a web developer, then hey, it's probably not that interesting for you.

Grails is built on top of the Groovy language, which itself is built on top of the Java platform. It shares some design principles and a philosophical orientation with Ruby on Rails, but it is its own discrete platform (and because it is so closely related to Java, it is nowhere near as intimidating for someone unfamiliar with Ruby).

I won't bore you with repeating the details of either technology, because the best thing to do is go to those links above and check them out for yourself. What I want to do in this post is highlight 2 things that I think really make these technologies compelling:
  1. Model bootstrap time
  2. Web development cycle time
Model Bootstrap Time
Let me begin by stating that before I embarked on my current project (a web-based work-flow and process improvement tool for a niche vertical) I had not programmed seriously (as in "on a development team, responsible for deliverables") for more than 3 years. In that time I had managed an engineering team and worked as a CTO, so I was across the technology landscape, just not in the kind of detailed, on the metal way that you are when you are actually writing code.

When I began to look for a platform to build my project, I checked out a variety of different options. First up was what I already knew, which was basically standard Java and J2EE. I though that through, and along with my business partners, made some estimates for development time. These numbers were pretty big, in fact they were probably too big for our resources and timeframe. This led me to have a look around for some alternatives.

My first port of call was AppFuse. Matt Raible has done a brilliant job integrating the daunting suite of Java tools, libraries and technologies into a coherent whole. With very little mucking around, I was able to have a simple application stub that allowed me to log on, manage users in a database, complete with Hibernate and Tapestry support, all running very sweetly out of Maven2. My issue with this, however, was not how quickly I could get up and running (which to be fair, cannot be much quicker!) but what to do next. Even though AppFuse wraps everything up, you still need to have a very good understanding of the architectures and idioms of the constituent parts to actually do anything of interest. And there is a very large software stack that underpins the prototypical AppFuse web application.

This is when I stumbled across the Grails project, just about the time it was released as Grails 1.0. I read the tutorial and quickly came to the conclusion that it would be simple enough to prototype the domain model for my new system using Grails. Which is what I did. After downloading all of the various Eclipse plug-ins, I was writing Groovy code and building my new system.

All up, I think I spent about 5 days on and off over the space of 1 month (note: this is a side project I'm working on, and not my full-time job) putting together the domain model. During this time, two pretty amazing things happened. Firstly, Grails has the concept of scaffolding. Until you have seen this, it sounds a bit like magic. Through the use of the configuration by convention idiom, Grails scaffolding allows you to get basic CRUD operations across your entire model (more or less) for free. This means that you can define a simple model class like this:

class User implements Serializable {
String username = '';
String password = '';
String email = '';
String mobile = '';
Date created = new Date();

// Relationships
static hasMany = [roles:Role];

// Constraints
static constraints = {
username(unique:true,blank:false);
password(blank:false);
email(blank:false);
mobile(blank:false);
}
}
And then run the application and work with the new domain object, creating, editing, updating and deleting them (assuming you also define the companion Role class referenced). Again, I won't go into the syntactic details, which can be easily discovered in the Grails reference manual. However the standout feature of that code is the complete lack of gumpf associated with the platform. It really does present a crystal clear example of what a POGO (plain old Groovy object) should look like.

What all of this means is that you can build a working domain model incredibly quickly when compared to the traditional Java approach. There is literally nothing else to do other than build the objects and attributes of the things that are in the domain model.

As an aside, I will mention that it took me a little bit of time to get my head around the configuration by convention idiom. When you start out, there is a lot of automagic stuff going on, and it can be a little difficult to let go and just trust the platform. However, once you do, the results are startling.

2. Web development cycle time
The second most extraordinary thing for someone who has not built a web application for the last couple of years was how different the development cycle time is with Grails. With a properly configured environment, the time it takes to make a change to a web page and see that registered in the application is roughly the time it takes you to make the change in the editor and click Refresh in the browser.

The spectacular thing for me was that this also works for (most) code changes. You can add an attribute to a Groovy object and then click refresh in the browser and the change will be apparent immediately. There are 2 exceptions to this. Some changes require the web container to go through a bounce process, but it is generally only marginally slower than a simple text change in .gsp page (GSP: Groovy Server Pages, like JSP pages but for Groovy code). And then there are some code changes that stretch this capability to the limit and will require a restart of the container, but these are rare.

This is an amazing difference when compared to earlier generation web development where you needed to rebuild the war and redeploy it to the container, then re-establish the session to the point you were up to in the test cycle. It could easily take many minutes to test a simple change. With Grails, more often than not, you just continue in the same session with the updated code running. No need to restart. Brilliant.

Conclusion
In combination, the speed with which I was able to prototype and work with a domain model, and the vastly reduced cycle time for the edit/compile/deploy/test cycle mean that I have been able to get started and then be productive more quickly than I could possible have imagined. When I use Grails and Groovy now day-to-day for development, I get the same kind of back-of-the-neck feeling that I got when I first saw Java back in its 0.9beta release in 1995. This is something special.

What's a CTO to do? (part 2)

It has been a while since I posted about some of the disciplines that a CTO in a software start-up needs to consider. For the record, I broke these down into:

1. Strategy
2. Product
3. Architecture
4. Infrastructure
5. Process
6. People
7. Program

Some of these are self-explanatory, whilst others require a bit more depth. As a summary, here's what I think are some of the really important questions in each of these disciplines. When reading this, consider the role of a CTO in a software start-up, I am not so concerned about big enterprise CTO roles, but more of the kinds of innovative, product-oriented businesses that build and deliver software, either shrink wrapped, or as a service over the Internet.

1. Strategy
What is the business strategy? What is the technology strategy? Is the technology strategy succinct enough to capture the attention of partners and investors and satisfy the requirements of technical due diligence? Does the technology strategy align with the business strategy? Who owns the technology strategy?

2. Product
Is there a product mindset? Is there product management mindset? Does technology follow product, or vice versa? Is there an overarching product strategy for the complete suite of products? Is there a product roadmap? Does the roadmap have clean and achievable timeframes for delivery? Are there separate release cycles for core infrastructure and customer-specific projects?

3. Architecture
What is the software architecture? Does it align with the product architecture? Do all members of the technology team understand it? Is the architecture managed? Is there a plan for allowing the architecture to change over time?

4. Infrastructure
What is the state of the engineering infrastructure? Is day-to-day developer productivity appropriate? What is the nature of the configuration management, version control and build environment? Is there room for improvement? Does the engineering infrastructure support the product strategy?

5. Process
How does the team work? What formal and informal processes are in place to assist?

6. People
Are the right people in the right roles? Is there separation between the software infrastructure team and customer-specific project teams? Is there a plan for succession in key roles?

7. Program
Is there a comprehensive program of work designed to deliver the product strategy? Does the program have clear milestones? Is the level of agility appropriate for the nature of the task, the nature of customer-specific projects and the maturity of the organisation?

As I said in a previous post, I consider the customer to be important enough to have its own category over and above these 7 disciplines (perhaps I will add it in as Discipline Zero in a future iteration of this framework). I have found that just having a simple framework like this is a good start, particularly during the discovery phase of a consulting engagement where you are trying to find out how a start-up or software development house operates.

My personal favourite from this list -- and the one where I think Australian software companies really lag behind our North American and European counterparts -- is product. I have come across very few companies that really embrace the idea of product management. In fact, one company I worked for spent a long time disavowing the entire notion of product management, insisting instead that they "had a framework, not a product", leaving no wonder why it took them so long to make their first sale. Alternatively, some companies end up so customer and project focussed, that they never have time to even notice that doing enterprise project work is a completely different exercise to product development, requiring a profoundly different outlook, and different set of skills.

I genuinely believe that things do not have to be like this! So, in an upcoming post, I'll take a stab at a really, really, simple software product management process, and attempt to situate product management as one of the core disciplines that a software start-up CTO should be across.

M@