개발 환경에 기능 프로그래밍 소개 [닫기]


15

이것은 긴 이야기이지만 가능한 한 최대한 요약하려고 노력할 것입니다. 우리는 다양한 유형의 자금을위한 소프트웨어를 작성하는 .NET 상점입니다. 예를 들어, 건강 청구 관리 소프트웨어, 연금 관리 소프트웨어, 401 (k) 소프트웨어 및 기타 재무 유형의 물건을 작성합니다.

이제 우리는 파생 상품 및 정량 분석 ​​유형의 작업이라는 새로운 영역에 들어 섰습니다. 이것은 내가 들었던 다음 8-12 개월 안에 다가오는 것입니다.

이제 저는 이 책을 통해 여러 언어로 된 기능적인 프로그래밍을 배웠지 만 실제로는 깊이 파고 들지 않았습니다. 이제 우리는 .NET 상점이므로 일부 .NET 라이브러리와 기존 지식을 활용할 수 있기 때문에 F #이 좋은 선택이라고 생각했습니다.

내 질문은 어디서부터 시작해야 하는가? 나는 Haskell, Erlang, Scala, F # 등과 함께 가야하는지 알아 내려고 노력하는 데 매우 어려운 시간을 보내고 있습니다. 이들은 모두 매우 흥미롭고 유능하며 솔직히 이것은 Microsoft에 의존한다는 것을 알 수있는 좋은 기회 일 것입니다.

비슷한 상황이 있습니까? 그렇다면 기능에 뛰어 들었던 경험은 무엇이며 무엇을 선택했으며 왜 그런가? 나는 이것이 큰 질문이라는 것을 알고 있지만 지금은 기능적 방법을 사용하는 개발자를 알지 못하므로 끊임없이 인터넷 검색 이외의 다른 곳으로 돌리지 않고 최고의 기능적 언어로 어디서나 불꽃 전쟁을 찾을 수있는 곳이 없습니다.


권장 읽기 : 어디서부터 시작
모기

답변:


14

프로토 타입, 프로토 타입, 프로토 타입! 기능적 프로그래밍이 필요하다고 생각되는 비즈니스 기능을 한 번에 들어보고 다양한 언어를 사용해보고 원하는 이점과 상호 운용성을 실제로 제공하는지 확인하십시오.


좋은 조언과주의를 기울일 것입니다. 사실 Erlang을 지금 설치하고 있습니다.
Nodey The Node Guy

10

실제로 정직하게 대답해야하는 첫 번째 질문은 기능적 언어 사용을 고려하는 이유입니다. 스위치의 비즈니스 이유를 정당화 할 수없는 경우에는 전환해서는 안됩니다. 다시 말해서, 새로운 프레임 워크, 언어 또는 다른 새로운 기술을 배우고 싶거나 다음 "멋진"것처럼 보일 수 있기 때문에 작업 환경에 도입하려는 것은 분명히 실수입니다. 따라서 먼저 동기 부여가 무엇인지 스스로에게 진실하게 물어봐야합니다.

특정 문제를 해결하기 위해 기능 언어가 필요하다고 생각하고 대부분의 주류 기능 언어가 요구 사항을 충족한다고 가정하면 가장 성숙하고 사용자 커뮤니티가 가장 큰 언어를 사용합니다. Erlang은 좋은 선택이며 이러한 요구 사항을 모두 충족하지만 순수한 ms / .NET 환경에서는 F #을 사용하여 이해할 수 있습니다.


2
@ennukiller-함수형 프로그래밍이 우리에게 좋은 선택이며 거짓말을하지 않을 것임을 분명히 알 수 있습니다. 또한 제공 할 수있는 지적 자극을 위해서만 사용하고 싶습니다. 우리는 엄청난 양의 계산을 수행 할 것이며 멀티 코어를 활용하고 싶습니다. 또한 모든 수학적 기능이 올바른 것으로 입증되어야합니다. 기능적으로 더 쉬울 수 있음을 이해합니다.
Nodey The Node Guy

