Hacker News Digest

Тег: #software-architecture

Постов: 10

The Learning Loop and LLMs (martinfowler.com)

Разработка ПО не может быть конвейерным производством, поскольку дизайн возникает через реализацию, а не наоборот. LLM снова подталкивают нас к этой ошибочной аналогии, игнорируя фундаментальную природу программирования, где экспериментирование и обратная связь от кода являются главным проводником. Как отмечает автор, "люди, пишущие код, не просто 'исполнители'; они играют центральную роль в обнаружении правильного дизайна".

LLM полезны как партнеры для генерации идей и начальной настройки, но часто создают код с ошибками, не соответствующими глубинным намерениям. Они особенно эффективны на этапе bootstrap-проекта: настройке окружения, создании начальных файлов и зависимостей, снижая порог для экспериментов. Однако после "Hello World" начинается настоящая работа, требующая глубокого понимания.

Существует фундаментальный цикл обучения: наблюдение и понимание, формулировка гипотез, экспериментирование и рефлексия. Этот цикл остается неизменным независимо от инструментов - от простого текстового редактора до продвинутого ИИ. LLM могут ускорить отдельные этапы, но не могут заменить необходимость непрерывного обучения через практику.

by johnwheeler • 06 ноября 2025 г. в 22:05 • 95 points

ОригиналHN

#software-development#programming#llm#artificial-intelligence#machine-learning#software-architecture

Комментарии (60)

  • Ценность разработчика заключается в понимании предметной области, архитектуры и умении принимать решения, а не в самом коде как артефакте решения.
  • Разработка ПО разделяется на творческие задачи (требующие опыта и глубокого понимания) и рутинные (которые хорошо автоматизируются, включая boilerplate).
  • LLMs полезны для генерации кода, но могут создавать ошибки и не всегда соответствовать глубинному замыслу, требуя тщательной проверки.
  • Автоматизация через LLMs вызывает опасения, что разработчики могут потерять понимание "существенной сложности" (бизнес-логика) в ущерб "случайной сложности" (технические детали).
  • Альтернативные подходы, такие как визуальное программирование (drag-and-drop) и метапрограммирование, рассматриваются как потенциальные решения для повышения абстракции.

Friendly attributes pattern in Ruby (brunosutic.com)

Bruno Sutic разработал Friendly Attributes Pattern для упрощения создания тарифных планов в своем проекте RailsBilling. Вместо громоздких повторяющихся вызовов с множеством атрибутов, он предложил компактный синтаксис с хэшами, который моделирует ментальную модель типичной страницы ценообразования. Новый подход преобразует различные структуры (массивы, хэши, значения) в стандартные атрибуты, используя типы данных для интерпретации: символы - как имена планов, числа - как суммы, ActiveSupport::Duration - как интервалы.

Паттерн работает в различных контекстах: в тестах, в консоли Rails, с методами поиска. Он поддерживает передачу аргументов в любом порядке, что удобно для разных языков, и позволяет использовать как отдельные значения, так и сложные структуры. Friendly Attributes является надмножеством стандартных атрибутов, обеспечивая обратную совместимость. Если подход не нравится, можно продолжать использовать традиционные методы без изменений.

by brunosutic • 02 ноября 2025 г. в 19:02 • 90 points

ОригиналHN

#ruby#rails#activerecord#design-patterns#software-architecture#web-development

Комментарии (65)

This is...not for me. It follows a big pattern in Ruby/Rails culture where to understand the code, you first have to understand the magic. And, it's never all that obvious where to go to try and understand the magic, because the magic itself has been imported by magic.I once was

Simplify your code: Functional core, imperative shell (testing.googleblog.com) 🔥 Горячее 💬 Длинная дискуссия

Google предлагает разделять код на функциональное ядро и императивную оболочку для упрощения разработки. Функциональное ядро содержит чистую бизнес-логику без побочных эффектов, а императивная оболочка обрабатывает взаимодействие с внешними системами. Такой подход позволяет тестировать логику изолированно и делает код более поддерживаемым. В статье приведен пример кода для отправки уведомлений об окончании подписки, демонстрирующий разницу между смешиванием логики и побочных эффектов и их разделением.

