Katedra i bazar

Linux jest wywrotowy. Kto by pomyślał nawet pięć lat temu (w 1991 roku), że z pracy rozproszonych po całym świecie programistów połączonych cienkimi przewodami Internetu i hakujących{1} w wolnych chwilach wyłoni się w niemal magiczny sposób światowej klasy system operacyjny?

Na pewno nie ja. Kiedy Linux pojawił się na ekranie mojego radaru na początku 1993 roku, moje zaangażowanie w rozwój oprogramowania uniksowego i open source trwało już ponad dziesięć lat. Byłem jedną z osób pracujących nad projektem GNU{2} w połowie lat osiemdziesiątych. Udostępniłem w Internecie wiele programów open source, pracując samemu i z innymi nad rozwojem wielu programów używanych do dziś (takich jak nethack{3}, tryb VC i GUD dla Emacsa{4}, xlife i inne). Byłem przekonany, że wiem, jak to się robi.

Linux wywrócił to przekonanie do góry nogami. Przez wiele lat głosiłem uniksową ewangelię małych narzędzi, szybkiego prototypowania i programowania ewolucyjnego. Wierzyłem jednak, że istnieje pewien punkt krytyczny złożoności, powyżej którego musi się zastosować bardziej scentralizowane podejście a priori. Uważałem, że najważniejsze programy (systemy operacyjne i narzędzia naprawdę sporych rozmiarów, takie jak edytor dla programistów, Emacs) powinny powstawać jak katedry: budowane zręcznymi palcami samotnych czarodziei lub grupy dostojnych magów pracujących w pełnym namaszczenia odosobnieniu, bez wersji beta udostępnianych przed czasem.

Styl rozwoju oprogramowania zaproponowany przez Linusa Torvaldsa, "wypuszczaj nowe wersje wcześnie i często, bądź otwarty, wręcz bliski rozwiązłości", był dla nas sporą niespodzianką. Zamiast budować katedrę w pełnej skupienia ciszy, społeczność linuksowa przypominała jeden wielki hałaśliwy bazar, pełen różnych poglądów i planów (co doskonale reprezentują serwery z archiwami linuksowymi, przyjmujące programy od każdego), z którego, jak się wydawało, spójny i stabilny system mógłby wynurzyć się tylko cudem.

Bardzo zaskoczył nas fakt, że ten bazarowy styl działał, i to działał dobrze. Kiedy nabrałem doświadczenia, nie tylko ciężko pracowałem nad pojedynczymi projektami, lecz również bardzo starałem się zrozumieć dlaczego linuksowy świat nie rozpadł się na kawałki w wielkim zamieszaniu, ale rośnie w siłę z prędkością niewyobrażalną dla budowniczych katedr.

W połowie 1996 roku stwierdziłem, że zaczynam rozumieć. Przypadek dostarczył mi doskonałego sposobu na sprawdzenie mojej teorii: projektu open source, który mogłem rozwijać w bazarowym stylu. Rozpocząłem więc nad nim pracę, która zakończyła się jednoznacznym sukcesem.

Na stronach tej książki opisuję historię tego projektu. Wykorzystałem ją by przedstawić kilka aforyzmów opisujących efektywny rozwój oprogramowania open source. Nie wszystkiego nauczyłem się w świecie linuksowym, jednak właśnie w nim niektóre sprawy nabrały szczególnej barwy. Jeśli mam rację, pomogą wam zrozumieć dlaczego społeczność linuksowa jest niewyczerpanym źródłem tak dobrego oprogramowania; być może sprawi też, że sami staniecie się bardziej twórczy. Poczta musi dojść

Od 1993 roku zajmowałem się techniczną stroną obsługi wolnodostępnego ISP{1}, zwanego Chester County InterLink (CCIL) w West Chester w Pensylwanii. (Byłem jednym z założycieli CCIL i autorem jedynego w swoim rodzaju programu BBS dla wielu użytkowników, z którym można się zapoznać telnetując się do locke.ccil.org; dzisiaj obsługuje ono niemal trzy tysiące użytkowników na dziewiętnastu liniach). Dzięki tej pracy miałem zapewniony 24-godzinny dostęp do Internetu; w praktyce było to nie tyle udogodnienie, co wymóg!

Przyzwyczaiłem sie więc do natychmiastowego otrzymywania poczty elektronicznej. Z powodów zbyt złożonych, by je tutaj wymieniać, trudno było nawiązać połączenie SLIP{6} między moim komputerem w domu (snark.thyrsus.com) a CCIL. Kiedy mi się w końcu udało, ciągłe logowanie się do locke w celu odczytania poczty stało się denerwujące. Chciałem jedynie, żeby moja poczta znalazła się na snarku, o czym mógłbym być powiadamiany i pokierować nią dalej używając narzędzi znajdujących się na mojej maszynie.

