Se você deseja insistentemente entrar na equipe de desenvolvimento do compilador ou no "mundo do Velho Oeste", fique à vontade para escolher e aprender a
melhor linguagem de programação do TIOBE e o melhor de tudo: no nível de suas especificações. Mas sério, agora no setor tudo está tão confuso com lógica e conclusões, tanto marketing e água, que a estratégia mais vencedora é ativar o próprio cérebro e fazer uma reavaliação expressa dos valores técnicos aos quais estamos tão acostumados. No post, tentarei orientar o mais claramente possível os desenvolvedores que estão iniciando suas carreiras sobre os riscos de escolher tecnologias e tirar as conclusões certas e distantes (distantes, distantes).
Você já amadureceu ou ainda não?
As crianças diferem dos adultos na compreensão da palavra "responsabilidade". Infelizmente, nem todas as crianças crescem a tempo e algumas morrem na fralda. Não há nada de terrível aqui - exceto por uma coisa: as crianças da equipe de programadores fazem os outros sofrerem muito, especialmente quando os prazos estão chegando e o lançamento está próximo: ou eles repentinamente ficam no meio do espaço aberto ou precisam de chupeta durante um brainstorming da área de assunto com representantes do cliente.

Os adultos diferem das crianças no entendimento do princípio-chave do gerenciamento de TI: “a programação é um privilégio”. Entre os desenvolvedores experientes e bem-sucedidos, os mais adequados e codificam bem e "levam a empresa adiante" ao mesmo tempo.
Setor de TI - enlouquecido
Sim, somos pessoas e propensas a emoções. Mas até agora ninguém sabe como programar adequadamente, embora mais de 50 anos se passaram desde a invenção do computador. Ninguém! Todo mundo está histérico e tentando atrair mais adeptos para o seu campo, enquanto seduz o negócio a criar um projeto por conta própria :-) Vou explicar com um exemplo.

A velocidade do cérebro
O fato é que os primeiros computadores eram realmente lentos, muito lentos e muito caros. Portanto, os primeiros programas foram escritos em linguagens de nível muito baixo e, às vezes, diretamente em código de máquina. Hoje em dia, essas tecnologias "pré-históricas" são usadas às vezes, mas com sentido: para criar sistemas operacionais e seus componentes (próximos ao hardware), para mecanismos de jogos, para bibliotecas e
servidores de alto desempenho, para
criptomoedas e, é claro, para criar
linguagens de programação .
E se
C , apesar de seu vazamento total e alto perigo para o desenvolvedor, se mostrou realmente bom e conquistou os corações dos conhecedores, o
C ++ acabou sendo uma criação extremamente feia e contraditória - mas o que fazer é a vida. Talvez
Rust , com as idéias certas para o manuseio seguro da memória, afete a situação para melhor, mas em termos de feiúra de sintaxe e ilegibilidade, ele parece ter deixado o C ++ para trás.
A situação é ainda mais agravada pelo aparecimento de
Golang . Por um lado - não há nada de novo nele, o acorde demóbico do grande
Ken Thompson : apenas restos miseráveis dos recursos do Java. Por outro lado, ficou muito mais fácil escrever um sistema “relativamente” e um software multithread, e isso é fato que
muitas empresas avaliaram :-)
Nesse campo, você encontrará principalmente tecnologias e hardware de baixo nível e profundamente conhecedores de programadores barbudos hardcore "reais" que geralmente aprendem uma linguagem de programação, mas depois dormem com uma especificação do compilador em vez de com uma esposa. Verdadeiramente, há pessoas legais neste campo. E se você não sabe quais comandos do processador x86
produzem decomposição
em python, é uma vergonha. Portanto, conselhos - evite esse campo até ler o final do post.
Mas há um outro lado da moeda. Os projetos aqui estão sendo feitos não apenas por um longo tempo, mas ... há
décadas . Linguagens de programação de baixo nível não são algo que ajuda, mas interfere. As violações no trabalho com a memória acontecem constantemente, são necessárias dezenas e centenas de testadores (ou você pode colocá-lo no github e faremos o teste coletivamente) e milhares de unidades e outros tipos de testes para fazê-
lo decolar . Muitos desenvolvedores que ingressaram na equipe no início dos projetos não vivem para ver o lançamento e morrer da velhice, ajudando os beta testers a dar seu último suspiro. Mas essas pessoas corajosas, antes de sangrar dos olhos, antes do aparecimento de estigmas, fazem todo o possível e ...
obras-primas nascem.

Arquitetura e empresa cerebral
Porque ninguém ainda sabe programar corretamente, o método de "design competente e confiabilidade" foi formado pela seleção natural. Você é louco por programar em idiomas que permitem operações inseguras de memória por meio de ponteiros - você também pode levar o mundo ao apocalipse: “falha de segmentação no software de um reator nuclear”. Como alguém pode começar a fazer um projeto sem suportar digitação forte no idioma? E eles criaram as próximas linguagens de programação corretas: Java e C #. Mas em Java, eles esqueceram os perigos dos valores nulos e, em C #, não pensaram completamente na compatibilidade com versões anteriores. O resultado é um enorme mundo corporativo, relativamente seguro e relativamente compatível com versões anteriores. Nesse mundo, o objetivo é medido em linhas de código por dia (geralmente não mais do que algumas dúzias, porque os dedos são esfregados no sangue) e grossos livros filosóficos e religiosos sobre padrões de design e, sim, eu quase me esqueci da maneira de me enterrar, do projeto, do cliente e do ambiente o mundo entra no código e se afoga nele, lembrando em agonia a hierarquia de herança de 20 níveis - sobre
OOP . Um dos principais lemas do campo é "por que fazê-lo simplesmente, se possível ... difícil e confiável, por um longo tempo, por séculos!". Além disso, alguns deles podem escrever de maneira rápida e elegante, lavando as mãos com sangue e coletando a estrutura do projeto em suas cabeças todas as manhãs, olhando para 3 monitores ao mesmo tempo. Mas alguns são tão viciados que continuam a criar hierarquias de hierarquias dentro de hierarquias de
infinitas ad - e o objetivo está perdido há muito tempo, e os olhos continuam queimando e comichão nas mãos.
De fato, em áreas onde a área de assunto se estabeleceu bem e se encaixa em "objetos com status e mensagens entre eles" - uma abordagem semelhante funciona muito bem.

É especialmente agradável quando existe uma digitação estática "estrita" (aspas, porque o que acontecerá a seguir sobre haskell) (isto é, quando os tipos de entidade são conhecidos antecipadamente, são verificados pelo compilador e você não pode adicionar uma sequência ao número) facilidade e prazer ao refatorar e melhorar o código e alto se para não dizer grandes
ambientes de desenvolvimento de qualidade. Os colegas deste campo geralmente são muito instruídos em arquitetura de software, leem bastante (o limite de entrada é alto), entendem os recursos de várias bibliotecas de plataformas, padrões de design, técnicas para escrever toneladas de documentação e criar testes automatizados, testam esses testes e podem escrever uma farsa por meses, o que acaba sendo desnecessário. Novamente - os projetos são frequentemente criados e lançados por um período muito longo; por grandes equipes, são necessários vários testadores, mas a natureza dos erros é uma ordem de magnitude menos fatal, o que inspira. Entrar nessa "casta" de desenvolvimento empresarial é muito difícil. Se você demonstrar como, em PHP, pode resolver o problema de 5 linhas que seus colegas de Java resolverão em 5 dias, você será queimado vivo no microondas :-)
Confiabilidade do cérebro
No ambiente acadêmico, outro campo foi criado, muito interessante e recomendado para a compreensão, e um conjunto de linguagens de programação funcional (Lisp, Haskell, Erlang e outras). Você é louco por programar usando variáveis e loops - você também pode cometer muitos erros! Um programa é um conjunto de chamadas de função e, em vez de loops, use recursão, senhores! OOP? Não, não ouvi - classes e tipos de dados algébricos. Você não conhece os funcionadores
aplicadores e não folheou a teoria das categorias - sim, você não desenvolve seu próprio cérebro, meu amigo.
De fato, na minha opinião, para entrar neste campo e entender seus valores, é preciso muito esforço - para a matemática haverá um mar e conceitos ainda mais inesperados, mas bonitos. A experiência adquirida nesta equipe será inestimável e será útil ao trabalhar com outras linguagens de programação. Eles dizem que, às vezes, alguém usa linguagens funcionais em projetos reais: compiladores,
criptomoedas - sem dúvida, seus projetos terão ordens de magnitude menos erros lógicos que o compilador detectará, e a falta, clareza e concisão do código em Haskell, é claro, surpreendem - mas na época de "nos Louboutins!" estudar e entender essa beleza está se tornando cada vez menos.

