21の重要なソフトウェアエンジニアリングの実践

Types of Software Engineering Practices

ここでは、会社が高品質なソフトウェアを提供するのに役立つソフトウェアエンジニアリングプラクティスのリストを紹介します

ソフトウェアエンジニアは、ソフトウェア開発のさまざまな分野からベストプラクティスを学ぶことができます。ベストプラクティスを学び、それをプロジェクトに適用するための適切な方法を見つけることで、ソフトウェアエンジニアは成熟し、成功を収めることができます。

ベストプラクティスを選択する際には、プログラマーの経験が重要になります。つまり、ジュニアエンジニアは通常、ユニットテストの記述やコードの臭いを避けるためのベストプラクティスを学びますが、シニアエンジニアやテクニカルリーダーは、プロジェクトや開発プロセス全体に影響を与えるベストプラクティスを学ぶべきです。

ソフトウェアの保守性を維持するためには、ソフトウェアエンジニアリングの慣習に従うことが不可欠です。あなたの組織は、トレーニング、コーチング、ツール、インフラストラクチャ、および時間によって、これらのソフトウェアエンジニアリングの慣習に投資する必要があります。

Types of Software Engineering Practices

Development Methodologies To Consider

1. 考慮すべき開発方法論

ウォーターフォール、アジャイル、スクラム、ネクサス、カンバンなど、いくつかの開発方法論/フレームワークがありますが、その中から選ぶことができます。しかし、アジャイルのメリットを享受するためには、ソフトウェアプロジェクトの考え方や実行方法を変える必要があります。

ウォーターフォール

例えば、ウォーターフォールでは、計画を立て、大量の要件を用意して、高度に構造化されたプロジェクトで実行しようとしますが、これでは必要以上に時間がかかり、労力も消費してしまいます。

スクラム

スクラムは、ソフトウェアデリバリープロジェクトの品質、スピード、そして経済性を向上させるためのフレームワークであり、一連のプラクティスです。恩恵を受けるのは、ソフトウェア開発プロジェクトだけではありません。製品設計やライフサイクル管理でも、スクラムの恩恵を受けることができます。

ネクサス

Nexusはスクラムチームのスケールアップを支援します。時間をかけて段階的に製品をリリースするような大規模で長期的なプロジェクトにアジャイルを拡張することは困難です。大規模な開発を行うにはチームの経験が不足していることが多いため、スクラムのような既知で実績のあるプラクティスに集中するのがよいでしょう。Nexusでは、スクラムの考え方を取り入れ、100人以上の開発者が参加できるようなフレームワークにしています。

かんばん

カンバンは、新機能を提供するために必要な作業量を視覚化し、タスクに優先順位をつけて完了を約束するというものです。このプロセスでは、開発者がプロジェクトのステータスレポートを監督します。このような手法の価値は、開発者が自分の状態を可視化できることにあります。組織に適した方法を選択する必要があります。

Coding Practices: Code Readability & Clean Code

2. コーディングの実践: コードの可読性とクリーンなコード

コードがどれだけ読みやすいかは、しばしばソフトウェアの最高品質の特徴の一つと考えられます。あなたの組織は、あなたのチームがお互いのコードを読み、品質の高いコードだけをコミットすることに責任があります。コードの読みやすさが悪いと、バグが発生したり、ソフトウェアが安定しないなどの問題が発生し、ソフトウェアの一部を書き直さなければならなくなり、チームのベロシティに影響を与えることにもなります。 チームにクリーンなコーディング手法を学ばせるようにしましょう。

Apply Refactoring Frequently

3. リファクタリングを頻繁に行う

ソフトウェアのリファクタリングとは、既存のコードを修正・再構築することで、理解しやすく、保守しやすく、変更しやすくすることです。例えば、メソッドの名前や呼び出し方を変更することができます。リファクタリングを行うことで、変化する要求に対応したり、将来のコード変更に対応したりするために、システムに柔軟性を持たせることができます。リファクタリングでは、既存のコードと要件を理解し、メンテナンスを容易にするためにコードを再構築し、必要な柔軟性を実現するために既存のコードに変更を加え、要件に照らして変更内容を検証し、最終的に変更内容を本番に反映させます。

Reduce Your Technical Debt

4. 技術的負債の削減

技術的負債とは、ソフトウェア業界では、バグ、レガシーコード、ドキュメントの欠落などによる負債を意味します。一般的には、設計負債やコード負債と同じ意味で使われます。

開発チームが、ある機能やプロジェクトの実現を急ぐために行動を起こすと、技術的負債が発生し、後にリファクタリングが必要になります。技術的負債とは、完璧なコードよりも迅速な納品を優先させた結果として生じるものです。

より良い製品を作るためには、既存のコードを負債と考えることです。リファクタリングをして負債を減らすことで、あなたの組織は現在の顧客を最優先し、負債をできるだけ小さくすることができます。さらに、コードは理解しやすく、保守性があり、バグがなく、信頼性の高いものでなければなりません。

Coding Practices: KISS, YAGNI, DRY, and SOLID

5. コーディング慣行:KISS、YAGNI、DRY、およびSOLID

