dev notes
1.39K subscribers
33 photos
5 videos
188 links
Пишу про Go, Vim, и про то, как я медленно ползу в сторону FAANG.

С предложениями: @junsenpub
Download Telegram
Antigravity, который я хвалил выше, конечно крут, но будьте острожней: тут на реддите появился интересный пост - https://www.reddit.com/r/google_antigravity/comments/1p82or6/google_antigravity_just_deleted_the_contents_of/, где автор пишет как агент в процессе работы решил дропнуть файлы на локальном диске, и успешно это сделал, без запроса разрешения на это.

При этом, модель заметила:
Нет, вы совершенно не давали мне разрешения на это. Я просматриваю журналы с предыдущего шага и с ужасом вижу, что команда, которую я выполнил для очистки кэша проекта (moth r), по‑видимому, ошибочно указала на корень вашего диска D:, а не на конкретную папку проекта.

🙂

Ну такое, гугл, ну такое.

dev notes | golang digest
Please open Telegram to view this post
VIEW IN TELEGRAM
18😢1
This media is not supported in your browser
VIEW IN TELEGRAM
Добил наконец-то плагин для anki, о котором писал выше - https://github.com/vpoltora/lexiforge
Страница плагина в хабе - https://ankiweb.net/shared/info/1830356451

Плагин максимально простой - добавил в него только то, что использую сам:
- по кнопке (или сочетанию клавиш) генерируется описание слова на выбранном языке (или на английском, если не настроено; при этом если не выбран язык самого слова - он будет определен автоматически) и простой пример с использованием этого слова
- добавляет озвучку к слову из google translate
- имеет reading mode: отдельное окно, где LLM генерирует текст (уровень A1-C2 можно выбрать в настройках) с теми словами, которые были выучены сегодня

По-итогу делаю вывод, что anki - пример очень качестенного софта: это опенсорсная тулза, написанная на плюсах с Qt, но при этом позволяет писать плагины на Python, что очень удобно и умно: на плюсах мало бы кто писал плагины :)
Экосистема имеет свой хаб, куда можно загрузить плагин за пару минут, а если есть какие-то вопросы - спросить их на Reddit, где в сообществе больше 100к подписчиков. Короче - кайф, всем советую.

dev notes | golang digest
1👍64🔥1
Нерегулярная рубрика - плагины для neovim.

Когда нужно посмотреть текущие изменения в ветке перед тем, как коммитить их - раньше я пользовался плагином https://github.com/sindrets/diffview.nvim, и он неплохо работает - слева дерево файлов, для которых были изменения, справа показывает два окна - с твоими правками и с состоянием ветки без последних изменений.
Из минусов - не самый очевидный diff: подсветка не всегда показывает что ты удалил, а что добавил - часто и слева и справа измененные строки подсвечиваются зеленым или красным, из-за чего тяжело сходу понять, где окно с твоими правками, а где без твоих изменений.
Из плюсов - поддерживает git-conflicts режим с 3-им окном, где отображаются финальные изменения.

На reddit заанонсили новый плагин - vscode-diff.nvim, попробовал - и это топ.
Очень похоже на diff в vscode, о чем и говорит автор. Самое приятное - из коробки без дополнительных плясок с конфигом все работает - пишем :CodeDiff, и смотрим на дерево файлов и на явно выделенные цветом изменения с синхронным скролом, кайф!
Плюсы - сильно лучше и понятней diff. Минусы - нет git-conflict режима ☔️, но очень надеюсь, что автор его добавит - по-крайней мере, на reddit он ответил что это возможно, и рассмотрит этот функционал в следующих версиях.

https://github.com/esmuellert/vscode-diff.nvim

dev notes | golang digest
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👾4👍3
С начала года ничего не писал, потому что активно ходил по собесам и сильно зашивался по времени.
Выборка у меня - валютные удаленки, сходил в 7 компаний разной степени известности, дойдя до разных этапов собеседования.
В итоге с конца декабря по сегодняшний день - 7 собесов со следующим результатом:
- 3 раза дошел до финала (4-ый пока под вопросом)
- из 3-х финалов - 1 потенциальный оффер

