01. 3D 그래픽의 이해



1. 3D 그래픽 파이프라인



1.1 게임 엔진을 구성하는 소스코드 모듈들

- User Input (사용자 입력)

- Resource Management (자원 관리)

- Loading and Rendering Graphics (그래픽 로딩과 렌더링)

- Interpreting and Executing Scripts (스크립트 해석과 실행)

- Playing Sound Effects (음향 처리)

- Artificial Intelligence (인공 지능)



1.4 좌표계

- Mesh (3차원 공간상의 객체) 를 기하학적으로 표현하기 위해선 좌표계가 필요하다.

- 2차원 좌표계(2차원 직교 좌표계, 화면(스크린) 좌표계), 3차원 좌표계(왼손 좌표계, 오른손 좌표계)

(출처 : http://msdn.microsoft.com/en-us/library/windows/apps/ff729721.aspx)


(출처 : http://blog.daum.net/jty71/15645437)



- 모델(or 지역) 좌표계와 월드 좌표계

- 모델 좌표계 : 객체의 지역적 공간(Local space)을 표현하는 좌표계(모델마다 별도의 좌표계를 갖고 있다고 가정)

- 월드 좌표계 : 게임 세계 전체를 하나의 통일된 좌표계로 표현하기 위한 좌표계(전역 좌표계)

(출처 : http://msdn.microsoft.com/en-us/library/windows/desktop/bb206365(v=vs.85).aspx)



1.5 와인딩 순서(Winding Order)

- Mesh 를 구성하는 다각형의 정점들을 나열하는 순서. 

즉, 다각형의 정점 or 모서리가 어떤 순서로 연결되는지를 나타냄.

- 은면(Back Face Culling : 카메라에서 보이지 않는 면) 제거를 수행하기 위해 사용한다.

- 시계 방향, 반시계 방향 순서가 있는데 Direct3D는 기본적으로 시계방향. (보통 반시계가 기본임)

Direct3D 기준으로 눈에 보이는 면들이 시계방향으로 와인딩 되기 때문에 
보이지 않는 면의 경우 반시계방향으로 와인딩 된다고 할 수 있다.

(출처 : http://cookiejeon.tistory.com/3)



1.6 화면 렌더링

- 화가의 알고리즘(Painter's Algorithm) : 3차원 세상을 2차원 평면에 그리는 과정이나 비효율적.

 자세한 내용은 위키백과.

http://ko.wikipedia.org/wiki/%ED%99%94%EA%B0%80_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98 )





2. 변환 파이프라인


① 정점(지역 좌표계)

월드 변환 (World Transformation)

② 월드 좌표계

카메라 변환 (View, Camera Transformation)

③ 카메라 좌표계

------------------------------------------------ ↑ 3D, ↓2D 좌표

투영 변환 (Projection Transformation)

④ 투영 좌표계

화면 변환 (Screen Transformation)

⑤ 화면 좌표계



* 참고로 Primitive Transformation 에는 3가지 종류가 있다.

1) Translation (이동)   2) Rotation (회전)   3) Scaling (크기)

(관련 링크 : http://msdn.microsoft.com/en-us/library/windows/apps/ff729722.aspx)



# 월드 변환(World Transformation)

- 회전 변환 + 평행이동 변환을 통해 지역 좌표계로 표현된 객체의 Mesh 가 월드 좌표계로 변환되는 과정

(회전 변환 계산법 생략*), (회전을 먼저 하냐 평행을 먼저 하냐에 따라 결과가 다르다는 점 주의)

(출처 : http://goldface.tistory.com/archive/20120205)


# 카메라 변환(View, Camera Transformation)

- 월드 좌표계로 변환된 정점을 카메라 좌표계로 변환하는 것을 말한다.

- 3차원 공간이 투영되어 가상 카메라에 나타나는 2차원 평면을 카메라 평면이라 한다.

- 가상 카메라는 위치, 방향, FOV(Field of View) 와 같은 속성을 가진다.

※ FOV : 특정 방향과 특정 위치에서 어떤 물체가 보이는 지를 말한다. 

   사람의 경우 앞(Forward)을 향해 FOV를 가지고 있다. 그래서 자신의 뒤에 무엇이 있는지 볼 수 없다.

※ 화각(Viewing Angle) : 카메라에서 볼 수 있는 각도, 화각에 따라 FOV 공간의 형태가 달라진다.

아래 그림에서 Θ에 해당한다.


사람은 너무 가깝거나 or 너무 멀거나 하는 물체는 제대로 볼 수 없다.

그래서 컴퓨터 그래픽에서는 이 FOV 를 다음과 같이 View Frustum 으로 표현한다.


View Frustum 은 총 6개의 면으로 이루어져 있고 그 중 2 개는 XY 평면과 평행하다.

아래 그림에서 a 면이 Near-Z, b 면이 Far-Z 평면이라 불린다.

FOV 가 넓을수록 View Frustum 의 부피도 커지고 그만큼 시야가 넓어지는 것을 의미한다.


보통 좌표계에서 Z 축이 Forward 방향을 나타낸다. (X 축이 좌우, Y 축이 상하, Z 축이 앞뒤)

(출처 : http://msdn.microsoft.com/en-us/library/windows/apps/ff729721.aspx)

- 카메라 변환 과정

1) 카메라를 월드 좌표계의 원점으로 평행이동

2) 1)과 같은 변환을 게임 세계의 모든 객체에 적용

3) 카메라 좌표계 축들이 월드 좌표계 축들과 일치하도록 회전 변환

4) 3)과 같은 변환을 게임 세계의 모든 객체에 적용

