ソフトウェア工学

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

2
最初のプログラマーは誰ですか?
史上初のプログラマーは誰であるかについて、歴史家の間でコンセンサスはありますか?もしそうなら、それは誰で、彼らは何をプログラミングしていましたか? プログラミングの先駆者について、プログラマブルマシンでプログラミングしたか、コンピューティングタスクを実行するようにマシン自体を設計したかに関係なく、もっと知りたいと思っています。
15 history 

4
MVCでは、複数のビューで同じコントローラーを使用できますか、または1つのビューで1つの一意のコントローラーを使用する必要がありますか?
MVCを中心としたプロジェクトのアーキテクチャを設計しているときに質問があります。(これはC ++ / Marmalade SDKプロジェクトです。特定のMVCフレームワークは使用していません。作成しています。) いくつかの記事(元のSteve Burbek記事など)で、「MVCトライアド」という概念を読み続けています。初めて読んだとき、アプリケーションは「MVCトライアド」ユニット(想定している各UIピースに1つ)を中心に構築されているように見えましたが、これはかなり柔軟性に欠け、MVCの使用が意図されていなかったと思います。次に、この問題をさらに調査すると、コントローラーとビューの密結合の例、つまり1対1の関係が見つかりました-TextEditViewにはTextEditControllerがあります。 しかし、プロジェクトに戻ると、(AddElementControllerのような「論理ユニット」による)1つのコントローラーと、その特定のコントローラーの複数のビューがあると便利です。 私は、何らかのタブUIが必要なAddElementControllerのようなものについて明確に考えています。AddElementTabViewとタブ用の複数のAddImageView、AddSoundViewなどを持つAddElementControllerが必要ですか?または、タブビューごとに異なる「サブコントローラー」が必要ですか? 要約すると、MVCパターン(このフレームワークのXフレームワーク固有の理解/実装ではありません)に関して、コントローラーに複数のビューがあるのは正しいですか、または各ビューに特定のコントローラーが必要ですか? また、いくつかの状態情報をコントローラーに保持するのは正しいですか、それともステートレスである必要があります(つまり、状態を非ドメイン状態モデルに配置する必要があるということですか)。 事前にすべてに感謝します。

5
プログラミング言語の「機能のネイティブサポート」とはどういう意味ですか?
「PHPにはUnicodeのネイティブサポートはありません」というような行をたどりました。また、PythonにはUnicodeのネイティブサポートがあることも読みました。これutf8_encode()で、PHPの関数を呼び出して文字列をUnicodeにエンコードし、unicode()Pythonの関数を使用して文字列をUnicodeに変換できます。では、Unicodeをネイティブでサポートすることはどういう意味ですか?また、一部の言語は並行性をネイティブでサポートしていますが、一部の言語はネイティブをサポートしていません。だから何が意味するの X言語は機能Yをネイティブでサポートします

