Будни программиста
2K subscribers
31 photos
1 video
4 files
38 links
Тут будут описанная жизнь программиста, и будет показано много чего кто не скажет о программистах
(Если не переходит нажмите ••• и открыть в браузере)
Download Telegram
Python_Senior_CheatSheet_code_routine.pdf
48.2 KB
Как и обещал в TikTok 🤝
Ловите шпаргалку с фишками, которые сделают ваш код в Python👩‍💻 чище, читабельнее и быстрее.
Разбираем:
🟢Почему range(len()) — это моветон.
🟢Как f-строки спасают от путаницы.
🟢Как считать элементы без for и if.

🎁 Плюс закинул бонусный прием для параллельных списков.
Сохраняйте себе и забудьте про велосипеды в коде!

Полезно было узнать?🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Привет тем, кто пришел из TikTok 🤝

⭐️По поводу «Ада туториалов». Я сам сидел в этой яме: прошел пару курсов по Python, смотрел индусов на YouTube часами. Думал, что всё понимаю. А потом открыл пустой файл main.py и... завис. Я даже не знал, с чего начать без подсказок.

💎 Мой первый самостоятельный проект был написан так криво, что сейчас мне за него физически больно. Там были глобальные переменные, бесконечные if/else и ни одной функции. Но он РАБОТАЛ. И именно этот костыльный код научил меня большему, чем 100 часов видео.

⚙️Как и обещал, ловите подробный гайд по 5 пет-проектам, которые вытянут вас на уровень Junior+. Закрывайте YouTube и идите гуглить ошибки самостоятельно!

Внутри гайда🖋

⏹Парсер цен (Scraper) — учимся работать с данными.
⏹Личный ТГ-бот для финансов — база данных и Async.
⏹Сортировщик файлов — автоматизация рутины.
⏹API для To-Do на FastAPI — поймешь, как работает бэкенд.
⏹Уведомитель о погоде — работа с внешними API.

👇 Забирай PDF ниже, выбирай проект и начни ломать уже СВОЙ код сегодня!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
В чем секрет опытных разрабов?🤔
Они не помнят все библиотеки наизусть. Они знают правила «чистоты», которые делают код читаемым, стабильным и дорогим. Пока Джун пишет 50 строк костылей, Сеньор пишет 5 строк, которые работают вечно.

❗️Чтобы вы не тратили годы на набивание шишек, я собрал «50 правил чистого кода» в один удобный PDF.

Что внутри:
🔸 Правила нейминга (чтобы не было data_v2_final).
🔸 Как писать функции, которые не хочется удалить.
🔸Базовые принципы SOLID и KISS на понятном языке.
🔸Чек-лист перед тем, как отправлять код на ревью.

👇 Забирай файл📁, читай и внедряй в свой проект уже сегодня.

P.S. После прочтения этого списка твой тимлид начнет тебя подозревать в читерстве. Погнали!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Senior_Clean_Code_Checklist.pdf
20.6 KB
50 правил, которые отличают профи от новичка
❤2👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
❌ Ошибка новичка

🔴Часто джуны пытаются вручную управлять индексами через range(len(...) - 1, -1, -1).

🔴Сложность Легко ошибиться на единицу (Off-by-one error).

🔴Читаемость: Мозгу нужно 2-3 секунды, чтобы просто понять направление цикла.

✔️Выбор сеньора (Clean Code)

🟢Использование reversed() делает код декларативным ты говоришь «что» сделать, а не «как».

🟢Эффективность: reversed() создает итератор и не копирует список в памяти.

🟢Безопасность: Никаких манипуляций с индексами вручную.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3❤‍🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Судя по вашим ответам в опросе, я решил залить немного своей ежедневной рутины решения багов 👌

Немного контекста, над чем я вообще сейчас работаю. Пишу бота для органической накрутки. Суть такая: заливаешь в систему свои аккаунты, ставишь задачу ("подпишись на этот канал за такое-то время"). Бот управляет акками и имитирует живых людей плавно подписывается, читает посты, ставит лайки.
И тут вылез критический баг, который убивал весь «человеческий фактор» пока основная задача активна, боты смотрят и лайкают. Но как только задача завершается они тупо забывают про канал. Новые посты выходят, а ботам плевать.Полез чинить. Сделал независимый мониторинг каналов. Запускаю тесты... В консоли всё зелёное, логи пишут: Найдено X новых постов. Ни одной ошибки. А просмотры по факту стоят на нуле.Залез под капот бота и нашел глупейшую рассинхронизацию компонентов.


