過去20年間に、ソフトウェア開発の大きな利益をもたらしたものは本当に1つもありませんでしたか?[閉まっている]


45

では特効薬、フレッド・ブルックスは最高でまとめソフトウェア工学の将来に関する予測、さまざまなになります:

技術または管理技術のいずれにおいても、それ自体で生産性、信頼性、シンプルさの1桁の改善さえ約束する単一の開発はありません。

彼の議論は非常に説得力があります。ブルックスは1986年に書いていた:彼は正しかった?2014年の開発者は、1986年の開発者の10倍未満の速度でソフトウェアを生産しますか?いくつかの適切な指標で、生産性の向上は実際にどのくらいの大きさですか?


4
コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
世界エンジニア14

回答:


58

2014年の開発者は、1986年の開発者の10倍未満の速度でソフトウェアを生産しますか?

それ以来、生産性に少なくとも1桁の改善があったと思います。しかし、技術または管理技術のいずれかで、単一の開発を活用することではありません

生産性の向上は、要因の組み合わせによってもたらされました。注:これは包括的なリストではありません。

  1. より良いコンパイラー
  2. 非常に強力なコンピューター
  3. インテリセンス
  4. オブジェクトの向き
  5. 機能志向
  6. より良いメモリ管理技術
  7. 境界チェック
  8. 静的コード分析
  9. 強い型付け
  10. 単体テスト
  11. プログラミング言語の設計の改善
  12. コード生成
  13. ソースコード管理システム
  14. コードの再利用

等々。これらの手法はすべて組み合わされて生産性が向上します。これまでに桁違いのスピードアップをもたらした単一の特効薬はありません。

これらの手法の一部は1960年代から存在していましたが、最近では広く認められ採用されるようになりました。


15
より良いソース/バージョン管理システムを忘れないでください。
ドーバル14

7
ああ、そう。このリストにさらに数十(または数百)のものを追加できると思います。
ロバートハーヴェイ14

44
@ user61852:期待は常に現実を超えるからです。
ロバートハーヴェイ14


1
@RossPatterson:基本的に、この時点で開発者ツールに必要なものは揃っています。私たちは、テンプレートメタプログラミングを見ることができるという理由だけで、最近のCPUサイクルのコンパイルで愚かな無駄をしています。80年代と比較していることを忘れないでください。私は確かに開発者ではありませんでしたが、1990
ビルド

71

Robert Harveyの答えは良いのですが、プログラマがこれまで以上に生産性を高めている最大の理由であるソフトウェアライブラリの広範な入手可能性を除外したと思います。

私がキャリアを始めたとき、STL、.NET、QTなどはありませんでした。生のCまたはC ++がありました。

以前は数日または数週間かかっていた作業(XML解析、TCP / IP接続、HTTP通信)は、C#コードの数行で実行できるようになりました。これは、開発者の全体的な生産性の観点から、桁違いに改善された場所です。

現在の製品では、ベンダーから購入したドッキングウィンドウフレームワークを使用しています。これにより、ほんの数分で完全に機能するドッキングウィンドウUIを作成できました。win32 APIを使用する時代にそれを行うには何が必要かを考えるとぞっとする。


19
これにドキュメントと支援の可用性を追加します。20年前には、メーリングリストと直接の同僚がいました。現在、世界のプログラミングの専門知識は、ほぼすべてのトピックにおいて、単一のインターフェースを介して即座に利用可能です。
NWard

15
@NWardだから基本的にスタックオーバーフロー=)
クリス14

2
@tmyklebu people just found other (generally better) solutions[要出典]。ライブラリを使用してXMLの「山」をすばやく解析することは、独自のソリューションを手作業でコーディングするよりも多くの点で優れています。XMLは確かに過度に簡潔で反復的なものになり得ますが、ほとんどの場合、ライブラリはXMLの使用を簡単にします。
WernerCD 14

5
1986年頃に書かれたほとんどのアプリケーションによって生成されたであろうように、それは、文書化されていない独自の形式でバイナリ大量のデータを解析しようとすると、XMLを大量に解析することができるように痛みを伴うように@tmyklebu
James_pic

