Программисты из SpaceX отвечают на вопросы про разработку

На Reddit есть инте­рес­ный тред, где про­грам­ми­сты из SpaceX отве­ча­ют на любые вопро­сы поль­зо­ва­те­лей. SpaceX — это та ком­па­ния, кото­рая постро­и­ла раке­ты Falcon и кораб­ли серии Dragon, а совсем недав­но запу­сти­ла пер­вый в сво­ей исто­рии пило­ти­ру­е­мый корабль с эки­па­жем.

Вот они собра­лись на Reddit, что­бы поот­ве­чать на вопро­сы, а мы пере­ве­ли самое важ­ное. Если вы зна­е­те англий­ский — почи­тай­те в ори­ги­на­ле, там мно­го инте­рес­но­го.

На каком языке написана большая часть кода для ракет и корабля?

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

Расскажите о своём стеке

Весь софт, кото­рый отве­ча­ет за сам полёт, мы пишем на C и C++, для выво­да инфор­ма­ции на экра­ны мы исполь­зу­ем HTML, JavaScript и CSS. Python нам нужен для тестов. А ещё мы исполь­зу­ем стан­дарт­ные веб-компоненты. Всё про­сто.

Мы знаем, что весь интерфейс на мониторах в Crew Dragon отображается с помощью движка Chromium и JavaScript. А кроме этого вы используете какие-то библиотеки и компоненты, и если да — то какие?

Да, мы исполь­зу­ем тот же Chromium, кото­рый лежит в осно­ве бра­у­зе­ра Chrome, ещё есть соб­ствен­ные биб­лио­те­ки. При этом важ­но пони­мать, что мы исполь­зу­ем Chromium толь­ко как дви­жок для отоб­ра­же­ния интер­фей­са на экра­нах. То, что мы выво­дим на мони­то­ры, никак не вли­я­ет на сам полёт и отка­зо­устой­чи­вость систе­мы.

Тем не менее у нас один и тот же про­цесс раз­ра­бот­ки любо­го кода, неза­ви­си­мо от его при­ме­не­ния и язы­ка про­грам­ми­ро­ва­ния. Мы парал­лель­но учим наших раз­ра­бот­чи­ков писать код для дви­га­те­ля на язы­ке C++ и при­дер­жи­вать­ся того же под­хо­да к надёж­но­сти во всех про­ек­тах.

Вооб­ще этот про­ект начи­нал­ся как симу­ля­тор полё­тов для NASA, что­бы пока­зать, как ещё может выгля­деть полёт­ный интер­фейс. Потом мы попро­бо­ва­ли запу­стить его на насто­я­щем обо­ру­до­ва­нии, кото­рое ста­вят в кос­ми­че­ские кораб­ли, и там наш интер­фейс тоже отлич­но рабо­тал.

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


Немно­го интер­фей­са из инте­рье­ра кораб­ля Dragon

Как работает система безопасности полёта?

За эту систе­му отве­ча­ет спе­ци­аль­ный набор чипов, кото­рый рабо­та­ет неза­ви­си­мо от основ­но­го ком­пью­те­ра. Эти чипы напря­мую полу­ча­ют и сиг­на­лы с основ­ных дат­чи­ков, и дан­ные с бор­то­во­го ком­пью­те­ра. Если они пой­мут, что раке­та летит не туда, теря­ет ско­рость или будет что-то подоб­ное, то эта систе­ма сра­зу закон­чит полёт и поста­ра­ет­ся поса­дить раке­ту на Зем­лю.

Как вы отслеживаете и исправляете ошибки, которые возникают во время полёта?

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

Что будет, если во время полёта что-то пойдёт не по плану — например, если откажут двигатели или что-то подобное?

Что­бы исклю­чить любую непред­ви­ден­ную ситу­а­цию, мы почти всё, что мож­но, ста­вим в трой­ном объ­ё­ме — дат­чи­ки, при­во­ды, мик­ро­схе­мы и всё осталь­ное. Даже если в полё­те сло­ма­ет­ся один или даже два из них, систе­ма будет рабо­тать как обыч­но.

Наши кос­ми­че­ские кораб­ли спро­ек­ти­ро­ва­ны так, что им не стра­шен даже отказ одно­го из дви­га­те­лей или меха­низ­мов управ­ле­ния — их ком­пен­си­ру­ют алго­рит­мы, кото­рые пере­рас­пре­де­лят нагруз­ку. Кро­ме того, у нас есть отдель­ные алго­рит­мы для обра­бот­ки дей­стви­тель­но кри­ти­че­ских ситу­а­ций. Напри­мер, Crew Dragon может сам пре­рвать полёт и при­зем­лить­ся обрат­но, если сбой в рабо­те будет слиш­ком боль­шим.


Ещё немно­го интер­фей­са из кораб­ля Dragon

SpaceX использует искусственный интеллект внутри своего ПО?

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

Если я ещё учусь в школе, что мне нужно сделать, чтобы когда-нибудь прийти к вам работать программистом?

Полу­чи­те про­филь­ное обра­зо­ва­ние или по-настоящему заин­те­ре­суй­тесь ком­пью­те­ра­ми. Най­ди­те вре­мя, что­бы разо­брать­ся в том, как всё рабо­та­ет. Наши инже­не­ры, кото­рые рабо­та­ют в SpaceX, отлич­но раз­би­ра­ют­ся в том, как рабо­та­ет их код, как устро­е­на сеть, зачем нужен Linux, раз­би­ра­ют­ся в желе­зе и так далее. Отлич­ный вари­ант — лич­ные про­ек­ты или ста­жи­ров­ки в круп­ных ком­па­ни­ях, что­бы полу­чить опыт созда­ния ново­го и реше­ния слож­ных про­блем.

А вооб­ще что­бы раз­ра­ба­ты­вать ПО, нуж­но сосре­до­то­чить­ся на двух важ­ных вещах:

  • алго­рит­мы и струк­ту­ры дан­ных;
  • пони­ма­ние того, как ком­пью­тер рабо­та­ет на самых низ­ких уров­нях.

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

Какую версию Linux вы используете?

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

Что за процессор стоит в Crew Dragon? Я понимаю, что там их много из-за требований надёжности, но всё-таки? Он мощнее, чем, скажем, Intel i9 9900k?

Мы исполь­зу­ем рас­пре­де­лён­ный четы­рёхя­дер­ный про­цес­сор с про­из­во­ди­тель­но­стью как у теле­фо­на пяти­лет­ней дав­но­сти 🙂

Приведите пример нестандартной ситуации, которую нужно предусмотреть вам как разработчикам

О, класс­ный вопрос. Вооб­ще нам нуж­но преду­смот­реть всё 🙂

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

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