Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
新規チームで新規開発を始める時にやること
Search
Shinnosuke Kugimiya
March 27, 2019
Programming
26
4.1k
新規チームで新規開発を始める時にやること
DMM Android勉強会で発表した内容です
Shinnosuke Kugimiya
March 27, 2019
Tweet
Share
More Decks by Shinnosuke Kugimiya
See All by Shinnosuke Kugimiya
UIテストはもうMaestroでいいのかもしれない話
kgmyshin
11
12k
新規開発を始めるときにやるべきこと
kgmyshin
17
8.4k
android app error handling
kgmyshin
1
1.3k
solid+cqs+dry
kgmyshin
35
9.5k
Paging Library ~ アイテムの更新 ~
kgmyshin
2
3.1k
KotlinでReact Native(expo) を使いたい
kgmyshin
2
1k
android-multi-module-with-dagger
kgmyshin
10
5.6k
kotlin linter
kgmyshin
12
14k
BLoC
kgmyshin
9
1.4k
Other Decks in Programming
See All in Programming
Rails と人魚の話/rails-and-mermaid
sanfrecce_osaka
0
100
PHPの次期バージョンはこの時期どうなっているのか - Internalsの開発体制について - PHPカンファレンス小田原
youkidearitai
PRO
1
190
コードレビューで学ぶ!Kotlinオブジェクト指向デザインパターン
akkie76
2
190
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
620
Blue/Greenデプロイの導入による 運用フローの改善
kudoas
1
360
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
220
GraphQLサーバの構成要素を整理する #ハッカー鮨 #tsukijigraphql / graphql server technology selection
izumin5210
4
800
StoreKit2によるiOSのアプリ内課金のリニューアル
kangnux
0
110
雑に思考を整理する技術と効能
konifar
58
28k
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
130
Hanami and htmx
bkuhlmann
0
200
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
840
Featured
See All Featured
Making Projects Easy
brettharned
108
5.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
39
4.4k
Writing Fast Ruby
sferik
620
60k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
Clear Off the Table
cherdarchuk
83
310k
Reflections from 52 weeks, 52 projects
jeffersonlam
344
19k
Gamification - CAS2011
davidbonilla
76
4.6k
Making the Leap to Tech Lead
cromwellryan
123
8.5k
Rails Girls Zürich Keynote
gr2m
91
13k
Building Adaptive Systems
keathley
30
1.9k
Principles of Awesome APIs and How to Build Them.
keavy
120
16k
The Art of Programming - Codeland 2020
erikaheidi
41
12k
Transcript
!LHNZTIJO %.."OESPJEษڧձ ৽نνʔϜͰ৽ن։ൃΛ࢝ΊΔ࣌ʹΔ͜ͱ
X © DMM.com ࣗݾհ
X © DMM.com ࣗݾհ w LHNZTIJOఝٶʢ͗͘Έʣ w "OESPJEΤϯδχΞ w $50ࣨॴଐ
X © DMM.com ಥવͰ͕͢ɺ ৽نҊ݅ͷ։ൃΛਐΊ͍ͯ͘தͰ ͜Μͳܦݧ͋Γ·ͤΜ͔ʁ
X © DMM.com $*Λಋೖ͍ͯ͠ͳ͍ w ͦͦ#VJME௨ͬͯͳ͍ w NBTUFS#VJME͕௨ͬͯͳ͍ w ͍͔ͭΒ௨ͬͯͳ͍ͷ͔Θ͔Βͳ͍
w νʔϜ͕ΪεΪε͢Δ
X © DMM.com -JOUΛಋೖ͍ͯ͠ͳ͍ w Πϯσϯτ͕ w ϨϏϡʔ༰ͷ΄ͱΜͲ͕ʮϑΥʔϚοτ͔͚ͯʯͰࡁΉ w νʔϜ͕ΪεΪε͢Δ
X © DMM.com $%Λಋೖ͍ͯ͠ͳ͍ w ඇ։ൃऀҎ֎ͷਓ͕ɺ։ൃதͷΞϓϦΛ͞ΘΕͳͯ͘ෆ҆ w ඇ։ൃऀͷਓ͚ͨͪʹɺQSPEʹ͍ۙͭΛ৮Ζ͏ͱͯ͠Βͬͯ QSPHVSBEʹ·Δ w
QSPHVBSE௨͚ͬͨͲɺHTPO͋ͨΓͷLFFQOBNFTͷઃఆΛΕͯɺ "1*ίʔϧ͕શ໓͢Δ w νʔϜ͕ΪεΪε͢Δ
X © DMM.com ςετΛॻ͍ͯͳ͍ w ϦϑΝΫλͰ͖ͳ͍ w มߋޙͷίʔυͱมߋલͷίʔυ͕ಉ͡ಈ͖Λ͢Δͱ͍͏อূ͕ Ͱ͖ͳ͍ w
Ͳ͏͍͏ಈ࡞Λਖ਼ͱͨ͠ϩδοΫͳͷ͔Θ͔Βͳ͍ͷͰɺϨϏϡʔͳ Μͱͳ͘େৎΖͰBQQSPWF w ͦͦ΄΅΄΅ಈ͍ͯͳ͍ʢಈ࡞֬ೝ͞Εͯͳ͍ʣ w νʔϜ͕ΪεΪε͢Δ
X © DMM.com ઃܭํΛܾΊͯͳ͍ w ਓʹΑͬͯॻ͖ํ͕શ͘ҧ͏ w ʮͷॻ͍ͯΔ7JFX.PEFM999͍ͬͯ͏͚ͩͲɺ͋ͳͨͷ ॻ͍ͯΔ7JFX.PEFMͳΜ͔ҧ͍·ͤΜ͔ʁʯ w
νʔϜ͕ΪεΪε͢Δ w ʮΈΜͳ.71͚ͩͲɺ.77.Ͱॻ͖·͢Ͷʯ
X © DMM.com ৽ن։ൃ࣌ʹɺ·ͣ։ൃपΓͷඋΛ͢Δ͜ͱ͕ॏཁ w ʹΑͬͯɺ్த͔Βͷಋೖ͕͍͠ͷɺίετ͕େ͖͍ͷ͕͋ Δ w ઃܭํ w
ಛʹ৽نνʔϜͰॏཁ w ςετํ w Βͳ͍ਓɺͬͯΔ͚Ͳಇ͍ͨ͜ͱͳ͍ਓͱɺԿͳ͘ େ͖ͳͷΛ࡞Γ্͛ΔͷࠔɻԿ͔͠Βͷτϥϒϧ͋Γ͑ ΔͷͰɺ͋Β͔͡ΊఆͰ͖ΔͷΛରॲ͓ͯ͜͠͏ɻ
X © DMM.com ৽ن։ൃΛ࢝ΊΔͱ͖༻ νΣοΫϦετ
X © DMM.com νΣοΫϦετ <>ϑΥʔϚολ <>$* <>$%
<>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com ࣮ࡍʹ͖ͬͯ·͠ΐ͏
X © DMM.com IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM ελΠϧɾϑΥʔϚοτͷઃఆ Δ͜ͱ "4ͷઃఆ͔ΒɺͦΕͧΕͷελΠϧΛઃఆ͢Δ FEJUPSDPOpHΛઃఆ͢Δ
ϑΥʔϚολҎ֎ͷίʔσΟϯάنEPDVNFOUͳͲʹ·ͱΊ͓ͯ͘ TIBQFTFMFDUPSͳͲͷϑΝΠϧ໊ͷ໋໊نଇͳͲ
X © DMM.com <ࣗͷ߹>ελΠϧɾϑΥʔϚοτͷઃఆ 1SFGFSFODFT&EJUPS$PEF4UZMF͔Β+BWB,PUMJO9.-ͦΕͧΕΛ ઃఆͯ͠ɺԼهϑΝΠϧΛίϛοτ
X © DMM.com <ࣗͷ߹>ελΠϧɾϑΥʔϚοτͷઃఆ FEJUPSDPOpHઃఆ͠Α͏ root = true [*] insert_final_newline=true
indent_size = 2 continuation_indent_size = 2 IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <>$* <>$%
<>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com HJUIVCͰϓϩδΣΫτΛ࡞ͬͨΒɺ·ͣਅͬઌʹಋೖ͢͠ w DJSDMFDJ w 5SBWJT$* w #JUSJTF
w +FOLJOT $*ͷಋೖ
X © DMM.com IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM <ࣗͷ߹>$*ͷಋೖ DJSDMFDJΛ༻ ͻͱ·ͣMJOUͱUFTU͚ͩΒ͓ͤͯ͘ ./gradlew
lint test DJSDMFDJCBEHFઃఆ͓ͯ͘͠
X © DMM.com <ࣗͷ߹>$*ͷಋೖ HJUIVCͷઃఆΕͣʹ
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <>$%
<>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com ඇ։ൃऀͷํʹ͚ͯɺಛʹσβΠφʔ͞Μ͕৮ΕΔΑ͏ʹॳΊ͔Β༻ҙ ͓ͯ͘͠ͷ͕٢ɻ πʔϧ༧ࢉ͍উखͰબΜͰ͍ͩ͘͞ɻ EFQMPZHBUF 'BCSJDCFUB
ʢࣗ࡞ʣ $%ͷಋೖ
X © DMM.com <ࣗͷ߹>$%ͷಋೖ
X © DMM.com <ࣗͷ߹>$%ͷಋೖ - run: | GIT_HASH=$(git rev-parse --short
HEAD) GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) curl \ -F "token=$DEPLOY_GATE_API_KEY" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=git:$GIT_HASH" \ -F "distribution_name=$GIT_BRANCH" \ https://deploygate.com/api/users/kgmyshin/apps IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEDPNNJUGGEGFBEGCDEBED $*ʹઃఆ
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <Y>$%
<>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com -JOU Δ͜ͱ BOESPJEMJOUͷϧʔϧͷݟ͠ LUMJOUPSEFUFLUͷಋೖ
X © DMM.com <ࣗͷ߹>-JOUͷઃఆBOESPJEMJOU <?xml version="1.0" encoding="UTF-8"?> <lint> <issue id="all">
<ignore path="build" /> </issue> <issue id="GoogleAppIndexingWarning" severity="ignore" /> </lint> ઃఆϑΝΠϧΛͭ͘Δ
X © DMM.com android { ... lintOptions { ... lintConfig
file("${rootDir.absolutePath}/lint/lint.xml") } } HSBMEFʹઃఆ͢Δɻ <ࣗͷ߹>-JOUͷઃఆBOESPJEMJOU
X © DMM.com <ࣗͷ߹>-JOUͷઃఆLUMJOU buildscript { repositories { … maven
{ url "https://plugins.gradle.org/m2/" } } dependencies { classpath "org.jmailen.gradle:kotlinter-gradle:1.22.0" … } } 5PQMFWFMͷCVJMEHSBMEFʹઃఆ͢Δɻ ˞LPUMJOUFSHSBEMFΛͬͯ·͕͢ɺଞͷͰ͍͍Ͱ͢ɻ·ͨLUMJOU͡Όͳͯ͘EFUFLUͰ0,Ͱ͢
X © DMM.com <ࣗͷ߹>-JOUͷઃఆLUMJOU NPEVMFͷCVJMEHSBMEFʹઃఆ͢Δɻ apply plugin: "org.jmailen.kotlinter" kotlinter {
ignoreFailures = true reporters = ['checkstyle', 'plain'] indentSize = 2 continuationIndentSize = 2 }
X © DMM.com <ࣗͷ߹>-JOUͷઃఆ ./gradlew lint lintKotlin $*Ͱ࣍ͷίϚϯυΛୟ͘Α͏ʹͯ͠ɺઃఆྃ IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <Y>$%
<Y>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com HSBEMFपΓͷཧ ϚϧνϞδϡʔϧͳϓϩδΣΫτͰΔ߹͍Δ͚ͲɺγϯάϧϞδϡʔ ϧͳϓϩδΣΫτͰෆཁ͔ɻ Δ͜ͱ όʔδϣϯͳͲΛҰݩཧ
X © DMM.com <ࣗͷ߹>HSBEMFपΓͷཧ ext.kotlin_version = '1.3.21' ext.versions = [
compileSdk: 28, minSdk : 21, targetSdk : 28, code : 1, name : "0.9.0" ] ext.deps = [ kotlin : [ core : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", reflect: "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" ], 7FSTJPOܥΛ·ͱΊͯ͠·͏
X © DMM.com <ࣗͷ߹>HSBEMFपΓͷཧ android { compileSdkVersion versions.compileSdk defaultConfig {
minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk versionCode versions.code versionName versions.name ... } ... } dependencies { implementation deps.kotlin.core implementation deps.androidx.appcompat implementation deps.androidx.constraintlayout implementation deps.androidx.lifecycle implementation deps.androidx.recyclerview ... ͜Μͳײ͡Ͱ͔͚Δ
X © DMM.com <ࣗͷ߹>HSBEMFपΓͷཧ apply plugin: 'com.android.library' apply from: "${rootDir.absolutePath}/modules/android_partial.gradle"
dependencies { … } apply from: "${rootDir.absolutePath}/modules/ktlint_partial.gradle" BOESPJEͰͷઃఆɺLUMJOUपΓ·ͱΊͯ͠·͑ɺ ֤ϞδϡʔϧͷCVJMEHSBEMFΛ͜Μͳײ͡ʹ͢Δ͜ͱͰ͖Δ IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <Y>$%
<Y>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <Y>HSBEMFपΓͷཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com %BOHFSͷઃఆ $PQZSJHIU D 0SUB5IFSPY 3FMFBTFEVOEFSUIF.*5MJDFOTF IUUQTHJUIVCDPNEBOHFSEFTJHOCMPCNBTUFS-*$&/4& IUUQTEBOHFSTZTUFNTHVJEFTHFUUJOH@TUBSUFEIUNM
Δ͜ͱɺHFUUJOH@TUBSUFEϖʔδΛݟͳ͕ΒηοτΞοϓ͢Δ͚ͩ
X © DMM.com %BOHFSͷઃఆ # Warn when there is a
big PR warn("a large PR") if git.lines_of_code > 1000 ### lint ### Dir.glob("**/lint-results.xml").each { |report| android_lint.filtering = true android_lint.report_file = report.to_s android_lint.lint(inline_mode: true) } զ͕Ոͷ%BOHFSpMFʢͷҰ෦ʣɻ ϚϧνϞδϡʔϧʹΑΔରԠ͕ೖΓ·͢ɻ IUUQTHJUIVCDPNLHNZTIJOOFXQSPKFDUBOESPJEQVMM
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <Y>$%
<Y>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <Y>HSBEMFपΓͷཧ <Y>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com ϝοηʔδςϯϓϨʔτ Δ͜ͱ HJUIVCܥͷςϯϓϨʔτΛ༻ҙ͢Δ PQU ίϛοτϝοηʔδͷςϯϓϨʔτΛ༻ҙ͍͍͔ͯ͠
X © DMM.com ϝοηʔδςϯϓϨʔτ IUUQTIFMQHJUIVCDPNFOBSUJDMFTBCPVUJTTVFBOEQVMMSFRVFTUUFNQMBUFT
X © DMM.com ίϛοτϝοηʔδͷ౷Ұ
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <Y>$%
<Y>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <Y>HSBEMFपΓͷཧ <Y>%BOHFS <Y>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com ઃܭํ Δ͜ͱ ઃܭํΛΈΜͳͰڞ༗Ͱ͖ΔΑ͏EPDVNFOUͳͲʹॻ͖ى͜͢
X © DMM.com ઃܭํ
X © DMM.com ઃܭํ
X © DMM.com ઃܭํ
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <Y>$%
<Y>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <Y>HSBEMFपΓͷཧ <Y>%BOHFS <Y>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <Y>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com ςετํ Δ͜ͱ ԼهΛEPDVNFOUʹى͜͢ ͲͷϑϨʔϜϫʔΫΛ͏ͷ͔ Ͳ͜ʹͲΜͳςετΛॻ͘ͷ͔
ͦͷςετԿΛอূ͢Δͷ͔ ॻ͖ํ͕Θ͔Δαϯϓϧ
X © DMM.com ςετํ
X © DMM.com νΣοΫϦετ <Y>ϑΥʔϚολ <Y>$* <Y>$%
<Y>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <Y>HSBEMFपΓͷཧ <Y>%BOHFS <Y>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <Y>ઃܭํ <Y>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com ։ൃϑϩʔ Δ͜ͱ HJUqPX HJUIVCqPX
TQSJOUͷྲྀΕΛͲ͏͏ʁ
X © DMM.com ։ൃϑϩʔ TQSJOUͷྲྀΕ ϓϥϯχϯάͷ ϓϥϯχϯά͕ऴΘͬͨΒͦͷ··ू·ͬͯશͯͷλεΫͷΫϥεਤ Λख͚ͯ͠ॻ͘
6TF$BTF͚ͩγʔέϯεਤॻ͘ ͦΕҎ֎ͷΫϥεਤɺγʔέϯεਤΛݩʹΨϦΨϦίʔσΟϯά͢ Δ͚ͩ
X © DMM.com ։ൃϑϩʔ UBTLͷྲྀΕʢઃܭํ͕ೃછΉ·Ͱࡉ͔ͬͯͨ͘ʣ ػೳ࣮ϒϥϯν࡞ ੜͤͯ͞EPNBJO࣮Ͱ13ͭ
JOGSB࣮Ͱ13ͭ 7JFX.PEFM -JWF%BUBΛ࣮ͯ͠13ͭ 'SBHNFOUʢओʹσβΠϯʣΛ࣮ͯ͠13ͭ 6TF$BTFΛ࣮ͯ͠13̍ͭ ࠷ޙʹ%*Ͱܨ͛ͯಈ࡞֬ೝ·Ͱͬͯ13ͭ
X © DMM.com ·ͱΊ
X © DMM.com νΣοΫϦετ <>ϑΥʔϚολ <>$* <>$%
<>-JOU BOESPJEMJOU LUMJOUPSEFUFLU <>HSBEMFपΓͷཧ <>%BOHFS <>ϝοηʔδςϯϓϨʔτʢHJUIVC HJUʣ <>ઃܭํ <>ςετํ <>։ൃϑϩʔ PQU $SBTIMZUJDT PQU σόοάϝχϡʔ
X © DMM.com ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ ଞʹ͜͏͍͏ͷͬͨΒ͍͍ͱࢥ͏ʂͬͯͷ͕͋Εɺͥͻڭ͑ͯ͘ ͍ͩ͞ʂ