7 pontos por GN⁺ 2023-12-27 | 1 comentários | Compartilhar no WhatsApp

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

 
GN⁺ 2023-12-27
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".

    • Capacidade de decidir o que vale importar de uma biblioteca e o que vale escrever por conta própria
    • Capacidade de identificar bibliotecas e frameworks de alta qualidade adequados aos requisitos do projeto
    • Capacidade de decidir onde vale a pena otimizar e onde não vale
    • Capacidade de escrever código que continue legível anos depois
    • Capacidade de pensar no projeto como um sistema complexo de grande escala, considerando dependências de software e não relacionadas a software
    • Como desafio alternativo, sugerem criar um mecanismo de busca para a web. Como algoritmos de correspondência de strings e afins já foram resolvidos por outras pessoas, o objetivo seria criar um buscador funcional de verdade (e também um crawler).
  • Como projetos de UI/web, recomendam coisas como:

    • Um jogo simples usando Unity ou Unreal (como 30–60 fps é importante em jogos, isso ajuda a construir interfaces com bom desempenho em outros contextos também)
    • Um framework JavaScript simples, parecido com React (ajuda a entender fluxo de dados e tratamento de eventos)
    • Um wrapper de biblioteca HTTP em torno de XMLHTTPRequest (fetch existe, 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.