Post

실용주의 프로그래머 2장 실용주의 접근법

실용주의 프로그래머 2장 실용주의 접근법

항목 8. 좋은 설계의 핵심

  • ETC(Easier to change), 하지만 적당히와 적절히!
  • 엔지니어링 일지가 가장 좋은 툴이 블로그나 노션인데, 한동안 잘 안적고 있어서 적어야겠다고 생각.

항목 9. DRY: 중복의 해악

  • 중복의 해악으로 주석과 코드가 그 지식이 중복된다는 것을 책을 보고 깨달음.
  • 주석은 목적과 용도를 넣기!, 원리는 코드로 이해하기 쉽게 하자!
    • 단, 무조건은 아님.
  • 다행인가 지금까지 우연히 규칙이 같았던 적은 없음.
  • 요새 잘 못하고 있는것.
    • 다른 사람의 코드와 문서를 읽는것 : 지금 사전설계에서 다른 분들꺼 PR에 어떤것들이 반영된건지 아직 못본것. 꼭 보자
      • 봤는가?

항목 10. 직교성

  • 결합도를 낮추고, 응집도를 높이는 것에 연결된 단어. 이런 특성을 가지면 직교적이다 할수 있다.
  • 좌표평면에서 동쪽으로 움직여도 y축 데이터가 변하지 안흔것도 일종의 직교성
  • 변화를 국소화해서 개발 테스트 시간 단축의 장점
  • 사전 설계의 경우? : 이것을 모듈화나, 클래스화에 녹여낼 수 있다고 생각.
  • 다른 팀원이 툴킷이나 라이브러리 도입할때 다른데 영향은 없을까? 이런 고민 필요
    • ex) 갑자기 spring boot 3.5 -> 4로 업글?
  • 버그 수정마다 태그 붙이기. ex) 지라 번호? 또는 이슈 번호로
    • 경향을 분석한 리포트
    • 각각의 수정이 수정된 파일 개수가 적다면? 또는 수정한 모듈의 개수가 적다면? 결합도 낮고, 응집도 좋다라고 평할수 있을듯
  • 연습 문제 1 관련. 진짜 이럴까? 이걸 난 잘 모르겠다.

항목 11. 가역성-

  • 가역성(可逆性, reversibility)은 어떤 과정이 진행된 후, 시스템과 주변이 초기 상태로 완전히 되돌아올 수 있는지의 여부를 나타내는 개념이다. 가능할 경우를 가역 과정(reversible process), 불가능한 경우를 비가역 과정(irreversible process)이라고 한다.

  • 결정이 돌에 새겨지는 것이라 가정하고, 발생할지도 모를 우연한 사건들에 대해 준비하지 않는 데에서 실수가 나온다.
  • 결정이 돌에 새겨진 것이 아니라 해변가의 모래위에 쓰인 글씨라 생각해 보자. 언제든지 큰 파도가 글씨를 지워버릴 수 있다.

최종 결정이란 없다.

항목 12. 예광탄

  • 요구 사항으로 부터 최종 시스템의 일부 측면까지 빨리, 눈에 보이게, 반복적으로 도달하게 해 줄 무엇인가를 찾아야한다.

  • 예광탄은 한번 쓰고 버리는 코드를 만드는것이 아니다. 75p

  • 모든 기능이 들어있지 않을 뿐 / 시스템을 구성하는 요소를 모두 연결해 놓은 후 목표물에 얼마나 근접했는지 확인할 수 있으며. 조정도 가능하다

  • 변경 요청과 기능 추가 요청은 언제나 게속 들어오기 마련이다. 76p

  • 예광탄 장점 : 1. 사용자가 뭔가 작동하는지 일찍 볼 수 있다. 2. 개발자가 들어가서 일할 수 있는 구조를 얻는다. 3. 통합 작업을 수행할 기반이 생긴다. 4.보여줄 것이 생긴다. 5.진행 상황에 대해 더 정확하게 감을 잡을 수 있다.

  • 예광탄 vs 프로토타입 : 예광탄은 기능은 없지만, 완결된 코드이며, 골격이다. 프로토타입은 예광탄을 발사전에 수행하는 정찰이나 정보 수집과 같다. 프로토타입은 쓰고 바로 버림.

  • 솔직히 예광탄을 정말 잘써야된다고 생각한다.

    • 코드까지는 한번 봐야할 설계나 작업이 있고, 그 작업에 이것을 하지 않으면 리스크가 상당히 크다.(불가능한데 우린는 무언가 하고 있지 않은가? 시간은 꽤 오래걸릴작업인데 시간 산정을 짧게 한건 아닐지)