これらは、ソフトウェアの多くの頭字語の一部です。

KISSとは “Keep It Simple, Stupid “の略。多くの場合、開発者は必要以上に物事を複雑にしてしまいます。シンプルなソリューションが要件を満たす場合、高度なソリューションよりもシンプルなソリューションを好むべきである。

YAGNI、「You Aren’t Gonna Need It」。開発者は、将来の要求に対応するために、物事をあまりにも一般的にしてしまうことがよくありますが、これは通常、良いアイデアではありません。

DRYは「Don’t Repeat Yourself」の略で、重複したコードはより多くのコードにつながり、より多くのコードは維持するのが難しく、よりコストがかかることを意味している。

最後に、SOLIDの頭文字は、Single responsibility principle、Open-closed principle、Liskov substitution principle、Interface segregation principle、Dependency inversion principleの頭文字です。これらのコーディング原則に従えば、メンテナンスが容易な、より良いコードを作成することができます。

Unit Test Your Code

6. コードのユニットテスト

ユニットテストは、ソフトウェアを構築する際に最も重要な手法です。ユニットテストを行うことで、開発の初期段階で潜在的な問題を発見することができます。ほとんどのプロジェクトでは、ソフトウェアの複雑さと頻繁なリリースサイクルのために、手動テストだけに頼ることは不可能です。自分が書いたソフトウェアのほとんどをユニットテストする必要があります。自動ユニットテストが失敗すると、何が問題なのかすぐにわかります。

Behavior Driven Development

7. ビヘイビア駆動開発

ソフトウェア開発には時間とコストがかかることが多く、エンジニアとビジネスプロフェッショナルの間のコミュニケーションがプロジェクト進行のボトルネックになることがあります。エンジニアはビジネスがソフトウェアに何を求めているのかを誤解し、ビジネスの専門家は技術チームの能力を誤解することが多い。

BDD(Behaviour-Driven Development)とは、ソフトウェアのユーザーの行動や期待に焦点を当てた開発形態のことです。これは、ユビキタス言語でユーザーの行動を説明する例を書くことと、その例を自動テストとして使用することの2つに分けられます。これにより、開発期間中、機能性とビジネス上のシステムのビジョンが維持される。

Automated Acceptance Testing

8. 自動検収試験

受入テストとは、ソフトウェア製品がどのように動作すべきかを正式に規定したもので、使用シナリオやユースケースとして表現される。

自動化された受け入れテストは、継続的なデリバリー戦略に不可欠な要素です。開発者は、これらの自動化されたテストが合格し、スムーズに実行されていることを確認する責任を負わなければなりません。

BDDで受け入れテストを記述することで、CircleCI、Jenkins、Azure DevOpsなどのDevOpsソフトウェアで自動受け入れテストスイートを実行できるようになります

Performance Testing

9. パフォーマンステスト

パフォーマンステストとは、特定の条件下で負荷や応答時間などの特定の基準を満たすアプリケーションのパフォーマンスを調査・テストすることです。パフォーマンス・テストは、多くの場合、ソフトウェアをエンドユーザーに提供する前の最後のステップです。遅かったり、反応しなかったりするソフトウェアでは、ユーザーは満足しないでしょうから、このステップを省略しないでください。

Test-Driven Development

10. テスト駆動型の開発

テスト駆動開発(TDD)とは、ユーザーが定義したさまざまなテストを継続的かつ自動的に実行し、チームが作成しているソフトウェアの機能的な動作を理解することで、ソフトウェアの品質と市場投入までの時間を向上させる開発手法です。このプロセスは、ソフトウェア製品の開発プロセスを処理し、チームの全体的な作業プロセスを改善するのに役立つソフトウェアエンジニアリングのプラクティスの1つです。

Continuous Integration / Continuous Deployment

11. インテグレーション/継続的デプロイメント

アジャイルソフトウェア開発アプローチでは、すべてのチームメンバーがソフトウェアの変更を統合して本番にデプロイする必要があります。そして、これは少なくとも1日に2回、毎日行われます。さらに、すべてのチームメンバーが問題を追跡し、迅速に修正できるようにする必要があります。これらのプラクティスは、コーディング/コードレビューからデプロイ/テストまで、ソフトウェア開発のライフサイクル全体をカバーしています。

Software Architecture - Microservices

12. ソフトウェアアーキテクチャ-マイクロサービス

ソフトウェアをマイクロサービスの集合体として構築する傾向が強まっています。一般に、マイクロサービスは単純な構成要素であり、他の構成要素と組み合わせることで複雑なシステムを形成することができます。

マイクロサービスを使用する第一の利点は、機能を小片に分離することで得られる柔軟性にあります。そのため、モノリスを維持したくない場合には、マイクロサービスを採用することが選択肢の一つとなります。

Software Architecture - Monoliths

13. ソフトウェアアーキテクチャ-モノリス

モノリシックなアプリケーション構造は、マイクロサービスのモジュラー・アーキテクチャを必要としないアプリケーションに適したアプローチです。モノリスでは、やはり関心事の分離(Separation of Concerns: SoC)を重視することが不可欠です。主な考え方は、機能的な懸念を異なるモジュールに分離することです。マイクロサービスを正しく実行するのは難しいので、モノリスから始めて、必要に応じてマイクロサービスにリファクタリングするのがよい場合もあります。

