Hypothesis: Property-Based Testing for Python
Hypothesis 6.145.1 — это библиотека для property-based тестирования в Python. Вместо написания тестов для конкретных входных данных, разработчики описывают диапазон входных значений, а Hypothesis самостоятельно генерирует случайные тесты, включая граничные случаи, которые могли быть упущены. Пример тестирования функции сортировки демонстрирует использование декоратора @given со стратегиями для списков целых чисел или чисел с плавающей точкой, где библиотека генерирует случайные списки для сравнения пользовательской реализации со встроенной функцией sorted().
Документация структурирована для разных уровней пользователей: от краткого руководства для начинающих до подробного API-справочника. В ней представлены разделы с обучающими материалами, практическими руководствами для специфических сценариев и объяснениями для углубленного понимания библиотеки. Библиотека активно развивается с 2013 года и поддерживается сообществом, что делает её надежным инструментом для повышения качества тестирования в Python-проектах.
Комментарии (117)
- Property-based testing (PBT) выявляет крайние случаи, которые обычные тесты могут пропустить, но требует «оракула» или спецификации, что делает его менее универсальным инструментом.
- Основной барьер внедрения PBT — это не только отсутствие знаний, но и необходимость переосмыслить подход к тестированию и, возможно, саму архитектуру кода.
- В отличие от классических примеров, PBT требует, чтобы разработчик формализовал свой код и его свойства, что делает его менее доступным для специалистов, не знакомых с формальными методами.
- Несмотря на то, что Hypothesis и подобные инструменты делают PBT доступным на практике, они не решают фундаментальную проблему: для сложных систем требуется либо сравнение с другой реализацией, либо формальная спецификация, что делает PBT менее применимым в таких случаях.
Simplify your code: Functional core, imperative shell 🔥 Горячее 💬 Длинная дискуссия
Google предлагает разделять код на функциональное ядро и императивную оболочку для упрощения разработки. Функциональное ядро содержит чистую бизнес-логику без побочных эффектов, а императивная оболочка обрабатывает взаимодействие с внешними системами. Такой подход позволяет тестировать логику изолированно и делает код более поддерживаемым. В статье приведен пример кода для отправки уведомлений об окончании подписки, демонстрирующий разницу между смешиванием логики и побочных эффектов и их разделением.
При таком разделении добавление новых функций становится проще - достаточно создать новые чистые функции и переиспользовать существующие. Например, для напоминаний о подписке можно создать функцию generateReminderEmails, используя уже существующую getExpiredUsers. Этот паттерн, впервые описанный Гэри Бернхардтом, помогает создавать более тестируемый, поддерживаемый и адаптивный код, избегая "спагетти" из смешанной логики и побочных эффектов.
Комментарии (170)
- Обсуждение вращается вокруг идеи "functional core, imperative shell" (FCIS) и противоположного ей подхода "generic core, specific shell", а также влияния этих подходов на тестируемость, производительность и читаемость кода.
- Участники обсуждают, что FCIS делает код более тестируемым, но может привести к проблемам с производительностью при работе с большими объемами данных, особенно если язык не поддерживает ленивые коллекции.
- Также обсуждается, что важно разделять логику и эффекты, но пример кода в статье вызывает вопросы, потому что он не демонстрирует лучшие практики, такие как пагинация или фильтрация на уровне базы данных.
- Некоторые участники подчеркивают, что важно не только следовать паттерну, но и использовать здравый смысл, чтобы не плодить сущности, которые не масштабируются, и не создавать ситуаций, где пример кода в статье может быть использован как оправдание для плохого кода.
My approach to building large technical projects (2023) 🔥 Горячее
Митчелл Хашимото делится личным опытом, как не теряя мотивации довести большие проекты до конца. Он начинает с маленького, но ощутимого результата: например, вместо «сделать терминал» он берёт подпроект «распарсить VT-коды» и уже через пару дней имеет живой результат и тесты. Далее он итеративно добавляет новые фичи, каждый раз имея что-то, что можно показать. Это позволяет сохранять энтузиазм и не терять фокус. Под конец он напоминает, что не стоит стыдиться незавершённых проектов — главное, чтобы они были интересны самому автору.
Комментарии (47)
- Собеседники подчеркнули, что ключ к быстрому прогрессу — это умение разбивать задачу на мелкие, легко демонстрируемые фрагменты и не застревать в «анализ-парализе»; главное — быстро получать обратную связь и не бояться «грязного» MVP.
- Подчеркнуто, что выбор инструмента (язык/стек) влияет на скорость итераций: REPL-языки и инструменты вроде hot-reload позволяют видеть эффект изменений почти мгновенно, что снижает порог входа и удерживает мотивацию.
- Участники обсуждения подтвердили: чем раньше показать работающий прототип, тем меньше вероятность, что проект застрянет в вечной «доработке»; демо-ориентированная разработка заставляет фокусироваться на ценности для пользователя, а не на перфекционизме.
- Сообщество отметило, что даже в личных проектах важно документировать и тестировать как будто ты передашь его другу: это упрощает возврат к контексту спустя месяцы и служит живым примером.
- Несколько человек поделились личным опытом, что их подход к разработке ПО вдохновил их начать вклад в open-source, и что их опыт в open-source в свою очередь улучшил их навыки ведения личных проектов.
Examples Are the Best Documentation 🔥 Горячее
Разработчики часто сталкиваются с тем, что официальная документация описывает функцию, но не показывает, как её использовать. Пример: вместо того, чтобы показать, как вызывать max() в Python, документация тратит абзацы на то, чтобы объяснить, что такое iterable и что значит key=. А ведь достаточно было бы показать, как передавать кастомную функцию сортировки в max().
Проект ClojureDocs берёт на себя роль «примеры — лучшая документация». Пользователи добавляют примеры к встроенным функциям, и это оказывается куда более полезным, чем формальное описание API. Примеры показывают, как вызывать функцию, какие есть подводные камни и какие есть альтернативы.
Комментарии (134)
- Документация должна включать и примеры, и полное API-описание; оба формата дополняют, а не конкурируют.
- Примеры важны для новичков, но не заменяют полное описание параметров и контрактов; примеры без спецификации приводят к тому, что разработчики вынуждены читать исходники.
- Примеры должны быть живыми: если они не запускаются как часть CI или не покрыты тестами, они быстро устаревают и вводят в заблуждение.
- Документация должна быть двух типов: краткий пример для быстрого старта и полное руководство для продвинутых пользователей.
- Примеры должны быть частью тестов и наоборот: примеры в документации должны быть тестируемыми как часть CI.
Testing is better than data structures and algorithms
Новички в программировании часто зацикливаются на изучении структур данных и алгоритмов (DSA), потому что это проверяется на собеседованиях. Однако в реальной работе редко приходится реализовывать сложные алгоритмы вручную — вместо этого стоит понять базовые структуры, их trade-offs и основы Big O, чтобы эффективно организовывать и обрабатывать данные.
Гораздо полезнее сосредоточиться на тестировании: это навык, который постоянно применяется в разработке, улучшает качество кода и выделяет кандидата на фоне других. Тестирование помогает проектировать системы, учит писать проверяемый код и становится отдельной инженерной дисциплиной с богатым инструментарием.
Комментарии (143)
- Участники обсуждают важность знания структур данных и алгоритмов (DSA) для разработчиков, отмечая, что понимание их характеристик (например, сложности операций) часто важнее умения реализовывать их с нуля.
- Подчеркивается необходимость баланса между теоретическими знаниями (DSA) и практическими навыками тестирования, при этом многие отмечают, что эти навыки не исключают, а дополняют друг друга.
- В дискуссии звучит критика статьи, указанной в исходном посте, за её провокационный заголовок, который, по мнению участников, упрощает сложную проблему и создает ложную дихотомию между DSA и тестированием.
- Несколько комментаторов приводят примеры из практики, где незнание базовых принципов DSA (например, сложности алгоритмов) приводило к серьезным проблемам с производительностью в продакшене.
- Обсуждается роль тестирования: одни видят в нем ключевой навык для обеспечения качества, другие указывают на его ограничения (например, сложность тестирования многопоточных систем) и необходимость сочетать его с другими методами, как property-based тестирование или формальные доказательства.
How to use Claude Code subagents to parallelize development 🔥 Горячее
Параллельная разработка с Claude Code: коротко
Запустил 3 агентов (product-manager, ux-designer, senior-engineer) одной командой — за минуту получил полный тикет в Linear.
Далее те же агенты кодят, ревьюят, тестируют в отдельных терминалах, пока я занят другим.
Ошибка стоит копейки — просто перезапускаю.
Ключевые принципы
- Параллельность: backend, frontend, тесты, доки пишутся одновременно.
- Специализация: каждый агент видит только нужный контекст (Stripe-интеграция, UI-форма, тесты).
- Минимальные требования: чёткая цель + границы (
/docs,/tests,/ui).
Как повторить
- Положи
.md-инструкции для ролей вagents/. - Один bash-скрипт:
claude -p agents/pm.md & claude -p agents/dev.md & claude -p agents/qa.md. - Результаты сливаются автоматом; если rate-limit — добавь
sleep 1.
Готово: спеку, код и тесты получаешь быстрее, чем пишешь Jira-таск.
Комментарии (117)
- Подавляющее большинство участников считают «ролевых» суб-агентов (product-manager, frontend, backend и т.д.) маркетинговым трюком: они не получают полного системного промпта и CLAUDE.md, быстро теряют контекст, пишут «моки» или ломают уже рабочий код.
- Практический итог: вместо ускорения появляется «казино» — много запусков, загрязнённый контекст, регрессии и перерасход токенов; проекты приходится переписывать вручную.
- Кто всё-таки использует суб-агентов, делает их не «по ролям», а «по задачам»: короткий запрос → агент жрёт много токенов → возвращает компактный отчёт (покрытие тестами, соответствие гайдам, рефакторинг-чек-лист), чтобы основной чат не засорять.
- Альтернатива — уйти от чёрного ящика: Tmux + два独立的 CLI-агента в соседних панелях, ручной синх через файлы или GitHub-issues; так проще остановить и подправить.
- Общий вывод: для реального кода достаточно обычного Claude Code с хорошим промптом, правилами в /commands и лаконичным CLAUDE.md; «мульти-агент» пока не приносит выгод, зато точно приносит лишние траты и головную боль.
Why LLMs can't really build software 🔥 Горячее 💬 Длинная дискуссия
Почему LLM не могут строить ПО
Эффективный инженер постоянно прокручивает цикл:
- формирует ментальную модель требований,
- пишет код,
- проверяет, что он реально делает,
- сверяет модели и правит код или требования.
LLM умеют писать и обновлять код, запускать тесты, логировать, но не умеют держать в голове ясную модель. Они путаются: считают, что всё работает, не понимают, где ошибка — в коде или в тесте, и при раздражении сносят всё и начинают заново. Человек же, столкнувшись с проблемой, может «свернуть» контекст, сфокусироваться на детали, затем вернуться к общей картине.
Даже если модели станут мощнее, им нужно научиться так же «держать в памяти» и переключаться между уровнями детализации. Сейчас они страдают от выпадения контекста, пристрастия к свежим фактам и галлюцинаций. Работа над «памятью» идёт, но пока LLM не понимают происходящего и не могут сравнивать две похожие модели, чтобы решить, что менять.
LLM полезны: быстро генерируют код и документацию, справляются с простыми задачами. В сложных случаях человек всё равно должен контролировать требования и проверять результат. В Zed верят в совместную работу человека и агента, но руль остаётся за инженером, а LLM — лишь инструмент.
Комментарии (426)
- LLM хороши как инструменты-ассистенты: быстро пишут boilerplate, находят мелкие ошибки, экономят время на рутине.
- Главный недостаток — неспособность удерживать и «поддерживать» целостную ментальную модель задачи; контекст «размывается» или меняется непредсказуемо.
- Поэтому при росте кодовой базы отладка превращается в «чтение спагетти», и инженер всё равно вынужден начинать заново.
- Решение — не «больше контекста», а системы-обёртки: TDD-циклы, пошаговое планирование, документация-модель, строгие промпты.
- Вывод: сейчас LLM заменяют джунов и Google-поиск, но полноценное ПО без человека, который держит «теорию» проекта в голове, построить не могут.
GPT-5 vs. Sonnet: Complex Agentic Coding
Задача: перенести TypeScript-утилиту Ruler на Rust, проверить идентичность через bash-тест.
Модели: GPT-5 (новый, превью) и Claude 4 Sonnet.
GPT-5
- Сразу прочитал код, составил подробный
plan.md, получил одобрение. - Работал почти без остановок, дважды отчитывался о статусе.
- Сначала написал bash-скрипт, который запускает оригинал и порт во временной папке и сравнивает вывод.
- Затем сгенерировал структуру
src/,Cargo.toml, CLI-аргументы, логикуapply/init/revert, обработку конфигов и MCP. - Итеративно правил код, пока тест не прошёл «зелёным».
- Время: ~20 мин, 1 коммит, ветка
feat/rust-port.
Claude 4 Sonnet
- Та же инструкция.
- Сразу начал писать Rust, но упустил bash-тест; пришлось напомнить.
- Тест написал быстрее, но менее читаемый.
- Порт делал «пачками»: сначала CLI, потом логика, потом MCP.
- После 3-х итераций тест прошёл.
- Время: ~30 мин, 3 коммита.
Вывод
- GPT-5 агентнее: сам планирует, реже спрашивает, меньше ошибок.
- Claude надёжнее в деталях, но требует чётких шагов.
- Оба справились, но GPT-5 ощущается «ближе к одной команде — один результат».
Комментарии (124)
- Пользователи сомневаются в объективности сравнений: результаты сильно зависят от системных промптов, харнесов и задач.
- Критика выбора моделей: вместо топ-версии Claude Opus сравнивали более дешёвый Sonnet, что искажает оценку «лучшей» модели.
- Стоимость vs качество: большинство разработчиков не готовы платить 10× за Opus, поэтому GPT-5 рассматривают как «cost-effective» вариант.
- Опыт в продакшене: многие находят Claude Code (Sonnet/Opus) надёжнее при работе с большими кодовыми базами и TDD, тогда как GPT-5 хорош для разовых скриптов.
- Нет единой метрики: из-за недетерминированности моделей и субъективных критериев «хорошего кода» каждый получает разные результаты.
Getting good results from Claude Code 🔥 Горячее 💬 Длинная дискуссия
- Чёткое ТЗ — пишу заранее, чтобы агент видел контекст.
- Файл-инструкция по запуску линтервов и сборки.
- Саморевью — прошу Claude проверить свой код.
- Глобальный гайд
~/.claude/CLAUDE.mdс правилами: мелкие шаги, TDD, простые решения, максимум 3 попытки при ошибке.
Качество
Я вручную читаю и тестирую всё, что выходит из LLM; отвечаю за PR независимо от автора кода.
Комментарии (180)
- Ключ к успеху — писать подробные спецификации: кто-то тратит 2 часа на 12-шаговый документ и получает отличный результат, другие же считают, что даже «чистые» спеки не спасают от схода с курса и бесконечных правок.
- Мнения о CLAUDE.md разделились: одни держат файл коротким (<100 строк) и минималистичным, другие вообще не видят в нём пользы из-за «context rot» и субъективных инструкций.
- Работа с большими старыми кодовыми базами по-прежнему сложна: большинство признаёт, что Claude Code лучше справляется с новыми pet-project’ами, чем с «грязными» legacy-фичами.
- Популярные тактики: шаг-за-шагом микро-PR, TDD-агент, запуск puppeteer-тестов для «замыкания цикла», code-review собственных патчей самим агентом.
- Некоторые вообще отказались от спецификаций: инкрементально подсказывают «следующий шаг, какой сделал бы я», сразу коммитят дифф и правят на лету.