ソフトウェア工学

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

4
開発チームを構成する方法
私は、会社のWebサイト/ Webアプリケーションの世話をする11人のソフトウェア開発者のチームのマネージャーであり、最大4つの同時プロジェクトに加えて、毎日のサポートをいつでも実行しています。11人の開発者には、技術的なスキル、役職、経験が混在していますが、チーム構造はフラットで、11人の開発者全員が私に直接報告しています。 単一のマネージャーを持つチーム全体が、あまりうまくスケールしないことが証明され始めています。私はあまりにも薄く広がり始めているので、直接報告の数を減らしたいです。これを行うために私が考えることができるすべての方法には、重大な欠点があります: ジュニア開発者にシニア開発者に報告してもらいます。これにより、最高の技術者が開発に費やす時間を削減できます。 チームをソフトウェア製品で分割します。たとえば、開発者1〜6はイントラネットで作業し、7〜11は外部サイトで作業します。各セクションには新しいチームリーダーがいます。 )。これにより、人工的なサイロが追加され、「イントラネット開発者」が外部のWebサイトで作業するのが困難になる場合があります。 構造を平らに保ち、プロジェクトマネージャー/チーム管理者の形をした管理サポートを追加して、プレッシャーを取り除きます。チームはこのように永遠に成長することができないため、これは問題を解決しません。 この問題を解決する標準的な方法はありますか? そうでない場合、他の人はこの問題をどのように解決しましたか?
22 management  team 

3
クラスまたはモジュールはいつ独立したアセンブリ/ DLLに配置する必要がありますか?
クラスを独自のアセンブリ/ DLLに含めるタイミングを決定するためのガイドラインはありますか?私はしばしば二つの考え方を目にします: 1)クラスのすべての「グループ化」は、リポジトリ、サービス、DTO、インフラストラクチャなどの独自のDLLに属します。 2)すべてが単一のDLLにある必要がありますが、名前空間/フォルダーを介して分離する必要があります。たとえば、Core.Repositories、Core.Services、Core.DTOなどの追加の名前空間を持つ「Core」DLLが必要です。 仕事では、すべてを「ビジネス」と呼ばれる単一のアセンブリにまとめます。いくつかのフォルダーがありますが、本当の分離はありません。ビジネスオブジェクト(ロジックを含む、その一部はクラスであってはならない)は、「BusinessObjects」フォルダーに注意せずにまとめられます。複数のクラスで使用されるものは、「コア」フォルダーにあります。ユーティリティは「ユーティリティ」フォルダにあり、データアクセスインフラストラクチャは「データ」フォルダです。 私が取り組んでいる新しいモジュールの場合、個別のデータアクセスレイヤーが必要です(基本的なリポジトリ実装を考えてください)が、他の160(!)そこのクラス。同時に、誰もが単一のライブラリにクラスを詰め込むことに慣れているため、新しいクラスライブラリの作成について心配しています。ただし、フォルダ/ネームスペースは機能します。

