読者です 読者をやめる 読者になる 読者になる

type t (* void *)

関数型言語や英語学習の事とか。

一般の話: プログラミングってどうやったら出来るようになるんでしょうね

ストレス解消に文章を書きます。ただの思い出話です。

どうやったらプログラミング出来るようになるんでしょうねという話です。

特に取り留めもなく文章を書いています。

 自分の経験?

自分がいつから自信を持ってプログラミング出来るようになったと言えるようになったのか分からないのですが、どうやって出来るようになったのか分からないのです。

もはや詳細に思い出せないのですが、僕が最初に真面目にプログラミングし始めたのは学部3年後期からで某O研でSML#書いてたんですよね。

そこでSMLの開発環境はEmacsとShellだ慣れろ使えWinはやめろVMLinux動かせ端末くらい叩けるよねマージソートも書けねぇの、みたいな事を経験した覚えがあります。

なーんか気づいたらPPLでポスター発表してるし、そのために初めて300行くらいのプログラムを書いたんですよ。

そのプログラムのために初めて他人の大きなプログラムを読んだのは、smlnjのCkitです。

CkitはC言語のパーサーでSMLのデータ構造を吐いてくれるものなのですが、ドキュメントが全然ないので利用するデータ構造を自分で読んで理解した覚えがあります。

Ckit自体はsmlファイルが15000行ぐらいの規模のプログラムで、この時初めてどうやってソースコードを読むのかという知見を得ました。重要なのは名前だなぁと。

まず真っ先にどうやって処理するのか処理部分は興味がなかったので、吐き出す木構造の定義を探しました。まぁそれっぽいものは見つけられて、次にその木の要素が何を表すのか考えるわけですけど、これが中々大変で名前を見て考えるのと実際に簡単なコードを読ませてみて出力を見る、みたいなことを2週間延々やった覚えがあります。

よく書けたコードだったので、データ構造自体は今思うと分かりやすいよなぁ。

まぁただの思い出です。

そんなことをやっていると、いつの間にかEmacsがそれなりに使えるようになっててそれなりに端末が叩けてそれなりにSMLが書けるようになってました。

最初はマージソートすらスラスラ書けなかったのにね。

プログラミング出来るようになるための近道は必要に迫られることだと思うのですが、やらなければならない目標だけ決まっていて、ポイッとされても質問できる相手がいればなんとかなるんじゃないかと思うようになりました

(余談ですが、次の年某O研は同じように半年間やろうと思ったら途中で参加者がギブアップしてしまったそうで……(^_^;))

この経験で自分の中でパラダイムシフトを感じたという話は

プログラミング一般:プログラム書いてて感動した事 - type t (* void *)

に書きました。

 

で、本題のいつ出来るようになったのか分からないと言う話

プログラミングってどうやったら出来るようになるの?

プログラミング非常に難しいと思うのですが、理由はいろいろ考えられて

・環境を作るのがムズカシイ、まず学習のために環境を作るのにつまづく

・エラーメッセージ読むのがムズカシイ

  ・エラーが読んで理解できない

  ・エラーを読まないといけないということに気づかない

  ・エラーの指摘が正確にエラー部分を指しているとは限らないので理解できない

  ・型エラーが読めない(静的型付きな関数型言語特有?)

・適切な練習方法がわからない 何読んで勉強すりゃいいの?

・ひと通り参考書読んだら次どうしたらいいのか分からない

・調べるのがムズカシイ、どこ見ればほしい情報が手に入るのか分からない

・バグ取りの方法がわからない

・本のとおりにやってるはずなのに動かない

 

至る所に地雷がワンサカある気しかしないです。

これどうやったらいいんでしょうね?多分知らず知らずのうちに自分もできるようになったのだけど、どうやってこれらの障害を乗り越えたのか分からないです。

 

コレを乗り越えても、

・どうやってドキュメント読めるようになるの?

・どういう風に構造化する方法を学ぶの?

・どういう設計が良いの?

・どうやったら良いコード、分かりやすいコードが書けるように鳴るの?

みたいな話が延々続くようにしか思えないんですよね…。

