'플로우'에 해당되는 글 1건

  1. 논리적 사고의 포기 2008.08.06

출처:http://d.hatena.ne.jp/softether/20070325

<어느 플로우 프로그래머의 이야기>

나는, 하루에 적어도 3000줄 정도, 많게는 10000줄이상의 프로그램을 쓸 수 있다. 그결과 많은 달는 10만줄/달 정도이다. 주로 사용하는 언어는 C이다.

또한, 프로그래밍에는 버그가 따라다니는 것이지만, 최근 2,3년간은 발생하는 버그의 수를 지극히 적게 유지하고 있다.

매우 복잡해서, 레이어적으로 OS에 가까운 처리를 하는 프로그램을 작성하는 경우, 프로그래밍 도중의 사전 설계가 매우 중요하다. 설계를 잘 하지 않으면, 후에 고쳐쓰기를 해야하고, 퍼포먼스가 저하되는 원인이되어 개발자를 괴롭게 한다.

당연한 이야기지만, 지금까지 작성한 복잡한 소프트웨어의 대부분의 설계도 자신이 하였다. 어떤 경우라도 설계는 최초의 1회로 한정하고, 이후 프로그래밍 작업에 들어간 후에도 그설계를 후회하거나 수정하지 않으면 안되는 일은 피하고 있어서, 그러한 문제는 발생하지 않고 있다.

이것은 내가 대학에 입학하고 나서 현재까지의 4년간 쭉 해온것이지만, 동시에 소프트웨어 개발뿐만 아니라 대학의 학위 이수, 학술활동, 벤처 창업과 경영등의 일도 함께 진행해왔다. 동시에 다수의 일을 진행하더라도, 능력부족으로 인한 문제는 대부분 나오지 않았다.

상기한 나의 능력은 이정도가 표준적인 것이라고 생각하고 있어, 자신의 능력이 특별히 높다고 생각하지 않고 있었다. 그러나, 다른 소프트웨어 개발자의 이야기를 듣거나, 기사를 읽다 보면, 이런 정도로 할수 있는 사람은 지극히 소수인듯 하다는 사실을 최근에야 알았다.

여러 조사결과 보통 개발자의 작업능력은 1개월에 몇백줄정도, 많은 사람도 1개월에 3000줄 정도 인듯하다. 하루에 몇백줄이 아니고, 한달에 몇백줄인것이다. 물론 직업 프로그래머의 이야기로, 일 이외에, 학업이나 업무 경영등에 시간일 쏟는 것이 아니고, 프로그래밍에 전념하고 있어도, 이정도라고 한다. 생각하고 있었던 것과는 전혀 다르다.

그때부나 최근 4년간, 자기 자신의 능력의 근원에 대해서 탐구하기 시작했다. 여러자료를 찾다보니, 보통사람의 사고방식과 자신의 사고방식이 큰차이가 있는 것을 알아냈다.

이렇게 이야기하면 '자신에게는 그런 능력이 없다'라든가 '조금 잘한다고 자랑하냐' 또는 '우연이다'라고 생각하는 사람이 있을 지도 모르기 때문에, 이제부터 누구나 조금만 사고방식을 바꾼다면 나와 같은 능력,작업 효율을 획득할 수 있는 것이라고 하는 것을 전하고 싶다. 그렇게 하면 자신 뿐만 아니고 모두에게 유익하다고 생각한다.

우선 가장 중요한 전제 지식으로 다음 세가지를 준수하는 것이 필수적이다.

1. 노력하지 않는다
2. 논리적으로 생각하지 않는다
3. 머리를 사용하지 않는다

이런 이야기는 평소 알고 있는 것과 정반대 이어서, 놀라거나 의심하는 사람이 있다. (아마 대부분이 그럴거다) 우리들은 사회통념상, 1.노력할것 2. 논리적으로 생각할것 3. 머리를 쓸것을 항상 배워왔다. 이러한 잘못된 통념은 초등학교~대학~취직~퇴직까지의 인생의 대부분에서 진리로 받들어지며, 전혀 자신의 능력을 알아차리지 않은채 인생을 마치는 사람도 있는 것이다.

