API Design on C++
TL;DR
-
API๋ ๊ตฌํ์ด ์๋๋ผ ์ฌ์ฉ์์์ ๊ณ์ฝ(contract) ์ด๋ค
-
์ข์ API๋ ์กด์ฌ๊ฐ์ด ์๊ณ , ๋์ API๋ ์ง์์ ์ธ ๊ณ ํต์ ์ค๋ค
-
Top-down(์ฌ์ฉ์ ์ค์ฌ) ์ค๊ณ๊ฐ ๊ฑฐ์ ํญ์ ์ ๋ต์ด๋ค
-
API๋ ์ฑ๊ณตํ ์๋ก ๋ณ๊ฒฝ ๋น์ฉ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๋ค
-
๊ตฌํ ๋ํ ์ผ์ด API๋ก ์๋ ์๊ฐ, ๋ฏธ๋์ ์ ํ์ง๋ ์ฌ๋ผ์ง๋ค
๊ฐ์ (Overview)
์ด ๊ฐ์ฐ์ โAPI๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํด์ผ ํ๋๊ฐ?โ๋ผ๋ ์ง๋ฌธ์
๋ฌธ๋ฒ์ด๋ ์คํ์ผ์ด ์๋ ํ์ค์ ์ธ ์ ์ง๋ณด์ ๊ด์ ์์ ๋ค๋ฃฌ๋ค.
ํต์ฌ ๋ฉ์์ง๋ ๋จ ํ๋๋ค.
API ์ค๊ณ์ ์ถ๋ฐ์ ์
โ๋ฉ์ง ๊ตฌํโ์ด ์๋๋ผ โ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ ๊ฒ์ธ๊ฐโ๋ค.
๊ฐ์ฐ์ ๋ค์ ์ง๋ฌธ๋ค์ ๋ตํ๋ค.
-
์ข์ API์ ๋์ API์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ?
-
์ ์ฌ์ฉ์ ๊ด์ (top-down)์ด ์ค์ํ๊ฐ?
-
API๊ฐ ์ปค์ง์๋ก ์ ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ค์์ง๋๊ฐ?
-
API/ABI ํธํ์ฑ์ ์ค๊ณ์ ์ด๋ค ์ ์ฝ์ ์ฃผ๋๊ฐ?
-
์ค๋ฌด์์ API๋ฅผ ํ๊ฐํ ๋ ๋ฌด์์ ๋ด์ผ ํ๋๊ฐ?
์์ธ ์ค๋ช (Detailed Breakdown)
1. ์ข์ API์ ๋์ API
์ข์ API์ ํน์ง
-
์ฌ์ฉ์๊ฐ API์ ์กด์ฌ๋ฅผ ์์ํ์ง ์๋๋ค
-
๋๋ฉ์ธ ์ง์๋ง์ผ๋ก ์ง๊ด์ ์ธ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
-
์๋ ์์ ์์ญ ๋ ๊น์ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
-
๋ณ๊ฒฝ์ด ์ ๊ณ , ๋ณ๊ฒฝ๋๋๋ผ๋ ์ฌ์ฉ์์๊ฒ ์ฃผ๋ ์ถฉ๊ฒฉ์ด ์๋ค
-
ํ ์คํธ, ์ฑ๋ฅ, ํ์ฅ์ฑ์ ๊ธ์ ์ ์ผ๋ก ๊ธฐ์ฌํ๋ค
์ข์ API๋ โ์ข๋คโ๋ ๋๋์กฐ์ฐจ ๋ค์ง ์๋๋ค
๋์ API์ ํน์ง
-
ํ๋ซํผ ๋๋ ๊ตฌํ ๋ํ ์ผ์ด ๊ทธ๋๋ก ๋ ธ์ถ๋๋ค
-
์ฌ์ฉํ ๋๋ง๋ค ๋ฌธ์๋ฅผ ํ์ธํด์ผ ํ๋ค
-
์ค์ฉ(misuse)ํ๊ธฐ ์ฝ๋ค
-
ํ ์คํธ๊ฐ ์ด๋ ต๊ณ ๋ฒ๊ทธ๊ฐ ์์ฃผ ๋ฐ์ํ๋ค
-
deprecate โ ์ API โ ๋ deprecate์ ๋ฐ๋ณต
๋์ API๋ ํ ๋ฒ ์ฐ๊ณ ๋๋๋ ๊ฒ์ด ์๋๋ผ ์ง์์ ์ธ ๊ณ ํต์ ์ค๋ค
2. API ์ค๊ณ ์ฒ ํ: Top-down vs Bottom-up
Top-down ์ค๊ณ (๊ถ์ฅ)
-
์ฌ์ฉ์ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ๋จผ์ ์ ์ํ๋ค
-
์์ ์ฝ๋์ ๋ฌธ์๋ฅผ ๋จผ์ ์์ฑํ๋ค
-
API๋ฅผ ์ ์ํ๋ค
-
๋ง์ง๋ง์ ๊ตฌํํ๋ค
โ API๊ฐ ๊ตฌํ์ ์ธ์ด๊ฐ ์๋๋ผ ์ฌ์ฉ์์ ์ธ์ด๋ก ๋งํ๊ฒ ๋๋ค
Bottom-up ์ค๊ณ (์ํ)
-
๊ตฌํ(์๊ณ ๋ฆฌ์ฆ, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ถํฐ ์์ํ๋ค
-
API๊ฐ ๊ตฌํ์ ๋๋ ค๋ค๋๋ค
๋ฌธ์ ์ :
-
๊ตฌํ ๋ํ ์ผ์ด API๋ก ๊ทธ๋๋ก ์์ด๋์จ๋ค
-
์ฌ์ฉ์๊ฐ ๋ด๋ถ ๊ตฌํ์ ์์์ผ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
-
ํ ์คํธ, ํ์ฅ, ๊ต์ฒด๊ฐ ๋ชจ๋ ์ด๋ ค์์ง๋ค
3. API ์ฌ์ฉ์ ๊ท๋ชจ์ ๋ณ๊ฒฝ ๋น์ฉ
| ์ฌ์ฉ์ ๊ท๋ชจ | API ๋ณ๊ฒฝ ๋์ด๋ |
|---|---|
| ๊ฐ์ธ / ์๊ท๋ชจ | ๋ฎ์ |
| ์ฌ๋ด ๋ค์ ํ | ๋์ (๋๋ ์์ , ๋ฆฌ๋น๋ ํ์) |
| ๊ณต๊ฐ API | ๊ฑฐ์ ๋ถ๊ฐ๋ฅ |
API๋ ์ฑ๊ณตํ ์๋ก ๊ณ ์น๊ธฐ ์ด๋ ค์์ง๋ค
API / ABI ํธํ์ฑ
์ฉ์ด ์ ๋ฆฌ (Terminology)
- Library API + Compiler ABI = Library ABI
ABI ํธํ์ฑ
-
ABI ํธํ์ฑ ๊นจ์ง์
-
์ต์ ์ ๊ฒฝ์ฐ: ๋ฏธ๋ฌํ ์ค๋์
-
์ฐจ์ ์ ๊ฒฝ์ฐ: ์ฆ์ ํฌ๋์
-
-
๋์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ ํนํ ์ค์ (์:
libstdc++) -
๋ชจ๋ ์ฌ์ฉ์๊ฐ ํญ์ ์ ์ฒด๋ฅผ ๋ค์ ์ปดํ์ผํ๋ค๋ฉด ๋ฌด์ํ ์๋ ์์
API ํธํ์ฑ
-
API ๋นํธํ์ ๋ณดํต ์ปดํ์ผ ์์ฒด๊ฐ ๋์ง ์์
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ ๋ (๋ฐ์ด๋๋ฆฌ/์์ค ๋ชจ๋)
-
์ ์ฒด๋ฅผ ๋ค์ ์ปดํ์ผํ๋ ๊ฒฝ์ฐ์๋ ์ค์
ABI ํธํ ๊ฐ๋ฅํ ๋ณ๊ฒฝ
-
์๋ก์ด free function ์ถ๊ฐ
-
ํด๋์ค์ friend ์ ์ธ ์ถ๊ฐ/์ ๊ฑฐ
-
enum ๋์ ๊ฐ ์ถ๊ฐ (๋จ, enum ํ์ ํฌ๊ธฐ๊ฐ ๋ฐ๋์ง ์๋ ๊ฒฝ์ฐ)
-
static ๋ฉค๋ฒ ๋ณ์/ํจ์ ์ถ๊ฐ
-
non-virtual ๋ฉ์๋ ์ถ๊ฐ (์ค๋ฒ๋ก๋ ์ ์ธ)
-
์์ฑ์ ์ถ๊ฐ
-
๊ธฐ๋ณธ ์ธ์ ๊ฐ ๋ณ๊ฒฝ
-
private non-virtual ๋ฉ์๋ ์ ๊ฑฐ
-
typedef ๋ฐ ์ ํ์ ์ถ๊ฐ
-
inline ํจ์ โ non-inline ํจ์๋ก ๋ณ๊ฒฝ
- ๊ธฐ์กด์ ์ปดํ์ผ๋ ์ฝ๋๋ ์ด์ ๊ตฌํ์ ๊ณ์ ์ฌ์ฉ
ABI ํธํ ๋ถ๊ฐ๋ฅํ ๋ณ๊ฒฝ
-
๋ฉ์๋ ๋ณ๊ฒฝ
(const/constexpr, ๋ฐํ ํ์ , ์ธ์ ์์น, cv-qualifier, ํ ํ๋ฆฟ ํ๋ผ๋ฏธํฐ, final/override, noexcept, inline/ํ ํ๋ฆฟ ๊ตฌํ ๋ด์ฉ ๋ฑ) -
ํด๋์ค ์์ ๊ตฌ์กฐ ๋ณ๊ฒฝ
-
ํด๋์ค ๋ฉค๋ฒ ์ถ๊ฐ/์ ๊ฑฐ/์์ ๋ณ๊ฒฝ/ํ์ ๋ณ๊ฒฝ
-
์ค๋ฒ๋ก๋ ์ถ๊ฐ ๋๋ ์ ๊ฑฐ
-
๋ฉค๋ฒ ํจ์ ์ธ๋ผ์ด๋ ๋ฐฉ์ ๋ณ๊ฒฝ
-
์ ๊ทผ ์ ์ด์ ๋ณ๊ฒฝ
-
virtual ํจ์ ์ถ๊ฐ/์ ๊ฑฐ/์์ ๋ณ๊ฒฝ
(non-virtual โ virtual ๋ณ๊ฒฝ ํฌํจ) -
๋์ง๋ ์์ธ ๋ฐ ์์ธ ๊ณ์ธต ๋ณ๊ฒฝ
-
์ ์ญ ๋ฐ์ดํฐ์ ํ์ ๋๋ cv-qualifier ๋ณ๊ฒฝ
API ํธํ ๊ฐ๋ฅํ ๋ณ๊ฒฝ
-
๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง ํ๋ผ๋ฏธํฐ ์ถ๊ฐ
-
ํด๋์ค์ ๋ฉ์๋ ์ถ๊ฐ
-
ํด๋์ค์ ๋ฉค๋ฒ ์ถ๊ฐ
-
ํด๋์ค ์ถ๊ฐ
-
๋ฉค๋ฒ ๋๋ ๋ฉ์๋ ์์ ๋ณ๊ฒฝ
API ํธํ ๋ถ๊ฐ๋ฅํ ๋ณ๊ฒฝ
-
์ธ์, public/protected ๋ฉ์๋, ๋ฉค๋ฒ, ํด๋์ค ์ ๊ฑฐ
-
์ธ์ ๋๋ ๋ฉค๋ฒ ๋ณ์ ํ์ ๋ณ๊ฒฝ
-
public/protected ๋ฉค๋ฒ๋ ๋ฉ์๋ ์ด๋ฆ ๋ณ๊ฒฝ
-
ํด๋์ค๋ฅผ ๋ค๋ฅธ ํค๋๋ก ์ด๋
API ์ค๊ณ ์์น (Guiding Principles)
1. ์ฌ์ฉํ๊ธฐ ์ฌ์์ผ ํ๋ค
-
์จ๋ณด๋ฉ ์๊ฐ์ด ์งง์์ง๋ค
-
๋ฒ๊ทธ์ ์ค์ฉ์ด ์ค์ด๋ ๋ค
-
์ฌ์ฉ๋ฅ ์ด ์ฆ๊ฐํ๋ค
-
์ต์ ๋๋์ ์์น(Principle of Least Surprise)
๋ฐฉ๋ฒ:
-
ํด๋์ค, ๋ฉ์๋, ํ๋ผ๋ฏธํฐ, ํ์ ์ด๋ฆ์ ์ ์ง๋๋ค
-
์๋ฏธ๊ฐ ๋ช ํํ๊ณ
-
๊ฐ๊ฒฐํ๋ฉฐ
-
๋๋ฉ์ธ ์๋ฏธ๋ฅผ ๋ฐ์ํ๊ณ
-
์ผ๋ฐ์ ์ผ๋ก ํต์ฉ๋๋ ์ฉ์ด๋ฅผ ์ฌ์ฉ
-
-
์ปดํฌ๋ํธ ๋ด๋ถ/์ธ๋ถ์์ ์ผ๊ด์ฑ ์ ์ง
-
์ ์ ํ ์ถ์ํ ์์ค ์ ์ง
-
์: ์ปจํ ์ด๋ ์์ฒด ๋์ iterator๋ฅผ ์ ๋ฌ
2. ์ค์ฉํ๊ธฐ ์ด๋ ต๊ฒ ์ค๊ณํ๋ผ
-
๊ณ์ฝ์ด ๋ช ํํ๊ณ ๋ฒ์๊ฐ ์ข์์ผ ํ๋ค
-
์ผ๋ฐ์ ์ผ๋ก ๋ฐ์๋ค์ฌ์ง ์ฝ๋ฉ ๊ด๋ก๋ฅผ ๋ฐ๋ฅธ๋ค
-
์ฌ์ฉ์๊ฐ ์์ํ๋ ๋๋ก ์ ํํ ๋์ํด์ผ ํ๋ค
3. ๋ฌธ์ํ๊ฐ ๋์ด ์์ด์ผ ํ๋ค
๋ฌธ์๊ฐ ์์ผ๋ฉด, ์กด์ฌํ์ง ์๋ ๊ฒ์ด๋ค
-
๊ณต๊ฐ๋ ๋ชจ๋ ์์๋ฅผ ๋ฌธ์ํํ๋ค
-
๊ณ์ฝ ์ ์๋ ๋ช ํํ๊ณ , ๊ฐ๊ฒฐํ๋ฉฐ, ๋ชจํธํ์ง ์์์ผ ํ๋ค
-
ํํ ๋ฆฌ์ผ ์ ๊ณต (๋ฌธ์๋ ์ฝ๋๋ค)
-
๋ฌธ์ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ์ ์งํ๋ค
4. ์ต์ํ์ผ๋ก ์๊ฒฐ๋์ด์ผ ํ๋ค (Minimally Complete)
-
ํ์ํ ๊ฒ๋ง ํฌํจํ๋ค
-
API ์กฐํฉ์ผ๋ก ์ถฉ๋ถํ ๋ง๋ค ์ ์๋ ๊ธฐ๋ฅ์ ์ ์ธํ๋ค
-
์ถ์ํ์ ํํ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ค
-
์ถ์ํ: ๊ตฌํ์ด ๋ฌ๋ผ๋ ๋์์ ๊ตฌ๋ถ๋์ง ์์์ผ ํจ
-
ํํ ๋ถ๋ณ์ฑ: ๊ฐ์ฒด๊ฐ ํญ์ ๋ง์กฑํด์ผ ํ๋ ์กฐ๊ฑด
-
์์:
-
std::mutex+std::lock_guard-
mutex๋ primitive ์ ๊ณต
-
lock_guard๋ ์์ธ ์์ ํ RAII ์ ํธ๋ฆฌํฐ ์ ๊ณต
-
5. ๋์จํ๊ฒ ๊ฒฐํฉํ๋ผ (Loosely Coupled)
-
์ปดํฌ๋ํธ ๊ฐ ์ํธ ์์กด์ ์ต์ํํ๋ค
-
์ปดํฌ๋ํธ๋ ์์ง๋ ฅ ์๊ฒ ๊ตฌ์ฑํ๋ค
๊ถ์ฅ ์ฌํญ:
-
์ํ ์์กด์ฑ ํผํ๊ธฐ
-
ํ์ํ ๊ฒ๋ง include/import
-
callback, observer ํจํด ํ์ฉ
-
Mediator ํจํด ํ์ฉ (์์ ์ ๊ทผ ๋จ์ผ ์ฐฝ๊ตฌ)
6. ๊ตฌํ ๋ํ ์ผ์ ๋ ธ์ถํ์ง ๋ง๋ผ
Hyrumโs Law:
โ์ธํฐํ์ด์ค์ ๋ชจ๋ ๊ด์ธก ๊ฐ๋ฅํ ์์ฑ์
์ธ์ ๊ฐ ๋๊ตฐ๊ฐ์ ์ํด ์์กด๋๋คโ
ํจ๊ณผ:
-
์ฌ์ฉ์๋ ๋๋ฉ์ธ ๊ด์ ์ผ๋ก ์ค๊ณ ๊ฐ๋ฅ
-
API ์ ๊ณต์๋ ๋ณ๊ฒฝ ์์ ๋๊ฐ ์ปค์ง๋ค
-
์ ๊ทธ๋ ์ด๋์ ํ ์คํธ๊ฐ ์ฌ์์ง๋ค
๊ฐ์ด๋๋ผ์ธ:
-
๋๋ฉ์ธ ํ์ ์ ๊ณต๊ฐ ์ธํฐํ์ด์ค์ ์ฌ์ฉ
-
๋ด๋ถ ํ์ ๋ ธ์ถ ๊ธ์ง
-
์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ /ํจ์ ๋ ธ์ถ ๊ธ์ง
7. ์ฅ๊ธฐ ์ฌ์ฉ์ ๊ณ ๋ คํ๋ผ
-
์๊ตฌ์ฌํญ์ ๋ณํ๋ค
-
ํ๋ซํผ ์ ์ฝ๋ ๋ณํ๋ค
-
์ฒ์๋ถํฐ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ฃ์ ํ์๋ ์๋ค
-
๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ์ถ๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค
์์:
- in/out ํ๋ผ๋ฏธํฐ๋ฅผ struct/class๋ก ์ ์
โ ์ดํ ํ๋ ํ์ฅ ๊ฐ๋ฅ
์ต์ ๋๋์ ์์น:
-
์ฌ์ฉ์์ ์์ธก์ด ๋ง์์ผ ํ๋ค
-
๋๋ฉ์ธ ๊ธฐ๋ฐ ์ถ์ธก์ด ํ๋ฆฌ๋ฉด ์คํจํ API๋ค
8. ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ํผํ๋ผ
-
ํน์ ์์ ์ ์ํํ๋ ๋ฐ ํ์ํ ์ฝ๋ ์์ด
API ์ ํฉ์ฑ์ ํ๋จํ๋ ์ข์ ์งํ๋ค -
์ ์ ํ ์ถ์ํ ์์ค ์ ์ง
- ์น ์๋ฒ API๋ socket์ด ์๋๋ผ HTTP ์์ฒญ/ํค๋๋ฅผ ๋ค๋ค์ผ ํ๋ค
-
๋ฐ๋ณต๋๋ ๊ณตํต ์์ ์ ์ํ ์ ํธ๋ฆฌํฐ ์ ๊ณต
-
ํ ์คํธ ์์ฑ์ด ์ฌ์์ง๋ค
9. ํ๋ซํผ ๋ ๋ฆฝ์ ์ผ๋ก ์ค๊ณํ๋ผ
-
ํน์ OS์์๋ง ๋์ํ๋ ์ค๊ณ ๊ธ์ง
-
ํน์ OS์์๋ง ๋์ํ์ง ์๋ ์ค๊ณ๋ ๊ธ์ง
-
Windows vs POSIX
-
์๋์ ๋ฌธ์
-
์ปดํ์ผ๋ฌ ์ข ์ ์ด์
-
-
์ค๋ฒ๋ก๋๋๋ ํจ์์ ๋์ผํ ํ์ ์ฌ์ฉ
10. ํ ์คํธ ๋๋ผ์ด๋ฒ๋ฅผ ๊ณ ๋ คํด ์ค๊ณํ๋ผ
API ์ค๊ณ์ ํฉ๊ธ๋ฅ :
๋ค API๋ฅผ ์ฌ์ฉํ๋ ํ ์คํธ๋ฅผ ์ง์ ์์ฑํด๋ด๋ผ
-
์ ํ๋ฆฌ์ผ์ด์ ํ ์คํธ/ํตํฉ ํ ์คํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํด์ผ ํ๋ค
-
mock ๋ถ๊ฐ๋ฅํ concrete class API๋ ํผํ๋ค
-
์ธํฐํ์ด์ค ๊ธฐ๋ฐ ์ค๊ณ ๊ถ์ฅ
-
๋ณต์กํ API๋ mock ๋ฒ์๋ฅผ ์ต์ํ
- ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(ISP)
-
์์กด์ฑ์ ๋๊ณ ๋จ๋ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค
11. ํ ์คํธ ๊ฐ๋ฅํ๊ฒ ์ค๊ณํ๋ผ
-
๋ด๋ถ ๊ธฐ๋ฅ์ ํ ์คํธํ ์ ์๋๋ก API๋ฅผ ์ค๊ณํ๋ค
-
์์คํ /๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค
๊ถ์ฅ ๊ธฐ๋ฒ:
- PIMPL (Pointer to Implementation) ํจํด
์์ฝ (Summary)
-
์ข์ API๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค
-
์ค์ ์ฌ์ฉ ๋ฐฉ์์ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ๋ค
-
API ์ค๊ณ ์์น์ ์ ์ฉํ๋ฉด ํ์ง์ด ํฌ๊ฒ ํฅ์๋๋ค
ํต์ฌ ์ ๋ฆฌ (Takeaways)
-
API๋ ์ฝ๋๊ฐ ์๋๋ผ ์ฝ์์ด๋ค
-
์ฌ์ฉ์ ๊ด์ ์์ด ์ข์ API๋ ๋์ฌ ์ ์๋ค
-
๊ตฌํ ๋ํ ์ผ์ ์ ๋ API๋ก ์์ง ์๊ฒ ํ๋ผ
-
API/ABI ํธํ์ฑ์ ์ค๊ณ ์ด๊ธฐ์ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ๋ค
-
โ๋์ค์ ๊ณ ์น์โ๋ API ์ค๊ณ์์ ๊ฑฐ์ ํญ์ ํ๋ฆฐ ์ ํ์ด๋ค
Reference
C++Now 2018: Titus Winters โModern C++ API Design: From Rvalue-References to Type Designโ
API Design Principles - John Pavan - CppNorth 2023
Testability and C++ API Design - John Pavan, Lukas Zhao & Aram Chung - C++Now 2024