오늘의../이달의 책

[노개북] 실용주의 프로그래머 (7장. 코딩하는 동안)

호마 2022. 4. 2. 18:13

오늘 읽은 범위 🔖 7장. 코딩하는 동안

📝 책에서 기억하고 싶은 내용
  • 여러분은 개발자로서 ... 경험과 지혜를 축적해 왔다. ..그 느낌을 따라라. 직감이 여러분의 역량에 일조하도록 하라. (p. 277)
  • 일단, 하고 있는 일을 멈춰라. 여러분의 뇌가 정리를 좀 할 수 있도록 약간의 시간과 공간을 확보하라. (p. 278)
  • 코드를 마구 찍어내는데 드는 시간을 줄이고, 오류를 초기에 더 적게 만들기 위한 의도적으로 프로그래밍하는 법 (p. 288) (중 일부만 작성) 
    • 지금 무엇을 하고 있는지 알아야 한다. 
    • 코드를 상세히 설명할 수 있는가?
    • 계획을 세우고 그것을 바탕으로 진행하라
    • 신뢰할 수 있는 것에만 기대라
    • 우선순위를 정하라
  • 대문자 O (Big O) 표기법
    • 어떤 함수가 O(n)2 시간이 걸린다고 하면, 이 함수가 실행되는 데 걸리는 시간의 최댓값이 n2보다 더 빨리 늘어나지 않는다는 뜻이다.
    • 최상위 차수를 제외한 다른 모든 차수는 제거하며, 상수인 계수는 표기하지 않는다.
  • 코드 프로파일러code profiler 사용해보기 (p. 297)
  • 성급한 최적화premature optimization를 조심하라 (p. 298)
  • 로버트 세지웍의 <알고리즘>, <알고리즘 분석 입문>을 읽어보라
  • 리팩터링refactoring: 밖으로 드러나는 동작은 그대로 유지한 채 내부 구조를 변경함으로써 이미 존재하는 코드를 재구성하는 체계적 기법 (마틴 파울러 <리팩터링>) (p. 301)
  • 무엇이든 잘못되었다는 생각이 들 때, 주저하지 말고 변경하라 (p. 302)
    • 중복, 직교적이지 않은 설계, 더 이상 유효하지 않은 지식, 이제는 사용하지 않는 기능, 성능, 테스트 통과
  • 리팩터링 하는 방법 (p. 305) (마틴 파울러 <리팩터링>) 
    • 리팩터링과 기능 추가를 동시에 하지 말라.
    • 리팩터링을 하기 전 테스트가 있는지 먼저 확인하라.
    • 단계를 작게 나누어서 신중하게 작업하라
  • 테스트 주도 개발test-driven development, TDD: 테스트를 먼저 작성하는 프로그래밍 기법
  • 테스트 주도 개발 주기 (아래 루틴이 불과 몇 분 동안 진행되며 반복된다) 
    • 추가하고 싶은 작은 기능 하나를 결정한다.
    • 그 기능이 구현되었을 때 통과하게 될 테스트를 하나 작성한다.
    • 테스트를 실행한다. 다른 테스트는 통과하고 방금 추가한 테스트 딱 하나만 실패해야한다.
    • 실패하는 테스트를 통과시킬 수 있는 최소한의 코드만을 작성한다. 그리고 모든 테스트가 통과하는지 확인한다.
    • 코드를 리팩터링한다. 테스트나 함수를 개선시킬 부분이 없는지 살펴본다. 
  • 상향식bottom-up, 하향식top-down, 끝에서 끝까지end-to-end (p. 313)
  • 테스트 접점 만들기: go 언어의 pprof 모듈을 이용하기 (url을 통해 메모리 사용량이나 동시성 분석, 프로파일링 가능) (p. 319)
  • 속성 기반 테스트property-based testing (p. 321)
    • 계약: 선행 조건에 맞는 입력을 넣으면 코드가 생산하는 출력이 후행 조건에 맞음을 보장함
    • 불변식invariant: 함수 실행 전후로 계속 어떤 부분의 상태에 대하여 참이 되는 조건
    • 파이썬의 Hypothesis, pytest 라이브러리
💭 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보기
  • 파충류외 이야기하는 법 부분은 끈질기게 매달려도 풀리지 않는 문제가 자고 일어나면 허무하게도 해결책이 생각나는 흔한 사례에 대한 조언이다. 무언가에 막히면 일단 하고 있는 일을 멈추고 뇌를 좀 쉬게 해야한다. 옆에 도와줄 동료가 있다면 얘기를 하는 방법이 제일 좋아보인다. (아니면 고무오리에게 ㅋㅋ)
  • 무언가 백지부터 시작하기 어렵다면.. 일단 가벼운 마음으로 프로토타입을 만들어보자. 제한시간을 두어도되고 만든것은 모두 지우기로 약속한다
  • 테스트 주도 개발과 속성 기반 테스트 해보기
🔍 궁금하거나 잘 이해되지 않는 내용
  • 경합 조건(?)race condition: 보통 '경쟁 상태'라고 말한다. 공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다.

 


오늘의 TIL 3줄 요약 

  • 의도적으로 프로그래밍하라
  • 리팩터링 하라
  • 테스트를 하라 (테스트 주도 개발TDD, 속성 기반 테스트PBT)