技ビス : 技術、ビジネス、スタートアップ

技術、ビジネス、スタートアップに関する情報と話題とアイディアと事例

なぜgolangを技術選択してしまうのか、WindowsやC#はダサいのか

twitterでパイセンがこんなことをつぶやいておりました。

このかた、色々ふざけた感じのIDではあるんですが(失礼)色んな会社で技術顧問したり、なんちゃら大臣賞とったりしている人なんですが、最近はDXを売りにしたファンドで「DXで企業価値あげちゃおう」「日本にもっとプロ経営者CTOふやさねば」みたいなことをおっしゃっていて、いやもう首がもげそうなほどそうですよねーと思っているのでした。

で、冒頭のツイートなんですが、こりゃもうそうなんだよなぁと思ったりはするのでした。正直ASPとかServletとかが書きたいかと言われると僕はそうでもないんですが(苦笑)、技術選択については色々思うところもあります。

というわけで、今日はみんながダサいと言いがちなWindowsとC#を全力で持ち上げてみたいと思います笑

目次

Stackoverflowは.Netで動いている

StackoverflowはエンジニアのQ&Aサイトで、技術的なことを検索するとだいたい答えが見つかる超便利サイトです。Stackoverflowにお世話になっているエンジニアの方は多いでしょう。たぶん、エンジニアじゃなくても知っている人は多いんじゃないかなーと思います。Stack Exchangeの情報によると月間13億PVをほこる巨大サイトです。

さぞかし、ナウでヤングなシステム構成なのだろうと思われると思いますが、基本は下の図の通りC# + ASP.NETでできてます。僕の知る限り2013年時点から言語は変わっておらず一貫してC#です。

f:id:harajune:20220223000928p:plain

ちなみにサーバはWindows IISでDatabaseもSQL Serverです。これをもって「Windows最高!」というつもりはないんですが、Cloud全盛でコーディング環境はLinuxじゃないとだめだとかWindowsは甘えとか言われる昨今、結構硬派な構成と言えるんじゃないでしょうか。

f:id:harajune:20220223001730p:plain

個人的にもC#って結構速いんで好きです。人間の生産性が重要という考え方もありますが、重い言語とかフレームワークを使うとそれだけスケールのことを気にしないといけないですし、それはコストに跳ねるのであんまり僕は好きではありません。

月間13億PVある割にはスリムな構成(だと思う)

前段で書いたとおり、速い言語はコスト的にもメリットがあります。Stackoverflowはいわゆる一般的なユーザ投稿型のWebサービスなので、ほとんどのクエリが多分readです。なので、MySQLとかで構成するならリードレプリカをたくさん置くかなーみたいな発想にだいたいなるかと思います。

では、Stackoverflowさんはどうかというと、月間13億PVを9台のオンプレWebサーバでさばき、データベースはLIVEとHot Standbyの2系統2サーバのみで構成しています。WebサーバのCPU使用率は平均5%、ピークでも12%。DBサーバに至っては実質1台で13億PVを支えてます。DBサーバのメモリが1.5TBだったりするのはあるにしても、大変・・・エコですね・・・

もちろん、作りのセンスが良いとか書いてないけどCDNが挟まってるとかいろいろな要因があるでしょうけども、僕の感覚値から言うと規模の割にスリム・・・という感想です。僕は全くMicrosoft製品詳しくないんでなんとも言い難いんですが、いやーすごいですね。

f:id:harajune:20220223002902p:plain

C#はGolangの3〜4倍くらい使われている

Stackoverflow調べなんですが、C#はgolangの3〜4倍くらい使われています。使われている度合いだけで行くとJavascriptには勝てないわけなんですが、トップ3がWeb系であることを考えるとC#はかなり善戦しているのではないでしょうか。2020年の数字とはいえTypescriptよりも人気です。

f:id:harajune:20220223003307p:plain

「golangエンジニアの採用に苦戦している」という話をたまに聞きますが、まぁそりゃそうなんですよね。絶対的に書ける人が少ないです。これもStackoverflow調べではあるのですが、エンジニアの会社を選択する理由のダントツトップが言語やフレームワークです。そりゃ、重要な判断基準においてそもそもできる人が少ないのだからこんなところでエンジニアの取り合いしてて採用できるはずもありません。2年前に某社に業務委託頼もうとしたときもできる人の数を聞いたらPHPの10倍〜100倍くらい違いました。というか、golangできるひとがAPACで数えるくらいでした・・・

