Greg Wilson recentemente me enviou um e-mail com a seguinte pergunta:
Estou ministrando uma aula de engenharia de software para alunos do terceiro ano da Universidade de Toronto a partir de janeiro e gostaria de incluir pelo menos uma hora sobre implantação — [deployment] nunca foi abordado em nenhuma das minhas aulas e é rapidamente esquecido na maioria dos livros didáticos de engenharia de softwaremas aprendi da maneira mais difícil que, muitas vezes, é um desafio tão grande quanto conseguir escrever o aplicativo em primeiro lugar.
A implementação é um grande obstáculo. É um desafio até mesmo para as melhores equipes de desenvolvimento de software e é incrivelmente importante: se os usuários não conseguirem passar da etapa de instalação, nenhum dos códigos que o senhor escreveu terá importância! E, no entanto, como observa Greg, os livros didáticos de engenharia de software existentes dão a esse tópico crucial apenas um tratamento superficial. Na mesma linha, há algumas semanas, um colega de trabalho mais jovem me disse de passagem que ele nunca aprendeu nada sobre controle de código-fonte em nenhuma de suas aulas de ciência da computação. Como isso é possível? O controle de código-fonte é o próprio alicerce da engenharia de software.
Se não estivermos ensinando habilidades fundamentais de engenharia de software, como implantação e controle de código-fonte, na faculdade hoje, estaremos ensinando ciência da computação da maneira errada. De que adianta aprender a escrever código de forma abstrata se o senhor não consegue trabalhar nesse código em equipe em um ambiente controlado e não consegue implementar o software resultante? Como muitos graduados em ciência da computação descobrem tardiamente depois de conseguir seu primeiro emprego real em programação, isso não é nada bom.
Os estudantes de ciência da computação de hoje devem desenvolver software em condições tão próximas quanto possível do mundo realou a melhor aproximação disponível. Cada linha de código deve ser escrita sob controle de origem o tempo todo. Isso não é negociável. Quando chegar a hora de implementar o código, tente implementá-lo em um host da Web compartilhado comercial e descubra tudo o que isso implica. Se for um executável, crie um pacote de instalação autônomo que os usuários tenham de baixar, instalar e, em seguida, ter algum mecanismo para registrar relatórios de bugs quando, inevitavelmente, não conseguirem fazê-lo funcionar. Os alunos devem acompanhar pessoalmente cada bug registrado para o software que escreveram.
Isso será doloroso? Caramba, caramba, será mesmo. Vai ser excruciante. Os alunos vão odiar. Eles começarão a questionar por que alguém em sã consciência gostaria de escrever software.
Bem-vindo ao mundo real.
Depois que escrevi minha resposta a Greg, Joel Spolsky publicou um sobre educação em ciência da computação que, pelo menos a meu ver, parecia assombrosamente semelhante ao conselho que ofereci:
Acho que a solução seria criar um BFA em Desenvolvimento de Software com uso intensivo de programação – um Julliard para programadores. Esse programa consistiria em um requisito prático de estúdio para desenvolver trabalhos significativos de software em equipes com professores muito experientes, com uma pitada de aulas de artes liberais para equilibrar.
Quando eu disse BFA, Bachelor of Fine Arts (Bacharel em Belas Artes), eu estava falando sério: o desenvolvimento de software é uma arte, e a educação existente em Ciência da Computação, na qual se espera que o senhor aprenda algumas coisas sobre completude de NP e Quicksort, é singularmente inadequada para treinar os alunos a desenvolver software.
Em vez disso, imagine um currículo de graduação que consiste em 1/3 de artes liberais e 2/3 de trabalho de desenvolvimento de software. Os professores são desenvolvedores de software experientes do setor. O estúdio funciona como uma empresa de software. O senhor pode ser capaz de se formar em Desenvolvimento de Jogos e trabalhar em um título de jogo importante, por exemplo, e é assim que o senhor passa a maior parte do seu tempo, assim como um estudante de cinema passa muito tempo realmente fazendo filmes e os estudantes de dança passam a maior parte do tempo dançando.
Isso não quer dizer que os programas de ciência da computação devam negligenciar a teoria. Conceitos fundamentais, como algoritmos e estruturas de dados, ainda são importantes. Minha aula de algoritmos era a minha favorita e, por longe o curso mais útil que já tive em meu próprio curso de ciência da computação. Mas ensinar essas coisas no despesas de negligenciar habilidades de engenharia de software mais prosaicas do mundo real – habilidades de que o senhor precisará desesperadamente como desenvolvedor de software praticante – é um erro colossal. É a isso que Steve Yegge se referia em seu ensaio fantástico da Wizard School.. Acho que sim.
Existe a preocupação de que todos esses diplomas de ciência da computação de alta qualidade possam se degenerar em pouco mais do que programas de escolas vocacionais, algo que Joel mencionou em seu excelente discurso em Yale:
Nas instituições da Ivy League, tudo é Unix, programação funcional e coisas teóricas sobre máquinas de estado. À medida que o senhor desce na cadeia para escolas cada vez menos seletivas, o Java começa a aparecer. Se descer ainda mais, o senhor literalmente começa a ver aulas sobre tópicos como Microsoft Visual Studio 2005 101, três créditos. Quando chega às instituições de dois anos, o senhor vê o mesmo tipo de curso de “certificação” SQL-Server em 21 dias que vê anunciado nos fins de semana na TV a cabo. Não é hora de começar sua carreira em (voz diferente) Java Enterprise Beans?
O senhor pode ter as duas coisas. É por isso que sou tão entusiasmado com os estágios. As aulas de CS na faculdade tendem a ser tão áridas e acadêmicas que o senhor deve passar os verões trabalhando no setor, caso contrário, o senhor não terá as habilidades cruciais de engenharia de software de que precisará para sobreviver depois de formado. Pequenas coisas sem importância como, por exemplo, controle de código-fonte e implementação e aprender a lidar com os usuários. Sempre que me encontro com estudantes universitários que estão se formando em ciência da computação, falo muito sobre estágios. É para o seu próprio bem.
Parece-me um pouco injusto forçar os alunos a depender de estágios para concluir sua formação em ciência da computação. Ou, talvez, algo ainda pior. “O senhor quer aprender ciência da computação? Não precisa de faculdade! Basta baixar algumas imagens ISO e fundar sua própria startup de rede social!” Liberar a ganância nua e crua da multidão do TechCrunch em mentes jovens e tenras de programação parece absolutamente cruel.
Assim como devemos ensinar ciência da computação? Os mais cínicos entre nós podem dizer o senhor não pode. Acho que isso é uma desculpa. Se os alunos quiserem se preparar para uma carreira no desenvolvimento de software, eles precisam se livrar da teoria e passar uma parte significativa do tempo criando software, incluindo todas as partes verrugosas, espinhosas e sem glamour. Metade da engenharia de software é a mitigação da dor. Se o senhor não estiver xingando seu provedor de hospedagem na Web todas as semanas, brigando com seu sistema de controle de origem todos os dias, decifrando relatórios de bugs furiosos de seus usuários a cada hora, não está aprendendo ciência da computação.