人工衛星開発から学んだエンジニアにとって重要なこと

こんにちは。フロムスクラッチでCTOを務めている井戸端です。

最近は、自分が手を動かして何かを実装するということがほぼなくなってきましたが、その分、ビジネスやプロダクト全体を見渡して開発を考えることが多くなってきました。

今日は、私自身の経験をもとに、エンジニアとはどうあるべきか、普段思っていることを書きたいと思います。


# 経歴
私はもともと情報系専門ではなく、大学時代は航空宇宙工学科という学科で、人工衛星の開発というちょっとマニアックなことをしていました。
![nj.jpeg](https://qiita-image-store.s3.amazonaws.com/0/110904/3947e472-2d16-d4a6-24d7-dd151ccbe904.jpeg)


人工衛星の開発というとイメージがつかないかもしれませんが、そんな人は[「宇宙兄弟」](https://www.amazon.co.jp/exec/obidos/ASIN/4063729397)を読んでみてください。訓練でローバーを開発するストーリーがあるんですが、実はあのイベントは実際に存在していて、私自身参加したことがあります。

![cansat.jpg](https://qiita-image-store.s3.amazonaws.com/0/110904/11cc5e4c-6353-5e90-2ef6-0abe32a05a25.jpeg)


ARLISSというイベントなので、宇宙開発に興味がある学生がもしこの記事を見ていたら、是非参加してみてください。めちゃくちゃ楽しいです。自分が参加したのは2010年で、「東京大学 Kids Town」というのが自分のチームになります。(この時の思い出についてはまたいつか…)
http://www.unisec.jp/history/arliss2010.html

大学卒業後思うところがありITコンサル系のSIerに就職し、金融系システムの開発に約3年携わった後、2014年に転職し今に至ります。

# 人工衛星の開発から学んだこと
学生時代の人工衛星開発を通じて、システムエンジニアリングというものについて多くを学ぶことができました。
今回は人工衛星開発の特徴を元に、自分が学んだことを紹介したいと思います。

人工衛星の特徴として、今回はこの3つ挙げたいと思います。

1. 前例がない
2. 宇宙空間で動作する
3. 非修理系である


## 前例がない ~未知の問題に立ち向かうために~
基本的に、人工衛星には1つとして同じものは存在しません。身近な例をとっても、下の表の様に達成すべきミッションが異なれば、衛星の設計から何から変わってきます。
極端に言うと"自動車"と"冷蔵庫"のように全く別物の開発をしていると言っても差し支えありません。

|衛星|種別|目的|
|----|----|----|
|ひまわり|気象衛星|地球表面上の雲や大気の状態の観測|
|GPS|測位衛星|受信者の位置の特定|
|かぐや|月周回衛星|月周辺空間の環境・計測|

### 
前例がないため、どこにも答えが存在せず、基本的に色々なものを１から考えて作ることが多くなります。

その時重要になってくるのが、と、 **キャッチアップ力** と **基礎理解力** だと思っています。

私の場合、衛星が撮影した画像を処理して蓄積する処理をVHDLで組むというのがあったのですが、全くVHDLを知らない状態から1ヶ月半ほどで実装する必要が生じ、何とか間に合わせたという経験がありました。

その時は、基本的な知識を本やWebから調べ、回路を組みながらあれこれ試して勘所を掴み、最終的に実装に落としていくというような事をしましたが、昨今テクノロジーの進化と変遷が激しくなる中で、未知の技術を学習して「使える」状態に持っていくための、 **自分なりのフレームワーク** を持っておくことが非常に重要であると思っています。
逆に言うと、何かした時に、常にそれを自分の中にフレームワークとして蓄積するという意識を持って取り組むことが重要だと思います。

また、汎用的な力を高めるために、CPU、メモリなどの構造やコンピュータが計算する仕組みなど、 **基礎となる知識** をしっかりと理解しておくことが更に重要になってきます。

## 宇宙空間で動作する ~困難な問題を解決するために~
人工衛星は当たり前ですが、宇宙空間で動作します。
宇宙空間は地球とは全く異なる環境で、真空、放射線、±100℃の温度変化...etc非常に過酷な環境です。

いざ試験をしようと思っても同じ環境を再現することが不可能ですし、極力同じ環境を再現するだけでも相当大変です。
完全な環境を整備することが難しいので、試験の手順も都度考える必要があります。
その為、1つ1つの試験の準備とその分析が非常に大事になってきます。

試験をする前に、以下のようなことをきちんとドキュメントにまとめた状態で臨みます。
準備が不十分では試験をしても得られた結果の妥当性を保証することができません。

- 試験の目的
- 実施方法、手順
- 環境準備 (※試験環境そのものを開発することもざらです)
- 結果取得方法
- 結果評価方法

また実施後は、更に以下の内容をドキュメントに整理してまとめます。

- 試験結果を分析結果
- 考察
    - 試験の目的に対して問題があるのかないのか
    - 問題ないとした根拠は何か等を

先に述べたように、環境や手順が確立しているものが殆どないため、1つ1つの試験について、 **本当に正しいのか** を常に自問自答し続ける必要があります。
また完全にはうまく行かなかった場合にも、 **事象を切り分け** 、どこまでうまく行っていてどこからがうまく行っていないのかを正確に把握して、 **次につなげていく** ことが重要になってきます。でなければ、いつまでたっても意味のない試験を繰り返すばかりになってしまいます。


## 非修理系である ~正しく開発するために~
人工衛星は、宇宙空間の周回軌道上で動作しているため、当然ですが一度起動したら手を加えることが出来ません。
なので壊れたり、想定外の事があったりすると、一発アウトです。

もちろん、どこかが壊れても大丈夫なように冗長系を組んだり、他で代替できるように作っておくことはしますが、それでも致命的な箇所が壊れたら終わりなことには変わりありません。
故障だけでなく、例えば、センサーから取得した値を元にアクチュエータの出力値を決めて姿勢制御を行っていますが、センサーやアクチュエータを補正するパラメータが少しずれているだけでも、ミッションを達成することができず、最悪衛星が死ぬこともあります。

その為、人工衛星の開発では、開発のステップを大きく3つに分けて、各ステップで設計→実装→試験を繰り返し、システムの信頼性を高めていきます。


最初のステップはBBM(Bread Board Model)です。人工衛星を大きく構造と電子回路に分けて開発をします。
構造側は打ち上げ時の衝撃や周回運動中の空気抵抗、熱伝導などを考慮して、衛星筐体の設計を行います。
電子回路側は、機器の選定を行って試作基盤を作り、電子部品の1つ1つから、電子回路の引き方などを決めていきます。
![bbm.jpeg](https://qiita-image-store.s3.amazonaws.com/0/110904/795bad20-cc14-f8e8-7160-7188efce3e0b.jpeg)

次のステップはEM(Engineering Model)です。いわゆる試作機で、BBMの結果を元に、構造と電子回路を合わせて1つの衛星として組み上げて試験をします。
ここでは全体を結合した状態での動作確認や性能試験、宇宙空間を模擬して実施する熱真空試験などを行います。
![em.jpeg](https://qiita-image-store.s3.amazonaws.com/0/110904/8561ba83-183e-8888-4c34-de02fcb39edf.jpeg)

最後のステップはFM(Flight Model)です。
これは実際に打ち上げる機体で、EMで試験をして改修した結果を元に制作し、長期運用試験など最終的な試験を実施します。

BBMからEM、EMからFMに移る際には、PDRとCDRという審査会があり、JAXAの方に来てもらって審査をしてもらったりしました。いわゆるウォーターフォール型の開発ですが、「あとで直せばいい」が一切効かない世界なので、これ以上ないほど手堅く進める必要があります。
![process.gif](https://qiita-image-store.s3.amazonaws.com/0/110904/3b53bcbc-6961-38cb-8ff9-d1a2179894f5.gif)

ウォーターフォールにせよアジャイルにせよ、他の開発手法にせよ、どのようなプロセスで開発を進めていくのかを理解し、 **採用している開発手法の要所** は何なのかをしっかりと抑えることが重要だと思っています。

# まとめ
まとめると、エンジニアにとって重要なことは以下のようなことだと思っています。

- 未知の問題に立ち向かうために
    - キャッチアップ力、基礎理解力
- 困難な問題を解決するために
    - 本質を問い続けること
    - 問題を適切に切り分けること
- 正しく開発するために
    - 開発プロセスを理解し、要点を抑える

エンジニアの主な役割は開発をすることではなく、 **技術で課題を解決すること** だと思っています。
更に言えば、数学や自然科学、その他理論を、現実の問題に落とし込んで、解決することが重要だと思っています。

これはITエンジニアにとっても変わりはなく、ただプログラムが書けるだけではエンジニアとは呼べません。
ITを用いて、どのような課題を解決するのか、その為のシステムをどのように構築するのか、きちんと考えて解決まで導ける人こそがエンジニアと呼ぶにふさわしいと考えています。

---
### 参考文献
- http://www.space.t.u-tokyo.ac.jp/nanojasmine/Index.htm
- [設計品質確保の思想　――航空宇宙エレクトロニクスに学ぶ「信頼性設計」 ｜Tech Village （テックビレッジ）　／　CQ出版株式会社](http://www.kumikomi.net/archives/2006/03/05qual.php?page=4)