Como você codifica algo quando não faz ideia de como ele realmente funciona? [fechadas]

14

Eu aprendi recentemente C e quero iniciar um projeto para solidificar meus conhecimentos. Eu decidi criar um editor de texto muito simples, algo como o vim. O problema que enfrento é que eu realmente não tenho idéia de como um editor de texto funciona, e não sei o que procurar no Google para aprender sobre isso.

A pesquisa no Google levou ao repositório GitHub do vim, que é inútil para mim porque a base de código é enorme e o código está me confundindo. Também encontrei tutoriais para criar um editor de texto em C que funciona como o vim.

Embora eu tenha pensado em seguir os tutoriais, parece trapaça. Como os desenvolvedores do vim descobriram como codificar o vim sem tutoriais específicos? Ou eles começaram com editores de texto mais simples? Como eles descobriram isso apenas com o conhecimento de idiomas e sua documentação?

O que é exatamente o que eu preciso para começar a escrever este editor de texto sem seguir diretamente um tutorial? Outro exemplo em que gosto de pensar é: como Dennis Ritchie e Ken Thompson criaram o Unix? Tenho uma ideia de como o sistema operacional funciona, mas não faço ideia de como colocá-lo em código. O que estou perdendo? Como transfiro esse conhecimento do idioma para uso prático e real?

Faithlesss
fonte
14
Você está se comparando a projetos com histórias longas e pessoas excepcionais. O Unix se originou em um grupo de pesquisa com muitos anos de experiência em programação em nível de sistema e se beneficiou da experiência com o sistema operacional Multics mais complexo. O Vim foi baseado no vi, que foi baseado no ed. Esses programas não apareceram de repente, eram uma evolução, construída por centenas de pessoas. Portanto, não fique frustrado quando achar difícil pular toda essa história. Ninguém pode. Em vez disso, tente fazer projetos que estão à beira do seu entendimento - apenas ao seu alcance, mas ainda desafiadores.
115018 amon
8
Você acabou de aprender a tocar algumas músicas no xilofone e agora quer tocar em uma grande orquestra internacional? Vamos lá, você está esperando demais. Programar é como tocar um instrumento - você começa com pequenas e simples melodias e, após vários anos de prática, aprende a tocar uma sinfonia.
Doc Brown
3
Acordado. Tome isso como uma chance para você aprender algo que muitos iniciantes aprendem da maneira mais difícil. Comece pouco . E leia o código do vim também. Você pode aprender muito lendo o código existente.
LAIV
17
Seu problema fundamental é a falta de clareza em seu pensamento. Você diz "um editor de texto pequeno e simples como o vim" e, em seguida, segue-o imediatamente, observando que sua base de código é enorme e confusa. Este deve ser um sinal forte para você de que nada que se pareça com o vim é simples . Até programadores experientes caem na armadilha mental em que você caiu. Coisas que você ainda não entende não são simples . Eles são complicados . A programação de computadores está transformando a lógica mental em realidade; comece pensando mais claramente sobre programação.
Eric Lippert
4
Além disso, pare de se preocupar com "trapaça". Isto não é um jogo. Você tem objetivos, e eles são bons objetivos. Faça o que você precisa fazer para alcançar esses objetivos . Você acha que programadores profissionais de computador não olham para a fonte quando querem aprender como algo funciona? Aprender a aprender com a fonte que você não escreveu é uma das habilidades de programação mais importantes, então comece a praticá-la.
Eric Lippert

Respostas:

17

Se este é seu primeiro projeto de programação, mesmo um simples editor de texto pode ser muito complicado. Algo como o vim ou um sistema operacional está completamente fora de questão.

Abordando o problema

Em geral, a maneira de começar é aproximadamente semelhante para a maioria dos projetos, no entanto:

  • Você reúne seus requisitos. O que exatamente o software fará?
  • Você começa com muito poucos requisitos e adiciona funcionalidade pouco a pouco.
  • Você decompõe os problemas colocados pelos seus requisitos atuais em subproblemas.
  • Você continua decompondo seus subproblemas até ter algo que saiba implementar.

Exemplo

Vamos dar o exemplo do editor de texto.

  • Você deseja exibir uma parte de um arquivo de texto na tela, inserir e remover caracteres e salvar a versão atual.

  • Comece apenas lendo um arquivo e exibindo seu conteúdo.

  • Você identificará (entre outros) os seguintes subproblemas:

    • Como sei o nome do arquivo a ser exibido?
    • Dado um nome de arquivo, como obtenho o conteúdo do arquivo?
    • Dado o conteúdo de um arquivo, como eu os mostro?

Depois de chegar a um ponto em que seus requisitos (carregar e exibir arquivos) são concluídos, você pode começar a considerar como exibir apenas uma parte que caiba na tela, navegar no arquivo, etc.

O próximo passo

Com o tempo, à medida que enfrenta problemas cada vez mais complexos, você perceberá que fica cada vez mais difícil encontrar maneiras adequadas de decompor seus problemas. Você também notará que a alteração do código pode se tornar tediosa ao longo do tempo.

Nesse ponto, é hora de aprender alguns conceitos básicos de arquitetura e design.

