////
Search
Duplicate
🌨️

4. 구현 시 결정해야할 핵심 사항

구현을 위한 준비 작업이 끝났다면 구현과 관련된 구체적인 사항을 결정해야할 단계다.
여기서는 일하러 가기 전에 공구 벨트에 착용할 공구를 선택하는 방법과 트럭에 짐 싣는 방법을 소프트웨어 관점에서 설명한다.

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. 구현 실천법 선택

구현을 준비하는 단계에선 여러 방법 중 어느 것을 집중적으로 사용하고자할 지 결정한다.
어떤 프로젝트에서는 짝 프로그래밍과 테스트 우선 개발을 사용할 수 있다.
어떤 프로젝트에서는 개인 프로그래밍과 코드 리뷰를 사용한다.
프로젝트에 따라 이러한 방법론들을 섞어서 사용할 수 있다.
체크리스트: 주요 구현 방법

요점 정리

모든 프로그래밍 언어에는 장단점이 있다. 사용하는 언어의 장단점을 알아둔다.
프로그래밍을 시작하기 전에 프로그래밍 규약을 만든다. 나중에 이 규약을 적용하기 위해서 코드를 변경하기란 거의 불가능하다.
단일 프로젝트에서 사용할 수 있는 것보다 더 많은 구현 실천범이 존재한다. 프로젝트에 가장 적합한 방법을 신중하게 선택한다.
사용하고 있는 프로그래밍 방법이 언어에 의존하고 있는지 아니만 언어가 내게 의존하고 있는지 스스로 물어보라.
언어에 의한 프로그래밍이 아닌 언어를 활용한 프로그래밍이 중요하다는 점을 명심하자.
기술적인 흐름에서의 위치에 따라 어떠한 접근 방법이 더 효과적인지 또는 가능한 방법인지를 판단한다.
이 기술이 원시기인지 성숙기인지에 따라 접근 방법이 달라진다는 의미다.
기술적인 흐름에서의 위치를 확인하고 그에 따라 아픙로의 계획과 에상되는 상호아을 조율한다.