2009-08-12 7 views
3

처음부터 시스템을 설계하고 개발 한 많은 사람들이 프로젝트 아키텍처에 대한 어려운 결정을 내려야하는 상황에 처해있었습니다. 구조적으로 건전하고 확장 가능한 시스템을 구축 할 때 "다음 단계"를 밟을 때, 당신은 어디에 있었습니까?프로젝트 아키텍처에 대한 결정; 당신의 의사 결정 과정은 어떻습니까?

저는 아키텍처 측면에서 다소 붕괴 된 대규모 웹 사이트를 구축했습니다. 프론트 엔드 코드가있는 웹 레이어가 있었고 실제 작업을 처리하는 비즈니스 및 데이터 레이어가있었습니다. 논리적 분리의 여러 계층이 동일한 물리적 시스템에서 공존했습니다. 웹 서비스 계층/계층의 사용을 통해 물리적 또는 단순하게 논리적 분리가 존재할 수있었습니다. 여러 가지 이유로, 그렇게 구현되지 않았습니다. 결정이 옳았는지 잘못되었는지는 단순히 의견의 문제입니다. 나는 상대적으로 단순한 응용 프로그램이 내 의견에서 조작 된 다른 상황에 처해있었습니다.

새 프로젝트의 아키텍처를 설계 할 때 고려해야 할 요인은 무엇입니까? 일관성있는 프로젝트 디자인을 자주 사용합니까, 처음부터 n 계층입니까, 아니면 각 프로젝트가 들어올 때마다 평가합니까?

이러한 경험을 반복하여 나는 같은 위치에있는 다른 사람들이 어떻게 이러한 고려 사항을 정당화하고 만드는 지 궁금해합니다. 나는 우리 모두가 다양한 의견을 가지고 있다고 확신하지만, 나는 의견 뒤에 생각 과정을 이해하는 것이 계몽적인 것이라고 믿는다.

+0

커뮤니티 위키? –

+0

좋은 점이 변경되었습니다. –

답변

3

주어진 문제에 대한 올바른 아키텍처는 전적으로 문제에 달려 있습니다. 귀하의 질문은 실제 답변을 제공하기에는 너무 일반적입니다. 내가 알고있는 모든 예상 요구 사항을 고려할 수있는만큼 아키텍처를 간단하게 유지한다고 말하는 것 외에는 더 간단하지는 않습니다.

편집 :

  • 이 UI가

    • 이이

      을 웹 기반 수 있습니다 : "일반"비즈니스 솔루션에 대한

      , 여기에 내가 생각 몇 가지 요인은? 사용자 상호 작용 요구 사항은 무엇입니까?

    • 기존 웹 인터페이스가 충분하지 않은 경우 Sliverlight와 같은 대화 형 기술을 사용할 수 있습니까?
    • 두꺼운 클라이언트 여야하는 경우 (그렇습니다. 여전히 정당화되는 시나리오가 있습니다), 배포 문제는 얼마나 심각합니까? 소규모 사용자 기반, 대규모 사용자 기반? 자동 업데이트를 포함해야합니까? 그것은 시행되어야 하는가?
  • 비즈니스 계층

    • 내가 물리적으로 분리 된 비즈니스 계층을 필요로 성능/확장 성 고려 사항이 있습니까? 비즈니스 계층은 항상 논리적으로 분리되어 있으며 필요한 경우 물리적으로 쉽게 분리 할 수 ​​있습니다. Windows를 대상으로 할 때 배포시 결정을 허용하기 위해 때로는 CSLA을 사용하지만 이는 무거운 프레임 워크이므로 항상 적절하지는 않습니다.
    • 비즈니스 규칙은 얼마나 단순하거나 복잡합니까? 그들은 시간이 지남에 따라 상당히 진화 할 것입니까? Drools과 같은 규칙 엔진을 통합 할 가치가 있습니까?
    • 비동기 처리 요구 사항이 있습니까? 작업 대기열 시스템이 필요합니까?
    • 외부 시스템과 인터페이스 할 수 있습니까? 인터페이스 유형은 무엇입니까? 웹 서비스, COM +, XML over HTTP, 독점, DB, 배치 파일 ...?
  • 데이터 지속성

    • 무엇 ORM 선택은 기존 플랫폼의 선택/제약 주어진 나에게 사용할 수 있습니까?
    • 저장 프로 시저를 광범위하게 사용하면 이익이됩니까? 저장 프로 시저를 유지 관리하고 시간이 지남에 따라 수정할 수있는 DBA가 있습니까? DBA가 없다면 필자는 실제로 성능 향상에 필요한 저장 프로 시저 만 사용합니다. DBA가있는 경우, 저장 프로 시저를보다 광범위하게 사용하면 DBA가 응용 프로그램과 상관없이 물리적 아키텍처를 관리 할 수 ​​있습니다 (추가 된 모든 복잡성으로 인해 비용이 발생 함).
  • 크로스 커팅

    • 보안 요구 사항은 무엇입니까? 통합 할 기존 메커니즘 (Active Directory/LDAP/...)이 있습니까? 역할 기반 보안을 지원해야합니까?
    • 운영 모니터링 요구 사항은 무엇입니까? "이 버그보고"기능? 간단한 로깅?
