Passei o último ano como uma equipe individual desenvolvendo um aplicativo de cliente rico (mais de 35.000 LoC, pelo que vale a pena). Atualmente, está estável e em produção. No entanto, eu sei que minhas habilidades estavam enferrujadas no início do projeto, portanto, sem dúvida, existem grandes problemas no código. Nesse ponto, a maioria dos problemas está na arquitetura, estrutura e interações - os problemas fáceis, mesmo os problemas de arquitetura / design, já foram eliminados.
Infelizmente, passei tanto tempo com este projeto que estou tendo dificuldades para pensar fora dele - abordando-o de uma nova perspectiva para ver as falhas profundamente enterradas ou inerentes ao design.
Como passo fora da minha cabeça e fora do meu código para que eu possa ter uma aparência nova e melhorá-la?
fonte
Respostas:
Maneiras de abordar isso:
Se você tem exemplos específicos que deseja abordar, talvez poste-os aqui.
fonte
Depuração de pato de borracha : Sente-se com um pedaço de código ou um módulo ou um recurso e explique-o em voz alta. Quando você se encontrar dizendo algo que parece errado, tolo ou simplesmente errado, escreva como um problema a ser investigado.
fonte
Continue aprendendo e expandindo suas habilidades. É difícil saber o que você não sabe, mas quando você o vê, esse momento "aha" o atinge. Isso pode resultar do aprendizado de outro idioma ou padrão de design.
Você será solicitado a fazer uma alteração. Você pode encontrar partes do seu código que não são tão flexíveis e exigirão muito retrabalho. Isso não é necessariamente um fracasso, porque você não consegue pensar em tudo a princípio.
Os usuários começarão a reclamar. Apenas quando você acha que tudo está ótimo ...
fonte
Uma memória curta ajuda. Eu sou conhecido por reclamar do "idiota" que mudou alguma coisa há uma semana atrás, apenas para descobrir pelo controle de origem que era eu.
Um bom primeiro passo é identificar o código que pode ser aprimorado. Procure no seu controle de origem os arquivos que mudam com mais frequência. Qual código é o mais difícil de trabalhar? Qual código produz mais erros? Que tipos de alterações causam um efeito cascata em todo o código? Nesta fase, você não precisa saber por que o código é problemático, apenas que é problemático.
Depois de identificar as áreas para trabalhar, tente descobrir qual é realmente o problema. Existem livros que adotam uma abordagem sistemática para categorizar problemas de design. Veja a refatoração de Martin Fowler , os padrões de codificação C ++ de Herb Sutter , o código limpo de Robert Martin etc. Eles têm várias "regras" que permitem que você olhe seu código de maneira objetiva.
Depois de identificar qual é o problema, tente diferentes maneiras de corrigi-lo. Por exemplo, se a regra que você violou é "preferir composição a herança", altere-a para composição e veja como se sente.
Obviamente, pode ser útil ter outra pessoa olhando para o código, mas nem sempre é tão útil quanto você imagina, porque você está muito mais familiarizado com os tipos de problemas que o código causa do que qualquer outra pessoa e com os motivos por trás do design. . Aprender algumas maneiras de avaliar objetivamente seu próprio projeto renderá grandes dividendos.
fonte
Peça a outra pessoa que veja seu código. Se você não encontrar outra pessoa para vê-la, escreva uma descrição completa da interação como se fosse mostrá-la a outra pessoa. O processo de tentar explicar suas decisões para outra pessoa (mesmo que seja apenas para a prática) pode ajudá-lo a realmente pensar por que está fazendo as coisas de uma certa maneira e a ver quaisquer buracos em sua lógica.
fonte
Eu conheço essa situação muito bem. Quando fico assim, tento ter pontos de vista diferentes no projeto.
1.) Ponto de vista do usuário / cliente - use feedback
Infelizmente, estamos presos em nosso código de uma maneira que não conseguimos ver nossas próprias falhas, porque usamos nossos aplicativos da maneira que os codificamos. Veja como as pessoas o usam e tente descobrir qual seria a orientação mais intuitiva para o usuário. Brinque com protótipos de interface do usuário. Parece divertido, mas se você descobrir que seria forçado a recodificar grandes partes do seu código apenas alterando a lógica de uso, é hora de iniciar um ciclo de reprojeto.
2.) Faça uma análise funcional do seu código e visualize-o
Alguns IDEs e estruturas pressionam você para, por exemplo, misturar código da interface do usuário e back-end. Se você deixar isso acontecer, algum dia enfrentará a situação em que sua base de código dificilmente poderá ser mantida por causa de dependências nebulosas e difíceis de quebrar. Especialmente, misturar o código da interface do usuário com outro código pode levar ao código de espaguete e funcionalidade redundante. Divida seu código em blocos funcionais, como, por exemplo, classes de banco de dados, classes de comunicação, classes de interface do usuário, classes principais, etc. e forneça os nomes dos blocos de funções. Em seguida, visualize a funcionalidade com uma ferramenta gráfica (eu uso uma ferramenta de mapeamento mental) para descobrir se sua estrutura é lógica e modular o suficiente para que você possa reutilizar grandes blocos de código em diferentes projetos e possa substituí-los por versões mais novas sem grande dor.
A melhor maneira de fazer isso na minha experiência é criar um documento que visualize todas as dependências entre suas classes e as chamadas do código. O resultado é uma visualização do seu design de interface. Se esse mapa de código parecer um clusterf *** completo, é hora de agir. Se ainda não aconteceu, você deve pensar em uma convenção de nomenclatura adequada que represente sua estrutura de código de uma maneira que você não precise pensar em como chamá-la e o que ela faz.
3.) Use abordagens comuns para garantia de qualidade
O meu favorito é o FMEA. Em termos de codificação, isso significa não apenas analisar o que deu errado no passado, mas também pensar no que poderia dar errado. Um exemplo bastante comum é uma conexão de rede que caiu repentinamente. Depois de fazer isso, você pode classificar as condições de erro por consequências como perda de dados, falha, cálculo incorreto e avaliar o impacto no usuário. Se ainda não tiver sido definido, a definição de classes e rotinas simplificadas de erro e exceção pode ajudá-lo a manter seu código limpo e direto. A melhor maneira é implementá-los em cada nova paz de código antes mesmo de começar a escrever qualquer outra coisa. (Bem, sou culpado nem sempre de seguir esse conselho.)
Além disso, me ajudou a gerar e atualizar com freqüência uma "lista de propostas de melhoria" para meu próprio código. (Para ser sincero, ainda há muito código em meus projetos dos quais não tenho orgulho.) Também tento dedicar um tempo para coletar e dar uma olhada no código de práticas recomendadas de documentações da API, conferências de desenvolvedores ou revistas de desenvolvedores.
Até este ponto, não há necessidade de tocar no seu código. É simplesmente conhecer o que está acontecendo de errado e encontrar uma maneira de definir como melhorar seu código.
Finalmente, algumas dicas para o trabalho diário de um peido velho. Tente evitar morder mais do que você pode comer. Isso leva a muita pressão para uma codificação limpa. Você raramente tem tempo para fazer o que é certo, mas terá que reservar um tempo para corrigir as falhas posteriormente.
Nada é tão duradouro quanto a solução provisória, mas quando se rompe, muitas vezes é tarde para consertá-lo a tempo. Exemplos são hackers desagradáveis ou exceções estranhas que eu costumava fazer com que algo funcionasse, apesar de, por exemplo, uma falha na estrutura ou no sistema operacional subjacente. E então a falha é corrigida ou a nova versão simplesmente elimina a API ...
Se você estiver parado e forçado a encontrar uma solução alternativa, faça comentários e faça anotações que devem ser revisadas periodicamente. Normalmente ficamos cada vez melhores por aprender algo novo. Se você encontrar uma maneira melhor de implementá-lo o mais rápido possível. Caso contrário, você poderá codificar a solução alternativa para a solução alternativa e a exceção da exceção em um dia. (Aquele que está sem pecado entre vós, que me dê o primeiro byte.)
fonte
Não se preocupe com as pequenas coisas.
Todos poderiam codificar melhor. Fazemos as coisas rapidamente e, em seguida, percebemos algumas semanas depois que isso poderia ter sido feito com mais eficiência. O ponto é que 90% do seu código provavelmente é bom o suficiente.
Examine seus logs de bugs e encontre as rotinas que podem estar causando problemas. Ao encontrar os bugs, você também pode revisar o código e pensar no que pode tornar o código mais eficiente. Na maioria das vezes, você perceberá que, além de corrigir o erro, não será possível fazer uma melhoria notável, mas, às vezes, perceberá que há uma maneira melhor de fazer algo.
Converse com os usuários e veja onde eles estão percebendo problemas, UX ou velocidade. Corrija esses problemas, procurando melhorar seu código.
Em algum momento, você descobrirá que seu código se tornou muito frágil e que simplesmente não há como fazer as alterações necessárias. Em seguida, pense em como você poderia ter tornado o sistema mais flexível, por meio de APIs ou desenvolvimento orientado a testes. Em muitos casos, você descobrirá que pode simplesmente começar a inserir essas APIs no código, sem uma grande quantidade de alterações. Em outros casos, você perceberá que o esforço para melhorar o código não vale a pena.
Mudanças incrementais podem ser difíceis. O objetivo é não reescrever completamente a base de código, se você não precisar. Claro, você é um programador melhor agora do que era um ano atrás, mas o que você tem deve estar funcionando agora. Daqui a cinco anos, quando um programador júnior reclamar com você sobre o código legado que eles precisam tentar consertar, apenas sorria e acene com a cabeça, e não admita que você o escreveu.
fonte
Você já pensou em sair e encontrar uma empresa onde possa fazer parte de uma equipe? Sinto fortemente que, isolados ou em uma equipe estagnada, os desenvolvedores perdem muito o que a profissão tem a oferecer.
As revisões por pares permitem que alguém que já esteja fora de sua cabeça dê seu conselho. A Revisão do código do Stack Exchange pode ser um bom lugar para colocar algum código que não seja particularmente proprietário da sua empresa para revisão. Provavelmente, ele não pode lidar com grandes blocos, mas muitos programas são feitos de muito código simples e algum outro código que não é simples e cria muitos problemas. Se você tem um exemplo de código típico, mas é repetido e alterado em muitos lugares, também pode ser um bom candidato à revisão. Por exemplo, se você formatar mensagens, não peça para que todas as mensagens sejam revisadas, apenas uma mensagem de exemplo bastante complexa.
Se você deseja ser mais objetivo em relação ao seu próprio código, acho que você pode compará-lo a um padrão de codificação, executar verificadores de código estáticos ou dinâmicos nele ou, se você estiver escassamente documentado, adicionar comentários pode ajudar.
Existe uma psicologia de teste que dificulta o teste de seu próprio código, mas certamente fazemos o possível para fazê-lo durante o teste de unidade. A leitura do seu próprio código pode ser um problema semelhante ou pior. Muitos campos usam mentores, julgamentos competitivos, treinadores etc. Isso também acontece se você contar com arquitetos, engenheiros de sistema e testadores. Os clientes com acesso a uma ferramenta de relatório de erros ou ao departamento de suporte ao cliente fornecerão feedback de fora da sua cabeça assim que o produto for colocado em campo. Esse é outro ótimo motivo para a abordagem do Agile de lançar cedo e frequentemente. Você pode ser o único desenvolvedor da sua empresa, mas há pessoas afetadas pelo seu código que podem fornecer feedback sobre ele de algum ângulo.
fonte
"Esse é um problema menor do que eu penso, ou é um problema experimentado por outras pessoas também?"
Sheesh. Já basta. Se o código está em produção, sem erros e fazendo o que é suposto fazer, a arquitetura não é importante. Pelo menos por enquanto.
Todos nós esperamos aprender à medida que avançamos. Eu escrevi muitos códigos dos quais me orgulhava no momento em que escrevi, apenas para decidir que isso foi horrível um ano ou dois depois. No momento, estou trabalhando em um projeto plurianual repleto de código incrivelmente cruel, mas o código funciona. Estou adotando uma abordagem muito conservadora para tocar em algo.
E você também deveria. Se você não vê nenhum problema arquitetural importante no momento, depois de um ano de trabalho, acho que pode ser seguro você assumir, por enquanto, que não há problemas importantes. Isso não é um artesanato ruim. Está avançando.
fonte
Além de outras respostas, eu recomendaria ir a uma conferência de desenvolvedores.
Isso irá expor você a muitos tópicos e pessoas que farão você pensar em seu próprio aplicativo e local de trabalho. Especialmente porque eles falarão sobre o que funciona e não por enquanto, e os problemas que surgirem. Há uma grande probabilidade de que haja alguma sobreposição com seu aplicativo.
De preferência, leve 3 dias para isso. Eu descobri que isso é tempo suficiente para obter a distância mental necessária para o meu próprio trabalho e olhá-lo através dos olhos de uma comunidade maior (por assim dizer), e não do meu.
Aliás, isso também se aplica a equipes de pessoas, já que o pensamento de grupo pode acontecer em qualquer lugar.
Por fim, se você não obtiver aprovação para isso, diga uma vez por ano, troque de emprego.
fonte
Implemente código de modo que tudo o que o aplicativo precise seja configurável e mantenível
a re-arquitetura e a reimplementação do seu projeto resultarão definitivamente no aplicativo com melhor consistência, desempenho etc.
fonte
Acredito que 'chutando' as preocupações de algumas pessoas inteligentes ajuda. É preciso haver informações específicas. É o site 24x7x365? Aplicativo LoB? Onde está sendo executado ou hospedado?
Depois de atingir os objetivos principais e os resultados desejados, outros podem ajudar a concentrar e direcionar sua atenção. Seu código pode ser o melhor código já escrito para uma tarefa específica - ou a pior. Realmente não importa - como isso afeta o objetivo desejado?
fonte