No famoso ensaio de Richard Gabriel, The Rise of Worse is Better , ele contrasta versões caricaturadas das filosofias de design do MIT / Stanford (Lisp) e Nova Jersey (C / Unix) ao longo dos eixos da simplicidade, correção, consistência e perfeição. Ele dá o exemplo do "problema de perdedor de PC" ( discutido em outro lugar por Josh Haberman ) para argumentar que o Unix prioriza a simplicidade de implementação em detrimento da simplicidade de interface.
Outro exemplo que inventei são as diferentes abordagens dos números. O Lisp pode representar números arbitrariamente grandes (até o tamanho da memória), enquanto C limita os números a um número fixo de bits (geralmente 32 a 64). Eu acho que isso ilustra o eixo de correção.
Quais são alguns exemplos de consistência e integridade? Aqui estão todas as descrições de Gabriel (que ele admite serem caricaturas):
A abordagem do MIT / Stanford
- Simplicidade - o design deve ser simples, tanto na implementação quanto na interface. É mais importante que a interface seja simples que a implementação.
- Correção - o projeto deve estar correto em todos os aspectos observáveis. Incorretividade simplesmente não é permitida.
- Consistência - o design não deve ser inconsistente. É permitido que um design seja um pouco menos simples e menos completo para evitar inconsistências. A consistência é tão importante quanto a correção.
- Completude - o design deve abranger o maior número possível de situações importantes. Todos os casos razoavelmente esperados devem ser cobertos. A simplicidade não pode reduzir excessivamente a integridade.
A abordagem de Nova Jersey
- Simplicidade - o design deve ser simples, tanto na implementação quanto na interface. É mais importante que a implementação seja simples que a interface. Simplicidade é a consideração mais importante em um design.
- Correção - o projeto deve estar correto em todos os aspectos observáveis. É um pouco melhor ser simples do que correto.
- Consistência - o design não deve ser excessivamente inconsistente. A consistência pode ser sacrificada pela simplicidade em alguns casos, mas é melhor descartar as partes do design que lidam com circunstâncias menos comuns do que introduzir complexidade ou inconsistência na implementação.
- Completude - o design deve abranger o maior número possível de situações importantes. Todos os casos razoavelmente esperados devem ser cobertos. A integridade pode ser sacrificada em favor de qualquer outra qualidade. De fato, a integridade deve ser sacrificada sempre que a simplicidade da implementação é comprometida. A consistência pode ser sacrificada para alcançar a integridade se a simplicidade for mantida; especialmente inútil é a consistência da interface.
Observe que não estou perguntando se Gabriel está certo (que é uma pergunta não apropriada para o StackExchange), mas para exemplos do que ele pode estar se referindo.