함수형 프로그래밍 은 가장 오래된 프로그래밍 패러다임 중 하나입니다. 그러나 더 인기있는 패러다임에 비해 업계에서는 많이 사용되지 않습니다. 그러나 그것은 학계에서 크게 강조되었습니다.
함수형 프로그래밍에 대한 가장 강력한 의견은 무엇입니까?
함수형 프로그래밍 은 가장 오래된 프로그래밍 패러다임 중 하나입니다. 그러나 더 인기있는 패러다임에 비해 업계에서는 많이 사용되지 않습니다. 그러나 그것은 학계에서 크게 강조되었습니다.
함수형 프로그래밍에 대한 가장 강력한 의견은 무엇입니까?
답변:
문제는 가장 일반적인 코드는 본질적으로 비즈니스 앱, 게임, UI 등의 상태와 관련이 있다는 것 입니다. 앱의 일부 는 순전히 작동하는 데 문제가 없습니다 . 실제로 대부분의 앱은 하나 이상의 영역에서 이점을 얻을 수 있습니다. 그러나 모든 곳에서 패러다임을 강요하는 것은 반 직관적 인 느낌입니다.
함수형 프로그래밍의 문제는 함수형 프로그래밍 그 자체가 아닙니다. 함수형 프로그래밍 자체는 대부분의 사람들이이를 수행하는 언어를 디자인하는 사람들과 대부분의 사람들입니다.
문제는 매우 영리하지만 (때로는 똑같이 훌륭하지만) 너무 많은 사람들이 순결, 완벽, 세계에 대한 자신의 (종종 좁은) 견해를 강요하는 것에 대해 너무 광신적이라는 사실에서 비롯됩니다. 언어와 그것을 사용하는 모든 사람.
결과 중 하나는 타협하지 않는 것입니다. 이것은 (다른 것들 중에서도) 대략 10,000 개의 언어와 방언으로 귀찮게하기에는 충분하지만 다른 것보다 진정으로 중요한 이점을 갖기에는 거의 다른 언어로 이어집니다. 많은 사람들이 현실 세계를보고 기능 모델에 잘 맞지 않기 때문에 기본적으로 잘못되고 가장 무시된다고 결정합니다.
타협 할 수 없다는 또한 문제의 특정 유형 (또는 문제의 몇 가지 특정 유형)에 대해 절대적으로 아름다운하지만 정말 꽤 많은 언어로 이끌었다 빨아 많은 다른 사람을 위해. 그 중 일부는 아마도 기능적 모델 자체에 기인 한 것이지만,이 영역에서 시작되는 기본 성격 유형에 의해 더 많이 발생하는 것 같습니다 (적어도 나에게는).
그로 인해 많은 문제가 발생합니다. 우선, "기능적 프로그래밍"을 배우는 것은 철학적으로 가치가 있습니다. 대부분의 다른 유형의 언어에서는 특정 장르의 한 언어를 아는 것이 다른 언어를 배우는 데 큰 도움이됩니다. 프로젝트에서 언어 XI를 사용하는 경우 일반적으로 언어 Y (X는 아님)를 상당히 안전하게 알고있는 사람을 고용 할 수 있습니다. 기능적 언어를 사용하면 훨씬 덜 사실입니다. Erlang을 잘 알고 있을지 모르지만 여전히 Haskell 모나드가 완전히 외국이고 이해할 수없는 것을 발견합니다.
다수의 언어와 재능의 이식성이 제한되어 있으며, 추악한 상황이 발생합니다. 한 언어 나 방언이 합리적으로 일반적인 사용에 필요한 "중요한 질량"을 형성하는 것은 거의 불가능합니다. 그건 천천히 변화, 그러나 그것은 많은 리눅스가 지배적 데스크톱 OS되고처럼 아직 - 사람들이 인수 설득력을 마련 매년 마지막 이 될 것입니다 년 - 그냥 사람처럼 모든 것을 예측했습니다 사람 수십 년 동안, 그들은 다시 잘못 될 것입니다. 그것은 예측할 수없고 "올해가 아니라"라고 생각하는 사람들이 지금까지 옳았다는 것입니다.
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...
아니요,이 모든 절차 적 언어처럼 들립니다. Java, Scala, Kotlin, C ++, C #, Groovy, Cheddar, ES6, Ceylon, Python 등이 계속 이어지고 있습니다. 실제 문제를 해결하지 못하는 C의 지루한 반복입니다. D : 즉,이 ranty 답변 보완하기 위해 내 ranty 의견이다
함수형 프로그래밍이 널리 사용되지 않는 이유는 너무 많이 사용되기 때문입니다. "이 언어 전체가 하나의 큰 추상화 역전"이라고 말하지 않고 Lisp 또는 Haskell과 같이 신중하게 살펴보기는 어렵습니다. 필요할 때 코더가 얻을 수없는 기준선 추상화를 설정하면 언어가 단순히 할 수없는 기능을 설정하고 언어가 더 기능적 일수록 더 많은 경향이 있습니다.
예를 들어, 하스켈을 보자. 기능적 순도라는 이름으로, 어떤 것과도 상호 작용하는 모든 컴퓨터 프로그램의 가장 기본적인 두 부분 인 상태 및 I / O를 관리하기 위해 아무도 이해하지 못하는 두뇌 파괴 추상화 역전을 사용해야합니다 ! 빨리 늙어 간다.
모든 것을 존중하면서 귀하의 질문이 잘못 제기 된 것 같습니다. 함수형 프로그래밍은 도구 또는 특정 종류의 문제를 해결하는 데 유용한 도구 모음입니다. 그것에 대한 의견을 갖는 것은 특정 문제 또는 응용의 맥락에서 의미가 있습니다. 일반적으로 그것에 대한 의견을 갖는 것은 플라이어 또는 렌치에 대한 의견을 갖는 것과 같습니다.
시장에 시간
절차 적 코드와 만트라의 전체 IT 환경을 제거하기가 어렵습니다.
우선 나는 state-ful programming과 fp에 관한 논쟁을 받아들이지 않습니다. haskell에서 State 모나드를 살펴보면 코드에 대한 State의 영향을 평가할 수있는 흥미로운 새로운 방법이 많이 있습니다.
내가 fp에 대해 의미있는 논쟁을한다면, haskell과 같은 진지한 기능적 언어를 배우는 것은 포뮬러 원 자동차를 운전하는 것을 배우는 것과 같습니다. ... 흥미롭고 교육적이지만 평범한 산업 코딩에는 슬프게도 쓸모가 없습니다. , 동료들이 캠리를 운전하고 있으며 매우 기뻐합니다. fp- 친화적 인 환경에서 일자리를 찾기는 여전히 극히 어렵고, 자신이 스스로 파업하거나 fp의 잘 알려진 전문가를 찾지 않으려는 경우가 아니라면 이러한 변화를 볼 수 없습니다.
내 답변이 fp fanboy로 표시되는 것으로 가정합니다. 왜하지 말아야 할 이유를 찾는 것에 대해 걱정하기 전에 haskell과 같은 실제 fp 언어를 사용하는 것이 좋습니다.
나는 열렬한 팬이며 기능적 프로그래밍을 옹호합니다. 그러나 여기 내 요점이 있습니다.
배우기 쉬움
파이썬이나 루비 같은 프로그래밍 언어는 배우기 쉽습니다. Haskell, Agda, Coq, ATS 등과 같은 언어를 사용한 고급 기능 프로그래밍은 배우기가 매우 어렵습니다. 어떤 사람들은“수학적 구조적 프로그래밍”이라는 용어를 사용합니다. 범주 이론과 추상 수학에 익숙하면 쉽지만 "모나드"와 같은 실마리가 없다면 꽤 효과가 있습니다.
스크립팅 언어로 프로그래밍하면 생산성이 향상 될 수 있습니다.
경우에 따라 Python 및 Ruby와 같은 스크립팅 언어를 사용하면 생산성이 향상 될 수 있습니다. 이는 서로 다른 패키지 또는 라이브러리를 빠르게 프로토 타이핑하고 함께 붙이는 것을 의미합니다. 이러한 맥락에서 동적 언어 (예 : 동적 객체 지향 프로그래밍)를 사용하는 것도 좋습니다. 일반적으로 정적 입력이 더 좋지만 동적 유형을 사용한 스크립팅은 긍정적 인 영향을 줄 수 있습니다.
비즈니스 고려 사항
프로그래밍은 성공적인 소프트웨어 프로젝트의 작은 부분 일뿐입니다. 소프트웨어가 작동해야하고 사용자는 만족해야하며 사용 된 프로그래밍 언어에 반드시 의존 할 필요는 없습니다. 관리자는 새로운 기술과 프로그래밍 언어를 평가할 때의 이점과 위험을 고려해야합니다. 새로운 프로그래머가 새로운 프로그래밍 언어를 빠르게 배울 수 있습니까? 기술력이있는 회사에 경험이 있습니까? 위험이 있습니까? 상급 관리자와 논쟁하기가 어렵습니까?
비즈니스 상황에서 기능 프로그래밍은 핵심 소프트웨어 구성 요소 (예 : 미션 크리티컬하지 않은 구성 요소)에 추가하는 시스템에서 사용할 수 있습니다. 예를 들어 핵심 소프트웨어를 거의 변경하지 않지만 새로운 프로그래밍 언어로 새로운 부품 (GUI, 모니터링 소프트웨어 등)을 추가하는 은행이 있습니다. (예외가 있을지 모르지만 이것은 은행에 대한 나의 경험입니다.)
또한 함수형 프로그래밍은 공식 검증이 이익이거나 필수 일 때 매우 유용합니다.
저는 FP를 유용한 패러다임으로 반대하는 것이 아니라 프로그래밍 언어에서 사용할 수있는 유일한 패러다임으로 반대합니다.
많은 문제를 해결하는 데 유리합니다. 그러나 FP는 C와 같은 절차 적 언어로 적용될 수 있으며 지금까지도 적용되었습니다.
기능은 수백 개의 코어가 있고 잠금이 확장되지 않는 실현에 부딪 칠 때 나타납니다. 그런 다음 중첩 된 데이터 병렬이 "큰 철분"프로그램을 수행 할 수있는 유일한 방법이 될 것이며 기능면에서 뛰어납니다.
FP는 성능을 무시하면서 멋진 짧은 프로그램을 작성하는 것이 시원하기 때문에 학계에서 시원합니다. 현실 세계에는 이에 대한 음모가 없습니다. 또한 예를 들어 일부 물건 (예 : 기수 정렬)을 구현하면 FP의 총 통증처럼 보입니다. 아 그리고 생성 된 코드는 IMHExperience sloooooooooooooooooooow입니다.
일부는 학습 곡선이 상당히 가파르고 시간이 오래 걸립니다 (특히 OOP에서 온 경우 패러다임 전환을 받기 전에 머리를 몇 번 부리 게됩니다).
함수형 프로그래밍 (Java에서오고 Clojure로 이동)을 시작했지만 여전히 여전히 어렵습니다. 커뮤니티는 Java만큼 표현적인 코드를 작성하지 않는 것 같습니다.
표현력이 약간 떨어지고 복잡성이 약간 증가한 것 같습니다.
함수형 프로그래밍 언어에 대한 경험이 거의 없지만 (일부 Haskell 및 Lisp 알고 있음) FP 패러다임은 다른 패러다임보다 매우 강력하고 종종 우아합니다. FP를 사용하여 진지한 프로젝트를 진행할 기회가 있었기를 바랍니다.
FP의 효과와 관련하여 심각한 의문이 생길 수있는 유일한 영역은 귀납적으로 정의 할 수없는 복잡한 데이터 구조 (예 : 그래프)를 처리 할 수있는 방법입니다. 예를 들어, 큰 그래프에서 작동하는 알고리즘을 구현해야 할 수 있습니다. 그래프를 살펴보고 작은 로컬 변경을 수행하는 경우 FP 접근법이 프로그램이 노드에서 노드로 이동할 수있는 명령 방식과 일치하는지 궁금합니다. 포인터를 사용하는 노드.