4
クラスメソッドの数の制限は何ですか?
私が読んださまざまなデザインの本では、クラスに必要なメソッドの数に重点が置かれることがあります(たとえば、JavaまたはC#などのオブジェクト指向言語を考慮)。多くの場合、これらの本で報告されている例は非常に簡潔でシンプルですが、「深刻な」または複雑なケースをカバーすることはめったにありません。 ただし、範囲は5〜8のようです。 プロジェクトでは、属性としてTitle、Desctiption、CreateDateなどの属性を持つクラス「Note」を開発しました。次に、getRelations(メモが別のドキュメントに割り当てられている場合)、getExpiryDate、ect などの基本的なメソッドを作成しました。 ただし、アプリケーションの開発を進めるには、より多くの機能が必要であったため、より多くのメソッドが必要でした。 クラスのメソッドが少ないほど、疎結合になります。これは、モジュール性と再利用性の面で確かに優れた利点であり、さらに編集が容易です。 ちなみに、コンテキストでサブクラスを作成する必要がない場合(または感覚さえある場合)、必要なすべての関数がそのクラスに関連している場合、さらにいくつのメソッドを追加できますか? 15を超えるメソッドを使用する場合は、少し再設計が必要になる可能性があることに同意します。しかし、その場合でも、メソッドまたは継承の一部を削除することがオプションではない場合、適切な方法はどれですか?

4
自動テストを使用してレガシーコードを改良するためのベストプラクティス
比較的大きくて古いコードベースで、既に定義されているインターフェイス(C ++ヘッダーファイルのセット)を再実装するタスクを引き受けようとしています。これを行う前に、可能な限り完全なテストカバレッジを取得したいので、再実装エラーをできるだけ早く簡単に検出できます。問題は、既存のコードベースが、(非常に)大規模なクラスと関数、高度な結合、(多くの)副作用を伴う関数などで簡単にテストできるように設計されていないことです。 同様のタスクの以前の経験や、自動化されたテスト(ユニット、統合、回帰など)をレガシーコードにどのように改良したかについての良い具体的なヒントを聞いていただければ幸いです。
22 testing  legacy 

1
オープンソースプロジェクトからコードを分岐/再利用する正しい方法は何ですか?
私がオープンソースプロジェクトに取り組んでいて、別のオープンソースプロジェクトからささいなユーティリティ機能(ファイル検索/置換機能など)を再利用したいとします。関数をコピーして、ファイルの先頭に小さな著作権表示を書くだけで合法ですか?ライセンスにプロジェクト全体の著作権所有者として名前を含めるべきですか? 同様に、オープンソースプロジェクトをフォークしたとしましょう。著作権が元の著作権所有者と私自身の間で共有されることをどこでどのように指定しますか? 答えはオープンソースライセンスに応じて多少異なる必要があると思いますが、できるだけ一般的な答えが欲しいです。 PS:私は主に法的側面について心配していますが、あなたの倫理的な観点を自由に含めてください。

16
なぜ多くの機関でJavaが共通語なのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 編集:この質問は、最初はJavaをバッシングしているように見えますが、この時点では少し推測されます。しかし、私がやろうとしているより大きなポイントは、すべての問題に対するすべての解決策として単一の言語が選択される理由です。Javaはたまたま使用されているものなので、ここで勝つ必要がありましたが、Javaを意図的に新しいものに引き裂いているわけではありません:) 私はほとんどのアカデミックな環境でJavaが好きではありません。言語自体が悪いと言っているわけではありません。いくつかの非常に望ましい側面があり、最も重要なことは、ほとんどのプラットフォームで再コンパイルせずに実行できることです。Your Next App ^ TMの言語の使用に問題はありません。(私が個人的にすることではありませんが、それはデザインが貧弱であるというよりも、経験が少ないためです) Javaを言語として使用して高レベルのCSコースを教えるのは無駄だと思います。私の同級生の多くは、ゴミ収集されていない世界で働く方法を知らないので、気にする価値のあるプログラムを作成できません。彼らはプログラミングの対象となるマシンを基本的に理解していません。誰かがガベージコレクトされた世界の外で働くことができるとき、彼らはその内部で働くことができますが、その逆はできません。GCは松葉杖ではなくツールです。しかし、コンピュータサイエンスの学生に教えるために使用される方法は、松葉杖のようなものです。 コンピューターサイエンスは、単一の言語に合わせた一連のコース全体を教えるべきではありません。学生は、すべての優れたデザインは慣用的なJavaデザインであり、オブジェクト指向デザインは物事を成し遂げる唯一の方法であるという考えを持ち帰ります。卒業生に機械の理解を深めるために、少なくとも1つはガベージコレクション言語ではない他の言語を教育に使用する必要があります。 尊敬されている機関のCSのPHDを持つ人が、紙袋から抜け出す方法をプログラムできないのは恥ずかしいことです。 さらに悪いことに、実際に物事がどのように機能するかを理解しているCS教授と話をすると、彼らはこのような感情を共有し、Javaですべてを行うことによって生徒に害を与えているということです。(他の言語に置き換えた場合、上記は同じになることに注意してください。一般的に、Java自体ではなく単一の言語を使用することが問題です) 全体として、私はもはやどのような学位も尊重することはできないと感じています-私の周りの人々がフィズバズの問題から抜け出す方法をプログラムできるのを見ることができないとき。 なぜ/どのようにしてこのようになったのですか?

