양배추가좋아
268
2018-03-13 22:54:57
28
1110

함수형언어 공부하고 있습니다.


 여태 자바 웹개발 과정 듣느라 스칼라를 해볼 시간이 안났는데, 어제 수료해서 지금 3시간 째 스칼라 붙잡고

놀고 있습니다. (사실 완전 초보라 논다기보다 그냥 접해본 수준이지만)... 인텔리j에 scala랑 sbt 연동해서 한개씩 객체 만들면서 하고있는데... 왜일까요? 함수형으로 짠 코드들이 너무 멋있는거 같아서 취준 하면서 자소서 쓰면서도 하루에 3시간은 꼭 이걸 붙들면서 한개씩 인터넷에 널린 예제들 실행해보고 있는데 쓰면서도 너무 멋지다는 생각이 계속 드네요. 

 앞으로 한달 동안 계속 연습하면서 뭔가 만들어볼 생각입니다... ( 잘 될지는 모르겠지만)

1
0
  • 댓글 28

  • 양배추가좋아
    268
    2018-03-13 22:57:18

    다른 언어가 어떤지 몰라서 그러는데... 스칼라는 object 옆에 extends App 이렇게 붙여주면 자바처럼 main 함수처럼 실행할 수 있는데... 이게 스칼라만의 특징인건가요?? 단순히 옆에 extends App 이거 붙여주는거로 되는데... 

    0
  • aeba
    1k
    2018-03-14 00:07:32

    스칼라 재밌어요. 스칼라로 취업하고 싶은 학생 1인입니다... (사실 불가능할거 같아서 빨랑 관두고 스프링 공부하려고 하고 있지만요...)


    제가 API에서 읽기로는 App이란 trait 자체가 특별한 기능입니다. (DelayedInit이라는 특별한 기능을 가지고 구현이 되던데 이 기능이 App 이외에서는 사용을 권장하지 않기 때문에 사실상 App만의 특수기능이죠).


    이런 '방식'을 쓰는건 제가 아는 한에서는 스칼라가 유일합니다만 main함수 하나 적는데에 자바처럼 장황하게 적을 필요가 없는건 대부분의 언어들이 그렇습니다. 코틀린이나 JVM 바깥의 많은 언어들은 단순히 탑레벨에 main을 선언하면 그게 엔트리 포인트가 되죠. 스크립팅 언어에서는 그냥 단순히 스크립트 맨 위에서 실행되고요.


    스칼라에선 탑레벨에 메소드나 함수타입의 필드가 올 수 없기 때문에 object를 선언하지만 자바처럼 장황하게 되는걸 막기 위해 App을 도입한거 같습니다.

    1
  • 양배추가좋아
    268
    2018-03-14 00:30:36

    aeba 저도 스칼라 api도 보고 있는데 api 도 굉장히 잘 되어있는거 같아요... 굉장히 공부하기 좋은거같습니다. 다른 언어에 비해서 자료가 좀 적은거같긴하지만... ㅠ 


    0
  • 양배추가좋아
    268
    2018-03-14 00:33:32

    지금도 하는 중인데... 뭔가 굉장히 놀랍다고나 할까나... JAVA나 C++ 같은 언어에서도 이런 비슷한게 있는지 궁금해지더군여.. (제가 프로그래밍은 초보라)  너무 재밌는데... scala로는 취직길은 보장 안될거같은 생각은 들긴 하네요..

    0
  • aeba
    1k
    2018-03-14 00:44:07

    다른 메이저 언어에도 람다식 정도는 다 채용하고 있습니다. 자바에도 Function 인터페이스가 있고, C++에도 람다식이 있습니다. 파이썬이나 JS같은 언어에도 함수 리터럴을 표현하는 기본적인 문법은 다 있습니다. 그 언어가 지향하는 사상?과 부합하지 않으면 람다식을 써서 표현하기에 특별히 적합한 것이 아닌 이상 별로 쓰이지는 않지만요.


    금요일에 스칼라 컨퍼런스 참석하러 도쿄갑니다 헤헤.


    갔다가 후기정도 남길지도 모르겠네요.

    1
  • 양배추가좋아
    268
    2018-03-14 00:50:41

    aeba 오 그러시군여... 스칼라 컨퍼런스라니.. 재밌을거같아요!

    후기 남기시면 꼭 보겠습니다.

    0
  • 김카프
    68
    2018-03-14 01:04:01

    회사에서 스칼라로 일하고 있습니다.

    사실 지금 월급루팡짓 하면서 회사에서 쓰고 있습니다(...)

    회사에서는 자바와 섞어서 쓰는 편이고 스칼라 출신 개발자를 채용한 게 아니라 '나은 자바' 수준으로 코드를 짜고 있습니다만, 스칼라의 매력은 사실 함수를 인자로 넘길 수 있다는 게 아니라 대수형 데이터 타입이라던가 모나드, 펑터 등등에 있다고 생각합니다.

    사실 다른 함수형 언어 써보면 함수형 언어로서의 스칼라가 부족한 게 몇 개 보이는데요, 대수형 데이터 타입은 선언이 괜히 더 장황하다던가(아무도 안 쓰는 F#같은 거만 봐도 훨씬 간편합니다), 타입클래스도 선언이 너무 장황해서 그냥 안 쓰고 만다던가, 커링도 지원은 하는데 제대로 쓰려면 불편하고, 합수 조합도 커링이 좀 부자연스럽다보니 안 쓰게 되고 그렇습니다.

    잘 쓰는 분들도 많겠지만 다른 언어랑 비교하면 분명 불편한 점인지라...

    ScalaZ같은 거 쓰면 좀 더 하스켈처럼 쓸 수는 있는데, 이러면 또 추상화가 하늘을 뚫고 올라가버려서 쓰기 더 어렵다는 단점이..

    스칼라 관심 있으시면 Coursera에 있는 스칼라 강좌 추천합니다. 저도 그거 보고 배웠거든요.

    0
  • aeba
    1k
    2018-03-14 01:04:29
    갑자기 궁금해서 그런데 스칼라는 어떤 일 때문에 만져보게 되셨나요?


    0
  • aeba
    1k
    2018-03-14 01:07:43 작성 2018-03-14 01:12:34 수정됨

    @김카프

    대수형 데이터 타입이 장황해지는거는 Dotty (Scala 3)에서 enum 키워드의 도입으로 해결된다고 합니다. 저도 좀 기다려지네요.

    타입클래스 선언이 장황해서 안쓰신다는건 조금 잘 이해가 가지 않습니다. 데이터의 종류나 전체적인 프로그램의 구조에 따라서 OOP 서브타이핑을 쓸지 타입클래스를 쓸지 결정할 문제 아닌가요?


    스칼라가 확실히 F#같이 ML 언어에 비해선 많이 장황한 부분도 있지만(OOP/서브타이핑 지원 떄문이겠죠 아마) 간결한 부분도 있습니다.

    F#이랑 비교해봐도 람다식의 간편함 (방금 .flatMap(_._1) 쓰고 왔는데, F#에선 똑같이 쓰려면 훨씬 길죠)

    call-by-name 인자들 (F#에선 thunk를 직접 만들어서 넘겨줘야죠...)

    Higher Kinded Type 지원 (F#에선 그냥 미지원)

    0
  • 양배추가좋아
    268
    2018-03-14 01:10:17

    김카프 답변감사드립니다. 함수형의 세계는 멀고도 험하군요.. 단순하게 생각할 일이 아닌가보네요...

    저도 코세라에 스칼라 코스 보긴했는데... 지금 다른 코스를 수강중이라서 그걸 마저 끝내고 들어보겠습니다. 저는 거의 시작단계라서 아직은 모나드라든지, 펑터 등에 대해선 무지합니다만 나중에 여러자료도 접하고 강의도 들어서 꼭 그 단계까지 올라가보고 싶습니다.

    0
  • 양배추가좋아
    268
    2018-03-14 01:14:46

    aeba 꾸준한 답변 감사드립니다. 사실 저는 데이터 분석, 머신러닝을 주로 공부해서 취직을 할 생각을 갖고 있습니다. 제가 스칼라에 관심을 갖게 된건 R의 ddply 라이브러리에서 함수를 연결해서 쓰는 경우라든지... 클로저를 잘 활용해서 함수 한 두개를 가지고 데이터 전처리 등에 활용한 경우를 stack overflow 등에서 봐와서 굉장히 흥미롭게 느껴졌던게 이유였습니다. Python에서 pandas 경우에도 비슷한 사례를 봤는데, 그 사용방법이 굉장히 우아하게 느껴졌습니다. 저는 mapping, filter, reduce 같은걸 R에서 쓰긴했지만 어디서 온건지 전혀 몰랐는데, 여기서 뛰어난 다른분들 글을 보고나서 스칼라를 취미(?) 삼아서라도 접해보면 좋지 않을까 생각했습니다. 

    0
  • aeba
    1k
    2018-03-14 01:19:05 작성 2018-03-14 01:20:05 수정됨

    @양배추가좋아

    전 이번학기에 R 강의 듣고 그리고 지금 통계학도 기초부터 열심히 배우려고 하고 있습니다... 화이팅해요. 전 백엔드 서버개발만 해봐서 ㅠㅠ

    저도 코세라 첫번째꺼 다 들었어요. 들은지 1년좀 넘은거 같은데 꽤 도움이 됐던걸로 기억해요.

    0
  • 양배추가좋아
    268
    2018-03-14 01:24:25

    aeba 코세라 스칼라 강의가 괜찮은가 보네요! 지금 머신러닝 스페셜라이제이션 수강중인데 이거 끝내고 빨리 수강해야겠네요 ㅎㅎ

    저랑 배우는 입장이 다르시군요.. 저는 이제 프로그래밍 쪽을 파는거고 aeba님께서는 이제 통계를 파시고ㅎㅎ

    1
  • 김카프
    68
    2018-03-14 01:27:25

    aeba

    개인적으로는 타입클래스 선언이 진짜 장황하다고 느끼는데요, 아마 제가 하스켈과 비교하고 있어서 그런 걸지도 모르겠습니다. 하스켈에서 몇 줄이면 될 걸 스칼라에서는 트레잇에 클래스에 이것저것 선언해줘야 하니까요. 제 기준이 어느 수준에 놓였는지 아시니 왜 장황하다고 말하는지는 아시리라 믿습니다.

    위의 이유로 타입클래스는 굳이 사용하지 않고요, 굳이 쓴다면 외부 API 기능 확장할 때 쓰면 좋다고 생각은 하고 있습니다. 업무 성격상 쓸 일이 없어서 아직 도입은 안 해봤습니다만. 한 번 도입해봤는데 써보니까 굳이 필요가 없어서 그냥 롤백한 경우가(..)

    그리고 딱히 F#과 스칼라를 비교해서 어느 언어가 더 우월하다고 논쟁할 생각은 아니었습니다. 둘 다 장단점이 있으니까요. 개인적으로 F#에서 좋아하는 부분은 언어 자체가 커링을 장려한다는(혹은 사용하기 더 편하다는) 점입니다. 덕분에 이것저것 함수 조합해서 사용하기 편하거든요. 스칼라에서 못 쓰는 건 아니지만 아시다시피 문법상 커링을 쓰려면 오히려 코드가 보기에 깨끗하다고 보기 어려워지는 점 때문에 제가 코드짤 때는 미관상 피합니다.

    스칼라는 좋은 부분 설명해주셨으니 별도로 제가 붙일 필요는 없을 것 같군요.

    1
  • 김카프
    68
    2018-03-14 01:31:39 작성 2018-03-14 01:35:17 수정됨

    코맨트 보다보니 흥미롭군요(..)

    전 Coursera에서 머신러닝(스탠포드대), 머신러닝 스페셜라이제이션(워싱턴, 전체 수료), 스칼라 스페셜라이제이션(1~3), 데이터 마이닝(일리노이대, 1~4) 들었는데요, 개인적 경험에 따라 추천하면 마지막 거만 빼고 나머지는 괜찮았던 거 같습니다.

    요즘엔 코스 보고 문제 풀기에 시간이 모자라서(애 있으신 분들은 아마 이해를 하시리라 생각합니다 ㅠ) 흥미 따라서 Clojure나 Haskell같은 거도 좀 보고 프로세스 칼큘리도 위키에서 좀 읽어 보고 그러는데 뭐 이렇게 사는 것도 나쁜 거 같진 않습니다. 아직까진... ㅠ

    1
  • 양배추가좋아
    268
    2018-03-14 01:35:56

    김카프 경험한걸 알려주셔서 감사합니다. ㅎㅎ 전 일단 무작정 들어보자는 심정으로 신청한건데 후에 어떻게 할지 계획이 없었습니다. 하루종일 하는데도... 과정이 쉬운게 없어서 시간이 빠듯하네요 ㅠㅠ 



    0
  • aeba
    1k
    2018-03-14 01:36:36

    @김카프

    무슨 말씀이신지 알겠습니다. 언어차원의 지원이 아니고 있는 언어 기능들을 응용해서 구현하는 식이라 그렇게 느껴지는건 어쩔수 없는가 봅니다. F#에 대해서도 그 점은 완전히 동의합니다.


    저도 논쟁의 의도로 쓴 글이 아닌데 다시 읽어보니 그런 느낌이 드네요. 혹여나 기분나쁘셨으면 죄송합니다.

    0
  • 김카프
    68
    2018-03-14 01:52:33 작성 2018-03-14 02:01:44 수정됨

    aeba님

    사실 하스켈 기준이 아니더라도 여전히 스칼라에서의 타입클래스는 좀 장황하고 이해하기 어려운 게 아닌가 싶습니다. trait에 implicit class에 implicit val 넣다보면 이게 뭔 짓인가 싶어서 그냥 래퍼 만들어다 쓰고 그렇게 되더군요.

    그러다보니 분명 개념은 아는데 안 쓰니까 맨날 문법 까먹고 연습하면 다시 기억했다가 나중에 가면 다시 까먹고를 반복하고 있습니다(..)

    아예 ScalaZ같은걸 쓰면 맨날 써야하니까(기초니까) 기억이라도 할텐데 이쪽은 또 추상화가 너무 높아져서 손이 선뜻 안 가고...

    언어 차원에서 좀 문법 간결하게 지원해주면 자주 쓸 것도 같은데, 뭐 그렇습니다.

    (사실 매크로 있습니다. https://github.com/mpilquist/simulacrum)

    0
  • 김카프
    68
    2018-03-14 02:01:14

    양배추가좋아

    사실 저 비전공자인데요, 처음엔 좀 빡빡하지만 듣다보니 적응되는 저 자신을 발견할 수 있었습니다. 특히 스칼라 첫 번째 강좌 재귀함수부터 멘탈이 파괴되는 경험을 했었죠.

    그래도 병렬 처리 강좌까지 듣고나니까 남는 건 많았던 거 같습니다.

    스파크 코스는 왠지 모르게 의욕도 안 생기고, 애랑 놀아주기도 해야하고 그래서 잘 안 듣게 되네요.

    1
  • aeba
    1k
    2018-03-14 02:25:17
    @김카프님
    전 underscore에서 무료배포하는 Scala with Cats 이북으로 공부를 했어요. 여기 예제들 쭉 풀다보면 장황한 문법이긴 하지만 반복하게 돼서 숙달이 되는거 같더라고요. 혹시 관심있으시면 추천드려봅니다.
    0
  • 김카프
    68
    2018-03-14 03:11:43 작성 2018-03-14 03:36:47 수정됨

    aeba

    말씀 감사합니다. 사실 Scalaz 강좌 보고 공부해서 개념은 잡고 있는데 진짜 그냥 쓸 일이 없어서 자꾸 까먹는 게 문제입니다.

    이게 팀 문화따라 다를텐데 저희 팀은 멤버들 배경이 스칼라, C++, 자바로 다양한지라 타입클래스같은 거 잘 안 쓰게 되거든요... 거기다 요즘은 저도 Clojure 다시 보느라 집에서 스칼라 코딩 더 안 하게 되기도 했고요.

    0
  • 김카프
    68
    2018-03-14 09:36:44

    회사에서 월급루팡하느라 제대로 글 못 썼는데 이제 퇴근도 했겠다, 와이프도 애 보고 있겠다 경험 공유 조금 더 해봅니다.

    Coursera, Edx, Udemy 합해서 20~30개 수강한 거 같은데요, 개개가 한 달 짜리였으니까 대학 학기로 치면 대충 2학기, 학점으로 치면 한 30학점쯤 되려나(...) 싶네요.

    개인적으로 가장 만족했던 강좌는 앞서 언급했듯 스칼라 강좌입니다. 병렬처리 강좌까지 들으면 만족감이 넘칩니다. 현재 팀에서 제가 스칼라 두 번째로 잘 아는데요(...) 이게 저 빼고 나머지 멤버들이 자바/C++ 배경 갖고 있어서... 그런데 진짜 병렬처리 강좌까지만 들었는데 씹고 뜯고 맛보고 즐기고 다 됩니다.

    다음으로 만족하는 강좌는 워싱턴대 머신러닝 강좌고요, 이건 개인적으로 수리적 배경지식을 자세히 설명해줘서 좋았습니다. 원래 두 개 더 예정되어 있었는데 회사가 애플에 팔리고나서 그만 만들라고 했나봅니다. 네 개로 그냥 끝내더라고요... 덕분에 스페셜라이제이션 수료증 하나 거저 얻었습니다.

    듀크 유니버시티 통계 강좌도 괜찮았는데요, 이게 제가 다녔던 대학 학점으로 치면 한 4학점쯤은 넘지 않을까 싶네요. 15주 커리큘럼에 설명 충분하고 중간 기말고사, 프로젝트까지 완-벽-한 강좌였습니다. 지금은 스페셜라이제이션 열었던데 정보 없어서 모르겠습니다.

    Edx에 있는 UC버클리 스파크 강좌도 좋았는데요, 지금 닫혀서 아마 지금 못 듣지 않나 싶네요.

    일리노이대 데이터 마이닝 스페셜라이제이션은... 음... 시간을 아끼세요.

    그 외에도 혹시 궁금한 거 있으면 되는데까진 답해드릴 수 있을 거 같습니다.


    근데 이거 함수형 언어 스레드 아닌가요?

    0
  • 양배추가좋아
    268
    2018-03-14 10:03:12

    김카프 저도 빨리 월급루팡하고 싶습니다. ㅎㅎ 강의들 20~30개 수강하셨다니... 혹시 더 알려주실 수 있으시다면 여태까지 수강했던 머신러닝 강좌들 로드맵 같은거라도 살짝 알려주실 수 있나요?? ㅎㅎ


    0
  • 김카프
    68
    2018-03-14 10:38:26 작성 2018-03-14 10:39:19 수정됨

    양배추가좋아

    제가 들을 떄만 해도 존스홉킨스 강좌가 데이터 사이언스의 거의 유일한 옵션이었는데요, 보니까 미시건대에서 파이썬으로 데이터 사이언스 강좌를 만들었더라고요. 첫 강좌 첫 주만 보고 말았던 기억이 납니다(..)

    취향 따라 갈리겠지만 개인적으로는 미시건대 파이썬 포 에브리바디로 파이썬 입문하고 미시건대 데이터 사이언스 강좌 봐도 무방한 거 같습니다.

    수학도 좀 하셔야하니까 칸 아카데미 가셔서 선형대수 조금 들어두시는 게 좋고, 통계는 듀크 유니버시티 통계 스페셜라이제이션이 그래도 괜찮지 않을까 싶습니다. 수강은 안 했지만 설마 이전보다 나빠지진 않았겠죠...

    데이터 사이언스 강좌 수강하시면 아마 전처리, 모델 학습, 후처리 정도 기본적으로 들어갈텐데, 이 다음에 워싱턴대 머신러닝 들어가면 괜찮을 거 같습니다. 지도학습/비지도학습 균형 잘 잡혀서 들을만했던 기억이 있습니다.

    일리노이대 데이터 마이닝 스페셜라이제이션은 약간 옵션으로 보셔도 되는데, 일단 이쪽은 비지도학습 위주입니다. 근데 어렵고, 지루하고(..), 가끔 쌩뚱맞게 왜 이런거 가르치나 싶기도 하고, 결정적으로 이거 석사 수업입니다. 진짜 석사 커리큘럼 일부요.

    코세라에 빅데이터 강좌 몇 개 있는데, 회사 일 때문에 잠깐 뒤져보니까 러시아 회사 Yandex 거가 그래도 좀 괜찮더군요. 경험상 산디에고 빅데이터는 거르시는 것도 괜찮을 거 같습니다.

    이렇게 쓰고나니까 제가 엄청 체계적으로 수강한 것처럼 보이시겠지만, 사실 제가 수강할 때는 코세라 초기라서 강좌가 몇 개 없었습니다. 그래서 대학으로 치면 1학년 거 들었다가 갑자기 4학년 거 듣고 2학년 거 들었다가 다시 1학년 거 듣고 뭐 그런 식으로 들었습니다(-_-) 요즘 찾아보니까 진짜 맘만 먹으면 체계적으로 들을 수 있겠던데 왜 내가 들을 떈 없었을까(-_-)하는 생각이...

    대충 이정도 들으시면 머신러닝 엔지니어 인턴같은거 하실 수 있을텐데요, 제가 해봤으니까 아마 될 겁니다.

    대충 4개월정도 캐나다 사람이 차린 스타트업에서 머신러닝 엔지니어 인턴 했는데(2개월은 데모를 위한 비즈니스 로직 구현) 딱히 일하면서 문제는 없었던 거 같습니다.

    지금은 머신러닝 자리 구하는 게 거의 불가능해서 그냥 소프트웨어 엔지니어 하는데요, 솔직히 머신러닝 강좌 제대로 수강하시면 알고리즘 공부 따로 안하셔도 얼추 기본은 탑재 가능하십니다. 물론 공부 안 해도 된다는 건 아니고 그냥 생으로 들이박는 거 보다 좀 덜 어렵다는 수준.


    1
  • 양배추가좋아
    268
    2018-03-14 11:02:11

    양배추가좋아 저는 다음에 어떤걸 들어야하나... 조금 갈팡질팡하고 있습니다. 듀크 대학교에 bayesian inference를 청강했었고, R 관련 수업도 청강했었습니다. 근데 이게 계속 청강만 하니깐 제대로 안한달까?? 그런게 있어서 이번에 처음으로 머신러닝 스페셜라이제이션 돈내고 듣고 있거든요.. ㅎㅎ 이거 다음에 계획을 못잡고 있었는데.. 말씀해주신대로 워싱턴대, 듀크,  Yandex 를 순차적으로 들으면 괜찮겠네요! 취직 때문에 맘이 급하긴한데 ㅎㅎ 어차피 이 분야로 가려고 계획하고 있었으니 좀 여유를 두고 긴시간동안 모두 수료할 수 있도록 노력하려고 합니다

    0
  • 김카프
    68
    2018-03-14 11:32:32

    양배추가좋아

    저도 경험해봐서 갈팡질팡이 어떤 느낌인지 알 거 같습니다. 이게 커리큘럼이 딱히 있는 것도 아니고 누가 조언을 적절하게 해주는 것도 아니고 해서 이 길이 맞는 건가 싶기도 하죠.

    바로 어제 지사장님이랑 얘기할 기회가 있었는데, 사실 제가 뽑힌 이유가 (직책이 소프트웨어 엔지니어고 실제 업무도 서비스 개발임에도 불구하고) Resume에 적힌 머신러닝 관련 수료증에 있다더군요.

    제가 지금 있는 회사는 외국에 소재해있어서(미국 아닙니다. 유럽 아닙니다. GDP 한국보다 많이 낮습니다) 한국 사정에 얼마나 잘 맞을지는 모르겠는데, 일단 열심히 하시면 좋은 결과 있지 않을까 싶습니다.

    다만 경험에 따르면 머신러닝이나 AI업무를 바로 하려면 그만큼 현업 경험이 있거나 석사 정도는 있어야 하더라고요...

    1
  • NPE
    389
    2018-03-14 12:09:10 작성 2018-03-14 12:09:57 수정됨

    심심해서 4번째 댓글에 있는 코드를 Clojure로 구현해봤습니다.


    (defn do-with-one-and-two [f]
      (f 3 4))
    
    (defn -main [& args]
      (let [call1 (do-with-one-and-two #(+ %1 %2))
            call2 (do-with-one-and-two #(* %1 %2))
            call3 (do-with-one-and-two -)
            call4 (do-with-one-and-two #(mod %2 %1))]
        (println call1 call2 call3 call4)))
    7 12 -1 1

    1
  • 양배추가좋아
    268
    2018-03-14 12:26:41

    김카프 빨리 따야겠네요. ㅎㅎ응원 감사합니다. 

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.