Come si codifica qualcosa quando non si ha idea di come funzioni effettivamente? [chiuso]


14

Di recente ho imparato C e voglio iniziare un progetto per consolidare le mie conoscenze. Ho deciso di creare un editor di testo molto semplice, qualcosa come Vim. Il problema che devo affrontare è che non ho davvero idea di come funzioni un editor di testo e non so cosa cercare su Google per scoprirlo.

Cercare su Google ha portato al repository GitHub di vim, che è inutile per me perché la base di codice è enorme e il codice mi confonde. Ho anche trovato tutorial per creare un editor di testo in C che funzioni in qualche modo come vim.

Anche se ho pensato di seguire i tutorial, mi sembra di imbrogliare. In che modo gli sviluppatori di Vim hanno capito come codificare Vim senza tutorial specifici? O sono partiti da editor di testo più semplici? Come l'hanno capito solo dalla conoscenza delle lingue e della loro documentazione?

Di cosa ho bisogno esattamente per iniziare a scrivere questo editor di testo senza seguire direttamente un tutorial? Un altro esempio che mi piace pensare è: in che modo Dennis Ritchie e Ken Thompson hanno codificato Unix? Ho un'idea di come funzioni il sistema operativo, ma non ho idea di come inserirlo nel codice. Cosa mi manca? Come trasferisco questa conoscenza della lingua in un uso effettivo e pratico?


14
Stai confrontando te stesso con progetti con storie lunghe e persone eccezionali. Unix è nato in un gruppo di ricerca con molti anni di esperienza nella programmazione a livello di sistema e ha tratto profitto dall'esperienza con il più complesso sistema operativo Multics. Vim era basato su vi che era basato su ed. Questi programmi non apparvero all'improvviso, erano un'evoluzione, costruiti da centinaia di persone. Quindi non essere frustrato quando trovi difficile saltare tutta quella storia. Nessuno può. Invece, prova a fare progetti che sono al limite della tua comprensione - appena a portata di mano, ma ancora impegnativi.
am

8
Hai appena imparato a suonare alcuni brani sullo xilofono e ora vuoi suonare in una grande orchestra internazionale? Dai, ti aspetti troppo. La programmazione è come suonare uno strumento: inizi con melodie piccole e semplici e dopo diversi anni di pratica impari a suonare una sinfonia.
Doc Brown,

3
Concordato. Prendilo come un'opportunità per te di imparare qualcosa che molti principianti imparano nel modo più duro. Inizia poco . E leggi anche il codice di Vim. Puoi imparare molto leggendo il codice esistente.
Laiv

17
Il tuo problema fondamentale è la mancanza di chiarezza nel tuo pensiero. Dici "un semplice editor di testo come VIM", e poi lo segui immediatamente notando che la sua base di codice è enorme e confusa. Questo dovrebbe essere un segnale forte per te che nulla che assomigli molto a Vim è semplice . Anche i programmatori esperti cadono nella trappola mentale in cui sei caduto. Le cose che ancora non capisci non sono semplici . Sono complicati . La programmazione informatica sta trasformando la logica mentale in realtà; iniziare pensando più chiaramente alla programmazione.
Eric Lippert,

4
Inoltre, smetti di preoccuparti di "barare". Questo non è un gioco. Hai degli obiettivi e sono buoni obiettivi. Fai quello che devi fare per raggiungere questi obiettivi . Pensi che i programmatori di computer professionisti non guardino alla fonte quando vogliono imparare come funziona qualcosa? Imparare come imparare dalla fonte che non hai scritto è una delle abilità di programmazione più importanti, quindi inizia a praticarla.
Eric Lippert,

Risposte:


17

Se questo è il tuo primo progetto di programmazione, anche un semplice editor di testo potrebbe essere troppo complicato. Qualcosa come vim o un sistema operativo è completamente fuori discussione.

Approccio al problema

In generale, il modo di iniziare è approssimativamente simile per la maggior parte dei progetti, sebbene:

  • Raccogli le tue esigenze. Cosa farà esattamente il software?
  • Si inizia con molto pochi requisiti e quindi aggiungere funzionalità po 'a poco.
  • Si decompongono i problemi posti dai requisiti attuali in sotto-problemi.
  • Continui a decomporre i tuoi sotto-problemi fino a quando non hai qualcosa che sai implementare.

Esempio

Facciamo l'esempio dell'editor di testo.

  • Si desidera visualizzare una parte di un file di testo sullo schermo, inserire e rimuovere caratteri e salvare la versione corrente.

  • Inizia con la sola lettura di un file e la visualizzazione del suo contenuto.

  • Identificherai (tra gli altri) i seguenti sotto-problemi:

    • Come faccio a sapere il nome del file da visualizzare?
    • Dato un nome di file, come posso ottenere il contenuto del file?
    • Dati i contenuti di un file, come li visualizzo?

Una volta raggiunto un punto in cui il requisito (carica il file e visualizzalo) è completato, puoi iniziare a considerare come visualizzare solo una parte adatta allo schermo, navigare nel tuo file, ecc.

Il prossimo passo

Nel corso del tempo, man mano che affronti problemi sempre più complessi, ti renderai conto che diventa sempre più difficile trovare modi adatti per scomporre i tuoi problemi. Noterai anche che cambiare il codice può diventare noioso nel tempo.

A quel punto, è tempo di imparare alcuni concetti di architettura e design di base.


