Skip to content

Commit

Permalink
Docs: Add The_Missing_README/Chapter02.md
Browse files Browse the repository at this point in the history
  • Loading branch information
fkdl0048 committed Feb 20, 2024
1 parent f0eb1e7 commit 2e013e8
Showing 1 changed file with 171 additions and 0 deletions.
171 changes: 171 additions & 0 deletions The_Missing_README/Chapter02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
## 2장 역량을 높이는 의식적 노력

> 경쟁력을 갖춘 개발자가 되기 위해 스스로 해야 할 일
마틴 브로드웰의 `학습을 위한 가르침`이라는 책에서 나오는 능숙함을 4 단계로 나눠 정의한다.

- 무의식적 능력부족(unconscious incompetence)
- 업무를 올바르게 수행할 역량도 안 되고 자신의 부족함을 인지하지도 못하는 상태를 말한다.
- 의식적 능력부족(conscious incompetence)
- 업무를 제대로 수행하지는 못하지만 자신의 부족함은 인지하는 상태를 뜻한다.
- 의식적 능숙(conscious competence)
- 노력을 통해 해당 업무를 수행할 역량이 갖춰진 상태를 의미한다.
- 무의식적 능숙(unconscious competence)
- 해당 업무를 수월하게 수행할 수 있는 역량이 갖춰진 상태를 의미한다.

모든 엔지니어는 의식적이든 무의식적이든 능력부족 단계에서 시작한다. **모든 엔지니어링 기술을 알고 있더라도 해당 회사, 팀의 절차와 규칙은 반드시 익혀야 한다.**

목표는 빠르게 의식적 능숙 상태에 들어가는 것이다.

### 실전에 앞서 익혀야 할 자기주도 학습 방안

배움은 능숙한 엔지니어에 이르고 향후 몇 년간 제대로 성장하는 데 도움이 되는 방법이다. 소프트웨어 엔지니어링 분야는 끊임없이 발전한다. 따라서 노련한 사람이든 초짜이든 배움을 지속하지 않으면 도태된다.

#### 본격적인 학습을 위한 몸풀기

입사 후 몇 달간은 일단 상황이 어떻게 돌아가는지 파악하는 데 집중하자. 그러면 설계 회의나 온콜 교대 업무, 운영 이슈, 코드 리뷰 등에 참여하는 데 도움이 된다.

#### 직접 부딪혀보며 배우자

가장 좋은 학습방법으로 직접 실습하며 학습하는 것이다. 팀에 합류한 신입이라면 적절한 난이도의 미션을 팀장이 부여해줄 것이기 때문에 너무 겁먹지 않는 것이 좋다. 실수는 피할 수 없다.

#### 코드 동작을 이해하기 위해 다양한 실험을 해보자

여러 가지 시도를 해보며 코드가 어떻게 동작하는지 알아두자. (기록)

디버거를 통한 생명주기를 파악하거나 프로그램 로직등을 학습한다.

#### 문서 읽는 습관은 몸에 배야 한다

매주 일정 시간을 할애해 자료를 읽는 습관을 들이자.

*여기서 가장 중요한 점은 매주 일정한 시간이라는 점이다. 가장 안좋은 형태는 불태우는 과정이고 그 과정에서 금방 질리기 마련이다.*

> 코드는 결코 거짓을 전하지 않는다. 하지만 주석은 간혹 거짓을 말할 때가 있다.
할일은 티켓이나 이슈로 관리한다. 서로 무슨일을 하는지 알 수 있도록, 무슨 일을 해야하는지 공유가 되는 것이 가장 먼저이다.

#### 발표 영상을 찾아서 보자

사내 발표나 기술에 대한 외부 발표 영상을 보고 이를 공유하자. (정리를 통해 개념을 학습)

#### 때로는 밋업과 컨퍼런스도 참여하자

컨퍼런스와 밋업에 참석하는 것은 네트워크를 구축하고 새로운 아이디어를 접할 수 있는 좋은 방법이다.

### 시니어 엔지니어의 업무를 체험하고 협업하자

