Z wielką przyjemnością chciałbym poddać pod dyskusję pewien arcyciekawy materiał, który był prezentowany na ostatnim seminarium w PW przez dr Jakuba Jernajczyka z Wrocławia. Dotyczy on istotnych podobieństw, jakie zachodzą między Platońskim (i nie tylko!) idealizmem a paradygmatem programowania obiektowego.
Podstawę dyskusji stanowią SLAJDY omawiane na seminarium.
Natomiast wprowadzeniem do niej jest przygotowany przez doktora Jernajczyka wpis, który zamieszczam niżej.
Zamieściwszy go zaś, serdecznie zapraszam do dyskusji – Paweł Stacewicz.
*****
Ogólne założenia oraz struktura mojego wystąpienia przedstawione zostały w prezentacji. W niniejszym wątku rozwinę dwa zagadnienia, które, ze względu na ograniczenia czasowe, nie miały okazji dostatecznie wybrzmieć.
1.
Rozważana analogia pomiędzy technikami stosowanymi w programowaniu obiektowym, a głównymi założeniami filozoficznego idealizmu [prezentacja, s. 2-12], ujawnia się również w odniesieniu do cyfrowych narzędzi służących do projektowania i edycji grafiki [prezentacja, s. 13-14]. W wielu tego typu środowiskach funkcjonuje mechanika wzorca oraz jego kopii, które zachowują wewnętrzną, często bardzo złożoną strukturę wzorca. Aby nie mnożyć terminologii (każdy program posługuje się własnym nazewnictwem), skupię się tutaj na omówieniu środowiska Adobe Flash (obecnie Adobe Animate). Złożoną strukturę wizualną, obejmującą nie tylko elementy graficzne, ale także ich zmianę (ruch), możemy we Flashu zawrzeć w pojedynczym symbolu, który początkowo istnieje tylko w bibliotece projektu, poza główną sceną [rys. 1].

Rysunek 1. Symbol utworzony w bibliotece Flasha (odpowiedniku świata idei).
Wersja animowana znajduje się tutaj.
Utworzywszy symbol możemy umieszczać na scenie (warstwie prezentacyjnej, można rzec „świecie fizycznym” Flash’a) wiele jego instancji, które w pełni zachowują jego wewnętrzną strukturę [rys. 2].

