4장. 구현시 결정해야 할 핵심 사항
목차
- 4.1 프로그래밍 언어 선택
- 4.2 프로그래밍 규약
- 4.3 기술 흐름 파악
- 4.4 구현 실천법 선택
이 장에서는 구현과 관련된 구체적인 사항을 결정하는 방법에 대해 이야기한다.
4.1 프로그래밍 언어 선택
개발자는 프로그래밍 언어에 영향을 받는다.
프로그래밍 언어의 잘못된 예는 포트란에 익숙한 개발자가 C++ 언어를 사용해 개발을 하게 됐을 때, C++의 객체지향 기능은 전혀 사용하지 않고 포트란의 기능들(GOTO 문이나 전역 변수)을 사용해 프로그래밍 하는 것이다. 이는 C++을 가장한 포트란 코드를 작성하는 것과 같다.
나 또한 이와 같은 경험을 한 적이 있다. C 언어를 배우고 C++ 언어를 사용하게 되었을 때 작성한 코드들을 보면 C++언어를 사용해 절차지향적인 프로그래밍 코드를 작성했다. 이후 Java를 배우고, C++에 대해 더 공부하면서 많이 나아졌지만 아직도 코딩 테스트 문제를 풀거나 다른 코드를 작성할 때 보면 객체지향적인 사고가 많이 부족한 것을 보게 된다. 객체지향적인 사고법을 더 키워서 더 C++스러운, Java스러운 코드를 작성하도록 노력해야겠다.
4.2 프로그래밍 규약
품질이 우수한 소프트웨어는 아키텍처의 개념적 무결성과 저수준 구현 사이의 관게가 명확하다. 구현은 반드시 아키텍처와 일관성을 유지해야 하며, 내부적으로도 일관성을 유지해야 한다. 그것이 바로 변수 이름, 루틴 이름, 형식 규약, 주석 규약에 대한 구현 가이드라인의 핵심이다.
복잡한 프로그램을 작성할 때, 여러 사람들과 협력할 때 이 가이드라인이 중요하다. 학부 과정에 셋 또는 넷이서 프로젝트를 진행하게 되었는데, 4명일 때 조차도 이런 규약을 정하지 않으면 나중에 병합할 때 더 많은 노력을 해야했다. 보기에도 깔끔하지 않았고, 이해하기도 어려워 다시 설명해야 하는 과정을 거쳐야 했기 때문이다. 사전에 변수 및 루틴 이름, 형식과 주석에 대한 규약을 정하고 시작하면 이후에 드는 노력을 훨씬 절감할 수 있었을텐데 빠르게 시작하려는 것이 문제가 될 것이라고 그때는 생각하지 못했다.
이부분은 협력할 때 특히 더 중요한 것 같다. 하지만 프로그래밍 규약은 습관인 경우가 많아서, 만약 실제로 정하고 했을 때 이를 철저하게 지키기 위한 연습은 반드시 필요할 것 같다.
4.3 기술 흐름 파악
데이비스 그리스가 지적했듯이 프로그래밍 도구가 프로그래밍에 대한 사고방식을 결정해서는 안 된다. 그리스는 언어에 의한 프로그래밍과 언어를 활용한 프로그래밍을 구분한다. 언어에 의한 프로그램을 작성하는 개발자는 자신의 사고를 프로그래밍 언어가 지원하는 기능으로 제한한다. 언어 도구가 원시적이면 개발자의 생각도 원시적일 것이다.
굉장히 공감이 많이가는 부분이었다. 사실 기술 흐름 파악의 전반적인 내용은 새로운 기술을 사용할 때와 기존 기술을 사용할 때 어떻게 대응해야 하는지에 대한 내용이었지만 나는 마지막 위에 써놓은 마지막 부분이 가장 인상깊었다.
도구에 의한 프로그램을 개발하는 것이 아니라 도구를 활용한 프로그램을 개발하는 개발자가 되는 것이 중요하다. 내 프로그램을 발전시키기 위해 어떤 도구를 사용할지 결정할 수 있는 능력을 키우고, 그 도구를 사용해 어떻게 표현할 것인지에 대해 공부해야 한다.
언어를 활용한 프로그래밍 사례
언어에 의한 프로그래밍과 언어를 활용한 프로그래밍의 차이점을 이해하는 것은 이 책의 내용을 이해하는 데 매우 중요하다. 가장 중요한 프로그래밍 원칙 대부분은 언어가 아니라 사용 방법과 관련이 있다. 사용하는 언어에서 원하는 구성 요소를 지원하지 않아 다른 문제가 발생할 수 있다면 그러한 기능을 보충하도록 한다. 자신만의 코드 작성 규약, 표준 클래스 라이브러리, 그 밖의 사항들을 만들어 본다.
4.4 구현 실천법 선택
구현을 준비하는 단계에서는 여러 훌륭한 방법 중 어느 것을 집중적으로 사용할지를 결정한다. 어떤 프로젝트에서는 짝 프로그래밍과 테스트 우선 개발 방법을 사용하는 반면, 어떤 프로젝트에서는 개인 프로그래밍과 공식 검토를 사용한다. 프로젝트에 따라 이러한 방법론들을 섞어서 사용할 수도 있다.