ソフトウェア工学

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

2
SchemeではなくClojureでSICPにアプローチする
私はソフトウェアエンジニアリングプログラムの3年生で、SICPを読むというアイデアをアドバイザーに伝えて、このすべてのソフトウェアの背後にある原理をより深く、より根本的に理解するようにしました。 彼は、本を完成するためにSchemeを学ぶのではなく(Lispの現代の方言ほど一般的ではないため)、代わりにClojureで演習を行うことを提案しました。 それはすでに難しい本です。より現代的なClojureで本の練習を試みた場合、それはどのように機能しますか?たとえば、実際のソリューションは見つかりません。Schemeで教えている構文は異なります。
11 clojure  scheme  sicp 

2
v1.5より前のSVNでのマージに関する不便さは、メタデータの欠如がもはや問題にならなくなった今では時代遅れになっていますか?
私はSVNを使い始めましたが、DVCSツールと比較してSVNでのマージは非常に難しいと多くのソースが言っています。最新の質問私はSEにここに見つけることができる2012年からです。 時々、v1.5より前のSVNにはメタデータがなかったが、SVNは現在バージョン1.8.9であるという理由が言及されています。 SVNがv1.5よりもはるかに成熟していることを考えると、特にSVN 1.5を使用しなかったため、前述のメタデータの欠如に悩まされていないという事実を考えると、SVN に対するこれらの議論にはまだ多くの妥当性がありますか? DVCSには完全に異なるアプローチがあり、それがより望ましい場合が多いことを理解していますが、何らかの理由でSVNを「必要」とする人にとって、マージはもはや「地獄」ではありませんか?

2
選択的に非表示にできるノードとエッジ間に許可された複数のエッジを持つグラフを表現する方法
理想的で仮想化されたネットワークの使用をモデル化するためにどのようなデータ構造を使用するかを考えています。 私のシナリオでは、互いに敵対的な多数のユーザーが、潜在的な接続がすべてわかっているコンピューターのネットワークを形成しようとしています。ただし、あるユーザーが接続する必要があるコンピューターは、別のユーザーが接続する必要があるコンピューターとは異なる場合があります。ユーザー1はコンピューターA、B、Dを接続する必要があり、ユーザー2はコンピューターB、C、Eを接続する必要がある場合があります。 NCTM Graph Creatorの助けを借りて生成された画像 このコアは、ノードがコンピューターを表し、エッジがイーサネットケーブルを表す、無向の循環グラフになると思います。ただし、シナリオの性質上、隣接リストと隣接行列を除外するいくつかの珍しい機能があります(少なくとも、重要な変更はありません)。 エッジは使用が制限される場合があります。つまり、あるユーザーが特定のネットワーク接続を取得した場合、他のユーザーはその接続を使用できません この例では、緑のユーザーはコンピューターAに接続できない可能性がありますが、赤のユーザーはBをEに接続していますが、それらの間に直接リンクはありません 場合によっては、ノードの特定のペアが複数のエッジで接続されます この例では、DからEまでの2本の独立したケーブルがあるため、緑と青のユーザーは両方ともこれらのマシンを直接接続できました。ただし、赤はそのような接続を確立できなくなりました 2台のコンピューターが複数のケーブルで接続されている場合、各ユーザーが所有するケーブルは1本のみです このグラフでは、次のようないくつかの操作を行う必要があります。 特定のユーザーに対して特定のコンピューターのペアが接続されているかどうかを判断する 特定のユーザーがターゲットコンピューターに接続するための最適なパスを特定する 特定のユーザーの最大遅延コンピューター接続(つまり、分岐のない最長パス)を識別する 最初に考えたのは、単純にすべてのエッジのコレクションを作成することでしたが、検索にはひどいものです。今考えられる最善の方法は、隣接リストを変更して、リスト内の各アイテムにエッジの長さだけでなく、コストと現在の所有者も含まれるようにすることです。これは賢明なアプローチですか?スペースが問題にならない場合、単一のグラフではなく、グラフの複数のコピー(ユーザーごとに1つ)を作成するのが妥当でしょうか?

2
オープンソースプロジェクトの成長に対処する方法
私は現在、オープンソースプロジェクトのサポートを1〜2年支援することに携わっており、プロジェクトは私が始めてから多くの人気を得ています。このプログラムは1週間に100,000以上のダウンロードがあり、主要分野の60%以上の人々が使用しているため、人々がそれを非常に楽しんで使用していることは明らかです。 しかし、問題は、開発とサポートの基盤がほぼ同じ速度で成長していないことであり、私たちは成長の苦痛に直面し始めています。ほんの一握りの開発者(特にメイン開発者)がかなり薄くなり、技術サポートボランティアが燃え尽き始めています。 これまでのところ、IRCにたむろして、このプログラムを作成し、ユーザーを支援している男たちの集まりでした。501(c)(3)の組織やLLCなどはありません。 現時点では、非常に正式なバグトラッカーや問題データベースはありません(バグレポート専用のカテゴリを持つフォーラムがあります)。これは、より多くの開発者を迎え入れるために改善できるものであると認めています。しかし、私の個人的な質問は、小さな個人プロジェクトから実際の... ものにどのように移行するのでしょうか?GIMP、FFmpeg、Blenderなどの大企業はこの移行をどのように処理しましたか? それに加えて、FOSSプロジェクトで補償を提供する方法はありますか?寄付は助けになると思いますが、それはこれまでのところ...フルタイムの仕事のため。 基本的に、私たちはいくつかの成長する痛みを抱えており、「私たちのブリッチには大きすぎる」と感じています。この移行を管理し、一度に多くのことを実行して燃え尽きないようにするために、私たちにできることは何でしょうか?

4
「OOPは状態を隠す」とはどういう意味ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 でcat-v.org上の多くの抗OOPの暴言の一つ、私は以下の通りであったそのうちの一つOOPモデルに対して複数の異議を上げるジョー・アームストロングの通路を見つけました: 異論4 –オブジェクトにはプライベート状態があります 国家はすべての悪の根源です。特に、副作用のある機能は避けてください。 プログラミング言語の状態は望ましくありませんが、現実の世界では状態が豊富です。私は銀行口座の状態に非常に興味があり、銀行に入金または引き出しを行うと、銀行口座の状態が正しく更新されることを期待しています。 状態が現実の世界に存在する場合、プログラミング言語は状態を処理するためにどの機能を提供する必要がありますか? OOPLは「プログラマーから状態を隠す」と言います。状態は非表示であり、アクセス関数を介してのみ表示されます。従来のプログラミング言語(C、Pascal)は、状態変数の可視性は言語のスコープルールによって制御されると言います。純粋な宣言型言語は、状態がないと言います。システムのグローバルな状態はすべての機能に持ち込まれ、すべての機能から出てきます。モナド(FPL用)やDCG(ロジック言語)などのメカニズムは、プログラマーから状態を隠すために使用され、「状態は重要ではないかのように」プログラムできますが、必要に応じてシステムの状態に完全にアクセスできます。 OOPLによって選択された「プログラマーから状態を隠す」オプションは、最も悪い選択です。国家を明らかにし、国家の迷惑を最小限に抑える方法を見つけようとする代わりに、彼らはそれを隠します。 これはどういう意味ですか?私は、ほとんどの場合OOPの低レベルまたは手順の経験がほとんどないため、これがおそらく私がこれに慣れていないことを説明しています。そして、より現代的な観点から、オブジェクト指向のヒステリーのほとんどが渡されたので(少なくとも私が知る限り)、あなたはあなたはその通過がどれほど正確/関連していると思いますか? ご協力いただきありがとうございます。

2
F#Coreが汎用配列型を定義するのはなぜですか?
FSharp.Core名前空間には、最大4次元の一般的な配列型、つまりCore。[] <'T>、Core。[、] <' T>などが含まれていることに気付きました。C#とVBはうまく機能しているようです。 System.Arrayを使用-int []、string []などの厳密に型指定された特殊な配列型をどのようにサポートするかは明確ではありませんが。 私はこれが2つの質問になると思う: C#は、非ジェネリックSystem.Arrayに基づくint []のような厳密に型指定された特殊な配列型をどのようにサポートしますか? C#がこれをなんとかしているのに、なぜF#は汎用配列型を定義するのですか?
11 c#  .net  f# 

