Fabricação vs Desenvolvimento de software [fechado]


10

Costuma-se dizer que a indústria de software é imatura em comparação à manufatura. Especificamente no que diz respeito à condução do processo.

Pergunta : Como desenvolvedores, podemos aprender com os processos da indústria de transformação? A adoção de seus processos pode aumentar a taxa de sucesso do desenvolvimento de software?

Minha opinião : na fabricação, a criação de um produto é fortemente orientada por processos. Você pode ter uma fábrica onde cada pessoa tem um conjunto específico de tarefas que segue. Um trabalhador (ou robô) pode apertar um parafuso o dia todo. Em seguida, a próxima tarefa do processo é executada pelo próximo especialista. Os trabalhadores (e robôs) não se intimidam com o processo ou inventam algo "on the fly". As peças agitam durante o processo e a saída é um produto acabado. Funciona bem e as empresas alcançam 99,99966% de produtos sem defeitos. As empresas resolvem ineficiências ao longo do tempo. Isso é impressionante e muito bem pode ser o sinal de uma indústria madura.

Na fabricação, um processo definido pode literalmente criar o produto final. Eu não acho que esse seja o caso em software. Podemos ter processos para controle de origem, revisão de código, folhas de check-in, coleta de requisitos, SDLC, etc. Mas a execução desses processos não cria, por si só, um produto acabado. Esses processos podem ser benéficos, mas são ortogonais à criação real.

Suponha que sua empresa seja contratada para criar um software que procurará milhões de imagens para encontrar o rosto de um criminoso. Apesar do ambiente pesado do processo, o desenvolvedor deve se engajar na criação de coisas "on the fly". Fazer as coisas rapidamente é contra o espírito da manufatura. Um bom processo de fabricação pode ser executado sem pensar por um robô.

Para a criação de algoritmos complexos que ainda precisam ser compreendidos na mente de um humano, é necessário criar coisas em tempo real. O desenvolvimento de software não é o seguinte de um processo, mas a criação de um processo a ser exucuído por um computador. Essa é uma diferença fundamental. Não importa quantos processos ortogonais montamos em torno do desenvolvimento, sempre recorreremos a fazê-lo "on the fly" quando se trata de criação.

Todos com quem falo parecem concordar com a mentalidade de fabricação. Estou sozinho em meus pensamentos?


11
FYI: O que me motivou a fazer essa pergunta foi um livro do CMMI. Ele comparou a criação de software à fabricação e concluiu o Soft.Ind. era imaturo.
Lord Tydus

3
Eu diria que uma analogia mais precisa no mesmo campo seria a engenharia envolvida no projeto e instalação da sua fábrica. É aí que os bits criativos / difíceis acontecem. O resto são apenas porcas e parafusos, assim como para nós o resto é apenas 1s e 0s.
21911 Benjol

11
A engenharia de software não se compara à fabricação. Ele se compara ao artesanato. Isso não pode ser reduzido a um processo industrial.
Mouviciel

11
Há uma razão pela qual é chamado de desenvolvimento de software . Não fabricação de software . Pense em desenvolvimento de produtos versus fabricação de produtos.
9119

Os japoneses não tentaram exatamente isso: criar software em um processo mais voltado para a fabricação de bens físicos? Pelo que me lembro, é amplamente considerado um fracasso completo e absoluto, embora, é claro, haja alguns títulos de software desenvolvidos com sucesso no Japão (tente Sonic the Hedgehog, por exemplo).
um CVn

Respostas:


36

A diferença fundamental entre desenvolvimento e fabricação de software é que, para o software, a fase de design é praticamente a coisa toda. A produção real (parte da linha de montagem na fabricação tradicional) é uma questão de copiar alguns arquivos. No software, o design do produto é o produto.

Portanto, sim, podemos aprender com os processos de manufatura, mas somente se tivermos em mente que precisamos observar a fase de design, não a fase de produção, e que muitos processos de manufatura são criados para lidar com as limitações específicas de uma cadeia de produção cara , que simplesmente não se aplica ao software.

Um exemplo de modelo de processo que funciona muito bem em software, mas geralmente falha de maneira terrível no design de produtos, é o design iterativo - você começa com um protótipo mínimo e adiciona recursos a cada iteração. Construir um carro protótipo para ver como é o novo design do botão da janela traseira é ridículo, mas no software faz sentido (basta pressionar F5 e esperar alguns segundos - pronto, pronto para testar).

