Que habilidades são essenciais para a programação profissional que normalmente não são ensinadas nas escolas? [fechadas]

14

Sou graduado em ciência da computação no primeiro ano. Fui a uma feira de emprego, distribuí currículos, para minha surpresa consegui uma entrevista e, eventualmente, um estágio como desenvolvedor.

Expliquei ao entrevistador (quem será meu chefe) que sou apenas o primeiro ano e não tenho muita experiência em programação. Ele simplesmente me disse que, porque eu tenho uma sólida formação em matemática (estou quase terminando meu bacharelado em matemática, além de alguns cursos de graduação), ele está confiante de que vou me sair bem.

Eu me saio bem em todos os cursos de programação, mas ainda sinto que estou em desvantagem. No momento, eu realmente só quero fazer bem neste trabalho quando ele começar. O trabalho estará usando principalmente C #, mas além de obviamente aprender um pouco de C #, qual é a única habilidade que você gostaria de ter aprendido antes de se tornar um verdadeiro programador?

Qualquer conselho é muito apreciado, mas se você tiver algum livro em mente, informe. Obrigado!

Eric
fonte
8
Esta pergunta já foi feita várias vezes neste site de diferentes maneiras. por favor, procure primeiro e depois pergunte. dê uma olhada no FAQ; programmers.stackexchange.com/questions/149970/… ; programmers.stackexchange.com/questions/46716/...
tgkprog
3
Eu pesquisei e vi as duas perguntas. Mas não estou preocupado em aprender design ou desenvolvimento web. Estou preocupado em aprender o que muitos programadores acham que realmente deveriam ter aprendido na escola. No entanto, essas perguntas têm ótimos conselhos, mas não são exatamente o que estou procurando. Obrigado
Eric
+1 A única habilidade que eu gostaria de dominar antes de se tornar um programador em tempo integral é forte em habilidades de matemática porque as habilidades de matemática são discutíveis como a habilidade mais importante a ter, porque treina a mente para resolver problemas e aprender novos conceitos e, como programador, que é principalmente o que vou fazer todos os dias.
11113 Anthony
3
Fluxo de trabalho. E perceber que esse código não é um floco de neve exclusivo do unicórnio. Aplique o Princípio de menor espanto ao projetar. Pense antes de você. Gerenciar a complexidade se torna um aspecto muito importante.
Sleeplessnerd
1
Na verdade, eu não gosto muito de trabalhar com pessoas com fortes habilidades matemáticas. Eles transformam tudo em uma fórmula matemática, em vez de aplicar os princípios da engenharia de software. Software NÃO é matemática. É essencial que você escreva seu código para que seja fácil de entender.
Rob K

Respostas:

21

Na escola, você aprende sobre como escrever código. O que você não aprende é o restante do desenvolvimento de software. As principais coisas sobre as quais nunca aprendi nada na escola são:

  • trabalhando como parte de uma equipe de desenvolvimento
  • usando controle de versão
  • usando um rastreador de erros

Essas são habilidades muito importantes para qualquer desenvolvedor, e você provavelmente não as encontrará na sala de aula, infelizmente.

Mason Wheeler
fonte
4
Trabalhar como parte de uma equipe de desenvolvimento é uma arte sutil e complexa, com certeza. No entanto, não entendo por que o controle de versão e o rastreamento de erros são sempre considerados um obstáculo importante para os novos desenvolvedores. Eles certamente são ferramentas importantes, mas você aponta a nova pessoa para as páginas de manual, um livro da O'Reilly ou um tutorial on-line e eles podem entender o uso de pão e manteiga em questão de horas. Por que você desperdiçaria o tempo da sala de aula com algo assim?
Charles E. Grant
1
@ CharlesE.Grant O controle de versão é semelhante à programação, pois você pode obter o básico em um tempo relativamente curto, mas é preciso experiência para ser usado com eficiência. E DVCS como git e Mercurial levam mais para entender do que CVCS como svn.
precisa saber é o seguinte
8
Eu nunca tive aulas de manutenção de código estabelecido (que é a maior parte do trabalho como parte de uma equipe de desenvolvimento) e minha experiência em sala de aula sobre como testar código era mínima.
Velociraptors
1
@ CharlesE.Grant: tenho ministrado cursos de pós-graduação em programação e tópicos relacionados por vários anos. Até os alunos de pós-graduação têm dificuldade em entender por que deveriam usar qualquer sistema de controle de revisão. E quando eles relutantemente começam a usá-lo, eles parecem ficar muito confusos com isso muito rapidamente. +1 a Mason por elevá-lo como um tópico importante não aprendido.
Peter K.
1
+1 +1 +1, um para cada ponto. É tão estúpido que eles não ensinam essas coisas ... ou pelo menos tentam ensinar.
Radu Murzea
20