1
雇用管理者は、「ビジネスに似た」個人用アプリを持っているが起業家ではない開発者を受け入れるのに苦労していますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 大学卒業後すぐに、ソフトウェアエンジニアとしての仕事を待つ間、自分のWebアプリ(Ease My Day)を構築することにしました。 このアプリを構築する理由: 仕事の現場に入る前に、ソフトウェアの経験をしっかり身につけて 一般的な問題の解決策を提供する 仕事を探している間に何もしないで座っていない このアプリは、起業家としての試みでもなければ、販売されるビジネスでもありません。それでもインタビューを通して、私はアプリを通過する5回のインタビューごとに4回の割合で、ビジネスと混同されていることに気付き、同じ質問をされます: なぜビジネスを構築したのですか?なぜアプリを停止したいのですか?アプリを販売しますか? 私はビジネスを構築せず、このアプリケーションから収入を得ていなかったことを知っています。 イニシアチブを取り、サイドで独自のアプリを作成したい候補者は、採用マネージャーのレーダーに赤旗を立てますか? 更新 @Kate Gregoryからのリクエスト これが私の履歴書での説明です: 個人プロジェクト:「イーズマイデイ」SaaSアプリケーションの開発者、Qcモントリオール リンク:http : //www.easemyday.com Facebook:http : //www.facebook.com/EaseMyDay 「イーズマイデイ」ベータ版の主な目的は、毎日の栄養/健康状態の監視を支援することです。 栄養に関する事実を含む6000以上の食品のリストが利用可能です。ユーザーは自分の食べ物を追加して、食べ物のデータベースを拡大できます。 これにより、ユーザーは目標を指定できます。体重を減らす、体重を増やす、健康を維持するだけの目標はありません。 ユーザーは、アプリの組み込みの計算機を使用して、毎日のニーズ(カロリー、タンパク質、炭水化物、脂肪など)を計算できます。ユーザーは、ニーズが既にわかっている場合、これらの値を手動で入力できます。 ユーザーは、食事、日、および/または週ごとに食物摂取を監視できます。 Amazon AWS(RDSを使用するEC2インスタンス)にデプロイされます 「イーズマイデイ」は困難な課題を解決しました。これは、毎日のヘルスモニタリング(これまでは特に時間のかかるタスク)を、わずか数秒で完了することができる楽しいアクティビティに変える、速度効率の高いプラットフォームです。現在、世界中のいくつかの国で使用されています。 言語/テクノロジー:....ここで、使用される言語/テクノロジー/ソフトウェアエンジニアリングアプローチについて説明します....

4
ポインターのインデックス付け
現在、「Numerical Recipes in C」というタイトルの本を読んでいます。この本では、著者は、1で始まるインデックスがある場合に特定のアルゴリズムが本質的にどのように機能するかを詳しく説明しています(私は彼の議論に完全には従わず、この投稿のポイントではありません)が、Cは常に0で始まる配列にインデックスを付けますこれを回避するために、彼は単に割り当て後にポインタをデクリメントすることを提案します、例えば: float *a = malloc(size); a--; これは、1で始まるインデックスを持つポインターを効果的に提供し、その後で解放されると彼は言います: free(a + 1); ただし、私が知る限り、これはC標準による未定義の動作です。これは明らかにHPCコミュニティ内で非常に評判の良い本なので、彼の言っていることを単に無視したくはありませんが、割り当てられた範囲外のポインターを単にデクリメントすることは私には非常に大雑把です。これはCの「許可された」動作ですか?私はgccとiccの両方を使用してテストしましたが、これらの結果はどちらも私が何も心配していないことを示しているように見えますが、絶対にポジティブになりたいです。
11 c  pointers 

