잠재적으로 단일 응용 프로그램을 여러 개의 작은 응용 프로그램으로 분할하면 버그를 방지하는 데 도움이됩니까? [닫은]


48

이것을 요구하는 또 다른 방법은; 프로그램이 왜 모 놀리 식인 경향이 있는가?

사람들이 다양한 워크 플로에 사용하는 Maya와 같은 애니메이션 패키지를 생각하고 있습니다.

애니메이션과 모델링 기능이 별도의 응용 프로그램으로 분할되어 파일을 전달하면서 별도로 개발 된 경우 유지 관리가 쉽지 않습니까?


9
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는 플러그인이 아닌 동안 유지해야 할 지옥이 될 수 있습니다. 혹은 그 반대로도.
Laiv

37
단일 모 놀리 식 프로그램은 판매 하기 쉽고 대부분의 사람들이 사용 하기 쉬운 경향이 있다고 덧붙 입니다.
DarthFennec

2
@DarthFennec 최고의 앱은 사용자에게는 하나의 앱처럼 보이지만 필요한 모든 것을 활용합니다. 방문하는 다양한 웹 사이트에 몇 개의 마이크로 서비스를 제공합니까? 더 이상 그들 중 누구도 더 이상 모놀리스가 아닙니다!
corsiKa

23
@corsiKa 일반적으로 데스크탑 응용 프로그램을 여러 프로그램 / 통신으로 작성하는 단일 프로그램으로 작성하는 것은 아닙니다. 마이크로 서비스는 단일 애플리케이션이 여러 물리적 서버에서 실행될 수 있으므로로드에 따라 성능을 확장 할 수 있으므로 완전히 다른 목적으로 사용됩니다.
DarthFennec

5
@ corsiKa-내가 사용하는 압도적 인 웹 사이트 수는 여전히 모 놀리식이라고 생각합니다. 결국 인터넷의 대부분은 Wordpress에서 실행됩니다.
Davor Ždralo

답변:


94

예. 일반적으로 두 개의 작은 응용 프로그램은 하나의 큰 응용 프로그램보다 유지 관리가 훨씬 쉽습니다.

그러나 응용 프로그램이 모두 함께 작동하여 목표를 달성하면 새로운 유형의 버그가 발생합니다. 그들이 함께 작동하게하려면 메시지를 교환해야 하며이 오케스트레이션 은 모든 응용 프로그램이 완벽하게 작동하더라도 다양한 방식으로 잘못 될 수 있습니다. 백만 개의 작은 응용 프로그램을 갖는 데는 특별한 문제가 있습니다.

단일 응용 프로그램은 단일 응용 프로그램에 점점 더 많은 기능을 추가 할 때 실제로 기본 옵션입니다. 각 기능을 자체적으로 고려할 때 가장 쉬운 방법입니다. 한 번만 커지면 전체를 볼 수 있고 "X와 Y를 분리하면 더 잘 작동 할 것입니다."라고 말할 수 있습니다.


6
예. 또한 성능 고려 사항도 있습니다. 예를 들어 포인터를 전달하는 비용과 데이터를 직렬화하는 비용.
JimmyJames

65
"일반적으로 두 개의 작은 응용 프로그램은 하나의 큰 응용 프로그램보다 유지 관리가 훨씬 쉽습니다." -그렇지 않은 경우를 제외하고는 사실입니다. 이 두 응용 프로그램이 서로 인터페이스해야하는 위치와 방법에 따라 크게 달라집니다.
Doc Brown

10
"일반적으로 두 개의 작은 응용 프로그램은 하나의 큰 응용 프로그램보다 유지 관리가 훨씬 쉽습니다." 나는 그것에 대해 더 많은 설명을 원할 것이라고 생각합니다. 코드 기반에서 하나의 실행 파일 대신 두 개의 파일을 생성하는 프로세스가 코드를 더 쉽게 만드는 이유는 무엇입니까? 코드가 얼마나 쉬운 지 결정하는 것은 코드가 얼마나 밀접하게 결합되어 있고 비슷한 것들입니다. 그러나 그것은 A의 논리적 분리와와는 아무 상관이없는 물리적 인 하나.
Voo

11
@Ew 물리적 분리는 논리적 분리를 강제하지는 않습니다. 이것이 문제입니다. 두 개의 개별 응용 프로그램이 밀접하게 연결된 시스템을 쉽게 설계 할 수 있습니다. 물론 몇 가지있다 상관 응용 프로그램을 별도의 시간을 보내는 사람들이 가장 가능성이 충분히 경쟁력이 일을 고려하기 때문에 여기에 참여는하지만, 어떤 가정 거의 이유가 원인이 . 같은 논리로 최신 C # 버전을 사용하면 코드를 유지 관리하기가 훨씬 쉽다고 주장 할 수 있습니다. 도구를 최신 상태로 유지하는 팀은 코드 유지 관리에 대해 걱정할 것입니다.
Voo

9
여기에 대한 논의는 두 가지 진술로 요약 될 수 있다고 생각합니다 .1) 앱 자체를 분할해도 앱을 유지 관리하기가 쉽지 않습니다. 반면에 다른 가능한 실패 지점을 제공합니다 .2) 앱 분할하면 분할 할 위치를 생각하게됩니다 그것은 결코 수행되지 않은 모노리스와 비교하여 이점을 제공합니다.
R. Schmitz

51

잠재적으로 단일 응용 프로그램을 여러 개의 작은 응용 프로그램으로 분할하면 버그를 예방할 수 있습니다

현실에서는 그다지 단순하지 않습니다.

분할하는 것이 처음에는 이러한 버그를 방지하는 데 도움이되지 않습니다. 때로는 버그를 더 빨리 찾는 데 도움이 될 수 있습니다. 작고 격리 된 구성 요소로 구성된 응용 프로그램은 해당 구성 요소에 대해 더 많은 개별 ( "단위"-) 테스트를 허용하여 특정 버그의 근본 원인을보다 쉽게 ​​발견 할 수 있으므로 더 빨리 수정할 수 있습니다.

하나,

  • 외부에서 모 놀리 식으로 보이는 응용 프로그램조차도 내부에서 단위 테스트 가능한 많은 구성 요소로 구성 될 수 있으므로 단위 테스트가 모 놀리 식 응용 프로그램에 반드시 필요한 것은 아닙니다.

  • Ewan이 이미 언급했듯이 여러 구성 요소의 상호 작용으로 인해 추가 위험과 버그가 발생합니다. 또한 프로세스 간 통신이 복잡한 애플리케이션 시스템을 디버깅하는 것이 단일 프로세스 애플리케이션을 디버깅하는 것보다 훨씬 어려울 수 있습니다.

또한 더 큰 앱이 구성 요소로 얼마나 잘 분할 될 수 있는지, 구성 요소 간 인터페이스의 폭, 인터페이스 사용 방법에 따라 달라집니다.

요컨대, 이것은 종종 절충점이며, "예"또는 "아니오"라는 대답이 일반적으로 올바른 곳은 없습니다.

프로그램이 왜 모 놀리 식인 경향이 있는가?

그들은 할? 주위를 둘러 보면 전 세계에 엄청나게 보이지 않는 수많은 웹 응용 프로그램이 있습니다. 플러그인 모델을 제공하는 많은 프로그램이 있습니다 (AFAIK조차 언급 한 Maya 소프트웨어조차도 가능합니다).

그들은 유지하기 쉽지 않을까요

여기서 "쉬운 유지 관리"는 종종 다른 팀이 응용 프로그램의 다른 부분을 더 쉽게 개발할 수 있다는 사실에서 비롯된 것입니다. 따라서 분산 된 워크로드, 초점이 분명한 전문 팀 등입니다.


