2014-05-22

プログラミングを学ぶ方法がわからない

最近、プログラミングをどうやって学べばいいのかわからなくなってしまった。

筆者はドワンゴに雇われている。ドワンゴに入社して早4ヶ月になろうとしている。ドワンゴに雇われている名目は、C++の啓蒙である。C++の啓蒙にはC++の教育も含まれる。したがって、筆者はそろそろC++の教育をしなければならない。

筆者は、プログラミングを教育する最良の方法は、参考書を執筆することだと考えている。直接対面して教えるのは非効率的だ。文章を書いておけば、大勢が学べる。では、どのような参考書を執筆すればいいのか。すでにC++11のコア言語の参考書は書いた。

EzoeRyou/cpp-book

C++14対応も、正式なC++14規格制定後に行わなければならない。そしてライブラリは、もし他にやる人がいないのであれば、やらなければならないだろう。

しかし、これらの本は、C++をこれから学び始める人向けではない。C++を学び始める人向けの入門書も、そろそろ考えなければならない。

東京に来て数カ月、筆者に対して、C++を学びたいと直接告げてくる人が何人もいた。興味深いことに、私に直接会ってC++を学びたいと告げた人たちには、共通の要望があったのである。

その要望とは、コンピューターの基礎的な操作方法から教えてほしいというものである。ターミナルやBashのようなシェルの使い方、基本的なCLIコマンド、GCCやClangなどのC++コンパイラーでソースコードをコンパイルする方法、Makeなどのビルドシステムの使い方、はては、ソースコードであるテキストファイルをテキストエディターで編集する方法にまで及ぶ。これはC++以前の話だ。

不思議だ。何故こういった、プログラミング以前の基礎的なコンピューターの操作方法から学びたがるのだろうか。筆者は、このような基礎的なツールの操作方法で苦労した覚えがない。かといって、筆者は基礎的なツールの操作方法の達人ではない。ただ、必要な箇所だけ、その都度調べて使っているだけだ。したがって、筆者はこのような基礎的な操作方法について、教育できるほどの上級者ではない。

なぜ、彼らは、こういった基礎的な操作方法の教育を必要としているのだろうか。すでに、これらの基礎的なツールの操作方法のドキュメントは、いくらでもネット上に文章として存在する。筆者よりもはるかに、それぞれのツールの上級者によって書かれた文章が存在する。いまさら筆者が中途半端な知識で解説する必要はないと思われるのだが、いったいどういうことだろう。

筆者は長い間、不自由なMicrosoft Windowsユーザーであったが、2年前、GNU/Linuxに転向した。それまでVisual StudioというIDEがあり、テキストエディター、ビルドシステム、C++コンパイラーの操作が、マウスだけで行える環境から、CLIのC++コンパイラー、GNU Make, Vimの環境に移った。操作方法が完全に変わったが、しかし、それほど苦労はしなかった。もちろん、まだGNU Makeの機能をすべて把握しているわけではないし、Vimを上級者のように使いこなせてはいないが、特に操作方法に苦労はしていない。いずれも有名なツールのみを使っているので、わからない操作方法は、調べればすぐに分かる。誰かがすでに同じ問題にぶちあたって、解決方法をドキュメント化しているからだ。

かつて筆者が、15年前、2年前に、それぞれ乗り越えていったはずのプログラミング以前の基礎的なツールの学び方を、筆者は覚えていない。それほど苦労した覚えがない。

しかし、現実にC++を学びたいと望むものは、C++以前の、基礎的なツールの使い方から教育されたいと願っている。自分で調べればすぐに分かることを、教えて欲しいらしい。

これはいったいどうしたものか。このような基礎的なツールの操作方法を自力で調べられない者は、後々も必要な情報を自分で調べられないであろうから、本物のC++プログラマーとはなれないであろうと、切り捨てるのは簡単だ。しかし、それでいいのだろうか。

ある同僚が言うには、この手の人は、最小限の労力で目的を達成する方法を求めているのだという。C++でプログラミングをするという目的はあるが、そのために費やす労力は最小限にしたいという。

