ソフトウェア工学

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

9
現在の仕事から転職する時が来たのはいつですか?[閉まっている]
次へ進むべき時だとわかったときに、仕事に到達したことはありますか? いつあなたが知らない悪魔のためにあなたが知っている悪魔を手放すことができるポイントに移動しますか? あなたが最終的に新しい仕事を見つけるという決定に直面したとき、あなたの決定要因最終的なストローは何でしたか?



19
なぜマイクロソフトは、オープンソースに関わる人々からそのような評判が悪いのですか?[閉まっている]
マイクロソフト(およびビルゲーツ)がオープンソースコミュニティの目で見ている評判の低さに原因となる特定のインシデントはありますか?Microsoftが独占企業ではないことは明らかです。Appleのような企業は、ソフトウェアの制限に関してはさらに悪い結果を出しています。なぜマイクロソフトはオープンソースコミュニティからの憎悪のほとんどを得るのですか?

9
単一の(パブリック)メソッドのみを持つクラスは問題ですか?
現在、ビデオ監視映像の圧縮とインデックス作成を実行するソフトウェアプロジェクトに取り組んでいます。圧縮は、背景オブジェクトと前景オブジェクトを分割し、背景を静的画像として保存し、前景をスプライトとして保存することで機能します。 最近、私はプロジェクトのために設計したいくつかのクラスのレビューに着手しました。 パブリックメソッドが1つしかないクラスがたくさんあることに気付きました。これらのクラスの一部は次のとおりです。 VideoCompressor(compressタイプの入力ビデオを取り込み、タイプRawVideoの出力ビデオを返すメソッドを使用CompressedVideo)。 VideoSplitter(splitタイプの入力ビデオを取り込みRawVideo、それぞれタイプの2つの出力ビデオのベクトルを返すメソッドを使用RawVideo)。 VideoIndexer(indexタイプの入力ビデオを取り込み、タイプRawVideoのビデオインデックスを返すメソッドを使用VideoIndex)。 私は自分自身だけのような呼び出しを行うために、各クラスをインスタンス化見つけますVideoCompressor.compress(...)、VideoSplitter.split(...)、VideoIndexer.index(...)。 表面的には、クラス名は意図する機能を十分に説明していると思います。実際には名詞です。同様に、それらのメソッドも動詞です。 これは実際に問題ですか?

