증명, 엑셀, 포토샵을 모두 더 쉽게 하는 방법이 있습니다. 소프트웨어 개발을 잘하는 방법을 적용하면 됩니다. 하지만, 저는 자동화된 증명 도구를 사용하거나, 엑셀에서 VBA 프로그래밍을 하거나, 스크립트 언어로 포토샵을 자동화하는 것을 주로 이야기하려고 하는 것이 아닙니다(물론 그런 것들도 포함될 수는 있습니다).
소프트웨어 개발을 잘하는 방법을 연구하는 학문이 소프트웨어 공학(Software Engineering)입니다. SE라고 줄여서 말하죠. 이 SE에는 여러 명이 뭔가 잘하는 방법도 많이 포함되어 있지만, 우선 개인 수준에 적용하는 것에 한정해서 말하겠습니다. 쉽게 말해 프로그래밍을 잘하는 방법이라고 할 수 있습니다.
프로그래밍을 잘하는 방법은
- 복잡한 것을 만들거나
- 한 번 만든 것을 나중에 자주 변경해야 하거나
하는 상황이라면 모두 도움이 됩니다. 제가 말하는 도움이 된다는 것은 노력을 줄이고 품질을 높인다(실수를 줄인다든지)는 뜻입니다.
세가지 예를 들어보이도록 하겠습니다.
증명
구조적 프로그래밍이라는 기법이 있습니다. 이 방법을 증명에 적용하면 증명과정이 훨씬 쉽고 명료해 집니다.제가 10년도 전에 대학 도서관에서 유유히 서가 사이를 탐험하던 시절 발견했던 보물 같은 책이 있었으니, How to Prove It이라는 책입니다(2006년에 2판이 나왔죠). 부제가 A Structured Approach입니다. 이 책의 서문에서 일부를 인용해 보죠.
The discussion of proofs in this book is inspired by the belief that many of the considerations that have led computer scientists to embrace the structured approach to programming apply to proof-writing as well. You might say that this book teaches "structured proving."
증명은 진술의 직선적인 나열입니다. 그런데 구조적 프로그래밍 이전의 프로그램이 그랬습니다. 개별 명령문들의 직선적 나열이었죠. 구조적 프로그래밍은 여기에 구조를 집어넣었습니다. 명령 하나 씩을 나열하는 것이 아니고, 기본적인 구조들 몇 가지를 조합하고 중첩해 넣는(nesting이라고 합니다) 식으로 프로그램을 구성해 나가게 바꾸었습니다.
그렇게 구성된 증명의 예를 하나 보죠.
Let x be arbitrary.
Suppose P(x) is true.
[Proof of Q(x) goes here.]
Thus, if P(x) then Q(x).
Thus, for all x, if P(x) then Q(x).
우리가 보아오던 증명의 형태와는 차이가 있습니다. 우선 눈에 들어오는 것은 들여쓰기입니다. 맨 위의 Let 문과 맨 아래의 Thus 문이 짝을 이루고, Suppose 문과 그 아래의 Thus 문이 짝을 이룬다는 걸 쉽게 알 수 있습니다. 전자는 "for arbitrary x prove" 구조라고 부르고, 후자는 "suppose-until" 구조라고 부릅니다. 마치 구조적 프로그래밍에서 if나 while문이 기본 구조인 것과 비슷하지요.
또 흥미로운 점은 대괄호 속에 증명을 생략하기도 한다는 겁니다. 일종의 함수 호출로 볼 수 있습니다. 구조적 프로그래밍에서, 그리고 좀 더 유사하게는 문학적 프로그래밍(Literate Programming)에서 쓰는 기법입니다. 애자일 진영에서는 의도에 의한 프로그래밍(Programming By Intention)이라는 기법이 이것과 유사한 면이 있습니다.
이 방법을 쓰면 증명을 읽기가 쉽습니다. 초보자도 쉽게 구조를 알 수 있습니다. 또 증명을 쓰기가 쉽습니다. 실수할 확률이 적습니다. 처음부터 구차한 것을 세세히 고려하지 않아도 됩니다.
엑셀
저는 80년대 초반에 처음 스프레드쉬트를 접했습니다. 최초의 킬러앱으로 불리우는 비지칼크였습니다. 엄청난 충격을 받았죠. 그 때 비지칼크를 공부하고 또 사용하면서 많은 깨달음을 얻었습니다.얼마전에 서점에 가서 엑셀 서가에 꼽힌 책들을 찬찬히 훑어봤습니다. 대부분이 요리책 수준이었고 개념적인 설명을 차분히 해주거나, 혹은 엑셀을 더 쉽고 편리하게 쓰는 법을 가르쳐주는 책은 정말 찾기 어려웠습니다.
그런데 엑셀 역시 프로그래밍을 잘하는 법을 적용하면 좀 더 쉽게 쓸 수 있습니다.
우리는 엑셀에서 수식을 입력할 때 통상 셀 주소를 직접 참조합니다. A7, C3 등등. 그렇지만, 프로그래머가 이런 식으로 프로그래밍을 하면 회사에서 쫓겨납니다.
점수에 따라 학점을 A에서 F로 달리 주어야 하는 경우, 많은 엑셀 책들이 IF 중첩문을 씁니다. 역시 이런 식으로 프로그래밍을 하면 면접에서 떨어집니다.
하지만 많은 책들이 이렇게 가르치고 있습니다. 그렇게 하면 더 어렵고, 나중에 고치기도 어려운데 말이죠. 여기에 SE의 지식들, 좀 더 소박하게는 프로그래밍 잘하는 법을 적용하면 훨씬 쉬워집니다.

여기에서 성적1은 중첩 IF문으로 구한 값들입니다.
예를 들어 첫번째 줄의 수식은 다음과 같습니다.
=IF(A2>=90, "A", IF(A2>=80, "B", IF(A2>=70, "C", IF(A2>=60, "D", "F"))))
한 번에 생각해 내고 또 실수 없이 그대로 입력한 제가 저 스스로도 대견합니다.
성적2는 프로그래밍 잘하는 법을 적용해서 구한 값들입니다. 성적2의 맨 첫번째 셀(C2)에 들어가는 수식은 다음과 같습니다.
=VLOOKUP(점수,점수등급,2)
무슨 뜻이냐면, 점수등급에서 현재 점수보다 작으면서 최대인 점수(현 점수가 속하는 점수등급의 기준 점수)를 찾아서 그 숫자의 문자성적(점수표 내에서 2번째 열)을 현재 위치(C2)에 넣어달라는 말입니다.
점수나 점수등급은 엑셀의 "이름" 기능을 사용해서 정의했습니다.
이렇게 하는 것이 무슨 장점이 있는지 몇 가지만 언급하겠습니다. 나중에 점수나 점수등급을 다시 언급하게 될 때, 그 위치가 어디였는지 기억하지 않아도 되고, 직접 찾아다니지 않아도 됩니다. 또, 수식을 읽으면 무슨 뜻인지 쉽게 알 수 있습니다. 그리고 점수등급에 변화가 생겨도(예컨대 기준점수가 바뀌거나, 새로운 등급들이 추가되거나) 중첩 IF문과 달리 모든 수식을 쫓아가며 고칠 필요가 없습니다. 물론 "프로그래밍"과정에서 실수할 여지도 적습니다. 이런 장점들은 문제가 복잡해질수록, 그리고 나중에 수정할 여지가 많을수록 빛을 발하게 됩니다.
이렇게 가르치는 엑셀 책을 아직 본 적이 없습니다. 아시는 분은 알려주시면 감사하겠습니다.
포토샵
부업으로 디자인 하는 친구가 여기까지 설명을 듣더니 맞장구를 치더군요. 포토샵에도 적용가능하다고. 포토샵에는 레이어란 기능이 있습니다. 그림을 여러장으로 나누어서 구성할 수 있는 기능입니다. 여기에 프로그래밍을 잘하는 법을 적용하면 그리는 과정도 쉬워지고 또 나중에 수정이 빈번한 경우 참 수월해 집니다.한가지만 예를 들어 보죠. 켄트 벡이 이런 말을 한 적이 있습니다. 한 메소드 안에서는 각 라인이 바뀌는 속도가 비슷해야 한다. 즉, 어떤 외부환경의 변화로 코드를 바꿀 일이 있어 특정 메소드의 명령줄을 바꾸게 되는데, 그 메소드 내에 있는 모든 줄들이 비슷한 빈도로 바뀌어야 한다는 겁니다. 이 줄은 한 달에 한 번 바뀌는데 같은 메소드 내의 바로 윗 줄은 매일 바뀌면 뭔가 개선의 여지가 있다는 겁니다. 어떻게 개선하나요? 변경 속도가 비슷한 놈끼리 묶어서 메소드를 재구성합니다.
레이어 분리를 할 때에도 이 규칙을 적용할 수 있습니다. 자주, 함께 바뀌어야 하는 것들은 같은 레이어에 넣고, 그렇지 않은 것들은 분리합니다. 그 친구가 말하길 자기는 처음에 이걸 잘 몰라서 고생을 했는데 나중에 이 방법을 쓰면서 굉장히 편해졌다고 하더군요.
프로그래밍과 절차적 지식
지식을 크게 진술적(선언적) 지식, 절차적 지식으로 나눌 수 있습니다. 진술적 지식은 무엇에 "관한" 지식입니다. 자전거에 바퀴가 두 개가 있다는 것을 아는 것은 진술적 지식이죠. 절차적 지식은 "어떻게"에 대한 지식입니다. 자전거를 탈 줄 아는 것은 절차적 지식입니다.
프로그래밍이라는 것은 기본적으로 일의 절차를 기록한 것입니다(programming이라는 단어도 그렇게 출발했습니다). 그래서 프로그래밍 언어는 절차적 지식을 표현하고 다루기에 편리하게 되어 있으며, 프로그래밍을 잘하는 기법들이라는 것은 이런 절차적 지식을 좀 더 효율적으로 만들고, 변형하고, 이해하는 기법들입니다.
우리가 살다 보면 절차가 중요한 일이 참 많습니다 -- 뭔가 행하는 것 모두가 절차입니다. 하지만 안타깝게도 우리의 교육은 절차적 지식에는 별로 신경을 쓰지 않았습니다. 전자회로 전문가가 학생들에게 전자회로를 설계하는 방법을 설명합니다. 그리고 자신이 그립니다. 그런데 자신이 설명한 방식(교과서 방식)과 다릅니다. 절차적 지식을 다루는 것에 익숙하지 않아서 그렇습니다. 그래서 SICP의 저자 제럴드 서스만 교수 같은 사람은 프로그래밍 언어를 매개로 해서 회로설계나 물리를 가르쳐야 된다고 주장하기도 합니다.
우리 삶의 많은 부분들에 있어 절차적 지식이 중요하기 때문에 절차적 지식을 전문적으로 다루는 프로그래밍이 삶의 여러 방면에서 도움을 줄 수 있다고 생각합니다.
저는 앞에서 증명, 엑셀, 포토샵을 예로 들어서 프로그래밍을 잘하는 기법들이 어떻게 적용될 수 있나 보였습니다. 하지만, 시중에 나가보면 이런 것을 설명하는 책이 거의 없습니다. 사람들은 더 어렵게, 더 복잡하고 조악하며 허술한 구조를 만들게 훈련받고 있습니다. 이것이 안타깝습니다.
저는 프로그래밍의 기법들을 통해 {증명, 엑셀, 포토샵}을 더 쉽게 익히고, 또 더 쉽게 쓸 수 있다고 믿고 있으며, 실제로 제 제한된 경험 내에서도 그러합니다. 아쉽게도 저는 증명, 엑셀, 포토샵 어느 것에도 전문가는 아닙니다. 하지만 제 믿음을 실험해 보고, 또 변화를 만들어 보고 싶습니다.
--김창준