Jak kodować coś, skoro nie masz pojęcia, jak to faktycznie działa? [Zamknięte]

14

Niedawno nauczyłem się C i chcę rozpocząć projekt, który wzmocni moją wiedzę. Postanowiłem stworzyć bardzo prosty edytor tekstu, coś w rodzaju vima. Problem, z którym się zmagam, polega na tym, że naprawdę nie mam pojęcia, jak działa edytor tekstu, i nie wiem, po co google, aby się o tym dowiedzieć.

Googlowanie na ten temat doprowadziło do powstania repozytorium GitHub vima, co jest dla mnie bezużyteczne, ponieważ baza kodów jest ogromna, a kod mnie dezorientuje. Znalazłem również samouczki dotyczące tworzenia edytora tekstów w C, który działa trochę jak vim.

Chociaż myślałem o podążaniu za samouczkami, czuję się jak oszukiwanie. W jaki sposób programiści vim wymyślili, jak napisać vim bez określonych samouczków? Czy też zaczęli od prostszych edytorów tekstu? Jak oni to odkryli na podstawie znajomości języków i ich dokumentacji?

Czego dokładnie potrzebuję, aby rozpocząć pisanie tego edytora tekstu bez bezpośredniego korzystania z samouczka? Innym przykładem, o którym lubię myśleć, jest: w jaki sposób Dennis Ritchie i Ken Thompson kodowali system Unix? Mam pojęcie o tym, jak działa system operacyjny, ale nie mam pojęcia, jak umieścić go w kodzie. Czego mi brakuje? Jak przenieść tę znajomość języka na faktyczne, praktyczne zastosowanie?

Niewierni
źródło
14
Porównujesz się z projektami o długiej historii i wyjątkowymi ludźmi. Unix powstał w grupie badawczej z wieloletnim doświadczeniem w programowaniu na poziomie systemu i czerpał korzyści z doświadczeń z bardziej złożonym systemem operacyjnym Multics. Vim był oparty na vi, który był oparty na ed. Programy te nie pojawiły się nagle, były ewolucją, zbudowaną przez setki ludzi. Więc nie denerwuj się, gdy trudno ci pominąć całą tę historię. Nikt nie może. Zamiast tego staraj się robić projekty, które są na granicy twojego zrozumienia - tylko w zasięgu ręki, ale wciąż trudne.
amon
8
Właśnie nauczyłeś się grać na ksylofonie, a teraz chcesz grać w dużej międzynarodowej orkiestrze? Chodź, oczekujesz zbyt wiele. Programowanie jest jak gra na instrumencie - zaczynasz od małych, prostych melodii, a po kilku latach praktyki uczysz się gry na symfonii.
Doc Brown
3
Zgoda. Skorzystaj z okazji, aby nauczyć się czegoś, czego wielu początkujących uczy się na własnej skórze. Zacznij mało . Przeczytaj także kod Vima. Możesz się wiele nauczyć czytając istniejący kod.
Laiv
17
Twoim podstawowym problemem jest brak jasności w myśleniu. Mówisz „prosty, prosty edytor tekstu, taki jak vim”, a następnie natychmiast śledzisz to, zauważając, że jego baza kodów jest ogromna i myląca. To powinien być dla ciebie silny sygnał, że nic, co bardzo przypomina vima, nie jest proste . Nawet doświadczeni programiści wpadają w pułapkę psychiczną, w którą wpadliście. Rzeczy, których jeszcze nie rozumiesz, nie są proste . Są skomplikowane . Programowanie komputerowe przekształca logikę umysłową w rzeczywistość; zacznij od wyraźniejszego myślenia o programowaniu.
Eric Lippert,
4
Przestań też martwić się o „oszukiwanie”. To nie jest gra. Masz cele i są to dobre cele. Rób, co musisz zrobić, aby osiągnąć te cele . Myślisz, że profesjonalni programiści komputerowi nie patrzą na źródło, gdy chcą dowiedzieć się, jak coś działa? Nauka uczenia się ze źródła, którego nie napisałeś, jest jedną z najważniejszych umiejętności programowania, więc zacznij ją ćwiczyć.
Eric Lippert,