Gostaria de saber no início da minha carreira que, como desenvolvedor, tenho um papel muito importante nos negócios . Eu não sou apenas um macaco de código.

Como desenvolvedor, você tem uma participação importante nas partes dos negócios relacionadas ao software em que está trabalhando.

Se sua empresa não escrever testes para o código deles, comece a escrever testes agora.

Se eles não rastrearem erros, encontre um rastreador apropriado agora.

Se seu chefe deseja que você comece imediatamente a trabalhar em uma animação sofisticada para a tela inicial do aplicativo de planilha - mas você ainda tem dezenas de bugs para corrigir e vários recursos críticos inacabados antes do próximo prazo de lançamento do cliente - converse sobre como priorizar corretamente o trabalho .

Mesmo se você é apenas "um funcionário normal", agir como consultor é uma ótima maneira de se diferenciar de outros desenvolvedores que apenas escrevem código e não agem como se tivessem interesse nos negócios.

Mark Rushakoff
fonte
9

Minha escola nunca me ensinou como resolver problemas. Eles me ensinaram a mecânica da codificação, mas ser capaz de estudar um problema, entendê-lo e encontrar uma solução é algo que eles não ensinaram. Requer paciência, rigor e intuição, além do entendimento de uma linguagem de programação.

Eles também não ensinaram sobre trabalho em equipe, controle de versão e a importância de escrever código fácil de manter. Eles também não ensinaram muito sobre como testar software. Eles podem ter tocado no teste de unidade, mas não se aprofundaram muito nos conceitos de teste de aceitação, teste de regressão etc.

Disclaimer: Eu fui para a faculdade nos anos 80. No entanto, vejo evidências disso com as pessoas contratadas hoje - recém-formados que têm muito pouco conhecimento sobre o mundo real da programação: controle de versão, testes, codificação limpa, habilidades de depuração etc.

Bryan Oakley
fonte
+1 para a parte de teste. Na minha universidade, eles também não ensinam. Eu tive 1 aula (sim: uma) em que o professor mencionou o teste de unidade ... por cerca de 3 minutos. É isso aí.
Radu Murzea
Sei que essa é uma resposta tardia, mas essa foi uma das coisas que fez meu diploma de matemática atraente para meus empregadores. Essa visão também é definitivamente compartilhada entre os empregadores.
Eric
Concordo que, em muitas escolas, os algoritmos (também conhecidos como "solução de problemas") não são ensinados adequadamente, ou não são ensinados de forma alguma, ou não ensinam como aplicá-lo com uma linguagem de programação, mesmo que seja necessário "agnóstico".
umlcat
Hmmmm .... sua resposta não poderia ser mais oposta ao que eu experimentei. O objetivo principal da escola é fornecer um plano de fundo para que você possa estudar efetivamente um problema, entendê-lo e encontrar soluções. Um novo aluno pode não ser "bom" quando sair da escola, mas certamente deve ser treinado e capaz disso. Na minha escola, eles não ensinavam programação. Esperava-se que você aprendesse a programar (por conta própria) enquanto aprendia as informações que o curso estava tentando ensinar. Então, onde você começa eles só ensinam a "mecânica de codificação" de está além de mim ...
Dunk
... Nas escolas decentes, você não recebe crédito por simplesmente aprender a codificar. Se você acha difícil usar o controle de versão, você tem problemas muito mais sérios que nenhuma escolaridade poderá ajudar. Quando você criar a maneira definitiva de escrever código fácil de manter, escreva um livro e fique rico. Ninguém resolveu esse problema ainda. Você deve ter perdido as partes da escola em que teve que entregar seus programas para ser testado. Os testes de aceitação / regressão são específicos do setor e são mais bem ensinados no trabalho, da maneira da empresa do que na escola.
Dunk
7

