プログラミング教育に関してのまとめ。
前職のプログラマやスーパープログラマたちを差し置いてまとめるのは恥ずかしい限りだが、教育従事者や父親としての観点でまとめてみる。
Contents
【ゴールや方向性】
②マークアップ言語(とりあえずHTML)を勉強して、リッチテキストとプレーンテキストの違いを把握して、パソコンの仕組みを意識する。
③プログラミング言語を勉強して、使えるコマンドを増やして、パソコンをブラックボックスからホワイトボックスに変えて、使いこなす。
④ハッカー系の映画や書籍を読んで、アイデアや想像を膨らませる。
(プラスα)データベースとネットワークを把握して、パソコンの向こう側にある仕組みを意識する。
【オススメの手段】
https://blockly-games.appspot.com/?lang=ja
※「迷路」がオススメ
– アルゴリズム体験ゲーム・アルゴロジック|JEITAソフトウェアで未来をつくる
http://home.jeita.or.jp/is/highschool/algo/
※「アルゴロジック」「アルゴロジック2」がオススメ
http://fightcodegame.com/
– CodinGame – Play with Programming
https://www.codingame.com/start
– Ruby Warrior – Popular Free Ruby Programming Tutorial Game
https://www.bloc.io/ruby-warrior#/
– CodeCombat – Learn how to code by playing a game
http://codecombat.com/
(プラスα)
上記の技術だけじゃ、システムの開発なんてできない。
だから、データベースやネットワークなんかの勉強をして、パソコンの向こう側にある仕組みを構築できるようになる必要がある。
だから、データベースやネットワークを使わなくてもいいような仕組みのものを開発するようにするか、ちゃんと勉強してから開発するかの二択となる。
後者となると、独りで独学で開発するのは無理だから、仕事でお金もらえるようになってからチャレンジするといいよ。
【プログラミングの必要性】
何も考えずに、以下のサイトかYoutubeで動画を鑑賞して欲しい。字幕の設定を日本語にできるので、日本語が得意な人は設定を変更して日本語で鑑賞して欲しい。
https://code.org/
もう少し細かく書かれたものとしては以下のサイトが有名だ。
http://lrandcom.com/facebook_former_executive_learning_programming_guarantee_life_time_work
流行ってますね。バズってますね。
色々と申したい気持ちはあるが、詳細は後ほど。
【プログラミングを勉強する前に】
【アーサー・C・クラーク】
高度に発達した科学技術は魔術と見分けがつかない
Any sufficiently advanced technology is indistinguishable from magic.
という有名な言葉がある。
想像してみて欲しい。
パソコンに詳しくない人が、急に動かなくなったパソコンの前で呆然としていたら、誰かが黒いウィンドウを立ち上げ、いくつか文字を打ち込んだら動くようになった。
パソコンの調子が悪くなり、サポートセンターに連絡したら、自分のパソコンが電話口の人の言う通り動き始めた。
(他に例が思いつかない。。。)
などなど、自分の想像の範疇を逸脱すると、もうその世界はファンタジーでしかない。
そんな状況で、安易に手を出すと、鴨がネギ背負って歩くようなものです。
私は、プログラミングの前にアルゴリズムが重要と考えている。
だけど、アルゴリズムは、概念的過ぎて、ここでお金を稼ごうとすると、チープに見えてしまう。
だから、ここに商機を見出してる人は、もう少し具体性のあるプログラミングを前面にだすような戦略をとっているように思う。
「英語」の勉強の世界も、似たような状況だ。
本来は、先に「言語技術」などの根源的な学習をしなければ、多言語を使えても、中身の少ない人間になってしまうように。
それと、プログラミングを勉強したところで、すぐに何か作れるようになるか、というと何もできない。
そりゃアドバイスなんかがあれば、iOS向けのアプリを開発してリリースして小遣い稼ぎはできると思う。
でもそれだけ?本当にそれをしたくてプログラミング勉強するの?
プログラミングを勉強する目的は、最初に明確にしておくべきだ。
そして、その目的は以下の3つに集約される。
②プログラミングと呼ばれるものの理解や知識や技術をある程度知った上で、就職してOJTを通して身に付けたい。
③プログラミングを通して、課題を見つけて解決する力を身に付けたい。
①や②であれば、やることは簡単だ。適当にネットで検索して、目当てのものを見つけて、オンライン学習でも書籍でもスクールでもやってみればいい。
難点があるとすれば、その道でお金を稼ぐぐらいの気持ちが無いなら手をださないことぐらいだ。
問題は③だ。
というよりも、①②以外でプログラミングをやってみたい、という人たちは全てがこの目的を持って、気軽にプログラミングに取り組んで欲しい。
③のような「プログラミング」に興味がある人は、どの言語から始めたらいいのか、という壁が最初に立ちはだかる。
①や②であれば、作りたいものや有名な言語に合わせて選べるから、そんなに選ぶのに苦労しない。しかし、ただ「プログラミング」をしたいだけだと話が違う。
③の人に是非取り組んでもらいたいこと。
それは【結論】に書いている通り、アルゴリズムを学ぶことだ。
すると、プログラミングの醍醐味、自動化の効果を実感できる。この感覚があるとないとでは、その後の習熟に大きく差がでる。
面倒な事は人手で解決するのでなく、自動化して機械にやらせよう、すると、大変さが1回で済む。
【読んでおいた方がいい本】
この書籍の選別はとても難しい。勧めたい書籍が多すぎる。
– 子どもを億万長者にしたければプログラミングの基礎を教えなさい
– 「アルゴリズム」のキホン (イチバンやさしい理工系シリーズ)
– 図解でかんたんアルゴリズム 情報処理のかなめとなる考え方が手に取るようにわかる! (サイエンス・アイ新書)
– エンジニアのための時間管理術
【学習環境や学習方法】
②オンライン学習サイトで勉強する
③スクールや塾に通って勉強する
この点に関しては、他のサイトでの紹介がとてもまとまっているので、各自で探していただきたい。
【プログラミング言語の紹介】
ぶっちゃけ何をやってもいいと考える。
言語にもある程度流行り廃りがあり、現場によって偏りがあるものだから。
それでも挙げるとしたら、以下の4つの観点で紹介したい。
②マークアップ言語
③OS上のコマンドライン系のシェルスクリプト
④データベースを操作するためのSQL
①プログラミング言語
プログラミング言語とは、いわゆるプログラミングをするための表記法、ルールの総称である。
有名なものやオススメなものとしては
・C言語
・Perl
・Ruby
・PHP
・JavaScript
・iOS向けアプリを開発するために使われているSwiftやObjective-C
・Java
といったところ。他にも沢山あるが、どれか一つできるようになっていれば、その後の習熟速度は速い。 ※若干相性があるが。
②マークアップ言語
マークアップ言語は、プログラミングと実態は違うものの、初心者向けへの説明が面倒なので、一緒にくくられているもの。
代表例としては
・HTML
・CSS
・Wiki記法
何かを動かすためじゃなく、何かを表示を整えるためのもの。
③シェルスクリプト
実はこのGUIとCUIを把握して、OSをコマンドラインなどを使ってシェルスクリプトで操作できるようにならないと、プログラミングをするための環境構築が準備できない。
てっとり速いのは、Linux系のOSを自作でインストールしてみると理解できる。
一行で雑に説明しているが、この言葉からネットで調べ、1ヶ月ぐらいあれば実現可能なレベルにはなれるだろう。
④データベースを操作するためのSQL
データベースを操作するための独自の言語がある。
プログラミング言語と違い、かなり表記法が似ているので、
・MySQL
・PostgreSQL
あたりのフリーのDBをいじってみればすぐにイメージがつく。
【関連知識の紹介:データベースやネットワークやレンタルサーバ】
ここまでの話だけでは、何かを作っていくための技術にはまだ足りない。
何かを作っていくには、そのためのデータを保存する方法を考えなければならない。
そのための知識がデータベースである。
それと、オンラインで何かを構築するのであれば、ネットワークについての知識も不可欠である。
IPアドレスって?PINGで疎通確認?VPNトンネルって?ファイアウォールでセキュリテイ対策?
その辺りが弱いと、自分の作ったものが、外から丸見えになってしまう。
こういったデータベースやネットワークの環境を構築するのは、とてもレベルが高いし、手間。
なので、面倒な人はレンタルサーバを借りるのがてっとり速い。
手続きも簡単で、月500円程度で、普通の環境がすぐに揃う。
セキュリテイも概ね問題ない。
困ったら、とりあえずお金に物言わせて、環境を整えてチャレンジするのが近道だ。
【ここまでの話で、現実味がわかない人へ】
技術的な話が多く、結局何をどうしたらいいんだろうか。
私は「プログラミング」はバズワードの一つと考えている。いわゆる意識高い系の人向けだったり、「英語」は勉強しておいた方がいいよ、という話だったり。
でも、そんなバズワードであっても、珍しく中身のあるものだ、とも考えている。
それは、「プログラミング」を通して本当に身につくのは「課題発見能力」と「課題解決能力」だからだ。
プログラミングができる人は、ここ最近とても増えているが、それはあくまでもプログラミング言語の読み書きができるだけに過ぎない。
それも一つの能力だと思う。
「英語ができる」人がいたとする。その人は「英語」で何ができるんだろうか?
日常会話?ビジネス会話?交渉?スピーチ?営業?医療従事?カウンセリング?コーチング?
「プログラミング」はあくまで手段。
自分がやりたいことの実現方法の一つに「プログラミング」が候補に挙がるようになれば、最初のゴールにたどり着けたものと言える。
その先にあるものは何か。
それが「課題発見能力」と「課題解決能力」だと私は考えている。
「プログラミング」は、他のツールと違って、正否の結果が一瞬で返ってくる。
他の分野における手段に比べたら、比較にならないスピードだ。
この特性はいかすべきである。
すると何が起きるか。全ての事象の具体性が排除され、抽象化されていく。
だから最後に残るのは、自分が何をしたいのか、何が問題なのか、という「課題」意識だけ。
それでもまだ察しがつかない人は、とりあえずExcelでじゃんじゃん関数使って、今まで電卓使ってたり、面倒な表計算をしていたりしたところを、置き換えてみるといい。
一つの数式で10個くらいの関数を入れ子にして、複雑な計算も抽象的に書けるようになるところまで目指してみるといい。
いつも同じような作業をしていて、自分じゃなくてもできそうな作業があれば、それを機械にまかせてみればいい。
何か違った世界が見えてくるよ。
【アーサー・C・クラーク】
高度に発達した科学技術は魔術と見分けがつかない
Any sufficiently advanced technology is indistinguishable from magic.
目指せ魔法使い。