www.gnuman.ru

Резюме | Контакты | Работа | Page Title Eraser | GrayModern2 | Статьи
Путешествия | Фотоальбомы | Проект 365 | Блог | Черный список
Как выиграть суд у ГИБДД и вернуть права | Технический департамент своими руками

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

Автор: Джоэл Сполски

Переводчик: Семён Хавкин

Редактор: Маргарита Исаева

23 марта 2000


Есть в Интернете инженерное волшебство, на работу которого мы с вами полагаемся каждый день. Оно заключено в сетевом протоколе TCP, одном из основных кирпичей, из которых выстроен Интернет.

TCP — это способ передачи данных, который считается надёжным. Это значит: если вы с его помощью отсылаете сообшение по сети, оно обязательно прибудет на место в неискажённом виде.

Мы все пользуемся TCP для повседневных нужд вроде загрузки веб-страницы или отправления электронной почты. Надёжность TCP позволяет всяким остапам бендерам из Восточной Африки рассылать по миру спам наивысшего качества. О радость!

Посмотрим теперь на другой, ненадёжный, метод пересылки данных под названием IP. Тут уже никто не обещает, что посылка доедет до места назначения, и что по дороге с ней ничего не случится. Отправляя через IP кучу сообщений, не удивляйтесь, если половина из них потеряется, а из остальных часть окажется совсем не тем, что посылалось: может, они будут содержать фотографии прелестных котят, но скорее всего — просто нечитаемый мусор, похожий на заголовок тайваньского спама.

Волшебство же состоит в том, что TCP основан на IP. Иными словами, TCP обязуется как-то работать надёжно, используя лишь ненадёжные детали.

Для иллюстрации волшебства, рассмотрим близкий, хотя и не вполне обычный, сценарий из реальной жизни.

Предположим, некая дама отправляла подводами из Петербурга в Москву диван, чемодан, саквояж и т.д. Часть подвод сломалась и до Москвы не доехала. Часть подвод опрокинулась по пути, разбив картину, картонку и зеркала. Подводы добирались до Москвы не в том порядке, в каком выезжали из Петербурга, поскольку некоторых задержали страшные лесные разбойники, и вообще возницы выбирали разные маршруты. А теперь представим, что даме предлагается новая услуга: Красная Стрела, которая гарантирует, что багаж (а) прибудет на место (б) в целости и сохранности (в) и в нужном порядке. Но волшебным образом Красная Стрела не использует, как вы подумали, железной дороги, а нанимает тех самых возниц с подводами. Красная Стрела организует работу возниц следующим образом. Состояние багажа каждой подводы тщательно проверяется. В случае повреждения диван, чемодан и проч. заменяются со склада точно такими же. Подводы выстраиваются в правильном порядке. Если страшные лесные разбойники сумели захватить Бологое и перерезать дорогу, то Красная Стрела перенаправляет подводы другим путём, и дама ничего не подозревает. Ей просто кажется, что багаж прибывает немного медленнее, чем обычно; а об ужасных событиях в Бологом даме знать необязательно.

Примерно так TCP и работает. По-учёному это называется абстракция: упрощение чего-то гораздо более сложного, что происходит под крышкой. На самом деле значительная часть программирования заключается в построении абстракций. Что такое, допустим, строковая библиотека? Это способ сделать вид, что компьютеры умеют так же легко работать со строками, как и с числами. Что такое файловая система? Это способ сделать вид, что жёсткий диск состоит не из быстро вращающихся намагниченных тарелок, которые умеют сохранять биты в определённых местах, а якобы представляет из себя иерархическую систему папок внутри папок, внутри которых отдельные файлы содержат, в свою очередь, байтовые строки.

