최근 C++ 로 다시 업무를 해야할 일이 있을 것같아 다시 들여다 보고 있다. Modern C++은 기존에 내가 해오던 것에서 너무 많이 바껴서 새롭게 공부가 필요함을 느낀다. 아래 원서를 가지고 공부를 시작해야 겠다.



공부 방법은 늘상 하듯이 Unit Test를 만들어서 코드를 작성해보려고 한다. Visual Studio 2017에서는 C++ 기반으로 두가지 테스트 프로젝트를 제공한다. 이중 Google Test 를 이용하기로 하자.



책을 가볍게 흟어 보니 C++17 까지 설명한 책이지 C++17에서 새롭게 나온것 만을 설명하는 것은 아닌것 같다. Modern C++에 대해서 정식으로 공부해본 적 없는 나같은 old style C++ 프로그래머에게는 더 적절하겠다. 이후 정리는 Modern C++ 이라고 생각될 만한 것들만 정리하여 chapter 당 한 페이지씩 작성할 생각히고, 또한 정리한 source code를 github 에 올릴 생각이다. https://github.com/pronaman/DailtBookStudy.git



자 그럼 스타트!



Qt Creator 사용 시 기본이 되는 단축 키는 아래와 같다.

  • Ctrl+B - Build project
  • Ctrl+R - Run Project
  • Ctrl+Tab - Switch between open documents
  • Ctrl+K - Open Locator
  • Esc - Go back (hit several times and you are back in the editor)
  • F2 - Follow Symbol under cursor
  • F4 - Switch between header and source (only useful for c++ code)

더 자세한 단축키들을 보려는 아래 링크를 클릭하라.

http://doc.qt.io/qtcreator/creator-keyboard-shortcuts.html

 

또한 Menu의 Tools -> Option -> Environment 를 통해 확인할 수 있다.

 

 

 

It means open gl library need to be compiled. type the commnand below in a terminal.


sudo apt-get install libglu1-mesa-dev

처음에 Visual Studio 2017을 한글 윈도우에서 설치하고 나면 메뉴와 각종 에러 메시지들이 한글로 나오게 된다. 하지만 각종 문의를 하거나 에러에 대해서 검색할 때는 영문 에러 메시지가 더 나은 결과를 보여줄 때가 많다. 아래와 같이 언어팩을 추가하고 설정을 변경하면 영문 메뉴와 에러 메시지들이 나오도록 변경할 수 있다.

 

Visual Studio 2017 Installer를 실행하여 언어 팩에서 영어를 추가한다.

 

 

그 다음 Visual Studio 2017을 실행한 뒤 도구 -> 옵션 -> 국가별 설정을 선택한 뒤 언어를 English로 바꿔주고 프로그램을 재 시작하면 영문으로 변경된다. 이제 에러 메시지를 그대로 긁어 검색하면 대개 Stackoverflow 사이트에서 원하는 답변을 첫번째로 얻게 될 것이다.

 

 

 

When I born, I black. 내가 태어났을때 난 검다. 

When I grow up, I black. 내가 성장할때 난 검다. 

When I go in sun, I black. 내가 햇볕에 나갈때 난 검다. 

When I cold, I black. 내가 추울때 난 검다. 

When I scared, I black. 내가 두려울때 난 검다. 

When I sick, I black. 내가 아플때 난 검다. 

And when I die, I still black. 그리고 내가 죽을때 난 여전히 검다. 


You white folks 너희 백인들은 

When you born you pink. 네가 태어났을때 넌 분홍이다. 

When you grow up you white. 네가 성장할때 넌 희다. 

When you go in sun you red. 네가 햇볕에 나갈때 넌 붉다. 

When you cold you blue. 네가 추울때 넌 파랗다. 

When you scared you yellow. 네가 무서울때 넌 누렇다. 

When you sick you green. 네가 아플때 넌 녹색이다. 

When you bruised you purple. 네가 멍들었을때 넌 보라다. 

