Продолжение недавнего поста о проблеме XY. На этот раз — с конкретным примером.

В сообществе Кложи кто-то спрашивает: подскажите профайлер, чтобы отладить код. Выкидывает OufOfMemoryException (OOM), потому что утекает память.

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

Слово за слово, и человека уговорили показать упрощенную версию кода, в котором течет память. А там… как бы вам описать? Идея очень простая: нужно пройтись по строкам файла, сжатого GZIP-ом. В каждой строке лежит джейсончик. Его нужно минимально обработать и записать в базу, а сломанные записи собрать для будущей починки.

Каждый писал такой код сто раз: это банальный цикл с try/catch. Что же было у автора? Ощущение, что он собрал все выкрутасы, какие только знал. Своя ленивая коллекция через lazy-seq, замкнутая на открытом Reader-e. Глобальный атом, накопление ошибок в иммутальный вектор вместо логов. Функция, которая возвращает функцию. И это только сокращенная версия! Настоящая химера: тело льва, крылья орла, хвост змеи. И где-то здесь течет память. Счастливой отладки!

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

Во вступительной части я описывал пример: кто-то не может поставить программу из-за ошибки. Той программой является очиститель реестра, подсказанный в курилке. Почистишь — и комп перестанет тормозить. Глупо, но такие истории случаются, и они простительны офисному работнику.

Чем это отличается от примера с профайлером? На мой взгляд, ничем. Это чистый, незамутненный пример проблемы XY. Автор написал говнокод и надеется, что профайлер каким-то образом его исправит. Нет, не исправит, а только займет лишние пару дней на установку и чтение документации. И пусть даже найдется место, где память течет — как это повлияет на код в целом? Говнокод останется говнокодом.

Вроде бы автор не офисный работник или таксист, а программист, но не понимает этого.