ソフトウェア工学

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

2
Linux / BSDに汎用のバッチ処理システムコールがないのはなぜですか?
バックグラウンド: システムコールのオーバーヘッドは、主にユーザー空間からカーネル空間へ、およびその逆へのコンテキストの切り替えにより、関数呼び出しのオーバーヘッドよりもはるかに大きくなります(推定範囲は20〜100倍)。関数呼び出しのオーバーヘッドを節約するためにインライン関数が一般的であり、関数呼び出しはsyscallsよりもはるかに安価です。開発者が1つのsyscallでカーネル内の操作を可能な限り処理することにより、システムコールのオーバーヘッドの一部を避けたいと考えるのは理にかなっています。 問題: これは、のような(?余計な)システムコールをたくさん作成したsendmmsgを() 、recvmmsg()などのようにchdir、オープン、のlseekおよび/またはシンボリックリンクの組み合わせ:openat、mkdirat、mknodat、fchownat、futimesat、newfstatat、unlinkat、fchdir、ftruncate、fchmod、renameat、linkat、symlinkat、readlinkat、fchmodat、faccessat、lsetxattr、fsetxattr、execveat、lgetxattr、llistxattr、lremovexattr、fremovexattr、flistxattr、fgetxattr、pread、pwrite等... 現在copy_file_range()、読み取りlseekと書き込みsyscallを組み合わせたLinuxが追加されました。これがfcopy_file_range()、lcopy_file_range()、copy_file_rangeat()、fcopy_file_rangeat()およびlcopy_file_rangeat()になるまでの時間の問題です...しかし、X個の呼び出しの代わりに2個のファイルがあるため、X ^ 2になる可能性がありますもっと。わかりました、LinusとさまざまなBSD開発者はそこまで行きませんが、私のポイントは、バッチシステムコールがあれば、これらのすべて(ほとんど?) libc側にオーバーヘッドがある場合。 システムコールをバッチ処理するための非ブロッキングシステムコール用の特別なシステムコールスレッドを含む、多くの複雑なソリューションが提案されています。ただし、これらの方法は、libxcbとlibX11の場合とほぼ同じ方法で、カーネルとユーザー空間の両方にかなりの複雑さを追加します(非同期呼び出しにはより多くのセットアップが必要です) 解決?: 汎用バッチ処理システムコール。これにより、特殊なカーネルスレッドを使用することに伴う複雑さなしに、最大コスト(複数モードスイッチ)が軽減されます(ただし、その機能は後で追加できます)。 socketcall()syscallには、基本的にプロトタイプの基本がすでにあります。引数の配列を取ることからそれを拡張して、代わりに戻り値の配列、引数の配列へのポインター(syscall番号を含む)、syscallの数、およびflags引数などを取得します。 batch(void *returns, void *args, long ncalls, long flags); 大きな違いの1つは、前のsyscallsの結果を後続のsyscalls(たとえば/ で使用するためのファイル記述子)で使用できるように、引数はおそらくすべて単純化のためのポインターである必要があることです。open()read()write() 考えられるいくつかの利点: ユーザースペースの削減->カーネルスペース->ユーザースペースの切り替え 可能なコンパイラスイッチ-fcombine-syscallsは、自動的にバッチ処理を試行します 非同期操作のオプションフラグ(fdを返すとすぐに監視されます) ユーザースペースに将来の結合されたsyscall関数を実装する機能 質問: バッチ処理システムコールを実装することは可能ですか? 明らかな落とし穴がありませんか? メリットを過大評価していますか? バッチ処理システムコールの実装を気にすることは価値がありますか(Intel、Google、またはRedhatで働いていません)。 以前に自分のカーネルにパッチを適用しましたが、LKMLを扱うのは恐ろしいです。 歴史は、「普通の」ユーザー(git書き込みアクセスのない非企業のエンドユーザー)にとって何かが広く有用であっても、上流(unionfs、aufs、cryptodev、tuxoniceなど)に受け入れられることはないことを示しています。 参照: FlexSC:例外のないシステムコールを使用した柔軟なシステムコールスケジューリング 専用ユーザーおよびカーネルCPUを介したシステムコールのオーバーヘッドの回避

