2017.08.28

숙련된 개발자도 저지르는 15가지 초보적 실수

Andrew C. Oliver | InfoWorld

코더는 코딩을 하고 초보자는 초보자다운 실수를 한다. 그러나 가끔은 경험이 풍부한 코더도 초보적인 실수를 한다. 필자는 20년 동안 코딩을 하면서 온갖 실수를 봤지만 대체로 몇 가지 실수가 반복된다.

이런 흔한 실수는 실무에서 다양하게 나타난다. 리비전 제어와 같은 적절한 위생(hygiene) 작업도 필요하지만 그렇게 해도 다른 실무적 실수를 저지르고 그 결과로 힘든 시간을 보낼 수 있다.



초보적 실수 1 : Make 또는 Shell을 빌드 툴로 사용
C 또는 C++로 코딩하지 않는 사람은 Make에 친숙하지 않을 수 있다. Make는 각 파일에 대한 다른 컴파일러 프로세스를 실행한다. 대부분의 현대적 언어는 각 파일에 대해 별도의 프로세스를 시작하도록 설계되지 않는다. 또한 자바와 같은 언어에서 Make를 사용해 종속성을 해결하기란 거의 불가능하다.

필자는 전에 대형 네트워크 장비 업체에서 일하면서 빌드를 앤트(Ant, 자바 빌드 툴, 당시엔 최신이었음)로 변환하는 것으로 빌드 프로세스 시간을 3시간에서 20초로 단축한 적이 있다.

셸 스크립트 역시 좋지 않은 결과를 초래하는 경우가 많다. 필자는 최근 한 실험용으로 셸 빌드 하나를 만들었다. 작은 실험 하나를 실행하자고 모든 사람들이 자바 툴셋 전체를 다운로드해야 하는 것은 비효율적이라고 여겼기 때문이다. 필자는 그게 좋은 방법이라고 생각했지만 사실은 (늘 그렇듯이) 초보적 실수였다. 이 빌드가 종속되는 소프트웨어가 다음 버전으로 올라가면서 (늘 그렇듯이) 모든 것이 뒤엉켰기 때문이다. 그 점을 생각하고 현대적 빌드 툴을 제공했더라면 종속성을 업데이트할 수 있었을 것이다.

초보적 실수 2 : IDE를 빌드 툴로 사용하기
대부분의 IDE에는 빌드/배포와 관련된 편의 기능이 있다. 처음에는 좋아 보이고, 실제로 간단한 코드를 테스트하는 용도로는 훌륭하다. 그러나 결국 종속성이 발생하고 다른 사람들이 내 코드에 손을 대고 작업을 하게 된다. 그러다 보면 한 시스템에서는 빌드가 되고 다른 시스템에서는 되지 않는 이해할 수 없는 상황이 발생한다. 지속적인 통합(Continuous Integration) 툴에서, IDE 외부에서 실행할 수 있는 반복 가능한 빌드가 필요하다. 릴리스 프로세스의 일부로 준비하고 완료할 수 있어야 한다.

초보적 실수 3 : AWS 인스턴스 종료
AWS에서 ‘종료(terminate)’란 다른 대부분의 툴과 같이 ‘프로세스를 끝내다’가 아니라 ‘모두 삭제한다’는 의미다.

필자가 처음 참여했던 대규모 아마존 웹 서비스 프로젝트에서 한 개발자가 특성을 읽는 툴은 안전할 것이라는 생각에 실행했는데, 불행히도 거기엔 종료 특성이 있었다. 이 특성을 읽게 되면 인스턴스가 실제로 ‘종료’된다. 그 개발자는 모든 곳에서 이 툴을 실행해서 100개 이상의 인스턴스를 종료했다. AWS는 이러한 실수를 방지하기 위한 조치를 나름 강화했지만 사실 “종료”가 아니라 “영구 삭제”라는 용어를 사용해야 마땅하다. glee로 프로세스를 종료하는 개발자들은 그 프로세스를 다시 실행할 수 있다고 생각한다. 그러나 AWS 인스턴스를 종료하면 모든 것을 잃게 된다!

초보적 실수 4 : 중요한 무언가를 사용해 테스트하기
앞서 언급한 개발자는 또 다른 초보적 실수를 저질렀다. 중요한 요소를 사용해서 테스트를 한 것이다. 테스트는 오로지 테스트를 위해 만든 단일 인스턴스에서 해야 한다. 아무런 해를 끼치지 않을 작업처럼 생각되더라도 안전을 기해야 한다.

