ソフトウェア工学

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

5
自分の言語を最初にCコードにコンパイルするのが理にかなっているのはいつですか?
独自のプログラミング言語を設計するとき、gccなどの既存のコンパイラを使用してマシンコードを作成できるように、ソースコードを取得してCまたはC ++コードに変換するコンバーターを記述するのはいつ意味がありますか?このアプローチを使用するプロジェクトはありますか?

4
実際にバイトストリームとは何ですか?
誰が実際にバイトストリームに含まれているのか説明できますか?バイト(16進データ)またはバイナリデータまたは英字のみが含まれていますか?「生データ」という用語についても混乱しています。「4バイトのデータを逆にする」ように頼まれた場合、データは16進コードまたはバイナリコードであると想定する必要がありますか?

12
汎用オブジェクトをコンテナに保存してからオブジェクトを取得し、コンテナからオブジェクトをダウンキャストするのはコードの匂いですか?
たとえば、プレーヤーの能力を高めるためのいくつかのツールを備えたゲームがあります。 Tool.h class Tool{ public: std::string name; }; そしていくつかのツール: Sword.h class Sword : public Tool{ public: Sword(){ this->name="Sword"; } int attack; }; Shield.h class Shield : public Tool{ public: Shield(){ this->name="Shield"; } int defense; }; MagicCloth.h class MagicCloth : public Tool{ public: MagicCloth(){ this->name="MagicCloth"; } int attack; int defense; }; …

3
カスタムHTTPメソッドの実装に問題はありますか?
次の形式のURLがあります / instance / {instanceType} / {instanceId} 標準のHTTPメソッドで呼び出すことができます:POST、GET、DELETE、PUT。ただし、「下書きとして保存」や「キュレート」など、いくつかのアクションがあります ドラフト、検証、キュレートなどのカスタムHTTPメソッドを使用できると考えました 基準が言うので、これは許容できると思います 「HTTP / 1.1の共通メソッドのセットを以下に定義します。このセットは拡張できますが、追加のメソッドは、個別に拡張されたクライアントとサーバーで同じセマンティクスを共有することはできません。」 また、WebDavなどのツールは独自の拡張機能を作成します。 カスタムメソッドで誰かが遭遇した問題はありますか?プロキシサーバーとファイアウォールを考えていますが、他の懸念事項は大歓迎です。安全な側にとどまり、action = validate | curate | draftのようなURLパラメーターを設定するだけですか?
34 rest  http 

3
C ++ 11は、動的/共有ライブラリ境界間でstd libオブジェクトを渡す懸念に対処しましたか?(つまり、dllなど)?
C ++についての私の主な不満の1つは、動的ライブラリ(つまり、dll / so)境界の外側にstdライブラリオブジェクトを渡すことが実際にはどれほど難しいかということです。 stdライブラリは、多くの場合ヘッダーのみです。これは、いくつかの素晴らしい最適化を行うのに最適です。ただし、dllの場合、それらは多くの場合、stdライブラリコンテナの内部構造/コードに影響する可能性のある異なるコンパイラ設定で構築されます。たとえば、MSVCでは、1つのdllがイテレータデバッグをオンにしてビルドされ、別のdllがオフでビルドされます。これらの2つのdllは、stdコンテナーを渡す問題に遭遇する可能性があります。std::stringインターフェイスで公開すると、クライアントが使用しているコードがstd::stringライブラリのに完全に一致することを保証できませんstd::string。 これにより、デバッグや頭痛などの問題が発生しやすくなります。組織内のコンパイラ設定を厳密に制御してこれらの問題を防ぐか、これらの問題のない単純なCインターフェイスを使用します。または、クライアントが使用するはずの予想されるコンパイラ設定を指定します(別のライブラリが他のコンパイラ設定を指定する場合、これは問題になります)。 私の質問は、C ++ 11がこれらの問題を解決するために何かを試みたかどうかです。
34 c++  libraries  c++11 

4
リトルエンディアンは勝ちましたか?
最近ビッグエンディアンとリトルエンディアンの戦いについて教えているときに、学生はそれが解決したかどうかを尋ねましたが、私は知らないことに気付きました。ウィキペディアの記事を見ると、現在最も人気のあるOS /アーキテクチャペアはリトルエンディアンを使用しているようですが、インターネットプロトコルはパケットヘッダーの数値を転送するためにビッグエンディアンを指定しています。それは現在の状況の良い要約でしょうか?現在のネットワークカードまたはCPUは、バイトオーダーの切り替えをハードウェアでサポートしていますか?