3
BDDを使用するときに単体テストを使用する方法は?
私はBDDを理解しようとしています。いくつかの記事を読みましたが、理解したように、BDDはTDDの「次のステップ」です。私は両方とも非常に似ていると思うので、この記事で読むことができるように、TDDからの改良としてBDDが生まれたと言います。素晴らしい、私はアイデアが本当に好きです。 考えられない実用的なポイントが1つあります。BAがシステムが持つすべての予想される動作を書き込む.featureファイルがあります。BAとして、彼はシステムがどのように構築されているのかわからないので、次のように書きます。 +シナリオ1:アカウントにクレジットがあります+ アカウントにクレジットがあることを考えると そして、カードは有効です そして、ディスペンサーには現金が含まれています 顧客が現金を要求するとき 次に、口座から引き落とされていることを確認し、現金が支払われていることを確認します そして、カードが返されることを確認してください わかりました、これは素晴らしいことですが、システムの多くの部分が連携してそれを実現します(Account obj、Dispenser obj、Customer objなどを考えてください)。私にはこれは統合テストのように見えます。 ユニットテストが欲しいです。ディスペンサーにお金があるかどうかを確認するコードをテストするにはどうすればよいですか?または、現金が分配されますか?または、必要なときに口座から引き落とされますか? ユニットテストと「BA Created」テストを混在させるにはどうすればよいですか?
17 unit-testing  bdd 

4
前方宣言とインクルード
Reduce the number of #include files in header files. It will reduce build times. Instead, put include files in source code files and use forward declarations in header files. これをここで読みます。http://www.yolinux.com/TUTORIALS/LinuxTutorialC++CodingStyle.html。 そのため、ヘッダーファイル内のクラス(クラスA)が、あるクラス(クラスB)の実際の定義を使用する必要がない場合に表示されます。そのとき、特定の(クラスB)ヘッダーファイルを含める代わりに、前方宣言を使用できます。 質問:ヘッダー内のクラス(クラスA)が特定のクラス(クラスB)の実際の定義を使用しない場合、どのように前方宣言がコンパイル時間の短縮に役立ちますか?
17 c++  coding-style 

4
イベントログメトリックのデータアーキテクチャ?
私のサービスには多数のユーザーイベントが継続しており、「日付D以降のイベントタイプTの発生をカウントする」などの処理を行いたいと考えています。 私たちは2つの基本的な決定をしようとしています: 何を保存しますか?すべてのイベントの保存と集約のみの保存 (イベントログスタイル)すべてのイベントを記録し、後でカウントします。 (時系列スタイル)毎日の単一の集約された「日付DのイベントEのカウント」を保存する データを保存する場所 リレーショナルデータベース(特にMySQL) 非リレーショナル(NoSQL)データベース内 フラットログファイル(ネットワーク経由で集中的に収集されるsyslog-ng) 標準的な慣行とは何ですか/さまざまなタイプのシステムの比較に関する詳細はどこで読むことができますか? 追加の詳細: 合計イベントストリームは大きく、潜在的に1日あたり数十万のエントリ しかし、私たちの現在のニーズは、その中の特定の種類のイベントを数えることだけです 生データや集計結果にリアルタイムでアクセスする必要は必ずしもありません 私見、「すべてのイベントをファイルに記録し、後でクロールしてストリームをフィルタリングおよび集約する」は、かなり標準的なUNIXの方法ですが、私のRails-yの同胞は、MySQLでない限り、現実はないと考えているようです。

7
データベースインデックスに関するベストプラクティス[終了]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 インデックスを使用してデータベースのパフォーマンスを向上させるためのDOとDONTは何ですか? DOは、インデックスを作成する必要がある場合、またはパフォーマンスを改善する別のインデックス関連のヒントです。 DONTは、インデックスを作成する必要がない場合、またはパフォーマンスを損なう可能性のある別のインデックス関連のアクションです。

