ソフトウェア工学

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

22
どの時点でパフォーマンスについて考える必要がありますか?
アプリケーションを構築しているとき、これが特定の機能を実行または実装する最良の方法であるかどうかを常に問いかけています。多くの場合、パフォーマンスに関する「馬の前にカートを置く」べきではないというコメントを受け取るために、stackoverflowまたはフィードバックを希望する別のフォーラムに質問を投稿します。ほとんどのプログラマーは、アプリケーションが終了するまでパフォーマンスについて本当に考えないのでしょうか、それともパフォーマンスがまったく許容できないのでしょうか?? つまり、開発環境は本番環境とは異なり、開発用ラップトップからの結果に完全に依存するべきではないことを理解しています...しかし、他のものよりも優れたパフォーマンスをもたらすプラクティスとテクニックがあります。 開発プロセス全体でパフォーマンスを考慮することは悪い習慣ですか?パフォーマンスが実際に低下するまで、これらの考慮事項をオフにする必要がありますか?? 更新 明確にするために、機能の一部を検討している、または作業しようとしている状況について説明しています。実装にはいくつかの方法がありますが、各実装がどの程度拡張できるかはよくわかりません。また、よく知らないテクニックもいくつかあります。小規模ではいずれのアプローチでもおそらく適切ですが、大規模では一部のアプローチが維持され、一部は維持されません。多くの場合、私が意見やガイダンスを求めるとき、応答は次のとおりです。後で心配する...

4
取り組むべき設計演習はどこにありますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または詳細な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 私は問題解決スキルを練習し続けることが重要だと感じています。私自身のミニプロジェクトを書くことは一つの方法ですが、別の方法はオンラインに投稿された問題を解決しようとすることです。巧妙なアルゴリズムを適用して解決する必要のある興味深いプログラミングクイズをオンラインで簡単に見つけることができます-Project Eulerはよく知られた例の1つです。 ただし、多くの実際のプロジェクトでは、ソフトウェアの設計(特に初期段階)に大きな影響があり、後の段階では単純なアルゴリズムほど簡単には調整できません。これらのスキルを向上させるために、設計上の問題のコレクションを探しています。 「設計」と言うとき、ソフトウェアソリューションの抽象的な設計を意味します。たとえば、どのモジュールが存在し、それらの間に依存関係があるのか​​、プログラム内でデータがどのように流れるのか、データベースなど。設計上の問題は、プロジェクトの初期段階で解決することが重要な問題ですが、その解決策は、コードが1行もないホワイトボード図です。 もちろん、この種の問題には単一の正しい解決策はありませんが、問題にアプローチするために使用される可能性のある典型的な解決策の長所と短所も表示する場所には特に満足しています。

4
あなたの会社には、オープンソースプロジェクトへの貢献について書面によるポリシーがありますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 あなたの会社には、オープンソースプロジェクトへの貢献について書面によるポリシーがありますか? 私たちは「教えてはいけない」というスタイルで貢献してきましたが、何かを書き留める時が来ました。私は、完全な書面のポリシーテキストと断片的なものの両方に感謝します。 更新:この質問をしてからある程度進歩しましたが、今そのようなポリシーを持っています- これを読んでください。

