読者です 読者をやめる 読者になる 読者になる

ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

ソフトウェアプログラミングは不安との戦いだ

はじめに

エッセイ的な記事なのでnoteに書こうか迷ったんですが、プログラミングの話なのでこちらに書きます。

ソフトウェアプログラミングのつらみ

僕はソフトウェアエンジニアです。名乗れる程度には。新卒入社して3年目も中頃が過ぎ、「言われたことはやる」から「言われなくてもやる」への転換期と言ったところでしょうか。それなりに自分のやれること、得意なこと、わかりながら仕事に関わっています。

ただね。

ソフトウェアプログラミングって絶望的につらいんですよね。

え?何?好きなんじゃないの?めっちゃ勉強してるし、仕事も楽勝とか言ってるやん?って?うん、そうなんやけどさ、そうよ、たいていはそうなんやけど、基本的には自分は絶望的にソフトウェアプログラミングが苦手やと思ってるし、自分のセンス、才能の無さに定期的に絶望してます。絶望しすぎて方言でとるわ。

つらみを淡々と語りますので分からなくてもいいのでやさしくしてください。

ソースコードを読むつらみ

いやね、オープンソースの時代ですから、実際OSS使ってビジネスしてますし、仕様書がない!クソだ!分かるか!なんてさすがの僕も言いません。(1年目のときは本気で思ってました。OSSじゃなくて自社製品だったけど。)

それにソースコードを読めてこそエンジニア的なところあるじゃないですか。分かる、分かるよ。正解はソースにしかないってのはね、いいんだけどね、それでもつらい。

何がつらいってソースコード読むこと自体はいいんですよ。あーこうなってんだーって学びもあるしさ。こんな書き方するかよwwwってなったり楽しみはあるのさ。問題はしぬほど大規模なソフトに対して初見で障害対応するとき。 無理なのでは????????

このへんはもう経験が圧倒的に足りてないとは思っていて、だからこそ見当のつかない闇の世界に見えるわけですね。つまりソースコードの対局的な見方や、こういうふうに作られることが多いっていうデザインパターンを知らないんだと思う。きっとできるひとはおおまかな概要と掴んで、この処理はこのへんで閉じててこうされる、みたいなのが分かるんだと思う。でもそのへんがまったく自信持てなくて不安で死ぬ

動かしてみてデバッグログ仕込むとか、原始的な方法はあるにはあるけど、大規模環境で容易にソースいじれない場合はこれも難しい。専有環境をそもそも持つべきっていう論はあると思うけど。誰か「この処理はここだよ」って教えてほしい。そして呼び出し関係全部静的解析してほしい。甘えでいい。おねがい。

問題切り分けのつらみ

ソフトウェアはバグと切っては切れない関係にあります。というかバグとの戦いがソフトウェア開発の9割をしめるといっても過言です。

ちなみにプログラミング的なバグか、環境の一時的要因かはさておき、何か起きたときは問題を切り分けなければなりません。

まったく見たことないのに「~番のトラブル対応、よろしゃす」とリーダーに振られるわけですが、いやまってそもそもこれは何の機能のコンポーネントなの?ログはどこに出るの?ログ何個かあるけど何が違うの?内部でコンポーネントいくつかあるけどそれぞれの役割は何なの?このコンポはどのコンポとどうやって通信して連携してるの?まったく分からないところから切り分けスタートです

ビル・ゲイツも問題を切り分けよと言ってますが、それができりゃ苦労しないよと言わせておいてほしい。もちろん仮説のもと試行してこの時に起きる、このときは起きない、とやってだんだん範囲を狭めていったり、もしくは時系列に並べて関連するidなりなんなりで並べて どこまでは通信はいっててここで消えてる、としたりして切り分けするのは分かってます。切り分けは、前提知識がない以上、仮説思考の上の試行錯誤をするしかないと思っていて、これがとても苦しい。知らないものに対する仮説を立てるのが難しい。つらい。

影響調査のつらみ

ではここにバグがあったので修正しましょう。はい。これで起きなくなりました。よかったよかった。で終わらない

そう、デグレートの危険性があります。その修正をしたことによって、該当箇所はよくなったかもしれませんが、それによって他の機能が動かなくなる可能性があります。これを見極めるのが難しい。つらい。

いやいや今時全部自動テスト書いてるからリグレッションテストできるし安心でしょっていう世界に僕は行きたい。お願いします。行きたい。

テストで担保せずとも(もちろんテストで担保は必要だが)論理的にこのメソッドはここからしか通らないって言い切りたい。grepしただけじゃ不安だ。

再現テストのつらみ

なるほどこんな障害が起きたんですね。まずは再現しましょう、そのぐらいは僕も分かってますよ。でもね、再現させるのって超難しい。

まずそもそも同じ操作をするのが難しい。操作って難しいんですよ。API打つのかCLI打つのかいろいろありますけど、製品によっては前準備とか環境を整えてあげないといけなかったり、そのために手続きが必要だったりしてそもそもめんどくさい。その上でオペレーションをする、まずそのやり方を知らないから調べるところからだったりする。そして再現できてるっぽいけどこれで本当に再現になっているのか不安になる。だって再現しないから。再現しないといっても自分のやり方が正しい自信がない。

再現したら儲けなもんで、あとはいくらでも網をしかけられるんだけど、再現しないことにはなかなか正体を暴けない。

おわりに

僕がいかに低レベルなプログラマで常に不安と戦っているかを愚痴る記事になったこと、反省してます。たまには許してほしい。

そしてこの不安を消すためにこれからも努力を続けます。