Odpowiedzi:

17

Jeśli to twój pierwszy projekt programistyczny, nawet prosty edytor tekstu może być zbyt skomplikowany. Coś takiego jak vim lub system operacyjny jest całkowicie wykluczone.

Zbliżanie się do problemu

Ogólnie rzecz biorąc, sposób rozpoczęcia jest z grubsza podobny w przypadku większości projektów:

  • Zbierasz swoje wymagania. Co dokładnie zrobi oprogramowanie?
  • Zaczynasz od bardzo niewielu wymagań, a następnie dodajesz funkcjonalność krok po kroku .
  • Rozkładasz problemy wynikające z obecnych wymagań na podproblemy.
  • Cały czas rozkładasz swoje pod-problemy, dopóki nie masz czegoś, co wiesz, jak je wdrożyć.

Przykład

Weźmy przykład edytora tekstu.

  • Chcesz wyświetlić część pliku tekstowego na ekranie, wstawiać i usuwać znaki oraz zapisać bieżącą wersję.

  • Zacznij od przeczytania pliku i wyświetlenia jego zawartości.

  • Zidentyfikujesz (między innymi) następujące pod-problemy:

    • Jak poznać nazwę pliku do wyświetlenia?
    • Jak uzyskać nazwę pliku, w jaki sposób mogę uzyskać zawartość pliku?
    • Jak mogę wyświetlić zawartość pliku?

Po osiągnięciu punktu, w którym Twoje wymaganie (załaduj plik i wyświetl go) jest gotowe, możesz zacząć zastanawiać się, jak wyświetlić tylko część, która będzie pasować do ekranu, poruszać się w pliku itp.

Następny krok

Z biegiem czasu, gdy podejmujesz coraz bardziej złożone problemy, zdajesz sobie sprawę, że coraz trudniej jest znaleźć odpowiednie sposoby na ich rozłożenie. Zauważysz również, że zmiana kodu może z czasem stać się nużąca.

W tym momencie nadszedł czas, aby nauczyć się podstawowych koncepcji architektury i projektowania.

doubleYou
źródło
Hej, dzięki dzięki za radę! Myślę, że przyjmuję to podejście. Jestem trochę uparty, jeśli chodzi o zmianę zdania, ale z tego, co zasugerowałeś, myślę, że postaram się zobaczyć, jak zrobić przeglądarkę plików. Może także dodać sposób, aby w jakiś sposób wyświetlić metadane pliku? Prawdopodobnie sam to wymyślę. Wielkie dzięki!
Faithlesss,
2
Aby dodać do tego, „jak je wyświetlić” można prawdopodobnie rozbić na zapisanie określonego znaku w określonej pozycji na ekranie (jeśli mówimy o edytorze wiersza poleceń), co powinno być czymś, co można łatwo znaleźć odpowiedź na online.
Dukeling,
2
„nawet prosty edytor tekstu może być zbyt skomplikowany” edytory tekstu są zaskakująco skomplikowane. Wyobraź sobie edycję pliku 20 MB. Wystarczająco duże, aby wymagać buforowania, ale niewystarczająco duże, aby opodatkować nowoczesny komputer. Musisz być w stanie przewijać, wstawiać i usuwać tekst, zmieniać układ tekstu w czasie rzeczywistym, znacznik paska przewijania aktualizuje się w czasie rzeczywistym wraz ze zmianą modelu za nim. Jeśli masz jakiekolwiek formatowanie, staje się to jeszcze bardziej skomplikowane.
15

Ty nie.

Jeśli nie masz nawet mglistego pojęcia, jak coś zrobić, to znak, że wykracza to poza twoje obecne umiejętności. Ponieważ jeśli nie masz pojęcia, jak zacząć, na pewno nie będziesz miał pojęcia, jeśli chodzi o najtrudniejszą część aplikacji.

