Yet another app
341 subscribers
57 photos
4 videos
24 links
Технологии, команды, проекты
Download Telegram
📝 Как в Python используются списки

Для работы с коллекцией объектов в Python используются списки (list) (иногда их называют как динамические массивы за расширяемость).

Можно выделить несколько подходов:

Сегодня поговорим о различных способах создания списков в Python с использованием библиотеки dis для анализа байт-кода. Разберем эффективность каждого метода!

1️⃣ Квадратные скобки


numbers = [1, 2, 3, 4, 5]


Байт-код:


>>> dis.dis("numbers = [1, 2, 3, 4, 5]")
1 0 LOAD_CONST 0 (1)
2 LOAD_CONST 1 (2)
4 LOAD_CONST 2 (3)
6 LOAD_CONST 3 (4)
8 LOAD_CONST 4 (5)
10 BUILD_LIST 5
12 STORE_NAME 0 (numbers)
14 LOAD_CONST 5 (None)
16 RETURN_VALUE


👉 Самый быстрый способ для небольших списков с известными значениями. Все значения загружаются как константы.

2️⃣ List comprehension


squares = [x**2 for x in range(5)]


Байт-код:


>>> dis.dis("squares = [x**2 for x in range(5)]")
1 0 LOAD_CONST 0 (<code object <listcomp>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_NAME 0 (range)
8 LOAD_CONST 2 (5)
10 CALL_FUNCTION 1
12 GET_ITER
14 CALL_FUNCTION 1
16 STORE_NAME 1 (squares)
18 LOAD_CONST 3 (None)
20 RETURN_VALUE


👉 Элегантный и эффективный способ для преобразования последовательностей.

3️⃣ Метод list()


numbers = list(range(5))

Байт-код:


>>> dis.dis("numbers = list(range(5))")
1 0 LOAD_NAME 0 (list)
2 LOAD_NAME 1 (range)
4 LOAD_CONST 0 (5)
6 CALL_FUNCTION 1
8 CALL_FUNCTION 1
10 STORE_NAME 2 (numbers)
12 LOAD_CONST 1 (None)
14 RETURN_VALUE


👉 Удобен для преобразования итерируемых объектов в список.

4️⃣ Цикл for с append


numbers = []
for i in range(5):
numbers.append(i)


Байт-код:


>>> dis.dis("""
numbers = []
for i in range(5):
numbers.append(i)
""")
2 0 BUILD_LIST 0
2 STORE_NAME 0 (numbers)

3 4 SETUP_LOOP 26 (to 32)
6 LOAD_NAME 1 (range)
8 LOAD_CONST 0 (5)
10 CALL_FUNCTION 1
12 GET_ITER
>> 14 FOR_ITER 14 (to 30)
16 STORE_NAME 2 (i)

4 18 LOAD_NAME 0 (numbers)
20 LOAD_METHOD 3 (append)
22 LOAD_NAME 2 (i)
24 CALL_METHOD 1
26 POP_TOP
28 JUMP_ABSOLUTE 14
>> 30 POP_BLOCK
>> 32 LOAD_CONST 1 (None)
34 RETURN_VALUE


👉 Более многословный подход, но гибкий подход для сложной логики. Может создать проблемы с производительностью, если в список нужно добавлять большое количество элементов.

🔍 Анализ производительности показывает:

1. Создание списка с помощью квадратных скобок - самое быстрое
2. List comprehension быстрее чем цикл for.
3. list() эффективен для преобразования итерируемых объектов.
4. Цикл for + append самый медленный способ работы со списками.


А как вы работаете со списками
👍4
🔍 Метод двух указателей: прокачиваем навыки через палиндромы

🤔 Многие начинающие разработчики решают задачу проверки палиндрома простым способом:


def is_palindrome_simple(s):
return s == s[::-1] # или s == ''.join(reversed(s))


Недостатки такого подхода:
- Дополнительная память O(n) для копии строки
- Невозможность пропускать спецсимволы на лету
- Сложность модификации для более сложных случаев
- Отсутствие возможности раннего выхода при несовпадении

Метод двух указателей даёт нам:
- Работу без дополнительной памяти O(1)
- Гибкость в обработке специальных случаев
- Возможность раннего выхода
- Прокачку важных навыков программирования

🎯 Навыки, которые прокачиваем:
- Работа с циклами и индексами
- Граничные условия
- Логические выражения
- Оптимизация кода

📚 Варианты задач с возрастающей сложностью:

1️⃣ Базовый палиндром (`abcba`)


def is_palindrome(s):
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True


💪 Прокачка: индексы, цикл while, условия выхода

2️⃣ Палиндром со спецсимволами (`a b,. cb. a`)
💪 Прокачка: вложенные циклы, строковые методы, edge cases
🔗 Задача: https://leetcode.com/problems/valid-palindrome

3️⃣ Поиск самого длинного палиндрома ddaabcbaaee

- с помощью перебора
- и с поиском от центра (оптимизированный способ)

💪 Прокачка: Вложенные циклы for, срезы строк, работа со списками, Оптимизация алгоритма, работа с множествами, list comprehension
🔗 Задача: https://leetcode.com/problems/longest-palindromic-substring

⭐️ Бонус: Попробуйте решить задачу поиска самого длинного палиндрома в строке обоими способами (перебор и от центра) и сравните производительность!

#programming #algorithms #coding #interview #python #palindrome
👍91🔥1
# 🔍 Эксперимент: от лайка до трудоустройства

Привет, сообщество! Хочу поделиться результатами интересного эксперимента, который я провел в прошлом году. Я предложил всем желающим пройти небольшое экспресс-интервью, после которого давал небольшие персональные рекомендации по развитию.

## 📊 Воронка эксперимента

Как распределились цифры:

- 24 человека поставили лайк посту с предложением
- 6 человек (25% от лайкнувших) заполнили анкету
- 6 интервью было проведено (100% конверсия от заполнивших форму)
- 4 рекомендации было составлено (66% от проведенных интервью)
- 1 человек успешно прошел все этапы собеседований и получил оффер (25% от полученных рекомендаций)

## 💡 Выводы

- мы потеряли 75% заинтересованных между "лайкнуть пост" (проявить поверхностный интерес) и "заполнить форму" (сделать первое реальное действие). Между "хочу" и "делаю" существует огромная пропасть
- Даже из небольшого числа активных участников можно получить качественный результат
- Персональный подход работает: все, кто заполнил форму, дошли до интервью
🔥10👍6❤‍🔥1
🎓 Приключения в Физтехе: учу студентов и учусь сам!

Всем привет! 👋

В начале года решился на небольшую авантюру — стал преподавать в Физтехе (МФТИ)! 🚀

📝 Веду курс в формате хакатона, где студенты разрабатывают проекты и защищают их перед настоящими заказчиками. Драйв и азарт!

🧠 Рассказываю ребятам всё о создании MVP, искусстве питчинга, формировании команд, тестировании и запуске продукта. Основной язык — Python 🐍

💬 Но уже на первой лекции студенты удивили вопросами:

«Как попасть в Яндекс?» 🤔

Тут всё просто — куча открытых вакансий, берите и подавайтесь! 😉

«А можно писать на Golang?» 💻


И вот тут я попал впросак! 😅 Пообещал им эту возможность (ведь суть курса — запустить проект на любом стеке), но быстро выяснилось, что нельзя. Оказалось, что у наших индустриальных партнёров только Python-специалисты, а с Go никто не работает.


📚 Готовлюсь к следующей лекции и хочу разобрать интересные кейсы про командную работу.

💡 Вопрос к вам, мои дорогие: с какими трудностями при формировании команд вы сталкивались? О чём жалеете, что не узнали раньше?

Поделитесь опытом в комментариях! 👇 Ваши истории помогут подготовить полезные кейсы для студентов!

В следующий раз, расскажу лайфхак как подготовить презентацию.

#физтех #преподавание #разработка #командная_работа
🔥11👏2
Продолжение истории с кейсом, разобрали со студентами с мотивацией сотрудника:

Низкая проактивность в команде

Описание проблемы:

В команде наблюдается низкая проактивность участников.

где член команды:

- Занимается только своим участком работы
- Отвечает только за свой функционал
- На митингах преимущественно молчит
- Ждет, пока "ответственный" сам решит проблему

Как повысить проактивность команды и вовлеченность участников в общий результат?


На слайдах результат штурма. Кратко: нужно больше интересных задач 🤪, мерч 👕 и вечеринка 🍻.

От себя добавлю, что можно добавить командной рутины 🧗 и поднять ответственность 🥸(с передачей полномочий) или сделать кросс-зависимость между участниками 🤼‍♂️.
6🔥2
🎓 3 воркшопа по ClickHouse для МФТИ: как я учил студентов мониторить production

Предыстория:

У меня уже были лекции по реляционным базам (PostgreSQL, MySQL).
Но хотелось показать другую сторону: как мониторить реальные продакшн-сервисы.

ClickHouse — идеальный инструмент для этого:
• Перцентили из коробки (quantile)
• Молниеносная обработка миллионов записей логов
• Встроенные функции для временных рядов

Тема воркшопов: "Какие метрики смотреть в проде и как"

Не абстрактная теория, а конкретные задачи:

1️⃣ Собрали логи API handlers (10K записей)
2️⃣ Посчитали p50/p95/p99 для каждого эндпоинта (и разобрали, когда нужен p99.99)
3️⃣ Обогатили данными: размер корзины × response time
4️⃣ Подключили DataLens для визуализации
5️⃣ Настроили алерты на аномалии

Для каждого воркшопа подготовил:
→ Презентацию (80+ слайдов)
→ Датасет с реалистичными метриками
→ Python-скрипты для генерации данных
→ Готовые SQL-запросы для разбора

Забавный кейс 😅

Используем MTS Link для воркшопов.
Я пишу в чат пример: SELECT version()

Система безопасности: "Подозрительная активность!"
БАН на 15 минут.

К счастью, это был конец последнего воркшопа.
Недоделанное — в домашку студентам.

Самое интересное:

Все студенты знали, что ClickHouse — колоночная база.
Но затруднялись объяснить, ПОЧЕМУ это быстрее.

Разобрали на запросе:
SELECT name, age FROM users WHERE age > 30

PostgreSQL (строковое хранение):
→ Читает все колонки: id, name, age, email, address...
→ 1M строк × 200 байт = 200 МБ с диска

ClickHouse (колоночное):
→ Читает только name + age
→ 1M строк × 20 байт = 20 МБ
→ 10x меньше!

Но это ещё не всё.

Второй уровень оптимизации:

ClickHouse хранит колонку age диапазонами:
[18-25: блок 1] [25-30: блок 2] [30-40: блок 3] [40-65: блок 4]

Запрос WHERE age > 30?
→ Блоки 1 и 2 пропускаются вообще (по метаданным)
→ Читаются только блоки 3 и 4

Итог: вместо 200 МБ читается ~3-5 МБ.

40x-50x разница в скорости.

Студент: "То есть ClickHouse даже не смотрит на большую часть данных?"

Именно. Вот почему он летает на миллиардах строк.

Дальше будет интереснее:

→ Топ-3 ошибки в ClickHouse, которые убивают производительность
→ Почему p99 важнее среднего (кейс из Яндекса)
→ Как готовить технические воркшопы (и не попасть в бан 😄)

#clickhouse #мфти #мониторинг #перцентили
9🔥5👍2
Как попасть ко мне на менторство

Этот пост давно просили — многие писали в личку с вопросами про менторство. Решил все собрать в одном месте.

Каждую неделю я вижу одну и ту же картину на собеседованиях: талантливые ребята проваливаются на одних и тех же вещах. Причем не потому что плохие разработчики, а потому что никто не объяснил, на что реально смотрят при найме.

Почему я могу реально помочь?

Я - тимлид и хайринг менеджер в Яндексе, где работаю больше 5 лет в разных командах. За 20+ лет в разработке прошел путь от джуна до тимлида, успел побыть и архитектором, и техдиром. А также:

- Регулярно в течение последних 3-лет в роли интервьюера в Яндекса. Провел 200+ технических и алгоритмических собеседований. Знаю изнутри, где кандидаты чаще всего валятся и какие критерии нужны для прохождения
- Обучил 200+ человек алгоритмам в Практикуме
- Мои менти успешно проходят собеседования в Яндекс и другие топовые компании
- Лектор в ШБР и на Физтехе по базам данных
- Преподаю, как разработчику делать проекты в МФТИ

Я принимаю решения о найме и знаю, почему отказывают сильным кандидатам и какие сигналы ищут интервьюеры. При этом я реально понимаю, как с этим работать, потому что я нахожусь регулярно по обе стороны, как интервьюер и собеседуюшийся, за последнее время я прошел интервью в топовых компаниях, такие как: Авито, Озон и другие.

Один на один я могу помочь 3-5 людям в неделю. Плюс честно — мне нравится преподавать. Видеть, как джун растет до мидла, а мидл до tech lead — кайф.

В канале я уже разбирал, как не валиться на алгоритмах и мою любимую задачу с собеседований, которую я задаю. Даже показывал, как интервьюеры распознают помощь ChatGPT. Но индивидуальная работа — это другой уровень.

Формат: разбор CV, мок-интервью с задачами из BigTech компаний, code review, карьерные консультации.

Буду максимально эффективен с middle/senior разработчиками, которые готовятся к собеседованиям в топовые компании.

За условиями пишите в личные сообщения -> @di0niz.
5👍5😁2
💎 Avito.Tech.Conf: что я узнал об управлении командами

Подъехали фоточки с конференции Avito.Tech.Conf и хочу поделиться некоторыми наблюдениями:

1. Авито внедряет практики Amazon и Иван Гуз упоминал инструменты:

- Публичные ценности компании;
- Шестистраничные меморандумы вместо презентаций;
- Письма акционерам от Безоса

💡 Лучшая история: Иван устроился работать в Ленту раскладывать товар, чтобы на практике протестировать весь путь от поиска кандидата до первой зарплаты.

2. Артур Щеглов — Принятие решений и принципы управления в Tech

Сильный доклад конференции про роль лида и зоны ответственности.

> "Решение должно приниматься там, где есть знания"

📚 Список литературы как расти на менеджерской позиции в биг техе:

• Will Larson — «An Elegant Puzzle»
• Team Topologies — Skelton & Pais
• «No Rules Rules» — про культуру Netflix
• Блоги Amazon и Netflix

3. Александр Дубровин — интервью с тимлидами

Разбор реальных кейсов на собеседованиях в Авито. В кулуарах обсудили разрыв между теорией и практикой.

⚠️ Два провальных ответа:

Кейс: Что делать, если вся команда в отпуске/на больничном
Неправильно: «Давайте урежем MVP и используем типовые компоненты»
Правильно: Искать временные замены, договариваться со смежниками и руководством

Кейс: Low-performer в команде
Неправильно: «Договоримся о проверке на следующем ревью»
Правильно: Еженедельный контроль целей на 1-на-1

Главный вывод: на интервью важно показать личную ответственность и активную вовлечённость, а не навыки делегирования проблем.

---

Конференция подтвердила: управление в tech — это про проактивность, а не реактивность.

P.S. Начал читать "Staff Engineer" от Will Larson — буду делиться
конспектом.
11🔥4👍2
📝 От дизайн-документов к стратегии: практический подход

На недавней конференции Avito.Tech.Conf в списке рекомендованной литературы попалась книга Will Larson "Staff Engineer: Leadership beyond the management track". Начал читать — и меня зацепил один элегантный подход к написанию стратегий. 🎯

Обычно стратегии пишут "сверху вниз": собираются умные люди, придумывают абстрактные принципы, спускают вниз. А потом удивляются, почему команды интерпретируют их по-разному. 😅 Ларсон предлагает обратное: начните с 5 дизайн-документов.

📖 Что такое дизайн-документы?

Design docs (они же RFCs 🗣️, tech specs 📋, а в Uber когда-то назывались DUCKS 🦆) — это документы, описывающие конкретную проблему, возможные решения и обоснование выбранного подхода.

Магия 5 документов → стратегия

1️⃣ Напишите 5 design docs по разным проектам

2️⃣ Прочитайте их вместе и найдите закономерности:
- Какие спорные решения повторяются?
- Над чем долго спорили в ревью?
- Какие компромиссы приходилось делать снова и снова?

3️⃣ Превратите эти инсайты в стратегию

💬 Пример из книги: если в трёх диздоках застряли в дебатах "Redis как кеш или как хранилище?", значит пора зафиксировать решение в стратегии, а не начинать с нуля каждый раз.

🎯 Почему это работает

Хорошая стратегия = конкретика + контекст + обоснование выбора
Плохая стратегия = абстрактные указания без объяснений

Дизайн-документы дают то, чего не хватает плохим стратегиям: детали, основанные на реальности.

🧪 Мой эксперимент

После прочтения этой главы решил не ждать и суммаризировал подход в универсальный шаблон. Собрал лучшие практики из Google 🔵, Uber 🚗, Monzo 💳 и других компаний в один документ.

👉 Универсальный шаблон RFC / Design Doc

Шаблон покрывает:

✔️ Описание проблемы и контекста
✔️ Альтернативные решения (не только выбранное!)
✔️ Обоснование выбора
✔️ План реализации
✔️ Риски и trade-offs

Если у вас в команде ещё нет процесса дизайн-доков — можно начать с этого шаблона. А через 5 документов вы уже сможете извлечь паттерны для вашей стратегии. 📈

🔗 Полезные ссылки для вдохновения

📚 Обзоры и философия:

- Scaling Engineering Teams via RFCs — Pragmatic Engineer про опыт Uber 🎤
- Design Docs at Google — как пишут в Google 🔍
- Remote Decision-Making — StitchFix про решения в распределённых командах 🌐
- Design Docs, Markdown, and Git — минималистичный подход ✏️

🎓 Вывод

Стратегия — это не то, что придумывают в башне из слоновой кости. Это то, что извлекают из реальных технических решений. 🏗️ Начните с написания дизайн-доков, и стратегия появится естественным образом.

P.S. Если используете мой шаблон — буду рад фидбеку! 👂 Что зашло, что стоит добавить/убрать?
👍5🔥2
📱 Сделал генератор скриншотов "как из Заметок на iPhone"

Знаете эти посты-карусели в инсте, которые выглядят как скриншоты из iOS Notes? Решил по вайбкодить и написать утилиту.

Пишешь текст → получаешь карусель в стиле iPhone

Звучит просто, но превратилось в квест 😅

С чем пришлось повозиться:

🎨 Эмодзи
Оказалось, что красиво отрендерить эмодзи — та ещё задача. Для рендеринга эмодзи есть специальные библиотеки, но есть проблема совместимости. Но Gpt решил меня погонять по интернету и скачивать шрифты, которые уже установлены.

➡️ Стрелки и символы
Символы типа → ✓ — это отдельная история. Они не совсем эмодзи, но и не обычный текст. Каждый символ пришлось обрабатывать индивидуально, чтобы всё выглядело ровно.

📍 Курсор
Захотелось добавить жёлтый курсор, как в настоящих Заметках — для аутентичности. Рандомная позиция, рандомный параграф.

Был баг: курсоры появлялись ВО ВСЕХ параграфах одновременно 🤦‍♂️ Искал причину — оказалась в логике обработки пустых значений.

📝 Переносы слов
Автоматических переносов нет из коробки. Написал свою систему, которая учитывает ширину каждого символа (эмодзи шире обычных букв!), работает с жирным текстом и курсивом.

Что получилось:

Поддержка разметки текста
Эмодзи и спецсимволы
Подсветка кода
Жёлтый курсор в рандомном месте
Готовая карусель для постов

Разработка заняла ~2 дня активной работы

Теперь контент в стиле iPhone Notes создаётся за минуту 🚀
4👍2🔥1
Хочу оставить небольшую шапгалку про устройство памяти, может пригодиться.

🎯 Python Memory Management: Арены, Пулы, Блоки

"Как Python управляет памятью для маленьких объектов?"


Python использует специальный аллокатор pymalloc с трехуровневой иерархией: Арена → Пул → Блок. Это минимизирует системные вызовы и фрагментацию памяти.

🏗 Иерархия памяти (снизу вверх)

1. Блок (Block) — минимальная единица

- Размер: 8–512 байт (кратно 8)
- Здесь физически хранится объект (int, короткая строка, tuple)
- Порог: объекты ≤ 512 байт → pymalloc, > 512 байт → системный malloc

2. Пул (Pool) — страница памяти

- Размер: 4 КБ (размер страницы виртуальной памяти)
- Моногамность: хранит блоки только одного размера (либо все по 32 байта, либо все по 64)
- Состояния: used (частично занят), full (полный), empty (пустой, готов к переназначению)

3. Арена (Arena) — крупный резервуар

- Размер зависит от архитектуры:
- 256 КБ — Python 2.x, 3.0-3.2, все 32-bit сборки
- 1 МБ — Python 3.3+ на 64-bit системах
- Содержит 64 пула (на 32-bit) или 256 пулов (на 64-bit)
- Запрашивается у ОС целиком через mmap

⚙️ Как происходит выделение памяти


Создали объект (например, x = [1, 2, 3])

Проверка размера < 512 байт?
↓ ДА
Ищем пул с подходящим size class (например, 64 байта)

Пул найден и есть свободный блок?
↓ ДА
Выделяем блок → объект создан
↓ НЕТ (пула нет)
Берем пустой пул из арены → размечаем под нужный size class
↓ НЕТ (пулов в арене нет)
Создаем новую арену (запрос к ОС)


🔥 Важные нюансы для интервью

1. Почему Python не возвращает память?
Арена возвращается ОС только когда все её пулы пусты. Если хотя бы один блок на 8 байт занят, вся арена (1 МБ!) останется в процессе.

2. Оптимизация: "заполненные вперед"
Список арен отсортирован по заполненности. Python сначала записывает в почти полные арены, чтобы скорее их «закрыть», а пустые освобождать.

3. Reference Counting + GC
- Счётчик ссылок (`refcount`) — основной механизм
- Cyclic GC — для разрыва циклических ссылок
- Арены/пулы работают под капотом, независимо от GC

4.‌ Размер объекта ≠ размер данных
Каждый объект в Python — это C-структура с метаданными (тип, refcount, указатель на данные). Даже int(5) занимает ~28 байт.

💬 Примеры вопросов на собесе

Q: Почему список из миллиона маленьких объектов не вызывает миллион malloc?
A: Потому что pymalloc создает арены заранее и переиспользует блоки внутри пулов.

Q: Что такое size class?
A: Это «размерная сетка» блоков: 8, 16, 24 ... 512 байт. Каждый пул настроен на один size class.

Q: Как Python решает проблему фрагментации?
A: Пулы моногамны (один размер блока), арены переиспользуются, а списки арен сортируются по заполненности.

📚 Дополнительно изучить

- Внутри CPYTHON. Гид по интерпретатору Python / Э.Шоу
👍5
💳 Когда алгоритмы решают судьбу твоих счетов

Помните пост про важность алгоритмов? Вот вам живой пример из жизни.

Приставы наложили арест на 800 рублей 😅 Казалось бы, мелочь. Но банки отработали постановление совершенно по-разному:

🟢 Крупный зеленый банк

У меня там вклад и несколько счетов. Заблокировали... счет в валюте, хотя на рублевом счете была нужная сумма!

Похоже на алгоритм: перебор всех счетов с проверкой баланса, но без учета валюты.

Блокировка в валюте — вообще отдельная проблема. Курс ЦБ скачет, поэтому фиксированную сумму в рублях нужно постоянно пересчитывать. Но банки этим не заморачиваются 😄 В итоге либо блокируют с запасом (клиент страдает), либо меньше, чем нужно (нарушают закон).

🟡 Крупный желтый банк

Тут вообще шедевр: заблокировали 5 счетов с нулевым балансом 🤦‍♂️ Включая сбор на ДР коллеге!

Похоже на алгоритм: простой перебор счетов БЕЗ проверки баланса вообще.

Как надо было?

Отсортировать счета по приоритету:

1. Сначала RUB, потом остальные валюты
2. По убыванию баланса
3. Блокируем нужную сумму на первом подходящем счете
4. Если денег не хватило — блокируем остаток на следующем счете

Вот и вся разница между хорошим и плохим алгоритмом. Один работает корректно и блокирует минимум счетов, другие создают проблемы клиентам на ровном месте.

А вы используете жадные алгоритмы? Делитесь в комментариях! 👇

P.S. Долг уже погашен, счета разблокированы. Но осадочек остался 😏

#алгоритмы #банки #жизненныеистории #разработка
6😁3👍2
😁😆😁 Рассказать о трекере задач для сдвгшников для macosx и раздать промики
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13