OpenStackエンジニアに育つにはどうすればよいの？

# 発端

同僚がマネージャーの立場からこんな記事(「[OpenStackエンジニアを育てるにはどうすればよいの？](http://qiita.com/nobuyaiwao/items/813b7ce617af43b60542)」)を書いたので、返歌というわけではありませんが(笑)、**ふつうの**現場の一エンジニアの立場から書いてみたいと思います。

# 理解して使いましょう

お客様対応をしていても「どうすればOpenStackの構築・運用ができるようになりますか？」と聞かれることがあります。

こういう時、私は**「理解して使いましょう」**と答えることにしています。

# 無理？

これって無理なことでしょうか？

私はそうは思いません。

根拠はたくさんありますが、たとえば以下の2点を挙げたいと思います。

* OpenStackも、実は普通の多層Webシステムと大差ない
* OpenStackも原則OSSで構成されており、一般的なOSSで構築されたシステムを取り扱うのと大差ない

「大差ない」とは書きましたが、通常のLAMP型のWebサービス(等)と比べると、OpenStackで扱われている技術の幅が広いのは確かです。
しかし、個々の技術領域については、それほど高度なことをやっているわけではありません。ここは逆に考えて、**OpenStackに取り組むということは、自分の技術の幅を広げるチャンス**と考えるべきです。

# どうすればいいのか？

さて、ではどうすればよいのか？

こういう話をしていると、後述するような比較的古典的な、学問に取り組む姿勢のような話をすることが多いです。しかし、現場のエンジニア(肩書きは、多くの場合(インフラ系)SE)と話をしていて、最近強く感じるのは、やはり

**未知なものに対する抵抗感、あるいは拒否感(のようなもの)を打ち破る**

これが大きいように思います。
ある意味、「OpenStackってなんだかよくわからないし難しそう」というバイアスを捨てることが一番重要なのかもしれません。

## ソースコードに接するのは無理なことか？

まず、ちょっと極端な話(?)からします。
OpenStackもオープンソースなわけですが、ソースコードを読む、あるいは修正するという話をすると拒絶モードに入ってしまう人がすごく多いように思います。
私の場合は、ソフト開発出身のせいでソースコードに接する抵抗感がないのかもしれません。しかし、(インフラ系)SEとして出発した人も、要件にしたがった手順を自分で考えてスクリプト化（＝コード化）するというような作業は日常的に行っていると思います。ちょっと進んだ取り組みをしている人であれば、適当なDSLを用いたインフラのコード化にとりくんでいるかもしれません。
ソフト開発とインフラ系SEの両方を経験した立場からは、**大差ない**と思います。

## 自分の領域から踏み出すのは無理なことか？

もう一点、こちらはとても**ふつう**の話です。:)
これまでは、サーバ系SE、ネットワーク系SE、ストレージ系SE、データベース系SE等と、roleも細分化されてきたというのが実情だと思います。

たとえば、私はOS開発出身ということもあり、インフラ系の中でもサーバ系を中心に取り扱ってきました。責任分介点としては、例えば

* 自分の担当のサーバ/OSと、その上で動いているDBの間
* 自分の担当のサーバと、それらをつないでいるネットワークの間

というようなところでした。

しかし、実際に問題になるのは**システム**です。
もう10年近く前の話になりますが、私はサービスイン後の商用システムで発生したトラブルの一次きりわけ作業選任のチームに所属していたことがあります。
この当時、痛感したのは、上記のような細分化されたroleの中だけで仕事をしていても、目の前でトラブっているシステムの問題は解決しないということです。
自分の(主)担当がサーバだとはいえ、たとえば

* サーバつなぐネットワークがどう構成されてどう動いているのか？
* サーバの上で動いているDBがどう作成されていて、どんなSQLをどう処理しているのか？

等々、全体の構造や動きを理解しつつ掘り下げていかなければトラブルは解決しないのです。

トラブルの例は少し極端かもしれません。
しかし、システムの構築や運用という観点でも、同じように当てはまる話だと思います。

したがって、**自分の領域から踏み出す必要がある**のです。そして、前述の通り、OpenStackで使われている個々の技術要素は、それほど高度なものではありません。**十分キャッチアップしていける範囲の話**だと思います。

前のほうでも「OpenStackに取り組むということは、自分の技術の幅を広げるチャンス」と書きましたが、この意味で2012年(!!)の日本OpenStackユーザ会会長(当時)の中島**怪鳥**によるプレゼンを紹介しておきたいと思います。これ、必読です。:)

[OSC.Cloud 2012 インフラエンジニアがOpenStackを学ぶべきたった一つの理由](http://www.slideshare.net/irix_jp/osc2012-15658447)

なお、手前味噌ですが、トラブルシューティング時の心得については、以下のスライド31以降もどうぞ。 :)

