개발 공부를 시작하다

개발 공부를 하기로 마음을 먹었지만, 어디서부터 시작해야 될지 막막했다.

우선 컴퓨터를 켜고 개발을 배울 수 있는 곳을 찾았다. 그중 가장 먼저 생활코딩이 눈에 띄었다. 그렇게 이고잉님을 처음 만났다. 처음 개발에 흥미를 붙이고 열심히 할 수 있었던 것은 생활코딩의 영향이 컸다. 이고잉님의 강의는 개발 강의이자 철학 강의였다. 단순히 개발 언어를 소개하고 기능을 알려주는 강의가 아니었다. 프로그래밍 언어가 어떻게 나오게 되었고 왜 필요한지, 언어별 장단점은 무엇이고 어떤 목적으로 사용하는지를 설명해주셨다. 개발을 통해 얻을 수 있는 편리함과 가치를 수강생이 스스로 생각해보게 했다. 기술과 그 안에 담긴 가치를 함께 전달해주는 생활코딩 덕분에 개발 공부를 재미있게 할 수 있었다.

그렇게 생활코딩에서 Java, Python, PHP, HTML, CSS, Javascript 등의 언어를 배웠다. 어느 정도 기초가 쌓였을 때쯤 유튜브와 인프런 강의를 참고하여 간단한 안드로이드 애플리케이션을 만들었다.

gif

  • 개인 프로젝트로 만들었던 안드로이드 애플리케이션

공부한 내용을 바로 적용해가며 눈에 보이는 결과물을 만들어 내는 과정이 너무 재미있었다. 그동안 답이 없는 토론과 막연한 진로 탐색에 지쳐있던 나에게 개발 공부는 재미있는 놀이였다.

무엇보다 조금씩 성장하고 있는 게 느껴졌다.

현실에 직면하다.

그렇게 1년을 공부했다. 그러다 평소에 동경하던 개발자님이 CEO로 있는 스타트업에서 인턴을 모집한다는 공고를 보았다. 꼭 가고 싶었던 회사였기에 지원해보기로 했다.

하지만 시작부터 현실의 벽을 실감했다.

인턴 지원서를 제출하기 위해서는 아래와 같은 질문에 대한 답을 작성해야했다.

1) 웹브라우저 URL에 www.naver.com을 치고 나서 네이버 첫페이지가 표시되기까지 일어나는 일을 본인이 알고 있는대로 최대한 상세하게 설명해 보라.

2) 동시 사용자 최대 100명, 채팅방1개, 텍스트만 주고 받는 것이 기능의 전부인 최소 스펙의 채팅 서버를 데모가 가능한 정도의 안정성을 확보하는 수준으로 만들어야 한다. 어떤 언어로 몇줄 정도에 어느 정도 기간에 만들 수 있는가?

3) 압축이란 것은 어떻게 하는 것일까? 손실 압축과 비손실 압축의 차이는 무엇일까?

4) 피보나치 수의 함수 f(n)을 작성하는 여러가지 방법에 대해서 떠오르는대로 모두 얘기해 보라.

5) 데이터베이스에서 인덱스와 관련하여 생각나는 기술적인 내용들에 대해서 모두 얘기해 보라.

대답 할 수 있는게 아무 것도 없었다.

그 동안은 그저 기능 구현에만 초점을 맞추었지 프로그래밍이 동작하는 원리나 효율성에 대해서는 무지했다. 자동차를 운전만 해봤지 엔진은 어떻게 돌아가는지, 연비를 높이려면 어떻게 운전해야하는지, 타이어의 공기압은 어느 정도가 적당한지 등에 대해서는 전혀 알지 못 했다.

아는 건 없었지만 검색을 해가며 답변을 작성했다. 이 과정에서 네트워크와 데이터베이스에 대해 아주 조금은 알게 되었다. 지원서에는 질문에 대한 답변과 더불어 그 동안 토이 프로젝트로 만들었던 안드로이드 애플리케이션 작품도 함께 제출했다.

간절함이 전달 된 걸까? 서류 전형을 통과하고 면접에 가게 되었다.
VX2.png

가고 싶던 회사에서의 면접

하지만 역시나 면접에서 내 밑바닥이 낱낱이 드러났다.

간단한 자기소개 후 첫 질문이 들어왔다.

"화이트보드에 간단한 알고리즘을 작성해보시겠어요? 숫자 n을 입력받아 소수인지 아닌지 판별하는 함수를 작성해보세요."

알고리즘 이라니.. 그 동안 알고리즘은 한 번도 풀어본 적이 없었다. 하필 처음 풀어보는 알고리즘 문제를 면접에서.. 그것도 손코딩으로 풀어야 한다니.. 머리가 하얘졌다.

어떻게 접근해야할지 도저히 감이 잡히지 않았다. 자리에서 일어나 화이트보드 앞으로 가는 길이 영겁의 시간처럼 느껴졌다. 펜을 집어 들고 뭐라도 적어보고 싶었으나 소수가 무엇인지조차 생각나지 않았다.

결국 소수가 무엇인지 질문했고 면접과님께서도 친절하게 대답해주셨다.

'소수는 1과 자기 자신으로만 나누어지는 수 입니다.'

그러나 소수의 정의를 알고도 달라진 건 없었다. 5분간 가만히 서있자 면접관님께서 힌트를 주셨다.

'예를 들어, 2를 제외한 짝수는 소수가 아니겠죠?'

힌트를 받아 2를 제외한 짝수는 소수가 아님을 판별하는 식을 세웠다. 하지만 거기까지 였다. 면접관님들의 도움을 받아 조금씩 적어가긴 했지만 실제로는 엉망징창인 코드였다. (분명 파이썬 코드인데 for 문은 자바로 짜고 있었다..) 그렇게 20분간 서서 얼른 이 시간이 끝나길 바랐다.

손코딩 질문이 끝나고 무기력하게 자리에 앉아 다음 질문을 이어서 받았다.

"방금 작성한 코드의 시간복잡도는 얼마나 될까요?"
"오버로딩과 오버라이딩의 차이는 무엇인가요? 코드로 설명해주세요"
"Call by value 와 Call by reference 의 차이는 무엇이죠? 메모리에는 어떻게 할당되나요?"
.
.
.

이렇게 무기력하게 면접을 본 건 처음이었다.
회사 문을 나와 엘레베이터를 타고 내려오며 생각했다.

이 길은 내 길이 아닌가..?
나는 그 동안 무엇을 한 거지..?
내 자신이 너무 부끄러웠다.
그렇게 초라하게 느껴질 수가 없었다.

하지만 이렇게 끝내기에는 너무 아쉬웠다. 면접에서 받았던 질문에 대해 공부하고 답변을 정리했다. 면접 결과가 나오기 전 정리한 내용을 메일로 보냈다.

이미 끝난 면접에서 이러한 행동이 자칫 구차하게 보일 수도 있을 것 같았지만
당시에는 이렇게 메일을 보냄으로써 느끼는 부끄러움보다 아무것도 하지 않음으로써 느끼는 아쉬움이 더 컸다.

VX3.png

결과는 예상대로 불합격이었다.

VX1.png

하지만 개발자로서 본 첫 면접이 나에겐 큰 전환점이 되었다. 면접을 통해 내가 부족한 부분이 무엇인지 분명히 알 수 있었다. 또한, 그 동안 공부해 온 방식에 변화가 필요하다는 걸 느끼게 해주었다. 무엇보다 면접 과정에서 받은 질문이나 면접관 분들의 태도, 회사 분위기를 보며 더더욱 이 곳에서 일하고 싶어졌다.

불합격 메일을 받은 날 스스로 다짐했다.
"1년 뒤 더 성장한 모습으로 다시 한 번 도전하자."