특히 컴퓨터 프로그래밍은 논리적인 일의 극단적인 예이므로, 프로그래밍을 할때의 개발자의 머리속은 매우 논리적으로 사고 하고 있는 것이라고 생각하는 것이 일반이며, 논리적으로 생각하지 않는 것에 매우 큰 위화감을 느끼는 사람이 많을 것이다. 우선 이점을 설명해본다.

최근 <컴퓨터에 관한 기술적인 일 (특히 프로그래밍과 소프트웨어 설계)은 논리적 사고로 실시하는 것이 좋다>라고 오해하고 있는 사람이 대부분인걸 알았다.

그러나 사실은 정반대이다.

복잡해서 난이도가 높은 작업에 있어서는, 아무리 컴퓨터 프로그래밍등의 초 논리적인 결과를 얻기 위한 작업이라도, 논리적인 사고는 대부분 불필요하다.

따로 논리적인 사고를 정의 하는 일은 하지 않겠다. 도대체, 엄밀하게 정의하자하는 자체가 즉 논리적인 사고이다. (논리적으로 엄밀히 정의 하기 보다는 당신의 머릿속에 자유롭게 그려지는 이미를 떠올리는 편이 좋다)

나는 뇌과학 전문가는 아니다. (말꼬리 잡지 말란 얘기)

프로그래밍을 하는 것은 당연 인간이다. 인간은 프로그래밍을 하여 실현 되고 싶은 처리 내용의 명령을 논리적으로 기술하고, 컴퓨터에 입력한다. 이것이 프로그래밍이다.

컴퓨터에 대한 논리적인 지령이라고 하는 목적이 있기에, 프로그래밍은 <논리적인 일>이다라고 생각하여, 프로그래밍 작업의 전부에 있어서, 인간의 논리적 사고로 작업을 행하는 것이다. 사실은 프로그래밍의 작업에 거의 모든 부문에서 논리적 사고라고 하는 것은 쉽게 말해 전혀 필요 없다.

논리적이지 않다고 생각하는 작업들에 대해 생각해보자. 음악을 들어서 '좋다'라고 생각하거나, 영화를 보고 감동하는 일은 논리적인 일이라기 보단 직관적인 과정이다. 음악을 들으며 '이 주파수 대역이 얼마 이상의 진폭으로 몇밀리 세컨 반복되니 좋구나'라고하는 일은 있을 수 없다. 더욱 직관적으로 '왠지 모르게 능숙하게 말로 정확하게 논리적으로 표현하기 힘들지만 이 음악이 좋다'라는 것이 당연한 지각 반응이다.

컴퓨터 프로그램을 읽거나, 쓰거나 한다라는 일이 논리적인 기술 방식을 수용하는 상대와의 작업이더라도, 논리적 사고라는 것은 음악을 듣거나 할 때와 같이 거의 필요없는 것이다.

논리적이지 않은 사고 방식을 하는 것이 중요하지만, 아예 '감각적인 사고'라고 표현하는 편이 좋을 것이다.

현재의 과학에서, 인간의 뇌는 컴퓨터와 같은 것이다라고 말한다. 그러나 뇌는 폰노이만형 컴퓨터의 아키텍쳐를 갖고 있지 않다. 더욱 효율 좋은 방법으로 여러가지 일을 하는 것이다.

현재의 컴퓨터는 논리적인 처리 밖에 할 수 없지만, 인간은 감성적인 사고를 처리를 할수 있다. 인간의 아키텍쳐와 컴퓨터의 아키텍쳐는 전혀 다른 효율을 갖는다. 그런데, 어쩐일인지 프로그래밍 작업을 하고 있으면, 대상이 되는 컴퓨터가 논리적 처리만 할수 있으니, 인간도 모르는 사이에 논리적 사고 밖에 할수 없게 되는 것이다. 여기에 큰 함정이 있다.

