ソフトウェア工学

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

8
List of Enumsを使用するのは良い習慣ですか?
現在、ユーザーが存在し、各ユーザーが1つまたは複数のロールを持つシステムで作業しています。ユーザーに列挙値のリストを使用することは良い習慣ですか?これ以上良いものは考えられませんが、これは大丈夫ではありません。 enum Role{ Admin = 1, User = 2, } class User{ ... List<Role> Roles {get;set;} }

6
既存のユーザーに新しいパスワードを強制せずにパスワードハッシュを更新する
確立されたユーザーベースで既存のアプリケーションを保守します。時間が経つにつれて、現在のパスワードハッシュ手法は時代遅れであり、アップグレードする必要があると判断されています。さらに、UXの理由により、既存のユーザーにパスワードの更新を強制することは望ましくありません。パスワードハッシュ更新全体は、画面の背後で行われる必要があります。 以下を含むユーザー用の「単純な」データベースモデルを想定します。 ID Eメール パスワード このような要件を解決するにはどうすればいいですか? 私の現在の考えは次のとおりです。 適切なクラスに新しいハッシュメソッドを作成します データベース内のユーザーテーブルを更新して、追加のパスワードフィールドを保持する ユーザーが古いパスワードハッシュを使用して正常にログインしたら、2番目のパスワードフィールドに更新されたハッシュを入力します これにより、パスワードハッシュを持っているユーザーとパスワードハッシュを更新していないユーザーを合理的に区別できないため、両方のチェックを強制されるという問題が残ります。これは恐ろしく欠陥があるようです。 さらに、これは基本的に、すべてのユーザーがパスワードを更新するまで、古いハッシュ手法を無期限に保持することを意味します。その時点でのみ、古いハッシュチェックの削除を開始し、不要なデータベースフィールドを削除できました。 私の現在の「ソリューション」は汚れていて不完全であり、そうではないので、ここでいくつかのデザインのヒントを探していますが、可能なソリューションを記述するために実際のコードが必要な場合は、自由に言語を使用してください。

10
スクラム:オーバーアウトを達成している開発者が行った作業をアウトバンドで統合する方法は?
「典型的な」SCRUMチームがあり、スプリントで働き、バックログを維持することを約束します。最近、帯域外作業(通常の労働時間/スプリント以外で作業することを選択)を行っている、過剰に達成している開発者の作業を統合/処理しようとする問題に遭遇しました。 例として、チームが50ポイントの仕事を引き受ける場合、スプリントの終了までにSCRUMフレームワーク内ですべての仕事を完了し、彼らと会社は満足しているとしましょう。チームメンバーの1人が、自分で、バックログアイテムで、自分の自由時間に取り組むことにしました。彼らはこの作業をチェックインせず、代わりに保存します(TFSを使用し、シェルフセットにあります)。 これを処理する方法は?問題のいくつか.. 次のスプリント中に、このチームメンバーは、プログラミング作業が99%完了し、コードのレビューとテストのみが必要であると言います。SCRUMおよびアジャイル方法論でこれをどのように扱いますか? 他の開発者は、作業が帯域外で行われたため、これらのストーリーに関連する設計決定に関与していないことに不満を述べています。 私たちの製品所有者はこの「無料」の仕事を引き寄せようとしますが、チームがスプリントで達成できないような機能を製品に追加するために、過剰達成メンバーが意図的にこれを行っている可能性があります。これが「プロセス」を壊しているという見方があります。明らかに、QA、UI、およびドキュメントの作業をこの作業で行う必要があります。 SCRUMチームに時間外労働を強制しないことについて多くの議論がありますが、スプリントの計画と実行中に出された期待以上の仕事をしているチームメンバーはどうでしょうか。私はこの人物を統治することをheし、あなたが余分に働くことはできないと言います(もちろん燃え尽きないように注意してください)が、同時にそれはチームの特定のメンバー(しかしすべてではない)でいくつかの問題を引き起こしているようです。 達成度の高いメンバーが行った作業を、ソフトウェア開発のSCRUMおよびアジャイルプロセスに統合する方法
32 agile  scrum  team 

3
継続的インテグレーションの簡単な説明
継続的インテグレーションをどのように定義し、CIサーバーにはどのような特定のコンポーネントが含まれますか? マーケティング部門の誰かに継続的インテグレーションとは何かを説明したいと思います。彼らはソース管理を理解しています-つまり、Subversionを使用しています。しかし、私は彼らにCIが何であるかを適切に説明したいと思います。ウィキペディアの記事は、それを適切に定義することはありません、Martin Fowler氏の記事は、のみ基本的に「統合」のあいまいな説明に続いてトートロジーである、次のようになります: 継続的インテグレーションは、チームのメンバーが頻繁に作業を統合するソフトウェア開発プラクティスです。通常、各ユーザーは少なくとも毎日統合し、1日に複数の統合を行います。統合エラーを可能な限り迅速に検出するために、各統合は自動ビルド(テストを含む)によって検証されます。 更新:私は彼らにこの画像を送った、私はより簡単なものを見つけることができなかった。 更新2:マーケティングチャップからフィードバック(質問が3つあったとき): 私は実際には3つの回答すべてが好きです。理由はさまざまです。それらすべてに感謝するためだけにログインしたい気がします! 明らかに彼はできません-だから彼に代わってありがとう:) 更新3:ウィキペディアの記事を見て、見出しだけを取り上げると非常に良いリストである原則が含まれていることに気付きました。 コードリポジトリを維持する ビルドを自動化する ビルドを自己テストする 誰もが毎日ベースラインにコミットします (ベースラインへの)すべてのコミットを構築する必要があります ビルドを高速に保つ 実稼働環境のクローンでテストする 最新の成果物を簡単に入手できるようにする 誰でも最新のビルドの結果を見ることができます 展開を自動化する

8
クローズドソースプロジェクトのsourceforge、github、bitbucketなどのホスティングサイトはどれほど安全で信頼できるものですか?[閉まっている]
私は、私のビジネスのソース管理を管理するために、sourceforge、bitbucket、またはgithubの使用を検討しています。私はプロジェクトを開いており、gccなどのプロジェクトに参加しています。しかし、私は自分の生活のためにクローズドソースのソフトウェアを開発するビジネスも持っています。 for索好きな目からソフトウェアを安全に保つという点で、sourceforge、github、またはbitbucketはどれほど信頼できますか?データ損失防止に関して、ホスティングはどの程度安定していますか?そこに誰もがそのような服装でビジネスロジックに基づいていますか?ホスティングソリューションのいくつかを調査した人はいますか?

