ソフトウェア工学

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

1
関数型言語のUIパターン
ClojureScriptをいじり始めたいのですが、いくつかの点に困惑しています。私の問題は、機能的に作業しようとするときに、ユーザーの対話から生じる状態の変化に対処するための良い方法です。 いくつか例を挙げましょう。ブラウザーで実行されるアプリケーションを念頭に置いていますが、問題はより一般的だと思います。もちろん、何かが変化します-少なくともDOMです。しかし、不変のデータ構造で動作するように残りのコードを整理する方法を見つけたいと思います。 1)イベントをDOMオブジェクトに添付したいとします。これは主に機能的な方法で行うのは難しくありません。ノードを作成するときに、さまざまなイベントハンドラーでハッシュマップをアタッチします。ただし、イベントの委任を使用している場合を考えてください。次に、新しいノードを作成するときに、おそらく既に存在する親ノードにイベントハンドラーをアタッチできます。そのため、既存のノードに関連付けられているハッシュを変更する必要があります。 2)入力フィールド用のオートコンプリートモジュールを設計しているとします。ユーザーがキーを押すたびに、提案を得るためにサーバーを呼び出すことができます。これは簡単です。しかし、今それを少し最適化したいと思います。一致するすべての結果fooがわかっている場合は、一致するすべての結果を再度要求しても意味がありませんfoobar。前者をフィルタリングできます。そのため、何らかのキャッシュを作成する必要があります。このキャッシュは、ユーザーが以前に入力した単語のスーパーセットではない新しい単語を挿入するたびに更新されます。繰り返しますが、キャッシュをどのようにモデル化するのですか?最も合理的な方法は、単語を結果にマッピングするハッシュマップのようですが、変更可能である必要があります。 ユーザーの操作による変更を機能設計に組み込むのを容易にするいくつかのパターンを提案できますか?

5
関数型プログラミングのデータ構造
私は現在LISP(特にSchemeとClojure)で遊んでいますが、関数型プログラミング言語で典型的なデータ構造がどのように扱われるのか疑問に思っています。 たとえば、グラフパス検索アルゴリズムを使用して問題を解決したいとします。そのグラフを関数型プログラミング言語(主にLISPに適用できる純粋な関数型に興味がある)で表現するにはどうすればよいでしょうか?グラフを完全に忘れて、他の方法で問題を解決できますか?

3
BDDの概念を採用したがらないチームに「販売」するために、どのような議論を使用できますか?
私は、行動駆動開発方法論(別名BDD)の声明的な支持者です。私は数年前からBDDを適用してきましたが、DotNetアプリケーションを開発する際の選択のフレームワークとしてStoryQを採用しました。私は長年ユニットテストを行っており、以前はテストファーストのアプローチに移行していましたが、BDDフレームワークを使用することでより多くの価値が得られることがわかりました。コード内の英語をクリアします。テストはテストを途中で終了することなく複数のアサーションを実行できるため、デバッグすることなく、どの特定のアサーションが合格/失敗するか一目で確認できます。 これは本当に私にとって氷山の一角でした。テストコードと実装コードの両方をより的を絞った方法でデバッグできることにも気づきました。その結果、生産性が大幅に向上し、ビルドログに出力されるために問題が統合ビルドに至るまでに発生した場合、障害が発生した場所を簡単に判断できます。さらに、StoryQ apiには、習得が容易で、非常に多くの方法で適用できる美しい流な構文があり、使用するために外部の依存関係を必要としません。 したがって、これらすべての利点があれば、チームの他のメンバーにこのコンセプトを簡単に導入できると思います。残念ながら、他のチームメンバーはStoryQを見てそれを適切に評価することを嫌がり(BDDを適用するというアイデアを楽しまないでください)、お互いの説得力のあるテストフレームワークから多くのStoryQ要素を削除しようと互いに確信していますただし、元々StoryQの使用をサポートしており、削除したいコードがテストシステムの他の部分に影響を与えることはありませんでした。そうすると、特定の作業環境でテストファーストで作業するより良い方法であり、より大きな結果につながるだけであると実際の経験から確信しているので、全体的にワークロードが大幅に増加し、実際に穀物に反することになります私のソフトウェアの品質の改善 veは、BDDを使用して最初にテストに固執する方が簡単だと感じました。さらに明確にするために、私たちが行った単体テストの大部分は非常に脆弱で維持が難しい傾向があります。テスト駆動型プロセスに固執することを嫌がって開発者が古い習慣に戻り、プロジェクトの最後にすべてのテストを行います(同じ人がアジャイルだと主張しています!)。 したがって、質問は次のようになります。 このチームがStoryQを使用すること、少なくともBDD方法論を採用することの方が良いと主張するために、どのような議論を使用できますか? BDDを標準的な選択方法として採用するという私の主張を裏付けるために使用できる事例証拠を教えてください。 チームがBDDを採用することを奨励したいという私の希望が間違っている可能性があることを示唆する反論はありますか?はい、議論が健全なものであれば、間違っていることが証明されてうれしいです。 注:テスト全体を書き直すことを推奨するのではなく、将来のすべてのテスト作業のために、できればお客様と交わる方法で異なる方法で作業を開始することを推奨します。 また、BDDの詳細については、次のリンクが役立ちます。 http://dannorth.net/introducing-bdd/ http://en.wikipedia.org/wiki/Behaviour_driven_development http://behaviour-driven.org/Introduction 詳細に興味がある人のために、私たちは4人の小さなチームで約5つの大きなプロジェクトに取り組んでいます。BDDの「パイロットトライアル」は、最初は約2か月間、その後約4か月間実行されました。チームは、私がこの方法で作業を続ける必要があることを受け入れ、独自のトライアルを行うことになりました。トライアルが終了してから約2年間BDDを行っていますが、他の人は問題をうまく解決することができました。この問題について「対立」を強要するのではなく、私はチームを優しく説得して、集団の背後から抜け出し、少し時間をとる方法を探しています。