인간의 아키텍처는 감각적 사고에 의해 동작하고, 그 처리 능력도 매우 우수하다. 그때문에 인간은 노력하면 감각적 사고의 기능위에 보통 컴퓨터가 가지고 있는 논리적 처리를 행하는 환경을 가상적으로 에뮬리에션하고, 그리고 나서 여러가지 논리적 프로그램을 실행할 수 있다. 예를 들면 전자 계산기를 사용하지 않아도, 숫자의 암산을 하건, 짧은 프로그램의 경우 머리속에서 실행할 수 있다.

그러나 인간의 감각적 사고 기능위에 에뮬레이션된 논리적 처리 기능은, 실은 에뮬레어터에서의 처리과 같은 것이므로, 실제로 머신(인간본체)와 비교하면, 매우 처리가 늦다. 오버헤드가 지나치게 큰것이다. 모든 방식의 처리를 한번에 동시에 실행할수 있는 인간의 두뇌가 있임에도, 논리적 처리만 가능한 가상 환경을 뇌안에 구축하고, 그리고 문제를 생각하기 때문에, 효율이 나빠진다.

이것이 보통의 소프트웨어 개발자가 한달에 불과 몇백줄~3000줄 정도 밖에 작업할수 없다고 하는 원인이 되고 있다. 인간 속에 구축할수 있는 가상의 논리처리 에뮬레이터는 성능이 매우 낮은 것이다.

논리적 사고를 철저히 배제하고, 인간 본연의 가장 자신있는 사고 방식인 감각적인 사고 기능을 이용하고, 여러가지 작업을 행하기로 한다면, 매우 효율적일것이다.

인간이면 누구나 가진 초 고성능 '감각적 사고 기능'은 예를 들면 작공이나 소설의 집필, 회화의 제작등의 예술적인 창작 작업으로만 사용할수 있고 프로그래밍이라든가 설계라든가 계산등의 논리적인 작업에는 사용할 수 없다고 단정해 오해하는 수가 있다. 논리적으로 생각하니, 확실히 논리적인 작업은 논리적인 기반위에서 밖에 실행할수 없다.

하지만 나는 프로그래밍또는 그외의 논리적인 작업에대해서 초 고성능 '감각적 사고 기능'쪽을 직접 활용하는 것으로 별도의 가상 논리 에뮬레이터를 작동시키지 않아도, 효율 높은 처리를 할수 있다고 자각하고, 그걸 활용하는 것 뿐이다.

실제의 프로그래밍 작업을 예로 해서, 해설한다.

우선, 대체로 이러한 소프트웨어가 있으면 좋구나라든가, 이러한 기능을 붙일 필요가 있구나라든가 말한, 매우 추상적인 것을 떠올린다. 이 기회, 「절대로 논리적으로 생각하지 않는 것」이 필요하다. 논리적으로 조금이라도 생각해버리면, 도중까지 잘 되어도, 그것이 깨져버려, 처음부터 재시도가 되므로 주의한다. 감각적인 사고로 가지고 올 수 있기를 실시하는 것이다.

그 다음에, 대체로 이미지가 생긴 바에서, 마음 속에, 소프트웨어의 설계도나 데이타 구조와 같은 것을 상기한다. 여기에서 주의하는 것은, 「절대로 논리적으로 생각해서 설계를 하지 않는 것」이다. 철저하고, 감각적인 사고라도 설계한다.

여기까지는 모두 머리 안(속)에서 처리할 수 있으므로, 달리 컴퓨터가 없어도 좋다. 전철 안(속)에서도 수업중이라도 운전중이라도 실시할 수 있고, 편리하다.

상 기까지에서, 거의 모든 작업은 완료하고 있다. 남겨진 일로서, 최후에, 컴퓨터에 대하여, 프로그래밍을 실시할 필요가 있다. 이것에는 물리적인 컴퓨터와 키보드가, 무슨 일이 있어도 필요하다 (종이에 펜으로 쓰면 손이 약해지고, 키보드를 치지 않아도 컴퓨터에 입력할 수 있는 편리해서 고품질한 디바이스는 아직 없기 때문이다).

프로그래밍의 목적은, 컴퓨터에 처리를 실행하게 하는 것이므로, 컴퓨터에 프로그램을 입력하지 않으면 의미가 없다. 거기에서, 방법 없고 컴퓨터 앞에 앉는다.

