ソフトウェア工学

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

10
チームに新しい開発者を追加する方法
私は2人の開発者で構成される小さな会社を経営しています。私たちは、クライアントの1人に対して非常に大きなアプリケーションを構築しています。このプロジェクトの開発は1.5年間続いています。 現在、このクライアントは重要なスポンサーを獲得しており、このプロジェクトに関連するイベントを開催しています。だから今、私たちは2ヶ月で期限があり、私たちはそれを見逃すことはできません。 チームに新しい開発者を追加することを考えていますが、彼の統合を支援するために何ができるのかと思います。 これが状況です: ブルックスの法則の限界に近づいています-新しい開発者を追加するときのポイントは非生産的です。 アプリケーションは比較的適切に設計されていますが、実装はいくつかの点で混isとしています(特に古いコード)。 ユニットテストは、より新しいコードに対してのみ行われます。このプロジェクトが始まったとき、私たちは定期的にテストを行いませんでした。 ドキュメントとコメントは不完全です。 アプリケーションは大規模で複雑です。 クライアントは、プロジェクトに関するほとんどすべての詳細を、非常に明確で「プログラマーに優しい」方法で書き留めています。 今すぐ人を追加することをお勧めしますか?もしそうなら、新しい開発者がチームに統合するのを助けるために何ができますか? 編集: スポンサーは来春にインターネットベースのスポーツイベントを開催しています。年の特定の日に開始する必要があります。変更することはできません。 開発者(私は2人のうちの1人)がする必要があるのは: 既存のアプリケーションを完了します(実行する作業の約25%)。 このイベントの組織に不可欠な新しいモジュールの作成(行う作業の約75%)。この新しいモジュールは、メインプログラムのAPIを理解しないと開発できません。 正確な時間の見積もりはできませんが、私たちは危険な状況にあります。

5
アプリケーション設定を読み込む最良の方法
Javaアプリケーションの設定を保持する簡単な方法は、特定の値(この値は数字、文字列、日付など)に関連付けられた各設定の識別子を含む「.properties」拡張子を持つテキストファイルで表されます。 。C#は同様のアプローチを使用しますが、テキストファイルには「App.config」という名前を付ける必要があります。どちらの場合も、ソースコードでは、設定を読み取るために特定のクラスを初期化する必要があります。このクラスには、指定された設定識別子に関連付けられた値を(文字列として)返すメソッドがあります。 // Java example Properties config = new Properties(); config.load(...); String valueStr = config.getProperty("listening-port"); // ... // C# example NameValueCollection setting = ConfigurationManager.AppSettings; string valueStr = setting["listening-port"]; // ... どちらの場合も、構成ファイルから読み込まれた文字列を解析し、変換された値を関連する型付きオブジェクトに割り当てる必要があります(この段階で解析エラーが発生する可能性があります)。解析ステップの後、設定値が特定の有効領域に属していることを確認する必要があります。たとえば、キュ​​ーの最大サイズは正の値である必要があり、いくつかの値は関連している場合があります(例:min <max )、 等々。 アプリケーションが起動するとすぐに設定をロードする必要があると仮定します。つまり、アプリケーションによって実行される最初の操作は設定をロードすることです。設定の無効な値は、自動的にデフォルト値に置き換えられる必要があります:これが関連する設定のグループに発生した場合、それらの設定はすべてデフォルト値で設定されます。 これらの操作を実行する最も簡単な方法は、最初にすべての設定を解析し、次に読み込まれた値をチェックし、最後にデフォルト値を設定するメソッドを作成することです。ただし、このアプローチを使用する場合、メンテナンスは困難です。アプリケーションの開発中に設定の数が増えると、コードの更新がますます難しくなります。 この問題を解決するために、次のようにTemplate Methodパターンを使用することを考えていました。 public abstract class Setting { protected abstract bool TryParseValues(); protected abstract bool …

7
1つのことだけを行うクラスのパターン
のは、私が手続き持っていると言うものを行うに: void doStuff(initalParams) { ... } 今、私は「何かをする」ことは非常に複雑な操作であることを発見しました。手順は大きくなり、複数の小さな手順に分割し、すぐに何かを行うときに何らかの状態を持つことが有用であることに気付きました。したがって、私はそれを独自のクラスに分解します: class StuffDoer { private someInternalState; public Start(initalParams) { ... } // some private helper procedures here ... } そして、私はこれを次のように呼び出します: new StuffDoer().Start(initialParams); またはこのように: new StuffDoer(initialParams).Start(); そして、これが間違っていると感じるものです。.NETまたはJava APIを使用するとき、私は常にを決して呼び出さないためnew SomeApiClass().Start(...);、間違っていると思われます。確かに、StuffDoerのコンストラクターをプライベートにし、静的ヘルパーメソッドを追加できます。 public static DoStuff(initalParams) { new StuffDoer().Start(initialParams); } しかし、その場合、外部インターフェイスが1つの静的メソッドのみで構成されるクラスがあり、これも奇妙に感じます。 したがって、私の質問:このタイプのクラスには定評のあるパターンがありますか? エントリポイントが1つしかない 「外部的に認識可能な」状態がありません。つまり、インスタンス状態はその1つのエントリポイントの実行中にのみ必要です。

4
アジャイルマニフェスト原則の特定のポイントを理解できない
私はアジャイルマニフェスト原則を読んでいました。1点を除いて、すべてが明確で合理的なようです。 シンプルさ-完了していない作業量を最大化する技術-は不可欠です。 これはわかりません。これは、行われなかった作業が何らかの形で誇張されるべきであることを意味しますか?もしそうなら、それは本当に意味をなさない。
24 agile  management 

8
「モジュール性」を達成するために部分クラスを使用することは一般的ですか?
私は最近、別のチームが部分的なクラスとして135個のファイルに分割された約800個のメソッドを含む「ゴッドクラス」を作成するというコードベースの状況に遭遇しました。 私はこれについて他のチームに尋ねました。私の腸の反応は軌道からそれを消すことでしたが、彼らはそれが良い設計であり、一般的な慣行であり、新しい開発者は残りの知識がほとんどなくても機能をボルトで固定できるため、「モジュール性」と「実装の容易さ」を促進すると主張しますシステムの。 これは実際に一般的な慣行ですか、それとも何らかの方法で良いアイデアですか?私はこの獣を倒す(または少なくともそれがさらに成長するのを防ぐ)ためにすぐに対策を講じたいと思っていますが、私は自分が間違っていると信じています。
24 c#  .net 

3
双方向同期の競合解決
接続が常に利用可能ではないことを前提として、「メイン」データベースサーバーと多くの「セカンダリ」サーバー間の双方向同期、特に競合解決をどのように管理しますか? たとえば、iOSでCoreDataを「データベース」として使用するモバイルアプリがあり、ユーザーがインターネットに接続せずにコンテンツを編集できるようにしたいと考えています。同時に、この情報はデバイスが接続するWebサイトで入手できます。2つのDBサーバーのデータが競合している場合/その場合はどうすればよいですか? (CoreDataをDBサーバーと呼びますが、多少異なることがわかります。) この種の問題に対処するための一般的な戦略はありますか?これらは私が考えることができるオプションです: 1.常にクライアント側のデータを優先度の高いものとして使用します 2.サーバー側でも同じ 3.各フィールドの編集タイムスタンプをマークして最新の編集を行うことで競合を解決してください 3番目のオプションは壊滅的なデータ破損の余地を開くと確信していますが。 CAP定理がこれに関係していることは承知していますが、最終的な整合性のみが必要なので、完全に除外するわけではありませんか? 関連質問:双方向データ同期のベストプラクティスパターン。この質問に対する2番目の答えは、おそらくそれができないということです。

6
本番環境で問題が発生した場合の問題を理解する
シナリオ: 本番にプッシュします プッシュは複数のことを壊しました その同じビルドはqaまたはdevを壊しませんでした 開発者は、製品にアクセスできません。 物事を機能させるには、上から多くのプレッシャーがあります。 詳細: ZendでAPI駆動型のPHP / MVCアプリケーション。 少数のサーバーに展開されました。 私の質問: 調査中に、何かが間違っているという予感があるとしましょう。しかし、私は確かに知りません。そしてもちろん、実稼働環境でテストすることはできません。その考えに基づいて修正案を提案している場合、問題が何であるかを理解する前に、それを試して適用し、機能するかどうかを確認するのが賢明でしょうか?
24 bug  production 

4
BDDは実際に非プログラマーによって書き込み可能ですか?
象徴的な「Given-When-Then」シナリオ構文を使用した動作駆動型開発は、ソフトウェア機能評価の境界オブジェクトとして使用できる可能性があるため、最近非常に誇張されています。 Gherkin、またはどちらの機能定義スクリプトでも、ビジネスで読み取り可能な DSLであり、すでにそのような価値を提供していることは間違いありません。 ただし、プログラマではない人が書き込み可能であることに同意しません(Martin Fowlerも同様です)。 プログラマ以外の人が作成し、開発者がインスツルメントしたシナリオのアカウントを持っている人はいますか? 書き込み可能性の欠如についてコンセンサスがある場合、シナリオを開始してそれらをインストルメント化する代わりに、実際のテストからビジネスで読み取り可能なシナリオを生成するツールに問題がありますか? 更新:「シナリオジェネレータ」ツールに関しては、もちろんビジネス言語を魔法のように推測することはありません;)しかし、現在、正規表現マッチャーを使用して(抽象化次元で)トップダウンアプローチでテストを作成するように、ボトムアップアプローチでシナリオを作成する文字列ビルダー。 「アイデアのみを提供する」例: Given I am on page ${test.currentPage.name} And I click on element ${test.currentAction.element} …

3
コンポーネントエンティティシステムアーキテクチャを使用してアプリケーション(ゲームではない)を構築するのは妥当ですか?
Apple AppStoreやGoogle Playアプリストアなどのアプリケーション(ネイティブまたはWeb)を構築するとき、Model-View-Controllerアーキテクチャを使用することは非常に一般的であることを知っています。 ただし、ゲームエンジンで一般的なComponent-Entity-Systemアーキテクチャを使用してアプリケーションを作成することは合理的ですか?

7
なじみのないプラットフォームやフレームワークを常に使用している場合、期限を設定/満たします[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 私は、オンライン広告を扱っている製品開発組織で働いています。私が受け取る割り当ては、ほとんどの場合、以前に取り組んだことのないプラットフォームまたはツール上にあります。最初はアンドロイドでした。次に、node.js、Windows Phone、Debianパッケージング、次にpython、hadoop、ganglia、リバースエンジニアリング、geo PostgreSQL、そしてリストが続きます。 仕事中に多くのことを学ぶことができてうれしいです。私が直面し続ける問題は、期限を守ることです。多くの場合、特定のタスクを達成するために何をする必要があるかが明確ではありません。関連するSDKをセットアップし、最初の問題に遭遇し、オンラインで読み、ドキュメントを調べ、そのプラットフォームのすべての作業項目についてオンラインで調査する必要があります。時には期限が与えられ、時にはそれらの期限を作成します。 何度も締め切りに間に合わせるのは非常に難しいと思います。2回目に何かをするのが速くなりますが、1週間か2週間以上、言語やフレームワークを使用することはありません。そして、これは非常にストレスが多く、対処するのに苦痛です。締め切りが間に合わないという、あからさまな公共の恥をかきます。これは正常ではないのではないかと思います。1週間でc#について1つのことしか知らない7つのwindows aphoneアプリを配信することはできません。しかし、私は締め切りの1日後にそれを行うことができました。私が多くの時間を持っているのは、私を導くGoogle検索です。多くの場合、カスタマイズしているツールに関するドキュメントはほとんど、またはまったくありません。 何時間か、あるいは何日もの間、時々何かにこだわることがあります。これは私の健康に打撃を与え、私はもはやすべてのタスクのために真夜中の油を燃やすことができません。これは、多くの精神的苦痛とうつ病を引き起こします。 このような状況で、私が提供する期限は暗闇での撮影だと思うのは正しいですか? これは正常ですか?あなたのためのすべてのワークアイテムには、毎回完全に新しい何かを学ぶことが含まれますか?自分が何も知らないツールに関係するタスクの締め切りに間に合わないために、自分が貧弱なパフォーマーだと言ってもいいかどうかはわかりません。これをどのように処理しますか?

10
単体テストは開発ですか、それともテストですか?
ユニットテストと統合テストの役割について、テストマネージャーと話し合いました。彼女は、開発者にユニットと統合のテスト内容とその方法を報告するように要求しました。私の考えでは、単体テストと統合テストはテストプロセスではなく開発プロセスの一部です。セマンティクスを超えて、ユニットテストと統合テストをテストレポートに含めるべきではなく、システムテスターがそれらについて心配するべきではないということです。私の推論は2つのことに基づいています。 ユニットおよび統合テストは、常にインターフェイスと契約に対して計画および実行されます。正式な契約を使用するかどうかに関係なく、メソッドが何をすべきか、つまり契約をテストします。 統合テストでは、2つの異なるモジュール間のインターフェイスをテストします。インターフェイスとコントラクトは、テストに合格するタイミングを決定します。ただし、システム全体の限られた部分を常にテストします。一方、システムのテストは、システムの仕様に照らして計画および実行されます。仕様は、テストに合格するタイミングを決定します。 ユニットテストと統合テストの幅と深さを(システム)テスターに​​伝えることには価値がありません。特定のビジネスレイヤークラスで実行される単体テストの種類を一覧表示するレポートを作成するとします。彼/彼女はそれから何を奪うことになっていますか? それからテストすべきものとすべきでないものを判断することは、すべての単体テストと統合テストに合格してもシステムがまだ仕様どおりに機能しない可能性があるため、誤った結論です。 これは役に立たないアカデミックな議論のように思えるかもしれませんが、私と同じように厳密に正式な環境で作業している場合、私たちが物事をどのように行うかを決定する上で実際に重要です。とにかく、私は完全に間違っていますか?

5
データベースを再設計するためのベストプラクティス
アプリケーション用のデータベースを設計する際の一般的なベストプラクティスをいくつか知っていますが、再設計についてはどうですか? 私は「内部」と言っているにも関わらず、内部ビジネスアプリケーションの再設計を担当するチームに所属していますが、残念ながら、システムの実際のユーザーとの接触から多くの層の人々がいます。 現在のプログラムはOracle Formsにあり、非正規化された多数のテーブルに散らばっています。場合によっては、互いのデータにわずかな異形を持つ複数のほぼ重複したテーブルがあります。多くの場合、制約は、適切に実施されていないストアドプロシージャの形式です。型でさえ正しく保存されていないようです。Oracleが無視しているように見えますが、SQL Serverのインポート/エクスポートウィザードに適合する(そして当然のことながら)あらゆる種類の不正なデータに遭遇しました。(たとえば、2桁の整数は完全な日時を構成しません!) 元のプログラムはおそらく20年前に遡り、元の開発者は皆かなり前に退職しているため、ここの年配の人でさえ自分が誰であるかわかりません。その結果、明確な要件をクリアする必要もありません。既存のアプリケーションの機能を複製し、既存のデータを保持するだけです。 書き換えの最終結果は、バックエンド用のMS SQL Serverを備えたASP.NET上で実行されるWebベースのバージョンになります。 私の他の2人の開発チームメイトは、私よりはるかに年上で、どちらもビジネス/ MISのバックグラウンドを持っていますが、私の場合はCSです。シニアメンバーの経験はほとんどOracleフォームのみであり、他のメンバーはほとんどがVisual Basicでビジネスアプリケーションの作業を行っています。私のデータベースの背景は、MySQLまたはSQLiteのプロジェクト用の新しいデータベースの設計に限られていますが、ほとんどは私の学部クラスですが、実際にデータベースを設計した経験があるのは私だけです。 既存のすべてのデータをニュートラル形式に読み込み、再キャストして新しいデータベースに配置する準備ができたC#で小さなプログラムを既に作成しました。宛先データベースの設計後にロードインコードを記述することで、データを新しい正規化されたテーブルに適切に分割し、新しい順序に従って正しい順序で追加するなどして、同じプログラムを後で実行できるようにする予定です。生産データを実際に新しく展開された再設計にコピーします。これにより、データベースの実際の再設計が主要な問題として残ります。 だから私の質問の中心:既存のアプリケーションのデータベースレベルアップから再設計を行うためのいくつかのベストプラクティスは何ですか?

9
複雑さを追加して重複コードを削除する
私はすべてが一般的な基本クラスから継承するいくつかのクラスを持っています。基本クラスには、typeのいくつかのオブジェクトのコレクションが含まれますT。 各子クラスは、オブジェクトのコレクションから補間値を計算できる必要がありますが、子クラスは異なるタイプを使用するため、計算はクラスごとにわずかに異なります。 これまで、コードをクラスからクラスにコピー/ペーストし、それぞれに小さな変更を加えました。しかし、今は重複したコードを削除し、基本クラスの1つの汎用補間メソッドに置き換えようとしています。しかし、それは非常に困難であることが証明されており、私が考えているすべての解決策は非常に複雑に思えます。 DRYの原則はこのような状況にはあまり当てはまらないと思い始めていますが、それは冒aspのように聞こえます。コードの重複を削除しようとすると、どれだけ複雑になりますか? 編集: 私が思いつく最良の解決策は次のようなものです: 基本クラス: protected T GetInterpolated(int frame) { var index = SortedFrames.BinarySearch(frame); if (index >= 0) return Data[index]; index = ~index; if (index == 0) return Data[index]; if (index >= Data.Count) return Data[Data.Count - 1]; return GetInterpolatedItem(frame, Data[index - 1], Data[index]); } protected abstract T GetInterpolatedItem(int …

13
より良いバグ修正ツールになる
プログラマーであることが大好きです。そこで、私はそれを言った。しかし、そうは言っても、私は本当にバグ修正に耐えられないことに最近気付きました。まったく。 実際、私は何かを開発している間、私の生産性は非常に高いです。単体テストを作成し、開発の自己テストを行う場合でも、私は一般的に本当に生産的です。私はうまく集中することができ、タスクを完了することができます。 ただし、QAの時間が来て、バグの修正に取り組んでいるとき、私のインスピレーションは非常に急降下します。何かを成し遂げるには、かなり極端な手段(BPMの高い音楽、カフェインの過剰な量など)を強制する必要があります。私の仕事は通常、既存の大規模なプロジェクトに足を踏み入れ、新しい機能を追加したり、バグを修正したりすることです。そのため、すべてのコードのユニットテストを書くのに数週間かかることを雇用主に正確に伝えることはできません:)私たちがよく使用するサーバー技術は、ユニットテストと統合テストの両方で非常に禁止されています。Javaクラスローダーの問題がかなりあるからです。私は完全にバグ修正に反対しているわけではありません。時には楽しいこともありますが、まったく楽しくはありません。 マイナーな変更を加え、それらが機能するかどうかを確認できるように30秒から3分間待機する必要がある場合(システムの動作方法による)。 バグ修正時の生産性とモチベーションを改善するにはどうすればよいですか?これはほとんどのプログラマーが対処するものですか?

3
実際のMySQLとPHPでの日時とタイムスタンプの比較
データ型を日時またはタイムスタンプとして指定する方法がわかりません。両方のイベントが必要ですが、両方が必要になると思います。私のウェブサイトは世界中で製品とサービスを販売しており、ユーザーがログインするためのアカウントシステムも持っています。以下を明確にしてください: お客様が私のウェブサイトから製品を購入する現在の日時:日時? システムから計算された場所と購入日時に基づく配達日時:日時? 前回アカウントにログインしたとき:タイムスタンプ? 購入日(現在の日付)を保存し、データベースに保存するためのPHPのコードは何ですか? インターネットで多くの説明を読んだ後、私はまだそれを理解できないので、それらのそれぞれの使用方法を詳しく説明してください。
24 php  mysql 

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