항목 13. 프로토타입과 포스트잇

  • 절대적인 건 없고, 때로는 코드 대신 포스트잇이든 그림을 그려도 괜찮!

항목 14. 도메인 언어

  • 문제를 도메인에 가깝게 프로그래밍 하라
    • 메서드, 클래스, 변수에 도메인 용어를 넣는것도 방법 일듯
  • 동작하는 코드에 대해서 디자인빼고 파바박 보여지는 예광탄이 필요하고, 그것을 토대로 사업부랑 소통하자.
  • 외부 dsl(ex) html, sql) vs 내부 dsl(ex) gradle)

내부 DSL의 핵심 개념

Groovy의 문법은 그대로 사용 가능 - 변수 선언, 반복문, 조건문, 함수 등 Groovy의 모든 기능을 사용할 수 있습니다.

빌드 도메인에 특화된 API와 구조 추가 - Gradle이 제공하는 특별한 함수들과 컨벤션이 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Groovy 문법 그대로 사용
def myVersion = "1.0.0"
def list = [1, 2, 3]

// 하지만 Gradle이 제공하는 특별한 DSL 구조
plugins {  // Gradle이 제공하는 빌드 전용 블록
    id 'java'
}

dependencies {  // Gradle이 제공하는 의존성 관리 전용 블록
    implementation "org.springframework:spring-core:${myVersion}"
}

tasks.register('myTask') {  // Gradle의 Task API
    doLast {
        println "This is Groovy code in Gradle DSL"
    }
}

즉, Groovy라는 언어 위에 빌드 자동화 도메인에 특화된 API와 구조를 얹은 것이 Gradle DSL입니다. 이것이 내부 DSL의 정의 그 자체

항목 15. 추정

  • 질문자가 매우 높은 정확도의 답을 요구하는가, 아니면 단순히 큰 그림만을 요구하는가? 기간을 추정할 때 다음과 같은 단위를 사용하기를 추천한다.

    • 1~15일 : 일
    • 3~8주 : 주
    • 8~30주 : 달
    • 30주 이상 : 추정치를 말하기 전에 다시 한번 생각해 보라.
  • 추정 단계
    • 모델을 만들어라
    • 모델을 컴포넌트로 나누어라
    • 실행계획을 세울것.(이건 내생각)
    • 각 매개변수에 값주기
  • 추정치 기록과 분석

    • 여러분이 계산한 추정치를 기록해 놓고, 이 값이 실제 결과에 얼마나 가까운지를 평가해 보는 것은 좋은 생각이다.
    • 여러분은 추정치가 꽤 좋다는 것을 자주 발견할 것이고, 점차로 이를 기대하게 될 것이다.
    • 추정치가 잘못되었더라도 움츠리거나 도망가지 마라. 왜 여러분의 추측과 실제 값이 달라졌는지 원인을 찾아야 한다.
  • 추정치의 조정
    • 프로젝트 진행상황에 맞춰서 점증적으로 조정.
  • 나라면 “나중에 전화드릴께요” 라 말할 것이다.

Action Plan

  • 나는 추정에 대단히 관심이 많다.
  • 특히 내 업무에 대한 추정과 추정이 틀린 이유를 분석하고 싶긴하다.
  • 그래야 좀더 시간을 쏟아볼지, 말지를 결정할 수 있는것 같다.
  • 해볼것 : 한가지 업무에 대해서 스스로 데드라인과 추정치 만들고, 기록하고, 다르다면 원인 분석하는 글쓰기 하기.
This post is licensed under CC BY 4.0 by the author.