保守性に関する学生のトレーニングを改善する方法は?[閉まっている]


18

保守性は、専門的なソフトウェア開発の主要な問題です。実際、メンテナンスは、プロジェクトのリリースから基本的に終わりまで続くため、ほとんどの場合、ソフトウェアライフサイクルの最も長い部分です。

さらに、メンテナンス中のプロジェクトは、プロジェクトの総数の大部分を占めています。http://www.vlegaci.com/298/interesting-statistics-%E2%80%93-numbers-of-programmers-in-maintenance-vs-development/によると、メンテナンス中のプロジェクトの割合は約2です/ 3。

私は最近この質問に出くわしました。彼の仕事は主にメンテナンスに関するものであることに気付いた男はかなり驚いているようです。それから、フランスのソフトウェア開発専門家コミュニティ(http://www.developpez.com/)のメインサイトでディスカッション(フランス語)を開くことにしました。ディスカッションのタイトルは、「学生はプロのソフトウェア開発の現実に十分に訓練されていますか?」そして、主に保守性についてです。少なくともフランスでは、人々はその両方の面でメンテナンスに直面する準備が十分に整っていないことが指摘されました。

  • 既存のコードを維持する
  • 保守可能なコードを作成する

ここでの私の質問は、この議論と同じであり、保守性を教える良い方法を見つけることを目指しています。

  • 保守性をどのように教えることができますか?
  • どのような運動を提案しますか?
  • 保守性に関して十分な訓練を受けている場合、どのような種類のコースを受講しましたか?

[編集]いくつかの誤解の後、私の質問を明確にしなければならないと思います。プロジェクトリーダーおよびソフトウェア開発者として、私はしばしば研修生または卒業したばかりの学生と仕事をしています。私はかつて自分自身を卒業したばかりでした。問題は、通常、プロジェクトの保守性を高めるSOLIDなどの原則に学生が慣れていないことです。私たちはしばしばプロジェクトを発展させる重要な困難を抱えることになります(保守性が低い)。私がここで探しているのは、保守性の重要性と、この特定の点に関してより良いコードを作成する方法に関する成功した教育の具体的な学術的な例です。または生徒の訓練方法を改善するための提案。



PS:そこに私の答えを見て、あなたはスパゲッティ実験は価値があるかもしれません
博士課程

スパゲッティコードはそれのほんの一部です:@Nupulとしてあなたのコードの保守性を教えるに関与教師と見ている、完全な答えをしてください、あなたはどのように進んで教えて
マティアス・ジョアン

回答を投稿しました...それがあなたに価値をもたらすことを願っています:)
PhD

「実用的なAPI設計」のAPI設計および保守性プロジェクトは、IMHOであり、保守性(および下位互換性)の課題を学生に教えるのに最適なプロジェクトです。
マルコ

回答:


8

保守性をどのように教えることができますか?

それは練習問題です。

私が考えることができる制御された方法でそれを実践する最も簡単な方法は、次のような典型的な保守プロジェクトをシミュレートすることです。

よくできたプロジェクト(プロジェクトA)を取得し、その上にいくつかの問題を導入します:いくつかのバグを挿入し、重複したコードとデッドコードのうたた寝、いくつかの機能、ユニットテストとドキュメントをあちこちにドロップします。以下のようなものの名前、破損したバージョン-プロジェクトA

課題追跡を確立し、あなたが行った特定の損害に対応するリクエストでそれを埋めます。開発プロセスの基本的なルールとプラクティス(VCSコミット、コードレビュー、QAなど)を確立します。ジョエルテストで提供されるチェックリストからできることを検討してください。

  • コースワーク1.
    バグを修正し、不足している単体テスト、ドキュメント、機能を追加します。
  • コース2.
    リファクタリング。
  • コースワーク3.
    来年の学生が使用する元のプロジェクトのメンテナンス/改善
    - プロジェクトAバージョン2.0およびプロジェクトA-破損したバージョン2.0破損したバージョン
    改善するということは、教育的なダメージを与えることを意味します。:)

上記のプラクティスのうち、コードレビューのプラクティスに特に注意を払ってください。これは、関連する質問のトップアンサーなどに示されているように、コードの保守が簡単であることを保証する最も効果的な方法です。