(출처 : http://msdn.microsoft.com/en-us/library/windows/apps/ff729721.aspx)



# 투영 변환(Projection Transformation)

- 카메라 좌표계에서 카메라에 보이는 객체에 대하여 카메라와 객체까지의 거리는 기본적으로 Z 좌표로 근사할 수 있다.

- 카메라와 Mesh 사이의 Z 좌표가 증가할 때 메시의 각 정점 X, Y 좌표를 Z 좌표(ViewSpaceZ)의 z 값에 반비례하도록

변환하면 원근 효과를 나타낼 수 있다.

- 카메라 FOV 공간에 있는 정점들이 투영되는 공간은 투영 윈도우(Projection Window) 라고 한다.

-1 <= X <= 1, -1 <= Y <= 1 :: 카메라 FOV 공간에 포함된 정점들을 투영 변환했을 때 값들의 범위

(그외의 값을 갖는 점들은 카메라 FOV 공간에 포함되지 않아 보이지 않음)

- 투영 변환 :

X(projected) = x / ( z / d )

Y(projected) = y / ( z / d )

d 는 카메라에서 투영 평면까지의 거리를 의미한다.

d = 1 인 경우는 FOV 의 화각이 90도인 경우를 말한다. Direct3D의 경우 항상 1.0 의 값으로 설정.

- 쉽게 설명하자면,

투영 변환이란 3D 좌표 → 2D 좌표로 바꾸는 작업이다. 그러면 어떻게 바꾸냐?

FOV 의 화각이 90도 라고 했을 때(d=1),

(x, y, z) → (x/z, y/z, z/z) → (x/z, y,z, 1) 으로 바꿔버린다.

그러면 모든 정점들의 Z 좌표 값이 모두 1이 될 것이다. 

즉, 한 평면에 모든 정점들이 표현되고 이는 2D 좌표와 다를 것이 없다.


여기서 중요한 건 d=1 이라는 가정이다. 정확히는 z / (z/d) = 1 / d 가 되어

투영 변환된 Z좌표의 값은 0 <= Z <= 1 값을 갖게 될 것이다.

'그러면 2D가 아니지 않느냐?' 라고 생각할 수 있는데 왜 이렇게 되어야 하는 지는

Z-Buffer 얘기를 해야하는데 위에 '화가의 알고리즘' 관련 링크를 따라가 보면 알 수 있다 :-)



# 화면 변환(Screen Transformation)

- 투영 변환을 거친 정점은 2차원 좌표라고 생각할 수 있다.

이러한 2차원 좌표를 화면 좌표계로 변환하여 2차원 화면의 Pixel 로 그리는 단계.

- 렌더링할 대상의 화면 영역을 뷰포트(Viewport) 라고 한다.

(출처 : http://www.asksatyam.com/2011/01/window-to-viewporttransformation.html)


아무리 비율 좋은 Mesh 라고 한다고 해도 화면 비율에 맞게 렌더링 하다보면

위와 같은 현상이 나타날 수 있다. 그러니 다음과 같은 식을 이용한다.


- 픽셀 위치 좌표계 :

ScreenX = projVertex.x * (ViewportWidth / 2) + ViewportLeft + (ViewportWidth / 2)

ScreenY = - projVertex.y * (ViewportHeight / 2) + ViewportTop + (ViewportHeight /2)


ViewportLeft, ViewportTop : 뷰포트의 원점 위치

ViewportWidth, ViewportHeight : 뷰포트 가로, 세로 크기

※ 투영 좌표계는 좌표계 한가운데가 원점인 직교 좌표계이고, 

뷰포트는 왼쪽 상단이 원점인 좌표계이므로 Y 축의 방향이 서로 반대 방향이라 (-) 부호를 붙인다.




Transformation Pipeline 의 흐름을 잘 이해할 수 있는 이미지를 가져와봤다.

(출처 : https://forum.libcinder.org/topic/finding-an-object-s-screen-coordinates)



* 그 외 참조 :

http://code.msdn.microsoft.com/windowsapps/Direct3D-Tutorial-Win32-829979ef


by kelicia 2014. 7. 21. 21:11



실용주의 프로그래머

저자
앤드류 헌트, 데이비드 토머스 지음
출판사
인사이트 | 2014-03-28 출간
카테고리
컴퓨터/IT
책소개
The Pragmatic Programmer 숙련공에서 마스터로...
가격비교



코딩 호러 시리즈를 읽으면서 매우 자주 소개된 책이 2권있다.

하나는 조엘 시리즈, 다른 하나는 이 책이다.


이미 아주 예전에 출간되었으나 최근에 디자인이 인사이트 특유의 심플한 디자인으로

탈바꿈되서 새로 나왔다. 목차를 보니 크게 다른 점은 없었다. (페이지 수는 이게 조금더 많다)



다른 분들이 쓰신 책 서평을 보니 거의 다 칭찬일색인데...

에..뭐랄까... 내가 코딩 호러 시리즈에서 이 책에 대한 내용을 심하게

네타 당했는지 읽는 내내 '많이 봤던 내용들이네...?' 하면서 지루하더라.

그래서 진짜 겨우 읽었다. 머릿속에 잘 들어오지가 않아서 여러모로 아쉽다.


물론 아주 유명한 책인 만큼 공감할 수 있는 부분, 새롭게 깨달음을 얻는 부분들도 있었으나

저자님께서 Perl 을 무지 좋아하시는 것 같았다ㅋㅋㅋㅋㅋ

나는 Perl 을 잘 모르기 때문에 저자님께서 씡나게 Perl 얘기를 하면 지루....

'보이지 않는 이 거리감 어쩔거야 ㅋㅋㅋ' 라는 생각이 조금 들었다.



제길. 이거 먼저 읽고 코딩호러 시리즈를 읽었어야 하는데 ㅋㅋㅋㅋㅋㅋㅋ

리뷰를 써야되나 말아야되나 솔직히 지금 포스팅하고 있는 시점에서도 고민된다 ㅋㅋ


진짜 어디서 본 내용들 많이 나오더라.

깨진 유리창 이야기 부터 고무 오리 기법, select 는 망가졌어 등등

중복되는 내용은 대충 훌훌 읽었....ㅋ


막상 이렇게 시작부터 책을 까도 막상 리뷰 쓰다보면 엄청 써대니 잡소리는 여기까지 하겠다.




1. 실용주의 철학


'돌멩이 수프와 삶은 개구리' 부분은 재밌게 읽었다.

스토리는 조금 억지스럽지 않았나 싶기도 했지만 그로부터 얻는 교훈에서는 느낀 바가 없진 않다.


'지식 포트폴리오'

- 지식 포트폴리오를 만들라고 하는데 매우 공감한다. 

그렇기 때문에 나는 이 블로그를 개설했었다.

주로 프로그래밍 관련 포스팅만 해서 다각화가 조금 부족한 면이 있지만

확실히 나는 개발 관련 포스팅을 해놓고 필요할 때 다시 보는 경우가 굉장히 많다.

이렇게 반복학습을 하면서 더욱 그 내용을 상기시키게 되서 더욱 지식 자산을 견고히 쌓게 된다.


블로그 개설을 강요하는 건 아니지만 ㅡ_ㅡ; (하지만 제프 앳우드님은 블로그를 하라고 하셨지)

아무튼 이 책에는 지식 포트폴리오를 관리하는 가이드 라인이 소개 되어 있다.

1) 매년 새로운 언어를 최소 하나는 배워라.

2) 기술 서적을 분기마다 한 권씩 읽어라.

