13. 왜 함수형 언어를?
● 새로운 패러다임에 대한 성장욕구
● 높은 추상화
● 코드 신뢰성
...
● 다음 제품을 위한 시간적 여유(?)
● 동시성
● 빅데이터
...
개인 회사
저는 함수형 언어를 알지도 못하는 사람
14. 왜 함수형 언어를? 높은 추상화, 코드 신뢰성
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
15. 왜 함수형 언어를? 높은 추상화, 코드 신뢰성
val employees = List(“neal”, “s”, “stu”)
val result = employees
.filter(_.length() > 1)
.map(_.capitalize)
※참고
Functional Thinking (함수형 사고)
Scala
우아하다..
17. 어떻게 팀에 도입을? 매주 SW 세미나
의미 찾기 ...
※참고
https://medium.com/@jooyunghan/함수형-프로그래밍이란-무엇인가-fab4e960d263#.g01d2p1c8
http://blog.jenkster.com/2015/12/what-is-functional-programming.html
18. 어떻게 팀에 도입을? 함수형 패러다임 도전
함수형 언어에 등장하는 ‘특성들’을
‘기존 제품의 서버에 적용’해보고
함수형 패러다임의 ‘매력’을 멤버들과 동기화.
.filter .map .reduce ...
node.js 기반 (javascript)
높은 추상화, 코드 신뢰성
19. 어떻게 팀에 도입을? .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
20. 어떻게 팀에 도입을? .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
21. 어떻게 팀에 도입을? .map()
var pKeys = ['12ABcd34', '3AD893NV', 'ab89ceab'];
pKeys = pKeys.map(function(pKey) {
return pKey.toUpperCase();
});
javascript
22. 어떻게 팀에 도입을? .map()
val pKeys = List("12ABcd34", "3AD893NV", "ab89ceab")
val capitalPKeys = pKeys.map(_.toUpperCase())
Scala
23. 어떻게 팀에 도입을? .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
24. 어떻게 팀에 도입을? .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
26. 왜 Scala?
함수형 프로그래밍 언어?
side effect 없는 프로그래밍을 지원하고 장려하는 언어
그래서 Scala?
Java라는 OOP 세상을 떠나 FP라는 순수 세상으로 다리 역할
※참고
https://medium.com/@jooyunghan/어떤-프로그래밍-언어들이-함수형인가-fec1e941c47f#.i4q8rr5t8
http://blog.jenkster.com/2015/12/which-programming-languages-are-functional.html
31. 조인 당시 상황은?
이미 레거시 서버/인프라로 운영되고 있던 제조/이벤트/스위처 시스템
레거시의 모든것을 알고 계셨던 담당자의 부재
iOS 개발자 1분, Android 개발자 1분, 펌웨어 개발자 1분
나홀로 레거시 분석하고, 사고 수습해야 하는 상황
프로세스의 부재
疊疊山中
32. 개선할 문제는?
스위처 앱/서버 사용 불안정
생산/공정 자동화 부재
이벤트 신청 서버 불안정
개발환경(서버) 부재
프로세스 부재
문제의 인프라
사용중인 기능보다 미사용 기능이 더 많은 서버
疊疊山中
33. 제약은 없나?
몇백명 기존 유저들의 서비스 사용 유지
매월 2배씩 증가하는 유저 감안
팀원들의 수작업 제거
곧 닥쳐올 새로운 제품 R&D
...
疊疊山中
40. 스위처/이벤트 서버 설계부터..
● DB 테이블 중복 컬럼 난무
● 다음 제품 확장성
● 불필요한 코드 생성의 근본적 원인
● 계속 불필요한 코드(a.k.a. 똥) 누적
● 변경 규모가 (아직) 크지 않음
● 사용자가 (아직) 많지 않음
● 기존 코드 로직 변경
● 사용 중인 기능에 대한 리스크
변경할 이유 변경하지 말아야할 이유
41. 스위처/이벤트 서버 레거시를..
● 기본 템플릿 재활용 가능 ● 설계 변경으로 로직 변경 발생
● 리팩토링 시간 > 새로 구현
● 불필요한 코드 난무
○ 테스트용 코드 (테스트 코드X)
○ 기능하지 않는 코드
재활용 할 이유 재활용 하지 말아야할 이유