SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
どうしてコードはレガシーになるのか
~あるAndroidアプリのレガシー脱出記~
株式会社Diverse・株式会社ミクシィ 菊池
About me
@kikuchy (菊池紘)
株式会社ミクシィ‑(出向)‑> 株式会社Diverse
Androidアプリ開発がメイン
Androidオールスターズ2などで登壇しました
結論
レガシーコードとは何か
当たり前のことを当たり前にできなくさせるコード
‑> レガシーコード
なぜコードはレガシーになってしまうのか?
人間が当たり前のことをやらない
‑> レガシーを生む
本題
デーティングサービスYYCとは
男女の出会いの機会を提供しています
累計会員数1000万人以上
この前16周年でした
YYC Android
YYCのAndroidアプリ
ひと月で1.7万人以上の方にご利用いただいています
(エンジニア視点での)特徴
JavaとKotlinのハイブリット
RxJavaを全面的に使用
リニューアル
2016年初旬にフルスクラッチでリニューアルしました
劇的ビフォーアフター
旧 新
ファイル数 370 (Java) 738 (Java+ Kotlin)
平均行数 306 77 / 72 (Java/ Kotlin)
最長ファイルの行数 4535 1275 / 462 (Java/ Kotlin)
最長ファイルの種別 Activity View (1275行のファイル)
コードの見通しがよくなりました✧\ ۹( 'ω' )‫ﻭ‬ //✧
旧 新
Clashrytics (直近30日のデータから)
撮影時点でのDAU 963 7343
クラッシュも少なくなりました₍₍ ᕕ(´ ω` *)ᕗ⁾⁾
横たわるレガシーコード
最長4535行のActivity
全体的にコピペ
inner classから外のクラスへ参照もちまくり
 org.apache.http に密結合でSDKのアップデートができず
ローカル変数で良いものまで全部クラスフィールド
フィールドへ再代入しまくりで、どれがどのタイミングで変更され
るのか
コンストラクタの中で自クラスのインスタンスを作って何もしない
etc...
コンストラクタの中で自クラスのインスタンスを作って何もしない図
class Hoge {
    public Hoge(String param) { ... }
    public Hoge() {
        // 誤
        new Hoge("default");
        
        // 正
        // this("default");
    }
}
結果
高すぎるメンテナンスコスト
不安定、低評価
読めない・生理的に読みたくない
‑> そしてフルスクラッチでのリニューアル断行へ
二の轍は踏むまい
(´;ω;` )
なぜこのコードはレガシーになったのか
イケてないポイント
最長4535行のActivity
全体的にコピペ
inner classから外のクラスへ参照もちまくり
 org.apache.http に密結合でSDKのアップデートができず
ローカル変数で良いものまで全部クラスフィールド
フィールドへ再代入しまくりで、どれがどのタイミングで変更され
るのか
コンストラクタの中で自クラスのインスタンスを作って何もしない
原因と結果
1. 設計方針が不明瞭
2. 密結合
3. 力量不足& セーフティネットの欠如
1. 設計方針が不明瞭
前任者不在& 設計に関するドキュメント皆無
「この後どう書けばよいのか」後任にはっきりと伝わらない
そもそもAPI以外ほぼ全部がActivityに直書きされていた
後任もそこに書けばいいと思ってしまう(思ってしまった)
割れ窓理論
その結果がこれだよ
最長4535行のActivity
全体的にコピペ
2. 密結合
設計方針が不明瞭であることも密結合になる原因の一つ
長大なコードがべた書きされている
修正にとても時間がかかる
そもそもモジュール化されていない
時間がかかりすぎるのでリファクタリングは断念された
古いコードを使い続けざるを得ない
更にべた書きのコードが増える
以下ループ
その結果がこれだよ
inner classから外のクラスへ参照もちまくり
 org.apache.http に密結合でSDKのアップデートができず
3. 力量不足& セーフティネットの欠如
まずい書き方をする人が居て、それを止める仕組みがなかった
コードレビュー文化がない時代に書かれていた
コーディング規約もなかった
噂によると初期開発者のレベルはかなり低かったらしい
その結果がこれだよ
ローカル変数で良いものまで全部クラスフィールド
フィールドへ再代入しまくりで、どれがどのタイミングで変更
されるのか読めない
コンストラクタの中で自クラスのインスタンスを作って何もし
ない
そして対策
1. 設計方針が不明瞭
‑> 設計とドキュメント
2. 密結合
‑> モジュール化
3. 力量不足& セーフティネットの欠如
‑> コードレビュー実施& コーディング規約整備
設計とドキュメント
設計方針はCleanArchitectureとMVPの間の子
依存は一方向に
重視する原則や歴史的経緯をWikiに
クラス説明などはJavaDocコメントに
作った本人も、どんなものだったか忘れる
思い出せるので仕事が早い
モジュール化
普通にJavaらしくクラスを使う
ちゃんと役割分担する
情報源
情報の表示
仕様の実行
『何でもActivity (Controller)に書かない』と気をつけるだけでも違
う
処理の抽象度を高めることで、本質的なことだけ考えられる
コードレビュー実施& コーディング規約整備
gitlabのMergeRequest使用
チームを跨いでのレビュー
弊社サービスpoiboyのAndroidメンバーと相互レビュー
全員のレベルアップ+モチベーションアップ
規約を整備
AOSPとクックパッドさんのJavaコーディング規約をベースに
改変しながら
Kotlinの規約も用意
考えないといけないことが減って楽に
当たり前じゃないか?
当たり前のことを当たり前にできなくさせる
コード
‑> レガシーコード
人間が当たり前のことをやらない
‑> レガシーを生む
当たり前のことを当たり前に
やっていきましょう
まとめ
当たり前のことをしないとレガシーコードが湧く
当たり前のことをするための環境整備をすべし
よいエンジニアライフを満喫しましょう!
✧\ ۹( 'ω' )‫ﻭ‬ //✧