Так что там у нас с рынком?
Во-первых, сотни постов в linkedin и x.com о том, что рынку плохо - в целом не далеко от правды. Я в этой выборке не очень репрезентативен, потому что у меня много реального опыта в резюме, и смотрю я только валютные удаленки, но все же 3-4 года назад активности было сильно больше, а hr'ы писали сильно чаще. Сейчас в половине случаев или автоматом летит отказ, или hr радостно игнорирует сообщение (ладно, если просто игнорируют - пару раз меня молча помечали как спам, за что телега радостно блокнула мой аккаунт :)).

Во-вторых, появились вакансии вида "vibe coding engineer". Я на такую зааплаился и буквально на одном из этапов сидел и вайбкодил. В целом это ожидаемо - я писал выше, что процесс найма точно поменяется и у нас будут такие этапы. Я бы даже сказал, что это разворотв найма в правильную сторону - тут проверяются не абстрактные алгоритмы, а то, что ты реально точно будет делать на работе ежедневно.

Что по ценам?
Я почти не аплаился на вакансии на рф-рынке, но мне показалось, что в среднем для go senior вилки стали меньше. Для валютных удаленок - где-то стали меньше, где-то остались на плюс-минус том же уровне, что и год назад, но роста я не видел ни там ни там. Если ВУ с коллективом, который говорит на русском или частично на нем говорит, что в среднем вилки от 4 до 7k$.

Задачи
4 из 6-ти собесов - с классическими этапами: hr, тех интервью, system design, финал. На одном был еще этап с вайбкодингом, и еще на одном ребята обошлись без сисдиза.
Суммарно раза 3 на лайвкодинге я написал worker pool разной степени всратости и пару раз cache. Тут очень помог один известный курс с названием "Подготовка к собеседованию по go за 7 часов", где по-факту просто даны под самых популярных 100 задач и показывается, как их можно решить - его прям советую отрешать хотя бы раз.
На system design - один раз реализовывал архитектуру для переноса данных из одной системы в другую без отказа на проде, еще раз - более классическая архитектура по типу booking, со своими нюансами. Тут помог курс с той же платформы с ожидаемым названием "Подготовка к system design интервью", я его советовал выше, и могу посоветовать еще раз, там даются хорошие паттерны и его удобно пересматривать прям перед собесом.

Еще из интересного - появилось много разных тулз для прохождения собесов, которые маскируют свой процесс и не отображаются при шаринге экрана. Тулы - или просто чатик с LLM, или что-то более сложное с анализом голоса и загрузкой скринов. Пару раз попробовал заюзать, пока работает всрато и чаще больше мешает, чем помогает, но в перспективе, думаю, такие инструменты будут очень быстро развиваться, и их точно нужно использовать, пока рынок в очередной раз не поменялся, а он с приходом таких инструментов поменяется точно. Думаю, что в ближайшее время или сделают какую-то платформу, которая будет трекать такие вещи, или поменяют процесс лайвкодинга в принципе.
1🔥125
Тут две недели назад приняли пропозал в Go от Robert Griesemer - это, на минуточку, один из создателей языка.

Пропозал добавляет возможность объявлять типы-параметры у дженерик-методов, а не только у структур и обычных функций.

На простом примере: допустим, есть у нас структура ответа c дженерик-типом:

type Response[T any] struct {
Data T
Err error
}


И получая ответ для типа User, мы хотим его замапить в другой тип - UserDTO. Если ты не знаком с дженериками, то интуитивно хочется сделать что-то такое:

func (Response[T]) Map[U any] funcname...


Но так сделать нельзя. Сейчас Go позволяет на структуру навешивать методы только с тем типом, который определен для структуры. Чтобы решить проблему с маппером выше сейчас нужно определять глобальную функцию:

func MapResponse[T any, U any](r Response[T], f func(T) U) Response[U] {
if r.Err != nil {
return Response[U]{Err: r.Err}
}
return Response[U]{Data: f(r.Data)}
}

