\(^2\) Mikrokomputery są współcześnie najistotniejszą częścią całej branży informatycznej, na tyle, iż zastosowania o nie oparte pojawiają się w miejscach dotychczas zarezerwowanych dla innych rodzajów komputerów (przykładowo automatyzacja urządzeń). Powoduje to, iż cała charakterystyka, oraz wszelkie ograniczenia pojawiające się na różnych etapach rozwoju mikrokomputerów, są również i tam obecne.
Początki komputerów i narodziny kultury hakerskiej
Za początek rozwoju współczesnych komputerów możemy określić rok 1954 - moment opracowania przez ośrodek badawczy firmy Bell Labs komputera TRADIC - pierwszego komputera opartego o tranzystory. Schemat działania tego komputera może posłużyć do wyjaśnienia podstawowego sposobu użytku wszystkich późniejszych komputerów, z racji iż wszystkie komputery do dziś są oparte właśnie o tranzystory. Otóż całe działanie komputera realizuje procesor (który zajmuje się wykonywaniem wszelkich obliczeń) , wraz z pamięcią (do zapisu kodu wejściowego, wyniku procesu działania i wszelkich wyników tymczasowych). Użytkowanie komputera odbywa się poprzez programy, czyli skonstruowany przez człowieka kod. W swojej podstawowej formie jest on listą instrukcji przesyłanych do procesora, co do operacji logicznych (w tym matematycznych), jakie ma na wprowadzonych danych wykonać. Na poziomie maszyny zostaje sprowadzony do postaci liczbowej, określanej również jako kod maszynowy (1 i 0) a sama składnia tak przedstawionych instrukcji, zależy od konstrukcji procesora. Trzymanie się wyłącznie takiej postaci, znacząco ogranicza użytek komputera i utrudnia pracę, dlatego od początku (przy pierwszych komputerach, nieopartych o tranzystory) pojawia się koncepcja wprowadzenia języka pośredniczącego między człowiekiem a komputerem. Język ten, powszechnie definiowany jako język programowania niskiego poziomu (jnp), jest zamianą kilku podstawowych pojęć, na postać liczbową, zrozumiałą dla maszyny. Owe pojęcia również wynikają z samych możliwości maszyny, zatem użycie komputera poprzez język tego typu wymaga wiedzy eksperckiej, na temat działania danego komputera, jednakże jest nieograniczonym działaniem na samej, obiektywnej maszynie.
Nadal jednak sposób zapisu kodu który chcemy wprowadzić, jest uzależniony od charakterystyki maszyny z której korzystamy, zatem o ile język niskiego poziomu (jnp) zapewnia nam standaryzacje w komunikacji między użytkownikiem a komputerem, to komunikacja między użytkownikami jest nadal mocno utrudniona. W związku z czym, w roku 1957 pojawia się język FORTRAN, pierwszy język programowania wysokiego poziomu (jwp), charakteryzujący się składnią zupełnie niezależną od maszyny. Język tego typu jest oddzielnym systemem, dostosowanym do potrzeb, dla których został opracowany, narzucając tym samym konkretną składnie logiczną i charakterystykę kodu, tym samym wprowadzając określone ograniczenia. Dostosowanie takiego języka do konkretnej maszyny odbywa się poprzez translator - oddzielny program opracowany w języku niskiego poziomu (jnp) tłumaczący język wysokiego poziomu (jwp) bezpośrednio na kod maszynowy. Zatem FORTRAN, wraz z innymi, późniejszymi językami wysokiego poziomu początkowo pełnią głównie rolę standaryzującą to, jak pisać o programach. Fakt, że programy tak zapisane dało się uruchomić, nie zmieniło faktu, iż nadal główną metodą pracy z komputerem był język niskiego poziomu (jnp).
Należy tu wspomnieć o tym, iż początkowo głównym celem użytku komputera była realizacja obliczeń, głównie dla celów naukowych. Były one przeprowadzane na samej maszynie, a więc ówczesne programy, nie były niczym więcej niż właśnie takimi obliczeniami. Dyskusja o programach była więc bardzo swobodna. Przez całe lata 60 wszelkie programy dostępne w formie zrozumiałego dla wszystkich kodu, który można było swobodnie modyfikować, wprowadzając własne poprawki, a ówczesna kultura środowiska wymagała, by takie poprawki również udostępnić. Cała kultura eksperckiego środowiska związanego z komputerami, globalnie określana jako kultura hakerska, opiera się właśnie na całkowitej wolności przy użyciu komputera: wolności tworzenia, wolności w dostępie do wiedzy i wolności dzielenia się wiedzą, przy założeniu, iż jedynie zachowując te zasady mamy pewność że nasz dostęp do komputera nadal pozostaje pełny (komputer z którego korzystamy nadal zachowuje pełne zdolności Maszyny Turinga).
UNIX i komercjalizacja informatyki
Na początku lat 70 dynamiczny rozwój branży informatycznej powstały dzięki tak swobodnej wymianie wiedzy, wprowadza nową standaryzacje, rozwiązania stojące u podstaw współczesnych komputerów. W październiku 1973 roku w środowisku akademickim zostaje opublikowany system operacyjny UNIX, produkt powstały w ośrodku Bell Labs, należącego do firmy AT&T, która to początkowo była właścicielem wszelkich praw do systemu, jednakże z powodu zakazu wejścia na rynek informatyczny, wydanego decyzją sądu w postępowaniu antymonopolowym, nie mogła go w żaden sposób opublikować. Udostępnienie systemu operacyjnego środowisku akademickiemu było inicjatywą inżynierów będących jego autorami, w zgodzie z ówczesną "hakerską" filozofią.
Wszelkie systemy operacyjne są programami uruchamianymi na komputerze celem rozszerzenia jego potencjalnych możliwości. Pierwsze z nich projektowane w latach 60 umożliwiały przykładowo automatyczne uruchamianie programów w pewnej kolejności czy uruchamianie wielu programów na raz. Natomiast UNIX był jednym z pierwszych systemów operacyjnych oferujących coś co można określić mianem środowiska pracy - wprowadzał sposób organizacji danych w pamięci komputera, możliwość swobodnego wglądu, wprowadzania i edycji zarówno kodu programów jak i danych, oraz otwarte środowisko, pozwalające tworzyć i uruchamiać wszelkie programy stworzone w językach zarówno niskiego, jak i wysokiego poziomu. Został on opracowany w oparciu o zasady programowania znane współcześnie jako teoria "Worse is Better" \citep{Gabriel:1991uo}, które ówcześnie dominowały w środowisku hakerskim przy projektowaniu wszelkich programów i opierały się o następujące założenia:
- Program musi być prosty, zarówno pod względem implementacji, jak i interfejsu. Dopuszczalne jest ograniczenie prostoty interfejsu, na rzecz prostszej implementacji. Prostota jest najważniejszą cechą każdego programu.
- Można poświęcić stuprocentową poprawność programu na rzecz prostoty.
- Spójność jest mało istotna. W niektórych przypadkach można zmniejszyć spójność na rzecz prostoty, jednakże lepiej jest zrezygnować z kompletności programu.
- Kompletność nie jest specjalnie ważna, jeśli miałaby uderzyć w prostotę lub spójność. System powinien skupić się na typowych przypadkach.
Kolejną zmianą, która zostaje zaproponowana w UNIXie, jest zastąpienie w podstawowej formie komunikacji z komputerem, języków niskiego poziomu (jnp), językiem C - językiem wysokiego poziomu (jwp) który zostaje powszechnie uznany za możliwie najwierniej oddający działanie na językach niskiego poziomu (jnp). Ma to umożliwić całkowitą uniwersalność programów (uniezależnienie ich od architektury sprzętu) , sam system zawiera wszelkie narzędzia potrzebne do dopasowania tak napisanego programu do konkretnej architektury procesora.
Od momentu wprowadzenia UNIXa zaczynają się również upowszechniać programy będące cyfrowymi narzędziami, które na potrzeby tej pracy zdefiniuję jako oprogramowanie (ang. software). Początkowo dzięki nim możliwe staje się tworzenie kodu programów, oraz tekstu wszelkich innych dokumentów od razu na komputerze, a w późniejszym okresie pojawiają się programy rozszerzających możliwości komputera o inne funkcje. Komputer w tym momencie przestaje być wyłącznie maszyną liczącą, staje się środowiskiem pracy i możliwe są pierwsze działania wyłącznie w rzeczywistości cyfrowej.
To właśnie oprogramowanie zaczyna powstawać głownie przy pomocy języków wysokiego poziomu (jwp), panuje jednak pełna dowolność co do wyboru języka, przyjęcie pewnych ograniczeń związanych z językiem wysokiego poziomu (jwp) jest wyłącznie decyzją autora. Ponadto panuje praktyka by kod tak wytworzony kod łączyć z elementami opracowanymi w językach niskiego poziomu (jnp) bądź korzystać wyłącznie z nich, jeżeli nie zależy nam na uniwersalności naszego programu lub oprogramowania.
Koncepcja oprogramowania pojawia się po raz pierwszy pod koniec lat 60, natomiast w 1971 z racji opracowania pierwszego układu mikroprocesora, który znacznie zmniejsza koszty i rozmiar konstruowanych komputerów, łącząc oba te rozwiązania pojawia się możliwość skonstruowania komputera personalnego - niedużego komercyjnego komputera, dostępnego finansowo dla osób prywatnych (dotychczas koszta powodowały iż na komputer mogła pozwolić sobie wyłącznie instytucja, a z jednego komputera jednocześnie korzystało wiele osób).
To właśnie w tym momencie zauważono ogromny potencjał komercyjny, związany z komputerami. Wkroczenie biznesu do, dotychczas głównie akademickiej, dziedziny jaką była informatyka, spowodowało ogromne zmiany.
Pierwsze personalne komputery oparte były o wcześniejszą, bo pochodzącą z 1969 roku koncepcję systemu operacyjnego związanego z językiem BASIC. System operacyjny był wyłącznie edytorem tego języka i to wyłącznie za jego pomocą mogła odbywać się obsługa komputera. Każdy komputer, w zależności od firmy będącej jego producentem, posiadał własną odmianę BASICa. Oprogramowanie, w przypadku tych maszyn obecne było w formie produktu - różnego rodzaju nośników zawierających kod maszynowy ówcześnie napisanych w danej odmianie BASICa programów.
W tym momencie biznes wprowadza pierwsze ograniczenia do użytku komputera. W ich idealnej wizji, potencjalny użytkownik ma możliwość wyłącznie kupna interesującego go oprogramowania, lub stworzenia własnego, w środowisku przygotowanym przez producenta komputera. Nie istnieje żadna możliwość wniknięcia w strukturę kupionego oprogramowania, można tylko próbować tworzyć własny program, mając do dyspozycji tylko to, czego udostępnienie użytkownikowi producent uznał za stosowne.
Oczywiście, teoretycznie do użytkowników trafia pełen kod maszynowy ich oprogramowania, natomiast należy tu zauważyć, że o ile można go przetworzyć na powrót do języka niskiego poziomu to kod tak skomplikowanych programów jakimi są cyfrowe narzędzia / oprogramowanie, do tego wytworzony w pełni przez translator jest niezwykle trudny do potencjalnej analizy, wymaga ona ogromnej wiedzy i nierzadko wielkich ilości czasu. W praktyce jest więc niemożliwa do przeprowadzenia przez pojedynczego użytkownika.
Natomiast kod źródłowy, czyli kod oprogramowania zapisany w postaci zrozumiałej, postaci języka wysokiego poziomu (jwp) staje się jednym z najbardziej istotnych sekretów każdego producenta. Programiści, dotychczas otwarcie publikujący każdy kod opracowanych przez nich programów, zmuszani są do podpisywania klauzul poufności, wiążących ich pracę z konkretnym producentem.
W 1973 roku pojawia się personalny komputer Xerox Alto, opracowany przez firmę Xerox PARC. Stworzony przez nich autorski system operacyjny, znajdujący się na tym komputerze, wprowadza jedną niezwykle istotną zmianę - graficzny interfejs użytkownika. Jego zastosowanie, pozwala niemalże całkowicie zrezygnować z obsługi komputera w sposób tekstowy, wprowadzając współcześnie wszystkim znane graficzne okienka. Z racji, iż tekstowa obsługa komputera nie jest już niezbędna, znika ona całkowicie z systemu, przez co użytkownicy zostają również pozbawieni możliwości programowania, swobodnego tworzenia kodu, będącego dotychczas podstawową formą obsługi komputera. W tym momencie skazani są wyłącznie na dostarczane im w formie produktów oprogramowanie, które teraz, w momencie gdy przybiera formę graficzną, tym samym, w założeniu jest tożsame z tym co mamy współcześnie, a więc takie oprogramowanie możemy zdefiniować jako aplikacje.
Aplikacje i ich charakter
Aplikacje mają zamkniętą ilość funkcji, prosty interfejs, brak dostępu do swojej struktury, czego konsekwencją jest zupełny brak wiedzy, co do sposobu ich działania. Ich użycie, zawiera w sobie konieczność zaufania ich strukturze i dostosowania się w zupełności do zamysłu twórcy. W całym procesie korzystania z aplikacji użytkownik jest jedynie po to, by oglądać efekty i raz na jakiś czas wprowadzić dane. W aplikacji nie ma miejsca na błąd, każda z funkcji zakłada swoje perfekcyjną realizację, jakiekolwiek odejście od niej, powoduje aktywowanie kodu błędu, który powinien być przewidziany w programie (kod błędu najczęściej powoduje zamknięcie programu bądź przerwanie akcji). Zły, bądź nieperfekcyjny użytek, w tym przypadku, jest więc walką z samą aplikacją i jej twórcami. Pozostawienie możliwości użycia aplikacji niezgodnie z intencją twórcy nigdy nie jest celowa, ponieważ program ma być przede wszystkim kompletny. Wykryta możliwość nieperfekcyjnego użycia, winna być, wedle zasad etycznych „dobrego programowania” możliwie najszybciej zlikwidowana.
W odróżnieniu od teorii "Worse is Better" projektowanie aplikacji opiera się przeważnie na tzw. teorii "The Right Thing" \cite{Gabriel1991}, następujących zasad programowania wywodzących się z uczelni MIT:
- Program musi być prosty, zarówno pod względem implementacji jak i interfejsu. Dopuszczalne jest ograniczenie prostoty implementacji na rzecz utrzymania prostoty interfejsu.
- Program musi być poprawny, we wszystkich ukazanych użytkownikowi aspektach. Niedopuszczalna jest jakakolwiek możliwość błędu.
- Program musi być spójny. Dopuszczalny jest ograniczenie prostoty implementacji i interfejsu, celem uzyskania spójności. Spójność jest tak istotna, jak poprawność.
- Program musi być kompletny. Konieczne jest opracowanie działania programu, dla możliwie największej ilości przypadków użycia. Prostota nie może ograniczać kompletności.
Podsumowując, aplikacje to narzędzia perfekcyjnie realizujące swoje zadania, zamknięte w formie okienka graficznego interfejsu. Dla użytkownika zupełnie nie istotna jest struktura ich kodu, wszystko to zostaje sprowadzone do różnych możliwości prostego użycia , których zrealizowanie nie wymaga żadnej specjalistycznej wiedzy, przeważnie odnalezienia w interfejsie odpowiedniego przycisku. W tym teoretycznym modelu są więc perfekcyjną realizacją Heideggerowskiego pojęcia poręczności (Zuhandenheit), stanowiącej według niego istotę każdego narzędzia. Według Heideggera, idealne narzędzie winno być wyłącznie czystą jego funkcją, wszelkie inne cechy zmysłowe narzędzia, ukazujące jego strukturę zaburzają ową funkcje, będąc zatem właśnie rzeczywistym rodzajem cyfrowego błędu.
Jednakże, tak jak zmysłowe cechy rzeczywistych narzędzi umożliwiają nam zdobycie wiedzy co do ich działania, a co za tym idzie również kontrolę nad nimi, tak w rzeczywistości cyfrowej, z racji braku tych cech, użycie aplikacji jest przez nas niekontrolowane. W momencie gdy kod źródłowy aplikacji dostępny jest wyłącznie jego twórcy, jako jedyny ma on wgląd w jej strukturę, zatem jedyna wiedza, co do charakteru jej działania pochodzi od niego. Oczywiście, to co zostanie powiedziane o danej aplikacji ma wpływ na jej sprzedaż, więc i sytuacje ekonomiczną producenta, zatem można przyjąć że wszelka wiedza, co do struktury i charakteru aplikacji, którą powinniśmy uważać za pewną, pochodzi z materiałów marketingowych danego producenta.
Walka o wolne oprogramowanie
W takim układzie jedyną przewidzianą możliwością dyskusji z budową, charakterem, możliwościami i ograniczeniami danej aplikacji jest zbudowanie własnej. Wymaga to jednak eksperckiej wiedzy, która również zależna jest od twórcy systemu operacyjnego — by dowolny program (nie będący nawet aplikacją) był w stanie otworzyć się w danym systemie potrzebne jest zaimplementowanie tzw. API, kodu umożliwiającego zgodność programu z systemem operacyjnym, które narzuca przy okazji konkretne ograniczenia. Jak łatwo się domyślić dostęp do API, jest również często uzależniony od względów biznesowych. Poza tym potrzeba oczywiście ogromnych środków czasowych i najczęściej wielu programistów (zależnie od stopnia skomplikowania aplikacji, którą chcemy stworzyć).
Zachodzące w latach 70 zmiany, wprowadziły całkowitą odwrotność hakerskiej etyki, dotychczas akademickiego środowiska eksperckiego. Komercjalizacja informatyki i będąca jej skutkiem logika produktu, skutecznie wyparła wolność dzielenia się kodem. Umowy poufności mocno ograniczyły możliwości współpracy wewnątrz środowiska, a wszelkie ograniczenia wprowadzane w komercyjne wydania programów i systemów operacyjnych, z dotychczas wyłącznie proponowanych rozwiązań, stwarzały stałe i konkretne ograniczenia. Logika działania w środowisku cyfrowym nieodwracalnie uległa przekształceniu.
Obrony dotychczasowych ideałów i zasad panujących do niedawna w środowisku podjął się Richard Stallman, a skutecznie pomogła mu w tym ówczesna społeczność internetu. To internet, z racji iż w tamtym okresie był na początkach swojego rozwoju\(^1\) i był używany głównie w środowisku akademickim do wymiany informacji, stał się kolejnym bastionem "hakerskiej" filozofii.
Stallman, świadomy, iż w ówczesnej sytuacji, gdzie każdy program staje się zastrzeżoną własnością konkretnych właścicieli, stwierdza, że programowanie całkowicie wolne od patentów i licencji musi powstać całkowicie od początku, od kodu maszynowego. Niemożliwe staje się wolne użycie jakichkolwiek dotychczasowych narzędzi, gdyż i one zostają przejęte przez prywatne korporacje i w istocie, przykładowo, UNIX, na początku lat 80, z racji zakończenia procesu antymonopolowego firmy AT&T, zostaje skomercjalizowany. Od tego momentu z racji szerokiej wyprzedaży praw do systemu przez AT&T stanie się on podstawą wszelkich kolejnych systemów operacyjnych.
27 września 1983 Stallman postanawia utworzyć społeczność, będącą w stanie stworzyć darmowy, wolny od licencji odpowiednik UNIXa, choć zgodny ze wszelkimi narzuconymi przez niego standardami - Projekt GNU. Zakłada on stworzenie od nowa całego systemu, wraz z wszelkimi dotychczas dostępnymi w UNIXie narzędziami. Od tego momentu zaczyna się batalia z korporacjami o prawa użytkowników do wolnego, darmowego i otwartego oprogramowania, systemów operacyjnych i aplikacji, dostępnych dla wszystkich, zgodnie z hakerskimi ideałami. Warunek zwycięstwa jest prosty - chodzi o to, by społecznie, przy użyciu zamkniętych, komercyjnych narzędzi skonstruować ich otwarte odpowiedniki, tylko lepsze.
Kilka lat później, w 1985 zostaje założona Fundacja Wolnego Oprogramowania, której głównym zadaniem jest koordynacja powstawania samego systemu, jak i wszelkich projektów pobocznych. Sam projekt systemu osiąga pierwszą finalną wersję w 1991, dzięki projektowi Linux, autorstwa Linusa Torvaldsa, który działając poza projektem GNU, projektuje wszelkie brakujące elementy. Oba projekty zostają połączone pod nazwą GNU/Linux, wydany system zyskuje ogromną popularność a idea wolnego oprogramowania zaczyna realizować się w wielu innych projektach, stając się niejako standardem w środowisku informatycznym.
Jednocześnie batalia trwa na wielu innych polach. Powstała w usenecie społeczność, do dziś określana jako "scena" od początku rozwoju internetu walczyła o darmowy i powszechny dostęp do wiedzy. To ona jest odpowiedzialna za zjawisko znane pod hasłem piractwa komputerowego. To również hakerzy związani ze "sceną" byli jednymi z osób odpowiedzialnych za rozwój metod inżynierii odwrotnej - analizy kodu zamkniętych programów w formie języka niskiego poziomu i to w tej społeczności co raz bardziej niszowa dziedzina języków niskiego poziomu (jnp) znalazła jedno z głównych zastosowań.
Tymczasem, cały czas trwał rozwój komercyjnego rynku informatyki. Z firmą Xerox, odpowiedzialnej za pierwszy system z graficznym systemem użytkownika, podejmuje współpracę firma Apple, dotychczas odpowiedzialna za niezwykle popularny personalny komputer obsługiwany jednym z języków BASIC i w 1984 roku premierę ma komputer Macintosh, pierwszy komputer firmy Apple, z systemem opartym o UNIX, wyłącznie z interfejsem graficznym, gdzie zupełnie nie ma mowy o programowaniu i jakiejkolwiek modyfikowalności systemu i dostępnych programów.
Systemem firmy Xerox inspiruje się również firma Microsoft, dotychczas tworząca własny tekstowy system MS-DOS, mocno inspirowany UNIXem, we współpracy z firmą IBM, odpowiedzialną za tworzenie otwartej (dla firm gotowych opłacić licencję) architektury komputerów personalnych. W 1984 roku ma premierę Windows, graficzna nakładka na system MS-DOS, a cały pakiet, z racji tego, iż systemy z rodziny DOS, mogą być uruchamiane na komputerze o dowolnej architekturze, zyskuje ogromną popularność. Potencjalna otwartość, wynikająca z inspiracji UNIXem, tutaj dla odmiany jest maksymalnie ograniczana na poziomie prawa, patentów i licencji.
1 Na tym etapie był to projekt określany jako usenet - system grup dyskusyjnych przeniesiony potem w całości do architektury internetu.