개발자가 되는데 컴퓨터 공학 전공지식이 중요할까?

2021. 5. 16. 01:07Random

들어가며

아는 사람은 다 아시다시피, 제 본 전공은 어학입니다. 문과 출신이라고 할 수 있으나, 복수전공이 소프트웨어였기 때문에 비전공자라 불리기에도 조금 애매한 처지입니다. 저는 소프트웨어를 배웠더라도 복수전공으로 배운 것과, 본 전공으로 한 것에는 보이지 않는 간극이 있다고 생각했으며, 그렇기에 스스로 비전공자 출신임을 말하곤 했었으나, 정작 전공조차 하지 않은 비전공자들 입장에서는 이 또한 기만처럼 느껴진다는 것을 알게 되었습니다.

최근 개발자라는 직업에 대한 수요가 늘어남에 따라, 많은 비전공자 분들이 전공자와의 차이를 많이 의식하고 있다는 것을 잘 알고 있습니다. 사실, 전공을 듣는 학생들 중에서도 "CS(Computer Science)를 아는 것이 정말 중요한가?"라는 질문을 가지는 학생들도 많습니다. 이 글은 어중간하게 걸쳐 있는 반쪽짜리 전공자 입장에서, 개발자로서의 취직 준비를 거쳐 실제로 취직을 하고 업무를 하면서 깨달은 바를 기록해보고자 작성되었습니다.

별 것 아닌 글이지만, 개발을 시작하고 싶거나, 개발을 공부하고 있으나 망설임이 있는 분들께 하나의 실마리를 던져줄 수 있으면 좋겠습니다.

CS(Computer Science)에 대하여

제목에는 '컴퓨터 공학'이라고 적어놓긴 했습니다만, 요즘 대세가 된 명칭은 '컴퓨터 과학(Computer Science)'입니다. 전공자들은 모를 수가 없는 네덜란드의 유명한 컴퓨터 과학자 "에츠허르 데이크스트라"는 "컴퓨터를 쓴다는 이유로 컴퓨터 공학이라 부를 거라면, 의학은 칼 공학, 천문학은 망원경 공학으로 부르는 게 맞을 듯"이라는 말을 하며 '컴퓨터 과학' 명칭을 지지했다는 일화는 유명합니다.

컴퓨터 공학이 맞냐 과학이 맞냐, 그 정의가 정확히 무엇이냐는 사실 이 글에서 다루고 싶은 주제는 아닙니다만, 그래도 나름 복수 전공을 했던 입장으로서는 공식적인 명칭을 쓰고 싶기에, 이후 컴퓨터 과학 혹은 CS라는 명칭을 쓰도록 하겠습니다.

제가 복수전공을 하면서 배웠던 CS 계열 과목들은 아래와 같습니다.

  • 컴퓨터 프로그래밍 (C, Python)
  • 객체 지향 프로그래밍 (Java)
  • 컴퓨터 네트워크
  • 모바일 프로그래밍 (Android)
  • 데이터베이스
  • 소프트웨어 공학
  • 정보 보안
  • 컴퓨터 논리 개론
  • 컴퓨터 구조
  • 운영체제
  • 알고리즘
  • 데이터 분석

이 과목들이 정확히 CS 전공과 커리큘럼 면에서 어느 차이가 있나 봤는데, 그렇게 크진 않더군요. CS를 학부에서 배울 때에는 이 정도를 학습하게 된다는 것 정도를 파악하시면 될 듯합니다.

개발자가 되는 데, 컴퓨터 과학과를 나와야 하나요?

컴퓨터 과학을 전공했는 지는 중요하지 않습니다.

대학 전공을 100% 살려 취직하는 사람은 생각보다 별로 없습니다.

영문학을 예로 들어보고자 합니다. 영문학 전공자가 전공을 살려 취직한다면 어떤 직업을 갖게 될까요? 영어 교사 혹은 강사, 통번역가 등이 떠오르시겠지만 아닙니다. 영문학은 영어를 가르치거나, 통번역을 하는 사람을 위해 존재하는 학문이 아닙니다. 영문학을 직업으로 삼는다면 당연히 영문학에 관련이 되어 있어야합니다. 영어로 된 소설을 쓰거나, 비평하거나, 더 나아가 연구를 하는 사람이 되어야 하는 것이죠. 컴퓨터 과학도 비슷합니다. 컴퓨터 과학은 네카라쿠배 같은 IT 기업에 들어가 서비스 개발자를 하기 위해 존재하는 학문이 아닙니다. 컴퓨터 과학 전공의 올바른 지향점은 알고리즘 혹은 컴퓨터의 아키텍처 등을 연구하는 쪽이 되어야 할 것입니다.

원론적으로는 그러하나, 그렇다고 해서 우리가 영문학 전공자를 보고 "이 사람은 통번역은 아예 못 하겠네"라는 생각을 하진 않습니다. 그 전공에서 배우는 지식들이 직간접적으로 다른 업무를 수행하는 데 도움을 줄 수 있다는 것을 우리는 매우 잘 압니다. 개발자 중에 컴퓨터 과학 전공자가 많은 이유 중 하나는 이런 이유이기도 합니다. 요약하자면 "개발자가 되는 데 대학에서 CS를 전공할 필요는 없다. 그러나, CS 전공이 개발자 취직에 유리한 것은 분명하다" 입니다.

공학사 학위가 개발자 취직에 도움이 되나요?

결론부터 말하자면 "아니오"입니다. 제가 다니던 대학교는 문과 쪽에 역량이 치중되어 있는 학교였으며, 본 캠퍼스 내 재학생은 전부 문과였습니다. 그러던 중 소프트웨어 연계 전공이 새로 생기게 되었고, 이를 통해 굳이 컴퓨터 과학을 복수전공하지 않고도 조금 더 적은 부담으로 컴퓨터 과학을 배울 수 있게 되었습니다. 그러나, 문과 특성 때문이었는 지는 몰라도, 대다수의 학생이 "이 과정을 통해 컴퓨터 과학 지식을 많이 쌓아서 취직에 활용해야겠다" 보다는 "이 과정을 통해 얻는 공학사가 취직에 도움이 될 것이다" 정도로 접근하고 있었습니다. 안타깝지만, 개발사 취직에 공학사는 아무런 도움이 되지 않습니다. 적어도 IT 서비스 개발에 지원했으며, 본인이 학사 졸업이라면 그렇습니다.

개발자 취직에 도움이 되는 자격증이 있나요?

결론부터 말씀드리자면 "없습니다"입니다. 제 개인적인 생각으로는, 어떤 자격증을 따더라도 개발자로 취직하는 데 도움이 되지 않습니다. 정보처리기사가 있긴 합니다만, "있으면 좋고, 없으면 없는 대로 그만" 정도의 위상입니다. (직장이 SI 기업이고 공공기관으로부터 수주를 받는 입장이라면 가산점이 되긴 합니다.) 저는 정보처리기사를 필기만 보고, 실기 준비가 귀찮아서 보지 않았습니다. 그리고 현재까지 이것이 없어서 불이익을 받아본 적이 없습니다. 다만, 정보처리기사의 시험 범위는 컴퓨터 과학의 전반적인 내용입니다. 이것을 공부하는 과정 자체가 개발자 역량을 높이는 데에는 도움이 될 것입니다.

좋은 대학을 나와야 좋은 기업에 개발자로 취직하나요?

이것은 "그럴 수도 있고 아닐 수도 있다"입니다. 그 이유는, 잘 알려진 기업 중에서도 어떤 기업은, 또 어떤 업계에서는 실제로 학벌도 따지는 것으로 알기 때문입니다. 그러나 굳이 학벌을 따지지 않는, 다니기 좋은 기업도 충분히 많습니다. 학벌을 따지지 않는 이유는, 개발자는 어디까지나 "실력주의"이고, 학벌이 실력을 보장해주지는 않기 때문입니다. 개발자 채용에는 코딩 테스트, 기술 면접, 포트폴리오 등의 여러 단계가 있습니다. 이 과정들에서 자신의 실력과 성장 가능성, 그리고 기본기만 증명한다면 어떤 대학을 나왔는 지는 중요하지 않습니다.

다만, 좋은 학벌은 곧 머리가 좋다 내지는 공부에 재능이 있다는 의미이니, 위에서 언급한 '실력 좋은 개발자'가 될 가능성이 높다고는 할 수 있겠죠. 약간의 상관관계는 있을 수 있으나, 인과관계가 아니므로 연연해 하지 않아도 됩니다.

그럼 CS 지식도 필요가 없나요?

아니오. 위에서 CS 학위가 불필요하다고 했으나, CS 지식은 좋은 개발자가 되기 위한 필수 요건입니다. 컴퓨터 과학을 전공하지 않은 사람들이 개발자로서의 커리어를 시작하는 단계는, 보통 학원이거나 인터넷 강의가 됩니다. 이런 강의들은 대부분 특정 언어(Java, Php 등...)와 프레임워크 사용법 위주로 가르칩니다. 이렇게 하면 단기적으로는 재빨리 개발자가 될 수 있으나, 잠재적인 위험을 갖고 커리어를 시작하게 됩니다.

사용하는 언어는 언제 갑자기 바뀔 지 모른다.

아래 나열하는 것들은, 제가 직간접적으로 알고 있는 분들의 사례를 요약한 것입니다.

  • C++로 10년 넘게 개발을 해왔으나, 이직을 하면서 자바 Java로 변경. 현재는 코틀린 Kotlin으로 개발 중
  • 파이썬 Python으로 개발을 시작했으나, 팀 내에서 다른 언어를 사용하자는 의견이 모여 Go 언어로 전환
  • node.js로 2년간 개발을 해 왔으나, 인력 수급 등 여러가지 이유로 팀 내 사용 언어를 자바 Java로 전환
  • C# 개발자로 입사했으나, 인사 이동으로 자바 Java로 변경

세간에 알려진 것(?)과는 다르게, 개발자들은 게임 캐릭터 직업을 고르듯이 한 번 주력 언어를 정하고 그것을 죽을 때까지 쓰거나 그러지 않습니다. 물론 하루가 멀다하고 사용 언어가 계속 바뀌는 것은 아닙니다만, 여러가지 이유로 사용 언어는 바뀝니다. 언어가 점점 인기를 잃어 지원이 중단되어 더 이상 쓰고 싶어도 못 쓰게 되는 경우가 있거나, 성능 혹은 개발 편의성에서 문제가 있어 변환을 시도하기도 합니다. 조직 개편이 원인이 되기도 합니다. 그리고 대부분의 개발자들은 이 언어의 변화를 따라갑니다.

프로그래밍 언어는 개발자의 논리를 컴퓨터 세계에 구현하기 위한 도구에 불과합니다. 언어의 선택은 어디까지나 그 논리를 표현하기 위한 적당한 수단이기 때문이어야 합니다. 그림 그리기에 비유하자면, 자신의 머릿 속에 있는 세계를 도화지 위에 표현하는 것이 프로그래밍이고, 그것을 위해 사용할 수 있는 도구가 프로그래밍 언어인 셈입니다. 그림에는 연필을 쓸 수도 있고, 붓을 쓸 수도 있습니다. 그리고 아티스트가 연필을 집었다면 거기에는 그만한 이유가 있고, 붓을 집은 데에는 또 그만한 이유가 있겠죠. 이렇듯 개발자에게 언어는 수단 정도의 위상밖에 되지 않습니다. 그렇기에 특정 언어에만 국한된 스킬을 가지는 것은, 단기적으로는 도움이 되겠지만 언젠가는 독이 될 수 있습니다. 위에서 보았듯이, 지금 사용하고 있는 언어는 언제 바뀔 지 모르기 때문입니다.

새로운 것은 계속 생긴다.

2021년 최신 버전으로 공개된 백엔드 개발 로드맵. 해가 갈수록 배워야 할 것들은 기하급수적으로 많아집니다.

또 다시, 세간에 알려진 것(?)과는 다르게, 개발자는 프로그래밍 언어만으로 일을 하지 않습니다. 백엔드 개발을 예로 들자면, 메시지 큐, 데이터베이스, 로드 밸런서 등의 여러가지 컴포넌트들을 조합하여 개발을 진행하게 되는데, 이 자체만으로도 언어 외적으로 배워야할 부담이 되지만 개발 업계는 계속 해서 발전하므로, 새로운 패러다임이 등장할 때마다 그 흐름도 따라가야만 합니다. 이 개념들을 학습하고 어떻게 응용할 지를 친절하게 다 알려주는 강의가 항상 존재한다면 좋겠으나, 실상은 그렇지 않습니다. 결국 이것들을 이해하고 소화시켜서 실제 업무에 적용시키는 것은 어디까지나 개발자의 몫입니다. 좋은 개발자란 이 일을 잘 해내는 사람들을 의미하기도 합니다.

그렇다면, 새로운 개념이 등장할 때마다 제대로 학습하고 응용할 수 있게 되려면 어떻게 하면 될까요? 그 정답이 CS 전공 지식입니다. 아무리 새로운 개념이 등장한다 하더라도, 그것이 개발과 관련된 것이라면 그 개념의 근간은 컴퓨터 과학일 수밖에 없습니다. 그렇기에 CS의 기본기가 튼튼한 사람들은 개발 패러다임의 변화 속에서 잘 적응해나가며 앞으로 나아갈 수 있습니다.

CS 지식은 실제 개발에 어떤 식으로 활용이 되나요

3년 전쯤, 제가 취직 준비를 하던 때에 대학 후배로부터 연락을 받은 적이 있습니다. 그 친구는 단과 대학의 학생회장을 맡고 있었는데, 귀찮은 문제를 하나 안고 있었습니다. 본래 단과대에 관한 정보는 대학 홈페이지 내부의 작은 페이지로 존재하는 경우가 대부분이나, 특이하게도 제가 다녔던 일본어 대학은 독자적인 서버, 독자적인 도메인을 가지고 서비스가 되고 있었습니다. 그러나 시간이 지나면서 유지보수가 어렵게 되어 결국 독자적으로 사용하던 홈페이지를 폐기하고 다시 대학 홈페이지 안으로 들어가기로 결정했습니다.

문제는 몇년 간 홈페이지 게시판에 쌓아놓았던 활동 사진들을 옮겨야 했다는 것입니다. 대학 홈페이지는 게시판 인터페이스가 매우 구렸기 때문에, 게시글 안에 사진을 올리는 과정이 매우 번거로웠습니다. 게시글당 최대 10개까지의 사진을 첨부할 수 있었으나, 그 사진을 일괄 선택하는 것이 막혀있었기에 클릭질을 수십회를 반복해야 했습니다. 이렇게 작업했다간 며칠동안 사진만 복붙해야하는 상황이었기에, 후배가 저에게 업로드를 편하게 할 수 있는 방법이 없는지 물어봤습니다.

잘 만들어진 요즘 서비스들은 이런 경우에, Open API를 제공하여 손쉽게 글을 쓸 수 있도록 제공하고 있으나 외주 업체에게 맡겨 저예산으로 만들어진 학교 홈페이지에 그런 게 있을 리가 만무했습니다. 저는 그래서 컴퓨터 네트워크 지식을 활용하여, "대학 홈페이지 사진 업로더"를 만들어 주기로 하였습니다.

파일 업로드 문제를 직접 API 콜을 함으로써 해결했다.

서버 안에서 어떤 게시글을 추가하는 작업은, 특정 API를 호출함으로써 이뤄집니다. 저는 구글 크롬 개발자 도구를 통해 게시글을 업로드하는 API 주소를 알아내었고, 거기에 사용되는 parameter들을 알아냈습니다. 굳이 브라우저에서 게시판을 접속하지 않더라도, 해당 uri로 바디만 잘 갖추어 POST 요청을 보낸다면 게시물을 쓸 수 있는 것입니다. 저는 학교 홈페이지의 게시판보다 좀 더 강화된 편의성을 가진 UI로, 엔드포인트만 학교 홈페이지를 바라보도록 하여 사진 업로드를 우회적으로 할 수 있는 앱을 만들어줬습니다.

브라우저에서 로그인을 직접 하지 않더라도, 로그인 API를 호출한 이후에 session 값을 가져온다면 동일하게 사용할 수 있다.

또한, 이 동작에는 필수 불가결한 요소가 하나 있었으니, 바로 "인증"이었습니다. 학교 게시판은 관리자 권한을 위임받은 사용자만 올릴 수 있었으니, 단순히 API 콜을 호출한다고 해서 글이 작성되는 것이 아니었습니다. 그래서 작성 전에, 관리자 아이디로 로그인을 해두어야만 했습니다. http 프로토콜 상에서 인증 절차와, 인증 이후의 서비스 이용은 주로 "세션(Session)"이라는 방식에 의해 이루어지며, 이는 쿠키(Cookie) 값에 담겨오게 됩니다. 이 쿠키를 얻는 데만 성공한다면, 이후 게시판에 글을 올릴 수 있게 되는 것입니다. 이는 전부 컴퓨터 네트워크 강의에서 들은 지식이 있었기에 가능한 계산이었습니다. 이 앱을 만들어준 덕에 후배는 조금 더 손쉽게 사진 업로드를 할 수 있었습니다.

이 경험은 여러모로 제게 많이 특별한 경험이었습니다. 그 이유를 설명하자면

  • 제가 최초로 제가 아닌 남을 위해 앱을 제작해 준 경우였습니다. 즉, 첫 외주 작업이었습니다.
  • 전공 지식을 활용해 유의미한 결과물을 만들어 낼 수 있었습니다.
  • 이 과정을 통해 전공 지식에 대한 이해도가 높아졌습니다.

이렇게 세션과 쿠키의 활용을 직접 해봄으로써 쌓인 경험은, 1년 뒤에 라인에서 인턴 프로젝트를 할 때에도 도움이 되었습니다. 인턴 프로젝트 때에는 이미지 업로더 때와 반대로 서버 입장에서 인증 작업을 구현해야 했었는데, 이 외주 경험이 있었기에 빠른 속도로 학습할 수 있었습니다.

이 외에도 실제 개발자로서 일을 하게 되면서 CS 전공 지식의 필요성을 깨달은 경우는 많습니다만, 이 정도로도 충분히 필요성을 설명이 되었다고 생각합니다. CS 전공 지식을 아직 배우지 않았거나, 심지어 배우고 있는 사람들 중에서도 "이게 대관절 어떻게 업무에 쓰인다는 거지?" 라는 의문을 가지는 사람들이 있습니다. 당장은 그렇게 느껴질 수 있으나, 제가 결국에는 CS 지식의 도움을 받았듯이, 여러분도 분명히 언젠가 이 지식들이 빛을 발할 때가 올 것이라고 말씀드리고 싶습니다.

비전공자들은 CS 지식을 어떻게 습득하나

복수전공으로 이걸 습득한 입장에서, 비전공자 분들께 이 방법을 제시하기는 참 조심스럽습니다. 다행히도 요즘에는 CS 지식을 따로 알려주는 강의들도 늘었습니다. 습득에 걸리는 시간 자체만 본다면, 오히려 이 강의들을 전부 수강하는 것이 컴퓨터 과학 전공수업을 듣는 것보다 이득입니다. 4년에 걸쳐서 배우게 되는 것을 강의에서는 몇 개월 단위로 끝을 내버리니까요. 그리고 우려와 달리, 대학에서 배우는 CS 전공 지식이 인터넷 강의에서 배울 수 있는 지식과 근본적으로 차이가 나지 않습니다. 둘 다 같은 소스에서 나왔기 때문이죠. (이제 와서 밝히지만 전 대학에서 복수전공으로 지식을 습득하는 과정에서, 교수님의 강의보다는 구글 검색이 도움이 된 경우가 더 많았습니다.) 그러므로 강의를 찾아 듣거나, 적당한 기본서만 찾아 공부해도 개발에 필요한 CS 지식을 습득할 수 있을 것이라 생각합니다.

또한, 정보처리기사가 도움이 될 수 있습니다. 정보처리기사는 컴퓨터 과학 전반적인 내용을 시험으로 내기 때문에, 이것에 대해 공부를 하는 과정 자체가 컴퓨터 과학이 어떻게 구성되어 있으며, 어떤 지식들을 습득해야 하는지를 제시해 줄 수 있습니다. 학과 상관없이 학부 4학년만 되면 응시 자격이 생기니 정보처리기사 취득을 목적으로 공부해보시는 것도 도움이 될 것이라 생각합니다.

마치며

이걸 보자마자 들었던 제 생각은 '도대체 이게 무슨 개소리야?' 였습니다.

제가 초딩이었던 시절만 하더라도 개발자에 대한 사회적 인식이 썩 좋지 않았습니다. 그러던 것이 이제는 없어서 못 구하는 직업 취급을 받는 것 같아(약간의 과장도 있다고 봅니다만) 참 여러가지 생각을 하게 됩니다. 그러다보니 개발자로서의 커리어 전환을 고민하는 사람들도 부쩍 늘어났다는 느낌을 받았습니다. 그런 고민 글들을 보다보면 개발자를 양성하는 학원을 폄하하고, '코더'와 '아키텍트'를 운운하며 같은 개발자 내에서도 선을 그으려 하는 사람들을 종종 보아왔습니다.

저는 개발자의 출신이 개발자의 등급을 결정한다고 생각하지 않습니다. 유명한 개발자들은 전부 다 처음부터 대단한 기업에서 두각을 나타내왔을 것 같지만, 의외로 초라하게 시작해서 조금씩 올라온 사람들도 많습니다. 이것은 그들의 노력이 그만큼 가상했다는 의미이기도 하지만, 동시에 이 업계에서는 노력이 곧 긍정적인 결과로 이어질 수 있는 곳이라는 의미이기도 합니다. 그렇기에 비전공자라는 점, 학원 출신이라는 점이 자신에게 단점으로 작용하지 않을까를 걱정하지 않으셨으면 좋겠습니다. 중요한 것은 꾸준히 발전하려는 의지입니다. 그리고 그 의지에 힘을 보태주는 것이 바로 CS 지식이라고 말씀드리고 싶습니다.