xguru 2020-08-17 | parent | favorite | on: ADR을 써야 하는 이유(github.blog)

ADR 사례들

CSS 프레임워크 결정
https://github.com/joelparkerhenderson/architecture_decision_record/…
- 이슈 : 웹앱을 위한 CSS프레임워크 결정이 필요. 유명 브라우저 및 화면 사이즈 상관없이 빠르고 안정적이어야 함. 디자인/레이아웃/UI/UX 에서 빠른 이터레이션. 반응형 디자인
* 결정 : Bulma 를 사용하기로 결정
- 전제 : 모던하고 빠르고 반응형인 웹앱을 만들고 싶으니, jQuery는 안쓰고 싶음
- 제약 : jQuery는 쓰지 않아도 되는 프레임워크
- 고려 : 아무것도 안쓰거나, Bootstrap/Bulma/Foundation/Materialize/Semantic UI 중에서 Bulma 와 Semantic UI를 깊게 고민

Monorepo vs Multirepo
https://github.com/joelparkerhenderson/architecture_decision_record/…
- 이슈 : 우리 프로젝트는 세개의 메인 카테고리 - 프론트엔드 UI,미들웨어,백엔드 서버
ㅤ→ SCM으로 git을 사용중인데, monorepo vs polyrepo vs hybrid 를 결정해야함
* 결정 :
ㅤ→ 조직/팀/프로젝트가 작고 빠른 이터레이션일 때는 Monorepo
ㅤ→ 조직/팀/프로젝트가 크고 안정적인게 중요할때는 Polyrepo
- 전제 : 우리가 만드는 코드는 조직을 위한것이고 외부(공공)을 위한것이 아님

프로그래밍 언어 결정
https://github.com/joelparkerhenderson/architecture_decision_record/…
- 이슈 : 소프트웨어 개발용 언어를 결정해야함. 웹 프론트와 백엔드
* 결정 :
ㅤ→ 프론트엔드는 TypeScript
ㅤ→ 백엔드는 Rust
- 전제 :
ㅤ→ 프론트는 일반적이지만 빠르게 개발,배포,반복이 되어야함. 레거시 호환 필요없음
ㅤ→ 백엔드는 일반적인것보다는 약간 높음. 품질,안정성,보안에 대한 고려. 거의 실시간 수준이 필요(GC에 의해서 멈추는것은 없어야함). 함수형 프로그래밍 / 병렬처리 및 멀티코어 프로세싱, 메모리 안전성도 중요함
- 제한 : 메이저 클라우드서비스의 서버리스(Amazon Lamba)에서 꼭 실행가능 해야함
- 고려 : C/C++/Clojure/Elixir/Erlang/Elm/Flow/Go/Haskell/Java/Javascript/Kotlin/Python/Ruby/Rust/TypeScript
- 논쟁 :
ㅤ→ C : 낮은 안전성으로 제외; Rust가 대부분의 것들을 더 잘할 수 있음
ㅤ→ C++ : 난잡(mess)해서 제외; Rust가 대부분의 것들을 더 잘할 수 있음
ㅤ→ Clojure : 뛰어난 모델링; Lisp 과 가장 비슷; JVM상의 훌륭한 런타임
ㅤ→ Elixir : 배포 및 동시성이 뛰어난 런타임; 훌륭한 개발자 경험; 상대적으로 작은 에코시스템
ㅤ→ Erlang : 배포 및 동시성이 뛰어난 런타임; 다소 도전적인 개발자 경험; 상대적으로 작은 에코시스템
ㅤ→ Elm : 전도유망; IBM이 좋은 사례들을 공유중; 작은 에코시스템
ㅤ→ Flow : JS의 흥미로운 개선; 하지만 개발자들이 멀어지는 중
ㅤ→ Go : 뛰어난 개발자 경험; 뛰어난 동시성; 언어를 이상하게 만드는 나쁜결정들이 있었음
ㅤ→ Haskell : 최고의 함수형 언어; 작은 개발자 커뮤니티; 프로덕션 성공 사례가 많지 않음
ㅤ→ Java : 최고의 런타임; 뛰어난 에코시스템; 그저그런 개발자 경험
ㅤ→ JavaScript : 가장 인기있는 언어; 가장 넓은 에코시스템
ㅤ→ Kotlin : Java의 많은 것을 개선; JetBrains의 훌륭한 후원; Java to Kotlin 한 다양한 성공사례
ㅤ→ Python : 시스템 관리쪽에서 가장 인기있는 언어; 좋은 분석 도구; 좋은 웹 프레임워크; Google이 Go를 선택하면서 버려짐
ㅤ→ Ruby : 최고의 개발자 경험; 최고의 웹 프레임워크; 훌륭한 커뮤니티; 엄청 느림; 패키징 하기 어려움
ㅤ→ Rust : 최고의 새 언어;Zero-cost abstractions(추상화해도 속도가 느려지지 않음) 강조; 동시성 강조; 상대적으로 작은 에코시스템; 몇몇 컴파일러 최적화에서는 한계가 있음 (메모리 직접접근은 unsafe여야 하는등)
ㅤ→ TypeScript: JavaScript에 Type을 추가; 뛰어난 Transpiler; 개발자들이 점점 JS 에서 TS로 넘어가는 중; Microsoft 의 강력한 후원

- VM기반은 선택하지 않기로함 (복잡성이 증가하기 때문에)
- 가장 빠른 런타임을 위해서는 JS 와 C를 선택
- 최고와 거의 비슷하게 빠른 런타임을 위해서는 TypeScript 와 Rust를 선택
- 만약 VM과 웹프레임워크 선택했다면
ㅤ→ Closer 와 Luminous
ㅤ→ Java 와 Spring
ㅤ→ Elixir 와 Phoenix