SlideShare a Scribd company logo
1 of 31
Download to read offline
Why Functional
Programming matters
@nurinamu
LezhinEntertainment - BizDevTeam
Why do I consider FP?
Long long time ago
• 회사에서 JDK7로 개발. 모던 Language에 대한 지적
호기심
• (당시 GAE가 지원안함. 얼마전부터 지원 시작)
• 문제가 터지면 70%는 NPE… (난 null 증오해)
• 사내에 약장수가 존재 했음… ( @kunny )
Kotlin
• Null Safety 기능이 아주 훌륭해!
• Codeless!!. 코드량과 버그량은 비례
• lambda 처음 써봤어. 그냥 막 다 좋아!
• (옆에서 스칼라에 다 있는 기능이야..라고 해도 좋았음)
이 약을 어떻게 팀에 전파하지?
Kotlin 전파시 가장 많이 듣는 질문
• 그거 java8에 다 있는 기능이야
• 그거 scala에 다 있는 기능이야
• Kotlin은 android에만 쓰게 될거야
• 아직 미성숙 언어야
• 굳이 왜 써야함?
포기란 배추 셀 때 쓰는 말
• 회사에 또 다른 약장수가 있다. ( @lazysoul )
• Functional Programming이란 약이 Kotlin 사용하는
데 도움을 줄 수 있다고 한다.
• 근데 내가 FP가 뭔지 모르겠다;
• FP 스터디에 들어와라.
Functional Programming
• 선언문이 없고 함수로만 구성되도록 프로그래밍 하는
패러다임
• 음..OOP로도 가능해보이는데 정확하게 왜 FP에 대해
알아야할지 나도 모르겠음.
Reference : https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
제대로 약장사임
• Paper : https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
• Code Mesh 2015 : https://www.youtube.com/watch?v=FGQAP0GxlW8
• Erlang Factory SF 2016 : https://www.youtube.com/watch?v=Z35Tt87pIpg
• Functional Conf 2016 : https://www.youtube.com/watch?v=XrNdvWqxBvA
• Lambda Days 2017 : https://www.youtube.com/watch?v=1qBHf8DrWR8
서문
• 1.Functional Programming 이란?



- Main Function -> Functions -> Bottom Level
Function 구조로 만들어가는 프로그래밍 기법. 모든 구
성은 함수. 

- Bottom Level Function 만이 Primitives로 구성됨.
서문 cont’
• 2. FP의 특징

- 선언문이 없다. : 변수가 한번 주어지면 변경할 수 없
다.(Immutable)



- Side-Effect가 없다. : 모든 함수는 같은 입력을 받으
면 출력이 동일해야한다. 

- Side-Effect가 없기 때문에 함수들의 호출 순서와는 무관하게 동일한 결과를 얻을 수 있다. ->
제어 흐름에 대한 제약이 줄어든다 -> 연산에 대한 호출의 시간적 제약이 없기 때문에 변수와 값의
교체를 자유롭게할 수 있다. -> 참조 투명성 -> 이런 자유도가 정규화된 프로그래밍 방식보다 수학적
으로 더 적합한 프로그래밍을 할 수 있게한다.
서문 cont’
• FP의 장점

- 엄청난 생산성 : 코드량이 확실히 줄어든다. 

왜? 선언문이 없어지니까 (코드의 대부분은 선언문)
• 하지만…

- 참조 투명성과 같은 이슈에 둔감하거나 필요성을 못느끼는 개
발자들에게는 딱히 좋은 점이 안느껴진다.

- FP의 철학을 제대로 이해하지 못하고 코드를 작성하면 FP의 장
점을 제대로 얻을 수 없다.
• 서문에 언급한 특징만으로는 FP의 힘을 설명하기 어렵고, FP 개
발자들이 추구해야할 방향에 대해서 설명하기 어렵다.
• 이 논문에서 이 문제들을 짚어볼 것이다.
구조적 프로그래밍을 통한 유추
• 구조적 프로그래밍(Structured Programming, SP)을
통해 FP의 강력함을 유추해본다.
• SP의 장점들은 다음과 같다.

- goto가 없다.

- block에는 entry와 exit가 하나씩만 존재한다.

- SP는 UnSP보다 수학적으로 더 다루기 쉽다.
• SP의 장점들은 FP와 큰 차이가 없다.
구조적 프로그래밍을 통한 유추 (Cont’)
• SP vs UnSP 의 가장 큰 차이점

- SP는 모듈화가 가능하다.
• 모듈화는 엄청난 생산성 향상을 가져온다.

- 모듈의 소형화는 코드를 빠르고 쉽게 작성할 수 있게
함.

- 일반화된 모듈은 재사용이 가능. 재사용이란 관점은
절처형 프로그래밍의 빠른 발전에 기여했다.

- 프로그램의 모듈화는 테스트를 독립적으로 할 수 있게
만들었다. 이것은 디버깅 시간을 줄이는데 도움을 주었
다.
구조적 프로그래밍을 통한 유추 (Cont’)
• SP는 커다란 프로그램을 작은 단위의 프로그램으로 만들어
주는데 큰 도움을 주었다.
• 하지만…

- 모듈화는 하나의 문제를 분할해서 여러개의 문제로 만드
는 단점이 있다. 근본 문제를 해결하기 위해서는 작은 문제
들을 하나하나 모두 해결해야만한다.
• 그래서 모듈화와 마찬가지로 중요한 것은 나눠진 모듈들을
다시 잘 접착하는 것이 중요하다.

- 이 접착 방법에 대한 것이 중요한 이슈이고 이 문제를 해
결하는 것이 FP의 가장 중요한 장점으로 이야기되어야한다.
- John Hughes
“FP 개발자들은 잘 접착할 수 있는 더 작고, 더 단순
하고 더 일반화된 모듈들을 추구해야한다.”
아마도 이 모듈이 Function으로 생각됨. - nurinamu
Gluing Functions Together
Gluing Functions Together (cont’)
• Function을 작은 단위의 함수로 정의하면, 새로운 함수
도 해당 함수로 모두 표현이 가능하다.
• High-order functions (고차함수) 지원은 함수들의 결
합에 필수 지원 기능이다.
Gluing Programs Together
• g, f는 각각의 프로그램. 위 상황에서 g는 f가 output을
완전히 반환하기 전까지는 대기 상태.

- f의 output을 완전히 반환한다는 것은 특정 메모리를
그 크기만큼 선점해야한다는 것. 만약 해당 output이
거대하다면 메모리 낭비가 큼.

- 그래서 g가 연산 시작이 가능한 만큼이 만들어지면 그
때 g가 해당 f의 output을 input으로 사용하여 처리.

- 이것이 “Lazy Evaluation”
Gluing Programs Together (Cont’)
• Lazy Evaluation은 fp에서 모듈화를 위한 최고의 기능.
• 그럼 왜 non-FP에서는 Lazy Evaluation을 도입하지 않
는 것일까?

- 도입이 가능하다. 하지만 코드의 기대치가 Lazy를 기대하지 않고 만들어진 시스템에 Lazy가 도입
이되면 다른 side effect를 일으킬 수 있어, 디버깅을 더 어렵게 만든다. 그래서 처음부터 해당 기능
에 대한 고려가 없는 시스템에 추가하는 것은 좋은 고려사항이 되지 못한다.
Gluing Programs Together (Cont’)
• Newton-Raphson Square Roots
• Numerical Differentiation
• Numerical Integrations
• Lazy Evaluation은 또 다른 주제로 추가 스터디가 필요
함.

- 심화된 Lazy Evaluation 기법을 위해서는 Monads도 공부 필요.
An Example from A.I
• 간단한 틱택토 게임을 예제로 이야기.
• Static evaluation의 한계점을 이야기함.

- input 마다 모든 결과를 연산하는 것은 판이 커질 수
록 시간도 오래걸리고, 어느 순간에는 연산 불가 상태가
됨.

- 필요한 만큼만 얻고 반환하는 형태 : Lazy Evaluation
이 필요.
• High-order function을 이용해 모든 것을 함수로 표현
가능
Conclusion
• 모듈화(Modularity)는 성공적인 프로그래밍의 Key.
• 생산성 향상을 목표로하는 언어들은 반드시 모듈화 프로그래
밍을 잘 지원해야한다.
• 모듈화 프로그래밍을 지원하기 위해서는 나누는 것 뿐만 아니
라 결합에 대한 고려도 잘 되어있어야한다.
• FP는 High-order function과 Lazy Evaluation이라는 접착제
를 고려한 패러다임이다.
• 그래서 FP 개발자들은 해당 기능에 대한 숙지가 반드시 필요
하다.
그래서 Kotlin은?
• Kotlin에서의 Lazy Evaluation.

https://www.safaribooksonline.com/library/view/
introduction-to-kotlin/9781491964125/
video283045.html

• Global Function 선언이 가능.
팀원들에게는…
• 1. 모듈화된 코드를 짜도록 노력하자. 

- OOP로 이미 하고는 있지만 더 작은 단위인 함수로

- 모듈단위 TC도 편해진다.
• 2. Side-Effect 없이 또는 예상 가능한 코드를 짜자. 

- FP를 해보자
• 3. JVM 언어중에 FP로 접근할 수 있는 언어인 Kotlin을
해보자.

- Kotlin 좀 써봅시다
과연 Lezhin BizDevTeam의 미래는…?
http://tech.lezhin.com/recruit/biz_backend_develop
함께할 용자를 찾습니다.
24시간 1:1 상담 대기중
@nurinamu in funfun slack

More Related Content

Similar to Why Functional Programming Matters

131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
NAVER D2
 
SWDeveloperStory201501
SWDeveloperStory201501SWDeveloperStory201501
SWDeveloperStory201501
Suho Kwon
 
2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서
Seongho Park
 
C Language II
C Language IIC Language II
C Language II
Suho Kwon
 

Similar to Why Functional Programming Matters (20)

Pivotal Labs 고객사례 - Coinone
Pivotal Labs 고객사례 - CoinonePivotal Labs 고객사례 - Coinone
Pivotal Labs 고객사례 - Coinone
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
 
SWDeveloperStory201501
SWDeveloperStory201501SWDeveloperStory201501
SWDeveloperStory201501
 
소프트웨어 개발 프로세스 개선
소프트웨어 개발 프로세스 개선소프트웨어 개발 프로세스 개선
소프트웨어 개발 프로세스 개선
 
회사에서 새로운 기술_적용하기
회사에서 새로운 기술_적용하기회사에서 새로운 기술_적용하기
회사에서 새로운 기술_적용하기
 
JIRA 업무 생산성 향상 및 프로젝트 관리
JIRA 업무 생산성 향상 및 프로젝트 관리JIRA 업무 생산성 향상 및 프로젝트 관리
JIRA 업무 생산성 향상 및 프로젝트 관리
 
Golang+on+analytics+and+blockchain
Golang+on+analytics+and+blockchainGolang+on+analytics+and+blockchain
Golang+on+analytics+and+blockchain
 
꿀밋업시리즈3탄_Spring Boot를 활용한 마이크로서비스 개발과 페어프로그래밍(TDD)
꿀밋업시리즈3탄_Spring Boot를 활용한 마이크로서비스 개발과 페어프로그래밍(TDD)꿀밋업시리즈3탄_Spring Boot를 활용한 마이크로서비스 개발과 페어프로그래밍(TDD)
꿀밋업시리즈3탄_Spring Boot를 활용한 마이크로서비스 개발과 페어프로그래밍(TDD)
 
