인공지능 시대의 소프트웨어 공학
지난 글을 쓰다가 만난 객체(Object)가 아닌 캡슐 구현 예시를 보다가 글을 이어 가게 됩니다.
두 가지 과거 경험이 글을 쓰도록 의지를 공급(?)합니다. 하나는 <모던 소프트웨어 엔지니어링>을 읽을 때 바로 이 연재 <인공지능 시대의 소프트웨어 공학>을 쓰게 만들었던 '모듈성(Modularity)'에 대한 재인식입니다. 당시 저에게 전율을 선사했던 문장을 돌아봅니다.
나는 이것이 소프트웨어 개발의 진정한 기술이라고 생각한다. 이런 특성은 자신의 분야에 통달한 전문가가 작성한 코드와 갓 입문한 초보자가 작성한 코드를 가장 크게 구분하는 요소다.
그리고 다시 보니 어쩌면 이 연재를 쓰는 동기가 되었을지도 모를 내용도 발견할 수 있습니다.
프로그래밍 패러다임, 언어 또는 도구에 관계없이 모듈성이 좋고 관심사가 잘 분리된 코드가 있다면 해결하려는 문제에 대해 더 많이 알게 되면서 더 좋아지고, 작업하기 더 쉽고, 테스트하기 더 쉽고, 수정하기 더 쉬워질 것이다.
두 달 가까운 시간이 지난 지금 그때 느낀 직감이 얼마나 들어맞는지 돌아볼 때가 된 듯도 합니다. 여기에 더하여 모듈과 컴포넌트 차이를 설명한 기사를 보고 찜찜한 느낌이 든 일이 있었는데, 이 글을 쓰며 일부나마 해소할 수 있을까 기대감을 갖고 글을 써 봅니다.
먼저 익숙한 라이브러리부터 다뤄 봅니다. 위키피디아 페이지 정의 부분의 크롬 번역을 옮겼습니다.
컴퓨팅에서 라이브러리는 소프트웨어 개발 과정에서 컴퓨터 프로그램을 구현하는 데 사용할 수 있는 리소스 모음입니다. 일반적으로 라이브러리는 컴파일된 함수나 클래스와 같은 실행 가능한 코드로 구성되거나, 소스 코드 모음일 수도 있습니다. 리소스 라이브러리에는 이미지나 텍스트와 같은 데이터가 포함될 수 있습니다.
실행 가능한 형태도 있고 소스 코드 형태인 경우도 있지만, 재사용할 수 있는 리소스 모음입니다. library의 크롬 번역은 '도서관'입니다. 위키피디아 상위 페이지를 보면 도서관이란 말이 과학 기술 분야에서 응용되는 양상을 관찰할 수 있습니다. (음악 분야도 있네요.)
그리고 보면 개념 정의 이후에 카테고리 부분이 눈에 띕니다. 라이브러리 제공 형식을 분류해 놓은 것이죠. executable, static, dynamic, source, shared, object, class, remote, 프로그래밍 언어 표준, 코드 생성 따위가 있습니다.
모듈 페이지를 향하면 모듈식 프로그래밍(Modular programming) 페이지로 안내합니다. 크롬 번역으로 정의 부분을 옮겼습니다.
모듈식 프로그래밍은 코드베이스의 기능을 독립적인 모듈로 구성하는 것을 강조하는 소프트웨어 개발 사고방식입니다. 각 모듈은 다른 측면을 제공하지 않고 컴퓨터 프로그램의 특정 측면을 전체적으로 제공합니다.
위키피디아의 상세한 내용을 보면 앞서 소개한 <모듈성은 소프트웨어 개발의 진정한 기술이다>를 떠올리게 됩니다.
나는 이것이 소프트웨어 개발의 진정한 기술이라고 생각한다. 이런 특성은 자신의 분야에 통달한 전문가가 작성한 코드와 갓 입문한 초보자가 작성한 코드를 가장 크게 구분하는 요소다.
위 내용에 따르면 모듈성(modularity)은 개인 차가 크다는 것인데요. 언어에서 제공하는 모듈 수준은 높지 않습니다.
어셈블리(C# , F# , Visual Basic(.NET)과 같은 .NET 언어에서처럼) 또는 패키지(Dart , Go , Java에서처럼)라는 용어가 모듈 대신 사용되는 경우가 있습니다. 다른 구현에서는 이러한 개념이 서로 다릅니다. Python에서 패키지는 모듈의 집합인 반면, Java 9에서는 새로운 모듈 개념(향상된 액세스 제어를 갖춘 패키지 집합)이 도입되었습니다.
접근 제어 수준에 그치는 것으로 볼 수 있습니다.[1]
마지막으로 추상 데이터 타입(Abstract data type)입니다.
컴퓨터 과학에서 추상 데이터 유형(ADT)은 데이터 유형에 대한 수학적 모델로, 데이터 사용자 관점에서 동작(의미론)에 의해 정의되며 , 특히 가능한 값, 이 유형의 데이터에 대한 가능한 연산, 그리고 이러한 연산의 동작을 다룹니다.
컴퓨터 공학 전공자가 아니고 주로 기업용 응용 프로그래밍 개발 분야에서만 일해서 그런지 정의 부분보다는 페이지 내에서 다음에 보이는 내용이 더 공감이 갑니다. 언어 차원에서 제공해 주는 표준 타입이나 유틸리티에 이미 포함된 형태라고 느껴집니다.
[1] 반면에 npm은 상대적으로 더 나은 모듈 제공 방식이란 생각이 드는데, 사용 경험도 많지 않고 주제와 밀접한 관련이 없어 그에 대한 내용을 다루지 않습니다.
(10회 이후 링크만 표시합니다.)
10. 목적에 따라 소프트웨어 설계 활동의 양상이 달라진다
16. 의사결정 부담을 줄여주는 패턴과 if로 시작하는 조건문
22. 내 코드에서 일정한 질서와 규칙에 따라 흐르는 원리
23. 소프트웨어 공학 지식 체계 문서에 드러난 AI와의 관계