Deveria haver uma função formal (interna ou externa) atribuída aos ambientes de desenvolvimento para controlar a complexidade desnecessária?

8

Alguns anos atrás, trabalhei para uma pequena empresa que desenvolvia estruturas internas que dedicava seu desenvolvedor mais sênior e seu arquiteto ao desenvolvimento de uma estrutura MVC e ORM personalizados do zero. Essas duas coisas eram ortogonais ao seu produto principal. Infelizmente, o suporte a essa abordagem orientada a estruturas veio do topo e atrasou a entrega de software de geração de receita - e as estruturas produzidas foram notavelmente inferiores às alternativas disponíveis no mercado, que agravaram os atrasos. A empresa consumiu dinheiro rapidamente e, eventualmente, todos foram demitidos.

Um empregador posterior cometeu um erro semelhante - eles obtiveram um desenvolvedor altamente qualificado tecnicamente - um perfeccionista, com uma forte base nos padrões de design da empresa para projetar demais uma solução de consultoria para um de seus clientes, conscientemente sofrendo uma perda, na esperança de que a solução pode ser adaptada e estendida para outros clientes. O projeto ultrapassou significativamente. Mas nenhum outro cliente em potencial mordeu. Um erro estratégico banhado a ouro que custou uma pequena fortuna.

Nos dois casos, houve um grau significativo de superengenharia. Nos dois casos, a empresa e o gerenciamento de projetos eram pessoas com experiência em domínio ou análise, em vez de experiência em programação. Nos dois casos, os arquitetos de software criaram soluções excessivamente complexas para coçar e melhorar seus currículos, com alguma cumplicidade do gerenciamento não técnico. Em ambos os casos, os arquitetos não tinham interesse em manter os custos baixos (além do risco de perder seus empregos se as empresas falissem - o que não era muito arriscado, considerando sua alta empregabilidade).

Minha experiência sugere que não é uma armadilha incomum que as lojas de desenvolvedores caiam.

Existe algum projeto em software para uma função técnica adversa interna ou externa formal - um "Surveyor de Quantidade" - para usar uma analogia de edifício - que possa chamar ou impedir a engenharia excessiva? Quem é o mais adequado para desempenhar esse papel?

user104662
fonte
3
Não sei se você poderia justificar uma posição para alguém que poderia ser substituído por um pedaço de papel com "YAGNI" impresso. ;)
vaughandroid 11/11
2
Em um rascunho, descrevi o papel como um "executor da YAGNI". Infelizmente, o conhecimento do YAGNI não significa que ele será observado, especialmente em ambientes não-ágeis.
user104662
3
"perfeccionista, com uma base forte em padrões de projeto da empresa para grosseiramente sobre-engenheiro" = "grande desenvolvedor"!
Evicatos
1
Parece que talvez um investidor ou acionista significativo com poucas células cerebrais seja um bom candidato para isso. alguém focado em dinheiro, gastando o dinheiro, em quanto tempo vamos receber o dinheiro de volta. não que os investidores não sejam inteligentes, acho que às vezes eles também não se importam, porque geralmente não é o dinheiro deles.
Andyz Smith 11/11
2
Parece que os desenvolvedores mais antigos (e o arquiteto, se você tiver um) supervisionando os projetos devem ser os que estão monitorando esse tipo de coisa. Também parece uma falta de um gerente de projeto real nos dois casos, para motivar (irritar) os desenvolvedores a entregar.
Rig

Respostas:

6

"Controlar a complexidade" é o trabalho de:

  1. O arquiteto, cujo trabalho é garantir que o sistema e a arquitetura corporativa sejam adequados para os projetos / produtos atuais ;

  2. O desenvolvedor, cuja tarefa é criar designs e códigos que não sejam apenas corretos, mas também manteníveis , e também revisar o código de outros desenvolvedores para garantir que eles possam entendê-lo; e

  3. O analista de negócios / sistemas ou proprietário do produto, cuja tarefa é descobrir o que a empresa realmente precisa no momento , o que pode ser concluído mais tarde ou o que pode nunca se materializar.