3
Microsoft SQL Serverで文字列の前にNを置く必要があるのはなぜですか?
T-SQLを学んでいます。私が見た例から、varchar()セルにテキストを挿入するために、挿入する文字列だけを書くことができますが、nvarchar()セルの場合、すべての例は文字列の前に文字Nを付けます。 nvarchar()行があるテーブルで次のクエリを試しましたが、正常に機能するため、プレフィックスNは必要ありません。 insert into [TableName] values ('Hello', 'World') 私が見たすべての例で、文字列の先頭にNが付いているのはなぜですか? このプレフィックスを使用することの長所と短所は何ですか?

8
クラスが単一の責任原則を満たしているかどうかを判断する方法は?
単一責任の原則は、高い結束の原則に基づいています。この2つの違いは、SRPに準拠するクラスの責任は1つだけであるのに対し、非常に凝集性の高いクラスには密接に関連する一連の責任があることです。 しかし、特定のクラスに一連の責任があり、したがって非常に凝集性があるのか​​、それとも1つの責任しか持たず、したがってSRPに準拠するのかをどのように判断するのでしょうか。言い換えれば、クラスが非常にきめ細かいと考える人もいるかもしれません(クラスがSRPに準拠していると考える人もいるかもしれませんが)


21
大規模なITプロジェクトが失敗する傾向があるか、コスト/スケジュールのオーバーランが大きいのはなぜですか?[閉まっている]
私は常に、大規模な変革または統合プロジェクトについて読んでいますが、これは完全またはほぼ完全な災害です。なんとか成功したとしても、コストとスケジュールの破綻は莫大です。大規模なプロジェクトが失敗しやすい背後にある本当の理由は何ですか。この種のプロジェクトでアジャイルを使用できますか、それとも従来のアプローチが最適です。 オーストラリアの1つの例は、プロジェクトを実施するためにテストの成功基準を変更したクイーンズランド州の給与プロジェクトです。 このSOの質問(Wayback Machineで)で失敗したプロジェクトをいくつか見る 共有する個人的な経験はありますか?

5
Pythonミックスインはアンチパターンですか?
私はpylint、他の静的分析ツールがすべてを知っているわけではないことを完全に認識しています。(これは、conventions だけでなく、さまざまなクラスのメッセージに適用されます。) 私のようなクラスがある場合 class related_methods(): def a_method(self): self.stack.function(self.my_var) class more_methods(): def b_method(self): self.otherfunc() class implement_methods(related_methods, more_methods): def __init__(self): self.stack = some() self.my_var = other() def otherfunc(self): self.a_method() 明らかに、それは不自然です。あなたが好きなら、これはより良い例です。 このスタイルは「ミックスイン」を使用して呼び出されると思います。 他のツールと同様に、pylintレートでこのコードを-21.67 / 10、主にそれは考えているためmore_methodsとrelated_methods持っていないselfか、属性otherfunc、stack、annd my_varのコードを実行せず、それは明らかに見ることができないためrelated_methodsとmore_methods混合でにしていますimplement_methods。 コンパイラーと静的解析ツールが停止問題を常に解決できるとは限りませんが、これは確かに、継承されたものを見るとimplement_methodsこれが完全に有効であることを示す場合であり、それは非常に簡単なことです。 なぜ静的解析ツールがこの有効な(私が思うに)OOPパターンを拒否するのですか? どちらか: 彼らは継承をチェックしようとさえしません mixinは慣用的で読みやすいPythonでは推奨されません #1は明らかに間違っています。なぜなら、を使用し pylintて継承する私のクラス(でのみ定義されているもの)について教えてもらえば、文句を言わないからです。unittest.TestCaseself.assertEqualunittest.TestCase ミックスインは非Pythonpythonですか、落胆しますか?