Вернёмся к TCP. Я тут для простоты слегка загнул, и у кого-то, может быть, от этого уже пар из ушей пошёл. Я сказал, будто TCP гарантирует, что сообщение прибудет на место. Вообще-то, это не так. Если ваш любимый хомячок перегрызёт сетевой кабель, так что никакие пакеты IP не дойдут до компьютера, то TCP ничего не сможет поделать, и сообщение не придёт. Если же вы поругались с сетевым администратором, который в отместку включил ваш компьютер в перегруженный хаб, то некоторые из пакетов IP все же дойдут, и хотя TCP будет работать, но так медленно, что за время пути собачка, сами понимаете, того.

Вот это я и называю дырявой абстракцией. TCP пытается абстрагироваться от ненадёжной сети полностью, но иногда эта сеть все-таки просвечивает сквозь дыры в абстракции, так что абстракция не всегда защищает от необходимости иметь дело с глубокими подробностями. Это всего лишь один пример того, что я назвал Законом Дырявых Абстракций:

   Все нетривиальные абстракции дырявы.

В абстракциях обнаруживаются дыры. В одних немного, в других целая куча. Эти дыры постоянно просвечивают, протекают, абстракции не срабатывают. Вот примеры:

Закон дырявых абстракций означает, к сожалению, что абстракции не так сильно упрощают нашу жизнь, как должны бы. Если я обучаю программистов C++, было бы здорово, если бы мне не нужно было рассказывать им про char* и арифметику указателей, а можно было сразу перейти к строкам из STL. Но в один прекрасный день они напишут "foo"+"bar", и возникнут странные проблемы, а мне придётся всё равно объяснить им, что такое char*. Или они попытаются вызвать функцию Windows с параметром типа LPTSTR и не смогут, пока не выучат char* и указатели и Юникод и wchar_t и хедерные файлы TCHAR — все то, что просвечивает через дырки в абстракциях.

Когда я обучаю кого-то программированию COM, было бы здорово ограничиться визардами Visual Studio и автоматической генерацией кода, но если что-то выйдет не так, у них не будет ни малейшего понятия, что случилось и как это исправить. Значит, надо рассказывать им про IUnknown и CLSID и ProgIDS и... о боги!

При обучении программистов ASP.NET было бы здорово сказать: мол, дважды кликните мышкой на штучку, а затем пишите код, который будет обрабатываться на сервере, когда пользователь кликнет на эту штучку. И правда, ASP.NET абстрагирует разницу между написанием кода HTML для отработки нажатия на гиперссылку (<a>) и кода для отработки нажатия на кнопку. Проблема: разработчикам ASP.NET пришлось скрыть тот факт, что в HTML нету способа отсылать форму из гиперссылки. Они обходят это, генерируя несколько строчек на JavaScript и добавляя к гиперссылке функцию onclick. Но эта абстракция дырява. Если пользователь отключит JavaScript, то приложение на ASP.NET не будет правильно работать; и если программист не знает, что именно абстрагировалось ASP.NET'ом, он не поймёт, в чём там дело.

Из-за закона дырявых абстракций вот что получается: придумает кто-нибудь чудесный новый генератор кода, с которым у программиста работа наконец-то станет эффективной, а ему и говорят: «Сперва научись делать это руками, а потом уж пользуйся генератором, чтобы сэкономить время». Генераторы кода, абстрагирующие разработку кусков кода, так же дырявы, как и все прочие абстракции. А единственный компетентный способ залатать эти дыры — выучить, как работают абстракции, и какие подробности они скрывают. Итак, абстракции экономят наше рабочее время, но не экономят учебное время.

Отсюда парадоксальное следствие: в то время как инструментарий программиста забирается на всё более высокие уровни сложности со всё более развитыми абстракциями, стать высококвалифицированным программистом становится всё труднее.

Во время мой первой стажировки в Microsoft я писал строковые библиотеки для Макинтоша. Типичное задание: написать версию функции strcat, которая возвращает указатель на конец новой строки. Несколько строчек кода на C. Всё, что я делал, пришло прямо со страниц К&Р, одной тоненькой книжки про язык C.

