ソフトウェア工学

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

13
外部動作を変更せずにリファクタリングをどこまでプッシュできますか?
Martin Fowlerによると、コードのリファクタリングは次のようになります(私の強調): リファクタリングは、既存のコード本体を再構築し、外部の動作を変更せずに内部構造を変更するための統制された手法です。その中心は、変換を維持する一連の小さな動作です。各変換(「リファクタリング」と呼ばれます)はほとんど行いませんが、一連の変換によって大幅な再構築が行われる可能性があります。それぞれのリファクタリングは小さいので、間違いが起こる可能性は低くなります。また、システムは小さなリファクタリングのたびに完全に機能し続けるため、再構築中にシステムが深刻に破損する可能性が低くなります。 この文脈における「外部行動」とは何ですか?たとえば、移動メソッドのリファクタリングを適用して、あるメソッドを他のクラスに移動すると、外部の動作が変更されたように見えますか? それで、私はどの時点で変更がリファクタリングでなくなり、さらに何かになるのかを知ることに興味があります。「リファクタリング」という用語は、大きな変更に誤用される可能性があります。別の言葉がありますか 更新。インターフェースに関する多くの興味深い回答がありますが、メソッドのリファクタリングを動かしてインターフェースを変更しませんか?


5
コードの所有権はコードの匂いですか?
これは、物議を醸すプログラミングの意見のスレッドでこの答えを読んで以来ずっと考えてきたことです。 あなたの仕事は、自分を失業させることです。 雇用主向けのソフトウェアを作成する場合、作成するソフトウェアは、開発者が理解し、最小限の労力で理解できるように作成する必要があります。適切に設計され、明確かつ一貫して記述され、きれいにフォーマットされ、必要な場所に文書化され、期待どおりに毎日ビルドされ、リポジトリにチェックインされ、適切にバージョン管理されます。 あなたがバスにぶつかったり、解雇されたり、解雇されたり、仕事を辞めたりした場合、あなたの雇用主はすぐにあなたに取って代わることができ、次の人があなたの役割に入り、あなたのコードを拾い上げて1週間以内に走ります。彼または彼女がそれを行うことができない場合、あなたは惨めに失敗しました。 興味深いことに、その目標を持っていることが雇用主にとってより価値のあるものであることがわかりました。使い捨てになるように努力すればするほど、彼らにとってより価値のあるものになります。 そして、これは他の質問、例えばこれで少し議論されましたが、私は再びそれを持ち出し、より多くの空白から「それはコードの匂いです!!」という観点から議論したかったのです。まだ深さ。 私は10年間プロの開発者です。私は、適切な新しい開発者が比較的迅速に理解できるようにコードが十分に書かれた仕事を1つ持っていますが、業界のほとんどの場合、非常に高いレベルの所有権(個人とチームの所有権の両方)が普通。ほとんどのコードベースには、新しい開発者がそれらを選択してすばやく作業できるようにするためのドキュメント、プロセス、および「オープン性」が欠けているようです。コードベースを非常によく知っている(「所有している」)誰かが知っている、書かれていない小さなトリックやハックが常にたくさんあるようです。 もちろん、これに関する明らかな問題は次のとおりです:人がやめるか、「バスにぶつかった」場合 または、チームレベルで、チームランチに出かけたときにチーム全体が食中毒になり、全員が死亡した場合はどうなりますか?チームを比較的簡単に新しいランダムな開発者の新しいセットに置き換えることができますか?-私の過去の仕事のいくつかでは、そのことがまったく想像できません。システムには非常に多くのトリックとハックがあり、「知っておく必要がある」だけなので、採用する新しいチームは収益性の高いビジネスサイクル(たとえば、新しい安定したリリース)よりもはるかに長くかかります。要するに、製品を放棄しなければならないとしても、私は驚かないでしょう。 明らかに、チーム全体を一度に失うことは非常にまれです。しかし、これにはもっと微妙で不吉なことがあると思います-これは、このスレッドでこれまで議論したのを見たことがないので、このスレッドを開始することを考えさせたポイントです。基本的に、コードの所有権に対する高いニーズは、技術的な負債の指標であることが非常に多いと思います。システムにプロセス、コミュニケーション、優れたデザイン、多くの小さなトリックやハッキングが欠けていて「知っておく必要がある」などの場合は、通常、システムが次第に深く技術的な負債に陥っていることを意味します。 ただし、コードの所有権は、プロジェクトや会社に対する一種の「忠誠心」として、またあなたの仕事に対する「責任を負う」肯定的な形として提示されることが多いため、完全に非難することは一般的ではありません。しかし同時に、方程式の技術的負債の側面は、コードベースが次第にオープンになり、作業が難しくなることを意味することがよくあります。そして、特に人々が前進し、新しい開発者がその地位に就く必要があるため、技術的な負債(つまり、メンテナンス)コストが高騰し始めます。 ですから、ある意味では、コードの所有権に対する高いレベルのニーズが、一般的なプログラマーの想像力の中で、仕事の匂いとして公然と見られていれば、私たちの職業にとって良いことだと思います。「仕事に責任と誇りを持っている」と見なされるのではなく、「技術的な負債を介して自分自身を定着させ、人工的な職の安全を確保する」と見なすべきです。 そして、テスト(思考実験)は基本的にすべきだと思います:もしその人(あるいはチーム全体)が明日地球の表面から消えたとしたら?これはプロジェクトの巨大な-おそらく致命的な-怪我になりますか、それとも新しい人々を連れて来て、彼らにdoccosとヘルプファイルを読んでもらい、数日間コードを遊んでもらうことができますか?数週間でビジネスを開始します(1か月ほどで完全な生産性に戻ります)。

