プログラミングの学び方/Python公式ドキュメント

NO IMAGE

 プログラミング日記に載せようと思ったけれど、何となく掲載を見送った記事をまとめてあります(要するにボツ原稿です)。興味のある人は読んでください。

プログラミングの学び方

 おかげさまで、これまでの記事では、かなりの数の人が記事を読んでくれましたが(まだ数十記事しかないサイトにしては上々の滑り出しです)、オブジェクト指向の話になった途端に急速に閲覧数が落ちました。というより、ほとんど誰も読んでくれていない状態です。

 他のプログラミングの参考書などを読んでいても、オブジェクト指向に踏み込むと急に内容が難しくなるんですよね。数学にたとえると、それまで三角比を学んでいたのに、次の単元で急に微分積分が現れた、みたいな感じです(別に数学にたとえる必要もありませんけど)。

 それまでは順調について来られた人も、ここで急に高い壁に阻まれたような気持ちになって戸惑うのかもしれません。逆に教える側としても「クラスとオブジェクトの概念」はひとつの関門なのです。世間に数多いるベテランプログラマーさんたちも、「オブジェクト指向の概念をいかに上手く伝えるか」ということにはけっこう苦心しているようです。クラスを設計図、オブジェクトを部品にたとえるのが一般的ですが、
「ダメだね。そんな教え方ではオブジェクト指向の概念は正確に伝わらないよ」
と主張する人もいます。まあ、確かにその人たちの主張も一理あるんですよね。コンピュータ内部の話ですから、クラスはクラス、オブジェクトはオブジェクトであって、他にたとえようがないのです。とはいえ、最初にオブジェクト指向を学ぶ段階であまり正確さにこだわり過ぎても前になかなか進めないと思うのです。

 私としては、最初のうちは大まかなことを理解して、とにかくコードを書くという経験を積みながら徐々に理解してゆくというスタイルのほうがいいと考えています。だから当サイトの記事でも設計図と部品という一般的な方法で説明したのです(←ただの言い訳)。

 オブジェクト指向はとても深い概念なので、
「クラスを生み出すクラスとは何ぞや?(←メタクラス)」
というような事にまで踏み込めんで学ぶときりがないのですが(そもそも日本語でまとまったドキュメントすらない)、クラスを設計して目的に応じた振る舞いをするオブジェクトを作るという、普通の使い方をするのであれば、オブジェクト指向は決して難しいものではありません。組み込み型など、もとからあるクラスに修正を加えるという形で新しいクラスを設計することもできます(クラスの継承)。

 要はコードを書くことです。プログラミングの習得に最適な学習法は、ひたすら書いて実行し、エラーメッセージでお叱りを受け続けることです。エラーメッセージはプログラミングの最良の教師です。「コードのここが良くないよ」と的確に指摘してくれます。クラスとオブジェクトのことを理解したいと思うのなら、サンプルコードを(コピペせずに)すべて自分の手で打ち込んで動作を確認します。そのあと色々なクラスを自身で設計してみましょう。思ったようにいかないことも多々ありますけれど、何度エラーを出されても、目的のコードが完成するまではしつこく食らいつく気持ちが大切です。あれこれ試行錯誤しているうちに少しずつ「クラス」というものの正体が見えてくるようになると思います。
 

「急がば回れ」で学びましょう

 私自身のプログラミングの習得過程を思い返すと、慣れないうちは様々に絡み合う専門用語が理解を妨げることもあるかもしれません。理解したつもりでも、実は思い違いをしていたりすることもけっこうあります。用語の意味を正確に把握するというのは、プログラミングに限らず、何かを学ぶうえで避けて通れない道だと思うのです。ですから、ちょっと記憶や理解が曖昧だと思える用語に関しては、前に戻って、もう一度しっかり読み直すという労力は惜しまないほうがいいと思います。急いで先のことを学ぶよりも、とにかくしっかり土台を固めるほうが、将来大きく伸びると思います。何事も急がば回れの精神で、ゆっくりと着実に理解を進めてください。
 

何をどこまで学ぶべきか?

 他のところでもちょっと書きましたけど、Pythonユーザーのすべてが、オブジェクト指向の概念を学ぶべきなのかと問われると、答えに窮してしまうのです。オブジェクト指向を習得するとプログラミングの幅が大きく広がることは確かです。自分でクラスを設計し、オーダーメイドの部品(オブジェクト)を使ってプログラムを組み立てることができるからです。

 とはいえ、Python はすでに膨大なライブラリが存在しているので、特に学術的なな目的で Python を活用するのであれば、たいていのことは既製品を使えば事足ります。もちろん Python の入門書には必ずオブジェクト指向の解説が載っていますが、あれは読者が職業プログラマーを目指すことを前提としているからです。書いている人も職業プログラマーです。だから Python の内部設計についてもきちんとページを割きます。「物理学のシミュレーションに Python を使いたい」という人のために書いてあるわけではないんですね。アカデミックな目的に特化するのであれば、SciPy などの科学技術計算パッケージをいかに活用するかを学んだ方が効率的だし、正しいベクトルだと思うのです。
 

Python のあらゆる方面の記事を掲載予定です

 当サイトも当面は Python の構造についての記事が続きますが、並行して Matplotlib を活用したグラフの描き方などの掲載も始まっていますし、今後は SciPy パッケージを活用した科学技術計算についても記事をどんどん掲載していく予定です。だから、全部の記事を無理に理解しようとはせずに、自分の興味のあるところをピックアップしながら、わからなければ関連記事を参照する、というスタイルで学ぶことをおすすめします。
 

Python公式ドキュメント

 当サイトの記事は主にPython 3.6.5 ドキュメントをもとに執筆しています。これは Python の公式ドキュメントなので、Python については何でも載っています。記述も極めて正確で信頼できるものです。それならば、Python を学ぶ人はみんな公式ドキュメントを読めばいいと思われるかもしれませんが、公式ドキュメントはあくまでエンジニアに正確な情報を提供することを目的に作成されたリファレンスなので、入門者にとってはまったく読みやすいものではありません。ですから、やはり公式ドキュメントから必要な事項を抜き出して、わかりやすい日本語で伝える手引書(書籍やサイト)が必要となるのです。
 

書き換え禁止のルールを作りましょう

 本来なら数値が入ると期待している rec_1.width の値が文字列 "100" で上書きされています。area()メソッドの面積の計算にこの変数が使われるので、実行結果は異常なものとなっています ("100" を 20 回繰り返して表示するという処理がなされています)。
 もちろん、self.width に数値以外のオブジェクトが渡されることを予測して、初期化メソッドの内部で渡された値を int型や float型に変換するなどの工夫をすれば上のような事態は防げるでしょう。不正な値が渡されたときにはエラーメッセージなどを表示して対処する方法もあります。
 しかし、より複雑なコードを書く上で、あらゆる事態を想定するのは極めて困難ですし、全てに対応するような記述の仕方をすれば、簡単な処理をするプログラミングでさえ、膨大な長さのコードが必要になってしまいます。ですから「この変数は書き換え禁止!」というルールを作ったほうがよほど簡単です。