ソフトウェア工学

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

2
純粋な抽象クラスとインターフェースの実装
これはC ++標準では必須ではありませんが、たとえばGCCが純粋な抽象クラスを含む親クラスを実装する方法は、問題のクラスのすべてのインスタンス化にその抽象クラスのvテーブルへのポインタを含めることです。 当然、これは、このクラスのすべてのインスタンスのサイズを、それが持つすべての親クラスのポインターによって膨張させます。 しかし、多くのC#クラスと構造体には、基本的に純粋な抽象クラスである多くの親インターフェイスがあることに気付きました。sayのすべてのインスタンスがDecimal、さまざまなインターフェースすべてへの6つのポインターで肥大化していた場合、私は驚くでしょう。 それで、C#がインターフェースを異なる方法で実行する場合、少なくとも典型的な実装では、どのようにインターフェースを実行しますか(標準自体はそのような実装を定義しないかもしれません)。また、純粋な仮想親をクラスに追加するときに、C ++の実装にオブジェクトサイズの膨張を回避する方法がありますか?

6
バグの修正にわずかな利点がありますか[終了]
以前の同僚から、すべてのバグを修正する必要があるわけではないと聞いたことがあります。バグの優先リストを下るにつれて、そのバグを引き起こすユースケースが不明瞭になったり、顧客満足度が低下したりするためです。ただし、そのバグの修正にはかなりの時間を費やす必要があります。 このコンセプトについて製品の所有者を説得しようとして、良いリソースが見つかりませんでした。私が見つけられたのは、ソフトウェア開発に限界費用があるかどうかの議論だけでした。 バグを修正することで実際にわずかな利点がありますか?この概念を説明する別の用語はありますか?

3
エレベータは、移動階の注文への最短経路を見つけるためにどのアルゴリズムを使用していますか?
エレベータをシミュレートしようとしています。いつも一度に1つの注文のみを受け取ることで非常に簡単に始め、キューの形でエレベータにメモリを追加して、床が押された順に移動するようにしました。これは明らかに最善のアプローチではありません。 そのため、現時点では、非常にシンプルで「近視眼」のロジックを使用しています。つまり、現在のフロアで自分に最も近いフロアを見つけ、次の目的地として設定し、リストにフロアがなくなるまでループします。 しかし、これは常に機能するわけではありません。たとえば、エレベーターは5階の建物の3階にあり、注文4,5,2を取得しました。最短経路は2から4になります。コードに応じて、コストが5の4-> 5-> 2が選択される可能性は同じです。 最短経路を見つけてエレベーターをより効率的にするにはどうすればよいですか?

8
メモリの割り当てをいつ解除するかを静的に予測することは可能ですか?ソースコードからのみですか?
メモリ(およびリソースロック)は、プログラムの実行中の確定的なポイントでOSに返されます。プログラムの制御フローだけで、特定のリソースの割り当てを確実に解除できる場所を知るのに十分です。人間のプログラマーがfclose(file)、プログラムが完了したときにどこに書くべきかを知っているように。 GCは、制御フローが実行されるランタイム中に直接把握することでこれを解決します。しかし、制御フローについての真実の本当のソースはソースです。したがって、理論的にはfree()、ソース(またはAST)を分析することで、コンパイルの前に呼び出しを挿入する場所を決定できるはずです。 参照カウントはこれを実装するための明らかな方法ですが、ポインターがまだ参照されている(まだスコープ内にある)けれども不要になった状況に遭遇するのは簡単です。これは、ポインタを手動で割り当て解除する責任を、それらのポインタへのスコープ/参照を手動で管理する責任に変換するだけです。 プログラムのソースを読み取ることができるプログラムを作成することが可能であるように思われます。 プログラムの制御フローのすべての順列を予測する---プログラムのライブ実行を監視するのと同様の精度 割り当てられたリソースへのすべての参照を追跡する 参照ごとに、参照が絶対に参照解除されないことが保証される最も早いポイントを見つけるために、後続の制御フロー全体をトラバースします。 その時点で、ソースコードのその行に割り当て解除ステートメントを挿入します すでにこれを行うものはありますか?RustやC ++スマートポインター/ RAIIは同じものだとは思わない。
27 parsing  memory 