Se olharmos para os processos de design do produto, os melhores setores para se olhar se enquadram em duas categorias:

  • aqueles onde a produção pode ser realizada a taxas de commodities; por exemplo, a indústria fonográfica (1% ou menos do preço de um CD é de panificação e impressão), mídia gráfica etc.
  • aqueles em que as quantidades são tão baixas que a fase de design é o fator de custo mais importante (artigos de luxo, produtos altamente personalizados, nichos de mercado ...)

É um erro fundamental tentar aplicar processos da fabricação física ao desenvolvimento de software: o desenvolvimento de software não é repetitivo (se você estiver no seu trabalho, procure outro emprego), é apenas parcialmente previsível, existem apenas poucas limitações físicas ( velocidade de hardware sendo uma) e a abordagem adotada e os resultados podem ser altamente pessoais. A aplicação das filosofias da linha de montagem ao que é basicamente uma questão de pensamento analítico e criativo pode (e costuma ter) ter efeitos devastadores.


2
Ótima resposta. No desenvolvimento de software, tudo é um protótipo!
James Anderson

11
É um bom ponto, mas acho que o aspecto do design é exagerado. Você ouve números como "60% do custo do software é manutenção" e "os últimos 10% de um projeto de software levam muito mais que 10% da programação". Os números não importam tanto quanto a idéia aqui, e a manutenção e o polimento acontecem bem após a finalização do design. O design é sem dúvida um aspecto significativo do produto, mas também é sem dúvida a parte mais fácil e barata.
Caleb

3
@Caleb: Exceto pela manutenção, especialmente para um produto bem projetado, não se trata principalmente de corrigir bugs no produto atual, mas de adicionar recursos, ou seja, adicionar e alterar o design.
Marjan Venema

@ Caleb - isso provavelmente se aplica também à criação de uma linha de produção e de processos de produção. A configuração da linha de produção é um dos aspectos mais caros e demorados do processo de fabricação.
James Anderson

2
@ Caleb: Eu acho que você não entendeu minha analogia aqui. Quando estou falando sobre 'design', estou falando sobre design de produto, ou seja, o processo que precede o início da linha de montagem. As fases de design e implementação de um produto de software são "design" nesse sentido, enquanto a parte de fabricação é reduzida ao upload de binários em um servidor ou à instalação de DVD-ROMs para envio. Como programador, tudo o que você entrega é um protótipo; então tudo o que você faz, incluindo o trabalho de manutenção, é 'design' na analogia tradicional da cadeia de produção.
tdammers

10

Se você quiser escrever o mesmo software exato repetidamente (em vez de simplesmente copiá-lo), poderá fazê-lo com muita eficiência por meio de uma linha de montagem.

Mas a criação de software não é uma tarefa repetitiva, cada módulo é uniqe. É por isso que a comparação com a fabricação é inválida.


Tirar lições da manufatura não significa construir uma linha de montagem de software. A manufatura tem muito a dizer sobre a melhoria do processo, e há muito no processo de desenvolvimento de software que poderia melhorar.
Caleb

@Caleb: Que lições você quer dizer então? Foi exatamente o que pensei que você quis dizer.
sevenseacat

11
@ Karpie, a melhoria do processo pode acontecer mesmo quando você está produzindo coisas que não são idênticas. Quantos bugs escrevemos este mês? Mês passado? Dois meses atrás? Se esse número mudar significativamente de um mês para o outro, você deve descobrir o motivo. Esse é o tipo de coisa que funciona para qualquer processo, esteja você produzindo widgets idênticos em uma linha de montagem ou longas-metragens em um processo altamente criativo.
Caleb

2

Eu acho que a resposta que você está procurando é aplicável ou realista aqui. O que eu sinto que você quer saber é como podemos configurar nossos processos para se parecerem mais com a indústria de transformação. Em vez disso, penso que a verdadeira questão se torna "Saber o que a manufatura e outras indústrias fazem para criar produtos de qualidade, o que podemos aprender?" ou "O que a indústria de software pode fazer para melhorar a qualidade?"

Infelizmente, a resposta para isso não é clara, porque a própria indústria de software ainda não sabe a resposta. Para poder responder a isso, a indústria de software precisa fazer pesquisas sobre o que funciona e por quê? Por exemplo, houve estudos que mostram que o Test Drive Design (TDD) leva a uma melhoria na qualidade. Embora a questão da produtividade ainda pareça não respondida ou pelo menos ainda não completamente esclarecida. Na medida em que as evidências mostram até agora:

  • As análises de código são excelentes e são mostradas para encontrar o maior número de erros, mas a eficácia de uma análise diminui bastante após a primeira hora de análise. Dado que a pessoa comum só pode ler algumas centenas de linhas de código por hora, isso sugere que os desenvolvedores devem dividir as alterações em partes menores.
  • Quanto mais tempo demorar para encontrar um bug, mais caro (tempo e dinheiro) será corrigido. Portanto, se um desenvolvedor o encontrar enquanto escreve o código, dizemos que o custo é 1. Se um unittest o encontrar mais tarde, o custo será 10, se a EVT achar que o custo é 100 e assim por diante.
  • Há alguma evidência que sugere que, quanto mais complexos são os requisitos, mais complexa é a solução e mais complexa é a solução, maior a probabilidade de haver erros.

