문자 출력 경계
의존성이 제어 흐름과 동일한 방향을 가리킴
애플리케이션은 감시 프로그램에 대해 컴파일 타임의 의존성을 가짐
제어흐름도 애플리케이션에서 감시 프로그램으로 전달
-> 출력을 어떤 장치로 보내는지 애플리케이션은 알지 못하게 함
감시 프로그램은 애플리케이션을 구동했지만 애플리케이션에 대한 컴파일 타임의 의존성이 없음
제어 흐름은 감시 프로그램에서 애플리케이션으로 전달
-> 의존성 역전
어떻게 의존성을 역전시킬 수 있었나?
오버레이 영역에서 모든 애플리케이션을 같은 메모리 주소로 이동시킴으로써 애플리케이션을 구동시켰다.
이 경계에서는 애플리케이션의 메모리 시작점 외에는 애플리케이션에 대해서 어떤 것도 감시 프로그램이 알지 못하도록 함
실크 스크린 기법으로 저항기 생성
저항기의 폭이 넓을수록 저항값 ↓
탐침기가 저항기의 저항값 측정하여 레이저로 일부를 태워 저항값이 원하는 수준에 도달할때까지 얇게 만듦
당시 프로그램 아키텍처의 형태 : 마스터 운영 프로그램 MOP
유틸리티 계층이 MOP 계층을 호출하지만, MOP 자체가 유틸리티 계층에 특화되도록 변경되었고, MOP가 유틸리티 계층을 호출할때도 있었다 -> 독립된계층이라고 생각 X, 둘이 강하게 결합
격리계층
가상 머신 인터페이스 제공, DSL 언어로 작성
트리밍 작업
테이프에서 로드 -> 시스템에 의해 실행
시스템은 M365 어셈블러로 작성되어 단일 컴파일 단위로 컴파일되어 순수한 바이너리 코드로 생성되었다.
모든곳에 결함이 존재했고, 경계도 불분명하고, 강제되지 않았다.
세트 프로그램 인터럽트라는 명령어를 지원했다.
해당 명령어를 입력하면 프로세서의 인터럽트를 발생시켰고, 이를 통해 우선순위가 낮은 다른 인터럽트를 조작할 수 있었다.
Thread.yield()
: 다른 스레드에게 실행 양보 (상태 제어자)
모노리틱 애플리케이션에 아키텍처를 적용
서비스센터가 많은 중앙 사무소 담당
중앙 사무소는 전화 회선처리
전화 발신 및 측정 하드워어는 CO에 위치 (M365 CO에 위치)
CO에 배치된 컴퓨터를 COLT라고 칭함
서비스 지역 컴퓨터(SAC) 라는 또 다른 M365는 서비스 센터에 배치
M365 메모리는 비싸고 덩치가 커서 역할을 분리하기로 함
경계를 나눠 속도 향상 메모리 사용 줄임
소프트웨어 수정 시 칩을 모두 교체해야 한다는 문제 발생 : 벡터화로 해결
배포 독립성
을 가질 수 있도록 함
플러그인 아키텍처
클린 코드의 가치
고칠수 있도록 남이 읽을 수 있도록 설계해야함
하드웨어를 업무 규칙에서 격리하는 일의 가치, 그리고 인터페이스를 추상화 하는 일의 가치를 배웠다.
SAC 소프트웨어 아키텍처 재설계 -> 지연
왜?
미국과 영국 사이의 모듈이 너무 달라졌고, 독립적으로 수정되던 코드를 통합하고자 하는 시도가 실패했다.
-> 이분화 문제로 인하여
어셈블러 코드는 나쁘다!
어셈블리 to c언어
선점형 방식 -> 비선점형 방식
디지털 혁명
아날로그 방식의 중앙 교환 장비를 디지털 교환기로 대체
-> CCU/CMU 아키텍처 도입
사실 이게 필요없었다.
중앙 교환국에 간단한 컴퓨터를 배치하고 모뎀 회선을 이용하여 분배 거점에 있는 두대의 표준 COLT와 연결하기만 하면 됐다.
BOSS 기반, C로 작성
소프트웨어 아키텍처가 완전히 다를지라도 효과는 동등할 수 있다는 사실을 받아들이게 되었다.
→ 소프트웨어 아키텍처는 동작을 더 잘하게 만드는 것이라기 보다는 다른 것에 더 큰 가치가 있다는 이야기로 보인다.
→ 개발, 배포, 유지보수 등등
데이터베이스는 세부사항이며, 시스템의 전반적인 업무목적과는 반드시 분리해야 한다.
이 시스템은 진짜 경계가 있다는 표시를 분명하게 보여주었다. 서비스는 독립적으로 배포할 수 있었으며, 자신이 채임지는 도메인 내에서 동작했다.
고수준의 프로세스와 저수준의 프로세스가 있었고, 의존성의 많은 부분이 올바른 방향을 향했다.
상태 머신을 외부적으로 표현함으로써 코드를 변경하지 않고도 애플리케이션의 흐름을 변경할 수 있었다. (개방 폐쇄 원칙, OCP)
가장 큰 실수는 과도한 아키텍처였다.
이 책에서 설명한 계층보다 훨씬 많은 계층이 있었고,
각 계층은 자신만의 독특한 통신오버헤드를 발생시켰다.
이로 인해 팀 생산성은 급격하게 떨어졌다.
이를 통해 나는 아키텍처가 뛰어나더라도 커다란 실패로 끝날 때도 있다는 사실을 배웠다.
아키텍처는 반드시 문제의 규모에 적합할 정도만큼만 유연해야 한다.
유사한 표현 방식과 매커니즘을 이용하기에 공유되는 요소를 바탕으로 프레임워크를 개발하기로 한다.
시행착오를 거쳐 만들어진 프레임워크는 GUI 어플리케이션과 의존성 규칙을 준수했다.
비네트는 프레임워크에 플러그인 형태로 연결되었으며
고수준의 GUI 정책은 모두 프레임워크 내부로 들어갔다.
사용할 수 있는 프레임워크를 먼저 완성해야 비로소 재사용 가능한 프레임워크를 만들 수 있다.