4
Conway의 법칙에 따르면 마지막 문장 은 시스템 구조가 조직을 모방하는 경향이 있다고합니다. 구조 : 개발자 / 팀은 다른 부분보다 일부 부분에 더 친숙하므로 수정 / 개선 가장 관련성이 높은 부분에서 발생 해야하는 반면 개발자는 (a) 방법보다는 "그들의"부분에 해킹하는 것이 더 쉬울 수 있습니다. 다른 부분이 작동하거나 (b) 해당 부분에 더 익숙한 사람과 협력합니다. 이것은 @TKK가 언급 한 "솔기"와 관련이 있으며, "올바른"/ 간단한 것을 찾아서 적용하는 것이 얼마나 어려운지에 대한 것입니다.
Warbo

38

나는 이것에 대해 대다수의 의견에 동의하지 않을 것이다. 응용 프로그램을 두 개의 개별 응용 프로그램으로 분리한다고해서 코드를 유지 관리하거나 추론하기가 더 쉬워지는 것은 아닙니다.

코드를 두 개의 실행 파일로 분리하면 코드의 물리적 구조 만 변경 되지만 중요한 것은 아닙니다. 응용 프로그램이 얼마나 복잡한지를 결정하는 것은 응용 프로그램을 구성하는 여러 부분 이 얼마나 밀접하게 결합되어 있는지 입니다. 이것은 물리적 속성이 아니라 논리적 속성 입니다.

서로 다른 관심사와 간단한 인터페이스를 명확하게 분리 한 모 놀리 식 응용 프로그램을 사용할 수 있습니다. 다른 마이크로 서비스의 구현 세부 사항에 의존하고 다른 모든 마이크로 서비스와 밀접하게 연결된 마이크로 서비스 아키텍처를 가질 수 있습니다.

사실 하나의 큰 응용 프로그램을 작은 응용 프로그램으로 나누는 방법은 각 부분에 대해 명확한 인터페이스와 요구 사항을 설정하려고 할 때 매우 유용합니다. DDD에서 당신의 경계 된 상황에 대해 이야기 할 것입니다. 그러나 작은 응용 프로그램을 많이 만들든지 논리적 구조가 동일한 큰 응용 프로그램을 만들 것인지는 더 기술적 인 결정에 달려 있습니다.


그러나 여러 편집 모드가있는 데스크톱 응용 프로그램을 가져 와서 사용자가 인터페이스 대신 개별적으로 열 수있는 각 모드에 대해 하나의 데스크톱 응용 프로그램을 만드는 경우 어떻게해야합니까? "사용자가 편집 모드 사이를 전환 할 수 있습니다"의 "기능"을 생성하는 데 필요한 사소한 양의 코드를 제거하지 않겠습니까?
그레이트 오리

3
@TheGreatDuck 다른 응용 프로그램 사이를 전환하지 않으려는 사소한 사용자를 제거하는 것처럼 들립니다. ;) 그러나 기능을 제거하면 일반적으로 코드가 단순 해집니다. 맞춤법 검사를 제거하면 맞춤법 검사 버그가 발생할 가능성이 없어집니다. 누군가가 원하는 기능을 추가했기 때문에 거의 수행되지 않습니다.
Odalrick

1
@TheGreatDuck 분명히 UX의 디자인은 아키텍처 결정에 앞서야합니다. 아무도 당신의 프로그램을 사용하지 않는다면 최고의 설계 아키텍처를 가질 필요는 없습니다. 먼저 기술적 세부 사항에 따라 결정하고 구축 할 대상을 결정하십시오. 두 개의 개별 응용 프로그램이 선호되는 경우 사용하십시오. 그래도 공유 라이브러리를 통해 많은 코드를 공유 할 수 있습니다.
Voo

시스템 의 복잡성 이 부품의 긴밀한 결합으로 인한 것이라고 말하는 것이 사실 입니까? 특정 개별 구성 요소 의 복잡성이 제한된 제한적인 상태로 격리되어 있지만 간접 및 통신을 도입 할 때 시스템을 분할하면 총 복잡성이 증가 한다고 말하고 싶습니다 .
Alex

