Разбор недели открытой разработки: p2p-сеть на Python, агенты, 53 коммита. Узнайте, как улучшить свои проекты и рабочий процесс. Читайте сейчас!
Вы когда-нибудь задумывались, как выглядит неделя разработки, в которой удаётся сделать 53 коммита, открыть 13 pull request'ов и при этом не выгореть? Я покажу на своём примере, как совмещать работу над низкоуровневыми p2p-протоколами, агентными системами и личной базой знаний. Вы узнаете, какие задачи стоят за цифрами, как я подхожу к отладке сложных сетевых багов и почему ведение журнала сессий делает код лучше.
Основное время я потратил на py-libp2p — библиотеку для децентрализованных сетей. Код сетевого уровня не прощает ошибок, но когда всё начинает работать — это невероятное удовольствие. В модуле libp2p/kad_dht я реализовал настраиваемые ограничения разнообразия подсетей и лимиты на количество IP-адресов в таблице. Если вы сталкивались с Sybil-атаками или хаотичным распределением пиров, вы поймёте, насколько это важно — дело не просто в функциональности, а в устойчивости DHT.
На транспортном уровне я занимался исправлением WebRTC в libp2p/transport. Пришлось защитить запись в приватные слоты и убедиться, что мы используем close_peer_connection во всех местах, где это необходимо, чтобы не оставлять висящие ресурсы. Также я потратил время на хитрый баг в Windows: для прохождения тестов нужно было слушать на конкретном не-loopback интерфейсе.
async def close_peer_connection(conn):
"""Безопасно закрывает соединение, освобождая ресурсы."""
if conn is None:
return
try:
await conn.close()
except Exception as e:
# Логируем ошибку, но не прерываем выполнение
print(f"Ошибка при закрытии: {e}")
finally:
# Гарантируем, что ссылка на соединение будет удалена
conn = None
# Пример использования в коде транспорта
async def handle_peer(peer_conn):
# ... обработка соединения ...
await close_peer_connection(peer_conn) # Всегда закрываем явноЯ дорабатывал Reachable, делая функцию "Ask" более похожей на естественный разговор. Пришлось укрепить хранилище, чтобы состояние не дрейфовало при усложнении интерфейса.
В breakscale я столкнулся с забавным багом: Vitest падал на Node 26 из-за реализации localStorage в jsdom. Я открыл issue, отследил проблему и отправил фикс, вернув localStorage на место. Также я добавил функцию улучшения описаний дизайнов — теперь акцент на том, из чего дизайн состоит, а не только на его размерах. Небольшое изменение UX, но оно делает инструмент интуитивнее.
Я отношусь к своему obsidian-vault как к продакшн-репозиторию: на этой неделе в нём 35 коммитов. В основном синхронизировал состояния UI и обновлял шаблоны. Заметил баг в шаблоне "Concept": родительский указатель рекурсивно ссылался на сам шаблон — классическая мета-ошибка. Также я записал три сессии стриминга, что помогает документировать мыслительный процесс во время кодинга.
Я открыл 13 PR, некоторые ещё в работе. Много усилий ушло на agent-orchestrator. Я добавляю передачу ID запросов в события, генерируемые демоном, чтобы телеметрия была полезной. Нет ничего хуже, чем видеть ошибку в логе без возможности отследить её источник. Также исправил проблему с dev-server прокси, который указывал не на тот демон — один из тех багов "как это вообще работало?", которые приятно исправлять.
В репозитории corsair я стремился повысить надёжность и производительность. Открыл PR, чтобы:
verifyHmacSignature юнит-тестами (код безопасности без тестов — просто катастрофа).corsair_entities и corsair_accounts. С ростом данных последовательные сканирования начали замедлять работу.from sqlalchemy import Index, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class CorsairEntity(Base):
__tablename__ = 'corsair_entities'
id = Column(Integer, primary_key=True)
name = Column(String)
# Другие поля...
# Создаём индекс для ускорения поиска по имени
Index('ix_corsair_entities_name', CorsairEntity.name)Я открыл 7 issues, в основном чтобы работать в открытую. Когда нахожу баг в agent-orchestrator (например, прокси tailnet Connect Mobile оставляет процессы после некорректного завершения) или узкое место в corsair, я документирую это до исправления. Это помогает держать всё в порядке и предупреждает мейнтейнеров о том, что я исследую.
Один баг, который я всё ещё отслеживаю, — в omarchy: выбор агента по умолчанию вызывает понижение версии из-за cooldown релиза в mise. Это странное взаимодействие между менеджером версий и логикой агента, надеюсь решить на следующей неделе.
Неделя была полиглотной, но Python и TypeScript явно лидировали.
С 12 205 добавлениями против 1 500 удалений это была "растущая" неделя. Я не просто чистил код, а добавлял новые функции и расширял тестовые наборы. Семидневная серия не была натянутой: когда переключаешься между p2p-протоколами и AI-агентами, всегда хочется что-то докрутить перед концом дня.
На следующей неделе планирую закрыть PR по WebRTC v2 в py-libp2p. Спецификации надёжные, но детали реализации фрейминга data-channel как байтового потока всё ещё капризны. Также хочу довести до конца индексы базы данных в corsair и посмотреть на реальное улучшение производительности.
И, конечно, больше стриминга. Я заметил, что запись сессий в Obsidian делает меня осознаннее в коде. Если мне нужно объяснить что-то "будущему мне" в журнале, я реже выбираю ленивый путь.
Прямо сейчас: начните вести журнал своих сессий программирования. Это может быть просто текстовый файл или заметка в Obsidian. Записывайте, что вы делали, какие проблемы решали и что хотите сделать дальше. Через неделю вы заметите, что стали писать более продуманный код, а ваши рабочие процессы — прозрачнее. Попробуйте хотя бы 3 дня — и увидите разницу.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →