ソフトウェア工学

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

9
一般的に言って、すべての機能部分を作成するか、UIを最初に動作させるのが良いのでしょうか?
一般的に言って、すべての機能部分を作成するか、UIを最初に動作させるのが良いのでしょうか? あなたが大きな何かに取り組んでいると仮定すると、UIの前にすべての機能データ収集ブロブを動作させる、一般的に受け入れられているプラ​​クティス、すべてのUIを一度に1つずつ動作させる、または途中で何かを行うのは一般的ですか? 管理しやすい部分に細分化することは誰もが知っていますが、問題は最終的にはUIが管理可能な部分に含まれるかどうかです。 この例の場合、1つのルートウィンドウを備えたGUIアプリケーションを考えてみましょう。ただし、さまざまなデータコンポーネントを分離するためにさまざまなドックに12個以上のタブがあります。個々のタブには、機能ユニットの観点から、その背後にある比較的複雑な可動部品のセットがあります。 この特定の問題の応用例はあるここに付随ブログやオリジナル商品。

1
go-langs goroutineプールは単なるグリーンスレッドですか?
ここでの解説は、グリーンスレッドの以下の批判を提供しています: 私は当初、コールバック地獄のないイベント駆動型プログラミングの手段としてN:Mモデルで販売されていました。古い手続き型コードのように見えるコードを書くことができますが、その下には、何かがブロックされるたびにユーザースペースのタスク切り替えを使用する魔法があります。いいね。問題は、複雑さをより複雑に解決することになるということです。swapcontext()およびファミリはかなり単純であり、複雑さは他の意図しない場所に由来します。 突然、ユーザー空間のスケジューラーを書くことを余儀なくされ、何年もかけて努力を重ねてきたLinuxのスケジュールよりも良い仕事をするスケジューラーを書くのは本当に難しいと思います。ここで、N個の緑色のスレッドからM個の物理的なスレッドをスケジュールして、同期を心配する必要があります。同期はパフォーマンスの問題を引き起こすため、新しいロックレスウサギの穴を掘って今すぐ始めます。正確で高度な並行スケジューラーを構築するのは簡単なことではありません。 別の批評はここにあります: 複数のスレッドを偽装する単一のプロセスには、多くの問題があります。その1つは、偽のスレッドがすべてページフォールトで停止することです。 私の質問は- されて行く-LANGのゴルーチン(デフォルトプール用)ちょうどグリーンスレッド?もしそうなら-彼らは上記の批判に対処しますか?