しかし、この手の基礎的なツールの操作方法というのは、いくら学んでも損はしないのだ。たしかに、Bashの大部分の機能は、C++プログラミングをする上では、直接役には立たない。GCCの全オプションを覚える必要はない。今や、Makefileは自動的に生成する時代だ。ユーザースペースのコードを書く上で、カーネルの知識が直接に役立つことはない。しかし、基礎的なツールをひと通り触っていれば、いつか役に立つ機会があるかも知れないのだ。以外なことに、思いもしなかった知識が、後々になって役に立つものである。

「学問に王道はない」とはよく言ったものだ。

理想はともかく、全くの初心者には、おそらく足がかりが必要なのだろう。そういう基礎的なツールの使い方を触りつつC++を始めるまでの段階を解説した、入門書を書くべきであろうか。第一章、GNU/Linuxのインストール方法、第二章、パッケージマネージャーでC++コンパイラーをインストールする方法、などなど。

とにかく、なにかやるとしよう。

せっかく、100人入るセミナールームが使えるようになったのだから、勉強会も積極的に開催していきたい。

ドワンゴ広告

筆者はドワンゴに雇われている。ドワンゴに雇われている名目に、ドワンゴの宣伝がある。宣伝をしてほしいとは言われたが、どのように宣伝せよ、とは言われていない。そこで、筆者は自分が正しいと信じる方法で宣伝をしている。

そもそも、広告とは、本来必要のないものである。ドワンゴが優秀なエンジニアを求人しているのは、いまさら言うまでもない。ドワンゴに限らず、まともな企業ならば、優秀なエンジニアは常時喉から手が出るほど欲しいに決まっている。広告など、いまさら行うまでもないのだ。

そして、広告というのは、極めて邪魔なものである。もし広告が邪魔だと感じられてしまうようであれば、それは広告としての機能を果たしていない。むしろ逆効果である。即座にadblockのフィルター行きになることは確実である。特に、優秀なエンジニアであれば、adblockは当然使っているであろうから、なおさらだ。現に筆者は、自分のブログの広告をadblockで消している(ドワンゴ広告は消していない)。読者も当然消すべきである。

そのため、筆者は、消さずとも許容できる広告を書くことにした。許容できるとはいったいどういうことか。他ならぬ筆者がadblockで消すほど邪魔でもないと感じるのであれば、あるいは、読者も許容できるかも知れない。

矛盾するようだが、筆者にとって許容できる広告は、adblockで消せる広告である。広告は広告であるとマークアップで意味付けするべきである、もし、広告がCSSセレクターで指定しにくいマークアップであれば、許容できない。そのような広告を使うWebページ自体が許容できない。

したがって、このドワンゴ広告は、adblockのようなユーザー指定のCSSで消しやすいマークアップをしている。

これにより、広告が邪魔だと感じられるようであれば、即座に消されてしまうわけだ。広告が邪魔だと感じられないような努力を強いられる。

もし、読者がこのドワンゴ広告を邪魔だと感じているが、消す方法が分からず、消し方を調べようともしない場合、残念ながら、読者は本物のエンジニアではないと言わざるを得ない。

ドワンゴは本物のエンジニアを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

21 comments:

Anonymous said...

既にWeb上に情報があるなら、そのリンクを紹介するだけで良いのでは。これを読んでおけと。
初心者は情報の質の良し悪しが分からないので、その選別のための時間を肩代わりするだけでも良いと思います。

Anonymous said...

CLIは、.NET Frameworkの共通言語基盤 (CLI)とコマンドラインの意味があり少しまぎらわしいような

Anonymous said...

人間IDEと化すC++啓蒙家

Ryo clothoid said...

僕は基礎的なツールの操作方法に本当に苦労してるし、調べても、分かる人が分かる人向けに書かれてて、そこに書かれてることやってもその通りにはならないし、さやに調べても分からないし、自分にセンスが無いんだなって思って生きてます。情報強者がどうやって問題解決してるのか感覚が全く掴めないです。。。いい教え方が確立されると嬉しいです。

Anonymous said...

善良な親というのは歩き方位は教えるものですよ。
言語を教えるというよりも知的好奇心を育ててあとは勝手にやってくれ。っていうスタイルを推奨しますね。
知的好奇心は応用が利きますし、なかなか心身的にもよろしいと思いますよ。
なので、歩き方位までは教えてやってください。
今はあなたは親になろうとしている。