3
集約ルートに別のARを含める必要がある場合(および含めない場合)
最初に投稿の長さについて謝罪しますが、コメントで前後に時間をかけないように、できるだけ多くの詳細を前もって伝えたいと思いました。 DDDアプローチに従ってアプリケーションを設計していますが、集約ルートに別のARを含めるべきか、それとも独立した「独立した」ARとして残すべきかを判断するためにどのようなガイダンスに従うべきか疑問に思っています。 従業員がその日のために自分で出入りできる単純なタイムクロックアプリケーションの場合を考えてみましょう。UIを使用すると、従業員IDとPINを入力できます。これらは検証され、従業員の現在の状態が取得されます。従業員が現在出勤している場合、UIには「Clock Out」ボタンが表示されます。そして、逆に、彼らが出勤していない場合、ボタンには「Clock In」と表示されます。ボタンによって実行されるアクションは、従業員の状態にも対応しています。 アプリケーションは、RESTfulサービスインターフェイスを介して公開されるバックエンドサーバーを呼び出すWebクライアントです。直感的で読み取り可能なURLを作成する最初のパスの結果、次の2つのエンドポイントが作成されました。 http://myhost/employees/{id}/clockin http://myhost/employees/{id}/clockout 注:これらは、従業員IDとPINが検証され、「ユーザー」を表す「トークン」がヘッダーで渡された後に使用されます。これは、マネージャーまたはスーパーバイザーが別の従業員に出勤または出勤できるようにする「マネージャーモード」があるためです。しかし、この議論のために、私はそれをシンプルにしようとしています。 サーバーには、APIを提供するApplicationServiceがあります。ClockInメソッドの最初のアイデアは次のようなものです。 public void ClockIn(String id) { var employee = EmployeeRepository.FindById(id); if (employee == null) throw SomeException(); employee.ClockIn(); EmployeeRepository.Save(); } これは、従業員のタイムカード情報がトランザクションのリストとして実際に維持されていることに気付くまで、非常に簡単です。つまり、ClockInまたはClockOutを呼び出すたびに、従業員の状態を直接変更するのではなく、従業員のタイムシートに新しいエントリを追加しています。従業員の現在の状態(出勤しているかどうか)は、タイムシートの最新のエントリから取得されます。 したがって、上記のコードを使用する場合、リポジトリは従業員の永続プロパティが変更されていないことを認識し、従業員のタイムシートに新しいエントリが追加されたことを認識し、データストアに挿入する必要があります。 一方(そして、ここに投稿の最終的な質問があります)、TimeSheetはAggregate Rootであり、アイデンティティ(従業員IDと期間)を持っているように見え、TimeSheet.ClockInと同じロジックを簡単に実装できます(従業員ID)。 私は2つのアプローチのメリットについて議論していることに気づき、冒頭の段落で述べたように、どのアプローチが問題により適しているかを判断するためにどの基準を評価すべきか疑問に思います。

4
開発者が期待できるユーザーストーリーの詳細
私が経験したアジャイル開発の最大の欠点は、開発に携わらない人が、ユーザーストーリー(3〜10人の理想的な人の日)が次のような1〜3文を超えてはならないというマントラに集中することです。 顧客として、フリーテキスト検索を使用して、探している製品を見つけることができます。 この文を与えて、プロジェクトマネージャーは私が開発者として見積もりにコミットし、ストーリーを開発することを期待しています。彼らは、アジャイル開発とは、開発者に提供する必要があるのはこのような文だけであると想定していることです。 アジャイル開発に関する有名な文献が、これが実際に機能するという印象を与えるので、私はそれらを責めません。「Planning XP」の記事ごとに自然言語で2ページのようなものを読みましたが、それだけです。「包括的なソフトウェア」よりも「動くソフトウェア」が好まれるため、このトピックは一般的には避けられているようです。 もちろん、現実には、開発者にそうする機会が与えられた場合、顧客とのインタビューによって、顧客がストーリーに関して持っている要件の長いリストが表示されます。 ANDやORなどのブール演算子が必要です。 すべての用語でファジー検索が必要です。 フレーズだけでなく単一の単語でも検索する必要があります。 基準X、Y、およびZを満たす製品を検索する必要はありません。 結果をソートします。ああ、ところで、ユーザーはオプションa、b、cのコンボボックスで並べ替え条件を選択できます。 技術的な詳細やソフトウェアの設計、実装の詳細についても話しているのではないことがわかります。それは純粋な要件です。話す時間が長ければ長いほど、顧客は実際に彼らが望むものについて多くのことを言うことに気付きます。 しかし、多くの場合、そのような情報が提供されていない状況や、非常に見苦しいやり方で自分自身を見つけます。私がインタビューを行うことも、インタビューを行う立場にある人がその結果を提供することもできません。 マネージャーは、「Lucene検索が必要」などの技術的な詳細を思い付く場合もありますが、製品名だけでなく製品の説明も検索するかどうかを考えたくない場合があります。時々私は彼らがただ怠け者だと思う;) 私にとって、これは私が働いているプロジェクトの最大の問題です(e-business Webアプリケーション、プロジェクトごとに500〜2000人日)。私はこの問題に十分な頻度で対処してきましたが、マネージャーはほとんどの開発者が状況に問題があることを認識しています。しかし、彼らは開発者があまりにも「完璧主義者」であると信じています。彼らは開発者が「常にすべてを指定したい」と悩んでいるようです。 一般的に認められている数字がないため、議論するのは難しいです。反復の長さは誰でも知っています。しかし、ストーリーを見積もり、開発するために必要な要件を誰も知ることができません。 参考資料はありますか?

5
monkeypatchingは優れたプログラミング手法と見なされていますか?
私は、モンキーパッチングは、標準的な優れたプログラミング慣行というよりも、迅速で汚れたハックのカテゴリーに属するという印象を受けていました。サードパーティのライブラリのマイナーな問題を修正するために時々使用していましたが、一時的な修正と考え、サードパーティのプロジェクトに適切なパッチを提出しました。 ただし、主流プロジェクト、たとえばGeventのgevent.monkeyモジュールでこの手法が「通常の方法」として使用されているのを見てきました。 モンキーパッチは、主流であり、通常の、受け入れ可能なプログラミングプラクティスになりましたか? 参照:ジェフ・アトウッドによる「人間のためのモンキーパッチング」

4
ビルドスクリプトをC ++で書くのは理にかなっていますか?
私はCMakeを使用してプロジェクトIDE / makefileを生成していますが、それでもコンパイル済みファイルを操作したり、コードを生成したりするためにカスタムの「スクリプト」を呼び出す必要があります。 以前のプロジェクトではPythonを使用していましたが大丈夫でしたが、現在作業中の2つの非常に大きなプロジェクトで多くの依存関係を管理するのが大変なため、どこでも依存関係を最小限に抑えたいと思います。 誰かが、そのための言語依存関係を追加する代わりに、C ++を使用してビルドスクリプトを作成するように私に提案しました。プロジェクトのテーマはすでにC ++を使用しているため、いくつかの利点があります。 プロジェクト全体をビルドするには、C ++コンパイラとCMakeのみが必要であり、他には何も必要ありません(他の依存関係はすべてCまたはC ++です)。 C ++の型安全性(最新のC ++を使用する場合)により、すべてが「正しく」なりやすくなります。 また、私がよく知っている言語でもあるため、優れたPythonコードを書くことができたとしても、安心して使用できます。 実行速度の潜在的な向上(ただし、実際に知覚できるとは思わない); しかし、いくつかの欠点があるかもしれないと思うし、私はまだ試していないので、本当の影響がわからない: コードを書くのに時間がかかるかもしれません(私はC ++で十分に効率が良いのですぐに動作するものを書くので確信がないと言ったので、このシステムでは書くのにそれほど長くはないかもしれません) tこの場合は問題になります); 入力として読み込むテキストファイルはすべてUTF-8であると想定する必要があります。実行時にC ++で簡単にチェックできるかどうかはわかりませんが、言語ではチェックされません。 C ++のライブラリは、スクリプト言語よりも管理が困難です。 私には経験と洞察力が欠けているので、長所と短所が足りないかもしれません。質問は次のとおりです。これにC ++を使用するのは理にかなっていますか?報告する経験はありますか、また重要な利点と欠点がありますか?