2
「時々オフライン」のWebアプリで使用するための一意で安全な識別子を生成するための戦略
ユーザーがオンラインとオフラインの両方で作業できるWebベースのプロジェクトがあり、クライアント側でレコードの一意のIDを生成する方法を探しています。ユーザーがオフライン(つまり、サーバーと通信できない)で機能し、一意であることが保証され、安全なアプローチが必要です。「安全」ということで、クライアントが重複したIDを(悪意のあるかどうかに関係なく)送信し、それによってデータの整合性が破壊されることを特に心配しています。 これがすでに解決された問題であることを願って、私はいくつかのグーグルをしてきました。特に本番システムで使用されているアプローチに関して、非常に決定的なものは見つかりませんでした。ユーザーが作成したデータのみにアクセスするシステムの例をいくつか見つけました(たとえば、複数のデバイスでアクセスするTodoリストですが、作成したユーザーのみがアクセスできます)。残念ながら、もう少し洗練されたものが必要です。私はここでいくつかの本当に良いアイデアを見つけましたが、それは私が物事がうまくいくと思っていた方法と一致しています。 以下は私の提案するソリューションです。 いくつかの要件 IDはグローバルに一意(または、システム内で少なくとも一意)である必要があります クライアント上で生成されます(つまり、ブラウザーのJavaScriptを介して) セキュア(上記およびその他の概要に従って) データは、作成していないユーザーを含む複数のユーザーが表示/編集できます。 バックエンドデータベース(MongoDBやCouchDBなど)に重大なパフォーマンスの問題を引き起こさない 提案されたソリューション ユーザーがアカウントを作成すると、サーバーによって生成され、システム内で一意であることがわかっているuuidが与えられます。このIDは、ユーザー認証トークンと同じであってはなりません。このIDをユーザーの「IDトークン」と呼びましょう。 ユーザーが新しいレコードを作成すると、javascriptに新しいuuidが生成されます(window.cryptoを使用して生成されます(使用可能な場合はこちらを参照)。このIDは、ユーザーがアカウントを作成したときに受け取った「IDトークン」と連結されます。この新しい複合ID(サーバー側IDトークン+クライアント側UUID)は、レコードの一意の識別子になりました。ユーザーがオンラインで、この新しいレコードをバックエンドサーバーに送信すると、サーバーは次のことを行います。 これを「挿入」アクション(更新や削除ではない)として識別します 複合キーの両方の部分が有効なuuidであることを検証します 複合IDの指定された「IDトークン」部分が現在のユーザーに対して正しいことを検証します(つまり、アカウントを作成したときにサーバーがユーザーに割り当てたIDトークンと一致します) すべてがcopaseticである場合、dbにデータを挿入します(id が既に存在する場合、誤って既存のレコードを更新しないように、「upsert」ではなく挿入を行うように注意してください) クエリ、更新、削除には特別なロジックは必要ありません。従来のアプリケーションと同じ方法で、レコードのIDを使用するだけです。 このアプローチの利点は何ですか? クライアントコードはオフラインで新しいデータを作成し、そのレコードのIDをすぐに知ることができます。クライアント上で一時IDが生成され、システムがオンラインのときに「最終」IDに交換される代替アプローチを検討しました。しかし、これは非常に脆い感じがしました。特に、更新が必要な外部キーを使用して子データを作成することを検討し始めたとき。IDが変更されたときに変更されるURLの処理は言うまでもありません。 IDをクライアント生成値とサーバー生成値の複合にすることにより、各ユーザーはサンドボックスにIDを効率的に作成します。これは、悪意のある/悪意のあるクライアントが行うことができる損害を制限することを目的としています。また、idの衝突はユーザーごとに発生し、システム全体にグローバルではありません。 ユーザーIDトークンはアカウントに関連付けられているため、IDは、認証されたクライアント(つまり、ユーザーが正常にログインした場所)によってのみユーザーサンドボックスで生成できます。これは、悪意のあるクライアントがユーザーの不正なIDを作成しないようにすることを目的としています。もちろん、ユーザー認証トークンが悪意のあるクライアントに盗まれた場合、悪いことをする可能性があります。しかし、認証トークンが盗まれると、アカウントはとにかく危険にさらされます。これが発生した場合、被害はシステム全体ではなく、侵害されたアカウントに限定されます。 懸念事項 このアプローチに関する私の懸念のいくつかを以下に示します これにより、大規模なアプリケーションに対して十分に一意のIDが生成されますか?これがIDの衝突を引き起こすと考える理由はありますか?javascriptはこれが機能するために十分にランダムなUUIDを生成できますか?window.cryptoはかなり広く利用可能であり、このプロジェクトはすでに合理的な最新のブラウザを必要としているようです。(この質問には、独自のSO質問があります) 悪意のあるユーザーがシステムを危険にさらす可能性のある抜け穴がありますか? 2つのuuidで構成される複合キーを照会するときに、DBのパフォーマンスを心配する理由はありますか。最高のパフォーマンスを得るには、このIDをどのように保存する必要がありますか?2つの別々のフィールドまたは単一のオブジェクトフィールド?Mongo対Couchに異なる「最良の」アプローチはありますか?連続していない主キーがあると、挿入時に顕著なパフォーマンスの問題が発生することがあります。主キーに自動生成された値を持ち、このIDを別のフィールドとして保存する方が賢明でしょうか?(この質問には、独自のSO質問があります) この戦略を使用すると、特定のレコードセットが同じユーザーによって作成されたことを簡単に判断できます(すべてのユーザーが同じ公開IDトークンを共有するため)。これに関する差し迫った問題はありませんが、必要以上に内部の詳細についての情報を漏らさない方が良いです。別の可能性は、複合キーをハッシュすることですが、それはそれが価値があるよりももっと面倒かもしれません。 ユーザーのID衝突が発生した場合、回復する簡単な方法はありません。クライアントは新しいIDを生成できたと思いますが、これは実際には発生しないはずのエッジケースでは多くの作業のようです。私はこれを未解決のままにするつもりです。 認証されたユーザーのみがデータを表示および/または編集できます。これは私のシステムにとって許容できる制限です。 結論 合理的な計画を超えていますか?この一部は、問題のアプリケーションの完全な理解に基づいた判断の呼び出しに帰着することを理解しています。

5
すでに統合テストがある場合、ユニットテストが必要ですか?
私のプログラムの統合テストがすでにあり、それらすべてが合格した場合、それはうまくいくと感じています。次に、単体テストを作成/追加する理由は何ですか?とにかく統合テストを書く必要があるので、統合テストでカバーされていない部品の単体テストのみを書きたいと思います。 統合テストよりも単体テストの利点を知っているのは 小さく、したがって高速に実行できます(ただし、テストに新しいユニットを追加すると、統合テストで既にテストされているため、テストスーツ全体が大きくなり、実行時間が長くなります) 1つのことしかテストしないため、バグを見つけやすくなります(ただし、統合テストが失敗した場合は、個々のパーツを検証するために単体テストの書き込みを開始できます) 統合テストで検出されない可能性のあるバグを見つけます。たとえば、マスキング/オフセットのバグ。(ただし、統合がすべてのパスをテストする場合、プログラムは隠れたバグが存在する場合でも動作します。したがって、将来の統合テストを中断したり、パフォーマンスの問題を引き起こさない限り、これらのバグを見つける/修正することは優先度が高くありません) そして、私たちは常により少ないコードを書きたいのですが、単体テストを書くにはもっと多くのコードが必要です(主にモックオブジェクトをセットアップします)。単体テストと統合テストのいくつかの違いは、単体テストではモックオブジェクトを使用し、統合テストでは実際のオブジェクトを使用することです。重複が多く、コードの動作を変更するためのオーバーヘッドが追加されるため、テストでもコードの複製は好きではありません(リファクタリングツールは常にすべての作業を行うことはできません)。

2
Gitでの変更(挿入と削除)の要約[終了]
私のコードベースが時間とともにどのように成長したかを見てみたい。GitHubには、+/-チェックインのリストに沿って、この感覚を示す素晴らしい表示があります。Google Codeでホストされているレポまたはオフラインで使用できる類似のものはありますか?
47 git 

1
なぜ.Netの世界は、静的に型付けされた代替の代わりに魔法の文字列を受け入れるように見えるのですか?
だから、私は.Netで働いています。.Netでオープンソースプロジェクトを作成します。それに関する私の最大の問題の1つは、.Netではなく、その周辺のコミュニティとフレームワークに必要なことです。魔法のネーミングスキームと文字列は、すべてを行うための最良の方法として扱われているようです。大胆な発言ですが、見てください: ASP.Net MVC: Hello world route: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); これが意味することは、ASP.Net MVCが何らかの形でHomeControllerコードを検索するということです。どういうわけか、それの新しいインスタンスを作成してから、Index 明らかidに何らかのパラメーターで関数を呼び出します。そして、次のようなものがあります: RenderView("Categories", categories); ...or.. ViewData["Foobar"]="meh"; そして、XAMLにも同様のことがあります。DataContextオブジェクトとして扱われ、希望するタイプに解決されることを期待し、祈らなければなりません。DependencyPropertiesは、マジックストリングとマジックネーミング規則を使用する必要があります。そして、このようなもの: MyData myDataObject = new MyData(DateTime.Now); Binding myBinding = new Binding("MyDataProperty"); …

