最近プログラムを書いていて思うこと

いろいろ書いてみる。

できるだけコードを書くな

プログラマがコードを書けば書くほどバグが増える。コードはできるだけ書かないほうがいい。

言い換えると、すでにある良質なライブラリ・モジュール・言語機能を使いまわせ、ということ。すでにある機能の車輪の再発明して欠陥を生み出すのは避けよう。そのほうがテストも楽だし品質もいい。

でもそれができるためには、そもそも、そういう便利なライブラリや言語機能を知らなければならない。

私は面倒くさがりだから、なにか面倒なプログラムを書かなければならない時、「こういうことをやりたいんだけど、どうせ同じ問題に誰かが直面してるだろう」と予想してstackoverflowなんかを検索してみる。出てきたコードから、レガシーな書き方(forループぐるぐる巻きとか)をしておらず、さらに、標準の言語機能やライブラリを多用しているものを選び、「参考に」する。コピペすると勉強にならないし、誰かが作ったバグを紛れ込ませることにもなるから。

このやり方は結構いいと思ってる。これで私は今まで知らなかった言語機能やライブラリをたくさん知った。

Javaの場合はAPIリファレンスの出来がすごく良いので、リファレンスだけ読んでればだいたいわかったけど、C#はリファレンスがウンコなのでこういうやり方をせざるを得ない。が、今のところ最良だと思っている。

モジュール指向的なやり方を実践する上でもっと良いやり方があれば教えてほしい。

単体テストを書け

未だに単体テストの重要性を理解しない人が私の周りには多い。

ユニットテストのテストケース書いたことあります?から始まって、使い方をひと通り説明したあと、必ず「なんでそんな面倒くさいことすんの?」という顔をされるか、「そうやってユニットテストが重要だって言う奴、いっぱいいるけど、絶対意味ねーよ」という顔をされるかのどちらかである。

単体テストを書くのが意味ない、という人は、ひとつのソフトウェアをメンテ、機能拡張しながら長い間作り続けるということをしたことがないんじゃないかな。普通、ソフトウェアは作ってハイ、終わり。じゃなくて、継続的にメンテしていく必要がある。そのたびに細かい試験を何度もやってられない。

WPFの衝撃

単体テストの重要性については先に書いた。だが、単体テストが作りにくいようなケースが存在する。それがUIである。

昔から、UIとデータは分離させろ、なんつって、MVCだとか何だとか言われてきたのだけど、WebなUIはともかく、クライアントソフト、特にMS系の環境ではそれがとても難しかった。

WinFormsのBinding機構はとても貧弱で、ちょっと複雑なことをするとたくさんイベントを書かなければならず、すぐにスパゲッティコードみたいな事になってしまう。ADO.NETとBindingが目指した目的は理解できるが、正しく設計されたとは到底思えない。

UIの状態とイベント処理とデータそのものが密結合されているので、単体テストも書くのにも苦労する。

その点に関してはWPFはかなり先進的である。まず、ほぼ完全にUIとデータ、ロジックが分離できる(MVVMモデルという)。それを可能にしているのが、ずっと強力になったBinding機能だ。WPFでは基本的にデータバインディングを通じてコントロールを操作することになるが、従来のようにコントロールのプロパティをコードでちまちまいじって操作することもできなくはない。

この点に関しても、ネットでは批判が多いようだ。なぜこれほどまでに仕様変更するのか?コントロールにデータを設定することすらままならない。面倒くさい。と。その理由は、データバインディングが前提となっているからなのだけれども、それを理解しないと前述のような印象を抱くことになる。

私は今後、Windowsクライアントで何かする案件があったら、余程のことがない限りWPF+.NET 4.5を推すだろうと思う。

ただし、そうすることで新しい技術についていけない技術者は切り捨てることになる。私の職場では未だにオブジェクト指向が何なのかがよくわかっていない人間も多い。ましてやLINQ、ラムダ式、async/await、XAMLなんてちんぷんかんぷんだろう。(ちなみに、彼らもWindowsクライアントソフトを作った経験が沢山あるので、素人というわけではないのだ)

個人的には、勉強しない技術者なんて技術者じゃないと思ってるので、勉強しない人たちは大いに切り捨てるべきだと思うのだけど、現実的・経営的視点から考えるとそういうわけにも行かない。

じゃあどうすんの?勉強して新しい技術を習得してる人たちが我慢して低いレベル、古い標準に合わせるの?ということもあって、どうすりゃあいいんかなあ。

以前、こんなことをブログに書いている人がいた。

「今は文系大学卒とか、コンピュータに関する専門知識が無い人がプログラマとして仕事をすることが多いけれども、今後は情報系大学修士卒とか、コンピュータに関する専門知識を持った人のみがプログラムを書くような時代に移っていくだろう」と。

私は情報系大学修士卒、とは言いすぎだと思うが、概ね同意する。少なくとも、アルゴリズムとデータ構造、基本的な計算機アーキテクチャ、設計論、プログラミングのパラダイムなどを独学でもいいから勉強した人たちが多数を占めるような環境でプログラムを作ることができたら、少なくとも今よりはマシになるだろう。という、控えめな表現にしておく。

英語を読め

先の話とかぶるんだけど、英語はやっぱプログラマにとって重要だ。
ソースは普通英語で書くのが普通だし、技術文書も英語が多いし、ユーザーコミュニティの規模も英語コミュニティのほうが大体でかい。

だから英語を慣れ親しんでおく必要が有る。

以上、特にまとまりもないけどこんな感じ。