초보적 실수 5 : 절대적 데이터 무결성 추구
정말, 정말 높은 데이터 무결성을 위해 READ_SERIALIZED를 사용하고 테이블 잠금을 사용하는 개발자를 여러 번 봤다. 잠금에 대한 강박은 이것 말고도 더 있다. 그 결과는 좋지 않은 스키마 설계, 그리고 데이터와 동시성 및 위험에 대한 비현실적인 이해다.

초보적 실수 6 : HTML에 코드 넣기, 또는 코드에 HTML 넣기
ASP, JSP, PHP, CGI, 일반 코드 등 HTML 중간에 그 코드를 끼워 넣을 방법은 항상 존재한다. 또한 out.println(“<p>This is a terrible idea</p>”);와 같은 짓을 할 방법도 항상 존재한다. 이런 것이 통용되던 때는 아마 1995년 정도였을 것이다.

요즘에도 비슷한 경우가 있다. 필자는 자바스크립트로 그 때와 똑 같은 일을 하는 사람들을 봤다. 태그 라이브러리, 이벤트 처리기 등 항상 더 나은 방법이 존재한다. HTML 코드만 아니면 어느 것이든 된다.

초보적 실수 7 : 전지전능한 리스트 사용하기
고백하자면 데이터를 어떤 형태로 만들어야 할지 확실치 않을 때 프로토타입 코드에서 필자도 사용하지만, 일단 알게 되면 바로 버린다. 이 실수는 대부분 고수준 언어로 시작한 사람들이 저지른다. “이 실수”란 무엇인가? 기본적으로 맵, 트리 또는 세트를 사용하지 않고 모든 것을 리스트에 넣고 직접 정렬하는 것이다. 더 나쁜 경우는 배열 백 리스트를 선택해서 중앙 부근에 계속 집어넣는 것이다.

이러한 코드의 문제는 이 형태가 프로덕션까지 이어지는 경향이 있다는 것이다. 다만 필자는 가끔씩 운영체제의 가비지 수집기나 메모리 관리에 부하 테스트를 하는 것은 좋다고 생각한다!
 


2017.08.28

숙련된 개발자도 저지르는 15가지 초보적 실수

Andrew C. Oliver | InfoWorld

코더는 코딩을 하고 초보자는 초보자다운 실수를 한다. 그러나 가끔은 경험이 풍부한 코더도 초보적인 실수를 한다. 필자는 20년 동안 코딩을 하면서 온갖 실수를 봤지만 대체로 몇 가지 실수가 반복된다.

이런 흔한 실수는 실무에서 다양하게 나타난다. 리비전 제어와 같은 적절한 위생(hygiene) 작업도 필요하지만 그렇게 해도 다른 실무적 실수를 저지르고 그 결과로 힘든 시간을 보낼 수 있다.



초보적 실수 1 : Make 또는 Shell을 빌드 툴로 사용
C 또는 C++로 코딩하지 않는 사람은 Make에 친숙하지 않을 수 있다. Make는 각 파일에 대한 다른 컴파일러 프로세스를 실행한다. 대부분의 현대적 언어는 각 파일에 대해 별도의 프로세스를 시작하도록 설계되지 않는다. 또한 자바와 같은 언어에서 Make를 사용해 종속성을 해결하기란 거의 불가능하다.

필자는 전에 대형 네트워크 장비 업체에서 일하면서 빌드를 앤트(Ant, 자바 빌드 툴, 당시엔 최신이었음)로 변환하는 것으로 빌드 프로세스 시간을 3시간에서 20초로 단축한 적이 있다.

셸 스크립트 역시 좋지 않은 결과를 초래하는 경우가 많다. 필자는 최근 한 실험용으로 셸 빌드 하나를 만들었다. 작은 실험 하나를 실행하자고 모든 사람들이 자바 툴셋 전체를 다운로드해야 하는 것은 비효율적이라고 여겼기 때문이다. 필자는 그게 좋은 방법이라고 생각했지만 사실은 (늘 그렇듯이) 초보적 실수였다. 이 빌드가 종속되는 소프트웨어가 다음 버전으로 올라가면서 (늘 그렇듯이) 모든 것이 뒤엉켰기 때문이다. 그 점을 생각하고 현대적 빌드 툴을 제공했더라면 종속성을 업데이트할 수 있었을 것이다.

