Ponto de complexidade sem retorno. Como você chama isso?

13

Como desenvolvedor de software, uma das minhas principais tarefas é manter a complexidade sob controle.

No entanto, em alguns projetos, há um momento em que o nível de complexidade cresce tão alto que atinge algum tipo de ponto "sem retorno". Após esse momento, você nunca poderá retornar o projeto a um nível aceitável de complexidade em menos tempo do que seria necessário reescrever tudo do zero.

Esse momento em particular tem um nome no dialeto dos programadores (algo semelhante à lei de Godwin para trolls)?

--editar--

Desculpe se não estou claro. Não acho que esse "momento" tenha um nome oficial ou seja uma métrica séria. Eu estava pensando em algo no espírito do "pico Ballmer" no xkcd .

Thibault J
fonte
1
Vejo uma controvérsia na sua definição do ponto em questão: ... em menos tempo, você precisaria reescrever tudo do zero , o que implica que aqueles que vão reescrever o projeto são bons o suficiente, ou pelo menos melhores do que aqueles que criou a bagunça em primeiro lugar;)
mojuba 5/05
1
Acho que um dos motivos pelos quais não existe um nome definido é que depende de quem está olhando o código. O que parece irremediavelmente complexo ou insustentável para um desenvolvedor pode parecer bastante razoável para outro. Em casos graves, eu apenas compilei uma DLL com o prefixo "ms" e digo que veio da Microsoft.
21711 Kevin Hsu
1
Talvez isso faria: Horizonte técnico do evento da dívida
PeterAllenWebb 19/11/11

Respostas:

20

É mais uma questão de manutenção do que de complexidade.

O fenômeno é chamado de "dívida técnica" e, quando atinge um nível crítico, o projeto está a caminho da falência.

É isso que você quis dizer?


fonte
Obrigado pela sua resposta. Estou ciente do conceito de "departamento técnico". Todo projeto tem algum tipo de dívida técnica. O que quero dizer é: como você chama o momento em que essa dívida se torna tão alta que você prefere jogar o projeto no lixo e começar de novo?
Thibault J
3
Eu gosto do seu termo "falência técnica". Isso sugere que, assim como em uma falência real, você deve examinar cuidadosamente quais partes são recuperáveis ​​e quais devem ser deixadas para trás. E talvez alguns reestruturação da dívida é tudo o que é realmente necessário :)
Jaap
2
@ Thibault J: Não acredito que exista um termo específico para esse momento. É mais uma questão de perceber se você ainda está feliz antes desse tempo ou, infelizmente, passou além dele.
1
@ Developer Art: ... percebendo se você ainda está feliz antes desse tempo ou infelizmente passou além dele - acho que essa é a chave para dar uma boa definição do ponto: um projeto que foi além do ponto é aquele que nenhum engenheiro faria. assumir voluntariamente.
Mojuba
3
Eu vou para o termo "falência técnica", eu gosto. E eu também vou usar sua definição.
Thibault J
16

O "ponto de excesso de complexidade" é referido em inglês como:

OH MEU DEUS O QUE É ESSE CRAP.

O problema é que isso pode se aplicar a algo realmente simples, mas é implementado de maneira tão horrível que você tem a mesma reação.

Então, separar algo muito complexo de algo muito horrível pode ser difícil.

NO ENTANTO: O que realmente tende a acontecer com todos os softwares é um processo assim:

Etapa 1: tenha uma boa especificação, faça um bom design, implemente coisas legais. Todo mundo feliz.

No final da etapa 1: os desenvolvedores se parabenizam pela maravilhosa elegância de seu design e vão embora pensando felizes "Eu tenho um legado maravilhoso aqui para que outros possam adicionar coisas no futuro, será maravilhoso e o mundo será um melhor lugar."

Etapa 2: Algumas alterações são feitas, as coisas são adicionadas, novas funções estão incluídas. A arquitetura e a estrutura da Etapa 1 tornaram esse processo bastante indolor. [Opa, o "fator cruft" aumentou um pouco.]