+0

나는 그것을 꽤 분명하게 만들었다 고 생각한다. 프로젝트의 아키텍처를 결정할 때 결정 과정 _을 찾고 있습니다. 우리는 모두 어떤 사람들이 그것을 시도하거나 적어도 그 사고 방식으로 시작한다고해도 한 가지 크기가 모든 것에 적합하지 않다는 것을 압니다. –

+0

나는 결정 과정이 매우 비선형 적이기 때문에 (많은 변수가 서로 영향을 미치기 때문에) 몇 가지 단락에서 프로세스를 적어 두는 것이 실용적이지 않은 그러한 광범위한 프로젝트에서 작업합니다. 나는 좀 더 상세한지도 교장으로 나의 대답을 편집 할 것이다. –

0

Spring을 사용합니다. 모두 내장되어 있습니다.

+0

그래서 iPhone에서 Spring을 사용할 수 있습니까? 또한 임베디드 웹 서버에 가장 적합한 옵션입니까? –

+0

추신 : 그냥 힘든 시간을 주겠다 ;-) 나는 많은 프로젝트에서 봄을 사용한다. –

+0

@Eric J. - 사실, 모두에게 그렇습니다. 스프링 원자력 발전소 모듈을 사용하여 뒷뜰 원자로를 가동하고 있으며 우주 왕복선의 화장실에는 봄에 400,000 줄의 코드가 있습니다. 내 아내 한테 물어 보겠다. 그러면 아내가 더 입양 될거야. 조각을 더 쉽게 교환하고 싶습니다. 8) – duffymo

1
을했다거나, 구조적으로 소리, 확장 가능한 시스템을 구축의 "다음 단계"를 복용에 선을 그어야 할

?

나는이 부분을 이해하지 못한다.

새 프로젝트의 아키텍처를 설계 할 때 고려해야 할 요인은 무엇입니까? 일관성있는 프로젝트 디자인을 자주 사용합니까, 처음부터 n 계층입니까, 아니면 각 프로젝트가 들어올 때마다 평가합니까?

나는 작은 팀에서 내 모든 일을 할만큼 운이 좋았으며, 높은 회전율을 가진 팀에서 거의 모든 일을 할 수있을 정도로 불행했습니다. 나는 배웠다. 결코 혼자서 시스템을 설계하려고하지 마라.; 팀 노력으로 결과가 더 좋습니다. 때로는 신속한 프로토 타이핑을 해봤지만, 팀이 훌륭하다면 화이트 보드, 인덱스 카드 및 종이 디자인으로 놀라운 결과를 얻을 수 있다는 것을 알게되었습니다.