3) 비 기술 서적도 읽어라.

4) 수업을 들어라.

5) 지역 사용자 모임에 참여하라.

6) 다른 환경에서 실험해보라.

7) 요즘 흐름을 놓치지 마라.

8) 인터넷을 이용하라.


사실 회사 일에 치여 살다보면 지금 하고 있는 일과 관련없는 공부를 하기가 힘들다는 건 현실이다.

지친 심신을 위한 휴식도 중요하지만 휴식이 지나치지 않은가에 대해 경계할 필요가 있는 것 같다.

물론 나에게 해당되는 얘기다 ㅋ 너무 쉬기만 하면 머리가 급속도로 포맷이 되니까 ㅡ_ㅡ


아, 그리고 이 장에서 Guru 가 뭔지 대강 알게되었다.




2. 실용주의 접근법


'중복의 해악'

- DRY : Do NOT repeat yourself

책 읽다보면 DRY 가 정말 많이 나온다. 그만큼 중복을 피하라는 것을 강조한다.


'예광탄'

- 목표물을 찾기 위해 예광탄을 써라.


프로토타이핑 VS. 예광탄 코드 

* 프로토타이핑 : 최종 시스템의 어떤 특정한 측면을 탐사해보는 것이 목표다.

진짜 프로토타입 방식을 따른다면, 어떤 개념을 구현해 보려고 시도할 때 대충 끼워 맞춘 것들을

모두 버린 후, 실험 과정에서 얻은 교훈을 바탕으로 다시 코드를 만들게 된다.


* 예광탄 코드 : 문제에 대한 대응 방법이다.

'애플리케이션이 전체적으로 어떻게 연결되는지 알고 싶고,

사용자들에게 실제로 이 애플리케이션이 어떻게 상호작용하는지 보이고 싶고,

개발자들에게는 코드를 붙일 아키텍처적 골격을 제시하고 싶다.' 라고 생각하는 경우, 

대강 구현한 알고리즘과 단순하지만 동작은 하는 사용자 인터페이스로 구성된 예광탄을 만들 것이다.


프로토타입은 나중에 버릴 수 있는 코드를 만드는 것이고,

예광탄 코드는 기능은 별로 없지만 완결된 코드이며 최종 시스템 골격의 일부를 보인다.




3. 기본적인 도구


'일반 텍스트의 힘'

- 지식을 일반 텍스트로 저장하라.


* 단점 

1) 압축된 이진 포맷을 사용하는 것보다 더 많은 공간을 차지할 수 있고

2) 일반 텍스트 파일을 해석하고 처리하는데 더 많은 계산이 필요할 수 있다.


* 장점

1) 구식이 되는 것에 대한 보험

2) 호환성

3) 더 쉬운 테스트


장점이 단점을 다 덮고도 남는다고 강조하신다ㅎ

지식을 저장하는 최고의 포맷은 Plain Text 라고 하시면서.




4. 실용주의 편집증


'단정적 프로그래밍'

- 연습문제가 재미있길래 가져와봤다.


Q. 간단한 현실 점검. 다음 '불가능한' 것들 중 무엇이 실제로 일어날 수 있는가?

1. 한 달이 28일 보다 적은 것

2. stat(".", &sb) == -1 (즉, 현재 디렉터리에 접근할 수 없다)

3. C++ 에서 a = 2; b = 3; if ( a+b != 5 ) exit(1);

4. 내각의 합이 180도가 아닌 삼각형

5. 60초가 아닌 1분

6. 자바에서 (a+1) <= a


해답

1. 1752년의 10월은 19일 밖에 없다. 그레고리 교황의 달력 개혁의 일부로

달력 간의 날짜를 맞추기 위해서 이런 일이 생겼다고 한다.


2. 다른 프로세스가 디렉토리를 없앴거나 디렉토리를 읽을 퍼미션이 없을 수 있다. 또는 &sb가 잘못 되거나.


3. 함정. (a 와 b 의 자료형을 명시하지 않았기 때문에)

연산자 오버로딩 때문일수도 있고, 또는 a 와 b 가 동일한 변수의 참조 변수일 수도 있다.


4. 비유클리드 기하학에서 삼각형의 내각의 합은 180도 안 될 수도 있다.

구 표면에 그려진 삼각형을 생각해보자.


5. 윤분(leap minute)은 61초나 62초일 수도 있다.


6. 오버플로 때문에 a+1 값이 음수가 될 수도 있다.



'리소스 사용의 균형'

- 기억에 남는 연습문제가 있었다.


Q. 일부 C 개발자와 C++ 개발자들은 어떤 포인터가 가리키는 메모리의 할당을 해제한 다음에는

반드시 그 포인터가 NULL 을 가리키게 하곤 한다. 왜 이것이 좋은 생각일까?


해답

대부분의 C나 C++ 구현에서는 어떤 포인터가 정말 유효한 메모리를 가리키는지 확인할 방법이 없다.

어떤 메모리 영역의 할당을 해제한 다음에 프로그램의 나중 부분에서 그것을 참조하는 잘못은

자주 일어난다. 그때쯤이면, 가리키는 메모리는 다른 목적을 위해 재할당되어 있을 수도 있다.


프로그래머는 포인터를 NULL 로 맞추어 놓음으로써 이런 잘못된 참조를 하지 않을 수 있기를 기대한다.

대부분의 경우 NULL 포인터를 참조하는 것은 런타임 에러를 발생하기 때문이다.

(비공개 포스팅에도 한번 언급했지만 NULL 포인터는 

일반적으로 '0' 이라는 값을 갖으며 유효한 참조나 메모리 주소를 가르키지 않는다)




5. 구부러지거나 부러지거나


'메타프로그래밍'

- 코드에는 추상화를, 메타데이터에는 세부 내용을.


메타데이터는 애플리케이션을 기술하는 모든 데이터로 보통 컴파일타임이 아닌 런타임에 접근, 사용된다.

메타데이터를 이용하여 반환 매개 변수, 사용자 선호사항, 설치 디렉터리와 같은

애플리케이션 설정 옵션을 기술하라. ex) 윈도우에서 .ini 확장자 파일




6. 코딩하는 동안 해야할 일들


'우연에 맡기는 프로그래밍'

- 우연에 맡기는 프로그래밍을 하지 말라.


휴... 왠지 이 파트를 읽으면서 나도 모르게 반성하게 되었다.

애초에 시작부터 우연에 맡기는 프로그래밍을 하는 것도 큰 잘못이고 어리석은 짓이나..

내 경우에는 조금 다르다.


코딩을 하다가 내가 생각했던 방식대로 계속 잘 안 되면 다른 방법을 찾게 된다.

다른 방법 역시 뭔가 계속 안 되면 나는 멘붕에 빠지기 시작하면서 짜증 지수가 최고조로 급상승.


결국 폭발하면 반드시 되게끔 만들어보이겠다는 오기가 생기기 시작해

온갖 수단과 방법을 가리지 않고(?) 마구잡이로 덤벼든다. 

생각해보면 이 과정은 우연에 맡기는 프로그래밍과 크게 다를 바 없다.

안 되니까 될 때까지 미친 애마냥 이거저거 막 찔러보는......


이래서 냉정과 침착 (=멘탈甲) 이 필요하다.



'리팩터링'

- 언제 리팩터링을 해야할까?

1) 중복(DRY)    2) 직교성이 좋지 않은 설계    3) 유효기간이 끝난 지식    4) 성능


연습문제가 3문제 있는데 모두 풀어볼 만한 흥미로운 문제였다.

풀면서 느낀 건 디자인 패턴 공부를 해놓은게 확실히 도움이 된다.

'읽기 좋은 코드가 좋은 코드다' 라는 책도 풀다가 중간에 생각날 정도로 도움이 됐다.




7. 프로젝트 전에


'요구사항의 구렁텅이'

- 요구사항을 수집하지 말고 채굴하라.


ㅋㅋㅋㅋ... 이 파트 읽으면서 설마 객체지향 수업시간에 징하게 배웠던

Use-Case 가 나올 줄이야 ㅋㅋㅋㅋㅋ 심지어 UML 도 나와서 좀 웃겼다.

'와, 이게 실제로 쓰이긴 쓰이나 보구나....' 싶었다.

개인적으로 Use-Case 작성하는 것에 대해 >매우< 스트레스 받는다ㅋㅋㅋ


그리고 요구사항을 수집하지 말고 채굴하라고 하는데... 맞는 얘기다.

실제로 내가 인턴했을 때 전달 받은 요구사항에 대한 문서들을 모아 잘 정리해서 

내 나름대로 코딩을 하고 있었다. (문서 중간에 조금 의심스러운 부분이 있었음에도 불구하고)

그런데 중간에 요구사항이 변경되는 바람에... 내가 우려했었던 그 부분에 대한 코드를 통째로 날렸다 ^^ㅋ


그러니 수집하지 말자. 채굴하자. 정말 쌀알만한 한 점의 의심스러운 부분이라도 캐내자.




8. 실용주의 프로젝트


'결국은 모두 글쓰기'

- 아무리 흐린 먹물이라도 가장 훌륭한 기억력보다 낫다.


진짜... 저 말에 매우매우매우 10000% 동의한다.

특히 나는 일주일도 안 되서 내가 전에 무엇을 했었는지 기억을 잘 못한다. ㅠ_ㅠ

그래서 혹시라도 까먹을까봐 불안해서 핸드폰이나 주변에 잘 보는 곳에 기록을 남긴다.


이는 개발할 때도 마찬가지다. 예를 들어 소스 코드 주석.

책에서 JavaDoc 도구가 제안하는 주석의 수준을 하나의 예를 들어 보여주는데 훌륭했다.

그리고 적절한 주석이 제자리에 있으면 JavaDoc 이나 DOC++ 같은 도구가 API 수준의 문서를

자동으로 추출, 포맷까지 해준다고 한다. 한번 해볼 가치가 있다고 느꼈다.


나의 경험을 비추어 봤을 때... 

인턴을 하면서 내가 분명히 무슨 이유가 있어서 어떤 코드를 작성을 했는데

대리님께서 그 코드를 보고 이거 누가했냐면서 왜 이렇게 해놓았냐고 약간 짜증이 섞인 말로 물어보셨다.


그래서 내가 한 거라고는 밝혔는데 문제는 왜 그랬었는지 내가 기억을 못 했다 ! ! ! ! (real 상황이었음)

지금 생각만해도 정말 절망스러웠다....ㅋㅋㅋㅋㅋ...

거의 한소리 듣기 일보 직전에 내 사수님께서 그 이유를 기억하셔서 잘 설명해주셨고,

이유가 잘 먹혀서(?) 결국 그 코드는 보존하게 되었다. 


Aㅏ, 정말.... 주석....

잘 달아놓자 ㅠ_ㅠ.............!


그리고 공부한 내용은 잘 정리해서 기록에 남기자. 나중에 진짜 다시 찾아보게 된다.



'오만과 편견'

- 자신의 작품에 서명하라.


마지막 파트라서 그런가, 꽤 중요한 내용이라고 생각된다.

'내가 이걸 만들었고, 내 작품의 품질을 보증합니다' 라는 뜻의 서명.

품질의 보증수표 ㅋㅋㅋㅋ 마치 화가들이 자신의 작품에 서명하듯이.


그러고보니 인턴할 때 누군가의 코드를 보고 있었는데

가끔가다 주석에 닉네임 같은 것이 적혀있었다. 

그걸보고 '누군지 몰라도 꽤 자신이 있나보다..' 라는 생각을 하게 되었다.

사실 자신이 있는 것도 있는 거지만 그만큼 자기 코드에 대해 책임을 지겠다는 뜻인데.


나는 아직 초보 개발자여서 내 코드에 대한 자신이 없기때문에 사실 지금은 서명하는 게 조금 두렵다.

더 솔직히 까발리자면(?) 누군가에게 지적받는 게 두려운 것 같다.


초보 개발자이든 뭐든 간에 맡은 일을 하다가 지적받을 수도 있는거고,

'받아들일 건 받아들이자' 면서 머리 속으로도 쿨하게 넘기려고 하는데도

막상 지적받으면 스스로가 창피하고 뭔가 굴욕적? 이다 ㅋㅋㅋㅋ 이러면 안되는데.


좀 더 덤덤하게 철판을 깔고 더 배운다는 자세로 내 흔적을 남겨야 할텐데. ㅋㅋㅋ

아니면 지적도 못 하게 완벽하게 코드를 짜든가. (실질적으로 이건 불가능)


쩝. 아무튼 책임 회피를 하는 것 만큼 최악인 것도 없으니

내 개인의 창피함 보다는 책임감을 좀 더 중요시 여기려고 노력해야겠다.




역시 리뷰 쓰다보니 앞에 지루하다고 투덜댈 때는 언제고 마구 쓰게 된다ㅋ

가끔 기록 강박증이 있는 건가 스스로 의구심이 들 때가 있지만 아직 그 단계까지는 아닌듯.


나는 좀 글을 써야된다. 평소에 너무 안 쓰니까 어휘력도 딸리고 표현력도 딸리고 ㅋㅋㅋㅋㅋ orz

다음엔 조엘 시리즈 ㄱㄱ ~


by kelicia 2014. 7. 4. 01:54

불타오르는 프로그래밍 트렌드 15가지, 그리고 식어가는 트렌드 15가지

Peter Wayner | InfoWorld

프로그래머들은 시시각각 유행이 바뀌는 패션업계를 비웃기 좋아한다. 치마 길이도 올라갔다 내려갔다 바뀌고 색상 유행도 항상 바뀌고, 넥타이도 두꺼워졌다 얇아졌다 항상 바뀌곤 한다. 하지만 기술업계에서는 기술, 엄밀성, 과학, 수학, 정밀성이 유행보다 더욱 중요하다.

그렇다고 해도 프로그래밍에 유행이란게 존재하지 않는 것은 아니다. 차이점이라면 프로그래밍 트렌드는 효율성, 증가된 커스터마이징, 사용 편의성에 의해 주도된다는 정도다. 이런 요소들을 한가지 이상 제공하는 신기술은 이전 세대를 완전히 갈아치운다. 그래서 그냥 엉뚱히 나오는게 아니라 그럴만한 이유가 있는 유행이다.

다음은 요즘 프로그래머들 사이에 지금 떠오르는 유행과 식어가는 유행 목록이다. 여기 소개된 목록에 대해서 모두가 동의하지 않을 수 있다. 하지만 그 점이 바로 빠르게 변하고, 열정적인 토론이 일어나고, 갑자기 재기하기도 하는 프로그래밍이라는 일의 매력이 아닐까?

뜬다: 전처리기
진다: 풀 랭귀지 스택(Full language stacks)


얼마 전까지 만해도 새로운 프로그래밍 언어를 개발하려면 칩에 맞춰 코드를 비트로 바꾸는 모든 것들을 새로 만들어야 했다. 그러던 중에 어떤 이가 이전 작업들 위에 그대로 편승할 수 있다는 점을 알아냈다. 그 결과 이제 똑똑한 아이디어를 가진 사람들은 풍부한 라이브러리와 API를 갖추고 새로운 코드를 예전 형태로 번역하는 전처리기(preprocessor)만 만들면 된다.

그런 식으로 다이나믹 타이핑(dynamic typing)을 좋아하는 이들은 과도하게 엄격한 구두법이 없는 단순한 자바 버전인 그루비(Groovy)를 만들었다. 자바스크립트(JavaScript)를 고치고 싶어했던 이들은 역시 부담스러운 구문법 없이 코딩할 수 있게 해주는 전처리기인 커피스크립트(CoffeeScript)를 만들었다. JVM상에서 실행되는 클로주어(Clojure)나 스칼라(Scala)같은 십여 개의 언어들이 있지만, JVM은 하나뿐이다. 바퀴는 다시 발명할 필요가 없지 않나?

뜬다: 자바스크립트 MV*프레임워크
진다: 자바스크립트 파일


오래 전, 모든 이들은 알림 상자를 띄우거나 이메일 주소에 @ 표시를 포함시키기 위해 자바스크립트를 배웠다. 이제는 HTML AJAX 앱이 아주 정교해져서 맨땅에서 시작하는 사람은 거의 없다. 정교한 프레임워크를 선택해 비즈니스 로직을 실행하는 글루 코드를 조금 작성하는 것이 더 간편하다. 켄도(Kendo), 센차(Sencha), 제이쿼리 모바일(jQuery Mobile), 앵귤러JS(AngularJS), 엠버(Ember), 백본(Backbone), 미티어 JS(Meteor JS)같은 십여 가지 프레임워크가 있는데, 이 모두가 웹 앱과 페이지의 이벤트, 컨텐츠를 잘 처리해 준다.

뜬다: CSS 프레임워크
진다: 제네릭 폭포수 스타일 시트(Generic Cascading Style Sheets)


과거에는 웹 페이지를 화려하게 꾸민다는 것이 CSS 파일을 열어 'font-style:italic' 같은 명령어를 사용하는 정도였다. 그렇게 힘든 아침 업무를 마치고 파일을 저장한 후 점심을 먹으러 가면 됐다. 그러나 이제 웹 페이지들은 너무나도 세련돼, 그런 단순 명령으로 꾸미는 것이 불가능해졌다. 색깔 하나만 바꿔도 모든 것이 다 엉클어진다. 마치 공동 운명체나 생태계처럼 모든게 연결돼 있다.

그런 부분에서 SASS와 그 사촌격인 컴파스(Compass)같은 CSS 프레임워크의 입지가 탄탄하다. 이들은 실변수, 내포화 블록, 믹스-인같은 프로그래밍 구조를 제공해 문법에 맞으면서도 안정적인 코딩을 도와준다. 프로그래밍 측면에서는 새롭게 들리지 않을 수도 있지만, 디자인 측면에서는 매우 큰 진보다.

뜬다: 캔버스상의 SVG + 자바스크립트
진다: 플래시


오랫동안 플래시는 사람들을 미치게 만들어왔지만, 아티스트들은 언제나 그 결과물에 만족해했다. 외곽선이 매끄럽게 처리된 렌더링은 매우 훌륭하기 때문에 많은 재능 있는 아티스트들은 세련된 결과물을 얻기 위해 플래시 기술을 폭넓게 사용해왔다.

그러나 이제 자바스크립트 레이어도 그 정도를 지원하게 되면서, 브라우저 제조사와 개발자들은 플래시의 종말을 기대할 수 있게 됐다. 이들은 SVG(Scalable Vector Graphics)같은 새로운 포맷은 DOM 레이어와 더 깊게 통합된다. SVG와 HTML은 하나의 큰 태그 파일을 구성하는데, 이는 웹 개발자들이 쓰기에 더 간편한 경우가 많다. 또한, 캔버스(Canvas) 객체에 세밀한 그림 그리기가 가능한 API들이 많고 비디오 카드의 지원도 받을 수 있다. 이들을 사용하면 더는 플래시를 쓸 이유가 없다.

뜬다: 거의 빅 데이터(하둡 없는 분석)
진다: 빅 데이터(하둡과 함께)


누구나 대학에서 중요한 인물이 되고 싶어한다. 그러나 상황이 여의치 않다면 자신이 충분히 돋보일 수 있는 적당한 수준의 대학을 찾게 된다. 마찬가지다. '빅 데이터'라는 단어가 중역 회의실에서 처음 흘러나오기 시작했을 때 이들이 마치 요트를 사거나 초고층 빌딩을 짓는 것처럼 가장 강력한 빅데이터 시스템을 찾는 일이 놀라운 것은 아니다.

재미있는 점은, 많은 문제가 빅 데이터 솔루션이 필요할 만큼 그리 큰 일이 아니라는 사실이다. 물론 구글이나 야후같은 기업들은 우리의 모든 웹 브라우징을 추적하고, 페타바이트나 요타바이트급 데이터 파일들을 보유하고 있다. 하지만 대부분의 회사들은 기본 PC의 RAM 정도면 충분할 만한 작은 데이터세트를 가지고 있다. 필자는 16GB RAM이 장착된 PC에서 지금 기사를 쓰고 있는데 이는 상당량의 바이트와 수십억 개의 이벤트를 담기에 충분하다. 대부분의 알고리즘에서 데이터를 SSD에서 스트리밍하기 때문에 메모리에 읽힐 필요가 없다.

