icon新大学生のみなさま、まずは合格おめでとうございます。大学での新生活は新しい喜びと学びに満ちています。運良く(運悪く)情報科に、あるいはそれに類する学科に入ることになった方は、「プログラミング実習(演習)」という必修科目を受けることになると思います。必修科目のわりにこれがなかなか難しく、多くの学生が苦戦している様子を毎年見かけます。私もプログラミングの授業は何度かTA(ティーチングアシスタント)を担当して、様々な苦難を目にしました。そこで、プログラミング実習を乗り切るためのいくつかのアドバイスを、この記事に記したいと思います。この記事が新入生の助けになれば幸いです。まとめプログラミング実習という授業について学校にもよると思いますが、プログラミングの授業は、大まかには以下のような流れになると思います:PowerPointなどを用いて、今回学ぶ要素について先生が解説する教科書などを参考にしつつ、授業時間内に練習問題を解いて提出する次週までに宿題問題を解いて提出する授業名に実習(演習)と名前がつくだけあって、自分でプログラムを書くことが非常に大きな割合を占めています。授業の自由度は高く、友達と相談したり、机間巡視をしている先生やTAに質問したり、気楽な姿勢で挑むことができる授業になっているかと思われます。それでも挫折する人が後を絶たないというのが実情です。TAとしては、もっと気楽に質問していただき、研究室にも質問に訪れてほしいのですが、それはなかなかハードルが高く難しいようです。使用するプログラミング言語はC言語やJava、あるいはRubyやPythonなど、多岐に渡ると思います。ここではC言語を前提として話を進めてきますが、他の言語でも通用する、一般的な話をできるだけメインにしていきます。実習において気をつけたいこと積極的に質問するプログラミングは、非日常的な活動です。新しい発見に満ち溢れていますが、その分、わからないことも多く存在します。いったときに、「なぜこうなっているのだろう」「どうしてこれで動かないのだろう」と自分で考えるというのは非常に大事なことです。それが10分や20分かかるとなると話は別です。時間は有限ですし、疑問は無限に湧いてきます。自分だけで考えると間違った答えにたどり着くかもしれません。自分で考える、というのは時に有害となることがあります。プログラミングは積み重ねの技術です。授業のはじめの方で抱いた疑問をそのままにしていると、大学4年の終わりまで引きずることになります。「時間が経てば別の分野に行くからリセットされる」ということがありません。わからないことをわからないまま放置していると、だんだん積み上がってきて、最後には崩壊してしまいます。自分で考えて、わからないときはすぐに先生やTAに質問してみましょう。本質的でない、素朴な疑問でも大丈夫です。「forループで使う変数の名前は、なんで”i”なんですか?」などでもかまいません。頭に浮かんだ疑問は片っ端から解決していくことにしましょう。本やネットで調べる授業の指定教科書は軽視されがちですが、意外と重要なことが書いてあったりします。プログラミングの入門書は玉石混交で、中にはひどいものもありますが、授業の教科書として指定されているなら、そこまでひどいことは書いていないはずです。一度、教科書にも目を通してみましょう。複数の参考書を利用するのも手です。ひとつの本だと多面的な視点が得られず、理解に苦労することがありますが、複数の参考書を見比べて、いろんな面から見てみると、案外簡単に理解できたりするものです。参考書はわざわざ買わずとも、大学の図書館にたくさん置いてあるはずです。行き詰ったときには、図書館で借りてみましょう。ネットで調べるという方法もあります。ネットには様々な情報が転がっていますし、質問サイトもあります。Overflow(http://stackoverflow.com/)が有名です。してもTAなどに相談しにくい、または先生やTAの知識レベルが信用できないとなったら、質問サイトを活用してみるのも手です。プログラミングにおいて気をつけたいことエラーメッセージを読むプログラミングにおいて困ることは、大きくふたつに分けられます。「思い通りに動かない」と「そもそも動作すらしない」です。慣れてくると「思い通りに動かない」に苦しめられることになるのですが、慣れるまでは「そもそも動作すらしない」に苦しめられることの方が多いと思います。そもそも動作すらしない場合、画面にエラーメッセージが表示されます。エラーメッセージは、なぜ動かないかの答えそのものであることが多いです。それにもよらずエラーメッセージを全く読まない人というのは非常に多く存在します。エラーメッセージを読むことで、初歩的なミスは簡単に解決することができます。単純な例を見てみましょう。0;}このプログラムは、aという変数の値と、bという変数の値を表示しようとするものです。in英語のメッセージですが、頑張って読んでみましょう。各未宣言な識別子はそれが使用される関数ひとつにつき一度だけ報告されますエラーは6行目27文字目における変数bが未宣言だと言っています。b;」のような宣言がないと、このプログラムは動かないと言っているのです。一度プログラムを眺めてみると、たしかに変数bに関する宣言はありません。これが動かない原因のようです。プログラムを修正してみましょう。0;}これでコンパイルに通り、動作するようになりました!しかしこういった宣言ミスはなかなか起こりません。0;}このプログラムにおいても同様のエラーが発生します。in6行目18文字目で未宣言エラーが発生しています。この原因は非常に単純で、単なるタイプミスです。user_name変数を使用しようとしているのに、user_nama変数を表示しようとして、エラーになっています。これはなかなか気づきません!しかしエラーメッセージをしっかり見ていれば、user_name変数を使用しているつもりなのに、変数が存在しないとエラーが表示される、つまりタイプミスをしている可能性があるのでは、と気づくことができます。他の例も見てみましょう。statusこれを訳してみます。ldは終了ステータス1を返しました今回はエラーがちょっと複雑ですね。なにやら「暗黙的」にprintf関数を使用していると警告されているようです。暗黙的ってなんだろう?なぜ?エラーには専門的な言葉がたくさん出てくるので、全部を読む必要はありません。printf関数になにかがあるとわかれば、それで大丈夫です。......よくみてみるとprintfがpirntfとタイプミスされていて、そんな関数は存在しないと怒られているようです。これも簡単に修正することができますね。^これは8行目に’}’ではなく、宣言(declaration)か式(statement)が期待されているというエラーです。いった場合には大抵字面通りに捉えると混乱します。‘{‘や‘}’などの括弧類が絡んでいるときはたいていの場合、文の開き忘れ・閉じ忘れです。この場合はプログラムをよく読むとfor文を閉じ忘れていることに気がつきます。このように、エラーメッセージをよく読むことで、どこにミスがあるのか、どんなミスをしているのか、ある程度予測がつくようになります。難しい言葉もたくさん出てくるので、エラーメッセージ全部を読む必要はありませんが、どこでエラーが起きているのかぐらいは見ておくと、楽になります。プログラムを読みやすくする膨大な数のエラーを乗り切って、ついにプログラムが動き出します!しかし今度は思った通りに動作しないのです。出力される値はぐちゃぐちゃで、全くのデタラメです。なってしまうのでしょうか。すればいいのでしょうか。意図しないプログラムの動作のことをバグといいます。バグは我々を苦しめる最大の要素で、プロのプログラマですら避けては通れぬ道なのです。やってバグと戦っていけばいいのでしょうか。ひとつの効果的な戦法としては、わかりやすいプログラムを書くという方法があります。プログラムは機械が読むだけではなく、人間が読むものでもあります。わかりやすいプログラムを書けば、それだけ人間のミスを減らし、バグを減らすことにつながります。プログラムというのは書きながら何度も読みますし、将来的に昔書いたプログラムを読み返すこともあります。そのときに読みやすく書けていれば理解の助けになりますし、バグにも気づきやすくなります。すればいいのかわからなくなったときは、とにかく「読みやすい」「綺麗な」プログラムを目指せばいいでしょう。すれば、きっとバグの原因も見つかります。わかりやすい変数名をつける読みやすいプログラムを書く方法の一つとして、変数にわかりやすい名前をつけるというものがあります。zなど、短くわかりにくい変数名をつける人が多いですが、もう少しわかりやすい名前にすると、プログラムを読みやすくなります。簡単な例を挙げてみましょう。0;}恐ろしいことに、この短いプログラムの中にすでにバグがあります!期待する出力は19.5ですが、実際に出力されるのは0.00195になります。これはプログラムを眺めていても解決しません。原因はもっと根源的な部分にあります。そもそもこのプログラムは、なんの説明もなしにいきなり出されると、なにをしているのかさっぱりわかりません。これはわかりにくい、悪いプログラムということになります。これを書き換えてみましょう。0;}これは変数の名前を書き換えただけです。みてみると......ああ!身長160メートル!そうです、BMIの計算では、身長はメートルを使うことになっています。身長の160.0の部分を、1.6に書き換えることで、正しい出力を得ることができます。このようにして、変数名にしっかりした名前をつけることで、バグを未然に発見することが楽になります。古い教科書においては、変数名はaやb、xやyなどといった短いものが使用されることが多いですが、現代では特に短くする必要はありません。長い変数名をつけていきましょう。変数名を工夫するコツは、必要な情報を名前に加えることです。上の例では「単位」が重要な要素となりました。単位は間違って入力しやすいので、変数名に単位の情報を加えてやると安心です。ループに使う変数名も同じです。0;}これもバグを含んでいます。faultと表示されます。これは内側のループでj++とするところをi++としているためです。ループを扱う時に、変数名に「i」や「j」を使うのはいいのですが、1文字だけだと、どうしても間違いやすくなります。長い変数名をつけてみましょう。いった行列の操作のときには、「row(行)」や「column(列)」といった変数名にするといいでしょう。0;}これでプログラムがわかりやすくなり、バグも発見しやすくなります。内側のループでrow++としていたら明らかに間違いだとわかるでしょう!コメントを入れる変数を工夫することでプログラムの流れをわかりやすくすることができます。変数名だけでは限界があります。そこでコメントの出番です。コメントを使うことで、プログラムに関係のないメモを書くことができます。コメントは特にプログラムが大規模になってきたときに有効です。プログラムの処理の流れを読むとき、5行程度のプログラムなら、なんとか大まかな流れは読めますが、20行などになってくると、なかなか難しくなります。そんなときにコメントがあると、とても読みやすくなります。実習の授業ではコメントを書かないという人が大多数ですが、できればコメントを書く癖をつけておきましょう。プログラミングに触れたてのときは、わかりやすい、綺麗なプログラムを書くことは困難です。試行錯誤しつつ行き当たりばったりで書くので、どうしてもぐちゃぐちゃしたプログラムになります。プログラムをある程度綺麗に描こうと努力するのはもちろんですが、コメントを使ってプログラム全体の見通しを良くする方法も身につけておきましょう。0;}何をしているのか、非常にわかりづらいプログラムです。実はこれは、入力された数値が素数かどうかを判定するプログラムです。括弧がたくさんあって読みにくいですね。頑張って工夫しても、なかなかシンプルになりません。そこでコメントの出番になります。数値を入力してもらう。入力された数値が素数がどうかを調べる。・入力が1以下のとき、素数ではない。・入力が2のとき、素数。・入力が偶数のとき、素数ではない。・入力がそれ以外のとき、input_number未満の奇数で割って素数かどうか調べる。3、5、7、9、...で割って調べる。nはinput_number未満の数とする。割り切れたら素数ではない。入力が素数がどうかによって表示を分ける。0;}比較的読みやすくなりました。完璧とまではいきませんが、ある程度の流れは追いやすくなっているはずです。この例では既に完成したプログラムにコメントを入れていきましたが、実際にはコメントを書きながらプログラムを書いて行く形になると思います。初めに大まかなコメントを入れて、それから書き始めるといいでしょう。数値を入力してもらう。入力された数値が素数がどうかを調べる。入力が素数かどうかによって表示を分ける。0;}これは空っぽのプログラムですが、コメントがあることでだいたいの流れが作られています。あとは流れに沿って書いていくだけなので、非常に簡単になります。コメントは、長いプログラム以外でも、もっと細かい規模で使うこともできます。user_name[20];このとき、なぜ20文字なのでしょうか。5文字ではダメなのでしょうか。100文字にしてはいけないのでしょうか。ここにコメントがあったとします。日本人の名前なら20文字もあれば十分入る。このコメントから、20という数字は考えて決められているとわかります。5ではおそらく少ないのでしょうし、100では大きすぎるのでしょう。いった風に、コメントでは、「この部分は何か(What)」よりも、「この部分はなぜこうなっているか(Why)」を書いた方が役立つと、世間一般では言われています。この説に縛られるのも毒ですが、ひとつの方針として心の中に持っておくと、あなたの助けになるでしょう。配列をソート(並び替え)する。今回は10要素程度なのでバブルソートでも一瞬で終わる。多い10000などの要素数になったら他のアルゴリズムを検討した方が良い。ソートした配列の中身を表示する。0;}これは配列をソート(並び替え)するプログラムです。アルゴリズムにはバブルソートというものを採用しています。コメントには「なぜ(Why)」が書かれています。コメントから、このソート方法は遅いが、今回の場合は全く問題ないということがわかります。1万要素の配列をソートする場合はこのアルゴリズムは避けた方がいいということもわかります。プログラムを読んだだけではわからない情報が、コメントからたくさん読み取ることができます。このようにして、プログラムにコメントをつけることで、追加の情報を付与して、読み手(ここでは自分自身)にとってわかりやすく仕上げることができます。コメントを入れる先ほどもコメントについて言及しましたが、一般論についてでした。大学の実習授業においては、コメントにはもっと違った役割があります。