컴 퓨터 앞에 앉고, 키보드 위에 양손을 두면, 나머지 일은 그다지 생각할 필요는 없다. 자동적으로 손이 키보드를 치고, 프로그램을 입력해서 완성되게 해 준다. 이 처리는 일절, 논리적 사고에서는 행하여 지지 않고 있으므로, 도중에 논리적 사고를 행하는 것은 엄금이다 (작업의 방해된다). 한결같이 아무 것도 생각하지 않는다.

입력 에러 없고 손을 움직일 수 있는 속도에는, 물리적인 한계가 있는 것 같다. 많아도 1일 1만줄정도정도다 (그것이라도, 입력 에러는 빈번하게 발생한다). 이 작업은, 에너지가 필요하므로, 식사를 빈틈없이 뽑는 것이나, 좋아하는 마실 것 (100% 오렌지 주스가 좋다)등을 책상 위에 준비해 두는 것이 추장된다.

프로그램이 얼추 완성되면, 테스트해 본다. 상기의 과정이라도, 역시 약간의 버그가 발생할 것이 있다. 그 대부분은, 컴퓨터에의 프로그램의 입력중에 발생하는 뇌내에서의 변환 에러인 것 같다. 뇌내에 있는 감각적인 프로그램의 구성 데이타를, 컴퓨터가 이해가 가는 논리적인 프로그래밍언어의 source code로 변환하는 부분으로, 약간 틀릴 것이 있다. 그러나 이것도 회수를 포개는 매번에 의해 정확해져 가므로, 걱정할 필요가 없다.

몇번 테스트해도, 뒤가 되어서 버그가 나와버릴 것도 있다. 논리적으로 생각하면, 상기와 같은 정확한 프로그래밍 작업의 뒤에는 약간의 잘못도 없을 것인 것이지만, 이것은 논리적인 처리에서는 없으므로, 왜 버그가 발생해버리는 것일지는, 논리적으로는 모른다. 이것은 할 수 없는 것이라고 생각하고, 버그를 고치면 좋다. 그래도, 보통 프로그래머가 논리적인 사고로 프로그램을 쓸 때와 비교하고, 버그의 발생 건수는 대폭 감소, 편해진다.

상기와 같은 방법은, 아마 프로그래밍뿐만아니라, 여러가지인 사물의 설계나, 문장의 집필, 자동차등의 운전등 대체로 대부분의 작업으로 활용할 수 있는 것이 아닐까라고 생각한다.

게다가 이 방법은, 일체 노력을 하거나 고생하거나 할 필요가 없고, 매우 마음이 편하다.

한 편, 몇사람인가의, 작업 효율이 좋은 컴퓨터 관계를 하고 있는 사람과 이야기한 바, 대체는 상기와 같은 것을 (표현은 다르지만) 평소로부터 실천하고 있어, 그것에 의하고, 평균적인 수준과 비교해서 아득히 에 높은 능력으로 작업을 하고 있는 것 같다.

최대의 문제점은, 모처럼 상기와 같은 것을 읽어도, 대개, 우선은 머리 안(속)에 있는 논리적 사고가, 「위로 씌어져 있는 것 같은 것은 논리적으로 있을 수 없다」라고 하게 논리적으로 생각해버려, 언제까지라도 논리적으로 생각해버릴 것이 있다고 하는 것이다.

논 리적으로 생각하지 않는 쪽이 잘 된다고 들어도, 그것이 옳은 것인가 아닌가 해 보지 않고, 논리적인 정오판단을 하려고 해서, 「논리적으로 생각한 결과, 설마 이런 것은 잔잔해졌을 것이다」라고 하는 논리적인 생각을 따르고, 언제까지 경과해도 해 보지 않는다라고 할 것이 있다. 그것은 매우 아까운 것이다.

거기에서, 금후 시간이 어느 날에, 일기인가 무엇인가로, 게다가 이 것에 대해서 자세하게 해설하고, 가능하다면 누구나 이용하게 해서 도움이 되는 정도에 정리하고 싶다.

,