Czy byłeś kiedyś świadkiem tworzenia jakiegoś oprogramowania? Chodzi mi o coś w rodzaju spoglądania przez ramię na klepiącego kod programistę. Można się tak dużo nauczyć. Jednak jeżeli dziedzina rozwiązywanego problemu jest dla jednej osoby zbyt obca, to również i kod na jej oczach powstający może stanowić dużą abstrakcje. Proces powstawania znanych, lecz trudnych algorytmów również może być bardzo ciężki do zrozumienia bez ciągłych objaśnień autora, na temat tego co wyraża dany kod.
Raz na jakiś czas (czyli w praktyce codziennie :)) przychodzi nam zmierzyć się z kodem napisanym przez kogoś innego, gdyż musimy np. naprawić jakiegoś buga. Zabawne w tym jest to, że z kwintesencji myśli - jaką jest kod źródłowy, musimy starać się na nowo całą myśl odtworzyć, by w pełni zrozumieć cały kod i zamierzenia pierwotnego autora.
Można rzec, że czytanie kodu to wręcz sztuka odtwarzania myśli autora na podstawie pozostawionych przez niego poszlak. Nauka programowania zatem nie może polegać na czytaniu kodu źródłowego, gdyż jest to czynność odwrotna.
Pytanie, które można tutaj postawić: skoro nie należy uczyć się programowania poprzez czytanie kodu, to jak? Jedna z odpowiedzi to: pisać, pisać, pisać. To jest wskazówka dla uczących się. A co ze wskazówką dla uczących innych? Wg mnie należy przede wszystkim pokazywać młodym adeptom sztuki programowania jak myśli powinny zamieniać się w kod. Każdy programista powinien zdawać sobie sprawę, że istnieje masę mini-wzorców, które codziennie stosujemy, a które dla świeżaka mogą być trudne do wymyślenia. Dobry programista języka C wie, że z połączenia switcha, wskaźników na funkcje, tablicy owych wskaźników można zrobić nie najgorsze menu gry, oprogramowujące coś takiego jak poniżej:
1. Nowa Gra
2. Lista wyników
3. Ustawienia
4. Wyjście
Dobry programista języka obiektowego patrząc na coś takiego od razu widzi klasę agregującą Menu oraz klasę MenuItem a także parę ich pól i metod tychże klas. Młody programista widzi co najwyżej listę stringów.
Programowanie w parach.
Mieliście kiedyś okazję programować w parzę? Dla naprawdę dobrej zabawy potrzebna jest osoba (na mniej więcej tym samym poziomie jak Ty), jeden problem (który oboje rozumiecie), jeden komputer oraz jedna klawiatura. Krzesło takie, jak te obok nie jest wymagane ;) Jedna osoba pisze kod, mówi na bieżąco co robi, dlaczego i po co. Druga parafrazuje to co słyszy, patrzy na kod szuka drobnych błędów, szuka corner-case'ów w zapisywanym algorytmie i robi wiele innych rzeczy o których osoba pisząca w danej chwili nawet nie byłaby w stanie myśleć.
Uczą się wówczas dwie osoby. Pisząca, na bieżąca ma zwracaną uwagę, dzięki czemu uczy się zauważać problem we właściwym momencie, nie pisze złego kodu dzięki czemu nie utrwala złych nawyków. Siedząco-czytająco-poprawiająca uczy się czytać kod, gdyż na bieżąco może pytać, czy dobrze rozumie danych kilka linii. Uczy się także wyłapywać szczególiki. Oczywiście podczas programowania w parach po jakimś czasie następuje zamiana, by obie osoby mogły szkolić się we wszystkich aspektach.
Niestety rzeczywistość jest taka, że trudno jest znaleźć dobra osobę do takiej zabawy, prezentującą odpowiedni (nie za niski, nie za wysoki) poziom umiejętności, posiadającą odpowiedni stopień zainteresowania danym tematem, dysponującą czasem wolnym w podobnym terminie a także mieszkającej w podobnej lokalizacji.
Jeżeli zwrócimy uwagę na ostatni aspekt, to łatwo nam może przyjść do głowy, że w ostatnim dziesięcioleciu masę problemów, które borykały się z brakiem odpowiedniej lokalizacji zostało rozwiązanych dzięki medium jakim jest Internet. Może by i tym razem iść podobną ścieżką?
Wyobraź sobie taki scenariusz...
Wchodzisz na pewien Portal, wybierasz kategorie oprogramowania jakie chcesz stworzyć. Wybierasz technologie z którymi jesteś zaznajomiony, oznaczasz w jakim stopniu władasz jakimś językiem programowania. Tworzysz opis projektu, który chciałbyś stworzyć. Portal po pewnym czasie wysyła Ci powiadomienie o innej osobie, która chciałaby zrobić coś podobnego. Nawiązujecie współpracę, tworzycie razem ostateczny szkic projektu. Zanim przystąpicie do pracy instalujecie każdy na swoim komputerze oprogramowanie, który tworzy wam "sandboxa" dla waszego projektu, oraz zapewnia komunikację typu klient/server programem, który pilnuje, by kopia programu na waszych komputerach prezentowała różny stan (gdy u jednego program głównie nadaje, drugi głównie odbiera transmisję). Transmisją byłby przede wszystkim obraz video pochodzący z pulpitu komputera. Użytkownik programu użytkownika bardziej pasywnego posiadałby dodatkowy kursor, który byłby widoczny na komputerze użytkownika bardziej aktywnego. Tym kursorem (którym mógłby tylko wskazywać) użytkownik drugi pokazywałby dane kawałki kodu pierwszemu. Oprócz komunikacji video powinna również odbywać się komunikacja audio, w tym przypadku w obie strony.
Program pochodzący z Portalu pilnuje też tego, by po zdefiniowanym przez ową parę śmiałków czasie, zamienić ich rolami. Całe środowisko pracy, zostaje w bardzo szybki sposób przeniesione na stanowisko drugiej osoby, tak by chwile później to ona mogła przejąć kodowanie a druga by mogła skupić się na "zwracaniu uwagi".
Teoretycznie wszystko to da się już osiągnąć, bez jakichkolwiek portali, stosując narzędzia takie jak VNC, Skype, VirtualMachine (oraz klient VPN w razie potrzeby). Znacie jednak kogoś, kto próbował czegoś takiego? Pomysł wydaje się trochę szalony, jednak, gdyby powstało jedno narzędzie umożliwiające to wszystko, podejrzewam, że znalazło by się wielu, którzy zechcieliby to wypróbować ;)
Programistyczny Truman-show
Jednak jeżeli ktoś nie lubi roli podpowiadacza i woli rolę aktywnego programisty, to sądzę, że już teraz łatwo może zrealizować następujący scenariusz:
Załóż stronę projektu, repo (wystarczy read-only), bug trackera, bloga, czat. Zainstaluj jakiś program typu CamStudio, czy Camtasia i jakiś inny broadcaster do nadawania video (justin.tv) i po prostu włącz wszystko i nagrywaj, transmituj to co robisz. Pokaż jak konfigurujesz środowisko, jak zaczynasz tworzyć projekt... a najlepiej gadaj przy tym ile wlezie - tak do siebie i mikrofonu, tłumacząc co robisz.
Sądzę, że jeżeli by coś takiego rozreklamować, to znalazła by się cała masą widzów, którzy zechcieliby spoglądać jak krok po kroku tworzysz coś od podstaw (nie koniecznie od początku wiedząc jak coś zrobić w całości). Znalazła by się masa ludzi, którzy by Tobie podpowiadali jaki możesz zrobić następny krok. Naprawdę mógłbyś poznać mnóstwo osób, którzy byliby chętni pomóc.... a Ty mógłbyś stać się sławny :) Musiałbyś tylko dzielić się z nimi nie tylko wynikami swojej pracy, ale wszystkimi przemyśleniami podczas programowania.
Jest jednak jeden minus tego przedsięwzięcia. Zapewne pisząc kod nie raz "zawiesisz się" na rzeczach banalnych, które może i nawet doskonale umiesz ale które jednak trochę zapomniałeś. Być może cały świat spostrzeże też, że nie znasz jakiejś podstawy i wszyscy mogą się dziwić.. "to on za taki projekt się bierze, a nie wie takich podstaw?". Jakiś czas po owym programie możesz na rozmowach kwalifikacyjnych słyszeć: "widzieliśmy jak Pan programuje, bierzemy Pana!" lecz równie dobrze: "robi Pan dość dużo głupich błędów, my tutaj cenimy dokładność".
Czy byłbyś na tyle odważny by stać się programistycznym Trumanem?
Subskrybuj:
Komentarze do posta (Atom)
Heh, ja raczej nie miałbym takiej odwagi, bo właśnie czasem popełniam strasznie głupie błędy lub zawieszam się na banalnych rzeczach.
OdpowiedzUsuńJednak ogólnie pomysł jest niezły, programować w parach mógłbym tylko raczej z kimś bliżej mi znanym.
fajny pomysł, chyba jeszcze nie ma portalu, który realizowałby coś takiego... może to jest właśnie ta nisza do wykorzystania.
OdpowiedzUsuńNagrywanie/prezentowanie jak koduje - brzmi ciekawie i intrygująco. Myślę że było by z tego więcej pożytku, a ostatni aspekt jaki opisujesz wcale nie musiałby mieć miejsca.
OdpowiedzUsuńProgramowanie w parcha - fantastyczny pomysł! Jak tylko przeczytałem ten paragraf, pomysł od razu mi się spodobał. Banalne, ale jakże odkrywcze. True, true!
Programowanie w parach odkryłem niedawno. Pisałem z osobą posiadającą o wiele mniejsza wiedzę ode mnie. Ucząc Ją zauważyłem wiele dziwnych zawiłości które stosuję albo banalnych błędów przez co zacząłem tego unikać - wcześniej nie przywiązywałem wagi do tego tylko szedłem dalej. W każdym razie uważam, że nawet taka praca z osobą o niższym poziomie (oczywiście nie mówię tu od razu o współtworzeniu projektu) daję dobre rezultaty dla obu stron.
OdpowiedzUsuńNatomiast pomysł video bloga w wydaniu programistycznym uważam za genialny. Jeśli nie byłby to stream na żywo a jedynie nagranie wrzucone do sieci, odpowiednio zmontowane to nie dość, że byłoby to bardzo pouczające dla wielu, nie dość że można by w etapie produkcji tego filmiku zauważyć swoje głupie błędy to na dodatek byłaby to genialna reklama, nie tylko umiejętności ale także technik i sposobów myślenia. Aż chce mi się tego wypróbować. ;)
Pomysł doskonały. Od dawna marzę by ktoś krytycznie zerknął na to co robię i jak to robię.
OdpowiedzUsuńPomysł z video wspaniały. Chyba spróbuję coś zamieścić - na 100% anonimowo - a potem się zdecyduje co dalej.
Pytanie, kto jest zainteresowany oglądaniem i komentowaniem?
Piszę w Qt/C++ a ostatnio w QML jest ktoś chętny do oglądania?
Anonimowy tchórz
P.S. Wpis i blog dodaję do RSS.
P.S.2 Kto wie być może zdefiniowałeś nowe zjawisko w internecie ...
Nie łudziłbym się, że w stanach już ktoś tego nie wymyślił. :P
OdpowiedzUsuńZdarza mi się pracować w ten sposób - UltraVNC zainstalowane na programistycznej wirtualce, znajomy podłączony do mojej sesji, i rozmowa na skype podczas pracy. Raz ja piszę w moim VS, raz on. Przy bardziej skomplikowanych problemach bardzo polecam takie podejście.
OdpowiedzUsuń