ソフトウェア工学

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

11
レガシーコードを引き渡すためのベストプラクティス
数か月後に同僚が新しいプロジェクトに移り、私は彼のプロジェクトの1つを引き継ぎます。準備するために、私はすでにMichael FeathersのLegacy Codeでの効果的な作業を注文しました。 しかし、この本は、私がこれまで見つけたレガシーコードに関するほとんどの質問と同様に、コードをそのまま継承する場合に関係しています。しかし、この場合、私は実際に元の開発者にアクセスでき、秩序あるハンドオーバーのための時間があります。 私が継承するコードの一部の背景: 機能している:既知のバグはありませんが、パフォーマンス要件が上昇し続けるにつれて、それほど遠くない将来にいくつかの最適化が必要になります。 文書化されていない:メソッドおよびクラスレベルでの文書化はほとんどありません。しかし、私は長年そのAPIに対して(ブラックボックスとして)書いてきたので、コードがより高いレベルで行うことになっていることはよく理解されています。 上位レベルの統合テストのみ: APIを介した他のコンポーネントとの適切な相互作用をテストする統合テストのみがあります(再び、ブラックボックス)。 非常に低レベルで速度が最適化:このコードはアプリケーションシステム全体の中心であるため、その多くは長年にわたって数回最適化され、非常に低レベルです(一部には特定の構造体用の独自のメモリマネージャーがあります) /記録)。 コンカレントおよびロックフリー:コンカレントおよびロックフリープログラミングに非常に精通しており、実際にこのコードにいくつかの部分を提供しましたが、これにより複雑さがさらに増します。 大規模なコードベース:この特定のプロジェクトは1万行を超えるコードであるため、すべてを説明する方法はありません。 Delphiで書かれています。この問題を言語に依存しないと信じているので、私はこれをそこに置くつもりです。 彼の出発までの時間をどのように費やすのが最適か疑問に思いました。ここにいくつかのアイデアがあります: マシン上ですべてをビルドする:すべてをソースコード管理にチェックインする必要がありますが、たまにファイルをチェックインすることを忘れていないので、これがビジネスの最初の順序になるはずです。 より多くのテスト:変更を行うときに導入したバグを早期にキャッチできるように、より多くのクラスレベルの単体テストが必要ですが、現在のコードはテストできません(巨大なクラス、長いメソッド、多すぎる相互依存関係)。 何を文書化するか:まず最初に、低レベル/高度に最適化された性質などのために理解するのが難しいコードの領域に文書を集中するのが最善だと思います。見苦しくてリファクタリング/リライトが必要なものがいくつかあるのではないかと心配していますが、実際には私が見逃すかもしれない正当な理由でそこにあった最適化です(Joel Spolsky、Things You Should絶対にしない、パートI) 文書化の方法:いくつかの散文を伴うアーキテクチャのクラス図と重要な機能のシーケンス図が最適だと思います。 誰が文書化するのか:私は彼に文書を書いてもらうか、彼にそれを私に説明してもらうために、何が良いだろうと思っていたので、文書を書くことができます。私は、彼には明らかであるが私ではないものが適切にカバーされないことを恐れています。 ペアプログラミングを使用したリファクタリング:これは時間の制約のために実行できない場合がありますが、多分私は彼のコードの一部をリファクタリングして、物事がそうである理由についての入力を提供するために彼がまだいている間にそれをより保守可能にすることができます。 これにコメントして追加してください。このすべてを実行するのに十分な時間がないため、特に優先順位を付ける方法に興味があります。 更新:引き渡しプロジェクトが終了したので、以下の回答で自分の経験を使ってこのリストを拡張しました。

9
アプリケーションロギングのパターンとアンチパターンにはどのようなものがありますか?[閉まっている]
最近、大規模なエンタープライズアプリケーションのフィールドの問題を調査する必要がありました。問題を見つけるために調べなければならなかったログに恐怖を覚えましたが、結局のところ、ログはバグの特定/隔離にはまったく役立ちませんでした。 注:すべてのバグがログで発見できるわけではないことを理解しています。これにより、ログが恐ろしいという事実は変わりません。 ロギングには、修正を試みることができる明らかな問題がいくつかあります。ここにリストしたくありません。ログファイルを単純に表示することはできません。 代わりに、ロギングの面で私たちがどれだけ悪いかを評価するために、私は知りたい: アプリケーション(特に大規模アプリケーション)のロギングに関するガイドライン(ある場合)を教えてください。 従うべきパターンや注意すべきアンチパターンはありますか? これは修正する重要なことですか、それとも修正することもできますか、またはすべてのログファイルが単に巨大であり、それらを分析するために補足スクリプトが必要ですか? 補足:log4jを使用します。
66 logging 

