ソフトウェア工学

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

4
プログラマーとして、ビジネスルールの採用と理解をどのようにスピードアップできますか?
私はしばらくの間開発者でした。私はそこから最高とはほど遠い。(私はこの部屋に一人で座っているので、私はここで最高かどうか疑問に思います。)しかし、私は自分の道具を理解するようになり、理性と学びの能力に信頼するようになりました。 新しい仕事を始めるとき、私が知っている言語であればコードベースを学ぶことができるといつも信じています。私が知っている言語やフレームワークではない場合、それを学ぶのに十分な概念を把握できると信じています(そして、ドキュメントを読むだけです)。これはプログラマーとしてのスキルセットの一部であり、この標準に対応できることを誇りに思っています。 しかし、これらすべてのために-私の大きな弱点の1つは、私が仕事をしているクライアントのビジネスルールを短期間で学習し、内部化することです。コードベースには問題ありませんが、特定のビジネスのビジネスルールとプロセスは、完全に理解するのに常に時間がかかるようです。(例として、これはエンタープライズアプリケーションを書き換えるときのトリップアップになります。) 開発者として、ビジネスルールとプロセスを迅速かつ効率的に取り入れる最良の方法は何ですか?主題の専門家でなくても、単にクライアント、会社、またはビジネスで長年の経験を持つことは可能ですか?

4
言語設計者は、特定の機能が正しく機能することを決定または証明するために何をしますか?
私は言語設計に興味があり、一般的に、広く知られている機能(たとえば、継承、ポリモーフィズム、デリゲート、ラムダ、キャプチャ、ガベージコレクション、例外、ジェネリック、分散、リフレクションなど)、特定の言語、実装方法、制限など。 過去数ヶ月で、Rustについて読み始めました。Rustには、オブジェクトの有効期間を静的に検証可能にすることにより、メモリの安全性と決定論的なリソース管理を保証する所有権システムがあります。言語の単純なユーザーの観点から、私はほとんどすぐにシステムを拾うことができました。 しかし、言語デザイナーの観点からは、Rustの物事がまさにその通りである理由を理解するのに少し時間がかかりました。所有権システムのいくつかの制限の背後にある理由をすぐに理解できませんでした。そのような側面がなければ、システムの整合性を侵害するケースを考え出す必要がありました。 私の主な質問は、Rustとその所有権とは特に関係ありませんが、必要に応じてコメント/回答の例として自由に使用してください。 言語設計者が新しい機能を設計するとき、機能が適切に機能することを決定するためにどのような方法論またはプロセスを使用しますか? 「新規」とは、既存の言語で既にテストされたものではないことを意味します(したがって、作業の大部分は他のデザイナーによって行われています)。「適切に動作する」とは、この機能が意図した問題を正しく解決し、合理的に防弾であることを意味します。「合理的な防弾」とは、機能の整合性に違反する言語または言語の特定のサブセット(「安全でない」コードのないサブセットなど)でコードを記述できないことを意味します。 シンプルな形の機能を考え出し、それを破る方法を見つけ、それをうまく破ったらパッチを当てて、繰り返すという意味で、試行錯誤のプロセスですか?そして、他の可能な違反を考えることができないとき、あなたは何も残っていないことを望み、それを1日と呼びますか? または、機能が機能することを実際に(単語の数学的意味で)証明し、その証明を使用して最初から自信を持って機能を(またはほぼ正しく)取得する正式な方法はありますか? (私はコンピューターサイエンスではなく、エンジニアリングのバックグラウンドを持っていることに言及する必要があります。したがって、CSの人々に明らかな何かが足りない場合は、お気軽にご指摘ください。)