Na minha opinião, algumas das coisas mais importantes não aprendidas (ou aprendidas adequadamente) na escola são:

  • Como usar corretamente e IDE; usar todo o poder de um IDE moderno proporciona um enorme aumento de produtividade: refatoração automática, navegação de código, integração de VCS, análise de código, conclusão de código etc.
  • Como usar corretamente um depurador: depuração remota, depuração de aplicativos multithread, avaliação expressa etc.
  • Reparação e manutenção de bugs; na universidade, eles não ensinam quase nada sobre isso, mas na indústria é bastante comum a correção de bugs.
  • Como trabalhar em uma grande equipe e em um grande projeto; basicamente na universidade, os projetos são pequenos, em comparação com os grandes projetos industriais.
  • Como escrever um bom código e como enfatizar a legibilidade; isso vem com a experiência, mas existem alguns livros que ensinam o básico (código completo, código limpo etc.).
  • Como usar uma estrutura em sua potência máxima, usando sua personalização; na universidade, talvez você tenha aprendido a usar algumas estruturas em alguns cenários muito básicos; na indústria, você alcançará as esquinas.
  • Como entender e escrever código após a especificação; você provavelmente aprenderá a escrever especificações, mas agora como lê-las e interpretá-las

VCS, sistemas de rastreamento de bugs, ferramentas de construção etc. são ferramentas que você é obrigado a aprender para poder trabalhar com uma equipe; eles não exigem muito tempo para serem aprendidos em um nível básico e são bem diretos depois disso (pelo menos no começo); a lista acima contém sutilezas que, se conhecidas, aumentam sua produtividade.

m3th0dman
fonte
aka "Programação" não é apenas conhecer uma linguagem de programação, há um "ambiente", "ecossistema", "quadro" ...
umlcat
4

A maior coisa que vejo faltando nos recém-formados é uma boa compreensão do controle de versão.

Se você tem experiência no desenvolvimento de software de código aberto usando repositórios de código-fonte (como o GitHub ), está um passo à frente mostde seus colegas de classe.

A segunda coisa é uma compreensão da complexidade ( big O). A maioria das pessoas fora da faculdade já ouviu falar sobre isso, mas ainda não desenvolveu um software real onde ele entra em jogo e, portanto, não entende sua real importância.

Quando seus conjuntos de dados são tão grandes que a força bruta nunca é suficiente e o entendimento de outras técnicas é útil e ser capaz de adivinhar quando a força bruta será adequada para a situação, é algo que você desenvolve com a experiência e comete os erros.

Martin York
fonte
1
Eu acho que a falta de educação em controle de versão está começando a mudar. O controle de versão estava muito estressado na minha escola.
Southpaw Hare
@SouthpawHare: Eu não estou dizendo que não existe, eles até ensinaram nos meus dias. Só que as pessoas que saem da universidade com essa experiência ainda são minoria. E, como as pessoas que a possuem, são mais valiosas. Não concordo que tenha mudado muito nos últimos 20 anos.
Martin York
3

Como depurar bem, especialmente usando um depurador e adotando uma abordagem adequada para solucionar um bug, ou seja, descobrir o que está causando, descobrir por que está causando e entender por que sua solução o corrige, em vez de simplesmente tentar coisas e esperar.

A maioria dos graduados em ciência da computação é notavelmente pobre em depuração e, como resultado, leva muito mais tempo para consertar as coisas necessárias e criar mais erros ao fazê-lo.

Vale a pena mencionar outras coisas, como controle de versão, rastreamento de erros etc., mas, a meu ver, a falta de abordagens sensatas à depuração é um problema muito maior e que requer mais aprendizado.

Jack Aidley
fonte
2

qual é a única habilidade que você gostaria de ter aprendido antes de se tornar um verdadeiro programador?

Na minha experiência, minha escola nunca me ensinou como resolver problemas.

Na minha experiência, programação é toda sobre resolver problemas. Na minha escola, eles estavam apenas verificando se você pode escrever um programa sem erro de sintaxe. O que é realmente necessário não é fornecido como entrada. A sintaxe é apenas algo que você pode procurar em qualquer livro, se necessário. Mas a capacidade de resolver um problema não pode ser alcançada de qualquer lugar, exceto que você pratique bem e se treine para isso.

Seja de qualquer tipo, tente concluir o maior número possível de perguntas para que você construa alguma confiança em si mesmo. Tente fazer isso com alguma paixão em sua mente, e você certamente conseguirá.

Abijith Kp
fonte
2

Dedique algum tempo para aprender alguns padrões comuns de design: fábrica, singleton, adaptador, comando e observador (minha faculdade não os ensinou).

