Graphite — Github на максималках

Когда я работал в Яндексе, у нас была своя система контроля версий, которая включала в себя и Арканум — веб-интерфейс для просмотра кода и взаимодействия с пулл-реквестами. Это была in-house система, заточенная под нужды компании, и это было удобно. На текущей же работе мне пришлось использовать Github, и у меня почти сразу стало подгорать от его недостатков.

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

У гитхаба очень быстро обнаружилась большая проблема с glanceability: большое количество информации спрятано по разным вкладкам, нужно тратить дополнительное время, чтобы её узнать. В частности, мне интересны три вещи:
- Статус CI. На гитхабе его можно увидеть либо во вкладке Checks, либо напротив последнего коммита в самом низу страницы
- Статус незакрытых комментов в ревью. В процессе ревью пр-а обычно пишут комментарии к проблемным участкам кода, которые нужно пофиксить. После фикса ветку можно отметить как resolved, и тогда она должна перестать мозолить глаза. Иногда в ветке может завязаться какая-то дискуссия, в таком случае ее тоже лучше иметь где-то в быстром доступе. На гитхабе эти ветки показываются на вкладке с кодом (но удачи скроллить через 100 файлов) и на главной вкладке Conversation (но они перемешаны с сообщениями о коммитах и прочими уведомлениями, а закрытые ветки всё ещё занимают кучу места)
- Статус самого пулл-реквеста. И я говорю не про «открыт-закрыт», а более гранулярно. Требует ли он моего внимания? Накидали ли мне в панамку? Возник ли конфликт с транком? Или мне всё ещё ждать ревью? На гитхабе такого просто нет

Graphite на самом деле не только веб-интерфейс для гитхаба, а целый инструмент, реализующий одну определенную философию работы с гитом, но об этом уже как-нибудь в другом посте. Сейчас поговорим конкретно про веб-интерфейс. Как можно видеть на втором скриншоте, плотность информации просто удивительная. Всё нужное прямо перед глазами, всё ненужное — спрятано подальше. Статус CI, незакрытые ветки, статус пр-а.

Стоит упомянуть, что Graphite — это проприетарный и весьма коммерциализированный инструмент, явно нацеленный на зажиточные компании. Но разница в UX с обычным гитхабом настолько значительная, что, даже если бы нам пришлось за него платить, свои $25 в месяц он бы отбивал (тратил бы я лишние 3 минуты в день на навигацию по гитхабу? скорее да, чем нет)

А почему я начал этот пост с рассказа про яндекс? Потому что я понял, что в аркануме все эти фичи уже были. Не уверен, кто у кого подсматривал, скорее арканум у графита, но на контрасте с гитхабом арканум был супер удобным.
🗺️ Выгрузил все GPS-треки своих перемещений, которые собирал с декабря 2023

Пока что сделал только самые примитивные визуализации, но результаты всё равно завораживают. По порядку:
1. Нечто напоминающее heatmap хождений по моему городу. Несмотря на то, что я выбрал самую маленькую толщину, самые частые пути всё равно превратились в шоссе.
2. То же самое, только для Амстердама. Видно, что в львиной доле районов я даже не появлялся. Разные цвета — это разные месяцы, если что. Оно так по дефолту, мне лень было менять.
3. Трек с поездки на Большое Алматинское озеро прошлым летом. Нашёл кнопку сделать 3д и просто понравился ракурс.
4. Занятная зона под Пушкино, куда периодически улетал сигнал GPS. Причём даже не из центра Москвы, а прямо из дома в Королёве

Данные я выгрузил в формате GPX, а потом запихнул их в gpx.studio. Технические детали постараюсь рассказать на днях, пока быстропост «зацените че сделал»
🗺️ Как и обещал, более технический follow-up к моему посту про визуализацию GPS-треков. Получилось немного рандомно, потому что правда не знаю, как такую широкую тему структурировать.

Сначала пару слов про Arc. Это iOS-only приложение (а точнее, два приложения: бесплатный Arc Mini и его «старший брат» Arc Timeline, который требует подписку), которое записывает gps-треки и анализирует их. Встроенный анализ нас сейчас не очень интересует, а вот запись — ещё как. Я не перестаю поражаться, насколько качественно он записывает геопозицию. Он способен трекать локацию в фоновом режиме с точностью до десятка метров (можно понять, по какой стороне дороги я иду!) и при этом съедает от силы 15% заряда в день. Все варианты, что я пробовал на андроиде, либо плохо трекают, либо жрут батарейку, либо и то и то. Главная причина, почему я до сих пор беру с собой айфон, хотя пользуюсь андроидом как основным устройством несколько месяцев как.

