각종 후기/우아한테크코스

[우아한 테크코스 3기] LEVEL 2 회고 (71일차)

제이온 (Jayon) 2021. 4. 13.

안녕하세요? 제이온입니다.

 

짧은 방학이 끝나고 이제 레벨 2가 시작되었는데, 첫 날부터 미션을 진행하느라 정신이 없었습니다 ㅎㅎ..

 

 

스프링 입문 - 체스 미션 페어 프로그래밍

포비의 정신 교육(?)과 함께 개학식이 끝나고나서 곧바로 스프링 수업을 들었고, 스프링 입문 미션이 주어졌습니다.

 

 

 

 

그리고 1단계 미션은 위와 같이 기존의 각자 작성한 체스 소스코드를 합치는 것이었습니다. 제 페어인 검프와 만나기 전에 검프 코드를 보니까, 저와 비슷하게 Map을 이용하여 체스보드를 구현한 것을 확인하였습니다. 다행히, 중심 로직은 비슷하다고 판단하여 금방 하지 않을까 생각하였습니다.

 

 

점심을 먹고 오후 1시 30분 즈음에 검프를 만나서 잠실역 주변 카페에 갔습니다. 먼저, 친해지는 시간을 갖기 위하여 아이스 브레이킹을 진행하였고, 그 중에서도 검프의 인생썰을 흥미롭게 들었습니다. 검프는 2학년 2학기 중간 고사 전에, 자기가 하고 싶은 일인 연기를 하기 위하여 휴학을 하였습니다. 이후 연기를 하기 위하여 알바와 연기 학원을 병행하는 등 굉장히 고난을 겪었다는 것을 알게 되었습니다. 우여곡절 끝에 결국, 연기자로는 가지 않고 가족들에게 인정 받을 수 있고 안정적인 개발자를 택했다고 합니다.

 

검프의 말 중에서 가장 인상 깊었던 부분은 가족에게 행복한 감정을 느끼게 하기에도 시간이 부족한데, 가족들이 반대하는 길을 굳이 찾아가면서 상처를 주기 싫다고 한 점이었습니다. 저는 가족에게 잘 하고 있는지 다시 돌아보면서 반성하는 계기가 되었죠.

 

검프는 제리와 마찬가지로 인생을 파란만장하면서도 하고 싶은 일에 과감히 도전하였다는 점이 참 대단하다고 느꼈습니다. 제가 살 날이 많이 남았는데, 리스크를 빡세게 재면서 살기보다는 어느 정도 배짱을 가지고 살아가야겠다고 생각하였습니다.

 

 

한 3시까지는 이렇게 친해지는 시간을 보냈고, 이후에는 본격적으로 코드를 합의하는 과정에 들어갔습니다. 제가 위에서 설명한대로, 중심 로직이 비슷해서 금방 하리라 예상했지만, 생각한 것보다 굉장히 어려운 작업이었습니다. Map을 사용한 것만 같았고, 체스말이 위치 정보를 가진다던가, Board는 수동적인 역할을 한다던가, 이동 전략을 enum이 아닌 수많은 클래스화했다는 점 등이 달랐습니다. 그래서 서로의 코드를 리딩하면서 적절히 코드를 재사용하는 것이 난감했습니다.

 

이때 검프가 먼저 서로가 생각하는 부분을 이야기해 보자고 제안하였습니다. 첫 번째 쟁점은 '체스말이 위치 정보를 가져야 하는가?'였습니다. 저는 우리가 걸어가는 행위를 하기 위하여 적도 상의 위치 좌표값을 알고 있을 필요도 없고, 위치 정보를 갖게 되면 해당 객체는 가변 객체가 되는 것이 아니냐고 이야기하였습니다. 검프는 체스말이 위치 정보를 갖지 않으면, 단순히 누군가가 '체스말아, 너 A에서 B로 움직일 수 있니?'라고 물어볼 때만 Yes or No로 대답이 가능하고, 그마저도 체스말은 실제로 움직이지 않는 수동적인 객체가 된다고 말하였습니다.

 

검프의 이야기를 통해, 제가 짠 체스말은 수동적인 것을 인정하였습니다. 다만, 저는 체스말 자체를 불변 객체로 만들고 싶어서 검프의 주장을 수용하면서 Position은 final로 지정하자고 제안하였습니다. 즉, 체스말을 계속 할당하는 오버헤드를 감수하더라도 불변을 보장하자는 것이죠. 다행히, 검프도 원래부터 불변 객체를 원해서 오케이 사인을 냈습니다.

 

 

두 번째 쟁점은 '보드가 하는 일은 무엇일까?'입니다. 제가 작성한 보드는 체스말을 이동시키면서 source는 빈 공간 target은 source에 있던 체스말로 변경해 주는 작업을 하였습니다. 또한, 폰, 룩, 퀸, 비숍에 대해 해당 경로가 직선이고, 중간 경로의 기물이 있는지 확인하는 기능을 수행하였죠. 검프가 작성한 보드는 매우 심플합니다. 처음에 빈 공간으로 64개 세팅하고, 32개의 체스말이 지니고 있는 위치 정보를 보드에 주입만 해 줍니다. 제가 작성한 기능은 체스말 또는 체스말 일급 컬렉션에 존재하는 것이죠.

 

이 쟁점에 대해서는 서로의 기능을 적절히 합치기로 하였습니다. 우리는 체스말이 위치를 갖도록 하였기 때문에 보드에 체스말을 이동시키는 기능과 source와 target에 따라 map을 조작하는 기능을 제거하되, 해당 경로가 직선이고 중간 경로에 기물이 있는지 판단하는 기능은 살렸습니다. 또한, 보드 자체도 불변을 보장하기 위하여 체스말이 움직일 때마다 체스판을 새롭게 할당하자고 합의하였습니다.

 

이 부분은 어떻게 보면 메모리 상으로 오버헤드가 클 수 있습니다. 하지만, 검프와 저는 둘다 이번 기회에 극한으로 불변을 보장하자고 이야기하였습니다. 특히, 검프가 과거에 화를 내는 연기를 못해, 연기 학원 선생님이 검프가 화가 날때까지 뺨을 계속 때렸다는 일화를 이야기 해주면서 뭐든 극한으로 가야 중간 정도로 조절하는 법을 알게 된다고 말해 주었죠.

 

 

마지막 쟁점은 '이동 전략을 enum으로 할 것인가, 클래스화 할 것인가?'입니다. 저는 각종 방향에 대한 정보를 Direction이라는 하나의 enum에서 관리하였고, 검프는 방향 하나 하나를 클래스로 다 뽑아서 작성한 뒤, 이동 전략과 관련된 클래스를 만들었습니다. 저는 enum이 관리하기 편하다는 이점을 강조하였고, 검프는 public한 모든 방향을 관리하는 enum 클래스를 적절히 하지 않은 곳에서 사용하는 것은 위험하지 않냐는 의견을 제시하였습니다. 검프의 말은 일리가 있었고, 저는 새로운 방법을 적용하는 것을 즐겼기 때문에 이 부분도 수용하였습니다.

 

 

정리

이것을 끝으로, 저녁에 같이 직화제육을 먹고 헤어졌습니다. 비록, 오늘은 코드 한 줄 적지 않았지만 사고의 확장을 경험하였습니다. 내일은 오프라인인데, 데일리 미팅 이후 검프와 열심히 체스를 구현하려고 합니다.

댓글

추천 글