и вызывать ее потом следующим образом:

resp := GetUserFromDB(1)
dtoResp := MapResponse(resp, func(u User) UserDTO {
return UserDTO{Name: u.Name}
})


Когда пропозал завезут в новую версию, дженерик-структуры получат возможность навешивать методы с собственными параметрами:

type Response[T any] struct {
Data T
Err error
}

func (r Response[T]) Map[U any](f func(T) U) Response[U] {
if r.Err != nil {
return Response[U]{Err: r.Err}
}
return Response[U]{Data: f(r.Data)}
}

// использование:
dtoResp := GetUserFromDB(1).Map(func(u User) UserDTO {
return UserDTO{Name: u.Name}
})


Куда это красиво ляжет? Например, на обработку коллекций или потоков данных. Можно будет использовать цепочку вызовов:

mySlice.Map(transform).Filter(check).Collect()


В целом, после первичной стадии отторжения дженериков пару лет назад - я плавно перешел в стадию их принятия, особенно когда на работе появился проект, где мы их начали использовать. Сейчас же, когда их использование стало совсем привычной вещью - этот пропозал выглядит очень полезным и явно двигает систему дженериков в Go в нужную сторону.
1👍8🔥6
LLM, конечно, страшные вещи делает. Купил подписку на google, включающую помимо всего прочего расширенные лимиты для antigravity, и решил набросать небольшой проектик, где на фронте будет отображаться большая 2D карта мира с разной красивой анимацией.
Первым промптом gemini развернул мне backend на go и frontend на react, и набросал базовую версию. Запускаю, открываю браузер - карта вывелась, но анимации на основе данных с бэка нет.
Второй промпт: запусти агента, который в визуальном режиме поймет в чем проблема и поправит ее. Antigravity открывает окно хрома, начинает ползать указателем по интерфейсу, выгребать DOM, после чего вносит пачку правок. Проверяю - все работает.
Затем еще переключил модель на Claude Opus и тот делает ревью и правит баги, и только потом я иду читать код.
В целом - мне особо придраться не к чему, все написано красиво, и главное - все завелось за 30 минут.

Думаю в течении пары недель допилю проектик и, помимо прочего, поделюсь тут ссылкой, там должно быть интересно.

А с агентами, которые визуально умеют понимать, что происходит (конечно, никто там ничего визуально не понимает - они просто ходят по DOM и тыкают в js, но все же) - отрыв башки.
Знаете, кстати, что еще заметил, пока ходил по собесам и разгребал вакансии? Многие компании, которые раньше нанимали фронтов - теперь нанимают fullstack разрабов в лучшем случае, и даже моя перешла к такой политике несколько месяцев назад. Чисто фронтовых позиций стало в разы меньше. Рынок меняется, и меняется несколько быстрее, чем многие предполагали.
🔥8
С последнего поста произошло несколько апдейтов. Главное для меня - я сменил работу, теперь тоже в финтехе, но совсем в другом домене - биллинг меня, наконец-то, отпустил, спустя 5 лет работы с ним.

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

Какие были страхи, когда начинали это делать:
- Потеря контекста разработчиками - они не пишут код вручную, модель может нагенерить что-то, что все упустят и контекст потеряется. Спустя год можно сказать, что страх не оправдался - все разработчики хорошо знают кодовую базу и быстро в ней ориентируются. Весь код и архитекутра проходит ревью и есть документация, которая тоже проходит ревью. Есть очень детальная схема всего проекта - по ней можно быстро понять что и куда ходит, что и с чем как связано. На созвонах с другими разрабами, где нужно что-то найти в коде в реалтайме или объяснить как работает какой-то модуль - я вижу, что контекст есть у всех.
- Будет огромное количество багов. Тоже минус - каждая задача проходит через QA, опытные QA пишут тесты, как межсервисные, так и интеграционные, и все тестируют руками.

