Skip to content

Commit

Permalink
Docs: Add The Psychology of Computer Programming/Part03.md
Browse files Browse the repository at this point in the history
  • Loading branch information
fkdl0048 committed Feb 3, 2024
1 parent c421413 commit d47cd22
Showing 1 changed file with 160 additions and 0 deletions.
160 changes: 160 additions & 0 deletions The Psychology of Computer Programming/Part03.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,14 @@

**바로, 상호 관심과 개성 존중**이다.

오래된 고전 책이라 업무에 있어서 시대차이를 느끼지만, 인간관계나 프로그래머의 본질적인 특성은 시대를 벗어나 획일적이라 느낀다.

#### 논의사항

> 예를 들어, 코딩이 매일 잘 되지는 않는다. 코딩을 하던 중에 일이 잘 풀리지 않음을 느낀다면, 코딩을 잠시 접어 두고 다른 종류의 기술과 마음가짐을 요하는 다른 작업에 눈을 돌리는 게 좋다. 그러나 그 시각에 해야 할 작업이 코딩뿐이라면, 일은 하면서 코딩에서 벗어날 방법이 없다.
- 코딩이 잘 되지 않는 날에 어떤 작업으로 눈을 돌리시나요?

### 8장 개인의 성격

어떤 의미에서, 성격은 사람들 사이에서 볼 수 있는 모든 개인차를 포괄하는 개념이다. 인간의 행동을 조금만 관찰해도, 지능과 교육 정도에 따라 성격의 차이가 생김을 명백히 알 수 있다. 이때의 성격은 어떤 사람을 다른 사람과 구별해 주는 개인적 특성을 총체적으로 일컫는다. 이런 의미에서 **성격은 그 사람의 정체성**이다.
Expand Down Expand Up @@ -258,6 +266,12 @@

결과적으로, 성격이라는 주제를 연구하면 프로그래머의 능률을 높이는 데 어느 정도 공헌하게 될 것이다.

#### 논의사항

> 성격이 고정적이지 않다는 점에 대해서 좀 더 부가적인 설명을 하자면, 분명히 성격은 잘 변하지 않는다. 그럴만한 이유가 없다면 성격은 변하지 않는다.
- 프로그래밍 분야에 들어와서 성격이 변하게 되신 경우가 있나요? 있다면 특정 경험에 대한 이야기를 듣고 싶습니다.

### 9장 지능 또는 문제해결력

겪어봐서 알겠지만, 프로그래머는 평균 이상의 지능을 가진 사람들이다.
Expand Down Expand Up @@ -350,5 +364,151 @@

즉, 좋은 프로그래머는 태어나는 것이 아니라 만들어진다. 따라서 우리는 프로그래머의 생산 즉, 훈련 과정에 관심을 가져야 한다.

#### 논의사항

> 프로그래밍에 지능이 그렇게 중요하다면 프로그래머가 될 사람을 어떻게 선별하는 것이 좋을까?
- 기업에서 실시하는 코딩테스트에 대한 생각을 듣고 싶습니다.
- 그냥 기본기로 면접을 볼 사람을 어느정도 거르기 위함인지
- 책에서 말하는 지능적 수준을 보기 위함인지
- or 다른 것을 보기 위함인지

### 10장 동기 부여와 훈련, 경험

심리학에 따르면, 어떤 과제를 해결할 때의 능률은 과제가 무엇인가, 수행하는 사람이 그 과제를 얼마나 잘 이해하고 있는가와 함수 관계에 있다. 또 성격이나 지능과 같은 개인차에 의해 능률이 달라진다고 한다. 그러나 능률을 실질적으로 향상시키는 요인은 성격의 변화나 지능의 향상이 아니라 훈련과 경험에 있다.

*심리학은 엄밀한 과학이 아니다.*

다른 요인으로는 설명할 수 없는 그 불가사의한 부분은 동기부여의 몫이다. 심리학자들조차 동기 부여가 실제로 존재하는지 확신하지 못하고 있음에도, 여러 책에서 이 주제를 다루고 있다.

그러나 교육이나 훈련에 대한 논의를 진행하기 위해서는 동기 부여를 어설프게나마 짚고 넘어가야 한다. 이에는 두 가지가 이유가 있다. 첫째, 만약 동기 부여로밖에 설명할 수 없는 부분이 실재한다면 그 영역은 훈련이나 교육을 통해서 접근할 수 없는 곳일 것이다. 둘째, 동기 부여가 훈련이나 교육 자체에 지대한 영향을 미칠 수 있다.

동기 부여가 되지 않은 사람을 가르치기가 얼마나 힘들지 상상해 보라. 반대로 스스로 동기가 있는 사람이라면 배우는 것을 막을 도리가 없을지도 모른다.

#### 동기 부여

