이것을 요구하는 또 다른 방법은; 프로그램이 왜 모 놀리 식인 경향이 있는가?
사람들이 다양한 워크 플로에 사용하는 Maya와 같은 애니메이션 패키지를 생각하고 있습니다.
애니메이션과 모델링 기능이 별도의 응용 프로그램으로 분할되어 파일을 전달하면서 별도로 개발 된 경우 유지 관리가 쉽지 않습니까?
이것을 요구하는 또 다른 방법은; 프로그램이 왜 모 놀리 식인 경향이 있는가?
사람들이 다양한 워크 플로에 사용하는 Maya와 같은 애니메이션 패키지를 생각하고 있습니다.
애니메이션과 모델링 기능이 별도의 응용 프로그램으로 분할되어 파일을 전달하면서 별도로 개발 된 경우 유지 관리가 쉽지 않습니까?
답변:
예. 일반적으로 두 개의 작은 응용 프로그램은 하나의 큰 응용 프로그램보다 유지 관리가 훨씬 쉽습니다.
그러나 응용 프로그램이 모두 함께 작동하여 목표를 달성하면 새로운 유형의 버그가 발생합니다. 그들이 함께 작동하게하려면 메시지를 교환해야 하며이 오케스트레이션 은 모든 응용 프로그램이 완벽하게 작동하더라도 다양한 방식으로 잘못 될 수 있습니다. 백만 개의 작은 응용 프로그램을 갖는 데는 특별한 문제가 있습니다.
단일 응용 프로그램은 단일 응용 프로그램에 점점 더 많은 기능을 추가 할 때 실제로 기본 옵션입니다. 각 기능을 자체적으로 고려할 때 가장 쉬운 방법입니다. 한 번만 커지면 전체를 볼 수 있고 "X와 Y를 분리하면 더 잘 작동 할 것입니다."라고 말할 수 있습니다.
잠재적으로 단일 응용 프로그램을 여러 개의 작은 응용 프로그램으로 분할하면 버그를 예방할 수 있습니다
현실에서는 그다지 단순하지 않습니다.
분할하는 것이 처음에는 이러한 버그를 방지하는 데 도움이되지 않습니다. 때로는 버그를 더 빨리 찾는 데 도움이 될 수 있습니다. 작고 격리 된 구성 요소로 구성된 응용 프로그램은 해당 구성 요소에 대해 더 많은 개별 ( "단위"-) 테스트를 허용하여 특정 버그의 근본 원인을보다 쉽게 발견 할 수 있으므로 더 빨리 수정할 수 있습니다.
하나,
외부에서 모 놀리 식으로 보이는 응용 프로그램조차도 내부에서 단위 테스트 가능한 많은 구성 요소로 구성 될 수 있으므로 단위 테스트가 모 놀리 식 응용 프로그램에 반드시 필요한 것은 아닙니다.
Ewan이 이미 언급했듯이 여러 구성 요소의 상호 작용으로 인해 추가 위험과 버그가 발생합니다. 또한 프로세스 간 통신이 복잡한 애플리케이션 시스템을 디버깅하는 것이 단일 프로세스 애플리케이션을 디버깅하는 것보다 훨씬 어려울 수 있습니다.
또한 더 큰 앱이 구성 요소로 얼마나 잘 분할 될 수 있는지, 구성 요소 간 인터페이스의 폭, 인터페이스 사용 방법에 따라 달라집니다.
요컨대, 이것은 종종 절충점이며, "예"또는 "아니오"라는 대답이 일반적으로 올바른 곳은 없습니다.
프로그램이 왜 모 놀리 식인 경향이 있는가?
그들은 할? 주위를 둘러 보면 전 세계에 엄청나게 보이지 않는 수많은 웹 응용 프로그램이 있습니다. 플러그인 모델을 제공하는 많은 프로그램이 있습니다 (AFAIK조차 언급 한 Maya 소프트웨어조차도 가능합니다).
그들은 유지하기 쉽지 않을까요
여기서 "쉬운 유지 관리"는 종종 다른 팀이 응용 프로그램의 다른 부분을 더 쉽게 개발할 수 있다는 사실에서 비롯된 것입니다. 따라서 분산 된 워크로드, 초점이 분명한 전문 팀 등입니다.
나는 이것에 대해 대다수의 의견에 동의하지 않을 것이다. 응용 프로그램을 두 개의 개별 응용 프로그램으로 분리한다고해서 코드를 유지 관리하거나 추론하기가 더 쉬워지는 것은 아닙니다.
코드를 두 개의 실행 파일로 분리하면 코드의 물리적 구조 만 변경 되지만 중요한 것은 아닙니다. 응용 프로그램이 얼마나 복잡한지를 결정하는 것은 응용 프로그램을 구성하는 여러 부분 이 얼마나 밀접하게 결합되어 있는지 입니다. 이것은 물리적 속성이 아니라 논리적 속성 입니다.
서로 다른 관심사와 간단한 인터페이스를 명확하게 분리 한 모 놀리 식 응용 프로그램을 사용할 수 있습니다. 다른 마이크로 서비스의 구현 세부 사항에 의존하고 다른 모든 마이크로 서비스와 밀접하게 연결된 마이크로 서비스 아키텍처를 가질 수 있습니다.
사실 하나의 큰 응용 프로그램을 작은 응용 프로그램으로 나누는 방법은 각 부분에 대해 명확한 인터페이스와 요구 사항을 설정하려고 할 때 매우 유용합니다. DDD에서 당신의 경계 된 상황에 대해 이야기 할 것입니다. 그러나 작은 응용 프로그램을 많이 만들든지 논리적 구조가 동일한 큰 응용 프로그램을 만들 것인지는 더 기술적 인 결정에 달려 있습니다.
분할이 끝나면 유지 관리가 더 쉽습니다. 그러나 그것들을 나누는 것이 항상 쉬운 것은 아닙니다. 프로그램의 일부를 재사용 가능한 라이브러리로 분리하려고 시도하면 원래 개발자가 이음새의 위치에 대해 생각하지 못한 위치 를 알 수 있습니다. 응용 프로그램의 한 부분이 응용 프로그램의 다른 부분에 깊숙이 도달하면 수정하기가 어려울 수 있습니다. 솔기를 추출하면 더 명확하게 내부 API를 정의하기 위해 강제하고, 이는 궁극적으로 유지하기 코드베이스를 쉽게 만드는 것입니다. 재사용 성과 유지 보수성은 잘 정의 된 솔기의 제품입니다.
상관 관계가 원인이 아님을 기억하는 것이 중요합니다.
큰 모놀리스를 만들어서 여러 개의 작은 부분으로 나누면 디자인이 좋을 수도 있고 아닐 수도 있습니다. (그것은 수있는 디자인을 개선 있지만 보장되지 않습니다.)
그러나 좋은 디자인은 종종 시스템을 큰 모놀리스가 아닌 여러 개의 작은 부분으로 구성합니다. (A 모노리스 수 있습니다 그냥 훨씬 덜 할 수있어, 최고의 디자인합니다.)
작은 부품이 더 나은 이유는 무엇입니까? 그들이 추론하기 쉽기 때문입니다. 정확성에 대해 추론하기 쉬운 경우 올바른 결과를 얻을 가능성이 높습니다.
CAR Hoare를 인용하려면 :
소프트웨어 설계를 구성하는 두 가지 방법이 있습니다. 한 가지 방법은 간단 하게 결함 이 없도록하고, 다른 방법은 너무 복잡하게하여 명백한 결함 이없는 것 입니다.
이 경우 왜 불필요하게 복잡하거나 모 놀리 식 솔루션을 구축해야합니까? Hoare는 바로 다음 문장에서 답을 제공합니다.
첫 번째 방법은 훨씬 더 어렵다.
그리고 나중에 같은 출처에서 (1980 Turing Award 강의) :
신뢰성의 가격은 최대한의 단순성을 추구합니다. 그것은 매우 부유 한 사람들이 지불하기 가장 어려운 가격입니다.
이것은 예 또는 아니오로 대답하는 질문이 아닙니다. 문제는 유지 관리가 쉬울뿐만 아니라 기술을 효율적으로 사용하는 것이기도합니다.
일반적으로 잘 작성된 단일 응용 프로그램이 효율적입니다. 프로세스 간 및 장치 간 통신은 저렴하지 않습니다. 단일 프로세스를 분해하면 효율성이 떨어집니다. 그러나 단일 프로세서에서 모든 것을 실행하면 프로세서에 과부하가 걸리고 성능이 저하 될 수 있습니다. 이것이 기본적인 확장 성 문제입니다. 네트워크가 사진에 들어가면 문제가 더 복잡해집니다.
단일 서버에서 단일 프로세스로 효율적으로 작동 할 수있는 잘 작성된 단일 응용 프로그램은 유지 관리가 쉽고 결함이 없어도 코딩 및 아키텍처 기술을 효율적으로 사용할 수는 없습니다. 첫 번째 단계는 프로세스를 여전히 동일한 프로세스로 실행되지만 응집력과 느슨한 결합의 규칙에 따라 독립적으로 코딩되는 라이브러리로 나누는 것입니다. 이 수준에서 일을 잘하면 유지 관리 성이 향상되고 성능에 거의 영향을 미치지 않습니다.
다음 단계는 모놀리스를 별도의 프로세스로 나누는 것입니다. 까다로운 영토에 들어가기 때문에 더 어렵습니다. 경쟁 조건 오류가 발생하기 쉽습니다. 통신 오버 헤드가 증가하고 "Chat 인터페이스"에주의해야합니다. 확장 성 장벽을 무너 뜨리기 때문에 보상은 크지 만 결함 가능성도 높아집니다. 다중 프로세스 응용 프로그램은 모듈 수준에서 유지 관리하기가 쉽지만 전체 시스템은 더 복잡하고 문제 해결이 더 어렵습니다. 수정은 엄청나게 복잡 할 수 있습니다.
프로세스가 별도의 서버 또는 클라우드 스타일 구현으로 분산되면 문제가 더 어려워지고 보상이 커집니다. 확장 성이 급증합니다. (확장 성을 제공하지 않는 클라우드 구현을 고려하고 있다면 열심히 생각하십시오.) 그러나이 단계에서 발생하는 문제는 식별하고 생각하기가 매우 어려울 수 있습니다.
없음 . 유지하기가 쉽지 않습니다. 더 많은 문제에 오신 것을 환영합니다.
왜?
이제 필요한 두 가지 제품이 있습니다.
이제 모델러, 애니메이터 및 모델러 애니메이터의 세 가지 소비자 시장이 있습니다.
더 작은 코드 기반은 응용 프로그램 수준에서 유지 관리하기가 더 쉽다고 말하면 무료 점심을 먹지 않을 것입니다. 이는 마이크로 서비스 / 모든 모듈 아키텍처의 핵심에서 동일한 문제입니다. 만병 통치약이 아니며, 적용 수준에서의 유지 관리 어려움은 오케스트레이션 수준의 유지 관리 어려움과 관련이 있습니다. 이러한 문제는 여전히 문제이며 더 이상 코드 기반이 아니므로 피하거나 해결해야합니다.
오케스트레이션 수준에서 문제를 해결하는 것이 더 간단하고 각 응용 프로그램 수준에서 문제를 해결하는 경우 문제를 두 개의 코드 기반으로 나누고 오케스트레이션 문제를 처리하는 것이 좋습니다.
그렇지 않다면 그냥하지 말고 애플리케이션 자체의 내부 모듈성을 개선하여 더 나은 서비스를 제공 할 수 있습니다. 코드 섹션을 응집력 있고 응용 프로그램이 플러그인으로 작동하는 라이브러리를 유지 관리하기 쉽게 밀어 넣습니다. 결국 모놀리스는 단지 라이브러리 환경의 오케스트레이션 레이어입니다.
좋은 답변이 많이 있었지만 거의 죽은 분할이 있기 때문에 모자에 고리를 넣을 것입니다.
소프트웨어 엔지니어로서의 경험에서 나는 이것이 단순한 문제가 아니라는 것을 알았습니다. 실제로 응용 프로그램 의 크기 , 규모 및 목적 에 따라 다릅니다 . 변경에 필요한 관성으로 인해 오래된 응용 프로그램은 일반적으로 오랜 시간 동안 일반적인 관행이기 때문에 모 놀리 식입니다 (Maya는이 범주에 해당합니다). 나는 당신이 일반적으로 새로운 응용 프로그램에 대해 이야기한다고 가정합니다.
다소의 단일 관심사 인 충분히 작은 응용에서, 많은 개별 부품을 유지하는데 요구되는 오버 헤드는 일반적으로 분리의 유용성을 초과한다. 한 사람이 유지할 수 있다면 너무 많은 문제를 일으키지 않고 모 놀리 식으로 만들 수 있습니다. 이 규칙의 예외는 편리하게 (논리적으로) 분리 된 많은 다른 부분 (프론트 엔드, 백엔드, 아마도 일부 데이터 레이어)이있는 경우입니다.
매우 큰 단일 관심사 응용 프로그램에서 응용 프로그램을 분할하면 내 경험에 의미가 있습니다. 다른 버그 (때로는 해결하기 쉬운 버그)와 교환하여 가능한 버그 클래스의 하위 세트를 줄이는 이점이 있습니다. 일반적으로 직원 팀을 격리시켜 작업하여 생산성을 향상시킬 수도 있습니다. 그러나 요즘 많은 응용 프로그램은 때로는 세밀하게 나뉘어져 있습니다. 또한 응용 프로그램이 불필요하게 많은 마이크로 서비스에 걸쳐 분할되어 팀과의 대화가 중단되면 많은 오버 헤드가 발생했습니다. 또한, 각 부분이 다른 부분과 대화하는 방법에 대한 모든 지식을 보유해야하는 것은 각각의 연속적인 분할마다 훨씬 어려워집니다. 균형이 있으며 여기에서 답을 통해 알 수 있듯이 그렇게하는 방법은 명확하지 않습니다.
UI 앱의 경우 전체 버그 양을 줄일 수는 없지만 버그 믹스의 균형을 통신으로 인한 문제로 바꿉니다.
사용자가 UI 응용 프로그램 / 사이트를 마주보고 있다고 말하면 사용자는 매우 환자가 아니며 응답 시간이 짧습니다. 이것은 통신 지연을 버그로 만듭니다. 결과적으로 매우 어려운 버그와 프로세스 간 / 기계 간 통신의 타이밍 요구 사항으로 단일 구성 요소의 복잡성이 감소하여 버그의 잠재적 감소를 거래하게됩니다.
프로그램이 처리하는 데이터의 단위가 크면 (즉, 이미지), 프로세스 간 지연이 길고 제거하기가 더 어려워집니다. "10mb 이미지로 변환 적용"과 같은 것은 즉시 + 20mb의 디스크 / 네트워크 IO를 얻습니다. 메모리 내 형식에서 직렬 형식으로 또는 그 반대로 변환 실제로 사용자로부터 시간을 숨기기 위해 할 수있는 일은 많지 않습니다.
또한 모든 통신 및 특히 디스크 IO에는 AntiVirus / Firewall 검사가 적용됩니다. 이는 불가피하게 버그를 재현하기 어려운 또 다른 계층과 추가 지연을 추가합니다.
통신 지연이 중요하지 않거나 이미 피할 수없는 곳에 모 놀리 식 "프로그램"분할
이것은 웹 사이트뿐만 아니라 데스크톱 응용 프로그램에도 적용됩니다. 프로그램의 사용자가 직면하는 부분은 "단일체 (monolithic)"인 경향이 있습니다. 단일 데이터에 연결된 모든 사용자 상호 작용 코드는 일반적으로 단일 프로세스에서 실행됩니다 (분할하는 것은 드문 일이 아닙니다) HTML 페이지 또는 이미지와 같은 데이터 단위로 처리하지만이 질문에 직교합니다). 사용자 입력이있는 대부분의 기본 사이트의 경우 서버 쪽을 더 모듈화하고 복잡성 / 코드 중복을 줄이더라도 클라이언트 쪽에서 유효성 검사 논리가 실행되는 것을 볼 수 있습니다.
버그 예방에 도움이 되나요?
막다? 아뇨
따라서 단일 응용 프로그램을 작은 구성 요소로 나누는 것만으로 버그를 예방한다고 말하지는 않지만 실제로 버그를보다 쉽게 예방할 수있는 지점에 쉽게 도달 할 수 있습니다.
If the animation and modelling capabilities were split into their own separate application and developed separately, with files being passed between them, would they not be easier to maintain?
혼합하지 마십시오 연장 쉽게 로 유지하기 위해 쉽게 SE-합병증 또는 의심스러운 디자인을 무료로하지 않습니다 -per 모듈을. Maya는 플러그인이 아닌 동안 유지해야 할 지옥이 될 수 있습니다. 혹은 그 반대로도.