見出し画像

コードだけでは量れない重さ

難しいのはアイデアを思いつくことではなくて、それを正しく実現することだとよくいわれます。簡単に実現できるアイデアであれば、誰でも真似ができてしまいますから、優れた製品やサービスを提供したいなら、それなりに時間をかけて準備しないといけません。ひとりで作るWebサービスって、リリースするまでにどれくらいプログラムのコードを書かないといけないものでしょうか? ひとりで作る単純な機能のものなのだから、3ヶ月から半年くらいかけて開発できるくらいかなと想像するかもしれません。わたしが独立したときに開発したクローバ PAGEはリリースまでに1年半かかりました。実は今作っている新しいサービスがあって、そちらはもう着手から2年経っています。もうそろそろ完成しそうなのですが、今計算したら、10万行ほどのコードを書いていました。
ときどき、天才プログラマーがわずか1ヶ月で完成させたみたいな触れ込みを聞くことがあります。著名なプログラマーである登大遊さんは1日で1万行書くことができるそうです。そのペースなら、今わたしが作っているサービスなんか2週間で完成させられそうです。

単純にコードの量でいうなら、わたしも若い頃に自分で考案したアルゴリズムをC言語で実装するような仕事をしていたときは、1万行とはいわなくても、かなりの行数のコードを書いていました。頭の中にある処理をコンピューターへの命令に変換する作業自体は、すでに頭の中に処理のイメージが出来上がっていればそんなに苦労する話ではないからです(もちろん登さんがすごいのは間違いありません)。でもこの現代でWebサービスを作るとなると、ちょっと話が違ってきます。

フロントエンドつらい問題

わたしはサーバーで動くプログラムを書くのが大好きです。そこにはユーザーの目を引くボタンも多種多様なアイコンも必要ありません。入出力されるデータと、エレガントなプログラムだけがある美しい世界です。しかしひとりでWebサービスを作るとなると、ユーザーという魔物を無視して開発を進めることはできません。彼らはデータにもプログラムにも一切興味はありません。興味があるのは、スマホのどこを押せば猫の動画が再生できるのかということだけです。なのでエンジニアやデザイナーは誰でもかんたんに動画が再生できるようにしようと試みますが、ユーザーはサインアップでつまずき、ログインしようとしてまたつまずき、お目当ての動画にたどり着くことすらできません。何度もこれは違うあれは違うと、ボタンの色を変えてみたり、文字のフォントを変えてみたりしているうちに、たった数十行のスタイルシートとTypeScriptを書くのに1週間かかっても不思議ではありません。それは以前からそうだったのではないかと思われるかもしれませんが、昔は灰色の画面に灰色のボタンがあって、押してなにか絵がでてくるまでに20秒かかっても誰も文句をいったりしませんでした。誰もがそういうものだと思っていたし、サブスクリプションという購入形態が普及していなかったので、少々使いづらくても我慢して使うのが普通だったのです。今だったら見た目がイケてないは十分すぎる解約理由になります。Webブラウザだけで実現可能な機能の幅が広がったことやスマホの普及もあり、今はフロントエンドのプログラミングをするエンジニアのほうが人気があるようで、今年のフロントエンド技術トレンド10選みたいな記事がよくリコメンドされてきたりします。わたしも全体の半分くらいはフロントエンドのコードを書くのに費やしていますが、本音をいえば面倒くさいのでサーバーのコードを書いているほうが好きです。

選択肢ありすぎ問題

MFCやSTLが用意された唯一のフレームワークで、プログラマーが「何をどう作るか」だけにフォーカスすればよかった頃はよい時代でした。今は「何をどう作るか」ではなくて、「何をどう使うか」のほうがずっと大事です。それくらいソフトウェアの開発は複雑になったといえます。請求書をPDFでダウンロードしたい? それなら候補となるライブラリーは18個あります。あなたはデータベースを選定するためにMySQLとPostgreSQLの違いを理解しないといけません。かつてApache Strutsを使っていたサービスが、その脆弱性のせいで、サービス終了や作り直しを余儀なくされ例をいくつも知っています。今はバイナリツリーもクイックソートも自分で実装しなくていい代わりに、膨大な選択肢のライブラリーを評価してその中からひとつを選ぶことがプログラマーの仕事になりました。自分の用途にあうものか、ひとつひとつリファレンスを読む必要がありますし、チュートリアルを試してみる場合もあるでしょう。まともに全部評価していたらそれだけで1年かかります。そうしてやっと、自分で1行もコードを書いていないにも関わらず、目的にあった最良のコードが手に入ります。そしてリリースする頃には、どうしてそのライブラリーを選んだのか完全に忘れています。

いくら要件に合いそうだからといって、すべてのライブラリーを片っ端から試すのは時間がかかりすぎるので、実際はある程度候補を絞って評価することになります。若い人は吸収が早いので、新しくてちょっと流行りの技術を使いたがります。逆に、ある程度経験のあるエンジニアは新しい技術を使うことを避けて、慣れ親しんだものを好む傾向にあるようです。私個人の経験からいえば、今後長い間サービスをメンテナンスしていくことを考えると、ある程度枯れて実績のある技術を使うべきだと思います。そうするとどこからが枯れているのかという話になりますが、2023年時点でReactやDocker、TypeScript、Rustなどは十分な実績があるという印象です。わたしは10年ほど前からReactを使っていますが、その後仕様が大きく変わったり、React Hooksが誕生したりして大きな書き直しを迫られてはいるものの、あのときAngularJSを選ばなくて本当によかったと思っています。あと、わたしと同じおじさんエンジニアにアドバイスですが、新しい技術に触れるときは、先入観やこだわりを一切捨てることが大事と思っていて、よくこの機能がないから使いたくないとかいう経験豊富なエンジニアがいるのですが、新しいパラダイムなのでそもそもその機能いらないってことが多いです。ReactでDOMの操作がやりにくいとか、DockerでコンテナにSSHしにくいとかいっている人は、大抵使い方が間違っていて、携帯は折りたたみじゃないと使えないというおじいさんと同じだと思ったほうがいいです。

我々はプログラムではなくサービスを売っている

作ったプログラムを.zipファイルに圧縮すれば開発の仕事が終わる時代ではなくなりました。作ったプログラムを適切に運用できてようやく商売として成り立ちます。そのためにはプログラマーは初めから運用のことを考えておかないといけないし、ライブラリーの評価と同じくらいの労力をAWSやGCPの評価や習得に割く必要があります。ここまで書いてみて、今からフルスタックエンジニアを志す人ってまあまあ大変だなと思いました。そのうちかなりの部分はAIがやってくれるでしょうから、頑張ってみてください。

というわけで、10万行が多いか少ないかは人によって感じ方の違いがあるでしょうが、今はコード書くだけじゃなくて他にもいろいろやることあるよっていう話でした。これから独立してWebサービスの開発を始める方には、会社を辞める前に、最低1年間暮らせるくらいのお金を貯めておくことを強くお勧めします。