ソフトウェア工学

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

2
APIを介したドメインモデルの公開
作業しているWebベースのアプリケーション用のシンプルなRESTful APIを構築しています。ドメインモデルを公開するための最良の方法について考えています。 Userクラスがあり、JSONレスポンスにさまざまなユーザープロパティを提供したいとします。セキュリティと帯域幅の問題のため、モデルのすべてのプロパティ(DateCreated、PasswordHashなど)を公開したくないのは明らかです。 私はデータ転送オブジェクトを読みましたが、これが進むべき道かどうか疑問に思っています。私が正しい場合、たとえば、ユーザーモデルをユーザーDTOに渡し、そのDTOが選択したユーザープロパティの公開のみを許可することを確認できます(これは、モデルをパブリックAPIから分離するのにも役立ちます)。 この解決策は適切ですか、またはこれについてより良い方法がありますか? ありがとう。

3
テストファイルをソース管理に保存する必要がありますか?
維持する必要のある(大きな)テストファイルがいくつかあります。これは、彼らの歴史へのアクセスが要件であることを意味します。 利点 新しい開発者は、だけでテストスイート全体を入手できgit pullます。 ファイルの履歴がバックアップされます。 ファイル自体がバックアップされます。 欠点 リポジトリのサイズが大幅に増加しました。 リポジトリをコピーする新しい開発者のダウンロードサイズが大幅に増加します。 テストファイルを維持するためのベストプラクティスは何ですか? これらのファイルをソース管理に保存しますか?代替案はありますか?

3
ブートローダーなしでブートローダーを書く
正直な答えが本当に見つからないという質問があります。ステップバイステップのチュートリアルを求めているのではなく、何をするつもりでもないということから始めましょう。気になるだけです。 私はオペレーティングシステムの開発と、それらが最初からどのように構築されるかについて、一日中読んでいます。私はその理論をかなりしっかりと把握しています。しかし、答えを見つけることができないように思えるステップが1つあります。 完全なツールが満載のオペレーティングシステムが存在する前に、ブートローダーなどのブートローダーを持たないコンピューター用の単純なブートローダーをブートセクターに作成するにはどうすればよいでしょうか。最小限のコンピュータを購入した後の最初のステップは何ですか?(つまり、画面、キーボード、プロセッサ、RAM、HDD、フロッピー)