2
@tmyklebu誰もその日の何ギガバイトも必要としませんでした(あるいはメガバイトさえ!)。その量のXMLを生成するのは、これまで以上に多くのデータを格納および追跡しているという事実です。james_picは正しいです。XMLは、膨大な数の独自のバイナリ形式を使用するよりもはるかに優れています。XMLは冗長かもしれませんが、クロスプラットフォームで、人間が読める、非常に柔軟です。これらはすべて貴重な特性です。
14年

62

議論のために、Fred Brooksの主張には同意しません

生産性の大幅な改善を可能にしたテクノロジーの改善があります:インターネット、より正確には、過去20年間ですべての家庭でインターネット接続の進歩的な可用性。

開発者として遭遇する可能性のあるほぼすべての問題に対する回答を即座に見つけることができるため、生産性が大幅に向上します。JQueryでn番目の要素を選択する方法がわかりませんか?Google検索により、Stack Overflowに関する正確な質問の答えが得られます。overflowCSSでの使用方法がわかりませんか?MozillaのMDNはこちらです。virtualC#でキーワードの意味を忘れましたか?Googleが再び役立ちます

プログラミングを始めたとき、私はインターネットを持っていませんでした。私は本といくつかのデジタル形式のドキュメントをローカルに保存していましたが、本やドキュメントを検索するのは時間がかかり、どれだけ本を持っていてもそこに言及されていない多くの問題がありました。

さらに重要なことは、あなたが遭遇するほとんどすべての問題は、以前に他の誰かによって既に遭遇されていたことです。インターネットは、このエラーが発生して問題を解決した人を見つけるのに役立ちます。これは、MSDNのような書籍や公式ドキュメントにあるような情報ではありません。代わりに、そのような情報は通常見つけられます:

  • 明らかに、スタックオーバーフローについて。例えば、私はこの問題について言及した本を見たことがありません。

  • ブログで。特定の問題が発生したときにブログで多くの助けを見つけまし .WCF構成またはプロキシサーバーが起動しないか、en-USとは異なる文化を持つマシンで特定のAPIを使用するときに不可解なバグがありますか?

  • オープンソースソフトウェアに関するバグレポート。たとえば、UbuntuのMAASを使用しようとしたとき、およびPXEを使用したとき、最近非常に役立ちました。この種の情報も本にはありません。

チームがプロジェクトに費やす時間のほとんどがプロジェクトの維持に費やされることを考慮すると、遭遇する可能性のあるほとんどの問題に対する回答を即座に入手できることの重要性は特に顕著です。

  • インターネットは、アーキテクチャおよび設計段階ではあまり役に立ちません(Programmers.SEは役立つかもしれませんが、建築家がアーキテクチャと設計に関する本を読んだり、設計パターンを学習したりすることは、はるかに価値があります)。

  • 実際の問題が発生した場合のテストおよび実装ステップで役立ちます。

  • しかし、メンテナンス中に発生するほとんどの問題は、インターネットを介した他者からの支援が重要と思われる場合に発生します。基本的な例:私のマシンではWCFサービスは完璧に機能ますが、実稼働環境にデプロイすると、例外なく失敗しますが、過去2週間は機能しました。これは私に起こりました。数週間ではなく数時間で問題を解決するのを手伝ってくれたブログライターとStack Overflowコミュニティに感謝します。

それは生産性の10倍の増加を正当化するでしょうか?わかりにくい。

  • 一方では、すぐに答えを見つけることができますが、単独で検索するのに何日も費やすこともできました(または、アプリケーションの大部分を書き換えることを余儀なくされました)。

  • 一方、全体的な生産性は、プロジェクト管理の改善(アジャイル、TDDなどが頭に浮かぶ)、チーム管理の改善(スティーブンデニングによるラジカル管理が頭に浮かぶ)、ツールの改善(デバッガー、プロファイラー)などの複数の要因に基づいて改善されました、IDEなど)、より優れたハードウェア(いいえ、CPUが低速でRAMが非常に限られているためにAssemblerに書き込むことを余儀なくされた場合、私はあまり生産的ではありません)など。


4
「インターネット」も単一の開発ではありません。
ベンフォイト14

