it-swarm-pt.tech

Por que eles não ensinam essas coisas na escola?

Durante o verão, tive a sorte de entrar no Google Summer of Code. Aprendi muito (provavelmente mais do que aprendi na soma de todos os meus cursos universitários). Estou realmente me perguntando por que eles não ensinam algumas das coisas que aprendi mais cedo na escola. Para nomear alguns:

  • teste de unidade
  • controle de versão
  • desenvolvimento ágil

Parece-me que eles passam uma quantidade significativa de tempo ensinando outras coisas como estruturas de dados e algoritmos antecipadamente. Embora eu ainda ache que são muito importantes para aprender desde o início, por que eles não ensinam mais esses três antes deles? Ou é apenas a minha escola que não ensina muito disso?

Não me interpretem mal, não acho que seja desejável que as universidades sempre ensinem os modismos mais modernos da programação, mas meus professores não deveriam estar me ensinando algo além de "desenhar um diagrama antes de começar a codificar?"

119
Jason Baker

A resposta mais simples para sua pergunta é que os campos da ciência da computação e do desenvolvimento de software são muito novos e pouco compreendidos. Embora todas as disciplinas científicas e de engenharia estejam avançando mais rapidamente nos tempos modernos, outros campos têm muito mais experiência para aproveitar e há uma compreensão compartilhada muito mais ampla de como elas funcionam.

Por exemplo, apesar dos recentes avanços na ciência dos materiais, os engenheiros civis sabem há cerca de 2000 anos como construir um arco que não cairá, e isso é algo que pode ser ensinado e aprendido na universidade com relativamente pouca controvérsia. Embora eu concorde totalmente com você sobre as técnicas que os desenvolvedores de software devem aprender, esse contrato é baseado na experiência pessoal e no raciocínio informal. Para ser uma "melhor prática" aceita socialmente, precisamos de dados quantitativos que podem ser muito caros para reunir: quanto o controle de versão ajuda? Como isso ajuda? Teste de unidade? Podemos argumentar sobre a eficácia de várias técnicas, mas na verdade provar que a eficácia seria muito cara. Precisávamos executar um projeto de software completo e realista do começo ao fim, inúmeras vezes, com grupos de programadores com experiência equivalente, usando técnicas diferentes. No mínimo, precisaríamos de muitos dados sobre projetos existentes que esses projetos não estariam dispostos a liberar.

Os engenheiros civis têm milhares de anos de pontes para examinar, com muitas informações. Os desenvolvedores de software, por outro lado, têm apenas algumas décadas de informações, a maioria das quais é mantida em segredo, uma vez que há pouca motivação para as organizações coletarem e publicarem informações sobre a eficácia de seus desenvolvedores, mesmo que estejam coletando (o que geralmente não é necessário). 't).

Há também alguma confusão de campos. Desenvolvimento de software, ou "engenharia" de software, é realmente uma coisa diferente da ciência da computação. Os desenvolvedores de software precisam de um conhecimento prático da ciência da computação, mas trabalhar nos limites da complexidade algorítmica ou raciocinar sobre paralelismo não é algo que um programador que trabalha faz todos os dias; da mesma forma, um verdadeiro "cientista da computação" escreverá um monte de código descartável que simplesmente não funciona ou não faz nada de interessante e não se beneficiará tanto do tipo de rigor que um produto de software real faria.

O surgimento da Internet e da comunidade de código aberto pode fornecer dados suficientes para começar a responder a essas perguntas de maneira conclusiva, mas mesmo que as respostas estejam disponíveis amanhã, provavelmente levará 100 anos para que permeiem a sociedade internacional a ponto de todos concordarem com o que deve ser ensinado nas escolas.

Finalmente, existem algumas considerações econômicas. Faz um tempo relativamente curto, já que quase todos os envolvidos no desenvolvimento de software tiveram acesso fácil e barato a máquinas dedicadas para executar as ferramentas de desenvolvimento que desejarem. Algumas décadas atrás, dedicar completamente uma máquina apenas para executar seus testes ou até abrigar uma história infinita de código-fonte teria parecido frivolamente caro para muitas pessoas.

187
Glyph

Porque nossos professores:

  1. Nunca tentei testar a unidade,
  2. Não sei como usar o controle de versão e
  3. Nem sequer ouvi falar de "desenvolvimento ágil".

Os alunos devem resolver o assunto com suas próprias mãos. Fizemos isso e ficamos bem, não foi?

42
mislav

Leonardo da Vinci escreveu,

Aqueles que estão apaixonados pela prática sem ciência são como um piloto que entra em um navio sem leme ou bússola e nunca tem certeza de onde está indo. A prática deve sempre ser baseada em um sólido conhecimento da teoria.

As boas escolas ensinam tanto teoria (estruturas de dados, algoritmos, etc.) quanto prática (teste de unidade, controle de versão etc.). Isso requer uma mistura apropriada de professores para que os dois lados desta moeda possam ser ensinados adequadamente. Uma faculdade composta inteiramente de tipos teóricos sem experiência real não serve. Da mesma forma, uma faculdade composta inteiramente por profissionais não funciona. Você precisa de uma mistura, e as boas escolas têm isso.

