みなさんこんにちは。オブジェクト指向と聞くと、自分からは最も遠い場所にある宝物の様な概念に思っている、まだまだ頭が固いプログラマーの端くれの小幡です。
今回の記事は、私のコーディング思想的な話がメインです。肌感が合わない、読んでいてイライラする可能性がありますので、そういった場合は読むのを中止される事をお薦めします。
さて突然ですが、映画『スターウォーズ』をご存知でしょうか?この映画でいう所の、マスター的な人(めっちゃ強い人)が私にはいまして、そのマスターが私にはフォースの素養(めっちゃ強いひとになるための才能)があるかないかもわからない状態で、様々な修行をさせてくれています。これには本当に感謝しています。
会社員としてのプログラマーはある意味で、どんな人の指示で仕事をするかでプログラマー人生が大きく左右されるのではないだろうか、と考えています。
というのも、その人の指示によってコーディングが大きく変化するからです。これはダークサイドに落ちる危険性も含んでいます。一歩間違えば、そのプログラマー人生を無駄にする可能性も十分にあるのではないだろうかとも思います。
そして私のマスターが言っていました。
「オブジェクト指向は皆の心のなかにある」と。
この記事を最後まで読んでも「オブジェクト指向」について理解が深まる可能性は低いです。ご注意ください。
「オブジェクト指向は皆の心のなかにある」とは?
抽象的な概念を人に伝えるということはとても難しいことだと思います。
プログラミングのなかでも特に難しい概念の1つが「オブジェクト指向」ではないでしょうか。その「オブジェクト指向」が「皆の心のなかにある」とは、さらに複雑怪奇に感じられるかもしれません。私も最初はそうでした。今でもそうかもしれません。
私は抽象的な事がとても苦手なので、オブジェクト指向はまだまだほとんど理解できていないと思っていますし、おそらく日本人で大体同じような意味合いで「オブジェクト指向」共有できてきる人は少ないのではないだろうか?とすら考えています。
というのも、プログラミングをしよう!と考えた時に、おそらくどこの入門的な解説をしているものを見ても、大体「変数」だったり「関数」の説明が序盤に出てきて、中盤に「オブジェクト」が出てくるからです。
なぜ「オブジェクト」が最初に解説されないのか?私は特に疑問にも思いませんでした。
「変数」はわかった、「関数」もなんとかわかった、しかし「オブジェクト指向」の壁は高い。なので「変数」や「関数」の応用が「オブジェクト指向」だと考えていました。
「基礎が出来ていないのに応用はできないよ」というような面持ちでした。
ところがマスターの領域に達すると話は違ってきます。
私はマスターに「プログラミング教室とか開いてみたらどうですか?」と質問してみました。するとマスターはこう言うのです。
「私が万が一、プログラミングを教えることになったとしたら、まずは生徒を街に出させる」
パソコンの前に座った途端に、余計な事を考えてしまうことがよくないことらしく、まずは外をブラブラさせて、自分が作りたいものについて考えさせるという事でした。
確かに私も作りたいものがたくさんあったはずなのに、コーディングとなるとすぐに「ここにif文をつけてー」などと、考え込んでしまいます。
そうではなく、まず第1に作りたいものを考えることが重要だと言っていました。
確かに仰る通りだと感じます。やや妄信的かもしれませんが。
少し話は脱線しますが、私は最近『闘うプログラマー』という本を読んでいます。この本の中でプログラミングをしているマイクロソフトの社員(マイクロソフティ)は皆、創作意欲旺盛で制御するのが難しいほどであるような書かれ方をしているのです。ちなみに伝統的なマイクロソフトの社員(マイクロソフティ)ではない社員は、日本のサラリーマンと変わらないような印象です。
仕事時間中はゲームをしたりしませんし、ルールと秩序を守り、上司に間違いを指摘され、給料を貰うために働く。そんな感じのプログラマーの心の中にもオブジェクト指向はあるわけですが。
そして彼ら(マイクロソフティ)は誰かに指示されたものを作るのではなく、欲求としてコーディングをしているらしいのです。これは、プログラマーとしての原点が全く違う様に思います。
皆さんには作りたいものがあります?それが「あなたの心の中にあるオブジェクト指向」かもしれません。
以下に『闘うプログラマー』のAmazonのリンクを貼っておきます。
私はスマホでの読者が苦手なので、東京の大型書店を見て回りましたが売っていませんでした。かなりのボリュームなのと、Windowsの歴史、プログラマーの苦悩や生活、お金の話などコンテンツ盛りだくさんなので面白いです。
お金の話で衝撃的だったのが、移籍してきたプログラマーのカトラリーがマイクロソフトのストックオプションだけで数百万ドルを手に入れたと言う話です。まさにアメリカンドリーム。
「ちゃんとした」コーディングについて考える
なるほど。「まず作りたいものを考える」そして、それを作る。
しかしながら、この「考える」ことが非常に難しいわけです。
マスターはよくこんな事を言います。
「みんな何も考えていない。少し考えればわかることさえも。」
これは一見すると、「オブジェクト指向を極めた人だから、そんな事がいえるのだ」というように感じられるかもしれませんが、そこまで複雑な考えが必要なわけではありません。
考える事はもっと単純で、「やりたい事は何か?」「どうすれば実現できるか?」ということに過ぎないのです。
具体的にデータベースからユーザの情報を取り出す処理について考えてみましょう。ユーザには識別番号、名前、メールアドレス、作成日、備考欄の5項目の情報があるとします。このデータベースに対して、「名前」だけを取り出したいと考えます。
これで「やりたい事」は、「名前を取り出すこと」になったわけですが、これを実装するときに「考える」ことになります。そんな事は簡単に思えますよね?データベースから名前を取ってくればよい。ただそれだけです。
しかしながら「ちゃんと」考えることが出来ているかと聞かれると、それが少し難しく、出来なくなってしまうことがあるわけです。
私がよくやってしまう「考えていないこと」としては「ユーザの情報」を取ってきてしまいます。これは、大枠で捉えれば「名前も」取得できているので、問題ないように思われるかもしれません。しかし必要のない情報、「メールアドレス」や「作成日」も、とってきてしまっています。これは「ちゃんとした」コーディングとは言いがたいです。
コーディングだけ見れば数行のコードの違いですし、取得している情報に関して見てもほんの少しの差異しかありません。しかし、もしこれが実際の工場か何かだとしたら、本当に不必要なものを取りに行くでしょうか?
ユーザ情報がまとめられた段ボールの中からユーザごとにまとめられたバインダーを取り出し、その中に書いてある「名前」だけを確認すれば、良いわけですから、わざわざ段ボールを持って移動したりはしないと思います。少し考えればわかることと言うわけです。
そんな面倒な事をコンピューターにさせているのかと考えれば、もっと単純に正確な情報だけ取得するスマートなコーディングができると思います。
1KBの情報が2KBの情報になっても大差ないと考えてしまいますが、2倍の情報量の取得は「ちゃんとした」コーディングとは言えないでしょう。
コードは1度書いたら何回も読まれます。コンピュータによって読み込まれ何度も実行されるでしょう。書く時間よりも、読まれる時間の方が長いです。少し考えてコーディングすらことで、後々の読む時間がグッと減少するかもしれません。
これがAWSのDynamoDBからデータを取り出すことであっても同じです。1つのレコードの1つの情報を取り出す方法がわからないからと言って、全ての情報を取り出してしまうのは考えていないのです。
「ちゃんとした」コーディングとは、書きたいように書きつつ、無駄がなく、それでいてPythonの禅のようなイメージです。
私は常にpython の禅のようなコーディングがしたいと考えています。以下に解説しているリンクを貼っておきます。
「プログラミング言語は関係ない」
マスターは、「どのプログラミング言語が好きですか?」という様な話題があまり好きではないらしい。
というのも、「プログラミング言語は関係ない」という事らしい。
先ほども紹介した通り「まず作りたいものを考える」という一歩を踏み出していれば、おのずと使う言語も決まってくるし、その設計も作りたいものに合わせるからだということだった。
全ての思想は「まず作りたいもの考える」からスタートする。そうすると簡単な静的Webサイトを作りたいのに、Pythonが好きだからPythonで作る、といういばらの道を歩むことはなくなります。静的なWebサイトを作りたいならHTML/CSSを使えば良いのです。
オブジェクト指向を必要としない言語を選択することも出来ますが、しっかりとその言語を選択することで行われるトレードオフを認識する必要があると考えます。
「どの言語を使おうか?」と考えるのは、「作りたいもの」が明確に決まった後です。プロジェクトで既に決まってしまっている場合などは、その選択された言語に対して文句を行っても仕方がありません。
まとめ
ここまで長文をお読み頂きありがとうございました!
今回の記事では、
- 「オブジェクト指向は皆の心の中にある」
- 「ちゃんとした」コーディング
- 「プログラミング言語は関係ない」
以上について記してみました。
あらためてプログラミングで良いものを作ったり、コーディングについて色々と考えてみると、自分の未熟さを痛感します。
少しでも皆さんの何かのお役にたっていれば幸いです。
私と同じ未経験からエンジニア転職を目指している人を応援したい思いで作ったディスコードサーバもありますので、お気軽に参加してみてください。以下にリンクを貼っておきます、
転職の悩み相談や、質問などお答えしていますのど、あなたのご参加をお待ちしております!
また次回の生地でもお会い出来ることを楽しみにしております。ありがとうございました。