При таком разделении добавление новых функций становится проще - достаточно создать новые чистые функции и переиспользовать существующие. Например, для напоминаний о подписке можно создать функцию generateReminderEmails, используя уже существующую getExpiredUsers. Этот паттерн, впервые описанный Гэри Бернхардтом, помогает создавать более тестируемый, поддерживаемый и адаптивный код, избегая "спагетти" из смешанной логики и побочных эффектов.

by reqo • 25 октября 2025 г. в 07:07 • 385 points

ОригиналHN

#functional-programming#imperative-programming#testing#software-architecture#google#code-refactoring#code-maintainability#bash

Комментарии (170)

  • Обсуждение вращается вокруг идеи "functional core, imperative shell" (FCIS) и противоположного ей подхода "generic core, specific shell", а также влияния этих подходов на тестируемость, производительность и читаемость кода.
  • Участники обсуждают, что FCIS делает код более тестируемым, но может привести к проблемам с производительностью при работе с большими объемами данных, особенно если язык не поддерживает ленивые коллекции.
  • Также обсуждается, что важно разделять логику и эффекты, но пример кода в статье вызывает вопросы, потому что он не демонстрирует лучшие практики, такие как пагинация или фильтрация на уровне базы данных.
  • Некоторые участники подчеркивают, что важно не только следовать паттерну, но и использовать здравый смысл, чтобы не плодить сущности, которые не масштабируются, и не создавать ситуаций, где пример кода в статье может быть использован как оправдание для плохого кода.

The bloat of edge-case first libraries (43081j.com)

Многие библиотеки в экосистеме JavaScript стали избыточно сложными из-за попыток обработать все возможные крайние случаи, даже те, что на практике почти не встречаются. Например, функция clamp, предназначенная для ограничения чисел, превращается в монстра, проверяющего строки, валидирующего типы и значения, что приводит к появлению микробиблиотек вроде is-number с 90 млн загрузок в неделю. Это результат плохого технического дизайна: вместо чёткого определения ожидаемых входных данных разработчики добавляют слои проверок для гипотетических сценариев.

Правильный подход — проектировать функции под конкретные типы данных, оставляя валидацию значений на усмотрение вызывающей стороны. Библиотеки вроде is-arrayish или pascalcase, принимающие разнородные входы, лишь увеличивают сложность и зависимости без реальной пользы. Стоит вернуться к простоте: в большинстве случаев достаточно встроенных методов языка, а специализированные решения нужны только для узких задач, а не как стандарт.

by PaulHoule • 21 сентября 2025 г. в 02:09 • 108 points

ОригиналHN

#javascript#typescript#nodejs#libraries#design-patterns#software-architecture

Комментарии (125)

  • Обсуждение критикует избыточное использование зависимостей в JavaScript/TypeScript для простых задач, таких как проверка типов, что ведет к раздуванию экосистемы.
  • Участники связывают проблему с историческими особенностями JavaScript: отсутствием строгой типизации и богатой стандартной библиотеки в прошлом.
  • Поднимается вопрос о дизайне контрактов функций: следует ли валидировать входные данные внутри функции или возлагать эту ответственность на вызывающую сторону.
  • Отмечается культурное различие между сообществами: в Python принята модель "согласованных взрослых", а в JS — оборонительное программирование.
  • Обсуждается роль статической типизации (TypeScript) и стандартных библиотек как способа уменьшить потребность в микро-пакетах для проверок.

If you are good at code review, you will be good at using AI agents (seangoedecke.com)

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

Ключевой навык — не просто исправлять отдельные строки, а оценивать архитектурные решения: что можно упростить, переиспользовать или вовсе избежать. Без этого код становится сложным, а проект — неуправляемым. Эффективная работа с ИИ требует структурного мышления, как при лучшем код-ревью: видеть не только написанное, но и упущенные возможности для изящества и простоты.

by imasl42 • 20 сентября 2025 г. в 04:59 • 119 points

ОригиналHN

#code-review#ai-agents#code-generation#software-architecture#parallel-processing#non-blocking-requests#open-source#development-processes#llm

