ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

3
視覚化ソフトウェアにとって意味のあるテストを作成するにはどうすればよいですか?
特定の種類のファイルを取得して視覚化したり、プロットされた画像を操作するためのボタンのホストを作成したりする、かなり大きなソフトウェアがあります。週に一度は機能しないバグ/コードの断片を見つけているように感じますが、このソフトウェアのテストを作成する方法を理解するのに苦労していますか? ライブラリやAPIなどのプロジェクトにとってテストがどのように重要であるかを理解しています。これらの関数を使用するテストを作成するだけです。 しかし、視覚化ソフトウェアはどうですか?関連する視覚要素のため、別のアプローチが必要なようです。 データで使用できるすべての操作を実行して手動で呼び出すテストプログラムまたはテストハーネスを作成する必要がありますか? バグを修正したことを検証し、コードが再度壊れた場合に警告するために、テストの作成を開始するにはどのアプローチを使用すればよいですか? ユニットテストをいつ行うべきかに関して、関連するが重複していない質問があります。私はバグを発見しているので、ソフトウェアが再び後退するのを防ぐためのテストを作成したいと思います。

3
誤ってコミットに無関係な変更を含める
私のgitコミットへの個人的なアプローチは、すべてのコミットがその完全性に変更の単位を含める必要があるということです。 私が開発するとき、私は通常そのようなユニットに焦点を合わせます。しかし、時々、私の注意がどこか他の場所に迷子になり、しばらくの間別のユニットで作業します。これはおそらく最適ではありませんgit add --interactiveが、慎重にコミットすることを学びました(私の良い友達です)。 ただし、変更を選択的にステージングするのを忘れて、代わりにファイル全体をコミットする場合があります。diffに表示されるすべての変更は、実際には同じユニットに関連していると信じています。 それから私git push。 これは危険ですか?意図した変更のみが含まれるようにコミットを修正するよう努力する必要がありますか?私の主な懸念は、歴史を見る他の誰もが変更を目にし、おそらくそれが間違いであることに気付く前に数分間頭を掻くでしょう。さらに悪いことに、変更が関連しているように見え、プログラマーがエラーを認識しない可能性があることは想像できます。 問題は、すでにプッシュしているため、サーバーの履歴を安全に書き換えることができないため、おそらく最初にコミットを元に戻して、適切に分割して再度コミットする必要があるでしょう。または、コミットをより適切なコミットメッセージで修正することもできますが、履歴の書き換えも必要になるため、本当に高速でなければなりません。最後の手段として、私が取り組んでいるユニットを次のようにコミットするだけで、以前のコミットに関連する変更があることに注意してください(ただし、これは間違っていると感じています)。 適切なコードレビューワークフローを備えたマルチ開発者の設定では、これが発生しない可能性があることを理解しています。私がプロジェクトの唯一の開発者である場合、履歴を書き換えることがこれに対する最良の解決策であることも理解しています。
8 git 

3
設計パターン-戦略ごとのDLL
私は通常、次の方法でアプリケーションを設計していることに気づきました。 必要なサブシステムのインターフェースを含む1つのDLL。たとえば、Company.Framework.Persistence.dll。 上記のサブシステムの各戦略(または実装)ごとに1つの新しいDLL 。例えば: Company.Framework.Persistence.MSSQL.dll Company.Framework.Persistence.MySQL.dll Company.Framework.Persistence.FileSystem.dll これにより、多くのプロジェクトで非常に大きなソリューションが得られますが、一方で、消費者は自分のニーズに適したDLLを選択する機会が与えられます。 と呼ばれる単一のDLLがある場合Company.Framework.Persistence.dll、消費者は彼が決して使用しない可能性がある多くの戦略をロードする必要があります。DLLをモジュール化すると、この問題を解決できます。 これは良い習慣ですか?この設計には欠点がありますか?

