コードポケット - アプリケーションをささっと作るコツ

誰に教えられたのでもないのですが、ぼくは冬眠前のリスのようにコード片を溜め込んでいます。

コード片とは、ライブラリにするほどまとまった大きさではない、数行〜十数行のコードのことで、溜め込んだコード片は、アプリケーションやツールを作るときに使っています。

例えば「Perlでメール送るのどう書くんだっけかな」とか「Pythonでファイル開いて全部読むのどう書くんだっけかな」とかというときに、溜め込んだ中からコード片をさっと取り出してコピペした後、なじむようにちょっと修正して使っています。



コードポケット

コードを溜め込んでいるディレクトリをぼくは「コードポケット」と名付けていて、コード片を取り出すことを「ポケットからコードを取り出す」と呼んでいます。先日、知り合いが似たようなことを実践していて、その人は「コードスケッチ」と呼んでました。いい名前ですね。

ぼくの場合、コードポケットは ~/lang/言語名/ の下にばらっとファイルがあるだけという昭和風の構成です。コード片が多い言語は用途に応じてサブディレクトリを作ったりもしています。

ポケットからコードを取り出すには、ファイル/ディレクトリ名で検索しています。

以下のような、 iname (あいなめ) という名の大文字小文字を同一視して名前の部分一致検索するシェル関数と、よくtypoするのでinaemというaliasを作っています。

iname() {
  find . -type d -name .svn -prune -o \( -iname "*$1*" -print \)
}
alias inaem=iname

例えばrubyでファイルを読みたいなーというときは、こんな風にして探しています。

$ cd ~/lang/ruby
$ iname file
./file
./profile
./profile/doprofile.sh
./profile/profileme.rb

「file」というディレクトリが引っかかったのでその中を見てみると、open-each.rbというファイル名のおめあてのコード片がありました。

ポイントはファイル/ディレクトリの名前のつけ方で、将来の自分が検索しそうなキーワードをいくつか羅列した名前にしたり、シンボリックリンクをはって別な名前をつけたりしています。

ポケットになにを入れるか

10年以上ポケットにコード片を詰め込んできて、自分なりのコツがいくつかあるので紹介します。

  • 自分で書いたり動かしたりしたコード片をポケットに入れる
    • よそからコピペしたのをそのまま入れるより、コピペしてからちょっとでもいじって動かしてみてコメントつけたコード片の方があとあと役に立つ度が高い気がします。
  • 鮮度を保つ
    • コードの書き方や使うライブラリは、流行り廃りがあるので、「お!いいな、このコード」「へーこういう書き方もあるんだー」と思ったらすかさず自分のポケットの中のコード片も更新するようにします。
  • OSSのプロダクトとかはポケットに入れない
    • おっきすぎてはいりません。
    • いれちゃうと検索でヒットするのが増え過ぎます。今ならコードサーチで検索すれば十分でしょう。
    • コードポケットは、あくまで自分が書いた/見つけた小さいコードを入れておく、というのがミソだと思っています。


最後に、ぼくのポケットの中のファイル数を晒します。コードじゃないファイルもカウントしてるんで正確性は低いですが、まぁこんな感じという雰囲気は伝わるんでないかと思います。

$ for l in *; do printf "%-12s %4d\n" $l $(find $l -type f|wc -l); done | sort -k2nr
perl         1460
java         1010
c             568
sql           231
sh            186
php           141
js             41
ruby           37
as             33
erlang         30
rrd            30
ps             28
make           22
graphviz       21
tk             20
awk            17
gnuplot        13
python         13
sed            10
elisp           5
tcl             5
expect          4

Enjoy!