Go в продуктовой разработке: посмотрим с трех сторон

До Golang Live 2020 уже рукой подать. С 14 по 17 октября мы встречаемся на платформе Онтико. И даже в онлайн-формате, помимо традиционных докладов, будут интерактивные форматы: воркшопы, круглые столы, афтепати и другие штуки. Даже играть будем. В этом году мы сделали акцент на Go в продуктовой разработке и будем раскрывать эту тему с трех сторон: как справиться с проблемами Go в этой теме и какие есть тулзы, почему всё-таки стоит выбрать именно Go, и как после этого поддерживать продукт.

pgxbq0hsmbzd0przdimboledesq.png
Да, Go — не гибкий, не богатый и не выразительный язык, из-за своих особенностей он плохо подходит для описания сложных абстракций и обобщенного программирования. Но используя некоторые его свойства в ином ключе, например, весь Программный комитет выбирает именно Go для продуктовой разработки. И вы же помните главное отличие продуктовой разработки от заказной для разработчиков? Со всеми несовершенствами решений, багами и заложенными архитектурными проблемами придётся жить и работать именно нам. Поэтому об этом хорошо было бы подумать еще на старте проекта. На конференции мы объясним, как справиться в продакт-разработке с этими гошными проблемами.

Первый день конференция будет открытым, а доклады будут освещать гоферную продуктовую разработку с тех же трех сторон. Например, расскажем, как применять OpenTelemetry в Golang-проектах в 2020 году, когда два стандарта OpenTracing и OpenCensus окончательно объединились в один. А еще вы увидите на практике, как использовать (или ужаснетесь и решите не использовать) пакет unsafe, чтобы оптимизировать скорость выполнения кода. Также мы поможем вам выбрать подход для генерации готового веб-сервера на языке Golang из спецификации OpenAPI и более детально рассмотрим grpc-gateway. В рамках темы Clean architecture вы получите разбор шести помарок в обработке ошибок, а тема автоматизации тестов будет раскрыта на примере Ozon, где интеграционные тесты на Go для проекта с 1000 микросервисов.

В следующие дни спикеры будут раскрывать тройное видение глубже, чтобы помочь вам в этом нелегком деле: одновременно совершенствовать и упрощать Go-разработку в продуктовых рамках. Например, как правильно выбрать архитектуру, реализовать сложную логику, как рефакторить, тестировать и деплоить код. Вы увидите, как Gо работает на реальных, часто высоконагруженных, проектах. Разработчики известных Go-продуктов поделятся своим опытом — как подходить к описанию бизнес-логики и обходиться без средств обобщенного программирования.

Какие тулзы облегчат разработку на Go?


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

gzepjv-h6czrnpqcwocptqce_tq.pngИ, хотя гексагональная архитектура объединяет классические идеи для отделения кода приложения от фреймворка, не всегда понятно, когда ее уже можно применять. Константин Деревцов (SibEdge) объяснит, какие нужны инструменты, чтобы построить гексагональную архитектуру именно в Go. Из доклада «Hexagonal architecture для Go-разработчика» вы узнаете о концепциях «портов и адаптеров» и «принципе инверсии зависимостей». Примером будет эволюция Go-приложения от «big ball of mud» до hexagonal architecture. Константин, помимо того, что DDD’шник, пишет на Go низкоуровневое ПО и увлекается системным программированием.

h8ribxf5ilpgbvga3hjczgxsgno.jpegВ продолжение темы облегчения жизни разработчика, поговорим о кодогенерации — ведь хочется, чтобы автоматическая генерация делала работу быстрей и лучше, чем живой человек. Конечно, для небольших рутинных операций кодогенерация воспринимается слишком трудозатратной, но уже есть готовые библиотеки для закрытия базы в обобщениях — stringer, jsonenums, ffjson, gen. Go справедливо ругают за отсутствие обобщений (generics) и синтаксических возможностей для обобщенного программирования, и именно кодогенерация может помочь вам найти оригинальное решение. Эмиль Шарифуллин (СКБ Контур) в докладе «Go generate code together» поделится, что в рамках языка Go может кодогенерация, как ее можно использовать и какие кейсы подходят лучше всего для этого. Техника сложная, но эффективная.

lgnwiihnkpggobbf47kliyf94hc.jpegНа Go можно автоматизировать даже правила написания кода, чтобы переложить на железные плечи роботов хотя бы часть забот о соблюдении стиля. Это сильно поможет тимлиду, который заботится о поддерживаемости кодовой базы своего проекта. Как правило, тимлид обнаруживает, что соблюдение правил занимает слишком много времени: правила обработки ошибок, вывода логов, именования переменных, и так далее, и тому подобное… И на каждое из правил тимлид вынужден тратить время трижды (даже в Go с его жестким стилем языка, да): когда объясняет эти правила команде, когда проверяет их соблюдение при code review, и когда по результатам review доказывает, что правила нельзя нарушать. Выглядит как поле для автоматизации, не правда ли? Искандер Шарипов (ВКонтакте) своим докладом «Ruleguard vs CodeQL vs Semgrep» поможет вам сохранить драгоценное время. Вы узнаете, чем go-ruleguard, CodeQL и semgrep лучше, чем написание своего линтера с нуля и увидите примеры интеграции go-ruleguard в CI.

