2007년 09월 04일
아키텍쳐는 코드 한줄부터...
앞선 글에서 단지 프로그램을 작성할줄만 아는 개발자는 코더일 뿐이다라고 비판했지만, 사실 좋은 아키텍트로 성장하기 위해서는 가장 먼저 착한 코더가 되어야 한다. 일단 돌아가기만 하면 된다라는 자세로 코딩을 수행하는 개발자는 절대로 좋은 개발자가 될 수 없고 단명하기 마련이다. 거대한 피라미드를 짓는데 모래로 쌓을 수는 없지 않은가? 가장 단단한 돌을 고르고 골라 하나씩 하나씩 깍아내고 쌓고 또 쌓는 아주 단순하고 기본적인 일들이 반복되어야 하는 것이다. 물론 아키텍트가 직접 모든 코드를 작성하는 것은 아니겠지만, 아키텍트 자신은 성실한 자세를 견지하지 못하면서 남에게 요구할 수 있겠는가? 한번 더 다른 시각으로 보자면 어떤 방식으로 코딩하는 것이 올바른 것인지 모르는 사람이 시스템의 완성도를 검증할 수도 없게 되는 것이다.
아파치 재단에서 개발된 소스나 썬에서 개발된 자바 API 코드를 들여다 보면 소스 코드의 길이보다 주석의 양이 10배가 넘는다는 것을 보게 된다. 코드 한 줄, 한 줄 작성하는데 있어서 철두철미하게 세세한 설정에 신경을 쓰고, 줄맞추기도 게을리 하지 않았다는 것을 알 수 있다. 만일 국제적으로 프로그램 작성 능력에 대한 나라별 순위를 따진다면 우리나라는 능히 꼴찌를 놓치지 않을 것이다.
대충 대충 프로그램 작성하고 변수명도 a, b, c를 즐겨쓰는 개발자들에게 나름의 변명거리가 있기 마련이다. 시일이 촉박하고 아무도 알아주지도 않고 돈도 적게 받는데 왜 그런 수고를 들여야 하는가라고 반문하기도 할 것이다. 아무도 알아주지 않다가도 그대가 더 나은 회사로 옮기고 싶고, 더 나은 개발자가 되고 싶고, 최고라는 소리를 듣고 싶을 때 남들에게 당신이 작성한 소스를 내어 보여야 하지 않을까? 그럴 때 지금 속으로 뇌까리고 있는 변명이 무슨 소용이 있겠는가? 지금이 아니면 언제 제대로 된 소스를 작성할 수 있을까? 언젠가 좋은 회사에 들어가게 된 후라고 한다면, 마치 로또 당첨된 후에 열심히 살겠다고 말하는 것과 다른게 무얼까?
프로그래밍 언어라는 것은 그리 단순한 시스템이 아니다. 코드 한줄, 문법 하나하나에도 수많은 개발자들, 학자들의 고뇌와 철학이 응축되어 있는 것이다. 가장 유명한 C언어 프로그램을 한번 들여다 보자. 겨우 단 4줄에 불과한 프로그램이지만, C 언어를 창조한 사람의 철학이 담겨 있는 프로그램이다. 제대로 이해하지 못하면 제대로 쓸 수가 없다.
#include <stdio.h>
main()
{
printf("hello, world\n");
}
아주 단순한 코드들이지만 그 안에 담겨진 C 언어의 미학을 옅볼 수 있다.
1. 간결하고 단순함
최근에는 C 언어 이전에 나온 언어들을 겪어본 개발자를 거의 볼 수 없게 되었지만, 포트란, 코볼, 심지어 어셈블리 언어를 이용해서 화면에 한 문장을 출력하려면 최소한 A4 한장이 넘는 분량의 코드를 작성해야 했다. (3년 전에 모교에서 어셈블리 과목을 3학기 동안 강의한적 있는데 어셈블리의 난해함과 지루한 코딩에 질린 학생들이 한학기가 끝나도록 화면에 구구단 출력하는 프로그램 정도를 겨우 만들 수 있었다.)
이전의 언어에서는 불필요한(?) 각종 선언과 길고 긴 예약어들, 그리고 까다로운 제어 문장으로 개발자들에 불필요한 노동을 강요하곤 했다. 하지만, C 언어는 최대한 타이핑을 줄일 수 있도록 영어단어가 아니라 괄호({})와 샾(#) 등을 기호를 언어에 도입하는 파격을 감행했다. 물론 부작용도 있는데 # 문자의 의미에 대해서 제대로 아는 개발자가 몇이나 될까? 우리 회사 개발자 10명에게 물어보면 아마도 9명은 대답을 못할 것이다.
2. 구조적 프로그래밍
여러 줄의 프로그램 코드를 괄호로 묶을 수 있다는 것은 무얼 의미할까? 더 나아가 괄호로 묶은 소스들의 묶음들이 중첩될 수 있고 (이중 루프를 떠올려 보라), 묶음에다가 이름을 붙일 수 있다는 것(함수를 만든다는 것)은 구조적 프로그래밍 시대의 도래를 알린 신호탄 이었다. 이전 언어에는 이런 식의 작성법이 거의 불가능했다.
거창한 표현으로 패러다임의 변화(혹은 진화)라고 하는 것인데, 괜히 어려운 말로 하지 말고 쉽게 말해보자. 인간은 날 수 없다라는 명제가 있다. 아니 왜 못 날아? 그럼 날 수 있게 도와주는 기계를 만들면 되지라고 말하고 실제 그런 기계를 만들어 내는 시도를 통해 세상을 바꾸는 것, 이런 걸 패러다임의 변화라고 한다.
3. API 제공
printf()는 무엇인가? 개발자가 스스로 만들지 않았지만 이미 만들어져 있어서 사용할 수 있는 함수를 의미한다. 그런데 이걸 잘 들여다 보면 고정된 문법이나 명령이 아니라는 것을 알 수 있다. - 언어가 제공하는 작업 도구 중에서 명령문이나 연산자(+, -, *, /, =)는 확장이 불가능한 도구다. - 즉, 추가 확장이 가능하다는 것을 암시하고 있는 것이다. API라는 개념이 널리 쓰이게 된 과정에서도 C언어는 지대한 공헌을 했다. 이전의 언어에서도 서브루틴 호출이라는 개념이 없지는 않았지만, 본격적으로 적용되기 시작한 시점은 아마도 C언어 이후로 알고 있다. C언어에서 함수를 만든다는 것, 코드 블럭을 만드는 작업은 아주 쉽기 때문이다. 단지 앞뒤에 괄호만 넣어주면 된다. 함수를 해체하거나 둘 이상의 함수를 합치고자 할 경우에는 괄호를 빼면 된다. 이토록 단순한 특성 때문에 무수히 많은 오픈 소스와 무료 라이브러리들이 세상에 만발하게 된 것이다.
우리는 이제까지 어쩌면 자신이 다루는 도구에 대해서 너무나 무관심하지는 않았는가 반성해야만 한다. 아주 단순한 코드들에 담긴 여러가지 숨겨진 지식들을 하나씩 파헤치다 보면 오히려 거대한 시스템을 설계하기 위한 영감을 얻을 수 있게 된다. 마치 인간이 존재의 근원을 알기 위해 DNA를 연구하는 것처럼 말이다. 이제 한가지 질문을 남겨 보자. # 문자의 의미는 무얼까? #include의 의미는 그리고 stdio는 무엇의 약자일까?
이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- 프로그래머의 조건.. by 우하하
- [안철수 컬럼] 경쟁력 있는 프로그래머의 조건 by 제갈장비
- 아키텍쳐 설계(론)에 대해서... by 써니
# by | 2007/09/04 10:06 | Architecture | 트랙백 | 핑백(1) | 덧글(5)





... 0 metoo 사실 좋은 아키텍트로 성장하기 위해서는 가장 먼저 착한 코더가 되어야 한다 오후 10시 39분 Tokyo(JST) 정석 ... more