依存関係を他のプログラマーに非常に明白にすることを促進するプログラミングパラダイムはありますか?


26

私は、さまざまなアーティファクトをリンクする迷路のような依存関係を持つ多くのストリームとレイヤーを介して複数のシステムを調達するデータウェアハウスで働いています。ほぼ毎日、このような状況に陥ります。何かを実行しますが、機能しません。大量のコードを調べますが、数時間後には、今わかっていることのごく一部のプロセスマップを概念化することができました。後日必要になるので、誰かに尋ねて、この他のストリームを最初に実行する必要があることと、ここでチェックした場合(他のコード化された依存関係の巨大なスタックの一見arbitrary意的な部分を示す)、これを見た。とてもイライラします。

再帰的なレベルのコードや、さらにはデータにオブジェクトを深く埋め込むのではなく、オブジェクト間の依存関係をより明確に見えるようにするためにもっとや​​った方がいいだろうとチームに提案できた場合おそらく、よく知られ、試行され、テストされたソフトウェアパラダイムを参照することで、別のストリームが存在するために存在する必要があります。

私のチームにこの利点を説明するのはちょっと難しいです。彼らは物事をありのままに受け入れる傾向があり、システム全体を新しい方法で概念化できる利点を見るという点で「大きく考える」ことはしません。巨大なシステムをモデル化できるなら、効率的な場合、メモリの非効率性、ストリーム停止の一意の制約、重複キー、ナンセンスデータに遭遇する可能性が低くなります。元のビジョンに沿って設計する方がはるかに簡単で、後でこれらすべての問題に遭遇することはありません私たちは現在、過去の仕事では珍しいことを知っていますが、彼らは避けられないと考えているようです。

では、依存関係を強調し、理想の長期的な順守を確保するために、システムの一般的な概念モデルを促進するソフトウェアパラダイムを知っている人はいますか?現時点ではかなり混乱しており、すべてのスプリントは「こことこことここにこのものを追加するだけ」であるように見えます。


2
これらがどのような「さまざまなアーティファクトをリンクする迷路のような依存関係」であるかを明確にできますか それらは、Mavenのようなビルドツールで解決できる依存関係をビルドしますか?これらは入力依存関係にありますが、これらのアーティファクトの1つは、明白または明確でない入力に依存していますか?データベーステーブル間の主要な依存関係ですか?
FrustratedWithFormsDesigner

システムはPLSQL、Unix bash、OWBなどであるため、あらゆる種類の依存関係があります。特定の形式、特定の場所、特定の時間、特定のモジュールでデータが必要になる場合がありますが、コードからはそれほど明白ではなく、2つの方法でしか識別できません。おそらく数日かけて、一部のデータがシステムの一部に区切りのセミコロンを持っていることを知るために、再帰的に呼び出されたコードの10層に埋もれていたために参照されていることさえ知らなかった、または誰かに尋ねることによって、時間、毎回。それは独立を促進しません。
Christs_Chin

4
文字通りそれらのすべて
マイルズラウト

3
少しの接線:Haskellは遅延しているため、コードを記述するときに操作の順序を効果的に指定しません。依存関係のみを指定します。関数Cは関数AとBの結果に依存します。したがって、AとBはCの前に実行する必要がありますが、Aを最初に実行した場合、またはBを最初に実行した場合も同様に機能します。面白いと思っただけです。
グレンペターソン

1
デザインパターンと呼ばれる本があります(この本はうんざりしますが、シングルトンについてのビットを除いて、それが言うことのほとんどは良いです)。依存関係の管理に関するいくつかのセクションがあります。
ctrl-alt-delor

回答:


19

発見可能性

その不在は多くの組織を悩ませています。フレッドが再び構築したツールはどこにありますか?Gitリポジトリで確認してください。どこ?

思い浮かぶソフトウェアパターンはModel-View-ViewModelです。初心者にとって、このパターンは完全な謎です。私は妻に、「テーブルの上に浮かぶ5つのウィジェットが神秘的な力で互いに話し合っている」と説明しました。パターンを理解し、ソフトウェアを理解します。

多くのソフトウェアシステムは、アーキテクチャが自明であるか、またはコードから自然に出現すると想定しているため、アーキテクチャの文書化に失敗します。そうではなく、そうでもありません。適切に定義されたアーキテクチャを使用していない限り、新しい人々は迷子になります。文書化されていない(または有名な)場合、新しい人々は迷子になります。また、退役軍人も、数か月間コードから離れると、道に迷ってしまいます。

