증명, 엑셀, 포토샵을 더 쉽게 하려면
<업데이트 중>

증명, 엑셀, 포토샵을 모두 더 쉽게 하는 방법이 있습니다. 소프트웨어 개발을 잘하는 방법을 적용하면 됩니다. 하지만, 저는 자동화된 증명 도구를 사용하거나, 엑셀에서 VBA 프로그래밍을 하거나, 스크립트 언어로 포토샵을 자동화하는 것을 주로 이야기하려고 하는 것이 아닙니다(물론 그런 것들도 포함될 수는 있습니다).

소프트웨어 개발을 잘하는 방법을 연구하는 학문이 소프트웨어 공학(Software Engineering)입니다. SE라고 줄여서 말하죠. 이 SE에는 여러 명이 뭔가 잘하는 방법도 많이 포함되어 있지만, 우선 개인 수준에 적용하는 것에 한정해서 말하겠습니다. 쉽게 말해 프로그래밍을 잘하는 방법이라고 할 수 있습니다.

프로그래밍을 잘하는 방법은
  1. 복잡한 것을 만들거나
  2. 한 번 만든 것을 나중에 자주 변경해야 하거나

하는 상황이라면 모두 도움이 됩니다. 제가 말하는 도움이 된다는 것은 노력을 줄이고 품질을 높인다(실수를 줄인다든지)는 뜻입니다.

세가지 예를 들어보이도록 하겠습니다.

증명

구조적 프로그래밍이라는 기법이 있습니다. 이 방법을 증명에 적용하면 증명과정이 훨씬 쉽고 명료해 집니다.

제가 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의 저자 제럴드 서스만 교수 같은 사람은 프로그래밍 언어를 매개로 해서 회로설계나 물리를 가르쳐야 된다고 주장하기도 합니다.

우리 삶의 많은 부분들에 있어 절차적 지식이 중요하기 때문에 절차적 지식을 전문적으로 다루는 프로그래밍이 삶의 여러 방면에서 도움을 줄 수 있다고 생각합니다.

저는 앞에서 증명, 엑셀, 포토샵을 예로 들어서 프로그래밍을 잘하는 기법들이 어떻게 적용될 수 있나 보였습니다. 하지만, 시중에 나가보면 이런 것을 설명하는 책이 거의 없습니다. 사람들은 더 어렵게, 더 복잡하고 조악하며 허술한 구조를 만들게 훈련받고 있습니다. 이것이 안타깝습니다.

저는 프로그래밍의 기법들을 통해 {증명, 엑셀, 포토샵}을 더 쉽게 익히고, 또 더 쉽게 쓸 수 있다고 믿고 있으며, 실제로 제 제한된 경험 내에서도 그러합니다. 아쉽게도 저는 증명, 엑셀, 포토샵 어느 것에도 전문가는 아닙니다. 하지만 제 믿음을 실험해 보고, 또 변화를 만들어 보고 싶습니다.

--김창준
by 애자일컨설팅 | 2008/05/20 22:21 | 트랙백(6) | 핑백(1) | 덧글(6)
트랙백 주소 : http://agile.egloos.com/tb/4370220
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from jazz' me2DAY at 2008/05/21 13:27

제목 : 홍째즈의 생각
창준님도 엑셀 얘기...more

Tracked from Small Steps .. at 2008/05/22 17:50

제목 : CEO에게 보고한다는 생각으로 프로그래밍하기
김창준 님의 글을 보면 프로그래밍을 잘하는 방법이 다른 &#8216;작업&#8217;들에 얼마나 효과적으로 적용될 수 있는지 설명되어 있습니다. 하지만, 프로그래밍을 잘하는 방법은 무엇일까요? ......more

