From c421413fb500290ca85e7312f8c728d8aff4c075 Mon Sep 17 00:00:00 2001 From: fkdl0048 Date: Fri, 2 Feb 2024 16:45:38 +0900 Subject: [PATCH] Docs: Add The Psychology of Computer Programming Chapter 09 --- .../Part03.md | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/The Psychology of Computer Programming/Part03.md b/The Psychology of Computer Programming/Part03.md index f14cb65..327d216 100644 --- a/The Psychology of Computer Programming/Part03.md +++ b/The Psychology of Computer Programming/Part03.md @@ -257,3 +257,98 @@ 하지만 특정 프로그래밍 업무에 필수적인 성격 요소를 추려낼 수는 있어 보인다. 어떤 성격의 소유자가 어떤 업무를 잘 하지 못할 것임을 알아내는 차원에서는 말이다. 결과적으로, 성격이라는 주제를 연구하면 프로그래머의 능률을 높이는 데 어느 정도 공헌하게 될 것이다. + +### 9장 지능 또는 문제해결력 + +겪어봐서 알겠지만, 프로그래머는 평균 이상의 지능을 가진 사람들이다. + +*과거에는 그럴 수 있을 수 있지만, 현대에는 그렇게 생각하지 않는다. 오히려 더 낮을 수 있다고 생각한다.* + +#### 심리적 자세 + +잘못된 곳을 찾을 때에는 심리적 자세가 방해가 되기도 한다. 수많은 연구를 거쳐 사람의 눈은 기대한 면만 보는 경향이 있음이 증명됐다. (보고싶은 것만 본다.) + +컴퓨터 프로그램에서 다양한 오류를 찾아낸다. 문법 오류나 잘못된 예약어, 잘못 선언된 상수 등은 간단하게 찾을 수 있고, 심벌 테이블이나 상호 참조 목록, 제어 흐름 분석은 상호 검증이 필요하다. + +심리적 자세 외에 거리라는 개념도 염두에 둬야 한다. 어떤 단어를 다른 옳은 단어로 오인할 확률은 거리감으로 인해 단어마다 다르다. 읽은 사람이 지닌 심리적 자세와 관계없이 말이다. + +그러나 프로그래밍 언어의 심벌에 대해서 거리를 그렇게 간단한 척도로 재면 어떤 심벌을 다른 것으로 오인할 확률에 대한 근사값밖에 얻을 수 없다. + +자연어로 의미가 있는 심벌은 프로그램을 읽을 때 혼란스럽게 만들 여지가 특히 많다. 그 이유는 다음과 같다. + +- 사람들은 항상 의미를 찾으려는 심리적 자세를 가지고 있는데, 이를 자연어가 만족시키기 때문에 프로그램 자체에 어떤 의미가 있다고 보게 된다. +- 사람들은 심벌의 값보다 심벌의 이름을 믿는 경향이 있는데, 그 경향을 더 부추긴다. +- 심벌 사이의 적절한 거리를 유지하기가 어렵다. +- 축약어로 인해 심벌 사이의 거리는 더 좁혀진다. + +심리적 자세가 야기한 문제를 논할 때에는 주석문 예기가 빠질 수 없다. 코드에 주석을 다는 목적은 읽는 이가 코드를 직접 보기 전에 적당한 마음의 준비를 하게 만들려는 것이다. + +그 코드가 정확하게 구현되어 있다면, 주석문은 확실히 효과가 있다. **그러나 코드가 부정확하다면, 읽는 사람의 심리적 자세가 주석문의 지배를 당하기 때문에 오류를 찾아내는 데 오히려 방해가 된다.** + +#### 문제 해결의 여러 측면들 + +심리학에서는 심리적 자세를 지능보다는 인지의 일부로 본다. 그러나 앞절에서 봤듯이 심리적 자세가 문제 해결 행위에 영향을 줄 수 있음이 분명하다. + +물론 심리적 자세는 문제 해결에 앞서 문제를 회피하는 데 영향을 준다. **문제를 모두 피하는 프로그래머가 문제를 안고 전전긍긍하는 프로그래머보다 지능적이다. 그 문제를 궁극적으로 해결하든 못하든 간에 말이다.** + +그러나 현실은 객관적인 척도가 부족하기에 프로그램 난이도를 판단할 때 담당 프로그래머가 얼마나 열심히 일 하느냐를 기준으로 삼곤 한다. 그 기준에 따르면 능력이 가장 떨어지는 프로그래머가 최고가 된다. 능력이 떨어지면 열심히 일하는 수밖에 없기 때문이다. + +- 더 능력있는 프로그래머가 피해를 입는 사례 + +가장 문제가 되는 경우가 문제 회피다. 물론 뭘 모르는 관리자를 속이려는 의도의 문제 회피는 그렇지 않지만?? 어떤 행위가 문제 해결에 얼마나 도움이 될지를 알기 어려운 것처럼, 우리가 얼마나 많은 어려운 문제를 회피하고 있는가도 알기 어렵다. + +**일단 문제를 해결하고 나면 그 전까지 겪었던 어려움은 완전히 잊기 쉽다.** 문제 해결을 어렵게 만드는 가장 일반적인 원인 중 하나가 일부 요소를 간과하는 것인데, 일단 어떤 요소가 중요함을 깨닫고 나면 해결은 간단해진다. + +만약 그 문제를 다른 사람에게 설명한다면 그 요소도 함께 설명할 터이고, 설명을 들은 사람은 앚은 자리에서 문제의 9할을 해결할 수 있을 것이다. 그는 우리가 왜 그렇게 어려워했는지를 이해할 수 없을 것이다. 마찬가지로 우리도 자신의 능력을 의심하게 된다. + +심리적 자세도 일종의 가정하기다. 가정이 좀 더 깊이 묻혀 있는 경우이기는 하지만, 문제 해결에 영향을 미치는 것은 마찬가지다. 그렇다면 문제 해결의 첫 번째 원칙이 **가정하지 않는 것**이라고 할 수 있는가? + +이는 맞는 말이면서 완전히 틀린 말일 수 있다. 문제를 성공적으로 해결하려면 가정을 하지 않을 수 없다. 모든 문제를 해결할 때마다 무에서 시작해야 한다면 문제 해결 능력이 향상되기는 불가능할 것이다. + +가정을 전혀 하지 않기보다 주어진 문제에 맞춰 적절히 가정하는 편이 더 지능적인 행위다. 즉, 지능적인 행위가 모든 문제를 해결하는 마법의 공식을 제시하는 것은 아니다. 그보다는 여러 공식을 갖춰 놓고 특정 공식에만 집착하지 않는 쪽이 지능적인 행위다. + +#### 프로그래밍을 위한 지능의 여러 측면 + +**모든 종류의 지능적 행위에는 융통성이 필요하다.** 정신적인 행위일지라도 몇몇 고정된 규칙으로만 수행된다면 지능적이라 할 수 없다. 그런 행위는 사람보다 기계가 수행하는 편이 낫다. + +그러나 지능적 행위에서도 몇몇 고정된 규칙을 적용하는 것은 중요한 요소다. (약점을 덮을 만한 다른 방도가 없다면 다른 프로그래머와의 경쟁에서 불리하다.) + +사람들은 저마다 다른 고유의 문제 해결 기법을 갖고 있다. 사람마다 잘 하는 것이 다르기 때문에 사람들은 각자 자기 능력의 강약에 맞는 해결 기법을 고르고 한다. + +- 뛰어난 기억력을 가진 프로그래머의 예제 + - 기역력이 뛰어난 상황에 좋은 경우가 있을 순 있지만, 이는 상대적, 환경적인 요인이 너무 많아서 의지하는 것은 좋지 못한 것 같다. 테스트, 문서화를 통해 이를 해결 + +작업 환경에 따라 다른 형태의 지능적 행위를 취해야 하는 것과 마찬가지로 프로그래밍 단계에 따라 두각을 나타내는 프로그래머가 달라진다. (창의력과 선택 능력 중 어느 하나라도 부족한 프로그래머는 프로그램 설계 단계에서 능력을 발휘할 수 없다.) + +#### 적성 검사 + +> 프로그래밍에 지능이 그렇게 중요하다면 프로그래머가 될 사람을 어떻게 선별하는 것이 좋을까? + +현대에는 코딩테스트로 대체한다. + +그러나 이것도 이론적인 추측일 뿐이다. 아직 적성 검사 결과의 유효성자체가 검증되지 않았다. 프로그래머에 대한 적성 검사는 적성 검사에서 높은 점수를 받은 사람들이 프로그래밍 교육기관에서 좋은 성적을 낸 학생들이었다는 연구 정도가 유효성을 입증할 근거가 될 뿐이다. + +*과연 코테에서 좋은 점수를 받는 사람이 책에서 말하는 좋은 개발자일까?* + +기본적인 커트라인인 경우로 생각하는 것이 좋아 보인다. + +#### 프로그래머를 대상으로 하는 적성 검사 + +상관성을 측정할 수 있지만, 그 수치가 과연 정확한가에 대한 생각 + +[상관성에 관한 글](https://github.com/fkdl0048/BookReview/blob/main/Growing_Up_Together/Chapter01.md#%EC%A7%81%EC%9B%90%EC%9D%84-%EB%BD%91%EC%9D%84-%EB%95%8C-%EB%AC%B4%EC%97%87%EC%9D%B4-%EA%B7%B8-%EC%82%AC%EB%9E%8C%EC%9D%98-%EC%8B%A4%EB%A0%A5%EC%9D%84-%EA%B0%80%EC%9E%A5-%EC%9E%98-%EC%98%88%EC%B8%A1%ED%95%A0%EA%B9%8C) + +스스로 경험이 있다고 주장하는 프로그래머에게 왜 잠시 앉아 작은 프로그램을 작성하거나 멍세서를 읽은 후 구현 스케치를 해보라고 시키지 않는가? 이는 아마도 우리 스스로도 프로그램을 거의 읽어 보지 않으므로 실제로 발생할만한 상황이 아니라고 생각하기 때문일 것이다. + +**또는 경력자를 뽑을 때 지원자가 한 명뿐이더라도 그 사람이 운 좋게 능력 있는 사람이기를 막연히 바라고 있기 때문일 것이다.** 지원자가 한 명뿐일지라도 당신의 아내감을 고르듯이 해야 한다. + +#### 요약 + +프로그래머를 고용하는 데 관계된 사람들은 좋은 프로그래머에게 필수인 자질이 무엇인지에 대해 저마다 의견이 있다. + +어떤 프로그래머를 뽑느냐보다 어떻게 프로그래머를 양성할 것인가로 바뀐다. + +즉, 좋은 프로그래머는 태어나는 것이 아니라 만들어진다. 따라서 우리는 프로그래머의 생산 즉, 훈련 과정에 관심을 가져야 한다. + +### 10장 동기 부여와 훈련, 경험 +