And when you die you grey. 그리고 네가 죽을때 넌 회색이다. 


So who YOU call in C O L O R E D? 그렇게 넌 누구를 유색이라 부르는가.

 

'About Me > Human' 카테고리의 다른 글

깨어있는 시민으로 세상을 바꾸고, 세상을 구하자  (0) 2018.12.28

- 마르틴 니뮐러의 그들이 왔다 -

맨 먼저 그들은 공산주의자를 잡으러 왔지만

나는 공산주의자가 아니었으므로 아무 말도 하지 않았다.

그리고 그들은 노동조합원을 잡으러 왔지만

나는 노동조합원이 아니었으므로 아무 말도 하지 않았다.

그리고 그들은 유대인을 잡으러 왔지만

나는 유대인이 아니었으므로 아무 말도 하지 않았다.

마지막으로 그들은 나를 잡으러 왔지만

나를 위해 말해줄 사람은 아무도 없었다.

'About Me > Human' 카테고리의 다른 글

2006년 UN이 선정한 최고의 시  (0) 2018.12.28

 

https://book.naver.com/bookdb/book_detail.nhn?bid=7010768

 

새롭게 소프트웨어 개발자로 입문한 친구뿐 아니라 경험많은 개발자한테도 권해주고 싶은 책이다. 팀을 구성하면 팀원들한테 한권씩 사주고 읽어보라고 권하고 싶다. 책에서 나오는 중요한 문장을 옮겨보고 코맨트를 달아보자.

 

chapter 13 개발 일정을 맞추는 방법