Se a empresa usar a metodologia Agile para desenvolvimento de software, seria valioso ter alguma compreensão dela.

user86834
fonte
2

Muitas das habilidades que você precisará como programador profissional são quase impossíveis para cada uma em uma universidade / ambiente acadêmico.

Eles podem vir apenas da experiência de trabalhar diretamente no campo.

  • Aprender a colaborar e se comunicar com pessoas fora da sua "profissão", como designers gráficos, designers de produtos, gerentes etc.

  • Entendendo que seu trabalho não é escrever código, mas dar vida a um produto. Mais fácil falar do que fazer.

  • Saber equilibrar boas práticas de codificação com considerações práticas. Adquirir a capacidade de julgar quando o código é "bom o suficiente", "com excesso de engenharia" ou "precisa de refatoração".

  • Aprendendo a superar suas próprias fraquezas e inseguranças. Adquirir a capacidade de suportar críticas. Soltando seu ego. Aprendendo o que significa assumir responsabilidade pessoal e depois assumi-la.

É fácil ler sobre tudo isso. É algo totalmente diferente colocar isso em prática. A única maneira é fazê-lo. Você será mordido muitas vezes, e provavelmente machucará, mas sairá mais forte e melhor.

Leitura relevante: Padrões de Aprendizagem

hasen
fonte
1

Tudo depende da escola. Na minha faculdade, temos muitos projetos práticos. Frequentemente em equipes e usando vários controles de origem. Então, acho que algumas escolas se concentram nessas.

Mas uma coisa que a escola não ensina: detalhes. Muitas vezes, quando a escola ensina alguma tecnologia ou prática (como desenvolvimento da Web, desenvolvimento de JAVA UI, bancos de dados avançados), elas apenas arranham a superfície e nunca entram em detalhes, que seriam necessárias para usar essa tecnologia ou prática nos negócios do mundo real. Você obterá uma visão geral das possíveis maneiras de resolver seus problemas, mas precisará aprender os detalhes necessários.

O único momento em que a escola ensina algo em detalhes é quando há uma forte base matemática ou teórica por trás de algo. Coisas como linguagens formais ou bancos de dados SQL são muitas vezes parte essencial do currículo escolar, porque são construídas com base matemática e são muito usadas em ciência da computação ou engenharia.

Eufórico
fonte
1
  • requisitos - errar e descansar é principalmente um desperdício
  • prioridades (que recurso em que versão)
  • fazer ou usar fora da caixa (comprar / freeware)
  • trabalho em equipe
  • gerenciamento de projetos - requisitos, qualidade (amostras de dados no prod, casos de teste, como testar, cobertura antes do código, há mais custos, mas não são relevantes. leia um livro do PMI
  • ferramentas de comunicação (correio, reuniões: planejador de calendário)
  • gerenciamento de código fonte
tgkprog
fonte
0

Eu gostaria de ter decidido, no começo do jogo, se eu queria ou não ser um programador geral, aprendendo muitas coisas diferentes, idiomas, bancos de dados e plataformas, e eventualmente me tornando um desenvolvedor da Web, ou devo apenas me especializar em um CMS, ou até mesmo se especializar no Photoshop, sendo um especialista, suas habilidades seriam tão valiosas e lucrativas quanto, na verdade, saber o que um verdadeiro programador deveria saber. Em outras palavras, se você só precisa ganhar um bom dinheiro, especialize-se em UMA COISA. Se você gosta do computador e gosta de resolver problemas, seja um programador.

[refletindo sobre e depois de aprender como 4 ou 5 'estruturas' de javascript diferentes antes que o JQuery realmente se tornasse forte, obtendo a certificação em JAVA e nunca obtendo uma posição em java e depois de trabalhar em várias plataformas; AS400-rpg, .NET - c # e PHP, antes de desejar dominar o photoshop e ganhar dinheiro igual sem precisar corrigir bugs ou escrever software. ]

Quero dizer, há uma certa satisfação em conhecer uma ampla gama de tópicos, mas a satisfação é prejudicada quando você vê alguém que apenas conhece o photoshop descontar o mesmo salário.

Eric
fonte
2
Sim, mas esse tipo de especialista nunca vai abrir sua própria loja. Se o seu sonho é ser CEO de sua própria startup em algum momento no futuro, você precisará de uma enorme variedade de habilidades.
Davor raldralo