web-dev-qa-db-ja.com

プロのソフトウェア開発チームは、重要なプロジェクトの複雑な設計にどのように対処しますか?

まず、私はこの質問がやや長くて漠然としていることを理解しており、申し訳ありません。これはおそらく、「理解した」人にとっては短い名前の基本的な問題ですが、私はこの点について欠けていると思うので、問題を説明する際にはご容赦ください。

私は11歳の頃から、この方法でプログラミングを行ってきました。これは、私が最初から自分にすべてを教えていたことを意味します。私は技術教育を受けましたが、厳密にはコンピュータサイエンスではありませんでした(私はフォトニックエンジニアリングの学位を取得して卒業しています)。もちろんプログラミングコースもありましたが、これは私にとっては基本的なもので、新しいことはあまり学びませんでした。私はその喜びのために道に沿って自分自身を教育し続けており、プログラミングのキャリアを追求するつもりであると常に知っていましたが、その当時の私のプロジェクトはすべて非常に小規模でした。私はそれらを私の心に留め、維持するのに問題はありませんでした。

現在、私はチームのリーダーですが、企業環境ではありません-私は大学でエンジニアリングアプリケーション用の科学ソフトウェア(C++)を開発しています。突然、プロジェクトは(比較的)大きくなり、ほとんどの場合、私の心を包み込むのに苦労しました。主に次の2つのことに多くの時間と労力を費やしています。

  1. しばらく作業していなかったコードのセクションに戻る必要がある場合、それがどのように機能したか思い出せません。私は多くの時間を費やして、関連するクラスのヘッダーファイルを確認し、ソースファイルの途中に配置したコメントを読みました。私が垣間見ることができ、より簡単に画像を取り戻すことができる何らかの「回路図」があるといいのですが。
  2. 変更を導入するとき、私がしようとしていることが他の場所で何かを壊すことになる途中に気づくことがあります(さらに悪いことに、それは実行時にのみ驚きとして表示されます)。私は元に戻して別の方法で始めましたが、他のコンポーネントへの影響を無視していることがわかりました。どのように処理が行われるか、他のコンポーネントにどのような影響を与えるか、変更を実装する前に詳細に計画する方法を確認できる「アーキテクチャダイアグラム」があればいいのにと思います。

私が一緒に仕事をする人のほとんどは、私と同じようなストーリーを持っています-強力な技術的志向と時には素晴らしいスキルですが、彼らの仕事を組織する方法がありません。しかし、彼らのプロジェクトは通常私のプロジェクトよりはるかに小さいので、彼らはどういうわけか対処します。とにかく、それが私にとって何を意味するかというと、私は一人でいるので、良い実践を学ぶ人がいないということです。

ITの管理に関する大学院のコースを受講しましたが、満足のいくものであると感じましたが、ほとんどの場合、プログラマー以外のユーザーを対象としており、プロジェクト管理の方法論、予算/スケジュールの見積もり、エンタープライズアーキテクチャなどについて説明しています。ソフトウェアの設計や計画などは対象外です。それは大丈夫です、私もそのことを学ぼうとしています。もちろん、いくつかのツール(UMLなど)とソフトウェア開発プロセスのタイプ(カスケード、反復、アジャイル...)が導入されましたが、明らかにそれほど詳細ではなく、何を選択して使用するか(そしてどの程度)。

私はSO-でソフトウェア設計について多くの質問と回答を読んでいます-これまたはその特定のツールまたは方法論を使用してそれを行うことについてはたくさんあります、そしてUMLのドキュメントが私の問題を解決すると確信したなら問題-私はそれを拾って使い始めます。しかし、それを誓う人もいれば、役に立たないと言う人もいます。より高い抽象化レベルでの答えを探しています-私が持っている2つの問題を解決する方法はありますか持っている、そしてあなたはそれをどのように個人的に行うのでしょうか?おそらく特定のツールに縛られることなく、それを行うために私は何を学ぶ必要がありますか?これらは時々流行に出入りし、そしてその適用性はプロジェクトのタイプ。

読んでくれてありがとう、私はもっと簡潔に言うことができませんでした(ソフトウェア設計の経験と語彙が不足しています)。

9
neuviemeporte

しばらく作業していなかったコードのセクションに戻る必要がある場合、それがどのように機能したか思い出せません。私は多くの時間を費やして、関連するクラスのヘッダーファイルを確認し、ソースファイルの途中に配置したコメントを読みました。

あなたの後に来る貧しい人がどのように感じるか想像してみてください-彼はあなたのコードがどのように機能するかを一度知っていたという利点さえ持っていません。コードを解読しようとするのではなく、問題のモジュール用に作成したドキュメントを確認する必要があります。そのドキュメントは、モジュールが何をするのか、その理由についてかなり正確なビューを提供するはずです。 「モジュールは、トリプルforループを使用して3つの配列を初期化することから始まります...」ではなく、「このモジュールは、Fabulotronのメインセンサーによって収集されたデータを取得し、標準のネオポリタン(チョコレート、バニラ、ストロベリー)形式に再配置します。分析モジュールに配信します。」

完璧な世界では、システムのさまざまなモジュールを説明し、それぞれの責任を説明する設計ドキュメントがあり、各モジュールはそのドキュメントを参照して、その機能を説明することができます。「このモジュールは、設計ドキュメントのセクション4.8で詳述されているファブロトロンデータ収集サービス: http://fabulotron.org/design/section4-8.html 。 "そのようなものがない場合は、作業するときに各モジュールの概要を書き留めてください。あなたは本を書く必要はありません-いくつかの段落はあなたを方向付けるのに十分です。

変更を導入するとき、私がしようとしていることが他の場所で何かを壊すことになる途中に気づくことがあります(さらに悪いことに、それは実行時にのみ驚きとして表示されます)。私は元に戻して別の方法で始めましたが、他のコンポーネントへの影響を無視していることがわかりました。

これは、モジュールが相互接続されていることを示している可能性があります。モジュール/クラス/ユニットをより独立させることができるほど、この種の問題に遭遇する可能性は低くなります。モジュール間のインターフェースをできるだけ明示的にして、それらをそこに必要なものだけに制限するようにしてください。インターフェースはコントラクトです-一部のモジュールがインターフェースで指定された義務を果たしていることがわかっている場合、それについて他に何も知る必要はありません。これにより、作業中のモジュールの変更が他のモジュールに影響するのを防ぐことができます。

私は物事がどのように行われるかを見ることができるいくつかの「アーキテクチャ図」があればいいのに

標準部品を使用すると、この点で役立ちます。 C++は、標準テンプレートライブラリの形式で標準部品を提供し、必要に応じてそれらの部品を使用すると、より高い抽象化レベルで作業できます。リストなどのデータ構造を管理するための独自のコードを記述した場合、あなたとそれに続く人々は常にソースを読んで何が起こっているのかを理解する必要があります。代わりにSTLによって提供される標準部品を使用する場合、C++プログラマーは、データ管理ルーチンを掘り下げることなく、コードが何をしているかをすばやく知ることができます。

別の種類の標準部品は、デザインパターンに由来します。これらは、2つのオブジェクト間の関係がどのように機能するかを説明するための省略表現として使用できる標準的な概念です。

9
Caleb

私は短期間だけプロの開発者であり、これを最初に始めたとき、これを行う方法について多くの苦労をしました。私は大学を通してさえ、主に独学でした。幸いなことに、私と一緒に働いた人々は多くの経験があり、大規模なプロジェクトを管理および処理する方法について教育することができました。

私が最初にやったことの1つは、座って クリーンコード を読むことでした。これは、私が戻ったときに理解できる、または他の誰かが理解できるコードの記述方法を理解するのに役立つ素晴らしい本です。

2つ目は、ユニット、統合、受け入れという良質のテストを書くことでした。コードが十分にテストされていれば、何かがいつ壊れたかがすぐにわかり、問題をすばやく診断できます。インターネット上には多くの優れたテストリソースがあり、どれがあなたに提案するのが最善かわかりません。

私の重要なポイントは、テストとクリーンコードです。

5
Klee

大規模なソフトウェアシステムを整理するための高レベルのアイデアをいくつか紹介します。私の経験のほとんどはインターネットシステムに関するものですが、これらのアイデアはエンジニアリングソフトウェアにも当てはまると思います。

  • 機能を比較的分離されたモジュラーブロックに分離します。たとえば、ソフトウェアが提供する計算のファミリごとにモジュールがあるとします。
  • MVCデザインパターンがある場合は、ユーザーインターフェイスに適用します。明確に定義された境界でインターフェースとモデルを分離してください。
  • レイヤーを使用してモジュールをグループ化することを検討してください。抽象化レイヤーを使用するアプリケーションでは、各レイヤーはその下のレイヤーにのみ依存します。
  • ドキュメントを作成するときは、実装の詳細をすべて忘れてしまうことを想定してください。この仮定の下で多くのドキュメントを作成します-コードの半分ほどがコメントになるかもしれませんが、後で混乱することはほとんどありません。
  • 自動化された単体テスト、統合テスト、受け入れテストは、一部の分野では優れていますが、C++開発者はそれらについて複雑な感情を持っているようです。
  • デザインパターン を多用します。一般的に良いアイデアであることに加えて、デザインパターンはソフトウェアエンジニアリングにおける一般的な語彙を提供します。クラスをWidgetFactoryと呼ぶことは、それがウィジェットを作成するために存在するクラスであることを伝える簡潔な方法です。

私がエンジニアリングソフトウェアを使用してから長い時間が経過しているため、これらの提案によって走行距離が異なる場合があります。幸運を!

2
greg

答えはソフトウェア工学です。

これは、大規模なプロジェクトの場合、実際のコーディングが行われるずっと前に、一連の要件収集、プロセス定義、仕様などに従うものです。

環境や文化に応じてさまざまな方法論が使用されます。エンタープライズタイプのビジネスは「 合理的な統合プロセス 」またはそれに類似する傾向があります。技術系の新興企業は通常、 アジャイル 、政府部門の過労 ウォーターフォール = methodoligy。

