A maioria dos programadores modernos se formou em universidades. Com o tempo, isso mudará, mas atualmente é um fato que bons talentos em empresas de TI ainda vêm das universidades. Neste post, Stanislav Protasov, diretor da Acronis para relações com universidades, compartilha sua visão sobre as particularidades da formação universitária para futuros programadores. Professores, alunos e aqueles que os contratam podem encontrar algumas dicas úteis abaixo.
Nos últimos 10 anos, ensinei matemática, algoritmos, linguagens de programação e aprendizado de máquina em várias universidades. Hoje, além da minha posição na Acronis, sou também vice-chefe do departamento de informática teórica e aplicada no MIPT. A partir da experiência adquirida em boas universidades russas (e não apenas), tirei algumas conclusões sobre a formação de alunos nas disciplinas de computação.
A regra dos 30 segundos já não funciona mais
Estou certo de que você já se deparou com a regra dos 30 segundos, que afirma que um programador deve entender a finalidade de uma função após um olhar rápido no seu código. Essa regra foi criada há muito tempo, e desde então surgiram numerosos sistemas operacionais, linguagens, hardware e algoritmos. Escrevo código há 12 anos, mas recentemente vi o código-fonte de um produto que, à primeira vista, parecia um feitiço mágico. Hoje, se você não está imerso na área do conhecimento, a regra dos 30 segundos deixa de funcionar. Caso contrário, você não conseguirá entender em 30, mas também em 300 segundos, o que está acontecendo.
Por exemplo, se você deseja escrever drivers, precisará mergulhar nesse campo e ler milhares de linhas de código específico. Com essa abordagem ao estudo do assunto, o especialista desenvolve uma 'sensação de flow'. Assim como no rap, onde a boa rima e o ritmo correto surgem sem racionalização específica. Um bom programador pode facilmente identificar código ineficaz ou simplesmente ruim, sem se aprofundar nos detalhes que causaram a violação do estilo ou a utilização de um método não otimizado (embora explicar essa sensação possa ser bastante complicado).
A especialização e a crescente complexidade fazem com que a graduação já não seja suficiente para estudar todas as áreas em profundidade. Mas é exatamente neste nível de ensino que se deve adquirir uma visão ampla. Depois, no mestrado ou no trabalho, será necessário investir um certo tempo para se aprofundar nas questões e especificidades do campo, estudar a gíria, as linguagens de programação e o código dos colegas, ler artigos e livros. Parece-me que só assim, com o auxílio da universidade, é possível "fortalecer a barra" para o futuro. .
Qual linguagem de programação é melhor ensinar na universidade?

Para minha alegria, os professores das universidades já desistiram de buscar a resposta correta para a pergunta: "Em qual linguagem é melhor programar?" As discussões sobre o que é melhor — C# ou Java, Delphi ou C++ — praticamente se extinguiram. O surgimento de várias novas linguagens de programação e a acumulação de experiência pedagógica levaram ao entendimento na comunidade acadêmica de que cada linguagem tem seu nicho.
O problema do ensino utilizando uma determinada linguagem de programação deixou de ser uma prioridade. Não importa qual linguagem é utilizada no curso. O principal é que a linguagem seja suficientemente expressiva. O livro "" é uma boa ilustração dessa observação. Nesta obra que já se tornou clássica, todos os exemplos são apresentados em Java — uma linguagem sem ponteiros, mas com Garbage Collector. Dificilmente alguém discordaria que Java está longe de ser a escolha ideal para escrever código paralelo de alto desempenho. No entanto, para explicar os conceitos apresentados no livro, a linguagem se mostrou adequada. Outro exemplo é o " de Andrew Ng, ensinado na linguagem Matlab no ambiente Octave. Hoje, poderia-se escolher outra linguagem de programação, mas qual é, na verdade, a diferença, se as ideias e abordagens são o que realmente importa?
Mais prático e próximo da realidade
Ao mesmo tempo, nos últimos anos, o número de profissionais nas universidades aumentou significativamente. Se antes os programas universitários russos eram amplamente criticados por estarem desconectados da realidade, atualmente essa crítica não se aplica mais à educação em TI. Há 10 anos, quase não havia professores com experiência prática na indústria nas universidades. Hoje, é cada vez mais comum que as aulas na disciplina especializada sejam ministradas por especialistas em TI que trabalham na área, mas que lecionam apenas 1 ou 2 cursos no seu tempo livre. Essa abordagem se mostra eficaz na formação de profissionais qualificados, na atualização dos cursos e, claro, na busca de talentos potenciais para as empresas. Não acho que estou revelando um segredo ao dizer que apoiamos a cátedra base no MIPT e estamos estabelecendo relações com outras universidades, inclusive para preparar estudantes que possam iniciar suas carreiras na Acronis.
Matemático ou programador?