1分あたりのWTF


11

免責事項:私はちょうどCS学位を取得しました。私は教師ではありません。

これは当たり前のように聞こえるかもしれませんが、コードメンテナンスを教える最良の方法は、学生にコードメンテナンスを実行させることだと思います。ここに私がやることがあります:

  1. 中程度に複雑な問題と、セマンティック上は同一の2つの実装を取り上げますが、一方は他方よりもはるかに保守性が高くなります。
  2. より良いコードベースで実装するのがはるかに簡単な多くの変更/機能追加を要求します。学生の半分は保守性の高いコードベースにこれらを実装し、残りの半分は保守性の低いコードベースに実装する必要があります。
  3. 公平を期すために、役割を逆にしてこの演習を繰り返してください。
  4. 正常なコードベースと不良なコードベースの間で正常に実装された変更の平均数と、それらの実装に費やされた時間を比較します。生徒に自分の経験を共有し、苦情を伝え、自分がやった仕事について話してもらうだけです。

アイデアは、学生に他の人のコードを使って作業させるだけでなく、設計スキルを向上させることを望んでいる保守可能なコードに対する感謝を開発させることです。


演習用に+1。それは私が長い間実行したかったものに非常に似ています。私のバージョンでは、学生は仕様に何かを書いてから、それを他の誰か(私が選んだ)に与えて修正します。保守性と優れた実践について教えた後、活動を繰り返して、あなたの主張を述べることができます。
アンディハント

1
Fowler's Refactoringの
mjfgates

2

保守性は美徳であり、スキルではありません。保守可能なプロジェクトを作成するための多くの方法がありますが、それらを作成することが保証されている公式はありません。

優しさや寛大さなどの美徳を重視するなら、日常生活で同じことを実践する方法を探します。保守性についても同じです。あなたとあなたの組織が保守性を重視しているなら、プロジェクトを設計および実装する際に心の奥底でそれを維持します。メンテナンス性が高く評価されていることを知っているので、何かを構築するのに少し余分な時間を費やすことは正当な理由になります。逆に、価値を持たない組織で保守性のために余分な時間を費やすことは推奨されません。

人々に物事を維持可能にすることを教えたいなら、組織が保守性を重視していることを明確にすることから始めるべきです。プロジェクトの要件で指定します。コードレビューを成功させるための基準の1つにしてください。要するに、保守性を文化の一部にする

次に、既存のプロジェクトの保守性を改善するためにリソースを投入します。バグが発生し続ける、またはバグの修正や変更が非常に困難で時間がかかるプロジェクトの部分を特定し、メンテナンスを容易にするために再設計またはリファクタリングします。

最後に、すでに毎日実践しているチームに割り当てることにより、新しい開発者を保守性の文化に教化します。誰かが価値を採用するのを助ける良い方法は、たくさんの良い例とガイダンスを与えることです。


1
ここで下票を理解するのに苦労しています。選択した聖書からソフトウェアデザインを好きなだけ引用できますが、主な問題は、開発者が重要なことであるということです。 。生徒が生み出している仕事の質を絶えず疑い、彼らが下している決定に疑問を抱くという重要な感覚を生徒に植え付けなければ、保守性に関するコースがどれほど彼らにとって有用であると証明できるか本当に疑わしい。
フィリップデュパノビッチ

@FilipDupanović同意します。さらに一歩進んで、CS学位の新卒者の準備不足を嘆く人もいますが、この問題は驚くべきものでもプログラミング特有のものでもないと思います。もちろん、新しい卒業生と経験豊富な労働者の間には違いがあります。あらゆる分野の優れた学位プログラムは概念的であり、職業的ではありません。経験だけが新しい卒業生に、彼らが学んだ概念を適用し、最終的にどんな仕事に就いても効果的に働くように教えます。–
カレブ

1

ソフトウェア開発に関連して保守可能という用語嫌う人がいます。現実には、すべてのソフトウェアは保守作業の対象となるという点で保守可能であるため、本当の問題は、ソフトウェアが比較的高価であるか保守が安価であるかということです。これは、回答の最初に行う非常につまらないステートメントのように聞こえますが、私のポイントはすぐに明らかになります。

