타입, 적을 것인가, 말 것인가?

자동 타입 추론 가능한 함수형 언어에서 타입을 적을 것인가, 말 것인가? 타입을 적는다면 이런 모양이 될 것이고,

let add (k:key) (v:value) (m:t) =
  body
(* or *)
let add : key -> value -> t =
  fun k v m ->
    body

안 적는다면 이런 모양이 될 것이다.

let add k v m =
  body

비용

타입을 적으면 코드 쓰기 비용(w)이 늘고, 타입을 안 적으면 코드 읽기 비용(r)이 는다. 이 두 비용 사이의 크기를 비교하자.

한 번 코드를 쓰면(w) 10번 고치고(10w, 10r) 100번 읽는다(100r).

옛 속담에 따르면 타입을 적을 때 필요한 총 쓰기 비용은 11w, 타입을 안 적을때 필요한 총 읽기 비용은 110r이다. 즉, w와 10r 중 누가 적은지 비교하면 되겠다.

예로 인자 셋인 함수를 생각해 보자.

결론: w = 4 < 10 = 10r (타입 적기 승?)

한 가지 빠뜨린 것이 있다. 코드를 읽을 때마다 모든 함수의 타입을 매번 다시 읽을 필요는 없다. 모듈 이름, 함수 이름, 변수 이름만 보고도 타입이 무엇인지 쉽게 떠오르는 함수에 대해선 타입을 볼 필요가 없다.

코드를 읽을 때 얼마나 많은 비율로 함수 타입이 보고 싶을까?

처음엔 당연히 타입을 모두 적는 것이 더 비쌀 것이라 생각했는데 큰 읽기 횟수를 생각하면 아무리 단축키 한 번 누르는 1초라도 모여서 커질 수 있겠다 싶다.

타입을 적었을 때 글자가 더 많아져 읽기 효율(readability)이 떨어지는 등 이슈가 있을 수 있지만, 반대로 단축키를 누르고 눈동자가 크게 움직이며 생각의 흐름이 끊기는 이슈도 있을 수 있으니 둘이 상쇄!

이쁨

코드를 하나의 물건이라 생각한다면 코드가 잘 동작하는 것도 중요하지만 기왕이면 이쁜 게 더 좋다. 사람을 이동시키는 자동차에서 굳이 광이 나야 하는 것과 같은 이유. 코드에도 광이 나면 좋다. 물론 무광 자동차가 더 멋지다고 생각하는 사람들도 있으니까 취향은 존중해야지. 다만 난 타입을 적지 않는 게 더 이쁜 것 같다.


딱히 타입을 적었을 때 크게 잃는 것이 무언지 모르겠고, 타입을 안 적었을 때 크게 얻는 것이 무언지 모르겠다. 여기저기 찾아 봐도 특별한 설명이 없다. 모르겠다. 그냥 지금 느낌으론 코드의 적당한 곳에 적당한 주석이 있으면 이해에 도움이 되듯 타입도 적당한 곳에 적당한 만큼 있으면 되는 게 아닌가 싶다.

2016-12-18 씀.