5
アジャイルプロジェクトで顧客/開発者文化の不一致に対処する
アジャイルの教義の一つは... 契約交渉を介した顧客コラボレーション ...もう1つは... プロセスとツールを介した個人と相互作用 しかし、少なくとも顧客とのやり取りに関しては、根本的な問題があります。 顧客の考え方は、ソフトウェアエンジニアの考え方とは異なります はい、それは少し一般化するかもしれません。間違いなく、そこにあるこれは必ずしも真実ではないところの事業領域は---これらは少数とはるかにかかわらず、間にあります。ただし、多くのドメインでは、典型的な顧客は次のとおりです。 日常の運用上の懸念に関心がある-短距離戦術...必ずしも戦略ではない; 当然のことながら、当面の解決策のみに関係します。 抽象的思想家ではなく、実践的思想家。 ソリューションが将来の懸念をどのようにサポートするかを検討するよりも、「仕事をやり遂げる」ことにずっと興味があります。 一方、理想的には、アジャイルを実践するソフトウェアエンジニアは次のとおりです。 品質についてよく考える人。 少し前もって作業することで、後の労力を大幅に節約できることに感謝する個人。 経験豊富な分析的思想家。 そのため、「顧客コラボレーション」を阻害する傾向がある文化の不一致があるようです。 これに対処する最良の方法は何ですか?
11 agile 

6
開発者、テスター、ビジネスユーザーは1つの統合テストスクリプトを使用する必要がありますか?
開発では、通常、テストする予定のデータ、シナリオ、および実行手順を文書化する独自のテストスクリプトを使用します。これは私の開発テスト計画です。機能がTestに展開されると、テスターは独自に作成したテストスクリプトを使用してテストします。UATでは、ビジネスユーザーは独自のテスト計画を使用してテストします。 振り返ってみると、デベロッパーテストではブラックボックステストとホワイトボックステストが混在し、テスターやビジネスユーザーはブラックボックステストに重点を置いているため、より良いカバレッジが得られるようです。しかし一方で、これはステージごとにのみ実行される別個のテストケース(つまり、テスト担当者がテストステージでのみ実行されると考えるケース)を表示し、開発者がそれを逃したことを望みます。 。 テストスクリプトを最初から統合する価値はありますか?したがって、1つの統一されたテストスクリプトを使用しますか、それともこれを事前に行うのは少し難しいですか?

