- HTML 문서 가져오는 클래스 (Spider) 작성
- HTML Parsing
- 도서관 검색 결과 Object 로 추출, 다시 HTML 생성.
오늘 무엇을 할 것인가 하며
ProjectPrometheus/Iteration 를 보고선 HTML Parsing 을 진행하기로 했다. 그 전에
1002 는 '아, 작업하기 전에 Book Search 에 대한 전반적인 그림을 그려 놓는게 좋겠군. 그리고 난 뒤 HTML Parsing 부분에 대해 구현해야지' 라고 생각을 했다. 한편
neocoin 은 수요일때와 마찬가지로 'HTML Parsing 부분에 대해 일단은
SpikeSolution 으로 만든뒤 모듈화 시켜나가야지' 라는 생각을 했다. 프로그래밍 스타일이 다른 두 사람이 진행 방법에 대한 언급없이 진행을 하려고 했다.
1002 는 '아 전체 그림' 하며 CRC 세션을 하려고 하는 중간. 한편
neocoin 은 같이 진행하고 있는 CRC 세션에 중간에 대해서 '지금 서로 무엇을 하고 있는거지?' 하며 혼란에 빠졌다. 똑같은 디자인 단계에 대해서
1002 는 전반적 Book Search 에 대해 생각을 하고 있었고,
neocoin 은 모듈과 모듈간 연결고리에 대해 생각을 하였다.
중간에 상민은 메모장을 열었고 ..... 부분에 대해 코드를 적었다.
그리고
1002는 다음과 같이 Java Pseudo code 를 적었다.
~cpp
BookSearcher bs = new BookSearcher();
bs.search(keyword);
bookList = bs.getSearchedBookList();
30-40분간의 서로간의 혼란과 싸움(?)끝에 서로 무엇을 위해 어떻게 일을 하려고 했는지에 대해서 이야기를 했고, 결국 서로 접근 스타일이 달랐으며, 서로 자기가 하려고 하는 일에 대한 의도를 밝히지 않고 '당연히 서로 알고 있는 듯' 일을 시작한 것임을 알게 되었다. 서로를 잘 알고 있다고 생각했기에 오히려 빠지기 쉬운 문제이라 생각된다.
암튼, 이후 다시 코드 구축 방법에 대해서 일단 이야기를 하였고, (여기서는 일단 서로 합의하에
1002 스타일 식으로 진행했다. 해당 클래스가 이용되어지는 모습을 먼저 생각하고, 시나리오에 따른 코드의 뼈대를 만들어가는 방식) 그 이후로는 오히려 진행이 빨라졌다.
잘 되지 않은 부분은 다음에 대한 시나리오인데,
Client (클래스 이용자) 는 Library 에게 keyword 를 던지며 검색을 요청하면, Library는 그 keyword를 이용, 검색하여 Client 에게 돌려준다.
하지만, 실제로 Library 내부에서는 많은 일들이 작동한다. 즉, keyword 를 해당 HTTP에서 GET/POST 스타일로 바꿔줘야 하고 (일종의 Adapter), 이를
HttpSpider 에게 넘겨주고 그 결과를 파싱하여 객체로 만든 뒤 Client 에게 돌려줘야 한다.
즉, RDD 를 위한 CRC 세션중 계속 그 클래스들의 추상화 정도를 놓고 서로 클래스들을 추출해내는데 어려움을 겪었다. ('용어는 어느정도 추상화를 시켜야 할 것인가?', '내부 구현 시스템이 가급적이면 드러나지 않는 것이 일반적으로 좋은 디자인이라고 하는것 같은데 막상 우리가
BottomUp 을 하여 뽑아낸 디자인엔 이미 이름이 '
HttpSpider' 등 이고..' 등등)
어떻게 보면 또 둘 간의 무의식적인 'Design Evaluation' 에 대한 강박관념이 아니였을까 하는 생각도 해본다. (일종의
PairPressure 일지도;) --
1002
CRC가 잘 추출되지 않을때는 차라리
UserStory를 따라가면서 클래스를 만들고, 거기에서 다시 CRC를 생각해 보는 방법이 시간 절약에 현명할 것이라고 생각된다. 객체 지향 의 프로그래밍을 추구해온 결과, Scenario나,
UserStory를 따라가며 코딩하면서 수많은 클래스들이 책임에 따라서 생겨나는 것을 보면서 자연 스러움과, 약간 의아함 마져 들었다.
왜냐면, 데블스 캠프 금요일 시간이 끝나고 나서 7층에서 석천이와
UserStory를 따라가며 만들어진
RandomWalk2 CRC의 모습에서는 단 3개만의 클래스만이 존재하였다. 하지만,
UserStory를 따라가면서 소스 수준의 코딩을 하면 더 많은 클래스로 분화할것을 기대한다. 즉, 코딩을 하면 어쩔수없이 Layer의 최 하위까지 내려갈수 밖에 없으리라고 본다. 자 그럼 문제는 레이어 일것이다. 다행히 현재 코딩된 부분은 전부 logic의 부분으로 취급하고 있지만, logic 내에서 다시 레이어로 나뉘어서 외부에서 접근할수 있는 인자와 없는 인자로 나뉘어 져야 할것이다. 여기서 잠시 기억되는 말
ObjectWorld 의 전 세미나에서 아키텍트 설계자는(Architector) 소스를 가지고 디자인을 생각하는 사람이 아니라, 디자인(스펙으로 제시된)을 보고 디자인(자신의 회사에 맞는)을 만들수 있는 능력을 가진 사람이라고 말하였다.
우리가 처음 망설이던 부분의 CRC가 그런 케이스라고 생각된다. 소스 까지 접근하지 않은체, Layer-Tier를 생각하면서 책임을 부여할때, 나가지 않는 진도에 답답해 하며 꺼낸 메모장이 재미있는 결과를 가져다 주었다. 다음 같은 상황이 되면 스트레스는 훨씬 줄어 들것으로 생각한다.
메모장을 쓰면서 접근 방법이 아에 달랐다는것도 수면위로 올라오긴 했으니; --1002
마지막으로 석천이의 의견이 먼저 올라오길 기다린 나는 나쁜넘이다. 흐흐흐
--
상민
- UserStory 와 사용자 시나리오를 혼용해서 쓴 것 같은데, UserStory Page 를 참조.
- UserStory 와 Scenario 일부러 혼용해서 썼다. 실제로 우리는 둘다 이용했다고 생각하기 때문에 특별히 구분할 생각을 안했음 --상민
- '일부러' 인가. 구현부분이 '무엇을 하고 있나' 에 대해 '이 Story를 하고 있다' 라고는 이야기할 수 있어도, 우리가 실제 coding 할때 이용한건 User Scenario 에 맞춘것임. UserStory 는 말 그대로 'Target' 일 뿐이라 생각하는데. 어떻게 '이용' 했지? --1002
- 소스 수준 코딩시 더 많은 클래스들이 분화되는 이유는 CRC 중 클래스와 클래스 간 대화를 할때 넘기는 객체를 따로 표시하지 않으니까. (우리가 7층에서의 RandomWalk2 보면 Class 와 Class 간 대화를 위한 클래스가 4개쯤 더 있음)
- 4개를 어떻게 구현할지 생각 안한것으로도 이미 class의 추출은 3개라고 생각함. 그렇지 않고 소스 수준이라면 전부 다 추출하고 그렇지 않을건 다른 방식으로 했겠지. --상민
- 그렇다면 3개의 클래스는 구현수준으로 까지 내려왔던가? 어차피 parameter 로 나온 클래스 4개나 우리가 '책임을 맡았다' 라고 하는 클래스 3개나 그 표현수준은 똑같다고 생각하는데. --1002
- 그리고 'Layer' 의 뜻이 모호하긴 하군. 'Abstract Layer', 디자인에 대한 추상화 정도를 이야기하시는것임? (문맥상 일단 그렇게 해석하는중)
- 자칫 RDD 에서의 그 세부클래스들에 대해서 너무 많이 생각하면 BUFD(Big Up-Front Design) 이 되리라 생각한다. 차라리 Class 가 2개였을때 코딩 들어가고, 20-30분 정도 코딩뒤 Refactoring 을 의식적으로 하여 Big Class 에 대해 Extract Class 를 추구하는게 더 빠르지 않았을까.
- TestDrivenDevelopment 의 경우를 추구했다면 어떠했을까. TDD 의 특성상 꼭 필요한 메소드들만 있는 단순한 디자인을 유도한다라는 점에서. 이번의 경우도 Scenario 를 생각하여 프로그램 뼈대를 만들어서인지 주 Interface가 되는 메소드들외에 불필요한 메소드는 적었긴 한데, 그 대신, 신기하리만치 처음 짠 시나리오가 완벽하게 먹히었다란 생각도 든다;
- 시나리오가 주요 한것에 동의, 신기하다는 느낌 비슷 -- 상민
- 박성운씨라면 SeparationOfConcerns 를 늘 언급하시는 분이니; 디자인 정책과 구현부분에 대한 분리에 대해선 저번 저 논문이 언급되었을때 장점에 대해 설명을 들었으니까. 이는 ResponsibilityDrivenDesign 과 해당 모듈 이름을 지을때의 추상화 정도가 지켜줄 수 있을 것이란 막연한 생각중.
- See KissPrinciple
- 나도 ps. 반문하기가 보통은 더 쉽다; (메모장에 글쓴거 이야기하는거 아님. '마지막으로' 를 'ps.' 대신 쓴 것일 뿐임) --1002
- 아직도 내가 메모장을 핀걸 가지고 가진 생각을 오해하는거 같은데 이해가 안간다. 같은 이야기를 정말 많이 한거 같은데 절반 정도 의도 전달이 된듯 하다. 남은 절반은 여백의 미 --상민
- 말로 걸러지고 글로 걸러지고 하루 지나서 기억력으로 걸러진 데이터는 '손실' 이겠지. 위의 '......' 부분은 그때 이야기했었던 자세한 대화내용이 기억이 안나서 그냥 저렇게 쓴 것일 뿐인데. 오해했다고 생각한다면 그 부족한 기억을 채워주면 안되나. --1002