August 23rd, 2021

Очередное айтишное.

Пока лето, жарко и мозги соображают только необходимый минимум, писать на сколько-нибудь серьезные темы не получается.
Поэтому поразвлекаю причастных к программированию реальным кодом, выдранным из предыдущего проекта (продакшн, работает давно).
Проект писали индусы 10  лет назад,  но, несмотря на все зачистки, в нем все еще оставалось достаточно перлов, чтобы самый завалящий трейни почувствовал себя сеньором.
Фрагмент кода (C#). Специально пробелов натыкал, чтобы подсветить всю глубину мысли программиста.

if ( ! args.Length >= 3 )
{
  // что-то делаем
}


Когда я увидел этот забор, я впал в ступор. Минут 10 я пытался понять в чем же заключается условие. Понял*.
Потом еще минут 20 пытался понять ход мыслей человека, нагородившего это. Не понял. Все-таки индусская логика очень сильно отличается от моей.
Потом исправил и постарался забыть как страшный сон. Не получилось.

Но это работает. И даже правильно, судя пот отсутствию рекламаций за  10  лет.
Да, кстати, проект американский. У них, как я смотрю вообще  на редкость пофигистическое отношение к технике и качеству программ. Во всяком случае в b2b части. Работает и ладно.
Ну и что, что страница открывается 5 минут. Открывается же. Ну и что, что генерацию отчета можно запустить только на ночь ибо выполняется она порядка 8 часов и жрет до хренища ресурсов. Работает же.
Значит нечего лезть туда грязными руками.

Вообще, в проекте было еще много интересного. Вроде упомянутого отчета. Тоже индусы делали.
Проблема отчета была в том, что код содержал в себе кучу вложенных  друг в друга циклов (то ли 3 то ли 4) и на каждой из порядка 80000 итераций, он тащил из базы данных в оперативную паямть  одни  и те же 2 или 3 тысячи элементов. И это не считая довольно тяжелой и сложной логики обработки этих данных (еще и, даже на беглый взгляд, не очень удачно написанной). Факт был в том, что 2 одновременно запущенных разными юзерами экземпляра отчета намертво вешали сайт, так как отчеты отжирали 100% ресурсов процессора и оперативной памяти.
При этом, на "выделить время и переписать все к х..м" заказчик не соглашался. Работает же. И пофиг что ночью.  Впрочем, заказчика можно понять. С теми программистскими ресурсами, которые он был готов оплачивать, переписывание затянулось бы очень надолго. А обратились они  с одной мелкой, но весьма заковыристой проблемкой, над которой тоже пришлось изрядно посидеть пока нашел.
Тем не менее небольшим фиксом удалось сократить время формиования отчета до  20 минут, а потребление оперативной  памяти "всего" до 2 гигов на пике. Ну и убрать все это счастье в фоновый поток, чтобы юзер не пялился 20 минут на бегущий кружочек лоадера. Так себе решение, так как база постоянно растет и количество итераций - тоже, но в качестве временного - сойдет.

______________
* для непрограммистов: идея заключалась в том, чттобы проверить длину args и если она меньше 3, то что-то сделать. Т.е.  if (args.Length < 3). Получилоь же, что проверяем, если длина >= 3, то тогда инвертируем результат проверки.