Echte Programmierung

Надеюсь, читатели простят меня за заголовок на немецком языке. Этот язык наилучшим образом соответствует (на мой взгляд) описанию состояния настоящего программирование, помните немецким с неприятелями … говорить прилично. Я бы всю эту заметку написал на немецком, но так как по немецкий я не знаю, то боюсь, перевод через авто переводчик полностью вышибет из текста весь смысл.

Естественно, я немного преувеличиваю свое «удивление» от состояния программирования. Хоть я, в основном, занимаюсь разработкой архитектуры ПО, но от разработки далеко не ухожу, так что вполне в курсе. Просто этот пример не только подчеркивает то, что я уже написал о стандартизации программирования, но и позволяет увидеть, куда надо стремиться. Впрочем, не буду забегать вперед.

Перейду к иллюстрации настоящего программирования на примере. Есть задача: надо сделать приложение, которое будет работать на всех основных платформах: Windows, Android, iOS, Mac. Естественно, что желательно минимизировать затраты на разработку, а значит, минимизировать дублирование кода. Насколько возможно, один код должен работать на всех платформах.

Само приложение достаточно простое, для него нужна хорошая графика (на уровне обычной 2D игры) и поддержка аудио на таком же уровне.

Единственная особенность, для использования программы нужна нейро-гарнитура, то есть устройство, которое снимает EEG. Нейро-гарнитуру берем самую распространенную – MindWave от NeuroSky.  Производитель дает открытый SDK для всех платформ, которые нам надо покрыть.

Так как нам хочется, чтобы один код работал на всех платформах, это естественно приводит к мысли использовать какую-нибудь мульти-платформенную (кросс-платформенную) среду разработки.

