Имена изменены, все совпадения случайны.
Увертюра
Сразу оговорюсь, 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 уже на С++…
Автор: basp