다음은 한 표준적인 심리학 교과서에 수록된 동기에 대한 글의 첫머리다. 내가 지금까지 본 동기 부여에 대한 설명 중 최고라고 생각한다.

> 인간 행동에 대해 수많은 연구를 해온 결과, 인간은 환경에 대해서 피동적인 존재가 아님이 확실하다. 인간은 어떤 자극에 반응하고 어떤 자극은 무시할지, 또 어떤 정보를 배우고 나머지는 버릴지를 스스로 결정한다고 말할 수 있다. 따라서 인간에게는 일종의 원동력이 내재한다는 가정을 세울 수 있다. 이 내적 원동력이 우리가 흔히 말하는 **동기**다.
프로그래머는 일하는 도중에 잠깐씩 다른 생각을 할 수 있다는 사실을 굳이 확인할 필요는 없다. 그런데 관리자는 프로그래머의 능률이 떨어짐을 동기의 부족이라고 단정해 버리는 실수를 많이 범한다.

그래서 관리자는 부족한 내적 원동력을 보충할 **외적 동력을 프로그래머**에게 부여하려 한다. 사실 프로그래머에게 동기가 적어서라기보다는 너무 많아 문제인 상황에서도 말이다.

동기에 대한 연구 결과 중 가장 널리 알려지고 인정 받는 것은 동력을 높이면 처음에는 능률이 최대치까지 올라가지만 그 이상의 동력을 가하면 오히려 능률이 0까지 빠르게 떨어진다는 점이다.

특히 과제가 복잡할수록 이러한 능률의 급등락이 많이 나타난다. 이는 프로그래밍에 매우 중요한 의미가 있다.

예를 들어 버그 찾기에 너무 열중하는 것은 좋지 않으며 심지어 아무 일도 하지 않는 때보다 더 나쁠 수도 있다. 그동안 수많은 버그들이 프로그래머가 포기하고 중압감을 떨친 후에야 잡혔다. 프로그래머에게 빨리 버그를 없애라고 압박하는 것은 최악의 전략이다. 그러나 이것이 지금까지 가장 일반적인 전략이었다.

프로그래밍 관리자가 동기 부여에 대해 가장 먼저 품어야 할 의문은 프로그래머가 현재 얼마나 많이 동기 부여가 되어 있느냐다.(자신도 마찬가지) 그리고 그 답에 따라 동기를 더 부여해야 할지 또는 오히려 줄여야 할지를 결정해야 한다. (균형잡기)

지나치게 동기 부여가 되어 있는 상황이라면 프로그래밍 프로젝트가 압력을 못 이기고 침몰할 가능성이 높다.

> 이제 동기를 더 부여해야 할지 줄여야 할지를 결정했다면 구체적인 방법은 무엇일까?
개인의 처지에서는 아마도 방법이 없을 것이다. 스스로 그렇게 할 동기가 없는데 자신의 내적 원동력을 어떻게 바꿀 수 없기 때문이다. 그러나 실제로는 관리자와 비슷한 전략을 쓸 수 있다. **내적인 뭔가를 바꿀 기회를 만들기 위해 외부 환경을 바꾸는 것이다.**

몇가지 실험을 통해 어떤 외적 요인들이 프로그래머에게 동기를 부여하는지를 알아본다.

가장 많이 선택한 항목은 `급료 인상 또는 보너스`였다. 그 뒤를 쫓는 2위는 `업무를 계획하는 데 관여한 정도`였고, `승진`, `과제의 질을 좀 더 높일 수 있는 추가 시간 부여`가 공동 3위였다.

최하위는 `내 업무의 범위를 줄이는 것` 이었는데, 누구나 전체 계획에 좀 더 많이 관여하고 싶어한다는 사실에 비춰볼 때 이해할 수 있는 결과다.

반대로 적은 선택을 받은 항목은 `문서화, 복사 등등에 대한 보조 인력`이었다. (지금은 완전히 대체 가능하다고 생각) 두 번째는 `높은 지위`였는데, 이는 `승진`이 많이 선택된 점을 볼 때 의아한 결과였다.

그러나 이후의 또 다른 실험을 한 결과 사람들의 관념 속에는 승진이 새 직함을 얻는다기보다 **급료 인상**과 더 강하게 연결되어 있다는 사실이 밝혀졌다.

나머지 두 가지는 `완료 목표일을 느슨하게 설정하는 것``완료 목표일을 정확하게 설정하는 것`이었는데, 이들이 모두 하위권이라는 점은 뭔가 이상했다. 설문 조사를 실시할 당시는 응답자들이 진행하는 프로젝트의 데드라인이 6개월도 넘게 남아 있던 것이다. (즉, 환경적인 사항이 실험에 영향을 크게 준 것)

이런 점이 동기를 연구하는 데 겪는 또 하나의 큰 어려움이다. 설문 조사를 통해 외적 요인들이 끼치는 실제 영향력을 밝혔다고 해도, 그것은 특정 시기의 특정 환경에서만 유효한 결과다.