5
Pythonでのプログラミングは、C、C ++、Javaよりも高速ですか?[閉まっている]
プログラマーの間では、より動的で緩やかに型付けされた言語であるほど、プログラマーの生産性は向上すると広く信じられています。Guido van Rossumは1998年にpythonを使用したプログラミングの生産性について書いており、ウェブ上を検索しています。 構文的には、Pythonコードは実行可能な擬似コードのように見えます。Pythonを使用したプログラム開発は、C / C ++を使用した場合の5〜10倍、Javaを使用した場合の3〜5倍の速度です。多くの場合、アプリケーションのプロトタイプは、C / C ++ / Javaコードを作成せずにPythonで作成できます。多くの場合、プロトタイプは十分に機能し、最終製品として提供されるのに十分な性能を発揮し、開発時間を大幅に節約します。また、プロトタイプの一部または全体をC ++またはJavaに翻訳できる場合もあります。Pythonのオブジェクト指向の性質により、翻訳は簡単なプロセスになります。 この問題は科学的に適切に評価されていますか?Pythonでない場合は、おそらくruby、perl、phpなどの兄弟スクリプト言語ですか? 問題を調査するために時間をかけた研究者や専門家の意見でない限り、答えが難しい可能性がある理由の合理化、類推、または説明を探しているわけではありません。 最初にこの質問をskeptics.SEで尋ねましたが、誰かが私もここで質問すべきだと提案しました。

9
ユーザーインターフェイスからクラスを分離する
ユーザーインターフェイスについて知る必要があるかもしれないクラスを作成する場合のベストプラクティスは何ですか。自分自身を描画する方法を知っているクラスは、ユーザーインターフェイス(コンソール、GUIなど)に依存するため、いくつかのベストプラクティスを破らないでしょうか。 多くのプログラミングの本で、継承を示す「形状」の例を見つけました。基本クラスのシェイプには、円や正方形などの各シェイプがオーバーライドするdraw()メソッドがあります。これにより、ポリモーフィズムが可能になります。しかし、draw()メソッドは、ユーザーインターフェースに大きく依存していませんか?たとえば、Win Forms用にこのクラスを記述した場合、コンソールアプリまたはWebアプリに再利用することはできません。これは正しいです? 質問の理由は、クラスが最も役立つようにクラスを一般化する方法に常に固執し、ハングアップしていることに気付くからです。これは実際に私に対して働いており、私は「一生懸命やっている」のだろうかと思っています。
27 design 

