2022-09-14 ‘Wily’ Code Complexity Library
Intro.
플랫폼 리팩터링 경험 공유. Code Complexity 줄이기 with Python 를 읽다가 Wily 라는 code complexity 파이썬 라이브러리를 알게 되었다.
이전에 SW 팀 위클리 에서 코드를 언제 리팩토링 해야할 지에 대해서 잠시 이야기 나눈 적이 있었는데 그 때도 이런 비슷한 라이브러리를 java script 진영에서 본 것 같다. 그리고 지라 카드가 몇 개이고, 크리티컬한 이슈가 몇 개인지에 따라 새로운 개발은 중단하고 디버깅을 해야할 때! 라는 것을 알려주는 시스템을 사용하는 팀도 있다는 것을 이 때 알게 되었다.
여튼.. 코드라는 것이 정형화 해서 분석하기가 어려운 점이 있다고 생각하기 때문에 절대적으로 이러한 방식이나 complexity 를 계산하는 라이브러리를 신봉하기 보다는 지표를 보면서 ‘아 이제는 리팩토링 할 때가 되었구나…’ ‘요즘에 신경쓰지 않고 작업했구나… ‘ 등등 어떠한 signal 을 심어 놓는 느낌으로 사용해 보는 것도 좋을 듯 하다.
Wily
Wily 는 커밋 별로 code complexity 가 얼마나 증가 or 감소했는지 숫자와 그래프로 보여주는 툴이다. 여러가지 지표들을 아래와 같이 4 가지로 보여준다.
Each Index 의 의미
- Maintainability
- 각 sub 지표들의 증감을 통해 종합적인 스코어를 보여준다.
- 높을 수록 덜 복잡한 것.
- Unique Operands
- 코드에 존재하는 variable과 value 의 합이라고 함.
- 높을수록 복잡하다.
- Cyclomatic Complexity
- 코드에서 분기가 되는 부분의 갯수. if 절이 많으면 +가 되겠지.
- 높을수록 복잡하다.
- Lines of Code
- 말 그대로 코드 라인수.
- 높을수록 복잡하다거나 낮을수록 덜 복잡한 것이 아니다. 라인수가 많아도 복잡도는 낮을 수 있다. 라인 수 참고용으로 보면 될 듯.
사용 해보기
Install Wily.
$ pip install wily
Wily 는 사용하기전에 프로젝트의 git info index 가 필요하다. build 명령어로 프로젝트의 인덱스를 생성 해보자.
(lx-hcs-399) ➜ lx-hcs git:(develop) wily build lx-hcs
Found 1 revisions from 'git' archiver in '/Users/seongtaekhong/dev/lx-hcs'.
Running operators - raw,halstead,cyclomatic,maintainability
In revision 5ad7524953b616b7e1878d756e5b521e8707ba44, for operator raw: No data collected
In revision 5ad7524953b616b7e1878d756e5b521e8707ba44, for operator halstead: No data collected
In revision 5ad7524953b616b7e1878d756e5b521e8707ba44, for operator cyclomatic: No data collected
In revision 5ad7524953b616b7e1878d756e5b521e8707ba44, for operator maintainability: No data collected
Processing |################################| 4/4
Completed building wily history, run `wily report <file>` or `wily index` to see more.
이제 실행해보자.
$ wily report src/serial_monitor_tab/serial_backend.py
잘.. 안 보이지만 27 → 31 → 25 요런 식으로 커밋할 때마다 maintainability 가 변경된 것을 확인할 수 있다. 맨 오른쪽 컬럼에서 라인수의 변경도 보여주긴 함
재미있는 건 여러가지 지표들을 graph 화 해주기도 한다는 점. 아래는 serial_backend.py 의 maintainability 이다. 점점 낮아지는 트렌드를 볼 수 있다. 하.하.
Pre-commit hook
매번 실행하기 귀찮으니 hook 을 걸어서 commit 할 때마다 자동으로 Wily 를 돌려 결과를 볼 수도 있다.
# Creates .pre-commit-config.yaml in project root folder
repos:
- repo: local
hooks:
- id: wily
name: wily
entry: wily diff
verbose: true
language: python
additional_dependencies: [wily]
pre-commit 이 설치되어 있고 .pre-commit-config.yaml 을 프로젝트 루트 폴더에 생성하면 커밋할 때마다 Wily 가 실행 됨.
만약 pre-commit 이 설치되어 있지 않다면 설치를 하자.
$ pip install pre-commit
or
$ brew install pre-commit
$ pre-commit -V. # Check installation
pre-commit 2.8.2
설치 후 commit 할 때마다 자동으로 Wily 가 실행된다.
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
결과값이 좀 이상하지만 어쨌든 pre-commit 이 잘 실행된다.
References
- Wily — wily develop documentation
- 플랫폼 리팩터링 경험 공유. Code Complexity 줄이기 with Python
- 기술 블로그 모음 - TechBlogPosts