"그래 적어보자!"
산업경영공학을 배우던 내가 진로를 컴퓨터공학자, 개발자로 바꾸고 느끼는 것들
(why를 생각하기 전에)
어느 순간 진로를 변경했을까. 시발점을 언제로 봐야 할까...
[2018년 2학기]
'개발' 단어가 나타난 카카오 개발 인턴으로 봐야 할까. 그렇기에는 코드를 곁들인 데이터 분석만 했었는데.
[2019년 1학기]
그러다 복학하고 산업경영공학 전공 수업(감성공학)에서 뜬금없이 웹페이지를 만든다고 설치던 날로 봐야 할까. 시간은 시간대로 쓰고 결국 에러를 못이긴, 책에 있는 메신저 코드를 복붙해서 시연을 했었는데.
[2019년 여름]
네이버 인턴을 당당히 떨어지고, Cuop이란 프로그램으로 스타트업 인턴으로 봐야 할까. 사실 개발서를 보며 똑똑한 사람들이 적힌 블로그 글을 보며 했지만, 나중에 돌이켜보니 아무 것도 모르고 사용했었는데.
[2019년 2학기]
수강내역을 통해 알아보니 컴퓨터공학 부전공을 결심하고 관련 전공을 수강한 2019년 2학기로 봐야 할까. 이쯤으로 보면 될 것 같은데...
확실히 변화가 있었고, 그 시점에 대해 주변에서 묻곤 했다. 한때는 자랑스러웠던 카카오 인턴을 시작이라고 말하기도 했었고, 배경이 되었던 그 이전학기 서울대학교 학점교류를 말하기도 했다. 무언가 그때부터라고 말하면, 적어도 3년 정도 시간을 들여 준비 중인 사람으로 보이기도 했었으니 말이다.
하지만 개발자 공채를 지원하는, 확실히 변경 완료된 지금 시점에서 글을 쓰다보니 1년을 늦춰 2019년 2학기로 말하는 것이 더 맞다고 느낀다. 왜 그런지 묻는다면, 3년 전부터 코드를 짰던 것은 맞지만, 왠지 아무것도 모른 채 흉내만 낸 것이 아닐까 싶다. 자세히 말해보면, 이것을 모른다면 컴퓨터공학을 아직 시작한 게 아니라고 할 정도로 무지했었기 때문일 것이다. 설마 또 3년 뒤에는 2021년 1학기를 시발점으로 볼지 모르겠다.
아무튼 이번 글에서는 변하는 시간동안 내가 크게 체감한 접점들을 적어보고자 한다.
위 주제에 대한 키워드를 적어보면, interface
, abstraction
, convention
, rules
정도 말할 수 있다. 이 중 산업경영공학 수업에서도 배우는 interface에 대해 먼저 말해보려 한다.
Interface라고 하면, 인간공학 수업에서 주로 모바일 어플리케이션에서 사람의 눈으로 보이는 디자인 및 움직임에 해당한다고 배웠다. 틀린 말이 아니다. 하지만, 현재 나는 그 단어를 완전 다르게 체감한다.
다시 정의하면, interface는 소통 가능한 두 존재가 서로 소통하기 위해 사용하는 언어라고 말하고 싶다. 더 알아보고 찾아보고 정의하고 싶지만, 일단 이 정도로 말하려고 한다. 이 정의에서 강조하고 싶은 것은 사용하는 언어가 아닌 소통 가능한 두 존재이다.
모바일 어플리케이션의 예시로 보면, 두 존재는 모바일 어플리케이션과 사람이다. 즉, 기계도 존재에 해당한다. 그리고 바로 주제에 연결 짓자면, 존재가 바로 Layer이다.
위 사진은 데이터베이스 수업 시간에 배운 Database Abstraction
에 해당한다. 여러 레벨로 이뤄진 것을 볼 수 있고, 각 레벨에 대해 설명하면 아래와 같다.
(컴퓨터공학과가 아니라면 아래 정리가 단번에 이해되지 않아야 정상이다)
내 방식대로 부연 설명을 하자면, 실제로 데이터는 0과 1의 형태로 디스크에 저장되어 있다. 하지만 우리는 테이블 형태로 데이터를 본다. 그리고 우리는 데이터를 보고자 할 때 디스크의 어느 트랙의 몇번 섹터에서 데이터를 검색하라고 말하지 않고, 테이블에 근거한 문법으로 데이터를 조회한다. 사실 우리가 데이터를 조회할 때 사용하는 그 명령이 바로 External Level과 Logical Level 사이의 interface이다.
즉, 중요한 것은 우리는 모든 레벨의 interface를 몰라도 데이터베이스를 사용하는데 전혀 지장이 없다. 왜냐하면, 최상위 interface를 통해 Logical Level에 명령을 보내면 그 명령을 하위 Level과 소통하기 위해 하위 Level의 interface로 알아서 소통하기 때문이다. 결론적으로 logical level은 사용자가 접근하기 수월한 모습으로 abstraction이 되어 있는 것이다. 그리고 컴퓨터공학 세계는 모든 게 다 Layer로 되어 있고, abstraction이 되어 있다.
물론 Layer는 정말 규칙적으로 0과 1부터 한 단계 한 단계씩 상위로 되어 있는 것이 아니다. 분야 별로, 누군가 만들어 놓은 대로 다양하게 Layer가 존재한다. 간단히 말하자면 모든 부분이 Layer로 되어 있고, 어떤 Layer를 활용하기 위해 해당 Layer가 정해놓은 convention과 rule들을 따르는 interface를 배우고 활용하는 것이다. (이 과정이 정말 끔찍하다) 배우다보면 layer라고 비유적으로 표현하지 않고, application, level, plane, module, framework, language 등 다양하게 말하게 된다.
컴퓨터 구조, 운영체제, 네트워크, 데이터베이스 등의 전공 과목을 통해 0과 1에서 프로그램 사이의 전반적인 Layer를 겪고 구현해보니 컴퓨터를 아주 조금 안다는 것이다.
뿐만 아니라, 이 접점은 나에게 큰 고민을 안겨주었다. 바로 내가 어느 Layer(단계)에서 개발을 할지 결정하는 것이다. 단적으로 말하자면, 상용 데이터베이스를 그저 사용하면서 서비스를 개발할 수도 있지만(물론 최적화는 해야겠지만), 새로운 데이터베이스 직접 개발할 수도 있다. 대학원에서 하는 연구들도 이러한 근본적인 성능 발전 혹은 새로운 방법론을 위해 탐구하고 설계한다고 느낀다.
나중에 Why에 대한 글을 적을 때 말하겠지만, 나는 Know How(작동 원리), Know What(무슨 존재인지), Know Why(왜 존재하는지) 세 가지 중에 Know How에 조금 집착하는 편이다. 따라서 개발을 하면서 새로운 오픈소스를 사용할 때 작동 원리 및 내부 프로세스나 구조가 무척이나 궁금하다. 물론 0과 1에 가까울수록 아는 재미가 크다. 그리고 어떻게 작동하는지 제대로 이해하면 정말 짜릿하다. 그렇기 때문에 매번 겪어보고 배우면서 진로를 고민한다. 하지만, 나의 두뇌가 어디까지 따라갈 수 있을지 모르겠다. 게으른 나의 시간들을 돌이켜보면 답이 나오질 않으니 말이다.
그리고 또 중요한 접점인 이유는, 나는 내가 컴퓨터 세계를 아직 거의 모른다는 사실이다. 그만큼 아는 즐거움이 있겠지만, 걱정이 큰 것도 사실이다. 평생 배워야 한다는 이 분야가 좋으면서 싫은 매력이 있다. 하지만, 전문가가 되어가는 것이 느껴진다. 전문직에 종사하고 싶은 한은 이렇게 푸나 보다.
(작성 중)
이렇게 컴퓨터공학의 세상이 Layer로 이뤄졌다는 사실이 특별하게 다가오는 이유는 지식과 편리함이 쌓이는 것이 가시적으로 보이기 때문이다. 가령 내가 어떤 회사에 대한 마케팅 측면의 솔루션을 제시했다고 하고 채택했다고 해보자. 하지만, 이는 결국 또 상황이 변함에 따라 그저 사라지게 될 것이다. 하지만, 컴퓨터공학은 편리한 Layer를 누군가 만들고, 만들어진 Layer 위에 또 다른 Layer가 만들어지고 그렇다. 오픈소스에 기여한다는 것이 하나의 생태계 커뮤니티에 속하여 살아간다는 느낌을 받는다.
"나는 Know How(작동 원리), Know What(무슨 존재인지), Know Why(왜 존재하는지) 세 가지 중에 Know How에 조금 집착하는 편이다."