あらまじ
プログラミング初心者に向けての記事なんて腐るほどあるので中高生に向けて書きます。
中高生にプログラミングを教えていた経験もあるので多少の信用度はあると思います。
また教職課程の数学と情報も取得予定なので、そこらへんもカーバーしつつ。
自己紹介
まず最初に私がどのように学んだか、そしてどのように学べればもっと効率が良かったか書きます。
21歳独身(人間界)、大学三年生。北海道在住。[2016年当時]
えーと、プログラミングを始めたのは確か、中学二年生の時で、ブラッディマンデイにハマったから興味が湧きました。確か教本は"猫でもわかるC言語"が最初だと思います。
選択としては大変間違っている選択肢でした。
知恵袋なんか見ると、今はあまりありませんが(私の観測地からは)C言語を勧める声がたくさんあったのです。C言語はデニス・リッチーが作った言語で大変優秀かつ奥が深い言語です。初心者向きではありません。勧めないでください。
一番最初にオススメなのは個人的にはpythonがいいと思います。あとはJavaかC++といったところでしょうか。だいたいGoogleと同意見ですね
(参照: https://github.com/jwasham/google-interview-university)
では、なぜC言語がダメなのか説明していきます。C言語は非常に優れている言語です。先にも述べましたが。でも初心者が極めるには深すぎるのです。ポイントという概念で間違いなく、つまづきます。
Javaやpythonでは参照値渡しということになりますが、そこまで複雑ではないです。
それだけではありません。C言語を学んだ先になにがあるか想像してみてください。GTKを利用したアプリケーションくらいしか思いつきません。
実際には低レイヤー(Linuxのドライバ)など,速度を速くしたい分野には今でも使われているそうです.[2018/01/04]
# include <stdio.h>
int main(void) {
printf("Hello,World!!¥n");
return 0;
}
なんて書けてもその先がないのです。この程度しか書くことを教えない教育にはその先が無いのです.[2018/01/04]
実際に私はVisualStdioでGTKのアプリケーションを作りましたが、自分が何をしているかとても分かりづらい。その時代は Androidなんてまだ普及していませんでしたし、あっても10万円以上はしたと思います。なのでGTKのアプリケーションを作っているうちにつまらないのでやめてしまいました。
もしも gtkのアプリケーションを書きたいなら以下のようになります。
# include <gtk/gtk.h>
static void
print_hello (GtkWidget *widget,
gpointer data)
{
g_print ("Hello World\n");
}
static void
activate (GtkApplication *app,
gpointer user_data)
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *button_box;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
gtk_container_add (GTK_CONTAINER (window), button_box);
button = gtk_button_new_with_label ("Hello World");
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
gtk_container_add (GTK_CONTAINER (button_box), button);
gtk_widget_show_all (window);
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
引用(興味が湧いたツワモノむけ)
https://developer.gnome.org/gtk3/stable/gtk-getting-started.html
私みたいなものは見るだけで嫌になります.
pythonだと
print("Hello, World")
ウィンドウを表示するだけなら以下で終わりです.
import sys
from PyQt4 import QtGui
def window():
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
b = QtGui.QLabel(w)
b.setText("Hello World!")
w.setGeometry(100,100,200,50)
b.move(50,20)
w.setWindowTitle(“PyQt”)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
引用
https://www.tutorialspoint.com/pyqt/pyqt_hello_world.htm
で終わりですね。短いだけではありません。今なら機械学習のライブラリも豊富ですし,ウェブプログラミングにもフレームワークが需実してきました.C言語で同じ事をやろうとすると時間がかなりかかりますし、できても誰も使いません。(誰かはきっと使うかもしれませんが,楽しく書けたらいいに越したことはありません.)[2018年1月編集]
高校卒業後
時は流れて高校を卒業するとPHPとMySQLとを使って掲示板を作りました。それなりに反響がありましたが、セキュリティー対策があれで、XSSされたので閉鎖しました。
アルバイトで学ぼうと思って、インフィニットループという会社で、課題をやりましたが、病気が悪化して、思うように体が動かないということや根本的に技術の基礎が足りなかったため1ヶ月でクビになりました。そしてちゃんと勉強しようと思ってAOで大学に入りました。
大学時代
そうして大学生になり、本格的に学び始めました、Lisp,Vim,Prolog,Java,Python,Swift,VBA。やれるものはがむしゃらにやっているうちに、やっと楽しくなってきました。プログラミングを始めて5年くらい後に面白いと思いました。
やっぱりいいと思ったのは、自主ゼミで出会った今のゼミの先生にプログラミングの基礎をマンツーマンで教わりました。正直に言ってこれが一番良かったです。先生の知識はとても深く理解しやすかったです。
ざっと僕のプログラミングが得意になるまでのストーリでした。
どのようにしてプログラミングを学ぶのか
プログラミングは続けることが非常に重要です。
続けないと、いつまでたっても何も作れません。C言語の本で計算機を作ることもそれはそれで楽しいのですが、その先にあることが想像できないのです。初心者には特に。
私を含め、熟練したプログラマなら鳥瞰することができるので、何が重要かは分かるのですが、それが先行してしまいすぎて、続けるためにはどうすればいいかということが考慮されていない偽初心者向けの本が多い時代でした。今は多少、プログラミング教育も騒がれていますが、まだ書籍で良いものはないと僕は思っています。 Unity(ゲームの方)やAndroidやiPhoneでアプリを作る本が増えてきました.独学しやすい時代になりました.[2018/01/04]
人の手を借りる
では、具体的にはどうするかですね。人の手を借りるというのも手段です。近くにプログラミングが出来る人がいればその人に教わるといいです。いない場合はLife is Tech!!という中高生限定のサービスを利用しましょう。Androidアプリ, iPhoneアプリ、Webプログラミング、など様々なコースがあります。
https://life-is-tech.com
以前はメンターをしていましたが、キャンプはいかなくてもいいと思います。高い割には学びが少ないからです。宿代も入れると10万円を超えます。Mac bookを買った方が100倍ましです。
こんなことを書くとさらに社員に嫌われるので、本音を書きます。スクールに入るといいと思います。
僕はスクールのメンターはしたことはほぼないので、よくわかりませんが、見た限りでは詳しく教えてくれますし、中高生のことを仕事が終わった後議論して、どうするか真剣に考えています。キャンプだとそういうことも時間の関係上あまりできないので、本当にプログラミングの初めての導入ぐらいで思っとくといいと思います。
スクールは月数万なので、ちょっと高い習い事って感じですね。得るものは多少はプログラミングが上手くなるという感じでしょうか。でも人に教わってなんでもできるようになるほど甘い世界ではないと思うのです。だから厳しく書いています。
Life is Tech!!やLitaLicoでもなんでもいいのですが、多少は触れるようになると次は学んでいく事をしなければいけません。
具体的にはLife is Tech!の場合はどっかの教科書に書いているようなカウントアプリを最初に教えます。(場合によっては文字を変えるだけの時計のアプリの場合もあります。)
+または-のボタンを押せばカウントすることができるものですね。
ソースは簡単です。
//一部省略(メインコードのみ)
addButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
number = number + 1;
}
});
textView.setText(number);
というようなものを書くだけで動くものを作ります。結構初めは感動するものです。Androidコースの場合次はタップナンバーと呼ばれる、画面上部に表示された数字と同じボタンを消していくアプリを作ったりします。だんだん難しくなっていきますが、教科書は丁寧に作られており、どの教科書から始めても大体作れるようにはなっています。
最後に
別にプログラミング教室を利用しなくたってプログラミングは学べますし、それは完全に自由です。
けっして上に書いたようなものを利用しないと難しいとかそういうことを書きたいわけではありません。
独学でも十分すぎるくらいです。今の環境は。
schoo,dotinstall,qiita,などを使えば独学も余裕です。
さて、高校では2020年からプログラミングが必修になります。ですが、僕の立場から言わせて貰えば、必要ないものだと思います。現行の教員が教えるとなると、民間のプロのエンジニアにお願いするしかないと思います。現行の情報の免許を取得しているだけの教師が教えるとつまらない教材になるのは見え見えです。私のようにどちらにも対応できるような人がなれば別なのですが、そういう人は高校教員にならないので・・・。
僕は数学を充実させるべきだと思います。高校で微積分を大学範囲まで、そして線形代数をしっかりとする方が有益ではないかと思います。数学の時間を割いてプログラミングを教えればいいのです。プログラミングなんて学んでも仕方がありません。
小手先だけのテクニシャンには未来に需要はないからです。
プログラミングの方法は変わり続けます。エンジニアは一生勉強します。勉強をやめたエンジニアに価値はありません。それほど新しい技術が半日のペースでてきます(もっと早いかも)
それを30〜35回の授業に落とし込めるとは思いません。正直邪魔な科目になるのが見え見えです。
プログラミングだって、print("ヘロー")といつまで打つのかなんて誰にもわかりません。
正直、プログラミングを今から教えるというのが手遅れです。日本語や英語のように知っていて当然の必須知識です。
それよりも僕は数学をしっかりできることの方がよっぽど重要なのではないかと思います。
DeepLearningを理解するには線形代数、微積分が少なくとも必須です。
プログラミングってそもそもなんでしょうか?一言で言われても、我々プログラマにはナンセンスな言葉です。
データベースでしょうか?ウェブデザインでしょうか?はたまたExcelのマクロでしょうか?
高校教師だとVBAをExcelで使っただけで、プログラミングという粗末な結果になると思いますよ。僕は情報の教職をとるので高校の教科書を見るのでわかりますが、Excel大好きなおじいさんが多すぎるんです。
じゃあ勝手に教科書から反れて教えていいかと言われると、法律違反になります。指導要領を無視して教えると法律違反になり教育委員会から怒られると思います。教科書が指定されている以上は少しは利用しないと教育委員会から怒られます。いくらオライリーの書籍を使いたいと思っても勝手に買わせることはできません。教育委員会にオライリーの書籍を使用していいかどうか許可をもらわないといけません。めんどくさいですよね。
でもこれが高校の現実です。
さて皆さんはプログラミング教育には賛成ですか?
ちょっと暗い終わり方になりましたが、「プログラミングなんて知ってて当たり前で学校で教えるまでもない。」そんな時代が来るといいですね。そういう未来への期待を祈って終わりたいと思います。
追記:2018/01/04
これは私の偏見が詰まった文章なので,信じたくないと思うのも結構ですし,それは決して間違ったことではありません.
C言語を題材にしましたが複雑な言語にはそれなりの理由があり,C言語は今でも使われていますし速度がpythonよりもとても早いです.
pythonはカプセル化(ググってください)をすることによってコードを少なくしていますが,その代わり速度が遅くなっています.ロード時間もありますし.
なのでプログラミングを好きだと思うのならC言語を極めることに関して私は何も言えません.好きこそものの上手なれです.
そして他者と違うことをやるということは何事においても大切なことだと思うからです.