Enigma Enigma

Petro Nepokupnyi

2021-08-27 14:37:58 eye-2 4518   — comment 16

Як Арістотель створив програмування


 

Філософи, на яких він мав вплив, підготували підгрунтя для технологічної революції, що змінила наш світ. (Кріс Діксон)

Зазвичай історію інформаційних технологій, комп'ютерів та програмування розповідають, як історію об'єктів, від рахівниці до різницевої машини Беббіджа та шифрувальних машин Другої світової війни. Насправді це більше історія ідей, які беруть свій початок з логічної системи Арістотеля.

Загалом основою логічної системи Арістотеля є судження. Судження за своєю природою є така форма мислення, яка розкриває зв'язок між предметом і його ознакою. Загалом існує декілька означень судження, але за основу виберемо основне означення: судження, це думка, у якій стверджується наявність чи відсутність властивостей у предметів, відношень між предметами, зв'язків між ситуаціями, або в якій при її висловлюванні дещо стверджується про предмет дійсності і яка об'єктивно є або істинною, або хибною. На будь-якій природній мові судження можна виразити однією із чотирьох базових конструкцій:

  • A: усі елементи Х мають властивість Р (або усі елементи Х належать до множини М);
  • E: жоден елемент Х не має властивість Р (або жоден елемент Х не належить до множини М);
  • I: деякі елементи Х мають властивість Р (або деякі елементи Х належать множині М);
  • O: деякі елементи Х не мають властивості Р (або деякі елементи Х не належать до множини М)

Далі виключно від особи, що формує судження залежить опис елемента Х, властивості Р чи властивостей множини М, яка описує певну сукупність елементів. Зрозуміло, що дискусія між двома опонентами виключно можлива, якщо вони при побудові своїх суджень за цими чотирма базовими конструкціями спираються на однаковий опис Х, Р та М. :)

Далі Арістотель у своїх працях розглядав побудову складних суджень, на основі наведених чотирьох базових конструкцій, які зкладаються з трьох суджень - силогізм. За Арістотелем, силогізм - це висновок, який можна отримати з використанням двох суджень вказаного типу: A, E, I або О. Висновок також належить до одного з вказаних раніше типів. Наприклад, силогізм AAA можемо представити так:

  • будь-який об'єкт Z має усі властивості будь-якого об'єкту Y;
  • будь-який об'єкт Y має усі властивість будь-якого об'єкту X;
  • значить, будь-який об'єкт Z має усі властивості будь-якого об'єкту X. 

Загалом існує 256 форм силогізмів, але дійсними (коли висновок без будь-яких суперечностей випливає із двох перших суджень) є виключно 24 (хоча ще п'ять відкидають, бо вони можуть надавати формально правильні висновки за порожніх множин у судженнях), які мають власні назви та вивчення яких входило навіть в гімназійний курс тієї же Російської імперії. Для прикладу, силогізм AAA має власну назву Barbara. Як зрозуміє читач наявність 256 форм, з яких тільки 24 (19) не мають суперечностей, відкриває доволі величезний простір для маніпуляцій, що можуть бути підтверджені вигуком "Ну, логічно ж!". :) З іншого боку, ці правильні 24 (19) форми здебільшого забезпечують левову частку міркувань, які здійснюють люди, тому, наприклад у гімназіях вимагали їх просто запам'ятовувати, як табличку множення. Хоча існує вісім правил формування силогізмів, розуміння яких позбавляло осіб від "заучування". Як завжди, вибір існує, при тому, що поточно ніхто не вимагає ні від учнів, ні від студентів вивчення силогізмів, за виключенням, можливо, філософських факультетів Вишів.  :)

Розкриття усіх типів силогізмів не є темою поста, бо читач, якого це зацікавить, зможе ознайомитися з ними самостійно. Загалом літератури в Інеті є достатньо. Зауважимо, що навіть формально правильні силогізми можна використати у маніпулятивних цілях. Як приклад,

  • злочинці діють зі злого наміру;
  • деякий М. не діяв зі злого наміру;
  • значить деякий М. не є злочинцем.

Це є силогізм класу AEE - Camestres. Зрозуміло, що правильність цього силогізму може досягатися тільки в тому випадку, коли буде описано абсолютно вичерпна множина дій, які будуть характеризуватися як "злий намір". Тоді, злочинцем будемо називати ту особу, дія якої входить у цю абсолютно вичерпну множину дій, які називають "злий намір". Тоді, якщо деякий М створив дію, що не входить в цю множину, то його не можна називати злочинцем. Думаю читачу зрозуміло, чому слідування цьому силогізму може містити елемент маніпуляції, бо практично нереально перерахувати усі дії, які можна буде схарактеризувати як "злий намір" в абсолютному, незалежному від суспільних, релігійних, моральних, ets. принципів.

Це й же приклад яскраво ілюструє обмеженість силогістики Арістотеля, що охоплює далеко не всі типи мислення. Загалом силогістика Арістотеля є так званою логікою властивостей: визначається множина об'єктів, які мають сукупність властивостей та можливих дій. Тоді, на основі інформації про певний інший об'єкт, який описується властивостями та діями робиться висновок про належність чи неналежність цього об'єкту до множини. Або, якщо якийсь об'єкт входить до цієї множини, то він повинен мати цей же набір властивостей та можливих дій. 