기술적 변화를 이끌어가기
기술적 변화를 이끌어가기기술적 변화를 이끌어가기
기술적 변화를 이끌어가기
 
컴포넌트 제대로 만들기
컴포넌트 제대로 만들기컴포넌트 제대로 만들기
컴포넌트 제대로 만들기
 
[114]파파고 서비스 2년의 경험
[114]파파고 서비스 2년의 경험[114]파파고 서비스 2년의 경험
[114]파파고 서비스 2년의 경험
 
2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서
 
C Language II
C Language IIC Language II
C Language II
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
 
언제 애자일을 써야 좋을까? The better ways of developing software
언제 애자일을 써야 좋을까? The better ways of developing software언제 애자일을 써야 좋을까? The better ways of developing software
언제 애자일을 써야 좋을까? The better ways of developing software
 
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
 
애자일의 모든것
애자일의 모든것애자일의 모든것
애자일의 모든것
 
Dev rookie codecomplete-1
Dev rookie codecomplete-1Dev rookie codecomplete-1
Dev rookie codecomplete-1
 
Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)
 

More from Lee WonJae (6)

Ready~ Action! on Google
Ready~ Action! on GoogleReady~ Action! on Google
Ready~ Action! on Google
 
KotlinJS Practice : Chrome API - TwiceRound Project #002
KotlinJS Practice : Chrome API - TwiceRound Project #002KotlinJS Practice : Chrome API - TwiceRound Project #002
KotlinJS Practice : Chrome API - TwiceRound Project #002
 
KotlinJS Overview - TwiceRound #001
KotlinJS Overview - TwiceRound #001KotlinJS Overview - TwiceRound #001
KotlinJS Overview - TwiceRound #001
 
개발자와 커뮤니티 - 기묘한 이야기
개발자와 커뮤니티 - 기묘한 이야기개발자와 커뮤니티 - 기묘한 이야기
개발자와 커뮤니티 - 기묘한 이야기
 
우리는 꿈을 꾸는 개발자들.
우리는 꿈을 꾸는 개발자들.우리는 꿈을 꾸는 개발자들.
우리는 꿈을 꾸는 개발자들.
 
WebRTC in 2014
WebRTC in 2014WebRTC in 2014
WebRTC in 2014
 