O resultado e a eficácia do "cérebro"
Para o inferno com arquitetura e POO, irmão! Cthulhu ama você, e
digitar patos é a chave para o sucesso! Digitação forte? E quem em sã consciência atribuirá uma string a um número? A digitação e compilação estáticas são uma perda de tempo, porque o código é escrito uma vez e, se você não tiver tempo para escrevê-lo para lançamento, ele será jogado fora (e até jogado fora, mas um pouco mais tarde). Refatoração? Escreva à direita :-) Encapsulamento? Coloque um traço na frente do nome da variável
e de todas as coisas . OOP é um redirecionamento desnecessário. Que diabos é a compilação F5 e você vê o resultado. Padrões de design - não, você não ouviu: nosso script é tudo ... Você quer um pouco de maconha?
O mais interessante é que, quando você mergulha em linguagens com digitação dinâmica (estrito em python, não estrito em php e javascript), seus olhos se abrem gradualmente para a imagem real das coisas, porque:
- o código se torna muito claro e conciso e não há necessidade de subir 20 classes (se não se referir às bibliotecas do sistema)
- você pode verificar rapidamente a ideia através do REPL
- os idiomas são simples, geralmente minimalistas, contêm as primitivas necessárias e poderosas (listas, dicionários) que, o mais importante, cabem na sua cabeça!
- existe uma nuvem de bibliotecas e você sempre pode resolver qualquer problema em 5 linhas
E para o inferno com isso, com a refatoração :-) A vida se tornou mais divertida (espero que o desenvolvedor que suporte meu código não saiba onde eu moro). Neste campo, você frequentemente encontrará muitas pessoas alegres de especialidades completamente diferentes, exceto a "programação de montadores", que é capaz, no entanto, de maneira muito rápida e eficiente de resolver problemas em 5 linhas e apoiar projetos de código e web por um longo tempo e com sucesso.
Observe as últimas tendências deste campo e imbua-se dessa filosofia de felicidade. Um
ambiente de programação simples e compreensível
no navegador , bem, o que poderia ser mais sexy?

