진짜로 프로그래밍을 잘 하고 싶다면 밑에 글을 잘 읽고 이해하려고 노력해봐라
---
니들한테 익숙한 함수라는 개념 밑에는
1. 네이밍 된 서브루틴 # 명령, 구문의 집합
2. 메소드 # 컨텍스트에 종속된 구문
3. 평가되는 식(순수함수) # 중첩된 표현의 집합
라는 세개의 카테고리가 숨어있다.
첫번째는 실행되는거고, 두번쨰는 호출되는거다. 세번째는 평가된다고 한다. 이 세개를 잘 구분해라.
대부분의 프로그래밍 언어는 저 세 카테고리 함께 지원하는 동시에 이들을 제대로 구분해서 설명하지 않는다.
어셈블리, 코볼같은 언어는 1번 카테고리만을 사용해 프로그램을 만든다. 반면에 추상화의 극단에 있는 리습은 3번 카테고리인 표현식으로 프로그램을 만들어
그리고 그 사이에 있는 대부분의 언어들은 저 세 카테고리를 혼용해서 사용한다.
C/C++은 대부분 서브루틴으로 구성되지만, 프로그래머가 재주껏 표현식처럼 동작하도록 만들 수 있다.
자바는 겉에서 봤을 때 메소드밖에 없는 언어지만 이를 잘 포장해서 순수함수, 서브루틴으로 보이게 만든다.
파이썬, 자바스크립트, 루비는 이 세개를 문법적으로 구분하지 않는다. 메소드마저도 실제로 메소드라는 키워드가 있는게 아닌 객체에 바인딩된 서브루틴 혹은 표현식일뿐이다.
그럼 어떤게 표현식이고 어떤게 서브루틴인가?
사실 내부적으로 기계어로 번역되어 메모리에 올라가는 순간에는 다 명령문의 집합이고 라벨이 붙어있는 루틴일 뿐이야.
여기에다가 인자를 받고 리턴을 강제하면서 우리가 이런 동작들을 일종의 수학적 모델, 표현식으로 여길 수 있게 해주는거지.
실행컨택스트, 콜스택도 재귀적인 평가방식으로 프로시져들을 추상화하기 위해 나온 개념이다. 원래부터 있었던게 아냐.
치환될 수 있다면 표현식인거고, 그렇지 못한건 서브루틴이다. 니들이 염려하는 스파게티코드는 루틴들이 꼬여서 만들어지는거야.
모든 복잡도는 외부 상태에 의존하는 루틴들에 의해 생긴다. 메소드는 여기에다 OOP라는 제약을 걸어버려서 이 개념을 한층 더 숨겨놨어.
이게 바로 니들이 C/C++, Java 타령 그만하고 다양한 언어를 배우고, 역사적 배경을 공부하고 함수형 프로그래밍을 익히고 SICP를 공부해야하는 이유다.
어떤 언어든 간에 C스타일로 코딩하는건 기계어로 코딩하는거나 다를바 없어. 문법 처음 배우면 변수 선언, 할당 배우고 분기랑 루프문 배우지? 그다음에
코드를 재사용하기 위해 함수 선언하고 호출하는법 배울거아냐. 여기까지는 사실상 그 고급진 언어를 가지고 기계어 프로그래밍을 하는거나 다를바가 없다는거다.
제발 저 기본문법 땐 다음에 해볼만한 프로젝트 찾지 마. 할거면 좀 더 고차원적인 레벨까지 판 다음에 해. 적어도 저 세개의 구분을 확실히 지은 다음에 쉘 인터페이스에서 표준입출력 연결 시키면서 가지고 놀아보란말이야. 그 다음에 OOP가 빠질 수 없는 GUI, 게임 프로그래밍을 해보고
공부할 방법을 하나 추천해주자면, 메타프로그래밍을 배워라. 거창한게 아니라 코드를 생성하는 코드를 짜보라는거야. 파일을 읽고 쓰는데 익숙해지고 추상화에 능해질거다. 언어는 어떤것이든 상관없다. 다만 C스타일로 메타프로그래밍 하려면 고생꽤나 할거다. 좀 더 간결한 코드, CPU의 동작이 안보이는 코드를 짜는거에 집착해라. C언어 안해도 돼. 내가 대학들어간 이후에 코딩 처음 시작했는데 python, java로 수업듣다가 처음 C 만져본게 pintos프로젝트 하면서였다. 삽질좀 많이 했지만 결국 다 해냈었어. 로우레벨이 알고 싶으면 차라리 컴퓨터구조 교과서 하나 사서 cpu 동작원리만 잘 보면 된다. 대부분 잘 나와있어 PC, Control Unit, Instruction set, 분기예측 이런 키워드들 보면서 cpu회로 따라그리다보면 폰노이만 구조의 계산기계란게 뭔지 알게 될거다. 그 이후에는 바로 고급 언어로 넘어가면돼.
그리고 알고리즘 너무 좋아하지 말고. 그 외에도 할게 많다.
뭐냐 이건