5
PHPログインスクリプトで採用すべきベストプラクティスは何ですか?
クライアントのWebサイトをより安全にするために、ログインスクリプトを書き直したいと思っています。これに実装できるベストプラクティスを知りたい。パスワードで保護されたコントロールパネルは豊富にありますが、コードの記述、速度、セキュリティの点でベストプラクティスを暗示していると思われるものはほとんどありません。 PHPとMYSQLデータベースを使用します。 以前はmd5を使用していましたが、sha256またはsha512の方が(安全なハッシュとソルトと共に)優れていることがわかります。 一部のログインスクリプトは、セッション全体またはユーザーエージェント全体でIPアドレスを記録しますが、プロキシサーバーと互換性がないため、それを避けたいと思います。 また、PHP 5でセッションを使用する際のベストプラクティスにも少し遅れています(前回読んだのはPHP 4でした)。これに関するいくつかのベストプラクティスが役立ちます。 ありがとう。

15
より小さなクラス/メソッドを使用するようにチームを説得するにはどうすればよいですか?
免責事項:私は新参者であり(これが私の仕事の3日目です)、私のチームメートのほとんどは私よりも経験が豊富です。 私たちのコードを見ると、次のようなコードのにおいと悪いエンジニアリング手法が見られます。 多少矛盾した命名ガイドライン 可能な場合、読み取り専用としてマークされていないプロパティ 大規模なクラス-何百もの拡張メソッド(多くのタイプ)で構成されるユーティリティクラスに気付きました。2500行以上でした! 大規模メソッド-150行のメソッドをリファクタリングしようとしています。 後者の2つは本当の問題のようです。チームメイトに、より小さなクラスとメソッドを使用するよう説得したいと思います。しかし、私はそれをする必要がありますか?はいの場合、どのように? 私のチームは、メインチーム(私たちはサテライトチーム)からメンターを獲得しました。最初に彼に行くべきですか? 更新:いくつかの回答がプロジェクトについて尋ねたので、それが機能しているプロジェクトであることを知ってください。そして、私見、そのサイズの巨大なクラス/メソッドは常に悪いです。 とにかく、チームを怒らせたくありません。それが私が尋ねた理由です-私はそれをするべきですか? 更新:受け入れられた答えに基づいて何かをすることにしました:私は初心者なので、すべてを「新鮮な目」で見るので、見つけたすべてのコードの匂いに注意します(位置、それが悪い理由、どうすればできるかより良い、...)、しかし、現時点では、私はチームから敬意を集めるために一生懸命努力しています:「より良いコード」を書き、人々を知り、なぜそれをしたのかを知っています...新しいコードポリシー(命名ガイドライン、小規模なクラス、小規模なメソッドなど)についてチームに問い合わせ、可能であれば古いコードをリファクタリングします。動作するはずです、私見。 ありがとうございました。