Zwykłe przekazywanie poczty przy użyciu sendmaila{7} nie wystarczało, ponieważ mój komputer nie zawsze jest widoczny w sieci i nie ma statycznego adresu IP{8}. Potrzebowałem programu, który połączyłby się z locke przez SLIP, pobrał pocztę i dostarczył ją do mojego komputera. Wiedziałem, że istnieją tego typu narzędzia i że większość z nich używała prostego protokołu zwanego POP (Post Office Protocol, protokół pocztowy). Oczywiście do systemu operacyjnego locke, BSD/OS, dołączono serwer POP3.

Potrzebowałem klienta POP3. Zacząłem więc szukać w Internecie i znalazłem. Szczerze mówiąc znalazłem trzy czy cztery takie narzędzia. Przez pewien czas używałem pop-perl, jednak brakowało mu niezbędnej funkcji: zdolności podmiany adresów w taki sposób, by można było bez problemów odpowiadać na listy.

Na czym polegał problem? Załóżmy, że otrzymałem list od użytkownika z locke o nazwie "joe". Pobierałem pocztę z locke, lecz kiedy próbowałem na nią odpowiedzieć, mój program pocztowy próbował radośnie przekazać ją nieistniejącemu "joe" na snarku. Ręczna edycja adresów na "@ccil.org" wkrótce stała się uciążliwa.

Było to oczywiście coś, co komputer powinien robić za mnie, jednak żaden z istniejących klientów POP nie wiedział jak! W ten sposób doszliśmy do pierwszej lekcji:

Przypisy:

{1} hack -- (inteligentna) sztuczka (programistyczna); bardzo specyficzne słowo, używanie niemal wyłącznie w kulturze hakerskiej. Jako rzeczownik oznacza sztuczkę programistyczną, sprytne rozwiązanie w kodzie źródłowym programu; czasownik odnosi się do programowania, jednak nie chodzi tu o bezmyślne wpisywanie kodu, lecz wysokiej jakości pracę twórczą.

{2} GNU - skrót od "GNU is Not Unix", projekt całkowicie darmowego systemu operacyjnego zgodnego z systemem UNIX, rozpoczęty przez Richarda M. Stallmana w 1983 roku. Większość oprogramowania rozprowadzanego wraz z Linuksem stanowi część projektu GNU. Programy tworzone w ramach projektu GNU są udostępniane na licencji GPL (GNU Public License), dzięki której użytkownicy mogą swobodnie używać, modyfikować i rozpowszechniać zmodyfikowane kopie programów. Więcej informacji o projekcie GNU można uzyskać na stronach http://www.gnu.org.

{3} nethack - bodaj najpopularniejsza tekstowa gra przygodowa.

{4} Emacs - jeden z dwóch najpopularniejszych edytorów tekstowych dla systemów uniksowych (w tym Linuksa). Zaprojektowany przez Richarda M. Stallmana i będący częścią projektu GNU, Emacs stał się popularny dzięki niespotykanej elastyczności, licznym ułatwieniom dla programistów i przyjaznemu interfejsowi.

{5} ISP - Internet Service Provider, firma lub instytucja oferująca dostęp do Internetu.

{6} SLIP - Serial Line Internet Protocol, protokół odpowiedzialny za przesyłanie pakietów IP przez port szeregowy, a więc również przez modem. Obecnie używa się do tego celu protokołu PPP (Point-to-Point Protocol).

{7} Sendmail - najpopularniejszy uniksowy serwer poczty elektronicznej (MTA).

{8} Adres IP - adres komputera, dzięki któremu jest widoczny w sieci. Statyczny adres IP jest niezmienny, natomiast dynamiczny jest przydzielany zwykle na czas połączenia.

{9} Minix, stworzony w celach edukacyjnych przez prof. A. Tenenbauma, znanego specjalisty od systemów operacyjnych, został niedawno udostępniony na licencji open source. W linuksowych archiwach zachowały się interesujące dyskusje Linusa Torvaldsa z prof. Tenebaumem, m.in. znana wypowiedź "gdyby był Pan moim studentem, za ten projekt dostałby Pan dwóję"...

{10} Wymienione systemy kontroli wersji pomagają programistom w dokumentacji pracy nad programem, unikaniu pomyłek oraz trzymaniu porządku w kodzie. Ostatni z nich, CVS, jest powszechnie stosowany w wielu projektach open source jako narzędzie wspomagające pracę grupową. Dzięki niemu wiele osób może pracować równocześnie nad jednym projektem nie przeszkadzając sobie nawzajem.

{11} Wynika to z założeń projektu GNU, chroniących użytkowników przed próbami zawłaszczenia kodu przez autorów, którzy po pewnym czasie mogliby zmienić zdanie, ich spadkobierców itd.