9
絶えず変化するプロジェクトで設計パターンを使用することを避けるべきですか?
私の友人は、すべての開発者が嫌うプロジェクトで小さな会社で働いています:彼はできるだけ早くリリースするように圧力をかけられています、彼は技術的な負債を気にしているようです、顧客は技術的な背景などを持っていません 彼は私に、このようなプロジェクトでのデザインパターンの適切性について考えさせた物語を教えてくれました。ここに物語があります。 Webサイトのさまざまな場所に製品を表示する必要がありました。たとえば、コンテンツマネージャーは製品を表示できますが、APIを介してエンドユーザーまたはパートナーも表示できます。 製品から情報が欠落している場合がありました。たとえば、製品が作成されたばかりのとき、それらの束には価格がありませんでしたが、価格はまだ指定されていませんでした。説明のないものもあります(説明は、変更履歴、ローカライズされたコンテンツなどを含む複雑なオブジェクトです)。出荷情報が不足しているものもありました。 デザインパターンに関する最近の読み物に触発され、私はこれが魔法のNull Objectパターンを使用する絶好の機会だと思いました。だから私はそれをやったが、すべてがスムーズできれいだった。product.Price.ToString("c")価格を表示するため、またはproduct.Description.Current説明を表示するために電話する必要がありました。条件付きのものは必要ありません。ある日、利害関係者はnull、JSON を使用して、APIで別の方法で表示するように要求しました。また、「Price unspecified [Change]」と表示することにより、コンテンツマネージャーにとっても異なります。そして、私は最愛のヌルオブジェクトパターンを殺さなければなりませんでした。それはもはや必要ではなかったからです。 同様に、いくつかの抽象的な工場といくつかのビルダーを削除しなければなりませんでした.3か月間、基礎となるインターフェイスが1日に2回変更されたため、美しいFacadeパターンを直接のugい呼び出しに置き換えました。関係するオブジェクトはコンテキストに応じて異なる必要があることを要件が告げたとき。 3週間以上の作業は、デザインパターンを追加してから1か月後にそれらを引き裂くことで構成され、私のコードは最終的に自分を含む誰もが維持できないほどのスパゲッティになりました。そもそもこれらのパターンを使用しない方が良いと思いませんか? 確かに、要件が絶えず変化し、製品の凝集性や一貫性を実際に意識していない人によって指示されるようなタイプのプロジェクトで自分自身で作業する必要がありました。この文脈では、あなたがどれだけ機敏であるかは問題ではなく、問題に対する洗練された解決策があり、最終的にそれを実装すると、要件が大幅に変更され、エレガントな解決策が適合しないことがわかりますもはや。 この場合の解決策は何ですか? デザインパターンを使用せず、思考を停止し、コードを直接記述しますか? チームがコードを直接記述している間に、別のチームが入力前に2回考えて、数日後に元のデザインを破棄するリスクを冒すような体験をするのは興味深いでしょう。同じ技術的負債。そのようなデータがない場合、20人月のプロジェクトに取り組むとき、事前に考えずにコードを入力するのは適切ではないと断言するだけです。 もう意味をなさないデザインパターンを維持し、新しく作成された状況にさらにパターンを追加しようとしますか? これも正しくないようです。パターンは、コードの理解を簡単にするために使用されます。パターンを入れすぎると、コードが混乱してしまいます。 新しい要件を含む新しいデザインを考え始めてから、古いデザインをゆっくりと新しいデザインにリファクタリングしますか? 理論家として、またアジャイルを好む人として、私は完全にそれに夢中です。実際には、毎週ホワイトボードに戻って以前のデザインの大部分をやり直さなければならないこと、そしてその費用を支払うだけの十分な資金も顧客も待つ時間がないことを知っているとき、これはおそらく動作しません。 だから、提案はありますか?

1
LGPL 2.1とLGPL 3.0の長所と短所
私が読んだことから、LGPL 3.0では、ライセンスを他のライセンスと一緒に使用することができ、それについてより寛容です(それについてさえ確信していません)。https://www.gnu.org/licenses/gpl-faq.html#AllCompatibilityはLGPL 2.1はそれと互換性がありながら、それは、GPLv2のと互換性がないことを言います。それは私が読んだこととは少し反対です... それで、LGPL 2.1と比較したLGPL 3.0の本当の長所と短所は何か知っていますか? 1つの欠点は、GPLv2と互換性がないことです。
32 licensing  gpl  lgpl 

7
機能を実装するための良いアイデアがない場合はどうなりますか?[閉まっている]
私は自分のアプリケーションに取り組んでおり、立ち往生しています。機能を実装する必要がありますが、この機能を実装するための適切なアプローチが見つかりません。私は数日間それについて考えていました、そして、良い考えは来ませんでした。インターネットを検索してもインスピレーションは得られませんでした。 先に進む必要がありますが、何が最良かを知りたいです。 もっと考え、もっと待って、最良のアプローチを探し続けてください 時間を無駄にするのをやめて、貧弱なデザインから始め、すべてをテストでカバーする どう思いますか?前にも言ったように、私は自分のアプリケーションに取り組んでいます。期限はありませんが、できるだけ早くアプリのコーディングを終了したいと思います。
32 design 

2
ブール値が1ビットのみを必要とするのにコンピューターの内部にバイトとして保存されるのはなぜですか
私は最近、コードを書くことを学び始めましたが、私の本でこの質問に出会いました。「1ビットしか必要としないのに、なぜブール値がコンピューターの内部にバイトとして保存されるのですか?」誰かがこの質問にもっと光を当てることができますか?

3
最小の驚きの原理は何ですか?
プログラミングでは、最小原理の原理と呼ばれるものは何ですか?この概念は、優れたAPIの設計にどのように関係していますか?これはオブジェクト指向プログラミングのみに適用されるものですか、それとも他のプログラミング手法にも浸透していますか?これは、「メソッドで1つのことを実行し、それをうまく実行する」という原則に関連していますか?

1
最新のCPUでの単一割り当てADT指向コードのパフォーマンス
単一の割り当てで不変データを操作すると、より多くのメモリが必要になるという明らかな効果があります。これは、常に新しい値を作成しているためです(ただし、隠れたコンパイラーはポインタートリックを実行して問題を軽減します)。 しかし、CPU(具体的にはそのメモリコントローラー)がメモリが(それほど)変化していないという事実を利用できるという点で、パフォーマンスの低下よりもパフォーマンスの低下を上回ることを何度か耳にしました。 私は誰かがこれが本当であるかどうか(またはそうでない場合)に光を当てることを望んでいました。 で別のポストにコメントそれがいることを言及した抽象データ型(ADTのは)私は、さらに好奇心作られたこれに関係しています、どのようにADTは、具体的にメモリとCPUの取引方法に影響しますか?ただし、これは別ですが、ほとんどの場合、言語の純度がCPUおよびそのキャッシュなどのパフォーマンスに必ず影響することに興味があります。

2
スケーラブルな通知システムを設計する方法は?[閉まっている]
通知システムマネージャーを作成する必要があります。 私の要件は次のとおりです。 異なるプラットフォームで通知を送信できる必要がありますが、これは完全に異なる場合があります(たとえば、SMSまたはEメールのいずれかを送信できる必要があります)。 通知は、特定のプラットフォームのすべての受信者で同じ場合もありますが、プラットフォームごとの受信者(または複数)ごとの通知である場合もあります。 各通知にはプラットフォーム固有のペイロードを含めることができます(たとえば、MMSにはサウンドまたは画像を含めることができます)。 システムはスケーラブルである必要があり、アプリケーションまたはサーバーをクラッシュさせることなく、非常に大量の通知を送信できる必要があります。 これは2段階のプロセスです。最初に顧客がメッセージを入力し、送信先のプラットフォームを選択します。その後、リアルタイムで処理されるように通知を作成する必要があります。 次に、システムはプラットフォームプロバイダーに通知を送信する必要があります。 今のところ、私はいくつかの結果になりますが、どれだけスケーラブルであるか、またはそれが良いデザインであるかどうかはわかりません。 私は次のオブジェクトを(疑似言語で)しました: 汎用Notificationオブジェクト: class Notification { String $message; Payload $payload; Collection<Recipient> $recipients; } 次のオブジェクトの問題は、受信者が1.000.000だったらどうなりますか?Recipientオブジェクトが非常に小さい場合でも、メモリを大量に消費します。 受信者ごとに1つの通知を作成することもできますが、一部のプラットフォームプロバイダーはバッチで送信する必要があるため、複数の受信者で1つの通知を定義する必要があります。 作成された各通知は、DBやRedisなどの永続ストレージに保存できます。 これを後で集約してスケーラブルであることを確認するのは良いことでしょうか? 2番目のステップで、この通知を処理する必要があります。 しかし、適切なプラットフォームプロバイダーへの通知をどのように区別できますか? をMMSNotification拡張するようなオブジェクトを使用する必要がありabstract Notificationますか?または何かのようなNotification.setType('MMS')? 大量の通知を同時に処理できるようにするには、RabbitMQのようなメッセージングキューシステムが適切なツールであると考えています。それは...ですか? これにより、大量の通知をキューに入れ、複数のワーカーに通知をポップして処理させることができます。しかし、上記のように受信者をバッチ処理する必要がある場合はどうなりますか? 次に、プラットフォームプロバイダーを接続して通知を実行するために、それぞれNotificationProcessor追加できるオブジェクトを担当することを想像します。NotificationHandlerNotificationHandler を使用しEventManagerて、プラグイン可能な動作を許可することもできます。 フィードバックやアイデアはありますか? お時間をいただきありがとうございます。 注:私はPHPでの作業に慣れており、おそらく選択した言語です。 編集 (morphunrealの答えによる) 1秒間に送信するメッセージの数(現在/初期レベルを定義し、再設計する前にシステムが処理する必要がある最大レベルを定義します) システムのハードウェア制約(システムで使用可能なメモリ、CPUなど) ハードウェアはどのように拡張されますか(つまり、サーバーの追加、クラウドコンピューティングなど) どの言語/システムが通知を生成しますか? 通知はプログラムで作成しますが、UIから作成するのは私自身です。 ジェネレーターはメッセージの受信者を知っていますか(?)、または他の手段で提供されていますか(つまり、特定のアラートタイプのビジネスルールは特定の受信者に送信されます) 特定の受信者、受信者のグループ(たとえば、タグシステムを使用)、またはプラットフォーム全体に対して通知を作成できる必要があります。 CC / BCC /開封確認を追加するためのビジネスルールはありますか はい。これは実際にはプラットフォーム固有であり、readまたはccはすべてのプラットフォームで利用できるわけではないことに注意してください。 …

9
レビューを待つときはどうすればよいですか?
私の質問をする前に、状況を説明しなければなりません。 私は会社でジュニアソフトウェアエンジニアとして働いています。私の開発を終えてコミットしたいとき、先輩の一人はいつも私を止めます。 彼はいつも彼がそれをレビューするのを待って欲しい。通常、彼はいくつかのバグを見つけて、いくつかの最適化を行うため、これは問題ありません。 ただし、期限までにコードをコミットする必要があります。終わったら彼に電話して、終わったと言います。彼は通常遅れる。私のコードも遅れています。 私の質問は、どうすればいいですか?レビューを待つ必要がありますか? 編集:質問への追加。もう1つ問題があります。 コーディングするときは自由になりたいです。開発の自由に対する信頼をどのようにして得ることができますか? いくつかの説明: これについて彼と話しました。しかし、それは助けにはなりませんでした。既に課題追跡を使用していますが、レビューのタスクはありません。開発タスクとテストタスクのみがあります。

10
C ++でベクターを介してリストを使用する意味は何ですか?
C ++リストとベクターを含む3つの異なる実験を実行しました。 中間に多くの挿入が含まれていた場合でも、ベクトルを使用したものはより効率的であることが証明されました。 したがって、質問:どの場合、リストはベクトルよりも意味がありますか? ほとんどの場合、ベクトルがより効率的であると思われ、それらのメンバーがどれだけ似ているかを考えると、リストにはどの利点が残っていますか? N個の整数を生成し、コンテナに入れて、コンテナがソートされたままになるようにします。挿入は、要素を1つずつ読み取り、最初の大きい要素の直前に新しい要素を挿入することにより、単純に実行されました。 リストを使用すると、ベクトルと比較して寸法が大きくなると屋根を通過します。 コンテナの最後にN個の整数を挿入します。 リストとベクトルの場合、時間は同じ桁数増加しましたが、ベクトルの場合は3倍高速でした。 コンテナにN個の整数を挿入します。 タイマーを開始します。 リストにはlist.sortを使用し、ベクターにはstd :: sortを使用してコンテナをソートします。タイマーを停止します。 繰り返しますが、時間は同じ桁で増加しますが、ベクトルでは平均で5倍速くなります。 引き続きテストを実行し、リストの方が良い例がいくつか見つかるかもしれません。 しかし、このメッセージを読んでいる皆さんの共同経験は、より生産的な答えを提供するかもしれません。 リストの使用がより便利だったり、パフォーマンスが向上したりする状況に出くわしたことがありますか?

4
GITを使用してプロジェクトで作業している複数の人を管理する
私はGIT / GitHubを初めて使用します(昨日から新しいように)。Githubで同じプロジェクトに取り組んでいる複数の人々を管理するための最良の方法は何かを知りたいです。現在、私は4人の開発者で1つのプロジェクトを管理しています。 ワークフローを実行して、すべてが同期していることを確認するにはどうすればよいですか? (注:すべての開発者は1つのユニバーサルアカウントを持ちます。) 各開発者は異なるブランチにいる必要がありますか? 同じファイルで作業している2人を処理できますか? 詳細な回答を投稿してください。私は恥ずかしがり屋ではありません。これをよく理解する必要があります。
32 git  github 

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