Dicas para estudantes programadores

Olá Habr! Apresento a você a tradução do artigo " Conselhos para estudantes de programação ".

Há muitas coisas que eu gostaria de saber quando comecei minha jornada como estudante de software. Quase 10 anos se passaram desde então e, infelizmente, não posso compartilhar minha experiência e conhecimento com meu passado "eu", apenas com meus colegas mais jovens. Este post é composto por algumas dicas úteis que eu gostaria de ouvir quando tinha 18 anos.

Decida o que você precisa


Obviamente, você não precisa estar familiarizado com lógica ou categorias formais se quiser aprender como criar algo prático (por exemplo, uma interface) e fazer exatamente isso. Existem dois caminhos principais que diferem em esforço, duração e resultado.

  • Você pode dominar rapidamente uma área - digamos, em um ou dois anos. Você não será inútil, fará algo e ganhará a vida. Existem oportunidades de emprego suficientes (pelo menos por enquanto) que não exigem muita flexibilidade.
  • Você pode se tornar um especialista bem estabelecido que gastou muito tempo e esforço em coisas fundamentais. Então você pode se adaptar, mudar de carreira se torna relativamente fácil. Você pode fazer aprendizado de máquina, depois verificação formal, programação de baixo nível para negociação ou acessar o desenvolvedor do jogo. Leva tempo e dedicação - eu avaliaria esse processo por pelo menos 6-8 anos.

Defendo fortemente o segundo caminho, porque é mais universal, interessante e traz mais a longo prazo. A tecnologia está mudando constantemente, portanto, você desejará mudar rapidamente para novas tecnologias.

Matemática


Aprenda matemática porque a matemática é útil. Eu não posso enfatizar isso. Ao iniciar, você pode pensar que não precisa de álgebra linear porque não conhece aplicativos. No entanto, para qualquer aprendizado de máquina não trivial, você precisará dele. Você precisa de estatísticas e credibilidade. Você precisará de lógica, combinatória, teoria dos conjuntos, todos os tipos de matemática discreta, teoria dos grafos, teoria da computabilidade, gramáticas formais, cálculo lambda, semântica formal, topologia, teorias de tipos, teoria dos números, grupos, anéis, campos, categorias.

Novas tecnologias estão constantemente emergindo. Muitos deles são baseados em modelos matemáticos existentes. Se você conhece bem a matemática básica, obtém benefícios muito agradáveis:

  • A escolha entre novas tecnologias será muito mais fácil.
  • Você entenderá onde novos métodos devem ser aplicados e onde não.
  • Você entenderá por que as soluções são o que são. Você pode modificá-los para melhor se adequar ao contexto.

Por exemplo, tive a impressão de que poucas pessoas entendem por que você nem sempre precisa usar o método dos mínimos quadrados para avaliar quão bem sua regressão linear corresponde aos dados. Isso é necessário quando os erros são distribuídos normalmente com o valor médio correspondente. Se não for esse o caso, você aplicará cegamente uma solução inadequada, mesmo sem pensar que parte do modelo precisa ser ajustada.

Aprenda matemática para aprender matemática. Escrever provas torna você rigoroso em suas ações. Você sempre pensará em todos os caminhos de execução possíveis que seu programa pode executar para não introduzir erros e problemas de segurança. A clareza de pensamento obtida com a construção de evidências é preciosa. Também o ajudará a escrever um código curto e conciso.

Aprenda o melhor, use as melhores ferramentas


Escolha o seu primeiro idioma. Deve ser bem projetado, ou seja, ter:

  • Coerência.
  • Núcleo pequeno.
  • A falta de complexidade desnecessária (por exemplo, ao aprender uma linguagem "complexa", há coisas que você só precisa saber ou lembrar constantemente, elas não trazem nada útil para a aprendizagem).
  • Baixa probabilidade de "dar um tiro no próprio pé".
  • Alto nível, porque a programação é a solução de problemas e problemas , e não o domínio em nenhum idioma. Conhecer todos os pequenos recursos do seu idioma favorito não significa ser perfeito em programação.

Eu recomendo escolher um dos seguintes idiomas:

  • Esquema (existe um excelente curso introdutório clássico "Estrutura e Interpretação de Programas de Computador").
  • Smalltalk
  • Eiffel
  • ML

Não tenha medo de ser enganado pela aparente impopularidade dessas linguagens, no mundo da programação, popularidade não significa qualidade.

Não comece com Python, eu imploro! É mal projetado, inconsistente e não ensina a você um pensamento estrito. Não há necessidade de se acostumar com a mentalidade de "bom, geralmente trabalhando". Python tem seus usos, mas não como primeira língua.

Se você se acostumar com idiomas de baixa qualidade, ferramentas de baixa qualidade, software de baixa qualidade e soluções de baixa qualidade, inevitavelmente as repetirá em seu próprio trabalho . Seja crítico, faça perguntas, critique tudo, procure inconsistências e deficiências.

Por exemplo, imagine que você está aprendendo um novo idioma Go. O Google "Go language sucks" e leia por que as pessoas o criticam. Alguns comentários serão pequenos, mas outros realmente farão sentido. Você provavelmente obterá novos conhecimentos ao ler comentários críticos, avaliá-los e depois determinar se eles são importantes ou se são apenas palavras vazias.

Pense por si mesmo


Dou aulas de programação (C e assembler) desde 2009 para estudantes da Universidade ITMO em São Petersburgo. Muitas pessoas têm problemas de programação e nunca conseguem aprender isso porque não criam código. Quando conseguem o trabalho, tentam simular uma solução existente, talvez pegando alguns fragmentos do Stack Overflow, personalizando-os ao seu gosto. Ok, tenho uma solução, o que mais é necessário?

