Meyer è un eccellente pensatore analitico, e nel libro affetta ed esamina i metodi agili come il medico legale di una serie tv asporta organo dopo organo e, di ciascuno, documenta salute o patologia parlando al registratore portatile.
Il libro non funziona come introduzione ai metodi agili: non dà un quadro generale.
Per chi li pratica da un po', però, è prezioso per ragionare su punti di forza e limiti: Meyer è spietato nelle critiche ma, grazie al cielo, legge con lucidità, passione professionale e onestà i testi che commenta, senza mai scegliere la comoda, e diffusa, strada di crearsi caricature da attaccare. I suoi pareri sono discutibili, intendendolo come complimento: vale discutere con chi argomenta bene.
Se devo scegliere un'idea che porto a casa è l'importanza di comprendere il dominio, il problema e il contesto, non (solo) iterativamente, prima di cominciare a scrivere codice. È una fase spesso trascurata in agile per (giustificata) diffidenza verso un eccesso di progettazione preventiva: “Agile criticism of “Big Upfront Anything” includes some perceptive comments. It is true that one cannot fully comprehend requirements before the development of the system; that requirements will change; that the architecture will have to be improved as implementation proceeds. Those observations express some of the fundamental difficulties of software engineering, and the futility of trying to define everything at the beginning.
There is, however, no argument for shunning the normal engineering practice — the practice, in fact, of any rational endeavor — of studying a problem before attempting to solve it, and of defining the architecture of the solution before embarking on the details”.
In particolare, la distinzione tra requisiti di dominio e requisiti di «macchina» è stata una piccola illuminazione: scoprire in modo iterativo norme bancarie o leggi della fisica è di sicuro, come minimo, una perdita di tempo. L'epic fail dei buoni propositi agili nella ristrutturazione di Gov.uk ha qui le sue radici. Meyer scrive: “In comparing traditional requirements processes with the agile approach, an additional concept to consider is the distinction between domain and machine requirements, emphasized for many years by Pamela Zave and Michael Jackson. The idea is simple:
• Some requirements elements describe properties of a model of a part of the world, or “domain”, in which the system will operate.
• Others describe desired properties of the system, or “machine”, that the project wants to build.
In a banking application, rules on accounts, deposits and overdrafts are domain properties; specifications of how to process payments and other operations are machine properties.
In software for phones, the laws of physics, defining for example limits on signal speed, and the company's call pricing policy, are “domain”; the functions of the system, which must be compatible with these constraints, are “machine”.
Although requirements documents often intertwine the two kinds, it is essential, say Jackson and Zave, to separate them because they are of a different nature: the project defines the machine, but it has no influence on the domain. Commingling them causes confusion and mistakes.
A frequent agilist comment is that “requirements are design”, meaning that it is pointless to pretend that requirements exist as pure customer needs whereas they are in fact decisions on the system to be built.
[…]
It is the responsibility of the project to identify such domain properties as requirements, separate from design decisions. And it should do so early. Missing an important constraint means that when it is finally discovered some of the code developed so far will have to be thrown out. Here we are not talking about incremental development anymore, but about elementary professional competence”.