1
@TheGreatDuck 여기서 기본 가정은 시스템에 공통적 인 것이 있으며 실제로 서로 통신해야한다는 것입니다. OP가 이상한 이유로 묶여있는 완전히 다른 두 개의 응용 프로그램이 분리되어 있으면 유지하기가 더 쉬운 지 묻지 않았다고 생각합니다. 실제로 자주 나오지 않는 이상한 가장자리처럼 보입니다 (어딘가에 누군가가 그렇게했다고 확신하지만).
Voo

15

분할이 끝나면 유지 관리가 더 쉽습니다. 그러나 그것들을 나누는 것이 항상 쉬운 것은 아닙니다. 프로그램의 일부를 재사용 가능한 라이브러리로 분리하려고 시도하면 원래 개발자가 이음새의 위치에 대해 생각하지 못한 위치 를 알 수 있습니다. 응용 프로그램의 한 부분이 응용 프로그램의 다른 부분에 깊숙이 도달하면 수정하기가 어려울 수 있습니다. 솔기를 추출하면 더 명확하게 내부 API를 정의하기 위해 강제하고, 이는 궁극적으로 유지하기 코드베이스를 쉽게 만드는 것입니다. 재사용 성과 유지 보수성은 잘 정의 된 솔기의 제품입니다.


좋은 소식. 나는 당신이 말하는 것에 대한 고전적 / 표준적인 예가 GUI 응용 프로그램이라고 생각합니다. 여러 번 GUI 응용 프로그램이 하나의 프로그램이고 백엔드 / 프론트 엔드가 밀접하게 연결되어 있습니다. 시간이 지남에 따라 다른 사람이 백엔드를 사용해야하지만 프론트 엔드에 묶여서 할 수없는 것처럼 문제가 발생합니다. 또는 백엔드 처리 시간이 너무 오래 걸리고 프론트 엔드가 다운됩니다. 하나의 큰 GUI 응용 프로그램은 종종 두 개의 프로그램으로 나뉩니다. 하나는 프론트 엔드 GUI이고 다른 하나는 백엔드입니다.
Trevor Boyd Smith

13

상관 관계가 원인이 아님을 기억하는 것이 중요합니다.

큰 모놀리스를 만들어서 여러 개의 작은 부분으로 나누면 디자인이 좋을 수도 있고 아닐 수도 있습니다. (그것은 수있는 디자인을 개선 있지만 보장되지 않습니다.)

그러나 좋은 디자인은 종종 시스템을 큰 모놀리스가 아닌 여러 개의 작은 부분으로 구성합니다. (A 모노리스 수 있습니다 그냥 훨씬 덜 할 수있어, 최고의 디자인합니다.)

작은 부품이 더 나은 이유는 무엇입니까? 그들이 추론하기 쉽기 때문입니다. 정확성에 대해 추론하기 쉬운 경우 올바른 결과를 얻을 가능성이 높습니다.

CAR Hoare를 인용하려면 :

소프트웨어 설계를 구성하는 두 가지 방법이 있습니다. 한 가지 방법은 간단 하게 결함 이 없도록하고, 다른 방법은 너무 복잡하게하여 명백한 결함 이없는 입니다.

이 경우 왜 불필요하게 복잡하거나 모 놀리 식 솔루션을 구축해야합니까? Hoare는 바로 다음 문장에서 답을 제공합니다.

첫 번째 방법은 훨씬 더 어렵다.

그리고 나중에 같은 출처에서 (1980 Turing Award 강의) :

신뢰성의 가격은 최대한의 단순성을 추구합니다. 그것은 매우 부유 한 사람들이 지불하기 가장 어려운 가격입니다.


6

