https://d226lax1qjow5r.cloudfront.net/blog/blogposts/improve-your-software-project-part-one-understanding-a-codebase/making-projects-better_part-one.png

ソフトウェア・プロジェクトの改善 - パート1:コードベースを理解する

最終更新日 November 15, 2022

所要時間:1 分

コードベースを引き継いだとき、コードの書き方や構成に不満があることに気づいたことはないだろうか?よくある話だが、多くの頭痛の種を引き起こす可能性がある。技術的負債は雪だるま式に増えていき、コードを理解したり新しい機能を追加したりするのが飛躍的に難しくなります。

この3部構成のシリーズでは、ピカピカの(古い)プロジェクトをよりハッピーにするためにやっておきたい重要なことを紹介していく。具体的な例をいくつか挙げると、オープンソースの Vonage Python SDKVonageのAPIにHTTPコールをするライブラリだが、原理はどんな種類のソフトウェアプロジェクトにも当てはまる。

この記事の例はPythonで書かれていますが、これらの原則はどの言語のプロジェクトにも当てはまります。また 便利なチェックリストもあります。

シリーズ各セクション

  1. パート1:コードベースを理解する(この記事です)

  2. パート2:変更を加える

  3. パート3次のレベルの強化

このシリーズは何を扱っているのか?

このシリーズでは、以下について話す:

  1. コードを理解する

  2. 自信を持って変更を加え、技術的負債に対処できるようになる

  3. 上司、チーム、顧客、地域社会との信頼関係を築く

  4. 機能強化

  5. プロジェクト引渡しの時にすべきこと

各記事が終わるころには、あなた自身がこの状況に対処するためのいくつかの戦略を手に入れ、そうするための力が湧いてくることだろう!

前置きはこれくらいにして、さっそく前編を始めよう......。

パート1:プロジェクトを理解する

スタッフを読む!

最初にすべきことは、受け継いだコードが何をしているのか、どのように構成されているのかを理解することだ。

そのプロジェクトに詳しい人に話を聞いたり、利用可能なドキュメントを読んだりすることから始めよう。私の場合、レポにreadmeがあり、それが出発点となった。それは、最後に更新されたときのコードの状態の良いスナップショットを提供した。

Image of readme

また、私が呼び出す必要があるAPIとその現在の動作が記述されているため、コードが現在何をすることが期待されているのかを理解するのに役立った。

Image of main docs page

ものを作る!

コードが何をするのかがわかったら、次のステップは、ある種の "Hello, World "プロジェクト、つまりコードを使い、小さいけれど何か役に立つことをする簡単なプロジェクトを作ることで、コードを探求することだ。私のプロジェクトはAPIを呼び出すので、SMSを送信するとてもシンプルなコードを書いた。

import vonage


client = vonage.Client(key=MY_KEY, secret=MY_SECRET)

client.sms.send_message({
    "from": "Max",
    "to": MY_NUMBER,
    "text": "Hello, world!",
})

うまくいった!

Screenshot of my phone with a new message

コードベースで遊んで、自分だけの "Hello, World "を作ってみよう。

コードの構造を理解する

プロジェクトのコードがどのように構成されているかを理解することは、「Hello, World」の実行時に何が起こっているかをより簡単に概念化できるようにするために重要である。また、コードがどのように動作するかのメンタルモデルを開発する必要があるため、これはアーキテクチャー思考スキルを練習するのに最適な方法です。このような考え方は、プロジェクトを理解しやすい明確な部分に分割するのに役立ち、後でコードの結合やその他の副作用を減らしたいときにも役立ちます。

私たちのSDKの場合、コードは6つの別々のファイルに整理され(Pythonは非常にコンパクトな言語であり、同等のJavaコードベースは約10倍大きい!)、以下のようになる:

  • プロジェクトを初期化し、インポートを処理するためのファイル、

  • 内部メソッドを保持するファイル、

  • カスタム・エラー・クラスを保持するファイル

  • VonageのAPIのひとつに関連するクラスを持つ3つのファイル。

Image showing the different files with the descriptions above applied to them

VonageのAPIにちなんだファイルが3つあることに気づき、警鐘が鳴り始めたが、READMEには12種類のAPIがサポートされていると書かれていた。

私は、コードのほとんどが、通常インポートだけに使われるファイル(__init__.py)にあることに気づいた。これではコードの構造を理解する助けにならないので、コードがどのように構成されているかを知るために、テストの構造を見てみることにした。

テストはモジュールごとに適切にグループ化されており、さまざまなコンポーネントを理解するのに役立った。コードとテストの両方の構造を理解することをお勧めする。

Screenshot of the tests folder

開発をセットアップし、テストを実行する!

さて、いよいよプロジェクトの依存関係をインストールしてテストを実行しよう。言語と依存関係の最新バージョンを使ってテストに合格したら、素晴らしいニュースだ!私の場合はそうでなかったので、言及されている依存関係の正確なバージョンから始めて、自分のコーディング言語の最新バージョンとうまくいっていない依存関係を見つけるために、依存関係を少しずつアップグレードしていった。