3
クローズドソースアプリケーションからGPLライブラリにリンクできますか?
さて、誰もが重複した質問について叫ぶ前に、はい、私はすでにこのようないくつかの質問をここで見ました。しかし、誰も質問に答えません。 ライブラリを変更せずにGPL対応のライブラリにリンクする場合、ソースコードをリリースする必要がありますか? この質問によると、答えはイエスです! しかし、この答えは私にとって満足のいくものではありません。答えは基本的に、コードをオープンソースにすることなく、GPLコードを使用することはできません。 しかし、前のことが当てはまる場合、個人や組織がLinuxでプロプライエタリなソフトウェアをリリースすることは不可能であることを示しています。間違っているに違いありません。単に、アプリケーションが何か便利なことをしたり、ファイルを開いたり、コンソールに書き込んだり、TCP接続を作成したりするには、アプリケーションlibcがGPLでリンクされている必要があります。 だから私の質問は次のとおりです:サイト上の以前のすべての回答がそうであるように、GPLが別のGPLプログラムにリンクするプログラムはGPLでなければならないと述べている場合、独自のアプリケーションを作成/リリース/販売する方法は可能ですか? Linuxで実行されるものは何ですか?上で説明したように、そのアプリケーションはLinux上で実行するためだけにGPLコードに好まれる必要があります。 より実用的な例では、非GPLアプリケーションでGPLが適用された共有ライブラリにリンクすると言いますが、それは非GPLアプリケーションを強制的にGPLに変換しますか?より具体的には、GPLライブラリを変更せずに使用し、そのライブラリを.soまたはとして配布.dllすると、アプリケーションがオープンソースである必要がありますか?
34 gpl  linking 

5
定数をどこに置くべきか、そしてその理由は?
私たちの大部分が大規模なアプリケーションでは、通常、「定数」の場所はわずかしかありません。 GUIおよび内部定数(タブページのタイトル、グループボックスのタイトル、計算係数、列挙)の1つのクラス データベースのテーブルと列用の1つのクラス(この部分は生成されたコードです)およびそれらの読み取り可能な名前(手動で割り当てられた) アプリケーションメッセージ(ロギング、メッセージボックスなど)の1つのクラス 定数は通常、これらのクラスの異なる構造体に分けられます。C ++アプリケーションでは、定数は.hファイルでのみ定義され、値は.cppファイルで割り当てられます。 利点の1つは、すべての文字列などが1つの中央の場所にあり、何かを変更する必要があるときに誰もがどこにあるかを知っていることです。 これは特に、プロジェクトマネージャーが人々が行き来する際に好むように思われるものであり、このようにして誰もがアプリケーションの構造を掘り下げることなく、このような些細なことを変更できます。 また、同様のグループボックス/タブページなどのタイトルを一度に簡単に変更できます。別の側面は、そのクラスを印刷して、キャプションが直感的であるか、ユーザーへのメッセージが詳細すぎるか、混乱しすぎていないかなどを確認できる非プログラマーに渡すことができることです。 ただし、いくつかの欠点があります。 すべての単一クラスは、定数クラスに密接に結合されています 定数の追加/削除/名前の変更/移動には、アプリケーションの少なくとも90%の再コンパイルが必要です(注:少なくともC ++の場合、値の変更は行われません)。1500クラスのC ++プロジェクトの1つでは、これは約7分間のコンパイル時間(プリコンパイル済みヘッダーを使用し、ヘッダーなしでは約50分)に加えて、特定の静的ライブラリに対する約10分間のリンクを意味します。 Visual Studio Compilerを使用して速度が最適化されたリリースをビルドするには、最大3時間かかります。膨大なクラス関係がソースであるかどうかはわかりませんが、そうであるかもしれません。 何かを非常に迅速にテストしたいので、そのテスト(そしておそらくその後のすべてのテスト)だけで15分待ちたくないので、一時的に直接コードに文字列をハードコーディングすることになります。「後で修正します」という考え方に何が起こるかは誰もが知っています。 別のプロジェクトでクラスを再利用するのは必ずしも簡単ではありません(主に他の密結合によるものですが、定数の処理はそれを容易にするものではありません)。 そのような定数をどこに保存しますか?また、プロジェクトマネージャーに、上記の利点に適合するより優れた概念があることを納得させるために、どのような議論を提起しますか? C ++固有の回答または独立した回答をお気軽にお寄せください。 PS:私はこの質問が一種の主観的なものであることを知っていますが、正直に言って、この種の質問についてこのサイトよりも良い場所を知りません。 このプロジェクトの更新 コンパイル時間に関するニュースがあります 。Calebとgbjbaanbの投稿に続いて、時間があるときに定数ファイルをいくつかの他のファイルに分割しました。私は最終的にプロジェクトをいくつかのライブラリに分割しましたが、これは今でははるかに簡単になりました。これをリリースモードでコンパイルすると、データベース定義(テーブル、列名など-8000を超えるシンボル)を含む自動生成ファイルと特定のハッシュを構築することにより、リリースモードで膨大なコンパイル時間が発生することがわかりました。 DB定数を含むライブラリのMSVCオプティマイザーを非アクティブ化すると、リリースモードでのプロジェクト(複数のアプリケーション)の合計コンパイル時間を最大8時間から1時間未満に短縮できるようになりました。 MSVCがこれらのファイルを最適化するのにこれほど苦労する理由はまだわかりませんが、今のところ、ナイトリービルドのみに依存する必要がないため、この変更により大きなプレッシャーが軽減されます。 その事実、およびより緊密でない結合、より良い再利用性などのその他の利点も、「定数」の分割に時間を費やすことは、結局のところそれほど悪い考えではないことを示しました;-) Update2 この質問にはまだ注目が集まっ ているので、ここ数年私がやってきたことは次のとおりです。 関連するスコープにすべての定数、変数などを正確に配置します。単一のメソッドでのみ定数を使用する場合、そのメソッドで定義することは問題ありません。単一のクラスに興味がある場合は、そのクラスのプライベート実装の詳細として残します。同じことが名前空間、モジュール、プロジェクト、会社の範囲にも当てはまります。ヘルパー関数などにも同じパターンを使用します。(パブリックフレームワークを開発する場合、これは100%適用されない場合があります。) これにより、再利用性、テスト容易性、および保守性が向上し、コンパイル時間(少なくともC ++)が少なくなるだけでなく、バ​​グ修正にかかる時間が短縮され、新しい機能を実際に開発する時間が増えます。同時に、より多くのコードをより簡単に再利用できるため、これらの機能の開発は高速になります。これは、中央定数ファイルが持つ利点よりも重要です。 詳細を知りたい場合は、特にインターフェイス分離の原則と単一責任の原則をご覧ください。 あなたが同意する場合、この更新は基本的に彼が言ったことに対するより一般的な見解なので、カレブの答えに賛成です。

