Os métodos de desenvolvimento devem esmagar o individualismo de um desenvolvedor?

9

Estou no meu semestre final da faculdade e estou fazendo um curso de engenharia de software. Na aula, aprendemos sobre vários métodos de desenvolvimento de software. O que focamos e usamos para desenvolver nosso projeto foi o método em cascata.

Sinto que o instrutor pode ter implementado errado. Em nossos diagramas de classe, tivemos que listar TODAS as propriedades e métodos, incluindo os privados. Eu li alguns livros, ou seja, Código Limpo, que dizem manter as funções o mais curtas e focadas possível. Parece tedioso listar todas as pequenas funções em nossos diagramas se elas não ajudarem outros desenvolvedores (são particulares, ninguém mais as usará). Além disso, talvez eu não pense em todas as pequenas funções ao projetar o programa, elas podem surgir quando refatoradas.

O instrutor nos disse errado ao pedir que listássemos todas as funções? E esses métodos de design reprimem o individualismo do desenvolvedor para escrever o código de como ele pode melhor entendê-lo?

David Peterman
fonte
20
É muito ruim que sua turma esteja ensinando o método Waterfall, que é um exemplo canônico de um mau processo para o desenvolvimento de software.
Whatsisname
6
Eu diria que esta classe te ensinou muito.
JeffO
7
Na verdade, a cascata original possui iterações que realizam um ao outro. É o ensino incorreto de Waterfall ao longo dos anos que destruiu sua utilidade. Mesmo com algo como Scrum, os passos que uma história percorre em um Sprint emula a de uma cachoeira em si mesma. Os diagramas UML são úteis apenas para design de alto nível. Assim que o código é escrito, todos os documentos escritos antes desse código ficam desatualizados. Esta é a realização da engenharia. No final, o código deve ser a documentação.
Andrew T Finnell
10
Praticamente todo desenvolvedor viu casos de individualismo do desenvolvedor que deveriam ter sido esmagados. (Embora provavelmente não seja pela metodologia em cascata).
psr
2
@whatsisname, eu discordo totalmente. Todo desenvolvedor deve aprender o desenvolvimento do Waterfall, para entendê-lo e experimentá-lo como um exemplo canônico de mau desenvolvimento de software. Além disso, muitas lojas ainda estão no Waterfall por certo ou errado e é importante que os graduados estejam preparados para isso.
maple_shaft

Respostas:

10

Você perguntou ao instrutor por que você tinha que listar todos os métodos?

É possível que, como com grande parte do que é solicitado em um ambiente de sala de aula, a intenção não fosse tornar os diagramas de turma mais úteis para os desenvolvedores, mas ajudar você e seus colegas a pensar em como você projetaria suas aulas. Quando os alunos estão aprendendo a decompor problemas maiores em problemas menores, provavelmente é útil que eles pensem sobre quais métodos particulares eles provavelmente precisariam. E provavelmente é útil para o instrutor ter uma idéia melhor de quais métodos os alunos estão pensando em implementar, a fim de intervir mais cedo no processo, se o projeto de alguém for mal pensado. A documentação em um ambiente de sala de aula geralmente é muito mais envolvida do que a documentação em um ambiente do mundo real porque o instrutor

Obviamente, também é possível que o instrutor acredite que esse nível de documentação seja útil em um projeto real. Se for esse o caso, o instrutor provavelmente está desatualizado ou veio de um nicho específico em que esse nível de planejamento e documentação é apropriado. Se você está construindo o sistema de navegação para o ônibus espacial ou projetando dispositivos médicos, por exemplo, geralmente é muito mais apropriado investir pesadamente no design antecipado, em vez de refatorar o código durante o desenvolvimento. Se você está desenvolvendo um site de rede social, por outro lado, uma abordagem mais ágil é mais apropriada.

Justin Cave
fonte
+1 para indicar como é necessário um design diferente para diferentes propósitos. Bons pontos sobre design de classe também; pedindo o instrutor é uma boa idéia
Ethel Evans
11
Lembre-se da regra de aprovação em um curso universitário: descubra o que o professor deseja e faça isso.
Christopher Mahan
9

Não, o instrutor está certo ao pedir para listar todas as propriedades e métodos antecipadamente, se você estiver usando o método em cascata. A Wikipedia observa uma crítica à cachoeira:

Muitos argumentam que o modelo em cascata é uma péssima idéia na prática - acreditando ser impossível para qualquer projeto não trivial concluir perfeitamente uma fase do ciclo de vida de um produto de software antes de passar para as próximas fases e aprender com elas. Por exemplo, os clientes podem não saber exatamente quais requisitos eles precisam antes de revisar um protótipo em funcionamento e comentar sobre ele. Eles podem alterar seus requisitos constantemente. Designers e programadores podem ter pouco controle sobre isso. Se os clientes alterarem seus requisitos após a finalização do design, ele deverá ser modificado para acomodar os novos requisitos. Isso significa efetivamente invalidar uma boa quantidade de horas de trabalho, o que significa aumento de custo, especialmente se uma grande quantidade de recursos do projeto já foi investida no Big Design Up Front.

Esses métodos de desenho não esmagam o implementador do individualismo do desenho, pois ainda há partes para interpretar e maneiras de dar toques únicos à estrutura, por exemplo, uma figura com um esqueleto e adicionar músculos e outros tecidos para criar um animal imaginando quanto liberdade você teve que projetar esse animal?

Você encontrou uma falha na cachoeira sim, mas tudo tem seus pontos fortes e fracos.

JB King
fonte
4

Na aula, aprendemos sobre vários métodos de desenvolvimento de software. O que focamos e usamos para desenvolver nosso projeto foi o método em cascata.

Você provavelmente aprendeu o modelo clássico da Cachoeira, que a pessoa atribuída ao apresentá-lo ao mundo do desenvolvimento de software declarou desde o início que era inadequado para o desenvolvimento de sistemas de software em larga escala. Você provavelmente estaria interessado em ler o artigo de Winston Royce intitulado Gerenciando o desenvolvimento de grandes sistemas de software para aprender mais sobre os problemas com o que muitas pessoas consideram o modelo Waterfall.

No entanto, o modelo Waterfall é bom para ensinar o ciclo de vida de desenvolvimento de software à medida que você avança e pode gastar tempo aprendendo e executando engenharia de requisitos, design arquitetônico, design detalhado, implementação, teste e manutenção em fases muito claras e distintas.

Em nossos diagramas de classe, tivemos que listar TODAS as propriedades e métodos, incluindo os privados. Eu li alguns livros, ou seja, Código Limpo, que dizem manter as funções o mais curtas e focadas possível. Parece tedioso listar todas as pequenas funções em nossos diagramas se elas não ajudarem outros desenvolvedores (são particulares, ninguém mais as usará). Além disso, talvez eu não pense em todas as pequenas funções ao projetar o programa, elas podem surgir quando refatoradas.

Todos esses são pontos muito válidos.

Listar todas as propriedades e métodos durante a fase de design, mesmo ao usar o Waterfall, provavelmente é um exagero. Você definitivamente deve listar tudo o que é público, juntamente com as propriedades essenciais. Na realidade, tudo o resto é um detalhe de implementação que você pode obter através da engenharia reversa de sua implementação em diagramas.

O conselho do Clean Code (nunca o li - só estou seguindo o que você postou) parece ser justo e aplicável mesmo ao usar a metodologia Waterfall. Você pode projetar suas classes e métodos com respeito ao Princípio de responsabilidade única , separação de preocupações e outros princípios do SOLID . O Waterfall não diz como projetar, exatamente quando você precisa fazê-lo. Dito isto, é mais difícil desde o início, à medida que você aprende e pensa em maneiras melhores de fazê-lo durante a implementação.

Eu acho que isso indica o fato de que precisa haver uma iteração entre design e implementação muito claramente - um problema que o Waterfall tradicional não explica.

Thomas Owens
fonte
11
@pillmuncher Tão poucas pessoas leram, é meio triste.
Thomas Owens
3
O mais triste sobre esse artigo é que a maioria das pessoas realmente descobriu uma cascata, enquanto é um artigo que desacredita completamente a prática.
Joeri Sebrechts
3

Parece tedioso listar todas as pequenas funções em nossos diagramas se elas não ajudarem outros desenvolvedores (são particulares, ninguém mais as usará).

Se você acha isso tedioso, espere até obter uma programação de trabalho real. Considere, por um momento, que o software pode não ser uma carreira viável para você.

Além disso, talvez eu não pense em todas as pequenas funções ao projetar o programa, elas podem surgir quando refatoradas.

Então?

o instrutor nos disse errado pedindo que listássemos todas as funções?

