Войти в почту

«Работает-работает, а потом вдруг перестаёт». Программисты — о страшных историях из жизни и практики

Геннадий Короткевич, аспирант Университета ИТМО, многократный победитель международных и всероссийских чемпионатов по спортивному программированию, самый титулованный спортивный программист планеты Однажды, году в 2009, я участвовал в сборах в белорусской олимпиаде школьников по информатике. Помню, что решал задачу «Скобки». Неважно, о чём была задача, но ответ мог быть очень большим числом, поэтому мне пришлось написать реализацию длинной арифметики. На Pascal. С нуля. Логично хранить длинное число как массив его цифр. Но можно хранить в каждой ячейке массива одну цифру, а можно — сразу девять, в одном числе. Второе, конечно, эффективнее. Оставалось только вывести ответ. Как это сделать: ну, взять и вывести эти числа, от старшего к младшему. Правильно? Вот такое решение я и отправил. На самом деле, неправильно. Если в каком-нибудь из этих чисел, кроме старшего, окажутся ведущие нули, то они потеряются. Поэтому нужно аккуратно проверить, что в каждом числе в массиве — девять знаков, а если нет — дополнить нулями. Мне повезло, что я успел быстро это придумать. Исправил. Написал программу для тестирования. Внимательно протестировал. Не нашёл больше ошибок. После окончания соревнования оказалось, что я получил за эту задачу 16 баллов из 100. Почему? Я забыл отправить исправленное решение. Отправил в тренировочном режиме уже после окончания олимпиады. 100 из 100. Мораль: используйте встроенную длинную арифметику, когда можете. И внимательно проверяйте, какое решение отправляете. Григорий Бакунов, директор по распространению технологий «Яндекса» Одно из самых мистических и пугающих происшествий произошло со мной летом 2007 года. Тогда у нас было несколько дата-центров, в которых уже стояли первые тысячи серверов. Один из них недавно перевезли из одного дата-центра в другой и включили. С этого момента начались странности. Сначала компьютер все время был в сети и работал. Однако стоило к нему подключиться, через 20-30 секунд соединение рвалось. За это время можно успеть выполнить пару команд и понять, что происходит, что мы вчетвером и пытались делать. И вот представьте себе, подключаетесь вы к компьютеру, выполняете команду, например «покажи список файлов». Он показывает, потом проходит несколько секунд — и компьютер рвет соединение. Вы подсоединяетесь снова, выполняете ту же команду, а список файлов ДРУГОЙ! При этом все работает, программы выполняются, огоньки мигают, система проверки доступности говорит, что сервер все время в сети. Что мы только ни делали. И перезагружали. И пробовали поменять версию ядра операционной системы — не помогало. Вот, буквально, один раз — одна версия ядра, отсоединяет, бац — другая! Честное слово, мы тогда чуть не поседели. Разгадка пришла к нам случайно. Оказалось, что вместо того чтобы перевозить компьютер из одного дата-центра в другой, младшие админы просто скопировали все данные на дисках и воткнули их в новом дата-центре. Понимаете? Да! А старый компьютер при этом не выключили. В одной сети одновременно были два компьютера с одним и тем же адресом. Раз в несколько десятков секунд соединение рвалось, и нас просто перебрасывало на другой компьютер. Максим Буздалов, руководитель Лаборатории «Эволюционные вычисления» Университета ИТМО, чемпион мира по программированию Представьте себе осеннее поле, на нем — холм, на холме — дерево, под ним на табуреточке сидит зябнущий молодой человек и нервно стучит по клавиатуре ноутбука. Первая мысль — совсем, мол, заработался, даже на природе расслабиться не может. И лишь доносящееся откуда-то сверху настойчивое жужжание наводит на мысль: что-то здесь неладно. Метрах в двадцати справа, метрах в десяти над землей в меру неподвижно висит квадрокоптер. Знакомьтесь, Parrot AR.Drone 2.0. По современным меркам — крайне устаревший агрегат, дальность полета 50 метров — в общем, как говорится, «не Фантом». Но одно достоинство у него не отнять — открытый исходный код протокола управления. Если очень захотеть, управление этим дроном можно написать воистину с нуля. Отладкой именно такого самописного приложения для управления дроном в данный момент и занят молодой человек на табуреточке. А нервничает он не только из-за того, что доверил судьбу летательного аппарата собственноручно написанному коду. Все дело в том, что этот код спятил, в консоли — сплошные ошибки, а дрон не реагирует ни на какие команды. И пока он висит в воздухе, надо успеть понять, почему это случилось, исправить ошибку, запустить приложение заново и безопасно этот дрон посадить. Это вам не пять часов, отведенных на олимпиаду по программированию, а максимум минут десять, и то — до первого порыва ветра! Хорошо, что в этот раз все закончилось удачно и взбесившийся код удалось обуздать. А вот с предшественником этого дрона все вышло иначе: он «сорвался с крючка» беспроводного соединения и был унесен ветром в ближайший лес, где повис на высоком дереве. Молодой человек вспомнил, что в официальном приложении была функция «подергать дрон в разные стороны», и — в глухом лесу, хоть и с ноутбуком, но уже без табуреточки! — начал копаться в мануалах и пытаться эту функцию реализовать уже в своей программе. К сожалению, в тот раз попытка привести дрон в чувства обернулась фиаско... Это все хобби, а такое бывает и в реальной жизни. И пусть в случае космического аппарата НАСА «Вояджер-2» — когда в 2010 году, спустя 33 года полета в космосе, он вдруг стал посылать на Землю что-то невообразимое вместо результатов измерения физических величин — счет шел не на минуты, расстояние от аппарата до Земли тоже измерялось совсем не в метрах и понять в таких условиях, в чем дело, было непросто. Цена ошибки была бы велика: «Вояджер» — это один из двух аппаратов для исследований самых дальних планет Солнечной системы. Если бы он окончательно вышел из строя, на то, чтобы «повторить эксперимент» — создать подобный аппарат и дождаться, пока он долетит до той же точки — ушло бы лет 15-20, не говоря уж о финансовых потерях. Тем не менее, проблема была идентифицирована (оказалось, подвела оперативная память — она не вечна даже у космических аппаратов), управляющая программа переписана и успешно передана — на расстояние в миллиарды километров! — и «Вояджер» снова в строю! Борис Минаев, руководитель команды «Базы данных» «ВКонтакте», чемпион мира по программированию В жизни разработчика иногда так бывает: когда что-то работает-работает, а потом вдруг перестаёт. У нас «ВКонтакте» есть самописная система сбора метрик, которая помогает следить за статистической информацией о действиях аудитории в режиме реального времени и присылает нам оповещения. Например, «пользователи начали отправлять на 15% меньше сообщений, наверное, что-то сломалось», а на самом деле просто начался матч Россия — Хорватия. У этой системы сложная структура. VK пользуются десятки миллионов человек, поэтому данных очень много и поместить их сразу в базу не получится. Вместо этого мы собираем метрики на каждом сервере, раз в минуту передаём их в коллекторы (хеш-таблицы, которые хранят 64-битный ключ и его количество), раз в несколько часов — в следующие коллекторы, и только потом — в базу данных. Однажды в полночь (в лучших традициях фильмов ужасов) коллектор перестал отвечать на запросы. Перезапуск помог решить проблему, но через пару дней история повторилась, и мы решили копнуть глубже. Неполадки не влияли на пользователей VK, но усложняли работу нашей команды. Мы подключились к коллектору: сначала всё было хорошо, но потом хеш-таблица зависла, а добавление каждого следующего элемента шло в несколько тысяч раз дольше, чем обычно. И только через восемь часов скорость добавления как ни в чём ни бывало упала до привычных значений. Тут мы заметили, что ячейки проблемной таблицы занимались очень неравномерно — почти все значения попадали в её первую половину. Оказалось, что если объединять несколько хеш-таблиц в одну (например, брать первые 10% от десяти хеш-таблиц и агрегировать их вместе), то получится одна таблица размером с исходную, но ключи элементов будут совпадать гораздо чаще! Из-за этого таблица заполнялась неравномерно, коллизий становилось всё больше, а время добавления отдельного элемента — всё дольше. Поправить это оказалось совсем легко — когда мы начали использовать разные хеш-функции в разных таблицах, элементы стали распределяться равномерно. Екатерина Боглаева, руководитель пресс-службы Университета ИТМО По-моему, самое страшное в программировании — это не возможное «восстание машин», а пресловутый человеческий фактор. Я училась на гуманитарном факультете, но в техническом вузе — ЛЭТИ. У нас в университете была информатика (вуз обязывает!), и мы там писали простые программки, кажется, на языке Pascal. Как-то раз я готовилась к зачёту — конечно же, ночью. Нужно было написать программу, выполнявшую три команды, одна из которых — форматировать дискету (да, давно это было...). На дискете же надо было принести сделанную домашку. Я в ночи воспалённым мозгом подумала: «Наверняка забуду с утра скопировать». И решила писать программу прямо на дискете. Писала, мучилась. Ура, закончила — надо протестировать. Программу я написала хорошо. Годно. Эта дрянь сама себя отформатировала! С тех пор я сама программы не пишу. Только пиарю. Иван Ямщиков, AI-евангелист ABBYY, научный сотрудник Института Макса Планка в Лейпциге, автор подкаста «Проветримся!» Одна из самых распространенных «страшилок» про технологии – то, что искусственный интеллект может сойти с ума и поработить мир. Два года назад СМИ подхватили «сенсационную» новость о том, что искусственный интеллект Facebook вышел из-под контроля, начал общаться сам с собой на собственном, ему одному понятном языке, и его пришлось отключить (вот, например, статья в Huffington Post). Рассказываю, что произошло на самом деле. Ученые создали алгоритм, с помощью которого пытались выяснить, может ли нейросетка посредством машинного обучения сконструировать язык коммуникации. Что представляла собой среда, которую эмулировали ученые? Это был квадратик, по которому бегали две точечки – красная и синяя; также там был крестик, куда одна из них должна была прибежать. Красная точка должна была оказаться там, а синяя видела, где крестик находится, но бегать не могла — зато она была способна отправлять красной строчки текста. Ученые пытались обучить систему работать так, чтобы синяя точка могла указывать путь и направлять красную до нужного места. Через некоторое время двум этим точкам удалось добиться того, что определенная строка текста стала у них обозначать направление «вверх», другая — «вправо», третья — «налево», а четвертая — «вниз». После этого эксперимент был признан успешным, люди написали про это научную статью и, естественно, выключили сервер. Всё! Но фантазия журналиста, как известно, превосходит фантазию ученого, поэтому в СМИ написали, что исследователи всё отключили, чтобы ничего не вышло из-под контроля и не началось восстание машин. Андрей Бреслав, руководитель проекта Kotlin в компании JetBrains Kotlin популярен во многом благодаря тому, что спасает людей от ошибок. Можно сказать, что он существует благодаря ошибкам, которые делают программисты на других языках. Например, пожалуй, самая известная из всех типов ошибок — так называемая «ошибка на миллиард долларов» (которая, как говорят, за время своего существования привела к огромным убыткам) «Ошибка на миллиард долларов» («the billion dollar mistake») обязана этим названием своему автору, английскому ученому сэру Тони Хоару. В 1965 году он он проектировал комплексную систему типов ссылок для одного из языков программирования, и его целью было гарантировать, что любое использование всех ссылок будет абсолютно безопасным. Но, как признался автор, он «не устоял перед соблазном добавить ссылку null, просто потому что это легко реализовать». «Изобретение» повлекло за собой море ошибок, уязвимостей и системных сбоев, которые, по словам ученого, наверняка принесли ущерб в миллиарды долларов в последующие сорок лет — в 2009 году, выступая на конференции, он публично за это извинился.: разыменование нулевой ссылки. Излагая простым языком, суть в том, что программа должна что-то прочитать или записать по какому-то адресу в памяти, а такого адреса нет. Что делать дальше, непонятно, и программа аварийно завершается. Пользователь это может видеть как угодно: нажал какую-то кнопку, а программа вместо того, чтобы сделать то, что от нее хотели, закрылась. Или не сделала ничего. Или выдала сообщение об ошибке. Или сайт не открылся. Или сообщение не отправилось. И так далее. Создавая свой язык программирования, мы предусмотрели способ защититься от подобного рода проблем. В общем, Kotlin — полезная штука. Помогает сэкономить.

«Работает-работает, а потом вдруг перестаёт». Программисты — о страшных историях из жизни и практики
© RB.ru