이것은 예 또는 아니오로 대답하는 질문이 아닙니다. 문제는 유지 관리가 쉬울뿐만 아니라 기술을 효율적으로 사용하는 것이기도합니다.

일반적으로 잘 작성된 단일 응용 프로그램이 효율적입니다. 프로세스 간 및 장치 간 통신은 저렴하지 않습니다. 단일 프로세스를 분해하면 효율성이 떨어집니다. 그러나 단일 프로세서에서 모든 것을 실행하면 프로세서에 과부하가 걸리고 성능이 저하 될 수 있습니다. 이것이 기본적인 확장 성 문제입니다. 네트워크가 사진에 들어가면 문제가 더 복잡해집니다.

단일 서버에서 단일 프로세스로 효율적으로 작동 할 수있는 잘 작성된 단일 응용 프로그램은 유지 관리가 쉽고 결함이 없어도 코딩 및 아키텍처 기술을 효율적으로 사용할 수는 없습니다. 첫 번째 단계는 프로세스를 여전히 동일한 프로세스로 실행되지만 응집력과 느슨한 결합의 규칙에 따라 독립적으로 코딩되는 라이브러리로 나누는 것입니다. 이 수준에서 일을 잘하면 유지 관리 성이 향상되고 성능에 거의 영향을 미치지 않습니다.

다음 단계는 모놀리스를 별도의 프로세스로 나누는 것입니다. 까다로운 영토에 들어가기 때문에 더 어렵습니다. 경쟁 조건 오류가 발생하기 쉽습니다. 통신 오버 헤드가 증가하고 "Chat 인터페이스"에주의해야합니다. 확장 성 장벽을 무너 뜨리기 때문에 보상은 크지 만 결함 가능성도 높아집니다. 다중 프로세스 응용 프로그램은 모듈 수준에서 유지 관리하기가 쉽지만 전체 시스템은 더 복잡하고 문제 해결이 더 어렵습니다. 수정은 엄청나게 복잡 할 수 있습니다.

프로세스가 별도의 서버 또는 클라우드 스타일 구현으로 분산되면 문제가 더 어려워지고 보상이 커집니다. 확장 성이 급증합니다. (확장 성을 제공하지 않는 클라우드 구현을 고려하고 있다면 열심히 생각하십시오.) 그러나이 단계에서 발생하는 문제는 식별하고 생각하기가 매우 어려울 수 있습니다.


4

없음 . 유지하기가 쉽지 않습니다. 더 많은 문제에 오신 것을 환영합니다.

왜?

  • 이 프로그램은 합리적으로 가능한 한 서로의 작업을 보존하는 데 필요한 직교성이 아니며, 이는 일반적인 이해를 의미합니다.
  • 두 프로그램의 많은 코드는 동일합니다. 공통 공유 라이브러리를 유지 관리합니까, 아니면 별도의 사본 두 개를 유지 관리하십니까?
  • 이제 두 개의 개발 팀이 있습니다. 그들은 어떻게 의사 소통하고 있습니까?
  • 이제 필요한 두 가지 제품이 있습니다.

    • 일반적인 UI 스타일, 상호 작용 메커니즘 등 ... 이제 디자인 문제가 있습니다. (개발팀은 어떻게 다시 의사 소통을합니까?)
    • 이전 버전과의 호환성 (모델러 v1을 애니메이터 v3으로 가져올 수 있습니까?)
    • 클라우드 / 네트워크 통합 (기능이있는 경우)은 이제 두 배 많은 제품에서 업데이트되어야합니다.
  • 이제 모델러, 애니메이터 및 모델러 애니메이터의 세 가지 소비자 시장이 있습니다.

    • 그들은 우선 순위가 상충 될 것이다
    • 상충되는 지원 요구가있을 것입니다
    • 충돌하는 사용 스타일이 있습니다.
  • Modeller Animators가 동일한 파일에서 작업하기 위해 두 개의 개별 응용 프로그램을 열어야합니까? 두 기능을 모두 갖춘 세 번째 응용 프로그램이 있습니까? 한 응용 프로그램이 다른 응용 프로그램의 기능을로드합니까?
  • 기타...

