설계 ①: 무엇을 표현하고 무엇을 버릴까
기준을 먼저 정해야 했다
무엇을 뺄지 정하려면 기준이 필요하다. 우리가 세운 기준은 하나였다.
“기본값을 합리적으로 정할 수 있는가.”
이 기준이 나온 배경은 7편에서 세어본 그 숫자다. 사용자가 주는 것은 네댓 개이고 시스템이 정해야 하는 것이 스무 개다. 그러니 기본값을 정할 수 없는 항목은 애초에 다루지 말아야 한다. 다루면 사용자에게 물어야 하고, 물으면 마찰이 생기고, 마찰이 생기면 아무도 쓰지 않는다.
이 기준으로 후보들을 걸러 나갔다.
남긴 것
형상 — 정해진 몇 가지만
임의의 형상을 받지 않는다. CAD 파일도 받지 않는다. 대신 매개변수로 표현되는 기본 도형만 허용한다. 사각형, 원, 원통, L자 단면, 그리고 이들의 단순한 조합.
이유는 두 가지다.
첫째, 격자를 자동으로 만들 수 있다. 임의 형상에서 좋은 격자를 만드는 일은 그 자체로 어려운 문제이고, 실패하면 결과가 조용히 틀린다. 정해진 도형이라면 격자 생성 규칙을 미리 정해둘 수 있다.
둘째, 치수의 기본값을 정할 수 있다. “사각형 판”이라고만 하면 대표적인 크기를 넣을 수 있다. “임의의 형상”에는 기본값이라는 게 없다.
이 결정으로 무엇을 잃었나. 실제 제품의 정확한 형상은 다룰 수 없다. 곡면이 섞인 실물, 구멍이 여러 개 뚫린 판, 조립체 전체. 전부 못 한다.
그런데 우리 목적에는 크지 않은 손실이었다. 우리가 만들려는 것은 “방향 확인용”이다. 손잡이가 뜨거워질지 아닐지를 보려면, 손잡이를 실물 그대로 모델링할 필요가 없다. 적절한 단면을 가진 막대로 근사해도 답의 방향은 같다.
물리 — 처음에는 열전달만
전자기, 유동, 진동, 구조를 한꺼번에 다루려 하지 않았다. 열전달 하나로 시작했다.
이유는 열이 가장 직관적이면서 기본값이 명확한 영역이기 때문이다. 주변 온도는 실온, 대류 조건은 자연 대류, 초기 온도는 주변과 같음. 이런 기본값이 상식으로 정해진다.
반면 예를 들어 유동은 그렇지 않다. 입구 유속을 얼마로 놓아야 “합리적”인가. 정답이 없다. 문제마다 다르다. 그래서 사용자에게 물어야 하고, 물으면 마찰이다.
경계조건 — 세 종류만
수학적으로 경계조건에는 여러 종류가 있지만, 우리는 세 가지만 허용했다.
- 고정 온도 — 이 면은 200도로 유지된다
- 열流 유입 — 이 면으로 열이 들어온다
- 주변과 열교환 — 이 면은 공기와 접촉해 식는다
그리고 여기에 암묵 규칙을 하나 붙였다. 아무 조건도 지정되지 않은 면은 주변 공기와 열교환한다고 본다.
이 규칙 하나가 앞 편에서 본 문제를 크게 줄였다. 사용자가 “바닥에서 200도”만 말하고 나머지 면을 언급하지 않아도 계산이 성립한다. 사람이 상식으로 채우는 그 값을, 시스템이 규칙으로 채운다.
재료 — 목록 + 직접 입력
흔한 재료는 목록으로 두고 물성값을 미리 넣어뒀다. 알루미늄, 강철, 스테인리스, 구리, 유리, 몇 가지 플라스틱.
목록에 없으면 물성값을 직접 넣을 수 있게 열어뒀다. 이건 좁힘의 예외인데, 이유가 있다. 재료는 목록으로 다 담을 수 없고, 담지 못한 재료를 쓰는 사용자에게 도구가 무용지물이 되기 때문이다.
대신 직접 입력을 드물게 쓰이는 길로 만들었다. 기본 경로는 목록이고, 필요한 사람만 값을 넣는다.
버린 것
빼기로 한 결정들이 오히려 이 설계의 성격을 규정한다.
| 뺀 것 | 이유 |
|---|---|
| 임의 형상 / CAD 가져오기 | 격자 자동 생성이 불안정하고 기본값이 없다 |
| 3차원 (초기) | 계산량이 폭발하고, 방향 확인에는 2차원이 대개 충분하다 |
| 재료 물성의 온도 의존성 | 데이터가 필요하고 기본값이 없다 |
| 상변화 (녹음, 끓음) | 조건 설정이 복잡하고 결과 해석이 어렵다 |
| 사용자 정의 수식 | 무엇이 들어올지 알 수 없어 검사가 불가능하다 |
| 격자·수렴 설정 노출 | 사용자가 정할 일이 아니다. 시스템이 정한다 |
마지막 줄이 특히 중요하다. 기존 도구에서 가장 어려운 부분을 아예 없애 버렸다.
물론 이 결정에는 대가가 있다. 시스템이 정한 격자가 부적절하면 결과가 틀린다. 그런데 사용자에게 정하라고 해도 대개 틀린다 — 그건 전문 지식이 필요한 판단이니까. 그렇다면 틀릴 가능성을 사용자에게 넘기지 않고 시스템이 책임지는 편이 낫다고 판단했다.
책임을 지는 방식은 20편에서 다룰 검증 문제로 이어진다.
확장을 어떻게 남겨뒀나
여기서 조심할 것이 있다. 좁게 시작하는 것과 좁게 갇히는 것은 다르다.
우리 계획은 다루는 영역을 단계적으로 넓히는 것이다. 열전달 → 기초 구조 → 그다음. 그런데 나중에 넓힐 수 있으려면, 처음 설계가 넓힐 자리를 남겨두어야 한다.
그래서 DSL의 구조를 이렇게 잡았다. 각 문제는 어떤 물리 현상인가 / 형상은 무엇인가 / 재료는 무엇인가 / 경계에서 무슨 일이 일어나는가 / 무엇을 알고 싶은가 라는 다섯 칸으로 표현된다.
이 다섯 칸은 열전달에만 해당하는 구조가 아니다. 어떤 물리 문제든 이 형태로 적힌다. 구조해석도, 전자기도. 다만 각 칸에 들어갈 값의 종류가 다를 뿐이다.
그래서 새로운 물리를 추가하는 일은 새 언어를 만드는 것이 아니라 기존 칸에 항목을 더하는 것이 된다.
지금은 열전달 하나만 채워져 있다. 나머지 칸은 비어 있지만 자리는 있다.
이 결정들이 만든 것
정리하면 이렇다. 우리가 만든 것은 “수치해석 언어”가 아니라 “특정 종류의 열전달 문제를 기술하는 언어”다.
훨씬 좁다. 그리고 그 좁음 덕분에 앞에서 필요했던 세 가지가 모두 성립한다. 완전성 검사가 되고, 기본값이 정해지고, 사람이 읽을 수 있다.
그런데 아직 가장 까다로운 문제가 남았다. 사람의 말은 여전히 애매하다는 것.
“플라스틱”이라고만 했을 때 무엇으로 정해야 하나. “좀 뜨거운” 상태는 몇 도인가. “빨리 식는” 조건은 어떻게 표현하나. 좁은 언어를 만들어도 입구에 들어오는 말은 여전히 애매하다.
이 애매함을 어떻게 다룰지가 다음 편의 주제다.
다음 편 예고 — 설계 ②: 애매함을 어떻게 다룰까. 정할 수 없는 것을 정해야 할 때, 시스템이 취할 수 있는 태도들을 비교한다.