42
Alan

A ciência da computação sempre foi um tanto contraditória; A parte que é sobre computadores não é uma ciência, e a parte que é uma ciência não é sobre computadores.

As universidades tendem a se apoiar mais na extremidade da 'ciência' (algoritmos, estruturas de dados, compiladores etc.) porque essas coisas são muito mais 'atemporais' do que as melhores práticas atuais do setor, que tendem a evoluir e mudar de ano para ano. O Controle de versão, por exemplo, passou por mudanças surpreendentes nos últimos 5 ou 10 anos, mas big-O ainda é big-O, e hash, btrees e recursão ainda são tão úteis quanto há 40 anos. A ideia deles é geralmente fornecer fundações suficientes para que você possa pegar ferramentas como git e entender o que significa quando lhe dizem que a estrutura de dados subjacente é um gráfico direcionado acíclico de hashes SHA-1 e que os desenvolvedores trabalharam duro para otimizar o número de syscalls para que seja vinculado ao io.

Agora, pense em onde você aprendeu tudo o que precisava saber para entender a última frase - se a resposta for 'universidade', eles estão fazendo um bom trabalho.

40
pjz

Tudo é uma moda passageira. Você aprenderá mais em seu primeiro ano de faculdade do que todos os seus anos de faculdade. A ciência da computação não tem nada a ver com computadores.

O College fornece uma caixa de ferramentas cheia de ferramentas. Esta é uma chave de fenda, que é uma chave crescente. Você PODE usar cada ferramenta uma vez na faculdade. É quando você entra no mundo real é quando realmente descobre o que tem. Você escolhe os úteis do resto, quais você deseja deixar em casa na bancada, por precaução, e os que você guarda no bolso todos os dias.

Tqm, Iso, Cmm, Agile, etc. Esses são todos os modismos que virão e seguirão; nenhum dos bem-sucedidos é mais do que apenas senso comum. Todos os engenheiros e empresas de sucesso usam algum senso de bom senso, foi o que os tornou bem-sucedidos, poucos precisavam de um nome para isso. O problema é que você não pode vender bom senso, um gerente não pode provar seu valor para a empresa treinando e comprando bom senso sem um nome atraente. Coloque um nome que seus superiores tenham lido em algum artigo ou revista e o gerente mantenha seu emprego e você mantenha o seu. Muito poucas das empresas que afirmam seguir essas práticas realmente o fazem. A maioria envia um cheque a um consultor e leva seu certificado anual e/ou vitalício a algum clube para que eles possam colocar um gráfico em seu site ou uma etiqueta na caixa em que o produto entra. Muitos argumentam que isso é raro ... esteve lá, viu, acontece. Isso tudo faz parte dos negócios, às vezes é preciso cortar custos para permanecer lucrativo e manter as portas abertas e as luzes acesas. Os seguidores incondicionais de todas essas práticas argumentaram que a última era uma moda passageira e essa não é, a última realmente era muito cara de seguir, essa não é. O último foi falso, você acabou de contratar um consultor, este é real. Como linguagens de programação, elas também evoluirão.

Sua capacidade de entender as realidades dos negócios, o sistema universitário e seu papel nele é a chave. Como qualquer coisa na vida, escolha suas batalhas. Não é a universidade, nem a empresa, nem o governo, nem o trabalho de outra pessoa ensinar que você quer ou precisa saber. É seu trabalho procurar o número um. Da mesma forma que você não pode culpar ninguém por fornecer tempo para isso, você deve fazê-lo. Você vai cair do cavalo, você não é uma vítima, levante-se e volte, sem desculpas, a vida não é um acordo justo. Aproveite as apostilas, não finja ser independente. E, certamente, pague suas dívidas, não sugue uma empresa de folhetos, sem dar a eles algo (o seu melhor na época?) Em troca.

Por que as pessoas pensam que cmm ou ágil ou qualquer outra coisa é uma moda? Por que eles pensam que não são? Por que o professor ensinou você a programar dessa maneira? Evitar gotos ou evitar constantes ou evitar isto e aquilo? É porque produz código mais confiável? Código com melhor desempenho? Reduz o erro humano? Ou é porque é mais fácil classificar trabalhos/programas, dando-lhes mais tempo para pesquisar? É porque eles não sabem programar e estão apenas seguindo o livro de alguém sobre o assunto? Eles ensinaram que você não pode ter um código de alto desempenho e manutenção, confiável? Você não pode nem "escolher dois" que possam ser mantidos interfere tanto no desempenho confiável quanto no alto? Às vezes, você sacrifica a confiabilidade pelo desempenho. Às vezes, você não se importa com confiabilidade ou desempenho, apenas deseja obter a versão 117.34.2 de outro programa de software contábil para a versão 118.0.0. Seu modelo de negócios é a venda de atualizações de versão e suporte técnico e, tanto quanto os desenvolvedores de software, qualquer robô antigo fará isso e poderá escrever o mesmo código da mesma maneira. Substitua o queimado pelo recém-saído da faculdade e continue vendendo atualizações.

