В честь Дня программиста мы решили немного расслабиться и перечитать любимые рассказы Айзека Азимова. И тут нас ждало открытие: оказывается, писатель-фантаст более полувека назад достаточно точно описал многие реалии современной разработки. Как это возможно, спросите вы? Давайте разберёмся вместе.
Из множества рассказов знаменитого фантаста показательна серия о компании «Ю. С. Роботс» и её сотрудниках. Несколько историй повествуют о буднях испытателей Пауэлла и Донована – своего рода тестировщиков роботов, другие – о главном робопсихологе, докторе Кэлвин. Спектр проблем, с которыми они сталкиваются, широк и знаком многим современным их коллегам по сей день.
Одна из таких распространённых проблем – неточно сформулированное в таске техзадание. У Азимова эта тема встречается не раз, и неудивительно – его роботы гораздо умнее и «человечнее», чем современные нам машины, и работающие с ними люди легко забывают, что робот мыслит иначе. В результате небрежная постановка задачи может обернуться бедой, как и случилось в рассказе «Хоровод».
А начиналось всё, как казалось испытателям, вполне удачно. Чтобы привести в порядок заброшенную базу на Меркурии, всего-то и надо килограмм селена для починки фотоэлементов. И будет электроэнергия, а с ней – охлаждение базы, без которого на Меркурии никак не уцелеть. Селена же в округе полно, целые озёра… Только отправленный к ближайшему из них робот спятил и бегает кругами, хуже того – несёт пьяный бред, хотя роботы не пьют. В ходе вылазки наружу с риском прожариться герои выясняют, что робот наткнулся на опасные для себя условия по пути к озеру. Но ведь есть прямой приказ, в чём же дело?
– Я сказал… Постой… Я сказал: «Спиди, нам нужен селен. Ты найдёшь его там-то и там-то. Пойди и принеси его». Вот и всё. Что же ещё я должен был сказать?
– Ты не говорил, что это очень важно, срочно?
– Зачем? Дело-то простое.
Эта «простота» привела к дилемме в программе робота: приоритет выполнения «неважной» задачи оказался ниже, чем чувство самосохранения (Третий закон, который предписывает избегать повреждения). В результате робот зациклился на выборе, выполнить приказ или уцелеть, и исправлять свою ошибку горе-испытателям пришлось рискованными действиями – обратившись к имеющему наивысший приоритет Первому закону. Проще говоря, подвергнув себя опасности и вынудив робота отложить другие задачи и броситься спасать хозяев. После такого опыта испытатели подошли к техзаданию более вдумчиво – и всё прошло как по маслу:
– Я посылал его к другому селеновому озеру – на этот раз с приказом добыть селен во что бы то ни стало. Он принёс его через сорок две минуты и три секунды, – я засёк время.
После Меркурия новое назначение кажется героям не таким опасным (на межпланетной станции, где происходит действие рассказа «Логика», куда прохладнее, всего «двести семьдесят три градуса ниже нуля»), но столкнуться им предстоит с проблемой, которая разработчикам может разве что привидеться в кошмарах. По крайней мере ни одна программа пока не заявила создателям, что столь несовершенные существа не могли её написать.
Однако робот Кьюти, новая разработка для обслуживания преобразователя энергии, в причастность людей к своему созданию не поверил. Ну правда, как же могут эти слабые существа создать нечто более совершенное, чем они сами? Это нелогично. У него есть более правдоподобная версия:
– Господин сначала создал людей – самый несложный вид, который легче всего производить. Постепенно он заменил их роботами. Это был шаг вперёд. Наконец, он создал меня, чтобы я занял место ещё оставшихся людей. Отныне Господину служу Я!
Герои пытаются переубедить робота, апеллируя и к книгам, и к фактам (как им кажется), доказывающим существование Земли. Даже сборка нового робота в присутствии Кьюти не даёт результата – не убедили. Возможно, виной тому отсутствие у робота прошитых в позитронный мозг постулатов о его происхождении и целях. Эту архитектурную ошибку легко объяснить – вряд ли разработчики всерьёз ожидали, что робот усомнится в доводах людей. Но недоработка, не игравшая роли в предыдущих поколениях продукта, в новом привела к созданию другой цепочки постулатов в мозге машины:
– Не верит, – грустно согласился Пауэлл. – Это же рассуждающий робот, чёрт возьми! Он верит только в логику, и в этом-то всё дело…
– В чём?
– Строго логическим рассуждением можно доказать всё что угодно – смотря какие принять исходные постулаты. У нас они свои, а у Кьюти – свои.
Однако, несмотря на то что робот воспринимает свою задачу через другие переменные, он полностью выполняет свои функции. Просто он делает это не потому, что ему это приказано людьми, а потому, что такова воля Господина.
И люди оказываются перед классической дилеммой: стоит ли исправлять что-то, если оно работает? Вот и герои, подумав, пришли к выводу — не стоит:
– Конечно, но дело-то не в этом. Нельзя же, чтобы он продолжал нести эту чепуху про Господина.
– А почему бы и нет?
– Потому что это неслыханно! Как можно доверить ему станцию, если он не верит в существование Земли?
– Он справляется с работой?
– Да, но…
– Так пусть себе верит во что ему вздумается!
Третий рассказ про испытателей – «Поймать кролика» – хорошо показывает, что бывает, когда продукт не проходил нагрузочное тестирование перед выходом. История описывает полевые испытания робота-рудокопа Дейва, причём новой конструкции – составного (один робот-командир управляет шестью другими роботами, как рука – пальцами). Но стоит роботу остаться без присмотра, как он перестаёт работать. Более того, пускается маршировать всей командой – весьма подозрительное занятие для рудокопа.
Лучше всего проблему испытателей описывает цитата из самого рассказа:
– Правильно. Теперь слушай – тут вот какая логика! – Донован начал загибать волосатые пальцы. – Первое: новый робот прошёл все испытания в лаборатории. Второе: «Ю. С. Роботс» гарантировала, что он пройдёт и полевые испытания на астероиде. Третье: вышеупомянутых испытаний робот не выдерживает. Четвёртое: если он не пройдёт полевых испытаний, «Ю. С. Роботс» теряет десять миллионов наличными и примерно на сотню миллионов репутации. Пятое: если он не пройдёт испытаний и мы не сможем объяснить почему, очень может быть, что нам предстоит трогательное расставание с хорошей работой.
Под угрозой потери хорошей работы тестировщик способен на многое – факт. Герои рассказа перебрали и отвергли множество вариантов проверки – от unit-тестирования на месте (можно было бы разобрать его на части и проверить по отдельности, но есть всего 10 дней и ещё неизвестно, даст ли это что-нибудь) до специального тестового окружения (которое есть, но на далёкой Земле и весит 10 тонн). Что остаётся? Имитировать условия, при которых появляется баг, и искать, искать причину. Такова, увы, доля многих тестировщиков современности. Правда, им повезло больше – в отличие от героев рассказа, нынешним специалистам хотя бы не приходится для этого умышленно взрывать шахту вместе с собой. Зато под завалом камней человек и думает куда эффективнее, и хорошо, что разработчики пока не взяли на вооружение этот приём.
Подстроенная авария помогла не только вызвать баг, но и догадаться о его причине и даже экстремально – подрывом одного из «пальцев» робота – снизить нагрузку и устранить проблему:
– Я и говорю. Команды, отдаваемые одновременно по шести каналам! В обычных условиях один или несколько «пальцев» выполняют несложную работу, которая не требует пристального наблюдения за ними. Ну, точно так же, как наши привычные движения при ходьбе. А в чрезвычайных обстоятельствах нужно немедленно и одновременно привести в действие всех шестерых. И вот тут что-то сдаёт. Остальное просто. Любое уменьшение требуемой от него инициативы, например появление человека, приводит его в себя. Я уничтожил одного из роботов, и Дейву пришлось командовать лишь пятью, инициатива уменьшилась, и он стал нормальным!
Впрочем, не только испытателям-«тестировщикам» достаются сложные задачки в рассказах Азимова. В рассказе «Как потерялся робот» главному робопсихологу Сьюзен Кэлвин приходится искать не неисправность, а робота целиком. Нет, он не пропал бесследно – спрятался среди других таких же и притворился одним из них. Только из 63 роботов 62 говорят правду, а один лжёт, и это серьёзный баг.
Причину срыва находят быстро: в программу робота заказчик внёс изменения. И не куда-то там, а в ключевую её часть – в формулировку Первого закона. Новый робот уже не обязан защищать человека (чтобы не лез за учёными в гамма-лучи и не портился). Но, как это часто бывает и в реальной жизни, такие несогласованные изменения, сделанные без ведома ведущего специалиста, чреваты скверными последствиями. В данном случае вмешательство нарушило прежде чёткую логику действия законов, и некогда отлаженная система стала нестабильной. Так что эмоциональный приказ «уйди и не показывайся, чтобы я тебя больше не видел» даёт роботу лазейку, он подчиняется – и делает всё, чтобы выполнить команду.
Приходится разработать серию тестов на следование Первому закону и подстроить ловушку, основанную на другом баге изменений в программе робота – не свойственном обычным машинам чувстве собственного превосходства:
– Мы с вашим молодым мистером Блэком приготовили небольшой сюрприз. Видите ли, пространство между мной и роботами было залито не гамма-лучами, а инфракрасными. Обычным тепловым излучением, абсолютно безобидным. Нестор-10 знал это и ринулся вперёд. Он ожидал, что и остальные поступят так же под действием Первого закона. Только через какую-то долю секунды он вспомнил, что обычный НС-2 способен обнаружить наличие излучения, но не его характер. Что среди них только он один может определять длину волны благодаря обучению, которое он прошёл на Гипербаэе под руководством обыкновенных людей. Эта мысль не сразу пришла ему в голову, потому что была слишком унизительной для него. Обычные роботы знали, что пространство, отделявшее их от меня, гибельно для них, потому что мы им это сказали, и только Нестор-10 знал, что мы лгали. И на какое-то мгновение он забыл или просто не захотел вспомнить, что другие роботы могут знать меньше, чем люди… Комплекс превосходства погубил его.
Поиском багов герои вынуждены заниматься и в рассказе «Риск». Проверке подлежит корабль с гипердвигателем, который на испытаниях почему-то не прыгнул. Для людей такие прыжки опасны, поэтому корабль пилотировал робот. Теперь же следует отправить кого-то на корабль, чтобы выяснить причину сбоя.
В этом рассказе поднято несколько проблем программирования. Во-первых, тестирования – автоматизированного (в данном случае – силами робота) или ручного (учёного). Робот на первый взгляд кажется более подходящим вариантом – машина быстрее и надёжнее человека-специалиста. Но робопсихолог настаивает на проведении проверки человеком. Позже она разъясняет свою позицию так:
– О том, что вы должны были понимать, почему роботу давать это задание нельзя. Вы же сами сказали: несовершенство робота приходится компенсировать изобретательностью и разумом человека. Именно так, молодой человек, именно так. Роботы лишены изобретательности. Их интеллект ограничен и может быть полностью просчитан. В этом, собственно, и состоит моя работа.
Получив приказ, точный приказ, робот его выполняет. Если приказ неточен, он не в состоянии исправить ошибку сам. Вы ведь сами говорили об этом, вернувшись с корабля. Так как же посылать робота искать неисправность, если мы сами не знаем, в чем она состоит, а значит, и не можем дать ему точного приказа? «Найди неисправность» – такой приказ можно дать только человеку, но не роботу. Возможности человеческого мозга, пока по крайней мере, точному просчёту не поддаются.
Отчасти эти принципы актуальны и сейчас – хотя автоматизированное тестирование применяется всё шире и обладает множеством преимуществ, в некоторых ситуациях по-прежнему ручное тестирование имеет смысл и позволяет выявлять проблемы, которые в силу их специфики сложно найти с помощью машин. В рассказе роботу невозможно подготовить полноценный сценарий поиска бага, поскольку нет понимания, что конкретно могло произойти на корабле, и неучтённые возможные проблемы он просто не заметит. А вот человек может сориентироваться уже на месте, исходя из увиденного и опираясь на свои умозаключения.
Во-вторых, рассказ вновь поднимает вопрос корректного техзадания. Именно в нём крылась причина бага – алгоритм запуска двигателя роботу был прописан без учёта его отличий от человека. В результате, следуя неправильно сформулированной команде, он перестарался – и разломал пусковой механизм:
– И если бы робот не был надёжнее человека, всё было бы в порядке. К сожалению, на «Ю. С. Роботс» считали своим долгом сделать робота надёжнее человека. Роботу было приказано крепко схватить рычаг, притянуть его к себе и держать. Крепко! Это слово было выделено, повторено, подчёркнуто. И робот выполнил приказ. Но вот незадача: робот раз в десять сильнее человека, в расчёте на которого был сконструирован рычаг.
– Вы хотите сказать…
– Я не хочу сказать, а говорю, что рычаг погнулся. Погнулся вполне достаточно для того, чтобы сместить спусковой механизм. И когда тепло рук робота сместило термоэлемент, контакта не произошло…
Подобных рассказов, отчасти кажущихся устаревшими, но во многом предвосхитивших события будущего, немало и у Азимова, и у других писателей. Жаль только, что таких высокоразвитых роботов у нас всё ещё нет, а проблемы и дедлайны всегда с нами, это великий фантаст подметил верно.
jedecuz
При всей изрядной наивности этого цикла он затрагивает довольно глубокую тему: «люди могут сотворить исскуственный разум, но как собственно человечество будет обходиться с этим своим творением?»