Power of nuisance – как плохой программистский дизайн законов извращает их

Когда зимой 2006-2007 я возвращался из России, я впервые столкнулся с нововведением после 9/11, когда в аэропорту отправки представители американских служб приглядываются заранее к пассажирам, вылетающим в Соединенные Штаты. Это делается не везде, но в ряде стран, с которыми есть соответствующие соглашения. С Италией таковое очевидно было, а вылетал я как раз из Рима.

В общем, тетка на промежуточном контроле (видимо еще итальянка) долго-долго с недоумением крутила в руках мой паспорт, задавала дурацкие вопросы, а потом передала меня представительнице американской службы. Девочка тут же начала меня спрашивать насчет моего маршрута (itinerary). На что я резонно отвечал, что мой маршрут у нее в компьютере и на моих билетах. Девица тупо продолжала спрашивать: «Sir, what's our itinerary?» Я старательно отвечал в деталях то, что было написано на билетах – Сиэттл-Атланта-Рим. Но это явно было не то, что ее интересовало, так что она перешла на хамство: «Sir, do you speak English?» «Well, do YOU speak Englsh? Look at the ticket, you see? The word "itinerary", and then Seattle-Atlanta-Rome. That's what dictionary means by "itinerary". If you mean something else, explain what and I'll gladly answer. Just repeating word "itinerary" does not help.» (для не владеющих, перевод, «А сама-то ты говоришь по-английски? Видишь, билет? На нем слово itinerary, а за ним Сэттл-Атланта-Рим. Именно это слово itinerary означает по словарю. Если имеешь в виду что-то другое, обьясни что – тогда я смогу и ответить. А повторять это слово как попугаю не поможет.»

В конце концов я догадался, что это дурища имела в виду не полет, а вообще всю поездку. Я рассказал ей про всю поездку, на чем разбоки и кончились. Но я совершенно не мог понять с чего это ко мне прикопались? И только где-то через месяц, уже дома, до меня дошло. За месяц отпуска я ни разу не брил бороду!!! И потому, для этих девочек я выглядел просто как какой-то моджаххед. Подозреваю, что православые священники и евреи-хасиды должны испытывать такие же неудобства при путешествии «в штатском».

И это все, на что эта ...ая администрация потратила миллиарды долларов с 9/11 под предлогом госбезопасности???!!! Прикапываться к бородатым туристам???!!!

Собственно, все это присказка, а сказка только начинается. Просто законы в пользу национальной-государственной-и-просто безопасности очень часто принимаются с очень благими намерениями, которыми устлана дорога сами знаете куда. И главная причина – паршивый дизайн, который я осмелюсь проиллюстрировать примерами на языках программирования.

Итак, закон, который позволил эту проверку в аэропортах имел намерением что-то вроде:

if (Traveller.isTerrorist) { задержать... }

Все просто и понятно, даже для конгрессменов. Среди которых, ученых, кстати говоря, не водится, да и о программистах я чего-то не слыхал. И вот PM-конгрессмен пишет такой вот закон-спек, и пробивает его утверждение. А дальше дело доходит до программистов, в случае законов – спецслужб, которых программистскому дизайну никто не учил. И вот он смотрит на этот закон-спек, и с ужасом видит:

class Traveller { … private: bool isTerrorist; … }

То есть, поле недоступно. И изменить его область определения нельзя, поскольку это часть платформы. Упс...

Что делает в этом случае хороший программист? Ну, ясное дело, надавать по ушам PM'у, накрутить хвосты начальству, добиться, чтобы все поняли, что это имплементировать нельзя, нужно что-то более разумное. Никто не говорит о том, что фича не нужна, просто определить ее надо как-то иначе, чтобы можно было разумно реализовать. Логично? Логично.

А что делает хреновый программист? Трудолюбиво засучив рукава пишет сто тысяч строк эвристик, в которых не только черт, но и он сам постоянно ноги ломает, и которые заканчиваются тем, что в аэропортах начинают приставать к бородатым туристам.

Вы уже поняли, к какому классу программистов принадлежат наши спецслужбы? Да-да, «наши», они во всем мире действуют примерно одинаково, если вообще действуют.

К слову, их даже винить в этом нельзя. Если вы следили за моими постами, то современные спецслужбы по обе стороны океана – это порождение социализма, при котором они приглядывали за организованым массовым и унифицированным рабочим классом. Обьекты их «охраны» были как гвозди, выходящие из одного штамповочного пресса – системы всеобщего среднего образования, которая штамповала мозги в соответствии с требованиями пропаганды и массовой технологии. В такой системе, во-первых, и правда можно иметь такое поле как public, пропечатанным в паспорте, а во-вторых, взаимозаменяемость элементов позволяла сначала по малейшему подозрению оторвать квадратные уши, а потом уже разбираться, квадратные ли они. Поскольку заменить элемент было дешевле, чем риск иметь плохой элемент в системе. Помните?