ソフトウェア開発を専攻するIT学位の問題は、学生がソフトウェアの作成について知っておく必要がある最低限のことだけを学生に教えることです。プロのスキルと知識は、その後の最初の数年間行われる学習を通じて獲得されます学位の資格。これは、卒業生が実行する大きなプレッシャーがある環境で実際に顧客にとって重要なプロジェクトに取り組み始めたときであり、期待はプロの基準に合った製品を作成することです。悲しいことに、多くの企業は、ソフトウェアの専門的な基準が維持される文化を奨励しておらず、結果として開発と維持に費用がかかるプロジェクトになります。私たちの卒業生にとって残念なことに、彼らは彼らのキャリアの初期にそのような環境で多くの悪い習慣を学びます、そして、彼らがこれらの習慣を克服する方法を学ぶ前に長い時間をすることができます。

クリーンなコードの書き方と、通常は技術的な負債を負うことになるソフトウェアの問題を特定する方法を生徒に教えるほうがよいでしょう。クリーンコードリファクタリングリーンソフトウェア開発に関する書籍を出発点として見て、高度なテストカバレッジを確保するために、実装コードの前にユニットテストを書くことを生徒に教えます。コード内の重複した繰り返しパターンを認識し、そのような重複を取り除くためにコードをリファクタリングする方法を生徒に教えます。学生がSOLIDDRYなどの原則を理解して適用するのを助けます。最も重要なことは、コードを維持する能力はコードの設計と実装のみに基づいて行われるものであるという考えを廃止し、代わりに最初からソフトウェアの生産に職人技と品質の感覚を植え付けることです。技術的な負債の影響を最小限に抑えるために、実装されているコードを改良し、それによりソフトウェアを維持するコストを長期にわたって最小限に抑えます。


私はあなたの答えを注意深く読みました。また、「維持可能」についてのあなたの記事を読みましたが、私はあなたにほぼ完全に同意することを言わなければなりません。私は、あなたが言及した本をいくつか読んで、仕事で毎日固いなどの原則を使用しています-または人々に使用させています-私は教師ではありません。しかし、あなたの答えは少しトピックから外れていると思います。私が探しているものを明確にするために質問を編集します。
マティアスジョアン

1
あなたは良い点を指摘しますが、あるプロジェクトが他のプロジェクトよりも多かれ少なかれ保守可能であると言うのも公平です。-ableまたは-ibleで終わる単語は絶対的または相対的な場合があり、OPが相対的な意味でそれを使用していることはかなり明らかです。
カレブ

0

この種のスキルを学ぶ最良の方法は、コードレビューとペアプログラミングを行うことだと思います。コードのレビュー中に、経験豊富なスタッフがコードを保守しやすくする方法を指摘し(通常は読みやすくすることで)、特定の選択により保守可能なコードを作成できる理由を正当化できます。

ペアプログラミングは、この種のことを教えるためのさらに優れた方法です。これは、経験の浅いスタッフが、コードの実行方法を既に知っている人とコードを保守する直接的な経験を与えるためです。

また、クリーンで保守可能なコードの記述について読むことができる素晴らしい本もいくつかあります。きれいなコードが思い浮かびます。

学生が大規模なコードベースを変更することはめったにないため、アカデミアを通じてこの経験を得るのは困難です。これらのスキルのほとんどは仕事での学習から得られるものであり、コードレビューとペアプログラミングはこの学習を実際に促進することができます。


1
ペアプログラミングは、より熟練した開発者から学ぶのに非常に良い方法であり、ロバートC.マーティンの本を読むことは間違いなく私の人生を変えましたが、質問は純粋なアカデミックな学習方法に関するものでした。ソフトウェア開発のプロフェッショナルな世界。
マティアスジョアン

1
-1:@suszterpattの提案は、ずっと良く聞こえます。
ジムG.

0

優れたコード=メンテナンスが少なく、機能の拡張/追加が簡単です。

悪いコード=メンテナンスの悪夢

基本的に、「プロジェクトに安っぽいコードがあるときはいつでも、コードの元の作者が苦しみ、ソフトウェアがどのように影響を受けるかによって会社に入ろうとする新しい開発者」という点を学生に伝えなければなりません。 」

