リターンのない複雑なポイント。あなたはそれを何と呼びますか?


13

ソフトウェア開発者としての私の主な仕事の1つは、複雑さを管理することです。

ただし、一部のプロジェクトでは、複雑さのレベルが非常に高くなり、ある種の「リターンなし」ポイントに達する瞬間があります。この瞬間を過ぎると、すべてを最初から書き直す必要がある場合よりも短い時間でプロジェクトを許容できるレベルの複雑さに戻すことはできません。

この特定の瞬間にはプログラマーの方言で名前がありますか(ゴルウィンのトロールの法則に似たもの)?

-編集-

はっきりしない場合は申し訳ありません。この「瞬間」には正式な名前があるとは思いませんし、重大な指標でもありません。私はxkcdの「バルマーピーク」の精神で何かを考えていました。


1
問題のポイントの定義には1つの論争があります:...すべてをゼロから書き直す必要があるより短い時間で、プロジェクトを書き直す人は十分であるか、少なくとも少なくともそもそも混乱を作成しました;)
mojuba

1
名前について合意されていない理由の1つは、誰がコードを見ているかに依存しているからだと思います。ある開発者にとって絶望的に複雑または維持できないように見えるものは、別の開発者にとってはかなり合理的に見えるかもしれません。深刻な場合、「ms」というプレフィックスを付けてDLLにコンパイルするだけで、Microsoftからのものだと言います。
ケビン・スー

1
たぶんこれでうまくいくでしょう:テクニカルデットイベントホライズン
-PeterAllenWebb

回答:


20

複雑よりも保守性の問題です。

この現象は「技術的負債」と呼ばれ、危機的なレベルに達すると、プロジェクトは破産に向かっています。

それはあなたが意図したものですか?


ご回答ありがとうございます。「技術部」の概念を知っています。すべてのプロジェクトには何らかの技術的負債があります。私が言いたいのは、この借金が非常に高くなり、プロジェクトをゴミに捨ててやり直すことを好む瞬間をどのように呼ぶのですか?
ティボーJ

3
あなたの用語「技術的な破産」が好きです。実際の破産の場合と同様に、どの部分が回収可能で、どの部分が取り残されるべきかを注意深く調べる必要があることが示唆されています。そして多分、いくつかの債務再編は本当に必要なすべてです:)
Jaap

2
@Thibault J:その瞬間に特定の用語があるとは思わない。それは、あなたがその時間の前にまだ幸せであるか、悲しいことにそれを超えて過ぎているかどうかを認識することです。

1
@開発者アート:...その時間より前にまだ幸福であるか、悲しいことにそれを超えた場合に実現する -私はそれがポイントの適切な定義を与える鍵だと思います:ポイントを超えたプロジェクトはエンジニアではないものです自発的に引き継ぐ。
-mojuba

3
私は「技術的な破産」の用語に行きます、私はそれが好きです。また、あなたの定義も使用します。
ティボーJ

16

「過剰な複雑さのポイント」は、英語では次のように呼ばれます。

なんてこった、このクラップスとは。

問題は、これは実際に単純なものに適用できるが、同じ反応をするような恐ろしい方法で実装されていることです。

したがって、非常に恐ろしいものから非常に複雑なものを区別することは困難です。

ただし、実際にすべてのソフトウェアで発生する傾向があるのは、次のようなプロセスです。

ステップ1:優れた仕様を作成し、優れた設計を行い、優れたものを実装します。みんな幸せ。

ステップ1の終わりに、開発者は自分のデザインの素晴らしい優雅さに自分自身を祝福し、「他の人が将来物を追加するための素晴らしい遺産があります。それは素晴らしいことであり、世界はより良い場所。"

ステップ2:いくつかの変更が加えられ、物事が追加され、新しい機能が含まれます。ステップ1のアーキテクチャと構造により、これは非常に簡単なプロセスになりました。[しかし、おっと、 "cruft factor"が少し増えただけです。]

ステップ2の終わりに、開発者は自分のデザインの素晴らしい優雅さに自分自身を祝福し、幸せな考えを捨てます。「ステップ1でこれらのすべてを許可したことはとても賢いことです。これはとてもうまくいきました。将来的に他の人が物事を追加するために、ここは素晴らしいものであり、世界はより良い場所になるでしょう。」

ステップ3:より多くの変更が行われ、より多くのものが追加され、より多くの新しい機能が追加され、多くのものが変更され、ユーザーのフィードバックが実際に聞かれています。

ステップ3の終わりに、開発者は自分の設計の素晴らしい優雅さに自分自身を祝福し、「このアーキテクチャは非常に多くの変更を簡単に取り入れることができるのでかなりいいと思います。しかし、私は少し不幸です。 XとYとZについてです。それらはもう少しクリーンアップできますが、!!!!!!ああ!!!ステップ1でこれらすべてを許可したことはとても賢いです。これはとてもうまくいきました。将来的に物事を追加する他の人たちは、素晴らしいことであり、世界はより良い場所になるでしょう。」

ステップ4:ステップ3と同じ

ステップ4の終わりに、開発者は次のように考えます。「非常に良かったものは、維持するためにいものになっています。本当に重大な変更が必要です。これに取り組むのはあまり好きではありません。リファクタリングが必要です。私は彼にそれが6週間を必要とし、これの終わりにユーザーが見ることは何もないと言うとき...と言いますが、私はこれを行うことでさらに5年間のおいしい将来の修正範囲を得ます....うーん..ビールを飲みにパブに行く時間。」

ステップ5:多数の変更を行う必要があります。

そして、ステップ5の間に、開発者は互いに「このコードはダメです。誰がこれを書いたのですか。彼らは撃たれるべきです。恐ろしいです。私たちはそれを書き直さなければなりません。」

ステップ5は致命的です。これは、重要な要素が非常に悪くなっているため、コードにさらにいくつかの変更を加えることはできず、いくつかの大きな変更が必要です。

