JuniorPython Developer > Основы Python > Анализ требований
Короткий ответ Нельзя додумывать детали самостоятельно: нужно уточнить требования у автора задачи (аналитика, продакт-менеджера) и зафиксировать договорённость письменно, прежде чем приступать к реализации. Как это работает подробнее Неполное требование — это сигнал, что решение ещё не принято, а не повод импровизировать. Разработчик формулирует конкретные вопросы (какие поля, какой формат файла, что с пустыми значениями, нужна ли пагинация для больших отчётов) и получает ответы до написания кода. Пример кода Что использовать на практике Практика. Вопросы лучше задавать сразу все и в письменном виде (тикет, чат), чтобы ответ стал частью истории задачи и к нему можно было вернуться. Если автор задачи недоступен, стоит предложить разумное умолчание и явно описать его в комментарии к задаче, чтобы его можно было поправить до ревью. Полезно также прикладывать к уточняющему вопросу конкретный пример («если поле «скидка» пустое — показывать 0 или прочерк?»), потому что на абстрактный вопрос без примера легко получи
acceptance-criteriaexcel
SeniorData Analyst > SQL и данные > Python для анализа данных
Короткий ответ Единственного правильного решения нет: можно работать с суммами в минимальных целых единицах (копейках) вместо дробных рублей, использовать тип Decimal для критичных расчётов, либо принять заранее согласованный порог допустимого округления — выбор зависит от требуемой точности сверки и производительности расчётов. Как это работает подробнее float64 хранит дробные десятичные числа приближённо в двоичном виде, поэтому последовательное сложение многих денежных значений накапливает мелкие ошибки округления; хранение сумм как целых чисел в минимальных единицах (копейках) полностью устраняет проблему двоичного округления для сложения, а Decimal в Python даёт точную десятичную арифметику ценой меньшей производительности и более сложного кода. Пример кода Что использовать на практике На практике. если отчёт должен сверяться с бухгалтерией "до копейки", стоит привести входные суммы к целым копейкам сразу при загрузке данных и выполнять все промежуточные расчёты в этих единицах, переводя обратно в рубли
decimalfinance
MiddlePython Developer > Основы Python > Внешние интеграции
Короткий ответ GraphQL позволяет клиенту одним запросом запросить произвольный набор полей и связанных сущностей через единый эндпоинт, в отличие от REST с фиксированной формой ответа на фиксированном URL; при этом резолверы для вложенных полей часто вызываются отдельно для каждого элемента списка, что создаёт классический N+1 на уровне резолверов, если не использовать batching (например, DataLoader). Как это работает подробнее в REST сервер решает, какие данные вернуть на конкретный путь; в GraphQL клиент описывает нужную форму ответа в запросе (query), а сервер исполняет граф резолверов, где каждое поле может иметь собственную функцию получения данных, независимо вызываемую для каждого родительского объекта. Пример кода Что использовать на практике Рекомендация. GraphQL решает проблему "недостаточности данных за один запрос" (undersetching) и "избыточности данных" (overfetching), характерные для жёстких REST-ответов, но добавляет сложность на стороне сервера: без батчинга резолвер для поля author у списка и
dataloadergraphql
MiddleDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Stateless веб-слой обычно масштабируется горизонтально практически без ограничений — просто добавляются новые идентичные инстансы за балансировщиком; управляемая реляционная база данных проще всего масштабировать вертикально, а горизонтальное масштабирование записи ограничено архитектурой конкретной СУБД и часто требует шардирования или смены модели данных. Как это работает подробнее у stateless-сервиса каждый инстанс независим и не хранит состояние между запросами, поэтому балансировщик может равномерно распределить нагрузку между любым числом реплик; у реляционной БД запись обычно идёт на единственный primary-узел, поэтому масштабирование записи горизонтально требует либо шардирования данных, либо перехода на распределённую СУБД. Пример кода Что использовать на практике Рекомендация. для веб-слоя горизонтальное масштабирование — стандартный первый инструмент при росте нагрузки; для БД сначала выжимают вертикальное масштабирование и read-реплики для чтения, и только когда это перестаёт хватать
horizontal-scalingmanaged-databases
MiddleJava Developer > Java Core > Collections
LinkedHashMap хранит дополнительный двусвязный список, который задает порядок обхода элементов.
Collections
MiddlePython Developer > Основы Python > Генераторы и итераторы
Короткий ответ [x for x in y] — списковое включение: все элементы вычисляются сразу и складываются в список в памяти. (x for x in y) — генераторное выражение: значения вычисляются лениво, по одному, когда они запрашиваются. Как это работает подробнее Выражения различаются моментом вычисления элементов и тем, что именно хранится в памяти. Материализация. Списковое включение строит весь список сразу, поэтому занимает память пропорционально числу элементов. Ленивость. Генератор хранит только текущее состояние и вычисляет очередное значение в момент запроса, например в цикле for или функцией next(). Одноразовость. По генератору можно пройтись только один раз; элементы нельзя получить повторно или обратиться к ним по индексу. Опускание скобок. Если генераторное выражение — единственный аргумент функции, вторые круглые скобки не нужны, например sum(x * x for x in range(5)). Пример кода Что использовать на практике Нужен список. Когда требуется хранить результат целиком или обращаться по индексу, бери списковое вклю
generator-expressionslazy-evaluation
MiddleData Analyst > SQL и данные > SQL
Короткий ответ LIMIT n (PostgreSQL, MySQL, ClickHouse, BigQuery) ставится после ORDER BY в конце запроса, TOP n в T-SQL (SQL Server) ставится сразу после SELECT, а FETCH FIRST n ROWS ONLY — стандартный ANSI SQL синтаксис, поддерживаемый, например, в PostgreSQL и Oracle как альтернатива LIMIT; при переносе запроса между диалектами синтаксис ограничения строк почти всегда нужно переписывать вручную. Как это работает подробнее все три конструкции решают одну задачу — ограничить количество возвращаемых строк — но различаются синтаксическим расположением и иногда поведением при наличии «ничьих» на границе отсечки (для которых может потребоваться WITH TIES в T-SQL или FETCH FIRST ... WITH TIES в ANSI SQL, что не всегда есть в упрощённом LIMIT). Пример кода Что использовать на практике Практика. при переносе SQL-логики между системами (например, миграция отчётов с SQL Server на PostgreSQL или с PostgreSQL на BigQuery) стоит явно пройтись по каждому запросу и заменить диалект-специфичный синтаксис, а не надеяться на
clickhousemysql
MiddlePerformance Marketer > Google Ads > Атрибуция и измерение
Короткий ответ Data-driven обучается на наблюдаемых конверсионных и неконверсионных путях; неполный трекинг и ограниченная выборка снижают надёжность её выводов. Как это работает подробнее Data-driven модель обучается на исторических конверсионных и неконверсионных путях аккаунта, сравнивая вклад каждого канала или точки касания в вероятность конверсии; при малом объёме данных платформа может упрощать правило или давать нестабильные веса от периода к периоду. Некоторые платформы ограничивают минимальный период накопления данных перед переходом на data-driven, и до достижения порога модель может автоматически работать по упрощённому правилу, о чём не всегда явно сообщается в интерфейсе. Что использовать на практике Проверьте требования платформы к данным, стабильность весов и изменение бюджетных решений при параллельном расчёте с прежней моделью. Подводные камни Не переходите на сложную модель только из-за её названия: модель атрибуции не доказывает инкрементальность канала.
conversion-datadata-driven-attribution
MiddlePython Developer > Основы Python > Django и DRF
Короткий ответ Django Form ориентирован на обработку данных HTML-формы и рендеринг виджетов/ошибок в шаблоне (server-rendered страницы), тогда как DRF Serializer ориентирован на (де)сериализацию структурированных данных (обычно JSON) для API; в одном проекте оба уместны, если часть приложения — классические серверные страницы, а часть — JSON API. Как это работает подробнее Form/ModelForm тесно интегрированы с Django-шаблонами: умеют рендерить HTML-поля, показывать ошибки рядом с полем, работать с multipart/form-data для файлов в контексте обычной веб-страницы. Serializer/ModelSerializer не привязаны к HTML: они описывают структуру данных для API, умеют валидировать и преобразовывать вложенные структуры, списки и т. п., без понятия «виджет». Пример кода Что использовать на практике Практика. В проекте с админкой/классическими страницами (например, регистрация через HTML-форму) и одновременно с мобильным приложением, которое ходит в JSON API, естественно иметь RegistrationForm для веб-страницы и RegistrationSer
djangodjango-rest-framework
JuniorSMM Manager > Общее > Площадки и основы SMM
Короткий ответ Публичная страница предназначена для бренда и его подписчиков (пользователи «подписываются», а не «вступают»), группа больше подходит для сообществ с обсуждениями и совместным контентом, а мероприятие — временный формат под конкретную дату или акцию, который после её завершения теряет актуальность. Как это работает подробнее во ВКонтакте это разные типы сообществ с разными настройками видимости, вступления и набором доступных вкладок (товары, обсуждения, документы); публичная страница по умолчанию открыта и ориентирована на массовую аудиторию, группа может быть закрытой/частной, мероприятие привязано к дате начала и окончания. Что использовать на практике Рекомендация. для большинства брендов выбирают публичную страницу как основную витрину, группу используют дополнительно для закрытых клубов или программ лояльности, а мероприятие — для анонса конкретного ивента или акции с ограниченным сроком жизни. Подводные камни Риск. создание бренд-сообщества в формате «мероприятие» без понимания, что оно
audience-segmentationcontent-formats