タグ付けされた質問 「large-scale-project」

10
大きなコードベースを理解しやすくする方法
私が比較的大規模なプロジェクトを開発しているとします。すでにすべてのクラスと関数をDoxygenで文書化しましたが、各ソースコードファイルに「プログラマーのメモ」を置くことを考えていました。 これの背後にある考え方は、特定のクラスがどのように機能するかを素人の用語で説明することです(ほとんどのコメントがそうする理由だけでなく)。言い換えれば、仲間のプログラマーにクラスがどのように機能するかについての別の見方を提供することです。 例えば: /* * PROGRAMMER'S NOTES: * * As stated in the documentation, the GamepadManager class * reads joystick joystick input using SDL and 'parses' SDL events to * Qt signals. * * Most of the code here is about goofing around the joystick mappings. * We want to …

3
アジャイル環境でアーキテクチャ設計はどのように行われますか?
アジャイルアーキテクトの原則を読んで、次の原則を定義しました。 原則#1システムをコーディングするチームがシステムを設計します。 原則#2動作する可能性のある最も単純なアーキテクチャを構築します。 原則#3疑わしい場合は、コーディングします。 原則#4構築し、テストします。 原則#5システムが大きいほど、滑走路は長くなります。 原則#6システムアーキテクチャは役割のコラボレーションです。 原則#7イノベーションに関する独占権はありません。 この論文では、アーキテクチャ設計の大部分はコーディング段階で行われ、その前のシステム設計のみが行われると述べています。それは結構です。 それでは、システム設計はどのように行われますか?UMLを使用していますか?または、インターフェイスと主要なブロックを定義するドキュメントですか?たぶん何か他に?

5
大規模なアプリケーションをコーディングするときにVimを使用する
私はVimを学び始めており、stackexchangeでここで与えられたいくつかのアドバイスに従っています。私はいくつかのおもちゃのプロジェクトでそれを使い始めています、そしてそれで私はクールです。 しかし、そのクラスの名前や他のファイルに含まれるマクロなどを知るためだけに、常に他のファイルを開かずに生産性を高めることができるのだろうかと思い始めました。 あなたが与えることができる一般的なアドバイスは何ですか?

3
大規模なソフトウェアプロジェクトの実際の複雑さを測定する方法は?
大学のアルゴリズムコースでは、ハッシュテーブルやクイックソートなど、実際に使用されるさまざまな単純なアルゴリズムの複雑さを正確に計算する方法を学びます。 しかし、今では大規模なソフトウェアプロジェクトで、より高速にしたい場合は、個々のピースを見るだけです-いくつかのネストされたループは、より高速なハッシュテーブルに置き換えられます。より洗練された手法ですが、パイプライン全体の複雑さを計算することはありません。 それを行う方法はありますか?または、実際には、アプリケーション全体をグローバルに考慮するのではなく、アプリケーション全体を高速化するために、高速アルゴリズムを使用して「ローカル」に依存しているだけでしょうか? (私自身は非常に高速であることが知られている多数のアルゴリズムを積み重ねると、全体として高速なアプリケーションになってしまうことを示すのは自明ではないように思えます。) 他の誰かが書いた大規模なプロジェクトを高速化することを任されているため、私はこれを求めていますアプリケーション全体。

2
大企業では継続的インテグレーションはどのように組織されていますか?
私の会社では、各機能/バグ修正ブランチがdevでどのようにマージされるかを確認するために中間ビルドを行わないのが一般的です。毎日のビルドのみがあり、常に多くのテストの失敗とビルドエラーが発生します。私は、1000人以上の開発者がマージごとにビルドするのは理不尽だと言われています。 それで、私はCIがそれ以上の開発者(Microsoft、Facebook)を持っている会社でどのように組織されているかを検索しましたが、何も見つかりませんでした。たぶん、インサイダーは私に言うことができますか?

8
大規模プロジェクトを開発する際の最大のボトルネックは何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 私の会社がMS Wordのレプリカを開発することだったとしましょう(例として)。開発プロセスのボトルネックは何でしょうか。無限の現金とMicrosoftのような組織があると仮定するとどうなりますか?言い換えれば、そのようなソフトウェアを迅速に開発する際の最も一般的な障害は何ですか?すべての仕様が整っており、組織が完全に機能していると仮定しましょう。そのため、製品の出荷準備が整うまでソフトウェア開発に専念します。-コードの作成-テストの作成-最終製品の手動テスト-設計の不備によるコードの再作成-コードの設計-経験豊富な開発者によるコードレビュー-GUIの設計-アルファに基づくGUIの再設計/ beta-user feedback-ユーザーからのフィードバックの処理-alpha / beta-userフィードバックを待っています 回答に参考文献を使用するか、主題に関する経験を述べてください。

4
大規模なレガシーコードベースを更新して特定の品質基準を満たすにはどうすればよいですか?
レガシーコードベースを改善するためのツールとテクニックについては多くの情報がありますが、実際に成功したケーススタディはありません。ほとんどのアドバイスはミクロレベルであり、マクロレベルで役立つ証拠が不足しているため、役立つものの、多くの人々を納得させるものではありません。 大規模なレガシーコードベースを更新して今日の品質基準を満たすようにし、完全に書き直すのではなく、実際に成功することが証明されている段階的な改善を具体的に探しています。 前: 大:1MLOCより大きい レガシー:自動テストなし 品質が悪い:複雑度が高く、カップリングが高く、回避された欠陥が多い 後 自動テスト より簡単なアップデート/メンテナンス 高品質:複雑さの軽減、コードの分離、少数の回避された欠陥 大規模なレガシーコードベースを完全に書き換えずに、上記の品質基準を満たすように正常に更新するために、実際にどのような段階的な手順が証明されていますか? 可能であれば、バックアップの回答に「成功した」品質改善プロセスを経た大規模なレガシープロジェクトの会社または事例の例を含めてください。

1
ソース内ビルドとソース外ビルド
私の(主にC ++)開発では、長い間、ソース外ビルドの使用に固執してきました。つまり、私のソースは通常/project/srcディレクトリにあり、ビルド/project/build/bin/releaseは/project/build/bin/debugディレクトリにあります。これを行ったのは、中間ファイルからソースディレクトリをクリーンに保ち、すべてのバイナリを1か所にまとめ、パッケージ化がより簡単になり、クリーニングがより簡単になり、バージョン管理がより簡単になるからです。(私は何かを見逃しましたか?) 現在、ソース内ビルドを使用する(大きな)プロジェクトを継承しています。このタイプの構造の動機は何ですか?その利点は何ですか?(私は、エンジニアリングレベルの理由と個人的な好みのタイプの理由に最も懸念しています。) Lakosの "Large-Scale C ++ Software Design"がそれを考慮に入れてくれることを期待していましたが、そうした場合は見逃しました。

4
非常に複雑なソフトウェアのコードベースを管理するにはどうすればよいですか?
私は、さまざまなオブジェクト指向プログラミング言語を使用して、自分自身と他の人のためのプログラムを作成することがよくあります。その場合、通常は比較的小さくなります(最大で数千行)。しかし最近、私は完全なゲームエンジンなど、より大きなプロジェクトを作成しようとしています。そうするとき、私はしばしば複雑さという障害にぶつかるように見えます。 私の小さなプロジェクトでは、プログラムのすべての部分がどのように機能するかについてのメンタルマップを覚えることは簡単です。これにより、変更がプログラムの残りの部分にどのように影響するかを十分に認識し、バグを非常に効果的に回避できるだけでなく、新機能がコードベースにどのように適合するかを正確に確認できます。しかし、より大きなプロジェクトを作成しようとすると、非常に面倒なコードと多数の意図しないバグにつながる、優れたメンタルマップを維持することが不可能であることがわかりました。 この「メンタルマップ」の問題に加えて、自分のコードを他の部分から切り離しておくことは難しいと思います。たとえば、マルチプレーヤーゲームにプレーヤーの動きの物理を処理するクラスとネットワークを処理するクラスがある場合、これらのクラスの1つが他のクラスに依存してプレーヤーの動きのデータをネットワークシステムに取得する方法はありませんネットワーク経由で送信します。このカップリングは、優れたメンタルマップを妨げる複雑さの重要な原因です。 最後に、他のクラスを調整する1つ以上の「マネージャー」クラスを考え出すことがよくあります。たとえば、ゲームでは、クラスがメインのティックループを処理し、ネットワーククラスとプレーヤークラスの更新メソッドを呼び出します。これは、各クラスは他とは独立して単体テスト可能で使用可能でなければならないという私の研究での発見の哲学に反しています。そのようなマネージャークラスは、その目的によってプロジェクトの他のほとんどのクラスに依存しているためです。さらに、プログラムの残りのマネージャークラスオーケストレーションは、メンタルマッピング不可能な複雑さの重要な原因です。 まとめると、これにより、かなりのサイズの高品質のバグのないソフトウェアを作成できなくなります。この問題を効果的に処理するために、プロの開発者は何をしますか?私は特にJavaとC ++のOOP回答ターゲットに興味がありますが、この種のアドバイスはおそらく非常に一般的です。 ノート: 私はUMLダイアグラムを使用してみましたが、それは最初の問題に役立つようであり、それでも(たとえば)最初に初期化されるものに関するメソッド呼び出しの順序付けではなく、クラス構造に関する場合に限られます。

3
ユーザーがREST APIで自分のリソースを変更/操作することのみが許可されることを承認するための最良のソリューション
バックグラウンド: 現在、REST APIを構築する過程で、ノードw / expressを使用しており、モバイルアプリと最終的には(最新のブラウザーベースの)Webサイトによって消費されます。 私は、ユーザーが自分のリソースを変更することのみが許可されるように、ユーザーの更新/アクション要求を承認する最良の方法を特定しようとしています。アクションは準高頻度で発生するため、懸念事項です。 注:この使用例では、エンティティーの所有権を譲渡することはできません。 可能なソリューション: 解決策:reddisなどのサーバーセッションで各ユーザーのリソースのリストを保存および維持します。 懸念事項:サーバー側セッションの永続化には、複数のサーバーに合わせて拡張する独自の複雑さのセットがあります。これもRESTに違反しています。詳細については、do-sessions-really-violate-restfulnessをご覧ください。 解決策: ユーザーの更新/アクションクエリの前に読み取りクエリを実行します。IEは私にこのユーザーのアイテムを提供し、リストにある場合は更新を続行します。 懸念事項: ユーザーがリソースに代わって操作するたびに追加の読み取りのオーバーヘッド。 解決策: ユーザーIDをdbレイヤーに渡し、それを更新条件付きの一部にします。または、ファンシーを取得したい場合は、データバックエンドに応じて、そのリソースに対してPostgresの行レベルのセキュリティなどを使用します。 懸念事項: リソースがリクエストしているユーザーのものかどうかを確認するには、リクエストのライフサイクルの少し遅いようです。エラーは、データバックエンドからずっと上にスローされる必要があります。同じように、認証とロールベースの承認はリクエストのライフサイクルの最初に行われることが多いので、少しずれているかもしれません。実装は、データバックエンドにも依存します。また、データバックエンドにビジネスロジックを示します。 解決策: クライアント側で一種のセッションに署名しました。JWTまたは暗号化/署名されたCookieを使用します。基本的に、ユーザーのリソースIDのリストを含む信頼されたセッションを維持します。 懸念事項: クライアント側セッションのサイズ。不要な場合でも、すべてのリクエストで送信されるという事実。複数のアクティブなセッション/クライアントの可能性を導入すると、メンテナンスが非常に複雑になります。リソースが別のクライアントに追加されたときに、クライアント側の状態をどのように更新しますか。 解決策: リソースがフェッチされるときに、署名された更新トークン(JWT)またはURLをリソースとともにクライアントに渡します。リソースが更新/アクションされたときに期待します。署名されたトークンには、ユーザーIDとリソースIDが含まれ、これらに対して簡単に確認できます。 懸念事項: リソースの所有権を譲渡できる場合は複雑になりますが、私の場合は問題ありません。更新前の読み取りよりも複雑になります。ちょっと変? 最終的な考え: 私は最後の解決策に傾いていますが、それが頻繁に発生することはないので、何か不足しているのではないかと思いますか?あるいは、私が知らないデザインパターンの一部かもしれません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.