큰 규모의 코드베이스에서 코드의 구조는 다른 사람이 코드와 얼마나 쉽게 상호작용할 수 있을지 영향을 미친다.
이 장에서는 코드베이스를 인지적 관점에서 바라보는 CDN 기술
에 대해 논한다. CDN은 코드를 사람들이 쉽게 변경할 수 있을지, 쉽게 정보를 찾을 수 있을지란 질문에 답을 찾는데 도움을 준다.
이어서 코드베이스의 인지차원
이라는 수정된 프레임워크를 사용하여 기존 코드베이스의 설계를 개선하는 방법을 다룬다
12.1 코드베이스의 특성 조사
코드베이스에 대해 논할때 기술적 측면이 아닌 인지적 측면에서 논해보자
인지적 차원
토머스 그린 등의 의해 만들어진 대형 코드베이스 사용성 평가 척도인 CDN을 일반화한 버전인 CDCB(코드베이스의 인지차원)이라고 부른다. 이를 통해 코드베이스를 검토하고 어떻게 이해, 개선할 수 있는지 논의할 수 있다. 이는 라이브러리 등 다른 프로그래머가 사용만 하는 경우 유용하다
먼저 각 차원에 대해 개별적으로 살펴보자
- 오류 경향성
- 일부 프로그래밍 언어에서는 다른 언어보다 실수를 하기 쉽다 (ex : 자바스크립트)
- 코드 베이스도 오류 경향성을 띌 수 있다. ex : 일관성없는 규칙, 문서 부족, 모호한 이름
- 번외) 타입 시스템은 오류를 방지하는데 도움된다는 것은 증명되었다. 타입이 지적된 위치와 런타임 오류가 발생하는 부분은 동일했다.
- 일관성
- 사람들은 비슷한 것들이 얼마나 유사하고 일관적인지 확인하면서 상호작용한다.
- 이름과 규약을 일관성 없이 사용하는 프레임워크나 언어는 인지 부하를 더 많이 가져올 수 있다.
- 일관성은 오류 경향성과도 관련이 있다.
- 분산성
- 프로그래밍 구성 요소가 얼마나 많은 공간을 차지하는지.
- 같은 기능을 하더라도 언어에 따라 라인, 청크가 더 많아질 수 있다.
- 숨겨진 의존성
- 의존 항목이 사용자에게 어느정도로 가시적으로 나타나는지
- ex) HTML 페이지와 JS 코드가 분리 되어 어디서 해당 코드를 실행하는지 모르는 경우
- 한 함수에서 어떤 함수들을 호출하는지랑, 그 함수를 어디서 호출하는지 중 전자가 파악하기 쉽다.
- 최근에는 IDE에서 해당 기능을 지원해주지만, 별도 동작이 필요하긴하다
- 잠정성
- 도구를 사용하는 동안 생각하는 것이 얼마나 쉬운지
- 코드베이스에서 코드를 작성하는 어느정도 자유롭지 못한데 문법 오류, 타입 체크 등이 사고를 방해할 수 있다. 이러한 제한이 엄격하다면 잠정성이 낮다고 한다.
- 잠정성이 높으면 작성자의 불완전한 코드를 실행해볼 수 있다.
- 점도
- 특정 시스템을 변경하는 것이 얼마나 어려운가. 잠정성과 연관이 있다
- 프로그래밍 언어, 점점 증가하는 테스트 등이 영향을 준다
- 점진적 평가
- 주어진 시스템에서 부분적인 작업을 확인하거나 실행하는 것이 얼마나 쉬운지. 잠정성과 연관이 있음
- HMR 같이 실행도중 코드를 변경할 수 있으면 점진적 평가 차원이 높다.
- 점진적 평가 차원이 낮으면 시스템에서 완료되거나 완벽하지 않은 코드를 실행할 수 없으므로 잠정성을 억제한다
- 역할 표현력
- 프로그램에서 여러 가지 다른 부분의 역할을 얼마나 쉽게 알 수 있는지
- IDE에서 변수, 키워드 등을 하이라이트해주는 것, 불리언 값을 반환하는 함수는
is
로 시작되는 것등이 역할 표현력에 도움을 준다.
- 매핑 근접성
- 프로그래밍 언어 또는 코드가 문제의 해결 영역에 얼마나 가까운지
- ex) APL은 벡터 미적분에 가깝고, 코볼은 비즈니스 및 금융과 밀접한 관게가 있음
- ex)
executeQuery()
보다findCustomers()
가 매핑 근접성이 높다.
- 도메인 주도 설계 철학은 코드의 구조와 식별자가 비즈니스 도메인과 일치해햐 한다고 규정함. 이를 통해 매핑 근접성을 높일 수 있음
- 프로그래밍 언어 또는 코드가 문제의 해결 영역에 얼마나 가까운지
- 힘든 정신 활동
- 사용자가 시스템 외부에서 힘든 정신 활동을 해야할 경우 생각하기가 어려워짐
- ex) C++에서는 포인터를 계속 생각해야함. 매개변수가 많은데 이를 올바른 순서로 넣어야함
- 이를 통해 성능 등 얻는 것이 있을 수 있지만, 그 작업이 어려울 것이라는 건 인지하고 신중하게 해야한다.
- 언어적 안티패턴도 힘든 정신 활동을 유발한다
- 사용자가 시스템 외부에서 힘든 정신 활동을 해야할 경우 생각하기가 어려워짐
- 보조 표기법
- 프로그래머가 공식 규격에는 없는 의미를 코드에 추가할 가능성
- 주석문, 파이썬의 named parameter 등이 있다.
- 추상화
- 시스템의 사용자가 기본적으로 제공되는 추상화만큼 강력한 추상화를 만들 수 있는지 여부
- 일반적으로 함수, 객체, 클래스를 만드는 것을 의미하고 이는 대부분 지원된다.
- 가시성
- 시스템의 다른 부분을 얼마나 쉽게 볼 수 있는지
- 코드베이스가 어떤 클래스로 구성되어있는지 확인하기 어려울 수도 있다.
코드베이스 개선을 위해 CDCB 사용
위에서 알아본 차원의 차이는 사람들이 코드베이스와 상호작용하는 방식에 큰 영향을 끼칠 수 있다.예를들어 코드베이스의 점도가 높으면 사람들이 변경을 꺼리고, 패치만 더해져서 더 복잡한 코드베이스가 될 수 있다
따라서 코드베이스가 여러 차원에서 어떻게 작동하는지 파악하는 것이 중요하다. 이를위해 인지적 차원 목록
으로 체크해볼 수 있다. 이를 정기적으로 수행한다면 코드의 사용성을 유지하는데 도움이 된다
차원 | 관련이 있는가? | 개선할 수 있는가? |
---|---|---|
오류 경향성 | … | … |
설계 기동 및 트레이드오프
설계 기동 : 코드베이스에서 특정 차원을 개선하기 위해 코드베이스를 변경하는 것 설계 기동으로인해 다른 차원이 변경되는 경우가 많다.
- 오류 경향성 vs 점도 : 타입을 추가하여 오류 경향성을 줄이면, 점도가 높아질 수 있다
- 잠정성 및 점진적 평가 vs 오류 경향성 : 잠정성과 점진적 평가성이 높은 시스템은 미완성 코드라도 실행해볼 수 있는데, 이는 오류 경향성을 높일 수 있다
- 역할 표현력 vs 분산성 : named parameter 등으로 역할 표현력이 높아질 수 있지만, 추가적인 레이블로 코드가 길어질 수 있다
12.2 차원 및 활동
차원이 활동에 미치는 영향
CDN 프레임워크의 활동들이 차원들과 어떻게 상호작용하는지
- 검색 : 숨겨진 의존성, 분산성은 검색에 악영향, 보조 표기법은 검색에 도움이 된다
- 이해 : 가시성이 낮으면 이해에 부정적이지만, 역할 표현력은 도움이 된다
- 전사 : 전사할 때 일관성이 안좋아질 수 있다. 이를 맞추기 위해 추가적인 노력이 필요할 수 있다
- 증가 : 매핑 근접성은 증가에 도움이 되지만, 점도가 높으면 악영향을 끼친다
- 탐구 : 잠정성과 점진적 평가가 높으면 도움이 되지만, 힘든 정신활동과 추상화는 인지부하를 유발한다
예상 활동에 대한 코드베이스 최적화
다른 사람이 어떤 작업을 수행할지 이해하고, 해당 활동에 맞춰 차원을 최적화할 수 있다
ex) 안정된 라이브러리는 증가보단 검색활동이 많음, 새로운 앱은 증가 및 전사 활동이 많이 일어남