6
メソッドの署名のすべてのパラメーターにjavadocコメントを書く必要がありますか?
私のチームの開発者の1人は、メソッドの署名のEVERYパラメーターにjavadocコメントを書く必要があると考えています。私はこれが必要だとは思わないし、実際、それは有害でさえあると思う。 まず、パラメーター名は説明的で自己文書化されるべきだと思います。パラメータの目的がすぐに分からない場合は、おそらく間違っています。ただし、パラメータの目的が不明な場合があることは理解しています。そのため、その場合は、パラメータを説明するjavadocコメントを作成する必要があります。 しかし、すべてのパラメーターに対してこれを行う必要はないと思います。パラメータの目的がすでに明らかな場合、javadocコメントは冗長です。あなた自身のために余分な仕事を作成しているだけです。さらに、コードを保守する必要がある人のために余分な作業を作成しています。メソッドは時間とともに変化し、コメントを維持することはコードを維持することとほぼ同じくらい重要です。「XはYをZの理由で行う」などのコメントを何回見て、そのコメントが古いことを確認しましたが、実際にはメソッドはXパラメーターさえも取りません。人々はコメントを更新するのを忘れているので、それは常に起こります。誤解を招くコメントは、まったくコメントしないよりも有害であると主張します。したがって、過剰なコメントの危険性があります。不要なドキュメントを作成することにより、 しかし、私は自分のチームの他の開発者を尊重し、おそらく彼が正しいと私は間違っていることを受け入れます。だからこそ、仲間の開発者に質問を投げかけます。実際、すべてのパラメーターにjavadocコメントを書く必要がありますか?ここでは、コードは会社の内部にあり、外部の第三者によって消費されることはないと想定しています。

4
ファームウェア/組み込みシステムソフトウェアの開発にアジャイル手法を採用する方法は?
アジャイル手法をどのように適用するかは、大規模で複雑な組み込みシステムソフトウェア(100人以上のエンジニア)に本当にあるのかといつも思っていました。ファームウェア開発には、アジャイルを実行するのを難しくするいくつかの独自の特性があります(つまり、ハードウェアは開発サイクルの後半まで利用できません。製品がリリースされると、ファームウェアを簡単に更新できませんなど)。 この種の開発の標準は、厚手のドキュメントと厳しいピアレビューです。2〜3個の署名なしで変数の名前を変更するなどの簡単なコード修正を取得することはできません。(少し誇張しますが、これは典型的なことです。さらに、多くの人がショートカットを採用しており、特に厳しい市場の締め切りに直面して、プロジェクトマネージャーはそれらを承認します。) ファームウェア開発プロジェクトにアジャイル手法を採用する方法に関するヒントやガイドラインを聞きたいです。

2
CQ [R] Sモデルではコマンドをどの程度細かくする必要がありますか?
私は、WCFベースのSOAの一部をサービスバスモデル(おそらくnServiceBus)に移行し、いくつかの基本的なpub-subを使用してCommand-Query Separationを達成するプロジェクトを検討しています。 SOAやサービスバスモデルは初めてではありませんが、最近まで「分離」という概念は、すぐに使えるデータベースミラーリングとレプリケーションに限定されていたことを認めています。それでも、最終的に一貫性のあるシステムのすべての利点を提供する一方で、多くの明らかな欠点(特に、適切なトランザクションサポートの欠如)を回避するように見えるため、私はこのアイデアに魅了されます。 基本的にESBアーキテクチャ(少なくともMicrosoftの世界では)の第一人者であるUdi Dahanの主題について多くのことを読みましたが、彼が言うことの1つは本当に私を困惑させます。 より多くのフィールドを持つより大きなエンティティを取得すると、それらの同じエンティティを操作するアクターも多くなり、特定の時点で何かが何らかの属性に触れる可能性が高くなり、同時実行の競合の数が増加します。 [...] CQRSの中核となる要素は、ユーザーインターフェースの設計を再考して、ユーザーの意図を捉えることができるようにすることです。これにより、ユーザーを優先させることは、ユーザーが移動したことや得たことを示すこととは異なる作業単位であるようになります既婚。上で見たように、データの変更にExcelのようなUIを使用しても意図はキャプチャされません。 - ウディダハン、CQRSを明確化 引用で説明されている観点から、その論理について議論することは困難です。しかし、SOAに関しては穀物に反するようです。SOA(および実際のサービス全般)は、粗雑なメッセージを処理して、ネットワークチャターを最小限に抑えるようになっています -他の多くの利点があります。 優れたメッセージキューイングを備え、RPCの手荷物のない高度に分散されたシステムを使用している場合、ネットワークチャターは問題になりませんが、問題を完全に却下することは賢明ではないようです。Udiは、すべての属性の変更(つまり、フィールドの更新)を独自のコマンドにする必要があるとほとんど言っているようです。これは、従来のウェブサービス。 高度にパラメーター化された適切なクエリ、テーブル値パラメーター、またはステージングテーブルへの一括挿入を行うと、SQL Serverの1つのバッチ更新に数秒の時間がかかる場合があります。これらの更新を一度に1つずつ処理するのは遅く、遅く、遅く、OLTPデータベースハードウェアはスケールアップ/スケールアウトに最もコストがかかります。 これらの競合する懸念を調整する方法はありますか?私はそれについて間違った方法で考えていますか?この問題には、CQS / ESBの世界でよく知られた解決策がありますか? そうでない場合、コマンドの粒度の「適切なレベル」をどのように決定するのでしょうか。出発点として使用できる「データベース」のような3NFのような「標準」があり、慎重なプロファイリングが潜在的に重要なパフォーマンスの利点を示唆する場合にのみ逸脱しますか? または、これはおそらく、さまざまな専門家によっていくつかの強い意見が表明されているにもかかわらず、実際には単なる意見の問題であるものの1つですか?

