ソフトウェア工学

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

4
JVMでヒープサイズが固定されているのはなぜですか?
JVMを固定ヒープサイズで実行する必要がある理由(JVMをあまり多くチェックしなかったが、そのようにしないものは見たことがありません)を誰かが説明できますか?単純な連続したヒープに実装する方が簡単ですが、Sun JVMは10年以上前のものなので、これを改善する時間があったと思います。 起動時にプログラムの最大メモリサイズを定義する必要があるのは1960年代のことのように思え、OS仮想メモリ管理との悪い相互作用があります(GCはスワップアウトされたデータを取得し、Javaプロセスのメモリ量を判断できません)実際に OS側から使用して、無駄なVM空間の膨大な量は、(私が知っている、あなたは...あなたの空想の48ビットマシン上で気にしません))。また、JVM内に小さなオペレーティングシステム(EEアプリケーションサーバー、OSGi)を構築しようとするさまざまな悲しい試みは、この状況で少なくとも部分的に責任があると思います。システム上で複数のJavaプロセスを実行すると、ピーク時に使用する必要があるメモリをそれぞれに割り当てます。 驚くべきことに、Googleは私が期待するような怒りの嵐を降ろしませんでしたが、固定ヒープサイズを見つけて事実を受け入れるだけの何百万という人々に埋もれてしまったのかもしれません。
20 java 

7
ヘッダーファイルは実際に良いですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 ヘッダーファイルは、クラス内のすべての関数とデータメンバーの「概要」を提供するため、C ++ソースファイルを参照するときに役立ちます。他の多くの言語(Ruby、Python、Javaなど)にこのような機能がないのはなぜですか?これは、C ++の冗長性が役立つ領域ですか?
20 c++ 

7
「バックポート」という用語の反対はありますか?
私が理解しているように、「バックポート」という用語は、前のバージョンにも移植される将来のバージョンに適用される修正を説明するために使用されます。ウィキペディアの定義は次のとおりです。 バックポートとは、特定のソフトウェアの変更(パッチ)を取得し、それが最初に作成されたソフトウェアの古いバージョンに適用するアクションです。ソフトウェア開発プロセスの保守ステップの一部を形成します... 例えば: V2.0で問題が発見され、修正されました。同じ修正が移植され、V1.5に適用されます。 これが反対方向に行われるときの用語は何ですか? この問題はV1.5で発見され、修正されました。同じ修正が移植され、V2.0に適用されます。 「バックポート」という用語は引き続き適用されますか?または、「Forwardporting」(面白いことに「Port Forwarding」とよく似ています)などの用語はありますか?

1
デシジョンツリーとニューラルネットワーク
この質問はして移行され、それがソフトウェア工学スタック所に答えることができるので、スタックオーバーフローから。 7年前に移行され ました。 銀行などの金融システムで不正行為を予測および予測するための機械学習構造を実装しています。カード番号、カード名義人名、金額、国など... どの構造がこの問題に最適かを判断するのに苦労しています。私は決定木の経験がありますが、現在、この種の問題に対してニューラルネットワークの方が良いかどうか疑問に思っています。また、他の方法が最適な場合は、気軽に私に教えてください。 各構造の長所と短所はどれで、どの構造がこの問題に最適でしょうか? また、この事実についてはわかりませんが、決定木は実行速度の点でニューラルネットワークよりも優れていると思います。このプロジェクトでは速度も重要な要素であるため、これは重要です。

1
Cライブラリが同じ名前のマクロと関数を使用するのはなぜですか?
PJ Plaugerの「The Standard C Library」を読んでいますが、これは本当に興味深いです。この本では、ライブラリの使用方法だけでなく、ライブラリの実装方法についても説明しています。 ctype.hセクションを読み終え、ヘッダーで関数がマクロと関数の両方として宣言されています。例えば int isdigit(int); だけでなく #define isdigit(c) (_Ctype[(int)(c)] & _DI) 両方が使用される理由がわかりませんか? また、独自のカスタムを再作成しようとすると ctypeヘッダーと実装とすると、マクロを削除する(定義をコメントアウトする)場合にのみ正常にコンパイルできます。 この側面は本で実際に説明されていませんでした。誰か説明してもらえますか?
20 c  naming  functions  macros 

