A decisão mais lamentável de design ou programação que você tomou? [fechadas]


57

Eu gostaria de ouvir que tipo de decisões de design você tomou e como elas saíram pela culatra. Por causa de uma má decisão de design, acabei tendo que apoiar essa má decisão para sempre (também participei). Isso me fez perceber que um único erro de design pode assombrá-lo para sempre. Quero aprender com as pessoas mais experientes que tipo de erros eles experimentaram e o que eles aprenderam com eles.

Tenho certeza de que isso ajudará muito outros programadores, ajudando-os a não repetir essas decisões.

Obrigado por compartilhar sua experiência.


19
gastando muito tempo em SO !! ;)
Mitch Wheat

6
@ George: parece que seu primeiro link é sobre excesso de engenharia, que pode estar relacionado tangencialmente a esse segmento, mas não é uma duplicata. O segundo e o último vínculo referem-se a erros de codificação e problemas de gerenciamento, nenhum dos quais é duplicado desse segmento.
Juliet

11
Provavelmente, isso deve ser transformado em um wiki da comunidade (há uma caixa quando você edita a postagem).

3
Eu gostaria que houvesse uma maneira de votar para combater o fechamento. Voto negativo perto?
Kieveli 24/09/09

5
O que há de errado com todos os eleitores fechados? Então, e se não for uma CW, deixe o solicitante obter alguns votos por apresentar a pergunta. Estou realmente interessado neste tópico. Não deixe a CW atrapalhar uma boa pergunta subjetiva. Sheesh, SO está cheio de gritadores "CW THIS".
syaz 24/09/09

Respostas:



56

"Farei isso mais tarde"
"Mais tarde" nunca chega.


8
Mais tarde nunca chega.

Isso nunca acontece.

Já foi dito: se você não tem tempo para fazê-lo agora, o que faz você pensar que terá tempo para corrigi-lo mais tarde?

4
Chamamos isso de "iteração nunca"
NotMe

10
Não há nada tão permanente quanto uma solução temporária.
precisa saber é o seguinte


44

A configurabilidade em um aplicativo é boa. Muita configurabilidade é um pesadelo para usar e manter.


2
Sim. Verdadeiro. É ideal tornar tudo configurável e dizer ao chefe que nunca precisaremos alterar uma única linha de código novamente.

11
Tendo sido o usuário infeliz preso a um desses sistemas infinitamente configuráveis ​​para o nosso gerenciamento de projetos, só posso dizer que eu o votaria um milhão de vezes, se pudesse.
HLGEM

O excesso de flexibilidade na configuração geralmente ocorre porque você não pode executar código arbitrário no tempo de execução, portanto, é necessário antecipar tudo.

Isso é chamado de «spoftcoding» ao contrário de «codificar»
deadalnix

42

Com um dos meus erros, aprendi que a normalização do banco de dados não deve ser seguida cegamente. Você pode e, em algumas situações, DEVE achatar suas mesas.

Acabei gerenciando cargas de tabelas (via modelos) e o desempenho não foi tão bom quanto poderia ser com um pouco de achatamento para tabelas.


5
Eu não poderia concordar mais ... Eu sou engenheiro de software e nos dizem para sempre normalizar. Que merda. Foi apenas porque os professores ainda não tentaram trabalhar com bancos de dados verdadeiramente complexos e dependentes do desempenho.

8
Devo acrescentar que a normalização também pode ser muito positiva, é claro.

12
Eu acho que os programadores são muito rápidos em desnormalizar por razões inadequadas, mas sim, a adesão servil às regras da normalização é um grande erro. Em geral, uma das minhas maiores frustrações no desenvolvimento de software é quando alguém diz "Precisamos fazer o X" e, quando aponto todos os problemas que isso causará, eles respondem: "Isso é irrelevante. Todos os especialistas concordam que o X é bom, portanto, devemos fazer X, sempre, sem exceções ".

4
Minha abordagem à normalização é sempre direta. Eu sempre normalizo, MAS, se eu vir um aumento potencial de desempenho com pouco achatamento - eu sempre testo e comparo e, na maioria dos casos, vale a pena achatar.
Eimantas

7
Mas a normalização é DIVERTIDA! :) Estou falando sério, gosto de projetar estruturas de dados. O que eu diria é que, embora seja fácil desnormalizar um esquema normalizado, o inverso NÃO é verdadeiro. Você precisa CONHECER as regras antes de quebrá-las.

36

Usando um único caractere nos bancos de dados para status, etc. Não adianta nada, a sobrecarga do uso de um char () ou nvarchar2 () mais longo é minúscula em comparação com a rede e a análise incorrida por qualquer chamada SQL, mas os caracteres sempre terminam um pouco ofuscado ou acabando (não para status, mas outras coisas). É muito melhor colocar apenas a versão legível por humanos e também ter no seu modelo Java (no meu caso) uma enumeração com valores correspondentes.

Eu acho que essa é uma forma de otimização desnecessária e cega prematura. Como se usar um único caractere salvasse o mundo hoje em dia. Além de booleanos Y / N em bancos de dados que não suportam booleanos / bits.


+1 Acabamos de ter uma reunião sobre esse assunto. Chegamos à mesma conclusão.
APC

E se o seu cliente trabalha com essas abreviações e não deseja abandoná-las?

Para sistemas existentes, você precisa ser compatível (eu ainda criaria uma enumeração Java de valores adequados, com o método <code> MyEnum fromChar (char c) </code>). Para novos designs, simplesmente não vá lá!

Alguns bancos de dados suportam enumerações, compactas e legíveis, e também servem para proibir valores inesperados. Se puder, use-os.
22411 Karl Bartel

2
Quase tão ruim: usando o tipo BIT no MS SQL Server, antes de descobrir que ele não pode fazer parte de um índice.
#

32

Não desenvolvendo uma camada de acesso a dados adequada e tendo sql em todo lugar no meu código, apenas para obter algo "rápido" em funcionamento. Mais tarde, quando o projeto começou a se expandir e os requisitos mudaram, tornou-se um pesadelo. Eu não sabia o que era um DAL na época.

... feliz por ter passado disso, embora ainda veja programadores com mais de 20 anos de "experiência" fazendo isso.


16
Não me lembro onde li, mas há uma diferença entre 20 anos de experiência e um ano de experiência repetido 19 vezes.
CaffGeek 6/10/09

@Chad: Estava em algum lugar nos escritos de Joel Spolsky.

+1: Sim. E tente refatorar toda essa lógica amarrada nesse SQL ... Seja SQL embutido, de forma livre ou procs armazenados. [Yup - Eu não tenho medo de que a guerra santa.]
Jim G.

26

Pensando que eu poderia ser Arquiteto, Desenvolvedor e PM, todos no mesmo projeto.

2 meses dormindo 3 horas por noite me ensinaram que você simplesmente não pode fazê-lo.


15
Então pare de dormir tanto! oh, espere ... você quer dizer que isso NÃO é normal ... ?? Hmm, eu tenho que me algumas outras pessoas sobre este projecto ...
Avid

Soa como o PM-você precisa de algum treinamento com estimativas :)

21

Escolhendo o Microsoft Foundation Classes (MFC) para escrever um IDE Java.


3
Owwww. Isso faria meu cérebro doer.
Greg D

2
Essa não foi uma decisão ruim em 1999. O AWT era feio e lento na época.
#

finnw - bem, pelo menos ainda é feio!
Niklas H

20

Não foi minha decisão (entrei na empresa um pouco mais tarde), mas em algum lugar em que trabalhei levei o i18n um pouco longe demais, incluindo a tradução de todas as mensagens de log.

Resultados:

  • Mais doloroso ao adicionar novo log
  • Mais custo para tradução
  • Logs são mais difíceis de ler depois

Opa


Estou fazendo um i18n aqui e tentando descobrir o que vale para o usuário e o que entra nos logs. Quero que toda a saída voltada para o usuário seja localizável, mas quero que os logs permaneçam os mesmos. No processo, estou tendo que descobrir mais de onde uma exceção vai do que eu gosto.
David Thornley

11
Deixe-me adivinhar, seu americano? E se não, você só fala inglês? Use internacionalização onde novas entradas de log em inglês, se outro idioma estiver disponível, você exibirá o idioma dos usuários. DICA: O uso de códigos de erro ajuda aqui, pois significa que você sempre pode grep / varrer logs, independentemente do idioma.

2
@ Jacob: Eu sou inglês, mas só falo inglês. Mas isso era para uma empresa em que toda a base de engenharia estava na Inglaterra; portanto, ter arquivos de log (que são para fins de diagnóstico, não informações visíveis ao usuário) em outros idiomas seria apenas um desperdício de recursos. Concordo que o uso de códigos de erro em vez de texto permite a tradução instantânea - mas ainda é mais trabalhoso do que usar apenas um idioma para começar. É uma questão de reduzir o trabalho, identificando onde algo que parece útil realmente não fornecerá nenhum valor significativo.
23909 Jon Skeet