cgggbvsg9ossnz_loxhj6oegync.jpegКогда мы пользуемся редакторами кода, мы ожидаем и от них удобства пользования, чтобы они были адаптированы к нашим рабочим процессам. А еще чтобы они были умными, когда мы работаем в редакторе, и в то же время не мешали нам. Это закономерные ожидания. Редакторы кода — часть нашей повседневной жизни, независимо от операционной системы, языка программирования или уровня владения языком. Florin Patan (JetBrains) в своем выступлении «GoLand Tips & Tricks» покажет, как параметры рефакторинга позволяют пользователям выполнять такие операции, как извлечение интерфейсов из типов, перемещение типов между пакетами и другие безопасным образом в больших базах кода. Вы увидите, как IDE выполняет статический анализ кода для источников Go, преимущества платформы IntelliJ для разработки инструментов для языков и как инструменты Go могут взаимодействовать с кодом. В презентации также будут описаны некоторые уникальности платформы. Выступление будет на английском языке.

5cvqclr7o1agrnr4c_zlk_ol4l4.pngПочти для всех инструментов разработчика характерны DSL, которые тоже облегчают нелегкий труд разработчика: DSL абстрагируют сложность логики, которую разработчикам необходимо повторять, и дают простые многократно используемые функции. Одновременно проверяя типы данных, выражения и инструкции, чтобы избежать скрытые ошибки, от которых страдают языки конфигурации. Таким примером может быть Terraform. Это DSL, который позволяет функциям и некоторым выражениям заключать в себе повторяющиеся задачи. Piyush Verma из Last9 в практической сессии «Building Domain Specific contexts using DSLs in Golang» покажет небольшой пример создания предупреждений для запросов к базе данных. Piyush представит DSL, который транслируется в соответствующие запросы к бэкэнду хранилища данных, чтобы дать вам представление о простоте написания таких DSL. Вы увидите жизненный цикл разработки и применения DSL (с примерами кода), который используется в Last9 для оповещения клиентов в режиме реального времени с использованием различных бэкэндов данных при значительном параллелизме. Piyush будет выступать на английском языке.

fnwq4w1icicq_ng3l_tbsalzp3m.jpegКонечно, и без инструментов сами разработчики могут усложнить себе жизнь. Например, когда команда пишет впервые микросервисы, каждый продукт может получиться немного гм… уникальным: со своим набором библиотек и особенностей, которые решают задачи (типовые в общем-то) немного по-разному. В результате, когда микросервисов становится много, их поддерживать и развивать становится всё тяжелее. И хочется, чтобы они были как можно более «одинаковыми». Александр Воронков из Plesk поможет вам в этом, выступив в «Как написать свой фреймворк для микросервисов». Александр расскажет как при создании фреймворка учесть особенности инфраструктуры для микросервисов, как избавиться от boilerplate-кода, привести к одному виду сторонние библиотеки между разными микросервисами и вообще как вы можете упростить себе жизнь как разработчика и писать микросервисы всего несколькими строками кода. Go очень хорошо подходит для микросервисов, осталось добавить фреймворк.

Как необычно применить Go


adjxigmhth1se4l5reenf7lecsa.jpegGo привлекает в первую очередь своим низким порогом вхождения и скоростью разработки, и если в Go нет того, что вам нужно — вы можете создать это сами. Конечно, есть задержки на сборку мусора и обработку блокировок. К тому же Go не всегда оптимально хранит данные в памяти — разработчики иной раз даже переписывают код на более низкоуровневых языках (C/C++/Rust), которые дают более быстрый отклик. Тем не менее, Вадим Кулибаба из Mail.Ru расскажет вам, что на Go все-таки можно реализовать даже высоконагруженный сервис для хранения данных в формате ключ/значение. Обойдя ограничения языка, Вадим реализовал не только компактный движок, мало подверженный проблемам сборки мусора и аллокаций. Вы увидите пример высокопроизводительного сокет-сервера, который работает с десятками тысяч запросов в секунду с минимальной задержкой. В докладе «Разработка базы данных на Golang» Вадим покажет практический пример такой СУБД.

qf1xno2ermi7ujmpf9cklxng0wk.jpegКонечно, во время разработки мы думаем и о безопасности создаваемых приложений. Но бывает, что проблемы безопасность возникают непреднамеренно, но последствия могут быть тяжелыми, когда используются библиотеки без их анализа. Конечно, вы уже знакомы с линтерами, поэтому SAST (статическое тестирование безопасности приложений) не вызывает удивления. Но что насчет открытого исходного кода в вашей разработке? Rob Haines из Synopsys выступит с темой «Application Security in Go: SAST and SCA» и покажет, как SCA (анализ состава программного обеспечения) помогает обнаруживать открытый исходный код в вашем приложении и управлять им в жизненном цикле разработки и за его пределами. В конце вы будете обладать полной информацией об этих двух разных технологиях (SAST и SCA) для защиты ваших разработок.

