この記事は、ゆうとクラブ Advent Calendar 2019の25日目の記事です。
プログラミングを学ぶ方に向けて、私が大切だと考えるテーマを紹介します。
想定する読者
この記事は、次の読者を想定します。
- プログラミングを学ぶかどうか悩んでいる方
- プログラミングを学びはじめた方
- プログラミングの学習サイクルを知りたい方
プログラミングの勧め
今日、コンピュータはあらゆる場面で応用され私たちの生活を豊かにしています。パソコンを持たない人でも、スマートフォン、家電、自動車など多くのものからその恩恵を受けています。
1989年にパロアルト研究所が、「社会や生活の至る所にコンピュータが存在し、環境にすっかり溶け込み消えてしまう」というユビキタスコンピューティングの概念を提唱しましたが、まさに2019年現在、ユビキタスコンピューティングの時代が到来しつつあります。
これからも世界中で、コンピュータの重要性は増す一方です。インターネット電話サービスSkypeを生み出したIT先進国エストニアでは、2012年にプログラミング教育推進プログラムが開始されました。日本においても2020年度から小学校プログラミング教育が全面実施されます。
未来の話としては、レイ・カーツワイルによって「人工知能の発展で2045年以降は人間の脳では予測不可能な未来が到来する」と予言さています。この予言は、シンギュラリティと呼ばれています。本当にシンギュラリティが到来するかどうかはわかりませんが、まさに我々人類は、いま大きな変革の最中にいると言えるでしょう。
変革の中では、過去に美徳とされた価値観が足枷になることもあります。プログラマの三大美徳は、「怠惰」「短気」「傲慢」とされています。一見すると悪いことのように思えるかもしれません。しかしこれらは、プログラマにとって重要な素質なのです。プログラマにとってもはや用済みとなった古い価値観は、切り捨てたほうが俊敏に行動できます。
インテルの創業者アンディ・グローブは、「シリコンバレーではパラノイア(偏執病・誇大妄想者)のみが生き残る」と語っています。プログラマは、10年後の当たり前をつくっていかないといけないのです。そのためには病的なまでの妄想力が必要となります。そして、その妄想を現実にするために我々プログラマはコードを書くのです。
どんなサイクルで学習するか
マイケル・ロンバルドとロバート・アイチンガーは「人はおよそ70%を経験から学び、20%は観察学習や他者からのアドバイスによって学び、残りの10%は研修や書籍などから学ぶ」としています。プログラミング学習においても、この考えを体系化した経験学習モデルを採用できます。
経験学習モデルでは、次の4つの段階をサイクルとして定義しています。
- 具体的経験 (Concrete Experience)
- 内省的省察 (Reflective Observation)
- 抽象的概念化 (Abstract Conceptualization)
- 積極的実践 (Active Experimentation)
それぞれの段階でどんな手法・行動があるのか私のお気に入りを紹介します。
段階 | 手法・行動 |
---|---|
具体的経験 | ハンズオン、モブプログラミング、ペアプログラミング、写経 |
内省的省察 | マイクロブログの活用、目をつむって考える |
抽象的概念化 | 技術系記事の投稿、ドキュメント作成 |
積極的実践 | OSSへのコントリビュート、ハッカソン |
プログラミングを学ぶことに王道はありません。時代や状況に応じて手法・行動はアップデートされるべきです。しかし、どの手法・行動を選択するにせよ、フィードバックの受けやすさを重視することで学びを得る機会が増えます。したがって、プログラミング学習においてもコードを書くだけではなく自然言語を含むコミュニケーションを学習することが重要なのです。
どんなテーマが大切か
プログラミングを学習する上で私が大切にしている三つのテーマを紹介します。
同じ哲学を共有し、強い絆で結ばれた集団に属す。
宗教によって戦争が起こるように、プログラミング界隈においても宗教的な派閥や対立が存在し議論が繰り広げられています。
下記は、その典型な例です。
- Vim VS Emacs
- 伽藍 VS バザール方式
- マイクロカーネル VS モノリシックカーネル
- オブジェクト指向 VS 関数型プログラミング
- 暗号通貨 VS 法定通貨
これらの議論は、終末のないフレーム論争です。こういった対立の中、どんなツール、思考法に重きを置き選択するかは、もはやプログラマの哲学とも呼べます。
これらの哲学について議論することも有意義ですが、一つの答えに辿りつくのは困難でしょう。しかし分かりあえた仲間がいればその結束は強いものです。
学習の金銭的コストを考慮する。
様々なソフトウェア・サービスを無償で利用できる現代ですが、今もなお、プログラミング学習には様々な金銭的コストがかかります。
- 書籍購入費
- ドメイン取得費
- サーバーレンタル費
- ソフトウェア購入費
- コンピュータや周辺機器の購入費
- 快適なインターネット回線
これらは学習のために絶対に必要とは限りませんが、経済的判断が原因で、学習の効率が制限されてしまうこともあります。効率的に学習できる環境を手にいれましょう。
矜持を持って社会に貢献する。
プログラミングという行為は、うまく使えば人々の生活を豊かにしてくれますが、倫理がペアであってこそであり、そうでなければ社会に悪い影響を与えてしまうことがあります。
逆に、技術の伴わない倫理のみが存在しても良い結果は得られません。倫理をもっていても重大なバグで社会に悪影響を与えてしまうこともあります。
したがって技術と倫理のペアを同時に学ぶことは大切な矜持です。そしてその矜持を持った上で、社会に貢献しましょう。
最後に
プログラミング学習においては、困難なことや苦痛に感じることも多々あると思います。これはプログラミングに限りませんが、どんなにクリエイティブな活動でも大半は退屈な作業なのです。それでも達成したときの嬉しさがあれば、きっと苦労は報われます。
みなさまがコンピュータとプログラミングを活用して少しでも理想の社会を実現できることを心から願っています。