2
증명이 필요한 경우 순수 기능 프로그래밍이 가장 좋습니다. 여기에 몇 가지 제안은 명령형 언어에 대한 기능 추가 기능에 대한 것입니다. 더 친숙 할 수 있지만 올바른 코드를 제공하지는 않습니다. 부작용이있을 경우 x = x ( '참조 투명성')라는 사실을 사용할 수 없으며 코드에서 나중에 x가 여전히 이전과 동일한 값을 가지고 있음을 증명해야합니다. 예를 들어, 일부 언어에서는 x:=3; y:=10; x:=add(x,x);결과 x가 6 y이 아니고 10이 아닌 결과 가 발생할 수 있습니다 .이 문맥에서 함수가 올바른지 증명하는 것은 비현실적입니다.
AndrewC

9

기존 Java 코드베이스가있는 상점에 대해서는 Scala와 강력하게 동의하는 것처럼 기존 .Net 코드베이스가있는 상점에 대해서는 F #에 크게 동의합니다.

함수형 프로그래밍은 다른 도구와 같습니다. 잘 사용하고 이미 코드를 개발하는 방법과 통합되어 코드의 작동 방식을 쉽게 추론하여 생산성을 높일 수 있습니다. 그러나 언어 전환은 무료가 아니므로 전환에 최대한 오랫동안 기존 코드를 최대한 사용할 수있는 솔루션이 최선의 방법입니다. 결국 환경에 새로운 언어를 도입하지 못하는 가장 확실한 방법은 동료들에게 지금까지의 변화의 이점을보기 위해 지금까지 가지고있는 모든 것을 다시 작성해야한다는 것을 알려주는 것입니다. 당신은 여전히 ​​그들을 판매하려고합니다.


7

새로운 언어를 배우지 않고 기능 프로그래밍 시작하는 것이 좋습니다 . 새로운 언어의 구문을 이해하려고 할 때 새로운 패러다임을 배우려고하면 더 어려워집니다.

물론, 함수형 프로그래밍을하기 위해 특별히 개발 된 언어는 몇 가지 장점 (예 : 이해력 및 데이터 구조를 기본적으로 변경할 수 없도록하는 등)이 있지만 일반적으로 가장 큰 단계는 생각을 함수형으로 바꾸는 것입니다. 스타일. C #은 그렇게하기에 좋습니다.

기본적으로 코드 상태 변경을 중지합니다. Java를 사용 하여이 작업을 수행했으며 람다가 있기 때문에 C #을 사용하면 훨씬 쉽습니다. 일단 당신이 그 스타일에 걸 맞고 그것이 좋은 것에 대한 느낌을 가지면, F #을 선택하든 Erlang을 선택하든 기능적 언어를 선택하고 그것을 생산적으로 만드는 것이 매우 쉬울 것입니다.


