Nand2Tetris를 시작하며

처음 프로그래밍을 공부할 때에는 나도 프로그래머에 대한 환상이 있었다. 그래서 TCP/IP를 구현하거나, 네트워크 기술들이 어떻게 동작하는지 세세하게 알아야만 비로소 프로그래머 입니다라고 말할 수 있을 것 같았다. 파일이 압축되는 방식이나 해쉬코드가 생성되는 알고리즘에 대해 알고 성능개선을 위해 조금이라도 시도를 해봤어야 프로그래머입니다라고 말할 수 있을 것 같았다.

소프트웨어에 본격적으로 뛰어든지 약 2년반이 지났지만, 나는 여전히 그당시에 생각했던 환상적인 프로그래머에 가까워지지 못했다. 아니 오히려 더 멀여졌다. 여전히 나는 가장 높은 추상계층에서 코드를 썼으며 네트워크와 통신하기 위해서 http.post(), 해쉬함수를 생성하기 위해서 hash()를 사용했다. 세세하기 알기 보다, 아주 간단하고 쉽게 물리 세계와 복잡한 알고리즘들을 호출했다.

1년전 쯤 아주 잠시 이런 것들에 대한 회의감이 들었을 때가 있었다.이렇게 나는 오랜시간이 지난뒤에도 기술에 대해 명시적으로 설명하기 보다 내가 겪은, 즉 경험에 대한 얘기 밖에 할 수 없었고, 구현은 더더욱 하지 못할 것이다.

그럼 나는 지난 시간동안 무엇을 했는지 짚어보았다. 나는 다른 방향을 택했다. 어플리케이션 하나를 완성하고, 요구에 맞춰 변경하고, 이를 계속해서 유지하는 어플리케이션을 만드는 방법과 기술들이 내 최고 관심사가 되었다. 나는 애자일과 테스트에 더 관심이 많고, 초기단계와 성숙한 단계의 어플리케이션이 다른 것을 인지하는 것이 더 중요하다고 생각하게 되었다. 좀 더 적나라하게 말하자면 나는 로우레벨 기술들과 작별을 선택하고, 추상계층 위에서 놀기 작정한 것이다.

토이프로젝트(라즈베리파이와 웹을 비디오 스트리밍)를 하는 와중에 TCP/IP로 통신하는 패킷들을 직접 열어봐야 하는 상황에 직면했고, 패킷들을 해석하기 위해서 2주정도 해맸던 기억이 있다. 패킷 선두에 여러가지 정보를 심는것도 그 때 처음알았고, 어찌어찌해서 해결하긴 했지만, 여전히 나는 그 원리는 깊은 내용에 대해서는 부끄럽게도 설명할 수가 없다.

앞으로도 나는 계속해서 높은 추상 계층에서 놀것이다. 저수준의 언어보다 고수준의 언어를 즐겨쓰고, 직접 인프라의 세계를 다 알 수는 없지만, 나는 몇줄의 간단한 코드로 서버를 켜고 끌 수 있을 것이다. 그렇게 나는 코드로 가치를 전달하는 일에 집중할 것이다.

아니 더 심할정도로 나는 이보다 더 높은 추상층으로 갈 것이다. 더 높이 개발자들이 일하는 현실로 가까이 갈 것이다. 모든 코드는 개발자들에 의해 쓰여지는 것이고, 개발자들이 일하는 환경, 중요하게 여기는 가치, 문화들이 결국 그 코드에 지대한 영향을 미치기 때문이다.(가치에 영향을 미치는 것은 비단 코드로 써진 서버나 멋진 애니메이션만이 아니다.)

공학자로써 응당 알아야 할 것들에 대한 이야기들, 로우기술에 대한 목마름 이것들은 모두 환상이였을지도 모르겠다. 환상은 깨졌지만 방향은 잡혔다.

회사내 연구 개발팀에서 NandToTetris라는 스터디를 시작한다고 해서 참여의사를 밝혔다. 그렇다면 이건 왜 신청했을까? 토이프로젝트의 사례처럼 언제든 로우레벨에 방문해야 될 상황은 있을 것이다. 그 때를 대비한 지도 하나 쯤은 있어도 좋지 않을까? 나는 추상계층 위에 살지만 언제든 바이프로스트를 타고 이 지도에 의존하여 디지털세계와 어셈블리의 세계, OS의 세계로 떠날 것이다.