본문 바로가기
데이터 통신

유지 보수 어렵게 코딩

by 방구석 infp 2023. 5. 25.
반응형

유지보수를 담당하는 프로그래머를 좌절시키려면 그가 생각하는 방식을 이해해야 한다. 유지보수 담당 프로그래머는 우리가 만든 거대한 프로그램을 넘겨받는다. 그 가 전체 코드를 읽기는 힘들기 때문에 해당 프로그램에 대한 이해도가 우리보다는 낮은 편이다. 아마도 그는 가능한 한 빨리 수정할 곳을 찾아내어 코드를 수정한 다음, 해당 수정으로 인한 부작용이 없는지 확인하고 작업을 마무리하려 할 것이다.

유지보수 프로그래머는 화장실에 걸린 두루마리 휴지 관을 통해 우리 코드를 살펴보는 것과 같은 상황에 부닥쳐있다. 그가 휴지 관을 통해 우리 코드를 보면서 전체적인 그림을 그려낼 수 없게 하는 것이 핵심이다. 그가 찾고 있는 코드를 가능한 찾기 어렵게 만들어야 한다. 더욱 중요한 것은 그가 안심하고 코드를 무시할 수 있도록 가능한 한 서툴게 코드를 작성해야 한다는 점이다.

프로그래머는 규약 convention을 통해 안심하는 습성이 있다. 간혹 조금이라도 규약 위반을 발견하면 돋보기를 들고 코드 전체 라인을 샅샅이 조사할 가능성이 크다.

언어의 모든 기능이 코드 유지보수를 어렵게 만든다고 생각할지 모르지만, 이는 사실이 아니다. 오직 언어의 기능을 적절하게 오용해야 유지보수가 어려운 코드를 만들 수 있다.

이름 짓기

험프니 티 Humpty Dumpty는 다소 경멸적인 어조로 말했다. “내가 단어를 사용할 때는 더도 덜도 아닌 딱 그 의미를 전달하려는 것이다.” 변수와 메소드의 이름을 짓는 방법은 유지보수할 수 없는 코드를 작성할 때 상당히 중요한 기술이다. 이름은 컴파일러에 영향을 주지 않는다. 이름 짓기 기술로 유지 보수 프로그래머의 정신을 혼미하게 만들 수 있다.

태아 작명법의 새로운 용도

태아 작명법 서적을 구입하자. 그러면 변수명을 뭐로 지어야 할지에 대한 고민을 덜 수 있을 것이다. Fred는 멋진 이름이며 입력하기도 쉽다. 입력이 쉬운 변수명을 원한다면 ASF를 사용해보기를 바란다.

단일 문자 변수명

변수명을 a, b, c 등으로 정한다면 간단한 텍스트 편집기로 해당 인스턴스를 검색하는 데 애를 먹게 된다. 그뿐만 아니라 그 변수가 무엇에 쓰이는 것인지 추측할 수 없게 방지하는 역할도 한다. 포트란에서는 오랫동안 i, j, k를 인덱스 변수로 사용해왔다. 혹시라도 이러한 훌륭한 전통을 조금이라도 깨뜨리려는(예를 들어 ii, JJ, KK 등으로 이름을 변경하려는) 사람이 있는가? 스페인 종교재판에서 이교도에게 어떠한 형벌을 가했는지를 그에게 경고하자.

창의적 오타

어쩔 수 없이 뭔가를 설명하는 변수명이나 함수명을 사용해야 하는 상황이라면 오타라는 무기를 선택하자. 몇몇 함수명과 변수명에 오타를 내고 다른 곳에서는 오타를 사용하지 않는다면 grep이나 IDE 검색 기술을 효과적으로 무력화할 수 있다. 이 방법은 생각보다 놀라운 효과를 발휘한다. 각기 다른 theatres/theaters(둘 다 극장을 의미)에 troy 나 tori같이 국제적인 취향도 추가해본다.

추상화하라