賢明な組織アーキテクチャ考え出し、それを文書化するのはチームの責任です。 これには次のようなものが含まれます

  • フォルダー構成
  • プロジェクト参照
  • クラスのドキュメント(それが何であるか、何をするか、なぜ存在するか、どのように使用されるか)
  • プロジェクト、モジュール、アセンブリ、あらゆるドキュメント。

チームが常に車輪を再発明しないように、物事を整理して発見できるようにするのはチームの責任です。

ところで、「コードは自己文書化する必要がある」という概念は、部分的に正しいだけです。 コードですべての行をコメントで説明する必要がないように、コードを十分に明確にする必要があるのは事実ですが、クラス、プロジェクト、アセンブリ、インターフェースなどの成果物間の関係は非自明であり、文書化する必要があります。


3
確かに、デザインパターンに過度に傾いている人々は問題の一部です。彼らは、他の誰もがコードを見ただけで何をしたかを理解していると仮定して、ドキュメントなしでコードを書いています。また、ソフトウェア設計パターンはアーキテクチャではありません(ほとんどの場合)。
ロバートハーヴェイ

1
フレッドが再び構築したツールはどこにありますか?Gitリポジトリで確認してください。どこ?-まさに!MVCパターンはフロントエンド開発に固有すぎます(私は思う)、そしてチームの全員がそれらを知っている場合にのみパターンが有用であるため、これは問題を依存関係が明らかではないことから、誰もが見つける方法を知っている場合に明らかになるように移動しますそれら。しかし、問題はこれが事実ではないことを前提としています。そのため、使用するために他の学習された概念フレームワークを必要としない、依存関係を説明する非常に明白な方法を促進する何かがあることを望んでいます。
Christs_Chin

7
「ドキュメント」と呼ばれます。さらに、誰もがサポートする賢明な依存関係フレームワークが必要です。残念ながら、プロジェクトにドロップするだけの定型的なテンプレートはありません。ソフトウェアの組織構造は、賢明なアーキテクチャの助けを借りて、チームが自ら作成するものです。
ロバートハーヴェイ

5
@RobertHarvey:ごく最近、「ドキュメンテーションを必要としないコードを書く」と聞いた。違う。ドキュメントなしでコードを書いています。
gnasher729

3
ここにいくつかの良いもの。注:コメントを必要としないコードの作成と、サポートドキュメントの作成には違いがあります。
ロビーディー

10

この種の問題に対処する最善の方法は、段階的に行うことです。欲求不満にならずに、広範囲にわたる抜本的なアーキテクチャの変更を提案してください。それらは決して承認されず、コードは改善されません。それは、あなたが行うべき、広くて広範囲にわたる正しいアーキテクチャ変更を決定することさえできると仮定しているが、これはありそうもない。

である可能性が高いことは、あなたがちょうど解決し、特定の問題であなたを助けていた小さな変更を決定することができるということです。そうかもしれない提案するなど、不足している依存関係を警告するスクリプトを書いて、インターフェイスを作成、いくつかのドキュメントを追加し、いくつかの依存関係を反転すること代わりに小さな変更を。さらに良いことに、あなたの会社の文化に応じて、彼らはあなたが元のタスクの一部としてあなたがそのような改善をすることを容認するか、さらに期待するかもしれません。

これらの小さな変更を作業の通常の部分にし、例によって他の人にもそうするように勧めると、それらは時間の経過とともに実際に合計されます。許可されていない単一の大きな変更について泣き言を言うよりもはるかに効果的です。


2
漸進的な変更という考え方に同意します。問題は、いくつかの組織原則が既に設定されていない場合、より多くの混乱が生じる可能性があることです。単一のプロジェクト、クラス、または他のアーティファクト(他のモジュールが依存する)のみをより適切な場所に移動する効果を考慮してください。
ロバートハーヴェイ

1
素晴らしいもの。混乱から秩序を作り出すために、あちこちに道具/小道具を追加することに熱心な少数の勤勉な魂によって、私の苦悩はしばしばそれほど難しくありません。私は一連のドキュメントや一連のドキュメントのファンではありませんが、よく書かれたチートシートまたは指摘事項/機能の箇条書きリストは大いに役立ちます。
ロビーディー

+1承認される可能性が高い小さな変更を提案した場合。私はそれを経験し、それが私がより影響力のある人になるのを助け、それから私の提案はより大きな影響を与えました。
RawBean

2

建築。

すべてのソフトウェアのすべての側面に適用される発見可能性と保守性の問題を解決する、単一の、具体的な、普遍的な原則または慣行はありません。しかし、のための広範な用語プロジェクト正気を作るものがあるアーキテクチャ。

アーキテクチャは、潜在的な(または歴史的な)混乱の各ポイントに関する決定の集合体です-アーキテクチャの決定が行われ、文書化される方法の指定を含みます。など、開発プロセス、フォルダ構造、コードの品質、デザインパターン、およびに関するすべてが行くかもしれないすべてのものですあなたのアーキテクチャではなく、そのうちの一つは、あるアーキテクチャ。

理想的には、これらのルールは心の特異性によって統一されています。

小規模なチームでも確かに共同でアーキテクチャを作成できます。しかし、意見が異なると、これはすぐにあなたの正気を維持するのに役立たない非常に統合失調症の建築つながる可能性があります。アーキテクチャ、およびその中の多くのTLAとパターンがすべて、単一の心でチームの成功に役立つことを保証する最も簡単な方法は、単一の心に責任持たせることです。

さて、それは必ずしもに「建築家」を必要としない司教職をまた、一部のチームは経験豊富な人にこれらの決定を下してもらいたいと思うかもしれませんが、主なポイントは、特にチームが成長するにつれて、誰かがアーキテクチャを所有する必要があることです。誰かがチームの脈動を把握し、アーキテクチャの議論を調整し、意思決定を文書化し、意思決定を監視し、アーキテクチャとその精神に準拠するために前進します。

私はすべての決定を下す一人の大ファンではありません。しかし、アーキテクチャの議論を調整し、決定を文書化する責任を負う「アーキテクト」または「技術製品の所有者」を特定することは、より大きな悪と戦う:認識できるアーキテクチャをもたらさない責任の拡散。


あなたは、認識できるアーキテクチャがないことに責任があるとして責任の拡散を識別することにおいて絶対に正しいです。現在、この問題を解決する決定がなされたのはごく最近です。私はいつもこれに対する良い解決策は、システムの内容を決定するが、アーキテクトがどのようにプログラムするかに応じてどこで決定するのかという種類のハーネスとして機能する別のソフトウェアシステムを介して分散システム全体を作成することだと思います。複数の異なるシステムとテクノロジーに対する1つのビューがあり、システムアーキテクチャ図を介してそれらをナビゲートします
...-Christs_Chin

この答えのあなたのポイントは、OPが話している種類の物と戦う/防ぐための単一の最高の方法だと思います。OPのように混乱を継承することにも適用されます。
GWR

1

(両方の意味で)ソフトウェアエンジニアリングへようこそ;)これは良い質問ですが、実際には簡単な答えはありません。これは、時間をかけてより良いプラクティスに進化し、より熟練するように人々を訓練するというケースです(定義により、業界のほとんどの人々は平凡な能力です)。

専門分野としてのソフトウェアエンジニアリングは、最初に構築し、私たちのようにメンタリティを設計することに苦しみます。それはただ獣の性質です。そしてもちろん、前述のコーダーが技術的な負債を導入することを犠牲にして短期的なニーズを解決する機能的なソリューションを迅速に導入するにつれて、ハックは時間の経過とともにハックに基づいて構築されます。

使用する必要があるパラダイムは、基本的にはより良い人材を獲得し、有能な人材を訓練し、計画とアーキテクチャに時間をかけることの重要性を強調することです。モノリシックシステムで作業するとき、その「アジャイル」を簡単に実現することはできません。小さな変更であっても、導入するにはかなりの計画が必要です。優れた高レベルの文書化プロセスを導入することは、主要な人々がコードをより迅速に把握するのにも役立ちます。

あなたが焦点を当てることができるアイデアは、システムの重要な部分を分離し、リファクタリングして、徐々にモジュール化し、分離し、読みやすく、保守しやすくする方法です。これは、既存のビジネス要件を満たすための秘trickです。したがって、目に見えるビジネス価値を提供すると同時に、技術的負債の削減を行うことができます。そのため、ソリューションは、実践とスキルを改善することと、長期的なアーキテクチャー思考に向かっていくことの一部です。

本当にこれはコーディングの詳細やアーキテクチャスタイルよりもはるかに大きな問題であるため、コーディング技術の観点ではなくソフトウェア開発方法論の観点からこの質問に答えていることに注意してください。それは本当にあなたがどのように変化を計画しているかという問題です。


6
私はあなたが言っていることを聞きますが、あなたの答えは最終的には不満であり、率直に言って少しin辱的です。これは、単に優秀な人材を雇用することよりも大きな問題です。私が働いている小さな店でさえ、私たちはこれに苦労しています。それは単なる人の問題以上のものだと思います。特定の技術的な問題点があると思います。
ロバートハーヴェイ