4
スタックの使用量は多すぎますか?
最近、CやC ++を書いているときに、Javaの場合とは異なり、それがオプションであるという理由だけで、すべての変数をスタック上で宣言します。 しかし、スタック上で大きなものを宣言するのは悪い考えだと聞いたことがあります。 なぜこれが当てはまるのですか?スタックオーバーフローが関係していると思いますが、なぜ発生するのかはあまりわかりません。 スタック上のものはどれくらい多すぎますか? スタックに100MBのファイルを配置しようとはしていません。文字列バッファーなどとして使用するために、数十キロバイトの配列を配置しようとしています。これはスタックの使用量が多すぎませんか? (重複する場合は申し訳ありませんが、スタックの検索はスタックオーバーフローへの参照を提供し続けます。呼び出しスタックタグさえありません。抽象タグを使用しました。)

11
アルゴリズムはコンピューターアーキテクチャに依存しますか?
アルゴリズムはコンピューターアーキテクチャに依存しないことをどこかで読みました(どの本かを忘れました)。アルゴリズム自体が計算であると言う人もいます(マシン?)? 一方、並列プログラミングに関する本には、並列アルゴリズムに関する章があります。並列アルゴリズムは並列アーキテクチャに依存しているように見えますか? 大きな写真が恋しいですか?ありがとう。

3
APIとフロントエンドバックエンドの区別
「標準」のビジネスWebサイトを作成しようとしています。「標準」とは、このサイトが通常のHTML5、CSS、およびフロントエンド、バックエンド(ものを処理するため)用のJavaScriptを実行し、データベース用にMySQLを実行することを意味します。これは基本的なCRUDサイトです。フロントエンドは、データベースに保存されているものを何でも作成します。バックエンドは、ユーザーが入力したものをデータベースに書き込み、処理を行います。ほとんどのサイトと同じように。 コーディングを開始するためにGithubリポジトリを作成する際、フロントエンドバックエンドとAPIの違いを理解していないことに気付きました。私の質問を言い換える別の方法は次のとおりです。APIはこの図のどこに来ますか? 私はいくつかの詳細と私が持っている質問をリストします-これがあなたに私の実際の質問が何であるかをよりよく理解してくれることを願っています。私は尋ねる特定の質問を知らないので混乱しています いくつかの詳細: Model-View-Controllerパターンを試してみたい。これにより質問/回答が変更されるかどうかはわかりません。 APIはRESTfulになります 私は私の希望私自身のAPIを使用するバックエンドをカンニングして、特別なクエリを呼び出すためにバックエンドを可能するのではなく。このスタイルはより一貫していると思います。 私の質問: フロントエンドは、APIを呼び出すバックエンドを呼び出しますか?または、フロントエンドはバックエンドを呼び出すのではなく、APIを呼び出すだけですか? バックエンドはAPIを実行するだけで、APIはバックエンド(バックエンドが究極のコントローラーとして機能し、タスクを委任する)に制御を返しますか? フロントエンドバックエンドとともにAPIの役割を説明する長く詳細な回答が推奨されます。答えがプログラミングのモデル(Model-View-Controllerパターン以外のモデル)に依存する場合、APIのこれらの他の考え方を説明してください。ありがとう。私はとても混乱しています。