2
Javascriptでのドメインモデルの実践(フレームワークを使用)
これは私がしばらく行ったり来たりして検索して何も見つかりませんでした質問です:バックボーンのようなフレームワークを使用しているときに、Webアプリケーション用のJavascriptでドメインモデルを複製することに関して受け入れられているプラ​​クティスは何ですか?またはノックアウト? サーバー側に一連のドメインモデルを持つ重要なサイズのWebアプリケーションがある場合、これらのモデルをWebアプリケーションに複製する必要がありますか(下部の例を参照)。または、動的な性質を使用してこれらのモデルをサーバーからロードする必要がありますか? 私の考えでは、モデルを複製するための議論は、フィールドの検証を容易にし、存在すると予想されるフィールドが実際に存在することを保証することなどです。私のアプローチは、クライアント側のコードをほとんど別のアプリケーションのように扱い、些細なことをすることですそれ自体、データと複雑な操作(クライアント側にはないデータを必要とする)をサーバーに依存しています。クライアント側のコードをこのように扱うことは、ORMのエンティティとUIレイヤーのビューで使用されるモデルを分離することに似ていると思います。それらは同じフィールドを持ち、同じドメインの概念に関連しているかもしれませんが、それらは別個です事。 一方、サーバー側でこれらのモデルを複製することは、DRYの明らかな違反であり、クライアント側とサーバー側で異なる結果をもたらす可能性があるように思えます(一方が更新されても、もう一方は更新されません) )。このDRYの違反を回避するには、JavaScriptのダイナミズムを使用して、必要なときにサーバーからフィールド名とデータを取得します。 それで、これらの状況で自分自身をいつ繰り返すか(そうでない場合)について、認められたガイドラインはありますか?または、これはプロジェクトと開発者に基づいた純粋に主観的なものですか? 例 サーバー側モデル class M { int A DateTime B int C int D = (A*C) double SomeComplexCalculation = ServiceLayer.Call(); } クライアント側モデル function M(){ this.A = ko.observable(); this.B = ko.observable(); this.C = ko.observable(); this.D = function() { return A() * C(); } this.SomeComplexCalculation = ko.observalbe(); …

4
C#デリゲートは不変ですが、なぜそれが重要なのですか?
これは、この他の質問のフォローアップ質問です。 バックグラウンド MSDNデリゲートチュートリアル(C#)から作業すると、次のようになります。 デリゲートが作成されると、関連付けられているメソッドは変更されないことに注意してください。デリゲートオブジェクトは不変です。 そして、コードサンプルでこれを確認します(コード全体を少し広げます)。 public delegate void ProcessBookDelegate(Book book); bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle)); bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal)); 質問 ここで明らかに、ここでのコードの記述方法により、プロセスごとに新しいデリゲートが作成されます。私は推測あなたのようなものを行うためにしようと不変性が関連しています ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle); ProcessBookDelegate thisIsATest = new ProcessBookDelegate(totaller.AddBookToTotal); thisIsATest不変であるときにどれをコンパイルする必要がありますか?では、Microsoftを不変にすることでどのような問題を解決したのでしょうか。C#6がデリゲートを変更可能にした場合、どのような問題が発生しますか? 編集 私は不変性がこれを防ぐと信じています: ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle); thisIsATest.ChangeTheDelegateInABadFashion(); someFunction(thisIsATest); //This function works as normal //because the delegate is unchanged //due to immutability しかし、不変性はこれを防止しません: …

1
BDDを使用してコンパイラを単体テストする方法
私のチームは、IDEに統合されるドメイン固有言語(DSL)のコンパイラを作成しています。現在、私たちはコンパイラーの分析フェーズに集中しています。リアルタイムのパフォーマンスと非常に詳細なエラー/警告/メッセージ情報が必要なため、既存のパーサージェネレーター(ANTLRなど)は使用していません。我々は持っています 各クラスは、言語の具体的な構文ツリーのノードを表します。 各ノードの注釈として機能するクラス(つまり、エラーや追加情報)、および 具体的な構文ツリー(つまり、レクサー、パーサー、文字列のキャッシュ、構文ビジター)を構築および操作する内部クラス。 テストを整理するための全体的な戦略を決定しようとしています。当社は、行動主導型開発(BDD)とドメイン主導型設計(DDD)を推進しています。弊社のドメイン用にDSLを構築していますが、コンパイラのドメインはプログラミング言語です。 私たちはまだコンパイラーを構築中であり、すでにいくつかのテストを行っています。100%ステートメントカバレッジを目指しています。 現在、構文ツリービルダーにソースコードを入力し、結果の構文ツリーのすべてのノードの各プロパティで検証を実行して、期待される情報(行番号、関連するエラー、子/親トークン、トークンの幅、トークンのタイプなど)。ここで、各ノードは独自のクラスであり、ノードに添付された特定の注釈とエラーは個別のクラスであるため、このテストは多くのクラスを参照することになります。 現在、入力(文字列)と出力(トークンのリスト)を他のクラス(構文ツリーのノードのクラスなど)から分離できるレクサーなどの特定のクラスのテストがあります。これらのテストはより詳細です。 これで、すぐ上の段落のテストを、テスト中のクラス(レクサー、文字列キャッシュなど)に対応させることができます。ただし、上記の2番目の段落のテストは、コンパイラーの分析フェーズ全体を実際にテストします。つまり、入力ソースコードが与えられている場合、各テストは構文ツリーに対して300以上のアサーションを持つことができます。テストは、分析フェーズの動作のためのものです。 これは適切なテスト戦略ですか?そうでない場合、私たちは何を別の方法で行うべきですか?テストにはどのような組織戦略を使用する必要がありますか?

2
1人の開発者が選択する必要のあるプロジェクト会議の構造は何ですか?
私は約3人の他の人(開発者以外)と一緒にまともな小規模プロジェクトに取り組んでいるソロ開発者です。これらの他の人々は開発以外の方法でプロジェクトに関与しており、1人は私のマネージャーでもあります。誰もがその場限りの議論にもかなりオープンです。 私のマネージャーはちょうど夢のように見えるものを私に与えてくれました-私はどの会議構造がプロジェクトに最適かを決定することを任されました。これは、会議の過負荷や無意味な会議に対処するための素晴らしい方法のようです。 今のように、大きな力には大きな責任が伴います。もし私が最終的に多くの無駄な時間をもたらす何かを提案した場合、それは私のせいです。 会議をどのように構成するかを考えるのにこれほど白紙の状態はありませんでした。私の考えは: 毎日の目標を伝え、前日の内容を確認するために、15分以下(スタンドアップミーティングと同様)の毎日の「タッチベース/ステータス更新」ミーティング。または、ホワイトボードを手に取り、自分の机に置いてこの情報を伝えることもできたようです。 特定の決定を下すため、またはチームのいずれかが持っている質問に対処するために必要に応じて会議 ...毎週の「ステータス」プロジェクト会議の必要性はないと思います。また、2番目の箇条書きで正式にスケジュールされた多くの会議が必要になるかどうかもわかりません。 私の懸念は、これらの「開発者に焦点を当てた」(つまり私)が他の人との疎外を引き起こしたり、この構造がほとんどのプロジェクトが実行されるものとはかなり異なるため、プロジェクトに対するコントロールの喪失を感じたりする可能性があることです。 1人の開発者が選択する必要のあるプロジェクト会議の構造は何ですか? コメントへの対応: 他に貢献している人は何ですか?彼らはこのプロジェクトの対象ユーザーですか?開発の非側面(ウェブサイトのテーマと画像、DBA、QAテストなど)に取り組んでいますか?他のレベルの管理/管理? 彼らは最終的なユーザーの一部であり、全体的なワークフローに関心があります。また、フォーム/ドキュメントのいくつかの領域にも貢献しています(その形式は開発作業に影響しません)。 他の2人のメンバーからフィードバックを得ることができますか?一部のマネージャーは、定期的に会議をスケジュールする必要があります。そうしないと、会議をスケジュールに合わせることができません。 時間を稼ぐことは今後の問題ではないようです。

3
バッテリーバックアップアップキャッシュとは何ですか?
私はInnodbのパフォーマンスの最適化に関する記事を読んだことがあります。その投稿では、著者が「バッテリーバックアップキャッシュ」という名前のことについて繰り返し言及していました。彼が何を話していたのか私には明確ではなく、グーグルも助けにはならなかった。私の推測では、これは停電が発生した場合のバックアップストレージのようなものです。私は正しいですか?

6
ソースコードを秘密にしておくことが正当化されるのはどのような場合ですか?
私がフリーランサーとして働いていたとき、プロジェクトとその背後にある概念がいかに重要でなく、興味深くなく、独創的でなくても、顧客がプロジェクト(Webアプリケーションなど)のアイデアとソースコードを可能な限り保護する多くのケースに遭遇しました。 私はすでにアイデアを秘密にしておくことについて質問を投稿し、多くの素晴らしい回答を受け取りました。今、私の懸念は、ソースコードの秘密性についてです。 私の観察によると: 私のキャリアで取り組む必要があったコードベース、 自分のソースコードの一部を秘密にしておくという私自身の意欲、および: たとえば、人気のあるProgrammers.SE寄稿者であるMason WheelerによるSimon StuartへのOpen応答などのいくつかの記事、 私はソースコードが主にこれらの理由のために秘密にされていると結論づけます: 作者はそのような質の悪いコードを恥じているか、誰かがそのような質の悪いコードベースを見た場合、またはコードベースの質が低い場合に評判を失うことを恐れているので、それをオープンソース化するのに役立つものは誰にもありません。たとえ誰かが興味を持っても、彼はソリューションを実行することがほとんどできません(または、多くの場合、コンパイルさえできません)。 コードの一部が盗まれているため(ほとんどの場合、特定の状況での使用を制限するライセンスの対象となるオープンソースプロジェクトから)、 コードはあいまいさによるセキュリティに依存しており、作者はケルクホフスの原則を気にしていません。 製品は非常に壊れやすいため、コードを表示すると非常に害が生じます。これらのセキュリティリークのあるクローズドソースのアプリが初心者のハッカーに耐える場合、初心者のハッカーであっても、同じオープンソースのアプリで発生する可能性ははるかに小さくなります。コードを調べてすべての穴を発見するだけです。 私が何を話しているのかはっきりしない場合は、ここに例があります: if (credentials.password === 'masterPassword12345') { isLoggedIn = true currentUser = credentials.userName } else { authenticate(credentials) } 著者がソースコード(および彼自身のスキルと専門知識)を過大評価したためです。例:自家製の暗号化関連のアルゴリズム(誰もレビューしなかった)は、よく知られたアルゴリズムよりも優れていると信じています。 なぜなら、コードの背後にあるアイデアは素晴らしいものであり、盗まれるだろうと著者が考えているからです。 「それは十分に完全ではない」症候群のために。言い換えれば、開発者はコードが「十分」であればソースコードを公開してもかまいませんが、日々改善すべき点があるため、コードがリリースされることはありません。 これらすべての理由は、ソースコードの公開に反対している人々のかなり否定的なイメージを与えます。 ケルクホフスの原則に従う高品質のコードを公開しない正当なケースはありますか?

4
現実的なデータに依存するクラスを単体テストするにはどうすればよいですか?
科学的測定の結果をカプセル化するクラスがあります。私は最初から単体テストを構築していますが、単体テストの経験があまりなく、どの動作をどのようにテストするべきかわかりません。 私のクラスは次の3種類のことを行います。 ファイル(または文字列)からそのインスタンス変数に測定データを読み込みます 測定データをファイルまたは文字列に書き込みます データに対して計算を実行します(例:一連の数値の平均を取得) 私の現在のアプローチは、既知の良好なサンプルデータファイルをtestディレクトリに含めることです。1つのテストでは、ファイルからデータを読み取り、それをクラスに渡し、いくつかの基本的な健全性チェックを満たしていることを確認します。別のテストでは、ファイルのファイル名をクラスに渡し、クラスにそれを読み取らせ、同じテストを実行します。テストの残りの部分では、ファイルからデータを読み取り、それをクラスに渡し、データ処理方法の結果が正しいことを確認します。 しかし、これはかなり絡み合っているようです。(3)をチェックするテストは、(1)の動作が正しいことを暗黙的に想定しています。そして、(1)のテストは、(3)のテストによって行われた広範なチェックから利益を得ることができます。単体テストの構造が不十分ですか、それともテストで特定のデータセットを使用する必要があるという事実の自然な結果ですか?

1
依存関係をできるだけ少なくして科学ソフトウェアを配布するにはどうすればよいですか?
私の研究の一環として、他人に配布する必要のないPythonおよびMATLABコードを多数記述しています。ソフトウェアを配布する必要がある場合でも、PythonとMATLABの両方が解釈されるため、共有が比較的簡単になります。 今、私はC ++で配布したいソフトウェアを書いています。私は自分のマシンでソフトウェアをコンパイルする方法を理解していますが、他の人にソフトウェアを提供するために何をする必要があるかを理解していません。 まず、プロジェクトの詳細:視覚化を計算して表示するためのコードを書いています。プロジェクトはグラフベースなので、LEMONグラフライブラリを使用しています。視覚化を表示する目的でVTKとOpenGLの実装を調査しています。私のソフトウェアを使用できるように、それらの環境のユーザー向けにPythonおよびMATLABバインディングを記述したいと思います。また、WindowsおよびLinuxバージョンを作成したいと思います(OS Xについてはまだ考えていません...)。 それでは、レモングラフライブラリを例に考えてみましょう。これは、小さな共有オブジェクトを伴う一連のヘッダーです。開発システムでは、CMakeを使用してライブラリをコンパイルし、プロジェクトにリンクします。 次に、Windowsで実行している誰かにソフトウェアを提供したいとします。私は彼らがインストーラーをダウンロードし、ボタンを1つか2つクリックして、すべての面倒を見てもらいたいと思っています。レモンライブラリやOpenGLのインストールについて心配してほしくありません。彼らは意図的に何かをコンパイルする必要はありません。これは可能ですか? 私はそれを感じていますが、参照を検索するときに不足します。Windowsでバイナリをコンパイルすると、Windows OSを実行している誰にでもそのバイナリを配布できるはずだという漠然とした考えがあります。しかし、私が使用するライブラリはどうですか?Windowsでそれらを静的にリンクする必要があると思います。これで、依存関係の問題が解決されます。しかし、私の心の奥で、静的リンクは良い習慣ではないことを読んだことがあります(または、これはLinuxだけですか?) ご存知のように、私は少し迷っています。私は正しい方向に微調整し、何かを知っていたら読んだ参考文献をいただければ幸いです!

3
パブリックプロパティとパブリックフィールドの使用
私が作業している場所では、プロパティの使用はお勧めできません。「スピードアップ」するコード生成ツールがあります。すべてのオブジェクトデータはパブリックフィールドになります。とにかくプロパティをリクエストすると、次のようになります。 Public sFoo as String Public Property Foo as String Get Return sFoo End Get Set(ByVal value as String) sFoo = value End Set End Property これを行うための合理的な議論は考えられません。パブリックプロパティとパブリックフィールドの両方を使用する正当な理由はありますか?

2
時間の見積もりに「予期しない遅延」の時間を追加しても大丈夫ですか?
私は最初の契約(上陸、自営業!)を上陸させ、会社は時間の見積もりを求めています。 プログラマーは時間の見積もりが悪かったことで悪名高く、私は以前、笑えるほど間違っていたことを知っています。固定入札なので、課金は気にしません。期待管理についてだけ心配です。 これまでのところ、実行する必要のある作業を項目別に示し、所要時間を見積もり、その時間を大幅に埋めていました。でも、まだ緊張しています。「予期せぬ遅延」に間に合うように書くことは受け入れられますか?見積もりは4週間ですが、考えていなかった問題については5週目を追加したいと思います。それは人々がすることですか?誰かがその中でそれを使って見積もりをくれたら、あなたは気を悪くしますか?

5
SQLiteはデータログの賢明なオプションですか?
Linuxで小さなデータロギングアプリケーションをセットアップしようとしています。データはシリアルポート経由で届き、そこからロギングとグラフィック表示に送られます。 ログ機能は、再起動後のグラフ機能の初期化のためにあります。 データは毎秒到着し、5桁の10進数の精度で構成され、2年間記録する必要があります。私の現在の空き容量は約15GBです。 これまでのプロジェクトの言語はbashとpythonです。 私の目的は、シンプルでありながら堅牢な(おそらくフラッシュドライブへのライブバックアップ? SQLiteはこれに適していますか?私のホームディレクトリにあるテキストファイルはこれに適していますか?
8 python  sql  logging 

1
P2Pアプリケーションを設計する方法
[ SOユーザー(10k SO +)の提案でここに移動] ピアツーピアアプリケーションを開発したいのですが。私はLOBアプリで多くの経験を積んでいますが、P2Pアリーナは初めてです。 私は物事がどのように機能するかについて大まかな考えを持っていますが、私の理解を記入するためにいくつかの詳細が必要です。 私が知っている(信じる)必要なこと: かなりの割合のクライアントがインバウンド接続を有効にする必要がある(ala uPnP / NATルール) 特定のノードがダウンした場合に回復力を提供するために、ノードは他の既知のノードを共有する必要があります 任意のクライアント間でデータを送信するには、何らかの形式の同期/ルート検索が必要です 「ダム」クライアントとノードリストの同期/共有を処理し、メッセージをリレーするためのより強力な「スーパーノード」を区別するためのリソーススニッフィング インバウンドサポートのないクライアントは、接続するノードの情報を受信できるアウトバウンド接続を開いたままにする必要があります。 つまり、特定の中央サーバーへの接続に依存しないチャット/メッセンジャーサービスを(最初は)提供したいと思っています。物事を始めるには(または大幅なアップグレード後に)集中型の「スーパーノード」をいくつか用意する必要があると思いますが、機能するP2Pネットワークが確立されたら、これらはオプションにする必要があります。 私は多くの問題を見ることができ、それらに対処する方法がわかりません。主にどのように... 中央の権限を確認することなく、ユーザーを他のノードに認証する どのノードが他のどのノードについて知っているかを調整します(最小-最大数/レイテンシ別????) 特定のユーザーが別のユーザー(またはノード)がオンラインかどうかを判断できるようにする ノードの2つのグループが物理的に切断(エアギャップ)されている状況と、グループの再接続時に再同期する方法に対処する など 私はこれがかなり自由回答式の質問であることを知っているので、高レベルの設計パターンは高く評価されますが、私が本当に探しているのは、他の人がこれらの問題を処理する方法に関するまともなガイドです(そして私はまだ検討していません) )。

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