brunch

You can make anything
by writing

C.S.Lewis

by 오래된만년필 Nov 13. 2024

개발자는 완성도를 중요하게 생각한다

개발자에게 완성도란 무엇을 뜻할까?

개발자의 직업은 일반 사무직이라기보다는 목수나 건축가 혹은 도예가처럼 전문 기능인에 속한다고 생각한다. 따라서 "소프트웨어 장인정신"이라는 책에서 언급한 것처럼 개발자에게는 어느 정도의 장인정신이 필요하다. 여러 분야의 장인들이 있을 테지만 심혈을 기울여 무언가를 만들고 완성도 있는 결과물을 내야만 그들을 장인으로 인정할 수 있다. 이러한 맥락에서 개발자는 완성도를 중요하게 생각하는 직업이다.


소프트웨어 개발에서 완성도는 네 가지 의미를 가진다.


첫째로 단순 작동하는 것을 넘어 품질이 좋아야 완성도가 있다고 이야기할 수 있다. 개발자가 작업하는 환경에서는 잘 동작하는 것을 확인했다고 해서, 수많은 사람이 동시에 사용할 때도 잘 동작한다고 보장할 수 있는 것은 아니다. 특정 기능을 하는 소프트웨어가 의도한 대로 항상 일정하게 동작하기를 기대하고 개발을 하지만 여러 이유로 의도한 바와 다르게 동작할 가능성이 있다. 높은 품질을 가진 소프트웨어는 마치 잘 만들어진 시계처럼 어떤 환경에서도 오차 없이 동일하게 의도된 기능을 수행하는 것을 의미한다. 이를 위해 객체지향 소프트웨어 개발론 같은 프로그래밍적 기술이 사용되며 개발자들은 이에 맞게 개발하고 동시에 품질이 높은 코드를 생산하기 위해 노력한다.


둘째로 작성한 코드는 가독성이 좋고 유지보수하기 쉬워야 한다. 중고등학교 수학 문제를 풀 때 풀이 과정을 알아보기 쉽게 적어두면 문제를 모두 풀고 나서 검산할 시간이 있을 때 실수한 부분을 찾기가 쉬워진다. 반면 휘날려 쓰거나 본인만 알아보게 풀이과정을 적거나 생략이라도 하면 본인이 검산하기도 어려울뿐더러 선생님이 어디서 잘못 계산했는지 확인을 도와주려 해도 어렵다. 마찬가지로 정확한 답과 함께 예쁘게 정리된 풀이과정이 있는 모범생의 수학 답안지처럼 가독성이 좋은 코드는 깔끔하고 완성도 있다는 느낌을 준다.


세 번째로 성능면에서 뛰어나고 최적화가 잘 되어 있어야 완성도 있다고 볼 수 있다. 같은 계산을 하는 소프트웨어인데 처리 시간이 현저히 느리다면 잘 만든 제품이라고 보기 어렵다. 더욱이 처리속도만 빨라서는 잘 만들었다고 판단할 수 없다. 십여 년 전 PC를 사용했던 시절을 떠올려보자. 모든 프로그램이 그런 것은 아닌데, 특정 소프트웨어를 오랜 시간 사용하다 보면 PC가 점점 느려져 정기적으로 재부팅해야 하는 현상을 많이 겪었을 것이다. 이제는 하드웨어의 발달과 메모리를 자동으로 관리해주는 기술 덕에 그런 현상을 자주 겪지는 않는다. 하지만 스마트폰을 쓰다가도 앱이 느려지거나 멈추면 강제로 종료하는 것을 기억해보면 현대의 프로그램 개발에서도 최적화는 매우 중요한 문제 중 하나이다. 따라서 뛰어난 성능과 최적화가 잘 되어있는 것은 완성도를 판단하는 중요한 요소가 된다.



마지막으로 다양하게 발생하는 예외상황을 완벽하게 처리할 수 있어야 한다. 품질 좋은 코드는 항상 예상한 대로 동작하지만, 잘못된 상황이나 의도되지 않은 동작을 방지하기 위해 개발자들은 '예외처리'라는 것을 한다. 사용자의 입장에서 "잘못된 접근입니다"와 같은 메시지를 봤다면 이것이 예외상황이 발생한 것이라고 볼 수 있다. 이때 발생할 수 있는 예외 상황들에 대해 적절한 메시지로 필요한 값들을 모두 입력받거나 적절한 순서로 진행하도록 유도하는 것이 예외처리에서 중요하다. 결제 페이지에서 수많은 입력값들 중 특정 값이 입력되지 않은 상황에서 단순히 "모든 값을 입력해주세요"라는 메시지를 노출하는 것은 사용자를 피곤하게 만든다. 그보다는 발생한 문제상황에 대해 구체적인 메시지를 보여주고 올바른 사용방법으로 유도하는 소프트웨어가 완성도가 있다고 이야기할 수 있다.


개발자들이 완성도를 중요하게 생각하는 이유는 무엇일까?


우선 장인정신과 프로정신을 드러내는 중요한 요소 중 하나가 완성도이기 때문이다. 본인이 생산한 코드에 대해 개발자는 책임감이 있다. 여러 사람이 함께 작업하는 프로젝트에서 내가 맡은 부분이 치명적인 문제를 일으킨다면 나중에 문제가 해결된 뒤에도 심적으로 많이 힘들다. 완성도 높은 코드는 이를 예방할 수 있다. 이 뿐만 아니라 잘 만들어둔 코드를 보고 있노라면 자기만족도 느낄 수 있다.