Há um homem chamado Greg Wilson que deu uma excelente conversa sobre isso há alguns anos atrás. Aqui está um link para a palestra: Greg Wilson Talk

Além disso, eu diria que lembre-se de seu próprio trabalho e encontre os temas com os tipos de erros que você introduz, bem como com quais partes você luta. Compile esses resultados e crie uma lista de verificação para inserir em seu processo em locais diferentes para ajudá-lo a fazer um trabalho melhor. Pessoalmente, olhei para os últimos anos do meu trabalho e descobri que existem alguns temas comuns para os problemas que apresento. Especificamente, descobri que

  • Não me lembro com frequência de criar todas as variantes que me levaram a quebrar a compilação.
  • Muitas vezes, não penso no seguinte para cada alteração. O caso bom, o caso ruim e os casos excepcionais.
  • Todos os cenários possíveis que podem acontecer. Observe que isso é realmente difícil, porque existem muitos deles.

Desde que encontrei alguns temas para meus erros, criei listas de verificação que eu uso automaticamente, devido à inserção deles nos meus scripts, que me ajudam a solucionar esses problemas. Havia um livro escrito sobre essa chamada, o "Manifesto da lista de verificação", que detalha como eles podem ser utilizados. Pessoalmente, achei muito perspicaz.


2

Não se trata de adotar "seus" processos. Trata-se de adotar "alguns" processos, que não têm os prejuízos usuais e bem apreciados do uso de processos de linha de montagem para empreendimentos criativos. O mais importante a ser observado aqui é a ideia de que a qualidade dos processos se traduz diretamente na qualidade do produto.

Os melhores processos ou produtos para esse assunto são os que se encaixam no cenário de uso pretendido, como uma mão na luva. O que se deve pensar é que a parte real da escrita de código é a única que, pelo menos em nível macroscópico, não é repetitiva. Todas as outras facetas, como controle de versão, rastreamento de bugs, planejamento, estimativas, medições, etc. são, e o uso de um processo padrão, personalizado e comprovado pode ajudá-lo, pelo menos nessas áreas.

Portanto, não, o processo de desenvolvimento de software não pode ser comparado à produção da linha de montagem e, como tal, "seus processos" não são bons, mas a fase de design de produção / design de produto do produto em uma indústria de fabricação pode ser a única a se inspirar.


1

Pergunta: Como desenvolvedores, podemos aprender com os processos da indústria de transformação? A adoção de seus processos pode aumentar a taxa de sucesso do desenvolvimento de software?

Resposta: Sim, claro. Há muitas lições que os desenvolvedores de software podem aprender com a fabricação, apesar de o desenvolvimento de software ser um processo criativo. O desenvolvimento de software é, por si só, um processo e inclui muitos outros processos. Quanto melhor você definir e controlar esses processos, melhor poderá controlar o processo de desenvolvimento de software em geral. Isso não significa que você deve prescrever todas as teclas digitadas por um desenvolvedor; significa apenas que, como desenvolvedor, você naturalmente executa tarefas em uma determinada ordem, e essas tarefas geralmente podem ser gerenciadas. aqui estão alguns exemplos:

  • rastreamento de defeitos: quando um erro é observado ou relatado, o que acontece com ele? Você o escreve em um pedaço de papel e o cola em uma ponta de 'investigação'? Mais tarde, você remove esses restos, um de cada vez, os investiga e, eventualmente, os move para o pico "resolvido"? Se você fizer isso sem falhas toda vez que receber um relatório de bug, terá um processo mensurado e bem definido, e provavelmente estará muito melhor do que alguém que tenha um sofisticado sistema de rastreamento de defeitos de alta tecnologia que é tão oneroso que alguns membros da equipe rastreiam os erros de outras maneiras, ou de modo algum.

  • controle de versão: existe uma boa chance de você usar o controle de versão onde trabalha e, obviamente, o controle de versão é muito mais útil quando todos usam da mesma maneira.

  • design do produto: você decide quais recursos implementar lançando dardos em uma parede coberta com post-its? Nesse caso, você tem um processo. Eu não acho que alguém argumentaria que é um ótimo processo, mas pelo menos é um ponto de partida. Se você mudar o processo, como pode ter certeza de que sua mudança foi realmente uma melhoria, a menos que você avalie antes e depois? Você não pode.

  • revisões de código: uma revisão de código seria útil se o processo de revisão e os critérios de codificação fossem alterados para cada revisão? Claro que não.

  • ciclo de vida de desenvolvimento de software: Toda a análise -> design -> implementação -> teste -> ciclo de manutenção é um processo que deve ser definido claramente.

