코딩이란 작업에 대하여

대한민국 소프트웨어 업계, 특히 SI 업계에서 ‘코딩은 중요한 것이 아니다’라는 말을 듣는 것은 놀랍게도 놀라운 일이 아닙니다. 짧지 않은 시간동안 코딩을 하고 소프트웨어를 만들어 온 입장에서 전혀 동의할 수 없는 의견임에도 불구하고요. 최근에 회사 일을 하면서 겪은 내용을 토대로 제가 생각하는 ‘코딩(coding)’의 의미에 대해 짧게 정리해보고 싶은 생각이 들었습니다.

coding

얼마전 페이스북 담벼락에 이런 글을 썼습니다.

대한민국 SI 판은, 프로그래머에 대한 평가 기준을 비롯해, 많은 것들을 본래의 의미와 역사를 무시한채 왜곡하고 멋대로 규정지어 버렸습니다. 그 바닥에서만 오래 갇혀지낸 분들은 대부분 그런 인식에 고착되었죠.

‘코딩’과 ‘프로그래머’에 대한 정의가 그 중 하나입니다. 그들은 코딩이란 개념에서 ‘디자인’을 빼버렸습니다. 즉 코딩과 타이핑을 유사한 개념으로 왜곡합니다. 그리고 프로그래머를 ‘그들이 정의하는 코딩’을 하는 사람으로 정의합니다. 그러다보니 한국 SI맨들은 소프트웨어에서 코딩은 중요한 것이 아니라(?)는 개소리를 하고 다니고 프로그래머는 저급 인력이라 생각하며 코딩도 제대로 해 본 적이 없는 이들이 아키텍트 타이틀을 달고 디자인이라는 것을 합니다. 프로그래머는 체계적이거나 분석적이지 않다라고 하기도 합니다.

디자인은 코딩에 있어서 아주 중요하고 필수적인 요소입니다. 프로그래머는 소프트웨어를 만드는 사람들을 지칭하는 최고의 표현 중 하나입니다. 처음부터 그랬고 변한 적이 없습니다.

몇몇 분들이 공감을 표해주셨고 다른 초고수님의 후속타와 함께 OKKY에 공유되었습니다. 요점은 ‘모든 프로그래머는 디자인(설계)을 한다’인데 적어도 현재의 팀을 비롯해 제 경험에서는 이 명제에 어긋났던 일이 없었습니다. 아니, 사실 어긋나는 것이 가능하지 조차도 저는 모르겠습니다. 모 컨퍼런스에서 발표할 때에도 비슷한 얘기를 했습니다.

프로그래머는 손보다 뇌가 빨라야한다

프로그래머가 행하는 것을 코딩이라고 한다면 여기에는 코드를 타이핑하는 손을 사용하는 작업과 더불어 어떤 코드를 타이핑할 것인가를 결정하는 뇌를 사용한 디자인 작업이 필수이며 둘 중 디자인이 반드시 선행되어야 한다는 말입니다.*

요즘은 회사 프로젝트에 코드 커밋이 활발한 시기입니다. 우리 팀은 대부분의** 코드를 Pull Request(이후 PR)를 통해 제출하고 그 과정에서 코드에 대한 리뷰가 진행됩니다. 최근에는 iOS와 Microsoft Azure의 특정 기능을 조합하는 비교적 중요도가 높은 코드에 대한 PR을 리뷰했는데 15시간 정도 소요되었습니다. 우리는 코드 리뷰에서 다음과 같은 것들을 논의했습니다.

  • 메서드 등의 이름에 가능하면 특정 기술에 종속적인 어휘보다는 프로세스를 잘 설명할 수 있는 일반적인 어휘를 사용하는데에 합의했습니다. 구현체가 업데이트되거나 새로운 기술로 교체되어도 클라이언트 코드가 영향을 받지 않도록 인터페이스를 설계하자는 의도입니다.

  • 사용자 입장에서 필수적이지 않은 프로세스의 경우 실패해도 이후 사용자 경험은 유지하도록 했습니다. 서비스가 제공하는 기능의 일부가 장애를 일으켜도 치명적이지 않다면 전체 서비스는 계속되어야합니다. 추후 재시도 논리를 추가하기로 했습니다.

  • 중복 코드가 발견되어 작업 진도에 큰 지장을 주지 않는다면 중복을 제거하자는 의견이 전달되었고 프로그래머(PR 작성자)가 이를 수용했습니다.

  • 새로운 코드가 인터페이스 분리 원칙을 준수하도록 하고 이를 위해 단일 멤버를 가지는 인터페이스를 정의하는 것과 콜백 함수를 사용하는 것 중 어느 쪽이 좋을런지 고민한 뒤 우리 코드가 의존하는 API 디자인에 적용하기에는 인터페이스 추가가 더 적당하다고 결론지었습니다.

  • 디자인은 명확하고 단순하며 높은 가독성과 testability를 가져야한다는 공감대를 유지하면서도 과한 엔지니어링이 되지 않아야함을 상기했습니다.

