グローバル汚染して困ることはなんでしょう。私なりの答えを最後に書きました。先日のQiitaHackathonで痛感したことです。
上記のお題目で、先日のHackathonのレポートも兼ねたいと思います。
当日、私は一人チームで、いきなりマルチスクリーンをクロスプラットフォームと取り違えるチョンボをやらかし、普通のWebアプリケーションをつくりはじめました。Filtterというタイムラインから良ツイートを抽出するためのアプリです。しかも事前にプロトをつくっており、頭も悪ければ根性も腐ってる感じでなかなかあれです。
残り2時間半の時点でその誤りに気づき、Websocketでそれっぽい機能をつくって急場をしのぐことを思いつきます(Qiitaのデザイナーの小西さんに相談にのってもらいました)。生WebsocketはPlayで少ししか触ったことがなかったので、Google App EngineのChannel APIを選択しました。
Google App Engineのローカル環境のアドレスがlocalhost:XXXXで、そのままではtwitter apiのアドレスとして指定できないため、localhostにローカルの適当なDNSを割り当てるか、本番環境使って開発するか2分くらい悩みました。結局その時点で残り2時間しかなかったので、後者の方針で行くことに。
普段は過剰なくらいクロージャや無名オブジェクトを使いまくって汚染を回避するのですが、イチイチ本番環境に上げてクロージャに閉じられた関数をチマチマデバッグするのがめんどくさかったので、禁忌を破り、windowオブジェクトを汚染しまくってデバッグをしはじめます。かなりいいペースで進んでいたのですが、残り30分くらいで見たことのないエラーにブチ当たります。
Uncaught TypeError: Illegal invocation
jsではnativeの関数の別名を作成することを禁止しており、これはそれにひっかかったときに吐くエラーです。グローバル汚染の腐臭がぷんぷんします。結局、問題の切り分けに時間がかかり、完成しないままタイムアップしました。
あとで調べた結果、このエラーはグローバル汚染が原因ではありませんでした。が、直接問題がなくても、ちょっとしたエラーでヒヨってしまうので、あまり精神衛生上よろしくないということがよくわかりました。
###グローバル汚染の弊害:メンタルがやられる
振り返らずともわかっていたことですが、改めて振り返ってみてもやはり何一つとしてよかったところがありませんでした。時間に追われながらプログラムを書いてると24のクロエに自分を重ねることができ、中二心が満たされます。懇親会も楽しかったです。今度はもうちょっとマシなものがつくりたいです。