Из минусов — вытащить из него юзабельные данные — это большая боль. Хоть он и хранит их в iCloud в каком-то собственном формате, не очень понятно как их преобразовать во что-то юзабельное типа GPX (скорее всего в теории возможно, но я не копался). Arc Mini умеет экспортировать GPX только за один день, повторять это 400+ раз мне не хотелось. Поэтому мне пришлось взять триал подписки на Arc Timeline и заставить его сделать помесячные экспорты. Такой вот неприятный вендор-лок.

Теперь про визуализацию. Сначала я просто взял GPX данные и загрузил их в gpx.studio. Я боялся, что мне придётся ставить что-то типа Google Earth, но в итоге был приятно удивлён, что нашёлся такой удобный, лёгкий и красивый инструмент. Но сырые данные оказались немного шумными: например, если в поезде пропадал сигнал и точка оказывалась в 500 метрах от предыдущей, на визуализации они просто соединялись прямой линией. Мне это не понравилось, и я навайбкодил препроцесс-скриптик на питоне, который проходился по точкам, и, если они расположены больше чем в N метрах друг от друга, разрезал сегмент в этом месте на два. Да, буквально такую задачу я поставил Cursor, и на удивление он с первого раза написал годную имплементацию. Это помогло избавиться от большей части рандомных лазеров, стреляющих во все стороны.

Мне очень хочется построить по этим данным scratch-map / «туман войны»: такую карту, на которой отмечены области, которые ты когда-либо посетил. Чтобы такое сделать, в принципе достаточно взять какую-нибудь систему разделения поверхности Земли на ячейки (например, H3 или S2), замапить все точки на ячейки определенного размера (я бы наверное выбрал поменьше, не больше 100м) и зарендерить эти ячейки. А если ещё посчитать количество точек в каждой ячейке, то получится heatmap — ещё одна визуализация, которую мне хотелось бы реализовать. Она позволит более точно и наглядно сравнить, по каким улицам я всё-таки чаще ходил.

Ещё одно направление мысли — замапить точки на OSM-фичи. Хоть треки и довольно точные, на самых посещаемых участках заметно, что их бросает туда-сюда. Если «снапнуть» каждую точку к ближайшей дороге на OpenStreetMap, можно будет гораздо точнее судить о том, сколько раз я ходил по какой улице. Но это ещё сложнее: надо выкачивать датасет OSM, писать скрипт, обрабатывать миллион корнер кейсов. Я никогда с таким не работал, но однажды хочется попробовать.

Ещё можно попробовать проанализировать данные по способу перемещения: разделить прогулки, поездки на велосипеде, машине, поезде и самолете. Это позволит посчитать всякую интересную статистику: например, сколько километров я прошёл пешком. Это не совсем тривиальная задача, но если натравить на неё какую-нибудь нейронку, мне кажется, может получиться что-то дельное.

Как-то так. Данные очень любопытные, меня правда завораживает бродить по карте и вспоминать истории, связанные с тем или иным местом. Идей, что можно сделать ещё — тоже хоть отбавляй. Но только где найти время и мотивацию их реализовывать? Если будут какие-то подвижки, которые ещё не тянут на собственный пост в этот канал, буду рассказывать в лайв-канале, подписывайтесь
✈️ Тем, кто в Европе (или рядом), должно быть интересно!

Хочу рассказать про сообщество Alumni on Tour. Оно состоит в основном из выпускников Вышки и занимается организацией поездок по Европе.

Прошлой осенью я уже ездил с ними в Болгарию, и мне очень понравилось: собралось больше 20 человек из разных стран и вышел идеальный баланс активностей и нетворкинга.

Следующая поездка будет в Италию и состоится она уже совсем скоро, с 20 по 25 мая. Программа очень насыщенная: собственная вилла (целых две!), больше 35 участников, поездки в Пизу и Флоренцию, рафтинг, поход, дегустация вина и уютные вечерние разговоры.

