ソフトウェア工学

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

2
高速タグ検索のアルゴリズム
問題は次のとおりです。 単純なエンティティEのセットがあり、各エンティティにはタグTのセットが添付されています。各エンティティには、任意の数のタグを付けることができます。エンティティの総数は1億に近く、タグの総数は約5000です。 したがって、初期データは次のようになります。 E1 - T1, T2, T3, ... Tn E2 - T1, T5, T100, ... Tk .. Ez - T10, T12, ... Tl この初期データが更新されることはほとんどありません。 どういうわけか、私のアプリは次のようなタグで論理式を生成します。 T1&T2&T3 | (T5&!T6) 私がする必要があるのは、与えられた表現に一致するエンティティの数を計算することです(注-エンティティではなく、単に数)。もちろん、これは完全に正確ではありません。 私が今持っているのは、単一のスレッドで5〜10秒の実行時間を与える単純なメモリ内テーブル検索です。 私は興味がありますが、このようなものを処理する効率的な方法はありますか?どのアプローチをお勧めしますか?このための一般的なアルゴリズムやデータ構造はありますか? 更新 要求に応じて少し説明します。 Tオブジェクトは実際には比較的短い定数文字列です。しかし、実際には問題ではありません-常にいくつかのIDを割り当てて整数を操作できます。 間違いなくソートできます。

4
開発者が製品の所有者に機能のアイデアを提案するのは普通ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 かなり最近、開発者として働き始め、以前はシステム管理者として働いていました。 アジャイル機能を使用するソフトウェア開発チームの私の理解は、「実装する必要がある」コミュニケーションは、製品の所有者から開発者への一方向でほとんど発生するということです。開発者は、技術的負債について製品所有者に懸念を表明することができますが、機能のアイデアを思い付くことは、主な責任の1つではありません。 私が働いている会社は別の見方をしています。開発者は、自分のチームの製品所有者に行って機能のアイデアを提案するだけでなく、他のチームの製品所有者にそのチームの製品に貢献する何かがあると思われる場合は行ってください。アイデアは、私たちはすべて1つの大きなチーム<会社名>であり、すべての開発者は、自分の専門知識を使用して、役立つと思われる機能をプッシュする必要があるということです。 より良い言葉がないため、そのようなアプローチは「通常」ですか?私は消極的すぎますか?イニシアチブを取り、製品所有者にアイデアを押し出すべきですか?逆に、会社はそれを完全に間違ってしまったので、他の場所で雇用を探すべきですか?

2
ステートフルライブラリ上の副作用のないインターフェイス
でジョン・ヒューズとのインタビュー彼はアーランとHaskellの語る、彼はErlangでステートフルなライブラリを使用することについて言うために、以下があります。 ステートフルライブラリを使用する場合は、通常、その上に副作用のないインターフェイスを構築し、残りのコードで安全に使用できるようにします。 これはどういう意味ですか?私はこれがどのように見えるかの例を考えようとしていますが、私の想像力や知識は私に失敗しています。

4
コンパイラ[関連]の仕事を募集するのがなぜそんなに難しいのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 先週、数人の大学生と私は、3つの主要な大学(2つは米国、1つは英国)でのキャリアフェアに参加しました。そこでは、インターンシップから私たちのチームにとっては、初級から上級までです。 驚いたことに、話をした学生の80%が、「Ansroidアプリを構築したい」という一連の質問に、彼らが何に興味を持っているのかと尋ねると答えました。(そして、他の20%?「iPhoneアプリ」!)一部の人は、「コンパイラをビルドしたくない、...、それは退屈だ」と公言しさえしました。彼らは言って、私は引用した。 それでは、最近の(若い?)「開発者」にとても魅力的なモバイルアプリについてはどうでしょうか。そして、同じ理由で、コンパイラーはなぜ彼らにとって「退屈な」トピックなのでしょうか?(私はこれら2つが相互に排他的であるとは限りません。1つは確かに携帯電話用のコンパイラを構築できますが、それはポイントの横にあります) より多くの才能、または単に興味のある候補者を引き付けるために、もしあれば、私たちは何ができますか?