Não há respostas universais para essas perguntas, você precisa descobrir qual é a sua opinião, conviver com ela e defendê-la. Mude de idéia, viva com ela e defenda-a.

Pergunta tudo ... eu realmente vou me queimar se tocar a panela quente no fogão? Os efeitos psicológicos de ter medo causam mais danos do que apenas se queimar? Existe uma maneira segura de testar a resposta sem se machucar?

Quando eu podia pagar, comprava e acabava derretendo transistores, bonés, resistores etc. no meu dormitório, todos com um odor característico. É muito mais barato e fácil comprar apenas um amplificador para o seu aparelho de som do que tentar construir um no dia seguinte à sua primeira classe de transistor. Sendo a exceção da Linus, é claro que é mais fácil comprar um sistema operacional do que escrever um ... Você pode fazer mais, embora o que você aprenda nesse período seja diferente do que o Linus aprendeu.

O mundo dentro e fora da universidade adotará essas fórmulas (cmm, ágil etc.) para solucionar problemas e, quando o próximo sair, elas serão descartadas com a mesma rapidez. Você não precisa usar o controle de versão para ter sucesso, há tantos sucessos com ou sem (bem, na verdade, devido à idade da indústria, há muito mais sucessos sem controle de versão até agora). Da mesma forma, você pode ser bem-sucedido com testes mínimos (veja os grandes nomes da indústria de computadores como exemplos). Você pode ser bem-sucedido testando seu próprio código e seguindo a regra de que nunca deve testar seu próprio código. Você pode ter sucesso usando o emacs e você pode ter sucesso usando o vi. Você precisa decidir qual mistura funciona para você e, se tiver sorte, encontre um lugar para trabalhar que esteja de acordo com você. Com o tempo, o que funciona para você mudará, de ferramentas para linguagens, para estilo de programação, para medos, controle de versão, documentação etc. Você se casará e terá filhos e decidirá que pode se esconder no canto daquela grande empresa com a grande pacote de seguro de saúde com o trabalho chato e aproveite seus filhos em vez de ser o programador de destaque na pequena startup.

Quando você sair da faculdade e entrar no mundo real, ouça, trabalhe e discuta com os "veteranos". Eles têm décadas a séculos de experiência combinada, armadilhas nas quais caíram e você pode evitar e/ou testar por conta própria (talvez você perceba que não precisa tocar na panela quente para descobrir que ela vai queimar você). A maioria já viu pelo menos um ou dois desses modismos irem e virem, e em particular o quanto eles foram queimados e o que fizeram para se recuperar dele. Eles conhecem muitas maneiras diferentes de testar as coisas e os nomes dos estilos de teste que vieram e se foram também. O que funciona, o que não funciona. Onde está o risco e como evitar a perda de tempo em uma tangente. À medida que amadurece e se torna o velho cronômetro, passe adiante. Pague pelo que aprendeu tentando ensinar aos que o seguem. Lembre-se de ensiná-los a pescar, não lhes dê apenas um peixe. E, às vezes, é preciso deixá-los falhar antes que tenham sucesso, impedir que se queimem demais.

O que eu realmente queria dizer aqui é que agora estamos em uma situação rara em que podemos testemunhar a evolução de um universo paralelo (e talvez influenciá-lo). Sim, a ciência da computação é uma ciência jovem em comparação com a física. Mas, ao mesmo tempo, evoluiu muitas vezes. Dependendo de onde você trabalha e com quem trabalha, poderá observar os engenheiros de hardware. Linguagens de programação no mundo do hardware certamente não são novas, mas não evoluíram tão rapidamente quanto no mundo do software. O software teve algumas décadas de vantagem. O hardware sempre pensou nos engenheiros de software como cidadãos de segunda classe. Nosso trabalho é fácil, o trabalho deles é difícil. (Observe que, na verdade, sou engenheiro de hardware e software). O interessante é que, no momento, eles ainda estão lidando com o que consideraríamos problemas elementares ou infantis. Por que eu precisaria usar o controle de versão, eu sou o único trabalhando neste chip. Sua experiência com o gcc ou outros compiladores baratos ou IDEs gratuitos não pode ser comparada com as ferramentas caras que eu uso, se a empresa achar que você é digno de usá-lo ou mesmo souber usá-lo, ele comprará uma cópia. E uma longa lista de outras desculpas. Tive o prazer de aprender tanto o vhdl quanto o verilog e tornar-me produtivo em ambos em uma semana do que era quase um desafio de um engenheiro de hardware (apesar do meu diploma dizer engenheiro elétrico, meu cargo é engenheiro de software). Eu queria aprender essas línguas, quando as ferramentas estavam disponíveis para mim, fiquei no escritório durante a noite e aprendi sozinha. Desse ponto em diante, o engenheiro em particular percebeu que o que eu estava dizendo era verdade, as linguagens são apenas sintaxe, os fundamentos de programação são os mesmos, as ferramentas todas fazem a mesma coisa. Suas maçãs e maçãs não maçãs e laranjas.