E agora é fácil criar um servidor Web sem bloqueio que
atenda a milhares de conexões em 10 linhas no
node.js e a comunidade esteja crescendo aos trancos e barrancos?
E não "Eclipse XML Soap Entiny beans Enterprise OOP ..." - json e csv e um sorriso (e o cheiro de uma planta desconhecida). E o código é lido e colocado no cérebro, e, portanto, funciona feliz e por muito tempo e é mantido com a mesma facilidade por muitos anos.
E acontece que “dessa maneira” também pode ser programado com sucesso e os anos passados em “linguagens de programação industrial” são vividos em vão (mas os dedos ficaram mais fortes).
Seleção de tecnologia
Você está em choque? Eu também E imagine como os clientes estão impressionados, escolhendo a tecnologia para implementar um projeto de negócios! :-)
Eu acho que você no momento entendeu muito bem que o mundo da TI realmente ficou louco e se perdeu (apenas brincando). Algumas linguagens de programação, como Scala, estão tentando se sentar em todas as cadeiras, mas ainda não são bem-sucedidas - o código está se tornando difícil de entender como um mero mortal. Mas, falando sério, a competição de paradigmas de programação só se intensificará porque ... as tarefas nos projetos são completamente diferentes e é das tarefas que você precisa "dançar"! Em um domínio estabelecido (servidores, bibliotecas),
a digitação nominal (C ++, Java, C # ...) é melhor, em algum lugar será melhor com a
digitação estrutural (Golang, Haskell ...) e nas tarefas de script ou máquina da Web o aprendizado trará felicidade real com o
duck (python, php, javascript ...). Não é necessário pensar que a
digitação estática , especialmente a estrita, é diretamente "obrigatória" - você falhará nos prazos e o código com um pensamento paranóico satisfeito sobre "possíveis erros" será jogado no lixo. Na web, scripts e aprendizado de máquina, você pode avançar com confiança com grande velocidade e com digitação dinâmica de pato e php e python com um grande número de
bibliotecas bonitas e
poderosas, este é um bom exemplo.
Portanto, esqueça "o que aprender uma linguagem de programação em 2018" para o inferno:
- Entenda os paradigmas de programação (OOP pode ser grave ou pode salvar um projeto)
- entender as sutilezas da digitação e os riscos e oportunidades associados a ela (você pode amaldiçoar a digitação dinâmica em uma biblioteca financeira ou pode sacrificar um programador java para Cthulhu e reescrever suas 100 aulas em 100 linhas em um script que é compreensível até para crianças)
- no nível da intuição, entenda os algoritmos (você precisa distinguir entre pesquisa e classificação e uma rede neural da regressão logística - e para entender melhor, você precisa aprender ... toda a sua vida, mas vale a pena)
- Entenda que desenvolvedores experientes (embora ninguém saiba onde encontrá-los no mercado) implementarão o projeto em tempo hábil em praticamente qualquer tecnologia (até mesmo um ataque cerebral) e o farão bem, mas inexperientes terão que escolher uma linguagem de programação com o nível mais confortável de riscos de entrada e colapso ainda ótimo
Em seguida, selecione a área de tarefas que você estará interessado em executar, como aprendizado na web ou máquina e:
- veja o que as pessoas resolvem esses problemas
- dispersar os riscos e oportunidades de cada instrumento de acordo com os critérios acima
- sente-se alguns fins de semana com 1 a 3 ferramentas específicas, mas em nenhum caso não aceita fanatismo ou especificações
- comece a trabalhar mais rápido e obtenha experiência no uso de ferramentas na prática - isso é a coisa mais importante
- você não precisa aprender a linguagem de programação "até o fim" - é melhor aprender a resolver seu problema nas 5 ferramentas mais populares em 10 a 15 linhas e você realmente agirá de maneira extremamente adequada!
Estudo de caso - ML
Digamos que você esteja interessado em aprendizado de máquina ... Parabéns! Por um lado, existe uma teoria acadêmica - mas você precisa extrair a essência dela de acordo com a estatística e a álgebra linear, e em nenhum caso você deve frequentar cursos de vários meses (vá, acredite, louco, se você não é um matemático, mas um humanista - e é imperceptível para si mesmo) ) Por outro lado, você precisa aprender a escrever rapidamente códigos úteis e resolver um problema em 5 a 15 linhas. Sim, você pode escrever tudo em C em 10.000 anos, para analisar a experiência dos colegas e escolher, corretamente, o python, no qual existem muitas bibliotecas e soluções prontas sobre esse tópico. Você dedica alguns dias de folga ao estudo de python - não há mais nada a aprender lá, a linguagem é muito simples (e concordamos em não entrar no mundo selvagem, porque tempo é dinheiro).
Além disso, leia sobre a essência do numpy, pandas, scikit-learn e, se seus olhos estiverem certos, então Keras e vá em frente, faça projetos. Mas você pode seguir outro caminho, longo e difícil, levando à santidade pessoal e à pobreza social (depois de três anos você entenderá a essência do algoritmo, vendendo jornais em um trem elétrico, mas talvez seja um modo especial) - comece a implementar os algoritmos por conta própria, com gerenciamento manual de memória, ou implemente uma solução
mais pesada e analise o código por meses. A ferramenta errada - a chave para noites sem dormir e tempo perdido - evita a complexidade em todos os aspectos.
Uma ferramenta escolhida incorretamente, mesmo a mais popular, mesmo de graça, mesmo que teoricamente seja capaz de tudo no longo prazo, pode arruinar o seu projeto ao falhar em todos os prazos. Minimize esse risco como você pode e não pode.
Conclusões
No total, meus amigos, garantimos que ninguém saiba como programar corretamente e com sucesso, mesmo nós desenvolvedores :-) A competição de paradigmas e tecnologias de programação está se fortalecendo, a cabeça está inchando e o tempo livre está se tornando cada vez menor. Portanto, a estratégia mais vencedora para um desenvolvedor que inicia sua carreira é beber uma lata de cerveja gelada, relaxar e:
- evitar aderência e imersão em partes tecnológicas excessivas, cujo número está crescendo exponencialmente
- escolha uma área interessante de problemas em que você esteja interessado em resolver problemas do cliente
- Aprenda a extrair essência curta e erótica de ferramentas e linguagens de programação
- escreva o mínimo possível, mas claro e compreensível para você e as pessoas ao seu redor
- aprender a resolver problemas em 5-15 linhas, não em 20-50 classes
- se você quiser ir para outro lugar, deixe coisas fundamentais como matemática, haskell ou rfc por tcp / ip
- aproveite a programação e aqueça seus colegas!

E lembre-se sempre de que o tempo, especialmente o tempo livre, é um recurso valioso e depende de nós onde investi-lo. Boa sorte a todos e bom humor!