ステップ5の問題は、それを捨ててやり直したいという欲求です。これが致命的である理由は「Netscape Factor」です。グーグルイット。企業はこの時点で死にます。なぜなら、再び始めることは、事実ではなく約50%の仮定、知識ではなく150%の熱意、謙虚ではなく200%のrog慢から始まることを意味するからです(「あの男たちはとても愚かだった!」そして、あなたはたくさんの新しいバグを導入します。

最善の方法は、リファクタリングすることです。少しずつ変更します。アーキテクチャが少し疲れてきたら、修正します。追加、拡張、改善。徐々に。途中の各ステップで、テスト、テスト、さらにテストを行います。このような漸進的な変更は、10年後、現在および元のコードが祖父のxのようになることを意味します(「10個の新しいヘッドと3個の新しいハンドルがありましたが、それでも祖父のaです」)。つまり、共通点はあまりありません。しかし、古いものから新しいものに徐々に慎重に移行しました。これにより、リスクが軽減され、顧客にとっては、腹立たしい要因が減少します。


ステップを短くすると、より多くの賛成票がもらえるでしょう。
コーディズム

ほとんどの企業はこのために予算を組まないので、リファクタリングは常に少なすぎます。システムの増加するエントロピーを管理するには、1日目から、ハウスキーピングのためにすべてのジョブから予算(10%〜20%)が割り当てられます。バグ修正の予算ではありません。予算支出は、管理、マーケティング、販売ではなく、エンジニアリングによって決定されます。開発によって作成されたエントロピーを除外するためにのみ使用され、製品が寿命に近づくにつれて支出が削減されます。
-mattnz

同意した。経営陣は常にそのようなことを整えたいと考えています。時々、それを隠すことで逃げることができます(何をするか、リファクタリングが必要な場合、開発見積もりに約20%を追加します-DO IT)。
すぐに

1
本当にリファクタリングできない点があります。同じお粗末なインターフェイスまたはデータベースに依存する複数の異種ビジネスアプリケーションがある場合、下手な基盤に依存する他のすべてのアプリを壊さずに、基礎となるものを非常にうまく修正することはできません。この時点で、あなたは本当にめちゃくちゃです。
ジョンクロマーティ

2

この瞬間を認識するのは難しく、適切なプロセスで回避できることに同意します。しかし、質問はそれを何と呼ぶか​​についてでした。実際の経済学では、「収益の減少」という概念があります。プロセス内の1つのリソースへの入力を増やすと、ユニットあたりの全体的な利益が減少するポイントです。これは確かにコーディングに当てはまり、抽象化、再利用などの優れたものでさえ、利益を減らすようなポイントを持っています。一般的なプログラミング固有の用語は「オーバーエンジニアリング」です。これを行う傾向がある人にとって、私はジョエルの用語「建築宇宙飛行士」が好きです。


1

新しいツールを備えた新しいチームは、それを見つけるためだけに、より安価で、より高速に、より信頼性の高いコードを実行できるという誤った印象の下で、あまりにも頻繁に良いコードが破棄されます。

  • 複雑さは非文書化要件にあります
  • 新しいツールは、約束されたフラッシュWebサイトよりも使いにくい
  • 新しいチームは思っていたほど「ホット」ではありません

おそらくあなたが説明した時間は、いくつかのコードベースで到着します(私はそう思っていました)。私は、古いコードがプロジェクトを終わらせたり、コードを書き直してプロジェクトを保存したりするケースを個人的に経験したことがありません。

このケースでは、特定の問題のあるモジュールまたは設計を特定するためにメトリックが使用され、それらが選別されて置き換えられた場合は含めません。


まあ、私は彼らのメンテナンス予算が初期の開発予算の3〜4倍になるようにプロジェクトが非常に強化されたことを見てきました。とにかく、私が探している用語は「公式」で深刻なものではなく、xkcdの「Ballmer peak」のようなものです。よくわからない場合は申し訳ありません。
ティボーJ

しかし、どうしてそんなに熱狂したのでしょうか?複雑な要件、不適切な管理、楽観的なエンジニアが原因である場合、なぜそれを修正する必要があるのでしょうか?
マッテンツ

チームがそれを書き直しているのは、最初にそれを書く人と同じではないからですか?
ティボーJ

1

この理論的な「瞬間」の本当の問題は、事実の後にしか認識されないということです。同僚がサイコパスでない限り、コードベースへのすべてのコミットは、そのコードベースの改善であるという信念で行われます。その「瞬間」に合格したことがわかる次の混乱を振り返るだけです。

しかし、私はそれに名前を付けることができるのが好きです。「紳士」と言うことができます。仲間の開発者をあなたの周りに引き寄せてください。「私たちは保守性のヘレスポントを越えました。


「コードベースへの単一のコミットはすべて、そのコードベースの改善であるという信念で行われます。」同じ会社で働いたことはないようです:)
ティボーJ

@ThibaultJ-おそらく同僚はサイコパスでしたか?
ダン・レイ

@Thibault J:すべてのコミットは、そのコードベースの改善であるという信念を持って行われていると信じています。もちろん、信念は十分に研究されておらず、根拠のないこともあります。
デビッド

私の最後の仕事では、コードベースの改善であるという信念を持って誰かが行ったメンテナンスのコミットはないと思います。
ボビーテーブル

プロジェクトの要件が十分に変更されて新しいデザインに強制的に置き換えられる場合もありますが、それでも古いバージョンを変更する必要がある場合があります。古いバージョンの以前のユーザーのほとんどが新しいシステムを使用し、古いシステムを必要としない場合は、たとえ新しいシステムが不適切な場合でも、新しいシステムが適していない少数の人々の要件を満たすバージョンを作成することは完全に合理的ですとにかくそれを必要としない人々にとってシステムを使いにくくする。
supercat

-1

