같은 것을 다시 해보는 것에서 우리는 얼마나 많은 것을 배울 수 있는가.
see also EightQueenProblemSecondTry
왜 동일한 문제를 여러번 풀고, 왜 같은 내용의 세미나에 또다시 참석을 하고, 같은 프로그램을 거듭 작성할까요?
훨씬 더 많이 배울 수 있기 때문입니다. 화술 교육에서는 같은 주제에 대해 한번 말해본 연사와 두번 말해본 연사에는 천지차이가 있다고 말합니다. 같은 일에 대해 두번의 기회가 주어지면 두번째에는 첫번째보다 잘 할 기회가 있습니다. 게다가 첫번째 경험했던 것을 "터널을 벗어나서" 다소 객관적인 입장에서 볼 수 있게 됩니다. 왜 자신이 저번에 이걸 잘 못했고, 저걸 잘했는지 알게 되고, 어떻게 하면 그걸 더 잘할 수 있을런지 깨닫게 됩니다. 저는 똑같은 문제를 여러번 풀더라도 매번 조금씩 다른 해답을 얻습니다. 그러면서 엄청나게 많은 것을 배웁니다. "비슷한 문제들"을 모두 풀 능력이 생기게 됩니다.
"We do it again -- to do it, to do it well, and to do it better." --JuNe (play on Whitehead's quote)
제가 개인적으로 존경하는 전산학자 Robert W. Floyd는 1978년도 튜링상 강연 The Paradigms of Programming(일독을 초강력 추천)에서 다음과 같은 말을 합니다. --김창준
TheParadigmsOfProgramming DeadLink? - 저는 잘나오는데요. 네임서버 설정이 잘못된건 아니신지.. - 아무개
In my own experience of designing difficult algorithms, I find a certain technique most helpfult in expanding my own capabilities. After solving a challenging problem, I solve it again from scratch, retracing only the insight of the earlier solution. I repeat this until the solution is as clear and direct as I can hope for. Then I look for a general rule for attacking similar problems, that would have led me to approach the given problem in the most efficient way the first time. Often, such a rule is of permanent value. ...... The rules of Fortran can be learned within a few hours; the associated paradigms take much longer, both to learn and to unlearn. --Robert W. FloydEven fairly good students, when they have obtained the solution of the problem and written down neatly the argument, shut their books and look for something else. Doing so, they miss an important and instructive phase of the work. ... A good teacher should understand and impress on his students the view that no problem whatever is completely exhausted. --George Polya
저는 ACM의 ICPC 문제 중에 어떤 놈을 이제까지 열 번도 넘게 풀었습니다. 대부분 PairProgramming이나 세미나에서 프로그래밍 시연을 했던 것인데, 제 세미나에 여러번 참석한 친구가 물었습니다. "신기해요. 창준씨는 그 문제를 풀 때마다 다른 프로그램을 짜는 것 같아요. 혹시 준비를 안해와서 그냥 내키는 대로 하는 건 아니죠? :)" 저는 카오스 시스템과 비슷하게 초기치 민감도가 프로그래밍에도 작용하는 것 같다는 대답을 해줬습니다. 저 스스로 다른 해법을 시도하고 싶은 마음이 있으면 그렇게 출발이 조금 다르고, 또 거기서 나오는 진행 방향도 다르게 됩니다. 그런데 중요한 것은 이렇게 같은 문제를 매번 다르게 푸는 데에서 배우는 것이 엄청나게 많다는 점입니다. 저는 매번, 전보다 개선할 것을 찾아 내게 되고, 또 새로운 것을 배웁니다. 마치 마르지 않는 샘물처럼 계속 생각할 거리를 준다는 점이 참 놀랍습니다. --JuNe
TDD 를 연습하고, 워크샵 준비하고 관련 기사글 작성하느냐고 VonNeumannAirport 문제와 kwic 문제를 각각 5번 이상 풀어보게 되었다. (Python 으로, CPlusPlus 로, Java로..) 하지만, 풀 때마다 매번 그 결과가 다르게 나왔다. 같은 문제를 계속 풀다 보니, 더 쉽고 더 간단하게 해당 단계를 뛰어넘는 법이 보이는 것이다. 그리고 JuNe 형과 Pair 를 하는중 첫째날때의 진행방법이 달랐고, 둘째날, 셋째날.. 더 좋은 방법들이 계속 보이는 것이였다. 그 문제 사이즈가 크건 작건, 여유를 가지고 다시 해보는 것에서 얻는 점이 많음을 느끼게 되었다. --1002
SoftwareDevelopmentMagazine에서 OOP의 대가 Uncle Bob은 PP와 TDD, 리팩토링에 대한 기사를 연재하고 있다. A Test of Patience라는 기사에서는 몇 시간, 혹은 몇 일 걸려 작성한 코드를 즐겁게 던져버리고 새로 작성할 수도 있다는 DoItAgainToLearn(혹은
~cpp DoItAgainToImprove
)의 가르침을 전한다.