5
Elmの主張のように、「ランタイム例外なし」の利点は何ですか?
一部の言語では、「実行時例外がない」と主張している他の言語よりも明確な利点があります。 私はこの問題について混乱しています。 ランタイム例外は、私が知る限り単なるツールであり、適切に使用されている場合: 「ダーティ」状態を通信できます(予期しないデータでスロー) エラーの連鎖を指すことができるスタックを追加する 乱雑(無効な入力で空の値を返すなど)と開発者の注意が必要な安全でない使用(無効な入力で例外をスローするなど)を区別できます。 エラーに詳細を追加することができます。例外メッセージを使用して、デバッグ作業に役立つさらに詳細な情報を提供できます(理論的に) 一方、例外を「飲み込む」ソフトウェアをデバッグするのは本当に難しいと感じています。例えば try { myFailingCode(); } catch { // no logs, no crashes, just a dirty state } 質問は、「ランタイム例外なし」の強力で理論的な利点は何ですか? 例 https://guide.elm-lang.org/ 実際には実行時エラーはありません。ヌルなし。未定義は関数ではありません。

2
DDD:ルートアグリゲートが別のルートアグリゲートへの参照を保持するのは正しいですか?
ドメイン駆動型設計(DDD)に従う場合、たまたま別のアグリゲートのルートエンティティである内部エンティティへの参照をルートアグリゲートが保持するのは正しいですか? 私はこれが正しいとは思わない、主にブルーブックのこのルールのため: AGGREGATE境界の外側にあるものは、ルートENTITYを除き、内側にあるものへの参照を保持できません。ルートENTITYは、内部ENTITIESへの参照を他のオブジェクトに渡すことができますが、それらのオブジェクトは一時的にのみそれらを使用でき、参照を保持することはできません。ルートはVALUE OBJECTのコピーを別のオブジェクトに渡すことができますが、それがどうなるかは問題ではありません。これは単なるVALUEであり、AGGREGATEとの関連付けがなくなるためです。 ルートアグリゲートが別のルートアグリゲートへの参照を保持している場合、前者の境界に違反しており、アグリゲートの概念全体が破損しているため、ルートアグリゲートが別のルートアグリゲートへの参照を保持する必要があるように見える場合は、別のエンティティを作成するには、おそらく他のルートエンティティと同じメンバーの一部を共有しますが、この本の他のルールが示すように、グローバルアイデンティティはありません。 ルートエンティティにはグローバルアイデンティティがあります。境界内のエンティティには、AGGREGATE内でのみ一意のローカルIDがあります。 これは正しい方法だと思いますが、それは反復的で冗長であると感じるので(DDDのコンテキストを取り除いて、純粋なOOPで)、フィードバックを求めています。

2
コンパイラはコンパイル時間を短縮するためにマルチスレッドを利用しますか?
コンパイラのコースを正しく覚えている場合、典型的なコンパイラの概要は次のとおりです。 字句解析プログラムは、ソースコードを文字ごとにスキャンします(またはスキャン関数を呼び出します)。 入力文字列は、妥当性について語彙素の辞書と照合されます 語彙素が有効な場合、対応するトークンとして分類されます パーサーは、トークンの組み合わせの構文を検証します。トークンごとのトークン。 理論的には、ソースコードを4分の1(または任意の分母)に分割し、スキャンおよび解析プロセスをマルチスレッド化することは可能ですか?マルチスレッドを利用するコンパイラは存在しますか?

2
ソフトウェア開発に対する増分アプローチと反復アプローチの違いは何ですか?
インクリメンタルアプローチは、生成物が終了するまで(たびに加算されるもう少し)モデルは、設計、実装、および漸増試験されたソフトウェア開発方法です。開発と保守の両方が含まれます。製品は、すべての要件を満たしたときに完成品として定義されます 反復設計は、プロトタイプ試験、分析、および製品またはプロセスを精製する循環プロセスに基づく設計手法です。設計の最新の反復をテストした結果に基づいて、変更と改良が行われます。このプロセスは、最終的に設計の品質と機能を改善することを目的としています。反復設計では、設計されたシステムとの相互作用は、連続したバージョンまたは設計の反復が実装されるときに、プロジェクトを通知および進化させるための研究の一形態として使用されます。 両方の方法は、システムの一部を作成し、すべてのテストケースに合格するようにシステムを調整し、システムの別のコンポーネントを追加し、再度調整することに関するものと思われます。 これら2つのソフトウェア設計方法の実際の違いは何ですか これらの2つの方法を組み合わせて、反復および増分設計アプローチを形成する方法

3
フリーウェアであるが、クローズドソースアプリケーションのライセンス
私は無料でリリースしたいシンプルなアプリケーションを開発しましたが、ソースコードのリリースは計画していません。アプリケーションを自由に利用できるようにしたいのですが、誰にも販売したり、リバースエンジニアリングしたりしたくありません。MITライセンスはシンプルで素敵に見えますが、誰でも販売できます。自分に適したライセンスはありますか、MITライセンスを変更するだけですか?

2
DDDの実装:ユーザーと権限
私は、ドメイン駆動設計の原則を把握しようとする小さなアプリケーションに取り組んでいます。成功した場合、これは大規模プロジェクトのパイロットになる可能性があります。「Implementing Domain-Driven Design」(Vaughn Vernon著)を読み、同様のシンプルなディスカッションフォーラムを実装しようとしています。また、githubでIDDDサンプルをチェックアウトしました。私は自分のケースにアイデンティティとアクセスを採用するのに苦労しています。背景情報をいくつかご紹介します。 私は(願わくば)ユーザーとアクセス許可のロジックを分離する背後にある理由を理解しています。それはサポートドメインであり、異なる境界コンテキストです。 コアドメインには、ユーザーはなく、作成者、モデレーターのみが存在します。これらは、サービスを使用してIDおよびアクセスコンテキストにアクセスし、受信したユーザーオブジェクトをモデレーターに変換することによって作成されます。 ドメイン操作は、関連する役割をパラメーターとして呼び出します。例: ModeratePost( ..., moderator); ドメインオブジェクトのメソッドは、指定されたモデレーターインスタンスがnullでないかどうかを確認します(IDおよびアクセスコンテキストから要求されたユーザーがモデレーターロールを持っていない場合、モデレーターインスタンスはnullになります)。 ある場合には、投稿を変更する前に追加のチェックを行います: if (forum.IsModeratedby(moderator)) 私の質問は: 後者の場合、セキュリティの懸念がコアドメインに再び溶け込んでいないのですか?以前は、本は「誰が主題を投稿できるか、またはどのような条件で許可されていますか。フォーラムは著者が今それをしていることを知る必要があります」と述べていました。 本のロールベースの実装は非常に簡単です。モデレーターがコアドメインである場合、必要なときに現在のユーザーIDをモデレーターインスタンスまたはオーサーに変換しようとします。サービスは適切なインスタンスで応答するか、ユーザーに必要なロールがない場合はnullで応答します。ただし、これをより複雑なセキュリティモデルにどのように適合させることができるかわかりません。私がパイロットをしている現在のプロジェクトには、グループ、ACLなどのかなり複雑なモデルがあります。 「投稿はその所有者または編集者のみが編集する必要があります」のようにあまり複雑ではないルールでさえ、このアプローチは破綻しているように見えます。 IdentityOrAccessコンテキストにOwnerOrEditorインスタンスを要求することは適切ではないと感じ、コアドメインではますますセキュリティ関連のクラスになります。さらに、userIdだけでなく、保護されたリソースの識別子(投稿、フォーラムなどのID)をセキュリティコンテキストに渡す必要があります。 ) コアドメインへのアクセス許可を引き出し、ドメインオブジェクトのメソッドまたはサービスでそれらをチェックすることで、最終的には、セキュリティに関する懸念をドメインに混在させることになります。 セキュリティとアクセス許可がコアドメイン自体でない限り、これらのアクセス許可関連のものはコアドメインの一部であってはならないことをどこかで読みました(そしてそれに同意する傾向があります)。上記のような単純なルールは、セキュリティをコアドメインの一部にすることを正当化しますか?