暁 紫電 said...

目的達成のために費やす苦労を最小限にすます方法は
目的達成のために必要な努力、活動等を
苦労だと思わないことだと思う。

Anonymous said...

C++ではないので少し趣旨とはズレているかもしれませんが、以下の2冊がプログラミングを習得する上でとても役立ちました。
これらの本をきっかけに、標準規格を読むようになり、こちらのサイトまでたどり着きました。
「C言語ポインタ完全制覇」
「30日でできる!OS自作入門」
OS自作入門はWindowsを対象としていますが、ツールが扱えない超初心者でもプログラミングできるように工夫されています。
Makefileも使用するのでGNU/Linux界への足がかりにも最適かもしれません。

Anonymous said...

検索が苦手な人って結構いますよ。
ググる時のキーワードを考えるのが苦手な人はかなりいるようです。

Anonymous said...

GCCとLinuxが主たる教材ならば

「ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道」

とかは良いのでは?

Anonymous said...

「ドワンゴに限らず、まともな企業ならば、優秀なエンジニアは常時喉から手が出るほど欲しいに決まっている」

これは疑問です。欲しいかも知れないけど努力はしない(宝くじ当たったらいいなと類似)のか、あるいはまともな企業ではないのか。

現在の一般的な採用は優秀なエンジニアを採用するのには向いていません。どちらかというと危ない人材を採らないようにする回避型の採用です。おそらく、なんだかんだ言って終身雇用の幻想から労使ともに抜け切れていないのではないでしょうか。

そういう点ではドワンゴは面白い会社ですね。採用を見れば会社のやりたいことがわかります。多くの会社では成果を出すより失敗しないことを重視するように、その採用スタイルからは見えます。

Anonymous said...

最小限の労力で目的を達成する方法を求めている人が入門書を読むとか、ぶっちゃけありえなーい。
目的に応じた逆引き辞書的な、しょうもないモノの方が良さそう。

Anonymous said...

シンプルな話だと思います。

・本当は、学びたくない興味があるだけ
・本当は、ちょっと使ってみたいだけ
・本当に使いたいけど時間がないだけ

要はモチベーションなんですが、最初はそんな感じだと思います。

Anonymous said...

ウェブ上の情報は、時に古かったり、特定の環境でしか動かなかったりするものを、全く断りもなく載せていたりするものであり、まともに動く情報を手に入れるためには不要な労力を要します。
つまり、『OpenGLでムカつくこと』の「12. ドキュメント地獄」は決してOpenGLのみについて言えるものではなく、LinuxやGCCについても決して例外ではないでしょう。
Googleの検索結果に対して「これはゴミクズであり表示すべきでない」とマークできればいいのに。

Anonymous said...

ツールのバリエーションがありすぎて、どれを選択してよいかが分からないということだと思います。

Anonymous said...

まあ自分で調べてるとそれなりに時間は要するよなあ
社会人や大学生だと必要なものだけ取捨選択したいのもわからなくはない

Anonymous said...

適切なサーチワードを生成するのも技術ですからねー。
自我がちゃんとしてないと道具すべてがOPです。

Anonymous said...

>コンピューターの基礎的な操作方法から教えてほしい

町の PC 教室みたいですね。

その人が職業プログラマになろうとしているなら、
「適性なし」でしょうね。
他の職を探した方が良いと思います。

プログラミングで食べていくつもりはなく、
興味本位でやってみたい、ということなら。
でも、その場合 C++ はミスチョイスのような。

Anonymous said...

慣れ、だと思う
いくらやっても慣れない人は向いてない
早く慣れる人ほど向いてる

Anonymous said...

そもそも江添さんはプログラミングできるんですかね。
言語仕様については相当高い知識をお持ちなお方だと思いますが、それは「プログラミング」とは別のスキルだと思います。

Anonymous said...

http://en.wikipedia.org/wiki/Progressive_disclosure

Tomoyuki Kano said...

CLIについていえば、じぶんでちゃちゃっと調べることが出来無いのなら、素養が無いか向いていないのです。向いていないということについていえば、マニュアルにしたがった動作だけを要求されるような仕事以外の全てについて向いていないのです。