8
型システムの安全上の利点は何ですか?
JavaScriptを:良い部品ダグラス・クロックフォードによると、彼は彼の継承の章に言及し、 古典的な継承のもう1つの利点は、型システムの仕様が含まれることです。これにより、プログラマは明示的なキャスト操作を記述する必要がなくなります。これは、キャスト時に型システムの安全性の利点が失われるため、非常に良いことです。 それではまず、実際に安全とは何ですか?データ破損、ハッカー、システムの誤動作などに対する保護 型システムの安全上の利点は何ですか?これらの安全性の利点を提供できるように、型システムの違いは何ですか?

14
業界のドキュメントに対する嫌悪感は何ですか?
最も基本的なドキュメントでさえも書くことに嫌悪感があるようです。プロジェクトのREADMEは比較的むき出しです。ドキュメントには依存関係の更新されたリストさえありません。 プログラマーがドキュメンテーションを書くことを嫌うような業界で私が知らないことはありますか?必要に応じてドキュメントの段落を入力できますが、なぜ他の人はそれを嫌うのですか? さらに重要なことは、ドキュメントを書くことで将来の時間とフラストレーションを節約できることを彼らに納得させるにはどうすればよいでしょうか?

3
コンストラクター注入とは何ですか?
(サービスロケーター)デザインパターンに関する記事を読みながら、コンストラクター注入と依存性注入という用語を見てきました。 コンストラクターインジェクションについてGoogleで検索した結果、結果が不明確だったため、ここでチェックインする必要がありました。 コンストラクター注入とは何ですか?これは特定の種類の依存性注入ですか?規範的な例は大きな助けになるでしょう! 編集 1週間のギャップの後にこの質問を再訪すると、私がどれほど失われたかを見ることができます。コメント/修正してください。 コンストラクター注入とプロパティ注入は、依存性注入の2つのタイプです。

