-
2장 실용주의 접근법독서/실용주의 프로그래머 2022. 3. 20. 22:38
TIL 요약
"코드는 부끄럼쟁이여야 한다."
"예광탄 사격도 시작이 좋아야 한다."
"두 번 이상 반복된 코드는 바꾸기가 힘들 것이다."
TIL 날짜
2022.03.20
오늘 읽은 범위
2장 - 실용주의 접근법
직교성
- 좋은 설계는 나쁜 설계보다 바꾸기 쉽다.
- Easy to Change (ETC)
- Don't Repeat Yourself (DRY)
- 두 번 이상 반복하지 마라.
- 코드는 부끄럼쟁이여야 한다. -> 불필요한 정보를 노출하지 마라
직교성에 대한 이야기를 정말 많이 이야기한다. 직교성을 풀어서 설명하자면 얼마나 독립적으로 이루어져 있는가 혹은 하나가 바뀌어도 다른 부분(모듈)에 얼마나 영향을 미치는가로 생각해 볼 수 있을 것 같다. 사실 회사에서 일을 하면서 아직 제대로 자바를 써보지 못했는데 얼마 전 새 프로젝트에 들어가게 되어 자바를 직접적으로 작성해보게 되었다. 학원에서 겨우 1주일 배운 자바라서 그런지 아직 모듈화, 캡슐화, 객체 지향의 장점처럼 자바의 특징을 아직 제대로 느껴보지는 못했다. 좀 더 사용해보면 알 수 있을 것이라 생각이 된다.
연습문제 1
파일에서 데이터를 읽는 클래스를 만들어야 한다. 한 번에 한 줄씩 읽어 들이고 각 줄은 여러 개의 필드로 쪼개야 한다. 의사 코드로 표현한 다음 두 클래스 중 어떤 것이 더 직교적인가?
# 1번 class Split1 { constructor(fileName) # 읽기 위해 파일을 열기 def readNextLine() # 다음 줄로 이동 def getField(n) # 현재 줄의 n번째 필드를 반환 } # 2번 class Split2 { constructor(line) # 한 줄을 쪼개기 def getField(n) # 현재 줄의 n번째 필드를 반환 }
직교성은 얼마나 모듈화가 되어 있느냐이기 때문에 언뜻 보기에는 2번 클래스가 사용하기 편해 보이지만 생성자가 하는 일이 여러 개다. 그래서 직교성은 1번이 더 괜찮다고 생각이 든다. 클래스 2번은 파일에 대한 접근과 파일을 열고 한 줄씩 읽고 쪼개는 행동까지 같이 하기 때문에 몰아놨다라는 느낌을 주게 만든다.
연습문제 2
객체 지향 언어와 함수형 언어의 직교성은 어떻게 다를까? 이런 차이가 언어 자체에 내재된 것일까 아니면 사람들이 언어를 사용하는 방법이 다른 것일까?
객체 지향이 추구하는 바는 다형성이라고 알고 있고 함수형 언어는 작성된 함수는 정해진 행동만 해야 하고 다른 함수에 영향을 미치지 않는다는 것이 특징이라고 알고 있다. 아직 뚜렷하게 객체 지향형 언어와 함수형 언어를 구분 지을 수 없지만 객체 지향형 언어는 얼마나 객체적으로 각각 독립되어 있는가이고 함수형 언어는 얼마나 외부 요인에 접근 없이 얼마나 순수한 함수인 가로 생각해볼 수 있을 것 같다. 이런 모양새는 언어에 따라 정해진다고는 생각하지 않는다. 구현하기 나름이라고 생각하기 때문이다. (속도나 프로그램 효율성을 제외하고.) 코드 작성법은 말 그대로 패러다임이기 때문에 어떤 전통 같은 요인에 의해서 사람들이 지금처럼 각 언어를 사용하는 것 같다. (그에 맞춰서 언어가 업데이트되는 경향도 있겠지만.)
개발법
이 위까지는 내가 직접 작성하는 코드에 대한 접근법이었다면 이다음부터의 내용은 작성한 코드를 어떻게 보여줘야 할지 빠른 작업 또는 빌드를 위해서, 개발자들을 위해서 프로젝트의 시작을 어떻게 해야 하는지 그리고 완성 전 사용자들에게 어떻게 보여줘야 하고 질문에는 어떻게 답을 해야 하는지에 대한 내용이 기술되어있다.
- 예광탄 개발법
- 요즘 회사에서 쓰는 방법으로 가장 단순한 로직으로 시작에서 배포까지 단 한 가지의 로직 또는 말 그대로 굴러만 가는 완성본을 만드는 것이다.
- 일단 쏴보고 천천히 과녁의 중심으로 이동하는 개발법이라 생각하면 편할 것 같다. 조심해야 할 점은 첫 한방이 너무 크게 빗나가면 안 된다는 점이다.
- 이 방법의 장점은 사용자가 꽤 빠르게 사용을 해볼 수 있다는 점이다. 물론 모든 기능을 사용할 수는 없지만 사용자 입장에서는 좋은 이미지를 가질 수 있을 것 같고 개발자 측면에서는 피드백을 빠르게 받아 개발을 진행하는 도중 사용자의 요청을 해소할 수도 있을 것이다.
- 프로토타입 개발법
- 말 그대로 프로토 타입을 만들어 보는 것이다.
- 직접적인 개발이 될 필요는 없을 것이고 자동차 디자이너가 3D 작업으로 모델을 만들거나 나무로 목업을 만드는 경우처럼 개발해야 하는 제품을 그런 식으로 먼저 그려보는 것이다.
- 요점은 선을 넘지 말아야 한다는 것이다. 매력적으로 보이는 3D 모델링은 사용자로 하여금 무지개 빛을 떠오르게 만들 수 있기 때문이다.
- 빠르게 그려볼 수 있는 만큼 프로토타입 개발법에서 얻을 수 있는 유리함은 가상으로라도 위험 요소에 미리 부딪혀 볼 수 있다는 점이다. 예를 들면 외부에서 가져오는 도구나 라이브러리, 성능적인 측면 혹은 새로 추가되어야 할 기능 같은 것들이 될 것이다.
- 그리고 프로토타입 때 개발되었던 것들은 사용되지 않을 수도, 모두 폐기가 될 수도 있음을 모두가 알아야 한다.
연습문제 3
마케팅 부서는 여러분과 함께 웹 페이지 디자인 몇 개를 브레인스토밍 하고 싶어 한다. 마케팅 부서에서 생각하는 방식은 클릭할 수 있는 이미지 맵을 만들어서 다른 페이지들을 연결하는 방식이다. 하지만 어떤 이미지를 사용할지는 아직 결정하지 못했다. 자동차 사진일 수도 있고 전화기 혹은 집일 수도 있다. 클릭하면 이동할 페이지 목록과 내용을 받았는데 마케팅 팁은 프로토타입을 몇 개 보고 싶어 한다. 잠깐, 준비할 시간은 15분밖에 없다. 여러분은 어떤 도구를 사용하겠는가?
마케팅 부서는 완성품이 아니라 브레인스토밍 하고 싶어 하기 때문에 준비해야 할 것은 프레젠테이션 할 수 있는 태블릿 하나면 된다고 생각한다. 더불어서 예상되는 이미지를 빠르게 몇 개 준비하는 걸로도 충분할 것이라 생각한다.
도메인 언어
도메인 언어가 뭔지 몰라 찾아보니 개발자가 아닌 사람과 소통을 수월하게 도와주는 언어라고 한다. 작성하는 사람의 대상이 비 개발자라고 하니까 더 쉽게 감이 왔다. 내부 언어와 외부 언어가 있는데 내부 언어는 개발 때 사용하는 프로그래밍 언어와 비슷하게 작성된다고 한다.
연습문제 4
간단한 터틀 그래픽 시스템을 제어하기 위해 소형 언어를 하나 구현하려 한다. 이 언어는 한 글자짜리 명령어들로 구성되는데, 어떤 명령어는 뒤에 한자리 숫자가 따라 나올 수도 있다. 예를 들어 다음 내용을 입력하면 사각형이 하나 그려진다.
P 2 # 2번 펜 선택
D
W 2
N 1
E 2
S 1
U
public class DrawRectangle{ public static void main(String[] args){} DrawRectangle drawRectangle = new DrawRectangle(); // 입력을 줄 단위로 파싱하여 DrawRectangle를 사용하면 될 것 같다. } } public class DrawRectangle { public void selectPen(int penNumber){} public void onPen(){} public void offPen(){} public void moveWest(int move){} public void moveEest(int move){} public void moveSouth(int move){} public void moveNorth(int move){} }
연습문제 5
앞 문제에서 우리는 외부 도메인 언어인 그리기 언어용 파서를 구현했다. 이번에는 내부 언어로 다시 구현해 보자. 기발한 발상을 떠올릴 필요 없다. 그냥 명령어마다 함수를 만들면 된다. 어쩌면 명령어를 소문자로 바꿔야 할 수도 있고 문맥 정보를 전달하기 위하여 명령어를 무언가로 감싸야 할 수도 있다.
위의 풀이에서 DrawRectangle이 가지고 있는 함수를 그대로 사용하여 작성하면 될 것 같다.
연습문제 6
시간 표현을 파싱 하는 BNF 문법을 하나 설계하라. 다음의 예를 모두 파싱 할 수 있어야 한다.
4pm, 7:38 pm, 23:42, 3:16, 3:16 am(시간이 없어 답안지를 참고함)
<time> ::= <hour><ampm>|<hour>:<minute><ampm>|<hour>:<minute> <ampm> ::= am|pm <hour> ::= <digit>|<digit><digit> <digit> ::= 0|1|2|3|4|5|6|7|8|9 <hour> ::= <h-tens>|<digit><digit> <minute> ::= <m-tens><digit> <h-tens> ::= 0|1|2 <m-tens> ::= 0|1|2|3|4|5 <digit> ::= 0|1|2|3|4|5|6|7|8|9
연습문제 7
앞서 작성한 파서를 원하는 언어의 PEG 파서 생성기를 사용하여 구현하라. 파서는 자정 이후로 몇 분이나 지났는지를 나타내는 정수를 반환하면 된다.
(skip)
연습문제 8
시간 표현 파서를 이번에는 스크립트 언어와 정규 표현식을 이용해서 구현하라.
(skip)
추정
개발이나 어떤 일을 하면서 자주 듣는 말이
"언제쯤 결과를 받을 수 있을까요?"
혹은
"얼마나 걸릴까요?"
처럼 범위를 가늠해야 하는 신경을 곤두세워야 하는 질문들이다. 자칫 잘못 이야기했다가 실망감을 안겨줄 수도 있기 때문이다. 책에서 추정은 상대방이 듣기 곤란하지 않게, 인지가 쉬운 시간의 단위를 사용해서 설명을 해야 한다고 이야기한다. 심지어 확실한 선을 그어 예시를 들어주기도 했다.
1 ~ 15일은 일 단위로 3 ~ 6주는 주 단위로 8 ~ 20주는 달로 구분지어서 이야기를 하면 좋다고 이야기한다. 또 프로젝트를 시작한 뒤 스스로가 도착선까지의 시간을 추정해보고 실제로 비교를 해본다면 얻는 것이 많을 것이라고도 두 번 정도 덧붙여주었다.
연습문제 9
다음과 같은 질문을 받았다고 하자. "어느 쪽의 대역폭이 더 넓을까? 1 Gbps 네트워크 연결과 1TB 저장 장치를 주머니에 넣고 두 컴퓨터 사이를 왔다 갔다 하는 사람 중에서?" 여러분의 대답이 의미가 있으려면 어떤 제약 조건을 달아야 할까? (예를 들어, "저장 장치에 접근하기 위해 필요한 시간은 무시한다면" 같이 조건을 달 수 있다. )
- 저장 장치의 종류가 HDD이냐 SDD이냐.
- 두 컴퓨터 사이의 거리가 얼마인가?
- 각 컴퓨터는 USB 3.0을 지원하는가?
연습문제 10
그래서 어느 쪽이 대역폭이 넓은가?
1 Gbps는 네트워크 문제가 없다면 대략 초당 128메가바이트를 전송할 수 있다. 만약 똑같이 1TB를 이동해야 한다고 했을 시 저장 장치의 종류에 따라 달라지게 되는데 저장 장치가 SSD이고 USB 3.0을 두 컴퓨터가 지원한다면 이때 속도는 5 Gbps가 나오기 때문에 주머니를 사용하는 것이 훨씬 빠르다.
728x90반응형LIST'독서 > 실용주의 프로그래머' 카테고리의 다른 글
4장 실용주의 편집증 (0) 2022.03.24 3장 개발도구 (0) 2022.03.23 다른 사람 들어보기 (0) 2022.03.22 1장 실용주의 철학 (0) 2022.03.19 시작 (0) 2022.03.18