서론: 철학적 문제의식

소프트웨어 개발에서 좋은 코드란 무엇인가? 이는 단순히 기술적 효율성의 문제를 넘어서는 근본적 질문이다. 코드의 품질을 논할 때 우리는 흔히 ‘깔끔함’, ‘명확함’, ‘아름다움’ 같은 미학적 언어를 사용하거나, ‘책임’, ‘역할’, ‘질서’ 같은 도덕적 언어를 사용한다. 이는 우연이 아니다. 좋은 코드에 대한 우리의 직관이 본질적으로 철학적 문제와 맞닿아 있기 때문이다.

본 글은 플라톤의 정의에 대한 탐구를 통해 소프트웨어 개발의 근본 원리를 철학적으로 고찰한다. 플라톤이 『국가』에서 제시한 정의의 개념이 현대 소프트웨어 설계 원칙과 구조적으로 일치함을 보이고, 이를 통해 정의로운 코드라는 새로운 개념적 틀을 제안한다.


1. 플라톤의 정의 탐구: 자기 일의 원칙

1.1 훌륭함의 원리: 정의를 위한 철학적 기초

플라톤의 정의(正義, Justice)를 이해하기 위해서는, 먼저 그가 모든 존재의 ‘훌륭함(德, Virtue)’이란 무엇인지에 대해 제시하는 근본적인 원리를 살펴봐야 한다. 그는 『국가』에서 다음과 같이 말한다:

“어떤 기능이 부여되어 있기도 한 각각의 것에는 ‘훌륭한 상태’와 ‘나쁜 상태’를 지니고 있다. 그 특유의 훌륭한 상태에 의해서 그 기능은 제 할 일들을 훌륭하게 수행하게 되지만, ‘나쁜 상태’에 의해서는 나쁘게 수행된다.”(353c)

이 인용문의 핵심은 플라톤이 모든 존재의 ‘훌륭함’을 그 고유한 ‘기능(function)’ 의 완벽한 수행과 연결 짓는다는 점이다. 즉, 각 존재가 자신에게 주어진 단 하나의 기능, 즉 ‘제 할 일’에 집중하고 전문화되는 것, 이를 기능적 전문화(functional specialization)라 부를 수 있다. 이렇게 될 때 비로소 그 존재는 가장 훌륭한 상태에 도달한다.이는 단순한 효율성의 문제가 아니라 존재론적 완성의 문제다.

1.2 정의의 본질: 자기 일의 원칙

이처럼 모든 ‘훌륭함’이 고유한 기능의 완벽한 수행에서 비롯된다는 대원칙 위에서, 플라톤은 마침내 정의의 본질을 규정한다. 그가 『국가』에서 직접 밝히듯이, 정의란 바로 “제 일을 하고 참견하지 않는 것”(433a) 이며, “제 것의 소유와 제 일을 함”(433e) 이 올바른 상태라고 규정한다.

이러한 철학적 정의는, ‘훌륭함’이 어떻게 성취되는지에 대한 매우 실용적인 관찰에 뿌리를 두고 있다. 플라톤은 국가의 기원을 논하는 대목에서 이미 그 근거를 다음과 같이 제시한 바 있다.

“어떤 이가 일을 더 잘 해내게 되는 것은 한 사람으로서 여러 가지 기술에 종사할 때가 아니라 한 사람이 한 가지 기술에 종사할 때이다.”(370b)

여기서 우리는 플라톤 정의 개념의 핵심, 즉 자기 일의 원칙(The Principle of One’s Own Work) 을 도출할 수 있다. 이는 각자가 자신의 고유한 성향과 능력에 맞는 일에 전념하고 다른 영역을 침범하지 않을 때, 개인의 탁월함은 물론 공동체 전체의 조화로운 질서 가 달성된다는 사상이다. 이때 정의는 외부에서 부과되는 규범이 아니라, 사물의 본성에서 자연스럽게 발현되는 질서다.

바로 이 지점에서 우리는 1.1에서 다룬 ‘훌륭함’과 1.2의 ‘정의’가 하나로 만나는 것을 목격한다. 플라톤에게 ‘정의’, 즉 ‘자기 일을 하는 것’은 그 자체로 도덕적 목표이기에 앞서, 모든 존재가 자신의 고유한 기능을 완벽하게 수행하는 ‘훌륭한 상태’에 도달하기 위한 유일하고 필연적인 방법론인 것이다.

2. 소프트웨어 개발에서의 정의 개념 적용

2.1 조화로운 질서와 무질서의 풍경

