A propriedade do código é um cheiro de código?


27

Isso é algo em que estou pensando desde que li esta resposta no controverso tópico de opiniões sobre programação :

Seu trabalho é sair do trabalho.

Quando você está escrevendo um software para o seu empregador, qualquer software que você criar deve ser escrito de tal maneira que possa ser adquirido por qualquer desenvolvedor e entendido com um esforço mínimo. Ele é bem projetado, escrito de forma clara e consistente, formatado de forma limpa, documentado onde precisa estar, compilado diariamente conforme o esperado, verificado no repositório e com a versão apropriada.

Se você for atropelado por um ônibus , demitido, demitido ou sair do emprego, seu empregador poderá substituí-lo a qualquer momento, e o próximo funcionário poderá assumir seu papel, pegar seu código e ser correndo dentro de uma semana no máximo. Se ele ou ela não puder fazer isso, você falhou miseravelmente.

Curiosamente, descobri que esse objetivo me tornou mais valioso para meus empregadores. Quanto mais eu me esforço para ser descartável, mais valioso me torno para eles.

E isso já foi discutido um pouco em outras questões, como essa , mas eu queria trazê-lo novamente para discutir de um ponto em branco " é um cheiro de código !! " do ponto de vista - que realmente não foi coberto em profundidade ainda.

Sou desenvolvedor profissional há dez anos. Eu tive um trabalho em que o código foi bem escrito o suficiente para ser captado relativamente rapidamente por qualquer novo desenvolvedor decente, mas na maioria dos casos na indústria, parece que um nível muito alto de propriedade (propriedade individual e de equipe) é o norma. A maioria das bases de código parece não ter a documentação, o processo e a "abertura" que permitiriam a um novo desenvolvedor buscá-las e trabalhar com elas rapidamente. Sempre parece haver muitos pequenos truques não escritos e hacks que apenas alguém que conhece muito bem o código base (o "possui") saberia.

Obviamente, o problema óbvio disso é: e se a pessoa sair ou "for atropelada por um ônibus"? Ou no nível da equipe: e se toda a equipe sofrer intoxicação alimentar quando sair para o almoço da equipe e morrerem? Você seria capaz de substituir a equipe por um novo conjunto de novos desenvolvedores aleatórios de maneira relativamente indolor? - Em vários dos meus empregos anteriores, não consigo imaginar isso acontecendo. Os sistemas estavam tão cheios de truques e hacks que você " apenas precisa saber ", que qualquer nova equipe contratada levaria muito mais tempo que o ciclo de negócios lucrativo (por exemplo, novos lançamentos estáveis) para fazer as coisas funcionarem novamente. Em resumo, não ficaria surpreso se o produto tivesse que ser abandonado.

Obviamente, perder uma equipe inteira ao mesmo tempo seria muito raro. Mas acho que há uma coisa mais sutil e sinistra em tudo isso - que é o ponto que me levou a pensar em iniciar esse tópico, pois não o vi discutido nesses termos antes. Basicamente: acho que uma grande necessidade de propriedade do código é muitas vezes um indicador de dívida técnica . Se houver uma falta de processo, comunicação, bom design, muitos pequenos truques e hacks no sistema que você "apenas precisa saber", etc. - geralmente isso significa que o sistema está se endividando progressivamente cada vez mais.

Mas o fato é que a propriedade do código geralmente é apresentada como uma espécie de "lealdade" a um projeto e empresa, como uma forma positiva de "assumir a responsabilidade" pelo seu trabalho - por isso é impopular condená-la completamente. Mas, ao mesmo tempo, o lado da dívida técnica da equação geralmente significa que a base de código está ficando progressivamente menos aberta e mais difícil de trabalhar. E, especialmente, à medida que as pessoas seguem em frente e os novos desenvolvedores precisam tomar seu lugar, o custo da dívida técnica (ou seja, manutenção) começa a subir.

