Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

良いソフトウェアとコードレビュー / Good software and code review

良いソフトウェアとコードレビュー / Good software and code review

AGAWA Koji

January 29, 2024
Tweet

More Decks by AGAWA Koji

Other Decks in Programming

Transcript

  1. 命名規則の一貫性 #include <stdio.h> int d; // グローバル変数 void f(int a)

    { int b = 5; d = a + b; } int main() { int n = 10; f(n); printf("%d\n", d); return 0; } 悪い例 #include <stdio.h> int totalSum; // グローバル変数の使用を避けるべきだ が、明確な名前を使用 void addAndStore(int number) { int baseValue = 5; totalSum = number + baseValue; } int main() { int inputValue = 10; addAndStore(inputValue); printf("Total Sum: %d\n", totalSum); return 0; } 良い例
  2. コードの構造化 #include <stdio.h> int main() { int x=0,y=0,z=0; printf("Enter two

    numbers:\n"); scanf("%d %d",&x,&y); z=x+y;printf("Sum is: %d\n",z); if(z > 10){ printf("Sum is greater than 10.\n"); }else{ printf("Sum is not greater than 10.\n"); } return 0; } 悪い例 #include <stdio.h> int readNumber(const char* prompt) { int num; printf("%s", prompt); scanf("%d", &num); return num; } int calculateSum(int a, int b) { return a + b; } void printResult(int sum) { printf("Sum is: %d\n", sum); if (sum > 10) { printf("Sum is greater than 10.\n"); } else { printf("Sum is not greater than 10.\n"); } } int main() { int x = readNumber("Enter first number: "); int y = readNumber("Enter second number: "); int z = calculateSum(x, y); printResult(z); return 0; } 良い例
  3. 適切なコメントの使用 #include <stdio.h> int main() { // 変数iを宣言して0に初期化 int i

    = 0; // 10未満の間、ループを繰り返す for(i = 0; i < 10; i++) { // iの値を出力 printf("%d\n", i); } // プログラムの終了 return 0; } 悪い例 #include <stdio.h> int main() { // 0から9までの数を出力する for(int i = 0; i < 10; i++) { printf("%d\n", i); } return 0; } 良い例
  4. リファクタリング #include <stdio.h> int main() { int x = 5,

    y = 10; int sum = x + y; printf("Sum of x and y is: %d\n", sum); int a = 15, b = 20; sum = a + b; printf("Sum of a and b is: %d\n", sum); // さらに別の変数の和を計算し表示する処理が続く... return 0; } 悪い例 #include <stdio.h> int calculateSum(int num1, int num2) { return num1 + num2; } void printSum(int num1, int num2) { int sum = calculateSum(num1, num2); printf("Sum of %d and %d is: %d\n", num1, num2, sum); } int main() { printSum(5, 10); printSum(15, 20); // 他の数値の和を計算し表示する処理も簡単に追加できる return 0; } 良い例
  5. ドキュメンテーション #include <stdio.h> // 処理を行う関数 void process(int a, int b)

    { printf("%d\n", a + b); } int main() { int x = 5, y = 10; process(x, y); // xとyを処理する return 0; } 悪い例 #include <stdio.h> /** * 二つの整数の和を計算し、結果を表示する関数 * @param a 最初の整数 * @param b 二番目の整数 */ void printSum(int a, int b) { printf("The sum of %d and %d is: %d\n", a, b, a + b); } int main() { int firstNumber = 5, secondNumber = 10; printSum(firstNumber, secondNumber); // 二つの数の和を表 示 return 0; } 良い例
  6. 例:マイクロサービスアーキテクチャ • 独立性: 各マイクロサービスは他のサービスから独立しており、独自のデータベースとビジネスロジックを持つ ことができる。これにより、サービス間の結合が緩くなり、一つのサービスを変更・更新しても他のサービスに影 響を与えるリスクが低減する。 • スケーラビリティ: 各マイクロサービスは個別にスケールアップまたはスケールダウン可能である。需要が高い サービスだけをスケールすることで、リソースを効率的に使用できる。

    • 柔軟な技術スタック: 異なるマイクロサービスは異なる技術スタックで開発されることが可能である。これによ り、最適なツールや言語をサービスごとに選択でき、イノベーションと適応性が向上する。 • 容易なデプロイメントとメンテナンス: 小規模なサービスはデプロイやアップデートが容易で、システム全体を停 止することなくメンテナンスを行える。 • 障害の局所化: 一つのサービスで問題が発生しても、他のサービスには影響が及びにくく、システム全体の安 定性が保たれる。
  7. 例:Design Doc • 概要 ◦ プロジェクトの目的や背景。解決しようとしている問題または達成しようとしている目標。 • スコープ ▪ ドキュメントが対象とする範囲。何を含め、何を含めないかについての明確な説明。

    • 既存のシステムとの比較 ▪ 既存のシステムや解決策との比較。新しい設計がどのように異なるか、または改善するか。 • 設計の詳細 ▪ アーキテクチャ、データフロー、コンポーネント、インターフェースの詳細。使用する技術やアルゴリズム。 • リスクとトレードオフ ▪ 設計のリスクや潜在的な問題点。トレードオフや妥協点に関する考慮事項。 • 実装計画 ▪ 開発のフェーズやマイルストーン。タスクの割り当てやタイムライン。 • テスト戦略 ▪ システムのテスト方法。パフォーマンス、セキュリティ、ユーザビリティのテスト計画。 • スケーラビリティとパフォーマンス ▪ システムのスケーラビリティに関する計画と戦略。パフォーマンス目標と基準。 • 保守とサポート ▪ システムの長期的な保守計画。サポート体制や文書のアップデート方針。
  8. 戦略的コードレビュー 戦略的コードレビューは、より大きな視野でコードとその開発プロセスを見ることに焦点を当てる。 • プロジェクトの目標と整合性: コードがプロジェクトの長期的な目標やビジョンに合致しているかどうか を評価する • アーキテクチャとデザイン: システムの全体的な構造やデザインパターンが適切かどうかを検討する •

    保守性とスケーラビリティ: 長期的な視点で、コードの保守性や将来の拡張性を評価する • パフォーマンスとセキュリティ: システム全体のパフォーマンスとセキュリティの側面を考慮する • 技術的負債の管理: コード内の技術的負債を特定し、その対処計画を立てる
  9. 戦術的コードレビュー 戦術的コードレビューは、より具体的な技術的詳細に焦点を当て、個々のコードの品質と機能性 を評価する。 • コーディング規約の遵守: コーディングスタイルと規約が遵守されているかどうかをチェックす る • バグの検出: ロジックエラーや潜在的なバグを特定し、修正する

    • コードの明瞭さと簡潔さ: コードが明瞭で理解しやすく、無駄がないかを評価する • テストの充実: 十分なユニットテストや統合テストが行われているかを確認する • 機能性と要件の適合: 提出されたコードが機能的に要件を満たしているかを検証する