На Reddit есть интересный тред, где программисты из SpaceX отвечают на любые вопросы пользователей. SpaceX — это та компания, которая построила ракеты Falcon и корабли серии Dragon, а совсем недавно запустила первый в своей истории пилотируемый корабль с экипажем.
Вот они собрались на Reddit, чтобы поотвечать на вопросы, а мы перевели самое важное. Если вы знаете английский — почитайте в оригинале, там много интересного.
На каком языке написана большая часть кода для ракет и корабля?
Весь софт, который должен работать автономно, написан на C++. Нам нравится объектно-ориентированный подход в C++, но при этом мы стараемся писать настолько простой код, насколько это вообще возможно. Ещё мы используем несколько библиотек с открытым исходным кодом, но у нас очень жёсткие требования к их качеству, поэтому нам проще написать свои библиотеки, где мы точно уверены в качестве кода.
Расскажите о своём стеке
Весь софт, который отвечает за сам полёт, мы пишем на C и C++, для вывода информации на экраны мы используем HTML, JavaScript и CSS. Python нам нужен для тестов. А ещё мы используем стандартные веб-компоненты. Всё просто.
Мы знаем, что весь интерфейс на мониторах в Crew Dragon отображается с помощью движка Chromium и JavaScript. А кроме этого вы используете какие-то библиотеки и компоненты, и если да — то какие?
Да, мы используем тот же Chromium, который лежит в основе браузера Chrome, ещё есть собственные библиотеки. При этом важно понимать, что мы используем Chromium только как движок для отображения интерфейса на экранах. То, что мы выводим на мониторы, никак не влияет на сам полёт и отказоустойчивость системы.
Тем не менее у нас один и тот же процесс разработки любого кода, независимо от его применения и языка программирования. Мы параллельно учим наших разработчиков писать код для двигателя на языке C++ и придерживаться того же подхода к надёжности во всех проектах.
Вообще этот проект начинался как симулятор полётов для NASA, чтобы показать, как ещё может выглядеть полётный интерфейс. Потом мы попробовали запустить его на настоящем оборудовании, которое ставят в космические корабли, и там наш интерфейс тоже отлично работал.
Нам нравятся все эти штуки, которые умеют современные браузеры, а ещё у нас работает много талантливых ребят. Мы не боимся делать что-то новое — нам нравится быть первыми в чём-то, даже если это не соответствует стандартам в отрасли.
Как работает система безопасности полёта?
За эту систему отвечает специальный набор чипов, который работает независимо от основного компьютера. Эти чипы напрямую получают и сигналы с основных датчиков, и данные с бортового компьютера. Если они поймут, что ракета летит не туда, теряет скорость или будет что-то подобное, то эта система сразу закончит полёт и постарается посадить ракету на Землю.
Как вы отслеживаете и исправляете ошибки, которые возникают во время полёта?
Здесь много нюансов. Ошибки, которые возникают от воздействия радиации на микросхемы и датчики, отслеживают несколько резервных компьютеров, а мы смотрим, что они показывают на выходе. Ошибки в датчиках решаются установкой разных дублирующих датчиков. Ошибки в передаче данных обрабатываются с помощью кодов обнаружения или исправления ошибок.
Что будет, если во время полёта что-то пойдёт не по плану — например, если откажут двигатели или что-то подобное?
Чтобы исключить любую непредвиденную ситуацию, мы почти всё, что можно, ставим в тройном объёме — датчики, приводы, микросхемы и всё остальное. Даже если в полёте сломается один или даже два из них, система будет работать как обычно.
Наши космические корабли спроектированы так, что им не страшен даже отказ одного из двигателей или механизмов управления — их компенсируют алгоритмы, которые перераспределят нагрузку. Кроме того, у нас есть отдельные алгоритмы для обработки действительно критических ситуаций. Например, Crew Dragon может сам прервать полёт и приземлиться обратно, если сбой в работе будет слишком большим.
SpaceX использует искусственный интеллект внутри своего ПО?
Нет, искусственного интеллекта у нас нет. Вместо этого корабль использует алгоритмы компьютерного зрения и распознавания, например, для ориентации в пространстве. Но кто знает, возможно, в новых космических кораблях мы поставим искусственный интеллект, чтобы он ими управлял :-)
Если я ещё учусь в школе, что мне нужно сделать, чтобы когда-нибудь прийти к вам работать программистом?
Получите профильное образование или по-настоящему заинтересуйтесь компьютерами. Найдите время, чтобы разобраться в том, как всё работает. Наши инженеры, которые работают в SpaceX, отлично разбираются в том, как работает их код, как устроена сеть, зачем нужен Linux, разбираются в железе и так далее. Отличный вариант — личные проекты или стажировки в крупных компаниях, чтобы получить опыт создания нового и решения сложных проблем.
А вообще чтобы разрабатывать ПО, нужно сосредоточиться на двух важных вещах:
- алгоритмы и структуры данных;
- понимание того, как компьютер работает на самых низких уровнях.
Даже если вы не будете регулярно копаться в драйверах устройств, сетевом стеке и сборке, то понимание того, как всё это сочетается, позволит вам решить любую проблему.
Какую версию Linux вы используете?
Мы не используем обычные версии Linux — мы взяли само ядро и немного переделали его под себя, чтобы получить лучшую производительность в режиме реального времени. Мы годами допиливали ядро, но это были очень маленькие изменения — строчка кода там, две тут. Единственное глобальное изменение — мы встроили в него свои драйвера для железа, чтобы работать с ним напрямую.
Что за процессор стоит в Crew Dragon? Я понимаю, что там их много из-за требований надёжности, но всё-таки? Он мощнее, чем, скажем, Intel i9 9900k?
Мы используем распределённый четырёхядерный процессор с производительностью как у телефона пятилетней давности :-)
Приведите пример нестандартной ситуации, которую нужно предусмотреть вам как разработчикам
О, классный вопрос. Вообще нам нужно предусмотреть всё :-)
Например, представьте, что у вас вдруг из-за радиации внезапно начал перезагружаться один из бортовых компьютеров. Это один из самых интересных случаев, для которого мы предусмотрели отдельный сценарий поведения алгоритма.
Или это может быть одновременный отказ нескольких подсистем, которые отвечают за навигацию, связь, жизнеобеспечение и двигатели. Отличный пример — катапультирование или пожар в кабине. За очень короткое время поступает много разных сигналов со всех датчиков, которые нужно как-то одновременно обработать и принять правильное решение.