Mutable stateful objects are the new spaghetti code
From the Clojure Rationale.
Brad Clow's blog
In the absence of a generally accepted definition of pair programing, for the purposes of this post I define it as two programers sitting at the same computer engaged in working on the program at hand.
I see pair programming as one form of collaboration. Other common forms of collaboration on a a software project include:
MIT has some readings for their Mathematics for Computer Science course.
Carnegie Mellon University also also posted lecture notes on a wiki.
It seems that I have a different view of what an agile project is, compared to most of the people I talk to about it. Maybe it is because I am involved in business as well being a software developer.
I assume a software project exists as part of meeting some objective. Often it is a business objective, but could also be non-commercial, such as academic. I will call the party (business or academia) that has the objective and that is paying for the project, the customer.
Looking up the dictionary on the Mac I am writing this with, the definition of agile is:
able to move quickly and easily
It seems that there were some issues with voting machines in the US recently. Paul Johnson proposed a reason why.
Too often projects are run predominantly with a short-term business focus. Lip service is paid to quality, but when things get tight, it is not actually that important. However, all that changes once the project is 'finished'. Suddenly the longer-term becomes more important, but by then it is too late.
In a software project, there is generally a relationship between quality 1 (from the developer perspective) and speed of development (from the business perspective). You can sacrifice quality for speed, but as the project becomes bigger or more complex, it becomes harder to change and so development speed decreases. The short-term gain (probably measured in days/weeks) becomes a long-term loss.
At the other end of the spectrum, you can spend most of your time focussed on quality and not worry about speed of development. As previously posted, this is not commercially sustainable either.
IMHO, one of the most interesting things Agile Methodologies bring to a project, is the opportunity to make development cost/speed and quality more transparent throughout the life of the project. In the end though, someone has to make decisions about quality and speed on a day-to-day basis. It seems to me that a business savvy developer will be more likely to succeed than a tech savvy business person. It is a tough line to walk though.
1 Quality means different things to different people. In this case I am referring to both how well code is written and whether it exhibits correct behaviour.
Lockharts Lament is a very interesting and worthwhile read. It is about mathematics, art, society and education. Especially education. A few interesting quotes and ones that made me laugh:
"The only people who understand what is going on are the ones most often blamed and least often heard: the students. They say, “math class is stupid and boring,” and they are right."
"High School Geometry: Instrument of the Devil"
"We’re killing people’s interest in circles for god’s sake!"
"The first thing to understand is that mathematics is an art."
Tim Sweeney of Epic Games spoke at POPL 2006 about development of the successful Unreal 3 game engine. In his slides, he looks at challenges as well as potential solutions such as functional programming, stronger, static type systems and STM. It seems he has now started research on Unreal 4. It will be interesting to see what comes out of his work.
There is also some comments from Tim and his staff on his slides at Lambda The Ultimate.