Em geral, embora ainda seja difícil enviar a mensagem de que um desses dois setores paralelos tem muito mais experiência em linguagens, hábitos de programação, controle de fontes, testes, ferramentas, ambientes de programação etc. do que o outro. O problema que estou tentando resolver é levar os projetos de hardware à medida que eles estão sendo desenvolvidos, criar simuladores funcionais acessíveis que podemos vincular a uma simulação (máquina virtual) do processador, para que possamos começar a testar o hardware e desenvolver o teste e teste. software entregável muito antes de usarmos o silício. Não, não há nada "novo" nisso, mas não temos mecanismo para obter o código mais recente, acompanhar as alterações no código para ver onde precisamos focar nosso tempo. Nenhum mecanismo para rastrear a documentação que define a interface do usuário (programação) para o hardware. A única cópia de ouro está na caixa de entrada de alguém em formato binário e só muda quando, bem, você não precisa ler o log de verificação para descobrir o que está acontecendo. Espere, esse verilog tem quantos anos? O bug que passei a semana toda em você descobriu três semanas atrás e consertou? Assim, voamos para um local de férias e festejamos por seis meses, esperando que o pessoal do hardware termine sua tarefa e a jogue por cima do muro para nós, ou aproveitamos a oportunidade para tentar ser paciente e otimista e ensinar a eles que eles existem métodos de senso comum que não são tão intrusivos que permitem que eles façam seu trabalho, façam backup de seu trabalho e compartilhem suas coisas para revisão por pares ...

Lembre-se de que os engenheiros de hardware deixaram a faculdade com uma caixa de ferramentas novas e brilhantes, assim como você. Você aprendeu 17 linguagens de programação diferentes, das quais você pode usar apenas uma; as demais linguagens que você em sua carreira serão inventadas depois de sair da faculdade. Quando eles saem da faculdade, podem contar o que sabem sobre cálculo e a teoria da relatividade, quantos elétrons existem em cada um dos elementos e calcular a carga em torno de uma superfície gaussiana. Mas a maior parte de sua carreira é de um, zero e ou não (ei, temos aqueles em comum, tudo o que você realmente precisa saber sobre computadores, um, zero e/ou não engenheiro de hardware ou software). Concedidas as leis fundamentais da física, cálculo, elétrons não vão mudar tão rápido quanto as linguagens de programação. Mas os fundamentos da programação são os mesmos em todas as linguagens e continuarão sendo no futuro. Você deixou a faculdade sabendo disso ou deixou de pensar Java é diferente e melhor que C++ porque isso e aquilo e aquilo outro?

Como qualquer outro negócio, o trabalho das universidades é permanecer lucrativo. Eles precisam contratar os acadêmicos certos para trazer os estudantes certos e os dólares certos para a pesquisa e os tipos certos de pesquisa para tornar a universidade lucrativa. Eles têm que oferecer as classes certas para trazer os alunos certos e produzir os graduados certos, para que, com o passar das décadas, os empregadores, próximos à universidade e, esperançosamente, distantes, reconheçam que essa universidade produz funcionários produtivos e lucrativos. (sim, e às vezes você precisa atrair os atletas certos no esporte certo para obter a quantidade certa de tempo na TV e a quantidade certa de reconhecimento de nome e receita esportiva). Algumas universidades ensinam C++ e Java, outras nunca. Alguns irão inventar o CMM, outros ensinarão Agile, outros não. Se a universidade tem algum valor, existe algo para você aprender. Eles não ensinarão tudo o que há para aprender, mas terão algo útil. Aprenda que, enquanto estiver lá, colete um número razoável de várias formas de ferramentas em sua caixa de ferramentas. Deixe a universidade e arrume um emprego. Se sua caixa de ferramentas for uma droga, talvez encontre outra universidade e nunca mencione a primeira. Se for uma caixa de ferramentas ok, use essas ferramentas e crie algumas novas no seu próprio tempo. Se for uma caixa de ferramentas muito boa, diga coisas boas sobre essa universidade e os bons acadêmicos com os quais você aprendeu isso e aquilo e pague a escola pelo que eles lhe deram. Mesmo que você não tenha conseguido todas as ferramentas possíveis no catálogo universal de ferramentas da universidade, ficará com um certo subconjunto. Mesmo se você não se formar ...

12
dwelch

Ensinei essas coisas quando era adjunto no Instituto de Tecnologia de Oregon. Eles são ensinados, apenas escassamente.

12
Scott Hanselman

oh deus, não me deixe começar

certa vez, o reitor do cs de uma universidade respeitável me disse que a programação orientada a objetos era apenas uma 'moda passageira', para que eles não oferecessem aulas de fantasia passageira como o C++.

por que eles não ensinam essas coisas, bem, a faculdade existe para ensinar os fundamentos da disciplina, não necessariamente as melhores práticas da indústria

11
Steven A. Lowe

A resposta mais simples é que você está estudando ciência da computação e as coisas listadas não estão realmente relacionadas ao campo acadêmico da ciência da computação. O desenvolvimento de software pode ser algo que você faça com ciência da computação, algo que se baseia nos blocos do que você aprendeu ... mas Ciência da Computação e desenvolvimento de software não são a mesma coisa.

