Todos nós já ouvimos isso; sempre que houver uma discussão sobre graduados em ciências da computação com poucas habilidades de desenvolvimento, alguém diz:
Ciência da computação não é engenharia de software.
O problema que vejo é que a programação e o desenvolvimento de software são ministrados nos cursos de CS. Eles são comumente ensinados mal. Se está sendo ensinado, por que não ensiná-lo direito da primeira vez? *
Então, eu gostaria de ver quais são as opiniões em 2 perguntas:
O argumento CS! = SE é um argumento ou desculpa para não ensinar adequadamente as habilidades de programação.
Independentemente da sua resposta à pergunta 1; se você estivesse na posição todo-poderosa de tomar tal decisão: você enfatizaria o ensino adequado da programação nos cursos de CS?
* Suspeito, com base em evidências anedóticas que obtive ao longo da minha educação, que a maioria dos acadêmicos da área não precisou escrever código para manter e não manter código e, como resultado, não possui conhecimentos / habilidades para ensiná-lo efetivamente.
fonte
Respostas:
Eu não acho que seja uma cópia, mas uma afirmação de que a ciência da computação não é engenharia de software, não é programação - é, bem, a ciência da computação formalizada. Em essência, é matemática (de fato, muitos programas de CS começaram como programas de matemática aplicada).
Eu acho que o problema está mais na indústria do que na academia. A indústria vê um diploma de CS listado em um currículo e pensa: "Ótimo, esse cara é bom com computadores" e o contrata para fazer qualquer coisa relacionada a um computador: TI, programação, desenvolvimento de software, o que for. Essas coisas não estão necessariamente no campo da experiência de um graduado em CS. Por sua vez, muitas pessoas que gostam de construir computadores ou jogar videogames entram em um programa de CS esperando fazer esse tipo de coisa e recebem uma surpresa rude; ou seja, muitos estudantes que ingressam no CS realmente não pertencem a esse país e estariam melhor em um programa de graduação mais direcionado.
Em segundo lugar, há um tempo muito limitado para ensinar CS - uma matéria muito ampla - em um currículo típico de graduação. Meu currículo de graduação tinha 8 cursos de CS (para um BA) ou 12 cursos de CS (para um BS), além de todos os cursos de matemática necessários. Isso não é muito tempo para ensinar CS e matemática e programação e engenharia de software, de modo que em algum ponto você tem que decidir o que é importante, eo que um estudante pode pegar por conta própria.
Esse último ponto é crucial: acho que um bom aluno - em qualquer área de estudo - explorará idéias por conta própria. Sou formado em ciências da computação, mas acho que saí da faculdade como um desenvolvedor decente, porque estudei e escrevi software sozinho . A faculdade não é só aulas; trata-se também de dar aos alunos tempo para desenvolver suas habilidades de forma semi-autônoma, enquanto ainda dão orientações valiosas.
Eu mantenho que a teoria do ensino - CS, matemática etc. - é tão importante, se não mais importante, quanto o ensino de habilidades específicas relacionadas ao trabalho. Se você ensinar a um aluno o porquê dos métodos e técnicas, e não apenas o quê , você terminará com alguém que é muito mais adaptável ao aplicar seu conhecimento. Por exemplo, fui a uma "escola Java" muito difamada e, portanto, fui ensinado em Java, mas também tive cursos de teoria da linguagem de programação, que explicavam o porquê de muitas linguagens; como resultado, aprendi a escrever um software muito melhor do que se não tivesse esse histórico. Claro, eu não escrevo software em Haskell no meu trabalho diário, mas conhecer muita teoria da linguagem de programação me permitiu ter uma ideia de quetem sido aplicável ao meu trabalho como programador.
Eu também acho que a indústria está esperando demais dos estudantes universitários. A indústria quer cortar seus próprios custos; portanto, em vez de treinar novos recrutas para seus empregos, eles esperam que as faculdades se tornem escolas técnicas / comerciais; com efeito, eles querem faculdades para fazer seu treinamento para eles. Não se espera que os graduados da faculdade saibam tudo o que há de novo na faculdade. Ser um bom desenvolvedor tem tanto a ver com a experiência quanto com o conhecimento (especialmente em um campo relativamente jovem como o desenvolvimento de software).
fonte
Parte do problema aqui é o fato de que 4 anos não são tempo suficiente para se tornar um engenheiro de software sofisticado. Dado que queremos que o graduado tenha exposição a mais coisas do que apenas cursos de matemática e ciências da computação e ao fato de que há bastante mecânica pura para aprender (algoritmos, estruturas de dados, sintaxe da linguagem), não podemos esperar que uma formação em ciências verdes seja um engenheiro de software.
Concordo que o CS! = SE e eu não tenho certeza se você pode apenas ir à escola e se tornar um SE (mesmo com um mestrado)
fonte
CS não é, de fato, SE. E as pessoas parecem confundir os dois o tempo todo, mesmo admitindo isso. A ciência da computação deve realmente ser renomeada como Computologia, ou a ciência da computação. De fato, a ciência da computação tem muito pouco a ver com computadores. É teoria dos grafos, análise de algoritmos, estruturas de dados, etc.
As pessoas querem assumir que um novo diploma de CS é realmente um diploma de ITT; eles querem alguém que tenha sido treinado em uma vocação. Ciência da computação é ciência, programação é uma arte. Estes não são os mesmos.
É como perguntar por que um recém formado em Física não é um bom engenheiro de automóveis. Isso é bobagem.
fonte
fonte
Não. CS não é SE. Isso é um fato, não uma desculpa.
Não. Seria como forçar os astrônomos a aprender os detalhes da construção de telescópios. Ou forçar os programadores a aprender os detalhes da construção de computadores. Coisas relacionadas, mas um homem não precisa saber tudo.
fonte
Sim, isso me parece uma bobagem e um sinal da imaturidade do CS como disciplina acadêmica.
Um programa de BS credenciado pela American Chemical Society exige que você tenha passado em cursos específicos para demonstrar uma proficiência específica em teoria (aulas de aula) e prática (aulas de laboratório). Atualmente, CS não tem nada disso, até onde eu saiba.
Um dos meus professores de pós-graduação era um teórico de torre de marfim, cujo escritório nunca foi manchado com algo mais fisicamente químico do que um aquário com Magic Rocks, mas quando eu era seu assistente de química para calouros, ele também provou ser um químico de bancada bastante competente .
Quando eu trabalhava como químico industrial de tintas, eles riam da idéia de que eu era bacharel e seria incompetente no laboratório. É claro que os detalhes do que eu estava fazendo no laboratório eram diferentes do que eu tinha nas aulas de laboratório na escola, mas os princípios eram os mesmos - nós apenas usamos um misturador de tinta e uma lata, em vez de um copo e agitador magnético. .
Se alguém aplicasse a mesma abordagem ao CS, os detalhes do que alguém poderia ensinar como habilidades práticas de desenvolvimento de software para um currículo de CS / SE podem variar de escola para escola e ao longo do tempo. Mas parece loucura para mim que é aceitável que alguém possa se formar em campo e não seja competente para escrever, depurar e manter algum tipo de código. (Claro, é assim que as coisas realmente são em muitos programas de CS, mas ainda é uma loucura.)
fonte
Concordo que 4 anos é apenas tempo suficiente para dar-lhes uma boa base sobre a qual crescer. No entanto, acho que uma coisa que realmente ajuda é quando pessoas da indústria se envolvem no desenvolvimento do currículo e até no ensino na sala de aula. No ano passado, fui bolsista da indústria em uma aula de desenvolvimento de software em uma universidade local. Foi uma experiência muito reveladora para mim. O professor e eu trabalhamos juntos no conteúdo do curso e colocamos muito mais informações sobre o processo de desenvolvimento, as melhores práticas do setor e as situações do mundo real, como antes. O que descobrimos foi que, como a maioria dos instrutores não desenvolve código amplamente usado e mantido, trazer alguém da indústria ajudou a identificar e ensinar as habilidades necessárias para fazer isso.
fonte
Sim, é uma copa 100%, eles devem ensinar habilidades de longo prazo que serão úteis ao longo de nossa carreira. Se sua intenção é ou não entrar na academia ou no setor, você precisará ser capaz de programar de uma maneira que possa ser mantida, mesmo que seja apenas por si mesmo.
Sim, embora apenas seja enfatizado nos cursos adequados. Pessoalmente, se eu tiver que falar com você para entender melhor como você tentou implementar um algoritmo, eu anotaria sua nota.
Mesmo se você fizer uma pesquisa pura em CS, provavelmente precisará criar um código para demonstrar suas idéias. As habilidades apropriadas de programação serão úteis para você em algum momento; por que não começar na faculdade?
fonte
Penso que o nosso problema é que somos muito mais parecidos com médicos do que estamos dispostos a admitir ... Temos a ideia de que um diploma de quatro anos deve preparar os alunos para escrever software. Não é nem perto.
Nossa profissão é amplamente iniciada em comparação com outras disciplinas. Talvez a pergunta deva ser: como podemos melhorar o CS para que os alunos que se formam com esse diploma sejam mais adequados para se tornarem membros produtivos de uma equipe de desenvolvimento de software do mundo real em um período de tempo muito menor?
Talvez devêssemos ser mais como remédios. Quatro anos de trabalho básico (grau CS) e, em seguida, residência - prática da embarcação sob a supervisão de um engenheiro de software mais experiente. Talvez seja isso que já temos, mas é menos formal ... Quero dizer, como um residente, aprendemos nossas habilidades mais valiosas no local de trabalho em nossos primeiros empregos.
Talvez como disciplina, apenas precisamos formalizar isso melhor.
fonte
Sou formado em ciências da computação e, durante um ano inteiro do meu programa, não houve programação, apenas teoria. Disseram-nos que não estamos nos formando em programação, mas em Ciência da Computação. Se você quer ser programador, vá para a faculdade comunitária.
Aprendemos sobre algoritmos, padrões de design e muita teoria sobre a solução de problemas sem uma linguagem específica. As linguagens de programação vêm e vão, mas a teoria subjacente permanece a mesma.
Portanto, na sua primeira pergunta, não, não acho que CS! = SE seja uma cópia. É um fato.
Para sua segunda pergunta, não, acho que não. Como você ensina programação corretamente? Além de loops, ifs, métodos, classes e OOP, o que seria 'programação adequada' e como você a tornaria relevante para qualquer linguagem de programação existente? Você precisa ter experiência em escrever código, algo que um diploma de 4 anos não pode preparar você.
Uma coisa que eu faria seria fornecer uma aula sobre desenvolvimento no mundo real. Controle de origem, rastreamento de tickets / bugs, rastreamento de código e tudo o que jazz seria um bom começo para preparar todos os graduados em breve para o que enfrentarão em seus novos empregos.
Acho que depende de nós quando contratamos um novo graduado para entender que eles provavelmente não vão escrever um código premiado. Eles precisam de orientação e direção.
fonte
É importante que a universidade encontre um bom equilíbrio entre o conhecimento teórico e as habilidades práticas. Enquanto participava de cursos diferentes, aprendi os dois. Durante os primeiros anos, houve muitas estruturas matemáticas e de algoritmos / dados. O que se seguiu foi uma escolha: você poderia continuar aprendendo ciência da computação (tipo de caminho artístico, onde poderia, por exemplo, frequentar cursos com sofisticados algoritmos de correspondência de cordas) ou se concentrar em engenharia de software. Você ainda precisava obter um sólido histórico de programação durante esse período.
Eu escolhi a engenharia de software, porque nunca estava muito interessado em problemas abstratos. Mas mesmo aqueles que gostavam de pura ciência da computação precisavam:
linux
módulo do kernel e modifique o próprio kernel, escreva um jogo orientado a objetos puroSmallTalk
,Java
em uma equipe de quatro,C
para programação paralela (as idéias eram abstratas, mas as revisões eram bastante duras, como perder pontos por não fornecer saída adequada, quando o programa falhava, como um bom unixprogram
deveria fazer),django
, o que me fez amar essa estrutura),LAMP
(ainda tenho pesadelosphp
, mas usei empostgresql
vez dissoMySQL
e estou muito feliz em saber dissoDBMS
agora),python
programa desktop de 10k linhas usandoPyQt
.Talvez houvesse outros projetos, mas eu simplesmente os esqueci agora.
O que quero dizer é: tudo depende da escola. Não gosto muito da abordagem pura de engenharia de software, onde
Java
é o idioma principal. Eu tive que ajudar um amigo uma vez, que freqüenta essa escola e tive que escrever um programa para programação paralela. Eu tive que escrever para ele basicamente, porque ele,sizeof(some_string)
no entanto,C
dá o comprimento da corda.Serei honesto: eu odiava matemática, estava com dor, quando tive que me preparar para tarefas abstratas, que seriam servidas em exames de algoritmos / estruturas de dados. Mas isso me dá uma certa vantagem: consigo pensar de uma maneira muito abstrata. É como quando você aprende artes marciais e não guarda (pelo menos naquelas onde você deveria). O treinador continua chegando e batendo na sua cabeça, quando você abaixa as mãos, porque você esqueceu ou porque está cansado demais para mantê-las. Mas depois de algum tempo, você apenas os mantém. E fica muito difícil acertar você na cara. O mesmo acontece com problemas algorítmicos abstratos. Entenda o conteúdo da Introdução aos algoritmos e realmente poucas coisas surpreenderão no trabalho.
fonte
Eu acho que a resposta é sim (de certa forma).
O fato é que não é possível ensinar às crianças em um curto período de tempo programando. Devem ser pensados o raciocínio lógico dos programadores, como resolver (em menor escala) os problemas do programador.
Estou certo de que os programas da escola devem ser revisados, meu pequeno país do "terceiro mundo", felizmente, um esforço está sendo feito para que isso aconteça. Nós somos o primeiro país a implementar o programa OLPC; http://laptop.org/en/
fonte
Da minha própria experiência (sou estudante no momento), tenho que dizer que sim, é uma desculpa. Todo mundo se refere ao CS como uma ciência que nos ensina todas as noções básicas de computadores e o SE como um ramo especial no CS que ensina explicitamente a programação. Imo, todo mundo que tem BS no CS, precisa saber como escrever código bom e otimizado (mesmo que a programação não seja sua área de especialidade). Então, sim, se eu tivesse uma posição onipotente de tomar essa decisão, forçaria os alunos a adquirir boas habilidades de programação.
fonte
Assumindo que o objetivo é educar bons engenheiros de software (programadores) porque o mundo precisa deles, não há problema em responder dizendo o que acho que deveria ser ensinado?
Primeiro, isso é importante porque atualmente a transferência de conhecimento é muito ineficiente. Quando os programadores em potencial estão nas aulas, suas mentes estão abertas e absorvem o que aprendem. Ao mesmo tempo, os professores (eu fui um) com demasiada frequência estão mais interessados em preencher o canal da pós-graduação com alunos que podem trabalhar em assuntos esotéricos. Quando se levanta a objeção de que os estudantes não estão sendo preparados para problemas do mundo real, vi professores afirmarem que esse não é o trabalho deles . Esse é o trabalho do mundo real.
Então, quando os alunos se tornam programadores no mundo real, eles estão ansiosos para aprender com seus novos colegas? Não na minha experiência. Antes, eles estão ansiosos para espalhar o evangelho que adquiriram na escola. Lembro-me, como estudante e jovem praticante, de pensar como seria difícil promover novas idéias entre os velhos peludos por aí. Agora que sou velho, vejo como é difícil abrir os olhos dos novos programadores para a diferença entre teoria e prática.
Eu era estudante de engenharia, em engenharia mecânica e, posteriormente, elétrica. Uma parte fundamental disso foi a) fundamentos matemáticos eb) solução prática de problemas. A engenharia de software deve ser assim, não apenas a programação.
Eu acho que a engenharia de software (programação) deve ser ensinada com ciência da computação suficiente para ser um conhecimento prático - teoria básica de autômatos e teoria da informação. Isso não precisa ser feito em grande profundidade. Depois que as habilidades básicas de programação são ensinadas, deve haver projetos cooperativos de tamanho não trivial. Uma parte essencial disso deve ser a proposta e a consideração de soluções alternativas de problemas específicos, com análise de prós e contras, não apenas a religião mais recente ou a "próxima grande coisa" ou o modelo único. Por fim, deve haver cooperação e parceria entre a indústria e a academia, para que idéias e melhorias possam ser comunicadas nos dois sentidos, melhorando bastante o controle de qualidade.
fonte
Aqueles que podem, fazem; aqueles que não podem ensinar.
Na minha universidade, a base de conhecimentos dos professores é extremamente deficiente. Vi professores lutando para entender como representar tabelas semiestruturadas em XML enquanto mantinham um PHD em Design de Banco de Dados. Eu vi meu professor de montagem me perguntar o que meu código está fazendo quando foi copiado e colado o trecho de código dele. Eu já vi meu professor de design de software nos dizer que o método Agile é o mesmo que o método em cascata, apenas mais rápido, que o modelo de processo de desenvolvimento iterativo possui e pode ter apenas três iterações, porque é essa a imagem que o livro usa como exemplo. Um dos meus professores nem sabia o que era uma declaração elseif.
Não acredito que eles estejam "dando um jeito" ou dando desculpas, acredito realmente que estão fazendo o melhor que podem com suas experiências, das quais têm muito poucas.
Concordo com as outras pessoas que postam aqui que 4 anos não são suficientes para se tornar um programador experiente, mas a experiência que meus professores tiveram também não é suficiente para torná-los experientes. É como em Ender's Shadow, onde Bean percebe que as métricas usadas pelos professores na escola de batalha ficam aquém porque a última guerra, que é a regra dos guias, era muito curta para mostrar realmente o que é realmente necessário. Em outras palavras, os professores estavam fazendo o melhor que podiam, mas não tiveram a experiência necessária para saber o que é realmente necessário para se tornar um bom comandante (ou um bom programador neste caso).
fonte
Those that can, do; those that cannot, teach.
Também não concordo com isso: carreiras acadêmicas e industriais levam a estilos de vida completamente diferentes. Grande parte da pesquisa mundial vem de acadêmicos. E não vejo como você respondeu à pergunta original.Cientistas da computação e engenheiros de software são diferentes. O cientista é o pessoal que realiza os experimentos malucos e apresenta os algoritmos que nós, engenheiros de software, utilizamos para melhorar.
Pense em químicos realizando experimentos para uma empresa farmacêutica. Eles não se importam em como produzir o produto químico em massa. Tampouco se importam com marketing, embalagem, distribuição ou qualquer coisa que aconteça com o medicamento depois de descobri-lo. Inferno, eles nem se importam com o processo de certificação. Eles só se preocupam em encontrar um produto químico que tenha efeito quando administrado aos sujeitos do teste. A empresa é responsável por ir além disso.
Os cientistas da computação são como esses químicos. Tudo o que eles fazem é testar teorias com código. Eles não se importam com a manutenção do código. Eles provam uma teoria e passam para a próxima. Outra pessoa empacota esse algoritmo e o torna útil para as massas, e nós temos MP3 ou visão computacional com o Kinect ou streaming de vídeo no seu iPhone. Portanto, CS! = SE é um argumento válido.
Escreva a segunda parte da sua pergunta. Se eu oferecesse uma licenciatura em Teoria da Música, poderia haver um curso obrigatório de composição ou algo assim, mas não exigiria que ninguém estudasse um instrumento. Cabe ao aluno procurar o conhecimento que deseja. Ciência da Computação não é Engenharia de Software ... se você quer aprender SE, faça um curso duplo.
fonte
Edsger Wybe Dijkstra era um cientista da computação holandês.
Ele recebeu o Prêmio Turing de 1972 por contribuições fundamentais para o desenvolvimento de linguagens de programação , uma vez disse:
"CIÊNCIA DE COMPUTADOR NÃO É MAIS SOBRE COMPUTADORES DO QUE ASTROMIA É SOBRE TELESCÓPIOS."
CS é REALMENTE DIFERENTE DE UM SE. (CS! = SE).
Um CS é um cientista que adquiriu conhecimento de CIÊNCIA DO COMPUTADOR.
CIÊNCIA DO COMPUTADOR ou ciência da computação (CS às vezes abreviado) é o estudo dos fundamentos teóricos da informação e da computação e de técnicas práticas para sua implementação e aplicação em sistemas de computadores. É frequentemente descrito como o estudo sistemático de processos algorítmicos que criam, descrevem, e transformar informações.
A ciência da computação tem muitos subcampos, por exemplo:
Muitos de nós não precisamos de nenhuma dessas habilidades no trabalho diário ou pelo menos um pouco delas.
O ENGENHEIRO DE SOFTWARE (SE) é uma profissão dedicada ao design, implementação e modificação de software, para que seja de qualidade superior, mais acessível, sustentável e mais rápida de construir. É uma "abordagem sistemática para a análise, projeto, avaliação, implementação, teste, manutenção e reengenharia de um software, aplicando engenharia ao software"
Como um conhecimento de CS, ele deve ter o conhecimento necessário para gerenciar problemas complexos reais sem conhecer uma linguagem de programação realmente boa. IMHO aqui podemos abrir outro tópico, onde um GRAU para mim é apenas um ponto de partida e não um objetivo final.
Como conhecimento de SE, ele deve ter o conhecimento necessário para gerenciar a produção desse problema complexo real e gerenciar o desenvolvimento de uma equipe ou projeto sobre esse campo.
Juntos, fazer a pesquisa em ciência feita por um CS em Ciência aplicada, com a ajuda de um SE.
Não quero dizer que CS é melhor que SE, quero dizer CS! = SE.
Esse tipo de pergunta é a mesma pergunta que pessoas que não são de computadores perguntam a si mesmas quando perguntam por que, como programadores, você não é capaz de resolver por telefone o problema do programa X, Y, Z no sistema operacional J, M, N. ;)
Na verdade, eu estou realmente entediado de codificar depois de 10 anos de desenvolvimento de sistemas unix no campo da segurança e depois de ler essa pergunta, entendi o ponto, preciso estudar mais ciência da computação e menos linguagem e sistema ou protocolo de computador!
Ninguém no meu trabalho pode lidar com a diferença entre SE e CS! é realmente uma coisa ruim.
Se você acha que um CS pode ser uma desculpa para uma péssima habilidade de programação, você realmente não entende o que é um CS e o que é SE.
Suponho que você seja um SE, você sabe, por exemplo, que toda a linguagem, todo paradigma e todas as coisas relacionadas à linguagem do computador podem ser expressas matematicamente em um conjunto de funções recursivas parciais e o que você aprende em um novo idioma, QUALQUER NOVA LÍNGUA, você é apenas aprendendo uma nova abstração sobre a mesma função parcial recursiva?
diverta-se :)
fonte