После изучения таких сред, мы выбрали Marmalade (https://www.madewithmarmalade.com/), которая рекламируется как среда для разработки игр. Это делает эту среду подходящей для нас, так как наше приложение близко к играм по требованиям.

Я не буду писать, по каким критериям мы сравнивали среды разработки, но было бы очень интересно прочитать в комментариях что-то такое: «А если бы выбрали XYZ, то этих проблем не было бы». Я был бы сильно удивлен…

Мармелад – мультиязыковая среда, позволяющая программировать на C++, Lua и JavaScript. JavaScript тянет за собой слишком много веб-программирования, убираем его из рассмотрения. А так как производительность приложения значения не имеет, а скорость разработки имеет, то выбираем Lua.

Замечание: естественно, что производительность графики имеет значения, но так как для графики используется OpenGL, да и run-time большей частью написан на C++, то надеемся, что производительности хватит.

Итак, приступаем к разработке… И на этом заканчивается мажорная часть этой истории (все хорошо, прекрасная маркиза).

Минорность №1 (NeuroSky) (легкое недоумение и сарказм)

В мажорной части я написал — производитель дает открытый SDK для всех платформ, которые нам надо покрыть – это чуть-чуть не правда. Нет одного SDK, есть отдельные SDK для каждой платформы: Windows Desktop, Android, iOS, MacOS.

Собственно, в разных SDK еще нет ничего странного, странность заключается в том, что нет единого API для всех платформ. Более того, API существенно разные. Видимо, у NeuroSky, который продал всего лишь 4000000 (4 миллиона) гарнитур нет денег на то, чтобы нанять архитектора, ну или хотя бы нормального менеджера, который ограничил бы фантазию разработчиков.

Любопытно, что сделать общее API для всех платформ не составляет никакого труда, в нем собственно всего 4 функции:

  • Подключится к устройству
  • Отключится от устройства
  • Получить список возможностей устройства: какие характеристики выдает устройство и границы для каждой характеристики. Например, устройство выдает уровень внимание в диапазоне 1..255 и т.д.
  • Получить уровень (числовое значение) одной характеристики.

 

Минорность №2 (Marmalade) (легкая, понимающая грусть)

В 4 тактах:

  • Берем бесплатную лицензию, убеждаемся, что использовать библиотеку, работающую с устройством, бесплатная лицензия не позволяет.
  • Внимательно читаем описание лицензий, берем самую дешевую на месяц, проверяем – можно подключать.
  • Месяц кончается, собираемся продлить лицензию – её больше нет в списке!
  • Ну что делать, берем следующую самую дешевую (не такую уж и дешевую) лицензию на год, так как на месяц купить её нельзя.

Понятно, что это мелочь, понятно, что разработчикам Мармелада кушать тоже надо. Все понятно, ложки нашлись, но осадочек остался

Минорность №3 (Marmalade extension) (меланхоличненько)

Для того, чтобы подключить внешний (по отношению к Мармеладу) код, нужно сделать расширение (extension).

Естественно, что наше расширение должно реализовывать единый API для всех платформ, будет иметь разный код для каждой платформы и использовать, для каждой платформы, разный NeuroSky SDK.

  1. Развлекаемся с windows

NeuroSky для Windows дает нам DLL (замечательно), которая позволяет подключится к устройству и извлечь две характеристики: attention и meditation. И еще одну DLL, которая позволяет получить «силу мигания» (если человек мигает). Эти две DLL находятся между собой в несколько противоестественной связи.

При создании расширения Мармелад создает еще одну DLL – по сути переходник, позволяющий подключать расширение к программе на C++.

И, кроме того, нужна реализация нашего единого API, которую желательно отделить от переходника, так как он большей частью состоит из сгенеренного автоматически и совершенно нечитабельного кода.

Итого, всего лишь 4 DLL (!) и можно написать тестовую программу на С++. Но, постойте! Мы же решили программировать на Lua. Для этого надо все это богатство впихнуть в Lua run-time. Дело элементарное – строится переходник, которые обращается к DLL расширения и собирается все в кучу.

Вот теперь обращение к функции API из Lua выполняется легко, просто и эффективно (надеюсь, что читатель понимает шутки, даже если они не промаркированы):

Lua код -> переходник в С++ -> DLL расширения -> DLL единого API –> NeuroSky DLLs

Как опытные разработчики, мы понимаем, что такое устройство программы в порядке вещей. Какой процент кода, например, Windows, занимается переливанием из пустого в порожнее? 80%? 90%? Не считая того, который шпионит за пользователем.

Расширение для Windows это всего лишь прелюдия. В самолете, в котором мы пытаемся полететь, нет открытого ресторана, а бассейнов всего два. Переходим к следующему уровню.

  1. Развлекаемся с Android

Что дает нам NeuroSky:

  • Один jar, одну .so для получения attention/meditation
  • Еще один jar для мигания, и еще пачку so – разные для разных CPU и версий CPU

Все так же мило, как и для Windows, только веселей.

Строим автоматический код для расширения, получаем заглушку на Java, в котором надо реализовать наш единый API. Реализуем и получаем:

  • Еще один jar (реализация API)
  • Еще одну so – код расширения

Итого, для каждой разновидности андроида: 3 jar, 3 so – это пока только для программирования на C++.

И после этого строим переходник Lua – C++.

Теперь у нас есть переходы между тремя языками: Lua <-> C++ <-> Java. Настоящее веселье при этом происходит со строками – так как в едином API они используются.

Lua string (сборка мусора) преобразуется в const char * (ручное освобождение памяти), потом преобразуется в java string (сборка мусора) и наоборот. Естественно, что приходится совершать странные телодвижения, чтобы не было утечки памяти.

Не буду писать об остальных платформах, понятно, что там появляется Objective-C, но это принципиально ничего не меняет. Перейдем к главным вопросам.

Вместо заключения

  • Откуда берутся дураки и негодные дороги способы разработки?
  • Кто в этом виноват?
  • Как нам обустроить программирование?

 

3 комментария


  1. Хоспыдя, как откуда появляются?! От желания прославиться/прозвездеть/стать миллионером без особых усилий и не успев состариться (а еще лучше — даже повзрослеть). Других причин нет. Надо продать 4000000 (прописью: четыре миллиона) нейросканнеров? Прекрасно! А, надо к ним API ещё? Вот, незадача… Эй, там, на рынке труда, кто может вот этот функционал соорудить, только до завтра?

    Ответить


  2. Прикол в том, что если действовать не так (имею в виду «Эй, там, на рынке труда…»), то Ваш нейросканнер люди оценят лет через 20-30, после упорной конкурентной борьбы с захватившими новый рынок «выскочками». Если, конечно, терпения хватит все это время в него инвестировать у кого-то. Такие дела. Чёртовы единство и борьба противоположностей.

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *