Programowanie piśmienne ma dobre ideały. Dlaczego uważasz, że to nie jest główny nurt? Czy to dlatego, że nie udało się dostarczyć?
Programowanie piśmienne ma dobre ideały. Dlaczego uważasz, że to nie jest główny nurt? Czy to dlatego, że nie udało się dostarczyć?
Odpowiedzi:
Po raz pierwszy zobaczyłem to w księdze pism Knutha i pomyślałem, że wygląda to schludnie. Potem spróbowałem użyć wyświetlacza programowania literackiego, aby zrozumieć, co się dzieje w programie, i okazało się, że jest trudniejsze niż się wydaje. Możliwe, że byłem zbyt przyzwyczajony do przeglądania list programów, ale wydawało się to mylące.
Potem spojrzałem na kod źródłowy, i to mnie tu i ówdzie wyłączyło. Musiałbym nauczyć się pisać programy w zupełnie nowy sposób, z mniejszą korespondencją między tekstem programu a tym, co widział kompilator, i nie widziałem żadnych korzyści.
Ponadto ludzie mogą pisać długie i przekonujące argumenty, że kod wykonuje X, podczas gdy faktycznie wykonuje Y, i natrafiłem na moją część wprowadzających w błąd komentarzy. Uwielbiam czytać kod, aby zobaczyć, co robi dość wcześnie. Umiejętność programowania jest antytezą tego.
Winiłbym efekt sieci . Aby inni mogli edytować Twój kod i dokumentację, muszą być w stanie to zrozumieć.
To odsuwa ludzi od czegoś takiego jak cweb / noweb, ponieważ korzystanie z nich wymagałoby nauki TeXa i specyficznej dla programu składni nad językiem programowania, którego używasz w projekcie. Może to być postrzegane jako ogromna strata czasu, zwłaszcza jeśli nie potrzebują żadnego składu matematycznego, który byłby tak dużym pociągnięciem dla TeX-a. (A dla wielu programistów aplikacji tak naprawdę nie będą tego potrzebować.) Zamiast tego wolą coś w rodzaju komentarzy XML Visual Studio, ponieważ jest to już popularne i ugruntowane.
Miejsca, w których widziałem, jak rozwija się umiejętność programowania, to komputeryzacja naukowa / statystyczna, gdzie większość programistów ma znaczące wykształcenie (akademie doktoranckie) w zakresie matematyki, CS lub statystyki, a zatem zna już LaTeX. Dokumentacja, którą piszą, najprawdopodobniej zawiera wiele skomplikowanych formuł, które najlepiej napisać w TeXie, i częściej programują w R. Udział procentowy programistów R, którzy znają SWeave, jest zdecydowanie wyższy niż, powiedzmy, odsetek programistów C, którzy wiedzą o cweb.
org-mode
wsparcie programowania w zakresie umiejętności czytania i pisania . Jest to całkiem przydatne i znacznie łatwiej jest mi zrozumieć (nie wspominając o zarządzaniu ) niż sama WEB lub NOWEB. Ważnym aspektem kodu jest czytelność, która jest czytelna. (cf github.com/vermiculus/stack-mode )
Podczas nauki fascynowała mnie koncepcja programowania piśmienniczego pod koniec lat 90. i nadal intryguje mnie podejście Knutha do programowania i składu. Nic, tylko najlepsze.
Opracowany przez Knutha system Literate Programming zrobił znacznie więcej niż od razu, a mianowicie przezwyciężył wiele niedociągnięć w podstawowym języku programowania wygenerowanym przez narzędzie do generowania kodu z dokumentu źródłowego Knutha, mianowicie standardowego Pascala.
Dla tych, którzy mieli szczęście, że nie wypróbowali Standard Pascal, oto niektóre z najważniejszych wydarzeń.
Wszystko to w zasadzie oznaczało, że Knuth potrzebował lepszego języka programowania (więc wynalazł jeden) i używał Pascala jako języka asemblera.
Większość współczesnych języków potrafi robić te rzeczy bez większego wysiłku, dlatego też usuwa DUŻĄ część pracy, którą miały rozwiązać Programowanie Literackie.
Również współczesne języki są bardziej wyraziste, co pozwala na głębsze zastanowienie się nad samym kodem.
Co pozostaje? Zdolność do generowania formularza typeset dokumentacji z kodu źródłowego, a ŻE istnieje dzisiaj.
Pomyśl tylko o JavaDoc - Java Runtime API to chyba największy dostępny obecnie program do pisania i pisania (poza tym, że kod nie jest właściwie prezentowany, ale Mógłby tak być, gdyby Java była otwarta od samego początku). Zobacz na przykład prezentację struktury kolekcji na http://download.oracle.com/javase/6/docs/api/java/util/Collection.html
Wierzę, że podobne systemy istnieją dla .NET i innych programów głównego nurtu.
To make it possible to have a single-pass compiler, all declarations had to come in a certain order.
Taka kolejność deklaracji z pewnością upraszcza projektowanie kompilatorów, ale nie włącza ani nie zapobiega kompilacji jednoprzebiegowej. Na przykład Delphi nie ma tego ograniczenia kolejności, ale nadal jest to jednokierunkowy kompilator Pascal.
Jedną z rzeczy, które odkryłem, kiedy miałem talent do programowania piśmiennego w latach 90., było to, że przyciągnęło to bardzo pasjonujących ludzi, którzy chcieli robić dokładnie to, co właściwe - i to wymagało napisania własnego systemu programowania, ponieważ żaden z nich nie był dla nich wystarczająco dobry. noweb była dobrą próbą odcięcia tego, zapewniając wszystkim wystarczająco dobry, najmniej wspólny mianownik, chociaż nawet wtedy spędziłem większość mojego LP na opracowywaniu do tego ładnej drukarki ...
Inną kwestią jest to, że jest naprawdę anty-zwinny. W pewnym sensie spowolnienie jest dobre, ponieważ zmusza cię do myślenia bardziej z góry i poprawiania sytuacji za pierwszym razem. Z drugiej strony, skrupulatne dokumentowanie podczas pracy oznacza, że istnieje znaczna bariera dla refaktoryzacji kodu. A jeśli zaczekasz, aż kod zostanie zahartowany przed LP, jeśli to zrobisz, skończysz na wielodniowym zadaniu dokumentacyjnym, które naprawdę może cię zatrzymać.
Moim skromnym zdaniem wiele firm ma kulturę przeciwną do celów programowania literackiego: chcą szybszych rezultatów (płaczą tylko z powodu jakości, gdy aplikacja jest w produkcji). Z własnego doświadczenia wynika, że moi szefowie nie rozumieli, że szybsze wyniki nie oznaczają „programu, który można uruchomić następnego dnia po tym, jak o to poproszę”. Dla nich, jeśli programista nie jest zajęty pisaniem na klawiaturze, nie pracuje, „marnuje swój czas na bezsensowne projektowanie”. Tak, wiem, mój szef jest dupkiem.
Kodery piszą kod nie po angielsku.
Kodery nie lubią pisać dokumentacji, ponieważ nie pomaga to w uruchomieniu kodu.
Kodery nie są dobre w pisaniu dokumentacji, ponieważ jest to kiepskie medium do wyrażania swoich pomysłów.
Programowanie piśmienne wydaje się być pomysłem na przeniesienie dokumentacji na wyższy poziom, gdzie kod jest późniejszą refleksją. Może to zadziałałoby, ale dla większości programistów wygląda na nieznośną dokumentację.
Głównie dlatego, że ludzie są BARDZO GŁUPI. Oczywiste świadectwo, którego jest niekończącym się strumieniem domysłów i nieporozumień wyrażanych przez młodych ludzi na temat natury tej prostej techniki.
Ludzie biorą LP za: (a) metodę dokumentacji (b) metodę pisania niektórych dopracowanych esejów, która wymaga pewnych specjalnych umiejętności lub talentów (c) po prostu nie mają pojęcia - jako twórca edytora programowania Leo, jak sam przyznaje itp. itd. itd.
LP to po prostu: (1) pisanie programów w mieszance kodu i fraz w (= dowolnym) ludzkim języku, przy czym te ostatnie oznaczają inne fragmenty kodu i / lub dołączone frazy. To właśnie robią autorzy niezliczonych podręczników programistycznych .. i (2) jest to prosty preprocesor, który rozszerza te wyrażenia w ludziach (które stały się jakby nazwami zawartych podprogramów), aby rozwikłać wynik W ZAMÓWIENIU WYMAGANYM PRZEZ KOMPILERA (lub interpretator). W przeciwnym razie można rozszerzyć napisany tekst za pomocą innego małego narzędzia, aby włączyć symbole formatowania, aby przekształcić „źródło piśmienności” w ładny, dobrze sformatowany, czytelny tekst.
Młodzi ludzie nigdy nie próbują tego niezwykle prostego pomysłu - albo fantazjują, albo wyobrażają sobie fałszywe powody, dla których nigdy tego nie spróbują.
Zasadniczo główna idea programowania „w pseudokodzie” napisanym w ludzkim języku, a następnie rozszerzania go za pomocą prostego narzędzia preprocesora POMAGA ZARZĄDZAĆ UWAGĄ (ograniczona, główna trudność dla każdego długiego programu), podobnie jak zwijanie kodu lub podział przepływu programu w funkcje / podprogramy, potrzebne, abyś nie zagubił się w szczegółach, ale całkowicie niepotrzebny do wykonania maszyny.
Istnieją dwa aspekty programowania piśmiennego, które, jak chciałbym, zostały włączone do programowania głównego nurtu - osadzone zdjęcia (np. Schematy projektowe) i wskaźniki do poprzednich i alternatywnych prób (np. „Powodem jest to, ponieważ próbowałem w inny sposób i nie działało, ponieważ ... ”). Oba te aspekty można rozwiązać za pomocą doc-comments i URI.
Ponieważ logika programów nie działa tak jak my mówimy. Program ma dobrze określony przepływ oraz warunki i pętle.
Po kodowaniu na bieżąco MYŚLĘ w tych kategoriach. Mój mózg przekształca problemy w domenę docelową kodu wykonywalnego. I jest o wiele bardziej wydajne dla mnie, aby zapisać to w zwykle języku programowania, niż robić dodatkowy krok transformacji, aby moje programy potrafiły pisać.
W rzeczywistości uważam, że moje programy są już kompetentne ... identyfikatory mówiące, dobre nazwy funkcji, komentarze, w których zrobiłem trochę hakerów, których sam nie zrozumiałbym natychmiast po kilku miesiącach.
Podsumowując: Mój kod Java sam w sobie jest bardziej kompetentny, tak jak chce tego każde programowanie.
Przyszedłem pisać się na temat programowania na odwrót - marzyłem, żeby kod był zorganizowany tak, aby pasował mi do głowy, a nie tak, jak wymaga tego kompilator. Uważam, że Leo jest prawie idealny do tego celu. Obsługuje również śledzenie plików zmienionych na zewnątrz. Te pliki nie muszą zawierać żadnych specjalnych znaczników, więc mogę używać Leo dla siebie bez potrzeby, aby inni w zespole o tym wiedzieli. Ta funkcja - „@shadow trees” - jest bardzo obiecująca, choć wciąż nieco wadliwa, wymaga więcej gałek ocznych. Rozwiązuje również problem „o nie, wszystko w jednym dużym pliku” zarówno poprzez organizowanie wszystkiego w zarys drzewa, jak i przez obsługę plików zewnętrznych.
Dla mnie, wbrew nazwie, „umiejętność programowania” w ogóle nie dotyczy dokumentacji. Nie mam więcej dokumentacji niż wcześniej. Chodzi o posiadanie struktury, która pomaga mi się nie zgubić . Przysięgam, zwłaszcza przy zarządzaniu plikami JSP-Behemoth (i że pomimo tego, że Leo był pierwotnie przeznaczony głównie dla Pythona i nie obsługuje języka JSP - muszę ręcznie podzielić plik na drzewo Leo!).
Widzę to jako cenne narzędzie dydaktyczne, w którym można napisać rozprawę o kodzie, a następnie przepleciono w nim fragmenty działającego kodu, aby poinstruować czytelników o tym, jak i dlaczego.
Myślę, że poza środowiskiem czysto edukacyjnym tylko Knuth naprawdę wie, jak najlepiej z niego korzystać.
To najgorszy ze wszystkich światów - musisz napisać bardzo poprawny, bardzo specyficzny program komputerowy w bardzo nieokreślonym języku = angielski. Musisz więc starannie napisać, używając dokładnie poprawnych fraz - tak samo możesz napisać kod.