No final da etapa 2: os desenvolvedores se parabenizam pela maravilhosa elegância de seu design e vão embora pensando felizes "Nossa, sou tão esperto por ter feito todas essas concessões na Etapa 1. Isso foi tão bom. Tenho um legado maravilhoso aqui para que outros possam adicionar coisas no futuro, será maravilhoso e o mundo será um lugar melhor ".

Etapa 3: Mais alterações são feitas, mais coisas são adicionadas, mais novas funções, várias coisas são alteradas, o feedback do usuário está realmente sendo ouvido.

No final da etapa 3: os desenvolvedores se parabenizam pela maravilhosa elegância de seu design e se afastam com um pensamento bastante feliz "Nossa essa arquitetura é muito boa para permitir que tantas mudanças se encaixem facilmente. Mas estou um pouco infeliz sobre X e Y e Z. Eles podem ser limpos um pouco agora. Mas !!! Ahhh! Eu sou tão esperto por ter feito todos aqueles subsídios na Etapa 1. Isso foi tão bom. Tenho um legado maravilhoso aqui para outros para adicionar coisas no futuro, será maravilhoso e o mundo será um lugar melhor ".

Etapa 4: assim como a etapa 3. Exceto:

No final da etapa 4: os desenvolvedores pensam: "Esse material que é tão bom está deixando o FEIO manter. Ele realmente precisa de algumas mudanças sérias. Não estou gostando muito de trabalhar nisso. Precisa de refatoração. Gostaria de saber o que o chefe dirá que quando eu disser a ele que precisa de 6 semanas e não haverá nada para os usuários verem no final disso ... mas terei outros 5 anos de escopo de modificação futura saboroso fazendo isso .... hmmm .. tempo para ir ao pub tomar um pouco de cerveja ".

Etapa 5: É necessário fazer várias alterações.

E DURANTE a etapa 5, os desenvolvedores dizem um para o outro: "Esse código é péssimo. Quem escreveu isso? Eles devem levar um tiro. É horrível. Temos que reescrevê-lo".

O passo 5 é fatal. É aqui que o fator de falha se torna tão ruim que o código não pode apenas ter mais algumas alterações, ele precisa ter algumas grandes alterações.

O problema na Etapa 5 é o desejo de jogá-lo fora e começar de novo. A razão disso ser fatal é "O fator Netscape". Vá para o Google. As empresas morrem nesse momento, porque começar de novo significa que você começa com cerca de 50% de premissas em vez de fatos, 150% de entusiasmo em vez de conhecimento, 200% de arrogância em vez de humildade ("Esses caras eram tão estúpidos!"). E você apresenta um monte de novos bugs.

A melhor coisa a fazer é refatorar. Mude um pouco de cada vez. Se a arquitetura estiver ficando um pouco cansada, corrija-a. Adicione, estenda, melhore. Gradualmente. Em cada etapa do processo, teste, teste e teste um pouco mais. Mudanças incrementais como essa significam que, dez anos depois, o código atual e o original são como o machado do avô ("ele tinha 10 cabeças novas e 3 alças novas, mas ainda é o machado do avô"). Em outras palavras, não resta muito em comum. Mas você mudou do antigo para o novo de forma gradual e cuidadosa. Isso reduz o risco e, para os clientes, reduz o fator de irritação.

rapid_now
fonte
Aposto que você receberá mais votos se diminuir os seus passos.
Codism
Devo acrescentar que a maioria das empresas não faz um orçamento para isso; portanto, a refatoração é sempre um pouco tarde demais. Para gerenciar a crescente entropia dos sistemas, é necessário configurar que, a partir do primeiro dia, um orçamento (10% a 20%) seja alocado para cada trabalho de limpeza. Não é um orçamento de correção de bug. O gasto do orçamento é decidido pela engenharia, não pelo gerenciamento, marketing ou vendas. Ele é usado apenas para fatorar a entropia criada pelo desenvolvimento e os gastos reduzidos à medida que o produto se aproxima do fim da vida útil.
8115 mattnz
Acordado. A gerência sempre quer aparar esse tipo de coisa. Às vezes, você pode esconder isso (adicione cerca de 20% à estimativa de desenvolvimento para fazer qualquer coisa e quando a refatoração for necessária - FAÇA-O).
quickly_now
1
Há um ponto em que você realmente não pode refatorar. Se você tiver vários aplicativos de negócios diferentes que dependem da mesma interface ou banco de dados ruim, não poderá consertar muito bem o material subjacente sem quebrar todos os outros aplicativos que dependem da base ruim. Neste ponto, você realmente está ferrado.
John Cromartie
2