Tracked from [ 놀란눈 블로그::W.. at 2008/05/23 02:00

제목 : 엑셀 함수 실습 - VLOOKUP
"증명, 엑셀, 포토샵을 더 쉽게 하려면" 을 읽고 만든 실습 파일...more

Tracked from mazing2305's.. at 2008/05/23 19:37

제목 : 마징가2305의 생각
애자일 이야기 : 증명, 엑셀, 포토샵을 더 쉽게 하려면보고 감동...more

Tracked from pligg.com at 2008/05/23 19:59

제목 : 애자일 이야기 : 증명, 엑셀, 포토샵을 더 쉽게 ..
포토샵이나 증명, 엑셀에 애자일 이론을 적용시키는 것을 보여준다....more

Tracked from GomSun2, 생각,.. at 2008/05/30 17:42

제목 : 변경 속도가 비슷한 놈끼리 묶어서 메소드를 재구성합..
켄트 벡이 이런 말을 한 적이 있습니다. 한 메소드 안에서는 각 라인이 바뀌는 속도가 비슷해야 한다. 즉, 어떤 외부환경의 변화로 코드를 바꿀 일이 있어 특정 메소드의 명령줄을 바꾸게 되는데, 그 메소드 내에 있는 모든 줄들이 비슷한 빈도로 바뀌어야 한다는 겁니다. 이 줄은 한 달에 한 번 바뀌는데 같은 메소드 내의 바로 윗 줄은 매일 바뀌면 뭔가 개선의 여지가 있다는 겁니다. 어떻게 개선하나요? 변경 속도가 비슷한 놈끼리 묶어서 메소드를 재구......more

Linked at Small Steps Blog.. at 2008/05/22 17:50

... ps Blog Small steps will lead you to a better place. &laquo; Crowdsourcing CEO에게 보고한다는 생각으로 프로그래밍하기 김창준 님의 글을 보면 프로그래밍을 잘하는 방법이 다른 &#8216;작업&#8217;들에 얼마나 효과적으로 적용될 수 있는지 설명되어 있습니다. 하지만, 프로그래밍을 잘하는 방법은 무엇일 ... more

Commented by 영록 at 2008/05/21 10:35
저는 조직이라는 것도 비슷하지 않나 싶습니다. 복잡하고 자주 변하죠. 그래서 요즘은 조직 문화를 만들어가는데 프로그래밍의 기법들을 적용해보는 중입니다. 창준님이 하시는 컨설팅도 비슷하지 않을까요?
Commented by soap at 2008/05/21 12:10
분리의 기준이 '빈도'라는 것은 신선한 충격이네요.
조직에 적용하면 안습입니다. 자주 바뀌는 사람과 아닌 사람 여부로 거주를 분리하면...결국 지금 프로젝트 조직이 바른길로 가고 있다는 뜻일까요?
DBA끼리 모여앉아 있다거나 각 레이어 별로 담당자 그룹이 쪼개져 있다거나 이런게 이 사람은 몇 MM투입 이런걸로 정당화되어 버리니까요. 아니면 데이터 위주로 레이어를 분리를 하면 그 기준이 초기부터 잡혀서 조직에 적용할 수 있는지 이런 여부에 부딪히게 되고 이 문제로 몇 주를 보내게 될 수도 있겠습니다.
Commented by mrkiss at 2008/05/21 15:44
전 여기서 엑셀을 따라해 봤습니다 ^^ 엑셀에 이런 기능들이 있었군요.
엑셀의 신이라 자칭하는 친구가 말하길 '엑셀로 안되는 것은 없다'라던 말이 생각나네요.

절차적 지식은 모든 교육에서 중요하다고 생각합니다. 우리나라 교육에서 더 많이 결핍된 부분이기도 하겠구요. 그리고 쉽게 추출해 내기도 어렵겠죠 선진국이란 건 절차적 지식이 많이 추출되고 교육되는 사회가 아닐까 싶습니다.
Commented by 굴돌 at 2008/05/22 04:06
꼭 그런것 같지만도 않은것이...
증명의 경우...어떤 사람들은 눈을 위아래로 왔다갔다 하면서 머릿속에 수식을 돌리는 것보다는 일반적인 플로우 하나를 제시해서 그것만 따라 읽으면 자기 머릿속에 필요한 정보가 들어오도록 글을 써주길 원하는 사람들이 있습니다. 주로 관리자라고 불리죠. 완전한 증명보다는 "쉽게" 이해하기 쉬운 쪽을 선호하죠.
엑셀의 경우...누군가는 vlookup()을 만들어야겠죠.
포 토샵도 그런 경우이면서...만약 나는 함수를 빼 놨는데 다른 사람은 예전 함수를 copy&past해서 살짝 수정하고 써버리면...제가 바보가 되버리죠...아직 내공이 부족해서인지 활용도 높은 모듈을 만들때는 해당 모듈이 다양한 기능을 하게 되는데...copy&past한 코드와 공존하게 되면 오히려 유지보수 비용이 더 높아지는 느낌이더군요. 몇 백개의 파일을 다 뒤져서 한방에 관련코드를 모두 수정하지 않은 제가 게으른건지...모듈화 해두면 다음 개발 때 모듈화된 것을 갖다 쓸것이라고 믿어버린 제가 멍청한건지...
모듈화는...서로 같은 로직을 여기저기 "순차적으로" 퍼트려놔서 각각 개발했다가...순간 눈치체고 모듈로 뺐는데...어느순간 다시 서로 다른 길을 갈때...그 허망함이 극에 달하죠..."난 이거 왜 모듈로 뺀거지?" 하는...
Commented by 나는먼지 at 2008/05/22 10:57
일반인들은 엑셀을 배우기전에 SE을 잘 모를테고...SE를 하는사람이라면 엑셀할때 VLOOKUP을 찾거나 만들겠죠. ㅎㅎㅎ...
Commented by 한주영 at 2008/05/22 17:28
좋은 글이네요.

업데이트 중이라 하시니 코멘트 달기가 애매한데, 아마도 말씀하시는 내용 중의 포인트는 절차적 지식을 단순히 열거하려 하지말고 구조화, 혹은 abstraction 하여야 하며, 그것이 곧 '프로그래밍을 잘하는 법'이다 라는 것 같네요. vlookup , layer 등이 abstraction 을 통해 쌓아 올라가는 식이니 말이죠.

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >


AgILE
Site Meter