확실히 이 아니고은 일관된 프로젝트 디자인을 가지고 있습니다. 각 아키텍처는 잠재적으로 프로젝트 —에 대해 일회용이지만 거의 독점적으로 연구 및 고급 개발에서 작업했습니다.

요인으로 간주 :

  1. 는 팀이 아키텍처는 작업을 끝낼 것이라고 생각 하는가? 다른 모든 고려 사항보다 우선합니다.

  2. 주니어 팀 구성원이나 신규 사용자가 아키텍처를 쉽게 습득 할 수 있습니까? 다른 그룹은 당신의 최고의 사람들을 훔칠 것이고, 그들은 회사를 시작하기 위해 떠날 것입니다.어떤 경우에는 새로운 아키텍처를 배우기위한 필드 요청을 처리하기에는 너무 바빴던 그룹이있었습니다. 비록 그들이 가지고 있었던 아키텍처가 그들을 다시 붙잡고 있었지만 말입니다.

  3. 아키텍처 구조는 아키텍처를 생성해야하는 조직의 구조를 반영합니까? :-) 어느 정도 뺨에 혀가 있지만 우리는 완벽한 개발 팀이 아니라 우리가 가진 시간과 사람들과 함께 구축 할 수 있다고 믿어야합니다. 따라서 개인과 일치하는 아키텍처 조각을 식별 할 수 있다는 것이 좋은 것입니다.

  4. 우리가 이해할 수없는 부분이 있습니까 — 또는 악화되는 부분이 있습니까? 그렇다면 주요 붉은 깃발.

  5. 아름답습니까? 점심 시간에 다른 팀의 사람들과 이야기하는 것이 자랑 스러울만한 것입니까? 그렇지 않다면 디자인/아키텍처가 아직 충분하지 않을 수 있습니다.

  6. 새로운 아이디어가 있습니까? 다른 사람들이 배울 수있는 것? (이것은 연구 환경에서 중요하다, 그러나 나는 다른 곳에서 중요하지 않습니다 생각한다.) 나는 그것이 앞까지 성능 병목 현상을 가정하는 아주 나쁜 관행이 일반적입니다 것을 발견

1

. 마지막으로 눈에 띄는 차이가없는 앞쪽에 최적화를 많이 할 수 있습니다.

요즘에는 리팩토링 도구가 많이 있으며 개발 패턴에 많은 리소스가 있습니다. 도구가 훨씬 더 좋아 졌기 때문에 이전에 아키텍처 기능에서 사용했던 것만 큼 많은 시간을 소비하지 않습니다. 아주 거칠게 내 처리는 다음과 같이이다 : 나는 일반적으로 2 계층 (UI/데이터 & 비즈니스로 시작

  1. 는 요구 사항을
  2. 우선 순위 지정 요구 사항 (골드 도금 기능에 많은 시간을 소비하지 않음)
  3. 를 수집 로직) 데이터 & 비즈니스 로직 계층이 분리되어 있다는 것을 알지 못한다면.
  4. 각 요구 사항에 대해 먼저 작동하도록하십시오. 고통스럽게 그것이 필요하다는 것이 분명하지 않으면 여기에 패턴이 없습니다. 구현에 패턴의 필요성이 나타남을 발견했습니다. 작동 후
  5. , 필요 리팩토링, 성능 테스트를 수행 패턴을 장소를 확인하고 성능 요구 사항입니다 경우
  6. 에 필요한 경우에만 그들을 구현 코드를 정리.

이러한 방식으로 작업하면 단순함의 측면에서 잘못 나온 것입니다. 패턴, 타사 도구 등은 특정 문제를 해결하는 데 아주 멋지지만 그와 같은 것을 추가 할 때마다 나중에 응용 프로그램을 유지 관리하는 데 필요한 이해의 막대가 생깁니다. 그래서 나는 간단하게 시작하고 특별히 뭔가를 얻을 때만 복잡성을 추가합니다.

