ヤクの毛を刈った男
Yak Shavingとは
ある問題を解決しようとすると
そのためにまた別の問題が発生する、
ということが繰り返し起こる現象
yak shavingの例
- 「なんかサーバールームのUPSがピーピー言ってるなー。ちょっと調べてみるかー。」
- 「あれ?サーバールームにカギがかかっているのか。カギの暗証番号はなんだろう??」
- 「先輩に電話してなんとか暗証番号ゲット!やっとサーバールームに入れたー。」
- 「音が鳴っているこのUPSを調べたいんだけど、このUPSのマニュアルはどこだっけ?」
- 「マニュアルは別の倉庫部屋だったかなー。。またカギかかってたらヤだなー。」
- 「倉庫部屋でなんとかマニュアルを発見!カギかかってなくてよかった~。」
- 「ふむふむ、UPSの内部の状態はUSBでPC繋げば調べられるんだな。」
- 「ところで、UPSとPCを接続するケーブルはどこだっけ?」
- 「また倉庫部屋まで探しに行かなきゃなんないよ。。。遠いのに。。」
- 「はぁー。なんとか倉庫でケーブルを発見できたわー。しんどいわー。」
- 「さて、PCとUPSをケーブルで接続して、と。って、あれ?調査は専用ソフトが必要なの?」
- 「また倉庫部屋まで探しに行く必要があるかと思ったけど、ケーブルと一緒にCD-ROMあったわー。」
- 「さて、このCD-ROMからインストール・・・って、このノートPC、CDドライブついてねーじゃん!」
- 「なんだよー、今度は外付けCDドライブ探さなきゃなんないのかよー。。また倉庫部屋行くか・・・」
- 「っしゃぁー!案外すぐCDドライブ見つかってよかったー。よし、これでインストールできるかな?」
〜続き
- 「あれ?CDドライブが認識しないぞ?なんだよー、専用のドライバが必要なのかよー。」
- 「仕方ない、インターネット経由でドライバでも探してみるか。・・あれ?無線LAN繋がらない・・?」
- 「無線LANの接続設定が消えちゃってて、再設定が必要になっているじゃん!もう!」
- 「はぁ~、無線LAN再設定してなんとかドライバがゲットできた~。やっと、インストールできる・・・」
- 「今度はCD入れたのにインストーラが起動しないぞ?手動で実行してみるか・・・」
- 「がーん!このソフト、Windows98用じゃん!このPC、Windows7じゃん!無理じゃん!」
- 「仕方ない・・・ネットからWindows7用の専用ソフトを探してくるか・・・」
- 「なんとかVista用のが見つかったけど、300MBもあるし。DL遅いし。3時間もかかるじゃん。。」
- 「やっとダウンロード終わった・・・。これでインストールに取り掛かれる・・・。」
- 「うげ!インストールしようとしたら、必要なコンポーネントが見つかりません・・・だと!?」
- 「仕方ない、ネットから・・・ ~以後省略~」
- 「うげ!今度は・・・ ~以後省略~」
- ~以後省略~
今日のお話は、
そんなヤクの毛を刈ってしまった男の話
1月某日
その男はちょっとしたツールを作りたいと思っていた
「gitのbranchって消すの結構怖いな、簡単に戻せないし。
ゴミ箱機能あったらいいんじゃないかな?」
gitへのサブコマンドの追加、
男はそれが簡単にできることを知っていた
「よし、 "git trash-branch ブランチ名"って打ったら
trash/ブランチ名 へ移動してくれるようなコマンドを作ろう!」
作業時間:0.5h
「git サブコマンドは実質単なるスクリプトだから
Bash, Ruby, Perl, PHPなんでも使える。どれにしようかな・・・?」
→ 移植性を考えてbashに
「bashそういえばきちんと勉強してないな。
これを気に関数とか使えるようになるか」
→ 勉強してとりあえず書いてみる
「とりあえず書けたぞ、よし動かしてみよう。
問題ないな。やっぱちょろいじゃん」
作業時間:3h
「コマンド実行した場所がgitリポジトリ内かぐらいはチェックするか。
あと普通のコマンドならヘルプぐらい必要だよなー。」
「あれ、gitのヘルプってそういえば標準出力には垂れ流さずに
manページヘ行くよな。オリジナルのサブコマンドの場合どうするの?」
→ gitのコード漁った結果、
組み込みコマンドだけman開くことがわかる
「なんだよ微妙な仕様だな、しょうがねーから標準出力に出すか。
lsのヘルプ参考にしながら書こう」
作業時間:6h
こんなものにしておくかなー」
そう、ここが、この男の大きな分水嶺だったのです
「あ、そういえば今どきテストのないコードを
publicに公開するのはどうよ。
しかしgitのサブコマンドってテストできるのかな?」
作業時間:8h
「gitサブコマンドとはいえ所詮は単なるコマンドだから
コマンド実行と親和性よくてかつテストが書きやすいRubyならできそう。
rspec使って書くか!」
rubyとそのライブラリであるbundler, rspecを使って
試行錯誤しながら
テストを書く
「シェルスクリプトのテストは初めてだったから戸惑ったけど、
Rubyだから思ってたより楽に書けたぞ。
これでだいぶ信頼感が上がったはず!」
作業時間:12h
「そういえば以前gitサブコマンドを追加したときに
zshが補完してくれなくてイライラしたな。
たしかzsh用の補完スクリプトを追加すればいいはず」
男は同じことを以前一度しようとして断念していた
「zsh completionの仕様と仕組みは理解できたが、
git用のzsh補完スクリプトが複雑すぎて理解しにくい・・・」
・・・・
「やあっとできた、今までの工程で一番時間がかかったぞ」
作業時間:20h
「 そういえば事前調査のときに外国人も似たような機能求めてたな、
READMEを書き慣れるためにも英語でいっちょ頑張って書くか!」
「しんどー、思った以上にREADMEをしっかり書くのは難しいな。
あとはブログにまとめ書いて完了にするか!」
しかし男は気づいてしまう。
「インストール方法が今どき自動じゃないなんてダサくね?」
作業時間:24h
男はいまどきのアプリケーションはchefで書かれた
インストールスクリプトがデフォルトで付いてることを知っていた
「READMEにコマンド一発でインストールする方法書いたけど
chefのほうが今風だし、しゃーない書くか・・・」
しかし、男は3ヶ月前に
自分のlinux環境を全自動でセットアップする
chefスクリプトを断念していたのだった
「これ完成させねぇとchefスクリプト書いても
自分が使えないじゃん
※」
※2ヶ月前は単独のcookbookでの実行に
chef-applyが便利であることを知らなかった
作業時間:25h
「しょうがない、全自動chefセットアップスクリプトを完成させてから
git-trash-branchのchefスクリプト書くか」
「あれ、以前途中まで書いてたのが動かなくなってる。
chefのバージョン上がって仕様が変わったんだ・・・」
「berkshelfがcookbookを引っ張ってくるのに便利だけど
今この機能を十全に使えてない気がするんだよな。
たしか依存性の解決を任せられなかったっけ?」
「とりあえずRuby使いたいからrbenv入れたいんだけど
rbenvはrootでインストールするの微妙だな、ローカルに
chefでファイル置くってどうすればいいんだ?」
作業時間:1days
「ubuntu起動時に毎回する設定とかもどうせから全自動化しよう」
「dropboxとかgoogle-chromeとかgoogle-inputとかは
単にpackage 指定するだけでは入らないなー」
「なんかOSが上がってkeymap変更する設定が反映されないー」
・・・・・
作業時間:X Days
・・・・・
・・・・・
2ヶ月後
「やっとcookbook作ったー。
これで本当に全作業終わったはず、疲れた・・・」
男は最低限で満足していれば3時間で済んだ作業に
結局2ヶ月かかったのです
この男のgit-trash-branchに関するヤクの毛狩りの旅は、
幸いなことに2ヶ月で終わりました
しかしヤクの毛狩りはあらゆる場面、特にエンジニアリング周辺に
数多く潜んでいます
ex:
ソフトウェアをインストールしようとしたら前提条件が芋づる式に出てくる、
ちょっとしたコード上の挙動を変えようとしてライブラリをforkし修正する、
などなど・・・
ほら、あなたの手にもヤク用のバリカンが