10
Ruby on Railsは急な学習曲線を持っているはずですか、それとも私だけですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 私は独学のプログラマーです。私は10月からさまざまな強度でRoRを学習しています(一日中、場合によっては数週間何もしません)。それまではJavaだけを知っていましたが、かなりよく知っていました。RoRについての誇大広告や、それがどのようにあなたを幸せにし、生産的にするのか、という話を聞いたことがあります。私はアジャイルの本からそれを学びました。そして、私がJavaScriptとCSSを知らず、データベースとHTMLを少ししか理解していないことに関係しているのではないかと疑っています。しかし、明らかに、アジャイルの本でプロジェクトを完了するのに他の人よりもはるかに長い時間がかかり、今でもあまり覚えていません。Railsには、シンボルを使用するタイミングと使用しないタイミング、動的メソッドがどのように呼び出されるかなど、私が取得できないように見えるものがいくつかあります。 最近、私は小さなRailsの割り当てを受け、そこでインターフェイスに小さな変更を加えるように求められました。約25時間かかりました。コードの理解にはある程度の進歩はありましたが、どうすればよいかわかりません。コンテキストを提供するために提供しなければならないコードが非常に多いため、Stack Overflowを要求することさえできません。 私の質問はタイトルにあります:RoRは学ぶのに長い時間がかかるはずですか、それとも私はただ遅いですか?間違った本から学んでいるということはありますか?私の学習スタイルは、それが理にかなっている場合、何も理解しないか、すべてを理解するようなものです。

6
ブレーク/リターンを使用したForeachループと明示的な不変条件および事後条件を使用したwhileループ
これは、値が配列内にあるかどうかを確認する最も一般的な方法です(私には思えます)。 for (int x : array) { if (x == value) return true; } return false; しかし、私が何年も前におそらくWirthやDijkstraによって読んだ本では、このスタイルのほうが優れていると言われました(中に出口があるwhileループと比較した場合)。 int i = 0; while (i < array.length && array[i] != value) i++; return i < array.length; このように、追加の終了条件はループ不変式の明示的な部分になり、ループ内に隠された条件と終了はありません。すべてがより明確で、構造化プログラミングの方法でより明確になります。私は一般的に、この後者のパターンできるだけ好ましいと使用forからだけ反復する-loopをaしますb。 それでも、最初のバージョンはそれほど明確ではないとは言えません。少なくとも初心者にとっては、さらに明確で理解しやすいかもしれません。だから私はまだどちらが良いのか自分自身に質問していますか? たぶん誰かが方法の1つを支持して良い根拠を与えることができますか? 更新:これは、複数の関数の戻り点、ラムダ、または配列自体の要素の検出の問題ではありません。それは、単一の不等式よりも複雑な不変式を持つループを書く方法についてです。 更新:OK、答えてコメントする人々のポイントがわかります:ここでforeachループをミックスインしました。これは、whileループよりもはるかに明確で読みやすいものです。私はそうするべきではありませんでした。しかし、これも興味深い質問なので、そのままにしておきます。foreach-loopと内部の追加条件、または明示的なループ不変条件とpost-conditionの後のwhileループです。条件と終了/ブレークのあるforeachループが勝っているようです。foreach-loopを使用せずに追加の質問を作成します(リンクリストの場合)。

9
ポリモーフィズムは実際の世界でどのように使用されていますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 昨年は閉店しました。 私は実際のプロジェクトで多態性がどのように使用されているかを理解しようとしていますAnimalが、method を持つ親クラスと、speak()このメソッドをオーバーライドする多くの子クラスを持つ古典的な例(またはそれに似たもの)しか見つけることができません次のように、speak()任意の子オブジェクトでメソッドを呼び出すことができます。 Animal animal; animal = dog; animal.speak(); animal = cat; animal.speak();

