도메인 지식, 네이티브 지식

개발과 관련된 일에는 두 가지 지식이 있습니다. 하나는 도메인 지식이고, 다른 하나는 네이티브 지식입니다.

javascript와 node.js를 예로 들어보겠습니다.

javascript는 익스플로러, 크롬, 파이어폭스 같은 "브라우저" 에서 사용되고, node.js는 런타임에서 사용됩니다. 즉, Node.js 브라우저 밖의 환경에서 사용할 수 있습니다.

javascript로 다음과 같은 기능을 사용할 수 있습니다.

  1. BOM : 브라우저 다루기(경고창, 새창, 창 닫기, 주소 조작, 및 기타 등등)
  2. DOM : 태그 다루기(태그 추가, 태그 수정, 태그 삭제)
  3. CSSOM : Style 다루기(Style 속성 추가, 수정, 삭제)

이것들은 javascript가 아닌 다른 언어로 수행할 수 없는 기능입니다. 반대로, javascript는 이것 외에 기능은 다루지 않는다는 이야기도 됩니다.

그럼 이번엔 Node.js를 간단하게 살펴볼까요?

  1. Server
  2. File System
  3. I/O
  4. etc...

Node.js는 대략적으로 위와 같은 일들을 할 수 있습니다. 이외에도 런타임에서 수행할 수 있는 일들 대부분을 할 수 있죠

자 그럼 javascript와 node.js의 공통점은 무엇일까요? 그것은 바로 ECMAScript 라는 "문법" 혹은 "스펙" 입니다. 즉, "똑같은 말"로 "다른 일"을 하는 것입니다.

여기서 javascript와 node.js의 기능에 대한 것들은 "네이티브 지식" 이며, ECMAScript는 "도메인 지식"이 되는 것입니다.

네이티브는 굉장히 제한적인 성격을 띄고 있고, 도메인은 광범위한 성격을 띄고 있습니다
또 다른 예를 들어보겠습니다.

학원 출신 개발자가 있고, 대학 출신 개발자가 있습니다. 학원과 대학의 커리큘럼은 어떤 차이점이 있을까요?

학원에서는 "네이티브 지식" 위주로 배웁니다. java, node.js, html, css 등에 대학 것들을 배우죠

대학은 "도메인 지식" 위주로 배웁니다. 알고리즘, 자료구조, 운영체제, 컴퓨터 구조, 시스템 분석 및 설계 등 "어디서든" 사용될 수 있는 "기본 지식"을 배우는 것입니다.

그래서 학원 출신은 어쨌든 취업이 되긴 합니다. 하지만 "우물"에 갇히기 쉽죠. 구현은 해도 이론은 모르는 아이러니한 상황에 놓이게 되죠.
반대로 대학 출신은 "지식"에 갇히기 쉽습니다. 이론은 알아도 구현은 할줄 모르는.. 그런 일들이 벌어지곤 하죠.
그래서 정말로 좋은 개발자가 되기 위해선 "도메인"과 "네이티브"가 상호 보완 되어야 합니다.

회사를 입사할 때 알고리즘 문제를 푸는 것도 이러한 맥락입니다. 알고리즘은 어디에서든 다 사용될 수 있는 "도메인 지식"이기 때문입니다.

하지만 알고리즘만 잘한다고 해서 구현까지 잘할 수 있느냐는 별개의 문제인것이죠. 구현은 "네이티브 지식"을 잘 알아야하기 때문입니다.

그래서 초기에 공부를 할 때 내가 공부하고 있는 것이 "도메인 지식"인가 "네이티브 지식"인가 구분하고 정복해가는 게 좋습니다. 그리고, 스스로가 "도메인"을 익히는게 좋다면 보통 대학원까지 염두하고 공부하는 게 좋습니다. "네이티브"를 익히는게 좋다면 그냥 바로 취업을 하는 게 정신건강에 좋습니다. 두 가지는 너무 성격이 다르거든요.

개발 자체도 똑같습니다. 좋은 소프트웨어를 만들기 위해선 기본적으로 도메인 모델과 네이티브 모델이 구분되어 관리를 해야 하며 도메인과 네이티브를 이어주는 "프로토콜"이 존재해야 합니다. 이것을 모르고 개발을 하는 것과, 알고 개발을 하는 것은 하늘과 땅차이라고 생각합니다.

그리고 도메인과 네이티브는 경우는 매우 상대적입니다.

도메인 지식이 네이티브 지식이 되기도 하고, 네이티브 지식이 도메인 지식이 되기도 합니다.

가령 한글과 영어는 모든 학습에 필요한 "도메인"지식이 됩니다.

컴퓨터 공학도 네이티브 지식의 큰 분류이며, 다시 컴퓨터 공학이라는 네이티브 지식에 알고리즘, 자료구조, 운영체제 등의 도메인 지식이 존재하는거죠

개발도 항상 상대적이라고 생각합니다.

잡담이 길어졌네요. 정리하자면 이렇습니다.

  1. 네이티브를 익히는 게 좋다 => 취업
  2. 도메인을 익히는 게 좋다 => 대학/대학원
  3. 소프트웨어를 설계할 때도, 개발 코드를 만들 때도 네이티브와 도메인을 구분해서 작성하면 좋다.