플라톤의 ‘자기 일의 원칙’이라는 개념을 인지한 채 소프트웨어의 위계적 구조를 들여다보면, 우리는 비로소 ‘좋은 코드’와 ‘나쁜 코드’의 본질적인 차이를 목격하게 된다. 국가에 질서와 혼돈이 있듯이, 소프트웨어에도 그와 같은 풍경이 펼쳐진다.

  • 함수 수준에서: 하나의 함수가 데이터를 조회하고(생산자), 그 데이터의 유효성을 검증하며(수호자), 실패 시 예외를 던져 프로그램의 흐름을 제어한다면(통치자), 이 함수는 모든 역할을 독점하려는 ‘정의롭지 못한 폭군’ 과 같다. 반면 ‘정의로운 함수’ 는 오직 하나의 기능, 즉 ‘자기 일’에만 충실하며, 다른 기능들은 동료 함수들에게 겸손하게 위임하는 협력자다.

  • 클래스 수준에서: User라는 클래스가 사용자의 정보를 담는 책임과 함께, 그 정보를 데이터베이스에 저장하고(UserRepository), 웹에 표시하기 위해 JSON으로 변환하는(JsonConverter) 책임까지 진다면, 이 클래스는 자신의 본분을 망각하고 남의 일에 참견하는 월권적 존재다. ‘정의로운 클래스’ 는 오직 ‘사용자라는 개념을 책임지는 것’이라는 자기 일만 수행한다.

이처럼 각 요소가 자신의 경계를 넘어 서로의 역할을 침범할 때, 소프트웨어라는 국가는 무질서와 혼란에 빠지게 된다.

2.2 ‘정의로운 코드’의 정의

이러한 철학적 탐구를 바탕으로, 우리는 ‘좋은 코드’를 기술적 용어를 넘어선 새로운 차원에서 정의할 수 있다. 이것이 바로 ‘정의로운 코드’ 다.

정의로운 코드란, 소프트웨어의 각 구성요소가 자신의 고유한 기능을 명확히 갖고, 그 기능만을 온전히 수행하며, 다른 구성요소들과 조화로운 관계를 맺는 코드다.

이는 기술적 효율성을 넘어서는 존재론적 완성의 개념이다. 각 요소가 자신의 본성을 실현하고 “제 일”에만 충실할 때 전체가 아름다운 질서를 이룬다.

3. 현대 개발 원칙과의 수렴

3.1 구조적 일치: 시대를 초월한 지혜

놀랍게도 플라톤이 2,400년 전에 제시한 이 철학적 통찰은, 현대 소프트웨어 공학을 지탱하는 핵심 원칙들 속에 그대로 살아 숨 쉬고 있다.

단일 책임 원칙(SRP): 클래스가 단 하나의 변경 이유만을 가져야 한다는 SRP의 요구는, “한 사람이 한 가지 기술에 종사할 때” 가장 훌륭한 결과가 나온다는 플라톤의 주장과 완벽하게 일치한다. 여러 책임을 가진 클래스는 필연적으로 혼란을 낳는다.

관심사의 분리: 이는 국가에서 생산자, 수호자, 통치자의 역할을 명확히 분리해야 한다는 플라톤의 사상과 맞닿아 있다. 데이터 접근 로직, 비즈니스 로직, 프레젠테이션 로직이 뒤섞인 코드는 각자의 ‘기능’을 망각하고 서로의 일에 참견하는 ‘정의롭지 못한’ 상태이며, 유지보수를 악몽으로 만든다.

높은 응집도, 낮은 결합도: ‘높은 응집도’란 하나의 모듈이 자신의 ‘자기 일’에만 충실하게 뭉쳐 있는 상태를 의미한다. ‘낮은 결합도’는 각 모듈이 다른 모듈의 일에 “참견하지 않는 것”을 기술적으로 구현한 것이다. 이 두 가지가 달성될 때, 비로소 플라톤이 말한 ‘조화로운 질서’가 시스템 전체에 발현된다.

캡슐화: 이는 각 객체가 ‘자신의 것’을 지키고 외부의 부당한 간섭으로부터 스스로를 보호하는 원리다. 객체의 내부 상태를 숨기고 오직 공개된 메서드를 통해서만 상호작용하도록 강제하는 것은, 각자가 “남의 것을 취하지도 않도록 하고, 또한 제 것을 빼앗기지도 않도록 하는 것”이 올바름이라는 플라톤의 말을 떠올리게 한다.