3
なぜ言語はブロックの明示的なマーカーよりもインデントを好むのですか?
Haskellを学んでいますが、自動インデントツールを探していました。私はあまり見ていませんでしたが、Haskellでは(Pythonのように)インデントがブロックを意味することを学びました。その結果、{}(中括弧)やbegin endキーワードなどの明示的なマーカーを使用する、Cファミリの他の言語ほど強力な自動書式設定ツールを作成することは不可能だと推測しています。 読みやすくするためにインデントを強制する言語は気にしませんが、インデントの強制と明示的なマーカーの両方の利点を理解できないため、自動化ツールはどのブロックに属するかを理解できます。 ブロックをマークするインデントの設定が、コードの見栄えを良くするためのものである場合、その利点はまだ理解できません。タブやスペースが異なるエディターや異なるフォント(モノスペースフォントは見栄えが良いなど)で異なって表されることを考えると、プログラマーがコードを適切に提示することを期待することは不可能です。現在のテキストエディタを考慮に入れることができるツールは、コードを正しくフォーマットするためにはるかに適切です。 言語設計者が明示的なブロックマーカーよりもインデントを選択するのはなぜですか?

2
2 ^ sqrt(n)の時間計算量
私はアルゴリズムの質問を解決していますが、私の分析では、O(2 ^ sqrt(n))で実行されます。どれくらい大きいの?O(2 ^ n)と同等ですか?まだ非多項式時間ですか?

2
同じ優先順位の2つの二項演算子、左結合および右結合を持つ言語
2つの2項演算子をopl持ちopr、同じ優先順位でopl左結合およびopr右結合であるプログラミング(またはスクリプト)言語(またはドメイン固有の言語)はありますか? (そのような例を見つけることはできませんが、その奇妙なケースを処理するのに十分な一般的なパーサーをコーディングしようとしています) x opl y opr zまたはx opr y opl zの形式の式はどのように解析されますか?より一般的には、さらに多くのオペランドを使用しますか?

