47
스타트업 극복기, 함수형 언어 방황기 박미정 [email protected] https://kr.linkedin.com/in/mjpark03 https://github.com/mjpark03

track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

Embed Size (px)

Citation preview

Page 1: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

스타트업 극복기,함수형 언어 방황기

박미정

[email protected]://kr.linkedin.com/in/mjpark03

https://github.com/mjpark03

Page 2: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

누구십니까?

Page 3: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

누구십니까?

● 스마트홈을 위한 스타트업 I/O에서 개발팀을 리드하고 있습니다.

● MAU 5,000명 돌파!

https://switcher.kr/https://www.facebook.com/switcher.io/

Page 4: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

무슨 이야기를?

Page 5: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

무슨 이야기를?

● 작은 스타트업 팀에 ‘함수형 언어’를 도입하기 위해

시도하고 있는 것들

● 작은 스타트업에 조인하면서 겪은 문제를 해결하기 위해

어떠한 고민을 했는가? (하소연..)

Page 6: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

함수형 언어 방황기

Page 7: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

저는..

함수형 언어를 쓰자고

주장하러 나온게 아닙니다..

Page 8: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

저는..

이제 막 시도하고 있거든요..

Page 9: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

저는..

그럼 왜 발표하냐..

Page 10: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

저는..

저처럼 이제 시도하시는

분들도 분명 존재하니까요!

Page 11: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

저는..

‘과정’을 공유하고 싶습니다!

Page 12: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

저는..

‘과정’에 대해

‘피드백’받고 싶어요 :)

Page 13: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

왜 함수형 언어를?

● 새로운 패러다임에 대한 성장욕구● 높은 추상화● 코드 신뢰성

...

● 다음 제품을 위한 시간적 여유(?)● 동시성

● 빅데이터

...

개인 회사

저는 함수형 언어를 알지도 못하는 사람

Page 14: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

왜 함수형 언어를? 높은 추상화, 코드 신뢰성

