Российские программисты самые ужасные программисты в мире. Даже индусы по сравнению с ними смотрятся весьма квалифицированными.
Гнев
По долгу службы, столкнулся с двумя отечественными разработками:
Для первой был API, SDK и даже пример. Однако оказалось, что API описан не весь и самые важные функции в SDK отсутствуют. я долго матерился по поводу кода и кривости реализации, однако меня ждал сюрприз - вторая разработка.
Вторая показала себя во всей красе - единственный API который в ней существовал, был представлен в виде COM-сервера. Решение вроде верное и грамотное если не считать "особенностей". Сервер был написан не по спецификации (его интерфейсы даже OLE/COM object viewer не воспринимал и писал ошибки), половина стандартных функций в нем отсутствовала из-за этого подключиться к нему стандартными методами было невозможно.
Обратившись к разработчикам, я получил некое подобие хидера (ком-сервер писался на делфи, где оказывается таки есть аналог хидеров) где описывались 4-и интерфейса (естественно без комментариев). Один стандартный - который не работал и 3-и своих, которые было весьма оригинально выполнены.
т.к. проект разрабатывается на .NET, то пришлось писать свою порт-библиотеку, которая давала обвязку для этого чуда (.NET наотрез отказывался работать с этим чудом, из-за кривой реализации).
Гениальность интерфейсов заключалась в том, что нужна была только одна функция (и это не QueryInterface как может показаться далее. А остальные тупо не работали, как выяснилось позже - это какой-то архаизм, который просто забыли убрать), куда передавался порядковый номер необходимой функции и собственно переменные (массив VARIANTов), функция возвращала только один параметр типа bool ( причем формат true - есть ошибка, false - ошибок нет. гениально я считаю.), а настоящие ответные данные, необходимо считывать из единственного свойства этого интерфейса.
После победы над этим ужасом поистине гениальным интерфейсом оставалась всего пара вопросов - какие коды соответствуют каким функциям? какой формат входящих данных? какой набор входящих данных?
первый вопрос решился довольно просто - методом научного перебора, я подобрал что код 4 с параметрами NULL вероятно возвращает версию. Поиск по ключевым словам с DLL дал мне неопубликованный список функций, которые по моему личному опыту наверняка шли по порядку.
Дальше был ступор. Причем серьезный. Однако разработчики не подкачали и прислали кусок не работающего кода, который использовал 4 функции (из 11 обнаруженных мной), однако общая логика стала понятна и спустя два для я смог завершить трансляцию.
Дополнительным бонусом являлось наличие русских наименований методов, свойств, функций и интерфейсов в обоих проектах.
А еще я по ошибки отправил одному из представителей первой компании фразу, что их продукт взрывает мне мозг.