개요

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

  • 클린 코드라는 책을 잘못 읽어 오해하고 있는데 이를 잘 읽기 위한 관점을 제시
  • 어려운 순간들을 회피하지 말고 직면할 것

  • 코드리뷰할 때 코드가 클린하지 않다는 이유로 리젝하는 경우가 많음
  • 클린 코드와 코드 리뷰를 많이 엮어서 생각하는 사람이 많음
  • 깨끗한 코드에 대한 이야기를 다룬 책들이 많아짐
  • 클린이라는 의미가 여러 의미로 해석되어 많은 해석들이 만들어짐
  • 맹목적으로 클린 코드에 대해 지키려고 하면서 생기는 문제들
  • 책을 잘못 읽어 코드 결벽증이 생기는 사람들이 많음
  • 좋은 개발 원칙들을 너무 강하게 적용하려고 하다 보니 생기는 문제들
  • 지나친 코드 강조
    • 클린 코드는 코드 자체에 대해 한정되지 않은 책임에도 불구하고 코드에만 집중하는 경향

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

  • 코드의 가독성은 잘 읽힌다는 것을 넘어서 결함이 없도록 하는 코드
  • 가독성? 너무 단순해서 결함이 없는 것이 당연하다는 것
  • 클린코드에 대해 부정하는 사람들
  • 좀 더 명확한 어휘의 사용이 필요하다고 지적하는 사람들

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

  • 원칙과 패턴의 의미
  • 원칙 패턴에서 많이 신경을 쓰기만 하고 그 뒤애서는 크게 신경쓰지 않음
  • 다섯 가지 단계의 기술 습득
  • 입문자
    • 상황에 맞는 지식을 꺼낼 수 없음
  • 초급자
    • 지엽적으로 들여다보는 시야
    • 상황에 맞는 지식을 꺼낼수는 있음
    • 똑같은 실력에서 멈춤
  • 중급자
    • 전체적으로 보고 문제를 인식함
  • 숙련자
    • 문제를 해결할 때, 일단 함
    • 도구가 손에 익어서 자유롭게 함.

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

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

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

  • 기계가 실행하는 명령의 집합
  • 코드는 설계 문서이고, 사람이 읽어야 함
  • 계층적으로 나누어진 목차
  • 소프트웨어를 어떻게 설계할 것이냐에 대한 이야기를 포함함
  • 코딩은 설계다
  • 유지보수성을 늘리는 방법
  • factoring 인수분해
  • 코드를 만들면 한곳에 떡져있거나 컴포넌트별로 잘 구성되어 있을 수 있음. 소프트웨어를 어떻게 정리할 것인가를 위해 구성 요소를 잘 분해해야 할 필요성이 있는데, 이러한 점이 팩터링. 분해하고 설계하는 것
  • 리팩터링은 곧 재설계
  • 테스트 코드가 있으면 변경이 쉬워진다.
  • 리팩토링을 테스트와 함께 하면 더 쉬워짐
  • 테스트코드 안전장치
    • 내가 잘 돌아가는 코드인데 잘못 고칠 수도 있음
    • 이러한 위험성을 위한 안전장치
    • 스트레스 적게 안심하게 일을 할 수 있음
    • 테스트코드와 리팩터링은 함께 맞물려서 돌아감

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

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

  • 결국엔 아키텍처조차 리팩토링 될 수 있음
  • 클린 코드 단순한 코드의 표현에 대한 얘기가 아님

소프트웨어를 다른 관점으로 보기

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

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

  • 클린 코더가 되어야 함
  • 클린 코더가 작성하려고 노력하는 과정이 곧 클린 코드
  • 기법만이 전부가 아님

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

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

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

  • 내 장점을 강화하면서 단점이 문제가 되지 않기 위해 조정하는 과정
  • 너무 부정적으로만 생각함
  • 학교는 커리큘럼이 있지만 사회는 정답이 없음. 아무도 알려주지 않음.
  • 학교에서는 정해진 길을 착실하게 밟으면 됐지만 이제는 직접 탐색해야 함
  • 탐색해야 할 때 이행하듯 직선으로 가는 것이 아닌, 전략을 다르게 잡아야 함
  • 이제까지 하던 습관대로 하던대로 이행하려고 하게 되면 문제가 됨

무지하다는 것

  • 메타 인지
  • 객관적으로 들여다보기
  • 피드백 받기
    • 내가 성장하기 위해 필요함
    • 내가 성장하고 싶고, 이를 위해 주변 사람을 이용해서 나의 성장에 사용하는 건전한 사고방식
    • 나 자신이 성장을 추구하고 성장하겠다고 하는 자세가 되어있다면, 싫은 소리도 수월함
    • 싫은 소리를 듣더라도 건전하게 수용함으로써 성장

  • 성장형 사고방식 하기

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

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

https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD117.html

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