Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

rmakiyama
October 19, 2021

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

▼動画URL
https://youtu.be/5M0xJLdAcAE

▼Android Kotlin Fundamentalsについて
Android Basics in Kotlinのアップデートに伴い、提供が終了されます。
これからはアップデートされたAndroid Basics in Kotlinで基礎を学ぶのが良さそうです。
詳しくはAndroid Developers Blogをご参照ください。
https://android-developers.googleblog.com/2022/01/android-basics-and-training-update.html

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

▼ アジェンダ

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

rmakiyama

October 19, 2021
Tweet

More Decks by rmakiyama

Other Decks in Technology

Transcript

  1. ΩϟονΞοϓͷํ๏͸༷ʑ w ެࣜυΩϡϝϯτ w "OESPJE%FWFMPQFST#MPH w 1SP"OESPJE%FW w 5FDI#PPTUFS w

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

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

    w 5XJUUFSͰ"OESPJEΤϯδχΞΛϑΥϩʔ w FUDʜ ٕज़ͷֶͼํΛ਎ʹ͚ͭΔܧଓతͳΩϟονΞοϓ
  4. "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
  5. 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
  6. 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
  7. 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
  8. 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
  9. ҰൠతͳݪཧݪଇΛֶͿ ιϑτ΢ΣΞ։ൃΛֶͿ w ୯Ұ੹೚ͷݪଇ w ΦʔϓϯΫϩʔζυݪଇ w Ϧείϑͷஔ׵ݪଇ w ΠϯλϑΣʔε෼཭ͷݪଇ

    w ґଘੑٯసͷݪଇ w %3:ݪଇ w ,*44ͷݪଇ w :"(/* w ந৅ґଘݪଇ w ҆ఆґଘݪଇ w FUDʜ
  10. ؔ৺ͷ෼཭͕Ͱ͖͍ͯͳ͍ྫ ιϑτ΢ΣΞ։ൃΛֶͿؔ৺ͷ෼཭ 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) } }