はじめに
ネクストリードでは技術スタックとして、バックエンドは C#(ASP.NET Core)、フロントエンドには Angular を採用して開発をしています。
フロントエンドの Angular は TypeScript が前提となっており、フルスタックで静的型付けの恩恵を享受しています。
本記事では、なぜ私たちが数ある選択肢の中から C# を選んだのか、その背景と意思決定の理由をお話しします。
「技術選定に悩んでいる」「C# は今でも選ぶ価値があるのか?」と考えている方の参考になれば幸いです。
技術選定の前提条件
私たちが携わるプロジェクトは、長期運用を前提としたエンタープライズ向けサービスであることがほとんどです。
そのため、最も重視したのは「数年後も安心して稼働できること」でした。
加えて重視したのは次の点です。
- 開発スピードと品質の両立(品質を犠牲にしない)
- 将来的にユーザー増加に対応できるスケーラビリティ
- 強固なセキュリティ
- Azure やコンテナ環境での運用
さらに、技術選定の第一条件として「静的型付けのコンパイル言語」であることを置きました。
静的言語のメリット
静的言語を選んだ最大の理由は安心感、そして長期的な保守コストの削減です。
コンパイル時に型チェックが行われるため、実行時の予期せぬエラーの発生リスクを大幅に減らすことができ、結果的にテスト工数の削減や本番リリース後の致命的なバグの減少に直結します。
さらに、VM 方式の言語では JIT や最適化が効くため、パフォーマンス面でも動的言語より優位となるケースが多くあります。
加えて、IDE による強力な支援も大きなメリットとなります。
IntelliSense、型チェック、リファクタリングなどの機能により、大規模なコードでも安全かつ効率的に開発が可能になります。
フロントエンドで TypeScript が広く採用されている現状からも、多くの開発者がその価値を認めているのではないでしょうか。
一方で、巷では「言語による違いはそんなにない」と言われることも多いですが本当にそうでしょうか。
特に大規模なエンタープライズ領域ではその差は顕著です。
私がフリーランスとして参加した多くの現場では PHP など動的言語が使われていましたが、規模が大きくなるにつれ、機能追加やリファクタリングのコストが急激に増加する場面を多く目の当たりにしてきました。
その理由は、利用箇所の特定や安全な変更が難しいためです。 動的言語にも IDE の補助はあるものの、その性質ゆえに完全なものではなく、typo や未検出の不具合が残る事も珍しくありません。
結果として、不要なコードが蓄積し、保守性が低下します。
対して静的言語では、参照箇所の特定や型安全性が保証されており、リファクタリングが効率的に行えます。
IDE の補完やリファクタリング支援により開発体験そのものが向上し、長期運用に耐えるコードベースを維持することが可能となります。
このあたりを踏まえると、Java がいまだにエンタープライズで使われ続けているのも不思議じゃありません。
C# を選んだ理由(技術的観点)
モジュラーモノリス構成を自然に実現できる
Visual Studio の .sln(ソリューションファイル)や .csproj(プロジェクトファイル)による構成管理は、モジュラーモノリスの設計に適しています。
※ 最近では sln は slnx という新しい形式が出てきています
Visual Studio において C# は第一級言語であり、非常によく統合されています。
- 複数プロジェクトを論理的に分割しつつ、単一のデプロイにまとめられる
- 明確な依存関係管理(プロジェクト参照)
- ドメインや層ごとにプロジェクトを分けることで、責務の分離と保守性が向上
- Visual Studio や Rider によるナビゲーション・ビルド管理が容易
この構成は「マイクロサービスほどの分離は不要だが疎結合な設計を目指したい」といった場合に最適です。
また、開発人数が増えた際にマイクロサービスへ移行する場合もスムーズにできます。
安定性と信頼性
C# は Microsoft が長年育ててきた言語であり、.NET エコシステムはエンタープライズ開発で豊富な実績があります。
LTS(Long Term Support)による 3 年間の長期サポートもあり、長期運用に適しています。
さらに、C# のバージョンアップの方針として 「言語レベルでの破壊的変更は行わない(過去のコードは新しいバージョンでも動作する)」というものがあります。
ライブラリのバージョンアップによる機能削除や破壊的変更はさすがに発生することがありますが、
言語レベルでは安心してバージョンアップができるのも大きなメリットです。
開発効率と生産性
ASP.NET Core はモダンな Web API 開発に最適化されています。
Visual Studio や Rider といった IDE のサポートも非常に強力で、デバッグやリファクタリングがスムーズです。
静的型付けと強力な型推論により、バグを事前に防ぎやすいのも特徴です。
パフォーマンスとスケーラビリティ
.NET 6 以降、毎年 11 月のメジャーバージョンアップでパフォーマンスが大幅に改善されています。
非同期処理(async/await)も標準でサポートされており、高負荷な API サービスにも十分に対応可能です。
もはや毎年恒例となった大ボリュームのパフォーマンス改善記事
- Performance Improvements in .NET 10
- Performance Improvements in .NET 9
- Performance Improvements in .NET 8
- Performance Improvements in .NET 7
- その他 .NET 6 以前の記事(上の記事から辿ってください)
クロスプラットフォームとクラウド対応
かつての .NET Framework は Windows 専用でしたが、現在の .NET は Linux や macOS でも動作します。
Docker や Kubernetes との相性も良く、Azure との統合もスムーズです。
最近では Azure でも Linux OS が選ばれるケースが増えているようです。
C# を選んだ理由(個人的背景)
ここからは、技術的な理由に加えて、個人的な背景についても触れます。
- NextRead の執行役員(私を除く)の全員が Microsoft 出身
- 私自身、大学院時代に Ruby -> C# へトランスパイルするソフトウェアを修論のテーマとして開発
- 研究テーマに選ぶほど Ruby も C# も好き
こうした背景がある中で、C# を選ぶのは自然な流れでした。
他の選択肢との比較
以下は、主要な選択肢を技術的観点で比較したものです。
Node.js は厳密には動的言語なのですが、コアとなる v8 の改善に世界中から投資が行われており、
動的言語の中では圧倒的に高速であることから選択肢として検討しました。
| 比較項目 | C# (.NET) | Java | Node.js |
|---|---|---|---|
| 安定性 | ◎ 長期サポートあり |
◎ 実績豊富 |
△ エコシステムの変化が速い |
| 開発効率 | ◎ 強力な IDE サポート |
○ ツールは豊富だがやや重厚 |
◎ 軽量で柔軟 |
| 型安全性 | ◎ 静的型付け |
◎ 静的型付け |
△ TypeScript で補強が必要 |
| パフォーマンス | ◎ バージョンごとにランタイムの高速化が進む |
○ 安定しているが JVM 依存 |
△ 単一スレッドの一部制約あり |
| クラウド対応 | ◎ Azure との親和性 |
○ AWS/GCP で実績あり |
◎ コンテナとの相性が良い |
まとめ
「C# は古い」という声は、もはや過去の .NET Framework に囚われたものです。
現在の .NET は完全にオープンソース化され、毎年ランタイムレベルでパフォーマンス改善が行われ、モダンな開発体験を提供しています。
NextRead では、C# を選んだことで長期運用の安心感に加え、開発効率や将来の拡張性も確保できました。
海外でも .NET の進化が再評価され、C# の採用率は着実に増えています。
「C# は今でも選ぶ価値があるのか?」という問いに対する答えは「今だからこそ C# を選ぶべき」という状況になりつつあります。
もしあなたが、長期運用を前提としたサービスを構築しようとしているなら、C# は有力な選択肢のひとつです。