3
堅牢性と正確性の競争[終了]
閉じた。この質問には詳細または明確さが必要です。現在、回答を受け付けていません。 この質問を改善したいですか?詳細を追加し、この投稿を編集して問題を明確にします。 昨年は閉店しました。 要件の品質の段落の「コード完了2」を読んで、これを見つけました。 競合する属性間で許容できるトレードオフが指定されていますか(たとえば、堅牢性と正確性の間)。 (上記は要件の品質を確認するための大きなチェックボックスリストのポイントです) そのため、ウェブや学術書などで、堅牢性と正確性に関する多くの定義を見つけました。 例: 「Object Oriented Software Construction、2nd Edition、Bertrand Meyer、Prentice-Hall、1997」の本: 正しさ:システムの仕様、設計、および実装において[欠陥]がない程度。 堅牢性:無効な入力またはストレスの多い環境条件が存在する場合にシステムが機能し続ける度合い。 それにもかかわらず、なぜこの2つが対立するのか、どのような状況にあるのかは明確ではありません。 私の質問は、なぜこれらの2つの属性が競合するのかということです。

3
Mike Poundがコンピューターの計算能力をプロセッサーではなくグラフィックカードで測定するのはなぜですか?
最近、私はマイクパウンドが4枚のグラフィックカード(正確にはTitan Xのカード)を持っている彼の会社のスーパーコンピューターを自慢しているパスワードに関するすばらしいComputerphileビデオを見ました。 数値シミュレーション愛好家として、シミュレーション作業専用のデスクトップを構築することを夢見ています。Mike Poundがコンピューターの計算能力をプロセッサーではなくグラフィックカードで測定するのはなぜですか?コンピューターを構築している場合、どのアイテムをもっと気にする必要がありますか?
17 hardware 

1
APIキーを配置する場所:カスタムHTTPヘッダーとカスタムスキームを使用したAuthorizationヘッダー
APIキーを介した承認/認証を使用してREST APIを設計しています。 最適な場所を見つけようとしましたが、次のようなカスタムHTTPヘッダーの使用を多くの人が提案していることがわかりましたProjectName-Api-Key。 ProjectName-Api-Key: abcde ただしAuthorization、カスタムスキームでヘッダーを使用することも可能です。 Authorization: ApiKey abcde 一方、カスタム認証スキームは、一部のクライアントでは予期せずサポートされず、カスタムコードにつながる可能性があるという考慮事項を見つけました。したがって、クライアントには期待がないため、カスタムヘッダーを使用する方がよいでしょう。 どの方法でAPIキーを送信しますか?

6
実装へのインターフェイス参照をキャストすることで、著者は何を意味しますか?
私は現在C#をマスターしようとしていますが、Gary McLean HallによるC#を介してAdaptive Codeを読んでいます。 彼はパターンとアンチパターンについて書いています。実装とインターフェースの部分で、彼は次のように書いています。 インターフェイスへのプログラミングの概念に慣れていない開発者は、多くの場合、インターフェイスの背後にあるものを手放すのが困難です。 コンパイル時に、インターフェースのクライアントは、使用しているインターフェースの実装を把握していないはずです。このような知識は、クライアントをインターフェイスの特定の実装に結び付ける誤った仮定につながる可能性があります。 クラスが永続ストレージにレコードを保存する必要がある一般的な例を想像してください。そのために、インターフェイスに正しく委任します。これにより、使用される永続的なストレージメカニズムの詳細が隠されます。ただし、実行時にどのインターフェイスの実装が使用されているかについて仮定するのは正しくありません。たとえば、インターフェイス参照を実装にキャストすることは常に悪い考えです。 それは言葉の壁か、私の経験不足かもしれませんが、それが何を意味するのかよくわかりません。ここに私が理解していることがあります: C#を練習するための自由時間の楽しいプロジェクトがあります。そこでクラスがあります: public class SomeClass... このクラスは多くの場所で使用されています。C#を学習しているときに、インターフェイスで抽象化する方がよいことを読んだので、次のようにしました。 public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have. public class SomeClass : ISomeClass <- Same as before. All implementation here. そこで、いくつかのクラス参照をすべて調べて、それらをISomeClassに置き換えました。 私が書いた建設を除いて: ISomeClass myClass …

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