꼭 청소할 필요는 없다 청소하지 않을수록 점점 살기 불편해진다 AND.. 청소되지 않은 집에서는 더 쉽게 어지럽히게 된다 ( 여럿이 사는 집이라면 더욱 ) 조금만 어지럽혀진 집은 그때그때 쉽게 정리하면 되지만, 대단히 어지럽혀진 집은 맘잡고 대청소를 해야한다 ( 여럿이 사는 집이라면 동의도 구해야한다 )
것의 변동성이 그만큼 높아진다 게임 엔진이 게임 로직을 참조하면 엔진의 변동성이 높아짐 UI System 이 UI Logic 을 참조하면 UI System 의 변동성이 높아짐 …자동차 범퍼의 예를 생각해보면 쉽게 이해가 갈 것이다. 차체와 범퍼가 구분되어 있지 않으면, 범퍼의 교체 비용이 차체까지 확산되는 것이다. - from <소프트웨어를 잘 만드는 방법 – 변동성> - 김학규
변동성이 높은 부분과 낮은 부분을 올바르게 나누어야 한다” “…보통 자동차는 10장 내외의 철판, 범퍼등의 파트로 나뉘어져 있다. 만약 100 장 이상의 철판으로 잘게 나뉘어진 자동차를 상상해보라. 아마 자동차가 아니라 누더기가 되지 않을까?” 간단한 접촉사고가 났다고 생각하면.. - from <소프트웨어를 잘 만드는 방법 – 변동성> - 김학규
Script Source C++ Code Logic Code Framework Code .cpp .h - from <소프트웨어를 잘 만드는 방법 – 변동성> - 김학규 pimpl, … Template Data-driven Scripting Framework / Library C++ compiler 헤더 파일 (.h) vs. 소스 파일 (.cpp) 인터페이스 vs. 구현 알고리즘 vs. 데이터 타입 코드 vs. 데이터 C++ 소스 vs. 스크립트 소스 프레임워크 코드 vs. 로직 코드
있지 않을까? 소스 내 상수 또는 파라메터라던가.. 자꾸 변하는 if 내 조건문 이라던가.. 함수내 변동성이 두드러지는 부분의 분리를 위해서라던가.. BUT.. 파일과 함수는 indexing 할 key 가 있지만 라인별 바뀐 부분은 어떻게 추적 하지? 활용 #6 소스 라인별 변화량 추적
개발환경의 복잡도 저하, 빌드 시간 단축 변동성을 기준으로 UnityBuild 적용 빌드 시간이 단축되면서 기존 UnityBuild 기법의 단점 보완 변동성이 낮으면서 파급력이 높은 파일 설계나 의존방식을 재점검 함수별 변동성 (+로그 고려) 그럴싸해보이는 결과 변동성이 높은 부분의 분리나 공정 효율 리서치 버그수정이 잦은 부분에 대해 시스템이나 프로세스 점검
있다 “프로그래머별 커밋 당 버그 비율” 따위를 측정하게됨 이런 수치가 존재한다는것만으로 디펜시브해지고, 커밋을 오래 끌게된다 릴리즈 전 빠른 버그 발생과 수정은 오히려 권장사항 대표적인 숫자의 함정 “버그 발생 수” 프로그래머 KPI TDD 도입에 “테스트 실패율” 표시 “단기 매출” 중심의 기획 평가 …
전에는 효과를 보기 힘든것이 많다 보람이 없다 - “뭐 나아지는거 있어?” 관심없으면 잊혀진다 인간은 망각의 동물 알아도 습관은 고치기 힘들다 프로그래머가 많을수록 난이도 급상승 청소의 메타포만으로는 한계가 있다 보이는대로 일일히 체크하고, 잔소리하고, 고치는것은 구시대적
Caller Thread System Scoped Lock Smart Pointer format string Nullable Type / Non-nullable Type 분리 Validator Static Analysis Syntax Checking Unit Tests Compiler Warning 코드퀄리티 저하를 예방하는
유용: 같은 로직흐름에서 재현이 되지 않는 부분을 smoke test 만으로 감지할 수 있게 해줌 없을때와 천지차이 Lock Ordering 데드락 방지 Needs_Lock 락 없는 접근 방지 Check Caller Thread 부르지 말아야 할 쓰레드에서 부르는 것을 방지
Validation 빌드시스템에서 validation 수행 지속적으로 수행 가능하다 관리된 상태를 위해 과거를 모두 정리할 필요가 없다 과거를 신경쓰지 않을 수 있다 커밋될 때 validation 을 수행 + 강제성을 부여할 수 있다 default 로 validation check 하되, 과거 데이터는 <ignore> tagging _CRT_SECURE_NO_DEPRECATE, #pragma warning(disable:####) Validator 에 파일마다 태깅하고 선택적으로 무시할 수 있는 기능을 넣어라 주의: 미래에 추가되지 않도록 유의할것. 가능하다면 추가되는것도 시스템으로 막는다 변화 미래 변화 관리 과거~현재는 영역으로 분리하고, 미래는 시간으로 분리하라
관리 주석 관리 중복 관리 스크립트 소스 오타 관리 format string 관리 초기화 관리 삭제 관리 naming convention, white space, 금지된 API 호출, … ex) 별도의 Timer System 이 있기 때문에 GetTickCount, timeGetTime 이용 금지 파일 입출력시 전용 프레임웍 이용: CreateFile, fopen 이용 금지 쓰레드 생성시 CreateThread 이용 금지, _beginthread / _beginthreadex 만 사용할것 로직에서는 scoped lock 만 사용할것. EnterCriticalSection 직접 사용 금지
코드의 diff 부분을 column 으로 전체 소스를 row 로 잡아 일정 이상의 연속끊김 등을 처리한 LCS 응용으로 중복정도를 검사가능 whitespace는 무시하고 라인단위보다 구문분석단위면 좋겠지 시간복잡도 O(NM), 공간복잡도 O(2N) 만으로 OK backtrack 하려면 좀더 들지만.. 중복 단순 coding style 관리 금지된 API 관리 주석 관리 중복 관리 스크립트 소스 오타 관리 format string 관리 초기화 관리 삭제 관리
되어야만 확인가능 Symbol 만 뽑아낸 후 통계적으로 오타를 예방한다면? 다른 Symbol 과 문자열 유사도 높으면서 단 한두건밖에 존재하지 않는다면 경고 처리 단순 coding style 관리 금지된 API 관리 주석 관리 중복 관리 스크립트 소스 오타 관리 format string 관리 초기화 관리 삭제 관리
문제를 발생시킨다 boost::format 를 쓸 경우.. C++ 식 해결법이지만, 많은 사람에게 익숙하지 않음 (오히려 망가지기 쉽다) 별도 format string 을 사용하는 프로젝트엔 꼭 구코드가 함께한다 일관성이 흐트러지기 쉬움 단순 coding style 관리 금지된 API 관리 주석 관리 중복 관리 스크립트 소스 오타 관리 format string 관리 초기화 관리 삭제 관리
컴파일러에게 맡긴다 별도의 Static Analysis 를 위해선 C++ 컴파일러를 만들어야함 Validator 는 Type Checker 가 없을 경우 삽입하고 인자 개수와 Type Checker 만을 확인 아주 간단한 텍스트 프로세싱으로 가능 단순 coding style 관리 금지된 API 관리 주석 관리 중복 관리 스크립트 소스 오타 관리 format string 관리 초기화 관리 삭제 관리
수 있다 BUT 바꾸면 안됨 SVN 클라이언트가 캐시로 인해 오동작 서버에서 별도로 변경 및 커밋을 Trigger 귀찮긴 하지만 생각해볼 수 있는 방법 단순 coding style 관리 금지된 API 관리 주석 관리 중복 관리 스크립트 소스 오타 관리 format string 관리 초기화 관리 삭제 관리
만드는건 당장 필요하지만 제거하는건 당장 필요하지 않다 보이지 않지만 중요한.. 문제가 되었을때는 이미 늦어있다 – Resource Leak 나중에 가면 대처하는것도 일이다 생몰 쌍 맞추기 생성자 / 파괴자 안의 생성/파괴 쌍을 규격화시키고 맞춰주기 delete 누락 방지 기본적으로 new 만 있고 delete 가 없을 경우 경고 소유권 이전시 별도 표시하도록 (ignore flag)
하기에 큰 규모 1. 분석 자동화 2. 운용 자동화 변동성이 많은 것이 중요한 것이다 중요한 것 위주로 신경쓴다 중요하지 않는것은 신경을 끈다 (현명한 포기) 중요하지 않는것은 신경이 쓰이지 않도록 한다 “청소하는 요령” 한번에 모두 정리하려면 힘빠진다. 점진적으로 정리해나간다 청소한곳과 안한곳을 구분짓는다 (공간적 분리) 청소한곳은 다시 어지럽히지 않는다 (시간적 분리)