Обновить
64K+

Качество кода *

Как Макконнелл завещал

39,26
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

LLM не должен читать логи без ограничений: безопасный MCP-шлюз для разбора сбоев

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели6.8K

Как дать LLM разбирать сбои в пайплайнах, не открывая ей доступ к сырым логам и произвольным SQL-запросам

Читать далее

Новости

Софт может деградировать бесконечно

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели16K

Нередко для описания хромых кодовых баз используют метафоры вроде «тонущий корабль». Я же считаю, что эта аналогия ошибочна. Бизнес начинает тонуть задолго до того, как код достигнет гипотетического дна. Технический долг нельзя свести к банкротству, чтобы начать с чистого листа. Именно поэтому подобные метафоры, подразумевающие достижение некоего конца, лишь создают ложное чувство спокойствия.

Программное обеспечение существует в умозрительной сфере. Его нельзя сравнивать со зданием или мостом, которые находятся в физическом мире, где вы можете их полноценно видеть и осязать. Если вы продолжите бесконечно добавлять в здание этажи и комнаты, оно в конечном итоге рухнет. Но у ПО нет такого жёсткого предела. Код всегда можно сделать ещё хуже. Всегда можно внести очередной слой абстракции или ещё больше ослабить производительность.

Читать далее

Сколько ваших проверок хоть раз возвращали False?

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели8K

Я делаю систему, которая собирает черновики производственных инструкций. В ней есть детектор опасных формулировок — и он исправно срабатывал на фразе «убедиться, что в зоне движения нет людей». То есть на правиле техники безопасности, как на его нарушении.

Починил и задумался: а остальные шестьдесят проверок качества что-нибудь измеряют? Написал инструмент, который портит документы изнутри схемы и смотрит, какие проверки реагируют. Тридцать не реагируют ни на что.

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

Читать далее

Груминг со звёздочкой: как изменился TTM после раннего погружения в код

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели5.7K

Что происходит, когда команда оценивает задачу до знакомства с чужим кодом? В нашем случае это приводило к оптимистичным срокам, неожиданным A/B-реализациям, повторным итерациям ТЗ и багам, которые обнаруживались уже на тестировании.

Мы добавили Tech Discovery — раннее исследование кода до финализации требований, дизайна и оценки. В статье расскажу, для каких задач этот процесс окупается, сколько времени занимает, какие результаты должна получить команда и чем наш подход отличается от обычного технического spike.

На выборке из семи задач TTM средних и сложных проектов сместился с диапазона 1,5–3 месяца к 1–2 месяцам, а количество профильных багов на эпик — с 6–12 до 4–9.

Читать далее

А чё, так можно было? Порядок полей = 1,8× к скорости

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели6.1K

Класс без единого поля занимает 24 байта, с двумя полями int — те же 24, а с тремя — уже 32.

В структуре достаточно поменять местами два поля, и её размер уменьшится с 24 байт до 16, а обход массива ускорится в 1,8 раза.

Читать далее

Сборщик мусора в Dart. Часть 3: старое поколение

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели11K

В первой части мы разобрали, как Dart отличает число от объекта, а во второй – как убирается молодое поколение. Там все держалось на одном приеме: живых переносим в соседнее полупространство, а всю старую половину выбрасываем целиком.

Почему в старом поколении переезд не подходит

В молодом поколении все было просто – отбрасываем мертвые объекты и забываем про них, в старом поколении все по-другому. Для старого поколения такая операция слишком дорогая. Количество живых объектов больше, чем неживых, а это значит, что нам бы пришлось копировать почти всю память с места на место. Также необходимо было бы держать вторую половину пространства запасам такого же размера как и занятую часть полупространства. Для решения этой проблемы существует mark-sweep (Пометка-очистка).

Читать далее

ТОП-50 скиллов для ИИ‑агентов (9 млн звезд на GitHub, 22 млн установок)

Время на прочтение20 мин
Охват и читатели14K

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

В этой подборке я собрал 50 самых популярных скиллов для ИИ-агентов - вместе они набрали 9 млн звезд на GitHub и 22 млн установок.

Используйте бесплатно.

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

Читать далее

Код прошёл ревью, потому что читался правильно. Выполняется он иначе

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели9.5K

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

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

Этим зазором пользуются двумя способами, и оба закрываются одной проверкой.

Читать далее

Что внутри ANE на самом деле, или почему ЫЫ нельзя поручать reverse engineering

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7.6K

