部分的に実行出来る事 - 機械学習時代のプログラム原則
前回の勉強会は環境設定の回で自分が当番だったのだが、話す予定の半分くらいしか終わらなかったので、今週末に再びやる事になった。で、プログラミングをする上でのポイントのような物を話したいと思っている。
過去に自分が学んできた事や経験から思っている事を、あまりプログラム経験が無い人に伝えるにはどうしたらいいか?と考えると、これがなかなか難しい。
普段はWriting Solid Codeだとかプログラミング作法だとかリファクタリングだとかCode CompleteだとかxUnit Text Patternsだとか、それこそ膨大な本を読んだ結果を前提とした上で自分の考えを語る訳だ。だから、それらが全て無い状態から話す、というのは結構難しい事だ。
Writing Solid Codeのデバッガで一行ずつ全ての行をステップ実行せよ、を現代の機械学習のプログラミングに翻訳すると、全てのコード片をそこ単体をトップレベルとしてShift+Enterで実行する事、に相当するんじゃないか、と最近思っている。
for文の中とか、関数の中とか、それをShift+Enterで実行出来るようにつくるのは結構難しい。 だがそうやって実行して結果を見ていく事が、全ての行を目で確認していく、という事に相当しているんじゃないか。 さらにはなにかおかしな事があった時に、順番に正しいかどうかを確認していく為に、一つ一つ確認しながら順番に実行していける状態を維持するのは、Test Doubleの足場を維持してDIとかを駆使してなるべくPOJOとして使えるように保っておく事にも相当している気がする。
for文をコード片として実行する小細工
for row in range(5):
tile = img[row*tile_h:(row+1)*tile_h, 0:tilw_w, :]
...
みたいなセルがあった時に、
row = 5
というセルを作って、forの中を抜き出したセルを作る。
tile = img[row*tile_h:(row+1)*tile_h, 0:tile_w, :]
...
これでfor文の中を特定の状態で実行する事が出来るようになる。 for文を書く時はまずラベルをハードコードしたセルを作り、それを元に実行して動作を確認してからfor文にする。
この手順に従ってコードを書いていくと、自然とこのような手段でコード片を自由に実行しやすいような、Jupyter Notebook向きのフラットなコードになっていくので、動作を確認する以上にご利益がある。