見出し画像

どこまで理解できているかを理解する

牛尾さんの書いたnoteがとても理解できたので、それにまつわる話を書いてみる。

先日とあるDiscord上で以下のような話題が上がった。

ある抗生物質がその対象としている症状に対しては効果があるけれど、ウィルスに関しては効果が無いと効かれたら、それはYESと回答できる。しかし、なぜ効果が無いのかを問われると答えられる人は少ない。

つまり、何が起こるのかはわかっているのだけれど、それがどのようにして起きているのかはわかっていないことがある、ということだ。これは普段自分たちが身の回りにあるもの殆どで言えることだと思う。なぜインターネットが繋がるのか、あるOSのために書かれたソフトウェアが別のOSだとそのまま実行できない、とか普段利用している技術についても沢山ある。知らなくてもその技術を利用することはできるので、恩恵を受けられる。

自分は理解することを次の3段階で考えている。まず、使い方を理解すること、次にその仕組みを理解すること、そしてその仕組みの作り方を理解すること。

最高にロックをする - 使い方を理解する

1つ目の使い方を理解することは、その字面通りで、技術を使えるということ。例えば、プログラミングで何らかのAPIを理解しようとするとき、何を入力したらどんな出力が返ってくるのかを知る段階とも言える。ドキュメントを読んだり、実際に動かしてみたりすることで理解を深めることができる。この段階だと、使っているものに不具合らしきものが起きたとしても、それを直すことは難しい。いくつか入力を試していくと、新しい入力に対してどういう出力が返ってくるのかがだんだんとわかってくる。しかし、そこに期待しなかった出力が返ってくると、それを変えることはできない。そういう時は、そういうものだと受け入れるか、不具合と思っても直せないので、バグとして報告したりする。

全てにおいて仕組みを理解しないといけないということではなく、理解していないこと、そして理解していなければいけないところはどこかを把握できていると良いと思う。

画像1

上手く使いこなせるようになるにも時間がかかかる。最高のロックをやるためにこのロックミュージシャンが必要なことはなんだろうか。彼は機材の仕組みを理解することなく、それを扱うことで最高の演奏ができれば良いはずだ。しかし、もし機材が期待した通りの機能が無かったり、不具合が起きた場合はどうしたらいいのだろうか。

仕組みを理解する

次の段階は、仕組みを理解すること。利用しているものがどういった原理で動いているのかを理解することだ。ソフトウェアでいえば、実際にソースコードや仕組みに関するドキュメントを読んだりして理解することなどだろうか。上で、「理解しなければいけないところはどこかを把握できると良い」と書いた。それがどういう時かというと、対象としている技術をより使いこなしたい場合だと思っている。例えば、Ruby on Railsというウェブアプリケーションのフレームワークで何かウェブアプリケーションを開発しているとする。そのときに、HTTPリクエストの事前処理したい場合、RailsでHTTPリクエストをどう扱っているのかを理解する必要が出てくるだろう。

最近ではOSSを利用してソフトウェアを開発する場合が多いので、仕組みを理解したくなったときにそこに手を出しやすい環境ではあると思う。勝手に書き換えることなどなければ権利的にソースコードを見ることは問題無い。テストコードがあればそれを使って動作を確認したり、実験もできる。

仕組みを理解したい動機は、上の例のように何か処理に一手間加えたいといった動機だけではない。ただ単純にどういう仕組なのか見てみたいという動機もある。そういった好奇心からソースコードを読んでいくと色々な発見があるので個人的にはワクワクする。

昨年中頃から参加している読書会でそういった話が扱われていて、いつもアタマから変な汗が出まくっている。

仕組みの作り方を理解する

最後に、仕組みの作り方を理解すること。これは自分は全然できていなくて、理解したいと思っていることである。使用しているOSSのソースコードを興味本位で読むことはある。いつも使っているメソッドだったり、READMEの手順で出てくる設定あたりなどからたどっていいき、色々読んでいく中でどのファイルに何が書いてあるかがだいたい把握できるようになっていく。けれど、なぜそのように作られているのかということを理解できない。自分が同じようなものを作ろうとしたら、同じようになるのだろうか。多分そうならない、と思うことが多い。いわゆる設計やデザインパターンといったテクニックの話ではあると思ってはいる。コードの構造からどういったパターンが使われているのかがわかったりするけれど、なぜそのようになっているのかの理解に到達することは難しく感じている。おそらくなのだけれど、どう使われるのかというものを理解する必要があると思っている。

終わりに

と、とりとめのない話を書いてしまいました。ソフトウェア開発に限らないことだとは思いますが、自分が扱っていることについて、自分がどこまで理解しているのかを把握していて、その先を更に深く掘っていけるのかどうかということを考えておくことが大切なのかな、と思っています。上でも書きましたがOSSを利用することが当たり前になっていますし、ソースコードを入手するのも手軽になってきています。なので、何かを知ろうとする場合の手がかりがすぐ目の前にある状況です。ソースコード全部をまるまるっと読まなければ行けないわけではありませんし(時間は有限なので)、必要なところを雰囲気だけ眺めるといっただけでもいいですし、知りたい部分のコードを見ながら、その部分の動作を検証するコードを書いたりなど理解するための方法も沢山あります。もし、ぼんやりと理解できていなくて不便を感じたりしていれば、そのソースをチラッと見てみるところから始めてみてはどうでしょうか。


最後まで読んでいただきありがとうございます! サポートで頂いたお金は、技術書の購入や勉強会参加費など勉強に使わせていただきます!