**돈은 저축과 급료가 늘고 갚을 빛이 점점 줄어들수록 그 중요성이 작아진다. 심지어 앞서 나온 일화와 같은 상황에서는 더 많은 돈으로 인해 직장을 떠날 수도 있다.** (실제 스터디원들의 이야기도 동일했다.)

> 따라서 돈이 동기 부여의 요인으로는 다른 것들에 비해 실질적이지 못하다고 말할 수 있을까?
돈은 동기 부여에 대해 모호한 요인으로 볼 수 있다. (연구로 증명된 것이 없다.)

돈이 상징적인 의미를 주는 경우라면 그 프로그래머에게 동기를 부여하기 위해서는 추가 시간을 준다든가, 프로젝트를 계획하는 데 좀 더 많은 발언권을 준다는 식으로 볼 수 있다.

즉, 업무 자체가 프로그래머의 가장 큰 동기가 되어야 한다.

#### 훈련과 수업, 교육

> 누구나 훈련을 거친다면 경쟁력 있는 프로그래머가 될 수 있는가?
교육 과정에서 생기는 혼동은 크게 두 가지로 나뉘는데, 하나는 수업과 교육을 혼동하는 것이고, 다른 하나는 교육과 훈련을 혼동하는 것이다.

- 운영체제를 다루어 본 경험이 없으면 개념은 공허할 뿐이라는 사실
- 특정한 훈련을 선행하지 않은 교육은 불가능하다는 점 (각자 필요한 경험을 컴퓨터에서 얻어낼 수 있는 상황을 만들어 줘야 한다.)

#### 학습을 저해하는 요인들

의외로, 학습에 방해되는 요소가 있어서 배움에 실패하는 경우가 많다. 이때 의외라는 표현을 쓴 이유는 **누군가를 가르칠 때 학습의 효과를 극대화하기 위한 각종 방책을 도입하는 것이 일반적이기 때문이다.**

그런데 어린 아이가 학습하는 모습을 관찰해 보면, 그런 인공적인 환경 밖에서 훨씬 많은 것을 배운다는 사실을 알 수 있다. 우리가 원하는 형태로 아이가 학습하도록 조절하려면 의도적으로 벽을 만들고 문을 뚫어야 한다.

*야생학습의 필요성.*

우선 뭔가를 배우려면 알 만한 가치가 있는 것 중에서 아직 모르는 것이 존재한다는 사실을 인정해야 한다. 그런데 전문 프로그래머들은 그 사실을 인정하면 자신의 지위가 낮아진다고 여긴다. 진정한 프로라면 약점을 인정해도 잃을 것이 없음을 알고 있겠지만 말이다.

어떤 사람들은 약점을 가까스로 인정한다 해도 자신이 실패할 거라고 확신해 버리고 배우려 하지 않기도 한다. 그런 두려움은 자신감이 부족하기 때문이거나 비슷한 종류의 시도에서 실패한 경험이 있기 때문이다. 그러나 **대부분 두려운 것은 실패 그 자체가 아니라 다른 사람들에게 자신이 실패하는 모습만 보이는 것이다.**

어떤 경우에는, 그룹의 특성상 새로운 학습이 원천적으로 금지되고 이미 알고 있는 기술을 얼마나 잘 발휘하는지만 중요할 수 있다. 배우려면 실수에 관대해야 하는데, 관찰자가 존재할 때에는 그러기 어렵다. 따라서 작업자와 관찰자가 모두 잘 알고 있는 사안을 처리할 때 작업자는 늘 하던 방식을 택할 수밖에 없고, 결국 새로운 배움은 불가능하다.

- 새로운 언어의 학습에 경우엔, 스스로 제한을 두는 (몰입 그래프)

다양한 프로그래밍 언어와 시스템에 대해서는 많은 논쟁이 있다. 그러나 배우기 쉬움과 사용하기 쉬움을 구별하여 다루는 논쟁은 거의 없다. 어떤 기능이 배우기 쉽다고 해서 사용하기에도 가장 쉽다는 법은 없다. **중요한 것은 기술의 확장성이다.**

다시 말해, **그 기술을 처음 배울 때 적용했던 상황 외의 다른 상황에도 쉽게 적용할 수 있는가의 문제다.** 일반론적인 기술을 하나 배우는 것은 지식의 목록에 한 항목이 추가되는 것 이상의 효과가 있다.

너무 특수해서 확장성이 전혀 없는 기술은 끝이 막힌 기술이라 할 수 있다.

프로그래밍에서 일정 규모의 문제들을 성공적으로 해결해 왔지만 그 규모를 넘어서는 문제는 제대로 해결하지 못하는 프로그래머를 심심치 않게 볼 수 있다.