3
要件の作成中にShallとMustを使用するためのベストプラクティス
この質問はして移行され、それがソフトウェア工学スタック所に答えることができるので、スタックオーバーフローから。 6年前に移行され ました。 先ほどメールを送信しましたが、派生要件で「Shall」という言葉を使用しても機能要件に続かないことを開発者に思い出させました。機能要件を記述するとき、「必須」という言葉を使用して、派生要件が行う必要のある機能を説明します。 派生=システムは要件である機能=システムは要求を行わなければならない それは私たちの先輩の一人によって送り返されましたが、それは間違っていて、すべての要件で使用されるべきです。 私はここで間違っていますか、すべての要件で使用する必要があります。それをバックアップするものを見つけることができませんでした。

1
リファクタリングはGitFlowブランチネーミングモデルのどこに属しますか?
私は最近、bitbucketで実装されたGitFlowモデルの使用を開始しました。そして、私には完全に明確ではないことが一つあります。 リファクタリングタスクをバックログ、計画、および実装することにより、技術的な負債に定期的に対処しようとしています。そのようなリファクタリングブランチは、でマージされたプルリクエストで終わりますdevelop。私の質問は、リファクタリングブランチはGitFlowのどこに属しますか? featureプレフィックスを使用することは最も論理的ですが、リファクタリングによって新しい機能が追加されることはないため、完全に正しいとは限りません。 しかしbugfix、実際のバグリファクタリングの修正がないため、プレフィックスの使用は適切ではないようです。 一方で、カスタムプレフィックスを作成することは、物事を過剰に設計しない限り複雑化するように思えます。 そのような状況はありましたか?これに対処するためにどのプラクティスを使用しますか?理由を説明してください。


2
元のインタープリターから独立した「ブートストラップされた」インタープリターを作成することは可能ですか?
ウィキペディアによると、コンパイラを記述するという文脈での「ブートストラップ」という用語はこれを意味します。 コンピューターサイエンスでは、ブートストラップは、コンパイルするソースプログラミング言語でコンパイラー(またはアセンブラー)を記述するプロセスです。この手法を適用すると、セルフホスティングコンパイラが実現します。 そして、それがどのように機能するかを理解できます。しかし、話は通訳者にとっては少し違うようです。もちろん、セルフホスティングのインタープリターを作成することもできます。それは私が求めていることではありません。私が実際に求めていることである:それは、元の、最初のインタプリタの自己ホスト型インタプリタから独立させることが可能です。私の言いたいことを説明するために、この例を考えてみましょう。 最初のインタープリターバージョンを言語Xで記述し、インタープリターはYと呼ばれる作成中の新しい言語用です。最初に言語Xのコンパイラを使用して実行可能ファイルを作成します。これで、言語Xで作成されたインタープリターを使用して、新しい言語Yで作成されたファイルを解釈できます。 私が理解している限りでは、言語Xで作成したインタープリターを「ブートストラップ」できるようにするには、言語Yでインタープリターを書き換える必要があります。ただし、ここで問題があります。言語Yでインタープリター全体を書き換えたとしても、言語Xで作成した元のインタープリターが必要になります。インタープリターを言語Yで実行するには、ソースファイルを解釈する必要があります。しかし、ソースファイルを正確に解釈するにはどうすればよいでしょうか?もちろん、何もありえないので、最初のインタープリターを使用する必要があります。 言語Yで作成する新しいインタープリターの数に関係なく、Xで記述された最初のインタープリターを使用して後続のインタープリターを常に解釈する必要があります。これは単に通訳者の性質のために問題のようです。 ただし、逆に、通訳に関するこのウィキペディアの記事では、実際に自己ホスト型通訳について説明しています。関連する小さな抜粋を次に示します。 自己通訳とは、自身を解釈できるプログラミング言語で書かれたプログラミング言語インタープリターです。例は、BASICで書かれたBASICインタプリタです。セルフインタープリターは、セルフホスティングコンパイラに関連しています。 解釈対象の言語用のコンパイラーが存在しない場合、セルフインタープリターを作成するには、ホスト言語(別のプログラミング言語またはアセンブラー)で言語を実装する必要があります。このような最初のインタープリターを持つことにより、システムはブートストラップされ、言語自体でインタープリターの新しいバージョンを開発できます しかし、これがどのように行われるかは、まだはっきりしていません。何であれ、ホスト言語で書かれたインタープリターの最初のバージョンを常に使用せざるを得ないようです。 さて、上記の記事は、ウィキペディアがセルフホスティングインタプリタと思われるいくつかの例を提供している別の記事にリンクしています。しかし、よく調べてみると、これらのセルフホスティングインタープリターの多くの主な「解釈」部分(特にPyPyやRubiniusなどのより一般的なもの)は、実際にはC ++やCなどの他の言語で書かれているようです。 それで、私が上で説明したことは可能ですか?自己ホスト型インタープリターは元のホストから独立できますか?もしそうなら、これはどのように正確に行われますか?

