Editor de texto
- Você usa editores de texto todos os dias, mas sabe como eles realmente funcionam? Comece implementando os recursos básicos.
- O maior desafio é como armazenar documentos de texto na memória. Usar arrays traz problemas de desempenho, então é necessário aprender diferentes estruturas de dados para resolver isso.
- Aprenda como o cursor de texto funciona e, depois de implementar um editor básico, tente adicionar
undo/redo e quebra automática de linha por palavras.
Jogo 2D - Space Invaders
- Mesmo um jogo simples exige estruturas de dados específicas e padrões de projeto. Em vez de focar no design e na arte do jogo, concentre-se na implementação geral.
- Aprendizado de renderização de tela, game loop, tratamento de entrada do usuário, criação e gerenciamento de objetos dinâmicos e aplicação da lógica do jogo.
- Depois de implementar o jogo básico, é possível expandi-lo com menu de tela de título, tela de game over, manutenção da mesma velocidade em computadores diferentes, aplicação de IA etc.
Compilador - Tiny BASIC
- Implementar um compilador é um projeto que exige compreensão profunda de programação. Comece escrevendo um compilador para uma linguagem simples como Tiny BASIC.
- Aprenda processos como tokenização do código (análise léxica), parsing (verificação da estrutura e geração de árvore), análise semântica e geração de código.
- Depois de implementar o compilador básico, é possível expandi-lo com biblioteca padrão, etapa de otimização e melhoria das mensagens de erro.
Mini sistema operacional
- Os conceitos básicos de sistemas operacionais podem ser aplicados em várias áreas. Implementar um sistema operacional aumenta a compreensão sobre hardware.
- Há uma curva de aprendizado dependente de hardware, mas seguindo livros ou tutoriais é possível criar um SO inicializável.
Planilha eletrônica
- Um aplicativo de planilha combina os desafios de um editor de texto e de um compilador. Você aprende como representar o conteúdo das células na memória e como implementar um interpretador de linguagem de programação para fórmulas.
Emulador de console de videogame
- Escrever um emulador combina em um só lugar os desafios de compiladores, sistemas operacionais e escrita de compiladores. Jogar um game real no emulador é uma experiência recompensadora.
- Emular um console de videogame real significa escrever uma máquina virtual que se comporte como a CPU correspondente e outros componentes de hardware.
Opinião do GN⁺
- Para consolidar a base de programação, implementar um editor de texto ou um jogo simples ajuda bastante a entender o funcionamento interno de softwares que usamos de fato.
- Projetos complexos como compiladores ou sistemas operacionais exigem compreensão profunda de linguagens de programação e arquitetura de computadores, algo essencial para desenvolver habilidades avançadas de engenharia de software.
- Esses projetos oferecem experiências interessantes e desafiadoras para programadores que querem aprender uma nova linguagem ou framework, ou aprofundar o conhecimento que já têm.
1 comentários
Opiniões no Hacker News
Trabalhar em projetos como editor de texto, compilador, sistema operacional e ray tracer pode melhorar a habilidade de programação, mas não necessariamente a habilidade de engenharia de software. Na prática, esse tipo de projeto pode até ser contraproducente para engenharia de software por embutir o princípio desastroso do "Not Invented Here".
Como projetos de UI/web, recomendam coisas como:
fetchexiste, mas entender como uma requisição HTTP é enviada e lida do zero ajuda a depurar problemas de CORS, requisições OPTIONS etc.)Opinião favorável sobre mini sistemas operacionais. Como desenvolvedor de aplicações, você depende de funções do sistema operacional (gerenciamento de memória, sistema de arquivos etc.), então é natural querer entender como isso funciona nos bastidores. Usar o xv6 para estudar e implementar diferentes algoritmos de escalonamento de processos no tempo livre pode ser uma experiência muito útil e divertida.
Vontade de mexer com coisas físicas, como robôs ou drones com piloto automático, ou simulações precisas da dinâmica de voo de espaçonaves com parâmetros de GNC programáveis. A pessoa tem o livro "Fundamentals of Astrodynamics" e quer aproveitá-lo durante o período de férias. Está procurando boas informações sobre GNC (guiagem, navegação e controle).
Isso varia conforme gosto pessoal e circunstâncias, mas é uma lista que pode ser um bom ponto de partida para quem procura ideias. A pessoa criou, usando um Sinclair ZX Spectrum, um editor de pauta musical com tracker e também jogos 2D (Space Invaders). No primeiro computador (um 386), criou um compressor Huffman, um índice B-Tree, um gerador de formulários OOP, um verificador de e-mail para conexão discada e parsers manuais.
Discussão sobre editores de texto: o maior desafio é como armazenar um documento de texto na memória. A primeira ideia foi usar um array, mas o desempenho fica muito ruim ao inserir texto em qualquer lugar que não seja o fim do documento. Ainda assim, usando strings de JavaScript, a pessoa não teve problemas de desempenho em mais de dois anos de uso do editor. Claro, houve vários outros problemas; por exemplo, renderizar linhas horizontais longas virou um problema porque a estratégia de otimização partia da premissa de que renderizar uma única linha seria barato.
Também é uma boa ideia tentar fazer um ray tracer simples de brinquedo. Criar um ray tracer com esferas em gráficos bitmap, com reflexão difusa e especular, pode ser um projeto relativamente limitado, desde que você não complique demais.
Se você acha que precisa do "Factory Pattern" para escrever um Space Invaders, então há algo errado. É difícil acreditar que o jogo original tenha usado esse tipo de conceito de design.
Opinião sobre editores de texto que usam arrays como estrutura de dados. Durante a digitação, o importante é manter alta velocidade, e só uma linha muda por vez. Ao inserir uma nova linha, o atraso extra necessário para reorganizar o array após pressionar Enter não seria perceptível, mesmo com milhões de linhas. A parte mais desafiadora de um editor de texto é garantir que apenas o que o usuário vê seja renderizado.