Нейронке сказали — «разберись как оно работает». Пошевелив гигабайтами матриц, она полезла ковырять список классов в AppleNeuralEngine.framework— и нашла там то, что искала — «40+ private classes, including _ANEInMemoryModel». Код работал. Делал то что от него требовалось — запускал математику на ANE. Но было в этом что‑то… не то.

Читать далее

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

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели6.5K

Строчка, которая встречается в скриптах повсеместно:

mysql -u admin -pSecretPass123 -e "select 1"

Пока команда выполняется, этот пароль видит каждый, у кого есть доступ к устройству — обычный, непривилегированный. Достаточно посмотреть список процессов.

Читать далее

Ленивый LINQ: разбираем yield и ленивые вычисления по кирпичикам. Часть 2

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели11K

В первой части мы успешно вскрыли чёрный ящик LINQ: написали Where вручную, разобрались, как компилятор превращает yield return в конечные автоматы, и посмотрели на методы с частичной буферизацией. Но LINQ был бы не собой, если бы на этом всё закончилось.

Во второй части переходим к «тяжёлой артиллерии» — OrderByGroupBy и Join. Эти методы вынуждены нарушить главный завет ленивых вычислений: они материализуют данные в памяти, прежде чем отдать хоть один элемент. Но как именно?

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

Читать далее

AI-ревьюер кода. Ирония судьбы, или С лёгким мердж-реквестом

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели7.6K

Привет, Хабр! На связи Оля и Эрик из команды больших языковых моделей ecom.tech. Cегодня мы расскажем, как делали сервис для AI-ревью кода с встраиванием его в CI/CD пайплайн GitLab. Эта статья будет полезна тем, кто разрабатывает агентов для работы с кодом (и не только), а также кто хочет поближе познакомиться с ассортиментом граблей, на которые можно наступить при внедрении этого самого AI в производственные процессы.

Читать далее

Как дизайнеру понять, что его вайб‑код не мусор: веб‑версия моей настолки с середины пути

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели8.8K

Два месяца назад мы взялись перенести в веб мою настольную игру. «Release любой ценой» — карточная игра про хаос IT‑разработки: собираешь релиз из Backend, Frontend и Database, соперники его валят, ты отбиваешься. Про саму настолку я здесь уже писал.

Нас в проекте трое: разработчик (ditayler), я (dimbo‑design, дизайнер) и Claude Code, через которого работаем оба. Ему досталась реализация логики игры и фундамент: монорепо, сеть, движок. Мне видимая часть: интерфейс, анимации, поведение карт, UX. Прочитать код я, в общем‑то, могу, а вот понять нет: моё ревью проходит на экране, как дизайн‑ревью.

Из этой конфигурации торчит неудобный вопрос. С моей стороны в проект постоянно едет код. Как убедиться, что туда не едет мусор, если прочитать его я не в состоянии? Ответ, на котором стоит проект: нестыковки должны всплывать сами — между договорённостью и кодом, между докой и реальностью. И сразу честно, чтобы не выглядело героическим строительством по ходу: большую часть этого фундамента разработчик задал ещё на старте, и именно фундамент работает. Что‑то доросло позже в моей зоне, за что‑то пришлось повоевать. Дальше эта система по частям, в порядке появления в проекте.

Читать далее

Ближайшие события

AI Enablement at Scale, часть 1: почему мы начали не с агентов, а с оценки 13 команд

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели6.9K

Что происходит, если вместо массовой раздачи AI-инструментов сначала изучить, как на самом деле работают команды?

Рассказываю, как мы начали AI Enablement в крупной финансовой организации: оценили 13 команд, визуализировали их delivery pipelines, обучили около 800 человек и построили программу вокруг реальных ботлнеков, а не вокруг модных AI-инструментов.

Читать далее

Кaк внeдpить cтaтичecкий aнaлиз: пpaктичecкий aлгopитм для мeнeджepoв

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели5.9K

Cтaтичecкий aнaлиз кoдa дaвнo пepecтaл быть инcтpyмeнтoм иcключитeльнo для paзpaбoтчикoв. Для pyкoвoдитeлeй пpoдyктoв, тexничecкиx диpeктopoв и кoмaнд инфopмaциoннoй бeзoпacнocти oн cтaнoвитcя чacтью cиcтeмы yпpaвлeния кaчecтвoм и бeзoпacнocтью paзpaбoтки.

B этoй cтaтьe мы paccкaжeм, кaк пocлeдoвaтeльнo внeдpить инcтpyмeнт cтaтичecкoгo aнaлизa, ктo oтвeчaeт зa кaкoй этaп и кaк пepeйти oт paзoвoгo иcпoльзoвaния aнaлизaтopa к peгyляpнoмy кoнтpoлю кaчecтвa иcxoднoгo кoдa.