Ehi amico grazie per il consiglio! Penso che prenderò questo approccio. Sono un po 'testardo quando si tratta di cambiare idea, ma da quello che mi hai suggerito, penso che proverò a vedere come creare un visualizzatore di file. Forse aggiungi anche un modo per mostrare i metadati dei file in qualche modo? Posso probabilmente capirlo da solo. Molte grazie!
Faithlesss,

2
Per aggiungere a ciò, "come posso visualizzarli" può probabilmente essere ulteriormente suddiviso per scrivere un personaggio specifico in una posizione specifica sullo schermo (se stiamo parlando di un editor da riga di comando), che dovrebbe essere qualcosa che si può trova facilmente una risposta online.
Dukeling,

2
"anche un semplice editor di testo può essere troppo complicato" gli editor di testo sono sorprendentemente complicati. Immagina di modificare un file da 20 MB. Abbastanza grande da richiedere il buffering, ma non abbastanza grande per essere tassato su un computer moderno. Devi essere in grado di scorrere, inserire e rimuovere il testo, fare in modo che il testo si riorganizzi in tempo reale, il marcatore della barra di scorrimento si aggiorni in tempo reale mentre il modello dietro di esso cambia. Se hai qualsiasi tipo di formattazione, questo diventa ancora più complicato.

15

Non

Se non hai nemmeno una vaga idea di come fare qualcosa, è un segno che va oltre le tue attuali competenze. Perché se non hai idea di come iniziare, non avrai sicuramente idea di quando si tratta della parte più difficile dell'app.


Quale sarebbe un buon progetto per iniziare allora? Ho già creato il mio gioco dell'impiccato (nel terminal), così come un gioco di tic tac toe. Semplicemente non vedo un modo per continuare, quindi ho pensato che un editor di testo sarebbe stata una buona idea.
Senza fede

3
@faithlesss - qualcosa che legge e scrive file sembra un passaggio intermedio di base.
Telastyn

9
Un file viewer potrebbe essere un buon progetto, allora, ad esempio, un cercapersone come il less, moreo viewprogrammi. Condividono alcuni aspetti degli editor, senza la complessità dei buffer di modifica mutabili.
am

@Telastyn ti ho preso. Allora guarderai a creare un visualizzatore di file, probabilmente uno semplice in grado di leggere i formati di testo di base, e poi passare a capire come leggere qualcosa di simile, forse un file json o un csv? Non dovrebbe essere così difficile analizzarlo, basta guardare la documentazione string.h immagino. Grazie per il consiglio!
Faithlesss,

2
@Faithlesss Scopri anche le caratteristiche di un editor di linee , il predecessore dei programmi di editor di testi
Bergi,

2

Devi decidere come vuoi che il tuo editor di testo funzioni.

Questa è una delle esperienze più aggravanti e gratificanti dello sviluppo dei tuoi progetti dall'inizio alla fine. Nessuno ti sta inviando requisiti per costruire. Devi sviluppare le tue esigenze.

Questo significa che dovrai fare moltissimo lavoro di progettazione prima di scrivere la tua prima riga di codice. Dovrai decidere l'aspetto dell'interfaccia. Dovrai decidere quale funzionalità includere. Entrambe le domande precedenti saranno guidate da ciò che ti senti in grado di fare. Se pensi alla situazione "ideale" (come vorresti che l'interfaccia funzionasse), ma non ti senti in grado di codificarla, allora devi iniziare a guardare approcci alternativi: come potrei farlo funzionare? Ciò ti aiuta a concentrarti sugli approcci di codifica di cui potresti voler saperne di più.

Come altri hanno già detto, provare a copiare vim potrebbe non essere l'approccio migliore poiché si tratta di una base di codice ampia e complicata. Ti stai anche negando il lavoro di progettazione che, secondo la mia modesta opinione, ti aiuta a completare come sviluppatore.

Ciò non significa che dovrai progettare l'intera applicazione dall'inizio alla fine prima di scrivere la tua prima riga di codice. Va bene che i requisiti cambino nel tempo man mano che impari di più. Va bene aggiungere nuove funzionalità che non ti vengono in mente finché non stai testando / usando la tua applicazione e pensi "Non sarebbe bello se ..." Va bene iniziare in modo semplice.


1

Scrivere da zero un editor di testo completo senza esperienza di programmazione è sciocco: ti scoraggerai e lo abbandonerai prima di imparare molto.

Vengono in mente diverse alternative:

  • Studia il codice di alcuni prodotti che conosci. Se sei esperto vim, guarda quello e cerca di capire qualcosa di piccolo e isolato, come come rappresenta i dati o cerca un singolo carattere (ilf comando).
  • Studia il codice di un programma molto semplice e sali da lì: catcomando wcpoi greppoised ad esempio.
  • Prova a scrivere un programma che fa solo una singola funzione dell'editor. Magari elimina il secondo carattere in ogni riga di un file (senza riscriverlo) o visualizza solo le righe da 50 a 70 di un file.

1
Senza sapere un po 'di schemi comuni, penso che comprendere anche una piccola parte di un grande progetto come VIM sarà inutile. Guardare progetti open source molto piccoli è comunque una buona idea. Vorrei aggiungere che tentare di apportare una modifica mirata a tale programma sarebbe un ottimo modo per imparare. Vantaggio: imparerai alcuni schemi utilizzati nei programmi del mondo reale. Svantaggio: potresti imparare anche un anti-pattern.
doubleYou,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.