名前があるかどうかはわかりませんが、名前がなければ「メルトダウンポイント」と呼ぶことをお勧めします。


または別の核用語を借りるために:臨界質量。
ジョンクロマーティ

-2

これはあまり興味深い質問ではありません。

確かに簡単です。

非常に些細なことなので、私たちは多くの対処方法を進化させてきました。

  1. ウォーターフォールの方法論。多くの人が要件と設計ドキュメントの確認に多くの時間を費やして、複雑さが管理されていることを確認します。

  2. アジャイル手法。誰かの問題を解決し、ソフトウェアをリリースするためにすぐに適用できるものについて議論する時間が少なくなります。誰もが何かをリリースすることに集中しているため、複雑さが管理されます。

誰もが「複雑さ」と格闘するのは、方法論に従わず、時間を適切に管理できないためです。

  • ウォーターフォール方法論の詳細な監督なし。要件、アーキテクチャ、高レベルの設計、または詳細な設計レビューで中間作業成果物をレビューする必要はありません。

  • アジャイル手法では、スプリントの期限や適切なユースケースの優先事項はありません。ユーザーに何かをできるだけ早くリリースすることに焦点を合わせていません。

目標を設定することにより、複雑さを制限する必要があります。

複雑さと格闘するということは、目標が設定されていないか、適切に報われていないことを意味します。

「ターニングポイント」はありません。複雑さの管理がなんらかの問題である場合、組織的に何かがすでに間違っています。


1
要点はわかりません。正常に実行されたプロジェクトがリターンなしのポイントに達することはほとんどありませんが、すべてのプロジェクトが正常に実行されるわけではありません。とにかくうまく実行されないプロジェクトも成功しますが、残りはさまざまな理由で失敗します。
デビッドソーンリー

@David Thornley:それが私のポイントです。「リターンのない複雑さのポイント」は存在しません。それは単なる昔ながらの悪い管理です。洗練された名前やルールは必要ありません。複雑さは、不適切な管理の症状にすぎません。あまり面白くない。
-S.ロット

@ S.Lott:適切に管理されたプロジェクトではないものの、存在すると思います。ひどく管理されたプロジェクトの群れがそこにあり、それらのいくつかは複雑なイベントの地平線の中に入り、いくつかはそうしません。私は、すべての悪い管理をひとまとめにすることは本当に有益だとは思わない。
デヴィッドソーンリー

@David Thornley:悪い管理(恐ろしい複雑さをもたらす)と悪い管理(誰もがやめる)を解きほぐすのは非常に難しいと思います。プロジェクトが複雑になりすぎるのか、遅刻するのか、単に無能になるのかを判断する方法がわかりません。
-S.ロット

@ S.Lott:ただし、すべての人が健康をやめるか、深刻な健康被害を被るプロジェクトと、複雑さが過剰になるプロジェクトには違いがあります。失敗にはさまざまな方法がありますが、それらを分類することは興味深いかもしれません。
デビッドソーンリー

-2

(大きな)プロジェクトとコードの複雑さを増大させるリスクを視覚化および監視する方法があります。それらが適度に適用される場合、戻りのないポイントの新しい名前は必要ありません。(openHPIに関連するMOOCがありますhttps ://open.hpi.de/courses/softwareanalytics2015/ )

構造的な複雑さは、大規模なチームのソフトウェア設計だけでなく、一般的な設計上の問題です。視覚化は、構造の複雑さの管理における最初のステップです。行列と有向グラフもこの目的に使用できます。

構造の複雑さを軽減する方法は、http//www.buch.de/shop/home/suche/?fq = 3540878890です。

  • モジュール化
  • フィードバックループの回避
  • 三角測量

さらに、公理的設計の概念があります。https:\ en.wikipedia.org \ wiki \ Axiomatic_design \この概念により、不必要な複雑さによる信頼性の問題を回避できます。

したがって、多数のメソッドが利用可能です。プロジェクトは十分に大きくなるので、最終的には常にそれらについて考える決定についてです。


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