또한 높은 완성도는 나중에 발생할 문제를 예방한다. 각 기능이 제 기능을 한다는 것은 신뢰할 수 있다는 것을 의미한다. 버그를 찾을 때도 수월하고 보안 측면에서도 안전함을 보장할 수 있다.


마지막으로 동료와 협업을 할 때도 도움이 된다. 다른 개발자가 보고 바로 이해할 수 있는 완성도 있는 코드는 다른 개발자의 도움을 받기 수월하고, 도움을 주기도 쉽다. 다른 개발자들을 교육할 때도 활용할 수 있다. 반면에 완성도가 떨어지는 코드는 다른 사람에게 보여주기 부끄럽다. 이러한 이유로 개발자는 완성도 있는 산출물을 만들고 싶어 한다.


완성도가 떨어진 제품이 문제를 일으킨 두 가지 대표적인 사례가 있다.


첫 번째는 2013년 오바마 행정부의 Healthcare.gov 런칭 실패다. 오바마 케어라고도 불리는 정부의 중요한 서비스였다. 서비스 오픈 당일 400만 명의 방문자 중 단 6명만이 가입에 성공했다. 개발팀은 마지막 순간까지 시스템 요구사항이 변경되는 상황에서도 정해진 일정에 맞추기 위해 서둘러 배포를 강행했다. 결과적으로 성능과 안정성이 검증되지 않아 완성도가 떨어진 상태로 서비스가 오픈되었고, 이는 곧 서비스 장애로 이어졌다. 이 일이 수습되는 데까지 6주라는 오랜 시간이 소요되었다.


두 번째는 2012년 Knight Capital의 트레이딩 시스템 오류다. 새로운 거래 소프트웨어 배포 과정에서 발생한 오류로 인해 45분 만에 4억 4천만 달러의 손실이 발생했다. 충분한 테스트 없이 시스템을 배포했고, 문제가 발생했을 때 이를 빠르게 중단할 수 있는 안전장치도 마련되어 있지 않았다. 이 사고로 인해 회사의 주가는 이틀 만에 75%가 폭락했고, 결국 회사는 인수될 수밖에 없는 상황에 처했다. 이처럼 단 한 번의 불완전한 배포가 20년 된 회사의 운명을 바꿔버렸다.


이 두 사례는 소프트웨어 개발에서 완성도가 얼마나 중요한지를 잘 보여준다. 특히 대규모 서비스나 금융 시스템처럼 높은 안정성이 요구되는 시스템에서는 철저한 검증과 테스트가 필수적이다. 따라서 일정에 쫓겨 완성도를 포기하는 것은 결과적으로 더 큰 비용과 시간 손실을 초래할 수 있다.


개발자들의 이런 성향을 기획자의 입장에서 잘 이해하면 그들의 스트레스를 많이 줄여줄 수 있다. 이를 위해 아래의 방법들을 참고하면 좋다.


첫째로 완성도를 갖추기 위해 시간이 필요하다는 점을 인지하고 개발 일정을 잡을 때 여유 시간을 주는 것이 필요하다. 당장 우리가 원하는 '돌아가는' 프로그램을 만드는 것을 기준으로 일정을 산출해서는 안 된다. 개발자가 스스로 어느 정도의 버퍼 시간을 확보하려고 할 텐데 이를 존중하고 가능하다면 그것보다 시간을 더 확보해줄 필요가 있다. 물론 이 시간 동안 우리의 의도대로 완성도 높은 작업물을 만들기 위해 노력하는 사람도 있겠지만 노는 사람도 있을 수 있다. 그럼에도 우리 프로덕트의 완성도를 위해 시간을 여유 있게 주는 것이 효율적인 선택일 것이라고 생각한다. 다만 노골적으로 후자에 해당하는 가짜 개발자들은 걸러낼 필요가 있다. 이들을 구별하는 방법에 대해서는 나중에 알아보겠다.


둘째로 완성도 있는 프로그램을 만들기 위해 테스트나 QA 영역에서 도움이 필요하다는 것을 인지하고 돕는 것이다. 연애 상담을 할 때 타인의 시선으로 보면 간단하고 명료한 일이 본인의 일일 때는 판단이 잘 안 서곤 한다. 마찬가지로 본인의 작업물을 스스로 테스트하면 문제점을 찾는 데 한계가 있다. 능력이 좋고 나쁨을 떠나 어쩔 수 없이 보지 못하는 부분이 생길 수밖에 없다. 그래서 초기 버전을 함께 테스트해주고 누락된 부분이나 의도와 다르게 동작하는 부분들을 함께 찾아줄 필요가 있다. 지적하는 느낌이 아닌 함께 제품을 만들어가는 느낌으로 이런 도움을 준다면 원팀으로 일하는 기분으로 완성도 높은 제품을 만들어갈 수 있다고 생각한다.


우리의 일들은 항상 마감 기한이 있다. 하지만 급하게 처리했을 때 완성도는 떨어지고 잠재적으로 문제가 발생할 수 있다는 점을 인지하고, 나중에라도 이를 보충할 수 있는 시간을 확보해주는 것도 도움이 된다.


결론적으로, 완성도 높은 소프트웨어가 개발자와 기획자 그리고 고객에게까지 모두에게 중요하다는 것을 인지하고 개발자들이 완성도를 높일 수 있도록 돕는다면, 그 혜택은 결국 모두가 누리게 될 것이다.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari