Pergunta

Muitas vezes nos encontramos trabalhando em um problema, apenas para descobrir a solução que está sendo criado é muito mais complexa do que o problema exige. Existem controles, melhores práticas, técnicas, etc que ajudam a controlar mais de complicação em seu local de trabalho?

Foi útil?

Solução

Começar alguém novo para olhar para ele.

Outras dicas

Se seu demasiado difícil de teste, o seu design é muito complicado. Esse é o primeiro uso métrica I.

Na minha experiência, projetando para um caso excessivamente geral tende a gerar muita complexidade.

cultura Engenharia incentiva projetos que fazem menos suposições sobre o ambiente; esta é geralmente uma coisa boa, mas algumas pessoas levam isso muito longe. Por exemplo, força ser bom se o seu projeto do carro não assume uma força gravitacional específica, ninguém está realmente indo para conduzir o seu carro na Lua, e se eles fizeram, que não iria funcionar, porque não há oxigênio para fazer a queima de combustível.

A parte difícil é que o cara que é desenvolvido as "obras-on-qualquer-planeta" design é muitas vezes considerado como inteligente, de modo que você pode ter que trabalhar mais para argumentar que o seu design é muito inteligente.

Compreender os trade-offs, para que possa tomar a decisão entre bons pressupostos e maus hipóteses, irá percorrer um longo caminho para evitar um design desnecessariamente complicado.

Aqui estão algumas idéias para design mais simples:

  • ler alguns livros e artigos de programação e, em seguida Aplicar -los em seu código de trabalho e de escrita
  • ler muito código (bons e maus) escritos por outras pessoas (como projetos de código aberto) e aprender a ver o que funciona eo que não funciona
  • redes de segurança de construção (testes de unidade) para permitir experimentações com seu código
  • controle de versão uso para permitir a reversão, se essas experimentações tomar rumo errado
  • TDD (Test Driven Development) e BDD (Behavior Driven Development)
  • mudar sua atitude, perguntar como você pode fazê-lo assim, que "simplesmente funciona" (convenção sobre configuração poderia ajudar lá, ou perguntar como a Apple iria fazê-lo)
  • prática (como músicos de jazz - jam com código, tente Código Kata )
  • gravar mesmo código várias vezes, com diferentes línguas e depois de algum tempo passou
  • aprender novas línguas com novos conceitos (se você usar uma linguagem estática, aprender uma dinâmica, se você usar uma linguagem procedural, aprender uma funcional; ...) [um idioma por ano é de cerca de direita]
  • pedir a alguém para revisar seu código e ativamente perguntar como você pode tornar seu código mais simples e mais elegante ( e, em seguida, torná-lo )
  • obter anos sob seu cinto, fazendo acima coisas (tempo ajuda mente ativa)

Eu criar um design etc., e então eu olhar para ele e tentar remove (agressivamente) tudo o que não parece ser necessário. Se ele sair eu precisar dele mais tarde quando estou polindo o projeto que eu adicioná-lo de volta. Eu faço isso ao longo de várias iterações, refino como eu ir junto.

Leia "trabalhar efetivamente com Legacy Code", de Michael C. penas.

O ponto é, se você tem o código que funciona, e você precisa de mudar o projeto, nada funciona melhor do que fazer a sua unidade de código testável, e quebrar seu código em pedaços menores.

Usando Test Driven Development e seguindo de Robert C. Martin Três Regras da TDD :

  1. Você não tem permissão para escrever qualquer código de produção a menos que seja para fazer uma passagem de teste unidade com falha.
  2. Você não tem permissão para escrever mais de um teste de unidade que é suficiente para falhar; e falhas de compilação são falhas.
  3. Você não tem permissão para escrever mais código de produção do que é suficiente para passar no teste de uma unidade falhar.

Desta forma, você não são susceptíveis de ter muito código que você não precisa. Você sempre será focado em fazer um trabalho importante e nunca vai chegar muito longe de si mesmo em termos de complexidade.

Test primeira pode ajudar aqui, mas não é adequado para todas as situações. E não é uma panacéia de qualquer maneira.

Comece pequeno é outra grande idéia. Você realmente precisa para encher todos os 10 padrões de projeto para essa coisa? Tente primeiro a fazê-lo "maneira estúpida". não corta completamente? Ok, fazê-lo "maneira um pouco menos estúpido". Etc.

Obter revisada . Como alguém escreveu, dois pares de olhos são melhores. Ainda melhor são dois cérebros. Seu companheiro pode apenas ver uma sala de simplificação, ou uma área problemática você pensou que era bom só porque você passar muitas horas cortando-lo.

Use linguagem magra. linguagens como Java, ou às vezes C ++, por vezes, parecem incentivar soluções desagradáveis, complicado. Simples coisas tendem a extensão ao longo de várias linhas de código, e você só precisa usar 3 bibliotecas externas e um quadro grande para gerenciar tudo isso. Considere o uso de Python, Ruby, etc. - se não para o seu projeto, em seguida, por algum uso privado. Ele pode mudar a sua mentalidade para favorecer simplicidade, e para ter certeza de que a simplicidade é possível.

É inevitável depois de ter sido um programador que isso vai acontecer. Se você seriamente ter unestimated o esforço ou bater um problema onde a sua solução simplesmente não funciona, em seguida, parar de codificação e começar a falar com o seu gerente de projeto. Eu sempre gosto de levar as soluções com me para a reunião, problema é A, você pode fazê-x, que terá 3 dias ou podemos tentar y que terá 6 dias. Não fazer a escolha si mesmo.

  • Converse com outros programadores a cada passo do caminho. Quanto mais olhos existem no design, o mais provável é um aspecto complicada é revelado mais cedo, antes que se torne demasiado ossificado na base de código.
  • Sempre pergunte a si mesmo como você vai usar o que você está trabalhando atualmente. Se a resposta é que você não tem certeza, parar para repensar o que está fazendo.
  • Eu encontrei-o útil para anotar pensamentos sobre como potencialmente simplificar algo que eu estou trabalhando atualmente. Dessa forma, uma vez que eu realmente tenho que trabalhar, é mais fácil para voltar e refatorar ou refazer, se necessário, em vez de mexer com algo que não é mesmo funcional ainda.

Este é um ato de equilíbrio delicado: na mão que você não quer algo que leva muito tempo para conceber e implementar, por outro lado, você não quer um corte que não é complicada o suficiente para lidar com o próximo o problema de semana, ou pior ainda requer reescrever para se adaptar.

Um par de técnicas que eu achar útil:

Se algo parece mais complexo do que você gostaria, então não se sentar para implementá-lo assim que você tem o pensamento acabado com isso. Encontrar outra coisa para fazer para o resto do dia. Inúmeras vezes eu acabo de pensar em uma solução diferente para uma primeira parte do problema que remove um monte de complexidade mais tarde.

Em uma veia similar ter alguém que você pode expor suas idéias. Certifique-se de que você pode explicar-lhes porque a complexidade é justificada!

Se você estiver adicionando complexidade porque você acha que vai ser justificada no futuro, em seguida, tentar estabelecer quando no futuro, você vai usá-lo. Se você não pode (realisticamente) imaginar que necessitam a complexidade por um ano ou três, então provavelmente não é justificável a pagar por ele agora.

Reduzir a quantidade de dados que você está trabalhando com pelo serializadas a tarefa em uma série de tarefas menores. A maioria das pessoas só pode ter meia dúzia (mais ou menos) as condições em sua cabeça, enquanto a codificação, por isso verifique que a unidade de implementação. Projetar para todas as tarefas que você precisa realizar, mas, em seguida, impiedosamente cortar o projeto de modo que você nunca tem que jogar com mais de meia dúzia de caminhos embora o módulo.

Isso decorre do post de Bendazo - simplificar até que se torne fácil

.

Peço aos meus clientes por Eles precisam de algum recurso. I tentar chegar ao fundo do seu pedido e identificar o problema que eles estão enfrentando. Isso muitas vezes se presta a uma solução mais simples do que eu (ou eles) iria pensar.

Claro que, se você sabe hábitos de trabalho dos seus clientes e quais os problemas que eles têm de enfrentar, você pode entender os seus problemas muito melhor a partir do get-go. E se você "conhecê-los" conhecê-los, então você compreender o seu discurso melhor. Então, desenvolver uma estreita relação de trabalho com seus usuários. É da etapa zero da engenharia.

Tome tempo para citar os conceitos do sistema de bem, e encontrar nomes que estão relacionadas, o que torna o sistema mais familiar. Não hesitar em mudar o nome de conceitos, melhor a conexão com o mundo que você sabe, melhor o seu cérebro pode trabalhar com ele.

Peça opiniões de pessoas que recebem seus chutes de soluções limpas, simples.

implementar Só conceitos necessários pelo projeto atual (um desejo para o futuro provas ou sistemas genéricos fazer seu projeto inchado).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top