Так чому ж Арістотель був творцем програмування? Загалом заголовок поста є дещо провокативним, але "зерно" істини в ньому є. За конкретним виміром, поточно у програмуванні широко застосовується так звана об'єктноорієнтована парадигма, за якою комп'ютерна програма є сукупністю взаємодійних об'єктів, кожен з яких є екземпляром певного класу, а класи утворюють ієрархію наслідування. Для необізнаних з програмуванням спробую надати дещо спрощене пояснення: клас в об'єктноорієнтованому програмуванні (ООП) є описом деякої множини об'єктів. Цей опис множини містить тлумачення властивостей, які мають мати об'єкти, які можуть належати цій множині та описи дій, які можуть виконувати, або які можуть бути застосовані до об'єктів цієї множини. Набір властивостей описує стан об'єкта, а набір дій - його поведінку. Нічого не нагадало? :) Якщо ні, то перечитайте ще раз уважно попередній абзац.

Щоб проілюструвати основні концепти ООП, звернемося до класичного силогізму типу ААА про "смертного Сократа", який наводиться у всіх довідниках чи підручниках з логіки (наприклад, тут), який загалом не належав Арістотелю, а був витвором середньовічних схоластів:

  • усі люди смертні;
  • Сократ є людиною;
  • значить Сократ є смертним.

З точки зору ООП в цьому силогізмі у першому судженні йде мова про формування класу Людина, кожен об'єкт якого має базову властивість "смертності". При цьому поняття Людина береться у базовому означенні, як жива, наділена інтелектом істота, суб'єкт суспільно-історичної діяльності й культури. Де життя береться з означення: це явище, що є сукупністю фундаментальних загальнобіологічних ознак (метаболізму, гомеостазу, росту, розвитку, відповіді на подразнення, розмноження, еволюції тощо), які характеризують живих істот, відрізняючи їх від неживих об'єктів. Зрозуміло, що за потреби, щодо будь-якого вжитого тут і далі терміну можна розгорнути просто "непахане поле" для різнотлумачень та маніпуляцій. Якщо що, то можна повернутися на кінець другого абзацу цього посту: "зрозуміло, що дискусія між двома опонентами виключно можлива, якщо вони при побудові своїх суджень ... спираються на однаковий опис ..." :)

Далі, в другому судженні йде мова про те, що певний Сократ визнається належним до цієї множини, що описано класом Людина. І висновком є слідування базовому підходу ООП - якщо об'єкт належить до множини (є екземпляром класу), то він повинен мати усі базові властивості цього класу, зокрема має мати властивість "смертності", що й описано у третьому судженні.

