整理の方法ブレスト

Twitterでブレストした内容、古くなると転記するのも面倒になるので今のうちに転記しておこう。



どうすれば部屋が片付くかをプログラマ的に考える。


まず「ものを捨てる」は最後の手段。ものを捨てれば片付くなんてのは「nの値が小さければこのO(n^3)のアルゴリズムでもかまわない」って言っているようなものだ。


よく言及される方法に「すべてのものに置く場所を作る」がある。これはO(1)でものを取り出すことのできる良い方法。鍵や財布や携帯をこの方法で整理すると外出時のオーバーヘッドが圧縮される。一方この方法を靴下に適用するのは適切ではない。靴下1, 2, ... nにそれぞれ同じサイズの領域を割り当てたりするのは容積の無駄。この場合はあふれる確率が無視できる程度に小さい「余裕のあるサイズ」の「靴下入れ」を作ってそこにつっこむのが一つの解。この設計は「個別の靴下を指定して取得することはない」という前提にたっているが靴下入れが十分に小さければ中身を一覧できるのでそこからの選択はO(1)


本がたくさんあるので透明のコンテナに詰めてみた。これはよくない設計。透明ならわかるだろうと思ったのは甘くて、背表紙があっちむいたりこっちむいたりで結局開けてみないと中身が確認できない。ただし全部まとめて段ボールに詰めるのに比べると移動しやすさの面でまだマシ。本を本棚に入れるのは前述のO(1)の方法に近い。ただし本棚はサイズの柔軟性に乏しいので大きくサイズの異なる書籍を一つの棚に入れるとパディングによって失われる空間が大きい。特に奥行き方向に無駄にされる空間の多さは問題。


いらないものを買わないのはもちろん重要だけども、問題は「いるものは買わなければいけない」という点。「部屋が本だらけなので新しい本を買いません」なんていう人は新しいものを学んで行くことができない。プログラマとしては致命的ではないだろうか。


机の上はvolatileな領域であって、長期間放置したときにそのままであることを期待してはいけない。別の作業をしているときにあふれて机の後ろに行ってしまうかもしれないし、一時的のつもりで上にものを置いたことによって極めて検索性に乏しい状態になってしまうかもしれない。机の上に出ていたものものは直前までアクセスしていた訳だから近いうちにまたアクセスされる可能性も高い。検索性を損ねる「積み重ね」がいかに悪い設計かは明らか。むしろ空の書類ケースを用意しておいて「作業中に別の作業が割り込んだら机の上のものを全部入れる」がいい。コンテキストスイッチぽい。


本をすべてO(1)でアクセスできる本棚を作るには僕の部屋は狭すぎる、という問題の解決がまだだ。この問題の解決方法はそれこそアクセス頻度の低い情報をコンテナボックスに詰めてしまうしかないかと思う。前回の失敗の原因は「透明だから大丈夫」と思ってインデックスを張らなかったことにある。「透明だから中が見える」は「箱の中が全部セーター」みたいな情報の密度が低いシチュエーションでしか真ではない。本のような個別のインスタンスにアクセスする必要がある場合はインデックスが必要。逆に言うと個別にアクセスしないなら本であってもインデックスがいらない。たとえば「箱の中全部スラムダンク」とか。

インデックスは箱が積まれた状態でアクセス可能でなければいけない。ということは側面でなければいけないということだ。

マンガや文庫本は本棚を買ったときに並べたくなるものの筆頭だが、マンガ文化について執筆中でもない限り「すばやくアクセスできる必要性」に乏しい。コンテナ行き候補筆頭。もしくは本棚の一番上や下のアクセシビリティの低い棚に配置されるべき。間違っても目線の高さとかにいれない。

インデックス自体もコンパクトにする。例えばデスノート全巻が入っている箱に各本のISBNを書いたりしない。デスノート全巻を同じ箱に入れていれば、まずデスノートの箱を見つけ出してそれから必要な巻を探せばいい。同時に読み出される傾向の高いデータはまとめるべきだしまとめることのできないデータこそインデックスが重要。

さて、箱から本を取り出して机の上などに一時的に置いて、読んだら、机の上に放置しない。たとえばまたすぐにアクセスする必要があるなら本棚へ、ないなら元の箱へ。これができるためにも本棚には常に空きスペースがなくてはいけない。


本棚に空きスペースがないと、入るべき本はどこか適当な場所に置かれることになり、システムが破綻する。本が入るべき場所が本棚とコンテナと決められているのにそれ以外の位置に本が置かれる事態は、サーバで言えばメモリ2ギガしか積んでいないのに3メガ必要になっているような状態で、本棚の奥の本を取るために手前の本をどけて、そのどけた本をまたジャマになったときにどけて、とスラッシングが発生してパフォーマンスが悲惨なことになる。そして検索性能はとても悪くなる。ギリギリではなく「新しい本が入る余地」を含めて設計する必要がある。

人間の脳は極めて信頼性の低いストレージなので脳にインデックスを格納しようとしてはいけない。A4用紙にでも印刷して壁に貼ればすむ話。問題は極めて更新頻度の高い一部の領域(冷蔵庫とか)だ。印刷が必要なシステムだとシステム運用コストが高すぎて破綻しそうだ。

おそらく本棚の一番目につくポジションは「新しくやってきた本入れ」にするべきなんだろうな。目につくと読みたくなるし。積んでしまうから読むのを忘れる。あー、しかし一つの棚にいろいろなサイズのものを入れると空間効率が…いや、いいのか。もともとその棚はきっちり詰めてはいけない棚だ。


(本棚を移動するときにルール決めない方がよかったと思った、いまはルール無しにしている、という意見に対して) 本棚を移動するときにまた別の問題があることは間違いない。しかし本棚を移動する頻度は本棚から本を取り出す頻度に比べて十分小さい。逆に、ルールを廃しても問題が起きないなら最初に導入していたルールが必要以上に詳細で維持コストの高いものだったということだ。

まあ基本的に僕の考えは「本棚を詳細に分類すべき」というもの*ではない*。むしろ本棚は視線を走らせるだけで目的のものを見つけ出せるのであまり分類の必要がない。問題は本棚が壁面という貴重なリソースを消費する関係上無尽蔵には増やせないことと、壁中を本棚にしても収まらない量の本があること。

それが本棚であるかどうかは別にして「買ってきた本が入る場所」は本を買う前にアロケートされている必要がある。さもなければ買ってきた本が積まれたり袋に入ったまま放置されることになって部屋が大変なことになる。

@hkondo それはなかなかいい方法ですね! > 箱に年月日時分を書いて、詰められる本と一緒にデジカメで写真

ユニークなIDを振る場合に、連番整数にしようとすると「直前のIDがなんであるか」をルックアップする必要が出てきてコストが高い。日時を元にIDを作る方法はコストが安い。僕も研究ノートに最初は連番整数を振っていたのだけどもそのうち分からなくなって年月日+数字にした。