Зачем и почему?

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

В чем суть? Главный тренд – это снижение стоимости аппаратов за счет более адекватной оценки рисков. И по идее весь процесс должен выглядеть так: вначале создается  адекватная модель того, как будет жить и существовать спутник, затем с опорой на нее мы его строим, потом запускаем,  получаем данные, корректируем нашу модель.

Но реальность такова:

Да-да, вы все правильно поняли, наземные испытания самые бесполезные для исходных моделей. Хотя казалось, это единственный момент, когда под нашим контролем все. Как мне кажется тут дело, в том, что в глазах конструкторов это просто железка, когда по факту, современные спутники - это беспилотники. 

Которые уже могли бы решать, что им делать в части нештатных ситуаций, но эта задача целиком и полностью (ну почти) лежит на людях, управляющих аппаратом. А почему? – Да просто потому, что нету моделей, симулирующих подобные случаи. Потому что опыт их устранения вообще никак не используется в дальнейшем проектировании.

Но чтобы это в принципе было бы возможно, нужно чтобы логика, положенная в основу моделей, была единой для всей цепочки проектирования и управления. Поэтому я предлагаю создать единую библиотеку которое позволит что-то типа следующего:

 Одно кольцо объединит их… К-хм... Понятно, что это только инструмент и чтоб исправить вышеозначенную проблему нужно еще много организаторский работы, но при такой схеме сделать это проще. Почему? Отвечаю:

  1. Классическое преимущество разделенного кода - меньше времени на отладку и на внедрение исправлений.

  2. Уже при разработке моделей можно разработать методики автоматизированной проверки на земле и обработки данных в процессе лета.

  3. Позволяет проектировать опираясь на то, как будут аппаратом управлять и как его будет принимать заказчик.

Начинаем собирать камни

Прежде, по крайне мере в мире свободного ПО, такой задачи никто не ставил. Поэтому будем действовать по принципу: «Новое вино следует наливать в новые мехи». Сформулируем наши желания, пока не утруждая структурированием и конкретизацией:

  • Хочется, чтобы созданная библиотека не должна навязывать разработчикам язык программирования, на котором они будут писать;

  • Хочется, чтобы возможно было разрабатывать как клиент-серверные приложения, так и однопользовательские;

  • Хочется, чтобы можно было писать как целые комплексы взаимодействующих приложений, так и одно-единственное, работающее само по себе.

 Из этого следует два вывода:

  • Выбирать приходится из С++ и Rust. В противном случае, всем остальным придется писать на том же языке, что и мы, быть может, добавится пара-тройка скриптовых, типа Python.

  • Нам точно потребуется ОРП-библиотеки, с помощью которых можно легко (относительно) переключится между серверной БД, например PostgreSQL и встроенной, такой как SQLLite. И желательно, чтобы он были на том языке, на котором написана вся библиотека.

И, казалось бы, все очевидно: Rust спроектирован с учетом накопленного опыта развития Си\C+, значит надо переходить на него, но не все так просто. Java, C#, D, были также разработаны с учетом того же, но C++ по-прежнему жив и активно развивается. А все дело в  цене – сборщике мусора, который как не крути, приводит к увеличения времени исполнения, объему потребляемой памяти, а также порождает проблему неопределенности во времени высвобождения объекта. Это видно по многочисленным тестам.

 Мой же опыт еще добавляет к этому, что проблемы с утечками памяти, хоть и уменьшаются, но не исчезают, а вот трудность обнаружения возрастает на порядки. 

У Rust же другая беда. С++ хоть и считается мультипарадигменном, но сквозь весь язык просвечивает понятие «объект». А вот у нашего пациента в основу положена другая сущность - «данные».  Казалось бы, в чем проблема? А она есть.

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

А вот «объект» пришел из физического мира, и там совсем другие свойства: «Если у Вас есть апельсин, а у Толи нет, то если Вы его передадите, то у Толи будет апельсин, а у вас нет». И принципы ООП тоже взяты оттуда же, вы только  вспомните всех этих уточек у классиков.

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

И надо сказать, что последнее обстоятельство сыграло немалую роль в том, что я поначалу отвернулся от Rust, и первый маленький прототип был создан  на C++. Когда же я стал писать статью я решил проверить, как сейчас обстоят дела. Как оказалось много лучше чем в 2020.