1
gitflowを使用する場合、リリースブランチまたはマスターブランチにタグを付ける必要がありますか?
この問題は次のことを示しています。 私の理解では、マージする前にリリースブランチに(マスターブランチではなく)タグを配置するのが正しいので、実際にはgit describe --devsブランチからタグを見つけることができます。#374を参照 一方、別の投稿: 今日、誤って0.4.2-preバージョンをhomebrew経由でインストールしましたが、そのバージョンでのタグ付けの仕組みに混乱しました。以前(バージョン0.4.1)は、リリースブランチがマージされた後、マスターブランチでタグが作成されました。今では、リリースブランチの最後のコミットでタグが作成されているようですが、これは私にとっては良い考えではないようです。特に、gitタグに依存し、HEADがタグ付きコミットの場合はリリースバージョンを作成し、次のいずれかのコミットの場合は開発バージョンを作成するビルドシステムがある場合。誰かがこの変更の背後にある論理を私に説明できますか?また、セマンティックバージョニングに関しては、これがパッチレベルのバージョンバンプであるとは考えません。 私たちのチームでは、これについて複数の議論を行いました。タグをmasterブランチから作成する必要があることを示すものもあれば、releaseブランチを好むものもあります。gitflow画像によると: タグがマスターに配置されているように見えます。
16 gitflow 

4
ワンマンチームのソフトウェアライフサイクル手法[非公開]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 8年前に閉鎖されました。 私は修士プロジェクト用のソフトウェアシステムを構築しており、「ワンマンチーム」に適した特定の方法論に関するアドバイスを探していました...

6
近似等式を使用したフロートハッシュの実装方法
次のPythonクラスがあるとしましょう(問題はJavaにもequalsandと同じように存在しますhashCode) class Temperature: def __init__(self, degrees): self.degrees = degrees ここでdegrees、フロートとしてのケルビンの温度です。今、私はのための平等のテストやハッシュを実装したいTemperatureという方法で、 直接等価テストではなく、イプシロンの差までフロートを比較します。 をa == b意味する契約を尊重しhash(a) == hash(b)ます。 def __eq__(self, other): return abs(self.degrees - other.degrees) < EPSILON def __hash__(self): return # What goes here? Pythonのドキュメントでは、数値をハッシュすることについて少し説明してhash(2) == hash(2.0)いますが、これはまったく同じ問題ではありません。 私は正しい軌道に乗っていますか?もしそうなら、この状況でハッシュを実装する標準的な方法は何ですか? 更新:現在、フロートのこのタイプの等価テストでは==、との推移性が排除されていることを理解していequalsます。しかし、フロートを直接比較するべきではないという「常識」とどのように結びついているのでしょうか?浮動小数点数を比較して等値演算子を実装すると、静的解析ツールが文句を言います。彼らはそうする権利がありますか?