작고 간단한 응용 프로그램에 대해서도 종속성 주입 프레임 워크 Nhibernate, NUnit에 도달 할 다른 건축가를 상대 할 때 실제로는 꽤 나쁜 맛이납니다. 자체 로깅 라이브러리를 굴리고 3 배를 쓸 수 있습니다. 코드의 라인을 가지고 테스트합니다.이 툴들은 ROI (투자 수익률, "돈을 벌기")가 아주 좋은 특별한 경우와 그렇지 않은 경우가 있습니다. 훌륭한 설계자는 최저 시간/비용으로 최대한 많은 가치를 제공합니다.

1

필자의 관찰에 따르면, 실제로 훌륭한 건축가는 알려진 요구 사항을 깊이 이해하고 미래의 유연성이 어디에서 제공되는지 이해하는 데 상당한 판단력을 사용하는 시간을 갖는다.

또한 계층의 논리적 및 물리적 분리의 차이점을 이해합니다. 요구 사항이 다른 경우에도 ...

  • 이 우리가 여기 사용할 수 있도록 마지막 프로젝트에 근무 :

    모든 너무 자주 나는 두 가지 패턴 중 하나를 참조하십시오.

  • 가 작동하지 않는 이유는 유일한 구조 문제는 당신이 주소를해야하는 경우 implmentation이 (심하게

을 수행 한 것이 었습니다 ... 비록 우리가 그것을 사용하지 않습니다 그래서 전에 작동하지 않았다

  • 당신의 솔루션에 얼마나 많은 계층이 있어야 실제로 운이 좋은지 알 수 있습니다 :-)

  • 2

    음, 간단히 말해 보겠습니다. 지금 가지고있는 요구 사항에 집중하고 가능한 모든 미래 기능, 가상 요구 사항 변경 및 다양한 개발 과정을 다루려고하지 마십시오.

    조엘이 작성한 훌륭한 기사가 있습니다 : Don't Let Architecture Astronauts Scare You.

    소프트웨어가 필요로하는 기능이 무엇이든 관계없이 요구 사항을 분석하고 비슷한 프로젝트로 이전의 경험을보고 시도하십시오.

    훌륭한 건축술은 뇌 진입 첫 번째 세션에서 결코 나올 수 없습니다. 하나의 접근법으로 시작하여 날씨 변화에 따라 코스를 조정하고 아키텍처를 개선하기위한 아이디어를 얻을 수있는 코드 검토 세션을 가지며 나쁜 코드 조각을 좋고 재사용 가능한 구성 요소로 리팩터링 한 다음 결국 차고가 성으로 변모합니다.

    KISS principle을 따르고 조기 최적화를 피하십시오.

    자주 사용하는 일관된 프로젝트 디자인이 있습니까?

    물론. 개인 또는 팀은 자신의 스타일, 일반적인 문제를 해결하는 기술, 재사용 가능한 구성 요소를 개발하여 모두 도구 세트를 구성합니다. 왜 당신이 새 프로젝트를 시작할 때마다 그들을 던져 버릴까요?

    처음부터 n 계층입니까?

    그것은 일관성, 깨끗한 구조 및 우려의 분리의 목표를 제공합니다.

    또는 각 프로젝트는 그뿐만 아니라

    에 온다 평가할 않습니다. 문제를 해결하고 가장 효율적인 방법으로 문제를 해결할 수있는 다른 방법이있을 수 있습니다.

    0

    처음에는 도메인의 복잡성을 고려했습니다. 복잡하거나 비즈니스, 상업 또는 산업 분야에서 컴퓨터 나 데이터 과학이 아닌 객체 도메인 모델을 기반으로하는 아키텍처를 기본으로합니다.

    다음은 크기, 중요도, 기대치 및 기타 비 기능 요구 사항을 고려합니다.

    관련 문제