Você deve aprender a escrever código do zero. Os tipos de habilidades necessárias para fazer isso são tão diferentes das habilidades adquiridas por interferir no código existente!

Programar é fazer uma escolha consciente. Você está no estado A (você tem acesso a várias funções / bibliotecas de idiomas e sabe como combiná-las); você deseja obter o estado B (as construções de linguagem são combinadas para resolver o problema). Como você constrói uma rota de A para B? Agora isso é programação real, solução de problemas .

Quando você começa a escrever programas do zero, fica um pouco difícil, mas é absolutamente necessário aprender a criar coisas do zero. Para melhorar as habilidades de resolução de problemas, é importante estudar algoritmos e estruturas de dados. Pegue um bom livro e resolva problemas de olimpíadas online. Eu recomendo os algoritmos de Dasgupta para iniciantes, depois o livro clássico de Cormen. Tudo isso abrirá um mundo totalmente novo para você, prometo.

Uma parte adicional do processo de criação de software é o desenvolvimento da arquitetura de software; é impossível aprender a estruturar corretamente seus programas sem criá-los de 0 a 100.

Amplie seus horizontes


Programe todos os dias, faça projetos de terceiros o tempo todo. Essa é uma maneira muito simples (e principalmente precisa) de eu entender como professor que é muito provável que meu aluno seja bem-sucedido. Uma pergunta: o que você programa no seu tempo livre?

Seus professores simplesmente não têm tempo suficiente para falar sobre tudo. No final, depois de deixar a universidade, você deve continuar estudando por conta própria até se aposentar. Se você é apaixonado pelo que faz, aprenderá diferentes tipos de software por diversão, e isso lhe dará muito mais experiência e habilidades do que seus colegas menos motivados.

Idealmente, você deve tentar de tudo: escreva seu próprio compilador, talvez um sistema operacional de brinquedo, um servidor http, um mecanismo de banco de dados, jogos, rakecasting, crie algum tipo de rede neural, escreva um aplicativo móvel simples, escreva um programa embutido ..., você pode continuar a si mesmo. Coloque todos os seus projetos no GitHub e tenha orgulho deles: seu futuro empregador pode dar uma olhada nele. Use este portfólio para seus próprios propósitos.

É sabido que recrutar um bom programador é extremamente difícil. Muitos programadores que se candidatam a um emprego têm problemas para escrever coisas triviais como o FizzBuzz. Se você possui projetos hospedados no GitHub, o empregador ficará mais confiante de que você é adequado para ele.

Teste você mesmo com diferentes ferramentas e idiomas. Se alguém lhe disser que todos os idiomas são semelhantes, é uma simplificação ou falta de experiência. Deixe-me explicar um pouco.

Um modelo computacional é um conjunto que consiste em operações básicas e maneiras de colá-las na ordem necessária para criar algoritmos complexos. Algumas linguagens têm modelos computacionais muito semelhantes, e algumas variam amplamente.

A programação é muito mais do que o conhecido C / Python / Java / C ++ / C # / Go / Javascript, construído com os mesmos princípios: imperativo, estrutural, um pouco com OOP e açúcar sintático para simular outros estilos de programação. O mundo da programação é enorme. Que tal:

  • Linguagens de programação funcional industrial com sistemas típicos complexos e bem pensados ​​(Haskell, Ocaml).
  • Linguagens funcionais com tipos dependentes que permitem não apenas programação, mas também registro de evidências (Coq, Agda, LEAN).
  • Idiomas concatenativos (adiante).
  • Programação lógica (Prolog, Refal).
  • Máquinas de estados finitos (expressões regulares, Promela).
  • Linguagens fortemente extensíveis que permitem implementar quase todas as construções de sintaxe, como Lisp, Forth, Camlp4 / 5, Rebol.
  • Idiomas específicos do domínio (JetBrains MPS, XText).

Cada novo modelo de computação é difícil de entender, porque é uma nova maneira de pensar. Mas o esforço e o tempo valem a pena.

Seja sociável


Tive muita sorte de conhecer pessoas incríveis. Meus assistentes me ajudaram a melhorar minhas habilidades, aprender algo novo, ver o mundo de uma perspectiva diferente. Isolar-se não fará nenhum bem a longo prazo: você precisa que outras pessoas discutam para entender o que estão fazendo, o que estão pensando.
Se seu amigo leu um artigo interessante e contou a você, você simplesmente economizou muito tempo, porque ele lhe deu um conhecimento processado e cristalizado.

Atenha-se a pessoas inteligentes e apaixonadas e tente aprender com elas. Você ficará surpreso com o quanto pode aprender durante o almoço com seus companheiros que desejam compartilhar os detalhes de seu trabalho ou pesquisa. Essa variedade de idéias é uma das principais razões pelas quais empresas como o Google oferecem comida de graça.

Pergunte às pessoas que são melhores em revisão e leitura de código. Ao aprender o trabalho de outra pessoa, você pode aprender muito. As revisões de código ajudarão você a aprender a escrever código ainda melhor. Esta é talvez uma das maneiras mais eficazes de se tornar um programador melhor muito, muito rápido.

Escrever testes


É tão importante que você precisa de um artigo separado para isso. O teste é parte integrante da criação de software, e até pessoas como eu que trabalham em software formalmente testado (o que significa que deve ser matematicamente rigorosamente formalizável) escrevem testes, embora você possa pensar que as garantias dadas pelas evidências são muito mais forte.

Espero que isso ajude alguém a ter uma imagem melhor, aprender mais rápido e se tornar um programador melhor; Se você tiver alguma dúvida, terei prazer em ajudar. Boa sorte

Source: https://habr.com/ru/post/pt425363/


All Articles