1
技術的な側面があることに同意しますが、変更を計画するためのより強力な方法論に重点を置くことと比較すると、それらは比較的マイナーだと思います。これは、より多くの計画と分析、より早い計画と分析、より良い計画と分析への文化的変化と同じくらい、設計パターンに関するものだとは思いません。
ブラッドトーマス

さて、比較として自分の答えを投稿します。ソフトウェアパターンとは何の関係もないと思います。
ロバートハーヴェイ

ブラッド、答えてくれてありがとう。この問題を認識しているのは私だけではないことを知っているので、あなたの反応は高く評価されています。私のチームではこのように思えます。また、私はこの問題が広まっているという点でロバート・ハーベイに同意します。新しいタイプのソフトウェアまたは新しい実務のいずれかに解決策があるという信念をあきらめたくありません。
Christs_Chin

2
まさに私の経験:チームメンバーに彼らが何をしているかを理解してもらう必要があります。MVVMとMVCを混合する人、Windows Forms(またはVB6)で通常の方法でWPFコントロールを使用する人、オブジェクト指向の基本的な理解なしにC#でプログラミングする人...を教えます。もう一度教えます。イライラする。もう一度教えてください。そして...再び彼らを教え
ベルンハルト・ヒラー

1

@RobertHarveyの規約の考え方が好きで、それが役立つと思います。また、@ KarlBielefeldtのアイデア「好きなようにドキュメントを作成する」も気に入っています。それがドキュメントを最新の状態に保つ唯一の方法だからです。しかし、包括的な考え方は、コードのすべての部分を見つけ、それらを構築し、デプロイする方法を文書化することが重要だと思います!

私は最近、完全に文書化されていないコードを生成するXML構成が含まれていた重要なオープンソースプロジェクトにメールを送りました。メンテナーに、「このXMLコード生成プロセスはどこに文書化されていますか?テストデータベースのセットアップはどこに文書化されていますか?」と尋ねました。彼は言った、「そうではない」。それは基本的に単一の貢献者プロジェクトであり、今ではその理由がわかっています。

あなたがその人で、あなたがこれを読んでいるなら、あなたがやっていることに本当に感謝しています。私は実質的にあなたの労働の成果を崇拝します!しかし、あなたの本当に創造的なものがどのようにまとめられるかを文書化するのに1時間を費やしたなら、私はあなたを助けることができる新しい機能をコーディングするのに2、3日費やすかもしれません。「ドキュメンテーションの不足は問題ではない」というレンガの壁に直面したとき、私も試してみるつもりはありません。

ビジネスでは、ドキュメントの欠如は時間とエネルギーの大きな浪費です。そのようなプロジェクトは、多くの場合、「すべての部品はどこにあり、どのように組み合わせるのか」などの基本的なことを理解できるように、さらに費用のかかるコンサルタントに蓄えられます。

結論として

必要なのは、テクノロジーや方法論ではなく、文化の変化です。物事がどのように構築され、なぜ重要であるかを文書化するという共通の信念。これは、プロダクションに移行するための要件であるコードレビューの一部である必要があります。誰もがそれを信じて行動すると、状況は変わります。そうでなければ、それは私の失敗したオープンソースの貢献のようになるでしょう。


2
文化的な問題の一部は、「ユーザーストーリーの一部でない場合(つまり、ステークホルダーの価値に直接貢献しない場合)、それは重要ではない」というアジャイルの信念にあると思われます。 ホグウォッシュ。 ここで関連する会話:アジャイルでは、プロジェクト開始時の基本的なインフラストラクチャタスクはどのように計画および割り当てられますか?
ロバートハーヴェイ

@RobertHarveyはい。私のチームの誰もが信じられないほど明るく、非常に簡単に付き合うことができます。スクラムマスタとプロジェクトマネージャは、十分な意図と意欲を持っており、実践は私が働いた中で最もアジャイルです。しかし、おそらくあなたが提案するまさにその理由のために、ドキュメントが欠けています。さらに、ドキュメントが作成されると、コミュニケーションの有効性のランダム性のさらなるレイヤーが、そのようなタスクを引き受ける必要があるという態度は言うまでもなく、適切な概念を識別し、それらを説明する人の能力に導入されます。通常、それは単に「質問する」です
-Christs_Chin