Não. É um requisito comum.

E esses métodos de design reprimem o implementador do individualismo de design (o desenvolvedor) para escrever o código de como eles podem melhor entendê-lo?

Sim. O esmagamento da alma dos indivíduos é uma parte importante do desenvolvimento de software. Toda a individualidade será derrotada de todos os programadores em todos os momentos, de todas as maneiras possíveis. Diz que em algum lugar das "Regras de Programação de Deus" transmitidas de alguma montanha a algum profeta.

Não. Você está apenas recusando o tédio. Supere isso e volte ao trabalho.

S.Lott
fonte
11
@FreshDaddy. "Eles (na maioria das vezes) nunca verão funções privadas". Falso. Depois de ganhar na loteria, outros programadores assumirão o seu código e verão as funções privadas. Além disso. Algumas linguagens (por exemplo, Python) evitam esse tipo de privacidade.
S.Lott
2
@ S.Lott - Listar todas as funções privadas não é um requisito comum. Acontece, não me interpretem mal, mas uma "lista completa de todas as funções privadas antes de escrever código" é certamente muito rara. Há "tédio necessário" e depois há "tédio inútil". Considerando que os programadores estão no negócio de eliminar o "tédio sem valor", os clientes do mundo real dificilmente solicitariam algo tão caro e inútil como esse, a menos que fosse um código do tipo "vida ou morte".
Morgan Herlocker 6/09/11
11
@ironcode: '"listar todas as funções privadas antes de escrever o código" é certamente muito raro.' Não na minha experiência. É assim que as pessoas aprendem a fazer design. Os programadores juniores costumam manter esse padrão até que possam provar que seu trabalho não exige esse nível de supervisão. Geralmente menos de um ano. Uma organização que pegou n00bs da escola e os jogou na programação sem supervisão está principalmente criando enormes problemas. Esse nível de supervisão é essencial para garantir que o código tenha uma chance de trabalhar.
S.Lott
11
@ S Lott - meu lema é que, se o desenvolvimento de software é entediante, você está fazendo errado. Somos programadores. Automatizamos o tédio. Não nos repetimos no código e também não há razão para nos repetirmos na documentação.
Kevin cline
11
@ Kevin: esta resposta é puro sarcasmo. Como tal, é completamente inapropriado, e eu o sinalizei.
Michael Borgwardt
1

Programação é a arte de trabalhar dentro de restrições. A CPU fornece um conjunto de instruções limitado; E / S é restrita pelo design do hardware; As APIs do sistema operacional são criadas para incentivar certos comportamentos e restringir outros; linguagens de alto nível geralmente são projetadas para promover um conjunto de idiomas em detrimento de outros ...

E metodologias também são criadas para restringir.

Seu desafio, em todos os aspectos do processo de desenvolvimento, é realizar sua visão dentro dessas restrições. Você vai bater a cabeça contra cada parede erguida por hardware, linguagem, API e metodologia? Ou você encontrará uma maneira de harmonizar o que deseja alcançar com o que é permitido e incentivado?

Você realmente acha que seu instrutor deseja ler inúmeras páginas de minúcia? Depois teste essa teoria: divida um programa e documente cada átomo. Quando a mesa dele está caída sob o peso, suspeito que você descobrirá que o verdadeiro desejo dele é um pouco diferente do que você espera.

Ou preparar a documentação como você vê o ajuste. Deixe claro, compreensível, faça com que seja lido como um romance de Dashiell Hammett. E então sente-se e converse com ele, mostre a ele o que você fez, convença-o de seu mérito.

Shog9
fonte
1

Eu acho que o instrutor é brilhante por fazer você fazer esse projeto e, assim, ensinando-lhe os prós e contras (principalmente) do desenvolvimento do Waterfall.

afeygin
fonte
1

Uma regra simples para avaliar a complexidade da análise de projeto é "O desenvolvedor ou a empresa em que trabalha pode ser responsabilizado por algo dramático o suficiente (geralmente incluindo morte ou grande quantidade de dinheiro perdido) acontecendo com o software criado?".

Eu tive a mesma experiência que você em alguns dos meus cursos. Pessoas com formação na indústria militar nos ensinariam análise. E isso seria uma análise completa e exaustiva, planejando todo o andamento do projeto, mesmo nos mínimos detalhes. Você não pode pagar muitas iterações com esse tipo de projeto (também a explosão de bombas pode ser boa, a explosão de orçamento não é); portanto, não há lugar para criatividade aqui; é preciso seguir o plano.

