개요
- 코드와 코딩에 대한 근본적인 생각
- 코드와 코딩이란 무엇인가?
- 처음에 개념이 잘못 잡혀있는 상태에서 달려나가다보면 시간을 허비할 수 있음. 첫 단추를 잘 꿰는 시간


- 클린 코드라는 책을 잘못 읽어 오해하고 있는데 이를 잘 읽기 위한 관점을 제시

- 어려운 순간들을 회피하지 말고 직면할 것

- 코드리뷰할 때 코드가 클린하지 않다는 이유로 리젝하는 경우가 많음
- 클린 코드와 코드 리뷰를 많이 엮어서 생각하는 사람이 많음
- 깨끗한 코드에 대한 이야기를 다룬 책들이 많아짐
- 클린이라는 의미가 여러 의미로 해석되어 많은 해석들이 만들어짐

- 맹목적으로 클린 코드에 대해 지키려고 하면서 생기는 문제들
- 책을 잘못 읽어 코드 결벽증이 생기는 사람들이 많음
- 좋은 개발 원칙들을 너무 강하게 적용하려고 하다 보니 생기는 문제들
- 지나친 코드 강조
- 클린 코드는 코드 자체에 대해 한정되지 않은 책임에도 불구하고 코드에만 집중하는 경향

- 클린은 “깨끗하다”는 의미가 아님
- 책에서 나온 클린의 의미는 4번째에 가까움. 명료하고 명쾌한 것
- 여기에 집중하다보니 집중하기 힘들고 클린한 상태가 될 때까지 계속 고쳐서 진도가 안 나감

- 코드의 가독성은 잘 읽힌다는 것을 넘어서 결함이 없도록 하는 코드
- 가독성? → 너무 단순해서 결함이 없는 것이 당연하다는 것

- 클린코드에 대해 부정하는 사람들
- 좀 더 명확한 어휘의 사용이 필요하다고 지적하는 사람들

- 프로그래머가 지향해야 하는 바 → 단순히 동작 뿐만 아니라 유지보수하기 좋아야 함
- 어디를 어떻게 고치면 되겠다 하는 코드
- 코드를 통해서 학습할 기회
- 품질과 생산성은 반대되는 가치처럼 보이지만 많은 영역에서 품질이 일정수준을 넘어서면 생산성은 따라서 올라감

- 원칙과 패턴의 의미
- 원칙 패턴에서 많이 신경을 쓰기만 하고 그 뒤애서는 크게 신경쓰지 않음

- 다섯 가지 단계의 기술 습득
- 입문자
- 상황에 맞는 지식을 꺼낼 수 없음
- 초급자
- 지엽적으로 들여다보는 시야
- 상황에 맞는 지식을 꺼낼수는 있음
- 똑같은 실력에서 멈춤
- 중급자
- 전체적으로 보고 문제를 인식함
- 숙련자
- 문제를 해결할 때, 일단 함
- 도구가 손에 익어서 자유롭게 함.

- 원칙과 패턴을 통해 훈련하라
- 모르는데도 오바하려는 등의 행동
- 클린이라는 말을 오해하지 말자

- 7번 이후에서부터 코드와 관련 없는 것들

- 기획부터 테스트까지 프로젝트의 일련의 과정 자체가 원초적으로 어떤 것을 만들어내는 방식 자체를 소프트웨어에 적용
- 인간의 이해할 수 없는 것을 코드로 변환하는 사람 → 코더

- 코딩이라는 것이 설계의 일부

- 설계의 과정으로써 코딩이 들어가야 함
- 설계와 시공이 분리되는 것처럼, 소프트웨어에서의 시공은 컴파일러가 하는 것임
- 컴파일만 하면 되기 때문에 너무 엄격하게 설계할 필요가 없음


- 기계가 실행하는 명령의 집합
- 코드는 설계 문서이고, 사람이 읽어야 함

- 계층적으로 나누어진 목차
- 소프트웨어를 어떻게 설계할 것이냐에 대한 이야기를 포함함
- 코딩은 설계다

- 유지보수성을 늘리는 방법
- factoring → 인수분해
- 코드를 만들면 한곳에 떡져있거나 컴포넌트별로 잘 구성되어 있을 수 있음. 소프트웨어를 어떻게 정리할 것인가를 위해 구성 요소를 잘 분해해야 할 필요성이 있는데, 이러한 점이 팩터링. 분해하고 설계하는 것
- 리팩터링은 곧 재설계