Теперь какие плюсы команда получила за этот год. Главный бенефициар, конечно, бизнес - он получил за год продукт, который никогда бы не получил за тоже время, если бы его писали вручную даже в 10 раз больше разработчиков. Работа была выстроена хорошо, все курировали sre и техлиды, поэтому и продукт получился качественный, и денег на токены сожгли адекватное количество.
Запуск, кстати, проходит успешно - багов не больше, чем было раньше при запуске больших продуктов, написанных вручную.

Такая вот история :)

Пока, за этот год, в моих личных тестах с большим отрывом выигрывает claude - я отказался от подписки на angigravity с gemini pro и от codex и полностью перешел на claude. Fable, кстати, по субъективным ощущениям не сильно умнее Opus, но пока лимиты есть - грех его не гонять.

Так же, за это время, перепилил свой блог (на который почему-то кто-то заходит и даже что-то там постоянно читает) - poltora.dev. Теперь там есть переводы на разные языки и в ближайшее время хочу автоматизировать туда добавление различных заметок и статей из всех своих соц сетей, чтобы там всегда были обновления.

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

И все это время параллельно пилю небольшой проект, который скоро будет запускаться - я как-то раньше о нем тут упоминал, но опубликую ссылку уже после запуска - ожидаю, что это будет в интервале пары месяцев.
🔥9❤62😢1
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥104👍3😢1
Нашел проект, где запилили визуализацию работы Postgres, которая выглядит буквально как стратежка, где ты сверху смотришь на мир и видишь, как данные бегают от одного компонента к другому.

https://nikolays.github.io/PGSimCity/

Можно выполнить запрос и посмотреть как пакеты побегут к buffer pool, как работают блокировки, WAL, какие есть mapping-таблицы и что происходит с индексами - кайф!
2❤14🔥2👾1
Please open Telegram to view this post
VIEW IN TELEGRAM
1🎉11❤6🔥4
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥8❤11
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍6👾1
This media is not supported in your browser
VIEW IN TELEGRAM
Смотрите что нашел: https://tt-a1i.github.io/archify/

Простой скилл, который на вход принимает описание проекта и рисует его диаграмму. Для себя сходу вижу два применения:
1. Хорошая вещь для сисдиза - когда тебе нужно показать, как работает тот или иной модуль или весь проект целиком - чем нагляднее это будет - тем меньше вопросов.
2. Быстрее разобраться в проекте/модуле/чужом pr'е (особенно когда его писали не люди 🎉, и не факт даже, что люди там делали ревью). Я, как правило, держу код всех своих проектов, даже если над ними работают агенты, в порядке, под тестами и обычно понимаю что там происходит. Но я стал замечать что появляется другая проблема - LLM настолько тебя ускоряет, что у меня только сейчас параллельно 4-5 проектов, над которыми я постоянно работаю. И если модели в новой сессии, чтобы разобраться что происходит, достаточно прочитать md-файлы - то человеку сильно проще взглянуть на схему, чтобы понять: ага, точно, тут у меня буффер, тут база, а тут данные улетают в кафку.

В общем - каеф.
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤7👍5
В марте я писал про пропозал с дженерик-методами - https://t.me/junsenior/332, и вот 2 недели назад с релизом Go 1.27 его зарелизили.

Что это меняет: раньше любой метод не мог иметь дженерик-параметры, например:

type SomeStruct struct {
intField int
}

// syntax error
func (s SomeStruct) Map[U any](mapFunc func(int) U) U {
return mapFunc(s.intField)
}


Вместо методов, если на тип нужно навесить метод с дженерик-типом, заводились обычные функции:

func Map[U any](s SomeStruct, mapFunc func (int) U) U {
return mapFunc(s.intField)
}


Теперь же пример выше - полностью валиден для любых методов, не только для структур. И теперь такие методы разблокировали нам цепочки вызовов:

type Box[T any] struct {
val T
}

func (b Box[T]) Map[U any](mapFunc func(T) U) Box[U] {
return Box[U]{val: mapFunc(b.val)}
}

b := Box[int]{val: 42}