1
多くのブール型プロパティを持つ列挙型
現在、ユーザーに返されるページに基づいてサーバーロジックを調整する必要があることが多いwebappに取り組んでいます。 各ページには4文字のページコードが与えられ、これらのページコードは現在、静的な文字列としてクラスにリストされています。 public class PageCodes { public static final String FOFP = "FOFP"; public static final String FOMS = "FOMS"; public static final String BKGD = "BKGD"; public static final String ITCO = "ITCO"; public static final String PURF = "PURF"; // etc.. } そして、多くの場合、コードには次のようなコードが表示されます(1番目の形式): if (PageCode.PURF.equals(destinationPageCode) || PageCodes.ITCO.equals(destinationPageCode)) { …
11 java  design  enum 

1
Clojureに衛生的なマクロがないことから生じる実際的な問題は何ですか?
Clojureマクロは簡単に記述できますが、ラケットの衛生的なマクロほど信頼性が低いと聞きました。私の質問には2つの部分があります。 gensym衛生マクロとどう違うのですか? ラケットマクロは、Clojureにはないものを何を提供しますか?(安全性、構成可能性など)

1
3の最大多重度で原点から外側にエッジと頂点を生成するアルゴリズム
私は、宇宙が非常に大きくなる(基本的には無限に大きくなる)Webサイト用の2Dゲームを作成しています。最初は、宇宙は原点(0、0)から等しい距離にある6つの星で構成されています。私のタスクは、相互に接続する「パス」(エッジ)を持つより多くの星を生成できるようにすることです。これらの制限を満たすアルゴリズムをどのように設計できますか: 星は外側にランダムに生成されます。(たとえば、新しい星の(x、y)座標は、(0、0)からすべての方向にゆっくりと外側に移動し、できれば螺旋状になります) エッジは交差しません。 多少の違いはあるはずですが、新しい星は他の星に近すぎたり近すぎたりしてはなりません。(たとえば、最小半径が必要です) スター/ポイントの多重度が3を超えることはできません。 このすべてがデータベースに保存されることを考えると、アルゴリズムのコストが高すぎることはありません。言い換えれば、O(n)の複雑さを実現したいと考えています(これが実現可能かどうかはわかりません)。 基本的に、私が目指しているのは、星がグラフ上の点であり、星間の移動がそれらの星の間のエッジで描かれている渦巻き状の銀河です。 解決する必要がある特定の手順は次のとおりです。 まだ3の多重度を持たない他の星の近隣に点をランダムに生成します。 エッジの競合を生成しない3の多重度をまだ持たない最初の星を見つけます。 星がx単位の最小距離にある場合、2点間にエッジを作成します。 解決策を探してみましたが、数学のスキル(およびグラフ理論の知識)には多くの作業が必要です。また、この問題に関するリソース/リンクは大歓迎です。 ここに私が考えていたいくつかの擬似コードがありますが、これがうまくいくかどうかはわかりません。 newStar = randomly generated (x, y) within radius of last star from origin while(newStar has not been connected): for (star in the known universe): if(distance between newStar and star > x units): if(star has < 3 multiplicity): …

3
DDDでは、リポジトリはエンティティまたはドメインオブジェクトを公開する必要がありますか?
私が理解しているように、DDDでは、集約ルートでリポジトリパターンを使用することが適切です。私の質問は、データをエンティティまたはドメインオブジェクト/ DTOとして返す必要がありますか? たぶんいくつかのコードが私の質問をさらに説明するでしょう: エンティティ public class Customer { public Guid Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } このようなことをする必要がありますか? public Customer GetCustomerByName(string name) { /*some code*/ } またはこのようなもの? public class CustomerDTO { public Guid Id { get; set; …

1
レガシー要件をBDDに移行する
Q:要件データベースで少なくとも15年間のレガシーソフトウェア要件を維持しながら、大企業をCucumberに移行する最良の方法は何ですか? 現在検討中: 1)すべてを移行する マイナス面:無制限の時間/予算がない、生き残るために前進しなければならない、すべてを止めることはできず、レガシー要件とレガシーテストスイートの100%をGCする。 2)ボーイスカウトルール あなたがそれを見つけたよりもすべてを残します。要件に触れたり変更したりする場合は、キュウリ機能を作成/更新します。欠点:2つのシステムの記録(Cucumber、legacy req。DB)があります。おそらく、与えられたアプリケーションの隅に非常に長い間触れられないことを永遠に想定しています。 3)ボーイスカウトルールプラス #2と同じですが、単一の保留シナリオを使用してCucumberに移行しないネット要件を機能に追加し、レガシー要件をコピーして説明セクションに貼り付けます。このようにして、Cucumberがどの程度「カバー」されているかに関するメトリックを(保留中のシナリオを介して)取得します。また、古い要件システムを維持する必要性に乗ります。それがCucumber内の巨大な混乱であるかもしれないので、これ以外の欠点を見つけることはできません。 4)ここにアイデアを挿入します。 バックグラウンド: Cucumberに移行するプロジェクトには自動化されたテストスイートがあり、一部のプロジェクトでは手動テストのみが使用されています。それらはすべて、レガシー要件データベースで要件を維持します。要件は法律/規制と金融商品の複雑なロジック(リスク、価格設定、構造など)が混在しているため、これを行う必要があります。 これは非常に大きな会社であるため、ソリューションをさらに複雑にしていることに留意してください。 「新しい」要件のためにCucumberを使用するプロジェクトが既にいくつかあります。それで、私たちはこの技術を試してみましたが、これは私たちにとってこれまでのところうまくいきました。Webプロジェクトと純粋なデータプロジェクトが混在しています。 ありがとう 編集:質問に回答するには...従来の要件管理DBは、要件をテストに関連付けません。「テスト可能」ではありません。現在、要件をテストに接続することは、各プロジェクトの最後に、要件をテストケース管理システムにリンクする、困難でエラーが発生しやすい手動プロセスによって行われます。キュウリは私たちにとって明らかに優れたソリューションです。それについての質問はありません。問題は、法的な理由や他の理由で失われることのない、膨大な量の重要な要件を抱える大規模な組織をどのように動かすかです。
11 bdd  cucumber 

