Respondendo às suas perguntas ...
... seria errado recomendar uma arquitetura super simples, mesmo para resolver um problema complexo, para um cliente corporativo?
Absolutamente não.
Na perspectiva do cliente
Como afirmado acima, depende em grande parte do cliente. Também depende da sua capacidade de avaliar com precisão quais soluções são adequadas para o seu cliente. Embora sempre haja um custo percebido para o valor desejado, como consultor, é seu trabalho definir as expectativas apropriadas do cliente. Em alguns casos, você terá que atender a essa percepção. Em outros, será do seu interesse corrigi-los. Afinal, você deve ser o especialista para o seu cliente. E se não estiver, você deve ter o conhecimento necessário para se tornar esse especialista. É para isso que eles pagam.
Da perspectiva do desenvolvedor
A parte mais difícil de escolher qual arquitetura usar é, muitas vezes, estimar corretamente a quantidade de trabalho necessária para utilizar a tecnologia para atender às necessidades específicas. Isso pode levar muito rapidamente a projetos que não atendem às expectativas do cliente. Entenda que alguns projetos são realmente feitos mais rapidamente usando esses trechos de código "complexos" mencionados. Também se entende que alguns não são. Você deve fornecer essa medida, com base no que você ou sua equipe sabem.
É a complexidade que define soluções corporativas ou é a confiabilidade, # usuários simultâneos, facilidade de manutenção ou todas as opções acima?
Embora as especificidades possam variar, em geral, uma solução corporativa é uma solução de software que se aplica a uma ampla audiência combinada. O número de usuários simultâneos pode ou não ser um fator, embora geralmente seja. O número total de usuários, freqüentemente em uma variedade de funções comerciais, é um dos maiores fatores determinantes para determinar se a solução é "corporativa".
Muitas soluções empresariais são altamente complexas, mas algumas são bastante simples. Embora a empresa ofereça um ar de confiabilidade (e certamente deva ser mantido em um determinado padrão), diferentes soluções têm diferentes níveis de confiabilidade.
Facilidade de manutenção é algo que eu acho que todo desenvolvedor (independente ou membro da equipe) se esforça, não é necessariamente tão fácil de conseguir. O importante é que exista um procedimento de manutenção que tenha diretrizes firmes, em vez de ser "fácil". Lembre-se de que diferentes bases de código terão níveis de facilidade substancialmente diferentes, dependendo das filosofias, metodologias, atividade do ambiente (comercial) e complexidade do código.
Reagindo às suas outras declarações ...
Em todos os casos, nunca houve a necessidade de tornar o código trocável ou reutilizável
Muitas vezes, nunca há uma necessidade específica de fazê-lo. Este deve ser seu objetivo, em todos os momentos, no entanto. Considere isto ... Você pode ter um cliente que exija a capacidade de acessar ou exibir seu calendário na página da web. Se você tornar seu próprio código reutilizável, quando outro cliente solicitar a mesma coisa, você já executará parte do trabalho. Se não o fizer, terá que fazer tudo de novo. Todo problema de cliente é geralmente um problema que outro cliente no futuro pode precisar. Em outras palavras, todo cliente com quem você trabalha deve ter o potencial de reduzir o custo do trabalho para seus futuros clientes (não necessariamente o custo do produto).
e os testes nunca foram realmente mantidos após a primeira iteração porque os requisitos foram alterados, pois consumiam muito tempo,
Eu argumentaria aqui que a metodologia de teste não foi suficientemente abstraída. Recentemente, usei um código que fazia seus próprios testes de unidade diretamente dentro de si. Um costume assert
e uma expect
função foram feitos para acomodar as necessidades do projeto. Sempre que fosse necessário um teste de unidade, ele poderia ser aplicado sem mesmo ajustar o código. De fato, o código é distribuído ativamente com as declarações e espera ainda estar lá. Ele fez essas verificações como parte do código de trabalho.
... prazos, pressão comercial, etc etc ....
Muitas vezes, descobri que a pressão extra dos negócios e os prazos que impedem o processo de codificação foram culpa do desenvolvedor, não do cliente. Embora nem sempre seja esse o caso, muitas vezes a pressão nos negócios é causada pela percepção de falha em atender às expectativas do cliente. Quando os prazos impedem o código, geralmente é porque o desenvolvedor falhou ao avaliar com precisão a quantidade de trabalho necessária para o código funcional utilizável. Em outras palavras, programe-os (os clientes esperam) , meça-os (futuros clientes esperam) , execute-os (os usuários exigem) e seja pago por eles (seu contrato deve exigir) .