7
スクラムを学術環境にどのように適合させることができますか?
現在、大学で提供されているソフトウェアエンジニアリングおよびキャップストーンデザインコースの新しいカリキュラムを開発するために、大学の教授と協力しています。 最近まで、両方のコースでウォーターフォールモデルを排他的に使用していたため、学生は長い時間をかけてレポートを作成していました。私からの多くのプレッシャーの後、私の教授は、この学期にスクラムをソフトウェアエンジニアリングカリキュラムに含めることにしました。 学期の前半はまだ滝のようで、学生は40ページの設計レポートとソフトウェア仕様書を書きました。学期中期には、すべてのチームがアプリケーションのデモをリリースする必要がありました。その時点で、コースはスクラムに切り替わり、3週間のスプリントが2回行われました。現在、ウォーターフォールを完全に排除し、スクラムベースのカリキュラムのみを作成する方法を考えています。 残念ながら、スクラムと学生の間でいくつかの非互換性が発生しました。 毎日のスクラム会議は、学生にとってほぼ不可能です。授業中であっても、教授が通常講義しているため、学生がスクラム会議を開催するのは不便です。 学生は経験が浅いため、何か時間がかかるのを正確に予測できないため、ポイント/時間の推定は困難です。 スクラムは、常勤の同じ場所にいる開発者に最適ですが、学生もそうではありません。せいぜい、学生はコースに週15〜20時間を捧げ、仕事の会議を開催することは非常に困難です。チームには最大10人の生徒を含めることができます(常に1人または2人の怠け者がいます)。 教授はドキュメントを切望しています!スクラムレポートは聞いていません。バックログとバーンダウンチャートだけです(アカデミックをなだめるのに十分かどうかはわかりません)。 学生はしばしば、アジャイルは「すぐにジャンプして、振り返らずにコーディングを開始する」ことを意味すると思います。これは、想像できる最も恐ろしいコードの一部につながります。したがって、50ページのドキュメントやUMLダイアグラムの山を必要とせずに適切な設計を実施する方法を探しています。 これらの問題を考えると、教授と私はスクラムをアカデミックな環境で機能するようにどのように適応させることができると思いますか(そもそもスクラムを気にする必要がありますか)。また、ウォーターフォールモデルを教えることにはまだ価値がありますか? フィードバックを事前にありがとう!

3
なぜファーストクラスのコレクションを使用する必要があるのですか?
The ThoughtWorks AnthologyのJeff Bay (RTF)によるObject Calisthenicsの規則4に従って、「ファーストクラスのコレクションを使用する」ことをお勧めします。 ルール4:ファーストクラスコレクション このルールの適用は簡単です。コレクションを含むクラスには、他のメンバー変数を含めないでください。各コレクションは独自のクラスにラップされるため、コレクションに関連する動作にはホームがあります。フィルタがこの新しいクラスの一部になることがあります。また、新しいクラスは、2つのグループを結合したり、グループの各要素にルールを適用するなどのアクティビティを処理できます。 これから理解できるのは、コレクションをラップアップする別のクラスを使用し、そのコレクションのデータを追加、削除、変更するメソッドを使用する必要があるということです。 そして、どのデータ型がコレクションに入れられ、何が出てくるかを確認するためにこれが必要です。 (適用可能な言語で)ジェネリックコレクションを使用する場合、この規則に従う必要がありますか? 重要な意味が欠けている場合は、明確にしてください。

5
クエリのために何千万ものオブジェクトを格納するための効率的な方法で、1秒あたりの挿入数が多いですか?
これは基本的に、p2pチャットネットワークでパケットの数をカウントし、パケットのタイプなどをカウントしているロギング/カウントアプリケーションです。これは、5分間で約400〜600万パケットに相当します。また、この情報の「スナップショット」のみを取得するため、5分ごとに5分以上経過したパケットのみを削除しています。したがって、このコレクションに含まれるアイテムの最大数は1,000万から1200万です。 異なるスーパーピアに300接続する必要があるため、各パケットが少なくとも300回挿入されようとしている可能性があります(おそらく、このデータをメモリに保持することが唯一の妥当なオプションである理由です)。 現在、私はこの情報を保存するために辞書を使用しています。しかし、大量のアイテムを保存しようとしているため、大きなオブジェクトヒープで問題が発生し、メモリの使用量は時間とともに継続的に増加します。 Dictionary<ulong, Packet> public class Packet { public ushort RequesterPort; public bool IsSearch; public string SearchText; public bool Flagged; public byte PacketType; public DateTime TimeStamp; } mysqlを使用しようとしましたが、挿入する必要があるデータ量に対応できませんでした(重複していないことを確認しながら)。それはトランザクションの使用中です。 私はmongodbを試しましたが、そのためのCPU使用は非常識で、どちらも保持しませんでした。 5分以上経過したすべてのパケットを削除し、このデータの「スナップショット」を取得するため、私の主な問題は5分ごとに発生します。LINQクエリを使用して、特定のパケットタイプを含むパケットの数をカウントしているため。また、データのdistinct()クエリを呼び出しています。ここでは、keyvaluepairのキーから4バイト(IPアドレス)を取り除き、keyvalupairのValueのrequestingport値と組み合わせて、それを使用して、すべてのパケットからのピア。 アプリケーションは現在、約1.1GBのメモリ使用量を保持しており、スナップショットが呼び出されると、使用量を2倍にまで増やすことができます。 これで、異常な量のRAMがあれば問題になりませんが、現在実行しているvmは2GBのRAMに制限されています。 簡単な解決策はありますか?