public class TheCompanyProcess {

public String cleanNames(List<String> listOfNames) {

StringBuilder result = new StringBuilder();

for(int i = 0; i < listOfNames.size(); i++) {

if(listOfNames.get(i).length() > 1) {

// TODO

}

}

}

※참고Functional Thinking (함수형 사고)

Java

Page 15: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

왜 함수형 언어를? 높은 추상화, 코드 신뢰성

val employees = List(“neal”, “s”, “stu”)

val result = employees

.filter(_.length() > 1)

.map(_.capitalize)

※참고Functional Thinking (함수형 사고)

Scala

우아하다..

Page 16: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을?

매주 SW 세미나

함수형 패러다임 도전

프로덕션 적용 시작

관심끌기 성공 ..

Page 17: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? 매주 SW 세미나

의미 찾기 ...

※참고https://medium.com/@jooyunghan/함수형-프로그래밍이란-무엇인가-fab4e960d263#.g01d2p1c8http://blog.jenkster.com/2015/12/what-is-functional-programming.html

Page 18: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? 함수형 패러다임 도전

함수형 언어에 등장하는 ‘특성들’을

‘기존 제품의 서버에 적용’해보고

함수형 패러다임의 ‘매력’을 멤버들과 동기화.

.filter .map .reduce ...

node.js 기반 (javascript)

높은 추상화, 코드 신뢰성

Page 19: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? .filter()

var results = [

{id: 1, invoice: '-'},

{id: 2, invoice: '6899134605305'},

{id: 3, invoice: '-'},

{id: 4, invoice: '6899134605370'}

];

results.forEach(function(value, index) {

if(value.invoice === '-') {

// TODO

}

});

var filteredResults = results.filter(function(result) {

return result.invoice === '-';

});

filteredResults.forEach(function(value, index) {

// TODO

});

javascript

Page 20: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? .filter()

case class Result(id: Int, invoice: String)

val results = List(Result(1, "-"), Result(2, "6899134605305"),

Result(3, "-"), Result(4, "6899134605370"))

val filteredResults = results.filter(_.invoice == "-")

Scala

Page 21: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? .map()

var pKeys = ['12ABcd34', '3AD893NV', 'ab89ceab'];

pKeys = pKeys.map(function(pKey) {

return pKey.toUpperCase();

});

javascript

Page 22: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? .map()

val pKeys = List("12ABcd34", "3AD893NV", "ab89ceab")

val capitalPKeys = pKeys.map(_.toUpperCase())

Scala

Page 23: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? .reduce() .fold()

var results = [

{id:1, amount:15, productId:1},

{id:2, amount:17, productId:2}

];

var totalAmount = 0;

results.forEach(function(value, index) {

totalAmount += value.amount;

});

var totalAmount = results.reduce(function(acc, item) {

return acc + item.amount;

}, 0);

javascript

Page 24: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

어떻게 팀에 도입을? .reduce() .fold()

case class Result(id: Int, amount: Int, productId: Int)

val results = List(Result(1, 15, 1), Result(2, 17, 2))

val totalAmount = results.foldLeft(0)((acc, item) => acc +

item.amount)

Scala

Page 25: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

그럼 그냥 javascript를

함수형 언어처럼 쓰면 되지 않나요?

Page 26: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

왜 Scala?

함수형 프로그래밍 언어? side effect 없는 프로그래밍을 지원하고 장려하는 언어

그래서 Scala?Java라는 OOP 세상을 떠나 FP라는 순수 세상으로 다리 역할

※참고https://medium.com/@jooyunghan/어떤-프로그래밍-언어들이-함수형인가-fec1e941c47f#.i4q8rr5t8http://blog.jenkster.com/2015/12/which-programming-languages-are-functional.html

Page 27: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

스타트업 1인 개발 극복기하드웨어 스타트업의 소프트웨어 이야기

Page 28: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

시작은?

복 기

Page 29: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

조인 이전 상황은?

1차 스위처 신청 15분만에 판매 완료

2차 스위처 신청 8분만에 판매 완료

원래 잘 되고 있었어요..

Page 30: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

조인 당시 상황은?

정말?

Page 31: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

조인 당시 상황은?

이미 레거시 서버/인프라로 운영되고 있던 제조/이벤트/스위처 시스템

레거시의 모든것을 알고 계셨던 담당자의 부재

iOS 개발자 1분, Android 개발자 1분, 펌웨어 개발자 1분

나홀로 레거시 분석하고, 사고 수습해야 하는 상황

프로세스의 부재

疊疊山中

Page 32: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

개선할 문제는?

스위처 앱/서버 사용 불안정

생산/공정 자동화 부재

이벤트 신청 서버 불안정

개발환경(서버) 부재

프로세스 부재

문제의 인프라

사용중인 기능보다 미사용 기능이 더 많은 서버

...

疊疊山中

Page 33: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

제약은 없나?

몇백명 기존 유저들의 서비스 사용 유지

매월 2배씩 증가하는 유저 감안

팀원들의 수작업 제거

곧 닥쳐올 새로운 제품 R&D

...

疊疊山中

Page 34: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

그래, 다 하려고 하지 말자

Page 35: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

1차 목표

Page 36: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

2.5개월, 유저들의 불만‘만’ 없애자

Page 37: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

개선할 문제는?

스위처 앱/서버 사용 불안정

생산/공정 자동화 부재

이벤트 신청 서버 불안정

개발환경(서버) 부재

프로세스 부재

문제의 인프라

사용중인 기능보다 미사용 기능이 더 많은 서버

...

疊疊山中

Page 38: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

문제의 인프라

‘기본만 지키자’

Page 39: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

스위처/이벤트 서버

고민1. 설계부터 변경할 것인가?고민2. 레거시를 재활용 할 것인가?고민3. 어떤 기능부터 (재)개발할 것인가?

Page 40: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

스위처/이벤트 서버 설계부터..

● DB 테이블 중복 컬럼 난무

● 다음 제품 확장성

● 불필요한 코드 생성의 근본적 원인

● 계속 불필요한 코드(a.k.a. 똥) 누적

● 변경 규모가 (아직) 크지 않음

● 사용자가 (아직) 많지 않음

● 기존 코드 로직 변경

● 사용 중인 기능에 대한 리스크

변경할 이유 변경하지 말아야할 이유

Page 41: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

스위처/이벤트 서버 레거시를..

● 기본 템플릿 재활용 가능 ● 설계 변경으로 로직 변경 발생

● 리팩토링 시간 > 새로 구현

● 불필요한 코드 난무

○ 테스트용 코드 (테스트 코드X)

○ 기능하지 않는 코드

재활용 할 이유 재활용 하지 말아야할 이유

Page 42: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

스위처/이벤트 서버 어떤 기능부터..

당연히,

고객님들이 사용하고 있는 기능진짜로

Page 43: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

스위처/이벤트 서버 어떤 기능부터..

개발된 기능

개발되었지만

기능하지 않는 기능(?)

고객들이

실제 사용중인 기능

CS 문의가

많은 (아직없는)기능

Page 44: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

선택과 집중으로

무사히 1차 목표 달성!

Page 45: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

2차 목표, 2.5개월

‘제조/공정’‘어드민’자동화로

멤버들의 수작업을 줄이자

Page 46: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

2차 목표 달성으로

현재 5,000명의 고객을 확보!

Page 47: track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, 박미정

감사합니다 ;)

[email protected]://kr.linkedin.com/in/mjpark03

https://github.com/mjpark03