“개구리를 해부하지 말고, 직접 만들어라.” 니콜라스 네그로폰데 박사가 《바이트》에 기고한 글입니다.
개구리를 더 잘 이해하려면 개구리 해부보다는 개구리와 똑같다고 부를 수 있을 개구리를 직접 만들어보라는 내용입니다.
정말 개구리와 똑같구나 싶을 정도로 만들려면 그만큼 개구리를 깊이 있게 이해하고 분석하고 설계해야만 가능합니다.
이 비유를 소프트웨어 분야에도 적용할 수 있습니다.
소프트웨어는 태생적으로 컴퓨터 과학의 이론과 전자공학 기반으로 만든 하드웨어 사이에 있습니다.
이론적인 배경을 학습하고 소프트웨어로 만들어보고, 하드웨어 구조와 특성을 학습하고 소프트웨어로 만들어보세요.
이론과 동일하게 동작하거나 하드웨어 없이 하드웨어처럼 동작하도록 만들려면 그만큼 제대로 이해하고 만들 수밖에 없습니다.
저는 대학 전공 수업에서 물리 법칙을 배우고, 디지털 시스템을 설계하고, 운영체제 동작 방식과 시스템 프로그래밍을 배웠습니다.
새로운 용어와 지식들이 넘쳐났죠. 무작정 외우는 방식 말고 다른 방법이 없을까 고민했습니다.
실험・실습 과목과 프로그래밍 과목이 암기 과목보다 더 흥미로웠고 결과적으로 학점도 잘 나왔습니다.
그때부터는 학습하는 전략을 바꿨습니다.
수치 해석 과목을 들으면서 뉴턴 방법으로 동작하는 계산기를 만들고, 데이터 네트워크를 수강하며 소켓 프로그램을 구현했습니다.
만약 지금 학생이고 운영체제를 수강한다면 운영체제를 구성하는 모듈을 나누고 직접 구현해본다고 생각하고 설계해보세요.
운영체제라고 부를 수 있을 정도 수준으로 만들려면 무엇을 어떻게 해야 하는지 생각해보는 것이 시발점입니다.
컴퓨터 CPU와 메모리, 네트워크 동작 방식, 데이터베이스 시스템, 컴파일러 등 학교에서도 이론적으로만 배우고 끝나는 과목들을 소프트웨어로 직접 구현해보면 흩어진 형식지가 암묵지로 연결됩니다.
학부 4학년 때는 전산학과 전공 수업을 들으면서 어려운 이론 과목이지만 의도적으로 구현해보려고 노력했습니다.
전공으로 인정되지 않아서 교양 학점으로만 남는 무모한 도전이었지만, 데이터베이스, 컴파일러나 인공지능 개발에 도전했습니다. 아마 과제였다면 흥미가 떨어져 하기 싫었을 겁니다.
그중에서 방정식을 증명하고 증명한 것을 계산 모델로 만드는 수치해석 과목이 가장 기억에 남습니다.
수시 해석을 통해 만든 방정식 계산법을 구현해보기 위해서 일부러 컴파일러 과목에서 배운 구문 분석 문법을 활용했습니다.
파스칼 문법과 비슷한 a-z까지 변수 개념을 추가했습니다.
사칙 연산과 논리 연산, sin(), cos(), pow(), exp() 같은 수학 함수들을 지원했고 일변수 다항식 해를 찾는 이분법(Bisection)과 할선* 계산 함수를 직접 구현했습니다.
마지막으로 출력 함수를 추가해서 나만의 공학용 계산기를 완성했습니다.
개발 과정에서 계산식 파싱 결과를 확인할 수 있는 디버깅 화면까지 넣었습니다. 스스로 원해서 한 것이니 개발 과정이 흥미롭고 재밌다는 건 두말할 필요가 없겠죠.
당시 객체 파스칼로 구현했던 계산기는 놀랍게도 아직도 잘 동작합니다!
* Secant. 원 또는 곡선과 두 개 이상의 점에서 만나 그 원이나 곡선을 자르는 직선
수치해석 계산기
수업 시간에 배우는 지식을 기획하고 설계해서 직접 구현한다는 것은 쉽지 않은 일입니다.
구현 범위가 넓거나 무엇을 개발할지 구체적이지 않아서 실패할 가능성이 높아 쉽게 포기하게 됩니다.
끝까지 해내는 팁을 하나 드리자면 우선은 함수 하나만 구현해보라는 겁니다.
이어서 입력・출력을 바꿔보고, 화면을 추가하는 식으로 점차 기획과 구현 범위를 넓혀 가는 겁니다.
그래야 수업에서 학습한 내용을 코드로 바꾸는 과정에서 형식지를 암묵지로 바꾸려는 의도적인 수련이 일어나면서 어렵지만 즐거운 도전으로 마무리할 수 있습니다.
실제로 개발 현장에서도 개구리를 해부하는 일이 자주 생깁니다.
새로운 라이브러리를 사용할지 검토하는 일, 다른 사람이 작성한 코드를 리뷰하는 일 모두가 개구리를 해부하는 일입니다.
이런 분석 작업을 할 때도 직접 구현하지는 않더라도, 내가 직접 구현한다면 어떻게 설계할 것인가 비교해보세요.
개구리를 만들라고 강조했지만 해부해서 분석하는 작업도 중요합니다.
그렇지만 분석만 하고 구현해보지 않으면 암묵지로 체화되기 어려우며 놓치는 부분이 생길 수 있습니다.
분석 단계에서는 직접 만들어보지 않고 분해하고, 관련 지식을 찾아 위에서 아래로 탐색하는 방식도 필요합니다.
분석이 끝나고 아래서 위로 해당 문제와 관련된 것인지 아닌지 확인하면서 구현하면 종합적인 시야를 가질 수 있습니다.
개발 업무나 개발 과정도 톱다운 방식으로 요구사항 분석이나 설계부터 구현까지 한 번에 끝날 것 같지만 그렇지 않습니다.
추상적인 상위 수준에서 구체적적인 하위 수준까지 내려오기도 하고, 다시 위로 올라가기도 하면서 반복하면서 개발합니다.
그래서 직접 만들어보라는 의미는 분석, 설계, 개발, 검증 단계를 위에서 아래로, 아래에서 위로 반복해야 한다는 의미입니다.
4편에서 소개할 원칙은 ‘남을 향한 자존심을 버리고, 나를 향한 자존감 채우기’입니다.
★ 더 나은 개발자로 성장을 꿈꾼다면
★ 먼저 헤쳐온 테크 리더들의 원칙에서 해답을 찾아보세요
“나도 테크 리더가 될 수 있을까? 어떻게 선배 개발자들처럼 성장할 수 있을까? 3년 10년 후에도 개발자로 살아갈 수 있을까? 팀워크는 도대체 어떻게 맞춰야 하는 걸까?”
개발자로 살아가면서 하루에도 천 번을 되묻는 물음에 마켓컬리, 레몬트리, 카카오, 코드스쿼드, 무신사, 몰로코, 데이블, 인프런, 패스트캠퍼스 테크 리더 9명이 답합니다.
지금까지 만나 볼 수 없었던 생존과 성장의 원칙에서 자신만의 해답을 찾아보세요.
김정
소프트웨어 교육 기업 코드스쿼드 대표로 모바일 iOS 마스터를 담당합니다. 케텔 시절 비파툴, 델마당 개발자 커뮤니티를 시작해서 취미 맥개발자 커뮤니티 OSXDev를 거쳐 레츠스위프트 커 뮤니티 운영진으로 끊임없이 살아가는 중입니다.