Спробую змоделювати деякі заперечення (або можливі питання читачів чи студентів на лекції), які можуть виникнути при використанні цього силогізму.

  • А ви не помиляєтеся, стверджуючи, що усі люди смертні (тобто, що однією з базових властивостей класу Людина має бути властивість "смертність")? Ні, не помиляюся, оскільки наразі для 99.999% відсотків представників людства характерною є ця властивість (не буду ставити 100%, хоча, наразі, окрім біблійних особистостей, інших відомих науці випадків не зафіксовано :) ). Якщо ми, наприклад маємо формувати інформаційну систему, що буде обслуговувати людство, то зрозуміло, що в цій системі має бути сформовано підсистеми відмітки щодо смерті людини (як описаної вище сукупності ознак, які будуть відрізняти живу істоту від неживого об'єкта). Ця властивість буде запускати інші підсистеми, як то формування документів про смерть, процедури набуття спадку особи, запуск процесу поховання, тощо. Для решти 0.001% відсотків, які, можливо, будуть "безсмертними", за парадигмою ООП можна сформувати успадкований клас від класу Людина, наприклад БезсмертнаЛюдина, який буде мати додаткові властивості для опису "безсмертя". Зрозуміло, що має бути хоча б якийсь набір властивостей, спільний між класом Людина та  БезсмертнаЛюдина, бо інакше прийдеться говорити про абсолютно різні сутності. :)
  • А хто такий Сократ? Сократ - це давньогрецький філософ, що вважається засновником Західної філософії. Немає жодних пересторог, щоб Сократа не віднести до класу Людина в нашій інформаційній системі, бо об'єкти класу Людина очевидно повинні мати властивість ім'я, за яким їх можна відрізняти. Зрозуміло, що простого посилання на ім'я недостатньо для того, щоб відрізнити один об'єкт від іншого, бо ім'я Сократ не є зарезервоване за певною особою, так само як і ім'я Арістотель. Але коли освідчена людина говорить про Сократа чи Арістотеля, то в першу чергу на думку приходять ці особистості - давньогрецькі філософи. А загалом щодо однозначного визначення об'єкту у множині, то є дуже багато способів. Деякі з них можна знайти тут.
  • Хм, добре - Сократ це філософ, який вже помер. Як щодо властивості "смертність" в цьому випадку? І друге, а для чого нам в інформаційній системі об'єкт вже померлої людини? Щодо першого питання, то властивість "смертність" у нас, наприклад, може бути пов'язана з іншою властивістю - "є_живий", що може приймати логічне значення "так"/"ні". При цьому властивість "смертність" також буде логічною, яка, для описаних вище 99.999% об'єктів класу Людина за замовчуванням буде вказана зі значенням "так". Якщо якийсь об'єкт набуде стану "безсмертя", то властивість "смертність" набуде значення "ні". Зрозуміло, що якщо буде винайдено технологію анабіозу, то правильним підходом з точки зору ООП є формування нового успадкованого класу ЛюдинаВАнабіозі, для якого все ж таки властивість "смертності" залишиться у стані "так".  Щодо питання, для чого вводити в інформаційну систему померлу людину, то тут відповідь може бути така: інформаційна система буде мати підсистему "Винаходи, твори, наукові праці, ідеї", коли для авторства потрібно посилання на об'єкти класу Людина. Зрозуміло, що усіх померлих осіб за тисячоліття людської історії внести буде неможливо, бо про багатьох не збереглося жодної інформації, але осіб, що внесли свій вклад у цивілізацію, і які є зафіксовані в історичних джерелах ми це можемо зробити. 

Зрозуміло, що перебрати усі можливі "хейтерські заперечення" неможливо. :) Зупинився на деяких найбільш очевидних. Однак вважаю використання цього силогізму доволі дидактичним, бо дозволяє продемонструвати багато яких нюансів, з якими стикаються програмісти навіть на початковому етапі розробки програм - формуванні правильної ієрархії класів, які мають описувати сутності інформаційної системи. "Потужність" цього силогізму проявляється ще й в тому, що механізм спадковості (успадкування класів) в ООП має величезну підступність, яка перетворює код до виду Spaghetti code. Дуже часто програмісти або взагалі не застосовують спадковість, а нескінченно розширюють базовий клас властивостями та методами, так званий антипатерн "Об'єкт бога", або змінюють властивості та методи в успадкованих классах, тобто роблять їх іншими, ніж вони були означені в базовому класі. Щодо останнього, то тут перестає працювати відомий принцип підстановки Лісков, згідно з яким успадковані об'єкти не можуть змінювати природу успадкованих властивостей та поведінку успадкованих методів. В успадкованих об'єктах можна виключно розширювати базові властивості та поведінку базових методів. Властиво на основі другого судження із розглянутого силогізму можна продемонструвати застосування цього принципу.

Найбільша проблема, яка спостерігається останнім часом полягає в тому, що в догоду чи то "хайпу" чи недостатній обізнаності в матчастині, формуються "теорії" та "критикуються" результати людської цивілізації, які за правильного застосування можуть бути надзвичайно інформативними та дидактичними для навчання молодого покоління. Потрібно розуміти, що те ж програмування не виникло на "породньому місці", а є результатом розвитку мислення в нашій цивілізації, коли концепти, які спочатку розглядалися як "ігри розуму", з часом були та є реалізовані у прикладних аспектах життєдіяльності. За "адаптивного" чи спотвореного формування свідомості в подальшому значно більших зусиль вимагається докласти для "перенавчання" осіб в компанії. Ба більше, дуже часто це є причиною втрачених прибутків компанії, наприклад, якщо говоримо про ІТ, внаслідок переробки коду інформаційних систем, в якому порушені базові концепти. І особливо "важкими випадками" є ті, коли особа до приходу в компанію за "навчання" заплатила власні кошти. :)

Проблема ж нашої країни, на скромну думку автора полягає в тому, що "Жовтневий переворот" 1917 року в Російській імперії запустив процеси "витіснення занадто розумних", коли зароджувана у цілому світі професія інженера, яка вимагала грунтовної освіти не тільки з фаху, але й знання декількох іноземних мов, обізнаності у філософії, літературі та мистецтві, розуміння підприємництва та винахідництва, та навіть певних науково-прикладних навичок, була зведена до рівня "покращеного" робітника. Тобто, замість "ностальгічного для певної частини нашого соціуму" "прогресу" країна отримала регрес у порівнянні до розвитку інженерії за межами союзу та сателітів, що вибирали союзний приклад "цивілізаційного шляху". Як наслідок немає потреби відкидати напрацьовані цивілізацією результати, а потрібно відновлювати розуміння цілісної картини розвитку цивілізації без "намулювання", яке піднялося після 1917 року.

P.S. Наведені вище міркування є доволі спощеним (науково-популярним) поглядом на взаємозв'язок філософії та сучасних технологій. Для зацікавлених читачів можна, наприклад, запропонувати ознайомитися з більш грунтовними роботами:

Aristotle and object-oriented programming: Why modern students need traditional logic

An Aristotelian Understanding of Object-Oriented Programming

Одна із запропонованих робіт є у відкритому доступі за посиланням.

Та й заодно можна порекомендувати онлайн курс логіки Стендфордського університету, який є доступним користувачам цілого світу. З іншими цікавими курсами з логіки провідних університетів світу можна ознайомитися за посиланням.

Підписуйтесь на наш Telegram канал Enigma