10
Eu sou sueco. Eu teria que ficar medroso com qualquer um que até sugerisse que o código / comentários / logs deveria estar em qualquer outra coisa que não fosse o inglês. O inglês é o idioma a ser usado em tudo, menos nas interfaces de usuário. Tudo o resto torna o código difícil de ler e discutir. Usar um idioma nativo é ridículo, já que qualquer outra estrutura / biblioteca que você usa está em inglês.
jgauffin

11
+1 Inglês é a língua franca da programação. Traduzi-lo é apenas colocar uma camada adicional, na qual você precisa do mínimo de camadas e da maior clareza possível.


19

Fazendo muito design . Criando muitos diagramas UML, particularmente diagramas de sequência para cada operação, muitos dos quais acabaram sendo inúteis. No final, verificou-se que uma quantidade significativa de tempo poderia ter economizado pulando o design / diagramas desnecessariamente detalhados e iniciando a codificação diretamente.


Se a pergunta era: "Qual é a decisão mais lamentável de design ou programação que você já viu?" em oposição aos erros que cometemos, eu colocaria "UML" no topo da minha lista. Logo abaixo "do registro do Windows".

2
É bom discutir a UML entre os membros de uma equipe, mas quando se trata do design e depois implementá-lo de acordo com o design, sempre acaba mal. Isso é algum tipo de sonho para algumas empresas, mas, na verdade, a gravação de software definitivamente não funciona dessa maneira. +1!
precisa saber é o seguinte

17

Os clientes que acreditam acreditam no que querem e depois fazem muito antes de verificar com eles.


15

Minha pior decisão de design? Na década de 1980, eu estava trabalhando em um projeto em que tivemos a brilhante idéia de criar um tipo de modelo para nossas telas de entrada de dados que seria interpretado em tempo de execução. Não é uma decisão ruim: facilitou o design das telas de entrada. Basicamente, basta criar um arquivo que se assemelhe à tela de entrada de dados, com alguns códigos especiais para identificar o que era um rótulo versus o que era um campo de entrada e para identificar se os campos de entrada eram alfa ou numéricos. Decidi adicionar mais códigos especiais a esses arquivos para identificar quais validações deveriam ser executadas. Em seguida, adicionei mais códigos para permitir a criação condicional da tela, o campo X incluído apenas quando alguma condição era verdadeira etc. Depois, adicionei mais códigos para fazer um processamento simples das entradas. Etc etc. Eventualmente, transformamos nosso modelo de tela em uma nova linguagem de programação, completa com expressões, estruturas de controle e uma biblioteca de E / S. E para que? Fizemos muito trabalho para reinventar o FORTRAN. Tínhamos uma prateleira cheia de compiladores para idiomas melhor projetados e testados. Se tivéssemos dedicado tanto esforço à criação de produtos onde realmente possuímos alguma experiência, essa empresa ainda estaria no mercado hoje.


Isso é engraçado e trágico :)

O triste é que essa abordagem às vezes é o melhor caminho a percorrer. O cliente pode escolher "a tela pode ser alterada a qualquer momento" ou "a tela faz tudo, inclusive faz o chá", mas não as duas coisas!

3
Não tenho nada contra o uso de modelos ou outro código genérico. O erro foi transformar um pedaço de código genérico em um idioma dentro de um idioma.

Eu vi exatamente isso ... em 2004! Toda a lógica de negócios está espalhada por cerca de quinze tabelas de configuração, com várias tentativas meio "dinâmicas" de "linguagens" dinâmicas lançadas para uma boa medida (consulte a Décima Regra de Greenspun)!

11
Você não quer dizer COBOL ao invés de FORTRAN?
finnw

15

A aplicação excessivamente zelosa do YAGNI (que é denominado Design por Enumeração em Armadilhas do Desenvolvimento Orientado a Objetos ) em um ambiente em que qualquer pessoa sensata poderia dizer que os requisitos definitivamente mudariam. E mude repetidamente.

Se você codificou tudo ( exatamente ) exatamente para os requisitos atuais - enquanto reprimia alguém que dissesse "isso não poderia ser mais genérico?" com seu martelo YAGNI - e os requisitos mudam drasticamente (mas de uma maneira que poderia ter sido razoavelmente antecipada), essa pode ser a diferença entre levar duas semanas para se adaptar e levar 20 minutos.