Então, em certo sentido, acho que seria uma coisa boa para nossa profissão se um alto nível de necessidade de propriedade de código fosse visto abertamente como um cheiro de trabalho (na imaginação popular do programador). Em vez de ser visto como "assumindo responsabilidade e orgulho" no trabalho, deveria ser visto mais como "entrincheirando-se e criando segurança artificial no emprego por meio de dívidas técnicas".

E acho que o teste (experimento mental) deveria ser basicamente: e se a pessoa (ou mesmo toda a equipe) desaparecesse da face da Terra amanhã. Isso seria um ferimento gigantesco - possivelmente fatal - para o projeto, ou poderíamos atrair novas pessoas, levá-las a ler os documentos e arquivos de ajuda e brincar com o código por alguns dias - e depois voltar para negócios em algumas semanas (e voltando à produtividade total em mais ou menos um mês)?


3
Qual a sua pergunta? Além disso, o que é "cheiro de código"?
CamelBlues

2
@CamelBlues: "O cheiro do código é qualquer sintoma no código fonte de um programa que possivelmente indica um problema mais profundo." (Wikipedia) Veja esta pesquisa para algumas das muitas perguntas neste site sobre cheiros de código.
Carson63000

4
A propriedade do código não é resultado do cheiro do código, não é que a propriedade do código seja um cheiro de código? Eu acho que essa ainda é a mesma pergunta que as outras, incluindo esta: programmers.stackexchange.com/questions/48697/…
Rei Miyasaka

1
Para mim, "assumindo a responsabilidade / propriedade"! = "Propriedade do código", recentemente tive uma discussão com um gerente de que a propriedade do código era um pouco ruim e que não era a mesma coisa que permitir que as pessoas renunciassem à responsabilidade. Para esse gerente, a propriedade do código significava o mesmo que ser responsável.
Thomas James

1
Sim, nunca assumi a propriedade do código como o que este Q parece defini-lo. Tomar posse de mim significa que o cara que está me substituindo depois da coisa horrível do ônibus pode ler meu código porque eu me orgulhava como se fosse meu bebê pessoal.
precisa

Respostas:


32

Acho que devemos fazer a diferença entre a propriedade do código:

  • do ponto de vista da responsabilidade,
  • do ponto de vista do estilo de código / hacks etc.

O primeiro deve ser encorajado. Se ninguém for responsável por códigos e bugs de baixa qualidade, coisas ruins acontecerão . Isso não significa que o bug relacionado ao seu próprio código deve ser atribuído a você sempre: se o código for escrito corretamente, qualquer pessoa poderá corrigi-lo em qualquer parte do código. Mas se você não tiver nenhum comentário sobre os erros que você faz, você produzirá os mesmos erros repetidamente .

A propriedade do código pode ajudar muito os gerentes e os desenvolvedores, especialmente os desenvolvedores. Se eu souber que 80% dos bugs no produto estavam no meu código enquanto éramos três desenvolvedores trabalhando no projeto, e que 75% desses bugs estavam relacionados à injeção de SQL, seria mais cuidadoso ao escrever código da próxima vez, e faça um esforço extra para escrever corretamente as consultas ao banco de dados.


O segundo (propriedade do código do estilo do código / hacks, etc.) é principalmente uma coisa ruim. O que isso traz para o produto? Não aumenta a qualidade do produto, mas diminui a uniformidade do código-fonte e dificulta sua manutenção ultimamente .

Para muitos projetos grandes, as pessoas não ficam a vida toda trabalhando no mesmo pedaço de código. E aqui, eu nem falo sobre coisas horríveis, como o desenvolvedor sendo atropelado por um ônibus: não acho que a propriedade do código seja a primeira preocupação neste caso. Mas muitas coisas pequenas acontecem: as pessoas migram do desenvolvimento para o gerenciamento ou para outros trabalhos, ou escolhem outros projetos, ou trabalham em outras coisas, ou começam a usar outro idioma (se vários idiomas forem usados ​​em um projeto), etc.

Uma parte do código de um projeto também pode ser reutilizada em outro projeto, e o desenvolvedor que trabalha nesse outro projeto gostaria de modificar algumas partes do código para atender às novas necessidades, sem pedir orientação ao ex-escritor do código.

