【NTQ Engineer Insight】生産性と品質を上げるクリーンコードとその浸透のさせ方
当然のことではありますが、コーディング量と品質が一定で開発に係る時間が少なくなれば、生産性は向上します。
品質の維持と開発速度の向上を同時に実現するためには、コードの可読性をあげて開発、保守を容易にすることが非常に重要です。
可読性と聞くとリーダブルコードを想起する方もいるかと思いますが、もう一つクリーンコードという考え方があります。
クリーンコードは、メンテナンス、開発、機能拡張にかかるコストを削減するためにはルールに基づいてコードをシンプルで直接的な可読性の高いものにするべきだという考え方です。
今回はクリーンコードの解説とNTQのC#開発を担うチームを中心とした社内浸透の事例をお話いたします。
クリーンコードとは?
クリーンコードの明確な定義については様々な意見があります。
例えば、グラディ・ブーチ氏はクリーンコードを「シンプルで直接的で散文のようなコードだ」と述べています。
同氏以外にも世界中の専門家がクリーンコードについて、さまざまな意見を述べています。
ビャーネ・ストロヴルプ氏
自分のコードはエレガントで効率的であってほしい。そのためにも、バグを隠しにくくするためにロジックをシンプルにすべきだ。また、関係者が原則に基づかない個別最適でコードをめちゃくちゃにしないことでパフォーマンスを改善できるようにし、明確な戦略に従ってエラー処理を完了し、メンテナンスを容易にするためにも依存関係を最小限に抑えるべきだ。クリーンコードによって、これらは実現できる。
グラディ・ブーチ氏
クリーンコードはシンプルで直接的で、上手く書かれた散文のようなものだ。クリーンコードは設計者の意図を曖昧にせず、鮮やかな抽象化とシンプルなコントロールで構成されている。
デイブ・トーマス氏
クリーンコードは、元々の開発者以外の人でも読み取りやすく、その改善を容易にする。単体テスト、受け入れテスト、意義のある名前付けを通してより良い開発を実現する。明示的に定義された最小限の依存関係を持ち、明確で最小限のAPIを提供する。そのためにも、コードは文学的である必要がある。開発言語に依存していてはすべての必要な情報をコードだけで明確に表現することはできないからだ。
マイケル・フェザーズ氏
クリーンコードの特徴としては様々なことが挙げられる。しかし、その中でも最も包括的な特徴は常に心を込めて書かれていることだろう。心を込めることで、それ以上の改善の余地がない域に達している。全ての改善について開発者が考えつくしており、改善をしようしても残されたコードとそれを創った開発者に対して畏敬の念を抱くだけだ。
ロン・ジェフリーズ氏
近年、私はケント・ベック氏のシンプルなコードのルールをほぼ身に着けたと感じている。優先度の高いものから述べるとシンプルなコードとは、すべてのテストが実行され、重複を含まず、システムの全ての設計アイデアを表現し、クラスやメソッドや関数などのエンティティが最小限になっているものだ。
まとめるとクリーンコードは、原則に基づいて重複なくシンプルに記述することで、本人以外でも明確にコードを読み解くことができるコードであるといえます。
読みやすいコードで開発を進めることで、コードの検証、更なる開発や開発後の保守にかかる時間を減らすことができます。
こうした点から、クリーンコードは開発プロジェクトにおいて非常に重要なものであるということができます。
クリーンコードと品質の関係
品質の観点ではどうでしょうか?
品質管理の世界では、日本の製造業で一般的な5Sの原則(整理、整頓、清掃、清潔、躾)がよく議論にあがります。
この5Sをアプリケーションの品質を既定するソースコードに適用すると以下のように整理できます。
これを実現するためには具体的に次のような考え方でルールを設定できます。
名前付け
名前は、変数、関数、引数、クラス、ファイル、パッケージ、フォルダー等、ソフトウェア内の様々な場所に散在するため、検索可能なものにする必要があります。検索を容易にするために、名前は、存在理由は何か、何をするものか、どのように使用するものかを示し、発音可能で検索可能なものとするべきです。
関数、エラー処理
可読性を上げるという観点では、メソッドは20~30行程度で1つのタスクだけを処理するものとし、引数は3つまでと上限を明確に設定するべきでしょう。また、メソッド内のエラー処理をスローする、テストを実現できる戻り値変数と上記のエラー処理を担当する別のクラスを持つ、nullを返さないようにするという特性を持たせることも必要だと考えます。
注意点としては、エラー処理は重要であるものの、それによってロジックが不明瞭になるならば、可読性が下がり、生産性に影響を与えます。そのため、盛り込みすぎには注意すべきです。
コメントとフォーマット
意味が十分に通る名前付けがされているのであれば、さらにコメントを付す必要はないでしょう。また、すでにSource Controlで管理している場合も、ファイルや変更点に関するコメントは不要です。ただし、業務上、コードを明確にする必要がある場合、追加する必要がありえます。
フォーマットの観点では、可読性を上げるために一つの画面上で簡単にコードの確認ができるように余分なコードは削除しておくことが必要となります。
サードパーティライブラリの使用
外部ライブラリを使用する場合、後でアップグレードしたり、システムのビジネスに影響を与えることなくライブラリを交換したりできるように利用する関数をラップする必要があります。
TDDとSOLID
テストファーストの考え方に基づいて開発を行う場合やコード設計時に使用する考え方です。SOLIDはオブジェクト指向デザインのためのルールで、コードを単一のタスクに分割し、コードの継承を強化し、レイヤーコードの相互依存性を低減するのに役立ちます。TDDは、品質を保証しながらアプリケーションを開発するための考え方であり、後に自動化テストに利用することができます。
この他にもクラス、システム、並行処理など、様々なルールが考えられますが、いずれも可読性を上げることで開発者間の負担を下げることを目指したものです。
シンプルなコードを作成するために上記のようなルールを設定することは、他の開発者の負担を下げるという観点で、前項のクリーンコードに繋がる部分があります。
以上より、クリーンコードは品質の観点でも非常に重要な考え方であることがわかります。
クリーンコードの適用で工数25%削減を実現したNTQの事例
システムを開発する際、開発、保守、拡張を容易にするために可読性の観点でコード品質を高くしてほしいという要求は常にあります。
コード品質向上の要求を受け、クリーンコードとSOLIDの原則、システムのパフォーマンスを向上させるTipsに関するトレーニングをC#チームで試験的に実施しました。
トレーニングを経て、コードがよりシンプルになり、整理されたことで読みやすくなり、メンテナンスや新機能の開発がしやすくなりました。
また、コンポーネント間の相互依存性が低くなったことで交換も容易にできるようになりました。
しかし、改善が見られる中でも一部、質の悪いコードが依然として繰り返されていました。
分析の結果、メソッドやクラスの名前付けに問題があることがわかりました。
具体的には、メソッドはそれに対する単体テストが書けないような状態で名前付けされ、SOLIDの5原則の活用もまだ徹底されていなかったのです。
こうした問題の解決のため、コード品質管理プロセス適用の更なる強化はもちろん、経験が不足しがちなテストを見据えたトレーニングにするためにトレーニングの内容を改善していきました。
トレーニングを継続することで、コード品質の基本的な間違いがほとんどなくなり、散見されていた名前付けの問題もなくなり、特に単体テストに繋げる名前付けという観点で開発者のレベルが向上しました。
また、業務の分離、抽象クラスの開発など、SOLIDのルールもより正確になりました。
また、ミスが減少し、当時多くの工数をかけて実施していたミスの多い人に対する重点的なピアレビュー等の多くの工数を削減することができました。
工数が減って品質があがったことで生産性も向上し、システムの新機能の業務の分析と設計、新機能の開発、既存機能の修正やバグの修正を容易にするためのシステムの一部のリファクタリングなど、より多くの仕事に対応できるようになりました。
バグや古い機能の修正にかかる時間が半分になり、新機能の開発プロセスの速度もあがったことで、開発の工数において25%の余力が生まれました。
その後、C#のチームで優先的に始まったこのトレーニングは対象を拡大していき、現在ではNTQでご支援しているほとんどの開発プロジェクトでクリーンコードを導入することとなりました。
お客様に納品する際のみならず、開発中のレビューや将来のプロジェクトの保守、拡張の検討がやりやすくなったとお客様からコメントをいただいています。
まとめ
クリーンコードの意義を時間の削減、品質の向上という観点で語ったうえでNTQのC#開発チームにおける生産性向上の事例をご紹介しました。
クリーンコードの浸透はNTQにおける生産性向上の一手です。
この他にも数々の施策を実施しながら、対日系システム開発企業での最大40%のコスト削減と日本レベルの品質を同時に実現するために尽力しています。
生産性向上を先導したC#チームが提供するNTQの新サービスC#_EXTENSION TEAMについては、下記のダウンロードページよりダウンロードいただけます。
・「ダウンロード」ページ
NTQは、10年以上にわたる日本での活動の中でC#を含め、大手企業様から新興のスタートアップ様にいたるまで数多くの企業様の600件を超える開発をご支援してまいりました。
モバイルアプリ、Webアプリ、デスクトップアプリ等の開発を検討中の皆様、開発人員が不足しているITベンダーの皆様は、ぜひ一度NTQにお問い合わせくださいませ。
・「お問合せ」ページ