그리고 반대의 경우도 꽤 있다. 규모가 큰 문제만 잘 해결하는 프로그래머도 있는 것이다.

**어떤 끝이 막힌 기술 또는 프로그래밍 언어에 숙달된 프로그래머가 새로운 기술을 배우려면 잠시나마 현재 맛보는 만족감 중 일부를 버릴 각오를 해야 한다.** 새 기술을 배우는 초기에는 시행착오가 많을 테고, 그럴 때마다 마치 예전의 초보자 시절로 돌아가는 듯한 느낌을 받을 것이다. 이런 상실에 대한 두려움은 새로운 프로그래밍 언어를 배울 때 특히 클 수 있다.

새로운 것에 대한 두려움과 실패에 대한 걱정, 자신의 약점을 인정하고 싶지 않은 마음에서도 마찬가지다. 그 외의 문제들은 간접적인 영향을 미치는데, **대부분 무엇을 배울지 또는 어떻게 배워야 할지를 잘못 이해해서 생기는 문제다.**

프로그래밍 학습에는 대부분 교사가 없다. 교수 뿐만 아니라 학습에 필요한 필수인 요소들 또한 없다. 교과서도 참고서도 없으며, 소프트웨어를 실행할 하드웨어도 없다. 새 주제를 공부할 여유 시간도, 실제 상품에 적용할 신기술을 인증해 줄 권위자도 없고, 심지어 좀 더 경험이 많은 선배 프로그래머도 없다. 그런 요소가 없음으로 인해 학습은 지지부진해지고, 학습자는 첫 번째 고비에서 바로 포기하게 된다.

마찬가지로 대학에서도 나는 학문을 가르치는 것이 맞다고 생각하긴 한다. 대학에서 취업하는 방법을 가르친다고 한다면 학원과 다를 것이 없기 때문에 학문에 중점을 둬야한다고 생각한다.

학교는 배우는 곳, 직장은 일하는 곳이라는 생각은 꼭 프로그래밍 분야에 국한된 문제는 아니지만, 프로그래밍 분야는 어떤 분야와 비교해도 지속적인 학습이 중요한 분야이다. (천장이 없음)

#### 프로그래밍을 학습하는 방법

스스로 발전하려 하는 프로그래머는 정식 훈련과 그가 필요한 교육을 받을 수 있도록 해주는 관리자의 배려에 의존하지 않을 수 없다. **순수하게 경험에만 의존하면 안 되는데**, 경험한다고 반드시 뭔가를 배우는 것은 아니다.

프로그래머는 자신이 경험한 것을 배움으로 발전시키려면, 학습하는 방법을 배워야 한다. (야생학습)

- 무엇을 모르는지 배우는 것이다. (레빗홀에서 빠져 나오는 것, 메타인지)
- 학습자의 성향에 따라 분류
- 직접 해보거나, 다른 사람과 교류를 통하거나
- 새로운 프로그래밍 언어를 예로 직접 작성해보고 분석하는 단계에서 다른 사람과 토의하는 것
- 물리적 환경을 조성
- 피드백 (멘토, 정확한 정보)
- 능동적인 태도 (스스로 의문하는 과정)
- 프로젝트 중심

#### 요약

우리는 프로그래머의 성과를 향상시키는 데 두 가지 측면에서 영향력을 행사할 수 있다. 하나는 일을 하고 싶어하는 마음이고, 다른 하나는 업무를 수행하기 위해 필요한 지식이다.

전자를 동기부여, 후자를 훈련 또는 교육이라고 한다. 그러나 프로그래머가 어떤 상황에서 더 열심히 일하는지에 대해 알려진 바는 거의 없다.

*앞 내용에서 언급했듯이 프로그래머는 매우 다양한 스킬을 요구하기 때문에 개개인의 목적이 다를 것이다. 돈, 직급, 명성, 자아실현 등등.. 그런 목표에 다가갈 수 있을 때, 더 열심히 하지않을까?*

프로그래밍 교육이란 주제에 대해 현대는 어느정도로 달라졌는지 궁금하다. 개인적인 생각으론 과거와 다르게 많이 발전했다고 생각한다.

정규교육에서 벗어나지 못했다고 하는 부분도 시간이 몇십년이 지났지만 지금도 크게 달라진 것 같지는 않다.

#### 논의사항

> 지나치게 동기 부여가 되어 있는 상황이라면 프로그래밍 프로젝트가 압력을 못 이기고 침몰할 가능성이 높다.
- 경험이나 상상을 통해서 어떤 상황이 과도한 동기에 의한 침몰 사례가 될 수 있는지 이야기 해보고 싶습니다.

*제가 이해한 바로는 처음부터 너무 큰 작업을 하려고 한다던가, 과도한 예측치 등등이 될 것 같습니다.*

0 comments on commit d47cd22

Please sign in to comment.