A propriedade do código individual é importante? [fechadas]

48

Estou no meio de uma discussão com alguns colegas de trabalho sobre se a propriedade da equipe de toda a base de código é melhor do que a propriedade individual de seus componentes.

Sou um grande defensor de atribuir a cada membro da equipe uma parcela aproximadamente igual da base de código. Ele permite que as pessoas se orgulhem de sua criação, oferece aos analistas de erros um primeiro lugar óbvio para atribuir tickets recebidos e ajuda a aliviar a "síndrome da janela quebrada".

Ele também concentra o conhecimento de funcionalidades específicas com um (ou dois) membros da equipe, facilitando muito a correção de erros.

Acima de tudo, coloca a palavra final nas principais decisões com uma pessoa que tem muita contribuição em vez de com um comitê.

Não estou defendendo a solicitação de permissão se alguém quiser alterar seu código; talvez a revisão do código seja sempre do proprietário, com certeza. Também não estou sugerindo a construção de silos de conhecimento: não deve haver nada exclusivo sobre essa propriedade.

Mas, ao sugerir isso aos meus colegas de trabalho, recebi muitas críticas, certamente muito mais do que eu esperava.

Por isso, pergunto à comunidade: quais são suas opiniões sobre como trabalhar com uma equipe em uma grande base de código? Falta alguma coisa em manter vigilante a propriedade coletiva?

Jim Puls
fonte
O que é "síndrome da janela quebrada"? Não estou familiarizado com o termo.
uman
11
Síndrome da janela quebrada: en.wikipedia.org/wiki/Broken_windows_theory
Pemdas
11
"Também concentra o conhecimento de funcionalidades específicas com um (ou dois) membros da equipe" ... "Também não estou sugerindo a criação de silos de conhecimento". Isso não é uma contradição? Para mim, concentrar o conhecimento com um / dois membros é a definição de um silo de conhecimento.
sleske
Isso parece muito semelhante a outra pergunta que surgiu alguns anos depois.
Eric King

Respostas:

46

Acredito que a propriedade da equipe seja muito mais benéfica a longo prazo.

Você só precisa observar os dois cenários a seguir para entender por que concentrar o conhecimento em um número mínimo de pessoas é inferior ao ideal:

  • Membro da equipe encontra acidente infeliz
  • Membro da equipe encontra melhor oportunidade de emprego

Naturalmente, a pessoa / pessoas que escrevem seções específicas terão maior conhecimento disso, mas não cedem à tentação de torná-los o único silo de conhecimento. Os silos fornecerão vitórias de curto prazo por dores de longo prazo.

Só porque você não possui propriedade individual de seções do código, desde que a escreveu, não significa que você ainda não terá os aspectos de "orgulho em sua criação" etc. etc. Não acredito que ter propriedade de equipe seja muito diminuir qualquer sentimento pessoal de propriedade do código escrito.

Dan McGrath
fonte
7
De uma perspectiva OO, os dois cenários se tornam: "O membro da equipe não está por perto". A "melhor opção de emprego" não é apenas uma subclasse de "infeliz acidente?"
Dan Rosenstark
4
@Yar: sim, embora eu ache que você ainda possa pedir a alguém que encontre "emprego melhor" para voltar para ganhar mais dinheiro ... nenhuma quantia de dinheiro o trará de volta de um ônibus :-)
Dean Harding
4
Encorajo os desenvolvedores do meu grupo a pedir / emparelhar com o autor original dessa maneira, para obter a correção mais rápida dos erros, juntamente com alguma distribuição de conhecimento.
precisa saber é o seguinte
17
Você sabe, essa é uma daquelas coisas que são tão maravilhosas na teoria, mas que raramente funcionam na prática. É por causa da tragédia dos bens comuns. Se tudo é responsabilidade de todos, então nada é responsabilidade de alguém, porque qualquer coisa é responsabilidade de outra pessoa. Os psicólogos chamam de "vadiagem social". Você precisa de um equilíbrio de responsabilidade individual e responsabilidade da equipe.
Jason Baker
4
Eu argumentaria contra isso @ Jason. Se for o caso, você precisa de melhores funcionários, equipes menores. A pressão dos colegas deve ser capaz de manter isso sob controle, desde que a equipe não seja um monte de flocos. A propriedade da equipe não gera falta de responsabilidade individual.
Dan McGrath
27

Por fim, a equipe possui o código. Mas, por todos os motivos mencionados, designamos autores individuais para partes específicas do código. Cada autor tem responsabilidade primária por sua parte do código e responsabilidade secundária pela base de código como um todo.

Se um problema com uma parte da base do código surgir, tento voltar à pessoa que originalmente escreveu o código para uma correção. Obviamente, não há nada que impeça que outros membros da equipe apliquem uma correção; espera-se que todos os membros da equipe estejam familiarizados com o código de todos os outros. Mas sempre tentamos obter uma correção do autor original primeiro. Afinal, eles escreveram o código; eles são os mais familiarizados com isso.

