January 08, 2023
동료들과 실용주의 프로그래머라는 책을 같이 읽고 있습니다. 공부하면서 정리한 내용을 블로그에도 남겨볼까 합니다. 아직 못 읽은 부분은 계속 업데이트하려고 합니다.
새로운 아이디어에 전력투구하기 전에 먼저 아이디어를 검증하고 피드백을 받아 보는 것이 매우 중요하다.
좋은 설계는 나쁜 설계보다 바꾸기 쉽다.
ETC(Easier to Change)
‘내가 방금 한 일이 전체 시스템을 바꾸기 쉽게 만들었을까, 어렵게 만들었을까?’
→ 파일 저장, 테스트 작성, 버그 수정시에 물어보기
코드의 결합도를 낮추고 응집도를 높인다.
컴포넌트 개발할 때 신경쓰고 있지만 정말 어렵다. 버튼 등 간단한 컴포넌트는 원칙을 지키기 비교적 쉬우나, 여러 개의 컴포넌트를 같이 쓰는 등의 컴포넌트는 결합도가 높으면 사용하기는 쉬워지나, 유지보수가 안 좋음. 디자인 시스템을 개발할 때 처음에는 바뀔일이 없던 컴포넌트도 나중에는 바뀌기 시작하고, 그래서 컴포넌트를 미리 넣어놓기 보다는 위치 정도만 잡아두고, 사용할 때 그 위치에 컴포넌트를 넣는 식으로 구현
FileWatcher는 컴파일러 같은건 할 수 있는데 메시지 띄우는건 못할 듯.
모든 지식은 시스템 내에서 단 한 번만, 애매하지 않고, 권위 있게 표현되어야 한다.
주석을 달기 전에 먼저 코드에 의도를 드러낼 것.
모듈이 자료 구조를 노출하면 언제나 모듈의 구현과 그 자료 구조를 사용하는 코드 사이에 결합이 생긴다. 가능하다면 언제나 객체의 속성을 읽고 쓸 때 접근자 함수를 사용할 것.
개발자 간의 중복 → 적극적이고 빈번한 소통
개발자 간의 중복은 엄청 공감됨. 이번에 만든 기능이 다른 분이 먼저 개발했었던 경우가 많음. 이런걸 찾기가 굉장히 힘듦. 그래서 요즘에는 다른 분들에게 먼저 물어보고 시작함.
하나가 바뀌어도 나머지에 어떤 영향도 주지 않으면 서로 직교한다.
우리가 설계하고 싶은 것은 자족적인(단일하고 잘 정의된 목적을 가진) 독립적인 컴포넌트
직교적인 컴포넌트들을 결합함으로써 단위 노력당 더 많은 기능을 얻을 수 있다.(M x N)
‘특정 기능에 대한 요구 사항을 대폭 변경하는 경우 몇 개의 모듈이 영향을 받는가?’ → 한개여야 한다.
불필요한 것은 다른 모듈에 보여 주지 않으며, 다른 모듈의 구현에 의존하지 않는 코드를 작성할 것.(shy)
직교적으로 설계하고 구현한 시스템 → 테스트하기 더 쉽다
모듈 수준의 테스트나 단위 테스트가 통합 테스트보다 테스트 케이스를 만들고 수행하기 훨씬 쉽다.
단위 테스트를 작성하는 행위는 직교성을 테스트해 볼 수 있는 기회
되돌릴 수 없는 결정을 최대한 줄인다. → 우리의 선택은 최선이 아닐 수 있다.
새로운 프로젝트의 백엔드 서버(파일 업로드가 있는)를 람다로 올렸다가 request size 제한이 있다는 걸 알아서 옮겼던 기억이…
컴포넌트 설계할 때도 어렵다. 어느 정도의 미래까지 대비해야 할지
요구 사항으로부터 최종 시스템의 일부 측면까지 빨리, 눈에 보이게, 반복적으로 도달하게 해 줄 무언가가 있어야 한다.
요구 사항에서 의문이 드는 부분
이나 가장 위험이 커 보이는 곳
의 코드를 가장 먼저 작성
시스템을 구성하는 요소를 모두 연결해 놓은 후라면 목표물에 얼마나 근접했는지 확인할 수 있고, 조정이 가능하다.
목표물에 맞을 때까지 조준을 옮겨야 한다.
한 사이클을 한 기능에서 쭉 돌아보는 방식. 배포 환경에서 발견되는 문제점을 미리 발견할 수 있음. 가장 큰 위험 요소를 빨리 파악할수록 고치는데 필요한 비용은 줄어든다고 생각.
프로토타입은 위험 요소를 분석하고 노출 시킨 후, 매우 저렴한 비용
으로 바로잡을 기회를 얻는 것
당장 중요하지 않은 세부 사항이라면 일단 무시하면서 코딩할 수 있다.
프로토타이핑의 대상은 위험을 수반하는 모든 것
→ 이를 통해 배우는 교훈
이 가치가 있다.
각 모듈이 실행 중에 필요한 데이터에 접근할 수 있는 경로를 갖고 있는지
모듈에 데이터가 필요한 시점에 데이터 접근이 가능한지
프론트 단에는 데이터 별로 필요한 시점이 있는데 개발하다 보면 필요한데 아직 못 불러오거나 하는 경우가 있음.
이번에 게시판에 대댓글을 추가하는데 (댓글까지 있었음) 저와 백엔드 개발자님은 현재 디비로 충분히 대댓글까지 커버할 수 있을거라고 생각했었는데, 만들고보니 현재 구조에서는 따로 분리하는 편이 더 나을 거 같다는 판단을 함.
이것도 UI를 만들어놓고 api 연동을 했었는데, UI는 텍스트만 나와도 되니까 api 연동을 맨 먼저 해보는 것이 어땠을까 하는 생각이 듦.
프로토타입을 코드로 만들 때는 시작하기 전에 항상 모든 사람에게 폐기 처분할 코드임을 밝혀야 한다.
GUI 환경의 기능은 설계자가 의도한 범위를 넘어설 수 없다.
도커로 서버를 켜는 명령어는 만들어놓고 유용하게 쓰고 있다. 하지만 그 이상의 활용은 못 해봄.
셸을 사용할 일이 많이 없어서 와닿지는 않지만 저자의 의도는 알겠음.
유창해지는 것의 가장 큰 이점은 사용법을 생각하지 않아도 된다는 것. 속도가 빨라지면 이점이 있음
트랙패드없이 작업을 해봐야겠다. 분명히 생산성 향상에 큰 도움이 될 거 같다.
프론트는 사용자의 환경이 매우 다양하다. 값을 참조하는 것도 그 구문을 실제로 호출하는 시점에 따라 에러가 날 수 있음.
기본적인 도구만으로는 해내기 힘든 종류의 변환 작업이 있을 수 있고, 이를 위해 텍스트 처리 도구가 필요하다. ex) json -> yaml 변환기
파일이나 위키말고 종이를 사용해볼 것
개발자는 노트북에 적는게 편하겠지만 항상 들고 다닐 수 있는가? 라고 물어본다면 No인 거 같다.