プログラムを作れることとプログラミング言語を理解できることの違い
この記事は初心者向けです。というか私が友人Kに伝えたいことです。
彼は、フリーランスのプログラマになることを目指しています。しかし、「プログラミング言語のシンタックスの習得」と「プログラムを作れるようになること」の差というのが、私が見る限りよくわかっていないようです。私はそれを危惧しています。努力が実にならない可能性があるからです。実際彼は苦戦しています。一般的に、独学でプログラミングを学習する際に陥りがちな罠の一つであるような気がします。なので、独学でプログラミングの勉強をしようと思っている方には多少参考になる記事だと思います。
プログラミングってなんなんでしょう
プログラミングするとは何なのか、シンタックス(言語のルール全般)を理解できるようになることと何が違うのか。この記事では具体的な比喩を使ってそれを説明して行きたいと思います。私自身初心者に毛が生えた程度の身です。そんな私が捉えたプログラミングの本質の話です。結果としてこの記事では、「なぜ自分でプログラムを作るということが重要なのか」ということが説明できると思います。
プロの人が書いている、具体的なプログラミング言語の解説だとかとは全く異なる記事です。「プログラミングするってどういう意味?」というかなりふわっとした抽象的な題材について書いていきます。
ただコードを読み書きできることとは違う
以下の二つは別物です。
- コードを読み書きできること(=プログラミング言語のシンタックスを理解できること)
- プログラムを作れること
頭の中でプログラム全体を構想するという過程と、単に言語の意味が理解できてコードを読み書きできることは全く異なることだと私は理解しています。
(オブジェクト指向での)プログラム全体の構想とは、簡潔に言えば、「プログラム全体をどういうモジュール/機能単位に切り分けるのか」、そして「それらがどういう関係性で動くのか」をデザインすることです。それぞれ具体的に書きます。(Kに)突っ込まれた時のために一応具体的に書いているだけで、ここは論旨とは関係が薄いので次項まで飛ばしても大丈夫です。
- プログラム全体のモジュール化
- クラスの定義
- どういう属性を持つのか(プロパティー、フィールドなど)
- どういう機能を持つのか(メソッド)
- クラスの定義
- 実行時のモジュール同士の処理関係
- どのクラスをいつどこでどういうふうに使うのか
- インスタンス化
- メソッドの実行
- どのクラスをいつどこでどういうふうに使うのか
プログラマーは何をするのか
プログラマーの仕事とは、自分の頭の中で構想したプログラムを”コード”といったコンピュータが理解できる言葉に置き換えていくことです。
もちろん何かを作るという過程は、結局は、例えばプログラマならコードを書いたり、作曲家なら楽譜を書いたりといった具体的な手段に到達します。頭の中にあるものは何かに置き換えないと他人には伝わらないからです。プログラマならその手段としてコードに置き換えるのです。その段階だけ(プログラマがコードを書いているという段階だけ)を見ていると「コードを読み書きできることが、すなわちプログラミングができることだ」という錯覚を抱くかもしれません。だけど、その段階の前には、まず頭の中でプログラム全体を構想するという過程があるんです。
他の物事に置き換えて説明
以下は「頭の中で概念として作品を構想すること」と「その構想を実体(文字などの具体的媒体)に置き換えるための手段」の対応表です。わかりやすくなればいいなと思って書きました。
概念を構想 | 実体に変換する手段 |
---|---|
プログラミングをする | コードを読み書きする |
作曲をする | 楽譜を読み書きする |
小説/論文を書く | 文字を読み書きする |
フルコース料理を作る(シェフ?) | 調理をする(調理師?) |
*相対性理論を組み立てる | 式の計算をする |
(*一番下はあんまいい例じゃないかもしれませんが、アインシュタインは計算は苦手だったと言われています。そこから考えると、左側の能力と右側の能力は異なるものだということがわかりやすいかなと)
人が構想して書いたプログラムをちょびっといじるというのは、人が作曲した曲を少しテンポを変えて弾いてみるとか、人が作った料理に調味料を加えてみるといった意味合いに近いと思います。それ自体に学習効果が無いとは言いませんが、全体の構想段階には程遠いのです。
自分でプログラムを作るということがなぜ重要なのか
ここまで論理が到達すればわかっていただけると思います。上で挙げた対応関係と言うのは、単に「レベルが高いこと低いこと」といった差ではなくて、本質的な違いとしては「作品を制作すること」と「道具を使うこと」の関係性です。道具は作品を表現するための手段なのです。プログラミング言語を習得することはプログラムを作るための手段でしかありません。
プログラミング言語のシンタックスをいくら覚えても、プログラムを構想する力は上達しません。いくら楽譜の読み書きができるようになったとしても、作曲する力が上達するわけではないと思います。同様に、いくら読み書きが上手になったとしても、小説を作る力が上達するわけでもないと思います。全く関係ないとは言いませんけどね。
逆の見方をすれば、道具の使い方をマスターするまで作品を作れないわけでもないのです。「構想」なんていうと大げさですが、作品の質を問わなければ、道具を手にしたその瞬間から作品はいつだって作れるはずです。つまり、プログラミング言語の学習を始めたその日からプログラムは作れるということです。時期尚早ということはありません。そして、作ることによってのみ獲得できる重要な能力が「プログラムを構想する力」です。
結論
というわけで、自分でプログラムを作りましょう。私も今その段階で苦闘しています。同時にやりがいも感じています。
そういえばエンジニア系の転職エージェントに行ったとき、初心者を数か月で就職させるカリキュラムの説明をしていましたが、「学習時間のうち9割は自分でプログラムを作る時間」とか言ってた気がします。記憶違いかもしれませんが、そう言ってたとしても自分としては特に驚きはありません。

コメント