7
ピア/コードレビューの不満
私は自分自身をスーパースター開発者とは呼びませんが、比較的経験豊富な開発者です。私はコードの品質を高いレベルに保ち、コーディングスタイルを常に改善し、コードを効率的で読みやすく、一貫性のあるものにするよう努めています。また、品質と速度の両方のバランスが必要であることも理解しています。 これを達成するために、ピアレビューの概念をチームに導入しました。github pull-requestでのマージの2つの親指。素晴らしい-しかし、私の意見では、せきをせずに。 同じ同僚からのピアレビューコメントがよく見られます- 後にスペースを追加すると良いでしょう <INSERT SOMETHING HERE> メソッド間の不要な余分な行 docblock内のコメントの最後で完全停止を使用する必要があります。 今、私の観点から-レビュー担当者はコードの美学を表面的に見ており-実際にコードレビューを行っていません。化粧品のコードレビューは、ar慢/エリートのメンタリティとして私に伝わります。内容はありませんが、レビュアーが技術的に正しいため、あまり議論することはできません。上記の種類のレビューはもっと少なく、次のようなレビューをもっと見たいです。 循環的な複雑さを減らすには... 早く終了し、if / elseを避ける DBクエリをリポジトリに抽象化します このロジックは実際にはここには属していません 繰り返してはいけません-抽象と再利用 Xメソッドの引数として渡された場合はどうなりYますか? これの単体テストはどこにありますか? 私は、化粧品の種類のレビューを与えるのは常に同じ種類の人々であり、私の意見では「品質と論理に基づく」ピアレビューを与えるのは同じ種類の人々であると思います。 ピアレビューの正しいアプローチは(もしあれば)何ですか。そして、同じ人が基本的にコードをスキミングして、実際のコードの欠陥ではなくスペルミスや美的欠陥を探すことにイライラするのは正しいですか? 私が正しい場合-化粧品の修正を提案することとのバランスで、同僚に実際にコードの欠陥を探すように奨励するにはどうすればよいですか? 私が間違っている場合-私を啓発してください。実際に優れたコードレビューを構成するものについて、経験則はありますか?コードレビューとは何かという点を見逃していませんか? 私の観点から言うと、コードレビューはコードの責任を共有することです。ロジック、読みやすさ、機能性をアドレッシング/チェックせずに、コードを評価するのは気が進まないでしょう。また、誰かがdoc-blockの完全な停止を省略したことに気付いたとしても、コードの強固な部分のマージをブロックすることはありません。 コードを確認するとき、500 Locあたり15〜45分かかります。これらの浅いレビューが実行しているレビューの深さであれば、これまで10分以上かかることは想像できません。さらに、浅いレビュアーからの評価はどれくらいの価値がありますか?確かに、これはすべての親指の重さが等しくないことを意味し、2パスのレビュープロセスが必要になる可能性があります。深いレビューのための1つの親指と「研磨」のための2番目の親指?

6
単体テストなしのアジャイル
作業しているコードベースのユニットテストカバレッジが0%である場合、「アジャイル開発」または「アジャイル手法」を適用していると主張することは理にかなっていますか?(そして、チームとして、あなたはそれについて何もしていません)。 それを明確にするために:私にとって、それは意味がありません。私の個人的な経験では、ユニットテストが実際に「アジャイル」(つまり、変更への対応、設計の改善、知識の共有など)を可能にする唯一のツールであり、TDDが唯一の手段であることがわかりました。 。 他の方法もあるかもしれませんが、どのように機能するかはまだわかりません。