As polêmicas que antes giravam em torno das linguagens de programação agora tomaram um caráter filosófico. Agora, discutem entre si os supostos “programadores” e “matemáticos”. Essas escolas poderiam, em princípio, se destacar em dois programas educacionais distintos, mas a indústria ainda não separa bem essas sutilezas, e de uma universidade para outra temos uma educação semelhante, mas com pequenas variações. Isso significa que tanto o estudante quanto a empresa onde ele trabalhará precisarão completar o quebra-cabeça do conhecimento com as peças que faltam.
A presença de profissionais nas universidades, que escrevem código industrial em várias linguagens, proporciona aos estudantes habilidades de desenvolvimento de maior qualidade. Familiarizados com as implementações de bibliotecas padrão, estruturas e técnicas de programação, programadores-práticos incentivam os alunos a escrever código de qualidade, de forma rápida e eficiente.
Esse útil hábito, no entanto, às vezes leva ao surgimento de amadores que reinventam a roda. Estudantes programadores pensam: “o que me custa escrever mais 200 linhas de código bom, que resolverão diretamente a tarefa proposta?”.
Professores que têm uma formação clássica em matemática (por exemplo, matemática pura ou matemática aplicada) geralmente trabalham em ambientes científicos ou na área de modelagem e análise de dados. Os “matemáticos” veem de forma diferente os problemas na área de Ciência da Computação. Em primeiro lugar, eles operam não com código, mas com algoritmos, teoremas e modelos formais. Uma grande vantagem da abordagem matemática é a compreensão clara e fundamental do que pode e o que não pode ser resolvido, e como isso deve ser feito.
Consequentemente, os professores de matemática falam sobre programação com um enfoque teórico. Os alunos que vêm de “matemáticos” costumam propor soluções bem pensadas e teoricamente mais aprimoradas, mas, em geral, são subótimas do ponto de vista da linguagem e, muitas vezes, são mal escritas. Esse aluno acredita que seu principal objetivo é demonstrar a capacidade de resolver tais problemas em princípio. No entanto, a implementação pode ser deficiente.
Os alunos que foram educados por programadores na escola ou nos primeiros cursos trazem consigo um “bicicleta muito bonita”, que, no entanto, geralmente não funciona de maneira muito eficiente assintoticamente. Eles, ao contrário, não se propõem a teorizar profundamente e a consultar livros didáticos em busca de soluções ótimas, preferindo um código bonito.
Em diferentes universidades, nos processos seletivos, costumo perceber qual a “escola” que está na base de sua formação. E raramente encontrei um equilíbrio perfeito na educação básica. Na minha infância, na minha cidade, era possível se preparar para olimpíadas de matemática, mas não havia clubes de programação. Atualmente, nas atividades extracurriculares, as crianças aprendem a programar em “modismos” como Go e Python. Portanto, já no nível de ingresso nas universidades, existem discrepâncias nas abordagens. Acredito que nas universidades é importante manter ambas as habilidades, caso contrário, a empresa receberá um especialista com uma base teórica insuficiente ou uma pessoa que não aprendeu e não deseja escrever um bom código.
Como realmente "treinar" os futuros