3
CおよびC ++を使用したAndroid開発[終了]
私はC、C ++開発者です。モバイル開発に興味があります。CとC ++を使用してAndroidアプリを開発する方法を知りたいのですが、C、C ++開発者向けのキットを提供しているが、Javaキットのすべての機能を備えているわけではないことを読みました。C / C ++開発キットに行くべきですか、それとも将来すべての機能を提供しないかもしれないので、Javaを学ぶほうがよいでしょうか?
47 c++  c  android 

5
Haskellに欠点や問題はありますか?
次の(比較的些細な)個人プロジェクトのためにHaskellに飛び込むことを検討しています。Haskellに取り組んでいる理由は次のとおりです。 純粋に機能的な言語に頭を悩ます 速度。これは議論の余地があると確信していますが、私はHaskellがC ++に近い(そしてErlangよりもかなり高速であるように見える)ことをプロファイリングしています。 速度。Warp Webサーバーは、他のほとんどすべてと比較して非常に高速です。 したがって、これを考えると、私が探しているのは、Haskellに付随する欠点または問題です。WebにはHaskellが良いものである理由に関する膨大な情報がありますが、そのい側面に関するトピックはあまり見当たりません(構文についての不満はまったく気にしません)。 私が探しているものの例は、PythonのGILのようなものです。CPython環境で並行性の使用を実際に検討し始めるまで、頭を悩ませなかった何か。
47 haskell 

4
コードの難読化のケース?
コードを開発する人々にとっての実際の利益と、そのコードを実行するビジネスの観点から、難読化されたコードを書く主な理由は何ですか(問題のコードが実際に商用コードである場合)?難読化が悪い場合よりも良い場合を説明する文書化されたケース(ある場所でオンラインで入手可能)はありますか?たとえば、難読化が悪意のある第三者によるコードの取得を有意に遅らせることが証明されている有名な例はありますか?あなたの車の窓を丸めても人々がそれらを壊してステレオを盗むのを止めないように、コードを難読化することは正直な人々を正直に保つだけです。 ========= バックグラウンド: これは、このトピックに関する私の仮定に意図的に挑戦する試みです。 私は一般的にコードの難読化を使用することに反対していますが、何かが足りない場合は興味があります。JavaScriptのような場合、ミニフィケーションが物事をより速く、すべてロードするのに役立つ理由がわかります(そこには実際の機能上の利点があります)が、コードの難読化が障害となる目的で単一の理由を考え出すことはできないようですコード/アルゴリズムのセクションが何をするかを発見することは、実際にはどんな目的にも効果的です。 オープンソースが非常に人気があるので、質問は「コードを共有するのか、それともプロプライエタリのままにするのか?」商用コードに関しては、なぜすべてを共有できないのか、そして盗難と戦うための法律があなたの側にあるのは理解できます。 ところで、誰かが難読化されたコードを書いている理由は、「雇用保障」であるならば、私はすべてのプログラマを解雇でしょうが一貫してあることが判明し、意図的に難読化を使用して、自分の仕事を維持するために助ける唯一の目的と、彼らは合理的に、それはいくつかを持っていたことを示すことができない限り、ビジネス上の利益。それは非常に完全に反チーム的であり、ばかげており、見当違いのプラクティスを通じて仕事を続け、素晴らしいソフトウェアを書いているのでそれを維持することにもっと関心がある人を指します。 人々がふつう冗談を言っていることに気づいている間、私はこの特定のケースに言及するだけです。

4
#include <iostream.h>が悪いのはなぜですか?
私は別のスレッドを読んでいたが、ある男が初心者向けにC ++の本について尋ね、プログラマーの一人がこれを書いた。 いくつかの警告:「hello world」を示すすべての本を避ける #include &lt;iostream.h&gt; C ++ブックを開いて、上記の例のようなiostreamヘッダーが含まれていることを確認しました。 なぜそれが悪いのですか?C ++を学習するとき、他にどのような留意点がありますか? 背景:私はCに精通しており、次の学期にC ++を学び始めます。

3
クラスベースのOOPよりもプロトタイプベースのOOPの利点は何ですか?
主にクラスベースの言語のコンテキストでOOPを扱った後にJavascriptのプログラミングを始めたとき、プロトタイプベースのOOPがクラスベースのOOPよりも優先される理由について混乱していました。 プロトタイプベースのOOPを使用する場合、構造的な利点はありますか?(たとえば、特定のアプリケーションでより高速であるか、メモリ集約度が低いと予想されますか?) コーダーの観点からの利点は何ですか?(たとえば、特定のアプリケーションをコーディングしたり、プロトタイピングを使用して他の人のコードを拡張したりするのは簡単ですか?) この質問を特にJavascriptに関する質問と見なさないでください(長年にわたってプロトタイプ作成とはまったく関係のない多くの欠点がありました)。代わりに、プロトタイピングとクラスの理論的な利点のコンテキストで見てください。 ありがとうございました。

9
真に乱数を生成することが不可能なのはなぜですか?
私は、100万個の乱数を生成する必要がある趣味の問題を解決しようとしていました。しかし、私はすぐに気付きました、それらをユニークにするのは難しくなっています。乱数生成について読むために、アルゴリズム設計マニュアルを取り上げました。 次の段落があり、私には完全に理解できません。 残念ながら、乱数の生成は実際よりもずっと簡単に見えます。実際、決定論的なデバイスで真に乱数を生成することは基本的に不可能です。フォン・ノイマン[Neu63]は、「ランダムな数字を生成する算術的方法を検討する人は、もちろん罪の状態にあります。」と言っています。ランダムに生成された場合。 決定論的なデバイスで真の乱数を生成することが不可能なのはなぜですか?この文はどういう意味ですか?

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