Media is too big
VIEW IN TELEGRAM
После «таких инцидентов» обычно вспоминают про бэкапы и начинают разработку сложных систем по настройке и сбору резервных копий данных БД.
Как раз недавно в команде закончили проект, посвященный бэкапам.
Как раз недавно в команде закончили проект, посвященный бэкапам.
🤣11🔥4😁1🆒1
Я только что вернулся в Москву после самой долгой и насыщенной поездки в жизни.
Зимовка в Азии — мечта, которую я вынашивал много лет. И в этом году она наконец-то сбылась.
С ноября по март я не просто сменил обстановку — я прожил целую маленькую жизнь в путешествии.
Удалёнка дала свободу перемещаться, а я решил взять от этого максимум:
5 стран🇻🇳 🇰🇭 🇲🇾 🇱🇦 🇨🇳 , 14 городов, тысячи километров, десятки новых вкусов, встреч и открытий.
Я побывал в таких городах как:
Нячанг, Пномпень, Сиемреап, Хошимин, Фукуок, Далат, Куала-Лумпур, Дананг, Хюэ, Хойан, Вьентьян, Ванг Вьенг, Луангпробанг, Гуанчжоу.
Было невероятно!
Но, скажу честно: романтика цифрового кочевничества — это не только свобода и закаты.
В реальности всё куда сложнее:
— постоянная адаптация к новой среде
— нестабильный интернет
— разница в часовых поясах
— жара, которая выключает продуктивность
— соблазн “чуть-чуть полежать на пляже” — а потом уже вечер
Оказалось, что в таких условиях особенно важна самодисциплина.
Удалёнка требует структуры, если хочешь не просто выживать, а развиваться и расти.
Сейчас я снова в Москве.
С любимым рабочим местом, нормальным графиком, быстрым интернетом и сосредоточенностью.
А значит — начинается мой личный «рабочий сезон».
И уже завтра, в 19:00 по МСК, я проведу открытый бесплатный урок:
«Эволюция MVC до чистой архитектуры».
Разберем, как устроены MVC, 3-уровневая, гексагональная, луковая и чистая архитектуры, а также узнаем их историю, сильные и слабые стороны.
Регистрация по ссылке — приходите, будет интересно и по делу.
Зимовка в Азии — мечта, которую я вынашивал много лет. И в этом году она наконец-то сбылась.
С ноября по март я не просто сменил обстановку — я прожил целую маленькую жизнь в путешествии.
Удалёнка дала свободу перемещаться, а я решил взять от этого максимум:
5 стран
Я побывал в таких городах как:
Нячанг, Пномпень, Сиемреап, Хошимин, Фукуок, Далат, Куала-Лумпур, Дананг, Хюэ, Хойан, Вьентьян, Ванг Вьенг, Луангпробанг, Гуанчжоу.
Было невероятно!
Но, скажу честно: романтика цифрового кочевничества — это не только свобода и закаты.
В реальности всё куда сложнее:
— постоянная адаптация к новой среде
— нестабильный интернет
— разница в часовых поясах
— жара, которая выключает продуктивность
— соблазн “чуть-чуть полежать на пляже” — а потом уже вечер
Оказалось, что в таких условиях особенно важна самодисциплина.
Удалёнка требует структуры, если хочешь не просто выживать, а развиваться и расти.
Сейчас я снова в Москве.
С любимым рабочим местом, нормальным графиком, быстрым интернетом и сосредоточенностью.
А значит — начинается мой личный «рабочий сезон».
И уже завтра, в 19:00 по МСК, я проведу открытый бесплатный урок:
«Эволюция MVC до чистой архитектуры».
Разберем, как устроены MVC, 3-уровневая, гексагональная, луковая и чистая архитектуры, а также узнаем их историю, сильные и слабые стороны.
Регистрация по ссылке — приходите, будет интересно и по делу.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21⚡5❤5👍2 2
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤3👏3👍1🆒1
Хорошая новость для тех, кто хотел перейти на Go-разработку или попасть в BigTech
Стартует набор на поток Route256🦎
Эксперты из Ozon научат всем азам в разработке на Go, кликайте для подачи заявки на участие в отборе.
➡️ 2 месяца онлайн-занятий по вечерам — можно совмещать с работой и учёбой;
➡️ Интересные задачи — реальные, под потребности компании;
➡️ Крутая команда — эксперты Ozon.
Route 256 — это демоверсия работы в BigTech (без преувеличения). Но у каждого студента будет свой персональный тьютор: поддержать, когда непросто, и поболтать, когда хочется.
⏰ Спешите подать заявку: тренировочный раунд уже открыт, а отборочный контест — 20 апреля.
Стартует набор на поток Route256
Эксперты из Ozon научат всем азам в разработке на Go, кликайте для подачи заявки на участие в отборе.
Route 256 — это демоверсия работы в BigTech (без преувеличения). Но у каждого студента будет свой персональный тьютор: поддержать, когда непросто, и поболтать, когда хочется.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👨💻3🙏2🆒1
ПРО АЛГОРИТМЫ НА СОБЕСЕДОВАНИЕ
Раньше я искренне не понимал, зачем некоторые IT‑компании так помешаны на алгоритмах.
Казалось, на реальных проектах алгоритмические задачи почти не встречаются, и фронт‑ и бэкенд‑разработка сводится к знанию фреймворков, «перекладыванию JSON-чиков» и API.
Однако за несколько лет участия в десятках собеседований и после собственного опыта в разработке я убедился: алгоритмы — это самый надёжный способ оценить не только знание синтаксиса, но и скорость разработки и качество мышления на собеседовании. Все остальное можно заучить и «натаскаться» проходя собеседования.
Личный пример.
В начале карьеры я мог быстро писать CRUD на знакомом фреймворке, но на реальную задачу уходило по несколько дней: то упирался в нестандартный кейс, то долго выстраивал логику, код писал не быстро. После целенаправленного изучения алгоритмов и регулярной практики на LeetCode время на решение типичных задач сократилось в разы: я просто «видел» шаблон и быстро его имплементировал.
Почему это не прихоть компаний
Алгоритмические задачи — это как игра на фортепиано: профессионал, играющий разные жанры и виртуозно владеющий инструментом, способен «прочувствовать» любую мелодию и сразу попасть в нужный темп и тон. Так же и разработчик, хорошо натренировавший алгоритмическое мышление, в коде «чувствует» структуру задачи и без лишних проб и ошибок строит оптимальное решение. А скорость выполнения задач - очень важный показатель.
Можно выучить и зазубрить любую теорию: computer science, устройство языка, SQL и NoSQL, брокеры сообщений. Но алгоритмы - это тот навык, который прививается со временем.
Конечно, перегибать палку не стоит: несколько тяжелейших секций на графах и динамическом программировании, далеких от повседневных задач, часто лишь валят кандидатов и отнимают время (возможно это тактичный способ слить кандидата). Главное, что дают алгоритмы — шаблоны мышления и «насмотренность», благодаря которым вы почти на автопилоте пишете чистый, понятный и эффективный код.
Пишите в комментариях, практикуете ли вы алгоритмические задачи, и если да, видите ли у себя прогресс в скорости разработки?
Раньше я искренне не понимал, зачем некоторые IT‑компании так помешаны на алгоритмах.
Казалось, на реальных проектах алгоритмические задачи почти не встречаются, и фронт‑ и бэкенд‑разработка сводится к знанию фреймворков, «перекладыванию JSON-чиков» и API.
Однако за несколько лет участия в десятках собеседований и после собственного опыта в разработке я убедился: алгоритмы — это самый надёжный способ оценить не только знание синтаксиса, но и скорость разработки и качество мышления на собеседовании. Все остальное можно заучить и «натаскаться» проходя собеседования.
Личный пример.
В начале карьеры я мог быстро писать CRUD на знакомом фреймворке, но на реальную задачу уходило по несколько дней: то упирался в нестандартный кейс, то долго выстраивал логику, код писал не быстро. После целенаправленного изучения алгоритмов и регулярной практики на LeetCode время на решение типичных задач сократилось в разы: я просто «видел» шаблон и быстро его имплементировал.
Почему это не прихоть компаний
Алгоритмические задачи — это как игра на фортепиано: профессионал, играющий разные жанры и виртуозно владеющий инструментом, способен «прочувствовать» любую мелодию и сразу попасть в нужный темп и тон. Так же и разработчик, хорошо натренировавший алгоритмическое мышление, в коде «чувствует» структуру задачи и без лишних проб и ошибок строит оптимальное решение. А скорость выполнения задач - очень важный показатель.
Можно выучить и зазубрить любую теорию: computer science, устройство языка, SQL и NoSQL, брокеры сообщений. Но алгоритмы - это тот навык, который прививается со временем.
Конечно, перегибать палку не стоит: несколько тяжелейших секций на графах и динамическом программировании, далеких от повседневных задач, часто лишь валят кандидатов и отнимают время (возможно это тактичный способ слить кандидата). Главное, что дают алгоритмы — шаблоны мышления и «насмотренность», благодаря которым вы почти на автопилоте пишете чистый, понятный и эффективный код.
Пишите в комментариях, практикуете ли вы алгоритмические задачи, и если да, видите ли у себя прогресс в скорости разработки?
👍12🔥3🗿2👏1
Так случилось, что мне пришлось плотно потрогать python 👩💻 в рамках рабочих задач)
Мне стало интересно: а к вы относитесь к вакансиям, в которых в требуется разработка на нескольких языках?
Мне стало интересно: а к вы относитесь к вакансиям, в которых в требуется разработка на нескольких языках?
Anonymous Poll
30%
Положительно – считаю, что это расширяет кругозор и прокачивает навыки.
26%
Положительно, если компания предоставляет обучение и поддержку – важно иметь время и ресурсы на осво
16%
Нейтрально – готов(а) работать на нескольких языках, если требования обоснованы.
22%
Зависит от проекта/языка – готов(а) осваивать новый язык, если это интересно и проект стоящий.
7%
Отрицательно – предпочитаю специализироваться на одном языке.
🔥6❤1
Полгода я вылизывал каждую лекцию, каждое задание, чтобы ты мог изучить Go без воды, с нуля и с фокусом на реальные задачи.
⠀
— быстро и системно освоить Go
— без воды, устаревших туториалов и "постоянно что-то гуглить"
— научиться писать реальные сервисы и пройти собес
⠀
Обновляется постоянно. Не как статьи или книги — он будет жить вместе с языком.
⠀
— Лаконичные уроки + практика
— Пошаговая структура от азов до настоящих API и тестов
— Бесплатные модули для ознакомления
— Постоянные обновления под новые версии Go и best practices
⠀
По промокоду UTOPIA до 15 мая.
Итоговая цена — 5179₽ вместо 7399₽
(И да, ты получаешь доступ навсегда, с обновлениями)
⠀
⠀
Если есть вопросы — пиши, помогу разобраться.
Go — это просто, когда тебя ведут по делу.
⠀
P.S. Это не просто курс. Это путь, который я сам когда-то прошёл. И теперь передаю его тебе — в концентрированной, работающей и честной форме.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍25🔥19❤7🤔2🏆2🗿2👎1
Go 1.24+ и фиксация инструментов: наконец-то по-человечески
Я тут узнал отличную новость: теперь оказывается можно нормально фиксировать dev-инструменты — прямо в
Например, если ты используешь
Это добавит в
И дальше можно:
Всё! Теперь:
— Версия
— Команда
— Можно забыть про
А раньше что?
Костыли:
—
—
— магия в README, которую никто не читал
Теперь всё по-взрослому, понятно и воспроизводимо.
Go продолжает радовать!🙌
Я тут узнал отличную новость: теперь оказывается можно нормально фиксировать dev-инструменты — прямо в
go.mod, без костылей.Например, если ты используешь
oapi-codegen (а ты точно его используешь, если генерируешь сервер/клиента из OpenAPI v3, ведь так?)):go get -tool github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest
Это добавит в
go.mod строку:tool github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen
И дальше можно:
go install tool
//go:generate go tool oapi-codegen -config cfg.yaml ../../api.yaml
Всё! Теперь:
— Версия
oapi-codegen зафиксирована— Команда
go install tool установит его любому разработчику— Можно забыть про
tools.go и ручное go installА раньше что?
Костыли:
—
tools.go с анонимными импортами (import _ )—
makefile с GOBIN=./bin go install и GOBIN=./bin go generate — магия в README, которую никто не читал
Теперь всё по-взрослому, понятно и воспроизводимо.
Go продолжает радовать!
Please open Telegram to view this post
VIEW IN TELEGRAM
ИЗЯЩНАЯ РАБОТА С ОШИБКАМИ В GO, ИЛИ КАК ИХ СРАВНИВАТЬ
Обычное
❓ Как работает
Когда ты используешь
Под капотом
❓ А что делает
Иногда нужно не просто узнать, была ли ошибка определённого типа, но и получить доступ к её полям. Например:
Ты можешь доставать полезные данные из ошибки, если она реализует нужный тип. Это особенно удобно, когда у тебя есть логика, завязанная на тип ошибки (например, логирование по коду, трассировка и т.д.).
❓ Как кастомизировать сравнение — метод
Ты даже можешь сам определить, когда твоя ошибка считается «равной» другой. Для этого нужно реализовать метод
Теперь, даже если сообщения об ошибках разные, но коды совпадают —
❓ Когда и где это реально нужно (примеры из практики)
— В библиотеках: ты возвращаешь ошибки вроде
— В сервисах: API может возвращать ошибки с кодами, а внутри тебе удобно описывать их кастомными типами — и потом ловить их по
— В middleware: например, хочешь логировать всё, кроме
— В gRPC/HTTP-хендлерах: удобно классифицировать ошибки и автоматически подставлять нужный статус код в ответе
— В CLI-инструментах: логика выхода с кодами ошибок может зависеть от типа ошибки, а не только от текста
Если ты до сих пор сравниваешь ошибки через
Больше примеров работы с ошибками даю в бесплатном уроке на своем курсе Go!
P.S. все еще действует промокод на скидку 30% -
Обычное
err == myErr в Go работает не всегда так, как ты ожидаешь. Особенно если ты оборачиваешь ошибку через fmt.Errorf("context: %w", err). В таких случаях Go предоставляет более мощные инструменты — errors.Is и errors.As.errors.IsКогда ты используешь
%w в fmt.Errorf (врапинг ошибки), ты как бы упаковываешь одну ошибку внутрь другой, добавляя контекст. errors.Is умеет разворачивать такие обёртки и проверять, есть ли внутри нужная ошибка:var ErrNotFound = errors.New("not found")
err := fmt.Errorf("ошибка в поиске: %w", ErrNotFound)
if errors.Is(err, ErrNotFound) {
fmt.Println("Ничего не найдено")
}Под капотом
errors.Is делает так: если ошибка обёрнута через %w, она вызывает Unwrap() и идёт по цепочке, пока не найдёт нужную. Если ты просто сравнишь err == ErrNotFound, то получишь false, потому что это уже не тот же объект — он обёрнут.errors.AsИногда нужно не просто узнать, была ли ошибка определённого типа, но и получить доступ к её полям. Например:
type MyError struct {
Code int
Msg string
}
func (e *MyError) Error() string {
return fmt.Sprintf("code: %d, msg: %s", e.Code, e.Msg)
}
err := &MyError{Code: 499, Msg: "custom"}
var myErr *MyError
if errors.As(err, &myErr) {
fmt.Println("У нас ошибка кода", myErr.Code)
}Ты можешь доставать полезные данные из ошибки, если она реализует нужный тип. Это особенно удобно, когда у тебя есть логика, завязанная на тип ошибки (например, логирование по коду, трассировка и т.д.).
Is()Ты даже можешь сам определить, когда твоя ошибка считается «равной» другой. Для этого нужно реализовать метод
Is(target error) в своей реализации:type HttpError struct {
Code int
Msg string
}
func (e *HttpError) Error() string {
return fmt.Sprintf("HTTP %d: %s", e.Code, e.Msg)
}
func (e *HttpError) Is(target error) bool {
t, ok := target.(*HttpError)
return ok && e.Code == t.Code
}Теперь, даже если сообщения об ошибках разные, но коды совпадают —
errors.Is вернёт true:var Err404 = &HttpError{Code: 404}
err := fmt.Errorf("обёрнутая ошибка: %w", &HttpError{Code: 404, Msg: "page not found"})
if errors.Is(err, Err404) {
fmt.Println("Обнаружена 404")
}— В библиотеках: ты возвращаешь ошибки вроде
ErrInvalidConfig или ErrNotConnected, и хочешь, чтобы пользователи могли их отловить независимо от контекста— В сервисах: API может возвращать ошибки с кодами, а внутри тебе удобно описывать их кастомными типами — и потом ловить их по
errors.Is— В middleware: например, хочешь логировать всё, кроме
ErrUnauthorized — тогда errors.Is(err, ErrUnauthorized) спасёт от лишнего шума— В gRPC/HTTP-хендлерах: удобно классифицировать ошибки и автоматически подставлять нужный статус код в ответе
— В CLI-инструментах: логика выхода с кодами ошибок может зависеть от типа ошибки, а не только от текста
Если ты до сих пор сравниваешь ошибки через
==, самое время освоить errors.Is и errors.As. Это делает твой код гибким, читаемым и гораздо ближе к надёжной архитектуре. Go даёт тебе все инструменты — просто используй их.Больше примеров работы с ошибками даю в бесплатном уроке на своем курсе Go!
P.S. все еще действует промокод на скидку 30% -
FEINPlease open Telegram to view this post
VIEW IN TELEGRAM
👍12❤7⚡3👏2🔥1