1
@BenVoigt:Brooksの引用文から、それをテクノロジーとして認定します。しかし、私は同意します、用語は明白でないかもしれません:最初に、それはインターネット(1980年代初期)またはワールドワイドウェブ(1989)でしょうか?第二に、重要なのはテクノロジーそのものだけではなく、その人気でもあります。
Arseni Mourzenko

しかし、「インターネット」の概念の下で積み重ねられるものには、さまざまなテクノロジーが関係しています。World Wide Web(DHTML / Javascript / browser)には複数の世代があります。データセンター規模の接続を可能にする光ファイバーの進歩があります。サーバーがテラバイトのRAMを持ち、データマイニングを実行できるようにするCMOSプロセスの改善があります。プログラミングに関する100万の質問にインデックスを付け、自然言語の意味で10個の最も近いヒットを提供するアルゴリズム。
ベンフォークト

5
Brooksが設計したシステムで作業する人々は、JCLの記述方法を覚えておく必要がありませんでした。これらのシステムには、十分に文書化された開発環境が付属しており、数十年にわたって継続的に活用/漸進的に改善されました。計画的な陳腐化によるものであれ不吉なものによるものであれ、私たちはそれから離れました。いずれにせよ、私は私たちが今持っているものを改善と呼ぶのをためらっています、そしてそれを「銀の弾丸」と宣言することを完全に嫌がります。
user1172763 14

複雑さは敵です。JCLを頭に抱え、マニュアルを手に持つことができます。単一のシェルフでシステム全体を文書化できます。現在、システムのサイズとその基礎となる変化率が大きく爆発しています。
pjc50 14

13

インターネットはかなり良い候補だと思います。StackOverflowとGoogleは、現代の開発者にとって最も強力なツールです。グローバルにインスタント知識共有!あなたは答えを知っている必要はありませんこれらの日は、あなただけの方法を知っておく必要があります知ってもらうの答えを-そしてそれは、開発者がコーディング、ひいては生産的であること、より少ない時間の読み取りとより多くの時間を過ごすことができます完全に十分なsubsituteです。これは、世界中のすべてのプログラマーがすべての回答にアクセスできることを意味し、彼らがする必要があるのは正しい質問をする方法を知ることだけです。


あなたは銀の弾丸を指摘する唯一の人です。プログラマーの生産性を大幅に向上させただけでなく、実際には複数の規模で生産性を向上させました。
ダンク14

+1000-数分でヘルプが得られますが、あいまいな問題については数日間働きます。
jqa 14

7

私たちを他の方向(つまり生産性の低下)に引っ張る傾向は、少なくともあなたが尋ねた傾向と同じくらい強いことをお勧めします。VB6やPowerBuilderなどのクライアント/サーバー開発ツールを使用した経験は、「​​Rapid Application Development」(RAD)の理想にかなり近づきました。フォームを描画する必要があり、手続き型コードまたはSQLコード用の明らかなフックがありました。

Web開発は、少なくとも当初はこれらのことを可能にする多くの技術とインフラストラクチャを破壊し、多くのクライアント/サーバー開発者は開発者であるのをやめるか、VB6などに必死に固執しました。

高度にクライアント主導のWeb開発への移行は、さらに別の大幅な削減経験でした。MicrosoftはWebFormsでRADの理想に戻りつつあり、その後すぐに支持を失いました。代わりに、開発者はインフラストラクチャ(XMLにはめったに使用されないXMLHttpRequestなど)を悪用し、そうでなければ、Webサイトをよりインタラクティブにするために低レベルの抽象化を求めます。

これらすべての移行の背後には正当な理由があり、ネイティブの.EXE(個々のクライアントでのインストールと管理を必要とする)を生成したプロセスをWeb開発と比較することは公平ではありません。よりシームレスな体験をもたらすポストバックで。しかし、現在流行している慣行は、クライアント/サーバー、RADなどを逃した人々の間で、驚くほど低レベルの思考プロセスをもたらします。クライアント/サーバーボタンは機能し、これを実現するイベントハンドラーにデータを取得する基になるデータチャネルを心配する必要はありませんでした。