2
複数の、または正しい正解を証明するのが困難な(決定論的な)アルゴリズムのテスト
この質問が似ていることを序文にしたいと思いますが、私の質問にはランダム性は関係せず、単なる決定的な決定論なので、「既知のシードを使用する」という答えは実際には当てはまりません。同様に、この質問は似ていますが、再び、アルゴリズムが失敗することを期待していません-どの方法が正しいかわかりません。 この質問は、グラフアルゴリズムのテスト中に発生しました。しかし、決してそれらに限定されません。A *などの一部のアルゴリズムには、複数の正解があります。正確な実装に応じて、いくつかの回答のいずれかが得られる場合がありますが、それぞれが同じように正しいです。ただし、どちらを先に吐き出すのかわからないため、テストを難しくする可能性があります。また、回答を手作業で計算するのは非常に時間がかかります。 私の特定のケースでは、Floyd-Warshallを修正して可能な限りすべての最短経路を吐き出すことで回避し、それを手作業でテストしました。それ自体が優れた機能であるという利点がありました。次に、FWからの既知の正しいパスに関して他の機能をテストできます(返されたパスが、その開始/終了ペアに対してFWによって返されたパスのいずれかである場合、それは正しいです)。もちろん、これは、FWの動作方法が原因で、密なグラフでのみ機能しますが、それでも優れています。 ただし、この特性を備えたすべてのアルゴリズムで常に実行できるとは限りません。これまでのところ、私が思いついた最良の答えは、正解そのものではなく、正解の特性をテストすることです。最短パスアルゴリズムに戻るには、返されたパスのコストを既知の正しいコストと比較し、パスが有効であることを確認できます。 これは機能しますが、特に検証自体が複雑な場合(たとえば、正しいアルゴリズムが存在する場合、最小スパニングツリーの検証は既知の難しい問題であり、おそらく以下よりも難しい場合)、すべてが正しく検証されないというリスクがありますMST自体の構築)、この場合、テストコードを広範囲にテストする必要があります。さらに悪いことには、MST検証アルゴリズムをテストするためにMSTを構築する必要があるため、MSTテストがMST検証アルゴリズムの動作に依存し、MST検証アルゴリズムのテストがMST生成コードの動作に依存するという素晴らしいシナリオになります。 最後に、出力を観察し、手作業で検証し、検証したばかりの出力をテストするためにテストをハードコーディングする「簡単な方法」がありますが、毎回テストを修正する必要があるため、それは素晴らしいアイデアではありません実装を少し変更します(これは自動テストで回避することになっています)。 明らかに、答えはある程度テストしている正確なアルゴリズムに依存しますが、いくつかの明確で決定的な「正しい」出力を持つアルゴリズムを検証するための「ベストプラクティス」があるかどうか疑問に思っていましたが、それらの正確な正しい出力は事前に知っていて、事実を確認することすら難しいかもしれません。