더 작은 코드 기반은 응용 프로그램 수준에서 유지 관리하기가 더 쉽다고 말하면 무료 점심을 먹지 않을 것입니다. 이는 마이크로 서비스 / 모든 모듈 아키텍처의 핵심에서 동일한 문제입니다. 만병 통치약이 아니며, 적용 수준에서의 유지 관리 어려움은 오케스트레이션 수준의 유지 관리 어려움과 관련이 있습니다. 이러한 문제는 여전히 문제이며 더 이상 코드 기반이 아니므로 피하거나 해결해야합니다.

오케스트레이션 수준에서 문제를 해결하는 것이 더 간단하고 각 응용 프로그램 수준에서 문제를 해결하는 경우 문제를 두 개의 코드 기반으로 나누고 오케스트레이션 문제를 처리하는 것이 좋습니다.

그렇지 않다면 그냥하지 말고 애플리케이션 자체의 내부 모듈성을 개선하여 더 나은 서비스를 제공 할 수 있습니다. 코드 섹션을 응집력 있고 응용 프로그램이 플러그인으로 작동하는 라이브러리를 유지 관리하기 쉽게 밀어 넣습니다. 결국 모놀리스는 단지 라이브러리 환경의 오케스트레이션 레이어입니다.


3

좋은 답변이 많이 있었지만 거의 죽은 분할이 있기 때문에 모자에 고리를 넣을 것입니다.

소프트웨어 엔지니어로서의 경험에서 나는 이것이 단순한 문제가 아니라는 것을 알았습니다. 실제로 응용 프로그램 의 크기 , 규모목적 에 따라 다릅니다 . 변경에 필요한 관성으로 인해 오래된 응용 프로그램은 일반적으로 오랜 시간 동안 일반적인 관행이기 때문에 모 놀리 식입니다 (Maya는이 범주에 해당합니다). 나는 당신이 일반적으로 새로운 응용 프로그램에 대해 이야기한다고 가정합니다.

다소의 단일 관심사 인 충분히 작은 응용에서, 많은 개별 부품을 유지하는데 요구되는 오버 헤드는 일반적으로 분리의 유용성을 초과한다. 한 사람이 유지할 수 있다면 너무 많은 문제를 일으키지 않고 모 놀리 식으로 만들 수 있습니다. 이 규칙의 예외는 편리하게 (논리적으로) 분리 된 많은 다른 부분 (프론트 엔드, 백엔드, 아마도 일부 데이터 레이어)이있는 경우입니다.

매우 큰 단일 관심사 응용 프로그램에서 응용 프로그램을 분할하면 내 경험에 의미가 있습니다. 다른 버그 (때로는 해결하기 쉬운 버그)와 교환하여 가능한 버그 클래스의 하위 세트를 줄이는 이점이 있습니다. 일반적으로 직원 팀을 격리시켜 작업하여 생산성을 향상시킬 수도 있습니다. 그러나 요즘 많은 응용 프로그램은 때로는 세밀하게 나뉘어져 있습니다. 또한 응용 프로그램이 불필요하게 많은 마이크로 서비스에 걸쳐 분할되어 팀과의 대화가 중단되면 많은 오버 헤드가 발생했습니다. 또한, 각 부분이 다른 부분과 대화하는 방법에 대한 모든 지식을 보유해야하는 것은 각각의 연속적인 분할마다 훨씬 어려워집니다. 균형이 있으며 여기에서 답을 통해 알 수 있듯이 그렇게하는 방법은 명확하지 않습니다.