- 체험하기(shadowing)
- 다른 사람이 업무를 수행하는 동안 그림자처럼 따라 다니는 것을 말한다.
- 따라다니며 배우고 이후에는 바꿔보는 것도 좋은 방법이다.
- 짝 프로그래밍(pair programming)
- 두 명의 엔지니어가 하나의 컴퓨터에서 작업하는 방식이다.
- 코드의 품질을 높이기 좋은 방법으로 권한다면 무조건 해보는 게 좋다.

#### 개인 프로젝트 활동에서 배움을 얻을 수 있다

사이드 프로젝트는 새로운 기술과 아이디어를 접할 수 있는 방법이다. 다만 항시 '본업'에 충실해야 한다.

오픈소스 프로젝트에 참여하는 것도 한 방법이다.

가장 중요한 것은 배워야 하는 소재라는 근거로 프로젝트를 선택해서는 안 된다. 해결하고 싶은 문제를 찾아내고, 자신이 배우고 싶은 도구를 이용해 그 문제를 풀어야 한다. 목표가 있어야 더 오래 몰두하고 더 많이 배울 수 있는 본질적인 동기가 스스로에게 부여된다.

대체로 회사에는 업무 외 활동에 대한 규정이 정해져 있으므로 자신이 속한 회사의 정책을 확인하는 것이 좋다.

### 제대로 질문하자

모든 엔지니어는 질문을 해야 한다. 질문은 배움에 있어 매우 중요한 비중을 차지한다. 신입 엔지니어는 팀 동료에게 폐가 될까 싶어 모둔 것을 혼자 알아내려고 한다. (매우 비효율적)

#### 스스로 문제를 해결해보자

먼저 스스로 답을 찾아보자. 설령 동료가 답을 알더라도 그에 앞서 스스로 노력해봐야 한다. 그 과정에서 매우 많이 배우게 되고, 직접 찾아본 내용을 토대로 도움을 청할 수 있다.

무작정 인터넷을 뒤지는 방법은 옳지않고, 정보는 문서와 코드에 다 존재한다.

#### 제한 시간을 정하자

문제를 해결하기 위한 시간을 정해두자, 스스로 시도해보기 전에 제한 시간을 정해두면 학습 효과도 높아질 뿐 아니라 부적합한 결론이 도출되는 상황을 미연에 방지할 수 있다.

*앞서 말한 하루에 몰아서하는 좋지 못한 상황에 대한 방어법이다.*

#### 자신이 시도한 방법을 공유하자

질문을 할 때는 자신이 이미 파악한 내용을 설명해야 한다. 기록해둔 내용을 그대로 전달하라는 의미가 아니다. 시도한 방법을 간결하게 요약하자.

```
앨리스 님께,
testkey가 왜 testKVStore에 저장되는지 혹시 아시나요?
그것 때문에 피드가 굉장히 느려지고 있거든요.
고맙습니다.
ooo드림
```

```
앨리스 님께,
저는 지금 testKeyValues가 (DistKV 레포에) TestKVStore에 저장되는 문제를 해결 중이에요. 숀이 앨리스 님께 물어보라고 하더라구요. 이와 관련하여 도움을 받고 싶습니다.
테스트를 실행하면 두 번까지는 성공적으로 넘어가는데 세 번째 테스트에서 매번 실패합니다. 랜덤하게 실패하는 것 같습니다. 그 테스트를 따로 실행해봤는데도 여전히 실패하고 있는걸 보면 다른 테스트에 영향을 받는 것은 아닌 것 같습니다. 테스트 루프안에서 실행해도 원인을 찾지 못하고, 소스코드를 읽어도 명학환 원인을 찾을 수 없었습니다. 일종의 경합 상태 같은데 어떻게 생각하시나요?
프로덕션 환경에선 큰 영향이 없을거라고 하니 급한 문제는 아니지만, 테스트 실패시마다 빌드가 20~30분씩 느려져서 꼭 해결하고 싶습니다. 혹시 몰라 테스트 환경과 로그를 같이 첨부합니다.
감사합니다.
ooo드림
```

두 메일은 명확한 차이가 있다. 처음 관계는 불만이 있어보이지만 명확한 컨텍스트와 문제를 설명하기에 상세 내용을 파악하는 것에서 시간을 허비하지 않는다.

#### 동료를 방해하지 말자

