JuniorPython Developer > Основы Python > Алгоритмы и типовые задачи
Короткий ответ FizzBuzz — классическая задача, которой проверяют базовые навыки программирования: циклы, условия и работу с остатком от деления. Для каждого числа от 1 до n нужно вывести FizzBuzz, если оно делится и на 3, и на 5; Fizz, если только на 3; Buzz, если только на 5; иначе — само число в виде строки. Как это работает подробнее Решение строится на простом цикле с проверками делимости, а главное в нём — корректный порядок условий. Правила вывода. Для каждого числа i от 1 до n выбирается ровно один вариант ответа: FizzBuzz, Fizz, Buzz или само число строкой. Оператор остатка. Делимость проверяется через %: i % 3 == 0 истинно, когда число кратно трём, аналогично для пяти. Порядок веток. Комбинированное условие «делится и на 3, и на 5» обязано идти первым, иначе число 15 попадёт в ветку Fizz. Вывод числа. В ветке else число преобразуется в строку через str(i), чтобы результат был однородным списком. Пример кода Что использовать на практике Простой цикл. Аккуратного цикла с elif достаточно для собеседован
algorithmsfizzbuzz
JuniorPython Developer > Основы Python > Потоки и синхронизация
Короткий ответ GIL — глобальный мьютекс в CPython, который позволяет только одному потоку выполнять байт-код Python в любой конкретный момент времени, даже если в процессе запущено несколько потоков. Как это работает подробнее GIL — особенность конкретной реализации CPython (а не языка Python), введённая для упрощения управления памятью (счётчики ссылок не потокобезопасны сами по себе). Потоки по очереди захватывают GIL, выполняя небольшие порции байт-кода, и периодически его отдают. Пример кода Что использовать на практике Практика. Для CPU-bound задач (чистые вычисления на Python) многопоточность в CPython не даёт параллельного ускорения. Для I/O-bound задач GIL освобождается на время блокирующей операции, поэтому потоки эффективно помогают перекрывать ожидания. Подводные камни Риски. Считают, что GIL автоматически делает любой код потокобезопасным — составная операция (x += 1) может быть прервана между чтением и записью; путают GIL с отсутствием параллелизма вообще, забывая про multiprocessing и C-расширен
concurrencygil
JuniorPython Developer > Основы Python > Инструменты разработки
Короткий ответ Git — это распределённая система контроля версий для отслеживания изменений исходного кода. В отличие от централизованных систем вроде SVN или CVS, каждый разработчик имеет полную копию репозитория со всей историей. Commit — это запись изменений с метаданными: автор, дата и ссылка на родительский коммит. Как это работает подробнее Каждый файл в репозитории в любой момент находится в одном из четырёх состояний, между которыми его перемещают команды Git. Untracked. Новый файл, ещё не добавленный в Git. Modified. Файл изменён после последнего коммита, но ещё не подготовлен. Staged. Файл добавлен командой git add и готов к коммиту. Committed. Изменения сохранены в репозиторий командой git commit. Целостность. Каждый коммит идентифицируется уникальным SHA-1-хэшем, а git push и git pull синхронизируют локальный репозиторий с удалённым. Пример кода Что использовать на практике Частые коммиты. Делай небольшие коммиты с осмысленными сообщениями, чтобы историю было легко читать. Проверка состояния. Регул
commitgit
MiddlePython Developer > Основы Python > Многопоточность и асинхронность
Короткий ответ GIL (Global Interpreter Lock) — блокировка в эталонной реализации CPython, которая позволяет только одному потоку исполнять байткод Python в любой момент времени. Она появилась из-за непотокобезопасного подсчёта ссылок, ограничивает вычислительные задачи, а вот задачи ввода-вывода от потоков по-прежнему выигрывают. Как это работает подробнее Многопоточность в Python существует, но из-за GIL реально параллельно по байткоду исполняется только один поток. Суть механизма. GIL — мьютекс, удерживаемый единственным потоком: даже в многоядерной системе два потока одного процесса не выполняют Python-байткод одновременно. Причина появления. Управление памятью в CPython, в частности подсчёт ссылок, не потокобезопасно; GIL упрощает его и избавляет разработчиков от множества ошибок с общими объектами. Что страдает. CPU-bound программы не ускоряются от добавления потоков, тогда как I/O-bound задачи дают выигрыш благодаря ожиданиям ввода-вывода. Обходные пути. Настоящий параллелизм дают отдельные процессы чер
cpythongil
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Helm chart — это упакованный набор шаблонов Kubernetes-манифестов с метаданными; values.yaml задаёт настраиваемые параметры по умолчанию (например, количество реплик, образ), а templates/ содержит Go-шаблоны манифестов, которые Helm рендерит, подставляя значения из values, в итоговые YAML для применения в кластер. Как это работает подробнее при helm install/helm upgrade Helm объединяет значения из values.yaml чарта, файлов -f custom-values.yaml и флагов --set (по возрастанию приоритета), рендерит шаблоны из templates/ с этими значениями через Go template engine и применяет получившиеся манифесты в кластер, сохраняя релиз как отдельный объект (Secret) для истории. Пример кода Что использовать на практике Практика. один и тот же chart переиспользуется для разных окружений за счёт разных values-файлов (values-dev.yaml, values-prod.yaml), без изменения самих шаблонов; это аналог "модуля" в Terraform, но для Kubernetes-манифестов. Подводные камни Ошибка. хардкодить значения прямо в templates вместо
configuration-managementhelm
MiddleJava Developer > Java Core > JPA и Hibernate
Короткий ответ JPA (Java Persistence API) — это стандарт (спецификация) ORM в Java: он определяет API и набор аннотаций — @Entity, EntityManager, JPQL — но сам по себе реализацией не является. Hibernate — самая популярная реализация этой спецификации: он реализует интерфейсы JPA и добавляет собственные расширения: HQL, тонкую настройку кэша второго уровня и дополнительные возможности. Как это работает подробнее Разница в уровне абстракции: JPA — это правила и интерфейсы, у которых есть несколько реализаций, а Hibernate — одна из них, наиболее функциональная. Если писать код только на стандартном JPA-API, он будет переносимым между ORM-провайдерами; расширенные же возможности доступны через Hibernate. JPA — стандарт: набор правил, интерфейсов и аннотаций; реализации — Hibernate, EclipseLink, OpenJPA. Hibernate — реализация JPA с самым широким набором возможностей и расширений. HQL — собственный язык запросов Hibernate, работающий на высоком уровне абстракции. На практике: в Spring Boot по умолчанию JPA-провайд
hibernatejava
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ IaC описывает инфраструктуру декларативным кодом, который хранится в репозитории, проходит review и применяется автоматически; при ClickOps инженер вносит изменения вручную через UI, и эти изменения нигде не зафиксированы как код. Как это работает подробнее Terraform читает конфигурацию в HCL, строит граф зависимостей ресурсов, запрашивает текущее состояние через API провайдера и вычисляет план изменений, необходимых для перехода к описанному в коде состоянию. Пример кода Что использовать на практике Практика. код хранится в git, его можно просмотреть в Pull Request, повторно применить для создания идентичного окружения (например, staging как копия prod) и восстановить инфраструктуру после потери. ClickOps подходит для быстрых экспериментов, но не оставляет истории изменений и не гарантирует повторяемость. Подводные камни Ошибка. считать, что после внедрения Terraform ручные правки в консоли становятся технически невозможны — это не так, их просто не стоит делать, иначе возникнет расхождение (d
cloud-infrastructureconfiguration-management
JuniorDevOps Engineer > Контейнеры и доставка > Файловые системы Linux
Короткий ответ inode — структура метаданных файла (права, владелец, размер, указатели на блоки данных), не содержащая имени; при удалении файла, открытого процессом, запись в каталоге исчезает, но место освобождается только после того, как процесс закроет файловый дескриптор. Как это работает подробнее Имя файла в каталоге — это просто ссылка на номер inode; команда rm уменьшает счётчик ссылок на единицу, а ядро окончательно освобождает блоки данных, когда и счётчик ссылок, и счётчик открытых файловых дескрипторов становятся равны нулю. Пример кода Что использовать на практике Практика. это объясняет ситуацию, когда df показывает диск почти полным, а du по видимым файлам — почти пустым: нужно искать процессы, держащие удалённые файлы, через lsof с фильтром deleted, и либо перезапускать процесс, либо дожидаться штатной ротации логов. Подводные камни Риск. Частая ошибка — пытаться освободить место, удаляя лог-файл, который пишет активный процесс, и удивляться, что df не показывает прироста свободного места сраз
file-descriptorsfilesystems
JuniorJava Developer > Java Core > Spring
Короткий ответ IoC (Inversion of Control) — принцип, по которому управление созданием и жизненным циклом объектов передаётся контейнеру. DI (Dependency Injection) — паттерн внедрения зависимостей и один из способов реализации IoC: контейнер сам предоставляет объекту его зависимости. Как это работает подробнее В Spring инверсию контроля реализует IoC-контейнер — базовый BeanFactory или расширенный ApplicationContext. Он создаёт бины, связывает их и управляет их временем жизни, поэтому приложение не вызывает new, а лишь описывает нужные ему объекты. Именно поэтому подход называется инверсией контроля: контроль над созданием объектов переходит от кода приложения к контейнеру. IoC шире, чем DI: IoC — общий принцип инверсии управления, а DI — конкретная техника, один из способов его реализации. Способы DI: внедрение через конструктор, через сеттер и напрямую в поле (field injection). Для запоминания: «Spring создаёт бин» — это IoC, а «Spring внедряет один бин в другой» — это DI. Пример кода Что использовать на пра
containerdependency-injection
JuniorJava Developer > Java Core > SQL и БД
Короткий ответ JOIN — операция объединения строк двух или более таблиц на основе условия соответствия, обычно по ключам. INNER JOIN возвращает только совпавшие строки; LEFT JOIN — все строки левой таблицы, а при отсутствии совпадения поля правой заполняются NULL; RIGHT JOIN — зеркальный вариант для правой таблицы; FULL JOIN возвращает все строки обеих таблиц, заполняя NULL стороны без пары. Как это работает подробнее Подзапрос (subquery) — это запрос, вложенный в другой запрос: он используется в WHERE через IN, EXISTS или сравнение со значением, а также в списке выборки для фильтрации и вычислений. Главное отличие от JOIN — в результате: JOIN «расширяет» выборку колонками второй таблицы, а подзапрос вычисляет отдельный результат, который внешний запрос использует как условие или источник данных. Объём результата: INNER JOIN — пересечение; LEFT и RIGHT JOIN — все строки одной стороны с NULL на другой; FULL JOIN — все строки обеих таблиц. Подзапрос: коррелированный подзапрос выполняется для каждой строки внешне
databasejoin