- 테스트 코드가 있으면 변경이 쉬워진다.
- 리팩토링을 테스트와 함께 하면 더 쉬워짐

- 테스트코드 → 안전장치
- 내가 잘 돌아가는 코드인데 잘못 고칠 수도 있음
- 이러한 위험성을 위한 안전장치
- 스트레스 적게 안심하게 일을 할 수 있음
- 테스트코드와 리팩터링은 함께 맞물려서 돌아감

- 리팩토링 전 코드를 깔끔하게 쓰는 습관
계속해서 설계와 유지보수를 하면서 코드를 만드는 사이클이 커가짐

- TDD → 코드를 만들기 전에 테스트를 작성
- 테스트를 통과하기 위한 최소한의 코드
- 리팩토링을 통한 개선
- 계속 개선함으로써 설계를 나중에
- 사이클이 빠르게 돌아가면서 리팩토링과 코딩이 동시에 진행됨

- 결국엔 아키텍처조차 리팩토링 될 수 있음
- 클린 코드 → 단순한 코드의 표현에 대한 얘기가 아님
소프트웨어를 다른 관점으로 보기

- 소프트웨어는 키우는 것
- 키워나가면서 계속해서 발전하는 방식
- 그 관점에서 코드를 봐야 함
- 계속 반복하면서 소프트웨어를 키워 나가는 과정

- 클린 코드를 작성할 수 있는 사람이 되어라

- 클린 코더가 되어야 함
- 클린 코더가 작성하려고 노력하는 과정이 곧 클린 코드

- 기법만이 전부가 아님

- 중요한 것은 일관성 유지, 지식 공유, 협력과 소통

- 코드 PR날리거나 머지할 때 동료에게 코드를 받아 승인을 받거나 개선할 수 있는 단서를 받기

- 내가 코드를 작성할 때, 다른 사람을 위해서 코드를 작성해야 함
- 피드백 → 싫은 소리 듣는다고 생각함
- 리뷰에 대한 부담감

- 내 장점을 강화하면서 단점이 문제가 되지 않기 위해 조정하는 과정
- 너무 부정적으로만 생각함
- 학교는 커리큘럼이 있지만 사회는 정답이 없음. 아무도 알려주지 않음.
- 학교에서는 정해진 길을 착실하게 밟으면 됐지만 이제는 직접 탐색해야 함
- 탐색해야 할 때 이행하듯 직선으로 가는 것이 아닌, 전략을 다르게 잡아야 함
- 이제까지 하던 습관대로 하던대로 이행하려고 하게 되면 문제가 됨
무지하다는 것
- 메타 인지
- 객관적으로 들여다보기
- 피드백 받기
- 내가 성장하기 위해 필요함
- 내가 성장하고 싶고, 이를 위해 주변 사람을 이용해서 나의 성장에 사용하는 건전한 사고방식
- 나 자신이 성장을 추구하고 성장하겠다고 하는 자세가 되어있다면, 싫은 소리도 수월함
- 싫은 소리를 듣더라도 건전하게 수용함으로써 성장

- 성장형 사고방식 하기


- 코드리뷰에 대한 테크닉에 대한 영상

- 소프트웨어 엔지니어링 분야가 만들어질 때 나온 논문들
- 다익스트라 → 프로그래밍은 인간적인 행동으로 인식됨
- 인간의 인위적인 능력의 한계 등이 소프트웨어 개발에도 해결해야 할 문제임
- 결국 소프트웨어 엔지니어링은 우리가 인간이기 떄문에 필요함

https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD117.html
- 코드를 많이 보면 능력이 보면 능력이 키워지지만 엉터리 코드를 보면 능력이 좋아지지 않음
- 좋은 코드를 많이 보면서 보는 능력 키우기(오픈 소스 보기)
- done is done
- 더 이상 할 일이 없다
- 리팩토링까지 끝남
- 계획을 세울 때 버퍼를 잡아두는 것이 좋음
- 평균적으로 머지를 할 때 피드백을 받는 것을 상정하고 계획하기
- 함수를 만들 때는 목적이 분명해야 함
- 적당한 크기를 갖되, 목적이 분명하게
- 목적이 불분명하면 합치고, 아니면 나누는 작업
- 애매모호할 때 지나치게 나누는 것보다는 합치기
- 코드의 길이를 한 화면을 덮지 않도록 만들기
- 한 화면에 모든 코드가 보이도록
- 가로, 세로가 내 시야를 넘지 않도록