Комментарии (118)

  • Сомнения в эффективности использования ИИ для генерации кода из-за высокого процента ошибок и необходимости тщательного ревью, которое может быть более трудоемким, чем написание кода с нуля.
  • Озабоченность качеством и надежностью ИИ-сгенерированного кода, особенно в зрелых проектах и open source, где отсутствие публичного ревью может подорвать доверие.
  • Увеличение нагрузки на разработчиков из-за необходимости ревью большего объема кода, который часто требует повышенного внимания из-за непредсказуемости ИИ.
  • Потеря преимуществ человеческого взаимодействия в процессе ревью, поскольку ИИ не может участвовать в обсуждении или доработке кода.
  • Необходимость разработки новых процессов и инструментов для эффективного ревью ИИ-сгенерированного кода, включая возможность комментирования и взаимодействия с агентами.

Cognitive load is what matters (github.com) 🔥 Горячее 💬 Длинная дискуссия

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

  • Следи за «весом» кода: одна функция = одна идея, короткие имена, избегай вложенностей.
  • Удаляй дубли: повторы усложняют чтение и тестирование.
  • Используй типы и имена как документацию: ясные сигнатуры снижают необходимость комментариев.
  • Ограничь контекст: меньше глобальных переменных, чёткие границы модулей.
  • Автоматизируй рутину: линтеры, форматтеры и тесты экономят мозговые ресурсы.

Правила применимы к любому языку и масштабу проекта.

by nromiun • 30 августа 2025 г. в 12:58 • 1388 points

ОригиналHN

#coding-best-practices#code-readability#code-maintainability#software-design#software-architecture#github

Комментарии (488)

  • Участники сходятся во мнении, что «простота» кода измеряется не строками, а когнитивной нагрузкой при его изменении (Ousterhout: complexity = cognitive load × frequency of change).
  • Часто «сложный» код — результат привычки или неопытности; опытные разработчики умеют сжимать идеи до минимально необходимого набора понятий.
  • Помогают: ранние возвраты, выразительные имена переменных, тесты, чёткие границы компонентов и повторяющиеся стандарты проекта.
  • Противоречие: «куча if-ов» кажётся простой, но скрывает дублирование; избыточные абстракции тоже усложняют отладку.
  • Ключевой совет — писать код как текст для людей, а не для машины, и сознательно тратить время на упрощение, даже если это не приносит немедленной карьерной выгоды.

Vibe coding as a coding veteran: from 8-bit assembly to English-as-code (levelup.gitconnected.com)

Vibe-кодинг глазами ветерана

Эксперимент
2 недели, 40 часов, 5 k строк Python: AI-агент и я пишем микро-игру с алгоритмами A*, Minimax и пр. Цель — проверить, вытесняет ли LLM «искусство программирования».

Процесс

  • Промптинг: описываю задачи естественным языком, AI генерирует код.
  • Рефакторинг: «сделай класс короче», «добавь тесты» — срабатывает 80 %.
  • Отладка: трассировка стека + «почему падает?» — LLM быстро находит баги.
  • Архитектура: за меня выбирает структуру пакетов, но я корректирую.

Что понравилось

  • Скорость: MVP за 3 вечера.
  • Меньше рутины: никаких «import os.path.join».
  • Новые идеи: AI предложил кэш-стратегию, которой я не планировал.

Что не так

  • «Галлюцинации» API: методы, которых нет в библиотеке.
  • Сложные баги: race condition LLM не видит без контекста.
  • Читаемость: имена вроде helper_utility_v2 приходится переименовывать.

Выводы

  • Junior-девелопер теперь = «человек, который умеет спрашивать».
  • Сеньор нужен, чтобы фильтровать, тестировать и нести ответственность.
  • Синтаксис умирает, зато растёт ценность системного мышления и prompt-инженерии.

Советы ветеранам

  1. Делайте микро-промпты: «добавь docstring» → «добавь пример вызова».
  2. Держи CI/CD: автотесты ловят ошибки, которые AI пропустил.
  3. Используй AI как пару, а не замену: «покажи diff» вместо «перепиши всё».

Итог
Vibe-кодинг не убивает профессию, а сдвигает фокус: от написания символов к управлению смыслом. Сборочная линия есть, но над ней всё ещё нужен человек с вкусом.

by thunderbong • 28 августа 2025 г. в 15:55 • 169 points

ОригиналHN

#python#llm#machine-learning#a-algorithm#minimax-algorithm#prompt-engineering#debugging#code-refactoring#software-architecture#natural-language-processing

