서론앱-티튜드 테스트타깃 하드웨어 병목현상클린 임베디드 아키텍처는 테스트하기 쉬운 임베디드 아키텍처다계층하드웨어는 세부사항이다.HAL 사용자에게 하드웨어 세부사항을 드러내지 말라프로세서는 세부사항이다운영체제는 세부사항이다인터페이스를 통하고 대체 가능성을 높이는 방향으로 프로그래밍하라
소프트웨어는 닳지 않지만, 펌웨어와 하드웨어는 낡아 가므로 결국 소프트웨어도 수정해야 한다. (by 더그 슈미트)
+소프트웨어는 닳지 않지만, 펌웨어와 하드웨어에 대한 의존성을 관리하지 않으면 안으로부터 파괴될 수 있다. (by 로버트 마틴)
서론
- 엔지니어와 프로그래머에게 전하는 메시지는 분명하다. 펌웨어를 수없이 양산하는 일을 멈추고, 코드에게 유효 수명을 길게 늘릴 수 있는 기회를 주어라.
- 하드웨어에 의존적인 코드는 추상화 해서 경계를 만들고 의존성을 애플리케이션 코드쪽으로 향하게 해야 한다.
- 애플리케이션 코드가 하드웨어에 구체적인 코드를 알아서는 안된다.
앱-티튜드 테스트
소프트웨어를 구축하는 세 가지 활동 1. 먼저 동작하게 만들어라 — 소프트웨어가 동작하지 않는다면 사업은 망한다. 2. 그리고 올바르게 만들어라 — 코드를 리팩터링해서 당신을 포함한 나머지 사람들이 이해할 수 있게 만들고, 요구가 변경되거나 요구를 더 잘 이해하게 되었을 때 코드를 개선할 수 있게 만들어라. 3. 그리고 빠르게 만들어라 — 코드를 리팩터링해서 요구되는 성능을 만족시켜라 by Kent Beck
- 임베디드가 아닌 대다수의 앱들이 코드를 올바르게 작성해서 유효 수명을 길게 늘리는 데는 거의 관심 없이, 그저 동작하도록 만들어진다.
- 앱이 동작하도록 만드는 것을 나(로버트 마틴)는 개발자용 앱-티튜드 테스트라고 부른다. 프로그래밍에는 단순히 앱-티튜드 테스트만 통과하는 것보다 중요한 것이 훨씬 많다.
타깃 하드웨어 병목현상
- 임베디드가 지닌 특수한 문제 중 하나는 타깃-하드웨어 병목현상이다. 임베디드 코드가 클린 아키텍처 원칙과 실천법을 따르지 않고 작성된다면, 대개의 경우 코드를 테스트할 수 잇는 환경이 해장 특정 타깃으로 국한될 것임 → 테스트가 느려진다.
클린 임베디드 아키텍처는 테스트하기 쉬운 임베디드 아키텍처다
계층

- 하드웨어는 기술의 발전과 무어의 법칙에 따라 변할 것이다.
- 부품은 낡게 되고 새로운 부품은 작은 전력을 사용하면서도 더 나은 성능을 제공하며, 더 저렴할 것이다.
- 어떤 이유에서든, 이처럼 불가피하게 하드웨어를 변경해야 하는 시점이 마침내 닥쳤을 때, 임베디드 엔지니어로서 필요 이상의 작업을 하기를 원치 않는다.

- 하드웨어 관련 정보가 코드 전체를 오염시킨 상황이다. 무엇을 어디에 위치시킬 지, 그리고 한 모듈이 다른 모듈에 대해 어디까지 알게 할지를 신중하게 처리하지 않는다면, 완성된 코드는 변경 하기가 매우 어렵게 된다.
소프트웨어와 펌웨어가 서로 섞이는 일은 안티 패턴
이다.
하드웨어는 세부사항이다.

- 주로 소프트웨어와 펌웨어 사이의 경계는 코드와 하드웨어 사이의 경계와는 달리 잘 정의하기가 대체로 힘들다.
- 임베디드 소프트웨어 개발자가 해야 할 일 하나는 이 경계를 분명하게 만드는 것이다. 소프트웨어와 펌웨어 사이의 경계는 하드웨어 추상화 계층(Hardware Abstraction Layer - HAL)이라고 부른다.
- eg) 애플리케이션에서는 이름/값과 같이 쌍으로 된 데이터를 영속성 장치에 저장하거나 읽을 수 있어야 한다. 이 때 소프트웨어는 이름/값 쌍이 플래시 메모리에 저장되는지, 하드디스크에 저장되는지, 클라우드에 저장되는지, 아니면 코어 메모리에 저장되는지를 전혀 개의치 않는다.
HAL 사용자에게 하드웨어 세부사항을 드러내지 말라
클린 임베디드 아키텍처로 설계된 소프트웨어는 타깃 하드웨어에 관계없이 테스트가 가능하다. HAL을 제대로 만들었다면, HAL은 타깃에 상관없이 테스트할 수 있는 경계층 또는 일련의 대체 지점을 제공한다.
프로세서는 세부사항이다
- 클린 임베디드 아키텍처라면 장치 접근 레지스터를 직접 사용하는 코드는 소수의, 순전히 펌웨어로만 한정시켜야 한다.
- 이들 레지스터를 알고 있는 것은 모두 펌웨어가 되어야 하며, 따라서 실리콘 칩에 종속된다.
운영체제는 세부사항이다

- OS에 의존적으로 코드가 구성되어 있다면 OS 변경을 해야할 때 새로운 OS가 제공하는, 이전 OS와는 다른 기능과 시스템 명령어에 맞게 그 의미 자체를 조정해야 할 가능성이 높다.
- 클린 임베디드 아키텍처는 운영체제 추상화 계층(OSAL)을 통해 소프트웨어를 운영체제로부터 격리시킨다.
- 소프트웨어가 OS 에 직접적으로 의존하는 대신 OSAL 에 의존한다면, 이식 작업의 대부분은 기존 OSAL 과 호환되도록 새로운 OSAL 을 작성하는 데 소요될 것이다.
인터페이스를 통하고 대체 가능성을 높이는 방향으로 프로그래밍하라
- 이들 원칙은 관심사를 분리시키고, 인터페이스를 활용하며, 대체 가능성을 높이는 방향으로 프로그래밍하도록 유도한다.