Telastyn
źródło
Jaki byłby wtedy dobry projekt? Stworzyłem już własną grę w kata (w terminalu), a także grę w kółko i krzyżyk. Po prostu nie widzę sposobu na kontynuację, więc pomyślałem, że edytor tekstu będzie dobrym pomysłem.
Faithlesss,
3
@faithlesss - coś, co czyta i zapisuje pliki, wydaje się podstawowym krokiem pośrednim.
Telastyn
9
Plik widz może być dobry projekt, a następnie, na przykład pager lubią less, morelub viewprogramów. Udostępniają niektóre aspekty edytorów, bez złożoności zmiennych buforów edycji.
amon
@Telastyn Mam cię. Spójrzmy wtedy na stworzenie przeglądarki plików, prawdopodobnie prostej, która potrafi czytać podstawowe formaty tekstowe, a następnie przejść do zastanawiania się, jak czytać coś takiego, może plik json lub csv? Parsowanie go nie powinno być trudne, wystarczy spojrzeć na dokumentację string.h. Dzięki za radę!
Faithlesss,
2
@ Faithlesss Zobacz także funkcje edytora liniowego , poprzednika programów do
edycji
2

Musisz zdecydować, jak ty chcesz swój edytor tekstowy do pracy.

Jest to jedno z najbardziej irytujących i satysfakcjonujących doświadczeń w tworzeniu własnych projektów od początku do końca. Nikt nie wysyła ci wymagań do budowania. Musisz opracować własne wymagania.

Oznacza to, że musisz napisać okropnie dużo pracy projektowej przed napisaniem pierwszego wiersza kodu. Musisz zdecydować, jak wygląda interfejs. Musisz zdecydować, jaką funkcjonalność włączyć. Oba powyższe pytania będą oparte na tym, co czujesz, że jesteś w stanie zrobić. Jeśli myślisz o „idealnej” sytuacji (jak chciałbyś, aby interfejs działał), ale nie czujesz się w stanie go zakodować, to musisz zacząć szukać alternatywnych podejść: Jak mogę to zrobić? Pomaga to skoncentrować się na metodach kodowania, o których możesz chcieć dowiedzieć się więcej.

Jak powiedzieli inni, próba skopiowania vima może nie być najlepszym rozwiązaniem, ponieważ jest to duża i skomplikowana baza kodu. Odmawiasz sobie również pracy projektowej, która moim skromnym zdaniem pomaga dopełnić twoją pozycję jako programisty.

Nie oznacza to, że musisz napisać całą aplikację od początku do końca, zanim napiszesz swój pierwszy wiersz kodu. Wymagania mogą się zmieniać wraz z upływem czasu. Można dodawać nowe funkcje, o których nie myślisz, dopóki nie przetestujesz / nie używasz własnej aplikacji i nie pomyślisz: „Czy nie byłoby miło, gdyby ...” Można zacząć od prostej.

Randall Stewart
źródło
1

Pisanie w pełni funkcjonalnego edytora tekstu od zera bez doświadczenia w programowaniu jest głupie: zniechęcisz się i porzucisz go, zanim zaczniesz dużo się uczyć.

Przychodzi na myśl kilka alternatyw:

  • Przestudiuj kod jakiegoś znanego produktu. Jeśli jesteś biegły vim, spójrz na to i spróbuj zrozumieć coś małego i odizolowanego, na przykład sposób, w jaki reprezentuje dane, lub szuka pojedynczego znaku ( fpolecenia).
  • Studiować kod programu bardzo prosty i kieruj się ku górze stamtąd: catpolecenie potem wcpotem greppotem sedna przykład.
  • Spróbuj napisać program, który wykonuje tylko jedną funkcję edytora. Może usuń drugi znak w każdym wierszu pliku (bez zapisywania go ponownie) lub wyświetl tylko linie od 50 do 70 pliku.
wallyk
źródło
1
Nie wiedząc trochę o typowych wzorcach, myślę, że zrozumienie nawet małego kawałka dużego projektu, takiego jak vim, będzie daremne. Warto jednak przyjrzeć się bardzo małym projektom typu open source. Dodałbym, że próba dokonania ukierunkowanej zmiany w takim programie byłaby świetnym sposobem na naukę. Zaleta: poznasz niektóre wzorce stosowane w rzeczywistych programach. Wada: równie dobrze możesz nauczyć się anty-wzoru.
doubleYou