병렬로 실행되는 하둡 클라우드 내의 십여 대의 기계의 빠른 응답시간을 필요로 하는 인스턴스들이 있겠지만, 대부분은 협업이나 커뮤니케이션을 신경 쓰지 않고 단일 기기상에서의 플러깅만으로도 충분할 것이다.

뜬다: 게임 프레임워크
진다: 네이티브 게임 개발


한때 게임 개발은 C에 있어서 모든 것을 백지에서부터 시작할 수 있는 개발자들을 충분히 채용하는 것을 의미했다. 물론 엄청난 돈이 들지만 보기에는 좋아 보이니까. 그러나 이제 어느 누구도 커스텀 코드를 감당할 만큼 사치를 부릴 수가 없게 되었다. 대부분의 게임 개발자는 오래 전에 자존심을 버리고 유니티(Unity), 코로나(Corona), 립GDX(LibGDX)같은 라이브러리를 활용해 개발하기 시작했다. 이들은 라이브러리의 인스트럭션만큼 C 코드를 작성하지 않는다. 우리의 즐기는 게임들이 자존심을 걸고 제작되지 않고 똑같은 엔진을 달고 찍혀나왔다는데 실망해야 할까? 오히려 대부분의 개발자는 그 세부내역과 씨름하지 않아도 돼서 한숨 돌리고, 게임 플레이, 나레이션, 캐릭터, 아트 부분에 집중할 수 있게 됐다.

뜬다: 단일-페이지 웹 앱
진다: 웹사이트


웹 페이지가 고정 텍스트와 이미지로 가득 찼던 시절을 기억하는가? 모든 정보를 웹 사이트라고 불리는 별개의 웹 페이지의 네트워크 안에 모두 담는 게 얼마나 간편하면서도 진기한 일인가. 새로운 웹 앱들은 컨텐츠로 채워진 대규모 데이터베이스의 얼굴이다.

웹 앱이 정보를 원할 때는, 그 정보를 데이터베이스에서 끌어와 로컬 몰드에 쏟아 붓는다. 웹 페이지를 구축하는데 필요한 모든 웹 기타요소들로 데이터를 교정 볼 필요도 없다. 데이터 레이어는 프레젠테이션과 포매팅 레이어와 완전히 별개다. 여기에다 모바일 컴퓨팅의 부상 역시 또 하나의 요소다: 앱처럼 작동하는 단일의 호응적으로 설계된 웹페이지는 앱스토어의 모든 혼잡으로부터 벗어나기 안성맞춤이다.

뜬다: 모바일 웹 앱
진다: 네이티브 모바일 앱


어떤 모바일 컨텐츠에 대해 훌륭한 아이디어가 있다고 가정해보자. 그 아이디어를 기반으로 iOS, 안드로이드, 윈도우 8, 어쩌면 블랙베리 OS까지 별개 버전으로 개발할 수 있을 것이다. 그 각 OS마다 다른 언어로 작업하는 별개의 팀이 필요하다. 그리고 각각 플랫폼의 앱스토어마다 앱이 사용자들에게 모습을 드러낼 수 있게 되기까지 엄청난 노력이 들어간다.

아니면 그냥 하나의 HTML 앱을 만들고 이를 모든 플랫폼에서 실행되도록 웹사이트에 올려도 된다. 만약 변경사항이 있더라도 앱스토어로 가서 빠른 검토와 버그 수정을 요청할 필요도 없다. 이제 HTML 레이어가 더 빨라지고 있으며 더 빠른 칩에서 실행됨에 따라, 이런 접근방식은 더 복잡하고 상호 소통적인 앱에서도 네이티브앱과 경쟁할 수 있게 되었다.


뜬다: 안드로이드
진다: iOS


불과 몇 년 전만 해도 이런 말을 애플스토어를 보고 이런 말을 할 수 있었을까? 시대는 바뀐다. 아이폰과 아이패드가 애플의 풍부하고 세련된 유저 인터페이스를 선호하는 열성 팬들을 계속 보유하게 만들고 있지만, 단순 판매량만 비교하면 안드로이드가 점점 더 늘어나고 있다. 안드로이드 휴대폰이 전체 판매량의 70%를 넘어선다는 보고도 있다.

이유는 단순하다. 가격 때문일 것이다. iOS 기기들이 높은 가격대를 유지하는 반면, 안드로이드 기기들은 막대한 경쟁으로 인해 가격대가 낮게 형성되었고, 태블릿같은 경우 애플 제품의 1/5 가격대도 있다. 그만큼의 가격경쟁력의 매력이 있다.

하지만 또 다른 요소는 오픈소스의 효과일 것이다. 누구든지 시장에서 겨룰 수 있게 됐고 실제로 그렇다. 큰 안드로이드 태블릿도 있고 작은 태블릿도 있다. 안드로이드 카메라와 심지어 안드로이드 냉장고도 있다. 누구도 혁신에 대해 구글에 문의할 필요가 없다. 아이디어가 있으면 그냥 실행하면 된다.

뜬다: GPU
진다: CPU


소프트웨어가 단순하고 설명이 깔끔하게 한 줄로 표시되었을 때에는 CPU가 어려운 작업을 수행했기 때문에 컴퓨터의 핵심이었다. 이제 비디오 게임들에는 병렬로 실행되는 확장적인 그래픽 루틴으로 가득 채워져 있는데, 비디오카드가 그 실행을 담당한다. 멋진 비디오카드에 500달러, 600달러 이상씩 쓰기도 쉬운데, 몇몇 심각한 게임광들은 그 이상도 쓴다. 이는 기본형 데스크톱 가격의 두 배가 넘는 금액이다. 게이머들만 GPU 카드를 자랑하는게 아니다. 컴퓨터 과학자들도 요즘에는 많은 병렬 애플리케이션을 변환시켜 GPU상에서 수백 배 빠르게 실행시킨다.

