🔍 Режим транзакции по умолчанию в PostgreSQL
❓ Какой режим транзакции по умолчанию в PostgreSQL?
В PostgreSQL режим транзакции по умолчанию — это READ COMMITTED. Это означает, что каждая транзакция видит только те данные, которые были зафиксированы (committed) до её начала.
💡 Основные характеристики READ COMMITTED:
1. Изоляция:
- Описание: Транзакции изолированы друг от друга. Изменения, сделанные одной транзакцией, не видны другим транзакциям до тех пор, пока они не будут зафиксированы.
- Преимущества: Обеспечение целостности данных.
- Недостатки: Возможны конфликты при одновременном доступе к данным.
2. Производительность:
- Описание: Этот режим обеспечивает хороший баланс между производительностью и изоляцией, так как не требует блокировки чтения.
- Преимущества: Высокая производительность при работе с большим количеством транзакций.
- Недостатки: Меньшая изоляция по сравнению с другими режимами.
❓ Какой режим транзакции по умолчанию в PostgreSQL?
В PostgreSQL режим транзакции по умолчанию — это READ COMMITTED. Это означает, что каждая транзакция видит только те данные, которые были зафиксированы (committed) до её начала.
💡 Основные характеристики READ COMMITTED:
1. Изоляция:
- Описание: Транзакции изолированы друг от друга. Изменения, сделанные одной транзакцией, не видны другим транзакциям до тех пор, пока они не будут зафиксированы.
- Преимущества: Обеспечение целостности данных.
- Недостатки: Возможны конфликты при одновременном доступе к данным.
2. Производительность:
- Описание: Этот режим обеспечивает хороший баланс между производительностью и изоляцией, так как не требует блокировки чтения.
- Преимущества: Высокая производительность при работе с большим количеством транзакций.
- Недостатки: Меньшая изоляция по сравнению с другими режимами.
🔍 PgBouncer
❓ Что такое PgBouncer?
PgBouncer — это лёгкий и быстрый пул соединений для PostgreSQL. Он управляет соединениями с базой данных, позволяя повторно использовать их и уменьшая нагрузку на сервер базы данных.
💡 Основные функции PgBouncer:
1. Пул соединений:
- Описание: Повторное использование соединений для уменьшения накладных расходов на их создание и закрытие.
- Преимущества: Снижение нагрузки на сервер базы данных.
- Недостатки: Необходимость настройки и управления пулом соединений.
2. Управление нагрузкой:
- Описание: Ограничение количества одновременных соединений с базой данных.
- Преимущества: Предотвращение перегрузки сервера базы данных.
- Недостатки: Возможные задержки при большом количестве запросов.
3. Поддержка транзакций:
- Описание: Возможность работать в режиме транзакций, сессий или выполнения отдельных запросов.
- Преимущества: Гибкость в управлении соединениями.
- Недостатки: Сложность настройки для различных режимов работы.
🎯 Преимущества использования PgBouncer:
- Уменьшение нагрузки на сервер базы данных.
- Повышение производительности приложений за счёт повторного использования соединений.
- Упрощение управления соединениями и нагрузкой.
❓ Что такое PgBouncer?
PgBouncer — это лёгкий и быстрый пул соединений для PostgreSQL. Он управляет соединениями с базой данных, позволяя повторно использовать их и уменьшая нагрузку на сервер базы данных.
💡 Основные функции PgBouncer:
1. Пул соединений:
- Описание: Повторное использование соединений для уменьшения накладных расходов на их создание и закрытие.
- Преимущества: Снижение нагрузки на сервер базы данных.
- Недостатки: Необходимость настройки и управления пулом соединений.
2. Управление нагрузкой:
- Описание: Ограничение количества одновременных соединений с базой данных.
- Преимущества: Предотвращение перегрузки сервера базы данных.
- Недостатки: Возможные задержки при большом количестве запросов.
3. Поддержка транзакций:
- Описание: Возможность работать в режиме транзакций, сессий или выполнения отдельных запросов.
- Преимущества: Гибкость в управлении соединениями.
- Недостатки: Сложность настройки для различных режимов работы.
🎯 Преимущества использования PgBouncer:
- Уменьшение нагрузки на сервер базы данных.
- Повышение производительности приложений за счёт повторного использования соединений.
- Упрощение управления соединениями и нагрузкой.
🔧 Императивное программирование и Go
❓ Что такое императивное программирование?
Императивное программирование — это парадигма, в которой программы описывают выполнение команд, изменяющих состояние программы. Go — это язык, который поддерживает императивный стиль программирования, предоставляя разработчикам мощные инструменты для управления потоком выполнения.
💡 Основные концепции:
- Управление потоком:
1. Использование циклов, условий и функций для управления выполнением программы.
2. Изменение состояния переменных и структур данных.
❗️Ключевые особенности:
- Простота и ясность:
1. Чёткое описание последовательности действий.
2. Легкость отладки и тестирования.
- Гибкость:
1. Возможность точного контроля над выполнением программы.
2. Поддержка сложных алгоритмов и логики.
🔍 Типичные сценарии использования:
1. Реализация алгоритмов и бизнес-логики.
2. Работа с данными и их преобразование.
3. Управление ресурсами и состоянием приложения.
🎯 Преимущества использования императивного программирования в Go:
- Чёткость и предсказуемость выполнения программы.
- Высокая производительность и эффективность.
- Поддержка сложных вычислений и алгоритмов.
❓ Что такое императивное программирование?
Императивное программирование — это парадигма, в которой программы описывают выполнение команд, изменяющих состояние программы. Go — это язык, который поддерживает императивный стиль программирования, предоставляя разработчикам мощные инструменты для управления потоком выполнения.
💡 Основные концепции:
- Управление потоком:
1. Использование циклов, условий и функций для управления выполнением программы.
2. Изменение состояния переменных и структур данных.
❗️Ключевые особенности:
- Простота и ясность:
1. Чёткое описание последовательности действий.
2. Легкость отладки и тестирования.
- Гибкость:
1. Возможность точного контроля над выполнением программы.
2. Поддержка сложных алгоритмов и логики.
🔍 Типичные сценарии использования:
1. Реализация алгоритмов и бизнес-логики.
2. Работа с данными и их преобразование.
3. Управление ресурсами и состоянием приложения.
🎯 Преимущества использования императивного программирования в Go:
- Чёткость и предсказуемость выполнения программы.
- Высокая производительность и эффективность.
- Поддержка сложных вычислений и алгоритмов.
👍20❤19🔥15
📜 Декларативное программирование и SQL
❓ Что такое декларативное программирование?
Декларативное программирование — это парадигма, в которой программы описывают, что должно быть сделано, а не как это сделать. SQL — это язык, который использует декларативный подход для работы с базами данных, позволяя разработчикам сосредоточиться на результате запроса, а не на его выполнении.
💡 Основные концепции:
- Описание результата:
1. Фокус на том, какие данные нужно получить, а не на том, как их получить.
2. Использование запросов для описания операций над данными.
❗️Ключевые особенности:
- Удобство и лаконичность:
1. Простота написания и чтения запросов.
2. Снижение вероятности ошибок за счёт абстракции.
- Оптимизация:
1. Возможность автоматической оптимизации запросов базой данных.
2. Улучшение производительности и эффективности работы с данными.
🔍 Типичные сценарии использования:
1. Выполнение запросов к базам данных для получения и обработки данных.
2. Определение правил и ограничений для данных.
3. Анализ и отчётность на основе данных.
🎯 Преимущества использования декларативного программирования в SQL:
- Удобство и лаконичность написания запросов.
- Автоматическая оптимизация и повышение производительности.
- Снижение вероятности ошибок за счёт абстракции.
❓ Что такое декларативное программирование?
Декларативное программирование — это парадигма, в которой программы описывают, что должно быть сделано, а не как это сделать. SQL — это язык, который использует декларативный подход для работы с базами данных, позволяя разработчикам сосредоточиться на результате запроса, а не на его выполнении.
💡 Основные концепции:
- Описание результата:
1. Фокус на том, какие данные нужно получить, а не на том, как их получить.
2. Использование запросов для описания операций над данными.
❗️Ключевые особенности:
- Удобство и лаконичность:
1. Простота написания и чтения запросов.
2. Снижение вероятности ошибок за счёт абстракции.
- Оптимизация:
1. Возможность автоматической оптимизации запросов базой данных.
2. Улучшение производительности и эффективности работы с данными.
🔍 Типичные сценарии использования:
1. Выполнение запросов к базам данных для получения и обработки данных.
2. Определение правил и ограничений для данных.
3. Анализ и отчётность на основе данных.
🎯 Преимущества использования декларативного программирования в SQL:
- Удобство и лаконичность написания запросов.
- Автоматическая оптимизация и повышение производительности.
- Снижение вероятности ошибок за счёт абстракции.
❤18👍18🔥17
🔍 Линтеры и Go: обеспечение качества кода
❓ Что такое линтеры?
Линтеры — это инструменты, которые анализируют исходный код на наличие ошибок, стилистических недочётов и потенциальных проблем, помогая поддерживать высокое качество кода. В экосистеме Go существует множество линтеров, которые помогают разработчикам писать чистый и эффективный код.
💡 Основные концепции:
- Анализ кода:
1. Проверка синтаксиса и стиля кода.
2. Обнаружение потенциальных ошибок и уязвимостей.
❗️Ключевые особенности:
- Повышение качества кода:
1. Раннее выявление ошибок и проблем.
2. Обеспечение соблюдения стандартов и лучших практик.
- Интеграция в процесс разработки:
1. Возможность использования в CI/CD пайплайнах.
2. Поддержка различных IDE и редакторов кода.
🔍 Типичные сценарии использования:
1. Проверка кода перед коммитом в систему контроля версий.
2. Обеспечение соблюдения стандартов кодирования в команде.
3. Автоматизация проверок кода в процессе разработки.
🎯 Преимущества использования линтеров в Go:
- Повышение качества и надёжности кода.
- Раннее выявление ошибок и проблем.
- Обеспечение соблюдения стандартов и лучших практик.
❓ Что такое линтеры?
Линтеры — это инструменты, которые анализируют исходный код на наличие ошибок, стилистических недочётов и потенциальных проблем, помогая поддерживать высокое качество кода. В экосистеме Go существует множество линтеров, которые помогают разработчикам писать чистый и эффективный код.
💡 Основные концепции:
- Анализ кода:
1. Проверка синтаксиса и стиля кода.
2. Обнаружение потенциальных ошибок и уязвимостей.
❗️Ключевые особенности:
- Повышение качества кода:
1. Раннее выявление ошибок и проблем.
2. Обеспечение соблюдения стандартов и лучших практик.
- Интеграция в процесс разработки:
1. Возможность использования в CI/CD пайплайнах.
2. Поддержка различных IDE и редакторов кода.
🔍 Типичные сценарии использования:
1. Проверка кода перед коммитом в систему контроля версий.
2. Обеспечение соблюдения стандартов кодирования в команде.
3. Автоматизация проверок кода в процессе разработки.
🎯 Преимущества использования линтеров в Go:
- Повышение качества и надёжности кода.
- Раннее выявление ошибок и проблем.
- Обеспечение соблюдения стандартов и лучших практик.
🔥24👍19❤10
🔍 Виды валидации кэша
❓ Что такое валидация кэша?
Валидация кэша — это процесс проверки актуальности данных, хранящихся в кэше, чтобы гарантировать, что пользователи получают самую свежую информацию. Существует несколько стратегий валидации кэша, каждая из которых имеет свои особенности и области применения.
💡 Основные виды валидации кэша:
1. Cache-Aside (Lazy Loading):
- Описание: Данные загружаются в кэш только при первом запросе.
- Преимущества: Уменьшение нагрузки на источник данных, так как данные кэшируются только по запросу.
- Недостатки: Возможны задержки при первом запросе.
2. Write-Through:
- Описание: Данные записываются в кэш и основное хранилище одновременно.
- Преимущества: Гарантирует, что данные в кэше всегда актуальны.
- Недостатки: Увеличение времени записи из-за необходимости обновления двух источников.
3. Write-Behind (Write-Back):
- Описание: Данные сначала записываются в кэш, а затем асинхронно обновляются в основном хранилище.
- Преимущества: Ускорение записи за счёт асинхронного обновления.
- Недостатки: Риск потери данных в случае сбоя.
4. Cache-Aside with TTL (Time-To-Live):
- Описание: Данные хранятся в кэше в течение определённого времени, после чего считаются недействительными.
- Преимущества: Простота реализации и управления.
- Недостатки: Возможность получения устаревших данных, если TTL слишком велик.
🔍 Типичные сценарии использования:
1. Ускорение доступа к часто запрашиваемым данным.
2. Снижение нагрузки на основное хранилище.
3. Обеспечение актуальности данных в распределённых системах.
🎯 Преимущества использования валидации кэша:
- Улучшение производительности приложений.
- Снижение нагрузки на основное хранилище.
- Обеспечение актуальности данных.
❓ Что такое валидация кэша?
Валидация кэша — это процесс проверки актуальности данных, хранящихся в кэше, чтобы гарантировать, что пользователи получают самую свежую информацию. Существует несколько стратегий валидации кэша, каждая из которых имеет свои особенности и области применения.
💡 Основные виды валидации кэша:
1. Cache-Aside (Lazy Loading):
- Описание: Данные загружаются в кэш только при первом запросе.
- Преимущества: Уменьшение нагрузки на источник данных, так как данные кэшируются только по запросу.
- Недостатки: Возможны задержки при первом запросе.
2. Write-Through:
- Описание: Данные записываются в кэш и основное хранилище одновременно.
- Преимущества: Гарантирует, что данные в кэше всегда актуальны.
- Недостатки: Увеличение времени записи из-за необходимости обновления двух источников.
3. Write-Behind (Write-Back):
- Описание: Данные сначала записываются в кэш, а затем асинхронно обновляются в основном хранилище.
- Преимущества: Ускорение записи за счёт асинхронного обновления.
- Недостатки: Риск потери данных в случае сбоя.
4. Cache-Aside with TTL (Time-To-Live):
- Описание: Данные хранятся в кэше в течение определённого времени, после чего считаются недействительными.
- Преимущества: Простота реализации и управления.
- Недостатки: Возможность получения устаревших данных, если TTL слишком велик.
🔍 Типичные сценарии использования:
1. Ускорение доступа к часто запрашиваемым данным.
2. Снижение нагрузки на основное хранилище.
3. Обеспечение актуальности данных в распределённых системах.
🎯 Преимущества использования валидации кэша:
- Улучшение производительности приложений.
- Снижение нагрузки на основное хранилище.
- Обеспечение актуальности данных.
❤20🔥19👍16
🧪 Юнит-тесты: основа надежного кода
❓ Что такое юнит-тесты?
Юнит-тесты — это автоматизированные тесты, которые проверяют отдельные компоненты кода, такие как функции или методы, на корректность работы. Они помогают выявить ошибки на ранних стадиях разработки и обеспечивают надёжность кода.
💡 Основные концепции:
- Изоляция:
1. Тестирование отдельных компонентов без зависимостей.
2. Использование моков и стабов для симуляции внешних зависимостей.
- Повторяемость:
1. Возможность многократного выполнения тестов с одинаковым результатом.
2. Автоматизация тестирования в процессе разработки.
❗️Ключевые особенности:
- Раннее выявление ошибок:
1. Обнаружение проблем на этапе написания кода.
2. Уменьшение времени на отладку и исправление ошибок.
- Поддержка рефакторинга:
1. Уверенность в том, что изменения не нарушают существующую функциональность.
2. Упрощение улучшения и оптимизации кода.
🔍 Типичные сценарии использования:
1. Проверка корректности работы отдельных функций и методов.
2. Обеспечение надёжности кода при внесении изменений.
3. Автоматизация тестирования в CI/CD пайплайнах.
🎯 Преимущества использования юнит-тестов:
- Раннее выявление ошибок и улучшение качества кода.
- Поддержка рефакторинга и улучшения кода.
- Автоматизация тестирования и повышение надёжности приложения.
❓ Что такое юнит-тесты?
Юнит-тесты — это автоматизированные тесты, которые проверяют отдельные компоненты кода, такие как функции или методы, на корректность работы. Они помогают выявить ошибки на ранних стадиях разработки и обеспечивают надёжность кода.
💡 Основные концепции:
- Изоляция:
1. Тестирование отдельных компонентов без зависимостей.
2. Использование моков и стабов для симуляции внешних зависимостей.
- Повторяемость:
1. Возможность многократного выполнения тестов с одинаковым результатом.
2. Автоматизация тестирования в процессе разработки.
❗️Ключевые особенности:
- Раннее выявление ошибок:
1. Обнаружение проблем на этапе написания кода.
2. Уменьшение времени на отладку и исправление ошибок.
- Поддержка рефакторинга:
1. Уверенность в том, что изменения не нарушают существующую функциональность.
2. Упрощение улучшения и оптимизации кода.
🔍 Типичные сценарии использования:
1. Проверка корректности работы отдельных функций и методов.
2. Обеспечение надёжности кода при внесении изменений.
3. Автоматизация тестирования в CI/CD пайплайнах.
🎯 Преимущества использования юнит-тестов:
- Раннее выявление ошибок и улучшение качества кода.
- Поддержка рефакторинга и улучшения кода.
- Автоматизация тестирования и повышение надёжности приложения.
🔥21❤16👍16
🤖 Авто-тесты: обеспечение качества на каждом этапе
❓ Что такое авто-тесты?
Авто-тесты — это тесты, которые выполняются автоматически без участия человека, проверяя функциональность приложения на различных этапах разработки. Они помогают обеспечить качество и надёжность кода, минимизируя ручной труд.
💡 Основные концепции:
- Автоматизация:
1. Выполнение тестов без участия человека.
2. Интеграция в процессы разработки и сборки.
- Покрытие кода:
1. Проверка различных сценариев использования приложения.
2. Обеспечение высокого уровня покрытия тестами.
❗️Ключевые особенности:
- Быстрота и эффективность:
1. Выполнение тестов быстрее, чем вручную.
2. Возможность проверки большого объёма функциональности.
- Повторяемость и надёжность:
1. Одинаковые результаты при каждом запуске.
2. Уменьшение вероятности человеческих ошибок.
🔍 Типичные сценарии использования:
1. Проверка функциональности приложения на различных этапах разработки.
2. Регрессионное тестирование для выявления новых ошибок.
3. Интеграция в CI/CD пайплайны для автоматического выполнения тестов.
🎯 Преимущества использования авто-тестов:
- Ускорение процесса тестирования и повышение его эффективности.
- Обеспечение высокого уровня качества и надёжности кода.
- Уменьшение ручного труда и вероятности ошибок.
❓ Что такое авто-тесты?
Авто-тесты — это тесты, которые выполняются автоматически без участия человека, проверяя функциональность приложения на различных этапах разработки. Они помогают обеспечить качество и надёжность кода, минимизируя ручной труд.
💡 Основные концепции:
- Автоматизация:
1. Выполнение тестов без участия человека.
2. Интеграция в процессы разработки и сборки.
- Покрытие кода:
1. Проверка различных сценариев использования приложения.
2. Обеспечение высокого уровня покрытия тестами.
❗️Ключевые особенности:
- Быстрота и эффективность:
1. Выполнение тестов быстрее, чем вручную.
2. Возможность проверки большого объёма функциональности.
- Повторяемость и надёжность:
1. Одинаковые результаты при каждом запуске.
2. Уменьшение вероятности человеческих ошибок.
🔍 Типичные сценарии использования:
1. Проверка функциональности приложения на различных этапах разработки.
2. Регрессионное тестирование для выявления новых ошибок.
3. Интеграция в CI/CD пайплайны для автоматического выполнения тестов.
🎯 Преимущества использования авто-тестов:
- Ускорение процесса тестирования и повышение его эффективности.
- Обеспечение высокого уровня качества и надёжности кода.
- Уменьшение ручного труда и вероятности ошибок.
❤25👍17🔥12
Как не бояться технических собесов и проходить их на изи 😎Одна из самых распространённых проблем на технических интервью — паника. Ученики пишут мне: «Я всё знаю, но на собесе туплю, краснею и забываю элементарные вещи». Вот несколько простых шагов, которые помогут тебе пройти техничку максимально уверенно и эффективно:
На вопрос «Как реализовать Rate Limiter в GO?» у тебя в голове образовалась пустота? Не замыкайся в себе, начни говорить вслух: «Давайте порассуждаем...» и дальше выстраивай свою логику. HR и технический специалист оценят твою способность думать, а не просто зазубренные ответы.
Многие ребята думают, что писать код на интервью надо как в финале чемпионата по программированию — молча и быстро. Это не так! Комментируй каждый свой шаг: «Вот тут проверю ошибку, вот тут сделаю интерфейс, а здесь нужна горутина». Когда рекрутер или техлид видят ход твоих мыслей, они намного охотнее дают положительный фидбек и продвигают тебя дальше.
Услышав задачу, не бойся уточнять. Например: «Нужно ли учитывать нагрузку?», «А какие ограничения по памяти?». Покажи свою компетентность и вовлечённость. Правильно заданный вопрос даст тебе +20 баллов к лояльности со стороны интервьюера.
Если собес удалённый, и ты часто забываешь какие-то тонкости, открой на втором мониторе заранее подготовленную табличку с часто забываемыми моментами. Поверь, даже топы иногда подсматривают базовые вещи, не стоит этого стесняться.
Технический интервьюер не ждёт, что ты будешь знать всё на 100%. Ошибся? Сразу же скажи: «Да, тут я поторопился, сейчас исправлю», — покажи, что ты умеешь быстро и адекватно реагировать на свои ошибки. За это тебе дадут намного больше баллов, чем за скрытые баги, о которых ты молчишь.
Вывод:
Технический собес — не экзамен в универе, это живой диалог с таким же инженером, как и ты. Показывай, что ты умеешь мыслить, задавать правильные вопросы и спокойно реагировать на ошибки. Тогда любой техинтервью превратится в простой и приятный разговор, после которого тебе прилетит долгожданный оффер 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25❤17👍17
Интерфейсы в GO: как отвечать на собесе, чтобы техлид сразу понял, что ты шаришь 🚀Мои ученики почти всегда легко проходят вопросы про интерфейсы, потому что чётко знают, как грамотно отвечать и что именно хотят услышать интервьюеры. Давай разберём пошагово, как звучит идеальный ответ на вопрос: «Что такое интерфейсы в GO?»
Интерфейс в GO — это абстракция, которая описывает поведение объекта (набор методов), но не говорит о реализации. Простыми словами: «Если оно крякает, значит это утка». Интерфейс позволяет писать универсальный код, не привязываясь к конкретной реализации.
Реализация интерфейсов в GO происходит неявно. Если структура реализует все методы интерфейса, то она автоматически ему удовлетворяет.
Простой пример реализации:
type Worker interface {
Work() string
}
type Programmer struct{}
func (p Programmer) Work() string {
return "Пишу крутой код"
}
Тут структура Programmer автоматически удовлетворяет интерфейсу Worker.
Пустой интерфейс (interface{}) — это особенный интерфейс, у которого нет ни одного метода, поэтому ему удовлетворяет любой тип. Он часто используется в GO, когда заранее неизвестен тип данных.
func PrintAny(val interface{}) {
fmt.Println(val)
}
PrintAny("привет") // строка
PrintAny(42) // число
Под капотом интерфейс — это пара значений:
Это важный момент, который часто спрашивают на продвинутых собесах. Особенно полезно знать, когда речь идёт о nil-интерфейсах
var x interface{}
var y *int = nil
x = y
fmt.Println(x == nil) // false (!)
Почему так? Потому что интерфейс — это тип (не значение!), а тут тип не nil (*int), хотя значение и nil
Использование интерфейсов в GO — это не бесплатно. Из-за косвенности вызовов (indirect calls) интерфейсы могут слегка снижать производительность. Но не спеши паниковать — замедление минимальное и на практике редко критично. Главное, что ты должен знать: интерфейсы используем по делу, а не просто «потому что красиво».
Вывод:
Интерфейсы в GO — мощная штука, которую важно не просто выучить, а реально понимать на уровне механики языка. Если ты будешь на собесе рассказывать именно так, с конкретными примерами и тонкостями, то впечатлишь любого техлида и гарантированно повысишь свой шанс на оффер с большим количеством нулей 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
❤23🔥21👍19
Каналы в GO: что нужно понимать, чтобы не облажаться на собеседовании 🔥Каналы в GO — это не просто «штука, по которой данные гоняют». На собесах важно показать, что ты глубоко понимаешь механику их работы и знаешь, как писать код, который не превращается в хаос.
Вот пошаговая шпаргалка, как отвечать про каналы так, чтобы сразу стало понятно: ты шаришь.
Канал в GO — это типизированный механизм коммуникации и синхронизации между горутинами. Каналы позволяют безопасно передавать данные между горутинами, избегая гонок (race condition) и необходимости вручную блокировать доступ
Простой пример:
ch := make(chan int)
go func() {
ch <- 42
}()
val := <-ch
fmt.Println(val) // 42
«Передача данных блокирует отправителя, пока не появится получатель, и наоборот. Используется для синхронизации».
«Позволяет отправить N значений без блокировки, если буфер не полон. Используются для оптимизации и развязки горутин».
Пример буферизованного канала:
ch := make(chan int, 2)
ch <- 1
ch <- 2
// ch <- 3 уже заблокирует, пока не прочитаем хотя бы один элемент
Закрытие канала (close(ch)) сигнализирует, что данных больше не будет. Чтение из закрытого канала всегда вернёт нулевое значение для типа канала и второй параметр, который показывает, открыт канал или закрыт
Правило:
Пример проверки закрытого канала:
val, ok := <- ch
if !ok {
fmt.Println("Канал закрыт")
}
Cамый удобный способ читать из канала — это for range. Он автоматически завершится, как только канал закроется, и обработает все оставшиеся значения
for val := range ch {
fmt.Println(val)
}
Оператор select позволяет работать одновременно с несколькими каналами. Это мощный инструмент для организации параллельной обработки и graceful shutdown
Классический пример select:
select {
case val := <-ch1:
fmt.Println("Получено из ch1:", val)
case val := <-ch2:
fmt.Println("Получено из ch2:", val)
default:
fmt.Println("Нет данных")
}
Вывод:
Отвечая про каналы именно так — детально, с примерами, и упоминая подводные камни — ты сразу демонстрируешь высокий уровень знаний. После такого ответа ты просто обречён на оффер с жирной зарплатой! 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥20❤16
Как грамотно отвечать про срезы (slices) в GO, чтобы сразу получить плюс к офферу 🔥Срезы (slices) — одна из любимых тем на собеседованиях. Часто кандидаты отвечают на поверхностном уровне, и теряют баллы. Вот чёткий пошаговый план, как отвечать про срезы так, чтобы интервьюер сразу понял — ты знаешь и глубоко понимаешь, о чём говоришь.
Срез — это структура данных в Go, которая представляет собой ссылку на участок массива. Внутри срез состоит из трёх элементов:
Пример среза:
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:3] // {2, 3}
Когда мы используем append, если ёмкость (cap) превышена, Go автоматически выделяет новый массив большей ёмкости и копирует данные в него. При этом оригинальный срез больше не указывает на старый массив
Простой пример реализации:
nums := []int{1, 2, 3} // len=3, cap=3
nums = append(nums, 4) // выделяется новая память (len=4, cap может быть больше)
На собесах любят спрашивать про распространённые ошибки:
arr := [3]int{1,2,3}
slice := arr[:]
slice[0] = 10
fmt.Println(arr[0]) // 10 (меняется исходный массив)
bigSlice := make([]int, 1<<20) // большой срез
smallSlice := bigSlice[:10]
// bigSlice остаётся в памяти, пока smallSlice на него ссылается
Чтобы избежать утечек, можно скопировать нужную часть в новый срез:
smallSliceCopy := make([]int, 10)
copy(smallSliceCopy, smallSlice)
Срезы передаются по значению, то есть копируется структура из трёх полей (указатель, len, cap). Но при этом данные, на которые указывает срез, не копируются, и модификация элементов среза внутри функции повлияет на исходные данные
func modify(slice []int) {
slice[0] = 100
}
nums := []int{1,2,3}
modify(nums)
fmt.Println(nums) // [100 2 3]
Массивы фиксированного размера редко используются в Go, чаще их заменяют срезами из-за гибкости и удобства. Но массивы нужны тогда, когда нужен именно фиксированный размер (например, ключи в map или строгая гарантия размера структуры в памяти)
Вывод:
Если на собеседовании ты объяснишь устройство срезов именно так — с примерами и тонкостями реализации, то интервьюер сразу поймёт, что ты уверенно владеешь Go, и твоему офферу уже можно начинать завидовать! 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥18❤17
Как правильно объяснить работу defer в GO, чтобы собеседование прошло идеально 🔥На собесах по Go часто спрашивают про оператор defer. Почему? Потому что он показывает, насколько ты глубоко понимаешь порядок выполнения кода и обработку исключительных ситуаций.
defer в Go — это оператор, который откладывает выполнение функции до момента выхода из текущей функции. Чаще всего используется для освобождения ресурсов, закрытия файлов или соединений с БД, чтобы гарантировать, что ресурс всегда будет освобождён.
Пример:
func readFile() {
file, _ := os.Open("data.txt")
defer file.Close() // файл закроется гарантированно в конце функции
}
Если в одной функции несколько вызовов defer, то они выполняются в порядке LIFO (последний зашёл — первый вышел). Важно помнить это, чтобы не запутаться и избежать неожиданного поведения
Пример:
func example() {
defer fmt.Println("Первый defer")
defer fmt.Println("Второй defer")
defer fmt.Println("Третий defer")
}
// вывод будет:
// Третий defer
// Второй defer
// Первый defer
На собеседованиях любят спрашивать tricky вопрос про взаимодействие defer и именованных возвращаемых значений. defer может изменить возвращаемое значение перед выходом из функции
Частый пример с собесов:
func tricky() (x int) {
defer func() {
x = 100 // меняем значение перед возвратом
}()
return 10 // сначала вернёт 10, но defer изменит это на 100
}
fmt.Println(tricky()) // 100 (!)
Если внутри функции произошла паника, то все вызовы defer выполнятся перед тем, как паника продолжит распространяться наверх. Это свойство активно используется вместе с recover(), чтобы восстановить приложение после паники
Классический пример обработки паники:
func safeDivide(a, b int) (result int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Произошла паника:", r)
result = 0 // возвращаем безопасное значение
}
}()
result = a / b // возможна паника (деление на 0)
return
}
fmt.Println(safeDivide(10, 0)) // "Произошла паника" и вывод 0
Вывод:
Если ты расскажешь про defer на собесе именно так — понятно, чётко и с примерами — то вопросы отпадут сами собой, и твой путь к жирному офферу станет короче и легче! 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍23❤13
Горутины и WaitGroup в GO: как ответить, чтобы рекрутер понял - ты приручил параллелизм 🏎️Горутины - одна из визитных карточек Go. На интервью любят проверять, умеешь ли ты запускать их правильно и завершать без утечек. Держи чек-лист, который сделает твой рассказ безупречным.
go func() { fmt.Println("Hello from goroutine") }()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
work()
}()
wg.Wait()
Вывод:
Показываешь знание стоимости горутин, WaitGroup - и техлид уже mentally пишет «offer approved»!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤23👍18🔥16
Ошибки, panic и recover: отвечаем так, чтобы интервьюер улыбнулся 😎
Error-handling в Go - лакмусовая бумажка инженерной культуры. Расскажи по пунктам - и не оплошаешь.
val, err := strconv.Atoi("42")
if err != nil { return 0, fmt.Errorf("parse: %w", err) }
func safeHandler(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
defer func() {
if rec := recover(); rec != nil {
log.Printf("panic: %v", rec)
http.Error(w, "internal error", http.StatusInternalServerError)
}
}()
h(w, r)
}
}
Вывод:
Четко разделяешь error vs panic, умеешь оборачивать и восстанавливать - +100 к доверию и к предложению! 💰
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍18❤17
RWMutex и atomic: отвечаем про синхронизацию так, чтобы тимлид сказал «берём!» 🌟
var mu sync.RWMutex
func (c *cache) Get(k string) (v int, ok bool) {
mu.RLock(); defer mu.RUnlock()
v, ok = c.data[k]
return
}
func (c *cache) Set(k string, v int) {
mu.Lock(); defer mu.Unlock()
c.data[k] = v
}
Для простых чисел используем atomic.AddInt64, atomic.LoadUint32 - дешевле, чем мьютекс
var hits int64
func hit() { atomic.AddInt64(&hits, 1) }
func readHits() int64 { return atomic.LoadInt64(&hits) }
Вывод:
Различаешь случаи Mutex/RWMutex/atomic, умеешь выбирать по нагрузке - +100 очков к уровню senior и к жирному офферу!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥18❤12
Просыпаться с ясной головой - базовый минимум или роскошный максимум?
Раньше мой мозг был как браузер с 50 открытыми вкладками. Куча планов, задач, идей — и в итоге полный ступор, от того, что меня одного на все не хватало.
Однажды я понял простую вещь: когда у тебя слишком много целей, мозг зависает. Он не понимает, за что хвататься, и в итоге ты ничего не делаешь. Сейчас каждое утро выписываю максимум 3 задачи на день. Не больше. И сразу становится понятно, куда направить энергию.
Хаос в делах вгоняет в состояние полного бездействия и вызывает тревожность. Цель становится размытой, мозг отвлекается на всё подряд.
Решение простое: выписать все цели и задачи на бумагу. Выбрать 1-3 самые важные на сегодня. Остальное — в сторону.
Порядок в голове = порядок в жизни.
Раньше мой мозг был как браузер с 50 открытыми вкладками. Куча планов, задач, идей — и в итоге полный ступор, от того, что меня одного на все не хватало.
Однажды я понял простую вещь: когда у тебя слишком много целей, мозг зависает. Он не понимает, за что хвататься, и в итоге ты ничего не делаешь. Сейчас каждое утро выписываю максимум 3 задачи на день. Не больше. И сразу становится понятно, куда направить энергию.
Хаос в делах вгоняет в состояние полного бездействия и вызывает тревожность. Цель становится размытой, мозг отвлекается на всё подряд.
Решение простое: выписать все цели и задачи на бумагу. Выбрать 1-3 самые важные на сегодня. Остальное — в сторону.
Порядок в голове = порядок в жизни.
👍38🔥23❤21
Внутрення опора - твой ключ к дисциплине
Знаешь, что я понял за годы работы над собой?
Самые сильные люди — это не те, кто никогда не падает. А те, кто умеет находить опору внутри себя, которая позволяет им подниматься.
Раньше я был игроманом. Мог сутками сидеть за компьютером, потом пытался завязать, но через неделю снова возвращался к старому. Потому что не понимал, что проблема не в играх, а в том, что у меня не было опоры.
Спустя нескольких лет самосовершенствования, я смог сформировать для себя систему трёх побед, которая помогает мне сохранять внутренний баланс, даже когда снаружи “штормит”.
Каждый день я делаю три простые вещи:
— хотя бы 10 минут движения (физическая победа)
— планирую день, расставляю приоритеты (ментальная победа)
— медитирую, благодарю вселенную за то, что имею (духовная победа)
С этой системой я чувствую себя капитаном своего собственного корабля. Моя опора - мой компас. А когда есть внутренний компас, никакой шторм не собьет с курса.
Знаешь, что я понял за годы работы над собой?
Самые сильные люди — это не те, кто никогда не падает. А те, кто умеет находить опору внутри себя, которая позволяет им подниматься.
Раньше я был игроманом. Мог сутками сидеть за компьютером, потом пытался завязать, но через неделю снова возвращался к старому. Потому что не понимал, что проблема не в играх, а в том, что у меня не было опоры.
Спустя нескольких лет самосовершенствования, я смог сформировать для себя систему трёх побед, которая помогает мне сохранять внутренний баланс, даже когда снаружи “штормит”.
Каждый день я делаю три простые вещи:
— хотя бы 10 минут движения (физическая победа)
— планирую день, расставляю приоритеты (ментальная победа)
— медитирую, благодарю вселенную за то, что имею (духовная победа)
С этой системой я чувствую себя капитаном своего собственного корабля. Моя опора - мой компас. А когда есть внутренний компас, никакой шторм не собьет с курса.
🔥30❤21👍17
🎯Наш эксперимент на HH: 300 откликов за сутки ⚡
В прошлое воскресенье мы с учениками оформили вакансию на HH (Go, ~3 года опыта).
За 24 часа прилетело 300 откликов. Я в соло разобрал ~90% и у большинства одинаковые GPT болванки:
🚫 «Настраивал gRPC-взаимодействие…»
🚫 «Работал с Kafka…»
🚫 «Оптимизировал Redis…»
🚫 «Писал тесты…»
🚫 «Участвовал в проектировании архитектуры…»
🚫 «Сбор метрик и мониторинг…»
Так нельзя писать — теряешься среди сотен похожих резюме.
Примеры «killer-фич», которые хотят видеть тимлиды
Пиши фичу, а не инструмент:
✔️ Рекомендательная система. Запустил блок «Вам может понравиться». За 30 дней: +4 300 дополнительных покупок, доля заказов из рекомендаций выросла с 6% до 14%.
✔️ Импорт каталога. Сделал сервис, который сам забирает файлы от поставщиков, приводит атрибуты к единому виду, чистит изображения, пересчитывает цены и кладёт всё в хранилище — без ручных правок, обновления доходят до витрины автоматически
✔️ Поднял бэкенд, который показывает остатки по каждому магазину и центральному складу с учетом резервов; цифры на витрине всегда совпадают с ERP, пересчёт срабатывает при любом движении товара.
19 августа вместе с учениками собираемся разбирать резюме: смотрим хорошие фичи и по резюме будем искать «волков»
В прошлое воскресенье мы с учениками оформили вакансию на HH (Go, ~3 года опыта).
За 24 часа прилетело 300 откликов. Я в соло разобрал ~90% и у большинства одинаковые GPT болванки:
Так нельзя писать — теряешься среди сотен похожих резюме.
Примеры «killer-фич», которые хотят видеть тимлиды
Пиши фичу, а не инструмент:
19 августа вместе с учениками собираемся разбирать резюме: смотрим хорошие фичи и по резюме будем искать «волков»
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍24❤23
🎓 Первая лекция по Go: массивы и слайсыНа этой неделе с учениками провели стартовую лекцию. Разобрали не «поверхностно», а как любят техлиды — что под капотом и как отвечать на собесе.
Что сделали:
Итог: у ребят есть четкая шпаргалка по массивам и слайсам и готовый скрипт ответа для собеседования.
Дальше: на следующей неделе — лекция по map: разберём «старую» и «новую» реализацию, ключевые подводные камни и как на это отвечать на собесе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33❤28🔥27
Про «Яндекс» в резюме: так не работает
По нашим откликам ~15% кандидатов ставят последним местом работы Яндекс.
Проблема в том, что это легко проверяется. У HR есть знакомства, служба безопасности делает бэкграунд-чек и доверие к резюме падает в ноль.
Что бывает: быстрый отказ без фидбэка, минус репутация, иногда бан в пуле кандидатов.
Вывод: если не работал, не пиши Яндекс. Сильнее всего работают крупные фичи, цифры и зона ответственности, это все проверено в менторстве.
По нашим откликам ~15% кандидатов ставят последним местом работы Яндекс.
Проблема в том, что это легко проверяется. У HR есть знакомства, служба безопасности делает бэкграунд-чек и доверие к резюме падает в ноль.
Что бывает: быстрый отказ без фидбэка, минус репутация, иногда бан в пуле кандидатов.
Вывод: если не работал, не пиши Яндекс. Сильнее всего работают крупные фичи, цифры и зона ответственности, это все проверено в менторстве.
👍29🔥25❤18