Classes que ensinaram a você controle de versão ou como escrever testes de unidade eficazes ... que estariam ensinando a você comércio, ou seja, (bom) desenvolvimento de software.

10
matt b

Bem, o problema das universidades é que elas precisam ensinar coisas realmente universais. Algo como o desenvolvimento ágil ainda é bastante novo e, apesar do quanto se fala na Internet, ele não está sendo usado em todos os lugares, então ensiná-lo a toda uma classe de estudantes só beneficiaria algumas pessoas que chegaram a lojas ágeis.

O controle de versão, no entanto, é algo que hoje em dia é indesculpável. É algo que todos precisam entender: é uma ferramenta quase tão útil quanto um compilador e o CVS existe há mais de 20 anos. Os conceitos pelo menos precisam ser entendidos por qualquer programador que sai de uma universidade. Felizmente, se você faz algum trabalho de grupo na universidade, pode ter a sorte de desembarcar com alguém que já conhece o controle de versão e convencer seu grupo a usá-lo. Sei que estou feliz por essa pessoa estar no meu grupo.

O teste de unidade também é praticamente indesculpável. A única coisa que eu diria é que o livro ainda está em desenvolvimento orientado a testes e buscar 100% de cobertura de código sempre pode, às vezes, ser mais problemático do que vale a pena. Mas o teste de unidade é extremamente valioso e deve ser coberto em um curso de engenharia de software. Eu imagino que algumas dessas coisas estão entrando em algumas universidades, mas ainda não chegaram a todas elas.

8
William

Por que não? Minha experiência em obter o meu diploma de CS foi praticamente a mesma. O motivo é que as pessoas que ensinam programação não programam, até onde eu sei. Não é necessário ensinar essas coisas para o credenciamento, os professores não estão familiarizados com isso e os alunos nunca desenvolvem projetos de qualquer significado como parte de seus cursos. Não há motivação para realmente ensinar programação, em vez de ensinar teoria de CS ou Java.

6
Allen

Depende da universidade. Eu me formei em 2003, de uma universidade australiana. Nesse período, aprendemos UML, Unit Testing, XP (e outras metodologias ágeis), juntamente com todo o material formal, como Z, algoritmos e estruturas de dados, sistemas operacionais, etc.

Eles não cobriram os testes de unidade em grandes detalhes, porém, apenas pagaram o serviço de aprovação para uma aula. Seria ótimo ter aprendido a escrever testes de unidade eficazes, em vez de apenas "O que é um teste de unidade".

No que diz respeito ao controle de versão, nós o usamos (CVS) em nossos projetos de programação a partir do segundo ano.

Também concordo plenamente com o que Glyph disse. O CS é um campo tão imaturo, realmente apenas nos últimos 50 anos, que não sabemos o que devemos aprender e o que é apenas uma moda passageira. Dê 150 anos para que as coisas se acalmem mais. O número de projetos fracassados ​​no mundo real torna óbvio que essa é uma indústria imatura. Imagine se 80% dos projetos de construção falharem!

6
Rob Gray

Os cientistas da computação pensam que são matemáticos, não engenheiros e, portanto, preferem ensinar as partes de matemática do que as de engenharia. Testes, controle de versão e documentação não estão passando por modismos mais do que em qualquer outra disciplina de engenharia.

5
Martin Beckett

Tudo isso pode ser facilmente coberto (superficialmente) em uma única classe sobre práticas de desenvolvimento de software. Não faz parte da maioria dos currículos de CS, porque não é disso que se trata, embora eu ache que alguma cobertura dessas coisas é útil. Minha escola teve uma classe dessas; não abrangia o controle de versão, mas abrangia UML, coleta de requisitos, metodologias de desenvolvimento (várias agile e cascata), testes de unidade, testes de integração etc. e exigia que trabalhassemos em equipes de 4 a 5 para desenvolver um projeto (um Clue bastante simples em Java). Se você sentiu necessidade de outras aulas de engenharia de software, elas estavam disponíveis como eletivas.

Apesar de nunca ter mencionado o controle de versão uma vez em qualquer classe que participei, a maioria dos meus amigos o usava para projetos pessoais, tarefas de classe e assim por diante, por isso não é como se não estivéssemos expostos a ele. As pessoas que não o pegaram sozinhas foram forçadas a usá-lo por um colega de classe no decorrer de uma tarefa em equipe.

A universidade visa ensinar conceitos e teorias, porque essas são as coisas difíceis de aprender por conta própria. O controle de versão é uma ferramenta e muito fácil de entender. Use um pouco, leia alguns tutoriais na Web e está tudo pronto. Se você precisar de palestras e tarefas de casa para descobrir como verificar algo no SVN, você terá muitos problemas com as coisas que realmente são difíceis.

Lembre-se de que existem muitas maneiras de aprender coisas na faculdade fora das aulas; tire vantagem disso. Você está pagando muito para assistir às aulas e usar as instalações, então ordenha-as por todo o valor e vá às reuniões do LUG e da ACM, participe das equipes do projeto (sempre há alguns EMs construindo um robô que precisa de um programador) ou um trabalho de administração do servidor do departamento de ciências humanas. Escolha um computador na área de carregamento do prédio de Engenharia de Materiais, faça o download de uma iso do Linux com sua conexão rápida à Internet e divirta-se.