É um cheiro de código? Bem, depende do que você quer dizer com cheiro de código. Para mim, é tudo sobre a coerência geral do projeto e o gerenciamento correto . Em um bom projeto,

  • as diretrizes de estilo de código são aplicadas para ajudar a entender o código mais facilmente mais tarde,
  • desenvolvedores mais experientes não violam o princípio do KISS, ajudando assim o entendimento do código fonte posteriormente pelos colegas menos experientes.

Para concluir, a propriedade do código deve ser rastreada por meio do controle de versão, mas você não deve poder dizer que um pedaço de código foi escrito por você ou outra pessoa em uma equipe .


9

Primeiro, precisamos definir o que é "propriedade do código".


Quando uma parte (parte) do código está no processo inicial de desenvolvimento, geralmente é necessário designar uma ou duas pessoas como "proprietários" porque:

  • No início, não há especificações ou requisitos claros, e os desenvolvedores precisarão coletar informações por conta própria. Há um intervalo de tempo entre a coleta e a documentação desses achados.
  • Evite edições conflitantes quando o trecho de código estiver sendo modificado ativamente.
  • O "proprietário (s)" é a pessoa que pode relatar o progresso do desenvolvimento do recurso.

Normalmente, há um único proprietário para cada tarefa. Proprietários duplos são possíveis com a programação em pares. Não seria prático fazê-lo sem nenhuma "propriedade de código" designada de forma restrita.

Nota:
Consulte a resposta do @ MainMa para outros problemas durante o desenvolvimento. Nesses casos, "propriedade do código" é um sintoma de problemas maiores, ou seja: escolha subótima da arquitetura, inconsistência no estilo de codificação e geralmente falta de qualidade do código.


Depois que uma peça é escrita e aceita na base de código ("pronto"), a pergunta mais geral sobre "propriedade do código" é exibida.

  • Quem é o especialista que pode responder a todas as perguntas sobre esse trecho de código / essa parte da funcionalidade?
  • Esse conhecimento foi capturado em artefatos tangíveis, como documento de requisitos, testes de unidade, testes de aceitação, logs de alterações, wiki do projeto etc.?

Sempre haverá alguma parte do conhecimento do domínio (entendimento tácito dos requisitos dos clientes, problemas de compatibilidade com sistemas misteriosos etc.) que são difíceis de formalizar em especificações escritas. Portanto, quando há um evento de calamidade, é necessário esperar alguma perda de conhecimento do domínio.

Juntamente com a perda de conhecimento do domínio, você também perderá os respondentes especializados que podem explicar os detalhes do sistema. Nesse aspecto, a perda do especialista é uma coisa universalmente ruim. O conhecimento deveria ter sido capturado anteriormente.

Isso não significa que a existência de "especialistas" seja ruim: considere os especialistas como um "cache" do conhecimento escrito. Os especialistas costumam responder a perguntas mais rapidamente do que procurar e digerir o conhecimento escrito.


No entanto, às vezes "propriedade do código" refere-se a barreiras estabelecidas pelos desenvolvedores ativos de um projeto para impedir que terceiros modifiquem o código.

  • Quem pode fazer alterações neste pedaço de código?
    • Para corrigir erros óbvios?
    • Para fazer o código satisfazer alguns outros requisitos?
    • Reescrever completamente o código a seu gosto?

Existem boas e más barreiras:

  • Boas barreiras
    • Conhecimento de domínio - quão bem você entende os requisitos e o estilo de arquitetura / codificação
    • Habilidade de programação e design - você tem as habilidades necessárias para melhorar o design e a qualidade do código do projeto
  • Barreiras ruins
    • Você não estava na equipe de desenvolvedores original, portanto não tem permissão para fazer alterações.
    • Somente correções são bem-vindas. Aprimoramentos de recursos não são bem-vindos.

Nesse caso, o privilégio de editar o código-fonte de outro projeto não deve se basear na propriedade do código, mas deve ser baseado no mérito.


Por fim, a resposta de @Graham Lee aponta para a fragmentação do conhecimento e da arquitetura causada pela departamentalização.

