ヤクの毛を刈った男

Yak Shavingとは

ある問題を解決しようとすると
そのためにまた別の問題が発生する、
ということが繰り返し起こる現象

yak shavingの例

  1. 「なんかサーバールームのUPSがピーピー言ってるなー。ちょっと調べてみるかー。」
  2. 「あれ?サーバールームにカギがかかっているのか。カギの暗証番号はなんだろう??」
  3. 「先輩に電話してなんとか暗証番号ゲット!やっとサーバールームに入れたー。」
  4. 「音が鳴っているこのUPSを調べたいんだけど、このUPSのマニュアルはどこだっけ?」
  5. 「マニュアルは別の倉庫部屋だったかなー。。またカギかかってたらヤだなー。」
  6. 「倉庫部屋でなんとかマニュアルを発見!カギかかってなくてよかった~。」
  7. 「ふむふむ、UPSの内部の状態はUSBでPC繋げば調べられるんだな。」
  8. 「ところで、UPSとPCを接続するケーブルはどこだっけ?」
  9. 「また倉庫部屋まで探しに行かなきゃなんないよ。。。遠いのに。。」
  10. 「はぁー。なんとか倉庫でケーブルを発見できたわー。しんどいわー。」
  11. 「さて、PCとUPSをケーブルで接続して、と。って、あれ?調査は専用ソフトが必要なの?」
  12. 「また倉庫部屋まで探しに行く必要があるかと思ったけど、ケーブルと一緒にCD-ROMあったわー。」
  13. 「さて、このCD-ROMからインストール・・・って、このノートPC、CDドライブついてねーじゃん!」
  14. 「なんだよー、今度は外付けCDドライブ探さなきゃなんないのかよー。。また倉庫部屋行くか・・・」
  15. 「っしゃぁー!案外すぐCDドライブ見つかってよかったー。よし、これでインストールできるかな?」

〜続き

  1. 「あれ?CDドライブが認識しないぞ?なんだよー、専用のドライバが必要なのかよー。」
  2. 「仕方ない、インターネット経由でドライバでも探してみるか。・・あれ?無線LAN繋がらない・・?」
  3. 「無線LANの接続設定が消えちゃってて、再設定が必要になっているじゃん!もう!」
  4. 「はぁ~、無線LAN再設定してなんとかドライバがゲットできた~。やっと、インストールできる・・・」
  5. 「今度はCD入れたのにインストーラが起動しないぞ?手動で実行してみるか・・・」
  6. 「がーん!このソフト、Windows98用じゃん!このPC、Windows7じゃん!無理じゃん!」
  7. 「仕方ない・・・ネットからWindows7用の専用ソフトを探してくるか・・・」
  8. 「なんとかVista用のが見つかったけど、300MBもあるし。DL遅いし。3時間もかかるじゃん。。」
  9. 「やっとダウンロード終わった・・・。これでインストールに取り掛かれる・・・。」
  10. 「うげ!インストールしようとしたら、必要なコンポーネントが見つかりません・・・だと!?」
  11. 「仕方ない、ネットから・・・ ~以後省略~」
  12. 「うげ!今度は・・・ ~以後省略~」
  13.  ~以後省略~


今日のお話は、

そんなヤクの毛を刈ってしまった男の話

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
「よし、ひと通り動作確認したしgithubにpushもできた
こんなものにしておくかなー」

そう、ここが、この男の大きな分水嶺だったのです



「あ、そういえば今どきテストのないコードを
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し修正する、
などなど・・・
ほら、あなたの手にもヤク用のバリカンが 

おまけ:本当の奇妙な物語







こんなに頑張って作ったのに


だれ一人使ってない


世にも奇妙な物語 - ヤクの毛を刈った男

By kbigwheel

世にも奇妙な物語 - ヤクの毛を刈った男

  • 2,927