13 лет совершенствования
В ноябре мы празднуем очередной день рождения языка, радуемся пополнению CNCF-песочницы инструментом для создания Go-контейнеров, смотрим на практическое применение фаззинга и размышляем об IDE будущего. Не переключайтесь!
Гофер-тинейджер
Наш гофер отпраздновал в ноябре своё 13-летие. По человеческим меркам это уже подросток, отказавшийся от прошлых убеждений и активно ищущий возможности развития. Релиз 1.18 поставил жирную точку в спорах про дженерики, и это стало определяющим моментом выбора пути дальнейшего совершенствования. Остальные, не менее важные изменения, такие как рабочие области и фаззинг, можно считать приятным бонусом.
Понемногу в язык приходит удобство не только для написания кода, но и для документирования. В комментариях теперь есть базовые структурные элементы, помогающие улучшать восприятие — заголовки, списки и ссылки. Приложения всё чаще запускают в контейнерах, что привело к появлению вспомогательных механизмов, таких как мягкое ограничение памяти GC.
Стоит оглянуться на уже пройденный путь и увидеть, через что прошел язык за все эти годы. Идея отодвинуть C на второй план более не является драйвером развития. Причём путь Go — не только история успеха, но и провалов. Недавний эпизод с уязвимостью Log4shell заставил пересмотреть отношение к безопасности и привёл к созданию инструментов вроде govulncheck.
Впереди будет ещё множество «синяков» и «набитых шишек», но мы в Evrone склонны верить, что этап детства позади, а Go ждёт отличное будущее. Нам же остаётся продолжать наращивать свою экспертизу и делиться опытом с «коллегами по цеху».
Easy Go Containers
Песочница CNCF пополнилась ещё одним полезным инструментом, а именно проектом ko. История его создания началась в 2018 году в процессе разработки решения Knative. Нужно было создать удобный инструмент развёртывания Go-приложений в контейнеры Kubernetes. Разработчики блестяще справились с этой задачей и их детище теперь стало очередным вкладом в развитие open-source software.
Основным юзкейсом ko является упаковка Go-приложения в образ и его отправка в реестр для контейнеров (например, в Container Registry) без необходимости создания Dockerfile. Любопытно, что на хосте вообще может не быть установлен Docker. За основу ko берёт образ distroless вообще без оболочки и исполняемых файлов. Это делает его безопаснее и меньше по размеру.
В целом, ko можно рассматривать как простой и функциональный конструктор, экономящий время. Если локальный билдер Docker формирует образы через запуск контейнера и снятие снапшотов с файловой системы, то ko действует иначе. Он напрямую формирует образ и манифест вообще без запуска контейнера. Это и приводит к экономии времени.
Вновь о фаззинге
Наверняка у вас были такие ситуации, когда звучала фраза «я бы в жизни не догадался». И это именно та фраза, которая объясняет, что делает фаззинг. Он позволяет выявить такие баги, о которых невозможно догадаться. Как в знаменитой фразе из фильма ДМБ — «Суслика видишь? Вот и я не вижу. А он есть».
Это достаточно старый метод тестирования, появившийся случайно. Во время передачи данных с терминала на мейнфрейм случился сбой, и до мейнфрейма долетела команда с аргументами в виде случайного набора символов. Это, в свою очередь, вызвало segmentation fault и падение команды, которая до этого многократно тестировалась.
Получилось, что сработал сценарий, который нельзя было предугадать. Это стало поворотным моментом, который привёл к созданию первых фаззеров, отправляющих сгенерированный «мусор» на ввод Unix-систем. Но если с привычными командами всё достаточно просто, то где в коде следует искать баги таким способом?
Чтобы ответить на этот вопрос, важно понимать, что фаззинг не заменяет традиционные методы тестирования, но отлично их дополняет. Даже самые привычные функции, такие как сортировка слайса, в какой-то момент могут сработать не так, как предусматривает разработчик. И там, где модульные тесты не найдут каких-либо отклонений — фаззер способен удивить. Особенно это полезно при парсинге чего-либо из внешнего мира, когда мы можем лишь предполагать, какие данные поступят на вход приложения.
Наиболее простой способ перейти от теории к практике — посмотреть, как это уже применяется в реальных кейсах. Мы подготовили небольшую подборку статей, которые стоит прочитать:
- Где искать баги фаззингом и откуда вообще появился этот метод
- Structure-aware Go fuzzing: How to fuzz with complex types
- Understanding fuzzing in Go
The IDE Of The Future
Разработчики много проводят времени в IDE — это факт. И вопрос удобства работы здесь вовсе не праздный. Среди гоферов наиболее часто используется Visual Studio Code от Microsoft и Goland от JetBrains. Последние, впрочем, не останавливаются на достигнутом и предлагают взглянуть на preview-версию их нового детища Fleet. Это интересная попытка заглянуть в будущее и создать универсальную IDE, в которой разработчикам будет удобно писать приложения на самых разных языках.
Первое, что бросается в глаза: если код находится за пределами локальной машины, то можно получить к нему доступ разными способами. Можно сразу склонировать код из репозитория на GitHub, подключиться к удалённому серверу по SSH, получить доступ к Docker-контейнеру или нативной для JetBrains платформы Space.
Интерфейс очень похож на VSCode и интуитивно понятен. Есть типичный для продуктов IntelliJ экран поиска GOTO, позволяющий найти нужный текст в кодовой базе, а затем сразу открыть файл и перейти к нужному месту. Словно хороший официант, Fleet сам предложит создать модульный тест при написании функции. В процессе отладки он отобразит все горутины, что достаточно удобно для определения состояния каждого из запущенных процессов.
Это лишь малая часть интересных функций новой IDE. Более подробное описание вы найдёте в статье Previewing The IDE Of The Future и блоге разработчиков. Станет ли Fleet конкурентом VSCode? Посмотрим. Все задатки у него есть.
Интересно посмотреть
Go-митап
Пропустили наш предыдущий Go-митап? Не страшно — записи докладов в кинематографическом качестве выложены в сеть.
Антон Губарев из Авито рассказал про опыт реализации ролевой системы доступа с помощью Open Policy Agent:
Николай Тузов из Lamoda детально описал внутреннее устройство каналов в Go:
В завершение Андрей Беренда из Ozon Fintech поделился опытом взаимодействия с ошибками, которые нельзя обработать в Golang:
Немного IT
Видеоподкаст про Go снимают и развивают двое наших коллег из Evrone. Они обсуждают его преимущества и недостатки, сравнивают с другими языками.
Выпуски длятся 50-70 минут, а значит можно совместить какие-нибудь скучные занятия с обучением. Отличная возможность погрузится в нюансы Go, стоя в пробке или проезжая очередную станцию метро! Сайт проекта.
Ну а если вам есть что сказать — добро пожаловать в комментарии!
Впереди Рождество и Новый год — время, когда каждый хочет уделить время родным и близким. Поэтому это завершающий Go-дайджест 2022 года, а следующий выйдет в январе 2023, где мы соберём самые интересные новости, дискуссии и инструменты за 2 месяца сразу. Спасибо, что читаете нас!
Вакансии
Evrone
Мы открыты для новых Go-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.