ATUALIZAÇÃO: Para esclarecer, aqui está um exemplo fictício que não está muito longe do que aconteceu. O Stack Overflow foi projetado para oferecer suporte a emblemas, mas suponha que eles só pensassem em quatro emblemas no início. Apenas quatro, um número tão pequeno, então eles codificaram o suporte para exatamente quatro emblemas em toda a lógica do site. No banco de dados, nas informações do usuário, em todo o código de exibição. Porque "Você não vai precisar" de nenhum crachá que você não consegue pensar, certo? Suponha que o site seja publicado e as pessoas comecem a sugerir novos crachás. Cada cracháleva até duas semanas para adicionar, porque há muito código para ajustar em todo o lugar. Ainda assim, "Você não precisará" de mais crachás do que a lista de hoje, portanto, nunca há refatoração para oferecer suporte a uma coleção genérica de crachás. Uma coleção tão genérica levaria mais tempo com antecedência? Não muito, se houver.

O YAGNI é um princípio valioso, mas não deve ser (ab) usado para desculpar design inadequado e codificação incorreta. Existe um equilíbrio e, com a experiência, acredito que estou me aproximando.


11
Sim e não, você pode prever em que direção isso vai mudar? Tenho experiência de sistemas dolorosamente complexos que se mostrou totalmente inadequado para o primeiro reutilização, o que não se encaixam no genericidade previsto ...
Benjol

Sim, prefiro lidar com YAGNI do que com essa porcaria.

Então você acha que deveria ter passado as duas semanas adiantadas?
#

4
Esse exemplo não é YAGNI. O DRY faz parte do YAGNI e, sem ele, você não pode permanecer responsivo às mudanças.

3
Stephan, o exemplo mostra um abuso superficial e inapropriado da frase de efeito, que era o meu ponto. DRY (com sua variante OAOO) também é um bom princípio, mas bastante separado: c2.com/cgi/wiki?OaooBalancesYagni . No entanto, não consigo encontrar nada em qualquer lugar para apoiar sua afirmação de que "DRY faz parte da YAGNI". Mostarda combina bem com cachorros-quentes, mas isso não significa que a mostarda faça parte dos cachorros-quentes. Se você puder esclarecer, talvez com referências, talvez eu entenda.
console 80x24

15

Recursos humanos incompetentes

Tentando fazer algo certo e ótimo com pessoas erradas!
Mesmo se eles estiverem no papel de um gerente de ego supérfluo (o que é bastante comum, especialmente em grandes empresas onde sua incompetência pode durar mais tempo).