4
Adam Jaskiewicz

Você nomeou 3, alguns dos quais acho que não são tão importantes para a compreensão dos sistemas de computador (por exemplo, controle de versão). Essas coisas fazem parte de um trabalho, e você pode se tornar um bom programador/cientista da computação sem precisar conhecê-lo.

da mesma forma para testes de unidade - por que escolher testes de unidade? Certamente testes de usabilidade, teste do sistema, teste de aceitação do usuário e teste de aceitação da fábrica são mais importantes? Bem, eles são, a menos que você considere seu trabalho completo depois que o código é enviado ao departamento de manutenção :)

Pense nos outros conceitos que eu uso diariamente, que seriam de pouca utilidade para um aluno que aceita os fundamentos de software e sistemas de computador:

  • boas práticas de comentários
  • conformidade com os padrões (não apenas internacionais, mas os padrões de codificação de equipe)
  • documentação
  • controle de alterações (não necessariamente o mesmo que controle de versão, que trata de armazenar diferenças, trata-se mais do que e por que você mudou alguma coisa)
  • desenvolvimento de usabilidade

As opções acima são todas "soft skills", que você não precisa = para escrever um bom código.

No entanto, se você está perdendo as habilidades "difíceis", como estruturas de dados e algoritmos, sua chance de escrever um bom código é quase impossível.

3
gbjbaanb

Acho que a questão é que as universidades não acham que precisam ensiná-lo a ser um profissional, mas se concentrar no lado acadêmico da programação. Eu teria pensado que deveria haver pelo menos referência aos métodos e técnicas mais recentes usados ​​na indústria, pois essas coisas também são de interesse acadêmico.

Em nosso curso, aprendemos o Processo de Software Pessoal, que abrangeu coisas como o tempo de gravação gasto em projetos, bons comentários etc., mas nenhuma menção a fundamentos profissionais, como controle de versão.

3
Deeksy

Aprendi tudo isso no primeiro ano, com exceção do desenvolvimento ágil.

É tudo sobre escolher a escola certa, IMHO. Se você for o top 10, aprenderá rapidamente tudo isso.

No que diz respeito ao CS Education em geral, estamos basicamente pedindo aos professores que ensinem muito (idiomas de todos os tipos, estruturas de dados, eficiência de tempo de execução, como as coisas realmente funcionam no nível de bits). Gostaria de levantar a questão: por que as crianças não aprendem mais sobre engenharia de software?

2
Alex Gartrell

Simplesmente porque estruturas de dados e algoritmos constituem o núcleo da computação e, portanto, são muito mais importantes. O teste de unidade, o controle de versão e a metodologia ágil são apenas ferramentas do comércio (e, se necessário, espera-se que seja buscado no trabalho).

2
CaptainHastings

Eu aprendi tudo isso na universidade. Talvez dependa dos cursos que você escolher? Meus cursos foram muito diversos (design de software, design de interface do usuário, comércio eletrônico, IA, programação funcional etc.). O Design de software teve exposição a padrões de design e testes de unidade (um grande projeto que envolveu várias coisas). UI Design ... éramos um grupo de três pessoas trabalhando em um projeto. Não podíamos fazer nada sem o controle de versão, então conseguimos isso. E o desenvolvimento ágil era algo sobre o qual nossos professores sempre nos diziam, mas eles deixavam que cada grupo usasse.

Acho que muitos estudantes universitários fizeram cursos "fáceis" ou cursos que dariam um alto GPA. Outros se concentram no que desejam aprender e estão explorando amplamente para descobrir qual campo os interessaria. E há aqueles que sabem exatamente no que estão interessados ​​... o que é bom, exceto que eles tendem a não diversificar seus cursos.

2
Swati

Assim como os alunos, cada faculdade é diferente. Algumas faculdades, ou mais precisamente, alguns professores são resistentes à mudança ou são preguiçosos. Felizmente a maioria não é. Teorias, conceitos, história etc. são importantes e vitais para qualquer currículo de CS. Mas o mesmo está preparando o aluno para o seu ambiente de trabalho. Não surpreende que as faculdades comunitárias da minha área ofereçam cursos de CS muito atuais e aplicáveis. Nem tanto com uma universidade grande, estabelecida e prestigiada.

2
Matthew Sposato

Eles não ensinam esses tópicos porque a maioria das escolas é acadêmica, não comercial. Ou seja, eles são projetados para ensinar idéias e teorias, não para treiná-lo em uma carreira. Todo o conceito de controle de qualidade não tem nada a ver com ciência da computação, além de passar uma prova matemática. Além disso, as práticas de controle de qualidade e os fluxos de trabalho de desenvolvimento diferem bastante de uma casa de desenvolvimento para outra, portanto, ensiná-los na escola é uma perda de tempo e dinheiro.

2
Nathan Strong

Para responder por que essas coisas não são as primeiras a serem ensinadas: os programas de graduação geralmente treinam você para se tornar um estudante de mestrado. Somente quando você começar a escolher seus próprios cursos (o que normalmente acontece nos anos posteriores) você poderá aprender sobre as coisas usadas fora da academia. É por isso que eles se concentram em algoritmos, estruturas de dados, apresentando problemas não resolvidos etc.

