- 2011年3月28日 10:00 AM
- 雑記

まずは、個人的な話から。
会社を辞めて、ちょうど1年。Webサービスを作り始めて、4年以上経つでしょうか。
学校でプログラムを習い、それを基礎にWebサービスを作り始めました。
私は高専で、情報工学を専攻していました。
そのため、情報関連技術の基礎的なところは、ひと通り、学校で学んで来ました。
Webサービスを作り始めて、学校で学んだそれらの知識も役立っています。
しかし、確実に学校だけでは、学べないことがあります。
それが、今回のテーマである”長期か、短期か、それが問題だ“です。
ここからは、私が感じる、学生時代に学べなかった、これから学ぶべきことをまとめていきます。
長期的視点を持つこと

長期的視点、それは言い換えると、”運用を考える“ということです。
運用と一言に言っても、様々な運用があります。
- インフラの運用
- サービスの運用
- コードの運用
インフラとサービスの運用はイメージが付きやすいでしょう。
インフラの運用は、サーバを含めたハードウェア周りを落とさずに運用すること。
サービスの運用は、そのサービスがうまく回るように、様々なメンテナンスをしていくこと。
恐らく、学校でプログラミング言語だけを習った人は、コードの運用が理解しにくいでしょう。
コードの運用、それはつまり、
未来を考えてコードを組むこと
です。
それが、オブジェクト指向設計や、言語自体の思想、そして良いコードとは何かと言う問いに繋がります。
コードは必ず、変化します。
プログラマはある問題を解決するために、コードを組みます。
そして、この問題を解決するコードが完成します。
完成したコードに対して、この後、必ず次のことが起こります。
- 完成したコードでは問題を完全に解決できなかった
- > いわゆる、バグ
- 問題自体が変わってしまった
- > 機能追加
会社に入ってコードを書くと、この二つのことに頻繁に悩まされます。
学生時代にも、コードは書きます。
卒業研究のため、課題のため、自分の趣味のため…など。
しかし、これらのコードには重要な点が抜け落ちています。
これらのコードには、定期的なフィードバックがないのです。
学生時代に組むコードの多くは、その場限りのコードです。
問題は変化しないし、長期的に運用することによるバグも発生しません。
そのため、機能追加もなく、人のコードを読む必要がありません。
会社で組むコードは、これの真逆です。
問題は変化し、長期的に運用することによるバグが発生します。
新規にコードを組むよりも、機能追加のほうが多いでしょう。
つまり、他の人が書いたドキュメントも存在しないコードを、読まねばなりません。
これが、新卒プログラマが初めに自覚すべき点だと、私は思います。
補足:
ただし、学生時代からオープンソースに貢献してきた学生は、その限りではないかと。
オープンソースほど、自分のコードが洗練される場はありません。
先ほど述べた全ての点が、詰まっていますからね。
それと、学生時代の話は、私の経験上です。
上記のようなコードばかりなのは、高専という特殊な場に居たせいかもしれません。
大学ではもっと違うコードを書くよ。という話があれば、コメントください。
参考になります。
長期か、短期か、見分けること

会社のために書くコードは、全てが長期的であるべきです。
それは、そのコードが自分が会社を辞めた後も、運用される可能性があるから。
しかし、自分のためのコードはどうでしょう。
これは、逆に短期的なコードをたくさん書くべきです。
ここで言う自分のためのコードとは、以下のようなコードです。
- 複数のデータをまとめて処理するための、エクセルのマクロ
- ソースコード内の変数名を置き換えるための、正規表現
- フレームワークのソースを高速に編集するための、vimのスクリプト
- 頻繁に行う処理を簡単にするための、Linuxコマンドのワンライナー
これらは全て、自分の作業をコンピュータに任せるためのコードです。
これは、コンピュータに任せられる!と閃いたら、すぐにコードにしましょう。
長期的なコードに必要な、テストも、抽象化も、全て不要です。
あまり考えずに、ざっくり作っちゃいましょう。
それらのコードは、自分で使っているうちに洗練されるはずです。
今、自分が書こうとしているコードは、長期的なのか、それとも短期的なのか、常に見極める必要があります。
言語を極めること

自分が使える言語を一つ以上、持ちましょう。
プログラミング言語の母国語のようなものです。
その言語であれば、すぐにコードが思いつくレベルまで、言語を極めることが大事です。
このような言語が一つあると、まず、コードを書くのが早くなります。
リファレンスも不要で、コードが書けます。
集中してコーディングでき、効率が上がります。
言語を一つ極めると、他の言語の習得も早くなります。
英語が話せるようになると、他の国の言葉も早く習得できるのにも、似ています。
基本的には、各言語で方言があるだけ。
その方言の使い方を理解し、それが内部的に何をしているか、理解すること。
中途半端に、色々な言語をやるよりも、まず、一つの言語を極めたほうが良いでしょう。
そうすれば、自然と他の言語も話せるようになるんです。
私は、PHP > Python > Cの順で、コードが書けます。
(JavaやVBも書けますが、使いこなせるレベルじゃない)
Pythonを学んだときは、PHPの知識をベースに学びました。
今は、Object-Cの勉強をしていますが、CとPHPと比べながら、学んでます。
自分の得意な言語があると、それと新しい言語を比較しながら学習できます。
言語を極めた基準の一つに、適切なテストコードが書ける、ということが挙げられます。
テストコードを書くには、かなりスキルが必要です。
正直、簡単なロジックを組むよりも、適切なテストコードを書くほうが難しい。
抽象化し、テストし易くするために、その言語の特性を利用していくためです。
逆に、テストコードほど、参考になるコードはありません。
他の人の書いた、テストコードを、そして、テスト対象のコードを読むことで、言語の理解が飛躍的に高まります。
長々と書いてしまいましたが、まずは得意な言語を持ちましょう。
どんな言語であれ、一つでも得意な言語があれば、色々とメリットがあるよ。ということが、言いたいのです。
正直、この記事には、まったく意味がないのかもしれません。
なぜなら、これらのことに気付けない学生は、こんな記事を読んでいないだろうし。
(そう、私自身そうでした。ま、こうやって自分を一般化するのは良くないんですけどね。)
逆に、この記事にたどり着いた学生は、これらのことに少なからず気づいているはずです。
これを読んで、少しでも、楽しくプログラムを組める人が増えることを望みます。
それに、私も更にステップアップして、次のレベルの記事が書ければ良いな。
ちょっと一言
今、亀有のnagicafe+に来て、記事を上げています。
nagicafe+、オススメです。集中して作業できますよ。
亀有に来た方は是非、お立ち寄りを。