@GlenPetersonはい、これは役に立つと思います。しかし、それは構築されるべきであるだけでなく、どのようにそして何がドキュメンテーションとして適格であるかについても指定されるべきです。たとえば、最近の例として、システムが識別する新しい番号のリストを誰かが含めました。それでおしまい。これらの数字がどのようにシステムに入るか、どこで、なぜ、誰によって、どのくらいの頻度で、または何か有用なことについては言及されていません。私たちのシステムが関連していると特定する番号は何も考えたことがありません。しかし、私はしばしば、彼らがどこへ入るのか、どこへ行くのか、途中で何が起こるのかと疑問に思っています。まだ謎です。
-Christs_Chin

1
@Christs_Chinコミュニケーションの多くはコンテキストに基づいています。そのコンテキストがなければ、ほとんどの通信はほとんど無意味です。あなたの痛みが分かります。しかし、他の人があなたを理解できるように書くのは難しいと思います(英語)。システムの初期仕様には、恐ろしく古くなっていても理解する必要があるコンテキストがある場合があります。通常はコンテキストが役立ちます。
グレンペターソン

1

(特定の状況についてアドバイスするのではなく)提起された質問に答えるには:

純粋な関数型プログラミングとして知られるプログラミングパラダイムでは、関数の出力に影響するすべてのものを入力パラメーターで指定する必要があります。隠された依存関係やグローバル変数、またはコードベース全体に目に見えないように作用するその他の不可解な力はありません。「これを最初に行う必要がある」一時的な結合はありません。


0

各データウェアハウスは異なりますが、自分で物事を簡単にするためにできることはたくさんあります。

まず、データベースのすべての行にはDATE_ADDED列とDATA_UPDATED列があり、データベースに追加された時刻変更され時刻確認できました。また、SOURCE_CODE列があるため、データのすべてのビットがシステムに入った場所を追跡できます。

次に、並べ替え、テーブルマッチ、スライサー、ダイサーなど、すべてのデータウェアハウスで実行される共通ツールがありました。

オーダーメイドのコードは最小限に抑えられていましたが、それでもさまざまなコーディングとレポートのスタイルを確認する必要がありました。

あなたはすでにETLスイートに精通していると仮定します。最近では無料で入手できる機能がたくさんありますが、それは私が10年ほど前にゲームに参加していたときにはなかったものです。

また、データマートを調べて、より使いやすく、データウェアハウスのサニタイズされたバージョンを提示することもできます。もちろん特効薬ではありませんが、データウェアハウスを再構築/修正する必要はなく、特定の問題を解決できます。


返事をありがとう。はい、これらのフィールドはすべて使用しますが、実際にはストリーム、レイヤー、システム間の依存関係ではなく、単一行の識別にのみ役立ちます。ETLスイートについてはご承知のとおりです。サポートが終了していたが、代わりにPLSQLに戻ったものから、よく知られているETLツールにアップグレードする過程にありました。コーディングするのは問題ありませんが、保守性とコードレベルからシステム全体を理解するためには、まったくひどいです。
Christs_Chin

1
理想は、ステージングテーブルまたはフラットファイルを介してエンドツーエンドでデータを追跡できることですが、それがない場合は、ウォーキングコードが残っています。
ロビーディー

0

あなたのケースにどれほど関連があるのか​​わかりません。依存関係をより目立たせるための戦略と、コードの一般的なメンテナンスがあります。

  • グローバル変数を避け、代わりにパラメーターを使用します。これは、言語間の呼び出しにも適用されます。
  • 変数の値の変更/変更はできる限り避けてください。可能であれば、値を変更する必要がある場合は、新しい変数を作成して使用します。
  • コードをモジュール化します。部分が実際に何をどのようにではなく)行っているかを簡単な文で説明できない場合は、条件を満たすモジュールに分割します。
  • コード部分に適切な名前を付けます。コードの一部が実行していることを簡単な用語で実際に説明できる場合、それらの用語はその部分の名前になります。したがって、コードは、モジュール/クラス/関数/プロシージャ/メソッドなどの名前を通じて自己文書化されます。
  • コードをテストします。前のポイントで説明したように、コード内のエンティティが名前を正当化するかどうかをテストします。
  • コードにイベントを記録します。少なくとも2レベルのログを維持します。最初のものは(実稼働環境でも)常に有効であり、重要なイベントのみを記録します。そして、基本的にすべてを記録するために他を使用しますが、オンまたはオフにすることができます。
  • 適切なツールを見つけて使用し、コードベースを参照、保守、開発します。Visual Studio Codeのシンプルな「すべてを検索」オプションでさえ、特定のケースで私の生活をずっと楽にしました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.