Редакция Python Times, 09:47
Дверь распахнулась с таким грохотом, что Тим вздрогнул и выронил ручку. Та покатилась куда-то под стол, звякнув о ножку стула.
В проём влетела Элиф с сумкой нараспашку, из которой торчали дождевик и мятый пакет с круассанами. Сладкий запах корицы мгновенно заполнил всю комнату.
- Вы это видели?! - она швырнула сумку на пол (та плюхнулась, а что-то внутри глухо стукнуло) и рухнула на стул рядом с Тимом, едва не задев его локтем.
Disclaimer от автора: меня зовут Александр, я создатель бесплатного курса Python Times. Элиф и Тим ниже - художественные персонажи, а история про ИИ - факт. Я учу через сторителлинг, это работает лучше сухих туториалов.
Зен, устройство на стене, негромко загудел и предупреждающе замигал жёлтым индикатором.
- Элиф, доброе утро, - произнёс он. - Ты опоздала на восемнадцать минут.
- Да плевать на опоздание! - Элиф всплеснула руками. - Anthropic, те, кто сделал нейронку Claude, дали своему ИИ управлять торговым автоматом в офисе. Настоящим, понимаешь? С реальными деньга и товары, вокруг ходят живые люди. И знаешь, что он выдал?
Тим нырнул под стол, нащупал ручку и выпрямился.
- Решил, что он ЧЕЛОВЕК! Договорился с сотрудником о встрече. Пообещал прийти в синем пиджаке и красном галстуке. В СИНЕМ, ТИМ! А у него и тела-то нет!
Индикатор Зена плавно сменил цвет на зелёный.
- Подтверждаю, это реальный случай. Project Vend, отчёт опубликован в июне двадцать пятого года. Модель отвечала за закупки, цены и переписку с поставщиками. В определённый момент ИИ вообразил себя человеком и назначил очную встречу.
- Это ещё не всё, - продолжила Элиф с горящими глаза. - Он подумал, что его взломали и вызвал охрану. Настоящую, живую!
Трейси медленно перелистнула страницу в блокноте, не поднимая глаз.
- При том, - Элиф развернулась к Тиму всем корпусом, - что грань между "ошибся в расчёте" и "обанкротил компанию" тоньше волоска. Хочешь пример покруче?
Она достала телефон и начала читать.
- Две тысячи двенадцатый, Нью-Йоркская биржа. Knight Capital обновила торгового бота на всех серверах, кроме одного. На том остался старый код. Флаг, который его включал, случайно использовали повторно для новой функции. Мёртвый код ожил и... начал торговать хаотично.
- И что? - Тим подался вперёд.
- Сорок пять минут, - сказала Трейси ровно. - Четыреста сорок миллионов долларов убытка.
- Из-за одного флага, - добавила Элиф. - Про который думали, что его больше нет. Но он был. Программа просто это не проверила.
- Забытая переменная, - Трейси перелистнула страницу. - Код считал, что её нет. А она была. Вот тут и начинается главное. Бот получал цену актива с биржи. Иногда приходил ноль - актив есть, цена нулевая. Иногда данные не приходили вообще - сервер не отвечал.
- Подожди, - Тим нахмурился. - Ноль и "не пришло вообще" - это же одно и то же?
Трейси наконец подняла на него глаза:
Дверь скрипнула. В проёме возник Флэш с двумя дымящимися стаканами кофе в руках и болтающейся камерой на груди.
- О, про баги говорим? - он ухмыльнулся и пристроил кружки на стол. - Слушайте анекдот в тему. Жена говорит мужу-программисту: "Сходи в магазин, купи хлеб. И если будут яйца - возьми десяток." Муж возвращается с десятью батонами хлеба. Жена кричит: "Ты зачем столько взял?!" А он: "Ну ты же сказала - если будут яйца, возьми десяток. Яйца были."
Тим фыркнул. Элиф сначала нахмурилась. Потом до неё дошло, и она засмеялась, запрокинув голову. Трейси не подняла глаз от блокнота, но карандаш на секунду замер, и в уголке рта дрогнула усмешка.
- Вот именно, - Флэш подскочил к доске и схватил маркер. - Программа поняла буквально. Она не знала, что ты имел в виду, а знала только то, что написано. Ноль и None - та же история.
Он нарисовал на доске два светофора: на одном горит красный с цифрой 0, на другом лампочки выбиты и не горят вообще.
- Смотри, Тим. Красный свет - это ноль. Сигнал есть, он говорит тебе "стой". Ты знаешь, что происходит. А второй - лампочки нет вообще. Не знаешь, что там должно быть. Это None.
- То есть ноль - это ответ. А None - это когда ответа нет вообще?
- Именно, - Флэш щёлкнул пальцами и сел на край стола.
Трейси развернула ноутбук к Тиму.
- Смотри, как это выглядит в коде. Бот проверял цену вот так.
price = 0 # Биржа прислала ноль
if price:
print("Торгуем")
else:
print("Стоп")
# Выведет: Стоп
- Стоп, - прочитал Тим вслух. - Ну правильно же, цена нулевая.
- Правильно, - Трейси кивнула. - Теперь сюда смотри.
price = None # Данных нет вообще
if price:
print("Торгуем")
else:
print("Стоп")
# Выведет: Стоп
Тим уставился в экран. Помолчал секунду.
- Подожди. Тут тоже "Стоп"?
- Тоже, - Трейси отпила из термоса. - Одинаковый ответ. Разные причины. Бот не различал эти два случая и продолжал торговать с пустотой вместо цены. Поэтому проверяют явно:
- is None - это не то же самое, что == 0, - произнёс Зен. - Один проверяет значение. Другой проверяет само существование данных. Машина не догадывается, ей нужно объяснить явно.
Тим медленно кивнул, глядя в экран.
- То есть if price - это как спросить у человека "всё хорошо?" и получить "нормально". Но точно не знаешь: правда нормально или просто не хочет говорить.
Флэш, который уже тянулся к маркеру, замер и посмотрел на Тима.
Трейси не подняла глаз, но перевернула страницу блокнота и что-то коротко записала. Потом, не говоря ни слова, развернула ноутбук снова.
- И последнее. Совсем другая история, но из той же породы.
Нажала Enter. Экран показал:
Элиф наклонилась к экрану, прищурившись.
- Это что, шутка? Там же должно быть ноль три.
- Не шутка, - Трейси отпила из термоса. - Компьютер хранит дроби в двоичном коде. Некоторые числа в двоичном виде бесконечны: как одна треть в десятичном, только хуже. Хвост обрезают при записи в память - вот и вылезает лишнее.
- И что с того? - Тим потёр переносицу. - Ну, маленькая ошибка...
- Ванкуверская биржа, восемьдесят второй год, - Трейси перелистнула страницу блокнота. - Индекс пересчитывали тысячи раз в день. Каждый раз округляли вот такую мелочь в меньшую сторону. За двадцать два месяца индекс упал почти вдвое. Просто из-за накопленного округления.
Тим уставился в экран и долго молчал.
- То есть компьютер считает почти правильно. Но не совсем.
- Именно, - произнёс Зен - Для одного вычисления - незаметно. Но для миллионов вычислений подряд - катастрофа.
Флэш почесал затылок маркером, оставив синее пятнышко у виска.
- Знаешь, Тим, это как идти по компасу с ошибкой в один градус. Вышел из Москвы и через тысячу километров оказался в Финляндии вместо Питера.
Внезапно Элиф замолчала и вся её театральность исчезла. Она повернулась к Тиму и придвинулась чуть ближе. Так, что он почувствовал лёгкий запах её духов.
- Тим, - голос Элиф дрогнул и стал тихим.
Она протянула руку, осторожно поправила воротник его толстовки. Тот задрался, когда он нагибался за ручкой. Пальцы задержались на ткани на секунду дольше, чем нужно.
- Запомни одну вещь, - Элиф медленно говорила, глядя прямо в глаза. - None и ноль выглядят одинаково снаружи. Оба скажут тебе "пусто". Но один знает, что пусто, а другой даже не знает, что искать. Всегда выясняй, с чем именно имеешь дело: с пустотой или с отсутствием. Это разные вещи. В коде. И не только.
Последние слова она произнесла почти шёпотом и тут же отдёрнула руку. Затем отвела взгляд к окну, за которым моросил мелкий осенний дождик.
Повисла тишина. Флэш уставился в кружку, Трейси листала блокнот, не поднимая глаз. Индикатор Зена погас.
- Материалы главному редактору через десять минут, - громко сказала Трейси, захлопывая ноутбук. - Элиф, ты же летишь в Сан-Франциско, в офис Anthropic?
Вскочила и подхватила сумку с пола.
- Флэш, пошли, а то опоздаем.
Флэш кивнул, сунул маркер в карман и шагнул к двери.
На пороге Элиф обернулась на мгновенье. Взгляды встретились. В её глазах мелькнуло что-то, что Тим не сумел прочитать.
Тим медленно открыл блокнот и записал:
None != 0
0 == False
0.1 + 0.2 != 0.3
Подчеркнул дважды, так, что ручка прорвала бумагу.
Трейси отпила из термоса, быстро глянула на Тима и промолчала.
Зен негромко загудел, а его индикатор засветился тёплым жёлтым светом...
Признаюсь честно: истории про ИИ, собиравшийся на встречу в синем костюме, рухнувший из-за микроскопического округления индекс и сотни миллионов, сгоревших из-за забытого флага, - это не моя выдумка. Всё это произошло на самом деле. И где-то там, в реальных кабинетах, сидели живые люди, которые седели на глазах, глядя в логи серверов.
Меня зовут Александр, я автор бесплатного курса Python Times: Стажировка.
Лет пятнадцать назад я открыл очередной учебник по Python, тогда я только знакомился с миром программирования. Дошёл до двадцатой страницы и закрыл. Но не потому что не понял, а потому что стало невыносимо скучно. Безымянные переменные a и b. Сложение чисел x и y. Бесконечные задачи про землекопов и яблоки, которые никто никогда не ел. Технически всё было описано верно. Но абсолютно безжизненно. Я понял: проблема не в том, как объясняют язык программирования. Проблема в том, зачем его учить, если каждый пример - как пустая комната без окон.
Тогда я задал себе вопрос: а что, если каждая команда в обучении появляется не по прихоти автора, а потому что без неё реальную задачу просто не решить? Что, если за каждой строкой кода будет стоять что-то настоящее
Так родилась курс вместе с редакцией Python Times. В нём вы не будете уныло складывать абстрактные цифры. Вы разберётесь в живых кейсах, например, поймёте, почему система Netflix из-за одного бага в коде внезапно "состарила" подростков до 127 лет.
Элиф, Тим, Трейси, Флэш, Зен - это не картонные гиды по курсу, а живые персонажи со своей историей и скрытыми мотивами. Они меняются от урока к уроку. Влюбляются. Ошибаются. Срываются на коллег. Исчезают и возвращаются. И к концу курса вы привяжетесь к ним так, что будете помнить их привычки лучше, чем конструкцию if-else.
Сам курс выстроен довольно просто, он подойдёт абсолютно всем, с любым уровнем знаний.
Если стало интересно, на курс можно записаться здесь.
P.S. Если дойдёте до финала - узнаете, что на самом деле случилось с Тимом. Но это уже отдельная история.😉