2
コードの抽象化をどのように処理しますか?
新しいコードベースを見るとき、ボトムアップのアプローチから始めたいと思います。 1つのファイルを理解してから、次の抽象化に移動します。 しかし、多くの場合、低レベルの抽象化が行っていることを忘れています。 だから、私はこの時点で、私が以前完全に理解していたファイルに戻って、それらを再学習しようとするほぼ無限のループにいることに気付くでしょう。私の頭の中で互いに接続する他の多くの抽象化をジャグリングしようとしながら。 この状況に対処するためのより良い戦略はありますか? 下位レベルの詳細を忘れて、それを当然のことと考えるべきですか?しかし、それでも、現在の抽象化が何をしているのかを理解するには、以前に低レベルの抽象化を理解しておく必要が何度もあります。

5
オブジェクトを同じメソッドに2回渡すか、結合されたインターフェイスで統合しますか?
デジタルボードと通信した後にデータファイルを作成する方法があります。 CreateDataFile(IFileAccess boardFileAccess, IMeasurer boardMeasurer) ここではboardFileAccessとboardMeasurerの同じインスタンスですBoardその実装するオブジェクトの両方IFileAccessとIMeasurer。IMeasurerこの場合、ボード上の1つのピンをアクティブに設定して簡単な測定を行う単一の方法に使用されます。この測定からのデータは、を使用してボードにローカルに保存されIFileAccessます。Board別のプロジェクトにあります。 私はCreateDataFile、簡単な測定を行ってからデータを保存することで1つのことを行うという結論に達しました。同じ方法で両方を行うことは、このコードを使用して測定を行ってファイルに書き込む必要がある他の人にとってより直感的です個別のメソッド呼び出しとして。 私には、同じオブジェクトをメソッドに2回渡すのは厄介に思えます。IDataFileCreator拡張IFileAccessし、必要なメソッドを呼び出すだけのインスタンスをIMeasurer含む実装を持つローカルインターフェイスを作成することを検討しました。同じボードオブジェクトが常に測定とファイル書き込みに使用されることを考えると、同じオブジェクトをメソッドに2回渡すのは悪い習慣ですか?もしそうなら、ローカルインターフェイスと実装を使用して適切なソリューションですか?BoardBoard

6
ゲッターの許可に関する正確な問題は何ですか?
私はセマンティクスについての意見を探しているのではなく、単にゲッターを賢明に使用することが実際の障害である場合を探しています。たぶん、それらに頼るという終わりのないスパイラルに私を投げ込むかもしれません、多分、代替案はよりきれいで、ゲッターを自動的に処理するなどです。具体的な何か。 私はすべての議論を聞いた、彼らはあなたがデータソースとしてオブジェクトを扱うことを余儀なくされるので、彼らが悪いと聞いた、彼らはオブジェクトの「純粋な状態」に違反しているたくさん受け入れる」。 しかし、a getDataが悪いものである理由はまったく理にかなったものではなく、実際には、セマンティクス、ゲッター自体は素晴らしいと主張する人もいますがgetX、名前を付けないでください、これは少なくとも面白いです。 私が賢明にゲッターを使用すると、そしてオブジェクトの完全性がそれを外に出しても壊れないデータのために、意見なしで壊れる1つのことは何ですか? もちろん、何かを暗号化するために使用される文字列にゲッターを許可することは愚かなことではありませんが、システムが機能するために必要なデータについて話しているのです。たぶん、あなたのデータが通って引っ張られProviderたオブジェクトから、しかし、まだ、オブジェクトがまだ許可する必要がありProviderませんし$provider[$object]->getData、その周りに方法はありません。 なぜ私が求めているのですか:私にとって、ゲッターは賢明に使用され、「安全」として扱われるデータで神に送信され、私のゲッターの99%はオブジェクトを識別するために使用されますObject, what is your name? Object, what is your identifier?。プログラミングに関するほとんどすべてがアイデンティティであり、オブジェクト自体よりもそれが何であるかをよく知っている人がいるので、オブジェクトを扱う人はオブジェクトに関するこれらのことを知っているはずです。あなたが純粋主義者でない限り、私は本当の問題を見ることはできません。 「なぜゲッター/セッター」が悪いのかに関するStackOverflowの質問をすべて見てきました。99%のケースでセッターが本当に悪いことに同意しますが、ゲッターは韻を踏むだけで同じように扱われる必要はありません。 セッターはオブジェクトのIDを危険にさらし、誰がデータを変更しているかをデバッグするのを非常に難しくしますが、ゲッターは何もしません。

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