Save 37% off PRO during our Black Friday Sale! »

Androidエンジニアが1人という不安と向き合う

E6d26a51159a7863cac28e9d12ccd389?s=47 rmakiyama
October 19, 2021

 Androidエンジニアが1人という不安と向き合う

▼動画URL
https://youtu.be/5M0xJLdAcAE
---
Androidエンジニア不足が叫ばれる昨今、1つのAndroidアプリに対して1人のAndroidエンジニアという状況が増えてきているように感じています。このような状況下では、スキル面・キャアリア面での不安を持つ方も多いのではないでしょうか。牧山のキャリアとしても、ほとんどがチームにAndroidエンジニアが1人という経歴です。
本セッションでは、その経験を踏まえ、牧山自身が抱えてきた不安を元に、その不安に向き合うためにやったこと・やっていることについて話します。

▼ アジェンダ

技術の学び方を身につける
優れたソースコードを読む
ソフトウェア開発を学ぶ
サービスへの理解を深める
エンジニアリングでサービスを前に進める

E6d26a51159a7863cac28e9d12ccd389?s=128

rmakiyama

October 19, 2021
Tweet

Transcript

  1. "OESPJEΤϯδχΞ͕ ਓͱ͍͏ෆ҆ͱ޲͖߹͏ 3ZP.BLJZBNBSNBLJZBNB 3BEJPUBML*OD !%SPJE,BJHJ%BZ

  2. w ຀ࢁྎ w 3BEJPUBMLגࣜձࣾ w "OESPJEΤϯδχΞ w!@SNBLJZBNB wSNBLJZBNB ࣗݾ঺հ

  3. "OESPJE։ൃܦݧ w ೥ΤΩαΠτגࣜձࣾʹ৽ଔೖࣾ w ೥d৽ن"OESPJEΞϓϦ։ൃ w ೥d3BEJPUBMLΞϓϦϑϧϦχϡʔΞϧ w ೥3BEJPUBMLגࣜձࣾʹస੶ w

    Ҿ͖ଓ͖3BEJPUBMLΞϓϦ։ൃ
  4. ˝ "OESPJEνʔϜ ˝ ձࣾͷ"OESPJEFS ೥৽ن"OESPJEΞϓϦ։ൃ "OESPJE։ൃܦݧ

  5. ˝ "OESPJEνʔϜ ˝ ձࣾͷ"OESPJEFS ೥3BEJPUBMLΞϓϦϑϧϦχϡʔΞϧ "OESPJE։ൃܦݧ

  6. ˝ "OESPJEνʔϜ ˝ ձࣾͷΤϯδχΞ J044FSWFS໊֤ ೥3BEJPUBMLגࣜձࣾʹస੶ "OESPJE։ൃܦݧ

  7. ˝ "OESPJEνʔϜ "OESPJE։ൃܦݧ ೥3BEJPUBMLגࣜձࣾ

  8. ΩϟϦΞͷ΄ͱΜͲ͕ νʔϜʹ"OESPJEΤϯδχΞ͕ͻͱΓ

  9. ͜Ε·Ͱʹ๊͖͑ͯͨෆ҆ w "OESPJEΤϯδχΞͱͯ͠ͷεΩϧෆ଍ w ૬ஊ૬खɺϩʔϧϞσϧ͕͍ͳ͍ w ͜ͷΞʔΩςΫνϟͰ߹͍ͬͯΔͷʜʁ w ͜Ε͔Β΋"OESPJEຊͰେৎ෉ͳͷ͔ʁ

  10. ෆ҆͸ͳ͘ͳΒͳ͍΋ͷ w ෆ҆͸༷ʑͳཁҼͰҾ͖ى͜͞ΕΔ w ٕज़ͷਐาɺςΫϊϩδʔͷਐԽ w ୲౰͍ͯ͠ΔαʔϏεͷ੒௕ w ձࣾ૊৫ͷมԽ w

    ϥΠϑεςʔδͷมԽ w FUDʜ
  11. ෆ҆ͱ޲͖߹͏͜ͱ͕େࣄ

  12. ࢲ͕ෆ҆ͱ޲͖߹͏ͨΊʹ΍ͬͨ͜ͱ w ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ w ༏ΕͨιʔείʔυΛಡΉ w ιϑτ΢ΣΞ։ൃΛֶͿ w αʔϏε΁ͷཧղΛਂΊΔ w

    ΤϯδχΞϦϯάͰαʔϏεΛલʹ͢͢ΊΔ ΞδΣϯμ
  13. ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ

  14. ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ w ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔ·Ͱ w ܧଓతͳΩϟονΞοϓΛ͢Δ "OESPJEΤϯδχΞͱͯ͠

  15. ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔ·Ͱ w ॻ੶Λ࡭΍Γ͖Δ w DPEFMBCνϡʔτϦΞϧΛ΍Δ w ࣮຿ͰΨϯΨϯ஁͑ͯ΋Β͏ w ཉ͍͠ΞϓϦΛ࡞ֶͬͯͿ w

    FUDʜ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ
  16. ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔ·Ͱ w ॻ੶Λ࡭΍Γ͖Δ w DPEFMBCνϡʔτϦΞϧΛ΍Δ w ࣮຿ͰΨϯΨϯ஁͑ͯ΋Β͏ w ཉ͍͠ΞϓϦΛ࡞ֶͬͯͿ w

    FUDʜ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ ࣗ෼ʹ߹͏ํ๏Λ໛ࡧ͠Α͏🙌
  17. ࠓͩͬͨΒ͜Ε͕Φεεϝ w "OESPJE#BTJDTJO,PUMJO w %FWFMPQJOH"OESPJE"QQTXJUI,PUMJO 
 CZ(PPHMF w "OESPJE,PUMJO'VOEBNFOUBMT ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔ

  18. "OESPJE#BTJDTJO,PUMJO ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔΦεεϝ IUUQTEFWFMPQFSBOESPJEDPNDPVSTFTBOESPJECBTJDTLPUMJODPVSTF

  19. "OESPJE#BTJDTJO,PUMJO w ,PUMJO"OESPJEͷجຊ͔Βֶ΂Δ w ಈը΍$PEFMBC͔ΒͳΔ1BUIXBZΛ࣮ࢪ w +FUQBDL΋ؚ·ΕΔ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔΦεεϝ

  20. %FWFMPQJOH"OESPJE"QQTXJUI,PUMJOCZ(PPHMF ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔΦεεϝ IUUQTXXXVEBDJUZDPNDPVSTFEFWFMPQJOHBOESPJEBQQTXJUILPUMJOVE

  21. %FWFMPQJOH"OESPJE"QQTXJUI,PUMJOCZ(PPHMF ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔΦεεϝ w ແྉ w ׬ྃ·Ͱͷ૝ఆظؒ͸໿ϲ݄ w εΩϧϨϕϧ͸தڃ·ͰΛ૝ఆ w ϕετϓϥΫςΟεɺϞμϯͳઃܭ

  22. "OESPJE,PUMJO'VOEBNFOUBMT ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔΦεεϝ IUUQTEFWFMPQFSBOESPJEDPNDPVSTFTLPUMJOBOESPJEGVOEBNFOUBMTPWFSWJFX

  23. "OESPJE,PUMJO'VOEBNFOUBMT w $PEFMBC͕த৺ w +FUQBDL,PUMJO$PSPVUJOFT w 3FQPTJUPSZύλʔϯʹ͍ͭͯͷϨοεϯ΋͋Δ w ΞϓϦΞʔΩςΫνϟΨΠυʹଇ͍ͯ͠Δ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ࣮ݱ͍ͨ͠ίʔυΛॻ͚ΔΑ͏ʹͳΔΦεεϝ

  24. ׬શʹཧղͨ͠💪

  25. ׬શʹཧղͨ͠🤔

  26. ΩϟονΞοϓ͠ଓ͚Δඞཁ͕͋Δ w ৽͍ٕ͠ज़͕ͲΜͲΜग़ͯ͘Δ w ,PUMJO$PSPVUJOFT'MPXT w +FUQBDL$PNQPTF w FUDʜ w

    ϕετϓϥΫςΟε΋มΘΔ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ
  27. ΩϟονΞοϓͷํ๏͸༷ʑ w ެࣜυΩϡϝϯτ w "OESPJE%FWFMPQFST#MPH w 1SP"OESPJE%FW w 5FDI#PPTUFS w

    "OESPJE%BHBTIJ"OESPJE8BHBTIJ w 5XJUUFSͰ"OESPJEΤϯδχΞΛϑΥϩʔ w FUDʜ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ
  28. ΩϟονΞοϓͷํ๏͸༷ʑ w ެࣜυΩϡϝϯτ w "OESPJE%FWFMPQFST#MPH w 1SP"OESPJE%FW w 5FDI#PPTUFS w

    "OESPJE%BHBTIJ"OESPJE8BHBTIJ w 5XJUUFSͰ"OESPJEΤϯδχΞΛϑΥϩʔ w FUDʜ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ ࣗ෼ʹ߹͏ํ๏Λ໛ࡧ͠Α͏🙌
  29. ΩϟονΞοϓͷํ๏͸༷ʑ wެࣜυΩϡϝϯτ w "OESPJE%FWFMPQFST#MPH w 1SP"OESPJE%FW w 5FDI#PPTUFS w "OESPJE%BHBTIJ"OESPJE8BHBTIJ

    w 5XJUUFSͰ"OESPJEΤϯδχΞΛϑΥϩʔ w FUDʜ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ
  30. ެࣜυΩϡϝϯτ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ IUUQTEFWFMPQFSBOESPJEDPNKFUQBDLBOESPJEYFYQMPSFS

  31. ެࣜυΩϡϝϯτ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ IUUQTEFWFMPQFSBOESPJEDPNKFUQBDLBOESPJEYSFMFBTFTGSBHNFOU

  32. ެࣜυΩϡϝϯτ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ IUUQTEFWFMPQFSBOESPJEDPNKFUQBDLBOESPJEYSFMFBTFTGSBHNFOU

  33. ެࣜυΩϡϝϯτ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ IUUQTEFWFMPQFSBOESPJEDPNKFUQBDLBOESPJEYSFMFBTFTGSBHNFOU

  34. ެࣜυΩϡϝϯτ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ IUUQTEFWFMPQFSBOESPJEDPNKFUQBDLBOESPJEYSFMFBTFTGSBHNFOU

  35. ެࣜυΩϡϝϯτ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ IUUQTEFWFMPQFSBOESPJEDPNHVJEFGSBHNFOUT

  36. ެࣜυΩϡϝϯτ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ IUUQTEFWFMPQFSBOESPJEDPNHVJEFGSBHNFOUT

  37. ެࣜυΩϡϝϯτ w +FUQBDL܈͸ಛʹॆ࣮͍ͯ͠Δ w ϢʔβʔΨΠυ΍ίʔυϥϘ΁ͷಈઢ΋͋Δ w ೔ຊޠͰ΋݁ߏॆ࣮͍ͯ͠Δ w ӳޠͷυΩϡϝϯτͱࠩҟ͕͋Δ͜ͱ΋ʜ w

    63-ʹ IMFOΛ͚ͭͯݟΔบ͸͚ͭΔͱྑ͍ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ
  38. ༏ΕͨιʔείʔυΛಡΉ

  39. ͳͥιʔείʔυΛಡΉͷ͔ w ίʔυΛಡΉྗ͸ͣͬͱ׆͖Δ w ࣮຿Ͱ΋ίʔυΛಡΉ࣌ؒ͸ඇৗʹ௕͍ w ίʔυϨϏϡʔ΋ͦͷҰ؀ w ઌਓͷ஌ܙ͔Βֶ΂Δ w

    νʔϜ΍ձࣾͷ֎͔ΒֶͿ w ࣮ݱ͢Δํ๏ͷΠϯσοΫεΛ૿΍͢ ༏ΕͨιʔείʔυΛಡΉ
  40. "OESPJEͰΦεεϝͷ044 w BOESPJETVO fl PXFS w HPPHMFJPTDIFE w OJDLCVUDIFSQMBJE w

    %SPJE,BJHJDPOGFSFODFBQQ w ESPJELOJHIUT%SPJE,OJHIUT@"QQ w BOESPJEUSBDLS w BOESPJEBSDIJUFDUVSFDPNQPOFOUTTBNQMFT w DISJTCBOFTUJWJ w TLZEPWFT1PLFEFY w FUDʜ ༏ΕͨιʔείʔυΛಡΉ ʜ(JU)VC4UBSˑL ʜ(JU)VC4UBSˑL ʜ(JU)VC4UBSˑL ʜ(JU)VC4UBSˑ ʜ(JU)VC4UBSˑ ʜ(JU)VC4UBSˑ ʜ(JU)VC4UBSˑL ʜ(JU)VC4UBSˑL ʜ(JU)VC4UBSˑL
  41. ಡΉͱ͖ͷίπ w ಡΉ໨తΛܾΊΔ w είʔϓΛߜͬͯಡΉ w ෳ਺ͷιʔείʔυΛࢀর͢Δ w ࠷ޙʹࣗ਎ͷϓϩμΫτͱൺֱ͢Δ w

    എܠɾҙਤΛ૝૾ͯ͠ΈΔ ༏ΕͨιʔείʔυΛಡΉ
  42. 👀ಡΜͰΈΑ͏🔍

  43. ಡΜͰΈΑ͏ w ໨త7JFX.PEFMͷ࣮૷ํ਑Λࢀߟʹ͢Δ w DPOGFSFODFBQQͱUJWJ ༏ΕͨιʔείʔυΛಡΉ

  44. %SPJE,BJHJDPOGFSFODFBQQ w %SPJE,BJHJͷެࣜΞϓϦ w ίϯτϦϏϡʔλʔେ׻ܴ w νϟϨϯδΛ੝ΓࠐΜͩઃܭ w 5IJTBQQIBOEMFTUIF7JFX.PEFMXJUIBO.7* MJLFJOUFSGBDF

    ༏ΕͨιʔείʔυΛಡΉ
  45. DPOGFSFODFBQQ3FBM'FFE7JFX.PEFMLU @HiltViewModel class RealFeedViewModel @Inject constructor( private val repository: FeedRepository,

    ) : ViewModel(), FeedViewModel { private val effectChannel = … private val showProgressLatch = … override val effect: Flow<FeedViewModel.Effect> = … init {…} private val allFeedContents: StateFlow<LoadState<FeedContents >> private val filters: MutableStateFlow<Filters> = MutableStateFlow(Filters()) override val state: StateFlow<FeedViewModel.State> override fun event(event: FeedViewModel.Event) { viewModelScope.launch { @Exhaustive when (event) {…} } } private suspend fun refreshRepository() {…} } IUUQTHJUIVCDPN%SPJE,BJHJDPOGFSFODFBQQ
  46. DPOGFSFODFBQQ3FBM'FFE7JFX.PEFMLU @HiltViewModel class RealFeedViewModel @Inject constructor( private val repository: FeedRepository,

    ) : ViewModel(), FeedViewModel { private val effectChannel = … private val showProgressLatch = … override val effect: Flow<FeedViewModel.Effect> = … init {…} private val allFeedContents: StateFlow<LoadState<FeedContents >> private val filters: MutableStateFlow<Filters> = MutableStateFlow(Filters()) override val state: StateFlow<FeedViewModel.State> override fun event(event: FeedViewModel.Event) { viewModelScope.launch { @Exhaustive when (event) {…} } } private suspend fun refreshRepository() {…} } interface FeedViewModel : UnidirectionalViewModel<Event, Effect, State> { data class State( val showProgress: Boolean = false, val filters: Filters = Filters(), val filteredFeedContents: FeedContents = FeedContents(), ) sealed class Effect {…} sealed class Event {…} override val state: StateFlow<State> override val effect: Flow<Effect> override fun event(event: Event) } IUUQTHJUIVCDPN%SPJE,BJHJDPOGFSFODFBQQ
  47. DPOGFSFODFBQQ3FBM'FFE7JFX.PEFMLU @HiltViewModel class RealFeedViewModel @Inject constructor( private val repository: FeedRepository,

    ) : ViewModel(), FeedViewModel { private val effectChannel = … private val showProgressLatch = … override val effect: Flow<FeedViewModel.Effect> = … init {…} private val allFeedContents: StateFlow<LoadState<FeedContents >> private val filters: MutableStateFlow<Filters> = MutableStateFlow(Filters()) override val state: StateFlow<FeedViewModel.State> override fun event(event: FeedViewModel.Event) { viewModelScope.launch { @Exhaustive when (event) {…} } } private suspend fun refreshRepository() {…} } interface FeedViewModel : UnidirectionalViewModel<Event, Effect, State> { data class State( val showProgress: Boolean = false, val filters: Filters = Filters(), val filteredFeedContents: FeedContents = FeedContents(), ) sealed class Effect {…} sealed class Event {…} override val state: StateFlow<State> override val effect: Flow<Effect> override fun event(event: Event) } interface UnidirectionalViewModel<EVENT, EFFECT, STATE> { val state: StateFlow<STATE> val effect: Flow<EFFECT> fun event(event: EVENT) } IUUQTHJUIVCDPN%SPJE,BJHJDPOGFSFODFBQQ
  48. %SPJE,BJHJDPOGFSFODFBQQ w ΠϯλϑΣʔεʹΑΔద੾ͳ੍໿ w ଟ͘ͷίϯτϦϏϡʔλͰͷ։ൃΛ 
 ҙ͍ࣝͯ͠Δͱ͍͏ҙਤΛײ͡Δ ༏ΕͨιʔείʔυΛಡΉ

  49. DISJTCBOFTUJWJ w 5JWJJTBXPSLJOQSPHSFTT57TIPXUSBDLJOH "OESPJEBQQ XIJDIDPOOFDUTUP5SBLUUW w 5JWJJTBOBQQUIBUBUUFNQUTUPVTFUIFMBUFTU DVUUJOHFEHFMJCSBSJFTBOEUPPMT w ׂҎ্ΛDISJTCBOFTࢯ͕։ൃ

    ༏ΕͨιʔείʔυΛಡΉ
  50. DISJTCBOFTUJWJ3FBM'FFE7JFX.PEFMLU @HiltViewModel internal class ShowDetailsViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private

    val updateShowDetails: UpdateShowDetails, … ) : ViewModel() { … private val pendingActions = MutableSharedFlow<ShowDetailsAction>() … val uiEffects: Flow<UiEffect> get() = _uiEffects.asSharedFlow() val state = combine(…) {…} init { viewModelScope.launch { pendingActions.collect { action -> when (action) { … } } } … } … fun submitAction(action: ShowDetailsAction) { viewModelScope.launch { pendingActions.emit(action) } } … } IUUQTHJUIVCDPNDISJTCBOFTUJWJ
  51. DISJTCBOFTUJWJ w ୯Ұํ޲ͷσʔλϑϩʔ w 7JFX.PEFMΛมߋ͠΍͍͢Α͏ʹ͍ͯ͠Δʁ w ""$ͷ7JFX.PEFMΛ௚઀ܧঝ w 6TF$BTF૚Λઃ͚ͯ7JFX.PEFMͷ੹຿Λബ͍ͯ͘͠Δ ༏ΕͨιʔείʔυΛಡΉ

  52. ࣗ਎ͷϓϩμΫτίʔυͱ ൺֱͯ͠Έ͍ͯͩ͘͞🔍

  53. ஫ҙΞʔΩςΫνϟʹ།Ұͷղ͸ͳ͍ ༏ΕͨιʔείʔυΛಡΉ w ༷ʑͳཁҼʹΑͬͯมΘΔ w νʔϜͷϝϯόʔ w ϓϩμΫτͷಛੑ w ࠾༻͢Δٕज़

    w FUDʜ w Πϯλʔωοτʹ།Ұͷղ͸ͳ͍
  54. ΞʔΩςΫνϟʹ།Ұͷղ͸ͳ͍ ༏ΕͨιʔείʔυΛಡΉ ࢀߟʰ%FTJHO*UϓϩάϥϚʔͷͨΊͷΞʔΩςΫςΟϯάೖ໳ʱQ

  55. ࣗ਎ͷϓϩμΫτͱ޲͖߹͑ΔΑ͏ʹͳΔ ༏ΕͨιʔείʔυΛಡΉΞʔΩςΫνϟʹ།Ұͷղ͸ͳ͍ w ࢹ໺Λ޿͛ͯΞʔΩςΫνϟΛݟΕΔΑ͏ʹͳΔ w ϓϩμΫτΛ΋ͱʹϑΟʔυόοΫϧʔϓΛճ͢ w ΠςϨʔγϣϯΛߴ଎ʹճ͍ͤͯΔ͔ʁ w ϘτϧωοΫʹͳ͍ͬͯΔ՝୊͸Ͳ͔͜ʁ

    w ςοΫϦʔυΞʔΩςΫτͱͯ͠ৼΔ෣͏
  56. "OESPJEຊ΁ͷෆ҆

  57. ෆ҆ͷछ͸ͻͱͦΕͧΕ "OESPJEຊ΁ͷෆ҆ w "OESPJE։ൃҎ֎ͷεΩϧηοτ w "OESPJEͱ͍͏ٕज़΁ͷকདྷੑ w J04Ϣʔβʔ͕ϝΠϯλʔήοτͳαʔϏε w ΈΜͳ͕ෆ͕͍҆ͬͯΔͷͰࣗ෼΋ෆ҆ʜ

    w യવͱͨ͠ෆ҆
  58. มΘΓʹ͍͘΋ͷʹ໨Λ޲͚Δ w ιϑτ΢ΣΞͷݪཧݪଇ w ର৅ྖҬΛద੾ʹϞσϦϯά͢Δ͜ͱ w αʔϏεΛΑΓྑ͍͖͍ͯͨ͘͜͠ͱ "OESPJEຊ΁ͷෆ҆

  59. ࢲ͕ෆ҆ͱ޲͖߹͏ͨΊʹ΍ͬͨ͜ͱ w ٕज़ͷֶͼํΛ਎ʹ͚ͭΔ w ༏ΕͨιʔείʔυΛಡΉ w ιϑτ΢ΣΞ։ൃΛֶͿ w αʔϏε΁ͷཧղΛਂΊΔ w

    ΤϯδχΞϦϯάͰαʔϏεΛલʹ͢͢ΊΔ ΞδΣϯμ
  60. ιϑτ΢ΣΞ։ൃΛֶͿ

  61. ͳͥιϑτ΢ΣΞ։ൃʁ ιϑτ΢ΣΞ։ൃΛֶͿ w "OESPJE։ൃ͔Βιϑτ΢ΣΞ։ൃʹࢹ໺Λ޿͛Δ w "OESPJE։ൃʹؐݩͰ͖Δ΋ͷ͹͔Γ w ͢Ͱʹ࣮ફ͍ͯ͠Δ͜ͱ΋ଟ͍͜ͱʹؾͮ͘ w Ͳ͏࣮૷͢Δ͔ɺ͔Βɺͳͥͦ͏࣮૷͢Δ͔΁

    w "OESPJEҎ֎ͷΤϯδχΞͱҰॹʹֶ΂Δ
  62. ҰൠతͳݪཧݪଇΛֶͿ ιϑτ΢ΣΞ։ൃΛֶͿ w ୯Ұ੹೚ͷݪଇ w ΦʔϓϯΫϩʔζυݪଇ w Ϧείϑͷஔ׵ݪଇ w ΠϯλϑΣʔε෼཭ͷݪଇ

    w ґଘੑٯసͷݪଇ w %3:ݪଇ w ,*44ͷݪଇ w :"(/* w ந৅ґଘݪଇ w ҆ఆґଘݪଇ w FUDʜ
  63. ؔ৺ͷ෼཭ ιϑτ΢ΣΞ։ൃΛֶͿ w ࠷΋ॏཁͳݪଇͷ͏ͪͷͻͱͭ w ͋ΒΏΔιϑτ΢ΣΞ։ൃʹద༻Ͱ͖Δ w "OESPJE։ൃͱ΋ೃછΈਂ͍

  64. ΞϓϦΞʔΩςΫνϟΨΠυ ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ IUUQTEFWFMPQFSBOESPJEDPNKFUQBDLHVJEF IMKBTFQBSBUJPOPGDPODFSOT

  65. ΞϓϦͷਪ঑ΞʔΩςΫνϟ ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ w .77.ύλʔϯ w ϨΠϠʔυΞʔΩςΫνϟ w 6*૚ͱϞσϧ૚

  66. "DUJWJUZ'SBHNFOU ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ΞϓϦͷਪ঑ΞʔΩςΫνϟ w 7JFX.PEFMͷΈʹґଘ w 6*ͷදࣔ w ΞϓϦίϯϙʔωϯτͱͷ 
 ΍ΓͱΓ

  67. 7JFX.PEFM ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ΞϓϦͷਪ঑ΞʔΩςΫνϟ w 3FQPTJUPSZͷΈʹґଘ w 6*ʹσʔλΛఏڙ w Ϟσϧͱͷ΍ΓͱΓ

  68. 3FQPTJUPSZ ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ΞϓϦͷਪ঑ΞʔΩςΫνϟ w ӬଓσʔλϞσϧͱ 
 ϦϞʔτιʔεʹґଘ w 7JFXͷ͜ͱΛ஌Βͳ͍

  69. େࣄͳͷ͸ؔ৺ͷ෼཭ ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ w .77.΍ϨΠϠʔυ͸໨తͰ͸ͳ͘खஈ w lͳͥzͦΕΛ͢Δͷ͔͕େࣄ

  70. ؔ৺ͷ෼཭͕Ͱ͖͍ͯͳ͍ྫ ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ class MainFragment : Fragment(R.layout.main_fragment) { private val viewModel:

    MainViewModel by viewModels() override fun onViewCreated(…) { if (viewModel.repository.hasData) { viewModel.getData(this) } } fun showData(data: Data) {…} } class MainViewModel(val repository: Repository) : ViewModel() { fun getData(fragment: MainFragment) { val data = repository.getData() fragment.showData(data) } }
  71. େࣄͳͷ͸ؔ৺ͷ෼཭ ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ w .77.΍ϨΠϠʔυ͸໨తͰ͸ͳ͘खஈ w lͳͥzͦΕΛ͢Δͷ͔͕େࣄ

  72. ࢹ໺͕޿͕Γࢹ఺͕มΘΔ ιϑτ΢ΣΞ։ൃΛֶͿ w "OESPJE։ൃͷதͰ΋ଟ͘ͷ͜ͱֶ͕΂Δ w ιϑτ΢ΣΞ։ൃͱͯ͠ݟΔ w ࣗ෼ͷϓϩμΫτಛ༗ͷ໰୊ʹ޲͖߹͑Δ w ΩϟονΞοϓ΁ͷয૩ײ͕ബΕΔ

  73. αʔϏε΁ͷཧղΛਂΊΔ

  74. ͳͥཧղΛਂΊΔඞཁ͕͋Δͷ͔ w ཧղΛਂΊͯιϑτ΢ΣΞ։ൃʹؐݩ͢Δ w αʔϏεͷ஌ࣝΛϞσϧʹ൓өͤ͞Δ w ؔ৺ͷ෼཭ʹඞཁͳڥքΛݟ͚ͭΔ w ະདྷΛݟਾ͑ͨઃܭ։ൃΛ͢Δ w

    αʔϏεͷํ޲ੑ w ։ൃ૊৫ͷະདྷ αʔϏε΁ͷཧղΛਂΊΔ
  75. ΤϯδχΞϦϯάͰ αʔϏεΛલʹ͢͢ΊΔ

  76. ΤϯδχΞͱͯ͠ ΩϟϦΞΛ௨ͯ͠ԿΛ͍ͨ͠ʁ

  77. ʰ೥๭೔*5ΤϯδχΞٯٻਓൃදࢿྉ຀ࢁྎʱΑΓ

  78. l։ൃऀͱͯ͠ͷզʑͷ໨ඪ͸ɺʮϢʔβʔΛت͹ͤΔʯ ͜ͱͰ͢ɻͦΕ͕ͦ͜զʑͷଘࡏཧ༝ͳͷͰ͢ɻz ʰୡਓϓϩάϥϚʔʕख़ୡʹ޲͚ͨ͋ͳͨͷཱྀʕୈ൛ʱQ

  79. ϢʔβʔʹՁ஋Λಧ͚Δ w ϓϩͱͯ͠ιϑτ΢ΣΞ։ൃΛ͢Δ w ϢʔβʔαʔϏε΁ͷཧղΛਂΊΔ w ࣗ෼ͷ੹೚ൣғΛߜΒͳ͍ ΩϟϦΞΛ௨͍ͯͨ͜͠͠ͱࢲͷ৔߹

  80. lΤϯδχΞϦϯάͱ͍͏ߦҝ͸ɺԿ͔Λʮ࣮ݱʯ͢Δ͜ ͱͰ͢ɻ࣮ݱͷͨΊʹɺෆ࣮֬ੑͷߴ͍ঢ়ଶ͔Βɺෆ֬ ࣮ੑͷ௿͍ঢ়ଶʹޮ཰Α͘Ҡ͍ͯ͘͠աఔʹߦ͏͢΂ͯ ͷ͜ͱͰ͢ɻz ʰΤϯδχΞϦϯά૊৫࿦΁ͷট଴dෆ࣮֬ੑʹ޲͖߹͏ࢥߟͱ૊৫ͷϦϑΝΫλϦϯάʱQ

  81. αʔϏεΛྑ͘Ͱ͖Δ͜ͱɺશ෦΍Δ w ΞφϦςΟΫεͷΠϕϯτઃܭ͢Δ w ,1*μογϡϘʔυΛ࡞Δ w υΩϡϝϯτจԽΛਪਐ͢Δ w མ͍ͪͯΔϘʔϧΛੵۃతʹर͏ w

    ίϛϡχέʔγϣϯͷػձΛ૿΍͢ w FUDʜ ΩϟϦΞΛ௨͍ͯͨ͜͠͠ͱϢʔβʔʹՁ஋Λಧ͚Δ
  82. ·ͱΊ w ࣗ෼ࣗ਎ͷෆ҆ͱ͔ͬ͠Γ޲͖߹͓͏ w ਓ͔ͩΒͦ͜ςοΫϦʔυͱͯ͠ৼΔ෣͓͏ w ਓ͔ͩΒͦ͜ΞʔΩςΫτͱͯ͠ৼΔ෣͓͏ w ΩϟϦΞΛ௨࣮ͯ͠ݱ͍ͨ͜͠ͱͱ޲͖߹͓͏ w

    ෆ҆ͱ޲͖߹ָͬͯ͘͠։ൃΛ͠Α͏ʂ