chroju.dev/blog

the world as code

Toilの地獄から抜け出す術を知りたい

最近とても停滞感があってよろしくないので一度ブログに吐き出すなどします。

Toilが多すぎる

現状、自分はオペレーションエンジニア(決まった手順しかやらないオペレーターではなくて、問題解決や運用体制の構築とかやる感じの)という位置付けで働いていて、日々のシステム運用に関するタスクをもろもろ片付ける他に、長年澱のように蓄積された技術的負債とか、暗黙的な運用を改善していくことも任務だったりします。Googleが名付けたところで言えば前者がToilってやつですね、いわゆる。自動でできるはずなのにマニュアルで行われていて、サービスの増加に比例してどんどん業務を圧迫していくような類の仕事。

で、SRE本ではToilを日常の仕事の5割以下に収めろと言ってるんですが、全然自分の場合収まっていない。TodoistやTogglで最近はToilが1日に占める割合を計測しているのだけど、いずれもほぼ8〜9割。実感としても将来的な投資に費やせている時間ってのがほとんどないです。

実際のところ何がToilとして積み重なっているのかというと、手動でコマンドを打つような作業がほとんど。弊社では基本的に本番稼働中のシステムでオペレーションする人間を限定しているので、デプロイや設定の確認(ドキュメントがなかったりバージョン管理してなかったりするので、実機確認が必要になる機会が多々ある)等々自分らがやらねばならんのですが。しかし手動でやることがあまりに多い。数年に渡ってエンジニアのUNIXコマンドスキルに依存していた運用のツケが回ってきている。ある程度自動化すればいちいち手を動かさなくてよかったり、サーバーの状態、設定を確認するような作業であれば適切な可視化をすれば済む話であったり、解決策は見えているのだけど、手を打つ方に時間を回せていない状態。それなりに「どうすればいいか」がわかってはいるので、その分余計に「改善に時間が回せない」ことへの歯がゆさが強くてメンタルに優しくなかったりしている。

改善に必要なスキルは多方面に渡る

DevOpsなんて言葉はもう枯れていて、SREという職種も珍しくなくなってきた昨今、先に挙げたようなありがちな技術的負債に対する汎用的な解決策は世の中に溢れていて、自分も見知ってはいる。でも、それを実際にどう現場へ適用していくかが本当の課題。

そもそもの時間が取れないってのはどしたらいいんですかね。『エッセンシャル思考』よろしく、本当に必要な依頼以外は「断る」というのは1つの選択かもしれない。うまいことやらないと怒られそうだけど。個人的な思いとしてはある程度残業時間増やしてでも時間確保するしかねーなってのと、あとは改善を進める効率を上げることなのかなと。例えばチームで使っているツールのAPIを叩くラッパースクリプトを書いたりとかよくしてるんですが、自分はお世辞にもプログラムを書くのが速い方ではないので、最近は1年ぐらいプログラマーとして働いてスキル上げたいなと思うぐらい。

時間が取れたとして、どうするか。改善は大きなことをいきなりやろうとしてもうまくいかないので「小さく始める」というのはよく言われることですが、小さく始めるにしても自分の業務だけが楽になるんじゃ意味がないから、自ずと他の人を何かしらは巻き込む形になる。なのでコミュニケーションスキル、と言わずともプレゼンテーションスキルは少なくとも必要。そう、技術的な解決策をいくら知っていてもそれだけではダメで、やはり組織でやっていく以上、当たり前の話として対人的なスキルは不可欠になるんですよね。自分が楽になるから、確実性が上がるから、ではなくて、双方ハッピーになれるという話をしなくてはならない。これが結構難しくて。単に設定をバージョン管理して可視化します、という話であっても、元々その設定を確認して開発に活用していた人たちの業務プロセスには変化が生まれる。それをメリットとして受け入れてもらえるか。改善を進めるというのを自分は十字軍にはしたくないと思っていて、そのへんのバランスには常々気を遣っていたり。

あとは自分の現場のように多方面に様々な課題が山積していると、その中のどの課題をまず解決するか、どのように解決するかという取捨選択も重要。局所最適にならず、なるべく全体最適で、さらにレバレッジを効かせられるようなことからどんどんやっていくべきで、些末なことに囚われるべきではない。どうしても課題をパラパラ並べていくと、手を付けやすそうなこととか、技術的に面白そうなことからやりたくなっちゃうんだけど、そこをグッと我慢しなければならない。

つわけで改善、と一言で言っても、求められるのは純粋なコンピュータに関する技術、だけではなくて、社会学や人文学がやっぱり必要になってくるなぁというのを実感する日々です。そしてそのどれもが自分には足りていないような気がして、強く閉塞感を覚えてしまっているのも事実であり。課題は一度バラして並べてあるので、それがなかなか崩れていかないのがとてももどかしくてしんどい。

あらゆる情報の流れを制御したい

まぁしんどい話ばかりしていても仕方ないので具体的にやっていることも書きます。。だいたいは散逸してしまっている運用を統制していこうという向きが強い。

  • 時系列データベース(主にinfluxDB)を用いたメトリクスデータの集約。
  • あらゆるもののバージョン管理、コマンドによるオペレーションの推進、必要に応じてAPIをラップしたCLIツールの作成。
    • Ansibleやfabricでの構成管理、デプロイの統一。

      • 言語はだいたいPythonを使っているけど、クロスコンパイルしてバイナリ配布できるGoに興味がある感じ。
      • Infrastructure as Code記載の構成レジストリ(サーバー情報を集約したデータベース)やKVSによる設定情報の統制管理。
      • あとは人間のオペレーションをどうコントロールできるか、という視点から認知科学やデザインを少しかじったり。

      とにかく暗黙知に頼った運用が多すぎて、結果として「運用でカバー」せざるを得なくなってToilがかさむ、という本当にしんどい循環をしてしまっているので、様々な情報の集約、可視化、管理をしたい感じ。たぶん自分が興味あるのは情報の流れをつくる、それに乗せることで人間の仕事を最適化していくということっぽいんですよね。それができるのはとても楽しくはあるけど、つらくもあり。結果技術というよりプロセスの話を最近多く学んでいるのでブログも書けてなかったり。そういや暗黙知つながりでポランニーの『暗黙知の次元』読んだりもしてるのだが、もはや自分が何屋かわからんな。

      ちょっと正解が何なのかよくわからなくなってきたので、一旦立ち止まって冷静にならないとダメそう。