В чем была проблема? Парсер (SmartChannelMonitor) отрабатывал четко, но пушал взаимодействия в старую таблицу PostInteraction. А вот воркер (task_distributor), который эти просмотры должен выполнять, уже был переписан под новую таблицу IndependentPostInteraction (специально созданную, чтобы данные не удалялись при завершении задачи). Результат: записи стабильно создаются в БД, но лежат мертвым грузом их никто не обрабатывает.

🛠Как решал проблему?

1. Направили данные по адресу Заменили создание объекта старой модели на новую. Теперь данные попадают куда надо и реально выполняются: Было:
db.add(PostInteraction(
interaction_type='view',
is_completed=False...

Стало:
db.add(IndependentPostInteraction(
monitoring_id=monitoring_id,
interaction_type='view',
is_completed=False...


2. Исправили TypeError (неверный ключ)
Сразу после замены вылезла ошибка: первый фикс по инерции использовал поле original_task_id, которого в новой таблице просто не существует. Решение: заменил на monitoring_id, предварительно вытащив его отдельным ORM-запросом:
monitoring = db.query(IndependentChannelMonitoring).filter(
IndependentChannelMonitoring.account_id == acc_id,
IndependentChannelMonitoring.channel_url == channel_url
).first()


3. Классика: NameError (забытые импорты)
В файл забыл импортировать новые модели, которые мы только что добавили в запросы. Докинули IndependentChannelMonitoring и Subscription в импорты и всё завелось.

💡Бонус: Очеловечиваем логику (Анти-фрод) Раз уж полезли в этот модуль, параллельно снес механическую накрутку. Снизили процент лайков до реалистичных 10–15%. Добавил "человечность": теперь 30% аккаунтов вообще не ставят лайки (режим "молчунов"). Это убрало шаблонную активность и сделало поведение ботов максимально естественным для алгоритмов.

Надеюсь, этот мини-разбор замотивировал кого-то сесть за старые, долго не решаемые баги. Иногда всё может быть гораздо легче, чем кажется пара измененных строк и правильная таблица спасают ситуацию

Всём удачного кодинга👍

КАНАЛ 📱 ЧАТИК💬
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
🤖Почему твой код от ChatGPT не работает, или Как реально использовать ИИ

В одном из постов я обещал показать, как делать нейронки своими рабами, а не конкурентами. Сейчас из каждого утюга кричат про «вайб-кодинг» типа, написал промпт, и ИИ всё собрал за тебя.
Спойлер на реальных фриланс-заказах это так не всегда может работать. Если ты попросишь нейронку «напиши мне бота для накрутки», она выдаст тебе нерабочий кусок устаревшего кода, который ляжет при первой же нагрузке.


🤔 Как я использую Cursor и LLM-модели, чтобы писать бэкенд в разы быстрее:

🔴Не прошу архитектуру. Большинство ИИ моделей ужасно видит проект целиком. Базы данных, связи таблиц, распределение тасок (как в моем вчерашнем баге) это придумываю и контролирую я

❤️Делегирую рутину. Написать регулярку для парсинга, набросать boilerplate-код для FastAPI, сгенерировать фейковые данные для тестов вот тут нейронка экономит мне часы в этих случаях можно спокойно пользоваться

❗️Не кидаю ошибки вслепую. Вместо «почини мне TypeError», я кидаю конкретную функцию и пишу В этой async функции контекст теряет ID канала, перепиши обращение к ORM»

🚨Главное правило: ИИ это твой очень быстрый, но в моментах туповатый джун-помощник. Тимлидом в вашем тандеме должен оставаться ты. Если ты не понимаешь, как работает код, который сгенерировала нейронка ты не сможешь его дебажить ведь это по факту не твой код тогда

🖥 А как вы юзаете нейронки?
Копипастите целыми файлами или чисто гуглите ошибки? Пишите в комменты интересно почитать 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Будни программиста
Судя по опросу 57% за асинхронность так что выкатываю базу ⚡️

Но для начала давайте разрушим главный миф из-за которого ломается 90% проектов. В Python📱 нет настоящей параллельности. Вообще🤯. Многие думают что если написать async def то код магическим образом начнет выполняться на разных ядрах процессора одновременно но забудьте про это. Ваш асинхронный код крутится в одном единственном потоке. Вся эта асинхронность это просто очень умная иллюзия где код умеет вовремя сказать что-то похожее на "бро я жду ответа от сервера иди пока делай другие таски я позову когда ответ придет"
Всем этим рулит Event Loop. И вот тут начинается боль потому что недавно ревьюил парсер который собирал данные с большого количества ссылок и бот тупо висел по две минуты не отвечая юзерам. А все потому что если внутрь асинхронной функции засунуть синхронную блокировку типа requests.get() то этот единственный поток тупо замирает и бот мертв

❌ Как обычно пишут джуны
import requests

async def parse_urls(urls):
results = []
for url in urls:
# тут бот тупо стоит и ждет ответа
res = requests.get(url)
results.append(res.status_code)
return results

✔️Как сделать нормально: выкидываем requests, берем aiohttp и лупим всё одновременно через asyncio.gather. Мы не блочим поток, скрипт отправляет запросы и идет заниматься своими делами пока ответы не прилетят. Время выполнения равно самому долгому ответу сервера ⏱️
import asyncio
import aiohttp

async def fetch(session, url):
async with session.get(url) as response:
return response.status

async def parse_async(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
return await asyncio.gather(*tasks)

🔥 Но джун на этом радуется а сеньор понимает что если скормить скрипту 10 000 ссылок то gather выплюнет 10к коннектов вместе и мы либо положим чужой сервак либо словим бан или тупо кончится оперативка. Поэтому ставим asyncio.Semaphore чтобы контролировать поток как жесткий фейсконтроль на входе 🛡
async def fetch_safe(semaphore, session, url):
async with semaphore:
async with session.get(url) as response:
return response.status

async def parse_senior(urls, limit=10):
semaphore = asyncio.Semaphore(limit)
async with aiohttp.ClientSession() as session:
tasks = [fetch_safe(semaphore, session, url) for url in urls]
return await asyncio.gather(*tasks)

⚙️ Но и это еще не всё. Сеньор знает, что сеть штука нестабильная. В реальном проде к этому коду нужно обязательно прикрутить aiohttp.ClientTimeout (чтобы скрипт не висел вечно если сервак тупит) и обернуть запросы в try/except. Иначе один упавший таск с ошибкой потянет за собой весь gather, и вы потеряете результаты всех остальных успешных запросов.В итоге луп жив код летит и чужие сервера не падают из-за твоих ошибок

Всем удачного кодинга 🧑‍💻

КАНАЛ 📱 ЧАТИК💬
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Найди баг джуна🤔

Вчера скинули на ревью вот такой кусок кода. Задача простейшая отфильтровать список пользователей по возрасту.
def filter_adults(users):
for user in users:
if user['age'] < 18:
users.remove(user)
return users

Скрипт вроде работает, ошибок не выдает. Но в продакшен я его не пустил.

Кто первым напишет в комменты💬, почему этот код бомба замедленного действия и как он себя поведет на реальных данных?

Правильный ответ и то, как надо было сделать, закину вечером👌

КАНАЛ 📱 ЧАТИК💬
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Будни программиста
Найди баг джуна🤔 Вчера скинули на ревью вот такой кусок кода. Задача простейшая отфильтровать список пользователей по возрасту. def filter_adults(users): for user in users: if user['age'] < 18: users.remove(user) return users Скрипт…
В чем суть проблемы джуна в этом посте

Удалять элементы из списка во время итерации по нему это выстрел себе в ногу. Когда users.remove(user) удаляет элемент, все оставшиеся элементы списка сдвигаются на один индекс влево. Но внутренний указатель цикла for всё равно делает шаг вперед.
Итог на реальных данных: Если в списке идут два человека младше 18 лет подряд, цикл удалит первого, сдвинет список и просто "перепрыгнет" второго. В продакшене у вас в базе останется куча несовершеннолетних юзеров, а вы даже не узнаете об этом, потому что скрипт отработает без ошибок (тихий баг самый страшный баг).

✔️Как надо было сделать (Выбор Сеньора)
Вариант 1 List Comprehension (База) Самый питонячий, читаемый и быстрый способ. Мы просто создаем новый отфильтрованный список, а не мучаем старый.
def filter_adults(users):
return [u for u in users if u['age'] >= 18]

Вариант 2 Функция filter() Для тех, кто любит функциональный стиль. Работает так же отлично.
def filter_adults(users):
return list(filter(lambda u: u['age'] >= 18, users))

Вариант 3 Идем с конца (In-place) Если список весит гигабайт, и нам критически важно менять именно исходник, чтобы не жрать память вспоминаем мой недавний пост! Используем reversed(). При удалении с конца сдвиг индексов не ломает оставшуюся итерацию.
def filter_adults(users):
for user in reversed(users):
if user['age'] < 18:
users.remove(user)
return users

Мораль никогда не мутируйте объект, по которому итерируетесь. Всем чистого кода 🤝

КАНАЛ 📱 ЧАТИК💬
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3❤‍🔥1
⚡️На чем я запускаю код или тяжелые скрипты: Мой актуальный сетап 🖥⚙️

Разбавим немного код железной темой. Часто начинающие программисты или даже уже программисты могут задаться вопросом 🤔«Какой комп нужен бэкендеру в 2026 году? Можно ли кодить на ноуте 10 летней давности?»

Мой ответ: Кодить можно, но эффективно работать вряд ли. Бэкендер на Python это не просто редактор кода. Это одновременно запущенный Docker, локальная база данных, тяжелая IDE, пара десятков вкладок в браузере и в моем случае локальные тесты ИИ моделей или 10 окон Playwright для парсинга. Старое железо от такой нагрузки начинает просто дымиться.
Чтобы всё это летало и Event Loop не фризил систему, я использую вот такую конфигурацию.

Моя рабочая станция:
🟢Проц: Ryzen 5 5600X (3.7 ГГц). Проверенная временем мощная база, которая отлично справляется с мультипоточностью и кучей фоновых процессов, тем более он у меня сейчас в разгоне и стабильно выдает 4.2ГГц

🟢Материнка: Asus TUF GAMING B550-PLUS. Надежный фундамент под это всё.

🟢ОЗУ: 32GB (2x16GB/3600) G.Skill Ripjaws V Black. Это сейчас просто гигиенический минимум. С 16 ГБ вы будете постоянно ловить Out Of Memory при работе с Docker или тяжелыми скриптами обработки данных, и тем более если вы ещё и любитель (как и я) держать по 50 вкладок в браузере то с 16 ГБ будет не очень комфортно

🟢Видюха: RTX 5060 Ti 16GB. Брал версию именно с 16 гигами видеопамяти специально под локальные тесты ИИ агентов и запуск LLM (для нормального фриланса сейчас это мастхэв)

🟢Накопитель: SSD 1TB (быстрое чтение/запись логов и БД).
Короче, этот сетап позволяет мне не думать о ресурсах ещё долгое время и просто делать свою работу быстро и качественно.

А на чем кодите вы? Скидывайте фотки своих рабочих мест и конфиги железа в комменты, интересно посмотреть👀

КАНАЛ 📱 ЧАТИК💬
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Будни программиста
Photo
Смех смехом, а мем-то страшный 😅

Вчера закинул вам картинку про требования к джунам, и на самом деле в ней только доля шутки. Рынок сейчас это мясорубка.
Раньше знал базовый синтаксис, мог написать простейшую функцию тебя отрывали с руками на позицию стажера. Сейчас из-за того, что базовый код за секунду пишет любая нейронка, планка входа улетела в космос. HR-ы требуют от джуна знать Python, Docker, CI/CD, асинхронность и иметь коммерческий опыт еще до окончания универа.

Как пробивать эту стену в 2026 году? Мой путь (и почему я вообще сижу на фрилансе) заказчику в телеграме или на бирже вообще плевать, как ты отцентрируешь div или знаешь ли ты алгоритмы сортировки бинарного дерева. Ему нужен РЕЗУЛЬТАТ, который сэкономит ему время и принесет деньги.

🤖Нужен бот, который парсит конкурентов? Сделал -> получил оплату (я чаще всего беру криптой). ⚙️ Нужна автоворонка с базой данных? Собрал -> получил деньги.
Пока тысячи новичков штурмуют корпорации и проходят по 5 этапов собеседований ради неоплачиваемого тестового задания, на бэкенд-автоматизации для малого бизнеса можно спокойно зарабатывать.

Если тема интересна, дайте огня 🔥 в реакциях, и в следующем посте я разберу, как правильно «причесать» свои пет-проекты (тех же парсеров и ботов), чтобы клиенты на фрилансе хотели отдавать вам заказы

КАНАЛ 📱 ЧАТИК💬ГИТХАБ👨‍💻СВЯЗАТЬСЯ СО МНОЙ❤
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥2
Будни программиста
Смех смехом, а мем-то страшный 😅 Вчера закинул вам картинку про требования к джунам, и на самом деле в ней только доля шутки. Рынок сейчас это мясорубка. Раньше знал базовый синтаксис, мог написать простейшую функцию тебя отрывали с руками на позицию стажера.…
Как упаковать пет-проект, чтобы вам доверяли реальные заказы🤔

Вчера пообещал выложить, так что выкатываю базу.

🤔 Многие из вас, возможно, сидят и думают: «Я же хороший специалист, постоянно развиваюсь, да вроде и делаю нормально. Почему тогда мои отклики игнорят, а заказы не берут?» Раскрою секрет: бизнесу вообще плевать, как красиво вы написали парсер или отцентрировали кнопку. Бизнесу важны готовый результат и ваша ответственность

💡 И еще один важнейший момент, прежде чем мы перейдем к правилам. Иногда нужно отвечать и помогать клиентам абсолютно бесплатно: подсказать по серверу, быстро поправить мелкий баг или проконсультировать. Именно это делает из вас крутого специалиста, который реально любит свое дело, а не кодера, который делает всё исключительно ради денег.
Чтобы ваш кейс на GitHub или отклик на заказ продавал вас как профи, транслируйте эти три принципа:

⚡️ 1. Вы продаете спокойствие, а не скрипты Джун сдает проект и пропадает это клиентов пугает. Опытный разраб сдает систему и показывает, что он отвечает за свои решения. В описании кейсов делайте акцент на стабильность. Клиент должен видеть: если завтра целевой сайт поменяет верстку или база ляжет от нагрузки вы не сольетесь, вы заложили это в архитектуру и знаете, как починить и всегда готовы помочь и подсказать даже если клиент не заплатит

⚙️ 2. Тотальная самостоятельность (Работа под ключ) Никто не хочет нянчиться с программистом и сутками висеть с ним на созвонах. Настоящая ценность это когда вы берете проблему и приносите готовое решение. Я выстраиваю процессы так, чтобы клиенту было максимально комфортно: мы четко утверждаем всё в текстовом формате, я ухожу работать и возвращаюсь с готовым продуктом. Экономия времени заказчика ваш главный козырь.

📈 3. Ответственность важнее денег Если вы берете заказ, вы берете ответственность за кусок чужого бизнеса. Умение сказать «я не успею в эти сроки» или «эта архитектура тут не сработает» еще до старта работы это признак профессионала. На фрилансе репутация строится на том, как вы ведете себя, когда что-то идет не по плану.

Настоящий Senior начинается не там, где он выучил все библиотеки, а там, где он готов нести полную ответственность за написанный им код

Всем удачного кодинга😓

КАНАЛ
📱 ЧАТИК💬ГИТХАБ👨‍💻СВЯЗАТЬСЯ СО МНОЙ❤
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Как я написал свой антидетект на Playwright⚡️

🤔Недавно на фрилансе прилетел заказ: нужно было настроить автоматическое скачивание медиа с сайта. Загвоздка в том, что ресурс был намертво закрыт Cloudflare Turnstile. Защита стояла такая, что даже я руками через обычный браузер не всегда мог пробиться с первого раза.
Обычный requests тут летит в мусорку сразу. Голый Selenium или Playwright отлетают на первой же проверке navigator.webdriver. Сайт анализирует всё: твою видеокарту, движения мыши, отпечатки канваса и ИНОГДА даже аудио-контекст.

✔️Решение: Пишем свой класс-Bypasser Я собрал кастомную антидетект-систему поверх Playwright. Бот, которого я написал, начал пробивать Cloudflare с первого раза там, где я руками ловил бесконечные капчи.
За счет чего работает обход:

🟢Тотальная подмена железа (Stealth-инъекция) Скрипт внедряет JS-код до загрузки страницы. Мы скрываем маркеры автоматизации и подменяем характеристики. Сайт думает, что к нему зашел юзер с NVIDIA RTX 3060, 16 ГБ оперативки и стандартными плагинами вроде PDF Viewer. Добавляем уникальный шум в Canvas и WebGL, чтобы отпечаток выглядел естественно.

🟢 Поведенческая эмуляция Боты кликают мгновенно и в центр кнопки. Мой Bypasser генерирует случайные кривые движения мыши с человеческими таймингами и кликает по чекбоксу Cloudflare со смещением (offset).

🟢Умная навигация и траст Использую подмену Referer на google.com (Cloudflare гораздо лояльнее к трафику с поисковиков) и подключаюсь к живому профилю Chrome через CDP (Chrome DevTools Protocol). Это дает нам реальные куки и историю, что повышает траст до небес.

📷Что на скриншоте? Это кусок моего класса, отвечающий за систему отладки (_dump_watch_artifacts). Когда ты воюешь с защитой, важно понимать, на каком этапе бот спалился. Если обход не прошел, скрипт автоматически дампит скриншот и HTML страницы. Без таких логов дебажить антибот-системы просто невозможно.

🤝Мораль такая на фрилансе бизнесу нужен результат. Заказчику плевать сколько тебе лет,или насколько сложная там капча, ему нужны данные. И если вы умеете писать такие байпассеры, у вас всегда будут жирные заказы.

КАНАЛ 📱 ЧАТИК💬ГИТХАБ👨‍💻СВЯЗАТЬСЯ СО МНОЙ❤
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1