<div>"어떤 언어를 배우는게 좋을까요? 조금 어렵다고 하지만 역시 C일까요?"</div> <div><br></div>처음으로 프로그래밍을 접하고 배우고 싶어하시는 분들이 자주 하시는 질문입니다. <div><br></div> <div><span style="font-size:9pt;line-height:1.5;">처음 시작하는 언어와 나중에 자기가 전문으로 사용할 언어의 숙련도는 언뜻 굉장히 중요해 보입니다.</span></div> <div>저 역시 컴퓨터 공학으로 학교에 입학했을 때 그렇게 생각했고 그렇게 들어왔지요.</div> <div><br></div> <div>C, C++, Java, PHP, C#, Objective C, Javascript, Python, Ruby... 무슨 언어는 이렇게 또 많은지</div> <div>'만약 잘 못 된 우물을 파고 있는거면 어쩌지? 한 3년 열심히 팠더니 다른 언어가 각광 받으면 난 뻘짓한게 되는건가?'</div> <div>처음 공부를 시작하고 싶은 사람들은 헷갈리고 막연합니다.</div> <div><br></div> <div>누군가 저에게 이런 고민을 물어보면 전 대체로 이렇게 이야기 합니다.</div> <div>"고민하지 마시고 재밌어 보이는 걸로 아무거나 골라 하세요."</div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div>사람마다 의견이 다를 수 있지만 저의 지론은 "언어의 숙련도와 개발능력의 상관관계는 절대적이지 않다" 입니다.</div> <div>물론 한 언어를 아주 능숙하게 다룬다면 개발에 큰 도움이 될 겁니다. </div> <div>하지만 한 언어를 아주 능숙하게 다루는 엔지니어 A씨가 좋은 개발자냐고 묻는다면, 이는 항상 참이라고 볼 수는 없습니다.</div> <div>만약 A씨가 좋은 개발자라고 한다면 이는 한 언어를 잘 다루기 때문이 아니라 그렇게 되기까지 많은 경험과 지식이 있기 때문이라고 보는것이 더 옳습니다.</div> <div><br></div> <div>그럼 어떤 요소가 엔지니어의 퀄리티를 판가름 하는 걸까요?</div> <div>여러가지가 있겠지만 크게 두가지로 나눠 보자면 모델링 능력과 알고리즘 숙련도일겁니다.</div> <div><br></div> <div>모델링 능력은 굵직한 뼈대를 그려내면서 동시에 얼마나 구체화 된 수치를 예측하느냐 입니다.</div> <div>이 서비스를 개발하면 얼마나 많은 유저가 있을까? 트래픽은 얼마나 될까? 얼마나 큰 서버가 필요할까 등등 큰 그림에서 작은 그림을 그려나갑니다.</div> <div>이러한 작업을 specification이라고 합니다.</div> <div>모델링 능력은 많은 경험+지식과 약간의 직관력에 좌우됩니다.</div> <div>때문에 미국 실리콘밸리의 회사에서는 인터뷰시에 이런 디자인/직관 문제를 자주 냅니다.</div> <div>"비행기 예약시스템을 디자인해보세요", "미국 전체에 휴대전화 송신탑이 몇개나 될까요? 이유를 말해보세요"</div> <div><br></div> <div>알고리즘은 우리가 학교에서 배우는 자료구조들과 그를 이용한 문제 해결능력입니다. 어떻게보면 수학적 능력이라고 볼 수 있습니다.</div> <div>리스트, 트리, 그래프, 해쉬테이블, 서치, 소트, 최단경로탐색, 등등 아주 기본적이면서도 중요한 지식들이지요.</div> <div>복잡한 문제가 앞에 있을 때 어떻게 해야 효율적인 시간복잡도와 공간복잡도로 문제를 해결 할 수 있는지 항상 고민해야 합니다.</div> <div><br></div> <div>질문) </div> <div>"인터넷 최근 인기 검색어를 구현해봅시다. 최근 24시간 동안 가장 인기 있는 검색어 top 10을 출력하는 알고리즘을 구현하세요"</div> <div><br></div> <div><br></div> <div>엔지니어라면 문제를 보는 순간 여러가지 상황에 따라 알고리즘이 떠 오를 겁니다.</div> <div>검색어의 양이 크지 않다면 Insertion과 look-up의 시간복잡도가 O(1)인 해쉬테이블이 이상적이겠지만, 만약 그 검색어 양이 엄청나게 많다면 해쉬테이블의 공간복잡도로는 무리겠지요. 아마도 R-B Tree를 이용한 근사값 추출을 해야하지 않을까. 하고 생각할겁니다. </div> <div><br></div> <div><br></div> <div>이러한 모델링능력, 알고리즘 지식은 자신이 사용하는 언어와는 거의 상관 없습니다. </div> <div>바꿔 말하면 이런 지식만 있다면 평생 한 언어만 사용한 사람이더라도 다른 언어로 구현해 내는게 크게 어려운 일이 아닙니다.</div> <div><br></div> <div>그러한 이유로 실리콘밸리의 IT 기업에서 기술 면접을 보면 특정한 케이스가 아니면 대체로 언어에 크게 연연하지 않습니다.</div> <div><span style="font-size:9pt;line-height:1.5;">전 현재 운영체제를 만드는 시스템그룹에서 일하고 있는데도 인터뷰를 볼 때 Python으로 봤습니다. </span></div> <div>물론 원래 C를 불편함 없이 다루긴 했고 이력서에 어필하긴 했지만 만약 팀에서 정말 C 언어능력만을 중요시 했다면 제 인터뷰를 C로 요청했겠지요.</div> <div><br></div> <div><span style="font-size:9pt;line-height:1.5;">전 이런 방향성이 맞다고 봅니다.</span></div> <div><br></div> <div><br></div> <div>제 개인적인 의견으로는 전공자가 아닌 이상 처음부터 억지로 C를 배우실 필요는 없습니다.</div> <div>일단 간단한 목표 설정을 하시고 자신이 결과를 볼 수 있을만한 걸 하는게 성취감도 있고 재밌습니다.</div> <div><br></div> <div>예전에 중고생 대상으로 로보트 만들기 캠프를 했는데 그때는 레고 마인드스톰과 iRobot create을 써서 프로그래밍을 가르쳤거든요.</div> <div>실제로 자신이 프로그래밍을 해서 뭔가 감지하고 움직이는 걸 만든다는게 무척 즐거워 보였습니다.</div> <div><br></div> <div>핸드폰 앱 개발을 해보고 싶으시면, 자신의 전화기 연결해서 아주 간단한 프로그램이라도 만들어보는게 윈도우 까만 윈도우 콘솔에서 스트링이랑 씨름하는 것 보다 훨씬 더 즐겁고 빨리 배우는 길이라고 생각합니다. 어차피 찍는 Hello World, 자기 전화에 찍히면 더 신기하에에기라도 하잖아요.</div> <div><br></div> <div>자신은 조금 하드코어고 C로 이런걸 해보고 싶으시다면 Arduino/AVR 같은 키트 프로그래밍을 해 보세요. </div> <div>요즘엔 초보용 키트가 아주 잘 나와서 납땜질 따로 안 하고 빵보드에 조립해서 프로그래밍만 할 수 있는 세트도 많답니다.</div> <div><br></div> <div><br></div> <div>언어에 익숙해지시면 언어 자체보다 조금씩 자료구조와 알고리즘들을 공부하세요. 프로젝트도 조금씩 크게 키워 보시구요.</div> <div>어느정도 자신이 생기시면 github등 오픈프로젝트에 참여하셔서 다른 사람들이 어떻게 짜는지 구경도 해보시구요.</div> <div><br></div> <div>이렇게 기웃기웃 하면서 일단 어떤 언어라도 어느 정도 발을 붙이시면 확장은 그때부터 하셔도 늦지 않습니다.</div> <div><span style="font-size:9pt;line-height:1.5;">그때는 자신의 상황에 어떤 언어가 더 나을지 보는 눈도 생기고, 진로도 명확해지며, 새로운 언어에 대한 진입장벽도 훨씬 낮아집니다.</span></div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div>.... 그래도 꼭꼭꼭 배워야 할 한 언어를 추천받으셔야겠다면</div> <div><br></div> <div><br></div> <div>전 영어를 추천하렵니다. (진지)</div>