Сегодня же для работы над CityDesk мне нужно знать Visual Basic, COM, ATL, C++, InnoSetup, внутренности Internet Exlorer, регулярные выражения (RegExp), DOM, HTML, CSS и XML. Всё это инструменты более высокого уровня по сравнению со старым K&Р, а всё ж таки мне и его надо знать, не то беда.

Десять лет мы представляли, что новые концепции программирования смогут облегчить наш труд. И правда: созданные за эти годы абстракции действительно позволяют работать с проектами на порядки более сложными, чем десять или пятнадцать лет назад, типа программирования GUI и сетевого программирования. Но хотя замечательные инструменты, вроде современных объектных языков визуальных форм, позволяют сделать многое невероятно быстро, вдруг в один злосчастный день приходится искать течь в абстракции, и на это уходит пара недель. А когда вам нужно найти себе программиста в основном на Вижуал Бейсике, совершенно недостаточно нанять программиста только на Вижуал Бейсике, потому что каждый раз, когда абстракции Бейсика потекут, он не сможет сделать ни шага.

Закон дырявых абстракций крепко держит нас за штаны.

Комментарии переводчика:


В английском оригинале статья называется The Law of Leaky Abstractions

Оригинал статьи: http://local.joelonsoftware.com/wiki/Закон Дырявых Абстракций


Другие статьи Джоэла Спольски (The Joel on Software) на русском языке
Маркетологи vs. Разработчики
Похож ли медленный рост на медленную смерть?
О чем ваша компания?
Студенческие проекты и тайм-менеджмент
Особенности Вайфая на конференциях
Новый Офис Fog Creek
Почему форматы Microsoft Office такие сложные? (И как это обойти)
Речь в Йельском университете 1
Речь в Йельском университете 2
Речь в Йельском университете 3
Письмо о стратегии VI
Семь шагов на пути к восхитительной службе по работе с клиентами
Общая картина
Консалтинг по оценке производительности (из писем)
Измерения продуктивности
В поисках Великих Разработчиков
Не дайте Астронавтам Архитектуры вас запугать
Секрет айсберга
Метод отождествления
Метод экономической мотивации
Командный метод управления
Три метода управления (введение)
А ваш язык программирования так может?
Контракты и соглашения которые не стоит подписывать
Ежедневная сборка - ваш союзник и друг
Моя первая проверка Билла Г
Испытание Удобства и Простоты Использования с Морами
Опасности обучения на Java
Как поставлять что-нибудь по почте
Превращение денег в программное обеспечение, которое работает
Три заблуждения теории вычислительной техники
Достигая тех высот
Выбор даты выпуска
Как заставить неправильный код выглядеть неправильно
Совет студентам изучающим вычислительную технику
Верблюды и песочница
Пожалуйста, сэр, могу ли я получить компоновщик?
Как Microsoft проиграла битву за API
Не просто удобство использования
Абсолютный Минимум, который Каждый Разработчик Программного Обеспечения Обязательно Должен Знать о Unicode и Наборах Символов
Как сделать так, чтобы ваше резюме прочитали
Двоекультурие
Бионический офис
Лорд Палмерстон в программировании
Закон Дырявых Абстракций
О вреде премирования
Пять миров
Огонь и движение
Назад, к основам
Весна в Кэмбридже
О вреде многозадачности применительно к людям
По главной улице без оркестра
Тест Джоэла: 12 шагов к лучшему коду
У Microsoft поехала крыша
Cтратегические заметки III. Позвольте мне отказаться!
Пять (неуважительных) причин не иметь тестеров
Ну откуда все эти (неоригинальные) мысли?
Планирование программного обеспечения малой кровью
Стратегические заметки II: Вопрос о курице и яйце
"Я начальник - ты дурак" и команда клоунов
Искусство проведения интервью
А вот ещё про отпуск
Введение в Восхитительный Дизайн
Для чего нужны тестировщики



Правильный CSS! Valid XHTML 1.0 Transitional