Trabalhei em ambientes de equipe que, como as pessoas não sentiam um senso de propriedade no que escreviam, não eram obrigadas a escrever um código excelente, mas apenas um código médio.

Robert Harvey
fonte
5
+1 No que diz respeito à melhor qualidade do código devido a um senso de propriedade. Isso certamente existe.
Orbling
+1 (+10 se eu pudesse): a propriedade afeta a qualidade do código, não apenas porque dá uma sensação de orgulho e, com isso, uma motivação mais forte, mas também porque ajuda a gerenciar a complexidade do código, conforme explicado muito bem no ensaio "Mantendo um programa na cabeça", consulte paulgraham.com/head.html .
Giorgio
19

Embora eu concorde, do ponto de vista comercial, sobre os motivos para espalhar o conhecimento sobre o produto; A realidade é que um indivíduo concentrando seus esforços em uma determinada área de qualquer coisa, com o tempo, se tornará muito mais versado nessa área.

Ignorar isso é ignorar a ciência. Infelizmente, o cérebro é incapaz de reter tudo o que encontra. Ele lembra o que é válido e valioso em um determinado momento, mas mesmo esse armazenamento diminui com o tempo.

Eu tenderia a concordar com você que a propriedade de um módulo ou compartimento específico dentro da base de código maior geralmente produzirá melhores resultados. Alguém saindo sem aviso prévio impediria o sucesso? Certamente. Mas fingir que todos na equipe devem ter a mesma quantidade de conhecimento em relação à base de código é ingênuo e não faz nada para melhorar o código; ele tenta proteger o código. Proteger o código é o papel da empresa por razões óbvias. Os esforços que uma empresa fará para proteger o código geralmente podem se tornar prejudiciais da mesma forma.

Você não garante que todos os jogadores do seu time possam jogar quarterback, não é? Eu argumentaria que garantir que cada membro da equipe tenha uma participação na base de código é da mesma maneira que tentar fazer com que todos os jogadores de sua equipe joguem quarterback em um nível satisfatório ... isso não se soma. Você tem backups? Claro que sim ... mas os membros da equipe devem ter uma identidade dentro da equipe. Acreditar que todos são iguais é pedir dor de um tipo diferente ...

Aaron McIver
fonte
5
equipes profissionais têm zagueiros reserva
Steven A. Lowe
11
@ Steven eu já disse isso; mas obrigado por reiterar ... "Você tem backups? Claro que sim ... mas os membros da equipe devem ter uma identidade dentro da equipe. Acreditar que todo mundo é o mesmo é pedir uma dor de outro tipo."
Aaron McIver
As equipes da NFL têm três quarterbacks, e não jogadores treinados. Analogias esportivas raramente funcionam em TI ;-)
Steven A. Lowe
3
@ Steven Estou ciente de como a NFL funciona. Novamente, eu não disse que os backups não existem, mas tentar espalhar esse conhecimento por toda a equipe não faz sentido. Desenvolvedores == jogadores. Se quisermos introduzir títulos como quarterback == architect, poderíamos, mas tudo se resume a uma única equipe tentando alcançar um único objetivo. A cada semana, 45 jogadores se vestem e desses 45,6% 6,6% têm conhecimento sobre como operar a posição de zagueiro. Parece ideal para mim; contra a maioria desses posts que desejam que 75% da equipe tenha conhecimento sobre como operar a posição de zagueiro.
Aaron McIver
10

Não sei se a propriedade do código individual é uma boa ideia. Pelo menos não no sentido em que as pessoas possam dizer "Este é o meu código, e farei o que quiser com ele". Talvez seja melhor dizer que você deve ter um gerenciamento de código individual : o código deve pertencer à equipe, mas há uma pessoa em particular à qual a equipe delega responsabilidade e autoridade sobre ele.

A razão para isso é que, se é responsabilidade de todos, não é responsabilidade de ninguém.

Jason Baker
fonte
+1 para "O motivo disso é que, se é responsabilidade de todos, não é responsabilidade de ninguém".
Karthik Sreenivasan
@KarthikSreenivasan: Exatamente, e então alguns membros disfuncionais da equipe começarão (1) fazendo alterações aleatórias no código "porque toda a equipe possui o código" e (2) não corrigindo os erros que apresentam ", porque é responsabilidade de toda a equipe Consertá-los". Eu acho que a solução ideal em algum lugar entre propriedade individual e propriedade de equipe.
Giorgio
8

Eu defenderia a propriedade da equipe sobre o indivíduo pelos seguintes motivos:

  • Consistência do código em todo o projeto
  • Promove a discussão de código, o que sempre leva a soluções melhores e mais avaliadas
  • Se um membro da equipe estiver doente (ou pior), uma seção inteira do código não estará sujeita a atrasos
  • Os membros da equipe podem trabalhar em todas as partes do projeto, o que serve para tornar a revisão de código incorporada ao processo de desenvolvimento
