問題の概要:
簡単に言うと、私はコードベースと開発チームを継承しましたが、置き換えることは許可されておらず、神オブジェクトの使用は大きな問題です。今後はリファクタリングをしてもらいたいのですが、神オブジェクトを使ってすべてをやりたいというチームから「簡単だから」という反発があり、リファクタリングは許されません。私は長年の開発経験を引用して、これらのことを知るために雇われた新しい上司であると言い返しました。また、サードパーティのオフショア会社のアカウント営業担当者もそうしました。これは現在、エグゼクティブレベルと私の会議です。は明日であり、ベストプラクティスを提唱するために多くの技術的な弾薬を使用したいと思います。長期的には安価になると感じているからです(そして個人的にはそれがサードパーティが心配していることだと思います)。
私の問題は技術的なレベルからのもので、長期的には良いことはわかっていますが、超短期および6か月の期間で問題が発生し、「知っている」ことでは証明できません。一人の人(ロバートC.マーティン、別名アンクルボブ)以外の参照と引用されたリソース、それは私が一人の人からのデータを持っていると言われているので私がするように求められていることであり、一人だけ(ロバートCマーティン)はそうではありません十分な議論があります。
質問:
somとはこの「神」オブジェクト/クラス/システムの使用は悪い(または私たちが探しているので良い)と明示的に言っている分野の有名な専門家によって直接引用できるリソース(タイトル、公開年、ページ番号、引用)最も技術的に有効な解決策)?
私がすでに行った調査:
- ここにはたくさんの本があり、それらの索引で「神オブジェクト」と「神クラス」という単語の使用を検索しました。奇妙なことに、ほとんど使用されておらず、たとえば私が持っているGoFの本のコピーは、使用されていないことがわかりました(少なくとも私の目の前のインデックスによると)が、以下の2冊の本で見つけましたが、もっと欲しいです使用できます。
- ウィキペディアのページで「神オブジェクト」を確認しましたが、現在は参照リンクがほとんどないスタブなので、個人的には個人的な経験が有効であると見なされない環境で使用できるものはあまりありません。引用された本は、これらの技術的ポイントを議論している人々によって有効であるには古すぎると見なされています。彼らは、「かつては悪いと考えられていたが、誰もそれを証明できなかったが、今では「神」オブジェクトは使いやすいと言っている」と言っている。私は個人的にこの記述は間違っていると信じているが、真実を証明したい、それが何であれ。
- Robert C Martinの「C#における俊敏な原則、パターン、および実践」(ISBN:0-13-185725-8、ハードカバー) 266ページに「神のクラスは悪い考えであることを誰もが知っています。 「システムのすべてのインテリジェンスを単一のオブジェクトまたは単一の関数に集中させたくありません。OODの目標の1つは、動作を多くのクラスおよび多くの関数に分割および分散することです。」 -そして、とにかく時々神のクラスを使用する方が良い場合もあると言い続けます(例としてマイクロコントローラーを引用します)。
- ロバートCマーチンの「クリーンコード:アジャイルソフトウェア職人技のハンドブック」 「136ページ(そしてこのページのみ)は「神のクラス」について話し、138ページから始まる「単一責任原則を推進するために彼が使用する「クラスは小さくなければならない」規則の違反の典型的な例としてそれを呼びかけます」 。
私が抱えている問題は、すべての参照と引用が同じ人物(Robert C. Martin)からのものであり、同じ単一の人物/ソースからのものであるということです。彼は1つの見解にすぎないため、「神のクラス」を使用したくないという私の願望は無効であり、ソフトウェア業界の標準的なベストプラクティスとして受け入れられていないと言われています。これは本当ですか?ボブおじさんの教えを守り続けようとして、技術的な観点から間違ったことをしているのでしょうか?
神オブジェクトとオブジェクト指向プログラミングと設計:
これについて考えれば考えるほど、これはOOPを研究するときに学ぶものであり、明示的に呼び出されることはありません。デザインは私の考えです(私が学びたいので、私を自由に訂正してください)、問題は私がこれを「知っている」ことですが、誰もが知っているわけではないので、この場合、私は効果的に呼び出しているので、それは有効な議論とは見なされません統計的にほとんどの人はプログラマーではないので、実際にはほとんどの人が統計的にそれを知らないとき、それは普遍的な真実として出てきます。
結論:
何を検索すればよいか迷っています彼らは技術的な主張をしていて、真実を知り、本当のエンジニア/科学者のような引用でそれを証明したいので、引用するための最良の追加の結果を得るには、たとえ私が個人的な理由で神のオブジェクトに対して偏っていてもそれらを使用したコードの経験。支援や引用をいただければ幸いです。
コメント
- グッドプラクティスとして神オブジェクトの文書化を依頼してください。
- 逃げる! ‘そこで働きたくない。
- “神オブジェクト”とそれがあなたの質問にどのように関連しているか。あなたは4つの段落を使って、神のクラスは’文献の標準的な用語ではないと言っています。では、なぜそれを使用しているのですか?業界標準の用語を使用し、それらの概念が現在のプロジェクトにどのように適用されるかを示すことができれば、一部の人々に自分の主張を納得させることができます。ビジネスミーティングで作り上げられた言葉を使用することは、あなたの議論を弱体化させるだけです。業界標準の用語が存在します。’すべてがグローバルまたは単一オブジェクトの悪夢、あるいはあなたが説明しようとしているものを最初に目にしたのはあなたではありません。
- ‘用語”アンチパターン”がありません。 “神オブジェクトアンチパターン”をGoogleで検索すると、ividの理由でトンのページが返されます。 = “4f9d6ede06”>
悪いです。
回答
実践の変更の場合は、問題点を特定することによって行われます。既存のデザインによって作成されました。具体的には、既存の設計のために本来あるべきよりも難しいもの、壊れやすいもの、現在壊れているもの、の直接的な(または多少間接的な)結果として単純な方法で実装できない動作を特定する必要があります。現在の実装、または場合によっては、パフォーマンスの低下、新しいチームメンバーのスピードアップにかかる時間など。
次に、作業コードは、理論や優れた設計に関する議論よりも優先されます。残念ながら、これは悪いコードにも当てはまります。したがって、より良い代替案を提供する必要があります。つまり、より良いパターンと実践の提唱者として、より良い設計を引き出すためにリファクタリングする必要があります。既存の設計から狭いトレーサー弾丸スタイルの平面を見つけ、おそらく反復1で、神オブジェクトの実装を機能させ続けるが、実際の実装を新しい設計に延期するソリューションを実装します。次に、この新しい設計を利用するコードを記述し、パフォーマンス、保守性、機能、バグや競合状態の修正、開発者の認知的負荷の軽減など、この変更によって得られるものをアピールします。
設計が不十分なシステムで攻撃するのに十分小さい表面積を見つけるのは難しいことがよくあります。初期値を提供するよりも時間がかかる場合があり、初期の見返りはそれほど印象的ではない場合があります。誰にでも、しかし、少なくとも少し同情的なチームメンバーとペアを組むと、新しいアプローチの支持者を見つけることに取り組むこともできます。
神オブジェクトを嘆くことは、あなたが合唱団。これは「問題に名前を付けるためのツールであり、問題を解決するために機能するのは、それについて何かをするのに十分な先輩でやる気のある受容的な聴衆がいる場合のみです。神オブジェクトを修正することが議論に勝ちます。
あなたの当面の懸念は経営幹部の賛同であるように思われるので、「このコードを置き換えることが戦略的目標である必要があると主張し、それらをあなたが責任を負うビジネス目標に結び付けるのが最善だと思います。あなたは最初に、それを置き換えるために何をすべきかについて技術的な急上昇に取り組むことによって、技術的な方向性を提供できると主張することができます。できれば、現在の設計について予約している1人または2人の技術者からのリソースを使用します。
あなたはあなたの議論を正当化するのに十分なリソースを見つけたと思います。そのような会議の人々はあなたの研究の要約にのみ注意を向けるでしょう、そしてあなたが2つか3つの裏付けとなる情報源に言及した後彼らは聞くのをやめます。あなたの焦点は、最初はあなたが見た問題を解決するために買収することにあるべきであり、必ずしも他の誰かが間違っているかあなた自身が正しいことを証明する必要はありません。これは社会的な問題であり、論理的な問題ではありません。
テクノロジーのリーダーシップの役割では、イニシアチブをビジネス目標に結び付ける必要があるため、経営幹部に主張するための最も重要なことは、仕事はそれらの目的のために行います。あなたは「新しい男」とも見なされているので、人々が仕事を捨てたり、急速に列に並ぶことを期待したりすることはできません。提供できることを証明することで、ある程度の信頼を築く必要があります。長期的な懸念として、リーダーシップの役割では、結果に焦点を合わせるようになることも学ぶ必要がありますが、必ずしも結果の詳細に執着する必要はありません。あなたは今、戦略的な方向性を提供し、チームの進歩から戦術的な障害を取り除き、チームのメンターシップを提供するためにそこにいます。自分のチームメンバーとの信頼の戦いに勝つことはありません。
トップダウンの決定を下すとゲームにある程度の肌がない限り、信頼できることはめったにありません。同じような状況が繰り返し発生する場合は、状況が制御不能になったらエスカレートするのではなく、組織内のコンセンサス構築に重点を置く必要があります。
しかし、あなたが今どこにいるのかを考えると、あなたの最善の策は、あなたのアプローチがあなたの経験に基づいて測定可能な長期的な利益をもたらすこと、そしてそれは次のような有名な開業医による仕事と一致していることを主張することですボブおじさんと共同で、あなたは数日/数週間を費やして、最高の価値のある側面の狭いリファクタリングを例に挙げて、優れたデザインの見方がどのように見えるかを示したいと考えています。ただし、個人的な好みを超えて、特定のビジネス目標に合わせてケースを調整する必要があります。
コメント
- それが社会問題。そこに非常に多くの悪い記述されたコードと不十分に設計されたアプリケーションがある理由であるに違いありません。
- ‘ビジネススピーチ
そのようなものです。できるだけ視聴者との関連性を持たせることを目指してください。’幹部と話している場合は、実行 / b>コードの標準がメンテナンスやパフォーマンスとどのように直接関連しているかについて話し、これがプロジェクト全体の財務や長期的な安定性などとどのように関連しているかについて話し合います。あなたのように聞こえます’あなたの知識のために採用されました。これを覚えておいてください。(’は考えているジャークオフマネージャーにならないでください。彼は常に最もよく知っています-しかし、この場合、あなたは’ 100%正しいです。)
- +1 for “作業コードは、理論や優れた設計に関する議論よりも優先されます。”私たちの探求で忘れがちなこと完璧なコードのために。
- すばらしい答えです。チームリーダーを目指すための多くの知恵があります。
答え
まず、測定可能な組織は業界のベストプラクティスを採用する必要があることを提示する必要があります。 「それは私たちのためだけに働く!」と言っています。単に予測できないため、時間的にもリソース的にも測定できません。ソフトウェアエンジニアリングは、他の科学分野と同じように科学であり、これらの概念は研究、研究、テスト、および文書化されています。
-
ソフトウェアエンジニアリングでは、アンチパターン(またはアンチパターン)は、社会的または事業運営またはソフトウェアエンジニアリングで使用されるパターンであり、一般的に使用される可能性がありますが、実際には効果がないか、逆効果です。
-
2009年の Google IO会議では、このテーマはMVPで部分的に説明されましたパターンを説明しました。神オブジェクトとは関係がないかもしれませんが、弾薬を与える可能性があります。
-
また、このアンチパターンを使用すると、単一責任の原則。これは次のように述べています。
すべてのクラスが単一責任を持つべきであり、その責任はクラスによって完全にカプセル化されます。そのすべてのサービスは、その責任と厳密に連携する必要があります。
-
Decaying Code ブログでも、これとその解決策について説明しています。
-
オブジェクトカップリング。
[…]カップリングまたは依存関係は、各プログラムモジュールがそれぞれに依存する度合いです。他のモジュールの1つ。
システムが緊密に結合されていると
assembly of modules [to] require more effort and/or time [to maintain] due to the increased inter-module dependency.
オブジェクトの結合レベルが高くなると、結合が少なくなり、逆に。神オブジェクトは、必要以上に知っているため、密結合の良い例です。したがって、責任を持ってオブジェクトを過負荷にし、コードの再利用性を大幅に制限します。 -
複雑なアプリケーションを設計する場合、シンプルさを頭に入れておく必要があります。大きな問題は、管理、テスト、文書化が容易な小さな問題に分解する必要があります。これは特にオブジェクト指向パラダイムに当てはまります。
このパラダイムでは、アンチパターン引数にループバックしますが、このパラダイムはすべて、パターン、実世界のオブジェクト表現、そして最終的にはデータに関するものです。カプセル化。
-
これらの「グッドプラクティス」が教室にもっと存在すると言うとき、あなたは正しい部分です。しかし、私は大学(および一部の大学)で教育経験があり、これらの原則が大学、特に工学部で教えられているのを見ただけです。それは悲しいことです。しかし、他の優れた実践と同様に、自分自身を改善しようと努力する人は、通常、いくつかの基本的なデザインパターンを学び、最終的には結合と凝集の間を行き来する方法を理解します。
私が通常生徒に教えるのは、優れたプログラミング標準を採用するには より多くの努力が必要なように思われるかもしれませんが、長期的には常に報われるということです。良い例は、プログラマーにソート関数を書くように頼む人です。プログラマーには2つの選択肢があります。 1)要素のリストが増えるにつれて持続しないクイックバブルソート関数(5分未満)を作成する、または2)より拡張性の高いより複雑な(最適化された)ソートアルゴリズム(クイックソートなど)を作成するより大きなリストで。
コメント
- オブジェクト指向プログラミング言語では、2つの独立したソースアセンブリが責任を負う場合、多くの場合、オブジェクト’の動作のさまざまな側面について、それらの動作をカプセル化するために独立したオブジェクトインスタンスを作成する必要があります。残念ながら、多くの場合、コードアセンブリ間の機能の最も論理的な細分化は、’オブジェクトインスタンス間の機能の最も論理的な細分化と一致しませんが、I ‘ 2種類の細分化を区別することについてはあまり議論されていません。
- これはこの質問では少し話題から外れていると思います。ここでは、’神オブジェクトのアンチパターンについてではなく、コードの結合と凝集度について説明しています。これは、非常に幅広いトピックであり、非常に主観的です。
回答
ここで、別の古い質問をネクロしますが、あなたはこの議論に勝てなかったと思います。理由。
文化の問題のように聞こえます
あなたは彼らのマネージャーですが、それらを置き換えることはできません。マネージャーに行って、彼らがすべきだと信じていることを実行させる必要があります。この場合、少なくとも神オブジェクトを前進させてそれをノックオフすることだと思います。生まれた文化を反映したコードの古典的なケースのように聞こえます。言い換えれば、神オブジェクトはこの会社の仕組みです。何か意味のある変更を加えたいですか?あなたはいつも同じ場所に行きます最終的には、すべての決定をトップでクリアする必要があるようです。
レガシーコードのクリーンアップとコードポリシーの変更で何度も失敗した試みに対抗する私は今、その文化がまだしっかりと定着しているとき、または少なくとも、文化と戦うことは、コードを可能にした文化と戦うことはできないと考えています。非常に難しい上り坂のスローガンで、「誰も私に十分なお金を払ったり、二度と成功する可能性が高い価値のある取り組みであると感じるのに十分な力を与えてくれる可能性はほとんどありません。
変化が起こる前に、彼らは変化するように動機付けられなければならず、残念ながら、Stackを時々読むのに十分な気を与えるプログラマーとして、誰もが同じものに動機付けられているわけではないことを理解するのは難しいです。私は自分の経験で多くの合理的な議論に勝ちましたが、結局のところ、会社は理由のために知的に怠惰な開発者に苦しんでいます。
ビジネス上の懸念は、おそらく明日だけを考えるように動機付けられています。来週または5年後(黙示録の場合に北極圏に種子貯蔵庫を建設した国からの移民の子供である場合、特に苛立たしいシナリオ)。たぶん彼らは「変化を恐れている」。多分彼らは年功序列を過度に評価しており、開発チームのリーダーやマネージャーを連れてくるために外部から雇わなければならない場合でも、彼らの全生涯のチームの誰も彼らの時代に十分に成長していないことを認識しているため、指揮系統は無意味ですそこに(または、言われた生活者が責任に関連するリスクを望んでいないため)、または、私はこれを見たことがありますが、おそらくそれは、平凡が自分自身を擁護するという非常に現実的で憂鬱な現象です。品質と競争し、「それを回避するのに十分な愚痴がある」場合、すべてが定期的にバラバラになるときに誰が責任を負うのかを理解することは不可能です。
最終的に恐怖に根ざした問題とどのように戦うか成功のための壊れた指標?これをお伝えします。献身的な品質の開発チームよりもはるかに多くの時間がかかり、このQが投稿されたときのサウンドよりもはるかに少ないものでした。
それが手に負えない文化の問題ではないという不可能ではないイベントで…
今、トップの人々を想定しています変化を非常に受け入れやすく、彼らは「実際にあなたがそれを成し遂げることを信頼してくれるので、あなたは本当にすべての議論をお金と失われた機会で中断する必要があるだけです。
誰かを訓練するのに時間がかかるたびにこのばかげたコードベースで新しくなり、何かに新しい機能を変更または追加するのに時間がかかるたびに、提携したい会社の別のシステムにエンドポイントを公開することが非常に困難になるたびに、費用がかかります。最も重要なことは、より小さくて機敏な競争相手が急降下するためのウィンドウを開いたままにして、あなたができることは彼らにあまりにもゆっくりと反応することだけであるという立場にあなたを置くことです
特に頑固で愚かな文化は、会社の実際の物理的な屋根が実際に燃えているとしても、どんな犠牲を払っても現状を維持することを認識してください。
コメント
- 私はすぐに会社を辞めました。彼らは私をフルタイムで雇い、申し出を受け入れるためにシアトルからニューヨークに引っ越させようとしました。私は基本的に彼らに”まさか、私が管理するチームがベルビューにいるときは’ニューヨークに移動しないと言いました。 WA “そしてその時点で私は基本的に通りを渡って歩いてMSFTで仕事を得て、もっと良いものが見つかるまで続けました。
- @honestduaneええ、その一連の期待一人でボリュームを話します。 GTFOであなたに良いです。
回答
次のような最も基本的なOOPプリンシパルのいくつかを引用できます。疎結合と高い凝集度。 「神オブジェクト」は、無関係なクラスを結合し、凝集度が低いように聞こえます。
回答
ボブおじさん自身にいつでも尋ねることができます。
重要なのは、それはどんな意味の人々にとっても明白であるため、一度説明すると、多数の著者が再参照する必要はありません。必要なのは1つのソース。
ソースを探すときに最初に使用する可能性のあるその他の用語は次のとおりです。
- SOLID
- Law of Demeter
- 大きな泥だんご
これらはすべて、実際にはそのように名前が付けられていなくても、実行可能な参照ソースを生成する可能性のある関連概念を表現しています。
最終的にしかし、あなたは上司です。そうする理由は、あなたがそう言うからです。優れたマネージャーと見なされるためには、決定を正当化する準備をする必要があります。あなたはそれを実行しました。それでも抵抗がある場合は、正しい行動方針は、チームが「言われたとおりに行動することです。
コメント
回答
「神」オブジェクトが間違っていることを証明または反証するにはどうすればよいですか?
できません。
この種の推測は数学的証明には適さず、数学的証明は健全な唯一の種類の証明です。
感情的な単語「間違った」を置き換えようとしても神オブジェクトを使用した場合の効果の定量化可能な測定値を使用すると、次のことがわかります。
- 利用可能な測定値は粗雑です。
- これらの測定値が定量化された信頼できる研究はほとんどありません。プロのプログラマーによって作成されたコードの場合
- 言語構造またはデザイン(アンチ)パターンがそれらの手段に結び付けられている信頼できる研究はほとんどありません。
そしてそれは、特定のオブジェクトが「神」オブジェクトであるかどうかを判断する問題を無視しています。
せいぜい、これらの種類の研究は、経験的な相関関係しか実証できませんでした。真の証拠ではありません。
実際に行っているのは、他の人々の意見を変えることを目的として、「神」オブジェクトの賛否両論を討論することです。 …そしてあなたの組織の慣習。
「証明」のような言葉を使用しないでください。そうしないと、議論している人々があなたの顔で笑いやすくなります。
回答
今週の第一人者#84 を見たいと思うかもしれません。 。それはすべて神オブジェクト(モノリス)とそれらがどのように悪いかについてです。
抜粋:
(メジャー)それは分離しますクラス内の潜在的に独立した機能[…](マイナー)新しい機能でクラスを拡張することを思いとどまらせる可能性があります[…]
回答
あなたのチームが「神のオブジェクトが間違っている」という学術的証明に本当に興味があるかどうかはわかりません。
心理的な観点から、リファクタリングのアプローチは、プログラムが期待どおりに機能しているにもかかわらず、チームの能力を攻撃していると誤解される可能性があります。「チームは悪い仕事をしました」。
あなたが本当にやりたいのは、「スパゲッティコード」と「神オブジェクト」のマイナスの副作用に対処することです。副作用によって引き起こされるバグが増えるため、新しい機能を追加するためのコストを爆発させます。
非常に回答を提供する代わりに、具体的で質問する方が役立つ場合があります:
manager > Why did implement the new tax-calculation schema took more than 4 weeks team > because {reason a} manager > And why was {reason a}? team > because {reason b} manager > And why was {reason b}? ... team > because {reason z} manager > what could we do to avoid {reason z} ? team > refactor code