Читать далее

Код‑ревью в эпоху ИИ: 7 ошибок, ведущих к инцидентам

Уровень сложностиСредний
Время на прочтение17 мин
Охват и читатели7.2K

ИИ уже умеет за минуты генерировать сотни строк кода, но скорость ревью от этого не выросла. Разбираем семь ошибок, из‑за которых AI Code Review пропускает реальные дефекты, создаёт ложное чувство безопасности и постепенно превращает проверку кода в формальность.

Разобрать ошибки

От героев былых времен

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели14K

Машина Тьюринга (МТ) не сферический конь в вакууме программистского бытия. Она не про «единички-нолики» и елозанье вдоль ленты, а про гимнастику мозгов для программистов. Продолжим тему МТ, начатую в [1]. Ее программирование увлекательная и, без сомнения, серьезная работа по созданию алгоритмов при миним миниморум средств на их реализацию Тем и привлекательна. Особенно на этапах обучения алгоритмическому мышлению.

Продолжим тему нахождения наибольшего общего делителя (НОД) двух чисел для МТ. Только теперь это будет обычное программирование. По счастью ли по совпадению нужный нам алгоритм приведен в книге Н.Вирта [2]. Его блок-схема (БС) приведена на рис. 1. Обычная и ни чем не примечательная БС и совсем простой алгоритм. Особенно в сравнении с рассмотренными для МТ. Привел он его, преследуя другие цели, но сейчас не это главное.

Читать далее

По заветам Макконнела

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели12K

Если вы начинающий программист и у Вас нет машины, то лучшее решение - машина Тьюринга (МТ)! Я в этом вам помогу, а еще Макконнел. Но и не только он один.

Первая моя статья на Хабре о машинах Тьюринга это про тяжелый грузовик [1]. А оно такое надо? Начинать лучше с чего-то полегче. Этим и займемся. Хотя основа или, так сказать, базис по большому счету будет один. Но, ведь, между карьерным самосвалом и самой простой «инвалидкой» тоже есть много общего? И то и другое явно не самолет.

В монографиях Макконнела [2], Карпова [3] и еще много где устройство МТ расписано по винтикам, которых не так уж и много. Я, например, когда-то начинал с книги А.Трахтенброта [4].  Также можно, не мудрствуя лукаво, запустить эмулятор МТ. Их  в Инете найти не сложно. И сразу погонять, не вникая в «винтики». Но это для самых отвязных, т.е. тех, кто не боится снести крышу.

Я предпочитаю среднее. Глубины теории для любителей. По мне гораздо лучше через «ручки». Для этого нужно иметь «конструктор», на котором можно  не только тренироваться, но и реализовать любые фантазии.

Подобие конструктора можно найти у Карпова Ю.Г. Но это пара набросков на псевдокоде. Мы же возьмем конкретный язык и конкретную реализацию. А для совсем уж ленивых будет доступен код по ссылке на Git-репозитарий.

Подобно Макконнелу я за «активный обучающий подход». Т.е. следую его заветам. Хотя следовал я им задолго до знакомства  с его идеями. И это даже хорошо, т.к. не отвлекало. В результате я пошел  даже немного дальше. Для анализа алгоритмов использовал не псевдокод, а другой вариант – формальную вычислительную модель и ее реализацию. Такой «математический псевдокод» позволяет делать  анализ проще, глубже и точнее. По результатам написал статью во времена, когда журналы еще издавались [5].

Читать далее

Опухший C++ код

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели102K

Есть такая старая программистская байка, что нельзя платить программистам за строки кода, так как тогда они будут писать длинный бестолковый код и любить метод copy-paste. Будущее наступило. Только теперь этими “программистами” является генеративный ИИ (GenAI), которому как раз платят за строки кода. Иронично.

Один из моих интересов — изучение сгенерированного С++ кода, чтобы понимать, как развивается индустрия создания ПО, какие проблемы уходят, а какие наоборот возникают. После заметки “Дайте посмотреть на нормальный С++ проект, созданный вайб-кодингом” мне предложили заглянуть в проект VibeTensor, что я и сделал.

Читать далее

ИИ пишет тест-кейсы и автотесты за тебя: как их генерировать и не получить ложное покрытие

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели15K

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

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

Разбираем, что ИИ реально снимает с QA, где создаёт лишь видимость покрытия и почему сгенерированный набор всё равно приходится проектировать и проверять человеку.

Где прячется ложное покрытие →
1
23 ...