[an error occurred while processing this directive]
The style used in this essay is deliberately pretentious, almost comic-epic. When I wrote it, I was trying to lampoon the pompous proclamations of software engineering gurus; phrases and mannerisms of speech of pundits and well-known practitioners are used and abused without remorse throughout. In anticipation of misconstruction on the part of sensitive souls, I have written a short account of the gestation of LSD-Meth, which I hope will offend a different set of people and which I would recommend you read first. So… try to take it easy as you read on: this is serious stuff! ;)
This development methodology is applicable to projects in which the following criteria are met:
A project that employs this methodology is driven by the following values:
The following supporting practices must be used:
The aforementioned practices and values constitute a genuine discipline of software engineering (they are all necessary and, together, sufficient) that addresses the most troubling software engineering issues outside the realm of interpersonal communication. This audacious claim warrants some clarification. If you have read (and believed) at least one paper in which the author claims that simplicity and correctness in software are at odds, the notion that both should be cardinal values may seem like madness and the subordination of simplicity to correctness could seem like hypocrisy. While it may be true that it is often impossible to produce a satisfyingly simple implementation of a correct design specification, it is almost always possible to produce a completely correct implementation of a simple design specification; in other words, the best you can think of is seldom immediately attainable, whereas a simple working system with demonstrable value is often immediately attainable.
This has profound implications for a project's survival: a mediocre production system can be redesigned and reimplemented incrementally, and its value increased gradually until it is functionally indistinguishable from the best you could think of, but a correct design is worthless if the system does not attain production. Upon hearing this, many software engineering gurus would claim that evolution into a correct form is not possible because the cost of changes to a system's implementation and architecture increase exponentially with time, especially after the system attains production; I contend that the belief that changes to the production system will be prohibitively expensive leads software architects to overdesign at the earliest possible stage, which in turn soon fulfills the expectation that the production system will have so much architectural inertia as to be immutable.
In order for a gradual evolution of a production system to be feasible, we must resist the temptation to design interfaces that are more complex than is needed to fulfill the current production target's requirements, especially in the name of reusability. Additionally, in order for maximize the value of the deliverable system, we must implement the most valuable features first, and integrate new features as quickly as possible — lest the system be delivered before we do.
Protect your rights in the information age: