어제 깨끗히 닦아주고 오늘 다시 순결한 키보드를 더럽히기 시작함



키보드 워밍업(?)을 위해 여러가지에 대해 잡글을 한번 싸줌



* 프로그래밍 언어


프로그래밍 언에에 흔히 '성능' 찾는 뉴비들이 있는데, 프로그래밍 언어 자체는 너의 영혼과도 같아서 성능을 논할 수가 없는 거밍. 성능을 논하려면 알고리듬이나 최소한 프로그래밍 언어 구현을 대상으로 해야 되는거고, 언어의 구현은 너의 몸뚱아리와 비슷하다 보면 됨. 몸짱 되려면 존나 힘들듯이 구현 제대로 하려면 존나 힘듬거임


과거 단순한 시스템들이 프로그래밍 대상일 때는 언어 구현 하나만 보고 선택을 하곤 했지만, 이제는 그런 간단한 문제들을 해결하는데 밥벌이를 제공하는 경우는 거의 없지. 물론 아직도 제한된 하드웨어를 사용하는 경우 특정 언어 구현에 종속되어서 속도 쥐어짜기를 해야 될 경우는 있겠지만 이런 일감은 이미 자리 꽤찬 생키들이 떨어져 나가기 전에는 잡기도 어렵고 그런 자리를 잡자고 시간과 노력을 투자하는 건 인생의 낭비임


지금은 언어나 구현 자체보다는 종합적 프로그래밍 환경이 중요한 때가 되었다. 라이브러리, 프레임워크, 가상머신, 커뮤니티, 개발환경, 뭐 이런 것들.




* JVM


얼마전에 JVM GC 최적화에 대해 하루 정도 시간을 보냈다. 과거 썬(지금은 오라클) 이 생키들의 GC 알고리듬 설명을 읽어보면 존나 명확하게 이게 왜 말이 되는지 알게 됨. 물론 구현은 쉽지 않겠지만.

JVM은 4갠가 5개 정도의 GC 알고리듬 구현을 제공하는데, 이 중에 서버에서 택할 수 있는건 CMS와 G1GC.


원래는 CMS - concurrent mark and sweep -  이것만 존재했는데, G1GC - garbage first gc - 가 5년 정도 전부터 실험을 거쳐서 현재 최종 서버용 권장 GC 알고리듬 구현이 됨.


니들이 프로그래밍 언어를 선택하는데, 그 언어가 GC가 필요한 언어다, 이러면 꼭 JVM  구현체를 택해라. 동일 알고리듬 다른 언어로 구현된 니 프로그램이 느리다 그러면 그건 십중팔구 GC의 차이로 생기는 문제임.




* 구현체 성능과 GC


개발 대상이 복잡해지고, 메모리를 언제 회수해야 될지 명확하지 않은 것이 요즘의 복잡한 개발 대상임.

흔히 엮이는게, DBMS, Web proxy, Web application server, Client UI(browser) , 네트워크, ... 이런 것들이고 그 일부에 니가 만들 시스템이 존재하는 건데 보통 병목현상은 DB나 네트워크에서 생김. 니 시스템 성능이 빨라야 되는 건 사실인데, 그게 다른 것들에 부하를 걸만큼 빨라지면 안되는게 현대적 프로그래밍이야. 니가 만든게 존나 빨라서 DB에 존나 많이 쿼리를 보낸다고 해봐라.

 -> DB 메모리가 존나 필요하게 되거나 스왑을 하게 됨 -> 느려짐 -> 빠른 니 코드가 더 많은 쿼리를 쌓아버림 -> 존나 메모리 더 필요함 -> 메모리 다 소진 할 때까지 반복 -> 세그폴트. 네트워크도 마찬가지.


그래서 GC를 쓰는 언어를 써야 되는 것이 자연스로운 기술의 변화가 되어버림. 그런데 GC에 기반한 언어도 각양각색이야.

니가 파이똥이나 루비똥이나 이런 초보적 GC 알고리듬을 쓰는 언어를 쓴다고 쳐봐. 언어 자체도 인터프리터인데, GC까지 병신임.



* 유행


이 바닦이 유형이 있어. 니가 한번 제대로된 유행에 올라타면 10년은 잘 나가게 됨. 최근 트렌드는 functional, immutable 이런거임. 이게 처음에는 함수형 언어로 시작했는데, 그 이후로 immutable DB - 기존 DB에 update와 delete가 없다고 보면 됨, immutable container image - docker, ... 이런거 까지 확장 되고 있는 추세임.


이런 변화는 어쩔 수 없다. 얼마 전까지는 OOP 였지만, 이거 이미 20년 정도 해처먹고 난 생키들이 여러가지 문제점들도 알게되었고, 계속 돈 많이 받는 자리 유지하려면 이제 새로운 걸 제시하고 계속 돈 많이 받아 내야 할 때가 됨.


니가 그런 새로운 걸 제시하는 생키가 아니라면 항상 주위를 잘 살피고 주시하다가 그런 움직임이 보이면 잽싸게 새로운 걸 습득하고 올라타라. 가끔 갤에 파이똥, 루비똥 이런거 쳐들고 오는 생키들 있는데 그런 건 이미 단물 다 빨렸고, 니가 지금 시작해서 이미 꿰찬 생키들 자리에 올라갈 기회가 0에 가깝다.


요즘 언어 유행은 Clojure, JavaScript(ES6), TypeScript, Go, Scala, 이런 등등인데 이중에 Clojure, Go, Scala 정도가 새로운 자리 꿰찰 수 있고 나머지는 아무리 잘해도 이미 꿰차고 있는 생키들 딱가리임.


이 중에서도 최근 트렌트를 따르려면 함수형 언어를 택해야지, OOP는 이제 주로 딱가리 용이고 새로 시작되는 것들 중 함수형 기술들을 이용하는 일을 하는 게 니가 좋은 자리를 꿰찰 기회가 많다.



* 현대적 언어 선택 알고리듬


1. GC가 되는 언어를 택해라

2. JVM 에서 되는 언어를 택해라

3. OOP 보다는 홤수형, mutable 보다는 immutable