3
ハンドルやManagerを渡さずにオブジェクトのハンドルを管理するのに最適なデザインパターンはどれですか。
OpenGLを使用してC ++でゲームを作成しています。 知らない人のために、OpenGL APIを使用して、などの多くの呼び出しをglGenBuffers行いますglCreateShader。これらの戻り値の型は、GLuint作成したものに対する一意の識別子です。作成されるものはGPUメモリ上に存在します。 GPUメモリが制限されている場合があることを考えると、複数のオブジェクトで使用されるときに同じものを2つ作成したくない場合があります。 たとえば、シェーダー。あなたは、シェーダプログラムをリンクして、あなたが持っていますGLuint。シェーダーを使い終わったら、呼び出す必要がありますglDeleteShader(またはそれに影響を与える何か)。 ここで、次のような浅いクラス階層があるとします。 class WorldEntity { public: /* ... */ protected: ShaderProgram* shader; /* ... */ }; class CarEntity : public WorldEntity { /* ... */ }; class PersonEntity: public WorldEntity { /* ... */ }; 私が今まで見たどのコードでも、すべてのコンストラクターにShaderProgram*渡して、に格納する必要がありWorldEntityます。ShaderProgramは、GLuintOpenGLコンテキストでの現在のシェーダー状態へののバインディングと、シェーダーを使用するために必要な他のいくつかの役立つことをカプセル化する私のクラスです。 私がこれで持っている問題は: を構築するために必要な多くのパラメーターがありますWorldEntity(メッシュ、シェーダー、多数のテクスチャーなどがあると考えてください。これらはすべて共有できるため、ポインターとして渡されます) どのような作成されたWorldEntityかを知る必要性をShaderProgramそれが必要 これはおそらく、異なるエンティティに渡すもののインスタンスを知っているある種のgulp EntityManagerクラスを必要としますShaderProgram。 つまりManager、クラスが必要なインスタンスEntityManagerとともにに自分自身を登録する必要があるかShaderProgram、switch新しいWorldEntity派生型ごとに更新する必要がある、マネージャの大物が必要なためです。 私が最初に考えたのは作成することでしたShaderManager(私は管理者が不良である、知っている)私はへの参照やポインタで渡すというクラスをWorldEntityので、彼らは何でも作成することができますクラスShaderProgramを経由して、彼らが望むShaderManagerとShaderManager、既存のトラックに保つことができShaderProgram、それができるよう、秒すでに存在するものを返すか、必要に応じて新しいものを作成します。 (私ShaderProgramはShaderProgramsの実際のソースコードのファイル名のハッシュを介してsを保存できます) だから今: …

1
一方向ストリーミングオーディオデバイスにはどのような種類のバッファを実装する必要がありますか?
オーディオデータがデバイスにストリーミングされるプロジェクトに取り組んでいます。オーディオデータはオーパス経由でエンコードされ、一度に20 msのペイロードでストリーミングされます。パケット損失を完全に回避するために、ストリーミングはTCP経由で行われます。ストリーミングの目的は、オーディオの損失やジッターを発生させずに、ライブオーディオストリーミングにできる限り近づけることです。 現在、遅いインターネット接続で何が起こるか、オーディオが少しジッターすることがあります。私は現在バッファを使用していませんが、目標はできるだけ「ライブストリーミング」に近づけることができると同時にジッターを排除することです。 私はジッターバッファーを調べましたが、ジッターバッファーも両端で遅延を処理して、両端が可能な限り同期するようになっているようです。静的なバッファサイズを作成した場合、必要がなければ、ライブストリーミングの側面からそれを取り除くことになると思います。 だから、これはいくつかの質問を私に残します、それらはすべて何らかの形で関連しています。 バッファー長を検出するための適切な方法またはアルゴリズムは何ですか? 受信側のデコーダーにデータを送り始めるための最良の方法は何ですか?バッファが一定のミリ秒に達すると、20ミリ秒のペイロードでデータの供給を開始しますか? バッファーがいっぱいになった場合、再生を遅らせますか? バッファはバイトまたは時間の長さになりますか? 本当にありがとう!