今のところ根性で乗り切るしか無いという結論です。手伝ってくれる友人がいれば大変幸福でよいですがその友人はどうやって湧くんだという話ですよね。

 

しーかし、人に教えてもらうというのは中々ムズカシイ。

一番あり得そうなのは講義で教わるというものですが。

学部のSML演習のTAを7週間くらいやっていたのですが、やっぱり講義で教わるだけでとりあえずドキュメント読めて1000行くらいのプログラム書けるように鳴るのは厳しいよね、という感じです。

講義の形で提供されても学生さんのモチベーションが全然ないから上達しないんじゃないかなぁという感触です。一部強い奴がいましたが…。

他に人に教わる機会ってなんだろ、友人に教えてもらうとか?なかなか貴重ですね。

研究室の輪講…?これはあり得そう。大変良さそうです。

 

どの方法も講義もダメだんだから、システマティックにこれをやったらできるようになる、と言うのはないような気がして、なんだかなぁという気分です。

 

プログラム輪講

友人の研究室におじゃまして、B4の学生さん向けのプログラミング輪講に参加しているのですが、これは大変よいですね。

基本的に毎週問題があって、それを解いてきて、集まってみんなで書いてきたプログラムを見せて説明する、という輪講です。

先生ではなくてM1の友人が主導で頑張っているみたいで、出来る人にプログラム見てもらうというのは本当に貴重な場だと思いました。

残念なのは、参加者がおとなしいことです。

やっぱり研究室の行事とかにしちゃうとみんな大人しくなってしまって、ガンガン分からない事を聞いたり、この書き方はおかしい、みたいな話にならないのです(除く:私)

M1の人が僕を覗いて3人いるのですが、彼らがずっと指摘している、みたいな感じになっていて微妙だなぁと思います。

(うちの研究室だと自主ゼミ的な輪講で、互いに喧嘩し始めるので……)

制度的にはよさそう、でもやっぱりこういう場にすると参加者が萎縮しちゃう。

うーん、やっぱりモチベーションが強烈にはない人には無理なのか…?

 

うちの研究室

うちに研究室では、僕がB4にちょっかいを掛けてこんな問題解ける?みたいに主に上で述べたプログラミング輪講でやった問題とかをふっかけています。

基本的には問題を与えてほっておくのですが、時々様子を見て進捗どうですか!と聞きに行き、困っていたらアドバイスする、みたいな感じです。

プログラムが完成すると流石に嬉しいらしく、自分から出来ました~と持って来てくれます。

そんな感じでEmacsの使い方とかもちょくちょく教えていたら、友人が作ってくれたインストールとドキュメントのお陰でスライドはBeamerでEmacsで書くようになったしOCamlも新しいモジュールをmliファイル読んで使いこなせるようにところまでは来ました。Yasnipeetとかも使いこなしている…?

これを大人数には出来ないだろうけど、続けていこうかなぁと思ってます。

今のところ一番良いのかなぁ…と。

 

キモは、適度な難しさの課題と質問しやすい環境を構築することなのかなぁ…。

聞きに行きづらいだろからこっちから声をかける、とか。

プログラミング出来ない人の特徴(すごく主観)

全然プログラミング出来るようになる方法がわからないのですが、経験的にこういう人は出来るようにならないだろうなあというのは分かるようになりました。

・やらない人、手を動かさない人

・短い(数十行)コードしか書かない人

・ライブラリ関数を使おうとしない人

 

まぁだいたい一番上の、「やらない人」が多くのケースが当てはまるような気がします。やらない人は絶対にできるようにならない。

やらない人のバリエーションとして、いつも「やりたい」と言っている人というのがあります。例えばですが「Lispやりたいんですよね~」と言っている人。

Lispやりたいんだったら処理系入れてもう何か参考書買うなりしてますよね、え、何したんですかどの処理系選んだんですか?という話です。

真にやりたいんだったらもうやっているんじゃないですかね…。

「やりたい人」というのは「やらない人」なんだなぁと情報系学科にいるとしみじみ感じるところです。

 

以上長々書きました。進捗作ります。