17
コピー&ペーストプログラミングの危険性を非プログラマーに説明するための良い、簡潔な方法は何ですか?[閉まっている]
コピーペーストプログラミングの問題を非プログラマーに説明できる優れた類似性または比metaを探しています。潜在的なクライアントのコード/システムのレビューを時折行いますが、よく見られる問題の1つは、コードベース全体に大量のコピーアンドペーストコードがあることです。それは私がレビューで定期的に呼びかけるものであり、毎回これがなぜ問題なのかを説明する必要がありますコピーと貼り付けは再利用の良い形ではありません)。明らかに、私はコード保守の観点から問題を説明することができます(しかし、説明します)。検索と置換がこの問題の効果的な解決策ではない理由を類推が示す場合のボーナス。助言がありますか? 明確にするために(以下のJaroslavの回答に基づいて)-ここではコードスニペットの使用については説明しません。私が目にするのは(多くの場合)膨大なコードのコピーと貼り付け、またはユーザーデータ(インラインSQLクエリを備えた)を多数のPHPまたはASP.NETページに貼り付けるための10行のコードです。そのため、同じプロジェクト内の別の場所からコードを複製します。 更新:ここには本当に良い答えがいくつかあります。スコットホイットロックの答えを選んだ理由についてはコメントで説明しましたが、製造に精通している顧客を扱っているなら、whatsisnameの答えを強くお勧めします。

5
C ++テンプレートは単なるマクロの一種ですか?
このようなC ++テンプレートとC#/ Javaジェネリックのさまざまな比較から、 https://stackoverflow.com/questions/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 C ++テンプレートは、コンパイルではなく、何らかの種類の前処理(解析前のプレーンテキスト置換)によって実装されているという認識を得ました。C ++テンプレートの型チェックはCマクロに似ているためです。エラーがある場合、それらはテンプレート自体からではなく、テンプレートコードブロックを処理した後に生成されたコードからのエラーです。言い換えれば、それらはCのマクロの一種の上位バージョンにすぎません。 次に、これをサポートする他のいくつかの事実を見つけました- C ++テンプレートが前処理によって実装される場合、動的リンク(.dllを使用)に問題があると思いました。そして、クイックグーグルがこれをサポートしました。 もう1つのポイントは、整数定数を引数としてテンプレートに渡すことができるということです。また、何らかの再帰をサポートします。ただし、この再帰は、コンパイルされたアセンブリ/マシンコードにはありません。再帰的なことは、すべての再帰呼び出しに対して関数を生成することにより、コンパイル時に管理されます。したがって、より大きく、より高速な実行可能バイナリを持ちます。 Cマクロとは異なりますが、いくつかの優れた機能があります。しかし、C ++テンプレートは何らかの前処理で実装されていませんか?これは異なるC ++コンパイラでどのように実装されていますか?
27 c++  c  compiler  templates  macros 

12
ソリッドと早すぎる抽象化の回避
SOLIDが何を達成することになっているのかを理解し、モジュール性が重要であり、その目標が明らかに役立つ状況で定期的に使用します。ただし、次の2つの理由により、コードベース全体に一貫して適用できません。 時期尚早な抽象化を避けたい。私の経験では、具体的なユースケース(現在または近い将来に存在する種類)なしで抽象化ラインを描画すると、間違った場所に描画されます。このようなコードを変更しようとすると、抽象化ラインが助けになるのではなく邪魔になります。したがって、どこに有用なのかがよくわかるまで、抽象化ラインを描画しないという側面を誤解する傾向があります。 私のコードをより冗長にし、理解しにくくするなど、重複を排除しない場合、モジュール性を高めることを正当化するのは難しいと思います。フローが単純で線形であるため、非常に適切にファクタリングされたラビオリコードよりも、シンプルで密結合された手続き型またはGodオブジェクトコードの方が理解しやすい場合があります。書くのもずっと簡単です。 一方、この考え方はしばしば神の対象につながります。私は通常、これらを控えめにリファクタリングし、明確なパターンが出現する場合にのみ明確な抽象化ラインを追加します。明らかにモジュール性を必要とせず、大幅な重複がなく、コードが読み取り可能な場合、Godオブジェクトと密結合コードで何か問題があるとしたらどうでしょうか。 編集:個々のSOLID原則に関しては、Liskov Substitutionは常識の形式化であり、どこにでも適用されるべきであると強調するつもりでした。また、すべてのクラスは、何らかの抽象化レベルで単一の責任を負う必要がありますが、実装の詳細がすべて1つの巨大な2,000行クラスに詰め込まれた非常に高いレベルかもしれません。基本的に、抽象化は、抽象化を選択した場所で意味をなす必要があります。モジュール性が明確に役に立たない場合に私が疑問に思う原則は、オープンクローズ、インターフェース分離、特に依存関係の逆転です。これらは抽象化が意味をなさないだけでなく、モジュール性に関するものだからです。