"Complexidade" é um conceito abstrato de qualquer maneira, e pode-se argumentar que "reduzir a complexidade" é o próprio objetivo do software, portanto, não faz sentido sugerir um papel dedicado a ele - é isso que todo equipe já deveria estar fazendo!

Supondo que uma análise superficial do ROI e do TCO demonstre que a (s) solução (ões) é (s) realmente (s) e (s) são (s) realmente (s) com excesso (s) de engenharia (s), então lamento dizer que os arquitetos, desenvolvedores e analistas que estavam trabalhando nele simplesmente não estavam muito bom em seus trabalhos. E as pessoas encarregadas desse aspecto são os gerentes ou executivos que os contrataram; possivelmente eles cultivaram uma cultura de excesso de engenharia e estão parcialmente em falta, ou possivelmente estão apenas recebendo maus conselhos da equipe de implementação.

Não vou arriscar um palpite sobre qual deles, já que eu (provavelmente) não trabalhei para sua empresa, mas tenho certeza de que você pode descobrir isso facilmente, apenas conversando individualmente com um ou alguns dos referidos gerentes.


Aliás, o desenvolvimento de estruturas internas nem sempre é uma coisa ruim. É que essas estruturas geralmente devem se basear na observação e refinamento do processo atual. Estruturas ou bibliotecas criadas pela refatoração do código existente tendem a durar muito tempo. Por outro lado, se as pessoas simplesmente mergulharem e começarem a desenvolver uma estrutura sem contexto algum, ela geralmente se tornará um passivo e rapidamente.

As pessoas devem ser capazes de reconhecer a diferença entre convenções (a maioria dos projetos em uma organização usará a mesma pilha de tecnologia, com uma certa quantidade de código padrão, mas isso não significa que juntar tudo em uma "estrutura" é uma boa opção. idéia) versus duplicação (as pessoas estão literalmente resolvendo os mesmos problemas comerciais ou técnicos repetidas vezes e as inconsistências levam a projetos complicados e defeitos graves). As empresas de software podem e devem reconhecer o último cenário e tomar medidas ativas para, bem, reduzir a complexidade. Frameworks não reduzir a complexidade, desde que eles não sucumbir ao efeito de plataforma interna .

Aaronaught
fonte
Boa resposta. Gostaria de acrescentar o ponto 4: você precisará de um gerenciamento que permita que as outras funções (1-3) paguem dívidas técnicas. Isso acelerará o desenvolvimento nas versões atuais, pois 1-3 sabem que podem refatorar mais tarde, conforme necessário. Se o gerenciamento sempre usa todos os recursos disponíveis para novos recursos, arquitetos e desenvolvedores são incentivados a inventar estruturas flexíveis que tentam resolver todos os possíveis problemas futuros. Isso é quase impossível e cria os problemas descritos pelo autor original.
Andreas Huppert
1
@AndreasHuppert: Eu certamente concordo que a gerência precisa entender a idéia de refatorar e que as equipes não podem ter 100% de seu tempo comprometido com novos recursos - para equipes bem administradas, esse número deve ser mais ou menos 20% ou mais, o restante é ocupado por planejamento, teste, revisão de código, automação, refatoração, depuração etc., e, é claro, pelas despesas gerais e interrupções usuais. Mas não tenho certeza se concordo que a falta de tempo é o que leva a essas horríveis plataformas internas. Se uma equipe nem sequer tem tempo para refatorar, onde poderia encontrar tempo para isso ?
Aaronaught
1
Porque é possível vender investimentos em uma plataforma / estrutura como investimento com um bom ROI para a gerência. A refatoração tem muito menos glamour e é difícil de vender.
Andreas Huppert
5

Existe algum projeto em software para uma função técnica adversa interna ou externa formal - um "Surveyor de Quantidade" - para usar uma analogia de edifício - que possa chamar ou impedir a engenharia excessiva? Quem é o mais adequado para desempenhar esse papel?

Não, normalmente não existe essa posição.

O truque é contratar pessoas certas para o trabalho. Pessoas que não farão engenharia demais e fazem exatamente o que é necessário.

Isso pode ser feito usando abordagens ágeis (como implementar requisitos em iterações ou usar TDD ou BDD). Mas, novamente, se a arquitetura for super projetada, não ajudará.

BЈовић
fonte