- 여러 새로운 기능의 개발이 공통적인 구성 요소에 많이 얽혀있을수록 많은 프로그래머가 서로 상대방의 코드를 건드리게 되며, 더 중요한 것은 서로 상대방의 설계 시 가정사항을 건드릴 일이 많아지게 된다. - 라이트스톤의 복잡성 원리(Lightstone's convolution principle)

 

  • 일정이 지연되는 이유

1. 범위 변경 문제

//요구사항의 항상 25% 이상 변경 된다고 가정하는게 맞다. 팀원들한테도 요구사항이 변경될 수 있음을 끊임없이 알려야 하고 그것이 당연하다고 인식시켜야 한다. 그렇지 않으면 요구사항이 변경될때마다 부당함을 어필하는 팀원들로 머리가 아파질 수 있다.

2. 인력 수준의 문제

//5 ~ 28배의 일인당 생산성의 차이 발생한다고 하는데 대개의 팀은 최악과 최고의 사이 어딘가에 위치해 있어 실제로는 2 - 3배 정도의 차이를 내는 것으로 생각된다. 물론 2,3배도 엄청난 거지만.

3. 지연된 프로젝트에 사람이 더 붙으면 오히려 더 느려지는 문제

//프레드 브룩스의 맨먼스의 신화를 통해 많이 알려진 이야기지

4. 개발팀의 목표가 불분명한 문제

//이부분은 성당을 만드는 석공의 이야기를 비유로 하면 좋을 듯

5. 의존성 관리: 기능별 예상치를 그냥 더해서 생기는 문제

//결합도와 응집도에 최대한 신경을 쓰는게 해결책 아닐까?

6. 잘못된 추정치 문제(비율 주의)

//코딩의 전체 개발 사이클의 1/6에 불과한데 코딩에 대한 일정으로만 추정하는 경향이 있다고 하는데 이것은 팀장이 팀원의 추정을 지속적으로 보정해 주면 된다. 멍청한 팀장이 아니라면 팀원에게 그가 말한 추정치의 근거를 물어보아야 한다. 그러면 그가 개발 사이클의 포함했는지 단순 코딩만 넣었는지 확인할 수 있다.

7. 공격적인 추정치 문제

//마치 팀을 이상적인 개발팀으로 생각하여 일정을 잡곤하지

8. 난 임계 경로에 들어있지 앟아 라고 생각하는 문제

//이건 생각 못했던건데 다른 팀원의 기능 구현때문에 일정이 늦어질때 자기가 구현해야할 기능도 일정을 지연시키는 현상을 말한다. 오 참신한데. 게으름 피우기 딱 좋은 상황

9. 소프트웨어의 엔지니어링 개념을 말아먹는 문제

//개발 방법론이 없거나 지켜지지 않는 경우  개발자들은 프로젝트 후반부에서 죽음의 행진을 하게 되는건 명확하다. 1인 개발이 아닌 팀인 경우 개발 방법론이 없다는 것은 나침반 없이 바다로 나가는 것이다.

10. 직원이 해야하는 다른 일을 고려하지 않는 경우.

//휴가, 발표 준비 등등의 일을 고려하지 않고 일정을 짠다는 말인데, 대략 1년에 20정도의 일정을 버퍼로 넣어야 맞아 보인다.

11. 바람의 변화

  • 이미 일정이 지연됐을 경우

1. 기능 줄이기

//내가 제일 좋아하는 방법이다. 프로젝트 초반에는 중요했다고 생각하는 기능들이 후반에는 불필요하거나 중요하지 않게 되곤 한다.

2. 기능 쪼개기

//기능 줄이기와 같은 맥락

3. 재협상

//일정을 다시 논의 하는 것인데 이렇게 하려면 일정에 대해 납득할 만한 근거가 있어야만 통하지, 안그러면 무능해보일 우려가 있다.

 

 chapter 17소프트웨어 혁신 리더쉽

  • 혁신가의 12가지 원칙

1. 주변에 최대한 뛰어난 사람들만 골라서 배치하라

//맞는 말이긴 하지만 뛰어난 인재를 고르기란 대단히 어렵다. 마치 서울대 가려면 공부 열심히 하라는 말처럼 공허하다. 가지고 있는 인재 풀 중에서 최대한 적절한 인재를 골라야 하겠지. 최대한 지연, 혈연, 학연등을 배제한채로 말이다.

2. 혁신에 보상하라

//오래전에 읽은 책중에 데모를 준비하려고 2주간 야근한 개발자에게 피자 한판으로 보상하는 것은 개발자를 모욕하는 것이라고 했다. 적절한 보상은 팀장으로써 반드시 쟁취할 분분이다. 그래야 리더쉽을 발휘할 수 있다.

3. 영역주의를 없애라

//음 용어적으로 적절하지 않은 표현같지만 팀워크를 중시해라 정도로 이해해야 할듯

4. 반복하라

//반복 개발하며 피드백을 받는 것은 팀 개발 방법론의 기본중의 기본

5. 해결책이 아니라 문제를 안겨줘라.

//생각해 볼 문제다. 이전까지 팀원이나 동료가 문제를 가져오면 같이 해결하는 것을 나의 큰 장점으로 생각해 왔는데 질문을 던지고 문제의 본질에 대해서 더 분명히 파악할 수 있도록 도와주라고 한다. 쉽게 말해 물고기를 주기보다 잡는 법을 알려주라는 건데. 두가지 방식을 잘 조율해야겠다.

6. 데이터는 중립적이다

//물론 그렇다 데이터는 중립적이지만 그것을 해석할때 외곡이 발생한다. 책에서는 확실한 데이터를 근간으로 사내 정치에 휘둘리지 말라고 하지만 같은 데이터를 가지고 상반된 해석으로 피터지게 싸우면 이런말 안할텐데..... ㅋ

7. 주어진 상황 내에서 문제를 해결하라

//이건 중요한 말이다. 현실을 직시하고 조건 내에서 최대한 해결하려고 노력해야 한다. 안그러면 끊임없는 불평에 계속된다.

8. 친화도를 높여라

//성공하는 사람의 7가지 습관에 나오는 것처럼 상대방의 감정계좌에 충분이 내가 쌓여 있다면 일을 하기는 편해진다. 방법은? 무조건 도와주자. 내가 필요할때 도움을 받을 수 있도록

9. "저것은 남의 것" 증후군에 걸리지 않도록 주의하라

//바퀴를 다시 발명하지 말라!

10. 다른 분야에 대한 지식을 쌓아라

//이종분야에 대한 융합역량은 생각보다 중요한 것 같다. IT뿐 아니라 경제, 문화등 다양한 지식을 쌓을 필요가 있다.

11. 현재 최신 기술을 이해하라

//익숙한 기술이 아니라 현재 최신 트랜드가 어떤지 최소한 이해는 하고 있어야 한다. 무엇이 있는지 알아야 나중에 필요할때 깊이 학습하여 적용할 수 있기 때문이다.

12. 일하는 방법에 있어서 사용자와 시장에 휘둘리지 말아라

//혁신적인 아이디어는 시장에서 나오지 않는다. 시장을 분석하는 것은 필요하지만, 분석만 하고 통찰력이 없다면 핸리 포드는 더 빠른 말을 기르는데 주력했을 것이다.

 

 chapter 18 빅 리그: 거물에서 선지자로

  • 초보 필자들을 위한 조언

1. 내가 아는 것을 쓴다

2. 질에 초점을 맞춘다

3. 나라면 이걸 읽을지 자문해 본다

4. 가능하면 다른 공저자들과 함께 일하자

5. 문체도 중요하다.

6. 글 써서 부자가 될 생각은 금물이다.

 

  • 공공 발표

1. 청중을 이해하라

//청중이 누구인지에 따라 다른 내용으로 발표를 해야한다.

2. (내용뿐 아니라) 스타일로 청중에 맞춰라

//청중이 경영진인지, 학생인지, 기술자인지에 따라 다른 스타일로 발표하는 것은 생각 못한 부분이다. 경영진한테 발표할때는 좀더 진중하게 해야겠다.

3. 알아듣기 좋게, 적당한 빠르기로 발표하라

//긴장하며 발표하다 보면 점점 말이 빨라지기도 하는데 의도적으로 속돌르 조절할 필요가 있다.

4. 청중을 사로잡아라

//보통 처음 발표를 시작할 때 주제와 관련된 잘 알려지지 않은 재미있는 이야기로 시작하곤 하는데 그런 방식은 발표에 집중하게 되는 좋은 효과를 내곤 했다.

5. 손동작을 절제하라

//오바마나 클린턴 연설을 유투브에서 보고 어느정도 해야하는지 참조하란다. 나중에 함 봐야지. 애매하면 그냥 두손 맞잡고 하자..

6. 웃어라

//웃는 표정으로 하고 가끔 청중과 눈도 마주치자. 근데 자꾸 까먹음. ㅠ ㅠ

7. 차트가 아니라 내가 발표한다는 점을 기억하라

//발표자료 죽죽 읽는 것은 최악이다.

8. 내가 주인공이 아니다

//스토리텔링을 할때는 나를 쓰지만 그 이외의 경우에는 안쓰는 것이 좋다고 한다.

9. 그래서?

//발표를 하고 나면 커다란 주제에 대한 메세지를 전달해야 한다. 또한 각 페이지 마다 그에 관련된 작은 메세지를 알려주어야 한다.

10. 적수를 만들어라.

//선명한 대비 구조를 만들어 지금 발표가 악(?)과의 싸움임을 보여주어라. 적수가 없다면 이발표가 얼마나 필요한지 꼭 인식시켜 주어야 한다.

 

chapter 22 성공하기

  •  어떤 사람이 성공하는가?

1. 목표 지향적이다.

2. 감성 지능이 높다.

3. 엄청나게 똑똑하다.

4. 자기 분야의 전문성을 가지고 있다.

5. 놀랄 만큼 집요하면서도 예의를 갖출 줄 안다.

 

최고 자리에 올라간 사람의 공통점은 초창기에 그 분야에 뛰어들었다. 최신 트랜드와 경향을 파악할 필요가 있다. IT역사에서 무엇이 새롭게 태동하고 있는가


프로그램은 현실세계의 추상화

고난이도의 알고리즘에 기반한 프로그램이거나 혹은 무수한 쿼리문을 날려 그 결과값을 화면에 뿌리기만 하는 관리 프로그램이라도 그 근본 구조는 다르지 않다. 객체지향 프로그래밍에선 결국 프로그램은 현실세계의 추상화이기 때문이다. 사용자의 요구사항을 추상화된 모델을 만들어 처리하고 응답하는 것이다.

 

회사의 자재관리 프로그램을 짠다고 생각해 보자. MVC 패턴에 입각하면 UI는 단순히 모델의 반영이며, 모델에 값을 전달하는 것에 불과하다. 물론 요즘 프로그램의 UI는 복잡하고 화려해지면서 그 자체가 하나의 프레임웍으로 구현된다.

UI프레임웍은 이미 충분히 일반화 되어 있다 . MFC, WPF, WinForm등 그저 갖다 쓰기만 하면 된다.

하지만 모델은 어떤가. 모든 프로젝트는 결코 동일하지 않듯이 프로그램도 동일한 비지니스 로직을 표현하는 것은 없다. 불가능한 것은 아니나 비지니스 로직을 프레임웍으로 만들기는 대단히 어렵다. 처음부터 비지니스 프레임웍을 구성하도록 하기보다는 프로그램에 맞도록 모델들을 잘 연계한 구조 (아키텍처, 골격)를 가져야 확장성과 유지보수성을 극대화할 수 있다. 

 

  • UI 결합 코드의 일반적인 사례

여러 회사에서 여러 프로그램을 접해보면서 놀라운점은 대부분의 프로그램이 UI에 밀접하게 연계되어 있다는 것이다. UI를 분리할경우 어떠한 작업도 진행할 수 없도록 짜여져 있다. 더욱 놀라운 것은 그게 문제인지조차 모르는 경우가 허다하다. 너무나 많은 프로그래머들이 그런식으로 작성해왔기 때문이다.

 

모델과 뷰의분리가 이해가 가지않는다면 역설적으로모델과 UI결합된 것을 보면된다. 다음 화면은 간단한 곱셈을 연산한 값을 출력하는 프로그램이다.

 

단순한프로그램을 어떻게구현할까? 초보자들은 흔히 다음과 같이 짜곤 한다. 

 

voidCBadCalculatorDlg::OnBnClickedBtnResult()

{

       CStringsLValue, sRValue;

       m_editLValue.GetWindowText(sLValue);

       m_editRValue.GetWindowText(sRValue);

       double rLValue = _tstof(sLValue);

       double rRValue = _tstof(sRValue);

       double rRet = rLValue * rRValue;     

 CStringsRetValue;

       sRetValue.Format(_T("%.4f"), rRet);

       m_editRetValue.SetWindowText(sRetValue);

} 

 

계산버튼 누르는이벤트 안에서값을 입력하는 에디터박스 안의값을 가져와서곱하기를 다시결과 값을에디터 박스에넣어 표현한다. 뭐가 문제일까? UI 있을 모델 객체가 없다. 모델객체가 없다면곱하기 테스트같은 것이불가능 해지고, 또한 다른 프로그램에서 계산기를 재사용하는 것이 어려워진다. 물론 복사신공(?)으로 가능하지만, 그건 객체지향 세계에선 가장 범죄 행위(?)중 하나이다.

 

그럼모델객체를 만들어보자. 혹자는 단순한 곱하기인데 굳이 클래스를 만들 필요가 있느냐고 생각할지 모르겠다.  현재의 상황만 보자면 사실 충분하기도 하다. 하지만 프로그램은 생물과 매우 유사한 진화 과정을 거치게 됨을 생각해야 한다.

 

#pragma once

namespace Indy

{

       class Calculator

       {

       public:

             Calculator(void);

             virtual ~Calculator(void);

             double GetResult() { returnm_rResult; }

             double Multiply(doublelValue, double rValue);

             double Multiply(doubleRValue);

       protected:

             double m_rResult;

       };

};

Calculator 구현

#include "StdAfx.h"

#include "IndyCalculator.h"

using namespace Indy;

Calculator::Calculator(void)

{

       m_rResult = 0;

}

doubleCalculator::Multiply(double lValue, double rValue)

{

       m_rResult =lValue * rValue;

       return m_rResult;

}

doubleCalculator::Multiply(double RValue)

{

       m_rResult *=RValue;

       return m_rResult;

}

 

위의 선언부를보면 개의 값을곱하는 함수가있고, 인자가 하나뿐인 곱하기 함수도 있다. 우리가계산기를 사용할 이전의연산 결과에다시 곱하는경우가 있는데, 인자가 하나뿐이 함수의 구현부를 보면 이전의 결과값을 누적함을 확인할 있다.  곱하기를 수행했는지를 알고 싶다면? 곱하기를 히스토리를 30단계까지 보고 싶다면? 곱하기의 결과를 자리씩 끊어서 “,” 붙여 회계 형으로 만들고 싶다면 어덯게 할까?

이제슬슬 머리가 아파오기시작할 것이다. 만약모델이 없고 UI이런 기능을 추가하려면조금씩 UI 기능양쪽과 서로 연관되면서 복잡도는 더욱더커지게 된다.

 

나는 골격을 프레임워크의 단계라고 본다. 만약 여러분이 유사한 프로그램을 정도 만든다고 하면 여러분이 만든 골격이 차츰 프레임워크로 발전할 것이지만 그렇지 않은 경우에는 골격이 아키텍처 차원의  활용성을 가지기는 매우 어렵다. 그러나 짜인 아키텍처는 품질을 유지하고, 개발의 속도를 높이는 데는 막강한 역할을 담당하게 될 것이다.

 

  • 골격이란 프로그램의 핵심기능이 구현된 중요한 구조(아키텍처) 구현물

프로젝트의 초창기엔주변의 자잘한기능이 아닌핵심 기능에집중해야 한다. 우리는 흔히 개발 공정을 작성할 프로그램의 전체 기능을 순서대로 개발하는 오류를 범하기도 한다.

예를 들어 XML 값을 읽어 들여 연산을 결과를 3차원 그래프 출력하는프로그램을 개발할경우 XML파서기 개발부터 시작하는 식이다. 계산기를 만들경우 계산하는기능에 우선집중해야 한다. 결과를 3차원 그래프 표현하거나 XML 출력하는 기능은 핵심 기능이 아니다. 프로젝트의전체를 관통하는주요 흐름만을최대한 빠른시간 내에구현해야 한다.

전체 개발기간의 3-40% 이내의 기간 내에 골격이 완성 되고, 핵심 기능이 구현되지 못한다면 프로젝트는 실패를 예고하고 있는 것이다. XML파서기를 아무리 만들든 무슨소용이 있겠는가? 계산 성능에서심각한 문제가 후반에 발견된다면 말이다.

바로이러한 문제를 조기에확인하기 위해 골격을구현하고 테스트하는 것은 중요한 작업이다. 이 작업이 마무리되면 프로젝트 중, 후반의 작업은즐거운 살붙이기 작업이 것이다.

 

프로그램이 자꾸 버그가 꼬리를 물때, UI의 작은 변경에도 많은 클래스들을 변경해야 할때 자신의 프로그램을 자세히 들여다 보라. 골격이 있는지, 또 있다면 UI와 완전히 분리되어 있는지 살펴볼 일이다.

 

'Successfull Project > Architecture Design' 카테고리의 다른 글

객체지향 코드 - 캡슐화  (0) 2018.12.28

+ Recent posts