Комментарии (107)

  • Участники сравнивают LLM с консалтинговой фирмой: 50 % шанс получить эксперта, 50 % — стажёра; приходится перечитывать каждую строку.
  • «Vibe-coding» (генерация без чтения) вызывает опасения: сложно дебажить, нельзя защитить авторские права, а тонкие баги пролезают.
  • Опыт показывает: AI полезен в известных языках и задачах (Python, CRUD), но почти бесполезен в нишевых (C/C++ gamedev, Prolog, Haskell).
  • Старшие разработчики всё равно нужны: только они могут проверять, направлять и «владеть» кодом, созданным ИИ.
  • Возникает вопрос: если не брать джунов, откуда возьмутся будущие сеньоры?
  • Предлагают термины вместо «vibe-coding»: «pro-coding», «prompt-coding», «reviewing code».

The unbearable slowness of AI coding (joshuavaldez.com)

Два месяца писал код только с Claude Code. Поначалу — восторг: задачи летят, коммиты сыплются.
Сейчас, когда приложение разрослось, всё затормозилось. Парадокс: само приложение умеет запускать множество копий Claude Code, и я держу одновременно 5 инстансов, пока придумываю новые фичи.

Задержка появляется при проверке PR. Каждый приходится локально применять, читать логи, просить Claude чинить собственные ошибки.
Объём кода огромен, но скорость воспринимается как мучительно медленная: после первого «ускорения» хочется, чтобы всё так же летело. Это затягивает.

Пока Claude остаётся QA-инженером, который требует контроля. Не верю, что CLAUDE.md решит проблему: правил-то он едва придерживается, а уж комплексные интеграционные тесты — тем более.

Пока что продолжаю мёржить PR вручную, вешать git-хуки за качество и «мчаться» по задачам, пока не выяснится, что модель придумала несуществующие методы библиотеки, и придётся вырезать Clerk и писать GitHub OAuth с нуля.

by aymandfire • 21 августа 2025 г. в 18:39 • 77 points

ОригиналHN

#llm#claudecode#github#oauth#ci#git#testing#software-architecture#integration-testing

Комментарии (50)

  • Участники обсуждают «проблему золушки»: задача должна быть достаточно большой, чтобы оправдать описание и ревью, но не настолько, чтобы LLM «утонула».
  • Ключевой узкое место — человек: быстро генерируемый AI-код всё равно требует внимательного прочтения и понимания.
  • Нужно сразу задавать архитектуру и контролировать её, иначе проект быстро разрастается хаотично; README и тесты помогают, но сами тесты иногда «ломаются» или игнорируются агентом.
  • Эффективные подходы: дробление задач на 4-5 мелких, запуск нескольких специализированных агентов (док-мен, безопасность, оптимизация), строгая типизация и CI-хуки для поимки галлюцинаций библиотек.
  • Некоторые считают, что LLM-программирование — это отдельная дисциплина, где привычные паттерны не работают, а «медленно и гладко» оказывается быстрее в итоге.

I forced every engineer to take sales calls and they rewrote our platform (old.reddit.com) 💬 Длинная дискуссия

by bilsbie • 21 августа 2025 г. в 15:46 • 221 points

ОригиналHN

#software-architecture#product-management#user-experience#startups#technical-debt#communication#reddit

Комментарии (157)

  • Инженеры, вынужденные участвовать в продажах, быстро поняли, кто и как реально использует продукт, и перепроектировали архитектуру без участия PM.
  • Многие считают, что это лишь подтверждает провал PM, которые не справлялись с передачей требований и потребностей клиентов.
  • Некоторые предупреждают: прямое общение инженеров с клиентами может породить кучу кастом-фич и технический долг.
  • Другие отмечают, что в маленьких стартапах такой подход полезен, потому что каждый должен понимать пользователя.
  • Итог: проблема не в инженерах, а в плохой коммуникации между клиентом, PM и разработкой.

Комментарии (51)

  • Участники критикуют догматизм докладчика: его тезисы «всё — API без внутренностей», «модули пишет один человек» и «C89 навсегда» выглядят слишком жёсткими и не универсальными.
  • Подчёркивают, что «good-enough-now API» неизбежны: требования меняются, а идеальный интерфейс предсказать невозможно.
  • Отмечают, что советы могут работать для стабильных desktop-систем, но не для быстро меняющихся продуктов или веба.
  • Напоминают о важности баланса: избыточная абстракция и YAGNI-функции создают техдолг, а полное отсутствие модульности — дублирование и баги.