KUR Creative


LoC(Line of Code)는 전투력이다

resource/전투력.jpeg

정확히 말하자면

혼신의 힘을 다해서
할 수 있는 한 가장 깔끔하게 짜고
후일 유지보수를 생각하면서 짜는
​개인 프로젝트​(혹은 자신이 주도하는 프로젝트)의 LoC가 그 프로그래머의 전투력이다.

프로그래밍의 핵심은 시스템의 복잡도를 줄이는 일이다.
다른 모든 것은 부차적인 일이다.
그런데 규모가 큰 프로젝트를 한다는 것은 이런 복잡도를 잘 컨트롤 하고 있다는 것과 같다.

사실 위에 이거저거 똥 붙인 LoC가 아니라
그냥 LoC를 어설픈 전투력으로 볼 수도 있다.
LoC가 크다는 건 뭔가 복잡할 가능성이 큰 것이고,
프로젝트가 크면 클 수록 복잡도는 올라간다.
일정 이상의 LoC를 가진 프로젝트는 그냥 그 자체만으로도 굴리기 힘들다.

혼자서 하는데 유지보수를 염두에 둔 프로젝트라면
할 수 있는 최대한으로 코드를 깔끔하게 하고
더 이상 뺄 수 없을 때까지 군더더기를 빼낸 다음
한번 LoC를 측정해보자.
그 값이 바로 당신의 전투력이다.

전투력 측정

처음부터 끝까지 전부 혼자서 작성한 프로젝트(git 써야 함)가 있다면 다음 명령으로 전투력을 측정해 볼 수 있다.

git ls-files | grep '\.type' | xargs wc -l

.type에 원하는 확장자를 넣으면 된다.

식질머신 v0

4년 쯤 전에 파이썬과 qml로 짰던 식질머신 v0 앱의 결과는 다음과 같다

[kur@kur-dev-machine SickZil-Machine-v0]$ git ls-files | grep '\.py' | xargs wc -l
   51 src/ImListModel.py
    0 src/__init__.py
   76 src/consts.py
  192 src/core.py
  227 src/gui.py
   62 src/imgio.py
   27 src/main.py
  142 src/state.py
    0 src/utils/__init__.py
   96 src/utils/fp.py
   68 src/utils/futils.py
  221 src/utils/imutils.py
    0 test/__init__.py
   31 test/core_test.py
   23 test/futils_test.py
  161 test/gui_test.py
   32 test/imgio_test.py
   37 test/imutils_test.py
  158 test/state_test.py
 1604 total
[kur@kur-dev-machine SickZil-Machine-v0]$ git ls-files | grep '\.qml' | xargs wc -l
800 qml/szmc-0.1.0.qml

그런데 이건 qml을 대충 빠르게 조까치 짜서 뻥튀기된 감이 크다. 제대로 짠다면 szmc-0.1.0.qml의 크기는 훨씬 줄었을 것이다. qml을 더 잘 짜서 한 반토막 쯤 난다고 하면, 식질머신 v0 앱의 LoC는 대충 2k로 볼 수 있다.

사실 식질머신을 뒷받침 하는 인프라 용도로 쓰려고 만들던 szmc-manager는 LoC가 무려 8k다(레포의 tmp 디렉토리의 과거 PoC 코드 제거함).

[kur@kur-dev-machine szmc-manager]$ git ls-files | grep '\.clj' | xargs wc -l
     5 doc/utils.clj-spec.html
   139 src/domain/algo/dockerized.clj
    53 src/domain/dset/dataset.clj
    25 src/domain/fs/common.clj
   210 src/domain/fs/frozen.clj
    30 src/domain/fs/io.clj
   268 src/domain/fs/out.clj
    64 src/domain/img/image.clj
   370 src/domain/img/mask.clj
    99 src/domain/img/size.clj
   136 src/domain/mydb/datomic.clj
    42 src/domain/run/check.clj
    
... 생략 ...

    16 test/utils/image/waifu2x_test.clj
    57 test/utils/map_test.clj
   107 test/utils/py_image_test.clj
    67 tmp/cmd-test/run_test.clj
  8087 total

하지만 이건 폭망한 프로젝트라서 언급하기 좀 그렇다..

사실 두 프로그램은 모두 수명이 끝났고, 업데이트도 하지 않고 있다. 식질머신 앱의 새 버전(v1)은 웹앱으로 만들 거고, szmc-manager 또한 완전히 다른 기반과 설계를 적용하여 처음부터 다시 만들고 있다. 그렇다. 포기하지 않았다. 버리지도 않았다. 식질머신은 내가 살아 있는 한 끝까지 간다!

그러니 이것들로 현재의 전투력을 측정하는 건 사실 말이 안 된다. 내가 1학년 때 C로 짠 KUR-GONU의 LoC는 4.6k다. 그렇다고 해서 학부 1학년 때의 내가 suxa 때의 나보다 전투력이 높은 건 아니니까..

kur-blog 1.3.0

역시 전투력은 제일 최근에 만든 걸로 측정해야 한다. 블로그 프로젝트는 만든지 반 년도 안 된 따끈따끈한 프로그램이다! 거기다 앞으로 피처 업데이트도 예정되어 있고, 10년 이상 유지보수를 천명했다. 자고로 마마잃은중천공이라했으니, 10년 뒤에도 접속 되는지 꼭 봐주시길..

