Retromaniak: Geometria, czyli garść wspomnień jak zostaliśmy programistami i uprzedziliśmy Microsoft
1994 rok był w Polsce rokiem wyjątkowym. To właśnie wtedy weszła w życie ustawa o prawie autorskim i prawach pokrewnych kończąca okres totalnej "wolnoamerykanki" w tym względzie. Tego roku miało jednak miejsce jeszcze inne, niezwykle podniosłe wydarzenie – otóż wspólnie z Kamilem Cybulskim (Cebulą ) stworzyliśmy edukacyjny program komputerowy "Geometria dla każdego". Po latach okazało się, że przy okazji ubiegliśmy Microsoft w jednym pomyśle, ale po kolei.
Wszystko zaczęło się rok wcześniej. Mieliśmy wówczas po 16 lat, nasze potrzeby były ogromne, a możliwości finansowe delikatnie mówiąc takie sobie. Nie chcąc polegać wyłącznie na garnuszku rodziców postanowiliśmy więc pieniądze zarobić. Obaj, jak to się wówczas mówiło, "interesowaliśmy się komputerami", co w naszym wypadku oznaczało, że pykaliśmy w gry plus umieliśmy sami złożyć peceta, zainstalować system oraz trochę programować. Byliśmy więc takimi geekami tudzież nerdami. Okazja przyszła sama – starszy brat koleżanki z klasy szukał kogoś do napisania programu do matematyki, a konkretnie geometrii. Stawka była imponująca – 7 mln złotych na dwóch!
Niestety to było jeszcze przed denominacją ;) Nie skupialiśmy się jednak tylko na pieniądzach. Perspektywa stworzenia własnego programu komputerowego, który następnie miał być sprzedawany w pudełkach to było coś! Sława, prestiż, szacunek, piękne niewiasty proszące o autografy – wszystko to już wkrótce miało stać się naszą codziennością (no dobrze, z tymi niewiastami to może trochę przesadziłem ;)
Zaczęliśmy przygotowania. Szybko okazało się, że czeka nas nie lada wyzwanie. W tamtych czasach programy edukacyjne (np. popularny niegdyś eTeacher ) tworzyło się w zasadzie wyłącznie pod system DOS i jego tryb tekstowy. Jednak geometria z tymi wszystkimi figurami, bryłami i tryb tekstowy? Przecież to się kompletnie nie kleiło. Oczywiście powstawały też programy i gry w trybie graficznym, ale przytłaczająca większość z nich pracowała w rozdzielczości zaledwie 320x240 pikseli, przez co wrażenia wizualne były również dyskusyjne. Postanowiliśmy więc, że idziemy w "high resolution" i program będzie pracować w oszałamiającej wówczas rozdzielczości 640x480 pikseli (VGA).
Jako główny język programowania wybraliśmy dobrze nam znanego Turbo Pascala 4.0 (choć ostatecznie aplikacja była kompilowana w Turbo Pascalu 7.0, który kupiliśmy za część zarobionych pieniędzy aby wszystko było lege artis). Sam Turbo Pascal był jednak narzędziem niezwykle ułomnym i wiele bibliotek musieliśmy pisać od zera w Assemblerze, co okazało się prawdziwą drogą przez mękę.
To z kolei było skutkiem naszych ambicji – poprzeczkę zawiesiliśmy sobie bardzo wysoko. Równolegle bowiem nasz kolega z klasy, Tomek Piasta, tworzył w AMOSie wersję tego programu na Amigę. Język ten miał to do siebie, że praktycznie wszystko co potrzeba udostępniał "z pudełka" – obsługę grafiki wektorowej, odtwarzanie muzyki w tle, czy zaawansowane obliczenia matematyczne. My zaś musieliśmy takie wodotryski programować niskopoziomowo, a przecież nie mogliśmy być gorsi (to były jeszcze te czasy kiedy trwały wojenki platformowe – Commodore 64 vs. Atari 65XE, Amiga vs. Atari ST vs. IBM PC itd.). To była sprawa honoru!
Nasz program miał być nowoczesny, pracujący w trybie graficznym, z obsługą myszki (to nie była wówczas taka oczywistość!), ale przede wszystkim efektowny – z figurami/bryłami animowanymi w trzech wymiarach oraz ze wspomnianą muzyczką lecącą w tle (wówczas prawdziwy odlot na PC). Plus oczywiście z tymi wszystkimi wzorami, obliczeniami, zadaniami egzaminacyjnymi (i ich rozwiązaniami) oraz z wbudowanym zaawansowanym kalkulatorem matematycznym. Dziś, gdy o tym myślę, zdaję sobie sprawę z jaką wówczas motyką na słońce się porwaliśmy...
Rozpoczęło się żmudne kodowanie. Z tego co pamiętam Cebula wziął na swoje barki głównie kodowanie grafiki wektorowej (rysowanie i obracanie figur/brył) oraz obsługę muzyki, ja zaś instalator, interfejs, wzory/zadania/obliczenia, kalkulator oraz biblioteki. Związanych z tym było kilka paradoksów, przykładowo interfejs Geometrii rysowałem korzystając z monitora... monochromatycznego (VGA). Kolorystyka gradientu głównego menu była więc w dużej mierze dziełem przypadku (wstępne projekty zanosiłem na dyskietkach do Cebuli żeby zobaczyć jak wyglądają w kolorze, bo ten burżuj miał kolorowy monitor ;)
Jednak chyba największym paradoksem był fakt, że w tym programie głównie ja odpowiadałem za stronę merytoryczną, podczas gdy oględnie mówiąc orłem z matematyki w liceum nie byłem, czego najlepszym dowodem była ocena mierna z tego przedmiotu na zakończenie edukacji ;) Kuriozum sytuacji potęgował fakt, że z naszego programu korzystali nie tylko uczniowie, ale i nauczyciele. Po roku, czy dwóch od wydania programu dowiedzieliśmy się, że jakiś matematyk, po kilku miesiącach wyrywania sobie włosów z głowy, doszedł do wniosku (prawdopodobnie w pełni słusznego), iż jedno z zadań jest... nierozwiązywalne ;) Napisał w tej sprawie do wydawcy.
Wróćmy jednak do aspektów programistycznych. Musieliśmy się zmierzyć z kolosalną, jak się okazało, liczbą problemów. Turbo Pascal generował przeraźliwie wolny kod, zatem aby uniknąć lamerskiego efektu "rysowania się" interfejsu uciekliśmy się do sztuczki ze stronicowaniem pamięci graficznej – obraz był najpierw ładowany do obszaru pamięci, z którego aktualnie nie korzystała karta graficzna, a następnie przełączany (przez chwilę ekran był czarny, ale wyglądało to znacznie lepiej). Z tego też względu wszelkie grafiki były zapisane w postaci zamaskowanych i minimalnie spakowanych bitmap, aby uniknąć wydłużającej cały proces dekompresji plików graficznych w formatach PCX czy GIF (każdy ułamek sekundy był na wagę złota).
To była jeszcze łatwizna. Prawdziwym wyzwaniem okazała się obsługa grafiki wektorowej, program bowiem w naszych zamierzeniach miał nie tylko prezentować rysunki figur/brył, ale umożliwiać ich efektowne obracanie w trzech wymiarach. Turbo Pascal umożliwiał co prawda narysowanie na ekranie jakichś linii, z czego można było następnie poskładać obraz figur/brył, ale kompletnie nie był przystosowany do ich obracania. Rozwiązanie tego problemu okazało się dość karkołomne. Otóż po wciśnięciu przez użytkownika jednego z klawiszy obrotu, program rysował tę samą bryłę liniami w kolorze czarnym (aby ją zamazać), a następnie jeszcze raz w kolorze białym przesuniętą o jeden stopień (było to znacznie szybsze rozwiązanie niż kasowanie zawartości całego ekranu). Powodowało to efekt delikatnego migotania podczas obracania, ale... działało. Wszystko to oczywiście wymagało tygodni kodowania.
Z kolei przy kalkulatorze musieliśmy uciec się do kodowania niektórych operacji obliczeniowych w assemblerze, bowiem Turbo Pascal wielu z nich nie obsługiwał. Problem, z tego co pamiętam, dotyczył pierwiastka 3 stopnia, a także niektórych funkcji trygonometrycznych. W końcu poradziliśmy sobie i z tym. Kompletnie jednak nie mogliśmy ugryźć obliczania x^n i zamiast usunąć tę funkcję z menu kalkulatora, zachowaliśmy się niczym prawdziwi Janusze programowania ;) Udało nam się znaleźć sposób na obliczanie przybliżonej wartości tego działania, ale czasami pozostawały jakieś resztki po przecinku. Przy niewielkich liczbach działało to dobrze, ale już przy 9^2 dawało to wynik 81,000000001. Pomijając ten "drobiazg" kalkulator działał jednak bardzo dobrze i był nawet całkiem zaawansowany. Z perspektywy czasu jestem pod wrażeniem, że chciało nam się go programować...
Różnych detali i ciekawostek związanych z Geometrią jest oczywiście znacznie więcej, ale nie będę się już nad nimi rozwodzić. Poza ostatnią. Z perspektywy czasu okazało się bowiem, że byliśmy prawdziwymi wizjonerami i ubiegliśmy Microsoft w jednej z jego kluczowych technologii.
O co chodzi? Otóż na przełomie lat 80- i 90‑tych nastąpiła w Polsce prawdziwa eksplozja piractwa. Masowo kopiowano gry, programy komputerowe, czy filmy na kasetach wideo. Produkowano nawet nielicencjonowane kasety audio, które wyglądały podobnie jak oryginalne (wyrosła na tym m.in. firma Takt). W tych warunkach wydawanie komercyjnego programu zakrawało na szaleństwo. Co prawda w 1994 roku weszła w życie ustawa o prawie autorskim, która rozpoczęła proces powolnych zmian, ale wśród użytkowników prywatnych nadal masowo kopiowano oprogramowanie, a Geometria była kierowana właśnie do tego odbiorcy.
Musieliśmy więc coś wymyślić i... wymyśliliśmy. Doszliśmy do wniosku, że proceder znacznie utrudnimy zaszywając podczas instalacji, w jednym z plików konfiguracyjnych, jakiś identyfikator, który byłby unikalny dla każdego komputera. W ten oto sposób jeżeli ktoś po instalacji na dysku twardym chciałby zgrać pliki programu i zanieść je do kolegi (zwykle tak się to odbywało ponieważ oprogramowanie dla DOS nie wymagało instalacji) to wówczas program wykryje, że został uruchomiony na innym komputerze i odmówi pracy. Przypomina Wam to coś? Na podobnej zasadzie działa aktywacja oprogramowania firmy Microsoft zaimplementowana po raz pierwszy w systemie Windows XP, który zadebiutował w 2001 roku.
Oczywiście rozwiązanie to nie było pozbawione słabości – co bardziej łebscy użytkownicy mogli bowiem po prostu skopiować zawartość dyskietki instalacyjnej, ale tu z kolei zastosowaliśmy kolejne utrudnienie. Podczas uruchomienia instalatora należało bowiem podać kod obrazka wyświetlanego na ekranie, a ten znajdował się w drukowanej instrukcji. To zaś były jeszcze te czasy kiedy o drukarkach ze skanerem czy o aparatach w komórkach nawet nikt nie marzył (ba, mało kto miał wówczas komórkę), stanowiło więc to spore utrudnienie. Oczywiście instrukcję można było skserować albo pożyczyć, ale summa summarum wszystkie te zabiegi miały na celu przynajmniej odrobinę obrzydzić ten proceder.
W tym miejscu jeszcze jedna dygresja – tworząc i testując program nieustanne wpisywanie kodów było dla nas bardzo męczące. Dlatego też zastosowaliśmy sekretną drogę na skróty – wystarczyło jednocześnie wcisnąć kombinację Ctrl+F1 oraz prawy przycisk myszki, aby instalator nie wymagał podania kodu ;)
Gdybyście chcieli na własne oczy przekonać się jak wyglądała Geometria – nic prostszego. Wystarczy pobrać pliki instalacyjne i odpalić na jakimś starym komputerze lub emulatorze DOSbox. Wydawca programu, firma Faterbit, od wielu lat już nie istnieje, mam więc nadzieję, że nikt nie będzie miał do mnie o to pretensji ;) Wymagania sprzętowe: procesor 286, 386 lub 486, karta graficzna VGA oraz 1,3 MB wolnego miejsca na dysku twardym.
Jedna uwaga: z racji zastosowanych przez nas hacków (bezpośrednie odwołania do BIOSu i pamięci karty graficznej, procedury w kodzie maszynowym, wykorzystanie przerwań) pod DOSboksem nie wszystko działa dziś prawidłowo. Dotyczy to szczególnie odtwarzania muzyki, skomponowanej przez naszego kolegę Karola Pierutę, która pod emulatorem rwie się niemiłosiernie.
Dziś, po ponad 23 latach od debiutu Geometrii, na program ten można patrzyć z politowaniem. Niemniej jednak obaj z Cebulą łączymy z nim masę pozytywnych wspomnień. Poza tym to właśnie m.in. Geometria wpłynęła na to, że 8 lat później stworzyliśmy portal... dobreprogramy. Ale to już temat na inny wpis... ;)
Ciekawostki związane z Geometrią
Program początkowo był sprzedawany z rozkładanego stolika na giełdzie elektronicznej pod Halą Ludową we Wrocławiu, która była w tym miejscu organizowana w każdą niedzielę. Wcześniej było to tradycyjne miejsce miłośników nielicencjonowanych filmów nagrywanych na kasetach VHS – masowo je tam wymieniano.
Zrzuty ekranowe z Amigi i IBM PC na tylnej części opakowania zostały omyłkowo zamienione pomiędzy sobą. Samo opakowanie było zaś wykonane oszczędnościowym, ale pomysłowym sposobem – wydawca zastosował plastikowe opakowanie na… kasety VHS plus prostą, kartonową obwolutę i dwie naklejki (od góry i dołu) maskujące nieco ten garażowy patent. Było to tańsze w produkcji niż zamawianie tradycyjnego pudełka do którego trzeba przygotować dedykowany wykrojnik i kartonowe wzmocnienia w środku.
Turbo Pascal nie oferował czcionek z polskimi znakami diakrytycznymi, stąd wszystkie teksty w programie są bez "ogonków" (wyjątkiem są litery "ó" i "Ó", które występowały w tabeli ASCII pod nr 162 i 224 oraz „n” z "~" które w pascalowej czcionce wyglądało bardzo podobnie do „ń”). Na głównym oknie programu ogonek przy "ę" w moim nazwisku został uzyskany przez naniesienie przecinka (co okazało się niedoskonałym rozwiązaniem, jak widać na zdjęciu przecinek ten jest z niewiadomych względów przesunięty). Ogonki na elementach menu zostały naniesione ręcznie, bo program graficzny również nie posiadał polskich czcionek.
Program tworzyliśmy kilka miesięcy i w trakcie kodowania nie ustrzegliśmy się od zabawnych błędów, których przyczyn nie mogliśmy z początku wychwycić. Jednym z nich było np. zniekształcanie się figur i brył podczas obracania, co dawało komiczne efekty. Dopiero po jakimś czasie okazało się, że problem wziął się z „czeskiego błędu” w jednym ze wzorów, który bardzo trudno było wychwycić. Ostatecznie jednak finalna wersja okazała się praktycznie pozbawiona błędów, choć program testowaliśmy wyłącznie sami.
Kod Geometrii był relatywnie obszerny jak na taki, bądź co bądź niezbyt rozbudowany program (z punktu widzenia użytkownika). Wynikało to z konieczności kodowania wielu modułów (bibliotek), które zawierały funkcje nieoferowane w Turbo Pascalu. Większość z nich pisaliśmy sami, w kilku przypadkach korzystaliśmy z gotowców, takich jak np. moduł obsługi myszki – bo nawet to nie było wspierane przez Turbo Pascala 7.0 (poza programami tworzonymi w Turbo Vision). Na długość kodu programu wydatnie wpływał fakt, że znaczna jego część składała się z niezwykle długich pętli i serii warunków.
Na potrzeby Geometrii Cebula opracował nasz własny format graficzny ABX (był to skrót od Abraxas Soft, jak się nieoficjalnie określaliśmy). Była to w zasadzie standardowa bitmapa z najprostszą możliwą kompresją typu RLE. Bardziej skomplikowane algorytmy kompresji stosowane w popularnych wówczas formatach graficznych nie wchodziły w grę, ponieważ nieakceptowalnie wydłużyłoby to wczytywanie grafik (swoją drogą to nie jestem nawet pewien czy ich obsługa była w ogóle wspierana przez TP).
Programy edukacyjne tamtych czasów na PC były zwykle nieme, w najlepszym razie generowały momentami jakieś pojedyncze sygnały przez archaicznego PC speakera będącego standardowym wyposażeniem komputerów tamtych czasów. Zachwyceni sceną amigową oraz funkcjonującymi na niej demami bardzo chcieliśmy aby w trakcie korzystania z programu odtwarzana była w tle muzyka za pośrednictwem karty dźwiękowej Sound Blaster. Tego typu karty były jednak wówczas bardzo drogie i mało kto mógł sobie na nie pozwolić. Dlatego też zaimplementowaliśmy także odtwarzanie dźwięku przy pomocy popularnego wówczas w Polsce wynalazku o nazwie Covox (prosty przetwornik C/A podłączany do portu drukarki).
Firma April Business Computer, w której w 1994 roku kupiliśmy Turbo Pascala, jeszcze do niedawna systematycznie wysyłała Cebuli cenniki oraz życzenia świąteczne (przez około 20 lat od zakupu!). Firma ta istnieje i funkcjonuje do dziś, choć jej strona internetowa i sklep nieco trącą myszką ;) Komplet systemów DOS 6 i Windows 3.1 kosztował w tamtym czasie dokładnie 3.485.000 złotych.
O Geometrii pisała m.in. Gazeta Wyborcza w ówczesnym dodatku Biuro i Komputer. Taką otrzymaliśmy recenzję:
"Geometria dla każdego" to interesujący program edukacyjny, który powstał w firmie Faterbit z Oławy. Łączy kilka tych elementów, które powinien zawierać każdy dobry program edukacyjny: odpowiednio szeroki zakres materiału podzielonego na dwie części: wiadomości teoretyczne i zadania, prostotę obsługi i atrakcyjny wygląd na ekranie.
Rok czy dwa lata po stworzeniu Geometrii mieliśmy pomysł na kolejny program edukacyjny, ale o nieco hmm… innym charakterze. Miała to być Encyklopedia Seksu, która byłaby pierwszym polskim programem do edukacji seksualnej. Do współtworzenia programu chcieliśmy zaprosić uznanego eksperta prof. Zbigniewa Lwa‑Starowicza. Program miał mieć m.in. bardziej odważną materiałowo część 18+, która według nas byłaby kluczem do zdobycia popularności (to były jeszcze te czasy kiedy Internet w Polsce dopiero ledwie raczkował, a o czerwonych serwisach nikt nawet nie myślał). Ostatecznie, z braku środków, nigdy tego programu nie stworzyliśmy. Tymczasem jakieś półtora roku później ktoś inny wpadł na taki sam pomysł i wydał praktycznie dokładnie taką samą encyklopedię jaką sobie wyobrażaliśmy i do tego właśnie z prof. Lwem-Starowiczem. Czytając o tym w magazynie PC World zgrzytaliśmy zębami ze złości ;)