티스토리 뷰
최근 Software Engineering at Google 이라는 책을 무료 PDF로 읽고 있다.
- PDF 링크: https://abseil.io/resources/swe_at_google.2.pdf
책을 읽다보니 저자중 한 명인 Hyrum Wright(하이름 정도로 발음하면 될 듯)의 이름을 딴 Hyrum's Law라는 것을 알게 되어 이를 한 번 정리해보았다.
- Hyrum's Law: https://www.hyrumslaw.com/
Hyrum's Law
"With a sufficient number of users of an API,
it does not matter what you promise in the contract:
all observable behaviors of your system
will be depended on by somebody."
"하나의 API를 사용하는 사용자가 충분히 많아지면,
(API를 개발한) 당신이 어떤 의도를 가지고, 어떤 기능을 보장하며 개발을 하였든 상관없이,
시스템에서 관찰할 수 있는 모든 동작에 대해
누군가는 의존성을 가지게 된다."
발번역이라 무슨 의미인지 알아채기 어렵다.
Hyrum's Law를 단적으로 보여주는 (개발자들 사이에선 나름 유명한) xkcd Comic을 보자
스페이스바를 누르고 있으면 CPU가 지나치게 뜨거워지는 문제가 있었는데 이를 개선했는데 User4의 불만 댓글이 달렸다. 자신은 컨트롤 키가 멀어서 손가락을 뻗기 힘들기에, Emacs를 설정하여 CPU가 과열되면 컨트롤 키가 눌린 것으로 인식하게 해두었다는 것이다.
이것이 Hyrum's Law이다. 개발자는, 당연하게도, 의도를 가지고 스페이스바를 누르면 CPU가 과열되게 구현한 것이 아니다. 하지만, 사용자가 충분히 많아지다 보면, 개발자가 의도하지 않았지만 관찰할 수 있는 동작인 CPU 과열을 이용하는, 그 동작에 의존하는 사용자가 생기는 것이다.
나는 스타크래프트 임요환이 배럭을 적진에 내려서 마린을 생산했던 플레이가 생각났다. 블리자드 개발자들은 상상도 하지 못했던 방식으로 플레이를 한 것이다.
인터페이스와 구현체
인터페이스를 제안하면 사용자는 그 인터페이스를 사용하고, 개발자는 그 인터페이스를 구현한다. (implement). 인터페이스가 운전대, 가속 페달이라면, 사용자는 운전을 하고 브레이크 페달을 밟으며, 개발자는 바퀴와 엔진을 만드는 셈이다.
Hyrum's Law는 "The Law of Implicit Interfaces(or Dependencies)" 라고도 부르는데, 인터페이스의 사용자가 충분히 많아지면, 사용자는 인터페이스의 구현체의 어떠한 동작에 대해서도, 의도적이건 아니건, 의존성을 가지는 사용자가 생긴다는 것이다. 의도하지 않았던 인터페이스 기능이 생긴것과 같으며 (implicit interface) 사용자는 이에 대해 전혀 개의치 않는다.
그래서 뭐가 문제인가?
"This effect serves to constrain changes to the implementation, which must now conform to both the explicitly documented interface, as well as the implicit interface captured by usage. We often refer to this phenomenon as "bug-for-bug compatibility."
"명시적으로 문서화된 인터페이스 뿐 아니고, 사용하다보니 생긴 암묵적인 인터페이스까지 지원해줘야 하기 때문에 구현체의 수정을 제한한다. 이를 버그를 위한 버그 호환성이라고 부른다."
이러다보니 구현체의 기능 일부가 아예 인터페이스처럼 되어버리게 된다. 즉, 꼭 구현해줘야 하는 것이 되버리는 것이다. 스페이스바를 오래 누르면 CPU가 뜨거워지는 버그를 계속 유지해줘야 하는 것이다.
그래서 조심하라는 거다. 이러한 암묵적인 인터페이스가 시스템의 디자인과 기능의 개선을 제한하지 않도록 주의를 기울이라는 거다.
참고 유튜브: https://youtu.be/5Wdgjw6IGDM
'development' 카테고리의 다른 글
C language: pthread_create에서 start_routine의 warning (0) | 2021.08.31 |
---|---|
Makefile - .PHONY는 어떤 용도로 쓰일까? (0) | 2021.08.05 |
LeetCode 문제풀이는 실무에 도움이 되는가? (3) | 2021.04.28 |
ACID - 확실히 알고 넘어가자 (0) | 2021.04.26 |
Slice, Array의 인덱스 표기에 대하여 - feat. Dijkstra (0) | 2021.02.05 |
- Total
- Today
- Yesterday
- 티스토리챌린지
- intellij
- 오블완
- go
- 제이펍
- github
- solid
- Bug
- notion
- 독서
- agile
- OpenAI
- bun
- 노션
- 클린 애자일
- 잡학툰
- 독서후기
- websocket
- strange
- API
- 인텔리제이
- ChatGPT
- 2023
- folklore
- golang
- 체호프
- 영화
- clean agile
- 엉클 밥
- Gin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |