В декабре 2019 года команда Khan Academy начала масштабный проект под названием Goliath, целью которого стала постепенная миграция бэкенда с монолита на Python 2 на сервисы, написанные с использованием языка программирования Go. Этот проект стал не только техническим вызовом, но и своеобразной революцией в подходах к разработке, организации процессов и поддержке масштабируемости. По истечении некоторого времени Khan Academy перешагнула рубеж в полмиллиона строк кода на Go, что позволило команде поделиться своим опытом и взглядами на этот язык с широкой аудиторией. Рассмотрим ключевые аспекты этого перехода, преимущества Go, а также мнение инженеров, которые участвовали в трансформации системы. Первое, что стоит отметить, это стремление команды подходить к миграции максимально поэтапно.
Вместо агрессивного переписывания всей системы за короткий срок, инженеры сконцентрировались на постепенном внедрении сервисов на Go наряду с уже существующими компонентами на Python. Такой подход снизил риски и позволил получать быстрые результаты по мере роста нового кода. Интересно, что на старте проекта никто из команды не владел Go глубоко — только экспериментальный опыт и базовые знания, полученные до начала проекта, позволили решиться на использование нового инструмента. Сегодня же все бэкенд и full-stack инженеры компании пишут на Go, что отражает уровень адаптации и зрелости владения языком. Преимущества Go очевидны для разработчиков.
Совместная обратная связь от инженеров говорит о том, что язык прост в чтении и написании, но при этом обеспечивает высокую производительность. Один из переходивших с .NET инженеров отметил уникальный стиль обработки ошибок: Go не использует исключения, а возвращает ошибки как значения функций. Это позволяет лучше контролировать успешность выполнения операций и минимизировать неожиданные сбои, что сказывается на надежности системы. Документация стандартной библиотеки Go также заслужила похвалу за удобство и доступность, например, через встроенные инструменты, которые работают без необходимости подключения к интернету, что упрощает процесс обучения и быстрого получения информации во время разработки.
В дополнение к языковым особенностям команда высоко оценила инструментарий Go. Быстрый компилятор, автоматическое форматирование кода и относительно стабильное управление зависимостями через Go Modules упростили процесс разработки и поддержки большого кода. В случае Khan Academy удачно применяются и внешние библиотеки, такие как gqlgen, которые облегчают взаимодействие с GraphQL и позволяют создавать гибкие API. Собственный талисман языка — Gopher, разработанный Рене Френч, также добавил неформальный и позитивный оттенок в восприятие сообщества, делая язык более привлекательным. Однако, несмотря на положительные стороны, есть и критика.
Наиболее частое замечание — отсутствие поддержки обобщённых (generic) типов, которые могут значительно упростить написание некоторых библиотечных компонентов и работу с коллекциями данных. Эта особенность делала код на Go более многословным и требовательным к повторяющейся логике, особенно при переносе функционала с более выразительных языков, таких как Python. К счастью, команда Go активно работает над внедрением generics, и в Khan Academy с интересом ожидают эту новацию, рассчитывая на повышение компактности и качества кода. Переход с Python на Go требует компромиссов в плане объема написанного кода. В одном из случаев части системы пришлось написать на Go почти в три раза больше кода, чем было в Python.
Это связано не только с языковыми различиями, но и с архитектурными изменениями, например, заменой вызовов функций на межсервисные запросы, что повышает уровень модульности и масштабируемости, но добавляет оберток в реализации. Со временем инженеры надеются за счет улучшений в языке и новых библиотечных возможностей сократить объёмы кода и повысить его выразительность. Производительность в ходе миграции показала себя с лучшей стороны. Go выиграл борьбу с Python в скорости выполнения практически во всех сравнительных сценариях. Быстродействие обработки больших массивов данных и параллельных операций действительно впечатляет.
Например, количество предупреждений о конкуренции в Google Cloud Datastore в версиях на Go почти свелось к нулю, в то время как на Python их насчитывалось около сотни в час. Кроме того, загрузка сложного объекта, включающего более тысячи студентов, сократилась с 28 до 4 секунд благодаря лучшей оптимизации и работе с асинхронностью. Касательно параллелизма и конкурентного программирования, Go предлагает разнообразные инструменты. Несмотря на широкую популярность каналов как одной из фишек языка, инженеры Khan Academy отдали предпочтение пакету sync, использующему примитивы синхронизации, что показало лучшую применимость в их рабочих сценариях. Это интересное наблюдение демонстрирует, что практическое использование возможностей языка не всегда совпадает с рекламируемыми концепциями, а зависит от конкретных задач и архитектуры.
Пятьсот тысяч строк кода на Go — это не просто достижение количественного характера, но и важная веха, демонстрирующая зрелость нового стека в реальной промышленной эксплуатации. Несмотря на то, что язык требует больше кода по сравнению с Python, команда отмечает удовольствие от работы, стабильность, быструю сборку и растущие возможности экосистемы. Учитывая разнообразие исходных языков, с которыми пришли инженеры, единое мнение о том, что Go справляется со своей ролью, является существенным свидетельством правильности выбора. Переход на Go в Khan Academy — это пример того, как крупные организации могут успешно обновлять свои технологические платформы постепенно, избегая крупных сбоев и сохраняя при этом развитие функционала. Основой успеха стала команда, открытая к обучению и новым инструментам, а также активное участие сообщества Go, которое поддерживает язык и продолжает его эволюцию, учитывая опыт таких крупных проектов.