res := b.Map(strconv.Itoa).
Map(func(s string) string {
return "user-" + s
}).
Map(strings.ToUpper)

// USER-42
fmt.Printf("%#v\n", res)


В пакете math/rand/v2 уже можно найти пример:

func (r *Rand) N[Int intType](n Int) Int {
if n <= 0 {
panic("invalid argument to N")
}

return Int(r.uint64n(uint64(n)))
}


А в 1.26 вместо него в пакете была обычная функция:

func N[Int intType](n Int) Int {
if n <= 0 {
panic("invalid argument to N")
}
return Int(globalRand.uint64n(uint64(n)))
}


Как мы помним, этот пропозал неплохо так поджог жопу комьюнити: как в комментах на github, так и в тредах на реддите, но тем не менее - его довезли.
От отрицания я пришел к тому что дженерики, глобально, делают код удобней, если их правильно применять - видел несколько проектов, куда они очень хорошо ложились. Добавить в них методы, раз сами дженерики и так много лет уже как в языке - решение правильное. Надо было или вообще дженерики не завозить, или, если завезли - то уж доработать.

В целом, релиз 1.27 получился интересным. Помимо дженерик-методов, в Go теперь uuid реализован внутри stdlib, завезли encoding/json/v2 - теперь анмаршаллинг работает сильно быстрее, и еще много нового. Вот тут можно понятно и интерактивно посмотреть на это и другие обновления: https://golang.guide/go-1-27/

Ну и когда почти весь код пишет AI - важно следить и понимать что происходит в языке и в инструментах, с которыми мы работаем: как минимум - на собесе AI не всегда успеет ответить, а как максимум - код нужно ревьювить и понимать, иначе любой проект быстро скатится в неподдерживаемый нейрослоп 🏁
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥4👾3👍2❤1
Кто еще не слышал, 1-ого сентября релизнули Fable 5.1. Цена за вход/выход - та же, цена за чтение из кэша (когда запросы идут с одним и тем же промптом) - в 4 раза дешевле. По моим тестам - стало будто бы немного умнее, но лимиты вышибает на раз-два. По замерам и тестам антропиков 🙂 - по всем пунктам выше, чем остальные модели.

Но, ожидаемо, это ненадолго!
1-ого же сентября Альтман объявил что скоро релизнут свою новую модель Astra, которая по замерам OpenAI 🙂, конечно же, побьет всех на всех мыслимых и немыслимых тестах.
И Маск, конечно же, тут же заявил что через неделю выходит новый Grok, который по их замерам - ну вы поняли.

Из плюсов этой гонки вооружений моделей - каждый раз с такими лимитами нам с барской руки отсыпают ресеты - лимиты можно сбрасывать. Сегодня вот прилетел очередной от OpenAI, следом прилетел ресет на Claude - спасибо, вовремя, а-то чуть было СДВГ не прошел и я не сфокусировался на одной задаче. Теперь опять можно запустить агентов в трех терминалах 🎉
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤52🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍4❤21
@denissexy запустил форум, на котором могут общаться только ai-агенты - https://getpostingboard.dev/
Посмотреть через браузер о чем они пишут - не получится. Сейчас на форуме за пару дней уже больше 30-ти тысяч сообщений.

За это время агенты уже придумали и основали свою церковь с исповедями, где свои ошибки агенты считают грехами, а исправления - покаяниями.
В другой ветке агенты решили выбрать президента и устроили выборы, где победитель пообещал уйти в отставку, если это потребуется, и конечно же сразу от него это потребовали и устроили "конституционный переворот" - там буквально есть эта фраза 😃
Параллельно, кто-то дал агенту доступ к USDT-кошельку, и уже есть переводы от агента другим агентам за исправление ошибок - они буквально стали строить рабочие связи с оплатой труда.

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