초보적 실수 2 : IDE를 빌드 툴로 사용하기
대부분의 IDE에는 빌드/배포와 관련된 편의 기능이 있다. 처음에는 좋아 보이고, 실제로 간단한 코드를 테스트하는 용도로는 훌륭하다. 그러나 결국 종속성이 발생하고 다른 사람들이 내 코드에 손을 대고 작업을 하게 된다. 그러다 보면 한 시스템에서는 빌드가 되고 다른 시스템에서는 되지 않는 이해할 수 없는 상황이 발생한다. 지속적인 통합(Continuous Integration) 툴에서, IDE 외부에서 실행할 수 있는 반복 가능한 빌드가 필요하다. 릴리스 프로세스의 일부로 준비하고 완료할 수 있어야 한다.

초보적 실수 3 : AWS 인스턴스 종료
AWS에서 ‘종료(terminate)’란 다른 대부분의 툴과 같이 ‘프로세스를 끝내다’가 아니라 ‘모두 삭제한다’는 의미다.

필자가 처음 참여했던 대규모 아마존 웹 서비스 프로젝트에서 한 개발자가 특성을 읽는 툴은 안전할 것이라는 생각에 실행했는데, 불행히도 거기엔 종료 특성이 있었다. 이 특성을 읽게 되면 인스턴스가 실제로 ‘종료’된다. 그 개발자는 모든 곳에서 이 툴을 실행해서 100개 이상의 인스턴스를 종료했다. AWS는 이러한 실수를 방지하기 위한 조치를 나름 강화했지만 사실 “종료”가 아니라 “영구 삭제”라는 용어를 사용해야 마땅하다. glee로 프로세스를 종료하는 개발자들은 그 프로세스를 다시 실행할 수 있다고 생각한다. 그러나 AWS 인스턴스를 종료하면 모든 것을 잃게 된다!

초보적 실수 4 : 중요한 무언가를 사용해 테스트하기
앞서 언급한 개발자는 또 다른 초보적 실수를 저질렀다. 중요한 요소를 사용해서 테스트를 한 것이다. 테스트는 오로지 테스트를 위해 만든 단일 인스턴스에서 해야 한다. 아무런 해를 끼치지 않을 작업처럼 생각되더라도 안전을 기해야 한다.

초보적 실수 5 : 절대적 데이터 무결성 추구
정말, 정말 높은 데이터 무결성을 위해 READ_SERIALIZED를 사용하고 테이블 잠금을 사용하는 개발자를 여러 번 봤다. 잠금에 대한 강박은 이것 말고도 더 있다. 그 결과는 좋지 않은 스키마 설계, 그리고 데이터와 동시성 및 위험에 대한 비현실적인 이해다.

초보적 실수 6 : HTML에 코드 넣기, 또는 코드에 HTML 넣기
ASP, JSP, PHP, CGI, 일반 코드 등 HTML 중간에 그 코드를 끼워 넣을 방법은 항상 존재한다. 또한 out.println(“<p>This is a terrible idea</p>”);와 같은 짓을 할 방법도 항상 존재한다. 이런 것이 통용되던 때는 아마 1995년 정도였을 것이다.

요즘에도 비슷한 경우가 있다. 필자는 자바스크립트로 그 때와 똑 같은 일을 하는 사람들을 봤다. 태그 라이브러리, 이벤트 처리기 등 항상 더 나은 방법이 존재한다. HTML 코드만 아니면 어느 것이든 된다.

초보적 실수 7 : 전지전능한 리스트 사용하기
고백하자면 데이터를 어떤 형태로 만들어야 할지 확실치 않을 때 프로토타입 코드에서 필자도 사용하지만, 일단 알게 되면 바로 버린다. 이 실수는 대부분 고수준 언어로 시작한 사람들이 저지른다. “이 실수”란 무엇인가? 기본적으로 맵, 트리 또는 세트를 사용하지 않고 모든 것을 리스트에 넣고 직접 정렬하는 것이다. 더 나쁜 경우는 배열 백 리스트를 선택해서 중앙 부근에 계속 집어넣는 것이다.

이러한 코드의 문제는 이 형태가 프로덕션까지 이어지는 경향이 있다는 것이다. 다만 필자는 가끔씩 운영체제의 가비지 수집기나 메모리 관리에 부하 테스트를 하는 것은 좋다고 생각한다!
 


X