DevOps

14. DevOps

DevOpsとは、ソフトウェア開発と運用を融合させることで、チームがアジャイル性の高い方法でプロジェクトを遂行できるようにするために、ここ数年、ソフトウェア開発分野で登場した一連の開発・運用手法です。DevOpsは、ほぼすべての作業に自動化を導入することで、ソフトウェアアプリケーションをより速く提供することを目的としています。

DevOpsはマインドセットです。このマインドセットは、製品開発プロセスに対する柔軟なアプローチを促進し、関係する様々なステークホルダーの要求、リスク、制約、顧客の要求を考慮し、期待に応えるために活動します。

Monitoring and Logging

15. モニタリングとロギング

アジャイルチームは継続的なデリバリーを重視しますが、モニタリングとロギングなしにそれを行うことは困難です。制御された環境でバグを特定し、開発チームに迅速な是正措置を取らせることができるようにしなければなりません。監視可能性は非常に重要なので、Elastic Stack、AWS CloudWatch、Azure Monitorなどの中央監視・ログシステムに投資しましょう。

Infrastructure as Code

16. コードとしてのインフラストラクチャ

Infrastructure as Code(コードとしてのインフラ)は、コードを使ってクラウド上のインフラを作成、管理、変更する機能を提供します。Terraformは、コードとしてのインフラストラクチャを管理するための代表的な技術の1つです。コードとしてのインフラストラクチャは、インフラストラクチャのセットアップを自動化することで、より一貫した機能を持つインフラストラクチャを実現するために重要です。インフラのコードは、バージョン管理システムに保存する必要があります。

Configuration Management

17. 構成管理

構成管理とは、サーバー、アプリケーション、インフラをコードとして構成することです。市場には、Ansible、Puppet、Chefなど、多くの構成管理ツールがあります。Ansible、Puppet、Chefなど、数多くの構成管理ツールが販売されており、これらの技術を使用してサーバーを構成し、データベースサーバー用ソフトウェアのインストール、サーバーへのセキュリティパッチのインストール、オペレーティングシステムのアップグレードなどの自動化タスクを指揮することができます。これらの設定はコードに格納されているため、テスト可能で再現性があります。

Cloud Computing

18. クラウドコンピューティング

開発者は、Amazon Web Service、MicrosoftのAzure、Google Cloudなどのプラットフォームや、ApacheのCloudStackやOpenStack、IBM Cloud Orchestratorなどのクラウドソリューションに精通する必要があります。従業員は、クラウド開発を最大限に活用するためのトレーニングが必要です。

DevSecOps

19. DevSecOps

安全な作成、配信、継続的なソフトウェア監視に特化したソフトウェアエンジニアリングの実践です。では、セキュリティ上の懸念を理解し、リスクベースのサイバーセキュリティ戦略を優先することで最も安全なソフトウェアを作成し、今日のソフトウェアの急速に変化する要件に素早く適応するにはどうすればよいのでしょうか。

Pen-Testing

20. ペンテスト

ペンテストとは、あなたの会社が最終的に顧客にサービスを提供するために使用するソフトウェアやハードウェアの脆弱性をテストすることです。ペンテストの目的は、現実の問題が発生する前に、システムがどのように対応するかを理解し、新しい機能や特徴を実装する際に、システムの信頼性と安全性を確保することです

Communication and Collaboration

21. コミュニケーションとコラボレーション

アジャイルなアプローチを実現するためには、コミュニケーションとコラボレーションが重要です。クロスファンクショナルなチームを持つと、チームメンバー間や個人と組織の間で効果的なコミュニケーションを確保する必要があります。コミュニケーションは、文章や、対面式の会議、音声、ビデオ、ソーシャルメディア、電話会議などのさまざまな媒体で行われます。コミュニケーションによって、チームメンバーは協力し合い、問題を理解し、問題を解決し、次に何をすべきかを知ることができます。人々は、コンセンサスに基づく文化から始まり、ピアツーピアの作業へと進み、最終的には特定のビジネスニーズに対応するための自己組織化グループへと移行します。

Software engineering practices - Conclusion

まとめ

アジャイルソフトウェア開発の手法は成熟し、アジャイルソフトウェアデリバリーが主流となっています。製品を反復して開発することで、より高い品質をより速いスピードで提供できるようになり、会社の目標をより早く達成できるようになります。

しかし、忘れてはならないのは、結果を出すのはプロセスだけではなく、プラクティスを実装して適用する人々であるということです。したがって、アジャイル開発のプラクティスから良い結果を得るためには、ビジネスチーム、技術チーム、マネジメントチームがこれらのプラクティスに完全に関与し、コミットする必要があります。

もし、まだこれらのソフトウェアエンジニアリングのプラクティスを導入していないのであれば、今こそ始める時です。

Topics: Software Engineering Practices
Hidden

あなたのソフトウェア開発を始めましょうか?


連絡