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

좋은 서비스를 만들기 위한 제품팀 문화 이해하기

좋은 서비스를 만들기 위한 제품팀 문화 이해하기

2024년 7월 30일 마인이스 기업 초청 강연 자료입니다.

마케팅, PR, 사업, 운영 등 제품에 직접적으로 관여하지 않는 직군들에게,
PM, 디자이너, 개발자 등 제품을 만드는 사람들은 어떻게 일하는지, 어떤 문화를 가지고 있는지 다양한 관점으로 소개합니다.

- 제품팀의 커리어는 무엇일까
- OKR
- 소프트웨어 공학 (워터폴 vs 애자일)
- 프로젝트/작업 관리
- 데이터/실험 기반 서비스 운영

좋은 제품문화에서 구성원은 행복하게 성장합니다.
그리고 좋은 제품문화는 긴급한 사업과 운영 요구사항도 균형있게 받아주며, 회사도 성장합니다.
회사와 구성원이 함께 행복하게 성장하는 제품문화의 여러가지 배경과 이론을 설명합니다.

Seungmin 마량

July 30, 2024
Tweet

More Decks by Seungmin 마량

Other Decks in Business

Transcript

  1. ੉۱ (അ) ীয೐ۨ޷ই ەझ ೐ۿ౟ ݒפ੷ (അ) GDE Android Korea

    (੹) ߛ௼࢟۞٘ ೐ۿ౟ ݒפ੷ (੹) ٘ۄ݃ঙஹಌפ উ٘۽੉٘ ѐߊ੗
  2. ݾର 1. ઁಿ౱ ழܻয ੉೧ೞӝ 2. OKR ੉೧ೞӝ 3. ઁಿ

    ѐߊߑध ੉೧ೞӝ 4. ೐۽ં౟ ҙܻ ੉೧ೞӝ 5. ઁಿ૑಴ ੉೧ೞӝ 6. ࢎসҗ ઁಿޙച Ӑഋ੟ӝ 7. ݃ޖܻ
  3. ઁಿ౱ ੄਄੉ ৢۄоਃ ☺ ੢ӝ 적 ੉Ҋݺഛೠ࠺ 전 ਷ য

    떤 ޙઁ೧ 결 ਸ҃೷ೡ૑ঌ۰઱Ҋ ழܻযী؀ೠഛनਸળ׮ ࢲ࠺झ੄੢ӝ 적 ݺഛೠ࠺੹ীղоӝৈೡࣻ੓ਸٸ
  4. ઁಿ৮ࢿب উ੿ࢿ ѐߊബਯ ਍৔ࢿࣼب ౱࠽٬ ݒ୹ j Objective ݽٚо஖ܳ૘ 중

    0CKFDUJWFח੉ 번 ࠙ӝ֙بী ૘ 중 ೞחߑೱࢿਸ૑੿ೠ׮ ӔѢח࠺੹
  5. Ҋ 객 ੉ఎਸ઴੉ӝਤೠઁಿউ੿ࢿਸৢܽ׮ Objective ৘द ૑ࣘоמೠӝ 업 ਍৔ਸਤ೧ݒ୹ਸ௼ѱৢܽ׮ ਍৔࠺ਊ੺ডਸਤ೧$4೐۽ࣁझܳѐ 선

    ೠ׮ द੢੼ਬਯਸ֫੉ӝਤ೧࠳ے٘ੋ૑بܳ֫ੋ׮ Ҋ 객 ੄ਗഝೠজࢎਊਸਤ೧ࢿמਸৢܽ׮ ѐੋ ഥࢎ ѐߊ౱ $4౱ ݃ா౴౱
  6. ਕఠಫ਷ ঱ઁ ࢎਊೞաਃ? ࢎਊೡҊ 객 ੉߈٘द੓׮ ӝദױ҅ী 서 Ҋ 객

    ೖ٘ 백 ਸ߉ਸࣻ੓׮ Ҋ 객 पಁഛܫ੉ծ׮ ❌ ࠺ਊܻझ௼חৈ੹൤௼૑݅
  7. Ӓ ৻ ೐۽ં౟ ҙܻ ੉ঠӝ ౭௄ਬഋ ী೗ झషܻ ೞਤ౭௄ ߡӒ

    সޖஏ੿ࣻ஖ झషܻನੋ౟ ਕ௼ఋ੐
  8. ࢎਊ੗ ೯ز੉ۆ ച 면 ੉ز ௿ܼ ੤ߑޙ ਖ਼ઓ  결

    ઁ ஶబஎࢤࢿ١ ࢎਊ੗оࢲ࠺झী 서 ೞחݽٚ೯ز
  9. ചݶ ೯ز ఋ੉߁ য٣ীࢲ ೯زೞ৓חо যڃ ೯زਸ ೞ৓חо ঱ઁ ۽Ӧ

    ೡ Ѫੋо ੉ܴ ചݶ, ೯ز, ఋ੉߁ਸ ೞա੄ ੉ܴਵ۽ ಴അ ࣘࢿ э਷ ೯ز੉যب ׮ܲ ࢎਊ੗/੉߮౟ ࢚ടਸ ಴അ ੉߮౟ ҳࢿ
  10. ੉߮౟ ੿੄ ৘द No, ചݶ ࢎਊ੗ ೯زҗ ఋ੉߁ ੉ܴ ࣘࢿ੉ܴ

    / ч 1 ੗࢑ ചݶ ૓ੑ enter__assets_home 2 - ੗࢑ زӝച ࢿҕ success__sync_assets 3 ஠٘୶ୌ ࢚ಿ ௿ܼ click__product_card ੉ܴ: id / ч: ࢚ಿ ই੉٣ ч ৘द: 3425, 1829 ੉ܴ: company / ч: ӝҙ ੉ܴ ч ৘द: नೠ஠٘, Ҵ޹஠٘ 4 ݽٚ ചݶ জ द੘ ನӒۄ਍٘ ചݶ੉ 0ѐীࢲ 1ѐо غח द੼ open_app ੉ܴ: os ч ৘द: android, ios, web
  11. binding.contactButton.setOnClickListener { view -> analyticsManager.logEvent(EventDefinitions.clickContactHouseDetail()) startActivity( Intent(Intent.ACTION_DIAL, Uri.parse("tel:${houseLiveData.value.contact}")) ) }

    fun logEvent(event: EventDefinition) { firebaseAnalytics.logEvent(event.eventName, Bundle()) amplitude.logEvent(event.eventName) } 이벤트 코드 심기
  12. binding.contactButton.setOnClickListener { view -> analyticsManager.logEvent(EventDefinitions.clickContactHouseDetail()) startActivity( Intent(Intent.ACTION_DIAL, Uri.parse("tel:${houseLiveData.value.contact}")) ) }

    fun logEvent(event: EventDefinition) { firebaseAnalytics.logEvent(event.eventName, Bundle()) amplitude.logEvent(event.eventName) } ߡౡ ௿ܼ द ੉߮౟ ੹࣠ 이벤트 코드 심기
  13. binding.contactButton.setOnClickListener { view -> analyticsManager.logEvent(EventDefinitions.clickContactHouseDetail()) startActivity( Intent(Intent.ACTION_DIAL, Uri.parse("tel:${houseLiveData.value.contact}")) ) }

    fun logEvent(event: EventDefinition) { firebaseAnalytics.logEvent(event.eventName, Bundle()) amplitude.logEvent(event.eventName) } Firebase, Amplitude ١ ؘ੉ఠ ೒ۖಬী ੉߮౟ ੹࣠ 이벤트 코드 심기
  14. class BaseActivity : Activity() { protected open var enterEvent: EventDefinition?

    = null override fun onResume() { super.onResume() if (enterEvent != null) { analyticsManager.logEvent(enterEvent!!) } } } class UploadTypeActivity : BaseActivity() { override var enterEvent: EventDefinition? = EnterEventDefinitions.uploadType() } class HouseListActivity : BaseActivity() { override var enterEvent: EventDefinition? = EnterEventDefinitions.houseList() } Enter 이벤트 코드
  15. class BaseActivity : Activity() { protected open var enterEvent: EventDefinition?

    = null override fun onResume() { super.onResume() if (enterEvent != null) { analyticsManager.logEvent(enterEvent!!) } } } class UploadTypeActivity : BaseActivity() { override var enterEvent: EventDefinition? = EnterEventDefinitions.uploadType() } class HouseListActivity : BaseActivity() { override var enterEvent: EventDefinition? = EnterEventDefinitions.houseList() } ചݶ૓ੑ ࢤݺ઱ӝী ੉߮౟ ௏٘ ࢗੑ Enter 이벤트 코드
  16. class BaseActivity : Activity() { protected open var enterEvent: EventDefinition?

    = null override fun onResume() { super.onResume() if (enterEvent != null) { analyticsManager.logEvent(enterEvent!!) } } } class UploadTypeActivity : BaseActivity() { override var enterEvent: EventDefinition? = EnterEventDefinitions.uploadType() } class HouseListActivity : BaseActivity() { override var enterEvent: EventDefinition? = EnterEventDefinitions.houseList() } ചݶ݃׮ ੉ܴ ੿੄ Enter 이벤트 코드
  17. ࢲ࠺झ ઱ਃ ૑಴ܳ ؀಴ೞח ੉߮౟ܳ ੿೧ঠ ೤פ׮ Active User(AU) ӝળ

    ੉߮౟ ࢲ࠺झ ೨ब ੉߮౟ ࢲ࠺झо ઺ਃೞѱ ࢤпೞח ೨ब ࢎਊ੗ ೯زਸ ੿੄೧ঠ ೤פ׮. ‘জਸ ࢎਊೞҊ ੓ח ਬ੷੉׮’ܳ ౸ױೡ ࣻ ੓ח ೯زਸ ੿੄೧ঠ ೤פ׮.
  18. Active User(AU) ӝળ ੉߮౟ ৘द झ೒ېद ചݶਸ ૓ੑೞݶ AU۽ ನೣೠ׮

    ۽Ӓੋ റ ക ചݶী ૓ੑೞݶ AU۽ ನೣೠ׮ যڃ ചݶ੉ٚ ನӒۄ਍٘۽ ৢۄয়ݶ AU۽ ನೣೠ׮
  19. ࢲ࠺झ ೨ब ੉߮౟ ৘द ழݠझ ࢲ࠺झ੉޲۽ Ѿઁ ೯زਸ ઱ਃ ੉߮౟۽

    ஏ੿ೠ׮ SNS੉޲۽ ஶబஎ ࢤࢿ ೯زਸ ઱ਃ ੉߮౟۽ ஏ੿ೠ׮ ࠗز࢑ ઺ѐ ࢲ࠺झ੉޲۽ ࠗز࢑ োۅ ೯زਸ ઱ਃ ੉߮౟۽ ஏ੿ೠ׮
  20. AU ࠙ࢳ ੉߮౟ߊࢤࣻܳࠁח"6࠙ 석 DAU 10݅ݺ ઺, 3݅ݺ੉ Ѥъ ചݶী

    ٜযৡ׮ Ѥъ ചݶী ٜযয়ח 3݅ݺ ઺ 2݅ݺ੉ ੗࢑োز੉ غয੓׮ Ѥъ ചݶী ٜযয়ח 3݅ݺ ઺ 1ୌݺ੉ ߡౡਸ ׂ۞ ੗࢑োزਸ दبೠ׮ enter property click
  21. AU ࠙ࢳ ੉߮౟ߊࢤࣻܳࠁח"6࠙ 석 DAU 10݅ݺ ઺, 3݅ݺ੉ Ѥъ ചݶী

    ٜযৡ׮ Ѥъ ചݶী ٜযয়ח 3݅ݺ ઺ 2݅ݺ੉ ੗࢑োز੉ غয੓׮ Ѥъ ചݶী ٜযয়ח 3݅ݺ ઺ 1ୌݺ੉ ߡౡਸ ׂ۞ ੗࢑োزਸ दبೠ׮ enter property click Ѥъ ӝמ਷ ਬ੷੄ 30%о ࠁҊ Ӓ઺ 66%о োزغয ੓׮ োزغয੓૑ ঋ਷ ࢎਊ੗ ઺ 10%о োزਸ दبೠ׮
  22. ܻబ࣌ ࠙ࢳ ౠ੿೯ز੉റੌ੿दрٍجইয়ח ܻబ࣌࠙ 석 ੗࢑ োزਸ दب೮؍ ࢎۈ਷ दبೞ૑

    ঋও؍ ࢎۈࠁ׮ (Click) 7ੌ ղ জਸ ੤ߑޙೞח ࠺ਯ੉ (open_app) 10% ֫׮
  23. ౠ੿೯ز੉റੌ੿दрٍجইয়ח ܻబ࣌࠙ 석 ੗࢑ োزਸ दب೮؍ ࢎۈ਷ दبೞ૑ ঋও؍ ࢎۈࠁ׮

    (Click) 7ੌ ղ জਸ ੤ߑޙೞח ࠺ਯ੉ (open_app) 10% ֫׮ ੗࢑ োزਸ औѱ दبೡ ࣻ ੓ب۾ ѐࢶ೧ঠѷ׮ ܻబ࣌ ࠙ࢳ
  24. ௏ഐ౟ ࠙ࢳ ഥਗоੑਸ ਤ೧ Ѣ୛ঠೞח 3ѐ੄ ചݶ ઺ ࠄੋੋૐਸ ೞח

    2ߣ૩ ചݶীࢲ ੉ఎ੉ ݆׮ ױ҅߹۽੉ఎܫਸࠁח௏ഐ౟࠙ 석
  25. ࠄੋੋૐਸ औѱ ೡ ࣻ ੓ب۾ ѐࢶ೧ঠѷ׮ ഥਗоੑਸ ਤ೧ Ѣ୛ঠೞח 3ѐ੄

    ചݶ ઺ ࠄੋੋૐਸ ೞח 2ߣ૩ ചݶীࢲ ੉ఎ੉ ݆׮ ױ҅߹۽੉ఎܫਸࠁח௏ഐ౟࠙ 석 ௏ഐ౟ ࠙ࢳ
  26. ؘ੉ఠ ࠺Ү জ ੹୓ AU ઺ ੗࢑ AUח 80%, о҅ࠗ

    AUח 60%, ੗زର AUח 10%੉׮ ֢റח AUо ծ૑ ঋ૑݅, ܻబ࣌੉ ݽٚ ӝמ ઺ ઁੌ ծ׮ ӝמՙܻ઱ਃ૑಴࠺Ү
  27. ؘ੉ఠ ࠺Ү জ ੹୓ AU ઺ ੗࢑ AUח 80%, о҅ࠗ

    AUח 60%, ੗زର AUח 10%੉׮ ֢റח AUо ծ૑ ঋ૑݅, ܻబ࣌੉ ݽٚ ӝמ ઺ ઁੌ ծ׮ ӝמՙܻ઱ਃ૑಴࠺Ү ੗زର৬ ֢റח ࢲ࠺झ੄ ઱ਃ ӝמ੉ ইפ׮
  28. ਃ୒ਸ যڌѱ ҙܻೡө झ೐ܽ౟ীਃ୒সޖܳ֍Ҋ ׮ܲসޖܳࡒ׮ ޖटসޖܳࡓө  য٣ө૑ೞҊݥ୹ө  언

    협 ࠺੹੉ݺഛೞҊ ૓೯࢚ട੉ైݺೞҊ ઱୓੸ੋઁಿޙചۄ 면  ୽࠙൤оמ೤פ׮