Concordo que o momento é difícil de reconhecer e pode ser evitado por processos adequados. No entanto, a pergunta era sobre como chamá-lo. Na economia real, existe o conceito de "retornos decrescentes": o ponto em que o aumento da entrada de um recurso em um processo diminui seu lucro geral por unidade. Isso certamente se aplica à codificação, e até coisas boas como abstração, reutilização etc. têm um ponto de retorno decrescente. O termo geral específico de programação é "superengenharia". Para alguém que é propenso a fazer isso, gosto do termo de Joel " astronauta da arquitetura ".

Kilian Foth
fonte
1

Muitas vezes, um bom código é descartado sob a falsa impressão de que a nova equipe com novas ferramentas pode fazer isso mais barato, mais rápido e com mais confiabilidade, apenas para descobrir que

  • A complexidade está nos requisitos não documentados
  • As novas ferramentas são mais difíceis de usar do que o site em flash prometido
  • A nova equipe não é tão "gostosa" quanto eles pensavam

Possivelmente o tempo que você descreveu chega com algumas bases de código (eu pensava assim). Eu nunca experimentei pessoalmente um caso de código antigo causando um projeto no estômago ou reescrevendo o código salvando um projeto.

Não incluo nesses casos as métricas que foram usadas para identificar módulos ou projetos problemáticos específicos, que foram selecionados e substituídos.

mattnz
fonte
Bem, eu vi um projeto tão f ** ed que seu orçamento de manutenção era três ou quatro vezes o orçamento inicial de desenvolvimento. Enfim, o termo que estou procurando não é uma coisa "oficial" e séria, mas sim algo como o "pico de Ballmer" no xkcd. Desculpe se não sou muito claro.
Thibault J
Mas como ficou tão fodido? Se é por causa de requisitos complexos, má administração e engenheiros otimistas, por que uma reescrita o conserta?
mattnz
Porque a equipe que reescreveu não é a mesma que quem escreveu no começo?
Thibault J
1

O verdadeiro problema com esse "momento" teórico é que ele só é reconhecido depois do fato. A menos que seus colegas sejam psicopatas, todos os commit na base de código são feitos com a crença de que é uma melhoria nessa base de código. É apenas olhando para trás, para a bagunça que se segue, que você pode ver que passou nesse "momento".

Mas eu gosto que poderíamos dar um nome. "Senhores", você poderia dizer, atraindo seus colegas desenvolvedores ao seu redor, "Atravessamos a Hellespont de Manutenção. Envie uma mensagem para sua esposa e avise que você não a verá por um tempo".

Dan Ray
fonte
"todo commit na base de código é feito com a crença de que é uma melhoria nessa base de código". Parece que nunca trabalhou nas mesmas empresas :)
Thibault J
@ThibaultJ - Talvez seus colegas tenham sido psicopatas?
Dan Ray
@ Thibault J: Eu acredito que todo commit é feito com a crença de que é uma melhoria nessa base de código. A crença às vezes é pouco pesquisada e infundada, é claro.
David Thornley
No meu último trabalho, acho que não há nenhum compromisso de manutenção que alguém já fez com a crença de que foi uma melhoria na base de código.
Bobby Tables
Às vezes, os requisitos de um projeto podem mudar o suficiente para forçar a substituição por um novo design, mas, no entanto, pode ser necessário fazer alterações na versão antiga. Se a maioria dos usuários antigos da versão antiga usará o novo sistema e não precisar mais do antigo, pode ser perfeitamente razoável produzir uma versão que atenda aos requisitos daqueles poucos para quem o novo sistema não é adequado, mesmo que torne o sistema menos utilizável para as pessoas que não precisam mais dele.
Supercat
-1

Não sei se existe um nome, mas se não houver, proponho chamá-lo de "ponto de fusão"