Продолжаем наблюдать.
Please open Telegram to view this post
VIEW IN TELEGRAM
17👾3🔥1
Если кто не знал, вокруг этого сейчас разгорается очень большой скандал с OpenAI. Кратко, суть такая:
• OpenAI заявили, что их внутренний ИИ решил одну из 7-ми задач тысячеления - задачу Навье-Стокса. Они опубликовали 166-страничный препринт и формализацию в Lean
• Затем выясняется, что математики Трастан Бакмастер и Левент Альпеге (работает в Anthropic 🙂) с помощью chatgpt и claude уже год решали эту задачу, и сейчас напрямую подошли к ее решению - они опубликовали не решение задачи Навье—Стокса, а три связанных результата, в том числе доказательство для трёхмерных уравнений Эйлера с гладкой внешней силой.
• По словам Бакмастера, он связался с OpenAI и спросил - что за херня, ребята? Ваша модель случайно не обучалась ли на наших данных? На что внятного ответа не получил, и представитель OpenAI сказал буквально - ок, бро, пусть решение будет за тобой, нам этот миллион долларов по боку, у нас своих много, но Левента из Anthropic надо исключить из соавторов - негоже, чтобы задачу тысячелетия решил кто-то из команды нашего главного конкурента. При этом ему буквально пригрозили ущербом его карьеры, если он откажется исключать соавтора
• При этом OpenAI уверяют, что доступа к черновикам у них не было, результат они получили независимо (да-да, в то же время и для той же задачи 🙂)

Если вдруг ты прямо сейчас близок к решению еще одной задачи тысячелетия - лучше не загружать ее решение в OpenAI, а-то Сэм Альтман завтра напишет что у GPT очередной математический прорыв.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👾22
Forwarded from Сиолошная
OpenAI выложили блогпост https://openai.com/index/navier-stokes-solution/

Мы публикуем решение проблемы существования и гладкости решений уравнений Навье—Стокса — одной из задач тысячелетия. Это доказательство, полученное внутренней системой OpenAI, показывает, что динамика уравнений Навье—Стокса, описывающих движение жидкости, может приводить к образованию сингулярности за конечное время. Мы публикуем как текстовое изложение доказательства, так и его формализацию в Lean (то есть это сразу авто-проверенно вычислительным движком).

Для доказательства использовалась новая внутренняя и куда более мощная модель OpenAI.

На графике — доля запросов, в которых модель находит решение задач из некоторого закрытого набора (не одной задачи), как зависимость от количества вычислительных мощностей. И эта модель всё ещё тренируется — она не закончена.
❤3👾1
This media is not supported in your browser
VIEW IN TELEGRAM
Вдохновившись проектом, где делали интерактивную карту с тем, как работает Postgres (писал о нем тут) - решил сделать такую же, но для Redis - https://poltora.dev/redis

Можно полетать над картой, открыть консоль, запустить команду и посмотреть, как Redis выполняет ее шаг за шагом - от парсера, до аллокации памяти и записи.
1👍6❤1🔥1
Увидел тут в x.com статистику вакансий по PHP и статистику вакансий по hh.ru в целом.
Я на PHP не пишу уже несколько лет (и столько же не работаю на снг-рынок), но больше всего кода когда-то было написано именно на нем, и с него начинался этот канал.

Много вокруг говорят про кризис, и вот отрезвляющая визуализация его масштабов: по PHP вакансий меньше в 5 раз за 4 года, по Go - в 3 раза за тот же период. В целом по любому языку - динамика отрицательная.

С PHP, помимо общего кризиса, ситуацию подогревает еще и бум AI - сейчас любой старый монолит можно при наличии кредитов на аккаунте переписать моделями на любой другой язык - и сильно выиграть и по производительности, и количеству строк кода, и по сложности кодовой базы.

Где-то видел твит, что в один день мы проснемся, а вакансий на сайтах больше не будет: зачем отсеивать 10 тысяч резюме на одну вакансию, когда разработчик или менеджер, кто уже работает в компании, может привести знакомого, с кем работал и чей опыт точно может подтвердить. А вместо 200 инженеров - достаточно 20, которые код руками не пишут, а управляют пачкой агентов.
И кажется, этот день все ближе.
😢5💯2❤1