morganpdx
fonte
6

A especialização é boa - para uma grande base de código, isso pode, a longo prazo, economizar bastante tempo de comunicação - mas a propriedade não é.

O que quero dizer é que a atitude deve ser a de que a equipe tenha um bug, e ninguém deve dizer que "oh, apenas X pode tocar nesse código, então não é problema meu". Se você faz parte da equipe, também é sua responsabilidade corrigir bugs em toda a base de código, se puder, e fazê-lo corretamente. A pessoa X pode ser a melhor opção para fazê-lo, mas deve-se esperar que alguém o faça se tiver que fazê-lo. Naturalmente, isso exige que o código seja escrito de uma maneira que permita e convide os membros da equipe a trabalhar com ele. Ter código gnarly proibirá isso, então lute por um código simples e claro, pois isso permite que a maioria dos desenvolvedores trabalhe com ele. Você pode optar pela revisão por pares para mantê- la assim.


fonte
5

Eu tenho que discordar de você: a propriedade da equipe de uma base de código é uma opção muito melhor do que a propriedade individual.

A desvantagem óbvia da propriedade individual é que, se algo acontecer com um funcionário (ser demitido, se aposentar, ficar doente, etc.), a menos que ele / ela tenha escrito um código realmente limpo, levará um tempo para que outra pessoa adote o nome dessa pessoa. código, especialmente se eles também tiverem que gerenciar seu próprio código.

Eles também são ferramentas demais que facilitam a propriedade da equipe. Revisões de código, controle de origem - são coisas que incentivam o envolvimento da equipe em toda a base de código. Além disso, como você atribui uma parte específica de uma base de código a apenas uma pessoa? Você acabou de dizer que somente essa pessoa pode modificar esse arquivo?

Por fim, acho que se uma parte de uma base de código quebrar, é muito fácil culpar a pessoa responsável por ela e isso causa mais problemas.

Saurabh Sharan
fonte
5

Eu acho que você precisa de ambos, porque há uma tensão entre as duas abordagens.

Se, para qualquer parte do código, existe apenas uma pessoa que pode trabalhar nela, isso é realmente ruim a longo prazo para a empresa, especialmente quando ela cresce, porque cada desenvolvedor se torna um ponto de falha. Por outro lado, a propriedade individual do código (espero) permite um tempo de entrega mais rápido, porque o desenvolvedor geralmente prefere essa abordagem (incentivo), porque o desenvolvedor conhece o código muito bem, etc ... Há também uma questão de tempo: deve ser possível realocar desenvolvedores em projetos específicos, dependendo das necessidades dos negócios, mas se você fizer isso diariamente, isso é horrível (apenas porque os desenvolvedores o odeiam, mas também porque o custo da troca é muito alto e você passa a maior parte do tempo nada).

Na IMO, uma função do gerente é encontrar um bom equilíbrio entre ambos. A revisão de código, os padrões de codificação e a padronização de um conjunto de ferramentas também devem ajudar a diminuir o problema de falha de impressão. Afinal, o ponto principal do código de manutenção é resolver esse problema.

David Cournapeau
fonte
4

Eu acho que a propriedade coletiva do código é incomparavelmente melhor do que a propriedade individual do código.

Não estou tão incomodado com o argumento do caminhão - em um modelo de propriedade individual, a perda de um proprietário é cara em termos de tempo necessário para que outra pessoa assuma o controle, mas o evento é raro o suficiente para que o custo amortizado seja baixo.

Em vez disso, acho que a propriedade coletiva do código leva diretamente ao código de alta qualidade. Isso ocorre por duas razões muito simples. Primeiro, porque a dolorosa verdade é que alguns de seus programadores não são tão bons quanto os outros e, se eles possuem um código, esse código será ruim; dar a seus melhores programadores acesso a ele melhorará. Em segundo lugar, revisão de código: se todo mundo possui o código, todos podem revisá-lo e melhorá-lo; até bons programadores escrevem código abaixo do normal se deixados para seus próprios dispositivos.

Digo isso com base na experiência do meu projeto atual. Nosso objetivo é praticar a propriedade coletiva, mas há algumas partes do sistema que se tornaram especializadas - eu e outro cara somos proprietários de fato do sistema de construção, por exemplo, há um cara que está fazendo a maior parte do trabalho nos feeds de dados recebidos , outro cara trabalhando na importação de imagens e assim por diante. Em várias dessas áreas (particularmente, devo confessar, na minha área!), A qualidade do código sofreu seriamente - existem erros, equívocos, críticas e hacks que simplesmente não sobreviveriam à atenção de outras pessoas da equipe.

