質問思考：自分にとっての新しい技術を効率的に学ぶ方法

# 要約
- 自分にとって新しい技術を学ぶときに、単に参考書を買って始めから終わりまで読む、ではなくもっと効率的なやり方がある。
- そのやり方は、その技術に対する質問を自分なりに作ってみて、自分で回答していくことである。
- なぜその技術を学ぶのか、根本的な問いから始まり、技術習得の時間の短縮にもなる。
- 「人に話すこと」は自分の理解を深める意味でも非常に重要な要素。話す場・書く場を設けよう。

# どんどん新しい技術が出て取り残され・・・

昨今どんどん新しい技術が出てきます。私は取り残されているうちの一人です。取り残されているのは私だけなら良いのですが、おそらく私だけではないのではないでしょうか。

例えば、Gitを本番環境で使ってません。もちろんRuby on Railsの勉強とかはチュートリアルでしましたよ。そのときにGit触りました。GitHubも製品開発で使ってないなぁー。ちょっと怖いな。SVNはとある製品で日米欧でのブランチ戦略とか練ってたんですけどね。WindowsのHyper-vは本番環境で使ってましたがDocker触ってないなー。もちろん勉強はしましたよ。でも今、何もみないでDockerを扱えるかといったらそんなことはないレベル。

まぁ、　　　　
取り残されている訳です。ちなみに1980年生まれ。

時代は進み、技術は進歩していきますので、学ばないわけにはいきません。
年をとってくると、守るべきものも増えてくる方もいると思います。なかなか自分の時間も確保しづらくなってきます。
時間は減るけど、学ぶものは減らない。むしろ増えていく。
要は、**時間を効率的に使う**しかないんですね。

ここでは、効率的な学び方として**「質問思考」**というものを提案させてください。

# 課題（困っていること）を明確にし、なんのための技術なのか考える

体系立てて何かを学ぼうとすると途方も無い時間がかかります。基本的に、新技術は、なにか課題があってそれを克服するために出てくることが多ので、まず課題を確実に把握する必要があります。その課題に対するソリューションとして新技術があると。
技術書は分厚いので、よほど好きな人しか読みきれないと思います。昨今はWEB上のチュートリアルも充実していますが、目的意識が低いと眠くなりますよね。このあたり、課題を明確にしていないと眠くなると思います。
技術書は購入するけど、積読になっちゃうこともままありますよね。それはなんとなく買っておかないとやばいし、学ぶ必要があることはわかってるんだけど、どうにも重い腰が上がらないというときです。何が足りないか、課題意識が足りないと思います。なぜその技術を学ぶ必要があるのか。それがあると何が良いのか、を


何を持ってその技術を理解した、と言えるのかは非常に難しいですよね。外部から認められるには資格を取るのが手っ取り早いかも知れないが、面倒臭いです。
私のように面倒くさがりで時間も確保できず、新技術を試す環境もお金がないため用意できない（例えば、デスクトップのWindows10 homeしか持ってない)、うだつの上がらない人間が新技術を効率的にマスターするにはどうすればよいのでしょうか。

# 質問思考  -自分に対して”問い”を出す-

このような場合は、**自分なりに自分自身に、その技術に対する問いを立てるのか良い**です。そんなに難しいことではないのですが、質問・課題を明確にして、それに対して答えるようにしていくのです。
例えば、Dockerであれば以下のような問いに、「何も見ずにスラスラと口頭で即答」できれば、概要は理解しており、腹に落ちている、と言っていいと思います。