11
ビジネスマンからの要件の緩和
技術系ではないビジネスマンから要件を引き出すのに最適な方法は何ですか? プロジェクトの仕様をまとめようとしているチームと協力しています。私たちが会い、次の会議への期待に至るたびに、私たちはビジネスの人々に彼らの要求を取り戻すように頼みます。通常、彼らは次のような反応を示します。「さて、来週私たちが好きなものを見ることができるようにプロトタイプを作り上げることができると思いますか? 6か月以上のプロジェクトであるため、明らかに実行不可能です(全体を開発する必要があります!)。また、なんらかの仕様なしにプロトタイプを作成する方法さえ知りません。率直に言って、私はほとんどの人と同じように、彼らは自分が望むものについてある程度の考えを持っていると思います。単純に伝える代わりに、「あなたが欲しいものを与えてください、または私たちは仕事をすることができない/できない」(結果に満足してもらいたい)、彼らが望むものを決めるのを助ける方法はありますか?たとえば、次のように伝えることができます。 「表示したいすべてのデータとマージンの機能の説明とともに、希望するUIを表示する画面(Powerpoint、ナプキンなど)を描画します。これから、私たちはそれを洗練し、この一連の動作要件に基づいてバックエンドを構築します。」 または 「今どのように見えるか心配する必要はありません(1番が電話を切ります)。プログラムが追跡する各項目について必要なすべてのデータのリストを提供してください。「顧客」の場合、名前、住所、電話番号、注文などをリストすることができます。完璧なデータベース構造である必要はありませんが、これから何かを見つけて、あなたが探しているもののアイデアを得ることができます。 これらの代替アプローチのいずれかは、ビジネスの人々に彼らが望むものに焦点を当てさせるのに意味がありますか?実際に見た代替手段はありますか?

7
Webプログラマーは暗号化について何を知るべきですか?[閉まっている]
Webサイト/ Webアプリケーションを構築するプログラマーは暗号化を理解すべきですか?ほとんどの暗号アルゴリズムがどのように機能するのか分かりませんし、md5 / des / aes / etcの違いを本当に理解していません。暗号化の詳細な理解が必要な人はいますか? 私はそれを必要としませんでした、しかし、私はおそらく私が何かを見逃しているのではないかと思います。パスワードを暗号化するためにsalt + md5ハッシュを使用し、WebサーバーにSSLを使用するように指示しました。それを超えて、私は他の多くを使用したとは言えず、これらの方法がどれほど安全であるかを確実に言うこともできません。他の人が彼らが安全だと主張するので、私はそれらを使うだけです。 これらの2つの単純な例とは別に、Webプログラミングで暗号化を使用する必要性を発見したことがありますか?

21
履歴書に本を読む
読んだ本を履歴書に載せるか、少なくともソフトウェア開発に関連する本を載せるのは良い考えですか?
27 books  resume 


3
プログラミング能力の成長を測定するためにどのようなマイルストーンを使用できますか?[閉まっている]
長期にわたって、コードの生成が改善されていると客観的に判断するにはどうすればよいですか?たとえば、私はここに座って、「今知って<language>いるし、<technique>今使っているので、もっと良くなければならない」と感じるかもしれません。しかし、これは私自身のバイアス、または意図したよりも遅い速度で良くなっているかもしれないという事実、または私は実際にそれを吸い込んで<technique>気付かないかもしれないという事実を説明しません。自分の能力を客観的に評価するための方法は何ですか?それらを仲間のグループと客観的に比較するのはどうですか?

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