모든 동료는 각자가 해야할 일이 명확하게 존재한다. 그래서 집중이 필요하다. 설령 쉬운 문제일지라도, 그에게 해결책이 있다고 해도 다른 이를 쉽게 방해해서는 안된다.

*이에 대한 순간은 개개인마다 다를 수 있지만, 어느정도 눈치로 파악이 가능하다. 헤드폰을 쓰거나 자신만의 공간에 가는 등*

#### 비동기식 멀티태스킹 의사소통을 시도하자

멀티태스킹, 비동기는 컴퓨터의 영역뿐만 아니라 사람 간의 의사소통에도 적용할 수 있다.

질문은 여러 사람이 각자의 상황에 따라 응답할 수 있는 곳에 올리자. 모든 사람이 볼 수 있는 곳에 올려두면 문제가 해결됐다는 점도 모두가 알 수 있게 된다.

#### 동기식 요청은 한 번에 보내자

간단한 질문은 이메일이로 해결 가능하지만, 복잡한 논의는 적합하지 않다. 직접 만나 대화하면 '많은 내용'을 빠르게 전달할 수 있지만 다소 비용이 든다.

### 성장의 장애물을 극복하자

스스로 학습하는 방법을 아는 것만으로는 충분하지 않다. 반드시 성장에 방해되는 요소는 제거해야 하고 가장 보편적인 장애물은 가면 증후군과 더닝 크루거 효과이다.

#### 가면 증후군

대부분의 신입은 의식적 능력부족 상태에서 시작한다. 배울 것도 많고 자신을 제외한 모든 사람이 자신보다 훨씬 앞서가는 느낌을 받는다. 어쩌면 어울리지 않는 자리에 있는 것 같다거나 단지 운이 좋아 이 직업을 갖게 된 듯해서 온갖 걱정에 휩싸이기도 한다. 그러다 보면 간혹 스스로에게 너무 업격해지기도 한다.

이런 현상을 바로 가면 증후군이라고 하며 자신을 의심하며 스스로에 대한 불신이 강해지는 경향이 있다. 사실 누구나에게 있는 보편적인 현상이라는 점을 기억해야 한다.

가면 증후군은 점점 더 강화되는 경향이 있으며 모든 오류는 자신의 능력 부족에 대한 증명으로 여기는 반면, 모든 성공은 남을 '기만'하는 증거로 바라본다.

이 상황에선 적절한 자기인식(메타인지)가 중요하다. 운이 좋은 것이 아닌 자신이 증명한 성과로 봐야하며 지속적인 기록을 통해 자신을 바라봐야 한다.

피드백을 받는 것도 도움이 된다.

*임포스터 증후군이라는 비슷한 증후군도 있다.*

#### 더닝 크루거 효과

더닝 크루거 효과는 가면 중후군과 반대되는 현상으로, 스스로 과대평가하는 인지적 편견을 갖는 것이다. 무의식적 능력부족 상태의 엔지니어는 자신이 뭘하는지 뭘 모르는지 모른다.

그래서 자신의 역량을 제대로 평가하지 못한다. 자신감이 넘친 나머지, 자신이 속한 회사의 기술 스택을 비난하고 코드 품질에 불만을 가지며 설계를 무시한다. 이러 부류는 늘 자신의 생각이 옳다고 확신하며 기본적으로 피드백을 거부한다.

이도 마찬가지로 메타인지의 영역으로 해결이 가능하고 타인의 의견을 통해 되돌아볼 수 있다.

### 개발자 필수 체크리스트

|이것만은 지키자|이것만은 피하자|
|---|---|
|코드를 이용해 자주 실험하자|이무 생각 없이 코드만 찍어내서는 안 된다|
|설계 문서와 다른 사람이 만든 코드를 읽자|위험과 실패를 두려워하지 말자|
|밋업, 커뮤니티, 관심 그룹, 멘토링등 프로그램에 참여하자|너무 잦은 컨퍼런스는 금물이다|
|논문과 블로그를 읽자|질문하기를 두려워하지 말자|
|멀티캐스트/비동기식으로 소통하자| |
|인터뷰나 면접, 긴급대응 교대 업무를 따라 다녀보자| |

0 comments on commit 2e013e8

Please sign in to comment.