8
解釈されたプログラミング言語に対するシェルスクリプトの利点は何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 (ここで適切な質問かどうかわかりません) で記述されているようなシェルスクリプトは、bash多くのことを実行できます。Unixプログラムを呼び出したり、出力をパイプしたり、ファイルとの間でI / Oをリダイレクトしたり、フローを制御したり、ファイルが存在するかどうかを確認したりできます。 しかし、最新のプログラミング言語、例えば、pythonおよびはruby、これらのこともできます。そして、それらは(私が思うに)より読みやすく、保守しやすいです。 bash広く採用されています。しかし、多くのディストリビューションにもpythonインタープリターがインストールされています。 それでは、スクリプトのシェルの利点は何ですか?私が書くことができるならpython、rubyそれともperl学ぶ価値がありますbashか?

7
アセンブリーよりもCを使用することの利点/欠点は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 現在、電気通信および電子工学の工学を勉強しており、マイクロプロセッサプログラミングでアセンブラからCに移行しました。これが良い考えだとは思わない。アセンブリと比較したCの長所と短所は何ですか? 私が見る利点/欠点は次のとおりです。 利点: C構文は、アセンブラー構文よりもはるかに簡単に学ぶことができます。 Cはより複雑なプログラムを作成するのに使いやすいです。 Cを学習することは、アセンブラーを学習することよりも生産性が高いため、アセンブラーよりもCの周辺に開発物が多くあります。 短所: アセンブラはCよりも低レベルのプログラミング言語であるため、ハードウェアへの直接プログラミングに適しています。 メモリ、割り込み、マイクロレジスタなどを操作することを示唆しているはるかに柔軟です。
15 c  low-level  assembly 

2
プログラムの実行中にJavaコードをデバッグ/変更する方法は?
ノッチ(Minecraftの名声)が実行中にMinecraftをデバッグおよび変更する様子を示すビデオを見ました。彼はゲームを一時停止し、コード内の何かを変更してから、プログラムの再起動を必要とせずに変更が即座に有効になるゲームの一時停止を解除します。 これはどのように作動しますか?これを達成するためにどのような手法が使用されていますか?
15 java  debugging 

6
「コード改善」の優先度と重大度を判断する方法は?
バグ追跡システムには「優先度」フィールドと「重大度」フィールドがあります。重大度は「ユーザーへの影響」、優先度は「製品への影響」として定義します。 私の質問は、「コード改善」タスクを重大度と優先度に分類する方法についてです。改善によって動作が変更されることはなく、「より良いコード」になると仮定します。全体的な長期的なメンテナンスの改善が見込まれますが、定量化するのは困難です。 優先度と重大度の定義を使用すると、予測が困難な長期的な利点を図に導入しない限り、コードの改善により両方の値が最も低くなります。したがって、コードの改善は簡単な作業ではなく、決して試みるべきではないことを意味します。 ただし、コードを絶えず改善してリファクタリングすることは非常に重要だと思います。 ソフトウェア開発自体は継続的な学習プロセスであり、コードを改善しなければ、それを上達させることはできません。 チームはコードを誇りに思うべきです。 今後のメンテナンスにかかる時間は短くなり、長期的には大幅な節約になります。 または、そのようなタスクは決して作成されるべきではなく、そのような改善は「オンデマンド」でのみ、「バグに関連する場合」に実行されると思いますか?それがバグに関連しているとしても、それがコードレビューの議論ポイントではないでしょうか?例えば、「なぜあなたはこの構造の劇的な変更をしたのですか?」


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