«Не было гвоздя, подкова пропала,
Не было подковы – лошадь захромала,
Лошадь захромала – командир убит,
Конница разбита, армия бежит.
Враг вступает в город, пленных не щадя,
От того что в кузнице не было гвоздя.»?

Вот органы охраны и занимались тем, чтобы в подковах не было плохих гвоздей. Причем, дело-то хорошее, вот только с постепенным уходом социализма массовым рабочим классом все менее становятся организованные рабочие, и все более специалисты, которые, заразы, очень дорогие и очень трудно заменяемые. Социалистические спецслужбы в принципе и раньше об этом знали – даром, что ли, Берия специалистов по лагерям искал – вот только теперь они еще и становятся массовыми, и поэтому старые подходы для общества работают все хуже и хуже.

Словом, одно дело, если это гвоздь в подкове, стоящий копейку в базарный день, а другое дело если это какая-нибудь головка цилиндра в двигателе Мерседеса S-класса с тремя встроенными процессорами и парой дорогих сенсоров.

Если провести биологические аналогии, то чтобы избавитсья от некоторых классов паразитов в человеческом организме, достаточно стакана тыквенных семечек, которые будучи ядовитыми для этих паразитов, почти не вредят самому человеку. Если же речь скажем о бактериальном заражении, то приходится использовать антибиотики, от которых и нормальным клеткам приходится не сладко. Причем, инфекции приспосабливаются к антибиотикам, а каждый следующий раз требуется какой-то новый, еще более сильный антибиотик, по сути яд, чтобы действовать.

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

Кстати, вы заметили, насколько плавно по сути марксизм перетекает в теорию корпоративных паразитов?

Впрочем, мы отвлеклись. Разговор ведь был о дизайне законов. Давайте взглянем на такие два фрагмента псевдокода:

class Очередь {
     void Add(Element elem) {
          lock(queue) {
               добавить элемент
          }
     }

     int Length() {
          lock(queue) {
               пересчитать длину
          }
     }
}

А теперь сравните с таким вот:

class Очередь {
     void Add(Element elem) {
          lock(queue) {
               добавить элемент
               Length = пересчитать длину
          }
     }

     int Length = 0;
}

Будет работать первый код? Да, в норме будет. Но, во-первых, это лиший lock на каждый запрос о длине очереди. Можно сказать, что в некоторых языках это очень дешевая операция, и что это просто небольшой и вполне терпимый nuisance (глупая и неприятная мелочь) в коде. К сожалению, небрежное отношение к мелочам может приводить к сильно неприятным результатам. Представьте себе что у вас две такие очереди, например, для аудио и видео, и при добавлении в каждую из них нужно проверить длину другой. Тогда при добавлении в них с разных нитей (threads) вы получите deadlock. Так что, за первый дизайн программист вполне законно может получить по ушам. К сожалению, за подобный дизайн законов и их реализацию никто по ушам не получает, а стоило бы.

И вот, после четырех страниц я, наконец, добрался до того, что собственно и хотел сказать. Критика многих законов, принятых с благими намерениями, вызывает озлобленную реакцию их защитников. Как??? Он возражает против DMCA??? Ах! Ох! Пират!!! Как??? Он против того, что призывников ловят на станциях метро??? Ох! Ах! Непатриот!!! Что??? Как??? Ему не нравятся хамские письма SBA??? Он, что, за нелегальное распространение софта??? Да чего так ходить, на недавний мой пост о будущей бизнес-модели видео индустрии, нашлись персонажи поучительно заявившие, что это нехорошо – хватать и убегать. То, что «хватать и убегать» в статье не было, а они вытащили это из рукава, ребят, конечно, ничуть не смущало.

Что все эти идиотские вопли игнорируют (подозреваю, что часто вполне сознательно), так это то, что законы имеют два способа сдерживать те или иные действия. Они могут (1) запрещать что-то, а могут (2) создавать неудобства, nuisances. Когда законы принимаются, они обычно имеют в виду (1), они создаются, чтобы запрещать что-то конкретное. (2) обычно получается как побочный эффект в результате плохого дизайна или плохой реализации (или и того, и другого вместе) Причем о (2) законодатели задумываются удивительно редко. А учитывая, что дизайн законов обычно безобразный, баги в дизайне и реализации часто создают очень много второго – nuisance.

