본문 바로가기

잡학다식/IT 컬럼

코딩보다 중요한 것: Leslie Lamport가 말하는 ‘추상화의 힘’

728x90
반응형

프로그래밍의 본질은 ‘코딩’이 아니다

많은 개발자들은 더 좋은 코드를 작성하기 위해 새로운 프로그래밍 언어나 프레임워크를 배우는 데 집중합니다. 하지만 정말 중요한 것은 ‘어떤 코드’를 작성하느냐가 아니라 ‘어떻게 문제를 해결할 것인가’를 먼저 생각하는 것입니다.

튜링상 수상자이자 LaTeX 개발자로 유명한 Leslie Lamport는 SCaLE 22x 키노트에서 **‘코딩보다 추상화가 중요하다’**는 점을 강조했습니다. 특히 알고리즘과 프로그램의 차이, 상태 기반 프로그래밍의 이해, 그리고 형식적 방법론(TLA+)의 필요성을 이야기하며, 좋은 소프트웨어는 ‘추상적 사고’에서 시작된다고 주장했죠.

이번 글에서는 Lamport의 발표 내용을 정리하고, 더 나은 프로그래머가 되기 위해 우리가 가져야 할 사고방식에 대해 이야기해 보겠습니다.

반응형

1. 알고리즘 vs. 프로그램: 차이를 이해해야 하는 이유

Lamport는 발표에서 다음과 같이 말했습니다.

“알고리즘은 프로그래밍 언어와 무관한 추상적 개념이고, 프로그램은 알고리즘을 특정 언어로 구현한 것이다.”

즉, 알고리즘은 문제 해결을 위한 논리적인 접근 방식이며, 프로그램은 그것을 코드로 표현한 것일 뿐입니다. 많은 개발자들이 프로그래밍 언어 자체에 집중하지만, 진짜 중요한 것은 프로그래밍 언어가 아니라 그 이전의 논리적 사고입니다.

알고리즘과 프로그램의 주요 차이점

구분 알고리즘 프로그램

개념 언어에 독립적인 추상적 개념 특정 프로그래밍 언어로 구현된 코드
목적 문제 해결을 위한 논리 설계 알고리즘을 실행 가능한 형태로 변환
특징 단순하고 간결함 복잡하고 구현 세부사항 포함
예시 정렬 알고리즘(퀵 정렬, 병합 정렬 등) Python, Java, C++ 등으로 작성된 정렬 코드

Lamport는 코드를 작성하기 전에, 먼저 올바른 알고리즘을 정의해야 한다고 강조합니다. 특히 동시성 프로그래밍에서는 알고리즘이 더 중요하며, 이를 명확히 정의해야 한다고 설명합니다.


2. 추상화의 힘: 배열 최대값 예제로 이해하는 원칙

단순한 문제라도 무엇(What)을 할 것인지 명확히 정의해야 합니다.

예를 들어, “정수 배열에서 최대값을 찾는 함수”를 구현한다고 가정해 봅시다.

📌 일반적인 접근법

def max_value(arr):
    return max(arr)

위 코드는 직관적이지만, 추상화의 원칙을 고려하지 않았습니다.

📌 추상화된 정의 적용

  • “배열의 최대값”을 찾는다는 것은 배열 내 모든 원소보다 크거나 같은 가장 작은 수를 찾는 것과 같습니다.
  • 하지만, 배열이 비어 있다면? 이 경우 반환값을 어떻게 정의할지 미리 고려해야 합니다.

📌 추상화 적용 후 정리된 정의

def max_value(arr):
    if not arr:
        return float('-inf')  # 비어 있는 배열의 경우 -∞ 반환
    return max(arr)

이렇게 사전에 명확한 정의를 세우면, 더 견고하고 예측 가능한 알고리즘을 만들 수 있습니다.


3. 프로그램 실행은 ‘상태의 흐름’이다

우리는 코드를 순차적으로 실행되는 명령어들의 집합으로 생각하기 쉽습니다. 하지만 Lamport는 프로그램 실행을 **‘상태의 연속적인 변화’**로 이해해야 한다고 말합니다.

예를 들어, 다음과 같은 프로그램이 있다고 가정해 봅시다.

x = 1
x = x + 1

이 코드에서 중요한 것은 명령어 자체가 아니라, x의 상태가 어떻게 변하는지입니다.

📌 상태 기반 프로그래밍의 장점

  • 프로그램의 실행 흐름을 이해하기 쉬움
  • 복잡한 버그를 추적하는 데 유용함
  • 동시성 프로그래밍에서 상태 변화의 중요성을 인식할 수 있음

4. TLA+: 추상화를 위한 강력한 도구

추상화를 명확하게 표현하려면, 정확한 언어가 필요합니다.

Lamport는 **TLA+**라는 도구를 소개하며, 이를 사용하면 복잡한 시스템의 설계를 명확히 할 수 있다고 말합니다.

📌 TLA+를 활용한 사례

  • Amazon Web Services(AWS): TLA+를 사용하여 심각한 설계 결함을 사전에 발견
  • Rosetta 우주선의 운영 체제(Virtuoso): TLA+ 기반으로 설계되어 코드가 간결하고 안정적이었음

TLA+는 수학적 논리를 사용하여 시스템의 올바름을 증명하는 방식으로, 복잡한 시스템을 다루는 개발자들에게 유용한 도구입니다.


5. 소프트웨어 버그의 원인과 해결 방법

Lamport는 또 하나의 중요한 문제를 제기했습니다.

“현대 소프트웨어는 수많은 라이브러리에 의존하지만, 정확한 언어 독립적 설명이 부족하다.”

즉, 많은 개발자들이 외부 라이브러리를 사용하면서도, 그것이 정확히 어떻게 동작하는지 이해하지 못하는 경우가 많다는 것입니다.

📌 버그가 발생하는 주요 원인

  • 라이브러리와 프레임워크에 대한 의존성
  • 명확한 형식적 정의(formal definition) 부족
  • 코드보다 문서화가 부족한 현실

결국 버그를 줄이려면 단순히 디버깅하는 것이 아니라, 처음부터 추상화를 명확히 하고 시스템을 설계해야 합니다.


728x90

코딩 전에 생각하라

Lamport는 다음과 같이 말합니다.

“코딩은 프로그래밍의 일부일 뿐, 진짜 프로그래밍은 정확한 알고리즘과 추상화에서 시작된다.”

우리는 새로운 프로그래밍 언어를 배우는 것보다, 문제를 올바르게 정의하는 법을 먼저 배워야 합니다.

📌 이 글에서 얻어야 할 핵심 교훈

  • 코딩보다 중요한 것은 문제를 올바르게 정의하는 능력
  • 알고리즘과 프로그램의 차이를 이해해야 한다
  • 상태 기반 프로그래밍을 고려해야 한다
  • TLA+ 같은 형식적 방법이 복잡한 시스템에서 유용하다
  • 결국, 코딩 전에 충분히 사고하는 것이 더 나은 소프트웨어로 이어진다

더 좋은 개발자가 되고 싶다면, 코드를 작성하기 전에 먼저 ‘생각’하세요. 🚀

https://www.socallinuxexpo.org/scale/22x/presentations/closing-keynote-leslie-lamport

 

Closing Keynote with Leslie Lamport | SCALE 22x

Join us for a captivating closing keynote with the legendary Leslie Lamport, Turing Award winner and pioneer in the field of distributed computing. We'll discuss computing history, open source and distributed systems. 

www.socallinuxexpo.org

728x90
반응형