逆に、現代の開発者は、クライアント/サーバー開発(またはポストバックベースのWeb開発)を行った人たちは、ショートカットに頼る傾向があると考えがちです(それは悪い意味で)。それは理解できますが、現代の開発方法は驚くほど低いレベルであり、「銀の弾丸」を探す日々は、鉱山の知恵に疑問を抱いている私たちをm笑する時代に道を譲ったようです。鉛を製錬する。


Meteor.jsを見ましたか?
虐待14

2
@strugeeはい、Meteor.jsは正しい方向への一歩になると思います。それでも、Brooksが本を書いてから少なくとも3〜4回は本質的に「やり直し」しているという事実(ここでは、PCへの移行、クライアント/サーバー、Web、そしてAJAX)は、おそらく「銀の弾丸」を見つけられず、生産性を直線的に改善することさえできなかったものです。時間は、現在の開発技術がどれくらいの期間(そして改善)持続するかを教えてくれます。楽観主義にはいくつかの理由があります...誰もが堅牢でクロスプラットフォームのポイントを求めています。
user1172763 14

5

技術は非常に進歩しており、今ではロバート・ハーベイが彼の答えに列挙しているすべてのものがありますが、

  • 問題は要件の変更にあるようです。クライアントは、ソフトウェアプロジェクトの要件を変更するときに材料の無駄がないことを知っているので、そうします。そのような要件の変更は、建物のような物理的な世界のプロジェクトが半分行われると、ほとんど起こりません。

  • もう1つの重要な側面は、プログラミングが引き続き非常に手作業であることです。ごくまれに、RADで生成されたコードが最初に手作業で変更されることなく本番環境に移行します。

  • コードは引き続き非常に複雑であり、その複雑さは新しいテクノロジーによって減少することはないようです。

  • 期限に間に合わない、または予算を超過する割合は、他の分野よりも大きくなり、多くの場合、それらを満たすために技術的負債が発生し、隠れたコストが発生します。

  • 間違いなく起こったことは、区画化が発生したことです。知っておくべき膨大な量のテクノロジーは、プログラマーが本当に得意とするために少数のテクノロジーを専門化する必要があり、さまざまな種類の専門家が大規模なプロジェクトを完了する必要があるということです。

  • ソフトウェアの複雑さについて話すことの1つは、文字通り世界には数百の自動車メーカーが存在するのに対し、オペレーティングシステム(デスクトップ、モバイル、組み込みなど)を作成および保守できる企業のリストは指で数えることができるということですあなたの手の。

  • 上記のすべてが、プログラマーになるために勉強する人が十分でない状況を作り出しました。そのため、政府は、より多くの学生がそのキャリアパスをとるように動機付けるためにキャンペーンを作成しました。

  • ソフトウェア業界の成熟度の趣味の1つは、ソフトウェアライセンスが「<companyX>は特定の目的に対するこのソフトウェアの適合性について何も表明しない。明示的または黙示的な保証なしに「現状のまま」提供される」と述べていることです。ハードウェアメーカーが自社製品が特定の目的に適さないと述べているとします。それが今の最先端です。


2
確かに、独自のOSを作成および保守できる企業は10社以上ありますが、他の機会がより有利なため、そうすることを選択する企業はほとんどありません。
ベンフォークト

@BenVoigtもちろん、OSの作成と保守は、非常に複雑なため比較的有利ではありません。数十年にわたる研究開発が必要です。
Tulainsコルドバ

1
また、市場はすでに飽和状態にあるため、RoIの「リターン」側はそれほど良くありません。
ベンフォークト

2
もちろん、あなたがやったのは、Lady Lovelaceが彼女の鉛筆を手に取った直後から存在していた、効果的なプログラミングへのよく知られている障害を列挙することだけです。30年前と異なるのは、物事が指数関数的に複雑になったことだけです。
ダニエルRヒックス

4

特定のメトリクスについて議論するかもしれませんが(つまり、物事は9.98倍に改善されていますか?)、私(昔から何かと言えば)はブルックスのコメントの一般的な感情に同意する必要があります。

まず、1970年以降に発明された真に新しい技術はほとんどありませんでした。はい、集積回路はより長く、より低く、より広くなり、グラスファイバーは通信速度を改善しましたが、一歩前進するたびに戻ってきます。