Опять же, позвольте еще раз отвлечься. Забавным моментом является то, что язык на котором пишутся законы (в шутку называемый legalese) предназначен как раз для того, чтобы быть невнятным и двусмысленным, в отличие от языков программирования, предназначенных как раз для того, чтобы все был предельно однозначно. Так что некоторая часть вины ложится просто на саму систему, которая by design использует плохо подходящие средства. Не могу не поделиться анекдотом на тему противоположных целей инженерии (в частности занятов написанием программ) и юриспруденции (получающей доходы от невнятности законов):

Помер инженер, и почему-то попал в ад. Посмотрел вокруг, ужас... Дым, копоть, условия труда безобразные, техника безопасности не соблюдается. Ну, дело привычное, надавал чертям по рогам, засучил рукава и начал наводить порядок... Через пару месяцев Бог звонит Дьяволу по «вертушке» и спрашивает: «Ну, как там у вас дела в подразделении.» Тот отвечает: «Ой, так здорово. Ты тут к нам инженера прислал, так он тут все обустроил, кондиционеры, фильтры, свежий воздух, грешники вместо того чтобы прохлаждаться на сковородках все полезным делом заняты, все так здорово!» «Эй, а чего у тебя там инженер делает? Это по ошибке. Давай его в рай, нечего ему у вас делать!» «Не отдам! Самому нужен!» «Да, ты что? Соображаешь с кем говоришь??? Засужу!» «Ну, и где ты найдешь адвоката?»

Пример: DMCA и его порождение DRM. Намерение замечательное – нельзя воровать произведения. Если автор-хозяин требует за них мзду, ее надо платить. Идея в целом верная. Но дизайн закона и его реализация...

Скажем, я не против DRM на специализированных устройствах вроде Xbox или там DVD плейеров. Хотя насчет этого у Сергея Соляника есть отдельное мнение – он соединяет Windows Media Center, проецирующий телевизор и прочий медиа-металлолом в столь хитрые комбинации, что у него нередко перестают играть совершенно законно купленные DVD. Но я – человек простой, так что с подобными проблемами не сталкивался. Но когда DRM сажают на мой компьюетр (особенно, если это сделано в стиле Sony – как rootkit вирус с музыкального CD) тут я законно обижаюсь. И по хорошей причине. Мой компьютер – это не специализированный медиаплейер. Я его использую для других целей. И если, как у одного моего приятеля, DRM блокирует мне возможность редактировать мои собственные фото и видео с последнего отпуска, то возможности выразить мои чувства в пределах литературного языка очень быстро исчерпываются. Кроме того, эта собака портит скорость моего компьютера, а я не за то платил деньги за железо, чтобы им абы кто пользовался. Так что, если видеоиндустрия начнет мне платить за украденную производительность моих компьютеров, и за каждый недоступный файл с фото с моего отпуска столько же, сколько она хочет за каждый нелегально скопированый диск, я может и подумал бы. А так это nuisance в пользу постороннего дяди.

К слову, даже при этом условии, я не очень был бы в восторге. Сами посудите, DRM – это по сути электронный коп в вашей собственности. Сегодня они засунули копа вам в компьютер, завтра в столовую, куда завтра? В спальню? Мне не нужен коп в спальне, если это не моя жена.

Возвращаясь к программистской аналогии, мы в результате доверяем писать программы-законы по определению хреновым программистам (юристам) на по определению хреновом языке программирования (legalese) в результате чего получаем (гении средии читателей, наверное, уже догадались) по определению хреновые программы (законы), причем без возможности выбора.

Если вам не нравится Виста, у вас есть XP, Mac OS и Linux. Если вам не нравится MS Office, у вас есть Open Office. Если вам не нравится C#, у вас есть Java. Если вам не нравится BizTalk и MSMQ, у вас есть WebSphere. Если же вам не нравится закон, то вы с этим ничего поделать не можете. Причем пишутся законы на языке, на котором нельзя писать без багов и «программистами» которых мгновенно выгнали бы и из Microsoft, и из IBM, и из Sun. А в OpenSource просто по-дружески надавали бы по ушам за такой код.

Ну, и как вам это нравится? В большинстве случаев цели, которые преследуют законы, правильные. Во многих случаях их дизайн и реализация представляет из себя nuisance, цена которого для общества сравнима с проблемами, которые этот закон должен был предотвратить, причем часто он еще и не способен предотвратить оные по тем же причинам. Это и есть the power of nuisance, и о нем нельзя забывать обсуждая законы и их реализацию, в том числе, когда кто-то выражает сомнение в очередном благоглупом благопожелании.

***


blog comments powered by Disqus