다음은 kur-blog 1.3.0으로 해본 전투력 측정 결과다(보안을 위한 클로즈드 소스 프로젝트라서 여러분은 못본다).

[kur@kur-dev-machine kur-blog]$ git ls-files | grep '\.clj$' | xargs wc -l
   51 build.clj
   17 src/clj/kur/blog/look/archive.clj
   16 src/clj/kur/blog/look/error.clj
   11 src/clj/kur/blog/look/home.clj
  101 src/clj/kur/blog/look/post.clj
   12 src/clj/kur/blog/look/subscribe.clj
   57 src/clj/kur/blog/look/tags_and_series.clj
   70 src/clj/kur/blog/look/template.clj
   26 src/clj/kur/blog/main.clj
   55 src/clj/kur/blog/monitor.clj
   25 src/clj/kur/blog/obsidian/frontmatter.clj
   22 src/clj/kur/blog/obsidian/tag.clj
   52 src/clj/kur/blog/page/post.clj
   39 src/clj/kur/blog/page/post/diff.clj
   28 src/clj/kur/blog/page/post/md2x.clj
   26 src/clj/kur/blog/page/post/name/generator.clj
   64 src/clj/kur/blog/page/tags.clj
   36 src/clj/kur/blog/state.clj
   80 src/clj/kur/blog/updater.clj
    5 src/clj/kur/util/compare.clj
   58 src/clj/kur/util/file_system.clj
   10 src/clj/kur/util/generator.clj
   26 src/clj/kur/util/regex.clj
    3 src/clj/kur/util/string.clj
   17 src/clj/kur/util/time.clj
    0 test/integration/kur/blog_test/e2e.clj
   35 test/integration/kur/blog_test/scenario.clj
   83 test/integration/kur/blog_test/spbt.clj
   47 test/integration/kur/blog_test/spbt/data_generator.clj
   23 test/integration/kur/blog_test/spbt/operation_generator.clj
   21 test/integration/kur/blog_test/spbt/property.clj
   33 test/integration/kur/blog_test/spbt/runner.clj
   30 test/regression/kur/blog_test/oneshot_regression.clj
  115 test/unit/kur/blog/obsidian/frontmatter_test.clj
   20 test/unit/kur/blog/page/post/name_test.clj
 1314 total
[kur@kur-dev-machine kur-blog]$ git ls-files | grep '\.cljc$' | xargs wc -l
  59 src/cljc/kur/blog/page/post/name.cljc
  58 src/cljc/kur/blog/page/post/name/spec.cljc
  84 src/cljc/kur/blog/policy.cljc
  45 src/cljc/kur/util/cfs.cljc
 246 total
[kur@kur-dev-machine kur-blog]$ git ls-files | grep '\.cljs$' | xargs wc -l
    4 md2x/src/kur/md2x/config.cljs
  116 md2x/src/kur/md2x/main.cljs
  104 md2x/src/kur/md2x/wikilink/parse.cljs
   73 md2x/src/kur/md2x/wikilink/plugin.cljs
   97 md2x/src/kur/md2x/wikilink/token.cljs
  394 total

[kur@kur-dev-machine kur-blog]$ git ls-files | grep '\.css$' | xargs wc -l
  17 src/css/anchor.css
  93 src/css/article.css
  30 src/css/footer.css
  17 src/css/header.css
  10 src/css/highlight_fragment.css
   6 src/css/layout.css
 173 total

clj, cljs, cljc.. ㅡ근ㅡ 답게 근로저만 마구 써댄 프로젝트다. 다 합쳐서 2127니까, 대충 2.1k다. 이 프로젝트는 젖먹던 힘까지 쥐어짜서 최고로 깔끔하게 만들었고, 유지 보수도 계속 할 생각이다.

결론

resource/Clojure_logo.svg.png

23년 나의 전투력은 대충 Clojure로 2.1k다.

나는 과거보다 성장했을까?

사실 코딩, 테스트 등 저수준의 전술적 전투력은 LoC로도 어느 정도 측정할 수 있다. 하지만 학습, 설계, 추상화 등 좀 더 고수준의 전략적 능력은 LoC로는 측정이 거의 불가능하다. 전략적 전투력이 높을 수록, 즉 설계나 추상화를 잘 할 수록 일반적으로 LoC는 오히려 줄어드는 경우가 많기 때문이다.

하지만 단순 비례 관계인 건 또 아니다. 사실 설계나 추상화가 엉망이면 일정 이상 LoC를 올리는 게 거의 불가능해진다. 엉망진창인 설계로도 10k 정도까지는 버틸 수 있는 거 같은데.. 그 이상은 아무도 손 대고 싶어하지 않는 프로젝트가 되는 듯하다.

아무튼 LoC로 프로젝트의 대략적인 규모를 측정할 수 있다. 그리고 큰 규모의 프로젝트를 굴릴 줄 알아야 진짜 고수다.
그래서 LoC는 나름 의미가 있다.


이런 업적게이질은 심심풀이로 딱 좋다.

여러분도 한번 해 보시라!

#from/old-blog
kur2306070427Archivekur2306302054