뜬다: GitHub
진다: Resumes


물론 중학교 체스 동아리 부회장같은 경력을 포함시켜 화려하게 꾸며진 이력서로 그 사람에 대해 알 수 있을 것이다. 하지만 누군가의 실제 코드를 읽는 것은 훨씬 더 풍부하고 유익하다. 유용한 메모를 남겨 놓았나? 별 쓸데없는 걸 작게 나누는데 너무 많은 시간을 허비했나? 확장을 위한 실질적 아키텍쳐가 있나? 이런 모든 질문들에 대한 궁금증은 코드를 보면 풀린다. 이는 오픈소스 프로젝트 참여가 점점 구직에 중요해지고 있는 이유이기도 하다. 상용 프로젝트에서 코드 공유는 어렵지만, 오픈소스 코드는 어디든 갈 수 있다.

뜬다: 임대 (Renting)
진다: 구매 (Buying)


아마존(Amazon)이 추수감사절 쇼핑기간 동안 컴퓨터와 전자제품 판매치를 공개했을 때, 아마존은 그들의 자랑할만한 클라우드 거래 내역은 포함시키지 않았다. 얼마전만해도 회사들은 그들 자체 데이터센터를 마련해 그들이 구매한 컴퓨터를 구동할 자체 직원을 채용했다. 이제 회사들은 컴퓨터, 직원, 심지어 소프트웨어까지도 시간 별로 임대한다. 어느 누구도 구매하는 번거로움을 원하지 않는다. 웹사이트가 소문이 나고 클릭 별로 모든 가격이 매겨진다는 것을 인식할 때까지는 다 좋은 아이디어다. 이제 아마존이 클라우드를 드론으로 배달하는 방법만 찾게 된다면, 이 트렌드가 본격화될 것이다.

뜬다: 웹 인터페이스
진다: IDE


오래 전, 사람들은 명령행 컴파일러를 사용했다. 그리고 누군가 이를 편집기 등의 도구와 통합해 IDE를 만들어냈다. 이제 IDE의 시대마저 작동중인 시스템 코드 편집까지도 가능한 브라우저 기반 툴에 의해 대체되고 있다.

예를 들어 워드프레스(WordPress)의 작동 방식이 마음에 들지 않는다면, 워드프레스의 내장 편집기를 사용해 즉석에서 코드를 수정할 수 있다. 마이크로소프트의 애저(Azure)는 자바스크립트 글루 코드를 자체 포털에 바로 쓸 수 있게 지원한다. 이런 시스템들은 최선의 디버깅 환경을 제공하지는 않으며, 생산 코드 편집에 따른 위험성도 존재하지만, 아이디어 자체는 관심 있게 볼 필요가 있다.

뜬다: Node.js
진다: JavaEE, PHP, 루비 온 레일즈


서버 세계에서는 언제나 운영체제가 프로그래머들의 모든 고집불통, 비효율적, 혹은 방종한 행태까지도 마음껏 할 수 있게 해주는 스레드 모델을 잘 다뤄왔다. 바보 같은 루프나 낭비적인 소비 연산 코드라도 운영체제가 스레드 사이의 변환으로 성능 균형을 맞췄다.

그때 Node.js는 프로그래밍의 자바스크립트 콜백(Callback) 모델과 함께 발맞췄고, 코드가 한때 알림 상자에서만 사용되었던 장난감 언어(Toy Language)에서 가능하게 되어 기대했던 것보다도 더 빠르게 실행되었다. 갑자기 새로운 스레드 생성의 간접비용이 명백해지고, Node.js가 떠올랐다. 프로그래머들이 제대로 행동하지 않을 때 문제가 발생하지만, 그 책임감은 대부분 긍정적으로 작용하게 된다. 자원 제약을 프로그래머에게 분명하게 하는 것이 보통 더 빠른 코드 생성을 가져온다.


Node.js 역시 브라우저와 서버 사이의 조화 제공으로 혜택을 받는다. 양쪽에서 동일 코드가 실행되어 개발자들의 기능 사용과 복제가 쉬워진다. 그 결과 Node.js 레이어는 인터넷에서 가장 뜨거운 화제가 됐다.

뜬다: 해커스페이스
진다: 대학


4년간 25만달러까지 내는 대학도 있다. 어떤 곳은 미리 큰 할인으로 월 50달러만 받는다. 어떤 대학은 미식축구 경기장, 총장을 위한 멋진 저택, 호화스러운 기숙사, 4색 잡지 등에 돈을 쓴다. 어떤 대학은 3D 프린터, 오실로스코프, 납땜 인두 등을 산다.

해커스페이스(Hackerspaces)는 대학 산학 단지의 막대한 간접비용 없이 혁신을 육성하고 있다. 이들은 관료제나 에머슨(Emerson)이 말한 틀에 박힌 “편협한 고정관념” 없이 창업을 확산시키고 부를 쌓는 사회적 네트워크를 만들고 있다. 강좌들은 한 학기 내내 끌지 않는다. 학생들은 배움을 위해 일년 전에 입학 원서를 낼 필요가 없다. 해커스페이스의 즉각적인 특성은 빠르게 움직이는 기술 세계에 더 잘 맞는다. 


editor@itworld.co.kr


출처 : http://www.itworld.co.kr/news/85553?page=0,0


오역이 많으나 읽어볼 만한 기사라고 생각한다.

특히 벌써 하둡이 진다는 말이 인상깊었다ㅋㅋ 

꽤 주목받는 기술이라 그래도 조금은 오래가지 않을까 했는데.


by kelicia 2014. 6. 6. 17:26