5
内部データ構造を常に完全にカプセル化する必要がありますか?
このクラスを考慮してください: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThings(){ return things; } } このクラスは、データを保存するために使用する配列を、関心のあるクライアントコードに公開します。 作業中のアプリでこれを行いました。sのChordProgressionシーケンスを格納するクラスがありましたChord(その他の処理も行います)。Chord[] getChords()コードの配列を返すメソッドがありました。データ構造を(配列からArrayListに)変更する必要がある場合、すべてのクライアントコードが破損しました。 これは私に考えさせられた-多分次のアプローチが優れている: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThing(int index){ return things[index]; } public int getDataSize(){ return things.length; } public void setThing(int …

2
(C)異なるコンパイラで作成されたオブジェクトファイルはバイナリ互換ですか?
C ++コンパイラは互いに互換性がないことを理解しています。ただし、特にCについては、このトピックに関する情報を見つけることができませんでした。私は、C標準にはコンパイラが適切に実装できる余地を残していることを知っています。たとえば、ほとんどの(すべて?)データ型のサイズとアライメントは、最小限の保証のために実装定義で保存されます。したがって、2つのコンパイラー(または同じコンパイラーの2つのバージョン)は、多くの詳細について意見が一致しません。 異なるコンパイラでコンパイルされた2つのオブジェクトファイルが実際に適切にリンクされるという保証はないという考え方で正しいですか?たとえば、ポインタのサイズは、一方のオブジェクトファイルでは32ビット、もう一方のファイルでは64ビットになります。しかし、そうだとすると、なぜCライブラリはプリコンパイルされた形で配布されるのでしょうか?私が使用したのと同じコンパイラー(例えばgcc)を使用する、またはバイナリー互換性を確保するために使用されている事実上の標準を使用するという期待はありますか?そして、C言語オブジェクトファイルとリンクするときに、外国語インターフェイスを備えた他の言語は、物事が適切に整列することをどのように保証しますか?
11 c  compiler 

5
バグの調査方法の学習[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 この難しさをどのように定義すればよいかさえ分かりません。就職する前に、数人の有望な従業員が私に対して行ったテストを思い出します。彼らは部屋のオブジェクトを選択し、そのオブジェクトが何であるかを自分で判断するのに役立つ質問をすることができます(20個の質問のように)。私はこれで途方もなく優れていたので(いや、謙虚さで高いポイントを獲得したことはありませんでした)、バグのトラブルシューティングは本当に上手だと思いました... しかし、私が最近見つけたものは次のとおりです。部屋にあるすべてのものを見るのは本当に簡単なので、そのような状況では本当に良いです。したがって、コンポーネントの一部の概念で問題に取り組むことができます。本質的に、「知らないことを知っている」。しかし、プログラミングでは、問題が私にとって完全に未知である多くの状況に遭遇します。私はそれが壊れていることを知っていますが、どのように壊れるかという概念はありません。私はすべての指示に従いました、私は技術をかなりよく知っています... 正直なところ、間違っている可能性のあるものを想像するのに苦労しているように感じるので、それらをテストし、できれば解決策を見つけることができます。 そのスキルを開発するにはどうすればよいですか?どうやら、私の想像上の限られた想像力が私のプロジェクトを破壊する可能性のある方法を思い付くために何をする必要がありますか?これで私を良くすることができるエクササイズ(おそらくパズル?)はありますか?おそらく最大の治療法は経験だけであることを知っています...しかし、できればプロセスを加速する手助けをしたいと思っています。一度に数時間、ぼんやりと私のコンピューター画面を見つめることは、ちょっと面白くないです...

2
コンパイル時IOC
誰かがコンパイル時にIOCを実行するプロジェクトを開始しましたか(おそらくRoslynまたはLinq MethodInfoを使用して)。 IOCコンテナーでの私の経験はこれまでのところ素晴らしく、いくつかの小さな問題がありませんでした 多くのIOCコンテナは、ここで解決ロジックの多くが発生するため、起動が遅くなります コンパイルがコンストラクターの呼び出しを保証しないため、解決が可能かどうかを確認するのは難しい場合がよくあります。 多くの場合、IOCコンテナーはランタイムに小さなオーバーヘッドを追加します(一部は小さくもなく、多くの場合、すぐに起動するものはゆっくり実行されます) 理想的な解決策は、IOCの代わりにFactoryクラスを追加するコンパイル手順をビルドチェーンに追加することだと思われます。 誰もこれをやったことがありますか?そうでない場合は、なぜですか?

2
Pythonがハッシュテーブルを使用してdictを実装しますが、Red-Black Treeは使用しないのはなぜですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 Pythonがハッシュテーブルを使用してdictを実装しますが、Red-Black Treeは使用しないのはなぜですか? キーは何ですか?パフォーマンス?

4
プログラマーとして、退職後も継続的なサポートを提供する義務がありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 私は、過去に私がプロジェクトに取り組んでいる唯一の開発者であったプログラミングの仕事をいくつかしました。私が去った後、私は通常、これらの会社から、通常は私に代わった開発者から週に数通のメールを受け取ります。これらのメールは通常、物事がどのように機能するか、既存のシステムに基づいて機能xを実装する方法についての詳細を尋ねています。 私は通常丁寧で親切ですが、この種のコミュニケーションは本当に私の時間に食い込み始め、私はすべての仕事を足首の周りの別の重さでやります。言うまでもなく、それらは正当な理由で私を置き去りにすることを選んだプロジェクトです。 私の質問は、これ以上サポートを提供しないで、問い合わせを拒否して回答することを彼らに伝えることは専門的に「大丈夫」でしょうか? NB。これらの会社はどれも私にどんな種類のリテーナーも支払っていないので、問い合わせはしばしば管理者ではなく開発者からの非公式の質問です。

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