megamouthの葬列

長い旅路の終わり

ご注文はCIですか?

いい歳なのにWebプログラマなんていう仕事をしている。
正確に言えばWeb屋だ。今や絶滅危惧種になったこの職業は、デザインをPhotoshopIllustratorでちょっと修正するところから、サーバーのファイアウォールの設定をちょっと変更するところまで、Webに関する何でもをこなす便利屋みたいなものだ。

一時は、Web屋みたいな人をフルスタックエンジニアなんて呼んでいた時期もあって、私も格好をつけたい時に便利に使わせてもらっていたけど、ただの銀玉鉄砲をシルバーバレット・オートマチック・モデルガンと呼んでるみたいで、口にする度に気恥ずかしくなってしまい、すぐに言わなくなってしまった。
これは言葉が悪いのではなくて、きっと私がWeb屋で、フルスタックエンジニアではなかったからだと思う。

銀玉鉄砲が、軽いアルミ缶すら撃ち抜けないように、Web屋もまた、ネットワークやサーバー運用の深淵を知らないし、デザインの理論的側面を知らない。

私たちが知っていて、出来ることといえば、ペライチのデザインをcssとhtmlの珍妙な混ぜ物にすることとか、フォームに入力されたデータをMySQLのテーブルに格納して、パスワードのかかった画面に一覧表示することとか、インストールされたCentOSSELinuxをすぐにDisabledにするぐらいのことだ。

何でもちょっとずつ、がWeb屋のあり方だし、ちょっとずつでも何でも、というのがWeb屋の生存戦略だ。

こういう事をし続けると、ちょっとずつ、というのが深くなっていく。例えば私なんかは、素のcssの代わりにscssで書くことができる(PostCSSは使ったことがない)、jQueryの代わりにVue.jsのコンポーネントを作ることもできる(Reactは使ったことがない)、Laravelでちょっとした業務アプリケーションを組むこともできる(Webで入力されたデータをRDBMSを介してWebで表示する以上のビジネスロジックはほとんど実装したことがない)、Apacheの代わりにnginxを使うことだって出来てしまう(Dockerは実運用で使ったことがない)

つまりは、やっぱり何だって出来てしまうし、周囲もそれなりに「何でも出来る人」扱いしてくれる。でも、括弧で囲んだ部分が示すように、未知の部分は多いし、突っ込んだ何かをするには不十分で、何かあるとすぐに壁にぶち当たってしまう。

少し前に、30代前半ぐらいのプログラマと組んで仕事をした。
彼はPHPとLaravelについてはプロフェッショナルで、私が用意したgitlabにコミットされるソースの質も高くて、私はそれを毎日チェックして、大いに参考にさせてもらった。(そして、自分の受け持った部分を真似して書いた)

「CIで自動テストを回したい」
ある日、彼がSlackのどこかのチャンネルで発言した。それはいいね。と私は答えた。
実際、今まで一緒に仕事をしたプログラマも顧客も、継続的インテグレーションはおろか単体テストの自動化をしたい、なんてことすら言ったことがなかったから、私はやっぱり出来る人は違うなあ、と素直に感心したのだった。
私はすぐにgitlabの隣にjenkensをセットアップして、彼に渡した。

「CIタスクが動かないですね」
しばらくして、彼が言った。
ユニットテスト自体は起動しているみたいだった。どれどれ、と私は彼のテストコードを見た。WebDriverを使ったE2Eテストだった。単体テストじゃないんだ、と私は思ったけど黙っていた。
「WebDriverが動けばいいのかな?」
と私は、少し気を落ち着かせながら、#generalだったか個別チャットだったかで尋ねた。
そうじゃないんですか?
と彼は答えになっていないことを言った。
私はひとまず、chromiumをインストールしたりなんだかして、WebDriverが動くようにした。
それでもテストは動かなかった。そもそもWebDriverがアクセスするサーバーがないんだもの。
「えっと、このテストコードはどこにアクセスするE2Eテストなの?」
「CIで作った環境じゃないんですか?」
「いやだから、このスクリプトでWebサーバーは起動しないじゃない?」
しばらく沈黙があった。私は話が通じているのか、にわかに不安になってしまった。というより、もしかしたら、私のほうがとんでもなく無知なことをしでかしているのかもしれない、という恐怖感が腹の底を重くした。

インフラのことはわからないんで
しばらく後で、彼は発言した。
そんなこと私だってわからない。CIでE2Eテストを回すなら、テストサーバーかなんかにアップロードするタスクの後にやるもんじゃないのか、と私は思った。
でももっと冴えた、CIなら当然の流儀が他にあるのかもしれない。私は逡巡した。
「Dockerとかで出来ないんですか?」
考え込んでいる私に彼は追い打ちをかけてきた。
Docker。CIで動かすスクリプトがLaravelとMySQLが動作するDockerコンテナ群をcomposeして、それからE2Eテストをする、っていうのならできるのかもしれない。だがそんなことやったことがないし、それが正しいやり方かどうかも確信がなかった。

「わからない。多分出来ると思うけど、やったことがないから時間がかかりすぎるよ」
私は白旗を上げることにした。そもそもなんで、君のCIスクリプトまで私が書かないといけないのだ、というのもあった。逆ギレと言われるのかもしれないが、私はWebプログラマとしてこのプロジェクトに参加していて、gitlabだって、誰も立てる人がいないから、立てただけなのだった。

「テストしないなら、品質保証できませんけど、いいんですか?」
最後に彼は言った。それが最後だったのは、私がその発言を無視したからだ。
単体テストもしないでE2Eテストだけで品質保証とかおめでてーな、とか昔のネットワーカーっぽい煽り文句が頭を駆け巡ったけど、どう考えても10歳ほども年下のプログラマに言うべきではなかったから、もちろん言わなかった。


その一件のしばらく後、クライアントの会社に立ち寄った。Slackでしかやり取りしなかった彼はもういなくなっていた。
「彼は、ちょっとコミュニケーションに問題がありましたね」
とクライアントは言った。私も同意した。でも、それで片付けるのも、なんだか居心地が悪かった。何より彼に悪い気がした。
本当は彼が正しくて、私が間違っていただけかもしれないのに。

私が、本当のインフラ屋だったら、きっと彼の要求が間違っているか、正しいのか、はっきり述べることができただろう、と思った。
このプロジェクトにおける私の役割がCI環境を構築することだったら、少し時間を貰えれば上手くやれたかもしれない。
あるいは、私がWebプログラマーだったら、そもそもCI環境を用意するところからお断りしていただろう。
「そういう環境はないと思いますよ」と言った私に落胆して、彼は次の作業に向かった筈だ。

私はWeb屋だった。何でも注文できるけど、何でもちょっとしか出来ないWeb屋だった。

このブログを読んだ誰かが、私がすべきだった何かを教えてくれるかもしれない。または私の無知を糾弾するかもしれない。

そうして、私は前より、ほんの少し賢くなれる。でも、きっと同じ注文は来ない。そして、次の注文に応えられる保証もない。

銀玉鉄砲を持った私は、友だちみんなが帰ってしまった夕日の街並みをトボトボと帰っていくよりないのだ。


[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)