doubleYou
fonte
Ei cara obrigado pelo conselho! Eu acho que vou seguir essa abordagem. Eu sou um pouco teimoso quando se trata de mudar de idéia, mas pelo que você sugeriu, acho que vou tentar ver como criar um visualizador de arquivos. Talvez também adicione uma maneira de mostrar os metadados do arquivo de alguma forma? Provavelmente eu mesmo posso descobrir isso. Muito obrigado!
Faithlesss
2
Para adicionar a isso, "como eu os mostro" provavelmente pode ser dividido em escrever um caractere específico para uma posição específica na tela (se estamos falando de um editor de linha de comando), que deve ser algo que se possa encontre facilmente uma resposta para online.
Dukeling
2
"mesmo um simples editor de texto pode ser muito complicado" os editores de texto são surpreendentemente complicados. Imagine editar um arquivo de 20 MB. Grande o suficiente para exigir armazenamento em buffer, mas não grande o suficiente para sobrecarregar um computador moderno. Você precisa rolar através dele, inserir e remover texto, reorganizar o texto em tempo real, o marcador da barra de rolagem é atualizado em tempo real à medida que o modelo por trás dele muda. Se você tiver algum tipo de formatação, isso fica ainda mais complicado.
15

Você não

Se você nem tem uma vaga idéia de como fazer algo, é um sinal de que está além das suas habilidades atuais. Porque se você não tem idéia de como começar, certamente não terá idéia quando se trata da parte mais difícil do aplicativo.

Telastyn
fonte
Qual seria um bom projeto para começar então? Eu já fiz meu próprio jogo da forca (no terminal), bem como um jogo do jogo da velha. Eu simplesmente não vejo uma maneira de continuar, então pensei que um editor de texto seria uma boa ideia.
Faithlesss
3
@faithlesss - algo que lê e grava arquivos parece um passo intermediário básico.
Telastyn
9
Um arquivo de espectador pode ser um bom projeto, em seguida, por exemplo, um pager como o less, moreou viewprogramas. Eles compartilham alguns dos aspectos dos editores, sem a complexidade dos buffers de edição mutáveis.
10248 amon
@Telastyn eu tenho você. Vamos olhar para criar um visualizador de arquivos, provavelmente um simples que possa ler formatos de texto básicos e depois passar a descobrir como ler algo como, talvez um arquivo json ou csv? Não deve ser tão difícil analisá-lo, apenas preciso realmente olhar para a documentação string.h, eu acho. Obrigado pelo conselho!
Faithlesss
2
@Faithlesss também ter um olhar para as características de um editor de linha , o antecessor de programas de editor de texto
Bergi
2

Você precisa decidir como você quer seu editor de texto para trabalho.

Esta é uma das experiências mais agravantes e gratificantes de desenvolver seus próprios projetos do início ao fim. Ninguém está lhe enviando requisitos para construir. Você precisa desenvolver seus próprios requisitos.

Isso significa que você precisará fazer uma enorme quantidade de trabalho de design antes de escrever sua primeira linha de código. Você precisará decidir como será a interface. Você precisará decidir qual funcionalidade incluir. Ambas as perguntas acima serão orientadas pelo que você se sente capaz de fazer. Se você pensa na situação "ideal" (como deseja que a interface funcione), mas não se sente capaz de codificá-la, precisa começar a procurar abordagens alternativas: Como eu poderia fazer isso funcionar? Isso ajuda a focar você nas abordagens de codificação sobre as quais você pode querer aprender mais.

Como já foi dito, tentar copiar o vim pode não ser a melhor abordagem, pois é uma base de código grande e complicada. Você também está negando a si mesmo o trabalho de design que, na minha humilde opinião, ajuda a se destacar como desenvolvedor.

Isso não significa que você precisará projetar todo o aplicativo do início ao fim antes de escrever sua primeira linha de código. Não há problema em mudar os requisitos ao longo do tempo à medida que você aprende mais. Não há problema em adicionar novos recursos nos quais você não pensa até testar / usar seu próprio aplicativo e pensar: "Não seria bom se ..." Não há problema em começar de maneira simples.

Randall Stewart
fonte
1

Escrever um editor de texto com todos os recursos do zero, sem experiência em programação, é tolice: você será desencorajado e o abandonará antes de aprender muito.

Várias alternativas vêm à mente:

  • Estude o código de algum produto que você conhece. Se você é proficiente vim, examine-o e tente entender algo pequeno e isolado, como como ele representa os dados ou procure por um único caractere (o fcomando).
  • Estude o código de um programa muito simples e trabalhe a partir daí: catcommand e wc, em grepseguida, sedpor exemplo.
  • Tente escrever um programa que faça apenas um único recurso do editor. Talvez exclua o segundo caractere em todas as linhas de um arquivo (sem gravá-lo de volta) ou exiba apenas as linhas 50 a 70 de um arquivo.
Wallyk
fonte
1
Sem saber um pouco sobre padrões comuns, acho que entender até um pedacinho de um projeto grande como o vim será inútil. Analisar projetos de código aberto muito pequenos é uma boa ideia. Eu acrescentaria que tentar fazer uma alteração direcionada a esse programa seria uma ótima maneira de aprender. Vantagem: você aprenderá alguns padrões usados ​​em programas do mundo real. Desvantagem: você também pode aprender um anti-padrão.
Doubleyou