本当に「わかりやすい」参考書が欲しい?

10年前ぐらいに、C言語の仕事を始める人向けに書いたテキスト

序文

自分は学生の頃からプログラマ志望だったので、どの参考書がいいか、という話をずいぶんしてきた。しかしかつての自分の経験を振り返ってみると、間違った選択をずいぶんしたと思う。

その頃の自分に言いたい、自分にとっての真実を以下に書く。

参考書を買うのはどんな時か

もしも1週間後に資格試験を受けるなら、合格するためのわかりやすい参考書が欲しいと思うのは当然だ。また学生で期末試験を控えていて、これから出題範囲の勉強を始めるというのなら、短い時間で理解できる、わかりやすい参考書を使って勉強するべきだと考えるだろう。

現実には

しかし新しいプログラミング言語を学びたいという時……ペーパーテストを受けるわけでもない時……その人にとって必要なものは、本当に「わかりやすい」参考書なのだろうか。

実際のところは、そのプログラミング言語を使って、何か作りたいとか、新しい仕事が欲しいとか、そういう事だろう。

だから参考書が分かりやすかろうが、分かりにくかろうが、それを読んでいる時間なんて、プログラムをする時間に比べると物凄く短い時間になるだろう。
そして1週間もしないうちに、参考書がわかりやすいかどうかなんて気にもしなくなって、索引のページで目当ての記事を探したり、F1キーでMSDNを表示したり、manコマンドを入力したり、Googleツールバーに知りたい事を入力したりしかしなくなる。

どうするべきか

だからあまり、わかりやすい参考書を探すのに必死にならないほうがいい。もしもC言語の本を1ヶ月間読み続けたりしているのなら、これからそんな事はしないようにしよう。

自分の書きたいプログラムを書こうとして、それを実現するために参考書を利用するようにしよう。

C言語を使うなら、「エキスパートCプログラミング」は面白いから早めに読むといい。「プログラミング作法」とかはいい本だけど、後出しのCode Completeの方がまとまってるからそれだけ読む方が効率がいい。Code Completeを最初のページから順に読んでいくのはダルいので、最初は自分が興味を持てそうな章だけ読むのをお勧めする。

XMLはわかりやすいか

以下はRailsが登場していない10年以上前に書いたテキストで、今では

Strutsオブジェクト指向XMLに不慣れな人にとっては難しいだろうけど、なにしろオブジェクト指向XMLなのでちゃんと習得すれば開発の効率が良くて保守性が高いんですヨ。しっかり時間をかけてStrutsの設計しましょうね」

などとフザけた妄言をまき散らす無能が周りにいなくなってしまったので、もう不要なのだけれども、また同じようなことが繰り返されるであろうのでなんとなく残しておく。

 

続きを読む

ビットシフトのメモ

以前ポストしたやつの再掲