コンパイラーテクノロジーにより、1桁の関数が実際のコーディング時間で割られて生成される1970年と比較して、プログラマーの「生産性」が約10倍向上しましたが、新しいまたは「改訂された」プログラミング言語と環境の急増は、平均的なプログラマーがますます多くを費やしていることを意味します「追いつき」モードでの時間であり、生産的な活動では少ない。Apple、Google、およびMicrosoftはすべて、自社の環境に新たな、実質的に互換性のない「アップグレード」を吐き出します。その速度は、自分たちのサービス、つまりプログラミングの顧客の間で反乱を引き起こします。同様に、HTML / CSS / Javascript / whateverはさらに複雑になります。

かつて文書を作成して広めることができる速度は、この「革新」すべてを制限し、まとめていましたが、インターネットのおかげで、厳密な文書はもはや必要ありません-機能を吐き出してブロガーに頼るだけです詳細を探し出し、利用できるようにします。

追加: 昨日からこれについて考えていましたが、特に1978年頃から2008年まで取り組んだプロジェクトについて考えていました。その複雑さを制御するために作られました(1つは、ソフトウェアを2つのほぼ等しい部分に分割し、それらの間に「マシン」インターフェースを配置することです)。私が働いていた特定の分野では、同僚の何人かが同様に複雑さを制御することに専念していました(ただし、その用語は当時あまり使用していませんでした)。その結果、製品は(最初は)非常に堅牢で、git-goの顧客からの「ヒット」が得られました。そして、よく訓練されたオーケストラで演奏するような、取り組むことは喜びでした。

もちろん、長年にわたって複雑さは忍び込んでおり、通常は複雑さを制御することに感謝のないマーケットプランナーや管理者からの要請がありました(単純さを維持することとは多少異なります)。私はこれが避けられないと感じているわけではありませんが、この場合、マネージャー(グレンヘンリーが最初にやったように)が混乱の力を押し戻さずに防ぐことは不可能でした。


2
しかし、私は20-30年前に私(そして間違いなく他の多くの人)に起こったことを思い出します-プログラミングのピーター原則(またはおそらく熱力学のプログラミングの第二法則)があり、複雑さは必然的に増加すると述べています理解不能のポイント。物事が簡単になることはありません。
ダニエルRヒックス

3

私たちは、過去30年以上のソフトウェアエンジニアリングの実践で学んだことの偉大な契約は、新しいソフトウェアの初期開発をスピードアップすることができますフォーム「技術Xのですが、について多くまたはより多くの時間の考え方として費やすことはありません場合はどのようにしてときあなたが長期的には、それはメンテナンスであなたに多くの時間と労力を桁違いの原価計算、技術的負債の吸引沼にあなたのアプリケーションを向けるだろう、それを使用して保存されたとして、それを使用します。」

このカミソリに該当する技術には、ハンドコーディングされたアセンブリ言語、コンパイラ、インタプリタ、プロシージャライブラリ、命令型プログラミング、関数型プログラミング、オブジェクト指向プログラミング、手動メモリ割り当て、ガベージコレクション、静的型、動的型、字句スコープ、動的スコープが含まれます。 、「安全な」ポインター、「安全でない」ポインター、言語概念としてのポインターの欠如、バイナリファイル形式、構造化マークアップファイル形式、マクロ、テンプレート、マクロとテンプレートの回避、共有メモリ、メッセージパッシング、スレッド、コルーチン、非同期イベントループ、集中リモートサービス、分散サービス、ローカルにインストールされたソフトウェア、配列、リンクリスト、ハッシュテーブル、ツリー。

上記のリストの項目の多くが、既知のソリューションスペースを使い果たすグループになっているという事実は非常に意図的であり、それ自体で何かを伝える必要があります。一つは、その主張する可能性が唯一の彼らは最初のZ3に切り替わるので、私たちが持っていた実践で明確な、一律改善をブロック構造化プログラミング(スパゲッティコードではなく)とメモリ保護(少年、私が今までやるされていないミスをタイプミスが私のコンピュータ全体をダウンさせる可能性のある日)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.