Forwarded from Golang digest
This media is not supported in your browser
VIEW IN TELEGRAM
❓ Что не так с этим кодом на Go? И чего вы ожидаете на выходе?
На первый взгляд - всё понятно. Но на самом деле это ловушка 😏
Вы переопределяете iota как обычную константу, равную самой себе (iota = iota). С этого момента iota перестаёт быть магической переменной, и счётчик сбрасывается.
Поэтому Y получает значение 0, а не 1 — как многие ожидают.
Вывод программы: 0
💡 Мораль: никогда не переназначайте iota внутри const, иначе потеряете её «магию».
Запустить код: https://go.dev/play/p/7xu1qRUcp2O
Задачи: https://youtube.com/shorts/ynJtcC1XY5k?si=57kpfY4uV4HdsEkH
На первый взгляд - всё понятно. Но на самом деле это ловушка 😏
Вы переопределяете iota как обычную константу, равную самой себе (iota = iota). С этого момента iota перестаёт быть магической переменной, и счётчик сбрасывается.
Поэтому Y получает значение 0, а не 1 — как многие ожидают.
Вывод программы: 0
💡 Мораль: никогда не переназначайте iota внутри const, иначе потеряете её «магию».
Запустить код: https://go.dev/play/p/7xu1qRUcp2O
Задачи: https://youtube.com/shorts/ynJtcC1XY5k?si=57kpfY4uV4HdsEkH
❤4👍2🤬2🔥1
📚 Alexandrie - быстрое, open-source приложение для заметок в расширенном Markdown.
Идеально для студентов, исследователей и всех, кто ценит чистоту и порядок в мыслях.
✨ Возможности:
• Расширенный Markdown-редактор
• Мгновенный поиск по заметкам
• Удобная организация и архивация
• Экспорт в PDF, Markdown и др.
• Доступ с любого устройства
•
⚡ Бэкенд на Go, фронтенд на Vue
📦 Запускается локально через Docker за пару команд.
👉 GitHub: https://github.com/Smaug6739/Alexandrie
Идеально для студентов, исследователей и всех, кто ценит чистоту и порядок в мыслях.
✨ Возможности:
• Расширенный Markdown-редактор
• Мгновенный поиск по заметкам
• Удобная организация и архивация
• Экспорт в PDF, Markdown и др.
• Доступ с любого устройства
•
⚡ Бэкенд на Go, фронтенд на Vue
📦 Запускается локально через Docker за пару команд.
👉 GitHub: https://github.com/Smaug6739/Alexandrie
❤8🔥3👍2😁1
@golang_books
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Forwarded from Golang
🫖 Новый пост в официальном блоге GO: Green Tea GC - новый сборщик мусора в Go 1.25
В Go 1.25 появился экспериментальный сборщик мусора Green Tea GC, который уже используется внутри Google.
Он снижает время, проводимое в GC, примерно на 10%, а в отдельных сценариях - до 40%.
Активировать можно при сборке флагом:
📘 Как это работает:
▪ Классический mark-sweep в Go обходит граф объектов и помечает живые узлы, но делает это неэффективно: память фрагментирована, обращения случайны, кэш часто промахивается.
▪ Green Tea решает проблему, он обрабатывает кучу по компактным блокам (spans), сохраняя пространственную локальность и уменьшая межъядерные переходы.
▪ Это делает GC более предсказуемым и дружелюбным к CPU-кэшу.
💡 Что изменилось внутри рантайма:
- Объекты группируются по размеру в страницы (pages) и спаны.
- Маркер обходит память блоками, а не «прыгает» по указателям.
- Очереди задач GC выстраиваются так, чтобы кэш был «тёплым».
📊 Что показывают тесты:
- Большинство программ тратят меньше времени на GC.
- В реальных нагрузках - до 40% ускорения.
- В некоторых случаях применение почти ничего не дает, поэтому важно тестировать на своих данных.
Green Tea уже признан production-ready, и команда Go планирует сделать его GC по умолчанию в Go 1.26.
В целом, Green Tea GC делает сборку мусора в Go быстрее и стабильнее за счёт лучшей локальности и оптимизации доступа к памяти. Это первый серьёзный шаг к более эффективному, «кэше-дружелюбному» GC в Go.
⚡️ Подробнее - https://go.dev/blog/greenteagc
⚡️Видео: https://www.youtube.com/watch?v=he5PfBfte2c
@Golang_google
В Go 1.25 появился экспериментальный сборщик мусора Green Tea GC, который уже используется внутри Google.
Он снижает время, проводимое в GC, примерно на 10%, а в отдельных сценариях - до 40%.
Активировать можно при сборке флагом:
GOEXPERIMENT=greenteagc go build ./...
📘 Как это работает:
▪ Классический mark-sweep в Go обходит граф объектов и помечает живые узлы, но делает это неэффективно: память фрагментирована, обращения случайны, кэш часто промахивается.
▪ Green Tea решает проблему, он обрабатывает кучу по компактным блокам (spans), сохраняя пространственную локальность и уменьшая межъядерные переходы.
▪ Это делает GC более предсказуемым и дружелюбным к CPU-кэшу.
💡 Что изменилось внутри рантайма:
- Объекты группируются по размеру в страницы (pages) и спаны.
- Маркер обходит память блоками, а не «прыгает» по указателям.
- Очереди задач GC выстраиваются так, чтобы кэш был «тёплым».
📊 Что показывают тесты:
- Большинство программ тратят меньше времени на GC.
- В реальных нагрузках - до 40% ускорения.
- В некоторых случаях применение почти ничего не дает, поэтому важно тестировать на своих данных.
Green Tea уже признан production-ready, и команда Go планирует сделать его GC по умолчанию в Go 1.26.
В целом, Green Tea GC делает сборку мусора в Go быстрее и стабильнее за счёт лучшей локальности и оптимизации доступа к памяти. Это первый серьёзный шаг к более эффективному, «кэше-дружелюбному» GC в Go.
⚡️ Подробнее - https://go.dev/blog/greenteagc
⚡️Видео: https://www.youtube.com/watch?v=he5PfBfte2c
@Golang_google
👍14🔥9❤3
🚀 Как ускорить доступ к файлам на Go в 25 раз?
В блоге от Varnish Software рассказывается, как использование memory-map (mmap) вместо классического чтения файлов (seek/read) дало огромный прирост скорости: random lookup ≈ 3.3 нс против ≈ 416 нс с ReaderAt.
✔️ Основная идея: вместо системных вызовов чтения данных из файла, маппим файл в память и читаем как обычный массив указателей.
⚠️ Однако есть важный нюанс: запись через mmap может быть очень неэффективной из-за page-fault’ов и управления виртуальной памятью.
📌 Полезно, если:
- много операций чтения, особенно случайного доступа;
- работа с большими файлами и важна производительность;
- запись файлов - не основная задача.
Если нужно быстро взглянуть на статью: https://info.varnish-software.com/blog/how-memory-maps-mmap-deliver-25x-faster-file-access-in-go
Benchmarks: https://github.com/perbu/mmaps-in-go
CDB64 files with memory maps: https://github.com/perbu/cdb
#GoLang #Performance #MemoryMap #mmap #SystemsProgramming #BackendEngineering
@golang_books
В блоге от Varnish Software рассказывается, как использование memory-map (mmap) вместо классического чтения файлов (seek/read) дало огромный прирост скорости: random lookup ≈ 3.3 нс против ≈ 416 нс с ReaderAt.
✔️ Основная идея: вместо системных вызовов чтения данных из файла, маппим файл в память и читаем как обычный массив указателей.
⚠️ Однако есть важный нюанс: запись через mmap может быть очень неэффективной из-за page-fault’ов и управления виртуальной памятью.
📌 Полезно, если:
- много операций чтения, особенно случайного доступа;
- работа с большими файлами и важна производительность;
- запись файлов - не основная задача.
Если нужно быстро взглянуть на статью: https://info.varnish-software.com/blog/how-memory-maps-mmap-deliver-25x-faster-file-access-in-go
Benchmarks: https://github.com/perbu/mmaps-in-go
CDB64 files with memory maps: https://github.com/perbu/cdb
#GoLang #Performance #MemoryMap #mmap #SystemsProgramming #BackendEngineering
@golang_books
👍6❤4🤔4🔥1
Forwarded from Golang
🛠 Как Go понимает ваш код: разбор статьи «The Go Parser»
Внутри компилятора Go после лексера идёт следующий этап - парсер. Он принимает поток токенов и превращает его в абстрактное синтаксическое дерево (AST).
Что делает парсер
- проверяет соответствие кода грамматике Go
- строит AST: функции, выражения, блоки, импорты
- готовит структуру для семантического анализа и генерации кода
Как он работает
- читает токены и смотрит вперёд (lookahead), чтобы решить, что разбирать
- вызывает функции вроде parseFile / parseDecl / parseExpr
- следит за областями видимости и комментариями
- начинает с package → imports → объявления
Пример: даже простой hello-world превращается в дерево, где есть узлы для пакета, функции main, вызова fmt.Println и строкового литерала. Это и есть «скелет» программы, который потом пройдёт проверку типов и оптимизации.
Парсер - это фундамент. Он ловит синтаксические ошибки, создаёт структуру рассуждений для компилятора и позволяет инструментам понимать код как данные. Это точка входа в мир статического анализа и построения своих утилит.
👉 Подробнее
@Golang_google
Внутри компилятора Go после лексера идёт следующий этап - парсер. Он принимает поток токенов и превращает его в абстрактное синтаксическое дерево (AST).
Что делает парсер
- проверяет соответствие кода грамматике Go
- строит AST: функции, выражения, блоки, импорты
- готовит структуру для семантического анализа и генерации кода
Как он работает
- читает токены и смотрит вперёд (lookahead), чтобы решить, что разбирать
- вызывает функции вроде parseFile / parseDecl / parseExpr
- следит за областями видимости и комментариями
- начинает с package → imports → объявления
Пример: даже простой hello-world превращается в дерево, где есть узлы для пакета, функции main, вызова fmt.Println и строкового литерала. Это и есть «скелет» программы, который потом пройдёт проверку типов и оптимизации.
Парсер - это фундамент. Он ловит синтаксические ошибки, создаёт структуру рассуждений для компилятора и позволяет инструментам понимать код как данные. Это точка входа в мир статического анализа и построения своих утилит.
👉 Подробнее
@Golang_google
❤8👍5
⚡️ Новое исследование, опубликованное в Nature, показывает: языковые модели по-прежнему путают «знание» и «убеждение», смешивая факты и выдумку.
Авторы представили новый бенчмарк KaBLE - 13 тыс. вопросов, 13 задач, 24 протестированные модели — и обнаружили серьёзные провалы в сценариях «ложное убеждение от первого лица».
KaBLE проверяет, понимает ли модель:
- кто что знает,
- кто только верит,
- и соответствует ли утверждение реальности.
На задачах ложного убеждения от первого лица:
- GPT-4o падает с 98.2% до 64.4%,
- DeepSeek R1 — с ~90% до 14.4%.
Это значит, что модели выглядят умными в одной формулировке задач, но ломаются в той, которая ближе к реальному общению пользователей («я думаю…», «я верю…»).
Для ложного убеждения от третьего лица новые модели дают ~95%, старые ~79%,
но у задач от первого лица результаты проседают до 62.6% и 52.5% соответственно.
Разрыв указывает на *атрибутивное смещение*: модель приписывает говорящему фактическое знание, а не различает его убеждения и реальность.
Исследователи также проверили рекурсивные знания — «кто знает, что кто-то знает…».
Новые модели решают многие случаи, но их логические шаги нестабильны и выглядят как сложное сопоставление паттернов, а не как уверенное правило рассуждения.
Итог: LLM всё ещё слабо различают знание, убеждение и факты — особенно когда человек говорит о себе.
nature.com/articles/s42256-025-01113-8
Авторы представили новый бенчмарк KaBLE - 13 тыс. вопросов, 13 задач, 24 протестированные модели — и обнаружили серьёзные провалы в сценариях «ложное убеждение от первого лица».
KaBLE проверяет, понимает ли модель:
- кто что знает,
- кто только верит,
- и соответствует ли утверждение реальности.
На задачах ложного убеждения от первого лица:
- GPT-4o падает с 98.2% до 64.4%,
- DeepSeek R1 — с ~90% до 14.4%.
Это значит, что модели выглядят умными в одной формулировке задач, но ломаются в той, которая ближе к реальному общению пользователей («я думаю…», «я верю…»).
Для ложного убеждения от третьего лица новые модели дают ~95%, старые ~79%,
но у задач от первого лица результаты проседают до 62.6% и 52.5% соответственно.
Разрыв указывает на *атрибутивное смещение*: модель приписывает говорящему фактическое знание, а не различает его убеждения и реальность.
Исследователи также проверили рекурсивные знания — «кто знает, что кто-то знает…».
Новые модели решают многие случаи, но их логические шаги нестабильны и выглядят как сложное сопоставление паттернов, а не как уверенное правило рассуждения.
Итог: LLM всё ещё слабо различают знание, убеждение и факты — особенно когда человек говорит о себе.
nature.com/articles/s42256-025-01113-8
👍8❤4
Как реализовать Outbox-паттерн в Go
Outbox - один из самых надёжных способов синхронизировать запись в базу и отправку события, чтобы не потерять сообщения при сбоях. Он объединяет бизнес-операцию и создание события в одну транзакцию, а затем отдельный воркер безопасно публикует это событие в брокер.
Как это работает:
- в той же транзакции, где создаёте данные (например, заказ), записываете событие в таблицу outbox
- фоновый процесс периодически выбирает pending-записи через
- отправляет событие в брокер
- помечает запись как обработанную
Так достигается атомарность: либо и данные, и событие записаны, либо ничего.
Для Go обычно используют связку Postgres + транзакции + отдельный dispatcher-воркер.
Идеально подходит для микросервисов, e-commerce и всего, что живёт на событиях.
https://packagemain.tech/p/how-to-implement-the-outbox-pattern-in-golang
Видео: https://www.youtube.com/watch?v=iMQ-hb535AE
Outbox - один из самых надёжных способов синхронизировать запись в базу и отправку события, чтобы не потерять сообщения при сбоях. Он объединяет бизнес-операцию и создание события в одну транзакцию, а затем отдельный воркер безопасно публикует это событие в брокер.
Как это работает:
- в той же транзакции, где создаёте данные (например, заказ), записываете событие в таблицу outbox
- фоновый процесс периодически выбирает pending-записи через
FOR UPDATE SKIP LOCKED- отправляет событие в брокер
- помечает запись как обработанную
Так достигается атомарность: либо и данные, и событие записаны, либо ничего.
Для Go обычно используют связку Postgres + транзакции + отдельный dispatcher-воркер.
Идеально подходит для микросервисов, e-commerce и всего, что живёт на событиях.
https://packagemain.tech/p/how-to-implement-the-outbox-pattern-in-golang
Видео: https://www.youtube.com/watch?v=iMQ-hb535AE
👍8❤6
Примеры использования
- Получение списка Pod'ов
- Прослушивание событий (watch)
- Использование контроллеров
- Работа с workqueue
- Создание кастомных клиентов
- Реализация информеров
- Примеры c RBAC и настройкой доступа
Каждый пример максимально изолирован и понятен, что делает репозиторий отличной стартовой точкой для тех, кто хочет разобраться, как изнутри работает Kubernetes-клиент на Go. Особенно полезно для разработчиков операторов и контроллеров.
https://github.com/iximiuz/client-go-examples
client-go — официальной Go-библиотеки для взаимодействия с Kubernetes API. Репозиторий содержит набор минималистичных, но рабочих программ, которые демонстрируют, как использовать client-go для различных задач:- Получение списка Pod'ов
- Прослушивание событий (watch)
- Использование контроллеров
- Работа с workqueue
- Создание кастомных клиентов
- Реализация информеров
- Примеры c RBAC и настройкой доступа
Каждый пример максимально изолирован и понятен, что делает репозиторий отличной стартовой точкой для тех, кто хочет разобраться, как изнутри работает Kubernetes-клиент на Go. Особенно полезно для разработчиков операторов и контроллеров.
https://github.com/iximiuz/client-go-examples
👍4❤3🔥2
Forwarded from Golang
Они объединяют эффективность существующих высокоуровневых функций набора соединений с возможностью отмены через Dialer.DialContext — то есть будут быстрее и надёжнее при работе с сетевыми вызовами.
Для тех случаев, когда вы точно знаете сеть (TCP, UDP, IP или Unix-сокет) и хотите:
- минимальные расходы (без лишнего разрешения адресов)
- контроль таймаута/отмены через context
- современный тип адресов из netip
В целом это шаг к более гибкому, эффективному и контролируемому сетевому подключению в Go.
Пример использования:
var d net.Dialer
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
raddr := netip.MustParseAddrPort("127.0.0.1:12345")
conn, err := d.DialTCP(ctx, "tcp", netip.AddrPort{}, raddr)
if err != nil { log.Fatalf("Failed to dial: %v", err) }
defer conn.Close()
http://antonz.org/accepted/net-dialer-context/
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1
🔥 Подборка полезных ресурсов для программистов.
Здесь ты найдёшь всё это - коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Devops: t.me/DevOPSitsec
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat
💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
Папка Linux:https://t.me/addlist/w4Doot-XBG4xNzYy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Сохрани себе, чтобы не потерять!
Здесь ты найдёшь всё это - коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Devops: t.me/DevOPSitsec
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat
💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
Папка Linux:https://t.me/addlist/w4Doot-XBG4xNzYy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Сохрани себе, чтобы не потерять!
❤1
⚡ Sloggo - лёгкий и быстрый сборщик логов на Go по стандарту RFC 5424
Если вам нужен простой, минималистичный и быстрый инструмент для централизованного сбора логов — без тяжёлых ELK, Loki или огромных кластеров — Sloggo выглядит очень достойным вариантом.
Что делает Sloggo:
- принимает логи по TCP и UDP в формате RFC 5424
- хранит их в DuckDB — быстрой встроенной базе данных без лишней настройки
- даёт чистый и удобный веб-интерфейс для поиска и фильтрации
- весит всего ~10 МБ и работает как один процесс
- запускается за секунды, подходит для малых и средних систем
Где полезно:
- домашние серверы и дев-окружения
- небольшие продовые сервисы, которым не нужна тяжёлая лог-инфраструктура
- быстрый сбор логов во время отладки
- системы с минимумом ресурсов (VPS, контейнеры)
https://github.com/phare/sloggo/
Если вам нужен простой, минималистичный и быстрый инструмент для централизованного сбора логов — без тяжёлых ELK, Loki или огромных кластеров — Sloggo выглядит очень достойным вариантом.
Что делает Sloggo:
- принимает логи по TCP и UDP в формате RFC 5424
- хранит их в DuckDB — быстрой встроенной базе данных без лишней настройки
- даёт чистый и удобный веб-интерфейс для поиска и фильтрации
- весит всего ~10 МБ и работает как один процесс
- запускается за секунды, подходит для малых и средних систем
Где полезно:
- домашние серверы и дев-окружения
- небольшие продовые сервисы, которым не нужна тяжёлая лог-инфраструктура
- быстрый сбор логов во время отладки
- системы с минимумом ресурсов (VPS, контейнеры)
https://github.com/phare/sloggo/
👍11❤4😁4🔥3
Forwarded from Golang вопросы собеседований
Долгое время он был «уверенным мидлом».
Умел писать фичи, работал с Go, microservices, немного разбирался в распределённых системах.
Но каждый раз, когда он пытался выйти на senior-позицию, всё заканчивалось одинаково:
Он умел делать, но не умел объяснять.
- System design?
- Trade-off'ы?
- Архитектура распределённых систем?
- Конкурентность?
- Сетевые протоколы?
На собеседованиях он будто терял почву под ногами.
Знания были, но целостной картины - нет.
В какой-то момент он решил изменить ситуацию.
И вот путь, который реально сработал — и привёл его к первому офферу Senior Backend Engineer (Go).
Что стало переломным моментом
Он не хотел буткемпов, марафонов и длинных лекций.
Ему нужны были:
- чёткие, короткие объяснения
- визуализации
- практика
- реальные архитектурные примеры
И именно там у него впервые сложилась цельная картина системной архитектуры.
Ниже - точная последовательность курсов, которые он прошёл.
1. Grokking the System Design Interview
Этот курс дал ему главное — структуру мыслей.
До: он уходил в детали и путался.
После: действовал по чёткому фреймворку:
1. Уточнение требований
2. Компоненты
3. Масштабирование
4. Trade-off’ы
В интервью ему особенно помогли примеры из курса:
- rate limiting
- sharding
- caching
- consistent hashing
- message queues
- fan-out patterns
Это был фундамент, который дал более половины успеха.
2. Grokking Modern System Design
Этот курс научил его думать как инженер распределённых систем.
Он разобрал:
- push vs pull модели
- когда выбирать gRPC или REST
- backpressure
- идемпотентные консьюмеры
- стратегии retry и DLQ
- eventual vs strong consistency
Для Go-разработчика это оказалось очень ценным.
3. System Design: Scalability & Distributed Systems Guide
Курс поднял его "архитектурный словарь" на новый уровень.
Он научился говорить как сеньор:
Не только *что* сделать, но *почему*.
Интервьюеры особенно впечатлялись фразами вроде:
> «Здесь нужен write-ahead log для гарантий durability.»
> «Это thundering herd, понадобится request coalescing.»
Именно такие ответы добавляют вес.
4. Concurrency in Go
Поскольку позиция была Go-ориентированной, ему нужно было подтянуть конкурентность.
Курс дал ему:
- worker pools
- пайплайны
- управление context
- каналы vs мьютексы
- deadlocks, races
- архитектуру rate limiters
На интервью ему встретился вопрос:
> «Спроектируй rate limiter в Go.»
Он ответил спокойно — потому что уже делал это в курсе.
5. Grokking the Behavioral Interview
Он думал, что поведенческие вопросы — вторичны.
Оказалось — нет.
Этот курс помог ему собрать истории про:
- конфликты
- провалы
- лидерство
- сложные решения
- ответственность
- коммуникацию
Он подготовил несколько универсальных историй и использовал их в разных компаниях.
Его стратегия подготовки
1) Один system design в день
Тренировал структуру, а не заучивал решения.
2) Один backend-топик в день
Например:
- circuit breaker
- sharding
- replication
- load balancing
- consensus
3) Go: конкуренция, профилирование, память
Углубление того, что отличает senior Go engineer.
4) Поведенческие ответы
Отточенные истории.
5) Мок-интервью
Чтобы снять стресс и уверенно излагать мысли.
На финальном интервью его попросили:
> «Спроектируй систему реальной-временной доставки событий (похожа на pub/sub).
> Нужны масштабируемость и надёжность.»
Несколько месяцев назад он бы провалился.
А теперь спокойно разобрал:
- partitions
- consumer groups
- горизонтальное масштабирование
- backpressure
- retry logic
- идемпотентность
- мониторинг
Итог
Он наконец выучил то, что обычно знают senior-инженеры:
- системное мышление
- понимание распределённых систем
- объяснение архитектурных решений
- trade-off’ы
- чёткая коммуникация
Если кто-то застрял между middle и senior — его опыт показывает, что выбраться можно. Точно так же.
Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🤯3👍2🔥2
Главная идея Go минимализм: меньше «магии», больше понятного и предсказуемого кода. Поэтому он быстро осваивается, даже если вы только начинаете путь в программировании.
В этом учебнике мы шаг за шагом разберём основные конструкции Go, научимся писать программы, работать с пакетами и запускать простые сервисы. Всё - практично, лаконично и без лишней сложности.
https://uproger.com/uchebnik-go-golang-dlya-nachinayushhih/
Видео: https://www.youtube.com/playlist?list=PLysMDSbb9HcxpAb8lhnMaRpX890wSLz66
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6😁3🥰2😢1
Media is too big
VIEW IN TELEGRAM
⚡️ Внутренняя Механика Планировщика Go - как реально работает G-P-M под капотом
Go стал популярным благодаря горутинам - быстрым и лёгким. Но настоящая сила в планировщике, который умеет выполнять миллионы задач на ограниченном количестве потоков ОС.
Разбираем устройство модели G-P-M 👇
1. Три основных сущности: G, P, M
- G — горутина: стек, состояние, контекст.
- P — логический процессор, который содержит очередь готовых горутин.
- M — поток ОС, который выполняет горутины из очереди P.
P распределяет работу.
M выполняет её.
G — сама работа.
2. Очереди и балансировка
У каждого P своя локальная очередь.
Если P простаивает, он забирает задачи у других (work stealing).
Это стабилизирует нагрузку и снижает задержки.
3. Блокировки и парковка
Когда горутина блокируется:
- её паркуют
- поток освобождают
- P поднимает другую готовую горутину
- когда syscall завершён, горутину возвращают в очередь
Так минимизируются блокировки потоков ОС.
4. Горутины уступают время сами
Создание новой G, операции с каналами или вызов runtime.Gosched() позволяют планировщику переключить выполнение.
5. Роль GOMAXPROCS
GOMAXPROCS определяет количество P.
Обычно равно числу CPU.
Увеличение сверх количества ядер не ускоряет работу.
6. Почему горутины такие дешёвые?
- стартовый стек около 2 КБ
- автоматическое расширение и сжатие
- быстрые переключения
- минимальная зависимость от ОС
Поэтому легко запускать сотни тысяч и даже миллионы горутин.
Планировщик Go - это компактный и эффективный механизм, который:
- распределяет нагрузку
- минимизирует блокировки
- масштабирует миллионы горутин
- обеспечивает стабильную и предсказуемую конкурентность
Эта архитектура - одна из главных причин успеха Go в высоконагруженных системах.
Go стал популярным благодаря горутинам - быстрым и лёгким. Но настоящая сила в планировщике, который умеет выполнять миллионы задач на ограниченном количестве потоков ОС.
Разбираем устройство модели G-P-M 👇
1. Три основных сущности: G, P, M
- G — горутина: стек, состояние, контекст.
- P — логический процессор, который содержит очередь готовых горутин.
- M — поток ОС, который выполняет горутины из очереди P.
P распределяет работу.
M выполняет её.
G — сама работа.
2. Очереди и балансировка
У каждого P своя локальная очередь.
Если P простаивает, он забирает задачи у других (work stealing).
Это стабилизирует нагрузку и снижает задержки.
3. Блокировки и парковка
Когда горутина блокируется:
- её паркуют
- поток освобождают
- P поднимает другую готовую горутину
- когда syscall завершён, горутину возвращают в очередь
Так минимизируются блокировки потоков ОС.
4. Горутины уступают время сами
Создание новой G, операции с каналами или вызов runtime.Gosched() позволяют планировщику переключить выполнение.
5. Роль GOMAXPROCS
GOMAXPROCS определяет количество P.
Обычно равно числу CPU.
Увеличение сверх количества ядер не ускоряет работу.
6. Почему горутины такие дешёвые?
- стартовый стек около 2 КБ
- автоматическое расширение и сжатие
- быстрые переключения
- минимальная зависимость от ОС
Поэтому легко запускать сотни тысяч и даже миллионы горутин.
Планировщик Go - это компактный и эффективный механизм, который:
- распределяет нагрузку
- минимизирует блокировки
- масштабирует миллионы горутин
- обеспечивает стабильную и предсказуемую конкурентность
Эта архитектура - одна из главных причин успеха Go в высоконагруженных системах.
👍11🔥3❤1🤔1