|  自分への問い | 回答例 |
| --- | --- |
|  なぜDockerが必要なのですか？ | Dockerはコンテナを活用した仮想化技術です。Dockerを利用することにより、開発環境・本番環境における、環境の統一、コンテナの入れ替え、ロールバックなどが非常に簡単にできるようになります。<br/>これまで手順書を用意して逐次手順を間違わないようにしていた環境構築が、コマンド一発でできるようになります。また、環境もDockerfileと言われる設定ファイルに記載しておくことにより、<br/>その環境が設定ファイルに記載された通りに再現できます。設定ファイルをソースコードの一部とみなすことによって、履歴管理もできますし、なによりポータビリティがあがります。<br/>まるっというと、開発・運用者の生産性があがります。よりユーザ価値に時間を割けるようになります。 |
|  Dockerとは何ですか？ | Dockerとはコンテナを活用した仮想化技術を実現するためのシステム・アプリケーションです。コンテナを操作するためのインターフェースも持っています。<br/>Dockerはアプリケーションのデプロイに特化しています。 |
|  コンテナとは何ですか？ | コンテナは、アプリケーションの分離された空間という概念です。あるOSの上でアプリケーションが分離された空間があり、その空間の中で別のOSを動かしたり、<br/>サーバやDBを動かしたり、アプリケーションを動かしたりできます。 |
|  仮想化とは何ですか？ | 物理的な1台のコンピュータ上で、複数の仮想的なOSを運用することを「仮想化」といいます。コンピュータのリソースを抽象化することになります。 |
|  Dockerはどのようなプロダクトですか？ | どのような、とは具体的にどのようなことが知りたいのですか？　・・・と聞き返したくなっちゃう（笑<br/>Dockerはコンテナ型仮想化技術を実現するために実行される常駐アプリケーションと、そのアプリを操作するためのコマンドラインインターフェースから成るプロダクトです。 |
|  Dockerの得意とすることは何ですか？ | ローカル環境でDockerのインストール・セットアップが済んでいれば、Dockerfileとコマンドを叩くだけで、環境構築ができます。<br/>環境構築が得意です。<br/>開発環境のみならず、本番環境でも多く使われています。<br/>以下は一例です。Dockerを使うと以下のようなことがやりやすくなります。Dockerやコンテナを使わないと、すごい大変なのよ。<br/>・インストールに癖があるコマンドラインツールをDockerコンテナとして入手し、ホストを汚さず即座に実行する。<br/>・依存する様々なライブラリやツールをDockerコンテナに同梱して配布することで、実行環境を問わず、高い動作再現性を持つスクリプトを実現する。<br/>・HTTP負荷テストでworkderをDockerコンテナとして用意して、HTTPリクエスト数を上げる。 |
|  Dockerの苦手なところは何ですか？ | Dockerは完全な仮想化を提供するものではないです。<br/>なので、特別な事情があり、例えばLinuxOSほとんど完璧再現したいのであれば、Virutal Boxなどの仮想化環境か、自分でLinuxマシンを構築する必要があります。 |
|  Dockerは何を解決してくれるのですか？ | 環境構築にかかる手順・手間がだいぶ減ります。大幅な時間の節約になります。<br/>環境自体を定義ファイルに記載できるので、その環境の再現性が大幅に増します。<br/>アプリケーションと実行環境を同梱して配ることができます。環境差異により動作しない、などの本質的ではないところでの困り事が減ります。 |
|  Dockerは無料ですか？有料ですか？ | Dockerには、DockerCEとDockerEEという２つのエディションがあります。<br/>DockerCEは無料で、EEは有料です。<br/>CEは、Windows10 Pro、Mac、AzureやAWS上で動作します。 CentOS, Debian, Fedora, Ubuntuでも動作します。<br/>EEは、Red Hat Enterprise Linux (RHEL), SUSE Linux Enterprise Server (SLES), Oracle Linux, Ubuntu, Windows Server 2016, AzureやAWS上でも動作します。<br/>EEではサポートがつきます。 |
|  Dockerはどのような環境で動作可能ですか？ | CEとEEで異なりますが、「Dockerは無料ですか？有料ですか？」の回答を御覧ください。 |
|  Dockerのメリットは何ですか？ | Dockerは何を解決してくれるのですか？の回答をご覧ください。<br/>加えて、Dockerは仮想化と比べると軽いです。<br/>Dockerコンテナはホストマシンのカーネルを利用したまま、名前空間(namespace)の分離やcgroupsを用いた制御によって独立したOSのような環境を実現しています。そのため、ゲストOSの<br/>起動を待つ必要がないので、プロセスの高速な起動と停止が可能になります。 |
|  Dockerのデメリットは何ですか？ | デメリットになるかわかりませんが、コンテナの土台となるOSは、同じOSじゃないと動作できません。<br/>つまり、ホストOSがWindowsで、コンテナがLinuxだと、コンテナはホストのLinuxカーネルが利用できないので、動作しません。<br/>逆も同じです。<br/><br/>Dockerにするデメリットってあんまりない気がする。強いて言えばDockerを学ぶコストがかかるくらい？ |
|  Dockerはどのような仕組みで動いているのですか？ | コンテナを分離するところは、Linuxの名前空間(namespace)の分離やcgroupsの仕組みを利用して実現されています。<br/>名前空間をつかって、コンテナの独立性を担保しています。<br/>IPC名前空間：異なる名前空間の共有メモリやセマフォにアクセスできないようにする。<br/>マウント名前空間：ファイルシステムツリーを分離する。異なる名前空間のファイルシステムにアクセスできないようにする。全てのユーザースペースはDockerイメージからマウントされる。chroot は使用しない。<br/>ネットワーク名前空間：ネットワークデバイスやIPアドレス、ルーティングテーブルなどのネットワークインタフェースを分離する。異なる名前空間でそれぞれ仮想ネットワークを構築することができる。<br/>PID名前空間：PID(プロセスID)空間を分離する。異なる名前空間で同じPIDのプロセスを作ることができる。<br/>ユーザー名前空間：UID/GIDを分離する。異なる名前空間で同じUIDのユーザーを作ることができ、root(UID=0)を名前空間外で操作の特権(root権限)を持たないようにセキュリティを設定する。<br/>UTS名前空間：uname() システムコールから返される2つのシステム識別子(nodename および domainname)を分離する。これにより各コンテナはそれぞれ独自のホスト名とNISドメイン名を持つことができる。<br/>参考：https://qiita.com/wellflat/items/7d62f2a63e9fcddb31cc<br/><br/>cgroupsはcontrol groupsで、プロセスをグルーピングして、そのグルーピングした単位で、CPUやメモリ、ディスクIOの利用率を制限することができます。<br/>（あーそうか、Oracleはこれを利用してCPU制限してたんだ。Windowsもできるのかな。Windows上で動作するOracleでもリソース制限できてたから何かしらできるはず）<br/>コンテナ単位でのリソース制限はcgroupsを使ってます。 |
|  Dockerはどのように使うのですか？ | Dockerコマンドを利用します。 |
|  Dockerfileとは何ですか？ | Docker上で動作させるコンテナの構成情報を記述するためのファイルです。 |
|  ・・・ |  |