3
実装が保留中のメソッドに対してNotImplementedErrorを送出するのは慣習的ですか?
私はNotImplementedError実装したい任意のメソッドに対してaを上げるのが好きですが、まだそれをやろうとしていません。私はすでに部分的な実装を持っているかもしれraise NotImplementedError()ませんが、まだ気に入らないのでそれを前に付けます。一方で、他の人が自分のコードを保守しやすくするので、慣習に固執するのも好きです。そして、慣習は正当な理由で存在するかもしれません。 ただし、NotImplementedErrorのPythonドキュメントには次のように記載されています。 この例外はRuntimeErrorから派生しています。ユーザー定義の基本クラスでは、派生クラスがメソッドをオーバーライドする必要がある場合、抽象メソッドはこの例外を発生させる必要があります。 これは、私が説明したものよりもはるかに具体的で正式なユースケースです。NotImplementedErrorAPIのこの部分が進行中の作業であることを単に示すためにを上げるのは良い、従来のスタイルですか?そうでない場合、これを示す別の標準化された方法はありますか?

12
企業での海賊版ソフトウェアの使用[終了]
数ヶ月前にエンジニアとして会社で働き始めました。それは小さな会社であり、彼らが基本的に行うことは電話での応答サービスです。現在、彼らは通常の電話からIP電話に切り替えており、コンピューターが仕事でより重要な位置を占めるようになっています。 ただし、労働者が使用するすべてのコンピューターには、オペレーティングシステムを含む海賊版ソフトウェアが搭載されています。さらに、他のコンピューターのコピーを作成するためのライセンスを1つも購入しませんでした。言い換えれば、彼らはオフィスのソフトウェアにお金を費やしていませんでした。ライセンスを取得したものをコピーすることは合法だと言っているわけではありませんが、状況はあまりにも深刻です。 海賊版ソフトウェアをインストールした人がいます。彼は罪悪感を感じず、私がそれについて尋ねたときさえ正当化しました。彼は専門家でさえありません。彼はインターネット上で検索し、海賊版ソフトウェアをインストールしました。私たちの上司はコンピューターの知識を持っていないので、彼はより安価な方法を取りました。 これについてどう思う?私はまだ会社に慣れていないので、割れたコンピューターのメンテナンスは行っていません。しかし、私はそれらのソフトウェアを毎日使用しなければなりません。そして、後日、サポート、ヘルプデスクなどを行います。私は、海賊版ソフトウェアを操作する責任を本当に負いたくありません。開発者およびエンジニアの観点から、海賊版ソフトウェアは法的サポートを受けることができず、予期せず動作する可能性があります。だから、転職を考えています。 考えすぎですか?上司との信頼性が高まり、彼のポリシーを変更しようとするまで待つ必要がありますか?これまでのところ、上司は私から一言も取りません。ご意見をお待ちしています。ありがとうございました
33 ethics 

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