$30 off During Our Annual Pro Sale. View Details »

10年モノのAndroidアプリのコード品質を改善していく、3つの取り組み

okuzawats
November 20, 2023

 10年モノのAndroidアプリのコード品質を改善していく、3つの取り組み

コード品質向上のいろは - 先達に学ぶ実践例 Lunch LT https://findy.connpass.com/event/300912/ での発表資料です。

okuzawats

November 20, 2023
Tweet

More Decks by okuzawats

Other Decks in Programming

Transcript

  1. 10年モノのAndroid版アプリのコード品質を改善していく、3つの取り組み
    コード品質向上のいろは - 先達に学ぶ実践例 Lunch LT(2023/11/22)
    奥澤 俊樹@Chatwork株式会社

    View Slide

  2. 自己紹介
    ● 奥澤 俊樹(@okuzawats)
    ● Chatwork株式会社
    ○ 2022/09〜
    ● Androidアプリエンジニア
    ○ モバイルアプリケーションアーキテクト
    ○ Chatwork Android版アプリのアーキテクチャの改善と
    技術負債解消に取り組んでいます。

    View Slide

  3. 10年モノのAndroid版アプリのコード品質を改善していく、3つの取り組み

    View Slide

  4. 何でやるのか
    Android版アプリにコミットするチーム・メンバーが増えていく中で、コード品質が開発速度に直結し、ひいてはビジネスゴールを達成するためにコード品質を向上していくことが必要であると考えた。
    Chatwork Android版アプリは、リリースから10年が経過している。古いコードベースには、テストが書きにくく、コード品質が低いと言わざるを得ないコードも存在している。
    そのコードの上に新たな機能が追加されてしまい、コード品質が低いままアプリが育っていくループを断ち切りたい。

    View Slide

  5. コード品質向上の取り組み
    1. コードレビュー

    View Slide

  6. 結局のところ、自分が誰よりもコード品質について考えて、全部コードレビューすればいいんでしょ?

    View Slide

  7. と思っていたんですが。

    View Slide

  8. モバイルアプリ開発に関わるチーム

    View Slide

  9. モバイルアプリ開発に関わるチーム

    View Slide

  10. モバイルアプリ開発に関わるチーム

    View Slide

  11. モバイルアプリ開発のチーム構成

    View Slide

  12. コード品質向上の取り組み
    1. コードレビュー
    2. 自動レビュー

    View Slide

  13. コード品質向上の取り組み
    1. コードレビュー
    2. 自動レビュー
    a. Danger:各種linterの警告をPRにコメントさせる他、BIG PRに警告
    b. ktlint:Kotlin用のlinter
    c. android lint:Androidのlinter
    d. SonarCloud:コード品質の自動レビュー

    View Slide

  14. SonarCloud

    View Slide

  15. SonarCloudとは?
    - コード品質について自動レビューを行い、継続的インスペクションを実現するため
    のプラットフォーム。
    - SonarSource社の製品。
    - SonarLint™: IDE integrated
    - SonarQube™: self managed
    - SonarCloud™: as a service
    - publicリポジトリでは無料で使える。privateリポジトリではコード規模に応じて支払いが必要。
    - 支払いの問題が済めば、有効化は簡単。

    View Slide

  16. SonarCloudで計測できるメトリクス(例)
    「コードの不吉な匂い」の検出

    View Slide

  17. Quality Gate
    ※各メトリクスについて基準を設定し、基準を満たさない時、CIを失敗させることもできる。
    ※”Sonar way”と呼ばれるデフォルトのルールがある他、自分でルールを定義できる。

    View Slide

  18. 複雑度に関するメトリクス
    以下のURLからWhite Paperを入手できます。
    https://www.sonarsource.com/resources/cognitive-complexity/
    ※認知的複雑度はSonarSource社が提唱している複雑度のメトリクス
    循環的複雑度(Cyclomatic Complexity、Thomas J. McCabe)、認知的複雑度
    (Cognitive Complexity、SonarSource)を算出してくれる。

    View Slide

  19. コード品質向上の取り組み
    1. コードレビュー
    2. 自動レビュー
    3. 勉強会の開催

    View Slide

  20. コード品質向上の取り組み
    1. コードレビュー
    2. 自動レビュー
    3. 勉強会の開催
    a. 石川宗寿, (2022), “読みやすいコードのガイドライン 持続的なソフトウェア開発のために”, 技術評論社

    View Slide

  21. 勉強会の開催
    「読みやすいコードのガイドライン」の著者・石川宗寿さんをお招きして、コードの読
    みやすさについての勉強会を開催しました - Chatwork Creator's Note
    https://creators-note.chatwork.com/entry/code-readability
    コード品質の中でも「可読性」に焦点を当て、モバイルアプリ(特にAndroid)の開発に関わるエンジニアを集めて勉強会を開催した。
    開発生産性を維持・向上していくために、コードの可読性が大切であるという認識を持ち、具体的にはどのようなコードを書けば可読性が向上するのかを学んだ。

    View Slide

  22. コード品質向上の取り組み
    1. コードレビュー
    2. 自動レビュー
    3. 勉強会の開催
    4. コーディングガイドラインの作成

    View Slide

  23. コード品質向上の取り組み
    1. コードレビュー
    2. 自動レビュー
    3. 勉強会の開催
    4. コーディングガイドラインの作成
    a. コーディングガイドラインが存在せず、既存コードのスタイルも統一されていないため、作成に着手

    View Slide

  24. スタイルガイド
    KotlinのCoding conventions、AndroidのKotlin style guideを参考に
    しつつ、ストリームアラインドチームの多様なバックグラウンドのメンバーにもコードを読みやすく、書きやすいガイドラインを目指して作成中(WIP)

    View Slide

  25. スタイルガイドの例
    Kotlinは
    fun a(): Int = 42
    のように、関数本体を直接返すことができる。Kotlin Coding conventionsでも、関数が単一式から構成される場合は関数ブロック {} を省略する書き方がGoodであるとしている。自分もこの書き方がスッキリしていて好み。だけど、
    fun a(): Int {
    return 42
    }
    というように関数ブロックを省略しない書き方に統一した方が、ストリームアラインド
    チームの学習コストが少なく済むのではないか?という仮説。

    View Slide

  26. スタイルガイドの例
    Kotlinの言語機能に存在するスコープ関数の乱用を避けよう、ということもproposalで
    出している。Kotlinに習熟していれば何をやっているのかわかるけど、そうでなければ
    コードを読むのに時間がかかってしまうのではないか?という仮説。
    foo?.run {
    it.also {
    setFoo(!foo)
    }
    }
    a?.let {
    bar()
    } ?: {
    baz()
    }
    こういうのとか こういうのとか

    View Slide

  27. ストリームアラインドチームのメンバーからのフィードバック
    「スタイルガイドがあるのも嬉しいが、それよりもPRにlinterがスタイルガイドに沿ったコメントつけてくれるのが一番嬉しい」

    それはそうだなと思うので、linterファースト、つまりlinterが指摘できることを重視してスタイルガイドを再検討する。
    前述したSonarCloudを使うことでコードの複雑度などのメトリクス計測をCIに組み込め
    るので、linterと併用することでコードを読みやすくするという目的が達成できるかもしれない。

    View Slide

  28. まとめ

    View Slide

  29. まとめ
    - ひとつのリポジトリにコミットするチーム・メンバーが増えたことにより、ビジネスゴールを達成するためにコード品質がより重要になった。
    - コードレビューに頼ってコード品質を向上しようとすると、開発が阻害されることがある。
    - SonarCloudを用いた自動レビューを活用して、コード品質のメトリクスを分析する。
    - コード品質の中でも可読性に焦点を当て、勉強会を開催して可読性を向上させるコードの書き方を学んだ。
    - 多様なバックグラウンドのメンバーがコミットしやすくなるようなコーディングガ
    イドラインを考えている(WIP)。
    - We Are Hiring! カジュアル面談で待ってます!

    View Slide

  30. 参考文献
    - SonarCloud, https://www.sonarsource.com/products/sonarcloud/ (最終アクセス日:2023/11/07)
    - 「読みやすいコードのガイドライン」の著者・石川宗寿さんをお招きして、コードの読みやすさについての勉強会を開催しました - Chatwork Creator's Note,
    https://creators-note.chatwork.com/entry/code-readability (最終アクセス日:2023/11/07)
    - 石川宗寿, (2022), “読みやすいコードのガイドライン 持続的なソフトウェア開発のために”, 技術評論社
    - Kotlin Coding conventions,
    https://kotlinlang.org/docs/coding-conventions.html (最終アクセス日:2023/11/07)
    - Kotlin スタイルガイド,
    https://developer.android.com/kotlin/style-guide?hl=ja (最終アクセス日:2023/11/07)

    View Slide