
В отсутствие ключа дверь — это часть стены. В отсутствие двери ни к чему ключ. Дверь и ключ к ней вместе представляют собой проход для разума. В отсутствие разума ни ключа, ни двери, ни прохода не существует.
Талман, Кода Овсінда (Б. Лонгієр «Ворог мій»)
Для початку невеличка картинка з натури. Перший курс політехнічного, перша лабораторна робота в другому семестрі. Об‘єктно-орієнтоване програмування. Задачка дуже проста: спроектувати на класах (поки що не написати, а спроектувати) програму для керування ліфтом. В аудиторії шістнадцять чоловік, розбиті на кілька купок. Всі зайняті чимсь важливим. Малюють якісь діаграми, голосно сваряться. Якщо вслухатись, можна почути окремі репліки.
- Пацани, у ліфта завжди є мотор, отже нам конче потрібен клас мотора. Його тип, швидкість, кількість років в експлуатації…
- А іще є кнопочні панелі. Це вектор кнопок, значить, нам потрібен клас кнопочної панелі, який буде містити ці кнопки і визначати, яку саме кнопку поверха натиснули.
- О, поверхи… Ми ж забули про поверхи!
І тільки ваш покірний слуга сидить в кутку, нічого не пише, і з відвертою нудьгою спостерігає за бурхливою діяльністю своїх одногрупників. Перед ним зошит, а в ньому написано кілька рядків. Нарешті, хтось помічає, що я нічого не пишу, і гнівно на мене накидається:
- А чого ти нічого не пишеш і не пропонуєш?! Он ми тут цілу систему запроектували, а ти байдики б‘єш.
Я тільки скоса глипнув на новоявленого борця за бурхливу діяльність, і голосно відповів:
- Тому що ви всі помиляєтесь. Потрібен тільки один клас.
Мабуть, тоді я вперше почув про свою зверхність і уявлення про себе як найрозумнішого, а всіх навколо – як ідіотів. Хвилин п‘ять всі допитувались, чому я так сказав, і чому відмовляюсь розуміти своїх же одногрупників. Мені наперебій показували, доказували, викладали цілі концепції «сферичного ліфта у вакуумі». Я терпляче всіх вислухав, а потім повторив:
- Потрібен тільки один клас. Сам ліфт.
- Але ж є кнопки, є мотор, є поверхи…
- Ну, і на біса вони вам здалися?
Запанувала тиша. Ніхто не міг відповісти на це простеньке питання. Дійсно, а навіщо вони щойно так жваво розробляли характеристики всіх цих додаткових класів. Ну, мотор іще зрозуміло: без нього ліфт не буде рухатися. Але навіщо поверхи…
Скориставшись паузою, я виклав свою ідею. У нас не чарівний ліфт Віллі Вонки, який може літати і переміщуватись будь-куди, а прозаїчний ліфт в багатоповерхівці, який може рухатись тільки вгору-вниз, і виключно дискретно – на певну кількість поверхів. За межі шахти вибратись він не може, отже замість тримати масив поверхів слід просто передбачити дві змінні – номер поточного поверху, і номер останнього поверху в будинку. Кнопки на панелях біля входу, і кнопки всередині самого ліфту мають одне і те саме призначення, вони задають поверх, на який повинен піднятись або спуститись ліфт – отже розробляти окремо кожну кнопочку немає сенсу, необхідна тільки одна функція, яка у якості аргументу буде приймати номер потрібного поверху, а повертати – кількість поверхів, на які повинен переміститись ліфт, або -1, якщо ліфт застряг. Іще необхідна функція самоконтролю ліфта, яка повинна повернути булевське значення – працездатний ліфт, чи ні. Саме це і було написано в зошиті, який лежав переді мною, убористим кодом на С++.
- Але ж ти повинен хоча б мотор передбачити, - завівся мій опонент, розкручуючи дискусію по новому витку.
- А мотор ти можеш поставити будь-який, - тут же осадив його я. – Як і присобачити на мою модель будь-які кнопки. І поставити ліфт із таким інтерфейсом в будь-якому будинку. Маючи простий та зрозумілий інтерфейс керування ліфтом, у подальшому ти пристосуєш його до будь-яких умов. Але без такого інтерфейсу ти будеш приречений на ходіння по колу, бо кожен додатковий клас в твоїй системі тягне за собою іще цілу купу додаткових класів, і врешті-решт виявиться, що для побудови банального ліфта слід побудувати ціле цифрове місто.
Мій опонент замовк. Зненацька до нього дійшло, що суть завдання була не в створенні велетенської кількості класів, які моделювали не тільки ліфт, а й його оточення – а у визначенні мінімального набору характеристик ліфта, які б описували найбільш ключові його риси, і дозволяли ним керувати. Так, як цього вимагає сама концепція об‘єктно-орієнтованого програмування.
У відповідь на німе запитання групи «чому я, сволоч така, про це здогадався, а вони, такі розумні, ні» я дістав конспект лекцій, і показав всім визначення класу в ООП. Все виявилось настільки просто, що нікому навіть в голову не прийшло, що так може бути.
Минули роки, а я досі витрачаю купу часу на те, щоб довести – об‘єкти кнопок та поверхів в задачі про ліфт непотрібні…
Адже в чому полягає головна проблема наших доморощених державотворців – вони завжди, пропонуючи розв‘язок задачі, обов‘язково передбачать в ній і кнопки, і поверхи, і для кожної гайки знайдуть містечко. Саме тому у нас, наприклад, бухгалтерський облік настільки комплексний, що розібратись в ньому без ящика пива попросту неможливо. В ньому передбачено все, що тільки можна придумати. А самого обліку нема. Роками неможливо розібратись, що саме знаходиться на балансі в тій чи іншій конторі, в якому стані і взагалі де те «воно» розташоване, зате на кожен об‘єкт знайдеться сотня папірчиків, в тому числі і такий, де однозначно обґрунтовується право на нього якоїсь мутної фірми з Кіпру. З плином часу кількість таких паперів дедалі нагромаджується – сотні і тисячі випускників економічних та юридичних вузів корплять над новими Формами, Алгоритмами, Інструкціями та Листами. А обліку як не було, так і нема.
Або візьмемо аудит, хоч останнім часом це слово уже саме по собі викликає гомеричний регіт. Нікого не цікавлять власне об‘єкти чи витрати. Натомість: таблиця 20, 25, 27. Покажіть дані в цій формі, відобразьте в іншій, продублюйте в третій. Графа №30 (я не шуткую, бачив я аудиторські таблиці і з 60-ма графами) повинна відображати тільки такі, так і й такі дані, і не дай Боже в них поставити сякі. Ах, цифри не сходяться? Так ви, шановна, крадійка в особливо великих розмірах, пожалте на прийом до прокурора. Називаються велетенські суми, а як запитуєш – що ж саме украла, розводять руками і роблять розумний вигляд. Тим часом на підставі отих папірчиків, якими обростає кожен об‘єкт із ненульовою вартістю, «чесно купуються» за безцінь цілі галузі економіки. Бо Форми, Інструкції та Алгоритми є, а обліку нема, а раз нема обліку – то вартість об‘єкта визначити можна тільки «на око».
Та сама історія із законодавством. Кількість підзаконних актів, які тлумачать (вдумайтесь, тлумачать) юридичні норми, уже далеко перевищила кількість самих законів. При цьому вони часто протирічать одне одному, і замість того, щоб повикидати всі ці зайві папери і все-таки написати простий і зрозумілий «клас ліфта», наші законотворці пишуть все нові і нові законопроекти, присвячені кожній кнопочці на панельці в глухій мансарді. Так і виходить, що законів достобіса, а права і самої законності врешті-решт не видно.
Вся ця метушня мені все більше і більше нагадує оту лабораторну роботу, в якій новачки, щойно дізнавшись про нову для них концепцію, з азартом починають «креативити», з часом втрачаючи сенс задачі, і переходячи до «креативу заради креативу». Їм подобається працювати із новими поняттями, і вони ліплять їх всюди, куди тільки можна – як підліток пише назви улюбленої музикальної групи на кожному заборі. Створюється новояз, який нагадує професійний жаргон тільки зовні, а насправді практично ніхто не розуміє сенсу слів, які вимовляє. «Акцепти», «дорожні карти», «кодекси», «урядові програми» сиплються, як із рогу достатку, підкріплюються п. таким-то, п. таким-то, і ще п. таким-то. Дивлячись на таку бурхливу діяльність, можна подумати, що там вирішуються якісь задачі епохального масштабу – поки голосно не задаси простеньке питання: «а на біса все це нам?». І запанує тиша…
І ось коли запанує тиша, хтось повинен тицьнути пальцем у кілька рядків у зошиті, і сказати сакраментальне: «потрібен тільки один клас».
Складність полягає в тому, що ми не творимо систему з нуля. Запізнились ми у розвитку (несуттєво наразі, через об‘єктивні причини, чи через власну дурість), а тому засновуємось на розробках, які з‘явились за сотні років до нас. За минулий час вони обросли конкретними реалізаціями, механізмами, контрольними елементами, і навіть чисто декоративними атрибутами. І ми радо беремося все це реалізовувати, із захопленням занурюючись в такий цікавий процес державобудівництва. На менше, ніж ціла система, і притому найостаннішої марки, ми не згодимось – адже у всіх такі, а ми що, гірші за всіх? Забуваємо тільки про те, що всередині всіх хромованих детальок, красивих панелей із барельєфами і золотих прикрас, ховається отой самий прозаїчний «клас ліфта». В ньому немає опису мотора, кнопочок, панелей і поверхів – але в ньому міститься сама його сутність, і саме за його допомогою ним керують.
Індустрія програмування давно уже минула етап, коли «у всіх було круто, а у нас по нулям», минула також і етап бездумного нагромадження коду заради «крутоти», і знайшла вихід. У нас є таке поняття – «зворотній інжиніринг». Це коли програміст докопується до самої сутності програми, яку хоче скопіювати, і досліджує, що саме лежить в основі її роботи і успіху. Якщо докопається, тоді його програма вийде кращою, ніж аналог. Якщо не докопається, вийде жалюгідна копія.
А іще у нас є приказка – Keep It Simple, Stupid.
Вячеслав Ільченко
Джерело: Абырвалг