당신은 곤혹스러운 프로그래머입니까?함수식 언어를 배우다


충분히 폭로: 나는 헷갈리기 쉬운 프로그래머이다.나의 머리는 백판 천재처럼 그렇게 일하지 않는다.나는 태어날 때부터 예술가였고 낙서를 가장 잘한다.나는 avisual language의 프로그래머가 되는 것을 독학했다. 왜냐하면 나는 그것이 만든 도형과 키보드의 찰칵거리는 소리를 좋아하기 때문이다.나는 프로그래머라기보다는 예술가와 작가이다.내가 복잡한 코드를 읽을 때, 나는 곤혹스러워하기 쉽기 때문에, 나는 가능한 한 원본 코드를 읽는 것이 아니라, 인성화된 문서와 주석을 읽는 것을 거의 좋아한다.
Recurse Center 이후 마지막 몇 년 동안 나는 프로그래머의 휴가 속에서 배회하며 내가 파악할 수 있는 어떤 재미있는 언어도 시도해 보고 싶었다.이것은 나의 뇌신의 망치를 찾는 개인적인 여정이다.어떤 것은 내가 오랫동안 버텼고, 다른 하나는 거의 물에 담근 후에 버렸다.모든 언어는 서로 다른 사고방식을 위해 설계되었기 때문에, 나는 내가 반드시 끊임없이 나에게 가장 적합한 도구를 찾아야 한다는 것을 안다.
몇 년 동안, 심지어 검색하기 전에 나는 이미 C++, 자바, Python과 Go를 사용했다.이 모든 것 중에서 Go는 나에게 가장 적합하다. 나는 가장 빠르고 자연스러운 방식으로 일을 할 수 있다.나는 한 달여 동안 내 first serious open-source library 를 써서 정상에 올랐다.그러나 나는 여전히 그것이 부족하다는 것을 금방 깨달았다. (나는 Go를 계속 사용했다. 왜냐하면 그것은 생산력을 크게 향상시켰기 때문이다.) 그래서 내가 Recurse Center에 받아들여졌을 때, 나는 함수 프로그래밍의 미지의 영역에 발을 들여놓기로 결정했다.저는 먼저 Lisp와 Clojure에서 시작해서 Ocaml과 Haskell을 배웠습니다. 이 두 언어는 무섭지만 아주 새롭습니다.내가 더 멀리 가기 전에, 나는 실리콘밸리에서 일자리를 찾았다. 그곳에서 나는 고향을 떠나 다른 해안으로 이사해야 했고, 앞으로 3년 동안 자바스크립트와 파이썬으로 코드를 작성해야 했다.
나는 곤혹스러운 프로그래머로서 나는 결코 국외인이 아니라는 것을 깨닫는 데 여러 해가 걸렸다.대부분의 프로그래머들은 다.우리들은 우리들 대다수의 사람들이 프로그래밍을 천성적으로 좋아하는 것이 아니라는 것을 인정한다. 프로그래밍은 후천적으로 습득한 천부적인 소질이 아니라 학습의 과정이기 때문이다.내가 엔지니어를 맡은 몇 년 동안 나는 자바스크립트와 Python 코드에서 (자바스크립트에서 더욱 그렇다) 무수한 오류를 일으켰다. 왜냐하면 내가 일하는 회사는 리듬이 빠르고 지도가 부족하며 최선의 실천이 부족하며 단원 테스트를 강조했지만 주로 곤혹스러웠기 때문이다.나는 불필요할 때 추상화하는 경향이 있다. 왜냐하면 추상은 나로 하여금 코드를 생각할 때 그렇게 곤혹스럽지 않게 하기 때문이다.내가 마지막 기한을 앞두고 스트레스를 받았을 때, 나는 주사위를 던지는 인코딩 버전으로 내려가 맹목적으로 코드를 시도하고 성공할 때까지 반복적으로 실행되었다.Python과 JavaScript가 코드가 정확하지 않은 상황에서 코드를 실행할 수 있도록 허락했기 때문에'배송'의 시작 심리는'f****it, 약속합시다'로 바뀌었다. (엔지니어들은 코드가 사용자 앞에서 붕괴될 때 코드를 전송하고 복구하도록 격려받기도 한다. 이것은 신속하게 이동하고 사물을 깨뜨리는 스타일이라고 생각한다.)
빨리 들어와서 나는 유일한 창시자로서 자신의 제품을 세우고 자신의 회사를 경영한다.이것은 긴장을 풀고 골머리를 앓는다.이것은 매우 편안하다. 왜냐하면 지금 나는 다른 사람의 9:5 규칙을 따를 필요가 없고, 필요하지 않을 때 통근할 필요가 없기 때문이다. (2019 관상바이러스 질병의 봉쇄에 직면한 많은 사람들에게도 마찬가지다.) 내가 배우고 싶은 것은 무엇이든지 배울 수 있기 때문이다.
Go와 JavaScript로 핵심 제품 avideo checkout platform를 구축하는 동시에 나는 10%의 시간을 내서 새로운 언어, 예를 들어 Crystal, Rust, Haskell을 배운다.나는 이런 것들을 한 번도 해 본 적이 없지만, 나는 지금까지 그것들을 견지하게 할 시간이 없다.
나는 거의 바로 크리스탈을 포기했다. 왜냐하면 그의 루비-like 문법 때문이다. (이것도 내가 Elixir를 선택할 수 없는 이유이다. 비록 나는 Erlang에서 매우 효율적이지만.)나는 녹이 슬는 것을 좋아하지만, 내가 그 중에서 어떤 투자 수익을 얻기 전에, 그것은 나의 생산을 방해할 수 있다는 것을 안다.그리고 하스켈이 클릭하세요.몇 년 전, 내가 처음으로 그것을 배우려고 시도했을 때, 그것은 나에게 신비감이었지만, 여러 해 동안Ocaml, Erlang, Lisp에서의 프로그래밍은 나의 기술을 내가 그것을 좋아하기 시작할 정도로 발전시켰다.
함수식 언어는 컴파일러와 같은 원사와 학술 프로젝트에만 적합하다는 악명이 높다.그들은 너무 높아서 좋은 명성을 얻지 못했다.다시 한 번 말하지만, 자신들의 취향을 선양하고 애완동물 냄새를 버스 밑에 뿌리는 인성이 계속 작용하고 있다.함수식 프로그래밍을 좋아하지 않는 대다수의 사람들은 어떤 부정적인 뉴스처럼 더 빨리 퍼진다.
내가 보기에 루비, 파이썬, 자바, 고 같은 명령식과 대상 언어는 나처럼 곤혹스러워하기 쉬운 프로그래머들을 곤혹스럽게 한다.그것들은 나를 매우 곤혹스럽게 한다. 나는 보통 엄숙한 스마트 IDE의 도움을 받아야만 효율을 높일 수 있다.예를 들어, Go 코드 라이브러리에서 변수와 대상 참조를 찾기 위해 여기저기 탐색해야 합니다.이 느낌은 마치 긴 영화 시리즈와 같아서 많은 에피소드가 있다. 일단 당신이 멈추고 돌아오면 다시 한 번 설명해야 한다.
함수식 프로그래밍에서, 모든 코드는 스스로 포함된다.어떤 표현식의 고층 추상 때문에 그것이 무엇을 하는지 이해하기 어려울 수도 있지만, 일단 그것을 이해하면 그것은 최종적이다.함수식 언어에는 어떤 마력도 나를 곤혹스럽게 하는 것이 거의 없다. 대부분의 상태가 변하지 않는 언어에 대해 나는 단지 어떤 것이 지속적으로 존재하는지 확보하기 위해 새로운 너트와 볼트를 만들고 싶지 않다.
예를 들어 함수식 프로그래밍이 하나의 특성만 있다면 나는 모든 언어를 선택할 수 있다. 그것이 바로 패턴이 일치하는 것이다.그것은 프로그래머에게 그들이 처리하고 있는 데이터의 시각적 효과를 제공했다.