Why Functional Programming Matters

  • 2. Why do I consider FP?
  • 3. Long long time ago • 회사에서 JDK7로 개발. 모던 Language에 대한 지적 호기심 • (당시 GAE가 지원안함. 얼마전부터 지원 시작) • 문제가 터지면 70%는 NPE… (난 null 증오해) • 사내에 약장수가 존재 했음… ( @kunny )
  • 4.
  • 5. Kotlin • Null Safety 기능이 아주 훌륭해! • Codeless!!. 코드량과 버그량은 비례 • lambda 처음 써봤어. 그냥 막 다 좋아! • (옆에서 스칼라에 다 있는 기능이야..라고 해도 좋았음)
  • 6. 이 약을 어떻게 팀에 전파하지?
  • 7. Kotlin 전파시 가장 많이 듣는 질문 • 그거 java8에 다 있는 기능이야 • 그거 scala에 다 있는 기능이야 • Kotlin은 android에만 쓰게 될거야 • 아직 미성숙 언어야 • 굳이 왜 써야함?
  • 8.
  • 9. 포기란 배추 셀 때 쓰는 말 • 회사에 또 다른 약장수가 있다. ( @lazysoul ) • Functional Programming이란 약이 Kotlin 사용하는 데 도움을 줄 수 있다고 한다. • 근데 내가 FP가 뭔지 모르겠다; • FP 스터디에 들어와라.
  • 10. Functional Programming • 선언문이 없고 함수로만 구성되도록 프로그래밍 하는 패러다임 • 음..OOP로도 가능해보이는데 정확하게 왜 FP에 대해 알아야할지 나도 모르겠음.
  • 12. 제대로 약장사임 • Paper : https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf • Code Mesh 2015 : https://www.youtube.com/watch?v=FGQAP0GxlW8 • Erlang Factory SF 2016 : https://www.youtube.com/watch?v=Z35Tt87pIpg • Functional Conf 2016 : https://www.youtube.com/watch?v=XrNdvWqxBvA • Lambda Days 2017 : https://www.youtube.com/watch?v=1qBHf8DrWR8
  • 13. 서문 • 1.Functional Programming 이란?
 
 - Main Function -> Functions -> Bottom Level Function 구조로 만들어가는 프로그래밍 기법. 모든 구 성은 함수. 
 - Bottom Level Function 만이 Primitives로 구성됨.
  • 14. 서문 cont’ • 2. FP의 특징
 - 선언문이 없다. : 변수가 한번 주어지면 변경할 수 없 다.(Immutable)
 
 - Side-Effect가 없다. : 모든 함수는 같은 입력을 받으 면 출력이 동일해야한다. 
 - Side-Effect가 없기 때문에 함수들의 호출 순서와는 무관하게 동일한 결과를 얻을 수 있다. -> 제어 흐름에 대한 제약이 줄어든다 -> 연산에 대한 호출의 시간적 제약이 없기 때문에 변수와 값의 교체를 자유롭게할 수 있다. -> 참조 투명성 -> 이런 자유도가 정규화된 프로그래밍 방식보다 수학적 으로 더 적합한 프로그래밍을 할 수 있게한다.
  • 15. 서문 cont’ • FP의 장점
 - 엄청난 생산성 : 코드량이 확실히 줄어든다. 
 왜? 선언문이 없어지니까 (코드의 대부분은 선언문) • 하지만…
 - 참조 투명성과 같은 이슈에 둔감하거나 필요성을 못느끼는 개 발자들에게는 딱히 좋은 점이 안느껴진다.
 - FP의 철학을 제대로 이해하지 못하고 코드를 작성하면 FP의 장 점을 제대로 얻을 수 없다. • 서문에 언급한 특징만으로는 FP의 힘을 설명하기 어렵고, FP 개 발자들이 추구해야할 방향에 대해서 설명하기 어렵다. • 이 논문에서 이 문제들을 짚어볼 것이다.
  • 16. 구조적 프로그래밍을 통한 유추 • 구조적 프로그래밍(Structured Programming, SP)을 통해 FP의 강력함을 유추해본다. • SP의 장점들은 다음과 같다.
 - goto가 없다.
 - block에는 entry와 exit가 하나씩만 존재한다.
 - SP는 UnSP보다 수학적으로 더 다루기 쉽다. • SP의 장점들은 FP와 큰 차이가 없다.
  • 17. 구조적 프로그래밍을 통한 유추 (Cont’) • SP vs UnSP 의 가장 큰 차이점
 - SP는 모듈화가 가능하다. • 모듈화는 엄청난 생산성 향상을 가져온다.
 - 모듈의 소형화는 코드를 빠르고 쉽게 작성할 수 있게 함.
 - 일반화된 모듈은 재사용이 가능. 재사용이란 관점은 절처형 프로그래밍의 빠른 발전에 기여했다.
 - 프로그램의 모듈화는 테스트를 독립적으로 할 수 있게 만들었다. 이것은 디버깅 시간을 줄이는데 도움을 주었 다.
  • 18. 구조적 프로그래밍을 통한 유추 (Cont’) • SP는 커다란 프로그램을 작은 단위의 프로그램으로 만들어 주는데 큰 도움을 주었다. • 하지만…
 - 모듈화는 하나의 문제를 분할해서 여러개의 문제로 만드 는 단점이 있다. 근본 문제를 해결하기 위해서는 작은 문제 들을 하나하나 모두 해결해야만한다. • 그래서 모듈화와 마찬가지로 중요한 것은 나눠진 모듈들을 다시 잘 접착하는 것이 중요하다.
 - 이 접착 방법에 대한 것이 중요한 이슈이고 이 문제를 해 결하는 것이 FP의 가장 중요한 장점으로 이야기되어야한다.
  • 19. - John Hughes “FP 개발자들은 잘 접착할 수 있는 더 작고, 더 단순 하고 더 일반화된 모듈들을 추구해야한다.” 아마도 이 모듈이 Function으로 생각됨. - nurinamu
  • 21. Gluing Functions Together (cont’) • Function을 작은 단위의 함수로 정의하면, 새로운 함수 도 해당 함수로 모두 표현이 가능하다. • High-order functions (고차함수) 지원은 함수들의 결 합에 필수 지원 기능이다.
  • 22. Gluing Programs Together • g, f는 각각의 프로그램. 위 상황에서 g는 f가 output을 완전히 반환하기 전까지는 대기 상태.
 - f의 output을 완전히 반환한다는 것은 특정 메모리를 그 크기만큼 선점해야한다는 것. 만약 해당 output이 거대하다면 메모리 낭비가 큼.
 - 그래서 g가 연산 시작이 가능한 만큼이 만들어지면 그 때 g가 해당 f의 output을 input으로 사용하여 처리.
 - 이것이 “Lazy Evaluation”
  • 23. Gluing Programs Together (Cont’) • Lazy Evaluation은 fp에서 모듈화를 위한 최고의 기능. • 그럼 왜 non-FP에서는 Lazy Evaluation을 도입하지 않 는 것일까?
 - 도입이 가능하다. 하지만 코드의 기대치가 Lazy를 기대하지 않고 만들어진 시스템에 Lazy가 도입 이되면 다른 side effect를 일으킬 수 있어, 디버깅을 더 어렵게 만든다. 그래서 처음부터 해당 기능 에 대한 고려가 없는 시스템에 추가하는 것은 좋은 고려사항이 되지 못한다.
  • 24. Gluing Programs Together (Cont’) • Newton-Raphson Square Roots • Numerical Differentiation • Numerical Integrations • Lazy Evaluation은 또 다른 주제로 추가 스터디가 필요 함.
 - 심화된 Lazy Evaluation 기법을 위해서는 Monads도 공부 필요.
  • 25. An Example from A.I • 간단한 틱택토 게임을 예제로 이야기. • Static evaluation의 한계점을 이야기함.
 - input 마다 모든 결과를 연산하는 것은 판이 커질 수 록 시간도 오래걸리고, 어느 순간에는 연산 불가 상태가 됨.
 - 필요한 만큼만 얻고 반환하는 형태 : Lazy Evaluation 이 필요. • High-order function을 이용해 모든 것을 함수로 표현 가능
  • 26. Conclusion • 모듈화(Modularity)는 성공적인 프로그래밍의 Key. • 생산성 향상을 목표로하는 언어들은 반드시 모듈화 프로그래 밍을 잘 지원해야한다. • 모듈화 프로그래밍을 지원하기 위해서는 나누는 것 뿐만 아니 라 결합에 대한 고려도 잘 되어있어야한다. • FP는 High-order function과 Lazy Evaluation이라는 접착제 를 고려한 패러다임이다. • 그래서 FP 개발자들은 해당 기능에 대한 숙지가 반드시 필요 하다.
  • 27. 그래서 Kotlin은? • Kotlin에서의 Lazy Evaluation.
 https://www.safaribooksonline.com/library/view/ introduction-to-kotlin/9781491964125/ video283045.html
 • Global Function 선언이 가능.
  • 28. 팀원들에게는… • 1. 모듈화된 코드를 짜도록 노력하자. 
 - OOP로 이미 하고는 있지만 더 작은 단위인 함수로
 - 모듈단위 TC도 편해진다. • 2. Side-Effect 없이 또는 예상 가능한 코드를 짜자. 
 - FP를 해보자 • 3. JVM 언어중에 FP로 접근할 수 있는 언어인 Kotlin을 해보자.
 - Kotlin 좀 써봅시다
  • 30.