こんなソースを見た(C言語

mask = 0;
for(i = 0 ; i < num ; i++)
{
    mask |= 1<<i;

パッと見て、1行に出来そうだと思ったのだが、5分ぐらい悩んでしまう。退化してるな自分。

mask = ~(~0 << num);

次はこれ

hoge = hoge&mask<<allbitnum;
hoge = hoge>>allbitnum

10分ぐらい、左にビットシフトしたあと、その後右にビットシフトしてると思ってしまった。
ビットシフトの方が優先順位高いのね。ていうか先に右にシフトすればいいじゃん! なんでこんなコードになったんだ。

1から書き直すことが、いつだって間違っている理由

最初に

ろくにドキュメントが整備されていなくて、わけのわからないソースだらけの巨大なソフトウェアがある時、1から作り直した方がいいって思う人はたくさんいる。
自分も昔はそうだった。でもいくつかの1から作り直すプロジェクトに参加して、それがいつだって間違っている事に気づいた。そのことについて。

意外とみな気づいていないこと

何百ページもある本を熟読するさまを想像してみて欲しい。そして、1ヶ月ほどでその本を読み終わったとしよう。

そして読み終わった後、本の内容を思い出しながら書き出してみると、どの位の量を書き出せるだろうか?

実際にやってみると、ほとんどの人は、数ページぐらいしか書き出すことが出来ない。A4レポート用紙一枚も埋められないアホもいる(これは私のことだ) 

実はこれが、「1から書き直すソフトウェア開発」で起こっている事なのだ。あらゆる人たち(もちろんプログラマも含めて!)が、「1から書き直せば簡単だ!」とわめき散らすのに、やってみるとなぜかうまくいかない理由はここにある。実際の仕様は何百ページ分もあるのに、みんな数ページ分の仕様しか思い出せないのだ。だから1から書き直すなんて、すぐ出来るような気がする。

現実

でも1から書き直し始めて、しばらくすると、思い出せなかった部分(≒仕様書になっていなかった部分)が、だんだんその姿を現してくる。

同僚との会話の中(例:ねえそういえば、データを保存するサーバをメンテナンスする時はどうするの?)で、記憶が浮かび上がってくることもあるし、必要に迫られて(例:ファイルを読み込みにいくのだが、時々別のプロセスがそのファイルをおかしな形にしている瞬間がある)考えざるを得なくなる場合もある。どうあれ最終的には、捨てた(はずの)ソースに書かれていることの、全ての内容を網羅しないといけなくなる。

全てを網羅できないなら、1から書き直すことで、機能を減らしたってことになる。

結末

なんてことだろう。1から書き直せば、短い時間で、綺麗な、同じ機能のソフトウェアが手に入ると思ったのに。汚らしい古いプログラムでは出来ていたことが、1から書き直したプログラムでは出来ていないケースのあまりの多さに愕然とするのだ。

そしてプロジェクトが(スケジュール的に)終盤にさしかかる時になってやっと、1から書き直し始めた時には考えてもいなかった仕様について決めて、今プログラムを書いているメンバーにそれを伝えて、スケジュールが迫っているから兎に角急いで実装してくれという話がプロジェクトのあちこちで見られるようになったとき、そのプロジェクトを立ち上げた人はこう思うようになる。ドキュメントがなくて、クソみたいなプログラムしかないから1から書き直したのに、今では似たようなドキュメントのないクソプログラムになりつつある・・・ そして本当にそうなる。

結論

以上の経験からわかったのは、1から書き直したからといって、以前に書いた時よりも素早く、綺麗なソフトウェアが手に入る合理的な理由はないということだ。仕様書が充実していて、エラー処理などを含む必要な機能をちゃんと定義できていれば、もしかしたら上手く作れるかもしれない。しかしそれでも、びっくりするほど素早くソフトウェアを作れる理由にはならない。

それに、そもそも1から書き直したい理由の1つは、仕様書が貧しくて、かつ既存のソースがよく分からないからだったはずだ。

だから1から書き直したくなった時、本当に必要なのは1から書き直す時間ではない。
ひどいソースを理解する時間や、足りない仕様書を書く時間や、リファクタリングする時間や、バグ対応する時間が必要だ。
これらは1から作り直すことに比べて、ずっと作業時間の見積もりがし易く、現実的なスケジュールを立てることが出来る作業だ。

補足

この話に例外があるとすると、それは仕様が本当に数ページしかない場合だ。たとえば画期的なアルゴリズムが発明されて、そのアルゴリズムはいくつかの数式で表されていて、それを実証するプログラムが自分の手元にあるとしよう。そういうものを理解するには、自分で書き直してみる事が一番冴えたやり方かもしれない。でもそんな場合は、1から書き直すべきだ、なんてわざわざ主張することもないだろう。

あと移植作業のことを「1から書き直す」作業ととらえる人もいるようなのだが、もちろんそういうのはこの話には含まれない。そういう作業をするプログラマは、移植前と移植後のコードが機能的に等価であることを保証するのは当然だと認識し、最初からそのように取り組むだろうから。

SQLite フロントエンド 色々メモ

PupSQLite .NET Framework4

Pup's Atelier-Software

一番良かった。
自分が作ったINSERT文が間違っていて、DATETIME型のカラムに日付にならない整数を入れてしまったとき、エラーが発生して編集できなくなったことだけが不便だった点。

Navicat for SQLite

Navicat for SQLite | SQLite のDB管理のための強力なGUI ツールです。

商用ソフト。6000円らしい。購入画面で 6,000.00 Yen と表示されて60万円かと思った。
なかなか良かったが、自分が利用する範囲では、PupSQLiteで十分なので購入しなかった。
先に書いた、カラム型と矛盾するデータを入れてしまった場合でもテーブルの内容を編集可能だった。コマンドラインでの操作を全くやる気がなく、全部GUIで作業を完結させる気ならこっちが良さそう。

SQLite Administrator

SQLite Administrator - International Milestone Beta

Excel ファイルを編集するみたいにテーブルの内容を変更したーい。
という自分の希望はかなえてくれないソフト。CSVデータでのインポート/エクスポートなどは可能。

入力UIの方針が自分の好みだったため、テーブルの作成などはこのアプリがいいかな……と最初は思ったものの、Default Valueの指定で 0 と入れたらその後いつのまにか ''0''('0'という文字列の周りにさらにシングルクォーテーション)となっていたりして、なんでそうなるのやら理解できないため使うのを止めた。

SQLiteCC3-j

SQLite ControlCenter 日本語版

先に書いた、''0''問題や不正なデータをINSERTしたら編集できなくなった問題で困ってあれこれしているうちに、なんとなく使わなくなった。
が、SQLiteCC3には罪は無かったのかもしれない。PupSQLiteが活発に更新されているので、そっちを使おうと思っているが、これも良さそう。