2
프로그래머로서의 첫 직업은 밀레니엄 버그 프로그래머였습니다. 내가 작업했던 소프트웨어는 수백 개의 작은 프로그램으로 나뉘 었으며 모두 작은 부분을 수행했으며 배치 파일과 함께 묶고 파일을 사용하여 상태를 전달했습니다. 컴퓨터가 느리고 메모리가 적고 스토리지가 비 쌌던 때에 발명 된 것은 큰 혼란이었습니다. 내가 그것을 사용할 때 코드는 이미 10-15 세였습니다. 일단 우리는 내 조언을 물었고 모든 조언을 새로운 모 놀리 식 응용 프로그램으로 변환하는 것이 내 조언이었습니다. 그들은 1 년 후 큰 감사를 받았습니다.
Pieter B

@PieterB 나는 비슷한 경험을했습니다. "최첨단 기술"은 불행히도 많은 방법으로 매우 큰화물 컬트입니다. 많은 회사는 업무에 가장 적합한 방법을 선택하는 대신 FAANG이 어떤 일을하고 있는지에 대한 질문없이 바로 따라갈 것입니다.
CL40

또한 : 일단 컴파일 된 모 놀리 식 애플리케이션으로 나타날 수있는 것은 코드 방식의 모듈 형 애플리케이션 일 수 있습니다.
Pieter B

1

UI 앱의 경우 전체 버그 양을 줄일 수는 없지만 버그 믹스의 균형을 통신으로 인한 문제로 바꿉니다.

사용자가 UI 응용 프로그램 / 사이트를 마주보고 있다고 말하면 사용자는 매우 환자가 아니며 응답 시간이 짧습니다. 이것은 통신 지연을 버그로 만듭니다. 결과적으로 매우 어려운 버그와 프로세스 간 / 기계 간 통신의 타이밍 요구 사항으로 단일 구성 요소의 복잡성이 감소하여 버그의 잠재적 감소를 거래하게됩니다.

프로그램이 처리하는 데이터의 단위가 크면 (즉, 이미지), 프로세스 간 지연이 길고 제거하기가 더 어려워집니다. "10mb 이미지로 변환 적용"과 같은 것은 즉시 + 20mb의 디스크 / 네트워크 IO를 얻습니다. 메모리 내 형식에서 직렬 형식으로 또는 그 반대로 변환 실제로 사용자로부터 시간을 숨기기 위해 할 수있는 일은 많지 않습니다.

또한 모든 통신 및 특히 디스크 IO에는 AntiVirus / Firewall 검사가 적용됩니다. 이는 불가피하게 버그를 재현하기 어려운 또 다른 계층과 추가 지연을 추가합니다.

통신 지연이 중요하지 않거나 이미 피할 수없는 곳에 모 놀리 식 "프로그램"분할

  • 개별 단계를 크게 개선하기 위해 약간의 추가 지연을 교환 할 수있는 정보의 병렬화 가능한 대량 처리 (때때로 상용 제품을 사용하여 사용자 지정 구성 요소가 필요하지 않음). 작은 개별 스텝 풋 프린트를 사용하면 예를 들어 하나의 고가의 기계 대신 여러 개의 저렴한 기계를 사용할 수 있습니다.
  • 단일 서비스를 덜 결합 된 마이크로 서비스로 분할-하나 대신 여러 서비스를 병렬로 호출하면 추가 지연이 발생하지 않을 것입니다 (각 개별 서비스가 더 빠르고 종속성이없는 경우 전체 시간이 단축 될 수 있음).
  • 복잡한 3D 장면 / 동영상 렌더링, 데이터에 대한 복잡한 메트릭 계산 등 사용자가 오랜 시간이 걸릴 것으로 예상되는 작업 이동
  • 모든 종류의 "자동 완성", "맞춤법 검사"및 기타 선택적 보조 도구는 종종 외부로 만들 수 있습니다. 가장 명백한 예는 입력이 항상 외부 서비스 (검색 엔진)에 보내는 브라우저의 URL 자동 제안입니다. .

