メソッド屋のブログ

米マイクロソフト DevOps エバンジェリスト 牛尾の日記です。ソフトウェア開発の上手なやり方を追求するのがライフワーク。本ブログは、個人の意見であり、所属会社とは関係がありません。

ハマりの本質とその対策

しばらく、ちょっと日本語でブログ書かなくなると思いますが、その最後のエントリをば。


私は技術調査とかでよくハマるタイプです。ここ数日もハマっていて、なんで俺はこんなハマるんだろう?ハマらない人との違いはどうなんだろう?とかいろいろ考えてみました。今回はあるプラットフォームのOAuth認証でどっぷりハマりました。ちょっと特殊なので、OAuthの仕様をこってり読み込んで、早速プログラミング。特殊なので、通常のライブラリと、手作りのライブラリ両方で試してみますがどちらも401. Unauthorized が出てきます。


サンプルのPHPはいただいているのですが、Rubyで作るので、Rubyで作ったサンプルでログを出すようにしたりして、Oauthのsignature等が正しいかムッチャクチャ検証しましたが、特に問題ないみたい。しかし401. Unauthorized。 Consumer/Secretは実績のあるものです。


仕方が無いので触った事無いけど、PHPを解析して、とりあえず動かしてみる事に、、、動かすとcURLとやらのライブラリを入れなアカンとのこと。しかし、MacPortで入れようとしたら、我がライオンちゃんではエラーが、、、おぉぉぉぉめんどくせーーーーーーーっ。ハマるのはもういやいや〜!


と夜遅くにシャウトしたのでした。というわけで、cURLを主導でコンパイルしている時にいろいろ考えてつぶやいてみました。一体どうやったらハマらないようになれるんだろう?わしのTLにいる師匠たちはどんな事をいってくれるだろうと思って、自分のハマり対策を考えてみました。


ハマりから抜け出す法

@sandayuu: コンパイルが暇なので、ハマり対策を考えてみる。「定義に戻る」「分割統治」「人に頼る」「ペアプログラミング」「仕組みを最後まで理解する」「ライブラリ等のソースコードを読む」「数学センスを身につける」 … 最後の一つは絶望的かも

そしたら、いろんな人がコメントをくれました

@tpyamamoto

@sandayuu 別の事やるのが一番いいですよ! 風呂とかコンビニ行くとか!


@ryuzee

@sandayuu えー、僕も結構はまってますよw。眠い時にやらないで朝やるとか、タイムボックス切るとかして泥沼は避けますが。

かの@ryuzee師匠ですら、ハマるなんてびっくりです。でもちょっと勇気をもらった。ハマるってある意味チャレンジしてることやから。


@hiranabe

@sandayuu 定義にもどる、いいですね。口に出して言う、というのも、好きなハックです。

平鍋さんもコメントくれました。いいですね。口に出すの!
さらに


@ryuzee