Ну что ж, тогда рассмотрим те особенности, которые могут послужить на жизнестойкость проекта.

Rust

C++

Кем развивается

Rust Foundation

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

Компиляторы

rustc

gcc, clang, msvc, icc и т.д.

Средства сборки

Встроенный cargo

Встроенных нет, стандарт дн-факто cmake, а вот альтернатива qbs прекратила развиваться

Средства документирования

Встроенные

Встроенных нет, стандарт де-факт doxygen

ОРП-библиотеки

diesel

ODB, QxOrm и т.д.

Библиотеки пользовательского интерфейса

Azul

Qt, WxWidgets и т.д.

Что можно сказать: разработка Rust ведется гораздо более централизовано чем C++ . В этом есть как плюсы, например, скорость внедрение нововведений, так и минусы, например разработчики и менеджеры могут видеть будущее языка по-разному.

Децентрелизованность порождает большую живучесть, с одной стороны, но при этом принятие стандарта, а потом его реализация в каждом отдельном компиляторе может затянуться на годы, и то нет гарантий, что стандарт будет воплощен в полном объеме.

С++ древний язык, да при этом обеспечивающий прозрачную совместимость с С. Проектов, написанных на нем хороши много. А Qt, по моему опыту, лучшее что существует для кроссплатформенной разработки пользовательского интерфейса.

Но и в Rust дела уже идут в гору. Глядя на структуру diesel в его будущее верится без проблем. А вот что с будет с Azul мне лично не очень ясно. Но опять же, никто не мешает в проектах на Rust использовать сишное наследие в виде GTK, благо есть специальный пакет, актуальность которого поддерживается скриптами.

Так что считаем, что по основным параметрам паритет. Но есть еще один беспокоящий момент: поддержка cстандартной библиотеки в операционных системах реального времени.

Убедил, что Rust не нужно рассматривать? Нет? Вот и я себе не убедил, хотя, повторюсь, у меня был уже минимальный рабочий проект на C++. Но чтобы понять куда двигаться дальше придется его реализовать и на ржавчине. И вот подобный поворот я не ожидал, когда сел писать эту статью. Он поломал всю логику повествования и то, что я хотел сейчас сказать. И в следующей статье, которые неизвестно когда будет, по всей видимости, я буду сравнивать Rust и C++.