{12} betatesterzy - osoby testujące wersje oprogramowania zwane "beta", tj. jeszcze nie gotowe, udostępniane w celu eliminacji błędów (praktyka ta jest powszechna wśród wielu producentów oprogramowania, nawet nie mających wiele wspólnego z Open Source, np. Adobe czy Microsoft). Wersje zwane "alfa" to aplikacje w bardzo wczesnym stadium rozwoju, użyteczne zwykle jedynie dla programistów. W świecie Open Source wersje alfa można zwykle rozpoznać po numerze wersji mniejszym od 1 (np. Xdialog 0.12), zaś wersje beta mają często nieparzysty numer podwersji (np. gtk+ 1.3.2, linux 2.3.39).

{13}poprawki - chodzi o tzw. łaty (patches), czyli zapisany w specjalnym formacie plik zawierający różnice między dwoma plikami czy zestawami plików, przy czym najczęściej chodzi o pliki źródłowe. Dzięki "zaaplikowaniu łaty" stary plik staje się identyczny z nowym. Jest to bardzo ekonomiczne rozwiązanie, zwłaszcza w przypadku, kiedy cały kod źródłowy ma ogromne rozmiary, zaś wprowadzane zmiany są niewielkie. Łaty są najpopularniejszą metodą wprowadzania zmian w społeczności Open Source również z tego powodu, że kilka osób może wprowadzić kilka różnych usprawnień do tego samego pliku nie powodując żadnych konfliktów.

{14} SMTP - Simple Mail Transmission Protocol, protokół wykorzystywany do wysyłania poczty (podczas gdy POP czy IMAP służą do odbierania jej). Protokół ten jest szczegółowo opisany w dokumencie RFC 821.

{15} Perl - potężny, skryptowy język programowania, używany przez programistów na całym świecie (również przy budowie serwisów WWW).

{16} OK - kod zwracany przez demona SMTP, jeśli operacja zakończyła się sukcesem. Protokół SMTP (jak i wiele innych protokołów internetowych) przypomina dialogi w języku angielskim. Klient komunikuje się z serwerem począwszy od komunikatu HELO (lub EHLO), zaś serwer odpowiada komunikatem OK lub ERR (po którym opcjonalnie mogą wystąpić inne informacje, wskazujące np. na przyczynę błędu). Dialog ten można ujrzeć wywołując fetchmaila z opcją -v.

{17} man - w systemach uniksowych programom (i nie tylko - dotyczy to również m.in. funkcji systemowych i plików konfiguracyjnych) towarzyszą pliki pomocy, zwane man (od angielskiego manual - podręcznik). I tak chcąc uzyskać pomoc na temat fetchmaila, wystarczy napisać man fetchmail, a wyświetli się strona podręcznika, wyjaśniając a sposób korzystania z fetchmaila.

{18} odpluskwianie (debugging) - proces znajdowania błędów w programie, polegający zazwyczaj na żmudnej analizie kodu, uruchamianiu programu z różnymi parametrami i testowaniu w różnych sytuacjach przy wykorzystaniu różnych narzędzi, zwanych debuggerami.

{19} aliasy - alternatywne nazwy. Serwery pocztowe korzystają zazwyczaj ze specjalnych plików, zawierających symboliczną nazwę (czyli alias) wraz z przypisanymi rzeczywistymi adresami jednego lub więcej użytkowników. Dzięki temu użytkowni jkowal może otrzymywać pocztę wysyłaną na adres Jan.Kowalski@serwer.com. Jeśli użytkowników skojarzonych z danym aliasem jest więcej, powstaje prymitywna lista dyskusyjna, tj. każdy list wysłany na ów adres dociera do wszystkich użytkowników skojarzonych z aliasem.

{20} pliki rc - pliki konfiguracyjne, których nazwa zazwyczaj ma końcówkę rc (w przypadku fetchmaila jest to .fetchmailrc), przechowujące opcje konfiguracyjne

{21} zapewnienie bezpieczeństwa przez niejawność (security by obscurity) - metoda zapewniania bezpieczeństwa polegająca na ukrywaniu ustawień systemowych, konfiguracji itp., próbując wprowadzić atakującego w błąd. Metoda ta jest bardzo nisko oceniana przez ekspertów od zabezpieczeń, zwłaszcza jeśli jest jedynym zabezpieczeniem systemu.

{22} UNIX powstał w Bell Labs (obecie Lucent); Richard Stallman, lider projektu GNU i główny twórca najważniejszego narzędzia używanego przez programistów linuksowych - kompilatora gcc, rozpoczął swoją działalność i przez pewien czas kontynuował ją w Laboratorium AI Massachusetts Institute of Technology; na uniwersytecie Berkeley powstało wiele narzędzi oraz kod różnych usług sieciowych.

{23} ukrywanie/strzeżenie kodu źródłowego oprogramowania (software hoarding) - termin używany przez Richarda Stallmana w stosunku do firm udostępniających jedynie wynikowe, binarne wersje programów. Znaleźć go można np. w słynnym "Hymnie hackerów" ("Hoarders may have piles of money, this is true, hackers, this is true...").