3
Clojureには継続/コルーチン/などがありますか?
私はPythonでプログラミングを始めましたが、コルーチンやクロージャーなどの概念に本当に戸惑っていました。 今、私はそれらを表面的なレベルで知っていると思いますが、その「啓発」の瞬間を一度も感じたことがないので、Clojureを学ぶことにしました。私はスチュアート・ハロウェイの本を買ったが、それは良いが、インデックスを見ると、コルーチンや継続のような言葉はなかった。私はそれらをグーグルで検索しましたが、何もありません。 だから、私の質問は: Clojureには、スタックオーバーフローなしでピンポンのようなタスクを実行するための継続またはコルーチンがありますか? Pythonの例(標準のPythonは、この対称コルーチンの完全な機能を備えたバージョンをサポートしていません): def ping(): while 1: print "ping" function to switching to pong def pong(): while 1: function to switching to ping print "pong"


13
オペレーティングシステムがCおよびC ++で低レベルの処理を行うのはなぜですか?なぜC ++だけではないのですか?
WindowsのWikipediaページには、Windowsがブートローダーとタスクスイッチャー用にAssemblyで、カーネルルーチン用にC と C ++で記述されていることが記載されています。 IIRC、あなたがからC ++の関数を呼び出すことができるextern "C"「Dブロック。カーネル関数にCを使用して、純粋なCアプリがそれらを使用できるようにすることができます(printfなど)が、それらをextern "C "ブロックにラップすることができるのであれば、なぜCでコードを書くのですか?

7
シニアメンターは何人のジュニアですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 私たちのショップのサイズは動的に増加するため、いくつかの新しいジュニア開発者を雇う予定ですが、あまりにも多くの指導とトレーニングでシニアを圧倒したくはありません。シニアがまだ効果的にタスクを実行できる間に、シニア開発者のメンターになれる(通常は大学を卒業したばかりの)ジュニア開発者は何人いますか?

3
ユニットテストC ++:テスト対象
TL; DR 優れた有用なテストを書くのは難しく、C ++でのコストは高くなります。経験豊富な開発者は、何をいつテストするかについての論理的根拠を共有できますか? 長い話 私はチーム全体でテスト駆動開発を行っていましたが、実際にはうまくいきませんでした。多くのテストがありますが、実際のバグやリグレッションがあるケースをカバーすることはないようです-通常、ユニットが相互作用しているときに発生し、孤立した動作からではありません。 これは多くの場合、ユニットレベルでテストするのが非常に難しいため、TDDの実行を停止し(開発を実際にスピードアップするコンポーネントを除く)、代わりに統合テストの対象範囲を増やすためにより多くの時間を費やしました。小規模なユニットテストは実際のバグをキャッチすることはなく、基本的にメンテナンスオーバーヘッドにすぎませんでしたが、統合テストは本当に努力する価値がありました。 今、私は新しいプロジェクトを継承しましたが、それをテストする方法を知りたいと思っています。ネイティブのC ++ / OpenGLアプリケーションであるため、統合テストは実際にはオプションではありません。しかし、C ++でのユニットテストはJavaよりも少し難しく(明示的にものを作成する必要がありますvirtual)、プログラムはオブジェクト指向ではないため、いくつかのものをモック/スタブすることはできません。 テストを書くためにいくつかのテストを書くためだけに、すべてを引き裂いてオブジェクト指向化したいとは思いません。だから私はあなたに尋ねています:それは何のためにテストを書くべきですか?例えば: 頻繁に変更する予定の関数/クラス 手動でテストするのがより難しい関数/クラス? すでにテストが簡単な関数/クラス? 敬意を表するいくつかのC ++コードベースを調べて、テストがどのように行われるかを確認し始めました。今はChromiumのソースコードを調べていますが、コードからテストの理論的根拠を抽出するのは難しいと感じています。人気のあるC ++ユーザー(委員会、本の著者、Google、Facebook、Microsoftなど)がこれにどのようにアプローチしているかについて、良い例や投稿がある場合は、さらに役立つでしょう。 更新 これを書いて以来、私はこのサイトとウェブを探索しました。良いものを見つけました: 単体テストを行わないのはいつが適切ですか? /programming/109432/what-not-to-test-when-it-comes-to-unit-testing http://junit.sourceforge.net/doc/faq/faq.htm#best 悲しいことに、これらはすべてJava / C#中心です。Java / C#で多くのテストを作成することは大きな問題ではないため、通常は利益がコストを上回ります。 しかし、上で書いたように、C ++ではより困難です。特に、コードベースがそれほどオブジェクト指向でない場合は、ユニットテストのカバレッジを良好にするために、物事をひどく混乱させる必要があります。例えば、私が継承したアプリケーションにGraphicsは、OpenGLの上にある薄層の名前空間があります。すべてのエンティティをテストするには、すべてのエンティティがその機能を直接使用するため、これをインターフェイスとクラスに変換し、すべてのエンティティに挿入する必要があります。それはほんの一例です。 したがって、この質問に答えるとき、テストを書くためにかなり大きな投資をしなければならないことに注意してください。

