Werner Vogels on Amazon Cloud

The next web linked to a really interesting presentation by Amazon’s CTO today: Amazon’s CTO: “Amazon is a technology company. We just happen to do retail”.

Lots of interesting information here:

  • Scrum & Agile – small teams, fast innovation, all teams are customer focussed. How to scale.
  • Architecture – what’s important when architecting large scale applications. Ideas behind doing SOA
  • Cloud – impact of cloud on enterprise software development
  • Business – lots of companies are transforming into IT companies, even if they don’t see this yet. This causes problems because they should put the best possible people on their most important assets: software
  • Operations – No separate operations department. You build it, you run it.

Werner Vogels: Amazon and the Lean Cloud from HackFwd on Vimeo.

The impact of technology on Business Models

As architects we are mostly working on translating business models and goals to IT strategies, plans and designs. We accept the business model as it is, and work from there.

Business models however, are not immune to IT changes. This blogpost, Amazon and the reintermediation of the spectacle, is a nice illustration of the fact that business models are impacted by software.

This means that architects should understand technological progress, be able to determine what the impact will be on business models, and be able to help organisations understand how IT impacts their business model.

I personally really like this part of working in IT, understanding new technology and thinking about it will impact businesses and customers.

Product Development Example

My post Nice example of product development as a learning process is getting a surprising amount of hits from people looking for product development example in google. I’m curious to know what exactly it is that you are all looking for?

Product Development is an interesting subject. Many people I talk to think that they need to aim for doing it right the first time, minimising rework. Minimizing rework is a apparently a huge problem.

There’s a lot of information however that this isn’t the right approach to product development. Trail and error through prototyping not only increases innovation and creativity, it is also faster and increases quality. Another important aspect of product development is the fact that involving users, or better yet, being a user, improves the quality of the product developed.

Scrum – It all starts with the Product Owner

In my experience the Product Owner is the most underestimated role in Scrum. I think it’s also the root cause of many problematic Scrum implementations.

Every Scrum implementation should start with the Product Owner. You should be very clear about the responsibility of the Product Owner:

  • The product owner is responsible for the success of the product.
  • The product owner is responsible for the long term vision of a product.
  • The product owner is responsible for the release planning.
  • The product owner is responsible for enabling a scrum team to implement the product.

This means that a product owner is much more than a user story writer. Most Product Owners I’ve met so far are requirements analysts with a new title. They are not empowered to sort the backlog, they are not empowered to learn from feedback and improve user stories.

If you are about to start with Scrum, start with the product owner. This will be hard enough, as many companies do not have a role or person responsible for the success of their products.

Using the Backbone router

Derick Bailey has some good advice regarding the backbone router: Stop Using Backbone As If It Were A Stateless Web Server.

A javascript application using backbone is stateful, and implementing MVC doesn’t mean that all actions have to be handled by the router. Only use the router when you want to expose a url in your browser history, something the user can bookmark or email.

I think it’s useful to look at it from a REST perspective: a url is an id or address of a resource. Use the backbone router to create urls to things that are resources, not to actions on resources.

When will we dump server side web frameworks?

Single page web applications have been around for a while. Applications that run all user interface code in the browser using Javascript to update the user interface. The application server only exists to provide access to data and business logic.

However, most Java Enterprise web applications i encounter still use serverside web technology like jsf, seam, wicket or similar. It’s not like these frameworks are perfect. Heavy weight on memory usage, problems with history and back buttons, complex lifecycle to maintain state, complex model split over multiple tiers.

Why are most enterprise web applications still using server side webframeworks? Some years ago I wrote a single page web application, mostly using JQuery (Here’s a presentation I did for nljug in 2008 about this project: Client-Server 2.0 using JQuery and Grails).

Today, the javascript frameworks to support single page webapps have matured a lot: we have MVC frameworks like backbone.js, UI component frameworks, javascript templating, QA tools like jslint and google closure linter, unit testing frameworks like qunit and jsunit, and documentation tools like jsdoc and docco.

So a full set of frameworks and tools to create single page webapplications exists. What is keeping us from using these for enterprise web applications?

On these Windows Explorer usage statistics

Microsoft posted some windows explorer statistics. Lots of detail about how people are using explorer.

Based on these statistics they are making conclusions what users find important, and what should thus be improved in windows explorer.

But do these numbers really show what people find important? As far as I’m concerned these numbers just show what people find usable in the current version of windows explorer, not what they would like to use it for.

