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

[KR] Open-Source Ecosystems

Jaewoong
November 12, 2024

[KR] Open-Source Ecosystems

[KR] Open-Source Ecosystems

Jaewoong

November 12, 2024
Tweet

More Decks by Jaewoong

Other Decks in Programming

Transcript

  1. G E T S T R E A M .

    I O 오픈 소스 생태계 메커니즘
  2. G E T S T R E A M .

    I O skydoves @github_skydoves Lead Android Developer Advocate @ Stream 엄재웅
  3. G E T S T R E A M .

    I O 오픈 소스 생태계 오픈 소스란?
  4. G E T S T R E A M .

    I O 1. 메인테이너 (Maintainers) 오픈 소스의 창작하거나 혹은 운영하는 역할 뿐만 아니라, 소비자로부터 다양한 사용 사례와 실제 사용자 경험을 수집하고, 메인테이너가 직접 경험하지 못한 경험들로부터 인사이트를 얻을 수 있다. 이는 오픈 소스 유지 관리의 다음 로드맵을 결정하는 중요한 지침서가 된다. 오픈 소스 생태계
  5. G E T S T R E A M .

    I O 1. 메인테이너 (Maintainers) 오픈 소스의 창작하거나 혹은 운영하는 역할 뿐만 아니라, 소비자로부터 다양한 사용 사례와 실제 사용자 경험을 수집하고, 메인테이너가 직접 경험하지 못한 경험들로부터 인사이트를 얻을 수 있다. 이는 오픈 소스 유지 관리의 다음 로드맵을 결정하는 중요한 지침서가 된다. 2. 소비자 (Consumers) 소비자는 조직, 개인 또는 다른 오픈 소스 프로젝트의 관리자가 될 수 있으며, 메인테이너 혹은 다른 소비자와 소통하여 그들이 직면한 복잡한 문제에 대해 논의하고, 프로젝트를 개선하기 위한 접근 방식을 제안하는 형태로 기여한다. 소비자들이 제기하는 토론과 피드백은 프로젝트에 코드를 직접적으로 기여하지 않더라도 메인테이너에게 매우 중요한 정보로 작용한다. 오픈 소스 생태계
  6. G E T S T R E A M .

    I O 1. 메인테이너 (Maintainers) 오픈 소스의 창작하거나 혹은 운영하는 역할 뿐만 아니라, 소비자로부터 다양한 사용 사례와 실제 사용자 경험을 수집하고, 메인테이너가 직접 경험하지 못한 경험들로부터 인사이트를 얻을 수 있다. 이는 오픈 소스 유지 관리의 다음 로드맵을 결정하는 중요한 지침서가 된다. 2. 소비자 (Consumers) 소비자는 조직, 개인 또는 다른 오픈 소스 프로젝트의 관리자가 될 수 있으며, 메인테이너 혹은 다른 소비자와 소통하여 그들이 직면한 복잡한 문제에 대해 논의하고, 프로젝트를 개선하기 위한 접근 방식을 제안하는 형태로 기여한다. 소비자들이 제기하는 토론과 피드백은 프로젝트에 코드를 직접적으로 기여하지 않더라도 메인테이너에게 매우 중요한 정보로 작용한다. 3. 잠재적 소비자 (Potential Consumers) 오픈 소스 커뮤니티는 잠재 소비자를 위한 훌륭한 참고서 역할을 수행한다. 이슈를 해결하기 위해 솔루션이 필요한 개발자들은 커뮤니티 내에서 해당 솔루션의 사용 사례와 여러 가지 정보를 탐색하여, 프로젝트의 호환성을 점검하고 본인들의 요구 사항에 부합 한지 평가한다. 활발한 커뮤니티는 솔루션이 장기적인 요구 사항에 적합한지 평가 시 잠재 소비자에게 강력한 지표 역할을 한다. 오픈 소스 생태계
  7. G E T S T R E A M .

    I O 첫 번째 기여하기
  8. G E T S T R E A M .

    I O 공개 공포증 공개 공포증 극복하기 • 오픈 소스에 처음 기여하게 되는 경우 누구나 한 번쯤은 직면하게 되는 공포증이며, 본인의 코드나 의견이 본인의 개발 능력 혹은 전반적인 경력 등을 대변할 수 있다는 우려에서 발생한다.
  9. G E T S T R E A M .

    I O 공개 공포증 극복하기 • 오픈 소스에 처음 기여하게 되는 경우 누구나 한 번쯤은 직면하게 되는 공포증이며, 본인의 코드나 의견이 본인의 개발 능력 혹은 전반적인 경력 등을 대변할 수 있다는 우려에서 발생한다. • 완벽하기 위해 노력할 필요가 없다. 세계적으로 알려진 빅 테크 회사와 유명한 조직에서도 수많은 오류와 실수를 범하고 있다. 공개 공포증
  10. G E T S T R E A M .

    I O 공개 공포증 극복하기 • 오픈 소스에 처음 기여하게 되는 경우 누구나 한 번쯤은 직면하게 되는 공포증이며, 본인의 코드나 의견이 본인의 개발 능력 혹은 전반적인 경력 등을 대변할 수 있다는 우려에서 발생한다. • 완벽하기 위해 노력할 필요가 없다. 세계적으로 알려진 빅 테크 회사와 유명한 조직에서도 수많은 오류와 실수를 범하고 있다. • 오픈 소스 활동을 통해서 전 세계적인 엔지니어들과 협력하면서 귀중한 경험을 얻을 수 있기 때문에 충분히 이겨낼 가치가 있는 증상이며, 이를 통해 무한히 성장할 수 있는 기회로 삼을 수 있다. 공개 공포증
  11. G E T S T R E A M .

    I O 첫 번째 기여 • 환상적인 코드를 작성하거나 프로젝트의 전반적인 아키텍처를 훌륭하게 개선하고 버그를 해결하는 것만 기여에 속하는 것은 아니다. • 오픈 소스 라이브러리를 사용하면서 직면한 버그를 제보하거나, 사용자 경험을 향상시키기 위한 제안 또한 오픈 소스 커뮤니티에 기여하는 것이다. • 오탈자 수정 및 번역 등 문서를 향상 시키는 것도 오픈 소스 기여에 속한다.
  12. G E T S T R E A M .

    I O • 본인이 개발 중인 제품의 이름, 프로젝트 내부에서의 라이브러리 활용 사례 등과 같은 세부 정보와 함께 사용자 경험을 공유 하는 것 또한 메인테이너에게 귀한 인사이트를 제공하고 오픈 소스 생태계에 기여하는 것이다. • 조직 내에서 사용하는 오픈 소스 라이브러리 목록을 작성하고 애플리케이션 내에서 해당 라이브러리들의 라이선스를 투명하게 공개하는 것 또한 오픈 소스 커뮤니티에 기여하는 또 다른 방법에 속한다. 첫 번째 기여
  13. G E T S T R E A M .

    I O 코드 투명성 코드 투명성에 익숙해지기 • 코드의 공개를 주저하게 되는 또 하나의 이유는 본인의 코드가 다른 사람들에 의해 평가되는 것에 대한 두려움이나, 다른 개발자들로부터 매몰찬 피드백을 받을 가성능 때문인 경우가 많다.
  14. G E T S T R E A M .

    I O 코드 투명성에 익숙해지기 • 코드의 공개를 주저하게 되는 또 하나의 이유는 본인의 코드가 다른 사람들에 의해 평가되는 것에 대한 두려움이나, 다른 개발자들로부터 매몰찬 피드백을 받을 가성능 때문인 경우가 많다. • 만약 어떤 개발자가 시간을 내어 피드백을 남기거나 코드의 문제점을 지적한다면 오히려 이를 좋은 기회로 생각해볼 수 있다. 코드 투명성
  15. G E T S T R E A M .

    I O 코드 투명성에 익숙해지기 • 코드의 공개를 주저하게 되는 또 하나의 이유는 본인의 코드가 다른 사람들에 의해 평가되는 것에 대한 두려움이나, 다른 개발자들로부터 매몰찬 피드백을 받을 가성능 때문인 경우가 많다. • 만약 어떤 개발자가 시간을 내어 피드백을 남기거나 코드의 문제점을 지적한다면 오히려 이를 좋은 기회로 생각해볼 수 있다. • 코드를 이미 GitHub에 공개했다면 친구, 동료 개발자 및 다양한 커뮤니티에 공유하고 피드백을 받아보는 것 또한 나의 성장 및 오픈 소스 프로젝트의 성장을 위해 많은 도움이 된다. 코드 투명성
  16. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클
  17. G E T S T R E A M .

    I O 1. 설계 (Design) 아이디어를 청사진으로 옮기고 프로젝트의 실행 가능성을 검증하는 단계이다. 라이프사이클에서 가장 중요한 단계로, 실질적인 오픈 소스 설계과 기획이 이후 단계에서 요구되는 리소스를 줄이는데 큰 역할을 한다. 구체적인 스펙을 구현하기 전에 APIs (Application Programming Interfaces)를 미리 설계하는 경우 개발 단계의 부담을 크게 줄일 수 있다. 2. 개발 (Development) 기술과 가장 밀접한 관련이 있는 개발 단계는, '구현' 및 '테스트'로 세분화할 수 있다. 구현은 설계 단계에서 미리 정의해 놓았던 스펙에 따라 핵심 기능을 개발한다. 이 단계에서 API 설계나 개발 방식은 새로운 인사이트나 접근 법에 따라 언제든지 변경될 수 있다. 3. 준비 (Preparation) API가 어느 정도 테스트 되었다면, 해당 API를 public repository에 출시하기 위한 준비가 필요하다. API에 대한 가이드 문서 혹은 README 파일을 포함한 포괄적인 오픈 소스에 대한 목적과 API 세부사항을 제공함으로써 소비자들과 상호 작용하기 위한 준비 단계이다. 4. 배포 (Release) 오픈 소스 출시 및 배포가 준비가 된 경우, 이제 해당 패키지를 공개 저장소에 게시하여 사용자가 쉽게 액세스 하고 프로젝트에 통합할 수 있도록 한다. 오픈 소스 라이프 사이클
  18. G E T S T R E A M .

    I O 설계 개발 준비 출시 오픈 소스 라이프 사이클
  19. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Design process 1. Define the problem
  20. G E T S T R E A M .

    I O 2. Research and explore initial ideas 오픈 소스 라이프 사이클 Design process
  21. G E T S T R E A M .

    I O 3. Access the feasibility of each idea 오픈 소스 라이프 사이클 Design process
  22. G E T S T R E A M .

    I O 4. Identify and investigate dependencies 오픈 소스 라이프 사이클 Design process
  23. G E T S T R E A M .

    I O 5. Create blueprints and Design for application interfaces 오픈 소스 라이프 사이클 Design process
  24. G E T S T R E A M .

    I O 설계 개발 준비 출시 오픈 소스 라이프 사이클
  25. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Development process 개발 프로세스 • 실제 구현 과정에서 새로운 인사이트나 접근법에 따라 API 설계는 언제든지 변경될 여지가 있다. • 다른 프로젝트와의 integration test 혹은 unit test 코드를 작성하여 핵심 구현이 올바르게 동작하는지 검증한다. • 외부로 드러나는 API 표면을 최소화하여, 외부에서 갖게 되는 API 의존성 면적을 줄인다. 이에 익숙하지 않은 개발자는 지속적으로 코드를 리팩토링하고 갈무리하는 시간을 가지는 것이 좋다.
  26. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Development process
  27. G E T S T R E A M .

    I O Client Client Client Client 오픈 소스 라이프 사이클 Development process
  28. G E T S T R E A M .

    I O Client Client Client Client 오픈 소스 라이프 사이클 Development process
  29. G E T S T R E A M .

    I O Client Client Client Client 오픈 소스 라이프 사이클 Development process
  30. G E T S T R E A M .

    I O Public Internal 오픈 소스 라이프 사이클 Development process
  31. G E T S T R E A M .

    I O Client Client Client Client Public Internal 오픈 소스 라이프 사이클 Development process
  32. G E T S T R E A M .

    I O Client Client Client Client 오픈 소스 라이프 사이클 Development process
  33. G E T S T R E A M .

    I O Client Client Client Client 오픈 소스 라이프 사이클 Development process
  34. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Development process
  35. G E T S T R E A M .

    I O :app :library :material MDC implementation implementation 오픈 소스 라이프 사이클 Development process
  36. G E T S T R E A M .

    I O :app :library :material MDC com.google.android.material.R (:material) implementation implementation 오픈 소스 라이프 사이클 Development process
  37. G E T S T R E A M .

    I O :app :library :material MDC com.my.library.R (:material) (:library) com.google.android.material.R (:material) implementation implementation 오픈 소스 라이프 사이클 Development process
  38. G E T S T R E A M .

    I O :app :library :material MDC com.my.library.R (:material) (:library) com.google.android.material.R (:material) com.my.app.R (:material) (:library) (:app) implementation implementation 오픈 소스 라이프 사이클 Development process
  39. G E T S T R E A M .

    I O :app :library :material MDC Transitive dependency com.my.library.R (:material) (:library) com.google.android.material.R (:material) com.my.app.R (:material) (:library) (:app) implementation implementation 오픈 소스 라이프 사이클 Development process
  40. G E T S T R E A M .

    I O com.my.library.R (:material) (:library) 오픈 소스 라이프 사이클 Development process
  41. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Development process
  42. G E T S T R E A M .

    I O :app :library :material MDC implementation implementation com.my.library.R (:material) (:library) com.google.android.material.R (:material) com.my.app.R (:material) (:library) (:app) Wow, a million lines of code in R classes in a minute! 오픈 소스 라이프 사이클 Development process
  43. G E T S T R E A M .

    I O Dex format has 64K limit for methods and fields references! 64K 65,536  64  1024 2^10 오픈 소스 라이프 사이클 Development process
  44. G E T S T R E A M .

    I O Image: Elye 오픈 소스 라이프 사이클 Development process
  45. G E T S T R E A M .

    I O 설계 개발 준비 출시 오픈 소스 라이프 사이클
  46. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Preparation process API 코드 주석 구체화 • B2C 서비스 앱 개발과는 다르게 API의 경우 많은 개발자들이 개발 시 참고해야 하는 인터페이스기 때문에 과하다 싶을 정도의 주석도 OK. • 본인이 사용하는 언어에 맞는 주석 syntax를 별도로 학습하는 것도 권장.
  47. G E T S T R E A M .

    I O API 문서 엔진을 통한 페이지 제공 • Public interface에 한해서 API 문서 엔진을 통해 외부로 노출된 API 스펙을 자동으로 문서화하여 GitHub pages에 업로드하는 것도 좋은 방법이다. • GitHub Actions를 통해 자동화를 할 수도 있다. 오픈 소스 라이프 사이클 Preparation process
  48. G E T S T R E A M .

    I O 라이브러리 문서화 • 아무리 좋은 코드라도 문서가 올바르지 않으면 그 누구도 이것이 뭐 하는 프로젝트인지 알기 어렵고, 올바르게 사용하기 힘들다. • 개발에 투자한 시간만큼 문서화에 시간을 투자하자. 어쩌면 개발보다 더 중요할지도. • 라이브러리도 제품이다. 제품 사용 설명서는 소비자가 제품을 올바르게 사용하도록 하는 필수 지침이다. 오픈 소스 라이프 사이클 Preparation process
  49. G E T S T R E A M .

    I O 설계 개발 준비 출시 오픈 소스 라이프 사이클
  50. G E T S T R E A M .

    I O 1. Registering a Sonatype account 2. Generating a GPG key pair 3. Setting up publication in your project a. Maven publishing setup with Gradle b. Signing artifacts with GPG key c. Configure pom files d. Per-module Gradle setup 4. Publish to sonatype repository 5. Evaluate and close the ticket on staging repositories 오픈 소스 라이프 사이클 Release process
  51. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Release process
  52. G E T S T R E A M .

    I O babel line-numbers left-pad dependency dependency 오픈 소스 라이프 사이클 Release process
  53. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Release process
  54. G E T S T R E A M .

    I O 1 2 3 4 5 오픈 소스 라이프 사이클 Release process
  55. G E T S T R E A M .

    I O 1 2 3 4 5 ✅ androidx.compose.ui:ui 🃏androidx.compose.ui:ui 🃏androidx.compose.ui:ui Phishing, spoofing, sniffing.. 오픈 소스 라이프 사이클 Release process
  56. G E T S T R E A M .

    I O 오픈 소스 라이프 사이클 Release process
  57. G E T S T R E A M .

    I O 피드백 루프 및 마케팅
  58. G E T S T R E A M .

    I O 마케팅 및 피드백 루프 프로젝트를 알리고 피드백 받기 1. 지인 찬스: 주변 사람들 혹은 팀원 등 본인이 속한 조직이나 지인들에게 최대한 많은 피드백을 받고 적용한다. Community
  59. G E T S T R E A M .

    I O 프로젝트를 알리고 피드백 받기 1. 지인 찬스: 주변 사람들 혹은 팀원 등 본인이 속한 조직이나 지인들에게 최대한 많은 피드백을 받고 적용한다. 2. 커뮤니티: Twitter, Slack, Reddit, LinkedIn 등 다양한 개발자 커뮤니티에 공유하고, 최대한 많은 의견을 받아서 시야를 넓힌다. 마케팅 및 피드백 루프 Community
  60. G E T S T R E A M .

    I O 마케팅 및 피드백 루프 Community
  61. G E T S T R E A M .

    I O 마케팅 및 피드백 루프 Community
  62. G E T S T R E A M .

    I O Code speaks louder than words! 마케팅 및 피드백 루프 Sample projects
  63. G E T S T R E A M .

    I O 마케팅 및 피드백 루프
  64. G E T S T R E A M .

    I O 수익화 및 조직에서의 오픈 소스
  65. G E T S T R E A M .

    I O 오픈 소스 수익화 전략 개인으로서의 수익화 전략 1. 사용자 기반 구축: 후원할 여지가 있는 소비자(개인 및 회사)를 포함하여 상당한 규모의 사용자 기반을 구축해야한다.
  66. G E T S T R E A M .

    I O 개인으로서의 수익화 전략 1. 사용자 기반 구축: 후원할 여지가 있는 소비자(개인 및 회사)를 포함하여 상당한 규모의 사용자 기반을 구축해야한다. 오픈 소스 수익화 전략
  67. G E T S T R E A M .

    I O 개인의 오픈 소스 수익화
  68. G E T S T R E A M .

    I O 오픈 소스를 높게 평가하는 산업 • B2C (Business-to-Consumer) ⭐ ◦ 개인 소비자를 대상으로 하는 비즈니스 ◦ 통상적으로 IC role의 개발자로서 기여 ◦ 빠른 제품 개발과 고객이 일반 소비자라는 점으로 오픈 소스 개발 기회를 접하기 쉽지 않음 개인의 오픈 소스 수익화
  69. G E T S T R E A M .

    I O 오픈 소스를 높게 평가하는 산업 • B2C (Business-to-Consumer) ⭐ ◦ 개인 소비자를 대상으로 하는 비즈니스 ◦ 통상적으로 IC role의 개발자로서 기여 ◦ 빠른 제품 개발과 고객이 일반 소비자라는 점으로 오픈 소스 개발 기회를 접하기 쉽지 않음 • B2B (Business-to-Business) ⭐⭐⭐ ◦ 기업을 대상으로 하는 비즈니스 ◦ Developer Relations Engineer, Developer Advocate, Developer Experiences ◦ 샘플 프로젝트, SDK 개발, 오픈 소스 라이브러리, 커뮤니티 기여 등 비즈니스적으로 가장 밀접한 관련이 있음 • Developer Platform or Developer Ecosystem ⭐⭐ ◦ Google과 같이 무료 SDK, API, 각종 툴을 개발하여 개발자 플랫폼 또는 생태계를 구축 ◦ Developer Relations Engineer, Developer Advocate, Developer Marketing, Open-Source advocate, Developer/OSS Ecosystem Manager, Developer Relations Manager, Developer Experience Manager ◦ 샘플 프로젝트, SDK 개발, 오픈 소스 라이브러리, 커뮤니티 기여 등 직무에 따라 밀접한 관련이 있음 개인의 오픈 소스 수익화
  70. G E T S T R E A M .

    I O 개인의 오픈 소스 수익화
  71. G E T S T R E A M .

    I O 조직에서 오픈 소스에 기여하는 형태 • 많은 회사(B2C)에서 프로젝트의 잠재적 코드 유출에 대한 우려 및 라이센스 문제에 관여되고 싶지 않아 피하려는 양상이 보인다. 혹은 B2B 시나리오에서는 고객과의 거래에서 발생하는 2차적인 문제 등이 우려될 수 있다. 조직과 비즈니스에서의 오픈 소스
  72. G E T S T R E A M .

    I O 조직에서 오픈 소스에 기여하는 형태 • 많은 회사(B2C)에서 프로젝트의 잠재적 코드 유출에 대한 우려 및 라이센스 문제에 관여되고 싶지 않아 피하려는 양상이 보인다. 혹은 B2B 시나리오에서는 고객과의 거래에서 발생하는 2차적인 문제 등이 우려될 수 있다. • 그럼에도 오픈 소스를 통해 기업에서 얻을 수 있는 가치 ◦ 강력한 브랜드 입지 구축 조직과 비즈니스에서의 오픈 소스
  73. G E T S T R E A M .

    I O 조직에서 오픈 소스에 기여하는 형태 • 많은 회사(B2C)에서 프로젝트의 잠재적 코드 유출에 대한 우려 및 라이센스 문제에 관여되고 싶지 않아 피하려는 양상이 보인다. 혹은 B2B 시나리오에서는 고객과의 거래에서 발생하는 2차적인 문제 등이 우려될 수 있다. • 그럼에도 오픈 소스를 통해 기업에서 얻을 수 있는 가치 ◦ 강력한 브랜드 입지 구축 ◦ 채용 및 개발자 마케팅(Developer Marketing)을 위한 효과적인 전략 조직과 비즈니스에서의 오픈 소스
  74. G E T S T R E A M .

    I O 조직에서 오픈 소스에 기여하는 형태 • 개발하려는 라이브러리가 처음에는 상대적으로 아주 사소한 문제를 해결하더라도 일단 시장에 내어놓고 꾸준히 개선하여 성장 시켜볼 수 있다. • 가장 쉬운 접근 방식은 팀 내의 프로젝트에서 가장 작은 컴포넌트를 분리하고 보다 쉽게 커스텀 할 수 있도록 API를 빌딩하는 것부터 시작해볼 수 있다. 조직과 비즈니스에서의 오픈 소스
  75. G E T S T R E A M .

    I O 조직에서 오픈 소스에 기여하는 형태 • 개발하려는 라이브러리가 처음에는 상대적으로 아주 사소한 문제를 해결하더라도 일단 시장에 내어놓고 꾸준히 개선하여 성장 시켜볼 수 있다. • 가장 쉬운 접근 방식은 팀 내의 프로젝트에서 가장 작은 컴포넌트를 분리하고 보다 쉽게 커스텀 할 수 있도록 API를 빌딩하는 것부터 시작해볼 수 있다. • 만약 직접 빌딩한 라이브러리를 제품에서 사용하게 되었다면, 스스로 관리자이자 소비자라는 이중 역할을 통해 오픈 소스 생태계를 더 잘 이해하고 적극적으로 기여할 수 있는 훌륭한 출발점이 될 수 있다. 조직과 비즈니스에서의 오픈 소스
  76. G E T S T R E A M .

    I O Stream의 오픈 소스 접근 방식 Stream의 오픈 소스 접근법 • 일반적인 다른 SaaS 플랫폼과는 다르게 Stream의 대부분의 SDK는 오픈 소스로 공개되어 있다. • Stream은 투명성을 제공한다는 점에서 몇 가지 뚜렷한 이점을 취하고 있는데, 대표적으로 많은 Stream의 고객은 SDK의 오픈 소스화를 통한 투명성 때문에 Stream SDK를 선택했다고 응답했다.
  77. G E T S T R E A M .

    I O Stream의 오픈 소스 접근 방식 Stream의 오픈 소스 접근법 • Stream의 Developer Relations는 Stream SDK가 통합된 흥미로운 오픈 소스 프로젝트를 개발하여 기업 마케팅과 오픈 소스 생태계에 기여하는 두 가지 이점을 동시에 취하는 전략 등을 사용하고 있다. • 이를 통해 최신 기술들을 증명하고 개발자 커뮤니티에 다양한 지식을 공유하는데 초점을 두며, 잠재적 고객에서 실제 고객으로의 전환율을 높이는 훌륭한 전략으로서도 작용한다.
  78. G E T S T R E A M .

    I O GitHub & Blog Post
  79. G E T S T R E A M .

    I O https://github.com/skydoves [email protected] https://twitter.com/github_skydoves https://medium.com/@skydoves Contact
  80. G E T S T R E A M .

    I O Thank you.