DPD
fonte
Ou emprestar outro termo nuclear: massa crítica.
John Cromartie
-2

Esta não é uma pergunta muito interessante.

Na verdade, é trivial.

É tão trivial que desenvolvemos várias maneiras de lidar com isso.

  1. Metodologias em cascata. Muitas pessoas passam muito tempo revisando requisitos e projetando documentos para garantir que a complexidade seja gerenciada.

  2. Metodologias ágeis. Menos pessoas passam menos tempo discutindo o que é imediatamente aplicável para resolver o problema de alguém e lançar o software para eles. A complexidade é gerenciada porque todos estão focados em obter algo liberado.

A única vez em que alguém luta com "complexidade" é devido a uma falha em seguir a metodologia e gerenciar seu tempo adequadamente.

  • Nenhuma supervisão detalhada em uma metodologia em cascata. Eles não são forçados a revisar produtos de trabalho intermediários em requisitos, arquitetura, design de alto nível ou revisões detalhadas de design.

  • Não há prazo de sprint ou prioridades de caso de uso adequadas em uma metodologia Agile. Eles não estão focados em obter algo liberado para o usuário o mais rápido possível.

A complexidade deve ser limitada pelo estabelecimento de metas.

Lutar com a complexidade significa que as metas não são definidas ou não são recompensadas adequadamente.

Não há "ponto de virada". Se o gerenciamento da complexidade é de alguma forma um problema, algo já está errado na organização.

S.Lott
fonte
1
Eu não vejo o ponto. É improvável que um projeto bem executado atinja o ponto de não retorno, mas nem todos os projetos são bem executados. Alguns projetos mal executados terão êxito de qualquer maneira e o restante falhará por vários motivos, às vezes atingindo o ponto de complexidade sem retorno e, às vezes, não.
David Thornley
@ David Thornley: Esse é o meu ponto. O "ponto de complexidade sem retorno" não existe. É simplesmente uma má administração. Não há necessidade de um nome sofisticado ou uma regra. Complexidade é apenas um sintoma de má administração. Não é realmente muito interessante.
S.Lott 5/05
@ S.Lott: Eu acho que existe, embora não em projetos bem gerenciados. Há uma horda de projetos mal gerenciados por aí, e alguns deles entrarão no horizonte de eventos de complexidade e outros não. Realmente não acho útil agrupar toda a má administração.
David Thornley
@ David Thornley: Eu acho muito difícil separar o gerenciamento ruim (o que leva a uma complexidade horrível) do gerenciamento ruim (o que leva todos a desistir). Não vejo uma maneira de saber se um projeto se tornará muito complexo ou apenas atrasado ou incompetente.
S.Lott 5/05
@ S.Lott: No entanto, existe uma distinção entre um projeto em que todos saem ou sofrem uma falha grave na saúde e um projeto em que a complexidade se torna excessiva. Existem diferentes maneiras de falhar, e pode ser interessante ou até útil categorizá-las.
David Thornley
-2

Existem métodos para visualizar e monitorar o risco de aumentar a complexidade de projetos e códigos (grandes). Quando eles são aplicados razoavelmente, espero que um novo nome para o ponto de não retorno não seja necessário. (Existe um MOOC relacionado no openHPI: https://open.hpi.de/courses/softwareanalytics2015/ )

Complexidade estrutural é um problema geral de design - não apenas para design de software em grandes equipes. A visualização é o primeiro passo no gerenciamento da complexidade estrutural. Matrizes e gráficos direcionados também podem ser usados ​​para essa finalidade.

Os alguns métodos para reduzir a complexidade estrutural são http://www.buch.de/shop/home/suche/?fq=3540878890 :

  • modularização
  • evitar loops de feedback
  • triangulação

Além disso, existe o conceito de projeto axiomático: https: \ en.wikipedia.org \ wiki \ Axiomatic_design \ Com esse conceito, problemas confiáveis ​​devido à complexidade desnecessária podem ser evitados.

Portanto, existem vários métodos disponíveis. No final, é sempre uma decisão pensar neles, porque um projeto é grande o suficiente.

Eddi
fonte
Isso não responde à pergunta.
Hulk