•
구현을 위한 준비 작업이 끝났다면 구현과 관련된 구체적인 사항을 결정해야할 단계다.
•
여기서는 일하러 가기 전에 공구 벨트에 착용할 공구를 선택하는 방법과 트럭에 짐 싣는 방법을 소프트웨어 관점에서 설명한다.
1. 프로그래밍 언어 선택
•
연구에 따르면 개발 언어가 여러 면에서 생산성과 코드의 품질에 영향을 준다고 한다.
◦
개발자는 친숙한 언어를 사용할 때 그렇지 않은 경우보다 생산성이 높다.
▪
코코모 2 예측 모델에서 얻은 데이터를 보면 3년 이상 사용해온 언어로 개발하는 경우가 그렇지 않은 경우보다 생산성이 30% 더 높다.
◦
고수준 언어를 사용하는 개발자가 저수준 언어를 사용하는 개발자보다 생산성과 품질이 높다.
▪
C++, 자바와 같은 언어가 생산성, 신뢰성, 명료성 이해성에 있어서 어셈블리어, C 같은 저수준 언어보다 5~15배 정도 높다.
◦
어떤 언어는 다른 언어보다 프로그래밍 개념을 표현하기가 좋다.
▪
영어 같은 자연어를 자바와 C++ 같은 프로그래밍 언어에 비유해서 생각해볼 수 있다.
▪
사피어-워프 가설에 따르면 특정한 개념을 생각할 수 있는 능력은 그러한 개념을 표현할 수 있는 단어를 알고 있느냐에 달려있다고 한다.
◦
개발자도 유사하게 프로그래밍 언어에 영향을 받는다.
▪
프로그래밍 개념을 표현하는데 사용할 수 있는 명령어가 존재하는지 여부는 프로그래밍 개념을 어떻게 표현할 것인가를 결정하며 어떤 개념을 표현할 수 있느냐도 결정한다.
▪
포트란 개발자들이 C++로 개발을 한다고 했을때, 그들은 C++의 객체지향적 개념을 사용하기보다 포트란의 나쁜 기능을 실행하기 위해서 C++을 사용했다.
•
언어 소개
◦
어셈블리어
▪
각 표현식이 하나의 기계 명령에 해당하는 저수준 언어다.
▪
표현식이 특정 기계 명령을 사용하기 때문에 어셈블리어는 인텔이나 애플 CPU 같은 특정 프로세서에 종속적이다.
◦
C
▪
원래 유닉스 운영체제에 사용되던 범용 중간 수준의 언어다.
▪
구조적 데이터와 구조적 제어 흐름, 기계 독립성, 풍부한 연산자와 같은 고수준 언어의 특성을 가지고 있다.
▪
포인터와 메모리 주소를 광범위하게 사용하여 이식 가능한 어셈블리어라고 불리며 비트 처리와 같은 저수준 구문을 제공하고 타입 제약이 약하다.
◦
C++
▪
C++은 C를 기반으로 한 객체지향 언어이며 C 언어와 호환되고 클래스, 다형성, 예외처리, 템플릿을 제공하며 C보다 견고한 타입 검사 기능을 제공한다.
◦
Java
▪
자바는 C나 C++과 유사한 문법을 가진 객체지향 언어다.
▪
자바 파일을 바이트 코드로 변환하고 이 코드를 가상 머신이라고 하는 특별한 환경 내에서 실행함으로써 모든 플랫폼에서 실행가능하도록 설계되었다.
▪
웹 어플리케이션 프로그래밍에 널리 사용된다.
◦
JavaScript
▪
이름과 달리 자바와 연관성이 별로 없는 인터프리트 스크립트 언어다.
▪
주로 웹페이지에 간단한 기능이나 온라인 어플리케이션을 추가하는 것과 같은 클라이언트 사이드 프로그래밍에 사용된다.
◦
PHP
▪
자바스크립트, C와 유사한 문법을 가진 오픈소스 스크립트 언어다.
▪
PHP는 서버 측 대화식 기능을 실행할 수 있는 거의 모든 운영체제에서 작동한다.
▪
이 언어는 웹 페이지에 포함되어 데이터베이스 정보에 접근하고 처리할 수 있다.
◦
파이썬
▪
다양한 환경에서 실행되는 인터프리트 방식의 대화식 객체지향 언어이다.
▪
스크립트와 간단한 웹 어플리케이션을 작성하는 데 가장 널리 사용되며 규모가 큰 프로그램을 만들 수 있는 기능도 갖고 있다.
◦
SQL
▪
SQL은 관계형 데이터베이스를 질의하고 갱신하고 관리하는 사실상의 표준 언어다.
▪
SQL은 Structured Query Language를 의미한다.
▪
이 장에서 소개한 다른 언어와 달리 SQL은 선언현 프로그래밍 언어다. 즉 연산의 순서를 정의하기 보다는 작업의 결과를 정의한다.
2. 프로그래밍 규약
•
품질이 우수한 소프트웨어는 아키텍처의 개념적 무결성과 저수준 구현 사이의 관계가 명확하다.
◦
구현은 반드시 아키텍처와 일관성을 유지해야 하며 내부적으로도 일관성을 유지해야 한다.
◦
그것이 바로 변수 이름과 클래스 이름, 형식 규약, 주석 규약에 대한 구현 가이드라인의 핵심이다.
⇒ 컨벤션..!
•
통일된 규칙이 없다면 코드가 엉망이 될 것이다. 코드가 일관된 형태로 작성되지 않으면 멋대로 작성된 코드 스타일의 차이를 이해하기 위해 자원을 낭비하게 된다.
◦
성공적인 프로그래밍을 위해서 일관성이 없는 변형을 줄여 비즈니스 로직 등에 좀더 집중할 수 있게 해야 한다.
•
멋진 밑그림을 그렸는데 각 부분을 다른 풍으로 그린다면 어떻게 될까? 아무리 밑그림을 잘 따라 그려도 개념적으로 일관성이 없어 콜라주처럼 보일 것이다. 프로그램도 저수준에서 일관성이 필요하다.
•
구현을 시작하기 전에 사용할 프로그래밍 규약을 작성한다. 코드 작성 규약의 세부 사항들은 매우 정밀하게 작성되어 일단 작성하고 나서 소프트웨어에 적용되면 고치기가 거의 불가능 하다.
3. 기술 흐름 파악
•
프로그래밍 도구가 프로그래밍에 대한 사고방식을 결정하게 두어서는 안 된다.
◦
이를 지적했던 그리스는 언어에 의한 프로그래밍과 언어를 활용한 프로그래밍을 구분한다.
◦
언어에 의한 프로그램을 작성하는 개발자는 자신의 사고를 언어가 지원하는 기능으로 제한한다.
◦
즉 언어 도구가 원시적이면 개발자의 생각도 원시적일 것이다.
•
언어를 활용한 프로그래밍 사례
◦
간단하게 요약해서 언어의 지침대로 사용하기보다 자신의 생각에 조금 더 생산성이 나은 구조로 개발하는 것이다.
◦
언어에 의한 프로그래밍과 언어를 활용한 프로그래밍의 차이점을 이해하는 것은 이 책의 내용을 이해하는 데 매우 중요하다.
◦
가장 중요한 프로그래밍 원칙 대부분은 언어에 종속적이지 않고 사용 방법과 관련이 있기 대문이다.
◦
사용하는 언어에서 내가 원하는 구성 요소를 지원하지 않아 문제가 발생할 수 있다면 그런 기능을 보충하도록 한다.
◦
자신만의 코드 작성 규약, 표준, 클래스 라이브러리, 그 밖의 사항들을 만들어보라.
4. 구현 실천법 선택
•
구현을 준비하는 단계에선 여러 방법 중 어느 것을 집중적으로 사용하고자할 지 결정한다.
◦
어떤 프로젝트에서는 짝 프로그래밍과 테스트 우선 개발을 사용할 수 있다.
◦
어떤 프로젝트에서는 개인 프로그래밍과 코드 리뷰를 사용한다.
◦
프로젝트에 따라 이러한 방법론들을 섞어서 사용할 수 있다.
체크리스트: 주요 구현 방법
요점 정리
•
모든 프로그래밍 언어에는 장단점이 있다. 사용하는 언어의 장단점을 알아둔다.
•
프로그래밍을 시작하기 전에 프로그래밍 규약을 만든다. 나중에 이 규약을 적용하기 위해서 코드를 변경하기란 거의 불가능하다.
•
단일 프로젝트에서 사용할 수 있는 것보다 더 많은 구현 실천범이 존재한다. 프로젝트에 가장 적합한 방법을 신중하게 선택한다.
•
사용하고 있는 프로그래밍 방법이 언어에 의존하고 있는지 아니만 언어가 내게 의존하고 있는지 스스로 물어보라.
◦
언어에 의한 프로그래밍이 아닌 언어를 활용한 프로그래밍이 중요하다는 점을 명심하자.
•
기술적인 흐름에서의 위치에 따라 어떠한 접근 방법이 더 효과적인지 또는 가능한 방법인지를 판단한다.
◦
이 기술이 원시기인지 성숙기인지에 따라 접근 방법이 달라진다는 의미다.
◦
기술적인 흐름에서의 위치를 확인하고 그에 따라 아픙로의 계획과 에상되는 상호아을 조율한다.