5
単体テストのコードを繰り返しても大丈夫ですか?
クラス割り当て用のソートアルゴリズムをいくつか作成し、アルゴリズムが正しく実装されていることを確認するためのテストもいくつか作成しました。私のテストの長さは10行に過ぎず、3行ありますが、3行の間で変更されるのは1行だけなので、多くのコードが繰り返されます。このコードを、各テストから呼び出される別のメソッドにリファクタリングする方が良いでしょうか?その後、リファクタリングをテストするために別のテストを作成する必要はありませんか?一部の変数は、クラスレベルまで移動することもできます。テストクラスとメソッドは、通常のクラス/メソッドと同じルールに従う必要がありますか? 以下に例を示します。 [TestMethod] public void MergeSortAssertArrayIsSorted() { int[] a = new int[1000]; Random rand = new Random(DateTime.Now.Millisecond); for(int i = 0; i < a.Length; i++) { a[i] = rand.Next(Int16.MaxValue); } int[] b = new int[1000]; a.CopyTo(b, 0); List<int> temp = b.ToList(); temp.Sort(); b = temp.ToArray(); MergeSort merge = new MergeSort(); …

2
ヨーロッパに拠点を置く企業として、顧客向けにカスタムiPadアプリケーションを作成することは可能ですか?
私たちの顧客は、彼が会社の少数のiPadで使用できるカスタムアプリケーションを作成することを望んでいます。このアプリケーションは、おそらくこの1人の顧客にのみ有用です(将来的にはさらに2、3人が、追加のカスタマイズを行った場合のみ)。 顧客がAppleのVolume Purchasing Programに加入している場合、カスタムB2Bアプリケーションを提供できることを読みました。ただし、これは米国の開発者(または顧客?またはその両方?)に限定されているようです。 ヨーロッパを拠点とする(または、より一般的には米国以外の)ソフトウェア開発者とその地元の顧客の代替手段は何ですか?

4
複数の環境でのGoogleアナリティクス
Google Analyticsを組織で使用することを計画しており、セットアップを担当しています。複数の環境に対処する方法について疑問に思っていました。開発中およびQA中にデータを収集する(または別の分析アカウントにデータを収集する)ことは避けたいのですが、サイトが運用環境に移行したとき(明らかに)にしたいのです。 複数の環境とGoogle Analyticsにどのように対処しますか? Googleアナリティクスに複数のアカウントを設定し、環境に応じていずれかを使用していますか? それが重要な場合は、ASP.NET 2.0を使用しています。


9
ソリッドメソッドと静的メソッド
私がよく遭遇する問題は次のとおりです。Productクラスを持つWebショッププロジェクトがあるとします。ユーザーが製品にレビューを投稿できる機能を追加したい。そのため、製品を参照するレビュークラスがあります。次に、製品に対するすべてのレビューをリストする方法が必要です。2つの可能性があります。 (A) public class Product { ... public Collection<Review> getReviews() {...} } (B) public class Review { ... static public Collection<Review> forProduct( Product product ) {...} } コードを見て、(A)を選択します:静的ではなく、パラメーターを必要としません。ただし、(A)は単一責任原則(SRP)およびオープンクローズド原則(OCP)に違反しているのに対し、(B)はそうではないと感じています。 (SRP)製品のレビューの収集方法を変更する場合、製品クラスを変更する必要があります。ただし、Productクラスを変更する理由は1つだけです。そして、それは確かにレビューではありません。Productの製品と関係のあるすべての機能をパックすると、すぐに散らかってしまいます。 (OCP)Productクラスを変更して、この機能で拡張する必要があります。これは原則の「変更のために閉鎖」部分に違反すると思います。レビューを実施するという顧客の要求を得る前に、私は製品が完成したと考え、それを「クローズ」しました。 より重要なことは、SOLID原則に従うか、よりシンプルなインターフェイスを使用するかです。 それとも私はここで何か間違ったことをしていますか? 結果 素晴らしい答えをありがとう 公式の回答として選ぶのは難しいです。 答えから主な議論を要約しましょう: pro(A):OCPは法律ではなく、コードの可読性も重要です。 pro(A):エンティティの関係はナビゲート可能でなければなりません。両方のクラスがこの関係について知っている場合があります。 pro(A)+(B):両方を行い、(A)から(B)に委任するため、製品が再び変更される可能性は低くなります。 pro(C):finderメソッドを静的でない第3クラス(サービス)に配置します。 コントラ(B):テストのモックを妨げます。 私の職場の大学が貢献したいくつかの追加事項: pro(B):ORMフレームワークは(B)のコードを自動的に生成できます。 pro(A):ORMフレームワークの技術的な理由により、ファインダーの行き先とは無関係に、「閉じた」エンティティを変更する必要がある場合があります。とにかく、私は常に固執することができるとは限りません。 コントラ(C):大騒ぎする;-) 結論 現在のプロジェクトでは、委任で(A)+(B)の両方を使用しています。ただし、サービス指向の環境では、(C)を使用します。