Комментарии (22)


  1. hw_store
    22.12.2022 12:54
    +6

    Кажется, текст статьи не совсем раскрывает то, что обозначено в её заголовке, в особенности в первом слове заголовка... Может, чуть-чуть подредактировать то или другое?


    1. DancingOnWater Автор
      22.12.2022 13:00

      А что не так?


      1. hw_store
        22.12.2022 13:37
        +2

        Ну, я бы сказал, что Вы в статье ставите вопросы, а заголовок как бы подразумевает, что вы будете давать какой-то ответ. А вместо этого Вы только обозначаете неопределённости. Хотя это моё субъективное мнение как человека, далёкого от конструирования софтверных проектов


        1. DancingOnWater Автор
          22.12.2022 14:04

          Не знаю... у меня в голове такая стандартная конструкция "Как собрались что-то делать, но тут все пошло не так", вот если бы я сказал "как я писал\разрабатывал ...", то да, должен говорить о решениях. По крайне я руководствовался такой логикой.


  1. Kelbon
    22.12.2022 16:39

    Звучит интересно, удачи в реализации. Насчёт кода кажется вы могли бы использовать С++20 штуки для измерения времени(вместо простых чисел в math constants) и кажется с таким количеством интерфейсов(virtual) можно было бы подумать про стирание типов вместо обычного подхода с виртуальными функциями


    1. DancingOnWater Автор
      22.12.2022 17:13

      То, что есть в С++20 для временных шкал мне показалось, слишком громоздко для вычислений.

      А вот про стирание типов не знал, пойду читать что это такое.


      1. Kelbon
        22.12.2022 17:33

        Сразу смотрите на библиотеки, с нуля реализовывать это всё будет неудобно. (у меня в статьях в профиле например много про это)


  1. UstasAlex
    22.12.2022 16:42

    Не совсем понятны некоторые утверждения. Например, что при предлагаемой логике будет понятно как будет приниматься КА. Так это известно всегда - есть ТЗ и заказчик принимает изделие сверяясь с каждой запятой этого ТЗ. И программы-методики отработки создаются исходя из необходимости подтверждения каждого пункта ТЗ. Затем, про аналогию с беспилотниками. Что беспилотник может делать самостоятельно, без команд с земли?


    1. DancingOnWater Автор
      22.12.2022 17:03

      Про ТЗ: это в идеальном мире, где и подрядчик и заказчик знаете все-все. В реальной космической отрасли сильно иначе. К сожалению, не редка ситуация, что те, кто делают модельный расчет для разработки конструкции, закладываются на такой тип управления, который земля не может обеспечить либо в принципе, либо без существенной переделки.

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


      1. UstasAlex
        22.12.2022 18:01

        Может разговор про коммерческие спутники. То, что идет как госзаказ, ТЗ для заказчика это Библия. По крайней мере для носителей. А насчет моделей, так это зависит от исполнителей, а не от принятой системы проектирования. Вон, когда не учли азимут космодрома, выяснилось, что полезная нагрузка моделировалась как материальная трчка, а не как трехмеоный объект. Ну так сами себе злобные буратины.


        1. DancingOnWater Автор
          22.12.2022 18:07

          ТЗ на разработку ракета-носителей я не видел, но смотря на Ангару не думаю, что оно осталось.

          И, если честно, я еще не разу не видел, чтобы при разработке нового изделия (а я сейчас говорю про разные отрасли) с новыми характеристиками ТЗ не переписывалось и не дополнялось по ходу.


          1. UstasAlex
            22.12.2022 18:14

            Ну, Ангара отдельная песня. За время ее разработки там сама идеология несколько раз поменялась.

            А то, что корректируется ТЗ, да. Но это всегда утверждается заказчиком и, естественно, учитывается при разработке и отработке. И заказчик всегда отслеживает именно последний вариант.


      1. UstasAlex
        22.12.2022 18:09

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


        1. DancingOnWater Автор
          22.12.2022 18:21

          Такое, естественно есть, но вот в чем дело: ракете с неисправным прибором лететь недолго, да и задача всего одна, как-никак выполнить можно. А вот спутнику нужно жить долго и решать много задач. То что вы описывает упрощенной режим управления у нас это переход в безопасный режим. Но во многих ситуациях борт может сам проанализировать причину сбоя и выйти из безопасного режима и выполнить-таки задачу


          1. UstasAlex
            22.12.2022 18:32

            Не очень представляю как борт может определить причину сбоя. Например, это ТЗЧ или некондиционные комплектующие. Ну, и если это действительно сбой, то все само восстанавливается. В крайнем случае при перезагрузке. Для этого причину и знать не обязательно.


            1. DancingOnWater Автор
              22.12.2022 19:03

              Телеметрия сейчас обширна, можно многое понять.

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


      1. UstasAlex
        22.12.2022 18:17

        Кстати, есди я правидьно понял, то смысл вашей идеи в формализации обратной связи. От результатов испытаний и экспдуатации до исходной модели.


        1. DancingOnWater Автор
          22.12.2022 18:25

          Не скажу, что это идея, скорее это желание


          1. UstasAlex
            22.12.2022 18:37

            В этом случае сразу возникает вопрос про поддержание нескольких веток системы. Потому что есть задел, особенно если переходить на конвеерное производство. Плюс поддержка уже функционирующих КА. При этом система должна определять в какую ветку можно и нужно вносить изменения, а в какие нельзя.


            1. DancingOnWater Автор
              22.12.2022 19:07

              Очень хороший вопрос, но я что-то подобное делал. И мой опыт говорит,
              что здесь в первую очередь играет проработанность идеологии изделия.


              1. UstasAlex
                22.12.2022 19:32

                Согласен. К сожалению, такого я почти не видел. Кстати, это одна из причин таких жутких сроков разработки.


  1. DancingOnWater Автор
    22.12.2022 19:06

    Удалено.Промазал с веткой