3
プロパティとメソッドを常にチェックせずに、JavaScriptでダックタイピングを使用するにはどうすればよいですか?
私はjavascriptがダックタイピングを使用することを知っていて、最初はC#のような強く型付けされた言語と比較して多型が簡単になると思った。しかし、現在、引数を取る私の関数には次のようなものが散らばっています。 if(myObj.hasSomeProperty()) または if(myObj.hasSomeMethod()) または if(isNumber(myParam)) 等 これは本当にugいです。私はC#のバックグラウンドを持っていますが、定義済みのインターフェイスの方がはるかに優れていることがわかりました。 私は静的に型付けされた言語で効果的な戦略を誤って適用しようとしていて、javascriptでこれを行うためのいくつかのより良い方法がありますか? 私はただチェックできないことを知っていますが、javascriptランタイムエラーを追跡することは、コード内で実際にエラーが発生している場所で常に発生するとは限らないため、悪夢になります。

5
進行状況をUIに報告するための最善の戦略-コールバックはどのように行われるべきか
ユーザーは、実行に時間がかかる拡張技術操作を開始する場合があります。このような場合、通常、現在進行中のタスクに関する情報とともに、何らかのプログレスバーを表示すると便利です。 UIとロジックレイヤーの密接な結合を避けるために、通常、何らかのプロキシを介して通信を行うことが最善です。つまり、バックエンドは独自のUI要素を操作したり、中間層と直接対話したりすることはできません。 明らかに、これを機能させるためにはどこかにコールバックが必要です。通常、2つの方法のいずれかで実装しました。 可変オブジェクトをバックエンドに渡し、進行中にバックエンドに変更を加えます。オブジェクトは、変更が発生するとフロントエンドに通知します。 フォームのコールバック関数を渡すvoid f(ProgressObject)かProgressObject -> unit、バックエンドが呼び出します。この場合、バックエンドはを構築し、ProgressObject完全に受動的です。進行状況を報告するたびに新しいオブジェクトを作成する必要があると思います。 これらの方法の欠点と利点は何ですか?合意された最適な使用方法はありますか?それらの使用には異なる状況がありますか? 私が見落としている進捗状況を報告するための完全に異なるテクニックはありますか?

7
なぜ優先度と重大度の両方が必要なのですか?
私は彼らが何を決定するのか理解していますが、見つかった問題にそれらを割り当てることは本当に便利ですか?つまり、すぐに修正する必要があるかどうかです。 それらの設定方法、分類方法などを知っています。IEEE/ ISOがそれを行う必要があることは知っています。理由がわかりません。

4
Ruby:if variable vs if variable.nil?
私はRubyを初めて使い、nilとfalseを除いてすべてのオブジェクトがtrueであることを知って驚いた。0でも真です。 言語のその特性についての良いところは、あなたが書くことができるということです: if !variable # do stuff when variable is nil end 経験豊富なRuby開発者である同僚は、.nilを使用する代わりにそれを選択すべきだと主張しています。そのようです: if variable.nil? # do stuff when variable is nil end ただし、後者は次の2つの理由により優れたオプションであると考えています。2.私の主題の意見では、たとえそれがよりコンパクトでなくても、より読みやすいです。 ここで「初心者」の間違いを犯していますか?

3
リンクリストには常にテールポインターが必要ですか?
私の理解... 利点: 最後に挿入すると、O(N)ではなくO(1)になります。 リストが二重リンクリストの場合、末尾から削除することもO(N)ではなくO(1)です。 不利益: わずかな量の4-8バイトの余分なメモリを占有します。 実装者は、テールを追跡する必要があります。 これらの長所と短所を見ると、リンクリストがテールポインターの使用を避ける理由がわかりません。私が欠けているものはありますか?

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