Em cada um desses casos, a implantação de um processo permite medir entradas e saídas e determinar se as alterações efetuadas têm o efeito pretendido. Não ter processos no lugar significa que você está apenas tentando adivinhar quando tenta melhorar a maneira como trabalha. É realmente disso que se trata a manufatura, e só faz sentido emprestar as sucessivas ferramentas de refinamento da manufatura, quando apropriadas.

Existe um campo inteiro dedicado à definição e melhoria de processos usados ​​para criar e manter software; isso se chama engenharia de software . Não é surpresa que você tenha dúvidas sobre o processo de desenvolvimento enquanto lê sobre o CMMI - o CMMI é um produto do Software Engineering Institute .

O desenvolvimento de software já adotou muitos conceitos de fabricação:

  • É difícil não ver a influência das partes intercambiáveis ​​de Eli Whitney no desenvolvimento da OOP e no componente .

  • As técnicas de gerenciamento de projetos usadas no desenvolvimento de software não são muito diferentes daquelas desenvolvidas para a fabricação. Como apenas dois exemplos, o mundo do software adotou apenas recentemente o conceito Kanban, desenvolvido décadas atrás na Toyota, e os gráficos de Gantt foram utilizados na fabricação muito antes da construção do primeiro computador eletrônico.

  • Metodologias de gerenciamento da qualidade, como o Six Sigma, desenvolvido para fabricação, foram adaptadas ao desenvolvimento de software.

Apesar do ambiente pesado do processo, o desenvolvedor deve se engajar na criação de coisas "on the fly".

Você está me dizendo que alguém decidirá por si próprio adicionar um patch ao pacote de reconhecimento facial e o incluirá na criação de produção sem antes criar um problema no sistema de rastreamento, revisar o design, verificar o código no controle de versão ou fazer com que o pessoal do teste o analise primeiro? Nosso processo exige essas coisas por algumas boas razões. Se "on the fly" você quer dizer "fora do processo", isso é inaceitável.

Fazer as coisas rapidamente é contra o espírito da manufatura.

Novamente, se "on the fly" significa "fora do processo", você está certo. Mas se você acha que a fabricação não requer pensamento rápido e desenvolvimento de soluções criativas para os problemas, você está errado. Todos os tipos de problemas surgem no processo de fabricação - os cupcakes não têm enchimento suficiente de creme, as superfícies pintadas de repente param de passar no teste de controle de qualidade, 20% das peças acabadas não possuem um anel de retenção importante, o sistema de mistura de massa quebrou parte crítica...


+1. Exatamente meus pensamentos. Receio, porém, que essa não seja uma resposta popular, porque, em um estado imaturo de engenharia de software, a codificação de cowboy é a coisa certa. Mesmo no CMMI, em L1, os heróis são adorados como divindades.
Vaibhav Garg

@ Vaibhav Garg: Acredito que, a longo prazo, o processo que funciona melhor, no sentido comercial , vence. Se o "processo de engenharia de software" controlado resultar em uma melhor relação qualidade / velocidade / custo, então ele vence. Às vezes, a codificação de cowboys parece produzir resultados irritantemente bons.
Joonas Pulakka

11
@JoonasPulakka. Concordo que, às vezes, a codificação de cowboys parece produzir bons resultados. Mas a chave aqui é "às vezes". Se você busca repetibilidade no desempenho, precisa repetir o que faz. Pense no P do SIPOC!
Vaibhav Garg

11
@ JoonasPulakka- Citando literalmente o CMMI Standard para organizações de nível 1: O sucesso nessas organizações depende da competência e heróica das pessoas na organização e não do uso de processos comprovados. Apesar desse caos, as organizações de nível 1 de maturidade costumam produzir produtos e serviços que funcionam; no entanto, eles freqüentemente excedem seus orçamentos e não cumprem seus cronogramas.
Vaibhav Garg

2
"O sucesso nessas organizações depende da competência ... das pessoas" Eu não acho que nenhum processo possa mudar isso.
kevin Cline
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.