5
アソシエーション、アグリゲーション、およびコンポジションの使用は何ですか?
カプセル化とは何か、それを実装する3つの手法であるアソシエーション、アグリゲーション、コンポジションについて多くの理論を経験しました。 私が見つけたのは: カプセル化 カプセル化は、クラス内のフィールドをプライベートにし、パブリックメソッドを介してフィールドへのアクセスを提供する技術です。フィールドがプライベートとして宣言されている場合、クラス外の誰もアクセスできないため、クラス内のフィールドは非表示になります。このため、カプセル化はデータ隠蔽とも呼ばれます。 カプセル化は、クラス外で定義された他のコードがコードとデータにランダムにアクセスすることを防ぐ保護バリアとして説明できます。データとコードへのアクセスは、インターフェイスによって厳密に制御されます。 カプセル化の主な利点は、コードを使用する他の人のコードを壊すことなく、実装されたコードを変更できることです。この機能により、カプセル化により、コードの保守性、柔軟性、および拡張性が向上します。 協会 関連付けは、すべてのオブジェクトに独自のライフサイクルがあり、所有者がいない関係です。教師と生徒の例を見てみましょう。複数の生徒が1人の教師に関連付けられ、1人の生徒が複数の教師に関連付けられますが、オブジェクト間に所有権はなく、両方に独自のライフサイクルがあります。どちらも独立して作成および削除できます。 集計 集約は、すべてのオブジェクトに独自のライフサイクルがある特殊な形式の関連付けですが、所有権があり、子オブジェクトは別の親オブジェクトに属することはできません。学科と教師の例を見てみましょう。1人の教師を複数の部門に所属させることはできませんが、部門を削除しても教師オブジェクトは破棄されません。それは「has-a」関係と考えることができます。 組成 合成は再び集約の特殊な形式であり、これを「死」関係と呼ぶことができます。これは強力なタイプの集約です。子オブジェクトにはライフサイクルがありません。親オブジェクトを削除すると、すべての子オブジェクトも削除されます。もう一度、家と部屋の関係の例を見てみましょう。家には複数の部屋を含めることができますが、部屋の独立した生活はなく、2つの異なる家に属することはできません。家を削除すると、部屋は自動的に削除されます。 質問は: 今、これらはすべて実世界の例です。実際のクラスコードでこれらの手法を使用する方法についての説明を探しています。私が意味する、カプセル化のための3つの異なる技術を使用するためのポイントは何か、これらの技術を実装する方法とどのように一度に適用される技術を選択します。