Por outro lado, se você leu um pouco, certamente leu sobre metodologias ágeis. Geralmente, há menos documentação e mais espaço para o desenvolvedor usar sua criatividade enquanto desenvolve uma solução para o problema que encontra.

Em conclusão, quanto mais experiência você obtiver, melhor e o que o seu instrutor está mostrando a você se aplica a alguma parte do setor. Esteja ciente de que certamente existem tantas maneiras de gerenciar e projetar um projeto quanto de codificá-las. E você encontrará defensores e críticos para todos eles. Teste-os enquanto estiver estudando e escolha o que mais lhe agrada.

Matthieu
fonte
E tenha cuidado com "Pode matar pessoas se travar", existe outro tipo chamado "Alguém pode ir para a cadeia se isso imprimir dados errados" e que muitas vezes retornam ao cara que toca no teclado, por isso é bom ter detalhes muito detalhados requisitos, nos mínimos detalhes.
Christopher Mahan
@Christopher: ajustada a minha resposta em conformidade, obrigado pelo comentário :)
Matthieu
0

Algumas aulas de engenharia de software, como a que eu tive, são ministradas em um estilo estranho, onde 'falha é sucesso', sucesso é uma oportunidade desperdiçada de aprender com a falha e mais é menos e menos é mais. Se esse é um deles, basta seguir as tarefas e apreciar a estranheza.

Trabalho
fonte
0

Eu acho que seu instrutor está fora de contato. O software comercial raramente é projetado ou documentado nessa extensão. É muito caro e a documentação resultante não pode ser mantida sem ainda mais despesas. Essas práticas da IMO são um legado dos dias em que a codificação era frequentemente feita em linguagem assembly. Você gastaria mais tempo tentando práticas mais ágeis: desenvolvimento orientado a testes, programação de pares, refatoração contínua.

O instrutor "lhe disse errado"?

Acho que sim.

Atribuir trabalho chato a trabalhadores de propriedade intelectual é um desperdício. Na escola, o trabalho chato tem pouco ou nenhum valor pedagógico, exceto, talvez, para atrair os alunos para o trabalho chato. Tais exercícios têm consequências negativas, tanto para os estudantes quanto para a indústria. Os alunos são prejudicados porque seu tempo é perdido. A indústria está prejudicada, porque alguns estudantes podem concluir que esse tédio é necessário e útil. Não é nenhum. Em trinta anos em software, o único trabalho que consigo pensar que era ao mesmo tempo chato e útil era trocar fitas de backup. Havia robôs que podiam fazer isso, mas eram proibitivamente caros.

Kevin Cline
fonte
2
Ouso dizer que você nunca trabalhou para uma empresa que ganha dinheiro com contratos do governo. (edit) Você disse Software comercial. Minha declaração não tem sentido agora.
Andrew T Finnell
@ Andrew Finnel: A verdade é tão dolorosa, em muitos níveis.
9788 Peter Parkerell
2
@ Andrew - eu trabalhei para DOD2167. Era horrível e improdutivo como era praticado. Mais tarde, trabalhei para outra empresa que desenvolve desenvolvimento ágil para o governo, com entregas frequentes. O cliente está muito feliz. Eles tinham um aplicativo útil em seis meses e recebem novos recursos trimestralmente.
Kevin cline #
@ Andrew Eu tenho mais de 2 anos de experiência no trabalho do Departamento de Defesa dos EUA, como funcionário do governo e como contratado. Métodos ágeis estão sendo adotados. Uma equipe em que trabalhei estava usando ativamente o Scrum, produzindo documentação "apenas o suficiente" "bem a tempo". Sim, a documentação (mesmo a documentação "apenas o suficiente") é significativamente mais extensa do que em muitos outros lugares, mas isso geralmente é motivado pelo número de partes envolvidas (contratos podem mudar de mãos, outras partes podem desenvolver outros sistemas etc.) e / ou a segurança ou a importância da vida e a importância dos sistemas em desenvolvimento.
Thomas Owens
2
@ Andrew não são apenas governos. Eu vi especificações de 40 páginas para "produtos"; normalmente você pode selecionar tudo dessa tabela e me fornecer um pipe delimitado, por favor. Ninguém pode ser incomodado para lê-los ...
Ben