12
非プログラマーに開発プロセスを理解させる
主にプログラミング会社ではない会社のためにプロジェクトを開始するとき、期待の1つは、すべてのバグのない完成した製品があり、必要なすべてをすぐに行うことです。ただし、そうなることはめったにありません。 期待を管理し、非プログラマーにソフトウェア開発が他のタイプの製品開発とどのように異なるかを説明するいくつかの方法は何ですか?

30
プロジェクトに注意する切迫した運命の警告サインは何ですか?[閉まっている]
失敗したプロジェクトに取り組んだことは、使用されている言語、業界、経験に関係なく、ほとんどのプログラマーに共通する数少ないものの1つです。 これらのプロジェクトは、素晴らしい学習体験、魂を砕く災害(またはその両方!)になる可能性があり、さまざまな理由で発生する可能性があります。 心の上部管理の変更 スキル不足/リソース不足のチーム 開発サイクル中に優れた競合他社が出現 オーバー/アンダーマネジメント そのようなプロジェクトをいくつか実行したら、プロジェクトが失敗する運命にある時期を早い段階で正確に認識できますか? 私にとって、大きな兆候は、機能クリープと組み合わされたハードで速い外部締め切りを持っていることです。計画がうまく練られていて、スケジュールどおりに進行しているプロジェクトが、後期の機能要求がロールインし、最終的な「成果物」に追加されると、恐ろしくレールから外れます。これらのリクエストの提案者は、「もう1つだけ」を求めずに部屋を出ることがめったにないため、コロンボのニックネームを獲得しました。 あなたの頭の中に差し迫った破滅の警告音を鳴らすためにあなたが警戒する警告サインは何ですか?

25
率直に言って、カウボーイコーディングが好きですか?[閉まっている]
アジャイル、ウォーターフォール、RUPなど、政治的に正しい方法論を擁護するほとんどのプログラマー。それらの一部は方法論に従いますが、すべてではありません。率直に言って、方法論を選択できれば、確かに主流の「正しい」方法論に行くのでしょうか、それともカウボーイプログラミングのような「より簡単な」方法論を好むでしょうか。どうして? 私はそれが依存することを知っています。いつ使用するか説明してください。カウボーイコーディングにはどのような利点がありますか。 ウィキペディアでカウボーイコーディングについて参照してください

3
BIOSプログラムの作成に使用されるプログラミング言語はどれですか?
私が理解しているように、ROMに保持されているBIOSコード/ビットストリームは汎用である必要があります(複数のCPUタイプまたはISAと一緒に動作します)。さらに、Webで、コードをダンプ(および「逆アセンブル」)できることが言及されています。 それで、どの言語、命令セットまたはマシンコードで書かれていますか?操作を実行するのに、どんな種類のプロセッサーも必要ではありませんか?もしそうなら、私はそれが外部CPUを使用すると思いますが、それは採用されたものの特定の命令セットをどのように知っていますか? 多分それは内部プロセッサを持っていますか?
65 cpu  bios 

6
データベース構成に関しては、Latin-1をUTF-8で使用する必要がありますか?
私が働いている会社でMySQLを使用しており、Ruby on Railsを使用してクライアント向けアプリケーションと内部アプリケーションの両方を構築しています。 ここで働き始めたとき、私は今まで遭遇したことのない問題に遭遇しました。実稼働サーバー上のデータベースはLatin-1に設定されます。これは、ユーザーがUTF-8文字をコピーして貼り付けるユーザー入力があるたびに、MySQL gemが例外をスローすることを意味します。 私の上司は、これらのほとんどが印刷できない文字であるため、これらの「悪い文字」と呼び、それらを取り除く必要があると言います。これを行う方法はいくつかありますが、最終的にはUTF-8文字が必要な状況に陥りました。さらに、特にこの問題について読んだ唯一の解決策はデータベースをUTF-8に設定することであるように思えるので、少し面倒です(私にとって理にかなっています)。 Latin-1に固執することについて聞いた唯一の議論は、印刷できないUTF-8文字を許可すると、MySQLでテキスト/フルテキスト検索が台無しになる可能性があるということです。これは本当ですか? UTF-8ではなくLatin-1を使用する他の理由はありますか?それが優れており、よりユビキタスになることは私の理解です。