11
Eu entendo sua dor :(

13

Toda vez que eu crio dívidas técnicas, escrevo código processual, pulo testes de escrita etc. porque estou correndo. Quase inevitavelmente, acho que isso cria dor para mim no caminho.


13

Usando o SQL Server Intergration Services (SSIS).

Eu não desejo isso no meu pior inimigo.

Após criar vários pacotes SSIS nos últimos dois meses, apenas para descobrir que os pacotes que desenvolvi não são distribuíveis e não podem ser implementados. Especificamente em um ambiente licenciado não Web e não SQL Server.

É uma situação muito ruim, quando você tem menos de 48 horas para reescrever seus pacotes SSIS no código POCO .NET puro ou perde o prazo previsto.

Surpreende-me que eu pude reescrever três pacotes SSIS (que levaram dois meses para testar e desenvolver), dentro de 12 horas em código .NET puro, com adaptadores OLEDB e adaptadores SQL.

O SSIS não é distribuível e não executará pacotes de uma máquina cliente se não tiver uma licença do SQL Server instalada (especificamente o DTSPipeline.dll). Seria ótimo saber de antemão. Agora vejo o aviso (em letras miúdas) no MSDN. Isso não é bom quando você tem um exemplo de código em toda a Internet usando apenas o código SQL-LICENSED da máquina. Basicamente, você precisa criar um serviço da Web que conversará com seu servidor SQL para executar seus pacotes SSIS programaticamente. Você não pode executá-los a partir do código .NET puro, a menos que tenha uma licença SQL instalada na máquina em execução. Quão irreal é isso? A Microsoft realmente espera que o SSIS seja usado em máquinas que exigem instalação do servidor SQL? Que desperdício completo de dois meses.

Minha empresa nunca mais utilizará o SSIS por causa dessa pequena impressão "pegadinha".


Talvez você deva evitar usar completamente o software de "impressão fina"! O Talend, por exemplo, é um ETL IDE de código aberto.

+1: Sim. A experiência de desenvolvimento do SSIS também é um pesadelo. Provavelmente, existem pelo menos meia dúzia de maneiras melhores de executar ETL.
Jim G.


10

Jogando alguns ovos de páscoa 'engraçados' em algum código que escrevi antes de sair de férias por 2 semanas. Eu pensei que seria a única pessoa a lê-lo quando voltasse, isso me deixaria rindo e pronta para recodificá-lo.

Escusado será dizer que meu chefe não ficou impressionado quando o revisou enquanto eu estava fora, e ficou ainda menos impressionado quando um dos 'ovos de páscoa' estava envolvendo seu rosto, engraçado, caricaturado em ASCII.

Mmmmmm ...


11
IMO, isso é "Bom trabalho, senhor!"

18
Muito recentemente, fui ridicularizado por minha equipe por rastrear mensagens como "adicionando o valor (p) à sua tabela!" Eu disse: olhem, eles me fizeram trabalhar no dia Talk Like A Pirate, eles merecem o que recebem.

3
Arr, seus loggs estão procurando por uma quilha!

10

O uso de Temas ASP.Net quando apenas uma pasta CSS normal seria muito bem.


Muitas gargalhadas, sim!

11
Esta resposta poderia ser encurtado para "Usando ASP.NET"
finnw

Skins são úteis para configurar o CssClass padrão.
Min

8

Pegar o caminho rápido para que algum código funcione, em vez do caminho certo (um pouco geral, mas chamaremos de abstração e, portanto, de resposta 'certa').


7

Minha empresa possui um modelo de desenvolvimento em cascata, no qual nossos usuários e analistas de negócios definirão requisitos para projetos. Em um dos nossos "grandes" projetos, recebemos uma pilha de requisitos e notei que vários requisitos continham detalhes de implementação , especificamente informações relacionadas ao esquema do banco de dados usado pelo nosso sistema de contabilidade.

Comentei para os usuários de negócios que a implementação é o meu domínio, que não deve estar contido nos requisitos. Eles não estavam dispostos a mudar seus requisitos porque, afinal, são o NEGÓCIO, e só faz sentido para os contadores projetar software de contabilidade. Como um desenvolvedor humilde que está muito longe na pesquisa de totens, sou pago para fazer em vez de pensar . Por mais que eu lutei, não consegui convencê-los a reescrever os requisitos - há muita papelada e burocracia em torno das mudanças que são muito complicadas.

Então, eu dei a eles o que eles pediram. No mínimo, meio que funciona , mas o banco de dados é estranhamente projetado:

  • Muita normalização desnecessária. Um único registro contendo 5 ou 10 campos é dividido em 3 ou 4 tabelas. Eu posso lidar com isso, mas eu pessoalmente gostaria de ter todos os campos 1: 1 reunidos em uma única tabela.

  • Muita desnormalização inadequada. Temos uma tabela que armazena dados da fatura que armazena mais que dados da fatura. Armazenamos vários sinalizadores diversos na tabela InvoiceData, mesmo que o sinalizador não esteja logicamente relacionado à tabela InvoiceData, de modo que cada sinalizador tenha um valor de Chave Primária codificado e mágico e todos os outros campos anulados na tabela InvoiceData. Como a bandeira é representada como um registro na tabela, sugeri puxar a bandeira para sua própria tabela.

  • Muito mais desnormalização inadequada. Certos sinalizadores de todo o aplicativo são armazenados como colunas em tabelas inadequadas, de forma que a alteração do sinalizador de um aplicativo exija a atualização de todos os registros da tabela.

  • As chaves primárias contêm metadados, de modo que, se uma chave primária varchar terminar com "D", calculamos faturas usando um conjunto de valores, caso contrário, calculamos com outro conjunto. Seria mais útil extrair esses metadados para uma coluna separada ou extrair o conjunto de valores para calcular em outra tabela.

  • As chaves estrangeiras costumam ir para mais de uma tabela, de modo que uma chave estrangeira que termina com "M" pode ser vinculada à nossa tabela de contas hipotecárias, enquanto uma chave estrangeira que termina com "A" pode ser vinculada à nossa tabela de contas automáticas. Seria mais fácil dividir os dados em duas tabelas, MortageData e AutoInsuranceData.

Todas as minhas sugestões foram abatidas com muito choro e ranger de dentes. O aplicativo funciona como projetado e, embora seja uma grande bola de barro, todos os hacks desagradáveis, casos especiais e regras de negócios estranhas são sarcasticamente e humoristicamente documentados no código-fonte.


3
Meu Deus, espero que seu currículo seja agradável e atualizado para uma fuga rápida antes que a grande bola de lama sucumba à gravidade!
Benjol

7

Aderindo à tecnologia mais antiga, porque parece muito aborrecido permitir que seus clientes atualizem para uma nova versão do .NET framework, mas na verdade levará mais tempo de desenvolvimento para criar o software, porque você não pode utilizar alguns componentes (que economizam tempo) do versão mais recente do framework.


+1: Sim - eu estive lá ... E assim que percebi que os n00bs não seriam atualizados, comecei a planejar minha fuga para pastos mais verdes.
Jim G.

E assim fiz, acabei de me aposentar no próximo mês!
vinha

6

De volta à universidade, eu estava trabalhando no meu projeto de design sênior. Outro cara e eu estávamos escrevendo um sistema de rastreamento de bugs baseado na Web. (Nada de inovador, mas nós dois queríamos ter alguma experiência na Web.) Fizemos a coisa com servlets Java, e funcionou razoavelmente bem, mas por algum motivo bobo, em vez de optar por usar Exceptions como nosso mecanismo de tratamento de erros, escolhemos para usar códigos de erro.

Quando apresentamos nosso projeto para uma série e um dos professores perguntou ao inevitável: "Se você tivesse que fazer de novo, o que faria de diferente?" Eu soube instantaneamente a resposta: "Eu usaria exceções, é para isso que elas existem".


Ahhh as alegrias de reinventar a roda! :-) Isso é engraçado.