Dockerを使いこなしている方にとっては当たり前の質問かも知れませんが、その当たり前のところを自分なりに深ぼった質問にして、その質問に対して回答することによって、理解が増します。

# 質問の出し方
質問の出し方ですが、新しい技術を仕事で使う場合は、たいていの場合はチームメイトや組織に説明が必要になると思います。このときにメンバーやマネージャーからでる質問を想定して、質問自体を考えると良いと思います。費用対効果は？とか（笑

**この質問に答えるため**に、書籍を読んだり、WEBを漁ったり、チュートリアルで実際にシステムを動作させてみたりするとよいです。すべては質問に答えるため。こうすると、課題感が明確になり、身になります。時間を効率的に使えます。
ただ単に技術書やWEBの記事を始めから終わりまで読んだり、チュートリアルを全コンプリートするのは、ほとんどの場合身につかないと思います。（すぐ忘れちゃう）

仕事で新技術を使う際には、説明が必要になりますよね。
人は、「説明すること」によって自分自身への理解と、何が足りていないかの認識が深まっていきます。
よって、説明する場数を踏むと自分自身への理解も速くなります。ただし、実際に現場に入っていない場合、この方式が取りづらいですよね。
壁打ち相手になってくれる人がいないので。非エンジニアの旦那・奥さん、彼氏・彼女にDockerの話をしても、3秒以内にそっぽを向かれると思います。私にはできません。

# とにかく話す。話せないなら、書いて読んでもらう

ちょっとした休憩の場や、飲み会でもいいので、（私は吸わないですが）喫煙ルームでも、人に話しをする機会が多いのは良いことですね。そこで、その技術について話をしましょう。新しい技術について、自分なりの理解を伝える。まったく反応がないかも知れませんが、話すことによって理解は深まるはずです。
最近は技術系コミュニティも活発だと思いますので、コミュニティなどでは恥ずかしがらず、（登壇するという意味ではなく。もちろん登壇するとそれなりの勉強が必要なので、理解が深まるチャンスを得たと思えます）どんどん話をすると良いと思います。間違っていてもいいと思います。間違いをどんどん指摘してもらって、改善していけばいいと思います。
（また、指摘してもらえないコミュニティはあまり意味がないかも知れません）

間違っていてもいいから、とにかく話をして、もしどうしても話が苦手なら、書きましょう。（書いたら周知して、読んでもらいフィードバックをもらいましょう）