Я сразу же забронировал место — очень хотел поехать. Но, к сожалению, учебный график неудачно совпал, и поехать у меня не получается. Поэтому ищу того, кто мог бы поехать вместо меня (остальные места разобрали в первые несколько недель!). Кому интересно, подробную программу можно посмотреть вот тут. Цена — €640 за 5 ночей и все активности. По поводу бронирования писать @victoriagermany.

А если в Италию поехать не выходит, есть и другие варианты: например, в августе планируется слёт в Амстердаме.
🎓 Обзор на учёбу: DevOps

Недавно закончил курс по DevOps в универе – очень прикольно! Один из самых полезных курсов, что у нас были.

Он не был сфокусирован на какой-то одной теме, вместо этого он состоял из небольших кусочков на разные темы с одним большим заданием в конце, где надо было применить все полученные знания. Темы были следующие:
- Bash-скрипты. Прошлись по основным концепциям bash (pipes, перенаправление ввода и вывода, status codes, переменные и всё такое) и частым утилитам (cat, read, sed, curl и так далее).
- Docker. Научились собирать образы, коснулись multi-stage билдов, научились публиковать образы в GitLab Registry. Заодно получили практический опыт докеризации php с использованием php-fpm (надеюсь, что это мне не пригодится)
- Docker Compose. Научились дружить контейнеры друг с другом, прокидывать env-переменные и volumes, настраивать health checks и порядок запуска контейнеров.
- nginx. Использовали в качестве reverse proxy, ничего сложного не делали.
- GitLab CI. Настраивали пайплайн с запуском тестов, сборкой образов и деплоем новой версии. Познакомились с кешированием, артефактами, триггерами запуска пайплайнов
- AWS. Учились разворачивать highly available and scalable инфраструктуру. Познакомились с концептами VPC, subnet, security group, EC2, load balancer, auto-scaling group. Поднимали базу данных на RDS. Хостили статический сайт на S3.
- Terraform. Примерно то же самое, что в предыдущем пункте, только декларативно.

Насыщенный и интересный курс. С докером я уже был предварительно знаком, с GitLab CI — тоже, но в гораздо меньшей степени, а вот AWS и Terraform стали для меня абсолютно новым опытом. Сначала было сложновато разобраться в сущностях, которые они нагородили, но постепенно проникся этим уровнем абстракции, когда серверы и сети не воспринимаются чем-то железобетонным, а могут быть созданы и убраны по щелчку пальцев. Короче, мне понравилось.
🎓 Обзор на учёбу: Embedded programming

Параллельно с курсом девопса у меня был курс Embedded programming. Задумка такая: нам выдали Arduino (точнее, STMicroelectronics Nucleo), всякие экранчики-светодиодики-кнопочки, и нашим итоговым заданием было придумать и собрать что-то похожее на квест-комнату, несколько мини-игр с использованием этих инструментов. Этот курс мне тоже очень понравился, но не благодаря практической полезности (которой здесь не очень много), а именно благодаря интересности самого задания.

Во время курса у нас были лекции, на которых объясняли основы работы с ардуино, а потом и с разными дополнительными компонентами. Плюс были небольшие задания на каждую тему для закрепления материала. Но эти задания не оценивались, поэтому их я даже не открывал, а 90% пар проскипал. Первый раз я открыл Arduino IDE за два дня до дедлайна, и это был самый интересный кодинг-спидран за долгое время! Не так часто получается ловить это состояние потока, когда порой забываешь даже пойти пообедать, настолько погружаешься в проект. А в этом случае сверху добавляется ещё и приятный код, и мгновенная отдача.

Признаюсь сразу: большую часть бойлерплейта за меня написал курсор. Я же в основном занимался бизнес-логикой (эйаю я это не доверял) и разгребанием багов, которые он нагенерил (например, минут 30 потратил на раскапывание того, что у меня не работал экранчик, потому что курсор перепутал порядок аргументов при передаче их в библитеку). Думал, что идеи для самих игр будет сложно придумать, но в итоге вышло несложно и даже, мне кажется, прикольно. Особенно мне понравилось использовать аналоговый ввод (крутилка-потенциометр).

