[Перевод] От Ericsson к WhatsApp: история Erlang
Эта статья посвящена увлекательной истории развития одной технологии, создатели которой в конечном счёте от неё отказались, и она волей судьбы попала в руки заботливых и верных энтузиастов. В итоге, почти через тридцать лет после своего рождения, она стала основой одного из самых значительных и прибыльных стартапов 2010-х.
Сегодня эта технология играет ключевую роль в сервисах, используемых миллиардами людей по всему миру.
Речь идёт о языке программирования Erlang.
Чем интересен Erlang? Одним из его аспектов, который мы осветим в статье, будет невероятная экономическая ценность и польза этого языка. Erlang рассматривался преимущественно с позиции любопытства, пока небольшая группа предприимчивых инженеров не использовала его для создания стартапа, который в последствии они продали за миллиарды долларов.
История Erlang также демонстрирует нам некоторые важные моменты:
- Распространение аппаратного и программного обеспечения общего назначения на такие специализированные области, как телекоммуникации.
- Насколько сильными могут оказываться отдельные разработчики и малые команды, когда используют правильные программные инструменты.
- Высокая отказоустойчивость опенсорсного ПО.
- И другие.
Эта статья о языке программирования, а также о том, как программное обеспечение может делать доступными большинство аппаратных ресурсов и обеспечивать связь между компьютерным и телефонным оборудованием.
Итак, что такое Erlang? Как он появился и почему недавно к нему вновь разгорелся интерес?
Начнём с места его рождения — Стокгольм, Швеция.
▍ Ericsson
Достаточно взрослые читатели могут помнить мобильные телефоны Ericsson, которые были популярны во времена, когда ещё не было смартфонов. Сегодня бизнес Ericsson сосредоточен на телекоммуникационном оборудовании.
Эту компанию в 1876 году основал Ларс Магнус Эрикссон в Стокгольме. В 1878 она начала выпускать и продавать телефоны и распределительные щиты. В течение последующих десятилетий успехи Ericsson были переменчивыми и после периода финансовых затруднений компанию спасли банки, управляемые семейством Валленбергов. К 1960-м годам Валленберги получили полный контроль над Ericsson.
Мы уже упоминали эту компанию в рассказе (англ.) про первый компьютер RISC, IBM 801. Суть в том, что владельцы IBM хотели войти на рынок связи и рассматривали вариант объединения усилий с Ericsson. Тогда их компания как раз разработала новый компьютер, который и должен был послужить точкой соприкосновения. Однако после серии секретных встреч в лондонском отеле Claridges вся эта затея закончилась ничем.
▍ Научная компьютерная лаборатория Ericsson
Но телефонии в целом и компании Ericsson, в частности, требовались компьютерные вычисления.
В 1980 году небольшая группа инженеров Ericsson — Бьярне Дакер, Майк Уильямс, Гёран Боге и Севед Торстен-даль — предложили создать на базе компании научную компьютерную лабораторию (CSL, Computer Science Laboratory). Перед ними стояла задача разработать программное обеспечение для будущих систем связи и внедрить эту технологию в существующие системы Ericsson.
Их инфраструктура сочетала в себе стандартные компьютеры и специализированное аппаратное обеспечение для телекоммуникаций — миникомпьютер DEC VAX 11/750 под управлением Unix, подключённый к телефонной станции Ericsson.
Изначальная конфигурация, использованная для разработки Erlang на VAX 11/750, подключённом к телефонной станции Ericsson
В контексте этой исходной конфигурации они и разработали Erlang.
Ранее для программирования систем связи в компании использовались различные языки, включая PL163, CHILL и изменённые версии Pascal.
Теперь же команда начала рассматривать и другие языки программирования, каждый из которых привносил свою специфику. К этим языкам относились популярные вроде Ada и менее известные вроде Concurrent Euclid, PFL, LPL, OPS4, Frames и CLU.
По мере продвижения команде стало ясно, что ни один из этих языков сам по себе не способен покрыть все потребности компании.
В 1985 году к коллективу присоединились Джо Армстронг и Роберт Вирдинг.
Затем в 1988 лаборатория переехала из Ericsson в компанию Ellemtel, ставшую их совместным предприятием со шведским национальным оператором связи Televerket.
Теперь акцент сместился на создание ПО для программирования AXE, телефонной станции Ericsson, которая на тот момент программировалась с помощью PLEX. Целью было «Создать нечто подобное PLEX, чтобы оно работало на стандартном оборудовании, но более эффективно».
При этом было важно перенести в новое ПО некоторые возможности PLEX. В частности, как говорил Армстронг:
«В первую очередь у нас должна быть возможность изменять код на лету. Иными словами, операции изменения кода должны производиться без остановки системы».
Программные системы нужно было обновить новым кодом, заменив им старый. Телефонную систему нельзя остановить полностью на время, пока в неё вносится часть кода. Потребители окажутся явно недовольны, если вдруг потеряют возможность совершать звонки.
Новый язык также был необходим для поддержания множества одновременных активностей, поскольку звонки маршрутизировались между пользователями, и это должно было происходить эффективно. Опять же, со слов Армстронга, язык должен был воспроизвести коммутационные возможности имевшихся систем связи:
«Система коммутации состоит из отдельных коммутаторов, которые обычно обрабатывают от десятков до тысяч одновременных звонков. Такая система должна справляться с миллионом звонков и быть устойчивой к сбоям отдельных коммутаторов, обеспечивая беспрерывный сервис для пользователей».
К этому добавились выводы, полученные в ходе ранее проведённого тестирования языков. В частности:
- предпочтительными считались небольшие языки;
- приветствовалось функциональное программирование;
- логическое программирование считалось лучшим в плане элегантности;
- важным аспектом для этого рода задач являлась поддержка конкурентности.
Армстронг экспериментировал со Smalltalk, но его внимание привлёк Prolog. Эксперименты с построением системы на Prolog вскоре привели к выдающемуся результату:
«То, что началось как эксперимент по «добавлению конкурентности в Prolog» в результате стало отдельным языком, которому дали имя Erlang, вроде бы это был Бьярне Дакер. Что означало это имя? Некоторые говорили, что оно происходило от «Ericsson Language» в то время, как другие утверждали, что язык назвали в честь Агнера Крарупа Ерланга (1878 — 1929). Мы же, в свою очередь, намеренно подогревали эту двусмысленность».
Название Erlang в честь Агнера Крарупа Ерланга, датского математика, работавшего в области инжиниринга трафика и теории очередей, явно подходило для языка, использовавшегося для маршрутизации телефонных звонков.
Теперь над Erlang вместе с Армстронгом трудился Роберт Вирдинг, и к концу 1988 года бо́льшая часть ключевых концепций языка была реализована.
▍ Чем был Erlang?
Так что же отличало Erlang, и каким образом он выполнял требования команды Ericsson?
В основе этого языка лежала идея использования множества тысяч «процессов», которые представляли отдельные части кода, выполняющиеся в основном независимо друг от друга. Каждый процесс взаимодействует с другими процессами посредством «сообщений», через которые передаются небольшие объёмы данных.
У каждого процесса есть «почтовый ящик», который он периодически проверяет, выполняя обнаруженные в нём предписания.
Более того, каждый процесс является крайне легковесным в том плане, что использует очень скромную часть ресурсов компьютера. Современный сервер может поддерживать миллионы процессов Erlang, выполняющихся одновременно.
Команда встроила в этот язык отказоустойчивость, которая позволила процессам давать сбой — из-за багов или аппаратных ошибок — не нарушая функционирования всей системы, что, естественно, стало бы катастрофой.
Язык также был реализован с возможностью масштабирования. Процессы могут выполняться на множестве физических машин, отправляя сообщения другим процессам, выполняющимся на той же машине или на других. Благодаря этому, программу Erlang можно легко масштабировать, просто добавив новые машины.
▍ Жизнь внутри Ericsson
Известия о разработке Erlang распространялись, и инженеры Ericsson захотели опробовать его в деле:
«Команда решила выпустить прототип новой программной архитектуры под названием ACS3, спроектированной для программирования телефонных сервисов на Ericsson MD110 PABX4, и искала подходящий для этого проекта язык. Тогда они и услышали про Erlang. Команда проекта, получившего название ACS / Dunder, приступила к созданию этого прототипа».
В итоге, когда инженеры проанализировали работу над ACS / Dunder, они пришли к поразительному выводу: разработка на Erlang происходила намного быстрее в сравнении с альтернативами.
Erlang был представлен миру в 1989 году, и в течение последующих лет в Ericsson продолжилась работа по его улучшению. Затем в 1992 году этот язык сделал, казалось бы, небольшой, но по факту очень значительный шаг — о нём была выпущена книга.
PLEX был проприетарных языком Ericsson, и предполагалось, что он даёт компании коммерческое преимущество. В случае же Erlang было решено пойти путём AT&T и Си.
«Мы решили выпустить книгу по Erlang и открыто рассказать о всём, что проделали, чтобы избежать изоляции и последовать примеру AT&T/Cи, а не Ericsson/PLEX. Кроме того, в 1992 году мы портировали Erlang под MS-DOS, Windows, Mac, QNX и VxWorks».
Итак, команда Erlang начала продвигать свой язык. В ролике ниже, Erlang: The Movie, некоторые из первых разработчиков языка — Бьярне Деккер, Джо Армстронг, Майк Уильямс и Роберт Вирдинг — рассказывают о своём детище.
Майк Уилльямс, Джо Армстронг и Роберт Вирдинг
▍ Закрытие AXE-N
В декабре 1995 года крупный проект Ellemtel под названием AXE-N закрылся. Как говорил Армстронг:
«Целью AXE-N была разработка нового поколения коммутаторов для полной замены системы AXE10. В рамках этого проекта была создана новая аппаратная платформа и программное обеспечение, которое писалось на С++».
В итоге это ПО было решено заменить на ПО, написанное на Erlang.
Опять же, слова Армстронга:
«Этот новый проект, к которому было привлечено более 600 программистов, стал крупнейшим проектом Erlang на тот момент. В начале проекта AXD за всю систему Erlang отвечало с полдюжины сотрудников лаборатории. Такое число специалистов являлось недостаточным для крупного проекта, в связи с чем было решено создать отдельную команду продукта, названную OTP, которая должна была поддерживать систему Erlang».
OTP, или «Open Telecoms Platform», предоставляла такие возможности, как «горячая перезагрузка кода», базы данных (пакет «Mnesia») и многие другие инструменты. Несмотря на использование слова «telecom» в названии, по факту OTP представляла универсальный набор программ и не имела чего-то присущего конкретно системам связи.
Итак, в свете всё большего внедрения Erlang будущее Ericsson выглядело многообещающим.
▍ Отказ от Erlang
Затем неожиданно в 1998 году в Ericsson решили от Erlang отказаться. Почему? Чтобы избежать затрат на разработку языка, который использовали только они, и вместо этого использовать продукт общих усилий по созданию других языков.
«Выбор языка реализации подразумевает более долгосрочное его использование, чем в случае с выбором процессора или ОС, ввиду более длительного жизненного цикла создаваемых с его помощью продуктов. Использование проприетарного языка подразумевает непрерывные усилия по его поддержке, а также сопутствующую разработку среды для обслуживания и дальнейшего развития. Это также подразумевает невозможность получать полноценную пользу от эволюции глобально используемых языков».
Иными словами, Erlang был практически убит успехом опенсорсных проектов.
▍ Опенсорсный Erlang
Но для Erlang это был не конец.
В Ericsson продолжили его поддерживать, поскольку он был необходим для имевшихся у них продуктов.
При этом усилия команды Erlang по его распространению за пределами Ericsson принесли свои плоды.
Как говорил Армстронг:
«Какое-то время мы распространяли Erlang среди заинтересованных компаний вне Ericsson, хоть и в виде бесплатной оценочной системы, чтобы не нарушать соглашение о неразглашении. К 1998 году, когда внешним пользователям было поставлено около 40 оценочных систем, уже созрела идея о выпуске Erlang под открытой лицензией. Напомню, что в начале его разработки, ещё в 1986 году, об «опенсорсе» никто не слышал, и всё, что делалось в то время, было секретным».
После отказа компании от Erlang создавшая его команда начала выступать за то, чтобы выпустить его под открытой лицензией, поскольку он всё равно больше не являлся чувствительной коммерческой тайной Ericsson. Они добились успеха, и 2 декабря 1998 года было объявлено о выходе его опесорсной версии.
Изначальные разработчики Erlang вскоре ушли из Ericsson, основав собственную компанию, Bluetail, чтобы продолжать работать над этим языком. Для них оказалось естественным обратиться в сторону интернет-сервисов, поскольку тогда как раз завершался период пузыря доткомов.
«Учитывая, что система Bluetail программировалась в основном теми, кто разрабатывал и реализовывал системы Erlang и OTP, этот проект был завершён в короткие сроки, и первая система была продана буквально через полгода с момента основания компании. Это был один из первых продуктов, созданный с использованием технологии OTP не для сферы связи».
Erlang оторвался от своих телекоммуникационных корней и направился в сторону интернета.
В итоге он начал применяться и в других сферах. Этот язык нашёл свою нишу в финансовой индустрии, помогая фирмам, занятым сверхбыстрым биржевым трейдингом, обеспечить устойчивость их систем. Известная на Wall Street компания Goldman Sachs, ориентируясь на его надёжность, использовала Erlang для реализации системы обмена сообщениями.
Тогда же начали появляться проекты на базе опенсорсного Erlang. Одним из них был ejabberd, первая версия которого была выпущена Алексеем Щепиным в 2003 году. Этот продукт представлял собой высококачественное ПО для реализации системы, позволявшей отправлять через чат сообщения большому числу пользователей.
Затем в 2009 году у Яна Кума возникла идея: «Почему бы не создать интернет-систему обмена сообщениями для iPhone?»
Первые устройства iPhone появились в 2007 году, а магазин приложений App Store — в июле 2008. Вскоре после этого в сентябре того же года вышла первая версия Android.
Пользователи этих систем могли отправлять друг другу сообщения, но это оказывалось затратным, поскольку плата взымалась за каждую передачу. Но при этом допустимый объём сообщения был очень мал, даже в контексте небольших месячных лимитов трафика, которые предоставлялись пользователям в то время.
К Куму присоединился Брайан Актон, с которым он познакомился, работая в Yahoo!*
*Иронично, но оба инженера в итоге устроились работать в Facebook, а Кум в последствии занял пост его директора.
Вместе они решили создать систему, в которой пользователи смогли бы обмениваться сообщениями, ограниченными лишь их месячным лимитом трафика. Это должно было существенно снизить стоимость услуг операторов связи. Реализовав отдельное приложение для каждой из новых мобильных платформ, разработчики также смогли встроить в него больше возможностей, сделав более полезным и интересным.
Внутренняя программная основа для бэкенда этой системы на тот момент уже была доступна в виде ejabbered. Кум и Актон взяли эту опенсорсную систему обмена сообщениями и адаптировали её в качестве фундамента своего будущего продукта.
В итоге в январе 2009 года появился WhatsApp.
Логотип WhatsApp
Популярность этого мессенджера росла очень быстро. Начиная с 10 миллионов пользователей в 2010 году к концу 2012 его аудитория расширилась до 100 миллионов. Благодаря эффективности Erlang, а также тщательной проработке ejabbered, ОС FreeBSD и самого Erlang, разработчики смогли быстро масштабировать своё приложение без особого наращивания аппаратных и инженерных ресурсов.
Такая возможность выполнять масштабирование при малых затратах также легла в основу их бизнес-стратегии. Вместо того, чтобы показывать пользователям рекламу, они назначили плату в $1/год после первого года использования. Эта сумма может показаться незначительной, но в свете растущей базы пользователей вскоре она начала составлять внушительную прибыль. Кроме того, такая стоимость оказывалась вполне приемлемой для пользователей из развивающихся стран, а отсутствие рекламы сделало приложение ещё более привлекательным.
К 2013 году основатель Facebook Марк Цукерберг начал видеть в WhatsApp угрозу для своего бизнеса. У Facebook был свой мессенджер, Facebook Messenger, но на этом поприще WhatsApp выигрывал.
Цукерберг наблюдал, как быстро WhatsApp масштабируется и смекнул, что этот процесс может продолжаться и дальше. Всё благодаря Erlang.
В итоге в 2014 году компания Facebook приобрела WhatsApp за $16 миллиардов, мгновенно сделав Кума и Актона миллиардерами. За предыдущий год выручка WhatsApp составила всего $10,2 миллиона, а убытки — $138 миллионов (всё равно немного для компании с 400 миллионами пользователей на конец того года — причём основная часть этих убытков пришлась на выплаты в виде опционов на акции, а не на внутренние расходы).
Сразу же после приобретения Facebook отбросила основной источник дохода WhatsApp, отказавшись от ежегодной платы в $1. Кстати, на момент продажи в команде мессенджера трудилось всего 35 инженеров.
Оказавшись под управлением нового владельца, WhatsApp продолжил расти, охватив уже более 2 миллиардов пользователей по всему миру — опять же, благодаря Erlang.
Причём WhatsApp стал не единственным мессенджером, в котором использовался этот язык. Facebook Messenger также изначально строился на основе Erlang и ejabbered, но затем ушёл от них ввиду проблем с наймом квалифицированных инженеров. Разработчики китайского мессенджера WeChat, обслуживающего миллиарды пользователей, также использовали Erlang.
▍ Elixir
Однако обмен сообщениями стал не единственным направлением, в котором себя нашёл Erlang.
Хосе Валим являлся ключевым участником группы, работавшей над открытым веб-фреймворком Ruby on Rails (обычно называемым просто Rails). Его разработку в 2003 году начал Дэвид Хайнемайер Хэнссон, занятый на тот момент созданием онлайн-сервиса для управления проектами, Basecamp.
Rails предоставляет значительную часть программной инфраструктуры, необходимой для построения современных веб-приложений: возможность создавать веб-страницы, обращаться к базе данных и прочее. Разрабатывался этот фреймворк на языке Ruby.
Валим увидел преимущества Erlang и то, насколько полезными они могут оказаться для разработчика современного веб-приложения. В частности, хорошая масштабируемость сделала его подходящим для приложений, где пользователям нужно часто взаимодействовать с серверами.
Он также увидел, что Erlang в этом плане имел некоторые серьёзные ограничения, включая незнакомый синтаксис, в связи с чем решил создать язык, который бы исключил эти проблемы, сохранив основные преимущества Erlang и OTP.
Так, в 2013 году появился Elixir. Elixir обеспечивает возможности Erlang (по факту этот язык кросс-компилируется в Erlang) через синтаксис, преимущественно знакомый программистам на Ruby.
По аналогии с тем, как Ruby on Rails писался на Ruby, Elixir вскоре стал основой для нового веб-фреймворка, который разработали Крис Маккорд, Хосе Валим и другие — Phoenix. Phoenix представляет собой открытое ПО, во многом равнозначное Ruby on Rails по своим возможностям, но при этом является менее требовательным к ресурсам и более удобным для создания таких приложений, как чаты, требующих интенсивного взаимодействия с сервером.
Инновационные разработки поверх Elixir и Phoenix продолжают вестись и по сей день. Двумя яркими примерами являются библиотека LiveView, избавляющая пользователя от необходимости писать JavaScript, выполняющийся в браузере, и библиотека Nx, которая добавляет в Elixir возможности, необходимые для создания приложений на основе машинного обучения.
Сегодня многие используют Elixir в качестве основы для своих веб-приложений, включая такие компании, как Twitch и ряд более мелких стартапов. Elixir и Phoenix предоставляют всё необходимое, позволяя даже небольшой команде создать приложение с возможностью быстрого масштабирования.
▍ Erlang сегодня
Erlang до сих пор разрабатывается и поддерживается отдельными людьми и командами как внутри, так и вне Ericsson. В 2022 году он получил существенное обновление, которое заметно ускорило выполнение написанных на нём программ за счёт внедрения новой версии JIT-компилятора.
Elixir и Phoenix уже достигли стадии зрелости. Оба этих языка привлекли небольшую, но увлечённую и преданную группу энтузиастов. Возникшая вокруг них экосистема продолжает расширяться, хотя она всё ещё не дотягивает до масштабов охвата Ruby on Rails.
Выиграй телескоп и другие призы в космическом квизе от RUVDS. Поехали?