ソフトウェア工学

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

8
「自動化は簡単」という考え方に対処する方法は?
タイトルはそれをすべて言います。当社の一部の従業員は、自動化されたテストは「簡単」であり、COMおよびUIテストのスイートを作成するには「1日かかる」と考えています。これに対抗するために何ができますか? 注:自動化を促進する方法については質問していません。それは問題ではありません。ここでは常に自動化されたテストとプロセスが促進され、要求されています。問題は、一部の個人は、自動化が「簡単」でも「高速」でもないことを理解していないことです。

3
本番システムでの再利用と回帰テストのコストに関連するソフトウェアエンジニアリングの原則はありますか?
私は年金と投資の面倒を見る銀行の大規模な金融取引システムに取り組んできました。15年間の機能変更後、手動回帰テストのコストはリリースごとに20万ドルに上昇しました。(1,000,000 LOC、1日あたり1,000万ドルの取引)。また、このシステムは、多くのデータを移動する社内の19の他のシステムと連動します。このシステムはJavaで実装されました。 ただし、「再利用」を行うほど、回帰テストのコストが高くなります。(理由は、「タッチするコードをテストする」必要があるためです。また、再利用/共有コードは、タッチされたときに多数の場所に影響を与えます。したがって、「DRY-Do Not Repeat Yourself」 -コードをコピーして貼り付ける金銭的なインセンティブを確認します。これは、回帰テストに大きな影響を与えるため、共有できるコードを変更したくないため、回帰テストのコストを削減するためです。 私の質問は、再利用と回帰テストのコストの関係を説明するソフトウェアエンジニアリングの原則があるかどうかです。 私がこの質問をする理由は、システムをテスト対象のより小さな部品に分解することには、おそらくコスト上のメリットがあるからです。 仮定: 「回帰テスト」とは、「受け入れテスト」を意味します。つまり、環境やデータのセットアップなど、ビジネスに代わってシステムに対して新しいテストを作成したり、古いテストを再利用したりする別のグループです。 大きなリグレッションテストコストに対する大胆な反応は、「より自動化されたテスト」です。これは良い原則です。この環境では、いくつかの課題があります。 (a)自動テストは、システムが高い自動テストカバレッジを持たない限り、システムの境界を越えてあまり有用ではありません。(影響範囲の課題)。 (b)システムが既に大きく複雑な場合、プログラマーの時間や高い自動化されたテストカバレッジへの資本投資に勢いをつけることは文化的に困難です。 (c)自動化されたテストの維持コストはプロジェクトに隠されているため、プロジェクトレベルで簡単に破棄されます。 (d)これは銀行で働くことの文化的現実にすぎません。 (e)私はこの問題を別の方法で解決しようとしています(分解)。

2
Haskellのメモ化の背後にある概念を誰かが説明できますか?
(コーディングの問題ではなく、概念的なメカニズムに関するものなので、ここに質問を入れています) 私はそのequasionでフィボナッチ数列を使用していた小さなプログラム、に取り組んでいたが、私は特定の数を乗り越えた場合、それは痛々しいほど遅くなったことに気づいた、私はとして知られているハスケルの技術でつまずい少し周りグーグルMemoization、彼らは次のように動作するコードを示しました: -- Traditional implementation of fibonacci, hangs after about 30 slow_fib :: Int -> Integer slow_fib 0 = 0 slow_fib 1 = 1 slow_fib n = slow_fib (n-2) + slow_fib (n-1) -- Memorized variant is near instant even after 10000 memoized_fib :: Int -> Integer memoized_fib = (map fib …

2
同じメソッドを複数回呼び出すときの循環的な複雑さ
Code Reviewでの質問のおかげで、下のコードのCyclomatic Complexityが正確に何であるかについて少し意見の相違(本質的に何かを学ぶ機会)になりました。 public static void main(String[] args) { try { thro(); thro(); thro(); thro(); thro(); thro(); thro(); } catch (NullPointerException e) { } } private static Random random = new Random(); public static void thro() throws NullPointerException { if (random.nextBoolean()) throw new NullPointerException(); System.out.println("No crash this time"); } Eclipseでこのコードを記述し、Eclipseメトリックプラグインを使用すると、メインメソッドのMcCabe …

2
堅牢性とフォールトトレランスの違いは何ですか?
システム/プログラム/分散アルゴリズム/ ...は、多くの場合、述語堅牢またはフォールトトレラントで記述されています。 違いはなんですか? 詳細: + robust + "fault-tolerant"でGoogleを検索すると、2回しかヒットしませんが、どちらも役に立ちません。 Googleで学者の用語を検索すると、タイトルに両方の用語が含まれている多くの論文が見つかります。残念ながら、彼らは用語を正確に定義していません:(しかし、彼らは両方の用語を使用しているので、どちらも他方を意味しないようです。

8
ラピッドプロトタイピングはアジャイル手法にどのように適合しますか?
私は大企業で働いており、アジャイルプロセスの使用を指示しています。たとえば、プロジェクトでは、アジャイル開発の管理を特に対象としたクラウドベースのサービスを使用しています。 私が働いている特定のエンジニアリンググループは、従来ソフトウェアを開発していませんでした(代わりに、より多くの鳥瞰的な観点からプロジェクトを推進しています)が、それは変化しています。私たちには、主にデータ中心の広範囲の今後/計画中のソフトウェアプロジェクトがあります。たとえば、データの監視、収集、集計、およびいくつかのレポート作成を行います。その他のタスクには、特殊なハードウェアとさまざまなタイプのクライアント/サーバー(多層)アーキテクチャによる自動化が含まれます。私は、複数の人を採用し、前進するための多くの計画を策定するプロセスを支援します。 私の質問は、ラピッドプロトタイピング(スローアウェイコード)を行うことがアジャイル哲学に適合するかどうかです。たとえば、Pythonとその幅広いパッケージが大好きです。Pythonベースのワークフローを使用して、多くのアイデアを非常に迅速に実装できる可能性があると思います。ただし、Pythonは「エンタープライズ品質」ではないという認識が多くあり、この作業の多くはJavaまたはC ++で書き直す必要があると思います。 ただし、Pythonプロトタイプを作成することで、実際の結果を迅速に提供できるようにするための費用を大幅に削減できます。 ラピッドプロトタイピングを(できればPythonで)エンタープライズ環境の堅牢なアジャイルワークフローに組み込むことができましたか?

2
「顧客の希望に反して正しいことをする」-それはどのように呼ばれますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 6年前に閉鎖されました。 仕様の修正を顧客と交渉し、顧客が望んだことではなく、顧客が望んだことを行うように仕様を修正する最適な状況を知っています。それは交渉で、説明しています。 時には、クライアントを納得させることができません。設計どおりに壊れたものを生産せざるを得ません。これは魔術師と悪魔が彼らの願いを文字通りに満たして魔術師の終miseをもたらす魔術師の功績によって「悪魔学」と呼ばれ、顧客が彼らのエラーに気づいたら非常に不満を残す別のアプローチであり、もちろん開発者に責任があります。 今、私は非常に異なるアプローチに直面しました:顧客はいくつかの重要な警告を説明できない単純な仕様を作成し、それらを修正することを完全に嫌がり、明白なエラーを認め、提案された修正を受け入れます。これらの仕様に合わせて作られた製品は非常に壊れており、人命を犠牲にする可能性があります。それでも、契約を完全に解除するには遅すぎます。契約には、そのための罰則条項があり、実際に受け入れることはできません。 上司の決断?私たちは仕様通りにそれを行ったことを正しく行い、顧客に嘘をつきます。問題のアルゴリズムは表面下に十分に隠されているため、製品は問題なく動作し、警告の状況で失敗することはありません。誰かが深く掘り下げない限り、要求どおりに壊れていないことを発見することはありません。 この仕様実行の戦術には、一般的な名前がありますか?

2
不快なコンテンツをGitHubにアップロードすることは認められますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私は自分のWebサイト用の不快なコンテンツチェッカーを開発し、それをGitHubで公開したいと考えています。ただし、ソースコードには多くの攻撃的、人種差別的、または不快なコンテンツが含まれています。 ソースは完全に文書化されていますが、GitHubでそのような作品を公開するのが許容できるのか、それとも文字列の配列を読者の想像力に任せるのかについて、あなたの意見が欲しかったのです!
12 github  ethics 

4
モデルとビューを扱うときの切り替えとポリモーフィズム
私の問題に対するより良い解決策を見つけることができません。要素のリストを表示するView Controllerがあります。これらの要素は、B、C、Dなどのインスタンスになり、Aから継承できるモデルです。したがって、そのView Controllerでは、各項目はアプリケーションの異なる画面に移動し、ユーザーがそれらのいずれかを選択するとデータを渡す必要があります。私の頭に浮かぶ2つの選択肢は次のとおりです(構文を無視してください、それは特定の言語ではありません) 1)スイッチ(私はそれが悪いことを知っています) //inside the view controller void onClickItem(int index) { A a = items.get(index); switch(a.type) { case b: B b = (B)a; go to screen X; x.v1 = b.v1; // fill X with b data x.v2 = b.v2; case c: go to screen Y; etc... } } 2)多型 …

5
ソフトウェアテストの形式化された/数学的な理論はありますか?
グーグルの「ソフトウェアテスト理論」は、言葉のソフトな意味での理論を与えるようだ。数学、情報理論、またはその他の科学分野の意味で、理論として分類できるものを見つけることができませんでした。 私が探しているのは、テストとは何か、使用される概念、テストケースとは何か、テストの実行可能性、テストの実用性、テストの範囲、正式な定義/説明コードカバレッジなど 更新:また、正式な検証と私が尋ねたものとの関係について、直感的にはわかりませんが、明らかに何らかの関係があります。

5
Web開発の役割のサーバーについて知っておくべきことは何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 少しあいまいに聞こえるかもしれないので、もう少し説明してみます... 長年自営業の開発者であった後、私は現在商業的なWeb開発者の役割を探しています。サーバーとホスティングに関する私の唯一の経験は、FTPを介してアップロードし、CPanel / WHMを少し試してみることです。私が行っている役割は、Web開発のPHP、MySQL、HTML、CSSタイプの役割ですが、最近のインタビューでは、サーバーでの設定について質問を受けました。理想的ではありませんでした! 私以上のことを知らなければ、私が何を学ぼうとしているのかを正確に説明するのは難しいですが、それは基本的にウェブ開発者として知っておくべきサーバー要素だけなのでしょうか?Web開発者の場合、ファイルのアップロード以外にサーバーを扱うことはありますか?Subversion(SVN)やバージョン管理システムのようなものは、多くの場合、Web開発チームによってセットアップされていますか?

2
関数型プログラミングとステートフルアルゴリズム
Haskellで関数型プログラミングを学んでいます。それまでの間、私はオートマタ理論を研究しており、この2つがうまく調和しているように思えるので、オートマタで遊ぶための小さなライブラリを書いています。 これが私に質問をさせた問題です。状態の到達可能性を評価する方法を研究しているときに、いくつかのパスがいくつかの状態を共有する可能性があり、それらを複数回評価する可能性があるため、単純な再帰アルゴリズムは非常に非効率であるという考えを得ました。 たとえば、ここで、aからgの到達可能性を評価する場合、dとcを通るパスをチェックする際にfの両方を除外する必要があります。 だから私の考えは、多くのパスで並行して動作し、除外された状態の共有レコードを更新するアルゴリズムは素晴らしいかもしれないということですが、それは私にとってはやり過ぎです。 いくつかの単純な再帰の場合、引数として状態を渡すことができることがわかりました。ループを回避するために通過した状態のリストを転送するため、ここで行う必要があります。しかし、リストを逆方向に渡す方法はありcanReachますか?たとえば、関数のブール結果と一緒にタプルで返すのですか?(これは少し強制的に感じますが) 例題の妥当性に加えて、この種の問題を解決するために利用できる他のテクニックは何ですか?これらはと何が起こるかのようなソリューションがあるように持っていることを一般的に十分でなければならないような気がしますfold*かmap。 これまでのところ、learnyouahaskell.comを読んで何も見つかりませんでしたが、まだモナドに触れていないことを考慮してください。 (興味があれば、コードレビューにコードを投稿しました)

1
メタサーキュラーインタープリター、仮想マシン、パフォーマンスの向上の関係は何ですか?
私はWeb上のメタ循環インタープリター(SICPを含む)について読み、いくつかの実装(PyPyやNarcissusなど)のコードを調べました。 私は、メタサーキュラー評価を大いに活用した2つの言語、LispとSmalltalkについてかなり読みました。私の知る限り、Lispは最初のセルフホスティングコンパイラであり、Smalltalkは最初の「真の」JIT実装を備えていました。 私が完全に理解していないことの1つは、これらのインタープリター/コンパイラーがどのように非常に優れたパフォーマンスを達成できるか、言い換えれば、PyPyがCPythonよりも速いのはなぜですか?それは反射のためですか? また、Smalltalkの研究により、JIT、仮想マシン、リフレクションの間に関係があると信じるようになりました。JVMやCLRなどの仮想マシンは、大量の型内観を許可し、Just-in-Time(およびAOT、私はそうですか?)コンパイルでそれを大いに活用すると信じています。しかし、私の知る限り、仮想マシンは基本的な命令セットを持っているという点で、CPUのようなものです。仮想マシンには、言語に依存しないリフレクションを可能にするタイプおよび参照情報が含まれているため、効率的ですか? インタプリタ言語とコンパイル言語の両方がバイトコードをターゲット(LLVM、Parrot、YARV、CPython)として使用しており、JVMやCLRなどの従来のVMのパフォーマンスが信じられないほど向上したためです。私はそれがJITについてだと言われましたが、私が知る限り、JITはJavaの前にSmalltalkとSunのSelfがそれを行っていたので、新しいものではありません。過去にVMのパフォーマンスが特に良くなかったことを覚えていません。JVMや.NET以外に学術的なものは多くなく、それらのパフォーマンスは間違いなく今ほど良くありませんでした個人的な経験から話してください)。 その後、突然、2000年代後半に何かが変わり、確立された言語でさえ多くのVMがポップアップし始め、非常に優れたパフォーマンスを発揮しました。ほとんどすべての最新のVMのパフォーマンスが飛躍的に向上したJIT実装について何か発見されましたか?紙か本か?

2
無料のランチオーバーですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉まっている 6年前にました。 2005年の有名なThe Free Lunch Is Overの記事で、Herb Sutterは並行プログラミング革命がオブジェクト指向革命と同じくらい大きいと予測しました。この革命は2005年から2013年に本当に起こったのですか? 記事のキーポイント: プロセッサメーカーは、CPUパフォーマンスを向上させるための従来のアプローチのほとんどを使用してスペースを使い果たしました。クロックスピードをこれまで以上に高速化する代わりに、ハイパースレッディングとマルチコアアーキテクチャを採用しています。 CPUスループットの向上を十分に活用したい場合、アプリケーションはますます並行する必要があります。 「ああ、パフォーマンスはそれほど重要ではありません。コンピューターは高速化を続けるだけです」と言うのは間違っているでしょう。 効率性とパフォーマンスの最適化は、重要性がますます大きくなります。すでに高度な最適化に適している言語は、新しい命を見つけるでしょう。そうでない人は、競争する方法を見つけ、より効率的で最適化できるようにする必要があります。パフォーマンス指向の言語とシステムに対する長期的な需要の増加を期待してください。 プログラミング言語とシステムは、ますます並行性に対処することを余儀なくされます。並行性のために、現在の言語よりも高いレベルのプログラミングモデルが必要です。

4
テストされたクラスをスパイするのは悪い習慣ですか?
私はクラスの内部呼び出しが通常であるプロジェクトに取り組んでいますが、結果は何回も単純な値です。例(実際のコードではありません): public boolean findError(Set<Thing1> set1, Set<Thing2> set2) { if (!checkFirstCondition(set1, set2)) { return false; } if (!checkSecondCondition(set1, set2)) { return false; } return true; } このタイプのコードの単体テストを書くのは、実際の条件の実装ではなく、条件システムをテストするだけなので、非常に困難です。(私は別のテストでそれを行います。)実際、条件を実装する関数を渡した方が良いでしょうし、テストではモックを提供するだけです。このアプローチの問題は騒々しいです:ジェネリックを多く使用します。 実用的なソリューション。ただし、テスト対象のオブジェクトをスパイにし、内部関数の呼び出しを模擬することです。 systemUnderTest = Mockito.spy(systemUnderTest); doReturn(true).when(systemUnderTest).checkFirstCondition(....); ここでの懸念は、SUTの実装が効果的に変更されることであり、テストを実装と同期させておくことが問題になる場合があります。これは本当ですか?この内部メソッド呼び出しの混乱を避けるためのベストプラクティスはありますか? アルゴリズムの一部について説明していることに注意してください。そのため、いくつかのクラスに分割することは望ましい決定ではない場合があります。

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