여기서 ~해야한다는 건 당위라는 게 아니고 내 생각을 얘기하는거니 오해없길바람


배우는 입장에서 언어는 크게 세 종류로 나눠야 한다.

시스템을 이해하기 위한 언어, 생각의 폭을 넓혀주는 언어, 실제로 쓰기 위한 언어.

시스템을 이해한다는 건 프로그램이 실제 컴퓨터 위의 데이터로서 움직이는 방식을 이해한다는 것이고

생각의 폭을 넓힌다는 것은 문제에 대한 새로운 접근 방식이나, 사고 방식을 배운다는 것이고

실제로 쓴다는 것은 직업이든 취미든 우리가 사용하는 프로그램을 만들기 위해 언어를 사용한다는 것이다.


첫번째 범주의 언어는 단적으로 하드웨어와 가까워야 한다.

하드웨어와 가까운 곳에서 무슨일이 벌어지는지 알려면, 복잡한 추상화 층은 오히려 독이된다.

이런 언어로는 어셈블리와 C가 있겠다. 물론 C와 어셈블리 사이에는 얕은 추상화 층이 있다. 그러므로 둘이 다루는것 또한 약간 다르다.

이들 언어로 배우는건 최적화다. 프로그래머가 시스템을 이해하고 있다는 건 더 좋은 성능을 기대할 수 있다는 것이다.


두번째 범주의 언어로는 마치 신선놀음 처럼... 하드웨어에서 멀어져야 한다.

관점을 시스템에서 문제 해결로 옮겨야 하니까, 첫번째 범주와는 반대로 높은 수준의 추상화 계층이 필요하다.

여기에 해당하는 언어는 신의 언어라고 부르는 하스켈, 스몰토크, 리스프, 이런 언어들은 물론이고 프롤로그, 매스매티카 같은 각종 '변태언어'들이 있다.

이런 언어들은 각자가 추구하는 문제 접근 방식이 있는데, 대개 이런 언어들은 '순수성'을 중요하게 여기기 때문에 언어에 국한되지 않는 지식을 얻을 수 있다.

이들 언어로 배우는건 문제 해결의 방법인데, 쉽게 말해 알고리즘과 자료구조다. 물론 이 두 단어로 압축할만큼 좁은 개념은 아니다.

현실이라는 벽이 있기 때문에 이 언어들을 실무에서 마주치기는 어렵다.


세번째 범주의 언어는 대개 멀티패러다임을 지향하고, 인기가 있어서 다양한 라이브러리들이 준비되어 있다.

자바, C++, 파이썬, C# 등등.. 너가 밥벌이 할 언어다.

이 범주의 언어에서는 첫번째와 두번째 범주의 언어로 배운것들을 잘 결합해서 너가 원하는 것을 이상적으로 구현해 낼 수 있어야 한다.

이 언어들은 어떻게 그 결합을 이루어 내는지를 설계 철학을 통해서 안내해준다.

그리고 그 설계 철학을 받아들이려면 위 두 범주의 언어를 통해 배운 통찰력이 필요하다.


이 언어들을 전부 배워야 할 필요는 없지만, 적어도 각 범주에서 하나씩은 알고 있어야 한다.

물론 단지 언어만 배우면 되는게 아니고 그 범주에서 내세우는 가치를 배워야 한다.

개인적으로 두번째를 먼저 배우고 그 다음 첫번째, 세번째 순서로 배우는게 좋다고 생각한다.


한줄요약: 놀지말고 공부해라