Имена изменены, все совпадения случайны.
Увертюра
Сразу оговорюсь, Matlab — отличный инструмент. Отличный инструмент, который мы использовали не по назначению.
Взгляните на нашу компанию. Наша сфера деятельности — разработка ПО для
промышленности и много чего еще. В компании работает около 100 человек, а
я в этой компании — один из сотрудников, занимающийся разработкой
алгоритмов. Есть у нас и Флагманский продукт, приносящий основную
прибыль.
Флагманский продукт — бизнес-приложение. В нем много формочек и
отчетиков, своя база данных и вычислительное ядро. Вычислительное ядро
написано на C# без привлечения нативного кода. Такое решение было
принято разработчиками осознанно. Parallel.For был так соблазнителен, а
C++ все хотели забыть как страшный сон.
Реальность, как это нередко бывает, не прислушалась к нашим пожеланиям, и
скорости C# вскоре стало не хватать. Другая проблема, что, как
выяснилось, программисты, какой бы хороший код не писали, в линейной
алгебре разбираются слабо.
Тогда наш Главный Алгоритмист предложил идею. Описание этой идеи и того, что из нее вышло и составляет суть данной статьи.
Идея
Идея была проста. Вместо того, чтобы платить зарплату одному умному
программисту (который бы умел писать хороший код на C# и разбирался в
тонкостях нашего «матана», а такого непросто найти), можно взять двух
«полуумных». Первый будет писать прототипы на Matlab, второй —
переносить решение на C#.
Matlab в таком случае преподносился как инструмент для документирования
алгоритма. У такого решения были озвучены следующие преимущества:
- Matlab — простой язык, который опытный программист может выучить за 1 день
- Все математики пишут на Matlab
Стоить отметить, что ранее для документирования алгоритма использовался Mathcad, UML-диаграммы и даже просто лист бумаги.
С идеей спорили, ее не принимали. Но в итоге Главный Алгоритмист всех
убедил, и была создана команда алгоритмистов, пишущих на матлабе. В эту
команду вошел и я. В нашу команду также вошел Самый Бесполезный
Программист из числа разработчиков, который должен был бы, не думая,
переносить наши матлаб-экзерсисы на C#.
Замечу, что кроме предложений отказаться от этой затеи, было и
предложение использовать, по крайней мере, python+numpy. Хотя бы той
причине, что сколько-нибудь значительного опыта разработки на Matlab ни у
кого не было (я раньше писал на python и R, остальные были математики и
инженеры, использующие Matlab как продвинутый калькулятор).
Предложения, как можно понять, отклонили.
Прошел год...
Прошел год и сейчас уже можно подвести некоторые итоги:
- Математики не умеют писать код. А в той лапше, что выходит из-под их
пера не могут разобраться и они сами. Нет ни специфических знаний, ни
опыта, ни культуры программирования
- Раз уж мы отказались от схем и Mathcad, то появилось желание
использовать для наших Matlab программ реальные источники данных. В
итоге мы немало времени занимались дублированием части функционала
Флагманского продукта на Матлабе
- Пока мы занимались программированием, времени на работу над собственно алгоритмом оставалось немного
- Matlab не подходит для разработки больших программ. По крайней мере,
не подходит нам. Динамическая нестрогая типизация, медленные циклы,
ооочень-медленный ООП (настолько, что пришлось частично отказаться от
использования ООП), неполная поддержка разреженных матриц
- Переносить код с Matlab на C# непросто. Еще сложнее бэкпортировать рефакторинги и оптимизации
В результате мы не можем заранее оценить, сколько времени потребуется на
реализацию той или иной фичи. Неделя или может быть месяц?
Вместо заключения
В самом начале статьи я немного слукавил, т.к. история продолжается до
сих пор. Мы продолжаем писать на Matlab, наш код продолжают переносить
на C#. Хотя теперь уже все согласны, что у идеи Главного Алгоритмиста
есть изъяны. Но менять уже что-либо слишком поздно.
А тем временем начинают поговаривать о дополнительном перекодировании решений с Matlab уже на С++… |