1
+1 : 동의합니다. 또한 Java 및 C ++에서 더 많은 기능적 스타일로 코딩하기 시작했습니다 (더 많은 최종 변수와 const 변수 사용, 함수 구성을 사용하여 복잡한 작업 분리 등). Java 및 C ++에서 프로그래밍 스타일이 확실히 향상되었다고 생각합니다. 잠시 후, 더 나아갈 준비가되었을 때, 기능적 언어 (Haskell, Ocaml, SML, Lisp, Scala, F # 등)를 시험해 볼 수 있습니다.
Giorgio

1

기능 프로그래밍을 배우고 이해하는 것만 원한다면 IronPython을 설치하고 Python의 기능 기능에 집중하십시오. 최악의 경우 C #과 통합되어 응용 프로그램의 코드 줄을 줄이고 일정보다 더 많은 버그없는 제품을 제공 할 수있는 도구를 배우게됩니다.

파이썬의 기능적 접근 방식이 복잡한 것을 단순화 할 수있는 방법에 대한 예제를 보려면 생성기에 대한 DaBeaz의 프레젠테이션을 살펴보십시오. http://www.dabeaz.com/generators/

그 외에는 스칼라에 시간을 투자하는 것이 현명하다고 생각합니다. .NET에서 베타 모드로 실행되므로 학습 목적으로 오늘 설치하여 사용할 수 있으며 가을에는 .NET의 릴리스 모드가됩니다. 이는 JVM 및 .NET에서 이식 가능한 코드를 Scala로 작성할 수 있음을 의미합니다. 스칼라는 액터와 메시지 전달을 기반으로하기 때문에 여러 개의 개별 컴퓨터에서 실행되는 여러 개의 개별 프로그램으로 만들어진 응용 프로그램을 만드는 것은 매우 쉽습니다. .NET / JVM 이식성을 믹스에 추가 할 때 고려해야 할 또 다른 측면이 있습니다. 통신을 위해 프로토콜을 개발하지 않고도 써드 파티 Java 라이브러리와 써드 파티 .NET 라이브러리를 모두 활용하는 하나의 애플리케이션이있을 수 있습니다. 두 프로세스 모두 스칼라로 작성됩니다. 스칼라 원격 메시징 (원격 액터)을 사용하여 통신합니다. Typesafe.com이 무엇을하고 있는지 판단하여 스칼라 표준 라이브러리의 일부가 될 것으로 보이는 Akka 라이브러리를 확인하십시오.


+1 : 스칼라와 다른 플랫폼에서의 가용성에 대해 언급했습니다. 질문 : akka는 스칼라의 현재 액터 구현을 대체합니까? 아니면 둘이 나란히 존재할까요?
Giorgio

Akka가 현재 Scala 액터를 언제라도 곧 교체 할 것인지는 확실하지 않지만 Scala 제작자 Martin Odersky는 Typesafe 회사에서 Akka 제작자 Jonas Boner와 합류했습니다. 그들은 Akka와 현재 Play 프레임 워크를 통해 스칼라를 많이 홍보하고 있습니다. 따라서 개발의 초점은 Akka에 있습니다. 스칼라로 배우를 배우는 경우 먼저 Akka에 집중하는 것이 가장 좋습니다.
Michael Dillon

정보 감사합니다! 나는 스칼라의 배우들을 보았지만 지금까지 매우 피상적 ​​인 것만 보았습니다.
Giorgio

-1

나는 분명히 대답의 주된 추진력에 동의하고, 당신이 기본적으로 Erlang에게 시험을 시도함으로써 긴 일에 뛰어 들고 있다는 것을 감안할 때, 당신이 배우는 방법에 대해 꽤 잘 이해하고 오른쪽에 약간의 조금 움직일 필요가있는 것처럼 들립니다. 방향, 그래서 그것은 분명히 당신에게 좋은 대답이었습니다 ... 그러나, 나는이 대답이 나에게 전혀 도움이되지 않았 음을 알기 때문에 나는 조금 다르게 질문에 접근 할 것이라고 생각합니다. 나는 항상 배우기 위해 코딩한다! 자, 여기 내 생각이 있습니다 ...

(BTW, 나는 책의 챕터에 더 적합하도록 계속 진행하는 경향이 있으며, 나는 본능을 완전히 억누를 수는 없지만 다른 방법을 시도 할 것입니다. 여기에 내 생각을 요약하고 누군가가 더 자세한 내용을 원 하거나이 형식으로 오해의 소지가 있다고 생각하는 경우 응답 미리 알림을 통과하는 것을 잊지 않도록 최선을 다할 것입니다 ...)

업무를 계속 수행하기 위해 여기 OP에서 요청한 추력 질문에 대한 이해가 있습니다. 설명하기 위해 필요에 따라 부수적 인 내용을 유지하겠습니다 ....

먼저 빠른 답변 :

비슷한 상황에 있었습니까? 최소한 비슷했습니다. 그럼에도 불구하고 관련이 많은 다양한 프로젝트를 수행하는 주요 위치에있었습니다 ... (CRM / Web / DB / Data Integration / etc.)

어떻게 / 왜 기능적으로 뛰어 들었 습니까? " LINQ 예제를 보았지만 정적으로 유형이 지정된 언어 (주로 C ++ 및 그 이후의 C #을 주로 사용 했음)와 같은 일종의 통합 된 정적으로 유형이 지정된 쿼리 언어를 꿈꾸었지만 )] 내 경력 전반에 걸쳐 ... 그러나 그것은 내가 있었던 상당히 빠른 화재 환경이었고, 과거에 무슨 일이 일어 났는지 종종 보았지만, 실제로 그것을 결코 생각하지 않았으므로 결코 그것을 예견하지 못했습니다. Plain Old Objects (lol!)에 대한 작업을 쉽게 수행 할 수있을 것입니다. 내가 그것을 보았을 때 나는 그것을 가지고 있어야한다는 것을 알았습니다 ... 그래서 그 이유와 시작 방법은 LINQ를 이해하는 법을 배우는 데 집중했습니다. .

네 가지 생각 ... 오류, 그건 옳지 않다 ... 사고

Martijn Verburg의 답변을 읽으면 비즈니스 기능에 대한 언급이 즉시 작업중 인 모든 코드를 구현하기 시작했습니다. 초기 실험이 얼마나 얕은 지에 따라 다르게 대답 할 수는 있지만, 단지 당신의 엄지 발가락을 담그면, 나는 당신이 태클하기 시작한 처음 몇 가지 문제에 대해 아마도 내가 생각해야 할 흥분 / 열정을 줄 수있는 일 (또는 곧 일할 일)을 위해 직접 무언가를 가지고 있는지 확실하지 않습니다. ...

나는 거의 전적으로 정적으로 형식화 된 언어 + OOP 은유와 패턴 + 몇 년 동안 내 실제 문제를 해결하면서 실수로 뇌를 감싸는 모든 것을 근거로 삼았습니다 ... LINQ / FP를 사용하면 그다지 도움이되지 않는 것들에 전념하는 많은 두뇌가있을 것입니다.

나는 순수한 절차 적 절차와 OO 프로그래밍과 비슷하다고 생각합니다. OOP에서 사용하게 될 많은 절차 적 요소가 있지만, grok / ken / "get" OO를 우선시하지 않고 C에서 C ++에 온 사람들 C ++에서 매우 나쁘다. 실제로 많은 (15+)의 지옥을 인터뷰 한 오랜 펌웨어 정말 디바이스 드라이버 개발자 생각 들이 C ++을 알았지 만, 사람에서 가장 실질적으로 전혀 이해와 함께, ++, C의 이해 몹시 기본 / 교과서가 있었다거나 그들은 실제로 OOP를 한 적이 없기 때문에 OOP 경험. 그들은 정적 멤버와 정적 함수와 비 정적 / 비 싱글턴 클래스를 가진 정적 함수를 가진 싱글 톤 다목적 클래스를 작성했습니다.

그리고 FP는 패러다임에서 제기되지 않은 개념과 비슷한 개념을 가지고 있으며 그와 함께하는 다른 것들과 (많은 기술의 하이브리드 화가 이상적이라는 것을 알았지 만) 나는 더 많이 이해하고 시간이 지남에 따라 실제 기능적 능력을 툴셋으로 가져 오기 전에 내 생각이 얼마나 제한적 이었는가; 나는 아마도 대부분의 OO 프로그래머보다 조금 더 독창적 인 방식으로 과거에 많은 것들을 구현했지만, 내 생각이 어리석은 개념을 사용함에 따라 해결할 수있는 모든 종류의 문제가 있습니다 ... C ++ / C #에서해야 할 일이 많이있었습니다.

갑자기 당신은 자신을 발견 ...

"너무 긴"게시물에서

당신은 모두 엉뚱한 "읽지 못했음"의 미로에 있습니다.

가까운 장래에 화상 회의가 다가오고 있습니다.
간결한
어 허. 확실한. "terse"모드가 "on"이라고 말하겠습니다.

가까운 장래에 화상 회의가 다가오고 있습니다.
> 무엇을 의미합니까?
그냥 말해 오늘 아침에해야 할 일이 없었습니까?

가까운 장래에 화상 회의가 다가오고 있습니다. 
> 야, 그게 너 뒤에있는 거지?
뭐!? 어디?! [비명 소리가 난다]

> 죄송합니다, 나는 어디에서 문구를 이해하지 못했습니까?
[계속 뛰고 비명을 지르며 풍자에 주목받지 못함]

그래서 ... PSE, PSE에게 무엇을 배워야합니까?

저는 개인적으로 LINQ와 함께 C #에서 시작했습니다. 한 번에 몇 가지 개념을 소개 할 수 있었으며, FP와 그 개념, 그리고 더 많은 LINQ와이 둘의 관계에 대해 끊임없이 읽고 있었지만, 여전히 생산적인 작업을 수행하면서 나아갈 수있는 길을 열었습니다. 한 번에 몇 가지 사항을 추가했는데, 데이터 쿼리는 톤을 이해하지 않고도 빠르게 유용한 도구가되었습니다.

이제 다시 돌아 보면, 다음 프로젝트 (1 년 후 해결)를 먼저 할 수 있었으면 좋겠습니다. 나는 F #에 대해 어느 정도 친숙해졌다. 우연히 ML (metalanguage) 을 배우는 데 큰 도움이 되었고 다른 파생물 (예 : OCaml )도있다.

기본적으로, '무엇'에 대한 적절한 대답은 관심있는 프로그래밍 문제의 좋은 쌍을 찾는 데 달려 있지만 물론 배우고 싶은 약간의 FP와 짝을 이루어야합니다 ... 목록에서 무언가를 두드리고 나서 반복 / 가죽 ...) 물론, 당신은 항상 당신이 시작한 주요 일보다 조금 더 배우게됩니다. 처음에는 아기 발자국을 밟았지만 결국 더 큰 일을하고 그 일을하는 동안 더 작은 물건이 제자리에 놓이게되었습니다.