すべての場合において、このプロセスは、あなたが何をしているかを正確に定義するのに役立ち、プロジェクトの終わりに近づくと、あなたがそれを行ったことを証明することができます。

1
James Anderson

Enterprise Architect をぜひお試しください。無料ではありませんが、アカデミックな価格でご利用いただけます。マクロとミクロの両方のレベルでプロジェクトを図式化するための優れたツールです。また、ソースファイルをクラスダイアグラムにリバースエンジニアリングすることもできます。これは、アプリケーションがどのように連携するかを文書化し、再編成するための良い出発点になるでしょう。

@Kleeの2番目の推奨事項もあります。想定される「アジャイル」ツールに我慢しないでください。これらは本当にベストプラクティスのアイテムであり、アジャイルプロセスに従っている場合(必須ではない場合)にも便利です。ただし、継続的インテグレーション(たとえば)は、どのような方法論でも重要です。さらに、単体テスト(cppUnit?)はあなたの友達です。 UIを直接テストするのではなく、UIによって呼び出されるロジッククラスをテストする場合、ユニットテストは非常に実行可能でなければなりません。 UIテストの自動化に役立つツールもありますが、私は最初にバックエンドのものをまとめるようにしています。

幸運を!

1
Matthew Flynn

あなたの問題には3つの側面があると思います

  1. プログラマー指向
  2. プログラム指向
  3. プログラムのメンテナンス-指向

最初の問題に関しては、プログラムの機能の概念を理解していないプログラマーがいる可能性があります(これは多くの場合、企業のセットアップで発生します)。しかし、あなたの質問とあなたがいるドメインによって、あなたとあなたのチームはプログラムが何をするかを制御しているようですが、Quick Timeでそれを実際のプログラムに変換することはできません(例を引用すると、私は人々について聞いたことがあります物理学の博士号を取得していて、プログラミングの指針を理解するのに問題があり、物理学はC++よりもはるかに難しいと確信しています。それが事実である場合、問題はほとんどプログラム中心です(あなたは周りの人があなたのプログラムが何をしているかを理解し、それを評価できるほど幸運に感じる必要があります)。

プログラム中心の問題の場合、私のとんでもない提案の1つは、PythonまたはHaskell(Pythonは非常に簡単です)学び、優れた数学者がいる場合、Haskellは素晴らしいです。より高いレベルの抽象化に移動すると、コードサイズが小さくなり、理解しやすく、長期的に簡単に維持でき、変更をすばやく変更できます。したがって、10行の元の50行のコードの代わりにコードを使用します。また、コンピュータープログラミングの専門家がいると間違いなく役立ちます。大学では、GUIとインターフェイスに数人の学生を参加させて、機能に集中できるようにすることもできます。 。私はこの本もお勧めしますJohn Lakosによる大規模なC++ソフトウェアデザイン(これは非常に大きな本であり、熟練したPythonプログラマになることができます本を読むのにかかりました)

問題の最初の2つの次元を整理すると、3番目は自動的に解決されます。私はあなたが単一の大規模なプロジェクトに取り組んでいると信じているので、あなたがあなたを成功させるどんなまともなプロジェクト管理ソフトウェアでも。事前の計画が必要です。すぐにコーディングを開始すると、プログラムに関与しすぎて全体像を忘れてしまう可能性があります。心に留めておくことは、大きなプロジェクトではうまくいきません。すべてを紙(またはコンピュータ)に入れます。 wikiを使用して情報を共有します。方法論に関しては、私はアジャイル方法論を好む(単純に、アジャイルはインクリメンタルソフトウェア開発のスタイリッシュな名前です)。また、コアプログラムに集中できるように、この分野の専門知識を持つ人を雇って、彼がこれらの面倒を見るように依頼することもお勧めします。ここでの結論は、すべてのプロジェクト管理方法論はプログラムの成功を確実にするための単なる方法であるということです。そのため、誰かが最高のものを推奨するものを選択する代わりに、あなたとあなたのチームに合った人を選ぶことができます。また、次のソフトウェアも役立ちます

  • 無料マインド-マインドマッピングソフトウェア
  • Trac-迅速かつ簡単なソフトウェアバグプログラムとwiki
  • MoinMoin-プログラムに関する知識の共有を可能にするクイックWiki

上記のヒントは、ある程度の学習曲線を必要としますが、長期的にはそれだけの価値があります。そして最後に、プログラミングはフォトニックエンジニアリングよりも簡単です(ただしC++プログラミングではありません)。

1
Ubermensch

あなたの質問のように、あなたにとって有用な答えは非常に長く曖昧になります-しかし、短い答えは「ソフトウェアエンジニアリング」です

ソフトウェア開発のキャリアに真剣に取り組んでいる場合は、できるだけ自由時間を空けて、 Steve McConnells サイトにアクセスすることから始めることをお勧めします。プログラミングは簡単で、学期に教えることができますが、ソフトウェアエンジニアリングは桁違いに複雑であり、学習するのに多くの時間が必要です。

0
mattnz