Закон дірявих абстракцій

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

На сьогоднішній день в Інтернеті є інженерне диво, з яким ми стикаємося кожного дня. Воно укладено в мережевому протоколі TCP, одному з основних цеглин, з яких збудований Інтернет.

TCP - спосіб пересилання даних, який вважається надійним. Щоденно ми всі користуємося TCP для повсякденних потреб. Як зазначалося раніше цей спосіб переселання даних вважається надійним - таким надійним, дозволяє кожному Остапу Бендеру зі Східної Африки розсилати по всьому світу спам найвищої якості.

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

Для ілюстрації чарівництва, розглянемо аналогічний, хоча і не цілком звичайний, сценарій з реального життя.

Припустимо, якась дама відправляла підводами з Петербурга в Москву диван, чемодан, саквояж. Тут сталося таке, що частина підвод зламалася і до Москви не доїхала. Частина підвод перекинулася на шляху, розбивши картину і дзеркала. Підводи добиралися до Москви не в тому порядку, в якому виїжджали з Петербурга, оскільки деяких затримали страшні лісові розбійники, і плюс до всього візники вибирали різні маршрути. А тепер уявімо, що дамі пропонується нова послуга: Червона Стріла, яка гарантує, що багаж прибуде на місце в цілості і в потрібному порядку. Але чарівним чином Червона Стріла не використовує, як ви подумали, залізної дороги, а наймає тих самих візників з підводами. Червона Стріла організовує роботу візників наступним чином. Стан багажу кожної підводи ретельно перевіряється. У разі пошкодження диван, чемодан та інші. замінюються зі складу точно такими ж. Підводи шикуються в правильному порядку. Якщо страшні лісові розбійники зуміли захопити шлях і перерізали дорогу, то Червона Стріла перенаправляє підводи іншим шляхом, і пані нічого не підозрює. Їй просто здається, що багаж прибуває трохи повільніше, ніж звичайно; а про жахливі події в Бологому дамі знати необов'язково.

Приблизно так TCP і працює. По-вченому це називається абстракція: спрощений опис процесу, механізм якого залишається прихованим.

Повернемося до TCP. Я тут для простоти злегка загнув, що сказав, ніби TCP гарантує, що повідомлення прибуде на місце. Насправді, це не так. Якщо ваш улюблений хом'ячок перегризе мережевий кабель, так що ніякі пакети IP не дійдуть до комп'ютера, то TCP нічого не зможе вдіяти, і повідомлення не прийде. Якщо ж ви посварилися з мережевим адміністратором, який в помсту включив ваш комп'ютер в перевантажений хаб, то багато пакетів IP загубиться, і хоча TCP буде працювати, але так повільно, що за час шляху собачка, самі розумієте, того.

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

У абстракціях виявляються діри. В одних небагато, в інших ціла купа. Ці діри постійно просвічують, протікають, абстракції не спрацьовують. Закон дірявих абстракцій означає, на жаль, що абстракції не так сильно спрощують наше життя, як хотілося б.Коли я навчаю когось програмування COM, було б здорово обмежитися Візард Студії і автоматичною генерацією коду, але якщо щось вийде не так, у них не буде ні найменшого поняття, що сталося і як це виправити. Значить, треба розповідати їм про IUknown і CLSID і ProgIDS і ... о боги!

Якщо я навчаю програмістів C + +, було б здорово, якби мені не потрібно було розповідати їм про char * і арифметику покажчиків, а можна було відразу перейти до рядків зі стандартної бібліотеки шаблонів. Але в один прекрасний день вони напишуть "foo" + "bar", і виникнуть дивні проблеми, а мені доведеться все одно пояснити їм, що таке char *. Або вони спробують викликати функцію Windows з параметром типу LPTSTR і не зможуть, поки не вивчать char * і покажчики і Юнікод і wchar_t і хедерние файли TCHAR - все те, що просвічує через дірки в абстракціях.

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

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


Закон дірявих абстракцій міцно тримає нас за штани!!!

Закон Дырявых Абстракций