먼저, 보트에 떠있는 것은 무엇입니까? 특히 처음에는 재미 있고 신나는 일을하는 것이 가장 좋으며, 그럴만한 가치가있을만큼 흥미를 유지할 것입니다. 따라서 작업해야 할 IOW 문제와 이러한 문제를 해결하는 기술 ... LINQ 및 인라인 데이터 쿼리가 처음에 필요합니다. 재귀는 꼬리 재귀를 포함하여 저에게 또 다른 것이 었습니다. 나는 그것의 GodelEscherBach-ness를 발굴했습니다. 꼬리 재귀에 대해 읽었습니다. 이시기 쯤에, 내가 작업하고 있던 것들이 보류되었고, 결국 많은 시간이 걸리기 때문에 오랫동안 그것을 유지할 수있었습니다. 중단이 적 으면 쉬웠지만, 재미 있다고 생각한 것을 선택했기 때문에 일이 중단 되더라도 그렇게 힘들지는 않았습니다. :)

그리고 나는 자각하는 게 프로그램과 같이 당신에게 말할 수있는 멋진 것을 내놓지 않았지만, 나는 그것을 잘 얻었습니다.

그리고 ... 무엇으로 무엇을 배울 수 있을까요?

이를 위해 어쨌든 관심이있는 다양한 알고리즘과 F #에서 할 수 있을지 궁금했던 다양한 것들을 사용했으며 아이디어가 부족하면 99 병의 맥주Project Euler 와 같은 것들을 해결할 것입니다. 문제 ...