12
仕事以外で学ぶモチベーションと時間を得る方法 [閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 私はプログラマーとして40時間働いており、家に帰る頃には最後にやりたいことはもう少しコードを書くことです。しかし、私は良くなっていませんが、ソフトウェアエンジニアリングが大好きです。では、仕事以外でクラフトを改善するための時間/動機をどのように見つけますか?
20 motivation 


4
個人のGitリポジトリを整理するにはどうすればよいですか?
私は、最近のiOSプロジェクトの一部として開発した1組のライブラリを、他のiOS開発者が自由に利用できるようにする計画で、GitHubアカウントを設定しています。 現在、ほとんどのコードのオフサイトバックアップはありません。そのため、当初、私はすべての個人プロジェクト、または少なくともすべてのiOSプロジェクトをGitHubがホストするプライベートリポジトリにアップロードすると考えていました。 。しかし、私は多くのプロジェクトを抱えており、その多くはかなり価値の低いものです(つまり、本を改造して学習体験のために書いたものです)。GitHubはプライベートリポジトリによって課金されるだけでなく、リポジトリを階層的に整理する方法もありません。 私が不足しているものがあり、階層でgitリポジトリを使用し、必要なときにそれらをチェックアウトしたり、現在SVNで行っている方法で作業したりできますか? GitHub(またはBitBucketのような競合他社)には、プロジェクト構成の機能がいくつか欠けていますか? それに失敗すると、この状況を処理する一般的に受け入れられている「Gitの方法」は何ですか(リリースを目的としていないプロジェクトを破棄し、オフラインで保存し、何らかの方法で一緒にバンドルするなど)。 私が知る限り、私のオプションは次のとおりです。 ライブラリをGitHubに配置し、他のすべてのプロジェクトで自分のSVNをホストし続け、オフサイトバックアップ(非難)に非VCSソリューションを使用し、 私がリリースする予定のライブラリとソフトウェアをGitHubに(それぞれパブリックおよびプライベートとして)入れ、あまり気にしないプロジェクトのために自分のSVNをホストし続け、XYZの実装方法に関する記憶を更新するために再訪する可能性が高い私の家が破裂した場合(二重の荒れ)、それらを消しても構わないと決めます。 [GitHubおよび/またはBitBucket]にすべてを配置し、必要なものを検索するか、[GitHubおよび/またはBitBucket]アカウントへのオフラインポインターセットを維持することで、途方もない数のリポジトリを持つことに対処する(トリプルブレチ)

6
「カスタムソフトウェア会社」は技術的な負債をどのように処理しますか?
この質問はして移行され、それがソフトウェア工学スタック所に答えることができるので、スタックオーバーフローから。 7年前に移行され ました。 「カスタムソフトウェア会社」とは何ですか? 「カスタムソフトウェア会社」とは、主にカスタムの1回限りのソフトウェアを構築することで収益を得ている会社を意味します。例は、代理店またはミドルウェア企業、またはRedifyのような請負業者/コンサルタントです。 「カスタムソフトウェア会社」の反対は何ですか? 上記のビジネスモデルの反対は、展開可能なデスクトップ/モバイルアプリであろうとSaaSソフトウェアであろうと、長期的な製品に焦点を当てている企業です。 技術的負債を積み上げる確実な方法: 私は、一連のSaaS製品に集中しようとする会社で働いています。ただし、特定の制約のために、特定のクライアントの意志に屈することがあり、そのクライアントにのみ使用できるカスタムソフトウェアのビルドを終了します。 これは技術的な負債を負う確実な方法です。これで、コア製品に何も追加しない、維持するソフトウェアが少しあります。 カスタム作業が技術的な負債を増やす確実な方法である場合、代理店はそれをどのように処理しますか? それで私は考えました。ビジネスモデルの中心としてコア製品を持っていない企業は、常にカスタムソフトウェア作業を行っています。彼らはどのように技術的負債の概念に対処しますか?どうして彼らを技術的な破産に追い込まないのですか?

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