(위 이미지는 원작자의 블로그글에는 없는 이미지이며, 제가 임의로 넣은 이미지입니다. 출처)
많은 주니어 개발자, 또는 몇몇 시니어 개발자 조차도 가면증후군(Imposter Syndrome)에 시달립니다. 가면증후군이란 "높은 성취의 증거에도 불구하고 자신이 똑똑하거나 유능하거나 창의적이지 못하다고 믿으며, 자신의 능력에 대해 남들을 기만하고 있다고 생각하는 현상" 입니다.
저도 다른 개발자분들의 발표를 듣거나 블로그 글을 읽다보면, '이 분은 분명 나보다 훨씬 많은 것을 알고있고, 나보다 많은 것을 경험하셨을거야'라는 생각이 들고 좌절하기도 합니다.
그러던 중 React의 메인 컨트리뷰터인 Dan Abramov의 이 블로그 글을 읽었고, 더 많은 분들이 볼 수 있도록 번역하기로 했습니다.
아래는 페이스북 엔지니어 Dan Abramov의 개인블로그 글 "Things I Don't Know as of 2018"을 원작자의 허락을 받아 번역한 글입니다. Dan Abramov의 블로그에도 머지되어서, 블로그에서도 한글 번역문을 확인하실 수 있습니다.
의역, 오역이 있을 수 있습니다. 피드백은 환영입니다. 댓글로 남겨주세요.
사람들은 종종 제가 실제보다 더 많이 알고있을 거라고 생각합니다. 이것은 나쁜게 아니며, 이에 불만은 없습니다. (소수 집단의 사람들은 노력해서 자격을 얻고도 가끔 편견에 시달립니다. 그리고 그것은 최악(sucks)입니다.)
이 글에서는 사람들이 종종 제가 알고있을 것이라고 오해하는 프로그래밍 주제들을 나열할 것입니다. 저는 당신이 이것들(또는 제가 모르는 다른 유용한 것들)을 배울 필요가 없다고 말하는 것이 아닙니다. 하지만 지금 저는 약한 입장이 아니기 때문에 이 문제에 대해 솔직하게 말할 수 있습니다.
제가 이것을 중요하게 생각하는 이유는 아래와 같습니다.
먼저, 가끔 시니어 엔지니어가 그 분야의 모든 기술을 알고있을 것이라는 비현실적인 기대들이 있습니다. 100개의 라이브러리와 툴로 이루어진 "개발자 로드맵(learning roadmap)"을 보신적 있습니까? 그것은 유용하지만, 우리를 두렵게 만듭니다.
게다가, 당신은 아무리 경험이 많더라도, 당신은 스스로 능력있다고 느낄 때도 있고, 부족하다고 느낄 때(imposter syndrome: 가면 증후군)도 있고, 지나치게 자만할 때(Dunning–Kruger effect: 더닝-크루거 효과)도 있을 것입니다. 이것는 성격, 환경, 직업, 팀원, 정신상태, 시간 등에 따라 달라집니다.
시니어 개발자들은 종종 자신들의 불안감을 공유해서 주니어들을 격려하기도 합니다. 하지만 불안감을 갖고있는 전문 외과의사와, 메스를 처음 들고있는 학생 사이에는 여전히 큰 차이가 있습니다.
"우리는 모두 주니어 개발자입니다" 라는 말을 들으면, 실제 지식격차를 겪고 있는 주니어에게는 의미없는 이야기로 들릴 수 있고, 더 낙담할지도 모릅니다. 저처럼 선의로 이야기 했더라도, 그 격차를 줄일 수는 없습니다.
심지어 시니어 개발자들조차도 많은 지식의 격차를 느낍니다. 이 글은 저 자신의 지식격차에 관한 글이며, 저와 비슷한 입장에 있는 사람들이 자신의 지식격차를 공유하기를 바랍니다. 하지만 우리는 지식격차를 공유할 때, 우리경험의 가치를 떨어트리지 않아야 합니다.
우리는 우리의 지식격차를 인정할 수 있으며, 가면(imposter)을 쓸 수도 아닐수도 있지만, 우리는 여전히 개발에 굉장히 가치있는 전문적인 지식을 보유하고 있습니다.
다음은 제가 모르는 것들입니다.
유닉스 명령어들과 Bash(Unix commands and Bash) 저는 ls
와 cd
는 할 수 있지만 그외 다른 모든 것들은 검색합니다. 나는 piping
의 개념은 알지만, 간단한 경우에만 사용해봤습니다. 복잡한 연결을 만드는데 xargs
를 사용하는 방법이나, 다른 output streams
를 구성하고 리디렉션하는 방법을 모릅니다. 또한 저는 bash를 제대로 배운적 없기 때문에 아주 간단한 (그리고 버그가 많은) 쉘 스크립트만 작성할 수 있습니다.
저수준 언어(Low-level languages) 저는 어셈블리가 무언가 메모리에 저장하고 점프하는 코드를 이해할 수 있지만, 그것 뿐입니다. C언어 몇 줄을 써보고 포인터가 무엇인지는 이해했지만, malloc
이나 다른 수동 메모리 관리 기법을 모릅니다. Rust도 사용해본 적 없습니다.
네트워크 스택(Networking stack) 컴퓨터에 IP주소가 있다는 것을 알고있으며 호스트네임을 해석하는 DNS에 대해 알고있습니다. TCP/IP와 같은 저수준의 프로토콜이 무결성을 보장하며 패킷을 교환한다는 것을 알고있습니다.(맞나요?) 그게 전부입니다. 세부적인건 자세히 모릅니다.
컨테이너(Containers) Docker나 Kubernetes를 사용하는 방법에 대해서 잘 모릅니다.(이 둘이 관련이 있나요?) 예측 가능한 방법으로는 분리된 VM을 작동시킬 수 있겠다는 막연한 생각이 있습니다. 멋져보이는데, 사용해보진 않았습니다.
서버리스(Serverless) 이것도 멋있어보이네요. 시도해보진 않았습니다. 이 방식이 백엔드 프로그래밍을 어떻게 바꾸는지 명확히 모릅니다.
마이크로서비스(Microservices) 제가 바르게 이해했다면, 이는 그저 "많은 API 엔드포인트들이 서로 통신하는 것"을 뜻합니다. 저는 이 방법을 사용해보지 않았기 때문에 이 접근 방식의 실질적인 장점이나 단점이 무엇인지 모릅니다.
파이썬(Python) 이것에 대해 미안한 마음이 듭니다. 저는 몇년간 파이썬으로 일한 적이 있지만, 저는 실제로 파이썬을 배우려고 노력하지 않았습니다. import
문법의 동작 등 많은 것들이 저에겐 이해하기 어렵습니다.
Node 백엔드(Node backends) Node
를 실행하는 방법을 이해하고, 빌드를 위해 fs
같은 API를 사용하고, Express
를 설정할 수 있습니다. 하지만 Node
에 데이터베이스를 한번도 연결해본 적 없으며, 실제 백엔드를 작성하는 방법을 모릅니다. 또한 "hello world"를 넘어서 Next
같은 리액트 프레임워크에도 익숙하지 않습니다.
네이티브 플랫폼(Native platforms) 언젠가 Objective C를 배워보려고 했었지만, 잘 안됐습니다. Swift도 배워본적 없으며, Java도 마찬가지입니다. (C#을 사용한 이후로 빠르게 선택할 수 있었습니다.)
알고리즘(Algorithms) 운이 좋으면, 버블소트와 퀵소트 정도까지 구현할 수 있습니다. 특정 문제와 관련이 있다면 간단한 그래프 탐색정도도 할 수 있습니다. 저는 O(n) 표기법을 이해할 수 있지만 "루프 내부에 루프를 넣지 말아라" 수준보다 깊지 않습니다.
함수형 언어(Functional languages) 자바스크립트를 빼면, 저는 전통적인 함수형 언어를 잘하지 못합니다. (저는 C#과 JavaScript만 잘하며, C#은 이미 대부분 잊어버렸습니다.) 저는 LISP에서 영감을 받은 Clojure나, Haskell에서 영감을 받은 Elm이나, ML에서 영감을 받은 OCaml 코드들을 읽기 어렵습니다.
함수형 용어(Functional terminology) Map과 Reduce가 제가 아는 전부입니다. 저는 monoids, functors 등을 모릅니다. 저는 모나드가 무엇인지 알고있지만, 어쩌면 제 착각일지도 모릅니다.
최신 CSS(Modern CSS) Flexbox나 Grid에 대해 모릅니다. Float만으로도 어렵습니다.
CSS 방법론(CSS Methodologies) 저는 BEM을 사용했지만, 그게 전부입니다. 저는 OOCSS나 다른 방법론을 시도해본적 없습니다.
SCSS / Sass. 배운적 없습니다.
CORS. 저는 이 에러가 두렵습니다! 저는 이를 고치기 위해 어떤 헤더를 설정해야 한다는 것을 알고 있지만, 예전에는 여기에 시간을 많이 낭비했습니다.
HTTPS / SSL. 설정해본적 없습니다. 비밀키와 공개키 개념뿐, 그 이상의 작동 방식은 모릅니다.
GraphQL. 쿼리를 읽을 수는 있지만, 노드와 엣지로 무언가 표현하는 방법, 프래그먼트를 언제 사용해야하는지, 페이지네이션이 작동하는 방식을 전혀 모릅니다.
소켓(Sockets) 컴퓨터들이 요청/응답 외에도 서로 통신할 수 있도록 하는 것이라는걸 알고있지만, 그게 제가 아는 전부입니다.
스트림(Streams) Rx Observable을 제외하고, 스트림을 자세히 다뤄보지 않았습니다. 전에 Node
의 Stream을 한두번 사용해봤지만 항상 에러 핸들링을 엉망으로 했었습니다.
일렉트론(Electron) 시도해본적 없습니다.
타입스크립트(TypeScript) 타입의 개념을 이해하고 읽을 수는 있지만, 사용해보진 않았습니다. 몇번 시도해봤지만, 어려웠습니다.
배포와 DevOps(Deployment and devops) FTP를 통해 파일을 보내거나 프로세스를 죽일 수 있지만, 그게 제 DevOps 스킬의 최대치입니다.
그래픽스(Graphics) Canvas, SVG, WebGL, 저수준 그래픽 뭐든 간에, 저는 이것들에 그다지 생산적이지 않습니다. 전반적인 아이디어는 알겠지만, 저는 더 기초를 배워야할 것 같습니다.
물론 이것들이 전부는 아닙니다. 제가 모르는 많은 것들이 더 있습니다.
이런 이야기들이 이상해 보일 수도 있습니다. 심지어 이런 이야기들을 쓰는게 잘못이라는 느낌도 듭니다. 제 무지를 자랑하고 있을까요? 이 글의 제 의도는 다음과 같습니다.
당신이 좋아하는 개발자조차도 당신이 아는 많은 것을 알지 못할 수 있습니다.
당신의 지식 수준에 관계없이, 당신의 자신감은 크게 다를 수 있습니다.
훌륭하고 경험있는 개발자는 지식격차에도 불구하고 가치있는 전문지식을 보유하고 있습니다.
저는 저 자신의 지식격차(적어도 그들 중 일부)를 알고있습니다. 나중에 프로젝트에 필요하거나 궁금증이 생기면 그때 채울 수 있습니다.
이 글은 제 지식과 경험의 가치를 떨어트리지 않습니다. 저는 할 수 있는 일이 많습니다. 예를 들면, 저는 어떤 기술이 필요할 때 배울 수 있는 능력이 있습니다.
추가: 저는 제가 아는 다른 몇 가지에 대해서도 글을 작성했습니다.
Dan Abramov의 블로그에도 머지되어서 -> https://overreacted.io/ko/things-i-dont-know-as-of-2018/ 네요. (혹시 찾아보는 분들도 있을까봐 댓글로 남겼습니다. 사실 저의 경우엔 글을 다 읽기 전에 찾아보아서 이 댓글은 계륵이 될지도 모르겠네요.)
저도 제 개발 능력에 대해 항상 저급하다고만 생각했는데, 앞으로 더 배울것도 많지만 자신감을 갖고 도전하다보면 최소한 자신감은 갖을 수 있을 것 같습니다. 좋은 글 감사합니다.
잘 읽었습니다 좋은 글 감사해요!