О чокнутых программистах (30.01.2023). Печать
2023 - Январь
30.01.2023 21:12
Save & Share
Минутка ненависти.


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

Сначала был единичный случай. Функция, проверяющая, есть на жестком диске 1 файл или 2, - состояла более чем из 50 строк кода, достаточно запутанного.

Но далее появился второй. Функция ядра, занимающая простым поиском файлов по фильтру расширения, - занимает строк 200 с 3 циклами в цикле. И ладно объем кода - вывернутая наизнанку, перевернутая вверх тормашками, витиеватая и алогичная - вход через жопу, выход через рот.

В итоге, эта функция вместо 7000 файлов порождала с дубликатами ~100млн записей в одном списке - что не просто крайне медленно работало, а стало приводить к переполнению оперативной памяти (не хватало 34ГБ).

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

Решение задачи выглядит просто: написать свою или добавить .removeDuplicates() в существующую. Но так как функция входит в состав ядра и используется везде - закрадываются страх и сомнения. А, вдруг, так надо? Вдруг, каком-то одном случае важно, чтобы были миллионы записей - для последующего использования в другом участке кода?

А времени на парное тестирование всех ее вызовов - нет. Итог - костыль: если функция вызывается от меня - .removeDuplicates(). Как только освободится время, переписать эту функцию с нуля или позаимствовать хорошие примеры из интернета - резко ускорив всю программу в целом. Теоретически, все решится десятком строк с QFileSystemModel.

Не берите психов в программисты.

(добавлено 27.04.2023) Нарвался еще на один участок кода. Сетевое взаимодействие:
- контрольная сумма принятых пакетов не проверяется;
- принятые данные не проверяются на соответствие той сущности, для которой проводилось сетевое взаимодействие;
- открываемый сокет не закрывается по завершении работы с сетью;
- часть комментариев ошибочны, написаны со строчных букв и без точек;
- ему так лень было писать код, что переменные имеют название из двух букв. Например, целая структура с разными типами данных имеет название "in". Набираешь в поиске "in" - и подсвечивает и все инты, и другие структуры вида "in2" в этом модуле, и другие содержащие в себе "in" слова. Аж в глазах зарябило.

Пришлось половину модуля переписывать - и задача из 2-часовой превратилась в 2-дневную.

(добавлено 01.06.2023) Еще одна абсурдность, с которой приходится сейчас возиться (задача увеличения количества получаемых данных).

Пусть есть модуль1, его задача - запустить модуль2 и получить от него данные по определенному номеру субъекта.

Вместо того, чтобы передать номер субъекта в модуль2 как параметр argv[] при его запуске и получить ответные данные в виде QProcess::readAll, - производится безумная и избыточная операция с данными. И ее не разрушить, т.к. на таком подходе завязаны не только эти 2 модуля - и тут лучшее может стать врагом хорошего.

Алгоритм:
- модуль1 создает XML из всех данных субъекта, включая его номер. То есть, не только класс «номер» выгружает - а вообще всё;
- в модуле2 XML преобразуется в такие же классы и подклассы субъекта, но уже свои, внутренние. Из них вытаскивается номер, обрабатывается, - и формируются выходные данные в структуре;
- для пользователя формируется отдельное окно с выходными данными. И, независимо от нажатия на крестик или кнопку "Принять", пользователь примет эти данные;
- данные помещаются в свои классы модуля2. Дополнительно сохраняются во временной директории в виде файла, который нигде никогда не используется, - и после выхода из программы временная директория будет очищена;
- свои классы модуля2 сохраняются обратно в XML;
- в модуле1 XML загружается во временные классы субъекта. XML сразу удаляется - т.е., для других модулей он не нужен;
- данные из временных классов субъекта перемещаются в классы субъекта.

Я задолбался создавать новые переменные и перемещать одноименные данные туда-сюда, сюда-туда, да еще и с перетипированием для XML и постоянной слежкой за недопустимой потерей точности long double, любыми другими искажениями данных и вынужденной потерей данных при визуализации для пользователя.

А уж использование конструкции ".arg" чего стоит (вообще, огромные сомнения в смысле ее использования).

s += QString("param_tvo=\"%01\" param_svo=\"%02\" ... =\"%50\") - а потом столбиком 50 штук .arg(QString(target.Param_xyi). Номера параметров не указаны - и чтобы вставить новые параметры в это добро, нужно вручную считать строчки, пока не доберешься до .arg с определенным номером. Вставляешь строчку с .arg - и начинаешь изменять верхнюю строку, вставляя уже ссылку на этот .arg в определенном месте. Далее переименовываешь %числа, т.к. ползет нумерация.

(добавлено 14.07.2023) Еще 1 механизм, целый модуль, - оказался написан коряво. Если говорить аллегориями, то еда запихивается в жопу, переваривается снизу вверх - и изо рта выходят какашки. Исправить алгоритм - это не сделать так, чтобы какашки запихивались в рот - и наружу из жопы выходила еда; понятное дело. Приходится применять совершенно неочевидные лайфхаки, сомнительность которых не хочется обсуждать.
Обновлено ( 14.07.2023 16:22 )