Mais conteúdo relacionado

Destaque

Destaque (20)

Poiboy for android 〜激短(1ヶ月)制作フローと気づき〜
Poiboy for android 〜激短(1ヶ月)制作フローと気づき〜Poiboy for android 〜激短(1ヶ月)制作フローと気づき〜
Poiboy for android 〜激短(1ヶ月)制作フローと気づき〜
 
開発チームにKotlinを導入した話
開発チームにKotlinを導入した話開発チームにKotlinを導入した話
開発チームにKotlinを導入した話
 
OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料
 
Androidの世界を離れて異文化留学してみた
Androidの世界を離れて異文化留学してみたAndroidの世界を離れて異文化留学してみた
Androidの世界を離れて異文化留学してみた
 
SimpleとEasyの選択
SimpleとEasyの選択SimpleとEasyの選択
SimpleとEasyの選択
 
Android - Background operation
Android - Background operationAndroid - Background operation
Android - Background operation
 
Intel EdisonでAndroid Things Lチカ?その後は?
Intel EdisonでAndroid Things Lチカ?その後は?Intel EdisonでAndroid Things Lチカ?その後は?
Intel EdisonでAndroid Things Lチカ?その後は?
 
Android Things play in Xamarin World.
Android Things play in Xamarin World.Android Things play in Xamarin World.
Android Things play in Xamarin World.
 
An Overview of Android Things at jag201702
An Overview of Android Things at jag201702An Overview of Android Things at jag201702
An Overview of Android Things at jag201702
 
LINE TW PARTY 2017_DEC_Smart Portal
LINE TW PARTY 2017_DEC_Smart PortalLINE TW PARTY 2017_DEC_Smart Portal
LINE TW PARTY 2017_DEC_Smart Portal
 
3分で作る Kotlin Friendly な API
3分で作る Kotlin Friendly な API3分で作る Kotlin Friendly な API
3分で作る Kotlin Friendly な API
 
Android things intro
Android things introAndroid things intro
Android things intro
 
Diverse会社概要
Diverse会社概要Diverse会社概要
Diverse会社概要
 
Image Object Detection Pipeline
Image Object Detection PipelineImage Object Detection Pipeline
Image Object Detection Pipeline
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for android
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 
アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術 アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術
 
Android Things, Alexey Rybakov, Technical Evangelist, DataArt
Android Things, Alexey Rybakov, Technical Evangelist, DataArtAndroid Things, Alexey Rybakov, Technical Evangelist, DataArt
Android Things, Alexey Rybakov, Technical Evangelist, DataArt
 
なるべくコードを書かないAndroid開発
なるべくコードを書かないAndroid開発なるべくコードを書かないAndroid開発
なるべくコードを書かないAndroid開発
 
アメブロの大規模システム刷新と それを支えるSpring
アメブロの大規模システム刷新と それを支えるSpringアメブロの大規模システム刷新と それを支えるSpring
アメブロの大規模システム刷新と それを支えるSpring
 

Semelhante a どうしてコードはレガシーになるのか

香川支部キックオフ 香川支部について
香川支部キックオフ 香川支部について香川支部キックオフ 香川支部について
香川支部キックオフ 香川支部について
yohei iwakura
 
Smart Phone Reward & Social Game
Smart Phone Reward & Social GameSmart Phone Reward & Social Game
Smart Phone Reward & Social Game
Nobuyoshi Noda
 
パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」
パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」
パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」
naoki ando
 
アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜
アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜
アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜
Daiki Kawanuma
 

Semelhante a どうしてコードはレガシーになるのか (20)

香川支部キックオフ 香川支部について
香川支部キックオフ 香川支部について香川支部キックオフ 香川支部について
香川支部キックオフ 香川支部について
 
アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~
アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~ アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~
アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~
 
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンスHTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
 
スマートフォン最新利用動向とSeesaaのアプリ開発
スマートフォン最新利用動向とSeesaaのアプリ開発スマートフォン最新利用動向とSeesaaのアプリ開発
スマートフォン最新利用動向とSeesaaのアプリ開発
 
アンドロイド勉強会第二回 080525 3
アンドロイド勉強会第二回  080525 3アンドロイド勉強会第二回  080525 3
アンドロイド勉強会第二回 080525 3
 