5
例外をキャッチ/スローすると、純粋なメソッドが不純になりますか?
次のコード例は、私の質問の背景を示しています。 Roomクラスはデリゲートで初期化されます。Roomクラスの最初の実装では、例外をスローするデリゲートに対するガードはありません。このような例外は、デリゲートが評価されるNorthプロパティにバブルアップします(注:Main()メソッドは、クライアントコードでRoomインスタンスがどのように使用されるかを示します)。 public sealed class Room { private readonly Func<Room> north; public Room(Func<Room> north) { this.north = north; } public Room North { get { return this.north(); } } public static void Main(string[] args) { Func<Room> evilDelegate = () => { throw new Exception(); }; var kitchen = new Room(north: …


2
役割ベースのREST API?
異なるロールを持つ複数のユーザーが含まれるリソースにアクセスできるREST APIを構築しています。 スコープをシンプルに保つために、「student / teacher / class」ドメインを取り上げます。 GET /students アクセスするリソースです。 ユーザーには、学生や教師などの役割がある場合があります 生徒はクラスの生徒にのみアクセスできます。教師は、教えるクラスの生徒にアクセスできます。いくつかの用途は学生であり、他のクラスも教えます。彼らは彼らのクラスの生徒と彼らが教えるクラスの生徒にアクセスできなければなりません。 理想的には、これを2つの機能として実装します。ロールごとに1つ、ユーザーが複数のロールを持つ場合は「結合」します。 私の質問は、これを実装するためにどのパターンを使用すればよいですか? 外部的に ロールごとにAPIを分割する必要がありますか?GET /teacher/studentsそしてGET /student/studentsそれは右の私には思われません。 すべてを維持する私は1つのリソースです(推奨) 内部的に 内部的にどのように実装する必要がありますか? すべての方法は、BIGスイッチで開始する必要がありますか、役割ごとに行う必要がありますか 役割ごとにリポジトリを実装する必要がありますか? これを達成するのに役立つ設計パターンはありますか? 副次的なコメントとして:私はASP.NET Web APIとEntity Framework 6を使用していますが、概念的な実装には関係ありません。

2
Exception.Messageを読むべき人はいますか?
例外を設計するとき、ユーザーまたは開発者が理解する必要があるメッセージを作成する必要がありますか?実際に例外メッセージの読者はだれですか? 例外メッセージはまったく役に立たないと思うし、いつも書くのに苦労しています。慣例により、例外のタイプは既に何かが機能しなかった理由と、カスタムプロパティがファイル名、インデックス、キーなどの情報をさらに追加する理由を既に示しているはずです。自動生成されたメッセージでも実行でき、含まれる必要があるのは、追加のプロパティのリストを含む例外の名前だけです。これは、手書きのテキストとまったく同じように便利です。 メッセージをまったく書き込まずに、コードでハードコーディングするのではなく、おそらく異なる言語で意味のあるメッセージを作成する特別な例外レンダラーを用意する方が良いと思いませんか? これらの質問のいずれかが私の質問に対する答えを提供するかどうか尋ねられました: 適切な例外メッセージを書く方法 多くの例外メッセージに有用な詳細が含まれていないのはなぜですか? 私は両方を読みましたが、彼らの答えに満足していませんでした。彼らは一般的にユーザーについて話し、宛先ではなくメッセージ自体の内容に焦点を当て、エンドユーザーと開発者の少なくとも2人が存在することがわかりました。例外メッセージを書くとき、私はどちらに話すべきかわかりません。 有名なメッセージは、例外タイプの名前を異なる単語で繰り返しているだけなので、実際の価値はまったくないと思います。完全に自動生成できます。 私にとって例外メッセージは、読者の差別化に欠けています。完璧なエンドユーザー用と開発者のための1:例外は、メッセージの少なくとも2つのバージョンを提供する必要があります。単なるメッセージと呼ぶのは一般的すぎます。その後、開発者のメッセージは英語で記述する必要がありますが、エンドユーザーのメッセージは他の言語に翻訳する必要がある場合があります。このすべてを1つのメッセージだけで実現することは不可能であるため、例外は、先ほど述べたように、さまざまな言語で利用できるエンドユーザーメッセージに識別子を提供する必要があります。 リンクされている他のすべての質問を読むと、例外メッセージは実際には開発者ではなくエンドユーザーが読むことを意図しているという印象を受けます... 1つのメッセージはケーキを食べて食べるようなものです。

3
大きな時系列データを効率的に保存する方法は?
いくつかの非常に大量の時系列データを保存し、クエリできるようにする必要があります。 データのプロパティは次のとおりです。 シリーズ数:約12.000(1万) データポイントの数、グローバル:1か月あたり約500.000.000(5億) 混合値タイプ:データポイントの大部分は浮動小数点値で、残りは文字列です サンプリング期間:シリーズ間およびシリーズ内で可変 タイムスタンプ:ミリ秒精度 データ保持期間:数年、減衰またはダウンサンプリングなし データアーカイブはほぼリアルタイムで構築する必要がありますが、妥当な遅延(約1時間)が許容されます 必要に応じて過去のデータを再構築できますが、高コストです 時々ですが、ごくまれに、過去のデータを更新する必要があります 想定されるクエリのプロパティ: データに対するクエリのほとんどはタイムスタンプベースのクエリです。1日から数ヶ月/年までの範囲。90%以上が最新データのクエリになります その他の要件: ソリューションは、無料のビールのように無料である必要があり、できればオープンソース 私が最初に考えたのは、SQLデータベースの代わりにバックエンドを格納するHDF5ファイルで PyTables / Pandasを使用することでした。 質問: PyTables / Pandasが「最良の」ルートであると仮定すると、それぞれが特定の期間にわたる複数のHDFファイルにデータを分割するか、すべてが単一のファイルに入れられて巨大になるのが良いでしょうか? 固定形式または表形式を選択する必要がありますか?私にとっては、1か月に1つのHDFファイルを保持すれば、固定形式は問題なく見えます。このように、シリーズ全体がおそらくRAMに収まり、テーブル形式インデックスを必要とせずにメモリ内をスライスできるからです。私は正しいですか? それが最善のアプローチではない場合、このデータストアをどのように構成する必要がありますか、またはどのテクノロジーを検討する必要がありますか?大量の時系列データの保存に取り組むのは私が初めてではありませんが、この課題を解決する一般的なアプローチは何ですか? 私が検討した他のアプローチ: 配列データベース:配列の開始時間と終了時間、およびサンプリング周期を保存するだけでよく、配列自体の値とインデックス付けが簡単なので、一定のサンプリング周期を持つ時系列に最適です。しかし、シリーズ自体の可変サンプリング期間では、タイムスタンプと値の関係をより厳密に保つ必要があります。これは、私の見解では、配列DBMSにはあまり適していません。 タイムスタンプ、paramID、値を列として持つ標準SQLデータベースですが、その性質上、クエリに対して大量のディスクI / Oを要求します

3
ロック文の中にどれくらいの作業を配置する必要がありますか?
私は、サードパーティソリューションからデータを受信し、データベースに保存し、別のサードパーティソリューションで使用するためにデータを調整するソフトウェアの更新プログラムの作成に取り組んでいるジュニア開発者です。当社のソフトウェアはWindowsサービスとして実行されます。 以前のバージョンのコードを見ると、次のように表示されます。 static Object _workerLocker = new object(); static int _runningWorkers = 0; int MaxSimultaneousThreads = 5; foreach(int SomeObject in ListOfObjects) { lock (_workerLocker) { while (_runningWorkers >= MaxSimultaneousThreads) { Monitor.Wait(_workerLocker); } } // check to see if the service has been stopped. If yes, then exit if (this.IsRunning() == …
27 c#  .net  concurrency  locks 

1
サービスとしてのソフトウェア(SaaS)モデルで完全なGPLライブラリを使用する
私はすでにサイトを検索しましたが、人々が販売/配布しようとしているソフトウェアでGPLライブラリを使用することに関連する答えを見つけることができました。この場合、答えはソースコードも利用可能にする必要があるということです。 SaaSはどうですか?つまり、クライアントがインターネット経由で使用するために月額料金を支払うアプリを構築し、クライアントは何もダウンロードしたり、コードにアクセスしたりしません。 質問: この場合、ソースコードを利用可能にすることなく、完全なGPLライブラリを使用できますか? 私のモデルがSaaSであっても、GPLの他の制限/要件はありますか?

3
単一ページアプリでのブラウザーキャッシュの処理
単一ページアプリのWebブラウザキャッシュを適切に処理する方法を見つけようとしています。 私はかなり典型的なデザインを持っています:SPAを実装するいくつかのHTML、JS、CSSファイル、およびSPAによって消費されるJSONデータの束。更新をプッシュするときに問題が発生します:サイトの静的部分とJSONを生成するコードを同時に更新しますが、クライアントブラウザーには静的部分がキャッシュされていることが多いため、古いコードは新しいデータを処理しようとし、 (行われた変更に応じて)問題が発生する場合があります。(特に、IEは、再検証せずにキャッシュされたJSを使用することについて、ChromeまたはFirefoxよりも積極的です。) これを処理する最良の方法は何ですか? JSONの変更に後方互換性があることを確認し、妥当な時間内にブラウザーのキャッシュが期限切れになると仮定します。 静的JSとJSONの両方に何らかのバージョン番号を埋め込み、window.location.reload(true);一致しない場合は実行します。 ヘッダーの適切な組み合わせ(must-revalidateまたはno-cache何でも; ソース はこれを行う方法によって異なります)を把握して、サイトをロードするための余分な往復を意味する場合でも、ブラウザーがすべてのロードで常にすべてのリソースを再検証するようにします。 更新をプッシュするときに静的コンテンツが期限切れになるように、キャッシュコントロールと期限切れヘッダーをマイクロ管理します。 他に何か?

3
クロスプラットフォームアプリケーションで「脂肪バイナリ」がより広く使用されないのはなぜですか?
私の知る限り、いわゆる「ファットバイナリ」-複数のシステムのマシンコードを含む実行可能ファイル-は実際にはApple PCでのみ使用されていますが、 PowerPCからx86。 最近では多くのソフトウェアがクロスプラットフォームであり、単一のファットバイナリを作成することは、オペレーティングシステムとアーキテクチャの組み合わせごとに何十もの異なるダウンロードを追跡するよりも多くの点で簡単になるようです。彼らが望むものに顧客に。 たとえば、なぜこのアプローチが受け入れられなかったのかについて、多くの推測を思いつくことができます。 マルチOSバイナリを実行不可能にするクロスコンパイルツールの欠如 とにかく各OSでコードをテストする必要があるため、各OSにネイティブにコンパイルできるシステムが既に必要です。 どうやら32ビットプログラムは既に64ビットマシンで「機能する」 動的リンクはOSごとに異なるため、「脂肪アプリケーション」が動作しても「脂肪ライブラリ」は動作しない場合があります しかし、私は常にこれらのOS固有およびアーキテクチャ固有の詳細をすべて隠すライブラリまたはフレームワークを使用しているため、そのどれが本当に真実であるか、またはさらに多くの問題があるかどうかわからない約。それでは、マルチアーキテクチャソフトウェアやマルチOSソフトウェアの作成にファットバイナリが一般に使用されない実際の理由は何ですか?(アップル以外)

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