Pessoalmente, acho bom que eles estejam fazendo isso. Programar não é tão fácil quanto muitos de nós parecem; muitas pessoas lutam com isso. Prefiro que essas pessoas primeiro entendam como um loop for funciona antes de descobrir o monstro que é o Perforce.

2
Swati

Todas as três coisas que você menciona (teste de unidade, controle de versão, desenvolvimento ágil) são ensinadas até certo ponto no programa de Ciências da Computação da Universidade de Groningen. Se isso é bom ou não, deixarei como uma questão em aberto; mas não é verdade que nenhuma universidade ensine as "coisas práticas".

1
Thomas

Isso se baseia em minhas experiências limitadas em um programa de CS, antes de eu mudar de curso, e em minha experiência como estagiário em uma grande empresa de software. O teste de unidade não é ensinado porque a maioria dos programas que você precisa criar não é grande o suficiente para precisar de testes automatizados; você garante um conjunto específico de entradas para poder testar tudo manualmente. Ensinar como automatizar os testes também pode interferir na classificação do seu projeto, uma vez que a maioria dos projetos é classificada com scripts que executam testes automatizados, com uma rápida olhada no código para garantir que você não tenha int foo1; int foo2; e você usa recuo adequado.

Não sei por que o controle de versão não seria ensinado, mas parte dele provavelmente é do tamanho de projetos. Eu nunca tive nenhum projeto que fosse grande o suficiente para o controle de versão e, em geral, quero dizer mais de 1000 linhas de código e levei um semestre inteiro para escrever. Eu acho que eles imaginam que você ensinará a si mesmo se precisar. Algum projeto de grupo que eu tinha era para ser par de projetos de programação e por que usar o controle de versão se vocês dois estão no mesmo computador?

Não sei por que o desenvolvimento ágil não seria ensinado, mas provavelmente remonta à mesma coisa com o tamanho do programa. Embora o desenvolvimento hostil seja comum a novos softwares executados em computadores pessoais e servidores pequenos, geralmente não é usado em sistemas como mainframes IBM ou em domínios problemáticos como bancos ou medicina, onde a documentação é essencial. Provavelmente, isso também tem a ver com o fato de que o desenvolvimento hostil não existia há 20 anos, quando muitos professores foram treinados.

1
Jared

Não acho que a programação ágil seja uma moda passageira, mas ao mesmo tempo seria difícil pensar em uma maneira de um professor fornecer projetos para permitir que você os aprenda. projeto B expandir em a. O problema é tempo e escopo. Em um curso de 4 meses, seria difícil.

Os métodos de controle de versão e teste de unidade estão sempre mudando e dependem do idioma ou da pessoa que os define.

As estruturas de dados e algo são algo que pode ser trabalhado em uma configuração de classe. Honestamente também, eles precisam de um pouco mais de esforço para entender do que o teste de unidade e o versionamento. Tente se lembrar de que parte da universidade é ensinar você a se ensinar. A colagem não tem exatamente o mesmo mandato. Ou pelo menos não na mesma medida. NA MINHA HUMILDE OPINIÃO.

1
baash05

Eu acho que bons programas de CS devem ensinar os fundamentos que servirão de base para toda a futura educação em programação. Metodologias de desenvolvimento como Agile e ferramentas de controle de versão são como modismos; eles vêm e vão. Além disso, eles tendem a ser usados ​​em ambientes industriais e não acadêmicos, então acho que é raro as universidades cobrirem coisas como aquelas que você provavelmente aprenderá no trabalho. Não estou dizendo que está certo, mas essa é provavelmente a mentalidade acadêmica.

1
Bullines

Eu concordo com o que você está dizendo. Recentemente, comecei a trabalhar no mundo do desenvolvimento de software e já comecei a aprender sobre desenvolvimento ágil, algo que nunca fui ensinado na universidade.

O fato é que os professores universitários não acompanham as novas técnicas de desenvolvimento tanto quanto deveriam. Eles também podem achar que há outras coisas mais importantes em seu currículo.

1
Dave

Os professores universitários não sabem como escrever software, apenas pesquisam, ensinam e ocasionalmente escrevem códigos que só precisam funcionar até que o artigo seja publicado.

É apenas por causa de pessoas como Titus que estamos recebendo acadêmicos que realmente gostam da programação - Leia seus comentários sobre esse tópico aqui

Quando eu era estudante, li livros na biblioteca sobre Extreme Programming e discutimos isso de maneira dinâmica nas aulas - as mesmas aulas que exigiam a conformidade com o "Modelo em cascata" do desenvolvimento de software, em que a "compilação" é uma etapa do processo. próprio.

Tudo de bom com sua carreira, espero que você se forme, é bom ter letras depois do seu nome. :)

1
Jerub

Eu acho que depende do tipo de programa de Ciência da Computação em que você está. Existem aqueles que apontam para o lado de Pesquisa e Ciência e existem outros que se voltam para o lado de Implementação. Recusei-me especialmente a certas escolas que só tinham professores que permaneceram no mundo acadêmico. Se você não tem professores que não "usam" o que ensinam, tudo está na cabeça deles, literalmente.