したがって、学生にソフトウェアメンテナンスについて教える最良の方法の1つは、良いコードと悪いコードの両方の例を示し、機能を追加するように依頼し、それから良いコードを書くことは自己満足のためだけでなく、コードを保守しようとしている人にとっては簡単です。

運動:

1)事前に作成された不良コード(例:重複コード)がある場合、「住宅ローンの支払いを計算する」という方法がプロジェクトの9箇所に記述さます。

「すべての住宅ローンの支払いに1.2%の追加料金を追加する」機能を強化するよう生徒に依頼します。

これで、生徒は9か所すべてでコードを見つけて修正する苦労を感じるようになります。「住宅ローンの支払い」が計算される9つの場所すべてを見つけることができなかった可能性が多くあります。

2)唯一の場所で住宅ローンの支払いを計算するこのメソッドを持つGoodコードを示します。よく書かれたコードをいかに簡単に強化できるかを生徒に示し、コード/プロジェクトの保守性をどのように高めるかを説明します。

ところで、私は、学生をソフトウェアの保守性にさらすというあなたのアプローチが大好きでした。


-1

@mattmattj:たくさんの回答があり、私が投稿しリンクにも良いポインタがあるので、既に投稿された回答の繰り返しではないものを追加します。

まず、「保守性」を定義する必要があります-すべてが受け入れる単一の定義はありません-ソフトウェアアーキテクチャの定義と同様です。そのため、最も重要だと思うものを選択し、すべてを網羅し、最大3〜4行で記述してください。次に、次のようないくつかのメトリックについて話すことができます-自分のコード(または他の人の)を思い出す/理解する時間、1分/時間あたりのWTFの数など。その後に言います。

いくつかの演習(回答の一部と少し重なるように聞こえるかもしれませんが、ご容赦ください)

クラスを2つに分割します。1つのセクションに、1〜2日で完了する必要がある簡単なコーディング割り当てを与えます。最大 厳しい締め切り。彼らはすべての状況下で仕事を成し遂げなければなりません-ガイドライン-彼らが適切だと思う「作業コード」。他の学生のグループについても同じ課題ですが、(命名)規則のリストと、デザインに関するガイドラインと、従わない場合のポイントの差し引き方法があります。たとえそれがそのように聞こえても、これは不正行為ではありません;)今、彼らにコードを交換させます。つまり、グループ1はグループ2がしたことで動作します。次に、元のコーディング割り当ての変更を提案し、同じ時間枠でそれを行うように依頼します。再結集して、それがいかに簡単/難しかったかを尋ね、議論/意見に床を開いてください。ポイントは間違いなく帰宅します-クラスの50%が幸福であり、それが簡単であると思い、50%が難しいと思った可能性が高いです。また、3週間後に自分のことで作業するように依頼し、1日でできるかどうかを確認することもできます;)

(良い方法は、同じコードを複雑な方法で記述し、クラスに独自のコードとともに変更を与えることです)

ここに保守性の基礎があります-変​​更/更新されたコードの各行には会社の費用がかかります。コードの読み取りと再収集が容易であればあるほど、変更の改善/迅速化が促進され、市場投入までの時間が短縮されます。今日のペースの速い技術分野では非常に重要です。保守性は、システムの効率的な進化の鍵です。

グリーンフィールド開発とブラウンフィールド開発の違いを理解することは重要です。すべてのプロジェクトまたはシステムがゼロから作成されるわけではありません(「ゼロから」プロジェクトを見つけたり、その一部になることはかなり困難です)。フィールドが「本質的に」茶色であり、「手に負えない」状態になったときに最終的な段階的廃止に伴い、時間をかけてシェーピングする必要があることを説明します(ドリフトが多すぎて「維持できない」場合のみ可能)。彼らはそれをより早く受け入れるほどよい。プログラミングは本質的に創造的ですが、他の人のコードを強化することはそのように認識されないため、これは困難です-それをひねります。創造性には、コードを理解し、「自分の」創造性を適用してコードを強化する機能があります。より適切に維持されれば、将来、より創造的にコードを強化することができます。

上記のリンクのスパゲッティの類推を自由に参照してください。他の回答は、ギャップを埋めるのに役立ち、指導の助けになるはずです!幸運を祈ります!


@Downvoter-投稿を改善する可能性を高めるためにコメントを残してください:)
PhD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.