4
プライベートゲッターではなくパブリックファイターを使用する
ほとんどの不変のPOJOは次のように書かれています: public class MyObject { private final String foo; private final int bar; public MyObject(String foo, int bar) { this.foo = foo; this.bar = bar; } public String getFoo() { return foo; } public int getBar() { return bar; } } しかし、私は次のようにそれらを書く傾向があります。 public class MyObject { public final String foo; …

11
誰もプロポーショナルフォントを好むのですか?[閉まっている]
私は、プログラミングスタイルに関するウィキペディアの記事を読んでいて、垂直方向に配置されたコードに対する議論に何か気づきました。 等幅フォントへの依存。表形式は、エディターが固定幅フォントを使用することを前提としています。最新のコードエディタのほとんどはプロポーショナルフォントをサポートしており、プログラマは読みやすくするためにプロポーショナルフォントを使用することを好む場合があります。 正直に言うと、プロポーショナルフォントを好むプログラマーに出会ったことはないと思います。また、それらを使用する本当に良い理由も考えられません。なぜプロポーショナルフォントを好むのですか?

7
ペアプログラミングはいつ機能しますか?いつそれを避けるべきですか?
常にプログラムをペアリングするのではなく、チームでペアプログラミングを選択的に使用します。次のような状況で最適に機能すると思います。 プロジェクトの新しいチームメンバーを増やします(ドキュメントやコードを自分で歩くのではなく)。 ジュニアとシニアの人々が一緒に働くことは(より経験豊富な開発者のスキルとトリックの一部を示すのに役立ちます。また、老犬が時々新しいトリックを学ぶことができます)。 誰かが欠陥を追跡しようとするとき、それはしばしば新鮮な目のセットとペアリングするのに役立ちます。 ペアプログラムを使用するタイミングとその理由 ペアプログラミングを回避する場合 どうして?

3
HTTPリクエストヘッダーとリクエストボディの違いは何ですか?
私はモバイルクライアント用の一連のWebサービスに取り組んでいます。要件では、すべてのリクエストに含まれ、特定のリクエストに格納され、他のリクエストで結果をフィルタリングするために使用される一意のデバイスIDが必要です。 すべてのリクエストに含まれるので、カスタムHTTPヘッダーに入れることを提案しました。そのため、特定のデータがヘッダーにあるのか、他のデータと一緒にあるのかを判断するためにどの基準を使用するのか疑問に思い始めましたリクエスト本文。 そのような基準はありますか?

5
「設定より規約」は基本的なプログラミングの原則に違反していませんか?
私はWPF MVVMフレームワークCaliburn.Microを見ていましたが、多くの標準的なものは命名規則に基づいていることを読みました。 たとえば、ViewのプロパティをViewModelのプロパティに自動バインドします。これは便利なように見えますが(定型コードを削除します)、私の最初の本能的な反応は、このコードを読む新しいプログラマーにとって完全に明白ではないということです。つまり、アプリケーションの機能は、独自のコードによって完全に説明されるのではなく、フレームワークのドキュメントによっても説明されます。 編集: したがって、このアプローチは設定よりも規約と呼ばれます。これに関する質問が見つからなかったため、質問を変更しました。 私の質問は: 構成に対する規約は物事を単純化する正しい方法ですか、それともプログラミングの原則に違反していますか(もしそうなら、どの原則に違反していますか)?

6
マイクロサービスでは、サービスごとに単一のデータベースまたは単一のデータベースインスタンスですか?
マイクロサービスアーキテクチャの各サービスには独自のデータベースが必要であることを理解しています。しかし、独自のデータベースを持つということは、実際には、同じデータベースインスタンス内に別のデータベースを単に持つことを意味しますか、それとも文字通り別のデータベースインスタンスを含むことを意味しますか? これにより、私はデータベースの共有を意味するのではなく、これはノー・ノーであり、むしろデータベースのインスタンスです。 たとえば、AWSを使用していて3つのサービスがある場合、単一のRDSインスタンスで各サービスに3つのデータベースを作成しますか、3つのサービスのそれぞれで独立して使用されるデータベースを含む3つのRDSインスタンスを作成しますか? 単一のRDSインスタンスで複数のデータベースを使用することをお勧めする場合、次の理由により、独立したサービスを持つという目的を無効にします。 RDSインスタンスのリソースはサービス間で共有されます。特定の時間にデータベースの使用量が多い可能性のあるサービスAは、同じRDSインスタンス上で異なるデータベースを使用するサービスBに影響しますか? すべてのサービスは、そのRDSインスタンスのデータベースバージョンに依存します。

5
C内からシェルコマンドを呼び出すことをお勧めしますか?
udevadm info -q path -n /dev/ttyUSB2Cプログラムから呼び出したいUNIXシェルコマンド()があります。おそらく約1週間の闘争で、私はそれを自分で再実装することができましたが、私はそれをしたくありません。 単に電話するのは広く受け入れられている良い習慣popen("my_command", "r");ですか?それは受け入れられないセキュリティ問題を引き起こし、互換性の問題を転送しますか?このようなことをするのは間違っているように感じますが、なぜそれが悪いのかを指で確かめることはできません。
50 c  unix  shell 

3
型システムとは何ですか?
バックグラウンド 私はサイドプロジェクトとして言語を設計しています。動作するアセンブラー、静的アナライザー、それに仮想マシンがあります。構築したインフラストラクチャを使用して、重要なプログラムを既にコンパイルおよび実行できるため、大学でプレゼンテーションを行うことを考えました。 私の話の中で、私はVMが型システムを提供することについて言及しました、「あなたの型システムは何のためにあるのですか?」答えた後、私は質問をする人に笑われました。 したがって、この質問をすることで評判を失うことはほぼ確実ですが、プログラマーに頼ります。 私の理解 私が理解しているように、型システムはプログラム内のエンティティに関する追加情報の層を提供するために使用されるため、ランタイム、コンパイラー、またはその他の機械は、操作対象のビット文字列をどう処理するかを認識します。また、コントラクトの維持にも役立ちます。コンパイラ(またはコードアナライザー、ランタイム、またはその他のプログラム)は、プログラマーが期待する値でプログラムが動作することをいつでも検証できます。 タイプは、それらの人間のプログラマーに情報を提供するためにも使用できます。たとえば、次の宣言を見つけます。 function sqrt(double n) -> double; これよりも便利 sqrt(n) 前者は多くの情報を提供します:sqrt識別子は関数であり、double入力として単一のものを取り、double出力として別のものを生成します。後者は、おそらく単一のパラメーターを取る関数であることを示しています。 私の答え それで、「あなたのタイプシステムは何のためですか?」私は次のように答えました: 型システムは動的です(型は値を保持する変数ではなく値に割り当てられます)が、意外な強制ルールがなければ強力です(互換性のない型を表すため、文字列を整数に追加できませんが、浮動小数点数に整数を追加できます) 。 タイプシステムは、命令のオペランドが有効であることを確認するためにVMによって使用されます。また、プログラマーは、関数に渡されたパラメーターが有効(つまり、正しい型)であることを確認するために使用できます。 型システムは、サブタイピングと多重継承をサポートしています(プログラマーは両方の機能を使用できます)。オブジェクトのメソッドの動的ディスパッチが使用される場合、型は考慮されます。 次の質問は、「タイプは値にどのように割り当てられますか?」でした。そこで、すべての値がボックス化され、タイプの名前、応答するメッセージ、および継承するタイプに関する情報を提供するタイプ定義構造を指すポインターがあることを説明しました。 その後、私は笑われ、「それは本当のタイプシステムではない」というコメントで私の答えは却下されました。 だから-私が説明したものが「実際のタイプシステム」として適格でない場合、どうなりますか?その人は、私が提供するものを型システムと見なすことができないということは正しいのですか?

5
エンドユーザーの命名法が変更された場合、コードとデータの名前をどこまで変更する必要がありますか?
かなり前に、ワークフローキューに追加された画像をユーザーが「受け入れる」機能を追加しました。結局、間違った用語を使用し、ユーザーは実際に画像を「承認」しました。 インターフェースのAcceptをApproveに変更するのは簡単です。1つの単語を置き換えるだけです。ただし、CSSクラス名からデータベース値まで、すべてのレイヤーを「accept」という単語でプログラミングしました。 ボタンを緑色にするCSSクラス: ".accepted"; DOMノードのクラス属性を検証およびバインドするモデルメソッド: "isAccepted"; JavaScriptステータス属性:「未確認」、「承認済み」、「公開済み」の配列。 Mysqlステータス列:「未確認」、「承認済み」、「公開済み」のENUM。 テスト名; 承認する承認のほとんどの出現を置き換えることは簡単です(特にテストがある場合)。特に、展開と同期する必要があるため、データを移行するのが少し難しくなります。 この特定のケースは単純ですが、私のキャリアの中で、同様の、さらに複雑なケースに直面しました。ファイルの名前も変更され、数十台のサーバーで展開が行われる場合、またはプロキシキャッシングの場合、memcachedとmysqlが関係します。 インターフェース以外のすべてのレイヤーに「受け入れられた」ままにしておくのは悪い考えです。チームに参加する新しいプログラマーは、この決定に至った歴史的な理由を学ばない可能性があるためです。 「管理上の次のステータス会議のためにキューに入れられました」に名前が変更されました、それは確かに意味をなさないでしょう。そして、あちこち妥協しても、ユーザーインターフェイスの概念はシステムの内部に影響を与えないことを何度か繰り返しますが、出力の半分が内部に接続されていないシステムで作業したくはありません。 だから、必要なときに常にすべての名前を変更していますか?これがあなたに起こり、トレードオフは価値がないと判断した場合、それはあなたを噛むために戻ってきましたか?この問題を回避するには、コードコメントまたは開発者向けドキュメントで十分ですか?

8
Itaniumプロセッサがコンパイラを書くのが難しいのはなぜですか?
よく知られているように、IntelのItanium 64ビットプロセッサアーキテクチャは、革新的なEPIC命令セットが優れたコンパイラを書くのが非常に難しく、IA64の優れた開発者ツールが不足しており、そのアーキテクチャ用のプログラムを作成する開発者が不足していたために失敗した、だから誰もハードウェアをあまりソフトウェアなしで使いたくなかったので、プラットフォームは失敗しました。馬蹄形の爪 優れたコンパイラ。 しかし、なぜコンパイラはそんなに難しい技術的な問題だったのでしょうか?コンパイラベンダーがEPICの明示的な並列処理を実装するのが難しいとしたら、そもそもなぜそれらに負担をかけるのでしょうか。この問題に対する優れた、十分に理解された解決策がまだ存在していなかったようではありません。代わりにその負担をインテルに負わせ、コンパイラ作成者にもっと簡単なターゲットを与えます。 Itaniumは1997年に登場しました。この時点までに、UCSD P-Codeバイトコードシステムは20年近く近く、Z-machineはわずかに若く、JVMはプログラミング言語の世界でホットな新星となりました。Intelが「単純なItaniumバイトコード」言語を指定せず、このバイトコードを最適化されたEPICコードに変換し、そもそもシステムを設計した人々としての専門知識を活用するツールを提供しなかった理由はありますか?
50 history  compiler 

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