Nesse caso, "propriedade do código" é um dos sintomas da departamentalização. Um segundo sintoma é a "falta de interesse nos projetos de outras equipes". Como organização, os gerentes precisarão tomar medidas para incentivar a transferência de conhecimento e a colaboração entre equipes e departamentos.


7

Mais insidiosamente, algumas empresas (trabalhei em uma) organizam sua estrutura de gerenciamento em torno de equipes funcionais: você gerencia os desenvolvedores de clientes do Windows, ela gerencia a equipe do instalador, ele gerencia os desenvolvedores de back-end e assim por diante. Isso não apenas leva à forte propriedade do código que você descreve, como a consagra à maneira como os negócios funcionam. Transforma a arquitetura de software em uma briga política.

Isso é um problema? É se a arquitetura é ou se torna subótima. É impossível dizer (por exemplo) que o instalador funcionaria melhor ou seria mais barato de desenvolver se fosse apenas um caso de uso do cliente, porque isso está tirando o controle de uma equipe e de seu gerente. As divisões entre os módulos funcionais tornaram-se fatos sobre a forma como o departamento de engenharia é executado, e é preciso muita agitação para alterar esses fatos.

[No caso de a discussão acima não esclarecer, minha resposta para sua pergunta é sim. A propriedade do código é um cheiro de código, porque pode impedir que pessoas inteligentes com boas idéias - ou mesmo apenas pessoas que estão disponíveis quando você precisar delas - trabalhem no código. Obviamente, ter controles para interromper mudanças caprichosas é uma coisa boa, mas se você tem um engenheiro que pode ver como consertar um bug e tem tempo para fazê-lo, não deve bloqueá-lo apenas porque outra pessoa escreveu o código do buggy. ]


6

Resolvendo sua pergunta de um ponto de vista um pouco diferente, a propriedade do código NÃO é um cheiro de código. Em vez disso, é um cheiro de gerenciamento e recursos .

Pense no significado de um cheiro de código. É uma metáfora que diz quando você olha para o seu código, que algo não está certo com o código e / ou o design do software, mas o problema pode não ser tão óbvio que consiga identificar o que o problema exato pode ser, mas você provavelmente já teve uma boa ideia. Em sua casa, se algo cheira mal, você segue seu nariz até localizar a fonte do problema e depois faz algo a respeito. Da mesma forma, se o código tiver um problema, você o investiga e o altera até que se torne um problema menor ou, como alguns podem dizer, bonito ou bem trabalhado .

A propriedade do código, por outro lado, pode ser um problema sério. Ele sugere uma falta de supervisão e um risco de que, se o proprietário do código sair, esse conhecimento sobre o código e os problemas específicos que ele resolver não estarão mais disponíveis para a empresa. Isso não tem nada a ver com o próprio código. Basicamente, isso se resume a uma situação de gerenciamento de riscos da mesma maneira que nos leva a manter backups de nossos dados e se aplica igualmente à propriedade de tarefas ou propriedade de documentos em outras áreas da empresa.

Eu acho que é bom descrever outros problemas de negócios como cheiros , mas certamente não implica que apenas porque há um cheiro , isso tenha a ver especificamente com o código.


1

Defino a propriedade do código como a responsabilidade pessoal pelo código que você escreve, com o entendimento de que outras pessoas trabalharão no seu código no futuro . Se você pensar nas coisas dessa maneira, será menos provável que você escreva um hack porque a) os erros nesse módulo podem ser rastreados até você eb) os membros da equipe provavelmente terão dificuldade em modificar o código no futuro .

Escrevi um post sobre isso há vários meses, em que argumentei que, sem a propriedade do código, como eu a defino, uma base de código geralmente é vítima da Tragédia dos Comuns .

Pela sua definição de propriedade do código, concordo que é ruim ter um código no qual apenas o autor possa trabalhar.


Soa mais como "acompanhamento de código" ou "sessão de código (a la baby-sitting)". Eu concordo com tudo na sua resposta.
MAWG
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.