code review from Archive

Posted by Young Han Lee on April 13, 2014 · 7 mins read

Code Review 교육을 들으면서

원래 교육을 듣는 취지는..

올해의 첫 교육을 들었다. 작년과 달리 (작년에는 상반기에 있는 교육을 말도 안되는 이유로 못가고, 하반기에는 일에 치어서 못가고) 상반기 교육을 듣게 되었다.
소속 팀이 변경된 점이 가장 크지 않을까 생각한다. 작년에는 정말 말도 안되게 작은 데모 가지고 못갔는데...
올해의 목표 중에 하나를 프로그래밍 스킬 향상에 두었기 때문에 교육도 관련 교육으로 채웠다.
사실 전공과 관련된 것은 거의 세미나 형식밖에는 안되고, 그걸로 현업에 크게 도움도 안되서 전공 외의 축을 만들었다.
남들은, 프로그래밍은 어짜피 그거 잘하는 사람들이 하면 되고, 너는 이론이나 신경쓰라고 하지만…
그렇게 하기에 주변에 프로그래밍 잘하는 사람이 존재하는 것도 아니라서;;;; (그런 이야기를 할 때는 적어도 그런 지원이 많던가..ㅎㅎ)
그리하여 프로그래밍 교육을 받으러 갔다. 그것도 코드 리뷰.. 사실 말로만 들으면 코드 리뷰는 특별한게 하나도 없다. 코드 적용하기 전에 리뷰를 잘 보자. 그래야 코드도 좀 정리가 되고 버그도 없지 않겠냐는..
지극히 당연한 이야기지만, 지극히 지켜지지 않는 부분에 대한 교육이었다.

생각보다 얻는게 많았던 교육

교육은 왜 코드 리뷰를 해야하는가 부터 시작해서 실제 코드 리뷰 사례
코드 리뷰 시스템등에 대한 소개가 있었다. 처음에는 익숙한 이야기들이었지만, 뒤로 갈수록 실습이 많아서 좋았다.
몇몇 분들은 교육을 쉬는 시간으로 여기지만 그러지 못하도록 실습이 있는 것이 얼마나 좋았는지..
관련된 내용으로 2개의 실습이 있었다.

  1. 짝 프로그래밍
    짝 프로그래밍은 두 명이서 페어가 되어, 한 명은 드라이버, 한 명은 네비게이터가 되어서 문제를 해결하는 것인데,
    시간을 정해놓고 역할을 바꿔가면서 진행을 했다. 문제는 스파이럴 박스…그림이 durl 처럼 숫자를 배열할 예정인데,
    좌측상단에서부터 시작을 하며 1부터 숫자를 증가시키면서 주어진 박스 사이즈에 맞게끔 만들면 된다. 여기에 추가로 X라는 포인트들이 주어지는데, 이 점은 만나면 방향을 시계방향으로 꺾어서 진행하는 것으로 제약한다.
    뭐 말로 하니까 역시 쉽지 않군..
    암튼, 방향 설정과, 갈 수 있는데까지 가보기, 두개를 묶어서 재귀로 돌렸다. 문제는 이 것을 두 명이 공유를 하면서
    코딩을 해야 하는데, 같이 짝이 된 분은 이런 프로그래밍이 익숙치 않은 분이어서, 생각을 공유하는데 많은 시간이 걸렸다.
  2. 팀 프로젝트
    팀 프로젝트로는 워드 카운트를 짜는 거였다. 8천라인의 영어 소설이 주어지고, 이를 알아서 파싱해서
    알아서 카운트 하고 알아서 출력까지…1초 안에
    이번에는 짝 프로그래밍을 했던 페어 2개를 묶어서 팀으로 만들었다. git/gerrit 연습을 위해서 진행한 프로젝트긴 한데, 뭐 머지할 때, 생각해서 업무를 나누었다.
    우선 입출력 / 저장하는 부분…가만..입력이야 워드 단위로 받는다 하더라도 출력하는 부분은
    저장할 때 자료구조를 어떤 것을 쓰느냐에 따라서 다르겠구나? 그럼 이것도 저장하는 부분에서 잡아줘야겠네..
    그래서 약간 불균등하게 업무 배분이 되었지만, 입력 / 저장, 출력으로 나뉘었다.
    당연히 나는 저장, 출력 부분…을 맡았다. 아무도 안맡으려고 한 것도 있고;;
    딱히 어려울 것 같지도 않아서…
    어라? STL을 쓰면 안된다고?;; 이러면 이야기가 달라지는데… 1초 안에 나오려면 계산량을 막쓰면 안되겠다는 생각이 들었다. 다행히 강사가 힌트를 준다.
    자료 구조는 다이나믹 어레이나, 링크드 리스트, 바이너리 트리 중에 써보세요
    음.. 다이나믹 어레이는 신규 단어 저장하는데는 O(1)이 들겠지만, 기존 단어는 O(n)이 들겠군.
    링크드 리스트도 마찬가지일테고…
    바이너리 트리는 둘다..O(logn)이면 되겠구나. 출력할 때 더 귀찮아 지겠지만..
    ㅇㅋ 바이너리 트리로 선택.
    덕분에 바이너리 트리를 한번 짰다.;;;전자과에서는 절대 구경도 할 일이 없었던 내용을..
    암튼, 자료구조형을 정하고 나니, 훨씬 후월하게 작업이 되었다. 사실 바이너리 트리 구조였기 때문에
    기존에 있는 단어인지를 확인 하면서 없으면 바로 추가가 가능했기 때문에 코드가 더 간결해졌다.
    확실히 머리속에서 복잡해지면 코드로는 간결해질 수 있는 것 같다. 암튼, 다른 자료구조를 선택한 팀보다는 일찍 끝낼 수 있었고, 덕분에 순위권.

실습 외에도 git / gerrit을 사용해볼 수 있었던 점이 개인적으론 좋았다. git의 경우 예전에 libav할 때 다뤄봤는데,
회사에서는 svn만 쓰고 있어서 개인적으로 쓰는 것 외에는 사용할 일이 없었다. 다른 사업부에서는 사용하고 있다곤 하는데,
왜 이렇게 전파가 느린건지 우린 아직도 svn..ㅎㅎ gerrit도 구경할 일이 없고 말이다.
다행히 연구소 품질 파트에서 git 전환 유도를 위해 신청한 과제에 대해 git/gerrit을 설치해주는데, 미리 신청해서 받아만 놓고 잘 사용하지 못하고 있었다. 사용법도 모르고 ㅠ.ㅠ.
그런데 이번에 실습을 하면서 git/gerrit을 다뤄봐서 좋았다. 개인적으로는….이 것만 따로 만들어서 동영상 강의를 올려도 좋을 것 같은데,
내 욕심일려나….

그리고 손코딩으로 얻은 점을 확인할 수 있었던 교육

교육에 오신 분들은 다 그렇듯이, 신입에서부터 지긋한 분까지…다양한 계층이 모인다.
물론 다 개발자 트랙을 타고 있는 분들이 나타나시는데, (나도 그랬듯이) 본인의 생각들을
코드로 내려놓는데 어려움을 많이 겪는다. 가장 힘들어 했으면서 공감했던 부분은 뭔가 꼬리는 잡았는데,
머리 속에서 풀어내지 못하면서 돌고 도는 것이다.

이걸 이용해서 어떻게 해보면 될 것 같은데..

문제는 어떻게가 머리 속에서 풀리려면 연습이 필요하고, 이걸 쉽게 끄집에 내는 것이
손코딩이었던 것 같다. 이번에도 2개의 문제를 접하면서 내 생각도 정리할 겸, 같이 하는 분에게 전달도 할 겸,
연습장에 슥 슥 써 나갔던 부분이 크게 도움이 되었다. 문제를 받고 내가 생각하는 방향이 잡혔음에도 우선은
같이 하는 분의 생각을 확인하고자 의견을 이야기하지 않고 있었는데, 이러한 내용을 밖으로 끄집어 내는 것이 쉽지 않으셨던 모양.. 틀리면 어떻게 하지라는 불안감도 있겠지만, (사실 이건 손코딩으로 많이 내려놓게 되었다. 쓰다보면 틀린 것 투성이라서..ㅎㅎ) 아무래도 코딩은 키보드로 하는 것이지 손으로 하는 것이 아니라는 관념 때문에,
펜과 종이 앞에서는 시간이 멈춘 듯한 광경을 많이 보았다. 우리 뿐만 아니라, 다른 팀에서도….

그럼에도 아직 갈 길이 멀었다는 생각이…

몇 번의 손코딩을 참여하면서 이런 부분은 확실히 늘었다고 단언할 수 있다.
예전 같았으면 나도 그냥 어떻게 하지…손 놓고 있다가 시간만 흘렀을테니까 말이다.
또는 되지도 않는 접근법으로 우선 IDE만 만지작 거리고 있었을 것이다. 생각해보면 짧은 시간동안 많이 늘었다. 그럼에도 아직 멀었다는 생각이 든 점은
팀 프로젝트에서 강사의 힌트가 없었다면 난, 바이너리 트리 방식으로 접근을 했을까 하는 점이다.
그도 그럴 것이 바이너리 트리 저장 구조를 이번에 처음;;; 들었다. 자료 구조도 들어본 적이 없으니까;;;
STL로 가져다 썼으면 썼지..딱히;;
이런 것들은 협업에 충분히 적용이 가능한 부분인데, 이제 알았다는 것이 아쉬웠고,
실제 STL로 가져다 쓰는 것 외에도 내부를 알 필요가 있다는 것을 강하게 느끼는 기회였다.
요즘 C++을 해보자고 겉 멋들어 있었는데, 다시 낮은 레벨로 갈 수 있는 전환점이 되었다.

기타

아, 정말 이번 교육은 강사님들이 정말 좋았다. 내용도 내용이지만, 강사분 두분의 성격이 너무 좋았다.
아니, 좋아보였다. (또 저 뒤에 어떤 모습이 숨어 있을지는 모르겠지만 ㅋㅋ) 만약 안에 숨은 모습이 무섭더라도
겉에 모습이 저 정도라면 같이 일 해보고 싶다는 생각이 들 정도였으니 말이다.
이틀이면 짧은 시간이었지만, 사람에게 좋은 인상을 주는데는 부족함이 없는 시간이라는 것을 느꼈다.
나도 저럴 수 있으면 좋겠다.
내가 접하는 사람들도, 저 사람과 일하고 싶다. 는 생각이 들 정도로 업무도, 그 외에 부분도 잘해야겠다는 생각이 들었다.