Eu chamo isso de falhas intencionais, apenas para que você possa melhorá-lo na próxima iteração.
whatnick

2
As exceções são apenas para lidar com exceções. Muitas pessoas abusam de exceções, transformando tudo em uma exceção.

@jacob - Concordo com o seu sentimento de que as exceções devem ser usadas para coisas que você pode prever (ou seja, condições excepcionais), mas pelo que eu vi (e não sendo um programador Java) Java parece usar exceções para tudo sob o sol. Portanto, não usar exceções no código Java pode ser considerado contrário ao fluxo da linguagem.

6

Não é minha escolha de método, mas criei um XSLT para converter um arquivo XML baseado em linha em um relatório HTML baseado em coluna.

Só funcionou no IE, era completamente impossível decodificar como funcionava. Toda vez que precisávamos expandi-lo, era impossivelmente difícil e levava idades.

No final, substituí por um pequeno script C # que fazia a mesma coisa.


Eu também fiz isso. Eu implementei um mecanismo de modelagem de email usando XSL e achei difícil ler e manter.
TrueWill

Sim. Substituiu a enorme árvore de arquivos XSLT de alguém por algumas funções simples do VB.NET. Muito satisfatório, especialmente quando a próxima solicitação de alteração de cliente que surgisse seria impossível de fazer no XSLT.

Eu descobri que a maioria dos programadores considera o XSLT uma má escolha, simplesmente porque eles não o entendem . É extremamente útil para um pequeno conjunto de problemas, muito mais eficiente do que muitas outras soluções. Por outro lado, ele é usado demasiado frequentemente, e principalmente não nesse pequeno conjunto de problemas ...
Avid

6

tentando usar todas as novas tecnologias (para aprender novas tecnologias), mesmo que isso não exija ..


5

Não levei tempo suficiente para avaliar o modelo de negócios. Fiz o que o cliente pediu, mas 6 a 12 meses depois, chegamos à conclusão de que deveria ter sido diferente.


4

Projetando sem uma especificação.


3
Specs nem sempre são possíveis

Deveria ser "Implementando a solução sem perguntar ao cliente se era isso que eles queriam"; o que geralmente significa que você seguiu as especificações.
precisa saber é o seguinte

3

Eu implementei uma subseção de um aplicativo de acordo com os requisitos.

Acontece que os requisitos foram inchados e banhados a ouro, e meu código foi superprojetado. Eu deveria ter projetado minha subseção para trabalhar apenas com o que estava adicionando no momento, mas planejo adicionar todas as outras coisas sem incluir o suporte genérico desde o início.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.