В общем, что я сделал:
- 4 мини-игры: 2 спокойные, 2 на время. Постепенно увеличивающийся уровень сложности, система жизней.
- Таймер, визуализация (точнее, сонификация) оставшегося времени с помощью баззера. Была ещё визуализация на экранчике, но я её так нигде и не использовал.
- Система набора очков.
- Простенькая FSM для переключения состояний (начало, победа, поражение, плюс по состоянию для каждой игры). Классовая структура кода, где каждая игра изолирована в свой файлик. Плюс классы-обёртки для работы с периферией.

В комменты запихну дополнительные материалы: мануал по играм, мини-репорт по реализации и видео с демонстрацией, которое от нас требовалось записать для сдачи проекта (на нём плохо что-то слышно и видно, но мне было лень записывать ещё раз).
🎓 Сейчас у нас в универе есть групповой проект, и во второй четверти этого года у нас тоже был групповой проект. Оба должны быть похожи на работу с реальным клиентом, но есть нюансы.

- В первом проекте у нас был «искусственный» клиент в виде одного из преподавателей, во втором — люди из реальной компании, которые нас даже к себе в офис пригласили
- В первом проекте мы пилили очень обособленный и изолированный продукт, во втором — не столько важна сама функциональность продукта, сколько интеграция с существующими системами
- В первом проекте «клиент» строил из себя такого человека-загадку, «я всё знаю, но не скажу, пока вы меня не спросите». Во втором — люди из компании не хотят ничего скрывать, просто по ним видно, что они сами не до конца разобрались, что и как им надо.

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

В принципе, текущий проект очень даже похож на реальные рабочие задачи. Может быть, даже чуть сложнее, потому что на работе у меня есть неограниченные ресурсы коллег и менеджмента, чтобы разобраться в проблеме, а тут от нас ожидается, что мы будем более автономны как команда.

Но особенно я был удивлён тому, насколько в таких проектах идёт упор на организацию работы. От нас сейчас ожидается, что мы распределим роли в команде, узнаем от клиента ТЗ, разобьём его на задачки и запланируем спринты, поресерчим реализацию и согласуем её с клиентом, напишем MVP, а потом добавим остальные фичи. В российских универах меня точно такому не учили, довольно долго я работал по принципу «сейчас что-нибудь попробую написать, если не получится — приду спрошу». А тут прямо очень большой упор на это, кажется это наш четвёртый командный проект за два года.
🗓️ Решил попробовать Timestripe

Это такой трекер задач/планов/целей с упором на долгосрочное планирование. Пока что пользовался очень недолго, но вот какие фичи меня зацепили:

- Максимально широкий спектр временных интервалов. Можно поставить задачку и на завтра после обеда, и на следующую неделю, и на следующий год. Удобно вносить и краткосрочные планы, и долгосрочные цели.
- Задачи можно бесконечно дробить на подзадачи. И у каждой подзадачи может быть своя цель по времени. То есть к задаче «выучить нидерландский до B1» на 2025 год можно привязать подзадачу «выбрать репетитора» на завтра. И это помогает связать долгосрок и короткосрок. Становится проще следить, а для чего я вообще это делаю. Оказывается, важный элемент в моей мотивации.

Но, конечно, не всё идеально. В частности, напрягает UX в мобильном приложении: каким-то образом не смогли сделать нормальный дашборд, где видно все задачи на этот день/неделю/месяц. И в целом интерфейс не очень отполированный: навигация, анимации, менюшки. Не в укор разработчикам, просто заметно, что Linear или Notion, наверное, вложили в это раз в 10 больше усилий.

В общем, первые впечатления — восторг. Очень давно искал что-то такое. Пробовал Notion, он вполне ок для долгосрочного планирования, но совершенно непригоден для краткосрочного. Пробовал Apple Reminders / Google Tasks — наоборот, краткосрочно ок, но для долгосрочного полная каша. Осталось понять, стоит ли этот восторг $10 в месяц...
🎧 Обзор на Sennheiser Momentum 4

Последние пару лет я пользовался исключительно AirPods — сначала Pro, а потом Pro 2. Они хорошо покрывали мои нужды: звук, шумодав, переключение между девайсами (на удивление хорошо работает даже с не-яблочными устройствами). Но недавно мне в голову засела мысль: «Я хочу полноразмерные наушники с ANC». И я сел выбирать. Моими опциями оказались:
- Sony WH-1000XM4. Их я не захотел брать по одной простой причине: у меня уже были XM4 до подсов, и ну не офигели ли продавать одни и те же наушники 4 года подряд?
- Sony WH-1000XM5. Судя по обзорам и отзывам владельцев, по некоторым параметрам даже даунгрейд по сравнению с XM4.
- Bose QuietComfort Ultra. Судя по обзорам — неплохие, но ценник заметно выше — ~€300+ по сравнению с ~€200+.
- Apple AirPods Max. Какая-то оверпрайс игрушка за 500 евро.
В общем, все варианты были так себе, поэтому я остановился на Sennheiser Momentum 4, несмотря на то, что им тоже уже 2.5+ года. Купил их я за €230.

