Состояние программирования сегодня

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

Мне повезло, что наша компания занималась такими делами. Последние несколько лет мы строили модели, предсказывающие поведение покупателя на основе накопленных данных. Основы подхода довольно просты. Выбираешь из базы данных информацию о своих покупателях за предыдущие, скажем, полгода – в период между один месяц назад и семь месяцев назад (последний месяц оставляешь для тестирования модели). Кстати, на сайт нашей компании приходило по 150 тысяч человек в день, так что данных у нас было много. Каждого покупателя ты можешь описать, скажем, тридцатью параметрами – имя, адрес, возраст, образование, и т.д. И каждому добавляешь несколько “флагов да/нет” – купил или нет определенный продукт, посмотрел ли определенное объявление, пробыл ли на сайте дольше 30 секунд и т.п. Все эти данные прогоняешь через алгоритм машинного обучения и получаешь модель, предсказывающую для каждого нового покупателя вероятность тех действий, которые ты описал флагами. То есть модель подсчитывает вероятность каждого из действий на основе прошлого опыта и данных нового покупателя. Полученную модель тестируешь на данных последнего месяца, погоняешь кое-какие параметры, чтобы предсказания были понадежнее – и все – можешь теперь использовать эту модель для увеличения продаж. Ну, там, показываешь новому покупателю рекламу продуктов, которые он вероятно купит и убираешь в сторонку те, которые ему, скорее всего, не нужны. Я был удивлен, когда увидел насколько повышается таким образом объем продаж.

Вот примерно в этом и заключается машинное обучение. Ну, конечно, тут используется много математики. И данные свои ты должен хорошо знать: зависят ли они друг от друга? насколько они отражают реальность (процент ошибок в данных)? нет ли дубликатов? какой алгоритм лучше применить? И ты должен знать область применения и ограниченность каждого из алгоритмов и его скорость. А потом чисто программистские заботы начинаются: как обработать большое число данных побыстрее? Одного – даже очень мощного – компьютера может не хватить. В нашей компании, например, потребовалось 27 много-процессорных машин для того, чтобы уложится в требуемое время обработки. А в таких компаниях, как Google и Amazon, много тысяч компьютеров задействованы одновременно.

“Большие” данные теперь стали повседневной заботой для многих. Последняя версия языка Java включает в себя уже конструкции для параллельной асинхронной обработки данных. Новые – “неблокирующие” – сервера теперь берут на себя заботы по многопоточности (multithreading), но программист должен следить за тем, чтобы структура данных и алгоритмы не мешали параллельной обработке. Слова “реактивное”, “динамическое” и “функциональное” теперь почти всегда стоят перед словом “программирование”.

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

Самым интересным для меня во всем этом было обнаружить, что моя интуиция о данных очень часто проигрывает алгоритмам машинного обучения. Я привык думать, что компьютер – это просто большой калькулятор, быстро выполняющий то, что человек тоже мог бы сделать в принципе. Теперь же я убедился, что возможность некоторых решений даже не приходит в голову ни мне, ни одному из моих коллег. У нас просто нет такой интуиции, чтобы пойти в том направлении, где алгоритмы находят устойчивые предсказания. При этом я даже не имею ввиду “глубокое” машинное обучение, когда компьютеру дано право решать, какие параметры включать в описание объекта. Даже “неглубокое” обучение поражает своими решениями.

В результате, друзья мои, я вынужден признать свою немощность по сравнению с искусственным интеллектом. И это даже не вопрос моего мнения. Это просто факт, с которым вынужден смириться каждый, кто работает в этой области. Гонка проиграна. Человек может продолжать считать себя хозяином положения, но он не может сравниться с компьютером в своей способности понимать, что происходит вокруг. Ну, зависит, конечно от того, что мы вкладываем в понятие “понимать”. Сегодня мы не даем компьютерам большой свободы действий на основе их знания, но через несколько лет, я думаю, картина очень изменится.

И тут необходимо вспомнить о последних открытиях в физике. Раньше мы привычно считали, что наука помогает нам познать природу вещей. Физики говорили о структуре материального мира, о силах, причинах и следствиях. Затем мы вынуждены были признать, что мы не в состоянии понять эту “природу”. Все, что мы можем, это предсказывать поведение материальных объектов используя формулы, называемые законами (если, конечно, они не слишком часто меняются). Мы знаем, что из данного состояния объект может перейти в другое и предсказать это новое состояние, но почему объект делает это, мы не знаем, даже если мы введем понятие “Бог”. Потому что мы по-прежнему не в состоянии объяснить, почему он решил действовать именно так. Бедные-бедные школьники. Я помню, как мы все мучились, пытаясь объяснить физические явления на уроках физики. А ведь от нас не объяснение требовалось, а запоминание слов и предложений, которые надо произнести в качестве объяснения.

За последнее десятилетие понимание этого (за что раньше выгоняли из класса и ставили двойки) стало практически общепринятым. Многие физики признали что наша вселенная “вычислимая”: физика описывает поведение мира не в терминах “причина-следствие”, а как вероятность перехода из одного сосотояние в другое, в то время как сама природа объектов остается непознанной и непознаваемой в принципе.

Как многие из вас знают, я начал свою профессиональную карьеру именно в качестве физика. Затем Валерий Попов, тоже физик, выпускник МИФИ, увлек меня моделированием поведения реальных объектов и процессов на компьютере, и я стал программистом. В качестве методологии моделирования мы пытались использовать объектно-ориентированный подход в то время, когда объектно-ориентированных языков еще не существовало.

Поэтому, когда появилась Ada, потом C++ и Java, я уже был к ним хорошо подготовлен и легко адаптировался к новым принципам программирования, создавая объекты, которые выполняли вычисления над своим состоянием в тишине цифрового пространства. И теперь, за последние пять лет, большие данные заставили нас пройти еще дальше по пути увеличения числа независимых агентов, которые обрабатывают потоки данных (состояния) и находят зависимости между ними. А ведь это практически научная деятельность, не правда ли? Мне, во всяком случае, это очень напоминает работу физика, ищущего новые законы.

Если это действительно так, то я надеюсь, что физика и программирование будут сведены в единый раздел науки, и я опять стану физиком, если даже и частично. Вот было бы здорово! Конечно, это случится не очень скоро, но Обри ди Грей обещает, что мы будем жить 1000 лет (даже если мой друг John Graham называет это обещание “hogwash” – “фигня” по-русски).

P.S. Новую работу я нашел за две недели. Она требует всего того, о чем я здесь написал. Я расскажу вам потом, что из этого всего у меня получилось.

Чеширский Кот улыбается
Но юмор всегда останется
чисто человеческим занятием!
Недавно была опубликована статья
Мы все имеем чувство юмора:
Предсказание и понимание визуального юмора
,
которая демонстрирует, что
с помощью машинного обучения
компьютер может распознать юмор.
Присылайте свои комментарии в ответ на мою рассылку новостей, и я их помещу здесь.
Если вы не получаете мою рассылку, то подпишитесь через закладку Подпишитесь.

Powered by WordPress. Designed by Woo Themes