3
C#でこの見かけの自己参照の目的は何ですか?
私のプロジェクトの1つで使用するためのPiranha(http://piranhacms.org/)と呼ばれるオープンソースCMSを評価しています。少なくとも私にとっては、次のコードが興味深く、少し混乱していることがわかりました。クラスが同じ型のベースから継承している理由を理解するのに役立つことがありますか? public abstract class BasePage<T> : Page<T> where T : BasePage<T> { /// <summary> /// Gets/sets the page heading. /// </summary> [Region(SortOrder = 0)] public Regions.PageHeading Heading { get; set; } } クラスBasePage<T>が定義されている場合、なぜ継承するのPage<T> where T: BasePage<T>ですか?どのような特定の目的に役立ちますか?
21 c#  architecture  .net  cms 

6
コードをコメントアウトしてから、徐々に削除して、すでに行ったことと今後行うことを追跡するのはなぜ間違っているのですか?
コードの大部分を変更する必要があることがわかったときは、それが間違っているか、他の理由で必要となる主要なアーキテクチャの変更に適応する必要があるため、これは私が通常行うことです: 変更が必要と思われるすべてのコードをコメント化します。コメントアウトされたコードは、TODOリストの一種として扱います。 コメントアウトされたコードを徐々に確認し、このコードの一部のコメントを外すか、必要に応じてコピーアンドペーストして必要に応じて編集するか、このコードの一部を最初から書き直して、コメントアウトされたコードを参照します。コメントアウトされたコードの一部が完了したと思うたびに、それを削除します。 コードがコメントアウトされなくなるまでこれを続けます。 私は主に、私が単独で開発している個人プロジェクトでこれを行っていることに注意する必要があります。 しかし、私はこれをやめるべきだと言われました。代わりに、コメントアウトされたコードを残すのではなく、古いコードを見るために古いコミットを参照してgitを使い始めるべきだと言われました。私が言われた: コードをコメントアウトするのは悪い習慣であり、一掃する必要があります。経験がないため、それを理解できません。数年後に、コードをコメントアウトするのが好きな別の人のコードを見つけた場合、自分でこの人を非難するでしょう。コメントアウトされたコードを見るたびに、私はそれを見ずにその全体を削除します。通常、そのようなコードは完全に価値がないからです。小規模な個人プロジェクトでは、コードをコメントアウトすることのマイナス面を確実に見落とすでしょう。しかし、あなたが仕事を見つけて、この習慣をそこに保つならば、それは残念です。 私が今見逃していることの、私がやっていることのこれらの欠点は何ですか? 私は、過去のコードを見るためにgitを使用することだけに熱心ではないと言わなければなりません。私が言ったように、私はコードをコメントアウトすることを一種のtodoリストとして扱います。gitは、コードが以前どのように表示されていたかを示しますが、コードのどの部分がまだレビューが必要で、どの部分がすでに実行されているかを明確に示すことはできません。コードの一部を見逃し、バグを導入する恐れがあります。 完全を期すために、引用している人は経験豊富な開発者であり、ボブおじさんの「クリーンコード」のファンであると付け加えるべきだと思います。

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