É evidente que, em tais condições, o estudante simplesmente escolhe o que mais lhe agrada. O professor, por sua vez, apenas transmite o ponto de vista que é mais próximo a ele. Mas todos se beneficiam se o código for bem escrito e, em termos de algoritmos, tudo for claro, fundamentado e eficaz.
- Visão de TI. Um graduado em Ciências da Computação já é um profissional com um amplo conhecimento técnico, que provavelmente escolheu sua especialidade. Mas nos primeiros anos, não sabemos o que ele ou ela vai fazer. Pode seguir para a ciência ou análise, ou, ao contrário, escrever uma enorme quantidade de código todos os dias. Portanto, é necessário mostrar ao estudante todos os aspectos do trabalho na área de TI, apresentando todas as ferramentas. É ideal que os professores dos cursos teóricos mostrem a conexão com a prática (e vice-versa).
- Ponto de crescimento. Evitar extremos é do interesse do próprio estudante. Compreender quem você é — “matemático” ou “programador” — não é difícil. Basta ouvir o primeiro impulso ao resolver um problema: o que você quer fazer — olhar para o livro em busca da abordagem ideal ou escrever algumas funções que posteriormente serão úteis? Com base nisso, pode-se construir uma trajetória complementar de aprendizado.
- Fontes alternativas de conhecimento. Às vezes, o programa é bem equilibrado, mas “Programação de Sistemas” e “Algoritmos” são ministrados por pessoas completamente diferentes, e alguns estudantes se identificam mais com o primeiro professor, enquanto outros preferem o segundo. Mas mesmo que você não goste do professor, isso não é motivo para negligenciar algumas disciplinas em favor de outras. Os próprios bachareis estão interessados em encontrar a determinação para trabalhar com fontes de conhecimento e, de forma alguma, confiar em opiniões radicais, como “matemática é a rainha das ciências, o principal é saber algoritmos” ou “um bom código compensa tudo o mais”.
Aprofundar seu conhecimento em teoria pode ser feito ao consultar literatura especializada e cursos online. Você pode aprimorar suas habilidades com linguagens de programação no Coursera, Udacity ou Stepik, onde há muitos cursos diferentes. Além disso, os estudantes costumam iniciar cursos avançados de linguagens quando sentem que o professor de algoritmos tem um bom domínio da matemática, mas não consegue responder a perguntas complexas sobre implementação. Nem todos concordarão comigo, mas na minha experiência, o curso de , que aborda sequencialmente todas as funcionalidades mais complexas da linguagem, é uma boa escolha. No geral, escolha um curso com altas avaliações, de empresas ou universidades respeitáveis.
Soft skills

