とある技術系ブログっぽいところで、とある人の意見で「パフォーマンス(性能)が遅くなることをわかっていてその技術を採用することはプロとして失格」というのを見たことがあります。でも、実際はパフォーマンス(性能)と生産性はトレードオフの関係になっていて、必ずしも実行速度最速を選ぶことが最適とは限らないと思っています。
例えば、言語の速さで言えば、(コンパイラの最適化以上に凄いことができる人が書く)アセンブリ > C > C++ > Java ≒ C# >> JavaScritp > Perl ≒ Python ≒ PHP ≒ Ruby という感じでしょう。
参考: fast? (64-bit Ubuntu quad core) | Computer Language Benchmarks Game
しかし、上の順番とほとんど逆の方向で、実行のしやすさ、メモリ領域の安全性(GCがあるとか)、抽象度の高さ等により、生産性は高くなると思います。また、同じ言語でも、例えばC++でメモリを確保(new)し、ポインタで管理する場合は二つのパターンがあります。
- 生ポインタ … メモリ解放を自分で制御する必要があり、注意深いコーディングが必要。
- スマートポインタ … 循環参照にならければ、不要になった時点でメモリ解放されるため、GCに近い生産性がある。ただし、参照カウンタの処理が入る分だけ、生ポインタより遅くなる。
他にもライブラリやフレームワークの選択なども、遅いけど使いやすい、速いけど使いにくいというのはあり得ます。このように、言語やコーディングの仕方、使用するライブラリの選択において、パフォーマンスと生産性のどちらを取るのかはトレードオフになっていると思います。
そこで、質問です。実際に作るときに、どこまでパフォーマンス(性能)を求めるべきなのでしょうか?たとえば、とある新サービスのWebシステムを作るにあたって、
- 想定平均応答時間: 1.0秒以内
- 想定工数: 6人月以下
とあったとき、計画が4つあり、それぞれの見積もりが下記のような感じだったとします(言語とフレームワークは、CPollとか使ったことが無いので、ぶっちゃけ適当です)。
- Sプラン(C + アセンブリ / フルスクラッチ)
応答時間: 0.1秒、工数: 12人月(スーパーハッカー雇用)
- Aプラン(C++ / CPoll)
応答時間: 0.5秒、工数: 6人月
- Bプラン(Scala / Play Framework)
応答時間: 1秒、工数3人月
- Cプラン(Ruby / Ruby on Rails)
応答時間: 2秒、工数2人月
予算を超えてでもSにすべきか、予算内でなるべく最高にすべくAにすべきか、仕様さえ満たすのだから、経費削減のためにBをすべきか、実際流行るかどうかわからないため、とりあえず作ってから考えるためにCでやっちゃうかです。なお、ただのプログラマーの立場では無く、プランを選ぶ顧客や経営者の立場、または、そのような人への意思決定に影響を与える形で意見を述べるまたは決定権を与えられた技術系担当者の立場(CIOまたは実質的なCIOである立場、外部からの場合はコンサルやSIerのような立場)であるという想定でお答えください。また、見積もりはあくまで想定であり、実際に作ったら想定以上になることもあり得ます。そういった、リスクも込みでお考えください。
【補足】
皆さん共通の疑問点などを補足します。
- 「プロ失格」について
荒れている記事がさらに荒れる事になりますので、出典は明記しません。また、一字一句同じというわけでは無く、そのようなニュアンスだったと言うことです。ですので、ググっても引っかかりません。
状況としては「○○はパフォーマンスが悪い、パフォーマンスが悪い技術を使うのはレベルが低い素人、なので、○○を使うのは素人」という感じの発言です。記事全体としては、コレに相当するような内容なので、皆さんにお教えするような価値はありません。
ただ、ここ2〜3ヶ月ほどパフォーマンスの良さ/悪さについて考えさせられたきっかけであり、そこからこの質問に繋がった事でもあるので、最初に記述させていただきました。
- 想定や見積もりについて
あくまで例だと思ってください。工数や秒数とかは適当ですので、大きさの比較以外に深い意味はありません。状況としては、これから企画として立ち上げ予算取りや仕様決めをする段階だと思ってください。想定平均応答時間と想定工数も確定した物では無く、最初にこれぐらいだといいなーと思ったぐらいの値です。Sプランの工数もCプランの平均応答時間も戦略的には許容できる範囲内という感じです。実際はサーバの台数やスペックだとか、保守・運用やソフトウェア(OSやDB等)の料金とかそういうのも総合的に判断する必要がありますが、話を簡単にするために、そういった物を省いています。
回答17件
あなたの回答
tips
プレビュー