Nel famoso saggio di Richard Gabriel, The Rise of Worse is Better , contrappone versioni caricate delle filosofie di design del MIT / Stanford (Lisp) e del New Jersey (C / Unix) lungo gli assi della semplicità, correttezza, coerenza e completezza. Fornisce l'esempio del "problema di perdita del PC" ( discusso altrove da Josh Haberman ) per sostenere che Unix privilegia la semplicità dell'implementazione piuttosto che la semplicità dell'interfaccia.
Un altro esempio che ho trovato sono i diversi approcci ai numeri. Lisp può rappresentare numeri arbitrariamente grandi (fino alla dimensione della memoria), mentre C limita i numeri a un numero fisso di bit (in genere 32-64). Penso che questo illustri l'asse di correttezza.
Quali sono alcuni esempi di coerenza e completezza? Ecco tutte le descrizioni di Gabriel (che ammette siano caricature):
L'approccio MIT / Stanford
- Semplicità: il design deve essere semplice, sia nell'implementazione che nell'interfaccia. È più importante che l'interfaccia sia semplice rispetto all'implementazione.
- Correttezza: il design deve essere corretto in tutti gli aspetti osservabili. L'errata correttezza non è semplicemente consentita.
- Coerenza: il design non deve essere incoerente. Un design può essere leggermente meno semplice e meno completo per evitare incoerenze. La coerenza è importante quanto la correttezza.
- Completezza: il progetto deve coprire tutte le situazioni importanti che è pratico. Tutti i casi ragionevolmente previsti devono essere coperti. La semplicità non può ridurre eccessivamente la completezza.
L'approccio del New Jersey
- Semplicità: il design deve essere semplice, sia nella realizzazione che nell'interfaccia. È più importante che l'implementazione sia semplice dell'interfaccia. La semplicità è la considerazione più importante in un design.
- Correttezza: il design deve essere corretto in tutti gli aspetti osservabili. È leggermente meglio essere semplici che corretti.
- Coerenza: il design non deve essere eccessivamente incoerente. La coerenza può essere sacrificata per semplicità in alcuni casi, ma è meglio abbandonare quelle parti del progetto che affrontano circostanze meno comuni piuttosto che introdurre complessità implementativa o incoerenza.
- Completezza: il progetto deve coprire tutte le situazioni importanti che è pratico. Tutti i casi ragionevolmente previsti dovrebbero essere coperti. La completezza può essere sacrificata a favore di qualsiasi altra qualità. In effetti, la completezza deve essere sacrificata ogni volta che viene compromessa la semplicità di implementazione. La coerenza può essere sacrificata per ottenere completezza se viene mantenuta la semplicità; particolarmente inutile è la coerenza dell'interfaccia.
Nota: non sto chiedendo se Gabriel abbia ragione (che non è una domanda appropriata per StackExchange) ma per esempi di ciò a cui si sarebbe potuto riferire.