이것은 웹 사이트뿐만 아니라 데스크톱 응용 프로그램에도 적용됩니다. 프로그램의 사용자가 직면하는 부분은 "단일체 (monolithic)"인 경향이 있습니다. 단일 데이터에 연결된 모든 사용자 상호 작용 코드는 일반적으로 단일 프로세스에서 실행됩니다 (분할하는 것은 드문 일이 아닙니다) HTML 페이지 또는 이미지와 같은 데이터 단위로 처리하지만이 질문에 직교합니다). 사용자 입력이있는 대부분의 기본 사이트의 경우 서버 쪽을 더 모듈화하고 복잡성 / 코드 중복을 줄이더라도 클라이언트 쪽에서 유효성 검사 논리가 실행되는 것을 볼 수 있습니다.


0

버그 예방에 도움이 되나요?

막다? 아뇨

  • 버그를 감지 하는 데 도움이됩니다 .
    즉, 당신이 알지도 못했던 모든 버그는 전체 엉망을 작은 부분으로 나누려고 할 때만 발견되었습니다. 따라서 어떤 식 으로든 버그가 프로덕션 환경에 나타나지 않게했지만 이미 버그가있었습니다.
  • 버그 의 영향줄이는 데 도움이됩니다 .
    모 놀리 식 응용 프로그램의 버그는 전체 시스템을 중단시키고 사용자가 응용 프로그램과 전혀 상호 작용하지 못하게 할 수 있습니다. 해당 응용 프로그램을 구성 요소로 분할하면 대부분의 버그는 의도적으로 구성 요소 중 하나에 만 영향을 미칩니다.
  • 새로운 버그에 대한 시나리오를 만듭니다 .
    사용자 환경을 동일하게 유지하려면 REST 구성 요소, OS 시스템 호출을 통해 사용자의 POV와 원활하게 상호 작용할 수 있도록 모든 구성 요소가 통신 할 수있는 새로운 논리 를 포함해야합니다 (REST 서비스, OS 시스템 호출을 통해).
    간단한 예로, 모 놀리 식 앱을 사용하면 앱을 떠나지 않고도 모델을 만들고 애니메이션을 적용 할 수 있습니다. 앱을 모델링과 애니메이션의 두 가지 구성 요소로 나눕니다. 이제 사용자는 모델링 앱의 모델을 파일로 내 보낸 다음 파일을 찾은 다음 애니메이션 앱으로 파일을 열어야합니다. 직접 보자. 일부 사용자는 그렇지 않을 것이므로 새로운 로직을 포함시켜야합니다. 응용 프로그램을 모델링하는 파일을 내보내려면 자동으로 애니메이션 응용 프로그램을 실행 하고 이 파일을 열 수 있도록. 그리고이 새로운 논리는 데이터 직렬화, 파일 액세스 및 권한, 사용자가 앱의 설치 경로 변경 등과 관련하여 여러 가지 버그를 가질 수 있습니다.
  • 필요한 리팩토링을 많이 적용하는 것은 완벽한 변명 이다.
    모 놀리 식 앱을 더 작은 구성 요소로 분할하기로 결정한 경우 처음 설계했을 때보 다 시스템에 대한 지식과 경험이 훨씬 많으며 코드를 만들기 위해 많은 리팩터링을 적용 할 수 있습니다. 보다 깨끗하고 간단하고 효율적이며 탄력적이고 안전합니다. 이 리팩토링은 어떤 식 으로든 버그를 예방하는 데 도움이됩니다. 물론 동일한 버그를 방지하기 위해 동일한 리팩토링을 모 놀리 식 앱에 적용 할 수도 있지만 UI에서 무언가를 만지고 비즈니스 논리를 깨뜨리는 것이 너무 모 놀리식이 기 때문에 그렇지 않습니다. ¯ \ _ (ツ) _ / ¯

따라서 단일 응용 프로그램을 작은 구성 요소로 나누는 것만으로 버그를 예방한다고 말하지는 않지만 실제로 버그를보다 쉽게 ​​예방할 수있는 지점에 쉽게 도달 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.