ソフトウェア工学

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

1
アカウントの作成中に、パスワードを自動的に生成してユーザーに送信するか、ユーザーが自分でパスワードを作成できるようにする方が良いでしょうか?
この質問は、私たちが取り組んでいるウェブサイトの「アカウントの作成」ページについて同僚と話し合っているときに今日出てきました。 私の同僚の意見では、登録をできるだけ迅速かつシームレスに行う必要があるため、ユーザーにメールを尋ねて残りを処理するだけです。 私はその意図に同意しますが、いくつかの懸念があります。 我々はパスワードを生成するので、我々は持っているパスワードが強い十分であることを確認する責任を 私の経験では、わかりにくいパスワードに直面したとき、ユーザーはそれを投稿に書き留める可能性が高い パスワードを書き留めていないユーザーは、パスワードを忘れる可能性が高いです。つまり、定期的に新しいパスワードを要求する必要があり、誰にとっても面白くない ただし、ユーザーが作成したパスワードの一般的な品質と、多くの人がすべて(「震え」)に同じパスワードを使用する傾向があるという事実を考えると、強力なパスワードを生成することが理にかなっていることがわかります。 私はまだそれについて不安を感じています。ユーザーがクレジットカードの詳細を保存するオプションを持つ商人のウェブサイトに取り組んでいるので、最も安全なアプローチを使用することが明らかに非常に重要です。

1
CharSequenceがcontains(CharSequence)を定義しないのはなぜですか?
契約は同一なので、これはJava SEとAndroidの両方に適用されます。 Java SEのCharSequenceドキュメント Android用CharSequenceドキュメント CharSequencecontains(CharSequence)メソッドを定義しません。私は理由を見つけることができないようで、それを含めることは非常に有用でありCharSequence#toString()、文字のシーケンスをチェックするために呼び出す必要を防ぎます。 例えば、Androidの中で、ユーザーが呼び出すことを余儀なくされているEditable#toString()にもかかわらず、それは文字の配列を含むかどうかを確認するためにEditable実装しCharSequenceた場合に回避することができ、CharSequence定義されましたcontains(CharSequence)。 この設計選択の背後にある考え方は何ですか?それは潜在的な見落としですか、またはこれには設計上の理由がありますか?

2
大企業では継続的インテグレーションはどのように組織されていますか?
私の会社では、各機能/バグ修正ブランチがdevでどのようにマージされるかを確認するために中間ビルドを行わないのが一般的です。毎日のビルドのみがあり、常に多くのテストの失敗とビルドエラーが発生します。私は、1000人以上の開発者がマージごとにビルドするのは理不尽だと言われています。 それで、私はCIがそれ以上の開発者(Microsoft、Facebook)を持っている会社でどのように組織されているかを検索しましたが、何も見つかりませんでした。たぶん、インサイダーは私に言うことができますか?

7
列挙に特別な値「ALL」を含めることは良い習慣ですか?
私はマイクロサービス環境で新しいサービスを開発しています。これはRESTサービスです。簡単にするために、パスが/ historyBooksであるとしましょう そして、このパスのPOSTメソッドは、新しい履歴ブックを作成します。 歴史書が歴史の1つ以上の時代をカバーしていると仮定しましょう。 簡潔にするために、人間の歴史の次の時代しかないと仮定しましょう。 古代 ポストクラシック モダン 私のコードでは、それらをで表現したいと思いenumます。 メソッドの本体(ペイロード)はJSON形式であり、フィールド名を含める必要がありますeras。このフィールドは、eraこの本で扱う値のリストです。 本体は次のようになります。 { "name": "From the cave to Einstein - a brief history review", "author": "Foo Bar", "eras": ["Ancient", "Post Classical", "Modern"] } この特定のサービスでは、ビジネスロジックは次のとおりです。 入力に時代が指定されていない場合、この本はすべての時代を網羅していると見なされます。 APIレビューでは、すべての時代が網羅されていることを明示的に示すために、時代の列挙に 別の値を含めることを提案しましたALL。 長所と短所があると思います。 長所: 明示的な入力 短所: リスト内の2つの項目が提供されている場合、と言うALLとAncient-アプリケーションから取得されますでしょうか?これでALL他の値が上書きされるはずですが、それは新しいビジネスロジックです。 特定の時代を対象とする書籍のクエリを実行する場合、すべての時代を対象とする書籍をどのように表現しますか?場合ALLも(同じロジックを使用して)出力に使用され、それが解釈する消費者の責任だALLとは["Ancient", "Post Classical", "Modern"]。 私の質問 新しいALLものを持つことは、まったく持たないことよりも混乱を引き起こすと思います。 どう思いますか?このALL値を追加しますか、それなしでAPIを保持しますか?
11 rest  api  json  enum 