Сложно, но можно. Практические кейсы


jpdi6dp6jn0tg4m9fijfgi1szkw.jpegМы каждый год впечатляемся скоростью внедрения Go. Превосходят в своей экспансии Go, пожалуй, только бессерверные облачные технологии (которые будут реальными облаками, а не то, что мы называем облаками сейчас). Steven Bogacz в выступлении «Going Serverless» покажет, как писать бессерверный код Go для сложных API-интерфейсов, развернутых в таких средах, как Lambda и Google Cloud Functions. Вы узнаете, как запускать один и тот же сервис в виде serverless в разных облаках (AWS Lambda, Google Cloud Functions), и как обычный локальный HTTP-сервис для упрощения тестирования и разработки. Особое внимание будет тестированию и абстракции. Это будущее серверной разработки. Сейчас это сложно, но мы движемся вперед: серверного кода всё больше, требования всё выше, а знать мы хотим, как он исполняется, — всё меньше. Стивен будет выступать на английском языке.

ewmxqccz1qexyrhktjxxwbpc29g.pngВ крупных компаниях применений для Go можно найти намного больше, чем в небольших командах. Много практических примеров нам только на пользу. Радует ещё то, что крупные разработчики делятся своими примерами, которые вы можете повторить на практике сразу после конференции. В том же Uber Go-кода уже написано невообразимое количество, при этом Uber имеет отличительное свойство — он использует монорепу. А большое числа проектов и кода заставляет Uber двигаться в сторону стандартизации, guidelines и code style. Егор Гришечко расскажет, как «Как разрабатывают в Uber», и как крупная компания при этом организует работу на Go. Егор работает в компании Uber в команде внутренней SAAS-платформы для баз данных.

nxownw-5wuvhjv7csrj1gwtd_ky.pngАвито тоже не только в теории мечтает автоматизировать повседневные задачи разработчиков и построить удобную систему оркестрирования зависимостей сервисов. Разработчики Авито на практике используют все эти инструменты, и Иван Королёв в докладе «Авито: создание микросервиса на PaaS» расскажет, как подходить к организации продакт-системы не как обычно, а как в это должно быть в 21 веке. Иван покажет вам изнутри, как организована разработка на Go в Авито. Вы узнаете о платформенных решениях для создания микросервисов (и для чего они нужны в этом деле), из каких частей состоит общий toolkit PaaS (Platform as a Service) Авито и создают и развивают микросервисы в Авито на живом примере.

hltusq-gwyxr8hpcqseetpbnunc.jpegРабота.ру — один из крупнейших сервисов России по поиску работы и сотрудников, поэтому поисковый движок для него критически важен. Тем не менее, предыдущее решение на основе Solr стало настоящим препятствием для этого. Владислав Сидорин в докладе «Зачем и как мы сделали поиск вакансий на Go, что нам за это было» расскажет, к чему привело рискованное решение — написать поисковый сервис на Go, и почему команда выбрала Go, а более ориентированный на максимальную производительность язык. Вы узнаете много интересного для гоферов-поисковиков: как собрать прототип и проверить свои гипотезы, какими программно построить архитектуру leader-follower сервиса, как обновлять индекс в RAM при конкурентном доступе к нему, как выстроить шардирование вашего сервиса, что нужно вывести наружу для мониторинга и сервиса и многое другое…

Помимо докладов будет два круглых стола. На первом — «Трудности найма Go разработчиков, или почему мы вам отказали» Даниил Подольский, Александр Чистяков, Анастасия Кадомцева, Николай Муляр, и Виталий Левченко расскажут про проблему нехватки Go-разработчиков со стороны работодателя, хеэхантера и гофера. Из-за того, что в Go низкий порог входа — за 2 дня можно изучить всю документацию и начать кодить, — не хватает разработчиков, которые будут развиваться дальше этого уровня. Работодатели готовы платить высокие зарплаты, хедхантеры готовы вас найти, гоферу осталось только расширить свое профессиональное мировоззрение. По итогу круглого стола все три стороны процесса получат рекомендации, что же делать.

На втором круглом столе «Подходит ли GO для ранней проверки гипотезы стартапа (прототипа) или лучше использовать PHP, Python, Ruby on rails, Node.js?» спикеры помогут вам понять —- почему именно Go? Какие нюансы есть у вашего проекта, чтобы выбрать Go. И наоборот, по каким критериям вы сможете понять, что любовь с Go не для вашего проекта и не сегодня? Ответы на эти вопросы вы получите в процессе этого обсуждения.

Отдельно стоит сказать об игре Go Royal, в конце которой останется только один победитель. Поэтому о ней мы напишем отдельный анонс.

Расписание конференции. Регистрация. Билеты.

© Habrahabr.ru