이러한 구조적 일치는 결코 우연이 아니다. 좋은 설계의 본질은 시대를 초월하며, 결국 현대 개발 원칙들이 ‘왜’ 좋은지에 대한 근본적인 이유를 플라톤의 정의의 개념이 제공하는 셈이다. 단일 책임 원칙이나 관심사의 분리와 같은 원칙들은 단순히 경험적으로 발견된 실용적 규칙을 넘어선다. 그것들은, 앞서 1.2에서 살펴보았듯 ‘자기 일의 원칙’이라는 정의가 추구하는 궁극적인 상태, 즉 ‘조화로운 질서’라는 보편적 가치를 기술적으로 구현한 것이라 할 수 있다.

4. 비판적 검토: 이상과 현실의 대화

그러나 ‘정의로운 코드’라는 유추가 가진 한계 역시 명확히 해야 한다. 이어지는 비판적 검토는 이 주장을 약화시키는 것이 아니라, 오히려 그 적용 가능한 현실의 범위를 선명히 밝혀줄 것이다.

4.1 유추의 한계: 살아있는 코드와 이상 국가

소프트웨어는 플라톤이 상상했던 이상국가와는 근본적으로 다른 특성을 지닌다. 소프트웨어는 끊임없이 변화하는 요구사항 속에서 유기적으로 성장하는 살아있는 시스템이다. 반면 플라톤의 국가는 이상적인 질서가 한 번 확립되면 영원히 유지되는 정적인 모델에 가깝다. 현대 소프트웨어의 복잡성과 컴포넌트 간의 상호의존성은 고대 사회의 분업과는 비교할 수 없을 정도로 역동적이다.

그럼에도 불구하고, 이러한 차이점이 ‘자기 일의 원칙’의 가치를 훼손하지는 않는다. 이 원칙은 소프트웨어의 구체적인 구현을 지시하는 ‘청사진’이 아니라, 변화와 복잡성 속에서 우리가 지향해야 할 방향을 알려주는 ‘나침반’ 이기 때문이다. 오히려 시스템이 역동적일수록, 각 부분이 자신의 역할에 충실해야 전체의 안정성이 유지된다는 근본 원리는 더욱 중요해진다.

4.2 대안적 해석: 철학 없이도 충분한가?

물론 단일 책임 원칙과 같은 원리들을 굳이 플라톤까지 거슬러 올라가지 않고도 설명할 수 있다. 유지보수 비용을 줄이려는 실용주의적 해석, 복잡한 환경에서 살아남은 설계 패턴이라는 진화론적 해석, 혹은 인간의 인지적 한계에 맞춘 설계 방식이라는 인지과학적 해석 모두 타당하다.

하지만, 이러한 해석들은 ‘무엇(What)’과 ‘어떻게(How)’는 설명할 수 있어도, 좋은 설계가 우리에게 왜 그토록 깊은 만족감과 아름다움을 주는가라는 ‘왜(Why)’ 의 질문에는 온전히 답하지 못한다. 철학적 접근은 다른 해석들을 대체하는 것이 아니라, 그것들을 더 깊은 차원에서 통합하는 ‘근본적인 이유’ 를 제공한다. 실용적 전략이 ‘질서와 조화’라는 보편적 가치와 맞닿아 있음을 이해할 때, 우리는 비로소 코드 작성의 기술적 행위를 넘어 철학적 실천의 영역으로 들어설 수 있다.

4.3 적용 범위의 한계: 언제 정의를 유보해야 하는가?

‘정의로운 코드’라는 이상은 진공 속에서 존재하지 않는다. 소프트웨어 개발은 철학적 이상을 실현하는 예술이기에 앞서, 제한된 자원(시간, 인력, 비용) 안에서 현실의 문제를 해결해야 하는 실용적인 행위다. 따라서 모든 개발자는 이상과 현실 사이에서 끊임없이 트레이드 오프(Trade-off) 를 결단해야 한다.

완벽하게 정의로운 설계를 추구하는 것이 오히려 비즈니스 목표 달성에 해가 되는 경우, 우리는 기꺼이 ‘차선’을 선택하는 지혜를 발휘해야 한다. 시장 출시가 급한 신규 프로젝트든, 복잡한 제약 속에서 기능을 추가해야 하는 거대한 시스템이든, 모든 상황은 우리에게 ‘중용(中庸)’의 미덕을 요구한다. 때로는 빠르게 ‘작동하는 소프트웨어’를 전달하는 것이, 완벽한 구조를 추구하는 것보다 더 시급하고 중요한 ‘정의’가 될 수 있다.

이는 ‘정의로운 코드’라는 이상의 실패가 아니다. 오히려 그것은, 우리가 추구하는 이상이 얼마나 높은 가치를 지니는지를 알기에, 현실의 무게를 감당하며 그 이상을 향해 한 걸음이라도 더 나아가려는 전문가로서의 책임감을 증명하는 것이다. 이상은 모든 현실에 기계적으로 적용되기 위해 존재하는 것이 아니라, 혼란스러운 현실 속에서 우리가 더 나은 결정을 내리도록 길을 밝혀주는 별과 같은 역할을 한다.