Boundio slideshare
Boundio slideshareBoundio slideshare
Boundio slideshare
 
Smart Phone Reward & Social Game
Smart Phone Reward & Social GameSmart Phone Reward & Social Game
Smart Phone Reward & Social Game
 
[ABC2016S]Android Wear アプリ開発入門
[ABC2016S]Android Wear アプリ開発入門[ABC2016S]Android Wear アプリ開発入門
[ABC2016S]Android Wear アプリ開発入門
 
OpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクルOpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクル
 
みんなの個性を見守る地域コミュニティ的プログラミングクラブ
みんなの個性を見守る地域コミュニティ的プログラミングクラブみんなの個性を見守る地域コミュニティ的プログラミングクラブ
みんなの個性を見守る地域コミュニティ的プログラミングクラブ
 
インモビ 概要
インモビ 概要インモビ 概要
インモビ 概要
 
Devsumi2013 15-C-1 実践!スマホアプリのマネタイズ!! ~マーケット把握術と iPhone&Androidプログラミングテクニック~
Devsumi2013 15-C-1 実践!スマホアプリのマネタイズ!! ~マーケット把握術と iPhone&Androidプログラミングテクニック~Devsumi2013 15-C-1 実践!スマホアプリのマネタイズ!! ~マーケット把握術と iPhone&Androidプログラミングテクニック~
Devsumi2013 15-C-1 実践!スマホアプリのマネタイズ!! ~マーケット把握術と iPhone&Androidプログラミングテクニック~
 
パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」
パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」
パソナテック Find Your Ability 講演資料 「ディレクターにとってのWeb業界って? 」
 
アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜
アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜
アプリケーション・デベロッパー 〜Xamarinによるクロスプラットフォーム開発〜
 
OpenID Connect のビジネスチャンス
OpenID Connect のビジネスチャンスOpenID Connect のビジネスチャンス
OpenID Connect のビジネスチャンス
 
『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説
『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説
『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説
 
アドネットワーク凛 媒体資料
アドネットワーク凛 媒体資料アドネットワーク凛 媒体資料
アドネットワーク凛 媒体資料
 
スマートコンバートセミナー資料 - 201209
スマートコンバートセミナー資料 - 201209スマートコンバートセミナー資料 - 201209
スマートコンバートセミナー資料 - 201209
 
【16-D-1】UI のこれまでの10年とこれから
【16-D-1】UI のこれまでの10年とこれから【16-D-1】UI のこれまでの10年とこれから
【16-D-1】UI のこれまでの10年とこれから
 
Cordova を使って本気で商用ハイブリッドアプリ開発をやってみた
Cordova を使って本気で商用ハイブリッドアプリ開発をやってみたCordova を使って本気で商用ハイブリッドアプリ開発をやってみた
Cordova を使って本気で商用ハイブリッドアプリ開発をやってみた
 

Mais de Hiroshi Kikuchi

Mais de Hiroshi Kikuchi (11)

Android Developer Toolsのバグを見つけて直してもらった話
Android Developer Toolsのバグを見つけて直してもらった話Android Developer Toolsのバグを見つけて直してもらった話
Android Developer Toolsのバグを見つけて直してもらった話
 
今更聞けない? Androidのテストのいろは
今更聞けない? Androidのテストのいろは今更聞けない? Androidのテストのいろは
今更聞けない? Androidのテストのいろは
 
新規Androidアプリ開発において何より大切なこと
新規Androidアプリ開発において何より大切なこと新規Androidアプリ開発において何より大切なこと
新規Androidアプリ開発において何より大切なこと
 
モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選
モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選
モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選
 
JUnit5とAndroidのテスト
JUnit5とAndroidのテストJUnit5とAndroidのテスト
JUnit5とAndroidのテスト
 
KotlinJSって正直どうなん
KotlinJSって正直どうなんKotlinJSって正直どうなん
KotlinJSって正直どうなん
 
画面状態を抽象化してテスタブル設計ライフを送ろう
画面状態を抽象化してテスタブル設計ライフを送ろう画面状態を抽象化してテスタブル設計ライフを送ろう
画面状態を抽象化してテスタブル設計ライフを送ろう
 
テストコードをアプリケーションコードと同じ階層に置きたい
テストコードをアプリケーションコードと同じ階層に置きたいテストコードをアプリケーションコードと同じ階層に置きたい
テストコードをアプリケーションコードと同じ階層に置きたい
 
Designing Auto Generated Codes
Designing Auto Generated CodesDesigning Auto Generated Codes
Designing Auto Generated Codes
 
C#でiPhone & Androidアプリ!
C#でiPhone & Androidアプリ!C#でiPhone & Androidアプリ!
C#でiPhone & Androidアプリ!
 
Ideatter : Tech-on2011決勝でのプレゼン資料
Ideatter : Tech-on2011決勝でのプレゼン資料Ideatter : Tech-on2011決勝でのプレゼン資料
Ideatter : Tech-on2011決勝でのプレゼン資料
 

どうしてコードはレガシーになるのか