가능한 한 it, everything, data, handle, stuff, do, routine, perform, 숫 자 등과 같은 추상적인 단어를 변수명이나 함수명에 많이 사용하자(좋은 예, routineX48, PerformDataFunction, DoIt, HandleStuff, do_rags_method).

머·리. 글. 자.

머리글자로 코드를 간결하게 만든다. 진짜 사나이는 머리글자를 풀어 설명하지 않고, 있는 그대로를 선천적(유전적)으로 이해한다.

진화한 유의어 사전

유의어 사전에서 되도록 많은 단어가 같은 동작(예를 들어, 뭔가를 보여준다는 의미를 가진 display, show, present 등과 같은)을 가리키도록 하는 것도 지루함을 달랠 좋은 방법의 하나다. 실제 의미상 차이가 없는 단어라 할지라도 알 듯 말 듯 하게 모호한 힌트를 제공하는 것도 잊지 말자. 때로는 비슷한 두 함수가 완전 다른 동작하는 경우가 있다. 이러한 경우에는 두 함수를 같은 단어로 설명한다(예를 들면, “파일 기록”, “종이에 잉크 칠하기”, “화면에 보여주기”를 print라는 한 단어로 설명할 수 있다). 어떤 경우에도 명확한 어휘를 사용해 특수 프로젝트에 사용할 용어집을 만들어 달라는 요구에 굴복하지 말아야 한다. 이러한 요구에 굴복하는 행위는 정보 은닉 information hiding이라는 구조화된 디자인 원칙을 위반하는 프로답지 못한 행동이다.

다른 언어의 복수형을 사용하라

VMS 스크립트는 “Vaxen(Vax 컴퓨터의 복수형)”에서 반환하는 다양한 “stat ii (status의 복수형)”을 추적한다. 에스페란토(현재는 거의 쓰이지 않는 인공어), Klingon(스타 트렉에 등장하는 전사 종족의 언어), Hobbitese(소설에 등장하는 가상 종족 호빗의 언어) 등을 사용하면 보다 효율적이다. Pluraloj와 같이 단어 뒤에 OJ를 추가해서 에스페란토어를 모방할 수 있다. 이러한 에스페란토를 사랑하는 적은 노력이 세계 평화에 기여하는 것임을 기억하자.

새로운 개념의 낙타표기법CapiTaliSaTion

무작위로 단어의 중간 음절 첫 글자를 대문자로 표기하자. 예를 들면, 메소드 명을 ComputeRasterHistoGram( )처럼 정할 수 있다.

이름을 재사용하라

언어의 규칙이 허용하는 범위 내에서 클래스, 생성자, 메소드, 멤버 변수, 파라미터, 지역 변수에 같은 이름을 사용하자. 이에 안주하지 말고 더 나아가서 {} 블록 내에서 이미 사용되고 있는 지역 변수명을 재사용할 수 있는지 고민하자. 이렇게 함으로써 유지보수를 담당하는 프로그래머가 모든 인스턴스의 범위를 유심히 살펴보도록 만들 수 있다. 특히 자바 언어에서는 일반 메소드를 생성자처럼 보이게 할 수 있다.

강세가 있는 단어

변수명에 강세가 표시된 단어를 사용하자. 다음 코드를 살펴보자.

type def struct { inti; } int;
두 번째 int에서 i에 강세가 있다. 간단한 텍스트 편집기로는 미묘한 차이를 구별할

는 것이 거의 불가능하다. 컴파일러의 이름 길이 제한을 악용하라.

컴파일러가 인식할 수 있는 변수명의 길이는 정해져 있다. 만약 변수명의 8글자만을 인식할 수 있는 컴파일러가 있다면, var_unit_update( )와 var_unit_setup( )처럼 마지막 부분만 살짝 바꿔보자. 그럼 컴파일러는 두 이름을 동일한 var_unit으로 인식할 것이다.

반응형

'데이터 통신' 카테고리의 다른 글

표기법  (0) 2023.05.27
단어 교환하기  (0) 2023.05.26
주파수 다중화  (0) 2023.05.25
위성 마이크로파, 다중화  (0) 2023.05.22
무선 매체  (0) 2023.05.21

댓글