Plug: Tendo cursado BS em Comp Sci e MS em Soft Eng na DePaul University, fui ensinado principalmente por instrutores/professores que ensinavam em meio período, o que foi bom para mim porque eu preferia que eles entrassem com uma anedota do dia anterior e relacioná-lo com a classe. Além disso, por ser uma escola predominantemente suburbana/de meio período, a maioria dos estudantes tem emprego no que está aprendendo.

O processo de aprendizado ainda começa com toda a teoria, mas geralmente nos perguntam "quantos de vocês realmente usam isso em seu trabalho?" e a resposta típica é "nós a usamos, mas de uma maneira simplificada ou simplificada", e então vamos para os cenários práticos do mundo real.

Durante a minha unidade escolar, os testes estavam sempre presentes. Embora eles iniciem você em Java, eles nos fizeram usar ANT e JUnit para todos os projetos. O que foi um bom começo na configuração de compilação e no teste de unidade.

E o Extreme Programing foi incluído em cerca de 3 ou 4 das aulas que participei. Lembro que todos começaram com os 12 aspectos diferentes, da programação em pares ao teste de unidade (veja acima). E agora parece que o foco está no Agile.

Portanto, a resposta rápida é sim, existem escolas por aí que têm uma abordagem mais pragmática do que outras.

1
Glennular

A maioria dos projetos de software da universidade precisa se encaixar nos limites de uma única classe, o que significa efetivamente um projeto de 5 a 6 semanas, envolvendo de 1 a 4 programadores inexperientes razoáveis. O teste de unidade e o controle de origem só se tornam convincentemente eficazes quando você escala além disso em projetos de longo prazo que envolvem mais pessoas. Como resultado, é difícil incorporar essas técnicas em um projeto de classe de uma maneira que não pareça apenas requisitos inúteis.

1
Shalmanese

A principal razão é que muitas (a maioria?) Universidades se consideram ter um objetivo diferente de uma escola de comércio. Como tal, eles querem ensinar aos alunos como aprender, e os princípios fundamentais da disciplina. Além disso, algoritmos e estruturas de dados serão aplicados a qualquer linguagem de programação e não dependem de ferramentas específicas (que podem ou não estar em uso ainda na graduação).

Em Ciência da Computação, isso significa algoritmos, estruturas de dados, teoria dos computadores, teoria dos compiladores etc. O que você está listando é menos sobre como programar, como resolver problemas etc. É sobre a prática da programação (que, aliás, é um livro incrível para qualquer pessoa na faculdade com a intenção de trabalhar como programador). Agora, muito disso não será usado em uma posição de macaco de código de nível de entrada, levando algumas pessoas a pensar que não é útil. Discordo. Eu acho que pode ser extremamente útil. No entanto, isso não significa que, depois de obter seu diploma em CS, você saiba tudo o que precisará para trabalhar como programador.

O que também não significa que as coisas mencionadas não sejam úteis. Eles são. Você terá problemas em trabalhar como programador se não aprendê-los, e acho que eles deveriam ser ensinados na faculdade, pelo menos até certo ponto. Eu estudaria o controle de versão de ensino, o teste de unidade, etc., da mesma maneira que observaria uma programação de graduação em arte e o ensino do que são pincéis e quais devem ser usados ​​para vários casos.

1
Christopher Cashell

Testes de unidade e controle de versão foram ministrados em cursos de 2º ano em Ciência da Computação, onde fui para a universidade. Os testes de unidade foram incluídos na parte dos testes, que também incluíam diferenças entre a caixa branca e a preta e uma boa parte das marcas nas atribuições de programação do 3º ano foi para um bom tratamento de erros que pode vir facilmente dos testes de unidade.

O desenvolvimento ágil pode ser um pouco difícil de ensinar em um ambiente acadêmico, eu acho. Embora eu tenha aprendido sobre o método Waterfall em teoria, não o vi em campo até depois de me formar e me mudar para o mundo real, que pode ser bem diferente da academia, por exemplo. no terceiro ano, faço todos os casos estranhos de erro e quase passo em uma tarefa em que nunca toquei no coração do que a tarefa tentou me ensinar sobre os semáforos.

Além disso, há quanto tempo o Agile existe e qual a sua forma? Existem muitas implementações diferentes do que eu vi.

1
JB King

Idealmente, meu palpite é que eles não têm tempo para ensinar essas coisas, ou é mais importante ensinar algo e as línguas, coisas que a maioria dos alunos terá dificuldade em aprender.

A escola é o oposto de autoaprendizagem e, como essas coisas (controles de versão, testes de unidade) são as mais fáceis de aprender, elas precisam garantir que mesmo o aluno menos capaz seja capaz de executar a mais importante programação e algoritmo básicos, e faça as "coisas em volta" depois.

As coisas sobre as quais você fala mudam ao longo do tempo, e é difícil mudar as ferramentas etc. As grandes estruturas educacionais gostam de manter as coisas simples.

0
jokoon