Observo que você pode obter alguns dos benefícios da propriedade coletiva do código, possuindo propriedade individual do código, onde a propriedade de um determinado pedaço de código se move entre diferentes programadores regularmente (digamos, a cada três meses ou a cada release - talvez até a cada iteração?) . Um equivalente de programação da rotação de culturas. Isso pode ser divertido. Eu não vou tentar eu mesmo, no entanto.

Tom Anderson
fonte
1

Não acho que a propriedade do código da equipe seja tão importante quanto fazer com que vários colaboradores entendam a arquitetura básica dos subsistemas predominantes.

Por exemplo, temos alguns membros de nossa equipe que criam páginas administrativas da Web para nossos produtos de servidor. Criamos um mecanismo de script personalizado do lado do servidor para que pudéssemos chamar funções C essenciais no servidor diretamente de nossos scripts java ou html. Eu acho que é mais importante que nossa equipe da "web" entenda como usar esse mecanismo, em vez de ser co-proprietária de aplicativos de páginas da web uns dos outros.

Pemdas
fonte
0

Acho que você assume a propriedade individual do código no momento em que o escreve e depois o entrega para a equipe. Dessa forma, todos assumem a responsabilidade e contribuem. Todos devem querer corrigir uma falha de codificação que eles criaram. Juntamente com uma revisão de código, isso cria padrões mais altos. Ninguém quer o trabalho de limpar os outros.

Pense em mais responsabilidade e menos propriedade. Afinal, quem está escrevendo os cheques é o verdadeiro proprietário de qualquer maneira.

JeffO
fonte
0

Jim, estou com você nesse 100%. Estou no meio da mesma batalha no meu local de trabalho - e foi por isso que me deparei com sua pergunta.

O que eu vejo é: "quando todo mundo é dono, ninguém é dono".

Para mim, não há um fator mais importante para codificar a qualidade do que propriedade e responsabilidade.

Exemplo da vida real ilustra bem isso. com o qual você cuidaria melhor: seu gramado particular ou o parque da comunidade? Muito obvio.

A propósito, isso não precisa necessariamente ser trocado por "flexibilidade de equipe". Significa apenas que, quando uma pessoa é dona de uma coisa, ela deve - e apenas pelo dia.

acohen
fonte
0

Para mim, depende da dinâmica da sua equipe.

Por exemplo, se você possui uma equipe que não é unificada por padrões, revisão por pares, testes metódicos ou se possui uma equipe em que os níveis de competência variam muito entre os membros, convém procurar uma noção mais forte de propriedade do código com uma mentalidade modular mais caixa preta.

Na falta disso, por exemplo, sua interface cuidadosamente projetada, em conformidade com os princípios do SOLID, pode ser rapidamente arruinada por alguém que nem sabe "SOLID" significa e deseja adicionar novas funções ecléticas o tempo todo à interface para "conveniência", por exemplo, Este é, de longe, o pior.

Você também pode lidar com colegas de trabalho desleixados, cuja idéia de corrigir um bug é corrigir o sintoma sem entender o problema raiz (por exemplo: tentar responder a um relatório de falha, basta colocar soluções alternativas no código apenas para ocultar o bug e transferir os mortais efeitos colaterais para outra pessoa). Nesse caso, não é tão ruim quanto sabotar o design da interface e você pode proteger suas intenções com testes de unidade cuidadosamente construídos.

A solução ideal é fortalecer sua equipe até um ponto em que essa noção de autoria e propriedade não se torne mais tão importante. A revisão por pares não é apenas para melhorar a qualidade do código, mas também para melhorar o trabalho em equipe. Os padrões não são apenas consistência, eles melhoram o trabalho em equipe.

No entanto, existem cenários em que a revisão por pares e realmente fazer com que todos estejam em conformidade com um padrão são simplesmente inúteis e trarão muitos críticos irremediavelmente inexperientes para a mistura. Eu diria que se a propriedade do código ou da equipe tem uma prioridade mais forte se baseará na capacidade da sua equipe de realizar uma revisão por pares eficaz e deixar todos saindo como se beneficiassem dela (ambos em termos da própria revisão) e se aproximando mais em termos de mentalidade e padrões). Em equipes grandes, soltas e / ou díspares, isso pode parecer inútil. Se sua equipe pode funcionar como um "esquadrão", onde você mal consegue dizer quem escreveu o quê, a propriedade exclusiva começará a parecer uma noção boba.

Nesse tipo de cenário longe do ideal, essa noção de propriedade do código pode realmente ajudar. Ele está tentando resolver o pior cenário possível, mas pode ajudar se o trabalho em equipe geralmente não for possível para impedir o código de um autor. Nesse caso, está diminuindo o trabalho em equipe, mas isso pode ser melhor se o "trabalho em equipe" apenas levar ao passo do pé.


fonte