8
一般的なコードレビュープロセスとは何ですか?
私の会社は最近、正式なコードレビューを開始しました。プロセスは次のようになります:githubに送信し、プルリクエストを要求し、約3人がコードをレビューし、すべてのパスが完了したらコードを入力します。 このプロセスは公平に思えますが、コードレビューを行う3人は公平ではないようです。レビューのためにコードを挿入すると、100〜200のコメントが表示されます。私にとって一番の数は一度300コメントでした。もちろん大きな変更だと思うでしょうが、これは50行未満のコード(ユニットテストを含む)でも非常に小さな変更になる可能性があります。すべてのコメントは「やらなければならない」と見なされ、議論はありません。 それを念頭に置いて、ここでの私の主な問題は、それが少し過剰に見えることです。私はグループと話をしましたが、彼らは基本的に、PHPで長年開発してきたからといって、「開発者」であるという意味ではないと言っていました。もちろん、これはそうでないことよりも痛いようです。また、グループ内ではあまりコメントを生成していないようであり、ほとんどの場合、他のコメントや提案を無視したり、無視したりします。 私の質問は、これが公平かどうかです。それとも普通ですか?

1
訪問者パターンを理解する
GUIコントロールを表すクラスの階層があります。このようなもの: Control->ContainerControl->Form さまざまなことを行うオブジェクトで動作する一連のアルゴリズムを実装する必要があり、Visitorパターンが最もクリーンなソリューションになると考えています。たとえば、オブジェクトの階層のXML表現を作成するアルゴリズムを考えてみましょう。「クラシック」アプローチを使用して、私はこれを行います: public abstract class Control { public virtual XmlElement ToXML(XmlDocument document) { XmlElement xml = document.CreateElement(this.GetType().Name); // Create element, fill it with attributes declared with control return xml; } } public abstract class ContainerControl : Control { public override XmlElement ToXML(XmlDocument document) { XmlElement xml = base.ToXML(document); // …

2
典型的な最新のマイクロプロセッサパイプラインの長さは?
私はパイプライン処理についてある程度学びましたが、それらは4ステージと5ステージであり、現代の典型的なパイプライン処理は実際にははるかに長く複雑です。典型的なパイプラインはどれくらい長く、どれだけ長くなると予想できますか?また、長いパイプラインのパフォーマンス向上で利益が減少するポイントはどこですか?

1
機能性中間体の欠点
JavaScriptに似た言語のオプティマイザーを作成しているため、中間コード表現を選択する必要があります。最近の明らか/典型的な選択は、静的単一割り当て(SSA)です。 ただし、CのModern Compiler Implementationは、機能的な中間形式についても説明します。これは基本的に、中間表現の純粋な機能を実現することを意味します(ローカル変数のみについては純粋で、ヒープデータはCPSではなく、変更可能であり、単純なletブロックおよびテールコールのみです)。推論しやすいという点でいくつかの利点があります。 おそらくそれは簡単ではないか、誰もがすでにそのような表現を使用しているので、私の質問は、機能的な中間形式がSSAと比較してどのような不利な点ですか?

3
ジェネリックはどのように実装されますか?
これは、コンパイラ内部の観点からの質問です。 テンプレート(C ++)ではなくジェネリックに興味があるため、質問にC#を付けました。なぜなら、両言語のジェネリックは実装が異なるためです。 ジェネリックなしの言語を見ると、非常に簡単です。クラス定義を検証し、階層に追加するだけです。 しかし、ジェネリッククラスをどうするか、さらに重要なことには、それへの参照をどのように処理するのでしょうか?インスタンス化ごとに静的フィールドが特異であることを確認する方法(つまり、ジェネリックパラメーターが解決されるたびに)。 私は電話を見たとしましょう: var x = new Foo<Bar>(); Foo_Bar階層に新しいクラスを追加しますか? 更新:これまでのところ、関連する投稿は2つしか見つかりませんでしたが、「自分でどうやってやるのか」という意味ではあまり詳しくありません。 http://www.jprl.com/Blog/archive/development/2007/Aug-31.html http://www.artima.com/intv/generics2.html
16 c#  generics 

3
Prologでルールエンジンが作成されないのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 私がPrologで見たことから、アプリのルールエンジンを作成するのに理想的であるように思えます。それでも、Prologで記述されたルールエンジンを見たことはありません。Prologには、ルールエンジンの構築に使用できないような固有の制限(ガベージコレクションアルゴリズムなど)がありますか?

2
DDDバウンドコンテキストとドメイン?
私は、数十のデータベーステーブル(集計、エンティティ/値オブジェクト)を使用する比較的複雑なアプリケーションで作業し、DDDを適用しています。この時点では、基本的にDDD-Liteのように見えます。つまり、アプリケーション/ドメインサービス、ドメインモデル(エンティティ、値オブジェクト)、およびリポジトリがあります。 私はDDDの実装という本を取り上げましたが、彼が最初に言及しているのは、DDDを開始するときによくある最初のミスとして、DDD-Liteおよびバウンドコンテキストとドメインイベントが欠落していることです。 現在、集計リレーションシップによってドメインモデルを整理し、ネームスペースを使用してそれを実証しようとしました。 ドメインモデルプロジェクトを個別のバウンドコンテキストに(まだ)分離することに関連する利点/欠点が見当たりません。おそらくそれは後で明らかになるかもしれませんが、バウンドコンテキスト(およびサブドメインなどが結び付けられている場合は、サブドメインなど)に関する実際のフィードバックをお願いします。

2
HTTPサーバーの作成方法
タイトルにあるように、HTTPサーバーを作成したいと思います。私の質問はこれですが、どうすればいいですか?これは非常に一般的で「高レベル」に聞こえますが、私の狂気には方法があります。この質問に対する答えは、言語にとらわれないようにすべきです。つまり、使用する言語(C、C ++、Javaなど)に関係なく、答えは同じでなければなりません。これがどのように機能するかについての一般的な考えがあります: ポート80でソケットを開きます。 クライアントがリクエストを行うのを待ちます。 リクエストを読みます(つまり、この人は「contact-us.html」ページを望んでいます)。 「contact-us.html」を見つけて読んでください。 htmlヘッダーを送信してから、「contact-us.html」のコンテンツを送信します 完了 私が言ったように、私はこれがプロセスであると信じます、しかし、私は100%確信がありません。これは私の質問の中心に私を導きます。人はこの情報をどのように、またはどこで見つけますか? HTTPサーバーだけを作成したくない場合、FTPサーバー、チャットサーバー、画像ビューアーなどを作成したい場合はどうなりますか?作業中のHTTPサーバーを作成するために必要な正確な手順/プロセスをどのようにして見つけるのですか? 同僚がhtmlヘッダーについて教えてくれたので、彼がいなければこれを知ることはなかったでしょう。彼はまた、各リクエストを新しいスレッドに渡すことについても述べました。物事の仕組みに関する大きな本はありますか?HTTPサーバーになるために必要なマニュアルはありますか? 「HTTPサーバーはどのように機能するか」をグーグルで試しましたが、見つけられる唯一の答えは、HTTPサーバーをプログラミングしたい人ではなく、平均的なJoeを対象としたものでした。

5
「チーム全体」のC ++機能
C ++では、例外などの機能はプログラム全体に影響します。プログラム全体でそれらを無効にするか、コード全体でそれらを処理する必要があります。有名な C ++報告書上の記事は、それを置きます: 直感に反して、コーディング例外の難しい部分は、明示的なスローとキャッチではありません。例外を使用することの本当に難しい部分は、任意の例外がスローサイトからハンドラーに伝播できるようにすべての介在コードを記述し、プログラムの他の部分を損傷することなく安全に到着することです。 さえがあるのでnew、例外をスローし、すべての機能が提供する必要がある基本的な例外安全性を - -それは唯一の例外をスローしない保証機能を呼び出しますしない限り、あなた無効に例外がない限り、完全にあなたの全体のプロジェクトでは。 したがって、例外は「プログラム全体」または「チーム全体」の機能です。それらは、それらを使用するチームの全員が理解する必要があるためです。しかし、私が知っている限り、すべてのC ++機能がそのようになっているわけではありません。 考えられる例は、テンプレートを取得していないが、使用していない場合でも、正しいC ++を作成できるかどうかということです。sort整数の配列を呼び出して、その驚くべき速度の利点を楽しむこともできます。Cのqsort(関数ポインターが呼び出されないため)バグを危険にさらすことなく、またはそうしませんか?テンプレートは「チーム全体」ではないようです。 コードを直接使用しないコードに影響を与え、したがって「チーム全体」である他のC ++機能はありますか?Cにはない機能に特に興味があります。 更新:私は特に、あなたがそれらに気づく必要がある言語強制サインがない機能を探しています。私が得た最初の答えはconst-correctnessであり、これもチーム全体であるため、誰もがそれについて学ぶ必要があります。ただし、AFAICSは、マークされた関数を呼び出した場合にのみ影響を与えconst、コンパイラは非constオブジェクトでの呼び出しを禁止するため、Googleに何かを提供します。例外を除いて、あなたはそれを得ることさえしません。さらに、を使用するとすぐに常に使用されるためnew、例外はより「邪魔」になります。ただし、これを客観的に表現することはできないため、チーム全体の機能に感謝します。 更新2:C ++機能の代わりに、大量のメインストリームプログラミング言語に適用されるマルチスレッドのようなものを除外するために、「C ++固有の機能」のようなものを書くべきでした。 付録:この質問が客観的である理由(疑問がある場合) C ++は複雑な言語であるため、多くのプロジェクトまたはコーディングガイドは「単純な」C ++機能を選択しようとし、多くの人々は主に主観的な基準に従って一部の機能を含めるか除外しようとします。それについての質問は、ここSOで定期的に閉じられます。 上記の代わりに、「可能な限り正確に」「全チーム」言語機能とは何かを定義し、C ++に関する文献の広範な裏付け証拠とともに例(例外)を提供し、C ++でチーム全体の機能を要求します。例外を超えて。 「チーム全体」の機能を使用するか、それが関連する概念であるかは主観的かもしれませんが、それはこの質問の重要性がいつものように主観的であることを意味します。

4
概念的には、ゲームのルール/制約(グラフィックス/物理学ではない)エンジンをどのように作成するか
自分で選んだアドベンチャーの本に似たシンプルなゲームを作りたい。プレイヤーには物語のテキストが表示され、可能性のリストからアクションを選択できます。これは、新しい物語のテキスト、広告無限につながります。唯一の問題は、以前の決定に応じて、可能性のリストが異なる可能性があることです。 一見すると、これは大量のif-elseステートメントのように聞こえるので、ルールエンジンが適切に機能することを意味します。しかし、それは私にとって有限状態マシンのようにも聞こえます。 これをJavaまたはGroovyで記述しようとしています。私は現在、概念的な問題、つまりこれを広範なレベルでどのように行うべきか(とにかく人々はチェスやカードゲームをどのように実装するのでしょうか)に興味がありますが、特定のライブラリに関するアドバイスも歓迎します。 明らかに、タイトルの「ゲームエンジン」は、衝突検出やその他の物理/グラフィックメカニクスを指すのではなく、プレイヤーが状況と彼の現在の状態に与えたオプションを決定するロジックです。

2
オープンソースソフトウェアがクローズドソースソフトウェアに変わることの影響は何ですか?
企業が許可されたライセンスのオープンソースアプリケーションを取得し、アプリケーションの広範な部分を修正し、新しい機能を追加し、バグ修正を適用することにより、それからクローズドソースアプリケーションを開発した場合... ライセンス要件を無視しています... 移行はどのように行われ、異なるライセンスを選択する以外にそれを防ぐために何ができますか? 会社の(倫理的または社会的)責任は何ですか?(例:オープンソースプロジェクトに戻ることは倫理的なことです) オープンソースバージョンとクローズドソースバージョンの両方が利用可能な場合、競合はどの製品に影響しますか? 過去にこれを(成功または失敗のいずれかで)行った企業または製品の例はありますか?これらのプロジェクトに対するコミュニティの態度はどうでしたか?

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