http://www.slideshare.net/thatsdone/openstack-days-tokyo-2016-hpe-presentation/31


## OpenStack ってどんなもの？

思わず熱くなって、ここまでだいぶ長くなってしまいました(笑)

さて、OpenStack とはどんなものなのか？
簡単に言えば

* APIを受け付けて
* APIの意味にしたがってリソースを制御(作成、削除、更新等)する

これだけのシステムです。

なので、「なんだかよくわからない」とは言わず、とりあえずとりくんでみましょう。

## とりくみの姿勢(その1) : 触ってみる

絶対の正解はないと思いますが、私の場合は自分の手で動かしてみるのが一番納得しやすいので、[同僚の記事](http://qiita.com/nobuyaiwao/items/813b7ce617af43b60542)で言うところの｢[触る](http://qiita.com/nobuyaiwao/items/813b7ce617af43b60542#%E8%A7%A6%E3%82%8B)｣から入ることが多いです。

こんな感じ。

* とりあえず手を動かしてみる
    * ただし、自分の頭で考えながら手を動かすのを忘れないこと
    * 私は devstack か packstack を使うことが多いですが、主要なdistroであれば[上流のドキュメント](http://docs.openstack.org/project-install-guide/newton/)もよく整備されています。(このリンクはNewtonの場合)
* うまくいったら共有する(日本語でOK)

うまくいかない場合は、こんな感じでしょうか。

* 一次情報(通常は英語)にあたる
* 動きを追ってみる
    * まずは各種ログ
* 問題をみつけたら報告する
* 回避策がわかったら(できればupstreamに)共有する
* 必要ならソースを読む
* 直し方がわかったら直してupstreamにcontributeする



## とりくみの姿勢(その2) : 読む

一方、触ってみるためには準備も必要ですし、時間も有限です。

したがって、同じく同僚の記事で言うところの「[読む](http://qiita.com/nobuyaiwao/items/813b7ce617af43b60542#%E8%AA%AD%E3%82%80)」ことから入るのもよいでしょう。

以下、動かしながら理解すべきことと共通しますが、私は以下にあげるような視点から把握していきます。ざっくり、アーキテクチャを理解するところからはじめるということです。

* 静的な構造を理解する
    * 構造と構造の間のインターフェースは特に重要です
        * REST API とかRPCとか
* 動的な構造を理解する
    * 言い換えれば、処理フローのことです
* 動的/静的な構造共通に、大域的なことがらから、順次必要に応じて局所的なことがらへ深めていきます

これって特殊なことでしょうか？そうではないですよね。
冒頭で「比較的古典的な...」と書いたのはこういうことです。

## 勉強すべきことたち

そういうわけで、(自戒をこめて書きますが)勉強重要です。

新しいものをキャッチアップしていくのは確かに重要だと思います。
しかし、本質を逃さない程度にほどほどに追いかけておくのが最低ラインだと、私は思います。

むしろ、古くて枯れてはいるが、基本的な技術をおさえておくほうが重要だと思います。
列挙していけばきりがありませんが、こんな感じ。

* OS
* DB
* Network
* Hardware
* Virutalization
* Security
   * AuthN/AuthZ
   * SSL/TLS
* Messaging Queue

さらっと書きましたが、これだけでもたくさんありますね。
しかも、それぞれ突き詰めはじめると奥が深いです。

こういう場合にどうするか？ですが、現在はネット上に情報があふれていますので、必要に応じて自分の弱いところを補強していくのもよいでしょう。
ただ、若い人には、教科書を通読することを薦めています。特に、本屋さんで何冊かながめてみて、自分が読みやすそうな(≒あまり厚すぎない)教科書を(分野ごとに)一冊決めて、最後まで読み通すのが良いと思います。やはり、その筋の第一人者の方々が考え抜いて書き上げた教科書からは、個々の詳細トピックだけでなく、何よりも全体の構成から学ぶべきところが多いように思うのです。
なお、特にOSの本は一冊通読しておくと、後々応用がきくと思います。

# まとめ

だいぶ長くなってしまいましたが、ここまでお読みいただき、ありがとうございます。「これをやれば大丈夫」という具体的な話ではなくてごめんなさい。でも、考え方って重要だと思います。

* OpenStackは難しくありません。多少範囲が広いだけです。
* 自分の領域をひろげてみましょう。OpenStackは絶好の素材です。
* 触ってみる/勉強してみるにあたって、視野を広くもちましょう。
* 日々是勉強です(自戒をこめて)

# 補足

この記事では、新しいことにキャッチアップし続けるよりも、古くても基本的な事項をおさえることに重点をおいていることがわかると思います。ただ、これまで～この先数年は、あらゆる面で考え方自体を変えていかざるをえない時代です。生き残っていくために大変ではありますが、逆にとても面白い時代に現役生活をおくることができてラッキーと言えるのではないかと思います。
楽しみましょう！ :)