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ą o nie oparte. Otóż całe działanie komputera opiera się o, częściowo wspomniany już wcześniej, 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, co do całkowitego zrozumienia zasad jego funkcjonowania, jednakże jest nieograniczonym działaniem na samej, obiektywnej maszynie.
Jednakże nadal 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 funkcjonujący 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 tłumaczący język wysokiego poziomu 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 tego, 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 ówczesna 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ą. 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, wprowadzając 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 akademickiego 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}, ówcześnie dominujące w środowisku hakerskim przy projektowaniu wszelkich programów i opierające się o następujące założenia:
- Prostota implementacji jest ważniejsza niż prostota interfejsu. Nie jest ważne, że korzystanie z systemu będzie trochę trudniejsze, jeśli znacznie uprości to system. Dzięki temu system powstanie szybciej, będzie zawierał mniej błędów i będzie łatwiejszy do rozszerzenia w przyszłości.
- Można poświęcić stuprocentową poprawność na rzecz prostoty. Jeśli coś działa prawie zawsze, a zawodzi jedynie w przypadkach, które nie są specjalnie ważne, nie warto komplikować kodu wyjątkami.
- Spójność jest mało istotna. W praktyce trudność ze stworzeniem, a przede wszystkim z zachowaniem spójności systemu, przewyższa znacznie korzyści, jakie odnosi się ze spójności.
- Kompletność nie jest specjalnie ważna, jeśli miałaby uderzyć w prostotę. System powinien skupić się na typowych przypadkach.
- Otwartość systemu uzyskuje się, po pierwsze, poprzez proste, tekstowe zbiory konfiguracyjne. Pozwalają na szybką reakcję w wypadkach nietypowych, a nie wymagają kawałków programu typu setup.
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 najbardziej uniwersalny. Ma to umożliwić całkowitą uniwersalność programów, sam system zawiera wszelkie narzędzia potrzebne do dopasowania 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ą owe cyfrowe narzędzia, 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. Opracowany 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 ono formę graficzną możemy zdefiniować jako aplikacje.
Aplikacje i ich charakter
Kolejną bazą dla współczesnych personalnych systemów operacyjnych był system obecny na komputerach Xerox Alto. Zawierał on pierwszy graficzny interfejs użytkownika (PUI), wraz z kompletem aplikacji zaś sam komputer był jednym z pierwszych komputerów personalnych, przeznaczonych do użytku innego niż tylko uruchamianie programów użytkowych i ich tworzenie. Tu nastąpiła kolejna bardzo istotna zmiana — w tym systemie nie było możliwe tworzenie żadnych programów. Co jeszcze bardziej istotne, wszelkie koncepcje obecne w PUI (łącznie z brakiem dostępu do programowania) zostały w całości przeniesione do pierwszego komputera i systemu operacyjnego, który odniósł globalny sukces — Macintosh. Kilka lat później, pojawiła się kopia systemu obecnego tam systemu — System Windows.
<I tu zaczynamy się rozmijać z tezami Nelsona, konkretniej co do kwestii języka Smalltalk, do którego dostęp miał znaleźć się w PUI. Nelson twierdzi że tak nie było, internet inaczej. Niemniej, w Macintoshu na 100% nie było żadnego języka>
Tu pojawia się do dziś aktualna koncepcja samych aplikacji. Mają mieć 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 takim układzie jedyną przewidzianą możliwością dyskusji z 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ć).
Tak, wiedza co do tego, jak działa rzeczywistość cyfrowa stała się udziałem nielicznych ekspertów, a jedynym partnerem do dyskusji nad sposobem i możliwościami działania danej aplikacji jest, dla jego twórcy, wyłącznie osoba, która sama jest w stanie taką aplikację stworzyć.
Choć sami programiści również nie byli w najlepszej sytuacji, tak ścisłe powiązanie ich prawa do programowania z ekonomią było dla całej informatyki ogromnym ograniczeniem. Cyfrowi aktywiści popierający hakerskie idee ruchu „wolnego oprogramowania” cały czas aktywnie działali (i nadal działają) na rzecz zmiany tej sytuacji. Rozwinął się, również oparty na UNIX-ie Linux, adaptujący koncepcje personalnego systemu operacyjnego, w zgodzie z filozofią swojego poprzednika (maksymalny brak ograniczeń), przepisano wiele translatorów języków programowania (tworząc ich otwarte odpowiedniki), które w ten sposób uwolniono od uwarunkowań ekonomicznych, na których bazie powstało wiele programów i aplikacji będących od wielu już lat w powszechnym użytku. Stworzono wiele języków programowania, opartych przykładowo o interpretery (aktywne translatory ze swojego języka na możliwie maksymalnie zgodny z charakterem systemu kod). Wszystkie te projekty zakładały pełną otwartość i powszechną dostępność swojego kodu (otwartość źródeł) i zyskały tak silną pozycję, że polityka globalnych korporacji musiała ulec zmianie. Tak, w 2001 roku, Apple, w systemie OSX zaimplementowało dostęp do powłoki UNIX-a, a Microsoft również, choć bardzo niechętnie, podjął współpracę z twórcami wolnego oprogramowania. Ta idea pozwoliła odnieść sukces takim korporacjom jak przykładowo Facebook czy Google.
W ten sposób, społecznie, teoretycznie na powrót uzyskaliśmy dostęp do samej struktury komputera (pamiętajmy tu o ograniczeniach związanych z systemem operacyjnym i językami programowania), A co z aplikacjami, czy systemami operacyjnymi? Czy zatem, skoro nie użytkownicy, to chociaż programiści odzyskali na powrót dostęp do kodu obecnego w ich komputerach? Niestety nie. Przede wszystkim nie każdy kod został „otwarty”, w pewnym uogólnieniu można powiedzieć, że zostały otwarte wyłącznie programy użytkowe, oraz technologie i programy związane z konstruowaniem aplikacji. Zatem opisana wcześniej struktura samych aplikacji zupełnie nie uległa zmianie, umacniając nawet swoją pozycję.
Ponadto pozostaje jedna, wcześniej nieujęta w tej pracy kwestia — kwestia internetu, o tyle istotna, że przy pomocy internetu mechanizmy kontrolujące użytek komputera stały się silniejsze, niż kiedykolwiek. Struktura techniczna internetu nie jest dla tej pracy istotna, zdefiniujmy go zatem w powszechnie rozumiany sposób, jako możliwość zdalnego połączenia między dwoma komputerami. Ponadto, trzeba tu zaznaczyć, iż na ten moment rozwoju technologii cyfrowych, coraz trudniejsze staje się odróżnienie klasycznie pojmowanych aplikacji, które znajdują się na komputerze użytkownika, od aplikacji internetowych, znajdujących się na bliżej nieokreślonym komputerze, gdzie przesyłany nam jest wyłącznie fragment, z którego aktualnie korzystamy. Potraktujmy więc oba te rodzaje jako jeden.
Dzięki temu, iż dostęp do internetu tak bardzo rozszerzył możliwości użytkowe komputerów, dostęp do niego jest stały i praktycznie niezbędny. Sprawia to, że w procesie użytkowania aplikacji, nie dość, że mierzymy się z nieznanym nam kodem, to też z aktywnie działającym programem, uruchomionym na nieznanym nam komputerze. Zatem w korzystaniu z aplikacji już nic nie jest pewne. Nie możemy mieć pewności, że aplikacja, przy każdym uruchomieniu zadziała tak samo. Nie wiemy, jakie dane są pobierane na nasz komputer i z niego wysyłane. Nie wiemy nawet, czy dana aplikacja tym razem pozwoli nam się uruchomić. Z racji, że zaczynamy uzyskiwać coraz większy dostęp do kodu na naszych komputerach zaczyna on z nich znikać. Aplikacje stają się usługą dostarczaną przy użyciu internetu przez producentów.
W tej sytuacji bardziej niż kiedykolwiek, istnieje potrzeba wniknięcia w struktury aplikacji. Skoro zaczynamy odzyskiwać kontrolę nad własnymi komputerami, to najwłaściwszym sposobem reakcji na postępujące uzależnienie aplikacji od internetu, byłoby przejęcie kontroli nad programami obecnymi na naszych komputerach odbiornikami internetowych instrukcji, z racji, iż te odbiorniki nie znajdują się wyłącznie w komputerach i smartfonach (komputerach dużo bardziej mobilnych). Powszechny paradygmat, gdzie dotychczas niecyfrowe urządzenia, powinny zostać inteligentne (smart), opiera się właśnie na globalnym instalowaniu tego typu odbiorników. Tu niestety na powrót pojawia się kwestia ochrony własności intelektualnej, która tym razem przybrała dotychczas niespotykanie kuriozalny format.
<Akapit o Artykule 1201 DMCA>