8
プログラミングとデータベースクエリの統合[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店。 C ++やJavaなどのオブジェクト指向プログラミング言語の一般的なチュートリアルを検討してください。アカウント、注文、アイテムなど(またはほぼ同等のもの)を表すオブジェクトを使用して、簡単な注文処理システムを作成します。完全に直感的に理解できますが、ダイニングテーブルにいる象は、これらがインメモリオブジェクトであるため、現実的ではないということです。実際のシステムでは、アカウント、注文などはそもそもメモリに実際に存在するのではなく、データベースに存在し、メモリ表現はその短命のミラーにすぎません。 データベースを読み書きするために多くのコードを自分で書くこともできますが、それは退屈でエラーが発生しやすいため、実際に誰もそれを行いません。 誰もがORMを使用することになりますが、それらはそれ自体非常に問題が多いため、有名な論文では「ORMのベトナム」と呼ばれています。 プログラミング言語とデータベースがお互いを知らない別個のものであるのと同じくらい、オブジェクトとリレーショナルの不一致ではないと思います。推測:解決策は、プログラミング言語とデータベースクエリ言語の両方である単一の言語を使用することです。そのためには、言語ランタイムもデータベースであり、JITコンパイラもクエリオプティマイザーである必要があります。 それが私が見た問題の要約です。私の質問は、まだ誰かがいますか、 実際にこのような統合システムを構築しました 試みたが、そのような統合システムの構築に失敗した あなたがそのような建築をどのように進めるのか、またはなぜ、なぜそうでないのかというトピックに関する実質的なものを書かれている 問題を解決する別の方法を思い付きますか?

1
HaskellのMaybeコンストラクターを「Just」と呼ぶことをサポートする直観は何ですか?
のようなオプションの型の直感は、Int Maybe Intがない(つまり、そこにNothingある)か、Int があるということです。そこに何かがあります。 それは私たちが「負」の場合の型コンストラクタを呼び出すように私には理にかなってNothing何もありませんということ-それは正確にすることを意味するので、Intそこに。しかし、なぜ実際にそこにある何かに重点が置かれている場合にだけ、単語を使用するのですか? 私にとって、「Just」という言葉には、説明しているものが代替品よりも少ないという意味が含まれています。実際にそこにある何かの反対。例えば、 A:今夜何かしますか? B:いいえ。私はただ滞在してテレビを見ます。 A:あなたの家の周りの不気味な幽霊の音を調査しましたか? B:ええ、実際には単なるフクロウでした。 明らかに、この命名の選択の根拠となった直感が欠けています。それは何ですか?私にとって、「Just」という言葉は、Maybeタイプでの使用方法の反対を意味します。

4
製品のアイデアを構築する前に効果的にテストするにはどうすればよいですか?
私はこれについて多くのオンラインリソースを読みましたが、数え切れないほどの物を構築する前に製品のアイデアをテストするより良い方法があるかどうか疑問に思っていますか? Validate.techのように1日以内に製品のアイデアをテストするものについて読んだことがありますが、ランディングページだけで人々を引き付けるのは間違っているようです。 これはやや抽象的ですが、どちらの方法でもあなたの考えを聞きたいです。
11 product 

2
タスクにアプローチする方法が2つある場合、どちらを選択する必要がありますか?
特定のユースケースがあり、インターネットを介してそれを行う3つの方法を見つけました。私はこれらの3つを見つめています。 私は何をすべきかわからないままそこに座る傾向があります-それから何もしません...選択する良い方法はありますか?それらすべてを試してみるべきですか? 特定のコンテキストをより具体的にするために、ボードゲームグリッドを回転したり、グリッドにズームインしたり、このグリッド上のピースを移動したりできる画面の一部が必要な非常に軽量なボードゲームを作成しようとしています。私はこれを行う方法がわかりませんでしたが、Core Animation、Core Graphics、Sprite Kitのようなものをオンラインで見つけ、それらに対する賛否両論を見ました-たとえば、Spriteキットは高レベルですが、フレームレートを60に保ちます画面で実際に何も動いていない場合、バッテリーの無駄です。Core Animationは低レベルのAPIであり、「最高レベルの抽象化を行う」というAppleのガイダンスに反対しています。使用する3つのことを学びたくありません。1。選択してスタックを解除する方法はありますか? ソフトウェアの分野全体に当てはまると思うので、これを意図的に漠然とした質問として残しています。

1
MVCパターンをC#WinFormsアプリケーションに適用するにはどうすればよいですか?
私はそれ以来、MVCパターンを使用してGUIを設計しているC ++開発者です。 最近、C#に戻りたいと思い、Windowsフォームアプリケーションをセットアップしましたが、MVC準拠の構造にプッシュする方法が少し失われました。 私が現在やろうとしていることは、WinFormsに与えられたクラスをビューとして「宣言」し、モデルとコントローラーのクラスをバックグラウンドで追加することです。ただし、ボタンのクリックなど、イベントと対話する方法についてはよくわかりません。通常、これらのイベントをコントローラーにリダイレクトし、完了したらビューでアクションを実行します。 しかし、これはこの星座ではかなり不満を感じます。たとえば、「Exit」ボタンを実装する場合、ViewからControllerにイベントをリダイレクトする必要があります。また、Viewに追加のパブリックメソッドを実装し、それをControllerから呼び出すことができます。最初のインスタンスのViewからClose()を呼び出すだけです。 何かアドバイスはありますか?C#でのWindows Formsの私の理解は、MVC実装を試すにはまだ十分ではありませんか?フォームクラスに間違った役割を与えていますか?MVCはこのユースケースにとって単に不適切なアーキテクチャですか?
11 c#  mvc  winforms 

2
すべての主要なOOP機能を失うことなく、OOPで不変性を本当に使用できますか?
私のプログラムでオブジェクトを不変にすることの利点を理解しています。アプリケーションの良い設計について本当に深く考えているとき、私は多くの場合、オブジェクトの多くが不変であることに自然に到達します。多くの場合、すべてのオブジェクトを不変にしたいところになります。 この質問は同じ考えを扱っていますが、不変性に対する優れたアプローチと、それを実際に使用するタイミングを示唆する答えはありません。いくつかの良い不変のデザインパターンがありますか?一般的な考え方は、「オブジェクトを変更する必要が絶対にない限り、オブジェクトを不変にする」ことであるように見えますが、実際には役に立ちません。 私の経験では、不変性はコードをますます機能的なパラダイムに追い込み、この進行は常に起こります。 リスト、マップなどの永続的な(機能的な意味での)データ構造が必要になります。 相互参照(たとえば、子が親を参照している間、子を参照しているツリーノード)で作業することは非常に不便です。 継承は意味をなさないために停止し、代わりに構成を使用し始めます。 カプセル化のようなOOPの基本的な考え方全体がバラバラになり始め、私のオブジェクトは関数のように見え始めます。 この時点で、私は実際にはOOPパラダイムの何も使用しておらず、純粋に機能的な言語に切り替えることができます。したがって、私の質問:良い不変のOOP設計への一貫したアプローチがありますか、または不変のアイデアを最大限に活用すると、常にOOPの世界から何も必要としない関数型言語でプログラミングすることになりますか?OOPがバラバラにならないように、どのクラスを不変にし、どのクラスを不変にするかを決定するための良いガイドラインはありますか? 便宜上、例を示します。さんが持ってみましょうChessBoard不変のチェスの駒の不変なコレクションとして(抽象クラスを拡張しますPiece)。OOPの観点から見ると、ピースはボード上の位置から有効な動きを生成する役割を果たします。しかし、動きを生成するには、ピースがそのボードへの参照を必要とする一方で、ボードはそのピースへの参照を必要とします。さて、あなたのOOP言語に応じてこれらの不変の相互参照を作成するためのいくつかのトリックがありますが、それらは管理するのが苦痛で、ボードを参照する部分を持たない方が良いです。しかし、ボードの状態がわからないため、ピースは動きを生成できません。すると、ピースはピースタイプとその位置を保持する単なるデータ構造になります。その後、ポリモーフィック関数を使用して、あらゆる種類のピースの動きを生成できます。これは関数型プログラミングでは完全に達成できますが、ランタイム型チェックやその他の不適切なOOPプラクティスがないOOPではほとんど不可能です...

3
Pythonが最新のJavascript実装のように最適化されていないのはなぜですか?
V8(Chrome)、SpiderMonkey(Firefox)、Chakra(IE / Edge)などの最新のJavascript実装には、すべてJITコンパイルと、パフォーマンスを改善するためのその他の最適化がいくつかあります。 Pythonにこれらがないのはなぜですか? 私はPyPyとIronPythonを見てきましたが、どちらも速度の向上を主張しています。PyPyインタプリタ言語であるPythonで書かれたPython実装が、C。IronPythonのリファレンス実装よりも速くなる方法がわかりません。同じ考えですが、.NET Frameworkがどのように速度を上げるかわかりません。
11 python-3.x  jit 

6
これは非オブジェクト指向でどのようにプログラムされますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 OOPのマイナス面に関する痛烈な記事を読んで、他のパラダイムを支持して、私はあまり過失を見つけることができない例にぶつかった。 私は著者の議論にオープンになりたい、と私は彼らのポイントを理論的に理解することができますが、特に1つの例は、例えばFP言語でそれがより良く実装される方法を想像しようとするのに苦労しています。 From:http : //www.smashcompany.com/technology/object-oriented-programming-is-an-expensive-disaster-which-must-end // Consider the case where “SimpleProductManager” is a child of // “ProductManager”: public class SimpleProductManager implements ProductManager { private List products; public List getProducts() { return products; } public void increasePrice(int percentage) { if (products != null) { for (Product product : …

6
ジュニアプログラマーと継続的に展開できますか?
マイクロサービスアーキテクチャでは、すべてのマイクロサービスを一度にデプロイして、すべてが連携して動作することを確認するために1週間待つのが、APIバージョン管理を厳密に強制し、多くの自動テスト(それぞれ:ユニットと探索、統合)、およびステージ上のテストとしてコミットが合格するとすぐに本番環境に自動展開します。 これで、テストを書き、コミットする前に変更をテストし、APIバージョン管理の使用方法を知っていて、展開時に実行されるインクリメンタルdb更新スクリプトでデータベースを削除しない限り、素晴らしいアイデアのように見えますステージで失敗するため、大きな問題ではありません)。 しかし、若いプログラマーでそれを行うことは可能ですか?たぶん、プルリクエストスキーマを実装する必要があります。これにより、継続的な展開のようになります(私の推測です)。 これが意見に基づいたものではなく、あなたの経験を共有してくれることを期待しています。ありがとうございます。 CIについても、継続的な配信についても質問していないことに注意してください。すでにあります。現在私たちが試みているのは、コードをチェックインした直後にすべてを本番環境に配置することを意味する、継続的な展開にすることです。

3
Pythonでユニットテストのグローバルパラメータを適切に処理する方法は?
私たちは多くのアルゴリズムを実装していますが、それらは通常、多くの共有され、公に知られており、セキュリティ関連のパラメーターを持っています。 現在、すべてのパラメーターと2つの定義済みグローバルオブジェクトを保持するクラスを使用しています。 class PublicParams(object): p = q = 0 def __init__(self, p, q): self.p = p self.q = q # used for tests publicParams_test = PublicParams(15,7) # Some 2048 bit numbers for example publicParams_secure = PublicParams(128378947298374928374,128378947298374928374) その後、アルゴリズムはPublicParamsオブジェクトを引数として受け取り、デフォルトで生産的になりますpublicParams_secure def AlgoOne(n, publicParams = publicParams_secure): # do stuff with publicParams.p # ... AlgoTwo(x, …

6
スクラムと安定した開発は矛盾を作りますか?
私は5チーム、合計約40人の開発者からなる開発グループの一員です。私たちは3週間のスプリントでスクラム方法論に従っています。継続的な統合セットアップ(Jenkins)があり、ビルドパイプラインには数時間かかります(広範な自動テストのため)。基本的に、開発プロセスはうまく機能します。 ただし、新しいスプリントを開始してから数日後、ビルドが不安定になり、スプリント終了の「コミットが停止する」まで揺れたままになることがあります。これの悪影響は、パイプラインのはるか下のビルドステップ、特にUI / Webtestsが数日間実行されないことです(「グリーン」ビルドでのみトリガーされるため)。その結果、新しく導入されたバグは、スプリントの非常に遅い段階でのみ検出されることがよくあります。 各コミットは、テストの基本セットに対して検証されます。確認されると、コードレビュー後に変更がマスターにプッシュされます(Gerrit) 基本的な単体テストは30分ごとに実行され、期間は10分未満です 統合テストは2時間ごと、1時間ごとに実行されます UI / Webtestsは、成功した統合テストで数時間実行されます スプリント中のビルドの安定性の責任者(スプリントごとに責任が渡される)によっては、ビルドを安定させるための中間的なアドホックな「コミット停止」が存在する場合があります。 だから、私たちが欲しい: 開発チームは、スプリント中に変更を開発してコミットします 後続のビルド結果にはほとんど意味がないため、ビルドステップが失敗した場合に放棄するビルドプロセス 開発者にタイムリーに質の高いフィードバックを提供するビルドプロセス (2)を考えると、ポイント(1)と(3)は互いに矛盾しているように見えます。誰もこれに対処する良い方法を持っていますか? (現在、ポイント(2)を緩めており、失敗したビルドステップでもビルドの継続を許可しています。それが品質にどのように影響するかについて、まだフィードバックがありません。) ありがとう、サイモン

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