3
読みやすさのためだけに名前でサブクラスを作成することは悪い習慣ですか?
1つのパッケージに3つのセンサーがあり、すべてを調整する必要があります。これらをsens1、sens2、およびsens3と呼びます。sens1とsens2のキャリブレーションは同じですが、sens3のキャリブレーションには追加のパラメーターが必要です。私の質問は、「読みやすさを維持しながら、ほぼ同一の3つのオブジェクトを処理する最良の方法は何ですか?」です。 もちろん、最初に考えたのは、ポリモーフィズムを使用することでした。汎用のSensorオブジェクトを.calibrate(Parameters params)メソッドでセットアップします。ここで、Parametersクラスを使用すると、実行しているキャリブレーションに基づいてパラメーターの数を変更できます。ただし、これにより次のようになります。 Sensor sens1 = new Sensor(); Sensor sens2 = new Sensor(); Sensor3 sens3 = new Sensor3(); 将来の人々は、1つのセンサーが他の2つのセンサーと根本的に異なることを知る必要がありますが、非常によく似ているため、Sens1とSens2を名前だけでサブクラス化するのが最善のようです。言い換えると、より論理的なクラス名を持たせるために、動作を変更または拡張しない2つのサブクラスを作成します。これらの3つのセンサーはすべて同じパッケージに含まれているため、このデータは非常に頻繁に組み合わされます。これにより、上記のコードが次のように変更されます。 Sensor1 sens1 = new Sensor1(); Sensor2 sens2 = new Sensor2(); Sensor3 sens3 = new Sensor3(); どこ Sensor1 extends Sensor { } Sensor2 extends Sensor { } Sensor3 extends Sensor { @Override …

3
データベースの正規化と依存関係
3〜4つの相互依存プログラムを開発しています。それらをfoo bar bazとauthと呼びます。お互いに独立してほしいです。各プログラムを他社にライセンス供与する場合を想像してみてください。fooとbarが必要な企業もあれば、bazだけが必要な企業もあります。authを独立しておくことも良い方法のようです。 コンテキスト:authはすべてのシステムの認証を処理します。authのメインのusersテーブルには、user_id、email、password、first、lastがあります fooには、アプリケーションの特定のフィールド(user_id、role_idなど)を持つusersテーブルもあります。 各システムには独自のデータベースがあります。過去に、各アプリケーションから認証データベースへの外部キーを作成しました。他のデータベースから更新権限を削除しましたが、特定の関連フィールドへの選択アクセスを許可しました。これは緊密な依存関係を作成するため、悪い解決策のように見えますが、ユーザー名と電子メールをfoo、bar、またはbazデータベースに格納する必要がないように、dbを正規化することができました。 すべてのデータベースに情報を保存する方が良いでしょうか?または、認証IDをfoo barとbazに保存し、apiを使用してauthIdを使用してユーザー情報を取得する方が良いでしょうか? 同様に、3つのシステムすべてに顧客がいる可能性があります。確かに、auth dbに依存関係を作成するのは悪いようですが、3つすべての顧客のdbについてはどうですか? または、1つの中央データベースを作成するのに最適なソリューションです。1つのユーザーテーブル。 他の提案?

1
なぜグローバルっぽいObject.create関数を作成するのですか?
私は.NETとJavaの分野でかなり経験豊富なプログラマーであり、JavaScriptについて読み始めました。Douglas Crockfordの "The Good Parts"の本を購入しましたが、すぐにいくつかのことが気になりませんでした。 1つは、必要のない基本的な型を変更することです。 if (typeof Object.create !== 'function') { Object.create = function (o) { //Really... 'o'? For a parameter you're only using twice? function F() {} F.prototype = o; return new F(); }; } newObject = Object.create(oldObject); 明らかにこの目的で関数を作成すると便利で時間を節約できますが、なぜ地球上でオブジェクト上に作成することを勧めているのですか?3呼吸前に彼はグローバルが悪であることを支持し、それから彼はモンキーパッチオブジェクトに進みました。彼はそれがすでに存在するかどうかさえテストし、他のライブラリが彼のためにそれを行った場合の実装は同じであると仮定します。 名前空間に相当するJSでこれを作成しない理由はありますか?すなわち MY_UNIQUE_UTIL_LIBRARY.create = function(obj){...}; //The name would be shorter …

1
Git-FlowでGrid of Doom™を回避する
私のプロジェクトはGit Flow分岐モデルに従っています。開発はで行われdevelop、masterリリースにマージされ、タグが付けられます。修正プログラムは、現在のブランチから分岐しmasterます。 ただし、現在の開発では修正プログラムも必要なので、各修正プログラムのブランチもマージさdevelopれます。 これにより、非常に見苦しいリビジョングラフが作成されます。特に、開発/ホットフィックスは、短い時間枠で頻繁にマージされます。 これは一般にGit-Flowで発生する問題ですか?簡単な修正はありますか?
8 git  gitflow 

1
Webアプリケーションをクライアント側のみにしない理由はありますか?
私は最近、パスファインディングアルゴリズムシミュレーションアプリケーションをPythonで書き始めました。 ユーザー入力を受け取り、ランダムに2Dグラフを生成し、GUIを介してシミュレーションを表示します。 さて、私が見つけたのは、Pythonやスタンドアロンアプリケーションは、この種のアプリケーションの共有にはあまり適切ではないということです。これは、人々に自分のコンピューターなどで実行させる必要があるためです。それらをウェブサイトに。 明らかに、表示要素と制御要素はクライアント側で記述する必要があります。 ただし、実際のパス検索アルゴリズムは、クライアント側またはサーバー側のいずれかで作成できます。 これで、サーバー側のバックエンドが必要ない(つまりデータベースがない)場合、Webアプリケーション全体をクライアント側のHTML / JavaScriptで実行することが可能になります。 問題は、これを行わない正当な理由があるかどうかです。 クライアントとサーバー間のやり取りを処理する必要がないため、クライアント側でのみ実行すると、複雑さが大幅に軽減されます。サーバーの唯一の目的は、最初にJavascriptをクライアントに提供することです。 一方、私はすべてをJavaScriptで記述する必要があります... また、再利用可能なモデルモジュールを使用するという考えは、私にとって魅力的です。例えば。後でスタンドアロンアプリケーションが必要な場合は、View / Controlモジュールを記述するだけで済みます。 ここで一般的に受け入れられている慣習は何でしょうか。

1
セロリでAPIを呼び出す
要件が次のようなクライアント向けのシステムを設計しています。 彼らはJSONファイルをアップロードします(1つのオブジェクト/行) JSONオブジェクトをペイロードとしてAPIを呼び出す 各API呼び出しの状態(成功/失敗)をデータベースに記録する 失敗した場合は、1回再試行します。 セロリとsqliteデータベースをバックエンドとして使用して構築することにしました。JSONの行の数は多くなく、メモリに収まる可能性があります。個々のコンポーネントはすべて正常に動作していますが(ファイルのアップロード、ファイルの読み取り、APIの呼び出し、dbへの書き込みなど)、セロリを使用したタスクのディスパッチの全体的なアーキテクチャについてはわかりません。 ファイルにN行あるとすると、次のようになります。 オプションA: result列(最初はnull)を持つデータベースにN個のオブジェクトを作成します。 N個のセロリタスクを作成し、オブジェクトIDをパラメーターとペイロードとして渡します サブタスクにAPIを呼び出しさせ、オブジェクトの結果フィールドを成功/失敗に更新します。 失敗した場合にセロリの再試行機能がAPIを再度呼び出そうとするようにします。 オプションB: result列(最初はnull)を持つデータベースにN個のオブジェクトを作成します。 1つのセロリタスクを作成し、N個のオブジェクトIDとN個のペイロードのリスト全体を渡します N個のオブジェクトすべてをループして、各ステップの結果でデータベースを更新します。 前のタスクが完了すると、別の1回限りのセロリタスクが起動され、失敗した結果を持つすべてのオブジェクトのデータベースが読み取られて再試行されます。 オプションAは、その単純さのために優先していますが、スケジュールできるセロリタスクの数の制限と、ブローカー(RabbitMQ)がそれを処理するかどうかはわかりません。オプションBの場合、大きなリスクは、セロリタスクが何らかの理由で何らかの行Mで終了した場合、後続のすべてのオブジェクトが試行されることはないということです。 これらの2つについての考え、または3番目に優れた代替案があるかどうか。

4
(C ++のような言語の)プログラムをクロスプラットフォームにするのは何ですか?
私はJavaでのかなり基本的なプログラミング経験があり、C ++とPythonを試しました。Javaでは理にかなっていますが、C ++で記述した基本的なプログラムはWindowsとOS Xで問題なく動作しました。ソースファイルを他のコンピューターに送信し、コンパイルして実行することができました。プログラムはかなり基本的なもので、主に私がC ++を学ぶためにやってきた基本的なオブジェクト指向のものだけです。 もちろん、どのマシンでもC ++プログラムをコンパイルして問題なく実行することはできません。それはどの時点で起こりますか?プラットフォームはどのレベルの複雑さで問題になり始め、プログラムはどこでも実行されませんか?プラットフォーム固有のライブラリを使用するときですか?クロスプラットフォームライブラリを使用するだけで、プログラムをC ++でクロスプラットフォームにできますか? 私は自分でこれを理解しようとしましたが、見つけたものはすべて頭を悩ませるか、単に質問に答えないかのどちらかです。多くの場合、エミュレーターや、クロスプラットフォームの言語を尋ねる人々がいます。

2
REST APIリソースをビジネスドメインに基づいた領域に分割する
いくつかの関連ドメインをカバーする主要なアプリケーションREST APIでは、リソースが属するビジネスドメインに基づいてリソースを「エリア」に分割する方が理にかなっていますか、それとも単一のモデルを維持する方が良いですか? たとえば、「販売」と「在庫」のサブドメインがあります。システムのユーザーは通常、一度に1つのドメインのみを考慮しますが、例外が発生する可能性もあります。両方のドメインに存在する「アイテム」の概念があるため、「アイテム」リソースを2つの異なる方法で実装できます。 各ドメインの概念を表すさまざまなリソースがあり、各リソースは関連データのみを保持しています。 / sales / items /:id / inventory / items /:id すべてのコンテキストで使用されるすべてのデータを含む単一のリソースがあります。 / items /:id ドメインの1つだけに属するリソースもたくさんあります。 「地域」の長所 単一ドメインのみに関心があるユーザー向けのAPIを理解しやすくする リソースの実装が簡単(一度に読み取る/更新する項目が少ない) 特定のドメインごとにリソースをより特殊化/最適化できます より詳細なレベルでリソースへのアクセスを制御する機能 単一の統合モデルの長所 複数のドメインに属するコンセプトの重複リソースはありません ユーザーが複数のドメインで作業する必要がある場合は、すべてのニーズに対応する単一のAPIを使用するだけで済みます 上記のAPIパーティショニングは、APIコントラクトと実装の両方の複雑さを軽減する有効な方法ですか?私はそれがどこにも言及されているのを見たことがありません。 どちらかのアプローチを支持して決定を下すために検討する必要があるものは他にありますか?

1
JSにコンパイルされた言語–同期式の待機を行う最もエレガントな方法
JavaScriptにコンパイルする(まだ別の)言語を作成しようとしています。私が持たせたい機能の1つは、JavaScriptの非同期操作を同期的に(正確には同期ではなく、もちろんメインスレッドをブロックせずに)実行できることです。より少ない話、より多くの例: /* These two snippets should do exactly the same thing */ // the js way var url = 'file.txt'; fetch(url) .then(function (data) { data = "(" + data + ")"; return sendToServer(data); }).then(function (response) { console.log(response); }); // synchronous-like way var url = 'file.txt'; var response = sendToServer("(" + …

5
大規模なデータセットに対するきめの細かい検索
1日あたり約400万件のレコードがあり、オンラインで7年間の価値を維持する必要があるため、検索できるようにする必要がある102億件のレコードを調べています。ユーザーは、検索がUIに十分な速さで、3〜5秒になることを期待しています 私の制御が及ばないため、既製のデータベースソリューションを使用することはできません。これは、データベースを別のチームに渡して管理する必要があるためです(質問しないでください)。つまり、ハードウェアを最適化する機能を失い、彼らはデータベースのための万能サービスを提供し、GBによって(内部で)課金されるソフトウェア。私は私がポイントを作ることを示唆するコメントを受け取るつもりだと確信しています、私はすでに持っており、経営陣は彼らが私に何をするように求めているかはばかげています。 私はソリューションの要としてLuceneを使用することを検討してきました。タイプ別および日別にパーティション化された実際のデータをフラットファイルに保存します。次に、Luceneドキュメントを使用して、検索対象のいくつかのフィールドにインデックスを付けます。唯一の「Stored」フィールドはレコードのIDです(そのため、フラットファイルから読み取ることができます)。 私は正確にLuceneまたはハードドライブにこだわっていませんが、私の理解によれば、インデックスを検索するための最初のIO /シーク時間があります。その後、すべてのLuceneドキュメントIDがあるとき、さらにIOが発生するドキュメントを読みます/ seeking時間、それから私はフラットフラットから実際のレコードを読みます...データセットのサイズを考えると、これは非常に速くなるとは想像できませんが、これは少し心配ですか? Luceneの最大ドキュメントサイズはインデックスあたり21億です。そのため、ここでは複数のインデックスが必要になります。 このアプローチは、一見すると、うまくいくように見えますか? 保存しているデータはイベントアクションデータです。ほとんどのクエリは、イベントIDでグループ化し、特定のイベントの最後のイベントアクションの詳細を取得します。一部のクエリは、大規模なセットイベントとそれらの個々のイベントアクションを分析します。

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