最近はまた事情も変わってきているでしょうけども、なかなか興味深い統計です。

f:id:harajune:20220223003656p:plain

C#エンジニアはgolangエンジニアの23%も給与が安い

これもまたstackoverflow調べなんですが、C#エンジニアはgolangエンジニアの23%も給与が安いんですね。

f:id:harajune:20220223004259p:plain

Perlがダントツトップな時点でだいぶバイアスを感じるところは多少あります。というのは、Perl使っている人というのは90年代以前からエンジニアしている可能性が結構高く、単純に経験年数が長い分だけ給与が高い可能性があります。Golangもだいぶ高いのですが、同じような理由で「経験年数の長いエンジニアは、どんな言語でも何となく書く」という話であるようにも思います。

golangは良くも悪くもシンプル言語なので、PHPとかrubyとかになれている感覚で行くと「あれもできないこれもできない」となってちょっと戸惑いがちだったり、最近は幾分かましになったようですがimportのクセがなんか強かったので、慣れないと辛い側面はあったりはします。ただ、逆に言うと慣れちゃえばいい程度の問題ではあるので、それなりに経験値のあるエンジニアなら問題なく使える・・・というようなことなのかなと思います。

技術選択はやりたいこと・できることに合わせるのが一番だとは思う

色々言いましたが、結局の所やりたいこと・できることに合わせて技術選択するのが一番ではあります。結局、言語ごとに向き不向きの傾向は結構違うんですね。WebだったらやっぱりJavascriptとかでしょうし、サーバAPIとかだとpythonとかgolang、モバイルだったらkotlinだとかswiftだとかに結局なるわけです。

さらに、ゼロスタートするのであればOSSのエコシステムの助けを借りることは、かなり開発期間を短縮します。swiftがめっちゃ得意だったとしてもReact Nativeの便利ライブラリ組み合わせたらぱっと作れちゃった・・・みたいなことはよくあります。

一方で、プロダクトが成熟してきたりしたときにどういう技術選択をするかというのもまた難しい問題です。ライブラリの組み合わせで作ってきたけど、ライブラリに手を入れまくらないと要望を果たせなくなってきてだんだんちぐはぐに・・・なんてことはよくあります。(こういうときは、ぜひともPRを送ってあげましょう。マイナーなユースケースでも誰かの役には立つかもしれませんし、他人が再利用できる形にまとめることは良いことです)

人が増えてきちゃっていると、いまある技術スタックに最適化されすぎた人員になっているということも考えられます。技術スタックを変えるなんてカジュアルに言った日には打ちこわし一揆にあうことでしょう。数百人エンジニアがいたら退職する人も結構出ると思います。結局の所このへんのメリットデメリットを判断した上で決める必要が出るでしょう。

などなど、色々書きましたが、twitterとかみてると「やれ、typescriptが最高だ」「macosを使ってないエンジニアは素人」「Linuxを使っている人は初心者」だとか見かけるんですが、きめつけとか流行りとかじゃなくてちゃんとメリデメを上げた上で合理的な選択をしたいところですね。なにしろエンジニアなんですから。

補足:最近.Net Coreに変わっちゃったけど別物らしい

実はStackoverflowは2020年に.Net Coreに移行したらしいです。

www.infoq.com

ぼくはもう5年以上.Net触ってないんでよくわかってないんですが、パイセンいわく別物らしく昔ながらの.Net知ってるからと言ってできるかというとちょっと怪しいかも知らんです。

軽く検索してみると.Net Coreへの移行ができない悲鳴がたくさん見つかりますね・・・例えば以下の記事にはこんな話が書いてあります。こりゃー、地獄ですね・・・

  • NET Frameworkとメソッド、クラスの構成が変わっている。
  • .NET CoreのFormアプリケーションでFormデザイナに対応していない
  • 実装されていない機能がある(実装する予定すらなくなっているものもある)

qiita.com