. Ao sair da universidade para trabalhar em qualquer empresa, desde startups até grandes corporações, os estudantes de universidades de renome muitas vezes se mostram mal adaptados ao ambiente de trabalho real. O fato é que hoje as universidades cuidam muito dos alunos. Mesmo que um estudante perca várias aulas, não se prepare a tempo para provas e avaliações, ou chegue tarde aos exames, ainda pode passar e até mesmo recuperar — e, em última análise, obter um diploma.
No entanto, hoje existem todas as condições para preparar os estudantes para a vida adulta e a atividade profissional independente. Eles terão que não apenas programar, mas também se comunicar. E isso também precisa ser ensinado. Nas universidades, existem diversos formatos para aprimorar essas habilidades, mas, infelizmente, frequentemente não se dá atenção suficiente a essa questão. No entanto, temos à nossa disposição muitas oportunidades para adquirir habilidades eficazes de trabalho em equipe.
- Comunicação empresarial escrita. Infelizmente, a maioria dos profissionais que saem da universidade não tem noção da etiqueta de correspondência. A especificidade da comunicação em mensageiros e as diferenças de estilo ao enviar mensagens de dia e de noite, além do uso de um tom coloquial e vocabulário informal. No entanto, a prática da escrita poderia ser aprimorada por meio da comunicação entre o estudante e a faculdade e a universidade.
Na prática, os gerentes frequentemente se deparam com a necessidade de decompor um grande projeto em tarefas menores. Para isso, é crucial descrever bem cada tarefa e seus componentes, para que os desenvolvedores juniores entendam o que é esperado deles. Uma tarefa mal definida muitas vezes leva à necessidade de retrabalho, e, portanto, a experiência em comunicação escrita ajuda os graduados a trabalharem em equipes distribuídas.
- Apresentação escrita dos resultados do seu trabalho. Para apresentar seus projetos acadêmicos, estudantes do último ano podem escrever posts no Habr, artigos científicos, além de relatórios simples. Existem muitas oportunidades para isso — já a partir do segundo ano em algumas universidades, começam os trabalhos de curso. Também é possível usar ensaios como forma de avaliação — geralmente, eles se assemelham mais a um artigo de opinião. Essa abordagem já foi implementada na HSE.
Se a empresa pratica uma abordagem ágil no desenvolvimento, apresentar os resultados do trabalho costuma ser feito em porções menores, mas com mais frequência. Para isso, é importante saber comunicar concisamente os resultados do trabalho de um especialista ou da equipe inteira. Além disso, muitas empresas hoje realizam “revisões” — anuais ou semestrais. Os colaboradores discutem os resultados e as perspectivas de trabalho. Uma revisão bem-sucedida é a principal razão para crescimento na carreira e bônus, como por exemplo, na Microsoft, Acronis ou Yandex. Sim, você pode programar bem, mas “sentado no canto”, mesmo um especialista incrível sempre perderá para aquele que sabe apresentar bem seu sucesso.
- Escrita Acadêmica. Vale ressaltar a escrita acadêmica. É útil para os estudantes conhecerem as regras para a redação de textos científicos, uso de argumentos, pesquisa de informações em diversas fontes e formatação de referências a essas fontes. Preferencialmente, isso deve ser feito em inglês, uma vez que na comunidade acadêmica internacional há muito mais bons textos, e para diversas disciplinas já existem formatos consolidados de apresentação dos resultados científicos. Claro, as habilidades de escrita acadêmica também são necessárias na preparação de publicações em russo, mas há muito menos exemplos de bons artigos contemporâneos em inglês. Essas habilidades podem ser adquiridas em um curso específico, que agora faz parte de muitos programas educacionais.
- Condução de Reuniões. A maioria dos estudantes não sabe como se preparar para reuniões, elaborar atas e processar dados. Mas, se desenvolvemos essa habilidade na universidade, por exemplo, participando de projetos em grupo, podemos evitar a perda de tempo no ambiente de trabalho. Para isso, é necessário um controle sobre o trabalho do projeto dos estudantes, a fim de ensiná-los a conduzir reuniões de forma eficaz. Na prática, isso custa uma fortuna para cada corporação — afinal, se várias pessoas com altos salários passam uma hora do seu tempo de trabalho em uma reunião, é desejável que haja um retorno correspondente.
- Apresentação em Público. Muitos estudantes enfrentam a necessidade de se apresentar em público apenas na defesa do trabalho de conclusão de curso. E nem todos estão prontos para isso. Eu vi muitos estudantes que:
- ficam de costas para os ouvintes,
- balançam, tentando levar a comissão à uma espécie de transe,
- quebram canetas, lápis e apontadores,
- caminham em círculos,
- olham para o chão.
É normal que uma pessoa se sinta assim na primeira vez que se apresenta. Mas é preciso começar a trabalhar com esse estresse antes — nas defesas de trabalhos de curso em um ambiente amigável, entre colegas.
Além disso, a prática padrão nas corporações é dar ao funcionário a oportunidade de apresentar uma ideia e obter financiamento, um cargo ou um projeto específico. Mas, se pensarmos bem — isso é como uma defesa de trabalho de curso, apenas em um nível mais elevado. Por que não treinar essas habilidades de carreira úteis durante os estudos?
O que eu deixei de fora?
Um dos motivos para escrever este post foi um artigo, . O autor do artigo foca apenas nas desvantagens dos estudantes russos, observadas por professores estrangeiros. A prática do meu ensino em diferentes universidades mostra que a escola e o ensino superior russos oferecem uma boa base. Os estudantes russos têm uma boa formação em matemática e algoritmos, e é mais fácil estabelecer uma comunicação profissional com eles.
No caso de estudantes internacionais, as expectativas de um professor russo podem, por vezes, ser excessivas. Por exemplo, em nível de formação básica em matemática, os estudantes indianos que conheço são semelhantes aos russos. No entanto, muitas vezes lhes falta conhecimento específico ao se formarem na graduação. Bons estudantes europeus tendem a ter uma preparação matemática menos robusta no ensino médio.
E se você estuda ou trabalha em uma universidade, pode começar a desenvolver suas habilidades comunicativas (as suas ou as dos estudantes), ampliar a base fundamental e praticar programação. Para isso, o sistema educacional russo oferece todas as oportunidades — é necessário apenas aproveitá-las corretamente.
Ficarei feliz se você compartilhar nos comentários deste post seus links para cursos e métodos que ajudam a equilibrar a educação, assim como outras formas de aprimorar soft skills durante os estudos na universidade.
Fonte: habr.com
