pythonはこう学んでゆきたい。学習過程で気がついたこと
オブジェクト指向の言語(java、python、rubyなど)は、コードが比較的英語に近く、僕らの言葉に近いです。そのため、はじめに学び始めるとなると、扱いやすい言語だと感じます。
一方で、しっかり手に馴染んで書けるようになるためには、意識したほうが良いポイントがあると感じました。今回は、いつもとは打って変わって、技術寄りの学びを書いておこうと思います。
※この記事は、知識的な内容はほとんど扱いません。また、用語に対する説明もしないので、役に立つ内容ではないかもしれません。あくまでこれまでの学習方法を整理した内容として、ご興味あれば御覧ください。
簡潔さのデメリット
オブジェクト指向の便利さは、データの操作の簡潔さにあると感じます。
一方、簡潔であるゆえか、コードを読んで「理解した」と思ってしまいやすくもあると感じます。ここで理解を止めてしまうと、いざ、何も参考にせずに書こうと思っても書けないことがほとんどです。
簡潔であることで実はかえって、「読めるんだけど書けない」「体系を理解している感じが持てず、宙ぶらりんである」と感じやすいのだろうと感じました。
実際、はじめのころ、pythonでデータを操作したりしている際、解説してくれているサイトなどを見たりして、「なるほど、こう書けばいいのか」と、わかった気になっても、なかなかきれいに書くことができず、エラーをいくつか起こしてはメッセージを読んでコードを修正していました。
修正すれば結果を出力できてはいるので、それでもいいのかもしれないのですが、「しっかり技術を手懐けている感」がほしいと思ってしまう自分としては、この上達の度合いは全く不十分で、できない自分が許せなくなってしまいます。
そこでいろいろ試行錯誤して、(あくまで現状、pythonに関しては)都合の良い学習法を自分の中に見出すことができたので、今回はその学習方法について書きます。
pythonに関して役立つということは、他のオブジェクト指向言語の学習にも転用は可能だと思いますので、もしプログラミングの学習に、僕と同様の見習いレベルの段階で躓いている方がいらして、いろいろ試行錯誤している方がいらっしゃれば、頭の片隅においてみてください。
オブジェクト指向を意識する
pythonの学習で重要になると感じるのは、オブジェクト指向に関する知識をもとに、「じっくり」理解することだと感じます。
もちろん、大きなアプリケーションを作るとなると、「抽象的な設計内容をどのようにコードに落とし込んでゆくのか」、「他のサービスとの依存関係をどのように扱うのか」というシステム開発の側面の知識も重要です。
だからといって、基礎の内容の優先度が下がるわけではなく、この重要性は高いままであるはずです。
むしろ、応用的な知見が必要となるフェーズで、前述の基礎的なポイントに関する理解が曖昧だと、設計をコードに落とし込んでテストしてみたら、コードの誤りが複数箇所見つかり、出所を探しては修正して・・ということを繰り返すことになります。
規模が大きくなるほど、ある場所で書いた内容を修正したら、それに合わせて修正しなければならない箇所も増えてゆきます。
このような手戻りを減らすには、初めに書くプログラムの正確さが重要になってきます。そうなると、結局は基礎となる知識を正確に使えるようになることが必要になると考えられます。
オブジェクト、クラス、インスタンス、メソッド、スコープ、データ型、引数、などは、チュートリアルで学ぶような基礎と呼べる概念です。資格でいうと、IT系の職業の人が入社してすぐ受験する、「基本情報技術者」レベルでしょう。しかし、ここを軽んじてはいけないと感じます。
これらを軽んじない、とは、言い換えると、「何があるのか(どんな関数やライブラリなどの技術があるのか)?」よりも、「どのように使うのか?」に、理解の焦点を合わせて学習することが重要だと言えるかもしれません。
僕はpythonでデータを扱うことが多いので、ライブラリのpandas、numpy、sklearn、matplotlibを使うことがほとんどですが、実はライブラリで定義される関数は、クラス内で定義されたメソッドです。逆に言えば、ライブラリの関数は、その関数が定義された特定のクラスのオブジェクトに対してしか使うことはできません。(これに気がついたことが、今回の記事の発端であり、掴みたい!と思ったきっかけでもあります。)
また、メソッドにはスコープという範囲があり、「このオブジェクトには直接は使えないけど、このメソッドを使ったうえでなら使える」みたいな階層関係が存在します。これを理解してくれば、自分がほしい結果に対してどのような内容を、どの順序で書けばよいのかを、コードを書きながら思い出すことができるようにもなってきます。
自分が使っている関数(メソッド)が、どのオブジェクトに対応するメソッドなのか?また、引数としてどのような形(位置引数?キーワード引数?リスト?あるいは辞書?)でデータを受け、何を出力するものなのか。
これらの情報は、技術書でも乗っていない程に(乗っていたとしても、ものすごくあっさりと書かれている)、根本的な内容です。公式のリファレンスを読まないとなかなか出会うこともないです。
そのため一般的には、この道を通らずに、さらっと流してすぐに実践に走ってしまいがちです。早く習得したくて、技術書でいろいろな処理を学んだものの、書くときはいちいち思い出したり、見返さないと書けない、という状況になりがちです。結果、いろいろな手段に触れてはいるけど、「手懐けている感」は得らません。
実際、学び始めた頃の僕も、大きなサイズのデータを自分の手で分析できる嬉しさから、基礎を蔑ろにしており、しっかり理解はできていませんでした。
これを脱するには、「pythonもライブラリも、オブジェクト指向である」という認識を忘れず、クラス・メソッド・スコープ、という関係性を意識しながら内容を理解してゆくことが重要だと感じます。
定着させた基礎の上に自信は実る
これには結構時間がかかるので、進みも遅く、短期で見ると成長できていない気がしましたが、続けてみると、大きなピラミッドの土台の一つに確実になっていると気がついてきます。
事実、僕がこれを学習する際に用いた「データサイエンス100本ノック」に類する内容に関しては、やりたい内容に関して、何も参考にせずにコードを自分で書けるようになってきました。
そうなると、しっかり技術を手懐けているような感覚が得られ、自信も出てきます(ダニングクルーガー曲線の初期の山のような過度な自信というより、小さな前進を楽しめている、積み上がっていることへの自信です)。
コードなんてコピペでいいじゃん、とも思うのですが、調べてコピペして修正をしたほうが早いものについては、コピペすれば良いと僕も思います。そのレベルの量をキーボード打つのは肩も首も疲れるでしょうし。
ただ、ほんの数行の内容なら、どう調べれば出てくるのか、とか、ちょうどよい内容が書かれているサイトを探すとか、あるいは指示をGPTに投げて回答の出力を待つとか、それよりも書いたほうが早い場合もあります。
それに、適切な修正は、適切な理解あってこそですし、基礎が理解できてこそ、より具体的で良い質問をGPTに投げることもできると考えられます。
知りたいことが明確でなくても答えにたどり着きやすくはなっていますが、それでもドンピシャの答えがほしければ、基礎知識があったほうが最後には強いことに変わりはないはずです。
どうせ長く付き合ってゆくものなので、今後も地道に大きな土台を作って、崩れにくい体系を自分の中に築いてゆこうと思います。仮にその体系が無用になっても(まったく無用になることはないと思うけど)、積み上げた経験は必ず糧になりますし、積み上げの喜びの味を知っている今なら、「また積み上げれば良い」と切り替えられます。
また焦って基礎を蔑ろにしそうになったとき、未来の自分にこの記事の内容を思い出してもらえればと思います。また、この学習方法自体もまだ不完全かと思うので、学習プロセス自体にも磨きをかけてゆけたらと思います。
同じようなところで躓いている人がもし読んでいたなら、あくまで一つの学習法ですが、この記事の内容がヒントになれば、嬉しいです。