결과적으로 두 세 줄의 간단한 인터페이스 코드와 새 디자인을 사용하는 코드 십여 줄이 프로덕션 프로젝트에 추가되었습니다. 이 프로덕션 코드 디자인에 대한 명세와 검증은 테스트 코드가 담당했습니다. 네, 우리는 바로 ‘코딩’을 한 것입니다.

이번 코딩 작업을 진행하면서 우리가 상대한 것은 의존 요소들(iOS, Microsoft Azure)의 API였습니다. 우리는 의존 API를 분석하고 두 의존성과 우리 코드가 잘 어울리는 디자인을 고민했습니다. 만약 비즈니스 논리를 코딩했다면 의존 API 대신 비즈니스 요구사항을 분석했을겁니다. 이 과정에서 어떤 사람들은 문맥 파악과 의사소통 등을 언급하며 ‘소프트웨어에서 코딩보다 인문학이 중요하다’라고 말합니다. 저는 이것을 더 없이 멍청한 주장이라고 생각하는데, 문맥 파악과 의사소통은 이미 말씀드렸듯이 코딩의 일부이고 소프트웨어 산업에 국한지을 것이 아니라 인간 사회의 모든 분야에 필요한 요소이며 결과적으로 프로그래머가 코딩을 잘 하지 못한다면 인문학 따위 아무 쓸모 없기 때문입니다. 즉, ‘소프트웨어에서 코딩보다 숨쉬기가 중요하다’라는 주장과 다를 것이 없습니다.

소프트웨어를 만드는데 있어서 중요한 것들은 많지만 코딩은 그 중에서도 가장 중요한 작업입니다. 이 기준을 적용하는데에 어떤 언어를 사용하는지 어떤 도구를 사용하는지는 중요하지 않습니다. 경우에 따라서 어떤 소프트웨어는 코딩이 개발 프로세스의 전부이기도 합니다. 코딩은 타이핑이 아닙니다.

* TDD를 하고있다면 ‘테스트 코드 작성’ 단계에서 뇌를 최대한 사용하고 ‘프로덕션 코드 작성’ 단계에서는 뇌 사용을 최소화하고 테스트 코드가 시키는대로만 타이핑합니다.

** 99% 이상의 코드입니다. 긴급한 장애 대응 코드 등이 나머지 1% 미만에 포함됩니다.

Advertisements

코딩이란 작업에 대하여”에 대한 4개의 생각

    1. Tae Min Jo

      일하다 보면
      내가 타이핑을 하는건지
      코딩을 하는건지 한숨쉴 때가 있었는데
      이글을 읽고 나니까.
      답답함이 조금은 해소되는 거 갔네요.
      잘 읽고 갑니다.ㅎㅎ

      응답
  1. 박태웅

    예전에 아주 뛰어난 프로그래머와 ‘프로그래밍을 한 마디로 표현한다면 그게 뭘까?에 관해 얘기를 한 적이 있었어요. 둘이 쪽지에 쓴 다음 맞춰보기로 했는데, 놀랍게도 답이 같아서 웃은 적이 있었습니다. 그때 그 친구와 제가 썼던 답이 “프로그래밍은 예외를 처리하는 것이다”.
    좋은 글 잘 읽고 갑니다. 😉

    응답

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중