News Feed

가능성의 문을 열수록 유연해지는 소프트웨어 개발

컨텐츠 정보

  • 조회 714

본문

필자는 지금까지 수년, 수십년 동안 소프트웨어를 개발해 왔다. 그 과정에서 많은 것을 배웠고, 다른 사람과 공유할 만한 소프트웨어 개발에 관한 지혜를 모았다고 생각한다. 어느 순간에는 “그래, 이 문제는 잘 알고 있어”라고 생각하게 된다.

그리고 가끔씩 지금까지 배운 것의 정점을 보여주는 계시를 받기도 한다. 의존성 주입(dependency injection)을 이해했던 순간을 잊을 수 없다. 물론 구현보다 추상화를 전달하고 싶겠지만 말이다.

이번 주에도 비슷한 깨달음을 얻었다. 이미 이 사실을 알고 있는 더 훌륭한 개발자가 많겠지만, 정말 좋은 소프트웨어 디자인은 가능한 한 오랫동안 옵션을 열어 두는 것, 즉 모든 결정을 마지막 순간까지 미루는 것임을 갑자기 깨달았다.

직관적으로 이해하기 어려울 것 같으니 이렇게 설명ㅎ아자. 우리는 항상 모든 것을 미리 계획해야 한다고 배웠다. 생각할 수 있는 모든 세부 사항을 고려하지 않고 프로젝트를 시작해서는 안 된다고 배웠다. 지금 당장 계획을 세워서 예상치 못한 일이 없도록 해야 한다고 배웠다.

그런 생각을 하는 두 사람의 대화를 상상보면 이럴 것이다.

엔지니어링 디렉터: “새로운 프로젝트 계획은 어떻게 되어 가는가?”
개발 책임자: “좋다. 시작할 준비가 되었다.”
엔지니어링 디렉터: “어떤 데이터베이스를 선택했나?”
개발 책임자: “아직 결정하지 않았다.”
엔지니어링 디렉터: “인증은?”
개발 책임자: “아직이다.”
엔지니어링 디렉터: “잠깐… 뭐라고?”

엔지니어링 디렉터는 이런 대답에 만족해야 한다.

추상화를 고수하라

조기에 결정을 내리면 그 솔루션에 얽매이게 되고, 보통 그 솔루션이 구현을 주도하게 된다. 구현에 대한 결정을 내리면 추상화로부터 멀어진다. 이미 존재하는 것을 왜 추상화해야 하는가?

이것은 잘못된 해결책이라고 생각한다. 그 대신 “우리 솔루션에 필요한 추상화는 무엇입니까?”라는 질문을 해야 한다. 이것이 소프트웨어 개발의 본질이다. 구현이 아니라 추상화에 맞추어 코딩하라. 이 격언에 대한 부연 설명은 6년 전의 조언으로 대신하겠다.

Always code as if

IDG

깨달음을 느낀 지점은 추상적 개념을 코드를 작성한다면 구현에 대한 결정을 미룰 수 있고, 또 미뤄야 한다는 것이다. 구현을 미루는 기간이 길어질수록, 그 구현에 의해 특정 방향이나 결정에 제한을 받거나 몰리는 가능성이 낮아진다. 그리고 추상적인 개념이 의사결정을 주도하는 시간이 길어질수록 해결책이 분리될 가능성이 커진다. 추상적인 개념만 가지고 있다면 실행과 연결할 수 없다.

초기에 관계형 데이터베이스를 결정했다가, 프로젝트가 진행되면서 NoSQL 데이터베이스가 필요하다는 것이 분명해졌다면, 문제가 될 수 있다.

가능성의 문을 열어 두자

목표는 어떤 데이터베이스를 사용하든, 어떤 인증 솔루션을 웹사이트에 사용하든 신경 쓰지 않는 것이다. 궁극적으로 프로젝트에서 실제로 수행하려는 작업에 맞게 구현하려고 하는 것보다 추상화에 맞게 구현하는 것이 더 쉽고 효과적이다. 결정이 모호해지면 추상화가 잘 된 것이고 따라서 잘 설계된 시스템을 만든 것이다.

소프트웨어 개발의 가장 큰 골칫거리인 미지의 미지수를 해결하는 데도 큰 도움이 된다. 구현이 없다면 자유가 있다. 구현을 선택하거나 구축하는 데 걸리는 시간이 길수록 솔루션을 구축할 때 항상 발생하는 예기치 않은 장애물에 적응할 수 있는 유연성이 커진다.

어떤 구현 방식을 사용할지 일찍 결정하는 것은 문을 잠그고 열쇠를 던져버리는 것과 같다. 최고의 소프트웨어는 최대한 오랫동안 많은 문을 열어두고, 반대편에 있는 것이 마음에 들지 않으면 다시 돌아갈 수 있도록 하는 것이다. 문을 열어두면 더 많은 정보를 가지고 후회 없이 앞으로 나아갈 수 있다.

이제 필자는 현실 세계가 개입한다는 것을 깨닫게 되었다. 결국에는 데이터를 저장하고, 암호화하고, 사용자를 인증하고 권한을 부여하는 방법을 선택해야 한다. 이것은 결정을 피하는 것이 아니다. 적절한 시기에 적절한 정보를 가지고 결정을 내리는 것이다. 이런 세부 사항을 결정하는 과정에서 오래 기다릴수록 시스템이 더 깨끗해지고 더 구분되며, 추후에 변경하고 유지하는 것이 더 쉬워진다.

따라서 너무 빨리 실행을 확정해야 한다는 압박감을 느낀다면, 잠시 멈추고 “정말 필요한 추상화는 무엇인가?”라고 자문해 보라.

최고의 소프트웨어는 조급한 결정이 아니라 가능성에 기반해 구축된다.
dl-itworldkorea@foundryco.com

관련자료

댓글 0
등록된 댓글이 없습니다.
Member Rank