このような場合、依存関係を少しずつアップグレードしていけば、問題が明らかになるはずです。依存関係のひとつに、コードベースが最後に使われたときから変更を加えたリリースがあった可能性があります。(私の場合、ある依存関係がバージョン間でデータを返す方法を変更したため、データを適切に扱うためにいくつかのテストを書き直さなければなりませんでした)。

ツール

このセクションでは、プロジェクトのスピードアップのためにツールを使う方法をいくつか挙げる。コード解析ツールの使用は、自動化できるので、非常に便利です。つまり、好きな頻度でツールを実行し、コードベースを改善し始めたときの進捗を追跡できます。

ツールの洞察は、技術的負債やコードのホットスポットを教えてくれ、どのように時間の優先順位をつける必要があるかを示唆してくれるからだ!

分析ツール

静的解析は、ソースコードを実際に実行することなく、自動的に解析する方法である。コードベースの構造を把握し、重複やその他のリファクタリングの対象を強調したり、潜在的な脆弱性について警告したりすることができる。ほとんどの言語で利用可能な無料のツールがオンラインで提供されており、サービスに課金するプロバイダーの多くは、非商用またはオープンソースプロジェクト向けに無料の階層を用意している。 sonarcloud.

行動分析とは、コミット履歴に基づいてプロジェクトについて学習することです。これによって、誰がいつプロジェクトで作業したのか、何が変更されたのか、どのコンポーネントがよく一緒に変更されるのか、その他多くの洞察を得ることができます。これは、多くのコミッターがいる大規模なプロジェクトで本当に役立つ方法です。 CodeSceneにはオープンソース・プロジェクト向けのフリー・ティアがあり、うまく機能している。

テストカバレッジ

テストカバレッジ(テストがカバーしているコード文の割合)は、単体テストが何をテストしているかを正確に調べるのに便利です。また、コードベースでテストされていない部分を強調することもできます。ほとんどの言語でツールが利用できます。 カバレッジ.

Image of test coverage outputs

変異スコア

テストカバレッジは、コードのどれだけの部分をテストがカバーしているかを示すものですが、 そのテストがコードの振る舞いを実際にテストする上でどれだけ優れているかを示すものではありません!Mutation テストは、テストがその役割を果たし、コードが意図したとおりに動作することをどれだけ信頼できるかについて、より深い洞察を与えてくれます。

例えば、文字列を変更したり、プラスをマイナスに変更したりといった具合です。テスト・スイートは、これらの変異バージョンのコードそれぞれに対して実行されます。物事が変わったので、テストは失敗すると予想されます。しかし、このような変更があったにもかかわらずテストがパスした場合、変異体は逃げ出し、このような小さな変更が本番環境に入った可能性があります!したがって 変異スコア(発生した総数に対する捕まえた変異体の割合) は、テストにどれだけの信頼を置くべきかを教えてくれます。

これには多くの言語版がある。 ストライカーJavascript、Node.js、C#をサポートしている。Pythonでは mutmutを試してみることをお勧めする。

Image of mutation score output

サンプルをプロファイリングしてコールスタックを理解する!

私は、"Hello, World "の実行時に発生する呼び出しのスタックを理解することをお勧めする。たいていの言語には、これを行うためのツールがある。

Pythonでは、次のようなツールをお勧めします。 Snakevizというツールをお勧めしたい。Hello,World "のコードを関数に入れ、次のようにプロファイリングする:

with cProfile.Profile() as pr:
    send_sms() # This function is where the Hello, World code lives
stats = pstats.Stats(pr)
stats.dump_stats(filename='send_sms.prof')

というファイルが生成される。 send_sms.prof.これをSnakevizのコマンドラインで実行すると...

python -m pip install snakeviz snakeviz send_sms.prof

...その関数が呼び出すすべての関数、その関数が呼び出すすべての関数、その関数が呼び出すすべての関数、その関数が呼び出すすべての関数を表示するインタラクティブなつららプロットを生成します。 関数などを表示します。これは、コードを通してコンピュータの経路をたどるのに役立ち、どのように動作するかに光を当てることができます。

Image of an icicle plot of my profiled function

次はどうする?

この記事の提案に従えば、信頼を築き、技術的負債に取り組み、コードベースに変更を加えるための絶好のポジションに立つことができるだろう。パート2では、これらすべてについて詳しくお話しします。

それまでの間、私たちの VonageコミュニティSlackまたは ツイッター.

シェア:

https://a.storyblok.com/f/270183/400x400/92109caf6a/max-kahan.png
Max KahanVonage 元チームメンバー

マックスはPythonデベロッパー・アドボケイトであり、通信API、機械学習、デベロッパー・エクスペリエンス、ダンスに興味を持つソフトウェア・エンジニアだ!物理学を専攻していたが、現在はオープンソースのプロジェクトに携わり、開発者の生活をより良くするためのものを作っている。