@sandayuu 全然師匠じゃないし(ーー;技術的Spikeは時間切ってやらないといけないっていうのはベストプラクティスだと思います♪

うーむ。言う事に深みがあります。タイムボックスっすね。確かに!


@haradahikoも教えてくれました

@sandayuu 後ろで誰か見ていて説明しながらやるつもりでやってみる。ペア作業できるならもっといいけどね。


@libero_18はとてもいいお話を

目的に合った道具を使うとか
@sandayuu 上手く行くと良いっすね 自分はハマるのが面倒なので仮想でも良いから、必ずサーバOSを使いますんでw

うーむ。サーバーOS使うってのは確かにいいかも。素晴らしい。


そして、とどめにこれ
@tpyamamoto

「諦めて進捗会議の言い訳を考える」が抜けてます!

素晴らしい、先を見越していますww


@tetsu_mもなんか言ってますww

背後でリアル弟が…ですねw RT @sandayuu: 具体的テクっすね!Thanks! RT @haradakiro: @sandayuu 後ろで誰か見ていて説明しながらやるつもりでやってみる。ペア作業できるならもっといいけどね。


というわけで、いろんな皆さんがいろんな話しをしてくれました。全て次回参考にしてみたいと思います。そう、私はこのブログを二度とハマりたくないから書いているのです。そして、今回のハマりの原因をここに書く事、それが重要なのです。


なぜハマるのか?


なぜハマるのか?これは、ハマり系プログラマ永遠の謎です。何回もひどい目にあっているのに、なぜ、懲りないのか?そのヒントを私は今回のはまりでつかみました。そして、上の皆様も言っている事にヒントがあるのです。


そして、私がハマるという事の本質?に気づいたのはある言葉を思い出したからです。それはワインバーグ氏の言ってたこんな感じの言葉

そこに無いというところがあると、たぶんそこにある。

ちょっと手元にスグ見当たらないから確認できないけど、多分この本

コンサルタントの秘密―技術アドバイスの人間学

コンサルタントの秘密―技術アドバイスの人間学


ハマりの本質ってコレじゃないかな?と思うのがこの言葉。

そこに無いというところがあると、たぶんそこにある。

なぜ、ハマるのかを考えてみると、過去のダダはまりの問題を考えてみると、よくよく考えると、すごーーーく技術的に難しい事に対してつまづいたときはほぼほぼ無い。技術的に難しい事の場合は、一つ一つとぎほぐしていったり、Googleさんに聞いたり、イケメンに聞いたら大抵わかる。


 私のようなよくハマる人のパターンなのだが、大抵、ハマったときの原因ってのはとってもしょーもない単純ミスと思われる事が多いのだ。ええ。人に言うのもこっぱずかしいぐらいの。
 ライブラリにバグがあるとか、そういう自分じゃない事だとブログに書きたくなるものだが、大抵のハマりの原因はしょーもない、全然技術的なところじゃなかったりするから、「あぁ〜これかよぉぉぉお」「俺アホやん」といった感じでもちろん記録にも残さないし、ブログにまとめたりもしない。なぜなら、本人にとって自明の技術的に当たり前の事だからだ。


 しかし、考えてみてほしい、ハマるのは大抵そういうものなのだ。先ほどの言葉で「そこに無いというところがあると、たぶんそこにある。」という話し。確かワインバーグさんの話しでは、仕事かなんかで「その棚には探している資料はありません」と先方が断言するのを聞いて、なかなか見つからなかったその資料を、「その棚」を調べることによって、速攻で発見するお話。


 そう、ハマるということの本質は「その人が見えていない所に答えがある」から、ハマるのだ。特に自分が「そこには答えは無い」と思っているところに特に。たちが悪い事に、そいういう、そこに答えはないという部分は、無意識に脳がバイパスして、そこを探そうともしないし、それが意識にも上らないのが辛い。だから、「そこに無いというところがあると、たぶんそこにある」という言葉を思い出す必要がある。


 今回、私は慣れないPHPを触って、サンプルを解析して、cURLをわざわざセットアップした。そこで帰ってきた答えは無情にも


401. Unauthorized.


 思わずシャウトしたよ。「おい!おんなじやん!Ruby関係ないやん」ここであきらめて帰宅する途中にさっきのワインバーグさんの言葉を思い出した。

そこに無いというところがあると、たぶんそこにある。
<< 


 そうか、そこじゃない。つまり、自分はOAuthのちょっとひねった奴だったこと、PHPのサンプルはあるけど、Rubyの実績はないこと。マニュアルには、OAuthの仕様へのリンクしか無い事、そして、Consumer/Secretは動作実績があること、そんな事から、問題はプログラムにあって、「Consumer/Secret」自体にそれは無いと思っていた事に気がついた。


 よくよく考えると、認証エラーなんだから、サーバー側で権限が足りないか、リクエストが不正なのである。PHPでも動作しないんだから「リクエストが不正」という事じゃないから、当然「権限が足りない」ってことも重要な選択肢のはずなのに、今から考えるとあほらしいぐらい、Consumer/Secretそのものについては疑っていなかった。もちろんスペルとかは何回も確認したけどね。まさに「そこに無い」と思っていたんだ。



 電車の帰り道でその事に気づいて該当の「Consumer/Secretに何らかの権限が足りないのとちゃうか?」と思い始めると、自分ってなんて間抜けなんだろうと思うのと同時に明日は片付けられるとかなり興奮もした。ついでに、ハマりの構造も見えてきたのだから。そうだよ、こういうときに「あーーーーっ。なんてアホなんや。気づけよ」って思うから、こういうある意味くそ当たり前の事って誰もブログにも書かないから、忘却の彼方に行ってしまう。でも、実際に我々の大量の時間と気力を奪うハマりは大抵こんな感じなのだ。思い出してみても大抵はとても当たり前の事なのだ。自分が「そこ」が問題と思っている以外の腐るほど当たり前な場所。



 実際は甘くなくて、Consumer/Secretと関連する設定を変えればうまくいくと思ったが、そうも上手く行かず、相変わらず401. UnAuthorized. これにはかなりがっかり。「見えてない場所を見る」為にロジカルシンキングを駆使して、「ユーザ管理サーバ」「サーバー」「ネットワーク」「クライアント」それぞれの箇所で起こりうる問題を列挙して考えてみて、いろいろ対策を考えました。まぁ、ましに考えることができましたが、上手く行かず、結局打つ手は無いからテクニカルサポートの回答を待つだけしかできないかなぁ、、、、でも、金曜日だしすっきりしたい。と思い直して考え直してみる事にした。実はこのプラットフォームはクローズドなので、決してインターネットに情報は落ちていない。だから、インターネット上で検索しても仕方が無いのだ。






.... はい。ここでした。そこが、「そこに無いというところ」なのでした。


もう打つ手がなくて、やけくそになって、とりあえずこのエラーメッセージをGoogleさんにかけてみた。普段はもちろん速攻でGoogleさんに聞いているがクローズドであるはずないから、検索せんかったけど、よくよく考えてみると、サーバー側もライブラリつかってるから、類似の現象が他のプラットフォームで起きているかもしれない。


検索しましたよ。一発よ。だって、MySpaceで似たような事例だったり、mixiのUnauthorizeの事例だったり、わんさかわんさか、、、そこで、見つけた解決策から、今回のサーバー側の挙動を推測して、結局Consumer/Secretの権限設定問題だったのでした。(ちょっとわかりにくかったけど)インターネットには、MySpaceのUnauthorizedでは、ユーザの権限をチェックしろよ。という話しと、mixiの場合はAuthoizedヘッダが古いrubyのライブラリだとよけいなカンマが入るから動かない(今回はそうじゃないので、これは関係ない)ので、必然的に、可能性が大きいのはユーザ等の権限設定だろうと確信をもてて、いろいろ実験したら解決しました。サポートよりも早く。。。。


そう、結局答えにリーチしたポイントはどちらも「そこに無い」と自分が思い込んでいた二つのポイントでした。はっきり言って、死ぬほど見直したRubyのプログラムは全く最初のバージョンのままだし、もっというと、標準ライブラリでオッケーでした。つまり、私はほぼほぼコーディングなんかしなくてよかったのです。


わかりますか?こんな間抜けな結論は誰もブログにしないのですが、これで、かれこれ合計3日ハマったのです。こういうしょーーーもない事で3日費やしているのです結局。自分が思っているような難しいところには全然ミスは無かったのです。そうきっとワインバークさんは今日もいうのでしょう。

そこに無いというところがあると、たぶんそこにある。
<< 

そして彼はもう一つ名言を残しています。

一見、それがどう見えようとも、それは人の問題。
<< 

答えがわかってみると、こんなしょうもない事に二度とハマらないはずだ。もう、皆さんなら次回どうなるか、お見通しのことでしょう。


だから、ブログを書いてみました。