{- 
 - `h:t` reads `h` cons `t`
 - which means it is a list 
 - of at least an element
 - in front and the rest.
 -}

-- Get the first element in the list.
firstElement (h:t) = Just h
firstElement []    = Nothing


-- Sum all elements in the list.
sumList (h:t) = h + sumList t
sumList []    = 0

지금까지 가장 효과적인 언어인 Go는 다음과 같습니다.

// Get the first element in the list.
func firstElement(list []interface{}) interface{} {
    if len(list) == 0 {
        return nil
    }

    return list[0]
}

// Sum all int elements in the list.
func sumListOfInt(nums []int) int {
    sum := 0
    for _, num := range nums {
        sum += num
    }

        return sum
}

바둑의 판본은 훨씬 복잡하다. 특히 내가 책을 읽을 때.
여기에서는 Go에서 interface{} 유형을 사용하고 예제 함수sumListOfInt를 고의로 사용하는 것을 주의해야 합니다.이것은 Haskell의 복잡한 유형 시스템에 비해 Go 단순화 디자인의 단점을 보여 준다. 나는 여기서 이 문제를 토론하지 않는다. 왜냐하면 그것은 주제에서 벗어났기 때문이다.
나는 또 다른 화염전을 일으킬 생각은 없었다. 그래서 나는 하스켈과 내가 적극적으로 사용하고 있고 밀접한 관계를 가진 언어를 비교했을 뿐이다.내가 말한 모든 것은 우리의 신념과 반대로 함수식 프로그래밍은 사실상 일반적인 프로그래머에게 더욱 추리하기 쉽다.그것은 프로그래머가 컴퓨터의 레지스터가 될 필요가 없기 때문에 영어 지령에 더욱 가깝게 읽힌다.이 차이를 더욱 명확하게 하기 위해 현실 세계의 임무와 어떻게 두 가지 다른 방식으로 그것을 완성하는지 보십시오.
잡화점에 가서 스파게티, 케첩, 소시지를 사다.

절실했어


From where you are, walk 20 yards until you see a junction, take a right and continue for another 0.5 miles. When you see a school to your right, continue for 10 yards and take the first crossing to the opposite side of the street. Walk another 2 blocks to the store.

When you're in the store, find pasta at the end of aisle #3, tomato pesto in aisle #4 at the middle, and head over the refrigerator to get the sausage.

...


기능적


Walk until you see a junction, take a right and walk until you see a school to the right, cross the street and continue until you see the store.

For all the aisles, get only the pasta and sauce, then go to the refrigerator to get the sausage.

...


함수식 프로그래밍은 프로그래머가 너무 구체적이지 않고 고급 지령에 집중하는 것을 도울 수 있다. 왜냐하면 구체성은 인류가 일반적으로 잘하지 못하기 때문이다. (나를 믿지 마라. 교차점에 도착하기 전에 얼마나 멀리 가야 하는지, 잡화점으로 돌아가서 시뮬레이션할 필요가 없는지 기억할 수 있니?)
만약 나처럼 코드 더미에 직면했을 때 곤혹스러웠다면, Haskell 같은 함수식 언어를 배워 보세요.이것은 아마도 너의 심리 모델의 완벽한 반영일 것이다.
만약 네가 비프로그래밍 주제에 대한 나의 생각을 읽어보고 싶다면, 너는 subscribe to BETA School, my new blog 할 수 있다.

좋은 웹페이지 즐겨찾기