🔊 Звук
Дисклеймер: я вообще не эксперт по звуку и слово «эквалайзер» до последнего времени вызывало у меня страх. Но звук вообще не впечатлил, я бы даже сказал разочаровал. Я ожидал заметного улучшения по сравнению с подсами, но получил лютейший бассбуст, который буквально мешает слушать музыку. Покопавшись пару часиков в эквалайзере, я смог довести звук до приемлемого уровня (по большей части это значило «урезать басы»), но осадочек всё равно остался. Как минимум потому, что мне хотелось, чтобы хорошо звучало из коробки.

📱 Приложение
Я не был особо удивлён, но приложение — прямо отстой. Пользоваться почти невозможно, да и не очень-то и нужно.

🛜 Мульти-девайс
Я понимаю, что это не самый частый юзкейс, но мне очень важно, чтобы наушники могли адекватно работать с 3+ девайсами. Потому что этих девайсов у меня хоть отбавляй: как минимум 2 телефона, 2 ноутбука, ПК, планшет и стимдек. Понятно, что не всем сразу нужны наушники, но двумя ограничиваться не хочется.
Так вот, сенхи умеют подключаться только к двум девайсам одновременно. Бесшовное переключение с одного на другое работает в принципе неплохо, но суть не в этом. Для того, чтобы подключить третье устройство, надо сначала отключить наушники от одного из двух подключенных. Или зайти в приложение, но это ещё хуже. Но я в целом не удивлён, XM4 работали точно так же. Для сравнения, AirPods Pro можно привязать к любому количеству девайсов и переключаться между ними буквально одной кнопкой: новый девайс «утягивает» наушники от предыдущего в одностороннем порядке. И это дико удобно.

🙉 Шумодав
Ну тут в принципе не прикопаться, шумодав хорош. В самолете лететь приятно. Прозрачность супер искусственная, как и у XM4, но я ей в любом случае не пользуюсь.

В общем, я скорее пал жертвой своих ожиданий. Если бы это были мои единственные наушники, я бы наверное и не особо жаловался. Но по сравнению с AirPods Pro 2 получился даунгрейд почти по всем фронтам. А самое главное, я разочаровался во всём форм-факторе полноразмерных наушников: я думал, что они комфортнее внутриканальных, а в итоге оказалось, что никаких плюсов я не заметил, но зато в них потеют уши. Короче, сенхи я скорее всего верну обратно в магазин и ещё годик не буду задумываться об апгрейде наушников. Ну может только проводные затычки погоняю, без удовольствия.
Ценой невероятных усилий смог опустить количество супергрупп+каналов в своем аккаунте ниже 500

Регулярно упирался в этот лимит ещё лет пять назад, поэтому купил телеграм премиум сразу же как только он вышел. Но недавно он у меня закончился, и я обнаружил себя с 750+ группами+каналами и невозможностью вступать в новые. Покупать премиум опять — как-то лень, да и моветон уже.

Пришлось безжалостно пройтись по старым каналам и группам и ливнуть из лишних. Причём клиенты телеги регулярно «теряли» чаты, просто не показывали их в списке, а при поиске по названию таки прогружали с сотней непрочитанных постов. Я так и не понял, что это за приколы такие. Наиболее стабильным источником правды оказался самописный скрипт на https://play.mtcute.dev/, который итерируется по всем чатам и фильтрует их по типу (supergroup + channel)
Каждый раз поражаюсь этому челу. Что ни видео — творит какую-то абсолютную магию с iOS, иногда используя приватные апишки и декомпиля всё подряд по пути. Причём заставляя это выглядеть таким увлекательным и простым, что мне самому хочется полезть играться в XCode

https://youtube.com/watch?v=NdJ_y1c_j_I
📐 Measure Everything

