では特効薬、フレッド・ブルックスは最高でまとめソフトウェア工学の将来に関する予測、さまざまなになります:
技術または管理技術のいずれにおいても、それ自体で生産性、信頼性、シンプルさの1桁の改善さえ約束する単一の開発はありません。
彼の議論は非常に説得力があります。ブルックスは1986年に書いていた:彼は正しかった?2014年の開発者は、1986年の開発者の10倍未満の速度でソフトウェアを生産しますか?いくつかの適切な指標で、生産性の向上は実際にどのくらいの大きさですか?
では特効薬、フレッド・ブルックスは最高でまとめソフトウェア工学の将来に関する予測、さまざまなになります:
技術または管理技術のいずれにおいても、それ自体で生産性、信頼性、シンプルさの1桁の改善さえ約束する単一の開発はありません。
彼の議論は非常に説得力があります。ブルックスは1986年に書いていた:彼は正しかった?2014年の開発者は、1986年の開発者の10倍未満の速度でソフトウェアを生産しますか?いくつかの適切な指標で、生産性の向上は実際にどのくらいの大きさですか?
回答:
2014年の開発者は、1986年の開発者の10倍未満の速度でソフトウェアを生産しますか?
それ以来、生産性に少なくとも1桁の改善があったと思います。しかし、技術または管理技術のいずれかで、単一の開発を活用することではありません。
生産性の向上は、要因の組み合わせによってもたらされました。注:これは包括的なリストではありません。
等々。これらの手法はすべて組み合わされて生産性が向上します。これまでに桁違いのスピードアップをもたらした単一の特効薬はありません。
これらの手法の一部は1960年代から存在していましたが、最近では広く認められ採用されるようになりました。
Robert Harveyの答えは良いのですが、プログラマがこれまで以上に生産性を高めている最大の理由であるソフトウェアライブラリの広範な入手可能性を除外したと思います。
私がキャリアを始めたとき、STL、.NET、QTなどはありませんでした。生のCまたはC ++がありました。
以前は数日または数週間かかっていた作業(XML解析、TCP / IP接続、HTTP通信)は、C#コードの数行で実行できるようになりました。これは、開発者の全体的な生産性の観点から、桁違いに改善された場所です。
現在の製品では、ベンダーから購入したドッキングウィンドウフレームワークを使用しています。これにより、ほんの数分で完全に機能するドッキングウィンドウUIを作成できました。win32 APIを使用する時代にそれを行うには何が必要かを考えるとぞっとする。
people just found other (generally better) solutions
[要出典]。ライブラリを使用してXMLの「山」をすばやく解析することは、独自のソリューションを手作業でコーディングするよりも多くの点で優れています。XMLは確かに過度に簡潔で反復的なものになり得ますが、ほとんどの場合、ライブラリはXMLの使用を簡単にします。
議論のために、Fred Brooksの主張には同意しません。
生産性の大幅な改善を可能にしたテクノロジーの改善があります:インターネット、より正確には、過去20年間ですべての家庭でインターネット接続の進歩的な可用性。
開発者として遭遇する可能性のあるほぼすべての問題に対する回答を即座に見つけることができるため、生産性が大幅に向上します。JQueryでn番目の要素を選択する方法がわかりませんか?Google検索により、Stack Overflowに関する正確な質問の答えが得られます。overflow
CSSでの使用方法がわかりませんか?MozillaのMDNはこちらです。virtual
C#でキーワードの意味を忘れましたか?Googleが再び役立ちます。
プログラミングを始めたとき、私はインターネットを持っていませんでした。私は本といくつかのデジタル形式のドキュメントをローカルに保存していましたが、本やドキュメントを検索するのは時間がかかり、どれだけ本を持っていてもそこに言及されていない多くの問題がありました。
さらに重要なことは、あなたが遭遇するほとんどすべての問題は、以前に他の誰かによって既に遭遇されていたことです。インターネットは、このエラーが発生して問題を解決した人を見つけるのに役立ちます。これは、MSDNのような書籍や公式ドキュメントにあるような情報ではありません。代わりに、そのような情報は通常見つけられます:
明らかに、スタックオーバーフローについて。例えば、私はこの問題について言及した本を見たことがありません。
ブログで。特定の問題が発生したときにブログで多くの助けを見つけました .WCF構成またはプロキシサーバーが起動しないか、en-USとは異なる文化を持つマシンで特定のAPIを使用するときに不可解なバグがありますか?
オープンソースソフトウェアに関するバグレポート。たとえば、UbuntuのMAASを使用しようとしたとき、およびPXEを使用したとき、最近非常に役立ちました。この種の情報も本にはありません。
チームがプロジェクトに費やす時間のほとんどがプロジェクトの維持に費やされることを考慮すると、遭遇する可能性のあるほとんどの問題に対する回答を即座に入手できることの重要性は特に顕著です。
インターネットは、アーキテクチャおよび設計段階ではあまり役に立ちません(Programmers.SEは役立つかもしれませんが、建築家がアーキテクチャと設計に関する本を読んだり、設計パターンを学習したりすることは、はるかに価値があります)。
実際の問題が発生した場合のテストおよび実装ステップで役立ちます。
しかし、メンテナンス中に発生するほとんどの問題は、インターネットを介した他者からの支援が重要と思われる場合に発生します。基本的な例:私のマシンではWCFサービスは完璧に機能しますが、実稼働環境にデプロイすると、例外なく失敗しますが、過去2週間は機能しました。これは私に起こりました。数週間ではなく数時間で問題を解決するのを手伝ってくれたブログライターとStack Overflowコミュニティに感謝します。
それは生産性の10倍の増加を正当化するでしょうか?わかりにくい。
一方では、すぐに答えを見つけることができますが、単独で検索するのに何日も費やすこともできました(または、アプリケーションの大部分を書き換えることを余儀なくされました)。
一方、全体的な生産性は、プロジェクト管理の改善(アジャイル、TDDなどが頭に浮かぶ)、チーム管理の改善(スティーブンデニングによるラジカル管理が頭に浮かぶ)、ツールの改善(デバッガー、プロファイラー)などの複数の要因に基づいて改善されました、IDEなど)、より優れたハードウェア(いいえ、CPUが低速でRAMが非常に限られているためにAssemblerに書き込むことを余儀なくされた場合、私はあまり生産的ではありません)など。
インターネットはかなり良い候補だと思います。StackOverflowとGoogleは、現代の開発者にとって最も強力なツールです。グローバルにインスタント知識共有!あなたは答えを知っている必要はありませんこれらの日は、あなただけの方法を知っておく必要があります知ってもらうの答えを-そしてそれは、開発者がコーディング、ひいては生産的であること、より少ない時間の読み取りとより多くの時間を過ごすことができます完全に十分なsubsituteです。これは、世界中のすべてのプログラマーがすべての回答にアクセスできることを意味し、彼らがする必要があるのは正しい質問をする方法を知ることだけです。
私たちを他の方向(つまり生産性の低下)に引っ張る傾向は、少なくともあなたが尋ねた傾向と同じくらい強いことをお勧めします。VB6やPowerBuilderなどのクライアント/サーバー開発ツールを使用した経験は、「Rapid Application Development」(RAD)の理想にかなり近づきました。フォームを描画する必要があり、手続き型コードまたはSQLコード用の明らかなフックがありました。
Web開発は、少なくとも当初はこれらのことを可能にする多くの技術とインフラストラクチャを破壊し、多くのクライアント/サーバー開発者は開発者であるのをやめるか、VB6などに必死に固執しました。
高度にクライアント主導のWeb開発への移行は、さらに別の大幅な削減経験でした。MicrosoftはWebFormsでRADの理想に戻りつつあり、その後すぐに支持を失いました。代わりに、開発者はインフラストラクチャ(XMLにはめったに使用されないXMLHttpRequestなど)を悪用し、そうでなければ、Webサイトをよりインタラクティブにするために低レベルの抽象化を求めます。
これらすべての移行の背後には正当な理由があり、ネイティブの.EXE(個々のクライアントでのインストールと管理を必要とする)を生成したプロセスをWeb開発と比較することは公平ではありません。よりシームレスな体験をもたらすポストバックで。しかし、現在流行している慣行は、クライアント/サーバー、RADなどを逃した人々の間で、驚くほど低レベルの思考プロセスをもたらします。クライアント/サーバーボタンは機能し、これを実現するイベントハンドラーにデータを取得する基になるデータチャネルを心配する必要はありませんでした。
逆に、現代の開発者は、クライアント/サーバー開発(またはポストバックベースのWeb開発)を行った人たちは、ショートカットに頼る傾向があると考えがちです(それは悪い意味で)。それは理解できますが、現代の開発方法は驚くほど低いレベルであり、「銀の弾丸」を探す日々は、鉱山の知恵に疑問を抱いている私たちをm笑する時代に道を譲ったようです。鉛を製錬する。
技術は非常に進歩しており、今ではロバート・ハーベイが彼の答えに列挙しているすべてのものがありますが、
問題は要件の変更にあるようです。クライアントは、ソフトウェアプロジェクトの要件を変更するときに材料の無駄がないことを知っているので、そうします。そのような要件の変更は、建物のような物理的な世界のプロジェクトが半分行われると、ほとんど起こりません。
もう1つの重要な側面は、プログラミングが引き続き非常に手作業であることです。ごくまれに、RADで生成されたコードが最初に手作業で変更されることなく本番環境に移行します。
コードは引き続き非常に複雑であり、その複雑さは新しいテクノロジーによって減少することはないようです。
期限に間に合わない、または予算を超過する割合は、他の分野よりも大きくなり、多くの場合、それらを満たすために技術的負債が発生し、隠れたコストが発生します。
間違いなく起こったことは、区画化が発生したことです。知っておくべき膨大な量のテクノロジーは、プログラマーが本当に得意とするために少数のテクノロジーを専門化する必要があり、さまざまな種類の専門家が大規模なプロジェクトを完了する必要があるということです。
ソフトウェアの複雑さについて話すことの1つは、文字通り世界には数百の自動車メーカーが存在するのに対し、オペレーティングシステム(デスクトップ、モバイル、組み込みなど)を作成および保守できる企業のリストは指で数えることができるということですあなたの手の。
上記のすべてが、プログラマーになるために勉強する人が十分でない状況を作り出しました。そのため、政府は、より多くの学生がそのキャリアパスをとるように動機付けるためにキャンペーンを作成しました。
ソフトウェア業界の成熟度の趣味の1つは、ソフトウェアライセンスが「<companyX>は特定の目的に対するこのソフトウェアの適合性について何も表明しない。明示的または黙示的な保証なしに「現状のまま」提供される」と述べていることです。ハードウェアメーカーが自社製品が特定の目的に適さないと述べているとします。それが今の最先端です。
特定のメトリクスについて議論するかもしれませんが(つまり、物事は9.98倍に改善されていますか?)、私(昔から何かと言えば)はブルックスのコメントの一般的な感情に同意する必要があります。
まず、1970年以降に発明された真に新しい技術はほとんどありませんでした。はい、集積回路はより長く、より低く、より広くなり、グラスファイバーは通信速度を改善しましたが、一歩前進するたびに戻ってきます。
コンパイラーテクノロジーにより、1桁の関数が実際のコーディング時間で割られて生成される1970年と比較して、プログラマーの「生産性」が約10倍向上しましたが、新しいまたは「改訂された」プログラミング言語と環境の急増は、平均的なプログラマーがますます多くを費やしていることを意味します「追いつき」モードでの時間であり、生産的な活動では少ない。Apple、Google、およびMicrosoftはすべて、自社の環境に新たな、実質的に互換性のない「アップグレード」を吐き出します。その速度は、自分たちのサービス、つまりプログラミングの顧客の間で反乱を引き起こします。同様に、HTML / CSS / Javascript / whateverはさらに複雑になります。
かつて文書を作成して広めることができる速度は、この「革新」すべてを制限し、まとめていましたが、インターネットのおかげで、厳密な文書はもはや必要ありません-機能を吐き出してブロガーに頼るだけです詳細を探し出し、利用できるようにします。
追加: 昨日からこれについて考えていましたが、特に1978年頃から2008年まで取り組んだプロジェクトについて考えていました。その複雑さを制御するために作られました(1つは、ソフトウェアを2つのほぼ等しい部分に分割し、それらの間に「マシン」インターフェースを配置することです)。私が働いていた特定の分野では、同僚の何人かが同様に複雑さを制御することに専念していました(ただし、その用語は当時あまり使用していませんでした)。その結果、製品は(最初は)非常に堅牢で、git-goの顧客からの「ヒット」が得られました。そして、よく訓練されたオーケストラで演奏するような、取り組むことは喜びでした。
もちろん、長年にわたって複雑さは忍び込んでおり、通常は複雑さを制御することに感謝のないマーケットプランナーや管理者からの要請がありました(単純さを維持することとは多少異なります)。私はこれが避けられないと感じているわけではありませんが、この場合、マネージャー(グレンヘンリーが最初にやったように)が混乱の力を押し戻さずに防ぐことは不可能でした。
私たちは、過去30年以上のソフトウェアエンジニアリングの実践で学んだことの偉大な契約は、新しいソフトウェアの初期開発をスピードアップすることができますフォーム「技術Xのですが、について多くまたはより多くの時間の考え方として費やすことはありません場合はどのようにしてときあなたが長期的には、それはメンテナンスであなたに多くの時間と労力を桁違いの原価計算、技術的負債の吸引沼にあなたのアプリケーションを向けるだろう、それを使用して保存されたとして、それを使用します。」
このカミソリに該当する技術には、ハンドコーディングされたアセンブリ言語、コンパイラ、インタプリタ、プロシージャライブラリ、命令型プログラミング、関数型プログラミング、オブジェクト指向プログラミング、手動メモリ割り当て、ガベージコレクション、静的型、動的型、字句スコープ、動的スコープが含まれます。 、「安全な」ポインター、「安全でない」ポインター、言語概念としてのポインターの欠如、バイナリファイル形式、構造化マークアップファイル形式、マクロ、テンプレート、マクロとテンプレートの回避、共有メモリ、メッセージパッシング、スレッド、コルーチン、非同期イベントループ、集中リモートサービス、分散サービス、ローカルにインストールされたソフトウェア、配列、リンクリスト、ハッシュテーブル、ツリー。
上記のリストの項目の多くが、既知のソリューションスペースを使い果たすグループになっているという事実は非常に意図的であり、それ自体で何かを伝える必要があります。一つは、その主張する可能性が唯一の彼らは最初のZ3に切り替わるので、私たちが持っていた実践で明確な、一律改善をブロック構造化プログラミング(スパゲッティコードではなく)とメモリ保護(少年、私が今までやるされていないミスをタイプミスが私のコンピュータ全体をダウンさせる可能性のある日)。