FP와 관련이있는 많은 관심사를 찾을 수있을 것입니다. 그것은 향상에서 OOP에 이르기까지 모든 것을 제공합니다. 사물을 조금 더 간결하게 진술하는 데 도움이됩니다. 이전에 생각했던 방식을 인식하지 못하고 정신 모델이 표현할 수없는 모양으로 왜곡시키는 데 도움이됩니다. 전에.

하지만 ... 내 모델에는 구멍이있어, PSE에게 ...

그렇기 때문에 특히 처음에 배우는 것이 중요하지만 실제로 학습하는 동안 (그리고 무언가를 배우고있을 때 항상 그렇지는 않습니까?) 적어도 문제 사이에 약간의 시간이 걸리면서 관련이없는 것을 읽습니다. 여전히 FP 및 전문가에 의해 작성된 소스 코드를 읽을 시간, 바람직하게는 동일하거나 유사한 문제를 해결하는 것; 물건에 대한 설명뿐만 아니라 ...

그리고 오래 동안, 당신은 당신의 오래된 관점에서가 아니라 FP 자체 안에서 모든 것을 이해하기 위해 당신의 두뇌를 긴장시켜야합니다 ... 어느 시점에서, 그것은 클릭했고, ... 내가 그것을 가장 잘 연관시킬 수있는 것은 네덜란드어에 유창 해지고있다. 어느 시점에서 나는 마음가짐에 충분히 자신을 넣을 수 있었다 (나는 기본적으로 여기에 설명 된 침수를 통해 그것을했다; "book larnin '"을 통해서만 배우려고하지 않고 FP에 몰입한다 ...

그리고 결국 나는했다. 나는 OP / LINQ를 다시 OOP로 변환하려고 노력하지 않고도 FP / LINQ가 터지기 시작할 때까지 모든 것을 내면화하고 뇌를 뒤 틀었습니다. (예, 그렇게했습니다. 치마를 걸 수있는 무언가가있었습니다. 모자. 뭐든간에.)

마지막 생각들...

내, 내, 당신은 당신의 서명 영리한 생각하는 능력을 잃고있는 것 같습니다
섹션 제목. 부끄러운 일이야

원격 회의가 여전히 빠르게 다가오고 있습니다. 지금은 훨씬 더 크게 나타납니다.
> 네, 그래요 .. 간결하고. 나는 당신이 그 소문을 잃은 것을 보았습니다.
 가까운 전화, 그 ... 음, 그래, 난 겁쟁이 ... 오 다시는 없습니다!
AAAAAAAHHHHHH !! [다시 비명을 지르며 도망 간다]

원격 회의가 여전히 빠르게 다가오고 있습니다.
Lancyjohn Cleezewiz 경과 비슷합니다.
거의 당신에게 있습니다.
> 이봐, 서둘러! 나는 당신과 함께 시도하는 실험이 있습니다! (그리고 po-ta-to)

온라인으로 FP에 대한 풍부한 정보를 자연스럽게 찾을 수 있습니다. 중요한 것은 기본 개념을 이해하고 적용하는 법을 배우는 것입니다. 예를 들어, 불변성에 대해 배우고 그것이 FP에 중요하고 유용한 이유를 알아보십시오. 순수한 FP가 공식적인 증거에 훨씬 더 잘 어울리는 방법과 같은 모든 것을 다루는 작은 이론을 배우는 것이 좋습니다. 이것이 F #의 선구자 ML의 원동력이었습니다. YMMV은 물론 당신은 눈물에 지루 사람이 경우, 예 많은 시행 착오를 많이 정확하게 볼 수 있습니다 이유에 사용되는 기술은 그들이 당신이이 도움이 될 것입니다 무엇을 '아하!' 전구 순간.

그래서 지금은 그대로 두겠습니다. 이것이 누군가에게 도움이되기를 바랍니다. 배우고 자하는 특정 내용에 대해 좀 더 알고 싶었지만 지금은 시간이 없습니다. 나는 그것이 나를 위해 긴 주일을 기대하고 있지만, 아마 주말에 다시 돌아올 시간을 찾을 수 있기를 바랍니다.

<3 "SnozzML이 끝날 때까지 스톱 갭 GRUEBOL을 소개합니다. 조만간 이번에는 저를 도와주는 거대한위원회가있었습니다." -그레이스 호퍼 위트 에그 헤드, 유명한 마지막 단어 XX97 GUE <3


"친애하는 SO"는 무엇입니까?
gnat

소중한 스택 오버플로; 노래의 리듬에 맞게 가정의 xD '버킷에 구멍이있다'는
shelleybutterfly

SO 외부에 게시되면 포인트를 이해하기 어렵게 만드는 것 같습니다. 편집 을 고려하십시오
gnat

멍청 아! 그렇습니다. tyvm. :)
shelleybutterfly

누구든지 내 대답을 향상시키는 방법에 대한 제안이 있으면 감사하겠습니다 .. 유머가 나쁜가요? 또는 나쁜 조언? 실제로 내 경험을 기반으로하므로 더 유용하게 사용할 수 있다면 변경해 드리겠습니다. 고마워;)
shelleybutterfly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.