Недавно нашёл прикольное расширение для веб-разработчиков, которое позволяет в пару кликов померить размеры элементов на страничке и расстояния между ними. Что-то типа линейки в фигме, но каким-то образом в 10 раз приятнее для использования. Очень полезно для pixel perfect верстки.

Вот ссылки для установки: Firefox, Chrome
🔥 Вастрик.Кэмп 2025 — это было легендарно

Только что вернулся с Вастрик.Кэмпа и до сих пор не могу прийти в себя — эмоций столько, что сложно подобрать слова. Если коротко, Кэмп — это полузакрытый 4-дневный офлайн-ивент от и для участников Вастрик.Клуба. Но на самом деле это намного, намного больше!

Больше всего мне понравилось такое описание: «Кэмп — это как детский лагерь, только для взрослых». Хоть я и ни разу не ездил в лагерь в детстве, я всё равно прочувствовал этот вайб. Несмотря на то, что нас было целых 150 человек, я никогда прежде не ощущал такой сильной атмосферы общности и взаимовыручки. А организаторы — вообще лапочки: добрые, заботливые, внимательные к каждой мелочи.

🌟 Активности
Как и полагается в настоящем лагере, активностей было выше крыши. И почти все они были организованы волонтёрами — такими же клубчанами, как и я. Кто-то разливал напитки на баре, кто-то заваривал чаи, кто-то привёз всякие интересные железки и рассказывал о них. Активностей было столько, что попасть на все было физически невозможно. Вот мои хайлайты:

🏴 Основал страну
Кэмп проходил всего в нескольких километрах от Либерлэнда — непризнанного микрогосударства на острове между Сербией и Хорватией, который не хочет признавать своим (в силу особенностей территориальных споров) ни одна из стран.
Высаживаться туда незаконно, но мы увидели его берега с борта катера. Зато мы высадились на другой ничейный остров и провозгласили там Вастриклэнд! Теперь там гордо стоит наш самодельный флаг из палки, листа бумаги и наклейки с лого Клуба. Мне посчастливилось участвовать в этой экспедиции.
Позже мы даже заключили официальное торговое соглашение с Либерлэндом, в рамках которого обменяли 1 (один) костюм со светящимися крыльями на 1 (одну) плескавицу.