Rysunek 2. Wiele instancji jednego symbolu, umieszczonych na scenie Flasha (odpowiedniku świata fizycznego), które różnią się między sobą cechami zewnętrznymi, ale w pełni zachowują strukturę wewnętrzną wzorca.
Wersja animowana znajduje się tutaj.
Analogia do klas i ich obiektów jest tutaj sprawą oczywistą, ponieważ w środowisku Flash każdy symbol stanowi pewną klasę (dziedziczącą po ogólnej klasie Object), a instancje tego symbolu stanowią obiekty owej klasy. W tym miejscu nie chcemy jednak podkreślać obiektowości Flasha jako środowiska programistycznego (wyposażonego w pełni obiektowy język ActionScript), lecz wskazać podobieństwa do mechanizmów obecnych w filozoficznym idealizmie i programowaniu obiektowym, które ujawniają się na poziomie czysto wizualnym, obsługiwanym za pomocą graficznego interfejsu użytkownika.
Wszystkie utworzone na scenie instancje danego symbolu w pełni zachowują jego wewnętrzną strukturę (wygląd oraz zachowania), ale mogą różnić się między sobą cechami zewnętrznymi (można by rzec przypadłościowymi), takimi jak położenie, wielkość, pochylenie, obrót, kolor itp.
Zmiana cech zewnętrznych pojedynczej instancji nie wpływa na pozostałe instancje, natomiast każda zmiana wewnętrznych cech symbolu powoduje zmiany we wszystkich jego instancjach. Ponadto usunięcie ze sceny pojedynczej instancji nie wpływa na pozostałe instancje, podczas gdy usunięcie symbolu z biblioteki spowoduje usunięcie ze sceny wszystkich jego instancji. Mamy tu więc wyraźną analogię do programistycznych klas i obiektów oraz do Platońskich idei i rzeczy (z tą tylko uwagą, że, w przeciwieństwie do klas oraz symboli, wewnątrz Platońskich idei nikt nie może dokonywać zmian, ani człowiek, ani nawet Demiurg).
Ponieważ koncepcja symboli i ich instancji bezpośrednio bazuje na koncepcji klas i obiektów, uwidaczniają się w niej również inne mechanizmy obecne w programowaniu obiektowym. Symbole, podobnie jak klasy, mogą zawierać w sobie również instancje innych, dowolnie zagnieżdżonych symboli (z tym zastrzeżeniem, że dany symbol nie może zawierać swojej instancji, lub instancji symbolu, który już go zawiera).
Na poziomie graficznego interfejsu użytkownika mamy też pewne odpowiedniki mechanizmu dziedziczenia – jeśli chcemy utworzyć nowy symbol, który zachowuje wybrane cechy danego symbolu, ale dodaje lub zmienia jego inne cechy, wystarczy utworzyć duplikat istniejącego symbolu, który następnie można modyfikować, nie zmieniając oryginału.
2.
Głównym celem mojego referatu było zwrócenie uwagi na pewne wspólne intuicje, podobne modele myślenia, które ujawniły się w różnych czasach, w wydawałoby się bardzo odległych od siebie dyscyplinach (w filozofii, informatyce, w klasycznym rzemiośle i projektowaniu cyfrowym).
Warto zatem rozważyć możliwe przyczyny zaobserwowanych tu analogii:
A) Mogą one wynikać z bezpośredniej, świadomej inspiracji programistów koncepcjami filozoficznymi. Wariant ten należy jednak raczej odrzucić, gdyż w literaturze specjalistycznej nie ma wzmianek o takich nawiązaniach, chociaż niektórzy autorzy (np. B. Stroustrup) posługują się pojęciami charakterystycznymi dla filozofii.
B) Bardziej prawdopodobna wydaje się inspiracja nieuświadomiona – niejawne odwołanie się do koncepcji, które od wieków obecne są w nauce i kulturze, a które po raz pierwszy pojawiły się, czy może lepiej rzec, zostały sformalizowane w greckiej filozofii (wpływ Platona na myśl europejską dobitnie uwypuklił Whitehead w stwierdzeniu, że „całą historię zachodniej filozofii dałoby się sprowadzić do kilku przypisów do Platona”).
C) Możliwa jest również całkowicie przypadkowa zbieżność podobnych koncepcji. Wariant ten wydaje się jednak mało prawdopodobny a nade wszystko mało ciekawy.
D) Znacznie bardziej prawdopodobna i chyba najbardziej interesująca w sensie poznawczym jest hipoteza, że podobne, bardziej podstawowe koncepcje/intuicje wpłynęły zarówno na myśl filozofów, rzemieślników, jak i programistów. To, że podobne koncepcje mogą ujawniać się w różnych dziedzinach ludzkiej aktywności mówiłoby nam coś istotnego o sposobie działania ludzkiego umysłu, który według podobnych reguł ujmuje i rozwiązuje bardzo odległe problemy. Oznaczałoby to, że według podobnych reguł postrzegamy, organizujemy i opisujemy świat; w końcu według podobnych reguł tworzymy nasze modele rzeczywistości, co wcale nie oznacza, że są one prawdziwe. Choć modele te mogą doskonale spełniać kryteria naszych reguł (wedle których przecież powstały) a co za tym idzie, wydawać się nam bardzo wiarygodne, wcale nie muszą odpowiadać rzeczywistości.
3.
Podczas seminarium pojawiło się wiele cennych i interesujących uwag. Poniżej sygnalizuję wybrane wątki, które być może zostaną rozwinięte na tym forum:
a) podkreślono, że wiele mechanizmów programowania obiektowego stosowano w informatyce dużo wcześniej niż ukonstytuował się ów paradygmat; przywołano przykłady własnych rozwiązań programistyczny z lat 60-70-tych, które antycypowały możliwości współczesnych języków programowania;
b) rozwinęła się ciekawa dyskusja dotycząca stopnia pokrewieństwa pojęcia klasy stosowanej w programowaniu obiektowym oraz klasy definiowanej w matematyce;
c) zwrócono uwagę na inne specyficzne języki, takie jak POV-Ray (www.povray.org) czy Metafont (część systemu TeX), w których jeszcze wyraźniej uwidacznia się analogia do Platońskiego idealizmu.
Na zakończenie pragnę serdecznie podziękować organizatorom i uczestnikom seminarium za żywą i owocną dyskusję.
Jakub Jernajczyk
******