Como se tornar um bom engenheiro
(0x0001.cc)- Muitos engenheiros de software trabalham sem paixão por software
- Trabalham apenas para receber um bom salário, mas sem paixão o desempenho acaba caindo
- Se ficarem presos a tecnologias antigas e crenças equivocadas, sem aprender, não conseguem crescer
- Elementos necessários para se tornar um bom engenheiro
- É preciso entender a essência da engenharia e construir conhecimento profundo
- É preciso aprender continuamente novas tecnologias e abordá-las de forma crítica
- É necessário ter o hábito de aplicar e aprimorar o conhecimento aprendido na prática
# O que faz um bom engenheiro
- Definição de engenheiro
"Uma pessoa que aplica princípios científicos para analisar problemas e, por meio de design, escrita de código, construção e criação, resolve problemas e torna o mundo um lugar melhor"
- Competências exigidas de um engenheiro de software
- É preciso entender os princípios de como um computador funciona
- É necessário um entendimento profundo de como hardware e software interagem
- É preciso aprender desde a base, sem depender apenas de linguagens ou tecnologias abstraídas
Entendimento profundo do domínio
- É necessário um forte entendimento dos princípios fundamentais
- Engenheiro mecânico → conhecimento das propriedades e aplicações dos materiais
- Engenheiro de software → entendimento de como memória e CPU funcionam
- É preciso aprender a partir dos princípios básicos
- É essencial um entendimento profundo de conceitos básicos como HTTP, estrutura de memória e funcionamento do sistema
- Não se deve começar pelo nível mais alto; é preciso construir a base primeiro
Aprendizado contínuo
- É preciso continuar aprendendo sobre tecnologias mais recentes e tendências de desenvolvimento
- É preciso analisar criticamente as vantagens e desvantagens de novas tecnologias
- Aprofundar-se em novos temas descobertos durante o processo de aprendizado
- Assim como ao estudar matemática se chega a tópicos mais específicos, também é preciso expandir a profundidade do aprendizado
Entender os limites e problemas da tecnologia
- É preciso entender claramente os pontos fortes e fracos de ferramentas e linguagens
- É preciso evitar a atitude de idolatrar excessivamente uma linguagem ou ferramenta específica
- É importante escolher a ferramenta ideal para cada projeto
Aplicar o conhecimento na prática
- Saber apenas a teoria não tem valor
- É preciso aplicar o que foi aprendido em projetos reais
- Isso deve ser usado para resolver problemas ou comprovar conceitos
- Exemplos de aplicação prática
- Construir pequenos protótipos
- Resolver problemas que surgem no dia a dia
- Explicar e ensinar a outras pessoas o que foi aprendido
# Como se tornar um engenheiro melhor
Desenvolver a capacidade de pensamento crítico
- O pensamento crítico é um elemento central da engenharia
- É essencial para entender e questionar conceitos e seus efeitos
- A falta de pensamento crítico, ou negligenciá-lo, leva à ineficiência e à complexidade
- Fortalecendo a capacidade de pensamento crítico
- Ao entrar em contato com novos conceitos, não se deve aceitá-los cegamente; é preciso avaliar sua eficácia e validade
- É preciso analisar logicamente os prós, contras e alternativas de uma abordagem específica
- Material para aprender pensamento crítico: consulte Critical Thinking
Ler mais livros
- A leitura é uma forma eficaz de adquirir conhecimento
- Existem livros sobre diversos temas relacionados à engenharia de software
- Não se deve apenas aceitar o conteúdo do livro; é preciso abordá-lo criticamente
- Exemplos de perguntas para ler de forma crítica
- "Há algum problema nessa abordagem?"
- "Existe uma forma melhor?"
- "Se eu fizesse diferente, como faria?"
- "O que este livro explica está realmente correto?"
- Criar o hábito de fazer anotações
- Organizar e registrar o que foi aprendido e pensado
- Quando um tema desconhecido for mencionado, pesquisar mais a fundo
- Recomenda-se o Obsidian como ferramenta de anotações (a escolha pode variar conforme preferência pessoal)
- Lista de leituras recomendadas
Aplicar o que foi aprendido em projetos
- Conectar teoria e prática
- O verdadeiro aprendizado acontece quando o que foi estudado é aplicado em projetos reais
- Ao implementar de fato um conceito, é possível obter um entendimento mais profundo
- Mesmo que sejam pequenos projetos ou protótipos, é importante construir algo com as próprias mãos
- Benefícios obtidos no processo de aplicação prática
- Você passa a enfrentar problemas reais que não apareciam na teoria
- No processo de resolver problemas, é possível concretizar e aprimorar o conhecimento
- A capacidade de resolver problemas e o raciocínio lógico são fortalecidos
- Formas de aplicar o que foi aprendido
- Construir pequenos protótipos
- Depois de aprender um novo framework, linguagem ou conceito, tente um pequeno projeto
- Ex.: após estudar indexação de banco de dados, implemente um sistema simples de busca e compare o desempenho
- Resolver problemas reais
- Tente resolver pequenos problemas que surgem no dia a dia ou no trabalho
- Ex.: automatizar tarefas manuais repetitivas, melhorar problemas de queda de desempenho etc.
- Ensinar o que foi aprendido
- Explicar o que foi aprendido a outras pessoas reforça a compreensão
- Escrever em um blog, fazer uma thread no Twitter ou discutir com colegas
- No processo de ensinar, é possível descobrir novas perspectivas
- Ao aplicar conhecimento continuamente, a compreensão teórica se transforma em capacidade prática, e você pode evoluir para um engenheiro mais competente
Avaliar e melhorar o próprio código
- A autocrítica é um hábito essencial dos engenheiros excepcionais
- Muitos engenheiros cometem o erro de achar que, se o código funciona, isso já é "suficiente"
- Porém, um verdadeiro engenheiro reconhece que sempre há espaço para melhorar
- Objetivo da autoavaliação
- Não é necessário ser excessivamente rígido consigo mesmo
- O ponto central é buscar oportunidades de melhoria contínua
- Não se contente apenas em fazer o código funcionar; procure melhorar desempenho, manutenibilidade e legibilidade
- Efeitos da autoavaliação contínua
- A qualidade do código melhora gradualmente
- A autocrítica fortalece a capacidade de resolver problemas
- É possível evoluir continuamente em conhecimento e capacidade
# Lista recomendada para engenheiros de software
Livros recomendados
- Designing Data-Intensive Applications – projeto de aplicações centradas em dados
- Introduction to Algorithms – (a edição em coreano também usa o título em inglês)
- Writing a C Compiler
- Essential Maths for Data Science – matemática essencial para desenvolvedores
- Elements of Information Theory
Projetos recomendados
- Compilador - tente escrever um compilador para a linguagem que escolher; consulte LLVM ou JVM
- Emulador - escreva um emulador de uma CPU simples (ex.: 8086)
- Motor de renderização / game engine - escreva um programa gráfico usando OpenGL ou Vulkan
- Criar um visualizador e editor de memória - escreva um programa que interaja com a memória de outros programas
- Escrever um servidor HTTP - escreva um servidor HTTP em uma linguagem de baixo nível
- Evite sites ou projetos simples. O efeito de aprendizado pode ser baixo. Escolha um dos projetos mencionados acima, estude o tema e tente implementá-lo você mesmo
Conclusão
- Tornar-se um bom engenheiro não significa conhecer muitas linguagens de programação
- Entendimento profundo dos princípios básicos + pensamento crítico + aplicação prática são o essencial
- É preciso aprender, aplicar e melhorar sem parar
- Engenharia é uma jornada sem fim, e a postura de querer crescer é importante
Conclusão
- A essência de se tornar um bom engenheiro
- Não é conhecer o maior número de linguagens de programação, dominar o framework mais recente ou correr atrás de novas tecnologias
- O ponto central é um entendimento profundo dos princípios fundamentais da engenharia
- É preciso aplicar o que foi aprendido em projetos reais, pensar criticamente e crescer continuamente
- Características dos melhores engenheiros
- Não param de aprender e continuam adquirindo novos conhecimentos
- Questionam constantemente suas próprias suposições e procuram maneiras de melhorar
- Aplicam o que aprenderam à resolução de problemas reais, colaboram com colegas e evoluem
- Engenharia é uma jornada para a vida toda
- É preciso curiosidade (curiosity), disciplina (discipline) e vontade de crescer
- Se você colocar esses princípios em prática, poderá ir além de um bom engenheiro e se tornar um grande engenheiro
9 comentários
Também já contribuí com a parte de gerenciamento de memória do kernel Linux e acho que entendo, até certo ponto, como funcionam os mecanismos de baixo nível, mas, pensando que no fim acabei fazendo um trabalho que, contra a minha vontade, fica distante do desenvolvimento, chego a pensar que, para se dar bem como engenheiro, talvez seja preciso agir de forma oposta ao que este texto diz.
Quando voltei ao país, percebi que a Coreia tem um mercado pequeno demais e uma concorrência muito forte, então há poucas empresas e posições em que dá para se concentrar em desenvolvimento; e, como todo mundo disputa essas poucas vagas, no fim parece que é preciso focar no que chama mais atenção para conseguir fazer o tipo de desenvolvimento que se quer.
Eu também concordo! E acho que a interpretação do que seria um engenheiro "bom" aqui varia demais de pessoa para pessoa. Pode ser uma visão extrema, mas mesmo sabendo da importância do conhecimento básico, fico pensando se um engenheiro que não tem valor no mercado pode ser considerado um bom engenheiro.
Concordo demais mesmo...
É uma pena que isso tenha virado um jogo de usar bem uma linguagem específica e tecnologias específicas de acordo com a tendência, em vez de um jogo sobre o quanto você entende de verdade o essencial e sabe lidar bem com isso.
Acho que na Coreia também há muitos engenheiros talentosos, mas eu também sinto muitos pontos lamentáveis por causa do tamanho do mercado.
Fico pensando que teria sido bom se lugares como a FuriosaAI tivessem dado certo.
A FuriosaAI faliu...?
Concordo um pouco... kkk
Será que é só o mercado coreano que é assim...
Há algum tempo, cheguei a fazer um seminário na empresa para um estudo da linguagem Kotlin e lembro que a reação foi boa quando tentei explicar comparando com a linguagem C++, que é a mais usada no departamento. Eu quase não uso C++, e os colegas do departamento estavam tendo contato com Kotlin pela primeira vez, mas pareceu ajudar bastante no crescimento de todo mundo em vários aspectos.
Opinião no Hacker News
Gostei muito da opinião sobre leitura de livros. Vejo com frequência muitos engenheiros perdendo muita coisa ao preferirem vídeos e posts superficiais em vez de documentação e livros
Concordo com muitos dos pontos mencionados neste texto. Mas não tenho certeza de como conhecer fundamentos profundos como CPU, memória e HTTP ajuda alguém a se tornar um engenheiro melhor
Não conheço até as bases mais profundas, mas já vi que, quando a pessoa não conhece o básico, ela produz resultados realmente absurdos e difíceis até de imaginar.
Por exemplo, implementar a busca carregando todos os registros do DB na memória e depois pesquisando na memória.
Quando há poucos registros, funciona bem, mas, quando o número de registros aumenta, a memória estoura.
Ela programa assim porque não entende nem um pouco a diferença entre memória e DB.
Esse é só um exemplo, e toda vez implementa de um jeito que ninguém conseguiria imaginar.
Um programador comum(?) realmente não consegue imaginar isso.