7
1 <10の比較は1 <1000000よりも安価ですか?
z-indexCSSのaのカウントとして〜10億を使用し、比較を検討する必要がありました。非常に大きな数値と非常に小さな数値との比較で、ALUレベルでパフォーマンスに違いはありますか? たとえば、これら2つのスニペットのうちの1つは他のスニペットよりも高価ですか? snippet 1 for (int i = 0; i &lt; 10000000; i++){ if (i &lt; 10000000000000) { //do nothing } } snippet 2 for (int i = 0; i &lt; 10000000; i++){ if (i &lt; 1000) { //do nothing } }
65 performance  cpu 

8
オープンソースプロジェクトに参加する難しいプログラマーに対処するにはどうすればよいですか?
特定のサイト用のオープンソーススクリプトがあります(ここでは名前を付けないようにしています)。私と他の少数の開発者が最近GitHubに移動しました。特に非常にアクティブなシステムを含め、新しいシステムに移行して以来、いくつかの新しい開発者を獲得しています。しかし、このアクティブなものはプロジェクトの多くを変え始めました。 まず最初に、彼はバージョン管理システムを削除し(Gitのようではなく、そのように-バージョンと呼びますv4.1.16)、準備ができたと思われるときにコードを単にサイトにプッシュする方が良いと言いました。今では、リリースノートを置く一元化された場所はありません。 荷物をまとめて行く準備ができたのは、プッシュスクリプトでした。プロジェクトの別の開発者は、単純なPythonベースのプッシュスクリプトを作成しました。さまざまな場所で複数のバージョンのスクリプトをオンラインで保持しているため、Pythonスクリプトに代わるグラフィカルインターフェイスを備えたより大きなJavaプログラムのコーディングを開始しました。私はIRCに行ってそれをみんなに通知し、古いPythonベースのスクリプトが私のできることをすべて行うことができ、はるかに軽量であると言って非常に迷惑な応答を得ました(彼はまた彼が考えた事実についてコメントしましたPythonはJavaなどよりも優れていました)。古いプッシュスクリプトのコードを調べたところ、彼が言った機能がどれも存在しないことがわかりました。 だから今、私は何をすべきかを知りたいです。私はこのプロジェクトに多くの時間を費やしてきたので、ただ立ち上がって去りたくありませんが、この新しい開発者と仕事をするのは難しいと感じています。反対に、彼は現在、プロジェクトのトップコミッターであり、主任開発者よりも多くのコミットを行っています。私はこれについてどうすればいいのかよく分かりません。他の誰かがこの問題を経験しましたか?もしそうなら、あなたは何をしましたか? 更新1:全員のコミットアクセスを無効にし、プルリクエストを通過するように要求しています。他の問題を解決するためのいくつかの手段も提案しました。他の人は誰もそれをサポートしていません。面倒な開発者は、「コミットアクション」に従わない人は、プロジェクトが実際にはそうでない場合でも混乱していると考えることができると単純に言っています。私は明らかにこれに同意しないので、プロジェクトから辞任することを真剣に考えています。 更新2:リード開発者は、私のコミットの1つがコード内の3つの改行を削除したという事実について暴言を始めました(リバートコミットはディスカッションを投稿した直後に表示され、「コミット」も参照しません)。 2人は私のコミットアクセスを取り消すかどうかの議論を始めました。だから、私は論理的なことをして、プロジェクトを去った。皆さんのご協力に感謝します!
65 open-source  team 

13
すべての間接参照されたポインタをヌルガードするのは合理的ですか?
新しい仕事で、次のようなコードのコードレビューでフラグを立てられました。 PowerManager::PowerManager(IMsgSender* msgSender) : msgSender_(msgSender) { } void PowerManager::SignalShutdown() { msgSender_-&gt;sendMsg("shutdown()"); } 最後のメソッドは次のように読むべきだと言われています: void PowerManager::SignalShutdown() { if (msgSender_) { msgSender_-&gt;sendMsg("shutdown()"); } } つまり、変数がプライベートデータメンバーであっても、変数をガードする必要があります。この「知恵」についてどのように感じているかを説明するためにexp辞を使うのを抑えるのは難しいです。説明を求めると、ある年のジュニアプログラマーがクラスがどのように機能するかについて混乱し、必要のないメンバーを誤って削除した(そしてその後に設定する)ことについてのホラーストーリーを大量に受け取ります、どうやら)、そして製品リリース直後に現場で物事が爆発しました。すべてをチェックする方が良いという「難しい方法を学び、信頼してください」。NULLmsgSender_NULLNULL 私にとって、これは貨物カルトのプログラミングのように感じます。いくつかの善意の同僚は、私が「それを得る」のを助け、これが私がより堅牢なコードを書くのにどのように役立つかを真剣に助けようとしていますが、...私は彼らがそれを手に入れていないように感じるのを助けることができません。 コーディング標準では、関数内で間接参照されているすべてのポインターをNULL最初にチェックすることを要求するのは妥当ですか?プライベートデータメンバーであっても?(注:コンテキストを提供するために、航空交通管制システムやその他の「障害と同等の人々が死ぬ」製品ではなく、家電製品を製造しています。) 編集:上記の例では、msgSender_共同編集者はオプションではありません。これまでNULLに発生した場合は、バグを示しています。コンストラクターに渡される唯一の理由はPowerManager、モックIMsgSenderサブクラスでテストできることです。 要約:この質問には本当に素晴らしい回答がいくつかありました。みなさんありがとう。私は主にその簡潔さのために@aaronpsからのものを受け入れました。以下のかなり一般的な合意があるようです。 すべての間接参照されたポインタにNULLガードを強制するのはやり過ぎですが、 代わりに参照(可能な場合)またはconstポインターを使用して、議論全体を回避できます。 assertステートメントは、NULL関数の前提条件が満たされていることを検証するための、ガードに対するより賢明な代替手段です。

8
インターンシップをどうやって救うことができますか?[閉まっている]
私は現在、非常に大きな非ソフトウェア開発会社でインターンとして働いています。私が応募した職種は、特に開発職ではありませんでしたが、私を雇ったチームは、CS専攻が彼らのためにいくつかの内部プロジェクトを開発するのを手伝ってくれることを望んでいました。私はここに4週間滞在しましたが、最初の戸惑いは衰え始めています。ただし、私はオフィス全体で唯一のCS専攻です。チーム、ビル、または近隣の場所でさえ、ソフトウェア開発のバックグラウンドを持っていません。私が持っている最高のものはデータベースマネージャーで、彼らの部署は忙しくてプロジェクトをサポートできません。チームメイトは自分の仕事のやり方を学ぶのを手伝っています(これは仕事をする上で重要です)が、私の仕事、つまり開発を手伝ってくれる人は誰もいません。 彼らが私に与えたプロジェクトは、私が学校でやったことよりも範囲が広い。それは、私が単独で働いているという事実と相まって、ガイダンスや明確に定義された目標さえも持たずにゼロからアプリケーションを開発しようとすることで、成功する能力について非常に心配しています。どこから始めればいいのかほとんどわかりませんが、今はおそらく2か月未満しか残っていません。 私はソフトウェア開発プロセスを学ぶべきだと感じていますが、今は暗闇の中を自分の道を感じているようです。そもそも自分の開発スキルにあまり自信がないので、これは特に厄介です。私は自分自身を研究し、教えてきましたが、ほんの少ししか得られません。彼らは私から大きな期待を持っていますが、私は自分の能力を確信できません。明らかに、私は座って自分の立場について上司と話をする必要があり、できるだけ早くそれをするつもりです(彼らはしばしば出張して外出しています)。 これにどう対処すればよいですか?このインターンシップは、私がそれを知る前に終わります。彼らもそれを望んでおらず、いつでも私を助けてくれますが、プログラミングの知識がなければ、できることは限られています。私は彼らが望むものを作り出すことができないことを彼らに伝えることを恐れています。これをどのように彼らに関連付ける必要がありますか?エンジニアのインターンが他のエンジニアから助けを得て、彼らの仕事をする方法を学んでいるのを見ます。私の状況を修正する方法についてのアドバイスは大歓迎です。 更新 皆さんからのすべての有益なフィードバックに感謝します。それは私の心を楽にしてくれました。私が最初にしたことは、マネージャーやスーパーバイザーと会うことでした。ここで私の時間から期待されることについて話し合いました。彼らは私がインターンとしてそれほど多くの時間がないことを理解しており、これは私たちが達成したいフレームワークの種類に範囲を置くのに役立ちました。また、自分の能力に関する懸念についても、割り当てられた時間で対処しました。 私は別の場所のデータベース管理者から電話を受けました-私のマネージャーは彼のスーパーバイザーと話しました、そして彼らは私のプロジェクトをサポートするつもりです。やってる それは半分だけです。考えられるすべてのプロジェクトの中から、最も重要な2つのプロジェクトに絞り込みました。私の他のプロジェクトについては、誰かが言ったように、私は本質的にインターンにとってユニークな状況であるリードソフトウェアアーキテクトです。物事が少なくとも半ば成功すれば、将来の雇用主に役立つ多くの知識と経験を得たと思います。今のところ、私は自分のプロジェクトの研究と開発を始めるための確かな基盤があると思います。皆様からの返信をありがとうございます!

14
動的に型付けされた言語の単一の関数から異なるデータ型を返すのは悪い考えですか?
私の第一言語は静的に型付けされています(Java)。Javaでは、すべてのメソッドから単一の型を返す必要があります。たとえば、条件付きでを返すメソッドStringや、条件付きでを返すメソッドを持つことはできませんInteger。しかし、たとえばJavaScriptでは、これは非常に可能です。 静的に型付けされた言語では、これが悪い考えである理由がわかります。すべてのメソッドが返された場合Object(すべてのクラスが継承する共通の親)、あなたとコンパイラはあなたが何を扱っているのか分かりません。実行時にすべての間違いを発見する必要があります。 しかし、動的に型付けされた言語では、コンパイラーさえ存在しない場合があります。動的に型付けされた言語では、複数の型を返す関数が悪い考えである理由は私には明らかではありません。静的言語の私のバックグラウンドにより、このような関数を書くことは避けられますが、コードを見えないようにすっきりさせることができる機能については気にされているのではないかと心配しています。 編集:私の例を削除します(より良い例を考えることができるまで)。私がやろうとしているのではない点に返信するように人々を誘導していると思います。

1
ダイクストラは、彼の論文「The Humble Programmer」で言及されているボランティアにどのような仕事をしましたか?
では、ダイクストラの論文「ハンブルプログラマー」、彼はいくつかのボランティアに解決する問題を与えたことに言及します。 「私は実際に経験豊富なボランティアでプログラミングの実験を少し行ったことがありますが、非常に意図せず、予想外のことが起こりました。私のボランティアの誰も、明白で最もエレガントな解決策を見つけませんでした。綿密な分析の結果、これは共通のソースを持っていることが判明しました。繰り返しの概念は、関連する制御変数をステップアップするという考えに密接に関連しているため、明らかなものを見ることは精神的にブロックされました。彼らのソリューションは効率が悪く、理解するのがむずかしく、それらを見つけるのに非常に長い時間がかかりました。」 ダイクストラがボランティアに与えた問題は何でしたか?解決策は何でしたか?

5
なぜGitやDebianのようないくつかの大きなプロジェクトでは、メーリングリストのみを使用し、問題トラッカーを使用しないのですか?
まともなサイズのプロジェクトのバグトラッカーは、私にとっては簡単なことのように思えます。問題が衝突したり混同したりすることなく、数百または数千の問題を非常に簡単に整理できます。 そのため、Gitのように、メンテナンスと開発を調整する主な方法としてメーリングリストを使用するいくつかの非常に大きなプロジェクトを見ると、少し圧倒されます。例: Git-コミュニティページ: ...バグレポートはこのメーリングリストに送信する必要があります。 WikipediaごとのDebianバグ追跡システム: ...そのユニークな機能は、バグレポートを編集するためのウェブインターフェースの形式がないことです-すべての変更は電子メールを通して行われます。 最新のバグトラッカーの多くは、電子メール(見ているバグや自分に割り当てられているバグに関するコメントや通知を受け取ることができます)やバージョン管理システム(問題を解決するなどのマークを付けることができます)と非常によく統合されています。)。この多くは、メーリングリストを使用して手動で行う必要があり、興味のないバグに関する大量の電子メールを受け取ることになります。 それでは、Webベースのバグトラッカーに対するメーリングリストの主な利点は何ですか?一部の大きなプロジェクトでメーリングリストのみが使用されるのはなぜですか?

8
独自のデータベースシステムを作成する[終了]
データベースをより効率的に使用するためには、データベースがどのように機能するかを学ぶ必要があり、私の学習方法はそうすることです。 独自のデータベースシステムを作成したい。私はクエリを使用してファイルを解析する擬似データベースを作成することには言及していません。これは、単にクエリ言語を備えたファイルシステムインターフェイスです。データベースエンジンの実際の構造について話しています。そして、私が念頭に置いているのはリレーショナルでも文書指向でもないので(それが存在する場合は「ノード指向」です)、可能な限り抽象的で高レベルのリソースが必要です。 それでは、どのように作成しますか?どのリソース/チュートリアル/本を読んで理解できますか? 言語は少しでも重要ではありません。理想的には、コードは特定の言語に結び付けられるのではなく、概念を説明するための擬似コードになりますが、何でもかまいません。私はグーグルで問題について何も見つけることができませんでした(私はこのテーマについて非常に文盲であるため、正しい検索を入力していないだけかもしれません)。 そのようなリソースが利用できない場合、クライアントを作成する方法について何かが少なくとも正しい方向への一歩になると思います。

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