🗺 Поучаствовал в пивном ориентировании (спортивное ориентирование + пиво) и занял первое место. Получил за это набор отверток от ifixit, которые потом отобрали в аэропорту :(
💃 Танцевал на воркшопе по парным танцам — особенно круто было делать то, чего я бы в обычное время даже не попробовал
🪩 Круто пофлексил на рэйве под диджей-сеты от клубчан
🗣 Занетворкался с десятками людей из разных стран
🏕 Поспал в палатке — как в настоящем лагере

📡 А ещё были...
• мини-CTF
• чайный клуб
• кальянная
• турниры по настольному футболу и покеру
• баня
• квест, вместо которого я поехал основывать Вастриклэнд
• что-где-когда
• собственная радиостанция на 100.7FM
• официальные сербские почтовые марки с символикой кэмпа
• ещё с десяток лекций, воркшопов и мастерклассов на самые разные темы

Но все эти активности не принесли бы и десятой части эмоций, если бы не общий вайб.

💙 Итог
Как вы уже поняли, я в полном восторге.
За билет я отдал €650 — и это стоило каждой копейки.
Теперь с нетерпением жду следующего Кэмпа и других ивентов от Клуба.

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

Ну, не совсем так. Большая часть потока реки Ниагара (от 50% до 75%), на которой и находятся водопады, используется для генерации электроэнергии. Чтобы водопады совсем не обмелели, в 1950 году США и Канада подписали соглашение, в рамках которого было установлено, что через водопады должно протекать минимум 100000 ft³/s (2800 м³/с) воды. А по ночам и вне туристического сезона — вдвое меньше (50к)!

Очень забавно, как даже самую настоящую природную достопримечательность переводят в экономный режим, чтобы извлечь побольше пользы.

Подсмотрел в косвенно связанном видео «What if you funneled Niagara Falls through a straw?» от What If
Автодополнение по Tab в Cursor — одна из тех фич, без которых потом не можешь работать.

Главная магия не в дописывании нового кода, а в предложении изменений прямо в существующем. Начинаешь менять название переменной — Cursor подсвечивает все места, где её нужно поменять. Рефакторишь условие — получаешь предложение переписать весь блок. Всё это без промптов, просто работаешь как обычно, а IDE угадывает твои намерения.

В опенсорсных аналогах такого не встречал ни разу. А для меня это прям киллер-фича — хотелось найти что-то подобное, но обязательно локальное, чтобы кодить хоть в бункере без интернета.

Несколько месяцев назад Zed выкатил свою версию под названием Edit Prediction. Но самое вкусное — они выложили в опенсорс модельку, которую для этого используют. Зафайнтюненная Qwen2.5-Coder-7B, полностью открытая и доступная для экспериментов.

Правда, есть нюанс — в самом редакторе модельку можно использовать только через их облако (ну конечно же, платно). Покопавшись в интернете, наткнулся на проект zed-zeta-server. Автор проекта зареверсил протокол и создал элегантное решение: локальный сервер, который притворяется облаком Zed, перехватывает запросы и перенаправляет их в твою локальную LLM. А сам Zed нужно просто настроить на использование локального URL вместо облачного — и, как ни странно, для этого они оставили специальную env-переменную!

В общем, я с энтузиазмом первооткрывателя всё это поднял. Завелось почти без проблем, но вот производительность неприятно удивила. Оказалось, даже на моём M4 Max модель выдаёт всего 60 токенов в секунду, что при типичной длине предсказания в 300 токенов превращается в медитативные 5 секунд на каждую правку.

(Почему 300 токенов? Для предсказания изменений модель получает кусок кода в радиусе 5-10 строк от курсора и должна вывести его целиком с изменениями. Даже если менять ничего не надо — всё равно 300 токенов на выход)

Короче, мечта о локальном Edit Prediction пока разбилась о суровую реальность. Но чуваку-реверсеру — огромный респект, по комментариям в коде прям чувствуется, как он кайфовал от исследования протокола.

Может, через пару поколений железа или нейронок это взлетит. А пока остаётся философски выбирать: платить за облачную магию или смириться с тем, что будущее пока не наступило.
Как вы знаете, несколько месяцев назад команда Typescript публично анонсировала переписывание компилятора с собственно Typescript на Go. Обещали ускорение в 10 раз, что в принципе звучит реально, учитывая, что текущий компилятор однопоточный.

Вся разработка ведется публично в репозитории typescript-go, доступны экспериментальные сборки. Полную feature parity обещают к концу года. Раньше он мне казался слишком сырым для реального использования, но на самом деле немалое количество фич уже поддержано.

Решил протестировать его в нашей продакшен монорепе, в частности для подсказок в IDE (для сборки пока что всё-таки ещё сыроват, в частности из-за отсутствия поддержки target-ов отличных от esnext). Обычный тайпскрипт там просто задыхается, ответов от LSP можно ждать секунд по 10. Завести было подозрительно легко: всего лишь поставить расширение и включить нативный режим.

Я думаю, никого не удивлю, если скажу, что стало быстрее. Прямо конкретно быстрее. Подсказки появляются раньше, чем успеваешь дописать название переменной. Раньше так было только в небольших проектах, а теперь и в огромной монорепе на 350к строк кода. Каких-то критичных регрессий не заметил, разве что переименование переменных пока не завезли, кажется.

Но главный минус в том, что я не смог завести нативный режим в курсоре. Дело в том, что курсор (и другие форки vscode) по лицензии не могут использовать Visual Studio Marketplace, и вместо этого они тянут расширения из сторонних источников, например open-vsx. И расширения туда нужно публиковать отдельно, и разумеется Typescript этого не сделал. Но это только полбеды: я кое-как сумел стянуть .vsix файл расширения из стора, и оказалось, что оно поддерживает только новые версии vscode, а актуальная версия курсора построена на базе v1.96.2, релизнутой в ноябре прошлого года. Пришлось запускать сам vscode.

И хоть я попробовал и Copilot, и Supermaven, всё равно они даже близко не стоят с качеством подсказок в курсоре. И получилась такая неприятная дилемма: либо молниеносный LSP в обычном vscode, либо гениальные AI-подсказки в медленном курсоре. День покодил по-старинке и понял — без нейросетей уже не то. Жду, когда курсор обновится и можно будет получить всё и сразу. Вот тогда заживём.
2025/06/29 15:55:37
Back to Top
HTML Embed Code: