Linuxを日常的に使う実験ブログ

私の考える最強のプログラミング勉強法

 2023-11-09

 2024-02-07

 プログラミング

筆者の考える最強のプログラミング勉強法を書いていきたいと思います。タイトルは少々誇張があるかも知れません。何が最強かは人によっても違うでしょうし、目指すゴールによっても手段は変わってくるでしょう。もちろん異論があることは認めます。

はじめに

以前に友人からプログラミングの勉強に関する相談を受けました。初心者向けの入門書を買ってきてサンプルコードを書き写してるいるのだが、その場ではわかった気になっても自分1人でプログラムを書こうと思うと何から書けばよいかわからない。いつまでたっても使えるツールにならないとのことでした。

サンプルコードが動くと嬉しいが、本を見ないで自分でプログラムを組もうとすると手が止まってしまう。どうやって勉強すれば良いのか?と尋ねられたのですが、筆者も答えに詰まってしまいました。なぜなら私自身はプログラミングの勉強というものをしたことがありません。趣味のコンピュータいじりの延長にプログラミングがあり、遊びの一環で行っていたからです。

そのことをきっかけに自分なりにプログラミング習得の方法を考えてみました。

そもそも「言語習得」のゴール像は正しいのか?

まずプログラミング初心者の方が考える「言語の習得」のイメージがプログラミングを日常的に行っている人とはズレている場合があります。プログラミング初心者の人に「言語の習得」について聞くと「文法が全て頭に入った状態で何も見ないで自由自在にプログラミングが出来る状態」という答えが返ってくることがあります。

プログラマーの皆さん、言語の詳細仕様全てが頭に入り、何も見ないでスラスラとプログラミングできますか?出来るという方ももちろんいるとは思いますが、少なくとも私は無理です。しばらく使わなかった言語だと「あれ?この言語だとどうやって書くんだっけ?」と調べながら書くこともしばしばです。

大事なことは「その言語が持つ機能を理解し、目的達成のためにどこでどう使うか」を強くイメージ出来ることだと考えています。書き方の細かい点は「調べて書けば良い」というスタンスの方が気が楽です。

筆者なりのプログラミング学習のゴールを問われれば、「作りたいものを思い描き、実現する力を得た」状態だと思います。言語の持つ機能を正しく理解し目的に応じて使える状態とも言えると思います。

文法を網羅しようと思わない

プログラミングの勉強を始めた初心者がよくやってしまう失敗が、プログラミング言語の入門書の頭の方から熱心にサンプルプログラムを書き写し文法を頭に叩き込んで行き、途中で息切れしてしまう。或いは、少し理解が難しい章になると進みが悪くなり「面白くない。学習が捗らない。」と投げ出してしまうことです。

目的意識なく文法を覚えようと思っても効率的な学習にはなりません。むしろ実際にプログラミングをする中で「もっと効率的に書く方法があるんじゃないか?」「この文法をここで使ったらスッキリ書けるのではないか?」のように必要に応じて知識を吸収していく方が漫然と技術書を頭から理解しようとするよりも頭に残ると思います。

そのために文法を網羅してから何かを作ろうとするのは止めた方が良いと思います。また、言語の機能をたくさん使うことが上手なプログラミングだという勘違いも正した方が良いと思います。必要なところで必要な機能を使えることが大事なのであり、そのためにはたくさんのコードを読み、設計し、書くことが近道だと思います。

文法はだいたい頭に入れる

網羅する必要はありませんが、何もわからないと書きようがありません。ざっと入門書で文法を確認しましょう。後述しますが、サンプルコードの書き写しはしなくて良いと思います。文法を見渡しましょう。基本的なところだとデータ型、分岐、繰り返し、関数、構造体やクラス、配列やリストの扱いを抑えましょう。入門書やサイトを俯瞰で見て「どこを見れば調べられるか」を把握することが大事です。細かい点は実際に壁にぶつかったときに調べるようにしましょう。

各言語には他の言語と違う「肝」のような機能があります。たとえばC言語の「ポインタ」やRustの「借用と参照」、Haskellの「モナド」であったりです。このような言語特有の概念は理解に時間がかかりますが、一番の攻略法は慣れることです。なので、ある程度本やサイトで調べたら完全に理解できなくてもどんどん使いましょう。一時期、ネット上で『ぜんぜんわからない。俺達は雰囲気で〇〇をやっている』というフレーズが流行りましたが、正直なところはじめは雰囲気で使っていて良いと思います。概念に慣れてきたころ、もう一度しっかり学び直しましょう。初回よりもぐっと理解しやすいはずです。

写経はしない

プログラミングの勉強で代表的なものが「写経」と言われるサンプルプログラムの書き写しだと思います。これは合う合わないの個人差がある話かも知れませんが、私にはとても退屈な作業で、学習効果を感じたことがあまりありませんでした。

これだけサンプルコードを書き写したという満足感は得られるかも知れませんが、実際どれだけ理解が進んだかという点については疑問を感じています。書き写すことに意識が集中してしまい、理解することが二の次になってしまいます。そしてお勧めしない最大の理由は「受け身の学習になってしまう」ことです。言われたことだけを素直に飲み込む学習は一見スマートで達成感はありますが、頭に残りにくいという難点があります。

それよりもサンプルコードを参考に自分なりにアレンジして別のプログラムを作り出す方が有効な勉強法だと思います。はじめはエラーばかりで動かない可能性もあります。その際にエラーメッセージを読み、何が駄目なのかをサンプルコードと見比べて「自分の頭で考える」時間を設けることがとても大事だと思います。

サンプルプログラムで終わらせない

プログラミングの学習として簡単なサンプルプログラムを書くということをしている方も多いかと思います。この作業自体は能動的な学習として良いことだと思います。ただ、サンプルプログラムというのは大概、とても短く機能も単純なものが多いです。一つの機能の検証用にサンプルプログラムを書いて動かしてみるというのは経験のあるプログラマーでもよくやると思いますが、それは飽くまで検証用でありゴールではありません。

初学者がサンプルプログラムだけ書いて学習を終わらせることはももったいないと思います。なぜならそこには「サンプルプログラムだから」という甘えが生じるからです。サンプルプログラムと実用に耐え得るアプリケーションの間には非常に大きな隔たりがあります。実用的なアプリケーションを作ろうと考えたら、ユーザビリティ、セキュリティ、パフォーマンスなど考慮すべきことが沢山あります。その一つ一つを検討し実装していく中でプログラミング以外にもシステムやネットワーク等の知識も増えていきます。実用的なツールを作り上げることは、多くのサンプルプログラムを書くことよりも遥かに実のあることだと考えます。

自分が使う実用的なツールを作る

サンプルプログラムじゃなければ何を書けば良いのか?という疑問が出ることと思います。私は自分が使うツールやサービスを作るのが良いと考えています。多くのプログラミング好きの人は勉強という意識なく自分のためのツールやサービスを作っています。CUIツールだとイメージが難しければ、モバイルアプリやWEBサービスはどうでしょう?

スマートフォンを多くの人が持っている時代ですので、自分用のモバイルアプリを作ってみるというのはとても手軽なプログラミングへの入口だと思います。また、Webサービスを作るというのも入口としては良いと思います。自分のブログサービスを自作するというのはどうでしょうか?自分用の読書記録サービスはどうでしょうか?

最初から立派なものを作る必要はありません。自分のアイデアがプログラミングによって具現化するという体験はとてもワクワクするものです。作りたい物をノートに書き出してみましょう。誰かがすでに同じようなものを作っていても気にする必要はないと思います。自分だけのツールやサービスを作りましょう。

まずは小さく動くものを作る

実用的なツールを作ろうとして躓いてしまう最大の原因は立てた目標が壮大すぎることです。最初からいろいろな機能が満載されたツールを作ろうとしてもどこから手をつけたら良いかわからなくなってしまいます。はじめは巨人の肩に乗り、フレームワークやライブラリを活用しながら小さく動くものを作りましょう。少しずつ機能をブラッシュアップし、あるいは他の機能を加えて自分なりに使いやすいツールを作っていくことが失敗しないコツかと思います。

慣れてきたらプログラミングをする前に画面や機能を設計する段階を設けるようにしましょう。プログラミング初学者にいきなり「設計しろ」と言っても正直難しいと思います。プログラミングによって何が実現できるのかが手のうちに入らないうちは「実装前に設計」と言われても何をやったら良いのか分からないものです。沢山ツールを作るうちに設計の大切さを知ることになります。

最後まで作り切ってGithubなどで公開する

サンプルプログラムを書かないという点と関連するのですが、妥協せず最後まで作りきり世に公開できるレベルまで作り込むことが非常に大切だと感じています。実際に人に使ってもらうことを考えるとユーザービリティやセキュリティなど考慮すべきことが質量ともにサンプルプログラムに比べて格段と上がります。世の中に公開して使ってもらう前提の物を作りきったときプログラミングのレベルだけでなく、サーバー、OSなどのシステム関するレベルも自ずと上がっていると思います。

例えばウェブ系のプログラミングの場合、Webフレームワークを使って開発環境だけで動くサンプルサイトを作って「プログラミング楽勝」と言いたくなる気持ちも分かりますが、本番環境にデプロイして運用可能な状態にするには難易度が相当上がります。そして本番環境で自分で運用してみて足りなかったことや未熟だったことに気がつくことも沢山あります。最後まで作り切ることは本当に大事だと思います。

自分の書いたコードをリファクタリングする

あなたは実用的なツールやサービスを作り公開しました。それはとても素晴らしいことですし、プログラミングの能力も学習開始のころとは桁違いになっていることと思います。しかし、まだ気を抜いてはいけません。もう一度自分が数ヶ月前に書いたソースコードを見直してみましょう。どうですか?素晴らしいコードでしょうか?多くの場合、自分が成長してから過去のソースコードを見ると書き方や設計に粗が見えるものです。

「今の自分ならどう書くか?」という視点で機能は変えずにソースコードを書き直してみましょう。初学者の頃には使えなかった言語の機能を使って今ならもっと洗練された書き方が出来るかも知れません。ディレクトリの構成やモジュールの構成をもっとスマートに出来るかも知れません。より適切なライブラリを知って、より好ましい実装が出来るかも知れません。

自分のコードの粗が見えてリファクタリングができるということは過去の自分よりも成長した証です。随時書いたコードを見直してリファクタリングしましょう。

他人の書いたソースコードを読む

今はオープンソースでソースコードが沢山公開されており、他人の書いたソースコードを読む機会に恵まれています。自分が使っているライブラリやフレームワークのソースコードが公開されていれば是非読みましょう。言語の機能の使い方や設計だけでなく、コメントの書き方や文化も学ぶことができます。自分が普段使っているライブラリーやフレームワークであればどのような挙動については把握できているためソースコードを読み進めやすいと思います。

ソースコードを読むときには命名規則やディレクトリ構造、モジュールの構成など学べることは全部吸収しようという意識で読みましょう。プログラマーは書く力よりも読む力がとても大事です。沢山の良質なソースコードを読むことはプログラミング学習においてとても重要です。

自分用のプログラミング入門書を書く

初学者に入門書を書くようにアドバイスするなんて何を言っているんだという声も聞こえてきそうですが、初学者こそ自分のために入門書を書いた方が良いと思います。自分で文法をまとめ直し文書化することで、何となくで使っていた文法が頭の中で体系的に整理されてきます。公開する必要はありません。あくまで自分用に作成しましょう。

理解が深まり、自分の理解に誤りがあったとき作成した入門書を適宜修正していきましょう。自らの理解が深まっていることが確認でき、成長が実感出来ると思います。

まとめ

要約すると

  • 入門書を頭から読み、サンプルコードを書き写す作業はやめる
  • 文法をだいたい頭に入れたら実用的なツールやサービスを作り始める
  • フレームワークやライブラリを使用し最初は小さく動くものを作る
  • 最後まで作りきり、githubなどで世の中に公開する
  • 自分の書いたコードはリファクタリングして設計能力を更に高める
  • 他人の書いたコードを読んで言語や設計の知見を高める
  • 自分用にプログラミング入門書を書いてみる

ということになります。プログラミング言語は手段達成のためのツールですので、勉強そのものが目的化してはもったいないです(言語の研究が目的ならそれはそれで良いのですが)。一つのツールやサービスを作り上げたとき、あなたのプログラミング能力は大きく向上し、他のものも作りたいという欲求が湧いてくるものと思います。

この記事が何かの役に立ち、読んでくれた方のIT技術ライフが向上することを祈っています。