9
リモートフリーランサーを監視する方法を教えてください。[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 8年前に閉鎖されました。 私は世界中のさまざまな場所から何人かの開発者を雇っています。それはすべてうまくいきますが、私は彼らのいくつかが最近あまりにも多くを見落としている私の礼儀正しさを乱用していることがわかります。 彼らはすべて終日雇われています。しかし、1日5時間後には、それほど多くは行われていないことがわかります。 1〜5分ごとにコンピューター画面のスクリーンショットを撮り、システムにアップロードするソフトウェアを開発することを検討しています。ただし、これは極端なことです。 通常、リモート開発者はどのように管理されますか?

2
基本フレームワークが確立されていない状態で、ゼロからスクラムしますか?
私たちは、新しいプロジェクトを開始しようとしている5人の小さなグループです。これは、スクラムでオールインする最初のプロジェクトです。 プロジェクト(フレームワークなど)のベースをどのように確立するかについて、少し苦労しています。このようなタスクは、ユーザーが直接恩恵を受けるものではないため、ユーザーストーリーをどのように書くかを考えるのに苦労しています。 それで、一般に、フレームワークもベースライブラリも配置されていない状態でプロジェクトをゼロから開始する場合、スクラムをどのように使用しますか?

3
コーディング標準で回避できるバグ[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 コーディング標準がバグを減らすのに役立つという主張を裏付ける統計(または推定)を探しています。ハードナンバーはいいと思いますが、私はそれを見つけることをあまり見ていませんでした。さまざまなオープンソースプロジェクトのバグ追跡も検討しましたが、必要なものを見つけるのにあまり成功していません。誰かが私がこれを見つけることができるかもしれない場所を知っていますか?それとも、より良いコーディング標準で回避されたかもしれないバグがあったオープンソースプロジェクトに貢献している人はいますか?

4
スペシャリストチーム向けのスクラム
スクラムは、ジェネラリストメンバーがいるチーム、つまり、少なくとも2人が同じタスクを実行できるチームに最適です。私の主な関心事は、専門家で構成されたチームのためにスクラムを適応させるための優れたソリューション(何を保持し、何を削除し、改善するか)を見つけることです。 5人の開発者からなるチームがあると仮定します(実例ではなく、単なる例です)。 Cの強力なスキルを持つ1人の数学者。 1人のDB開発者。 1人のWeb開発者。 UX / GUI開発者1人。 1人のソフトウェアアーキテクト。 ここでは、すべてがスペシャリストであり、誰も他の誰かを置き換えることはできません(このようなチームを構築するリスクは気にしません。スクラムに集中したいと思います)。だから、スクラムの文脈で、ここに私の考えがあります: 役に立たない春の計画:実際、数学者が特定のタスクに2ポイントの価値があると言ったとき、誰も彼に反対することはできません。 役に立たないチーム速度メトリック:誰もが自分のタスクに任意の数のポイントを割り当てることができるため、速度の計算は意味がありません。 毎日のスクラム会議を毎週(より長い)スクラム会議に置き換えます。チームの各メンバーが自分のタスクに取り組んでいるため、毎日のスクラム会議は「チームスピリット」を維持するために非常に重要です。ただし、毎日のスクラム会議は約15分間続くことになっています。これは明らかに、他の人が何をしていて何をするのかを理解するには不十分です。さらに、数学者はほとんどの場合、同じことを答えます。「私はまだ%&Lo(+?$$ +&)をやっています」...毎週のミーティングでより多くの時間が与えられます。「最初の」スクラム会議と「毎週の」スクラム会議の間で同じ会議時間を維持するには、各週のスクラム会議を継続する必要があります(週5日、4週間のスプリント、スプリント会議は4時間、毎日の会議は15分)。 (4 * 60 + 20 * 15)/ 4 => または、スクラムはまだ使用可能ですか?たぶん別のアジャイル技術を使用する必要がありますか?
11 agile  scrum 

7
不変の参照またはラベルのみを持つ言語の名前変数の良い代替手段は何ですか?
たとえば、関数型言語では、変数は単一の割り当てであり、値は割り当てられると不変です。そのため、バインドされていない状態とバインドされた状態の2つがあり、一度バインドされると変更できません。 そのようなものに最も適した数学用語や他のコンピューター科学用語はありますか?意味的に分散や可変性を意味しないもの。 termなど存在しない場合、およびそのような構造を持つ言語を設計している場合、これらに使用するのは単語変数以外です。 私はアイデアを投票するつもりはありません。そのようなことに対して受け入れられている業界(業界)の用語があるかどうかを把握しようとしています。

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