I change my habits based on the qualities of the tooling I use. For example, the kind of drawings i made with Adobe Illustrator are different from the ones I make with Inkscape or with iDraw on the iPad. I don’t want to fight a tool, forcing it to do something it doesn’t really support very easily. I just figure out what the tool is best used for, and change my usage accordingly. Inkscape doesn’t easily support customised brushes, so i don’t use them. But in Illustrator i used them a lot.

Usage statistics don’t tell the whole story.

The iPad is a better laptop

For some things at least. Yesterday evening i was doing some coding on my laptop. When i finished, i put my laptop away, and grabbed the ipad to do some internet reading. I actually put the laptop away to use my ipad. Why? The ipad is just a limited laptop. I can open a browser on a laptop. Still, for reading on a couch the iPad is a much better device. No useless keyboard in the way.

Luke Wroblewski posted some interesting statistics yesterday about the post-pc era. The one that surprised me most: Sales of Apple’s iPad pulled in 30% more than all of Dell’s consumer PC business in just the first half of the year. Seems like many people agree that tablets are better than laptops.

The power of trial and error

A while ago i mentioned the following quote from Donald Reinertsen’s Managing the design factory: The try-it-fix-it approach is faster and higher quality.

Here’s another interesting statement regarding trial and error: delighting customers can only be approached by trial and error. It’s a quote from Myth #8: Apple Just Builds A Better Mousetrap.

Trial and error leads to better quality, higher productivity and improved customer satisfaction. Why are so many people still convinced that we should have much longer preparation, bigger design documents, longer analyses, before implementing a process, or creating a product prototype?

Here’s another interesting statement regarding the power of prototypes: A big part of that is prototyping. Whereas other companies might make six or seven prototypes while developing a new product, Apple will make hundreds, Kahney said. “They discover these products through prototypes, and that’s what makes it so creative.” (Steve Jobs’s most ambitious product: Apple Inc.).

So, in addition to the benefits mentioned above, trail and error also increases creativity.

Trail and error increases quality, productivity, customer satisfaction and creativity. Sounds like a silver bullet.

Who needs a database when you have R?

This is really nice; using the following two statements you can read a comma separated file into a variable and run a sql query over the data:

stats <- read.table("stats.log",header=FALSE,sep=";"
    ,col.names=c("id","ip","timestamp","url","time"))
callsPerUrl <- sqldf(
  "select distinct(url), count(ip) from stats group by url")

No need to create a database, just a simple script that you can start on the commandline using R.

Recently i needed to calculate some statistics on log files created during a performance test. The logfiles are too big for MS-Excel, one option was to load them into MS-access, or some other database.

However, a co-worker told be about R. I thought this might be a good opportunity to try it. If you know a bit about sql it’s pretty easy to get started.

Here’s an example log file i’m going to process:

"1";"192.168.1.1";2011-08-12 11:47:25;"/search";2.997
"2";"192.168.1.2";2011-08-12 11:47:29;"/book/ISBN/1234";4.6
"3";"192.168.1.1";2011-08-12 11:47:31;"/searchresults";1.383
"4";"192.168.1.2";2011-08-12 11:47:46;"/searchresults";10.536

You can read this log file into an R data-table using the following statement:

library(data.table)
statsTable <- data.table(read.table("stats.log",
    header=FALSE,sep=";",
    col.names=c("id","ip","timestamp","url","time")))
setkey(statsTable,url,ip)
statsTable

If you run this using R you get the following result:

     id          ip           timestamp             url   time
[1,]  2 192.168.1.2 2011-08-12 11:47:29 /book/ISBN/1234  4.600
[2,]  1 192.168.1.1 2011-08-12 11:47:25         /search  2.997
[3,]  3 192.168.1.1 2011-08-12 11:47:31  /searchresults  1.383
[4,]  4 192.168.1.2 2011-08-12 11:47:46  /searchresults 10.536

The following statements calculates the average time it takes to serve an url:

avgPerUrl <- statsTable[,list(avg=round(mean(time),2)),by=url]
avgPerUrl

The result:

                 url  avg
[1,] /book/ISBN/1234 4.60
[2,]         /search 3.00
[3,]  /searchresults 5.96

Now, the best part for those of us who are more familiar with sql. Just use SQL:

library(sqldf)
callsPerUrl <- sqldf(
    "select distinct(url), count(ip) from statsTable group by url")
callsPerUrl

The result:

              url count(ip)
1 /book/ISBN/1234         1
2         /search         1
3  /searchresults         2

Nice. One statement to load a file into a data table, and another statement to query the data. No need to start an RDBMS server, create tables, import data, just a simple script. And it gets better from here: simple statements to plot graphs, and lots of libraries to do complex analysis…