최근에 "소프트웨어 디자인 철학"을 읽었고 두 번째 장에서는 소프트웨어 복잡성이라는 주제를 탐구합니다.
"A Philosophy of Software Design"이라는 책에서는 복잡성을 실질적으로 정의합니다.
"복잡성은 이해하고 수정하기 어렵게 만드는 소프트웨어 시스템의 구조와 관련된 모든 것입니다."
즉, 복잡성은 다양한 형태를 취할 수 있으며 반드시 성능과 관련이 있는 것은 아닙니다. 코드는 성능을 발휘하면서도 여전히 복잡할 수 있습니다
이 기사에서는 책에 담긴 몇 가지 주요 정의와 통찰력을 공유하고 싶습니다. 하지만 먼저 여러분이 이미 겪어봤을 일반적인 상황을 상상해 봅시다...
많은 분들이 경험하셨거나 경험하게 되실 공포 이야기 속으로 들어가 보겠습니다.
간단한 CRUD 작업 관리 앱으로 시작되었습니다. 코드는 깔끔하고 모듈식이며 유지 관리가 쉬웠습니다. 개발팀은 만족했고 시스템은 초기 고객에게 완벽하게 작동했습니다.
문제는 영업팀이 시스템에 캘린더 통합, 이메일 알림, 놀라운 보고서 생성 기능이 있다고 주장하면서 시스템을 대기업에 판매하면서 시작되었습니다. 판매가 마무리되면서 이러한 기능을 신속하게 구현해야 했습니다.
캘린더 통합: 팀은 Google 캘린더 및 Outlook과 통합해야 했습니다. 다양한 개발자가 솔루션을 구현했기 때문에 접근 방식이 일관되지 않았습니다.
이메일 알림: 이메일 알림이 다음에 추가되었습니다. 한 개발자는 특정 라이브러리를 사용했고 다른 개발자는 맞춤형 솔루션을 만들었습니다. 혼합된 접근 방식으로 인해 코드가 혼란스러워졌습니다.
보고서 생성기: 보고서 생성기의 경우 개발자는 PDF, Excel 내보내기, 대화형 대시보드 등 다양한 기술을 사용했습니다. 통일된 접근 방식이 부족하여 유지 관리가 악몽이 되었습니다.
점증하는 복잡성: 각 기능은 독립적으로 빠르게 개발되어 기능 간 종속성이 발생했습니다. 개발자들은 모든 것이 작동하도록 "빠른 수정"을 만들기 시작하여 시스템의 복잡성과 연결성을 높였습니다.
소프트웨어 개발은 진공 상태에서 이루어지지 않습니다. 다양한 내부 및 외부 요인이 영향을 미칩니다. 우리 모두는 이런 상황에 처해 있었고, 앞으로도 그럴 것입니다.
그런 다음 문제가 시작되었습니다.
이제 시스템이 복잡하다는 것은 분명합니다.
이제 이 복잡성을 "해부"하여 이를 더 쉽게 식별하고 완화해 보겠습니다.
"완화"는 다음을 의미합니다.
"덜 심각하거나 심각하거나 고통스럽지 않게 만들다, 완화시키다."
저는 종종 코드에 복잡성이 내재되어 있다고 생각합니다. 어떤 것들은 본질적으로 복잡합니다. 개발자로서 귀하의 역할은 컴퓨터가 효율적으로 실행할 수 있는 코드를 만드는 것뿐만 아니라 미래의 개발자(미래의 자신도 포함)가 작업할 수 있는 코드를 만드는 것입니다.
“복잡성을 제어하는 것이 컴퓨터 프로그래밍의 핵심입니다.”
— 브라이언 커니건
언급된 책의 저자는 복잡성이 일반적으로 세 가지 방식으로 나타난다고 말하며 여기서는 이에 대해 살펴보겠습니다.
변경 증폭은 겉으로는 단순해 보이는 변경이 여러 곳에서 수정이 필요할 때 발생합니다.
예를 들어 제품 소유자가 "우선순위" 또는 "완료 날짜" 필드를 요청하고 엔터티가 밀접하게 결합되어 있는 경우 얼마나 많은 변경을 수행해야 합니까?
인지 부하는 개발자가 작업을 완료하는 데 필요한 지식과 시간의 양을 나타냅니다.
이런 시나리오를 상상해 보세요. 새로운 개발자가 팀에 합류했고, 그는 보고서 생성기의 버그를 수정하는 임무를 맡았습니다. 이 작업을 완료하려면 개발자가 다음을 수행해야 했습니다.
이것은 작업에 1점 또는 8점이 소요되는 전형적인 "추정 불가능" 시나리오입니다. D20을 굴리고 그에 따라 응답하는 것이 좋습니다.
알 수 없는 것은 자신이 모르는 것을 모르는 것입니다.
이것은 최악의 복잡성 표현입니다. 해서는 안되는 것을 변경하여 모든 것이 중단될 수 있기 때문입니다.
예: 개발자는 해당 기능에 의존하는 보고서 생성기에 영향을 미칠 것이라는 사실을 알지 못한 채 새 알림을 추가하기 위해 이메일 전송 코드를 수정했습니다. 이로 인해 고객에게 심각한 문제가 발생했으며 최악의 형태의 긴급 복잡성이 예시되었습니다.
공포 이야기와 세 가지 주요 증상을 살펴보았으니, 복잡성을 유발하는 원인이 무엇인지 살펴보겠습니다.
종속성은 소프트웨어에서 필수적이며 완전히 제거할 수는 없습니다. 이를 통해 시스템의 서로 다른 부분이 함께 상호 작용하고 기능할 수 있습니다. 그러나 종속성을 제대로 관리하지 않으면 복잡성이 크게 증가할 수 있습니다.
코드를 단독으로 이해하거나 수정할 수 없어 관련 코드를 고려하거나 수정해야 하는 경우 종속성이 존재합니다.
중요한 정보가 명확하지 않을 때 모호함이 발생합니다. 이로 인해 코드베이스를 이해하기 어렵게 만들어 인지 부하가 증가하고 알려지지 않은 미지의 위험이 발생할 수 있습니다.
중요한 정보가 명확하지 않을 때 모호함이 발생합니다.
점진적이기 때문에 '이번 한 번이면 괜찮겠다'라고 생각하기 쉽습니다. 하지만 누적되면 하나 또는 두 개의 종속성을 수정하는 것만으로는 큰 차이가 없습니다.
“소프트웨어 엔지니어링에서는 모든 것이 절충안입니다.”
— 작가가 기억나지 않습니다
복잡성을 피하는 방법에 대해 인터넷에서 이미 보셨을 수많은 규칙, 전략, 프레임워크(SOLID, 디자인 패턴, YAGNI, KISS 등)를 작성할 수 있습니다.
그러나 이를 모두 하나의 기본 원칙으로 통합할 수 있습니다("실용주의적 프로그래머"에서 언급한 대로). "내가 구현하고 있는 것이 변경하기 쉬운가요?" 대답이 '아니요'인 경우 아마도 복잡성이 증가하고 있을 것입니다.
코드 변경이 용이하도록 하면 유지 관리가 단순화되고, 개발자의 인지 부하가 줄어들며, 시스템 적응성이 향상되고 오류 발생 가능성이 줄어듭니다.
감사합니다!
위 내용은 소프트웨어 복잡성과의 끝없는 싸움의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!