5. 결론: 정의로운 코드, 그 철학적 실천을 향하여

우리는 ‘좋은 코드란 무엇인가?’라는 소박한 질문에서 출발하여, 2,400년 전 플라톤의 철학이라는 깊은 바다를 항해했다. 이 여정을 통해 우리는 코드 작성이라는 기술적 행위가 ‘질서’와 ‘조화’를 창조하는 철학적 실천이 될 수 있음을 목격했다. 이제 ‘정의로운 코드’라는 나침반이 우리 개발자들의 여정에 어떤 실천적 함의를 던져주는지 숙고하며 이 글을 마무리하고자 한다.

5.1 장인으로서의 책임: 단순한 구현을 넘어

‘정의로운 코드’라는 개념은 우리에게 코드 작성을 바라보는 새로운 관점을 제시한다. 그것은 단순히 주어진 기능을 구현하는 기술적 행위를 넘어, 시스템 전체의 건강과 미래를 책임지는 ‘장인(Craftsman)’의 행위로 확장된다.

좋은 장인이 나무의 결을 살려 최적의 형태를 찾아내듯, 우리 역시 코드의 구조 속에서 최선의 질서를 고민하게 된다. 하나의 함수, 하나의 클래스를 설계하는 것은 시스템이라는 작은 공동체 안에서 각 시민에게 가장 적합한 역할을 부여하고 그 책임의 경계를 설정하는 일이다. 이것은 더 나은 결과물을 만들기 위해 우리가 매일 마주하는 ‘전문가로서의 신중한 선택’ 이다.

이제 우리는 키보드 앞에서 스스로에게 묻게 될 것이다. “이 코드는 자신의 ‘자기 일’에 충실한가? 이것은 시스템 전체의 ‘조화로운 질서’에 기여하고 있는가?” 이 질문을 품는 개발자는 단순히 코드를 생산하는 것을 넘어, 코드 속에 장기적인 안정성과 명료함을 구현하는 창조자가 된다.

5.2 이상과 현실의 변증법: 더 나은 타협을 위한 별

물론 우리는 4장에서 살펴보았듯, 늘 시간과 자원의 제약이라는 현실의 중력 속에서 살아간다. 비즈니스의 요구는 때로 우리에게 완벽한 정의가 아닌 ‘차선’의 타협을 강요한다.

그러나 ‘정의로운 코드’라는 이상은 바로 이 지점에서 가장 밝게 빛난다. 그것은 모든 상황에 기계적으로 적용해야 할 율법이 아니라, 어두운 현실 속에서 더 나은 타협을 가능하게 하는 ‘북극성’ 이다. 우리가 어디를 향해 가야 하는지 알고 있을 때, 우리는 길을 잃더라도 최소한 방향을 잃지는 않는다. 현실의 제약 속에서 ‘정의’를 향한 최선의 노력을 담아내는 것, 이것이야말로 진정한 전문가의 책무이자 이 철학적 탐구의 가장 현실적인 결론이다.

5.3 미래를 향한 제언: 우리에게는 철학이 필요하다

소프트웨어가 세상을 집어삼키는 시대에, 우리는 그 어느 때보다 더 깊은 성찰을 요구받고 있다. 인공지능이 코드를 생성하고 기술적 효율성이 극대화될 미래에, 인간 개발자의 대체 불가능한 가치는 어디에 있을까? 그것은 바로 ‘왜’를 묻는 능력, 즉 좋음과 올바름, 질서와 조화를 추구하는 철학적 사유에 있을 것이다.

단순히 기술 규칙을 암기하는 교육을 넘어, 그 규칙들의 철학적 근거를 탐구하는 문화가 필요하다. 기술적 효율성만으로는 부족하다. 우리에게는 질서와 조화, 아름다움과 정의를 추구하는 소프트웨어, 그리고 그것을 만들 수 있는 ‘개발자’가 필요하다.

플라톤의 정의의 개념을 통해 본 소프트웨어 개발은 단순한 공학적 행위를 넘어선다. 그것은 혼돈에 질서를 부여하고, 무질서 속에서 조화를 창조하는 고귀한 실천이다.

결국 좋은 코드란, 각 부분이 ‘자기 일’을 다하는 코드다. 이것이 2,400년 전 철학자로부터 배운, 현실 속에서 분투하는 현대 개발자를 위한 영원한 교훈이다.


참고 문헌