수준이 낮네. shebang!

byHAJUNHOMay 07. 2020

shebang

뼈대, 골격, 오두막집을 뜻한다. 3D 분야 에서의 와이어 프레임을 연상하면 되겠다.

 

https://www.youtube.com/watch?v=w5S5dWfJPn4

유튜브는 링크 자체가 저작권 표시므로 부연 설명을 달지는 않겠다.

 

웹 사이트 와이어 프레임은 웹 사이트의 설계도를 말한다. 블루프린트, 청사진도 같은 말이다.

https://en.wikipedia.org/wiki/Website_wireframe

Website wireframe - Wikipedia

en.wikipedia.org

 

 

블루프린트는 3D 엔진인 언리얼 엔진의 프로그래밍 언어기도 하다.

https://docs.unrealengine.com/ko/Engine/Blueprints/GettingStarted/index.html

블루프린트 소개

블루프린트가 처음이신 분들에게 블루프린트란 무엇이며 어떠한 것을 할 수 있는가에 대한 하이 레벨 개요입니다.

docs.unrealengine.com

 

청사진, 블루프린트, 와이어프레임, 설계도, outline, shebang 등으로 떠오르는 무엇인가가 있다면 그것은 순서상으로 먼저 해야 할 일일 것이다.

 

시간적으로 먼저 해야 할 일은 보통 계층을 나누었을 때 가장 기초적인 부분을 뜻하는 경우가 많다. 소프트웨어 분야에서 가장 먼저 해야 할 일은 초급 편에서 말한 것과 같이 개발 목표를 정하는 요구사항 분석이다.

 

based 위키피디아

 

만약, 요구사항이 김밥과 같이 간단한 요리를 만드는 것이라고 해 보자. 간단하게 생각하면 집에 있는 김에다가 밥을 싸면 될 것이다. 그러나 간단하지 않은 경우도 있다. 거대한 스포츠 경기장에 온 모든 관중들에게 김밥과 같이 간단한 식사를 제공해야 하는 요구사항이라고 생각해 보자. 혼자서 해도 되지만 김밥이라는 것은 유통기한이 짧기에 힘들다. 혼자서 해도 된다는 뜻은 준비 기간이 1년 이상이고 혼자서 할 수 있는 사람이 로봇을 만들 정도로 기계에 능통하여 대량의 김밥을 만드는 기계를 만들 수 있는 경우를 말한다. 또한 건축 설계, 시공에도 능통하여 경기장 구조를 변경하고 관중들에게 음식이 자동으로 배달될 트레일까지 만들 수 있는 경우를 말한다. 창의성도 뛰어나 트레일이 아니라 드론 혹은 다른 방법으로 배달될 수 있도록 동선을 짜고 프로그래밍에 능통하여 이 모든 것이 유기적으로 신속하게 이루어지도록 할 수 있는 경우를 말한다. 이런 상상력을 펼치는 것보다 보다 현실적인 대안을 생각하면, 여러 사람과 일을 나누는 것이다. 우선, 업무를 나누었을 때 가장 먼저 해야 할 일을 세분화한다면 정말 고려할 것이 많다. 먼저 김밥 만드는 방법을 배우는 것일 것이다. 그리고 관중들이 원할 김밥 메뉴를 정하고 알레르기 있을 사람들에게 그 메뉴를 어떻게 전달할 지도 고려해야 한다. 직접 김을 생산하지 않고 공수해 온다고 했을 때, 유통기한과 비용을 고려해야 하며, 김을 사 오는 것과 밥을 짓는 것에 순서를 매기는 것도 필요하다. 원재료 수송까지의 거리도 일의 순서를 매기는 것에 들어갈 것이다. 단순히 사람들에게 김밥을 먹이는 일인데 동시 다발적으로 김밥을 배송하더라도 정말 김밥이 옮은 선택인지 정당성을 따져봐야 한다. 모두의 식사 시간을 동일시하는 것에 대한 토론도 진행해 봐야 한다. 복잡하게 생각하다 보면 너무 많은 생각을 하게 된다.

 이런 문제를 해결하기 위해 바로 "통찰력"이 필요하게 된다. 처음 요구사항을 생각해 보자. 

 

거대한 스포츠 경기장에 온 모든 관중들에게 김밥과 같이 간단한 식사를 제공해야 함

 

거대한 스포츠 경기장 주변에 먹거리를 파는 곳은 많을 것이다. 없다면 허가해 주면 된다. 그리고 경기장 티켓을 인쇄할 때 먹거리를 교환할 쿠폰을 넣어 찍어내면 된다.

 

작은 요구사항이 아니라 큰 요구사항이 있을 때 그 요구사항을 충족하는 시스템이 나누어져 있으면, 솔루션을 만들기 쉽다. 이 때문에 환원주의, WBS, DP, 분할 정복 등에 대해 이야기했다.

 

요구사항을 충족시키는 소프트웨어 개발을 잘하기 위한 소프트웨어 아키텍처 디자인 패턴 중

https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1 e9013

10 Common Software Architectural Patterns in a nutshell

Ever wondered how large enterprise scale systems are designed? Before major software development starts, we have to choose a suitable…

towardsdatascience.com

 

Layered pattern은 바로 분할이라는 해결 방법론을 이야기한다. 패턴, 해결 방법론, 정형화된 알고리즘 등 다양한 용어를 붙일 수 있겠지만

 "천리 길도 한 걸음부터" 

와 조금은 다른 느낌으로 무엇인가를 미리 나누어 두는 말은 많다."티끌 모아 태산", "작은 고추가 맵다", "구슬이 서 말이라도 꿰어야 보배다" 등 분할된 느낌과 비슷한 여러 말 중 "십시일반"과 "백지장도 맞들면 낫다"는 말이 이 부분과 들어맞겠다고 해야겠다. 트렌디한 용어로는 "마이크로 서비스"가 있고, 초급 편에 나왔던 기법을 정리하면 간단히 API로 마무리가 된다. 그 크기에 따라 라이브러리, 컴포넌트, 서비스 등의 용어를 써도 소프트웨어 아키텍처 패턴에서 레이어드 패턴이란  간단히 

 일을 잘 나누는 것

으로 생각하면 되겠다. 프로그래머에게 디자인 패턴이란 보통 모듈 패턴을 말하고 그 상위에 아키텍처 패턴이 있다. 시스템 패턴이 없는 이유는 시스템은 만들어진 프로그램을 플레이스테이션에서 돌릴지, PC에서 실행할지, 닌텐도에서 즐기도록 만들지 결정하는 것인데 이것이 패턴화 되기는 어렵다. 아주 경험 많은 프로그래머, 아키텍트, 시스템 엔지니어(물론, 한 사람)이라면 나름의 패턴이 있을 것이다. 그러나 시스템을 결정 지어야 하는 큰 프로젝트의 경우 영업, 마케팅, 회계, 인사, 재무 등 회사의 모든 부서가 비용을 고려해서 토론의 형태로 결정되어야 한다. 

 

 무엇인가를 나눌 때 layer 혹은 level로 표현하는데 한국어로 표현하면 계층, 수준으로 번역이 된다. 참 재미있는 일은 OSI 7 계층처럼 "계층"으로 표현될 때는 별 문제가 없는데 이게 "수준"으로 변경되니 상위단 프로그래머의 경우 "고수준"에서 설계와 구현을 생각하게 된다. 필자가 책을 내고 글을 써야겠다는 결심을 한 것도 인터넷에서 마치 응용단 프로그래머들이 모든 것을 만드는 것처럼 이야기되고, 삼성전자에서도 무선사업부의 많은 부서들이 마치 삼성전자의 모든 일을 하는 것처럼 자만심을 가진 것을 알게 되어서였다. 물론, 휴대폰을 만들어서 돈을 많이 버는 것은 사실이나 그 가격 경쟁력은 부품 산업에서 나오는 것이다. 

 

 고객과 맞닿아 있는 고수준 위치의 개발자들이 돈과 힘을 가지는 것은 요구사항에 대한 솔루션 개발과 맞닿아 있기 때문이다. 다만, 아이러니 한 점은 프로그래머 커뮤니티 가 보면 웹 개발자, UI 개발자, HTML 개발자를 폄하하는 만화를 종종 접한다. 이 두 가지 모순을 접할 때, 보통 사람들이 생각하는 프로그래머의 자질은 정해진 목표를 잘 해결하고 요구사항을 얼마나 잘 충족하는지가 아니라 적당히 어려운 분야를 선택하는 것인 것도 같다. 이는 필자가 스타트업에 있을 때 같이 일하는 개발자가 수년 동안 만든 부분의 핵심 부분을 쉽게 설명해 주면 될 것을 그러지 않고 본인의 기술 영역을 지키는 것을 본 것을 시작으로 그 뒤에 만난 수많은 개발자들도 비슷한 스탠스를 취하는 것을 보고 더 확실히 느꼈다. 오픈 소스를 썼으면 말하면 될 텐데 굳이 본인이 만들었다고 하는 것도 재미있다. 15년 전 삼성전자 소프트웨어 멤버십 면접관으로 있을 때는 본인 소스 열어 보라고 하여 특정 부분을 설명하라고 했었는데 그때 들통난 지원자의 얼굴 표정들을 지금도 여전히 보고 있으니 한편으로는 재미있다. 또 한 개발자 커뮤니티나 강의에 대해서는 고맙다는 댓글이나 반응이 없다. 이 단락에서 필자가 경험하고 말한 모든 것에 대해서 어떤 평가 없이 말하고 싶은 게 있다면, 

 "그냥 순수하게 새롭게 배우는 것을 즐기고 가감 없이 커뮤니케이션하고 오늘 내가 가르쳐 준 것도 제자에게 다시 새롭게 배울 자세가 프로그래머에게 필요하다는 것이다."

 

그리고 늘 저수준(low level) 프로그래머에게 고마운 마음을 가지고 있어야 하겠다. 그리고 두벌실 키보드처럼 잘못된 키보드지만 이미 저변화된 저수준(low level)이라는 용어를 쓰더라도 base layer, foundation layer, parent layer 임을 간과해서는 안 되겠다. 부모님 은혜를 잊어서는 안 되지 않겠는가?

.

.

.

 

이 쯤되면 어느 수준이 중급 프로그래밍인지 고민이 된다. 일상의 부분도 프로그래밍할 수 있다면 바로 중급 프로그래머라고 할 수 있겠다. 필자가 쓰는 프로그램 중에 iPhone에서 python 3.6 코드를 실행할 수 있게 해 주는 프로그램이 있다. Pythonista 해당 프로그램에서 볼드체로 된 2 부분을 바꾸면 아래와 같이 터치했을 때 저녁 메뉴가 랜덤 하게 나오도록 할 수 있다.

 

 

사실 중급 편에서 일일이 소스 설명을 하는 것은 이상하기도 하다. 물론, 사다리 타기로 만들지 않고 기본 예제를 조금 수정해서 원하는 바를 이룬 것도 우습기도 하다. 초급 편에서 추상화 단계를 설명하며, 왜 전등을 켜는데 전기의 원리부터 시작해서 모든 원리를 설명하지 않았는지를 따져 본다면 쉽게 알 수 있겠다. 

 

from scene import *

import random

import math

import ui

from colorsys import hsv_to_rgb

A = Action

FONT_NAME = 'Ubuntu Mono'

if min(ui.get_screen_size()) > 750:

                    FONT_SIZE = 100

else:

                    FONT_SIZE = 100 #was 30

SPACING = FONT_SIZE * 0.45

hl = ['hamberger', 'Korean sausage soup', 'chinesestyle spicy soup', 'vietnam noodle', 'hot spaicy noodle soup with sea food','korean noodle with gimbap']

MESSAGE = random.choice(hl)

class MyScene (Scene):

                    def setup(self):

                                        self.hue = 0.0

                                        self.prev_touch = None

                                        self.letter_index = 0

                                        self.background_color = '#262b30'

                                        self.instructions = LabelNode('my dinner', ('HelveticaNeue-Bold', 24), position=self.size/2, parent=self)

 

                    def did_change_size(self):

                                        if self.instructions:

                                                            self.instructions.position = self.size/2

                    def touch_began(self, touch):

                                        #if self.instructions:

                                                            #self.instructions.run_action(Action.fade_to(0, 1))

                                                            #self.instructions = None

                                        self.prev_touch = touch.location

 

                    def touch_moved(self, touch):

                                        d = touch.location - self.prev_touch

                                        if abs(d) < SPACING:

                                                            return

                                        letter_pos = self.prev_touch + 0.5 * d

                                        self.prev_touch = touch.location

                                        letter = MESSAGE[self.letter_index]

                                        self.letter_index += 1

                                        self.letter_index %= len(MESSAGE)

                                        if not letter.strip():

                                                            return

                                        a = -math.atan2(*d) + math.pi/2

                                        font = (FONT_NAME, FONT_SIZE)

                                        color = hsv_to_rgb(self.hue, 0.65, 1)

                                        label = LabelNode(letter, font=font, position=touch.location, color=color)

                                        label.rotation = a

                                        self.hue += 0.03

                                        label.run_action(A.sequence(

                                                            A.move_to(letter_pos.x, letter_pos.y, 1.2, TIMING_ELASTIC_OUT),

                                                            A.wait(3),

                                                            A.scale_to(0, 0.25),

                                                            A.remove()))

                                        self.add_child(label)

                                        for i in range(5):

                                                            p = SpriteNode('shp:Spark', position=letter_pos, color=color)

                                                            p.blend_mode = BLEND_ADD

                                                            r = max(FONT_SIZE, 50)

                                                            dx, dy = random.uniform(-r, r), random.uniform(-r, r)

                                                            p.run_action(A.sequence(

                                                                                A.group(

                                                                                                    A.scale_to(0),

                                                                                                    A.move_by(dx, dy, 0.5, TIMING_EASE_OUT_2)),

                                                                                A.remove()))

                                                            self.add_child(p)

if __name__ == '__main__':

                    run(MyScene(), multi_touch=False)

 

임베디드 분야에서 verilog를 했던 독자라면 brace 가 없는 띄워쓰기에 익숙할 것이고, 초급 편을 본 독자라면 고급언어라 세 가지 점을 제외하고 java 코드 리딩 능력으로 충분히 이해할 수 있으리라 믿는다. 

 

1. 생성자의 형태가 double underscore __ 로 시작되고 끝난다.

2. class 상속 키워드가 따로 없고 ()에 들어간다.

3. brace matches {} 대신 탭으로 function(def) 구분이 된다.

 

3번 때문에 오히려 가독성이 떨어져 보일 수도 있겠다 싶어 탭의 경우 1칸 스페이스로 표현되었다.

 

.

.

.

 

지금까지 다양한 생활 밀착형 파이썬 예제들로 큰 설명 없이도, 자연스럽게 C, JAVA, PYTHON까지 섭렵했으리라 생각된다. python 은 쉬운 언어가 아니라 C에서 더욱 추상화된 언어이다. 초급 편에서 복잡하게 함수 포인터를 공부했다면, 오히려 중급 편에서의 python은 그 함수 포인터를 편하게 쓸 수 있게끔 매크로화 시켰다고 보면 된다. 파이썬에서는 함수 포인터 형태로 전달 가능한 것(초급 편의 바로 그 '것', 객체)을 일급 함수라고 부른다. 메모리 전체를 뚱~ 떼서 작업할 수 있다는 점을 제외하고는 C보다 더 강력한 프로그래밍 언어이다. 이제 메모리 직접 컨트롤은 사실 운영체제 수준이나 시스템 전체를 아키텍팅하다 불가능한 상황에서의 프로토콜 전이로 메시지를 전달하는 경우 등을 제외하고는 쓸 일이 많이 없다. 처음 HTML5로 거대한 IT 회사들이 잠시나마 의기투합했던 것을 보면 python과 tensorflow가 여러 회사에서 환영 받을지도 모른다는 바램이 있다. 바랄 뿐이다. 필자 입장에서 각 회사는 결국 자신들이 주력으로 내세운 프로그래밍 언어에 하위 개념을 추상화시켜 API로 제공할 것이라 생각이라 좀 아쉽다.. 프로그래머의 입장에서 생각해보면, pythonista 에서도 데이터분석용 API가 돌아가도록 애플이 도와주어 프레임웍 API를 해당 회사에 제공해 주었으면 하는 입장이다. 물론, 그 권한은 iOS 자체를 위험하게 만들 수도 있으니 회사 자체를 인수하는 쪽으로 갈 것이라 생각한다.

 

또 미래를 볼 줄 모르는 누군가는 python이나 java, C++ 의 대표적인 IDE 인 pyCharm, Eclipse/IntelliJ/Android Stduio, Visual Studio 에 대해 이야기 하지 않고 마이너한 툴을 이야기 했다고 하여 욕하겠지.

'Blog History' 카테고리의 다른 글

240  (0) 2020.05.11
239  (0) 2020.05.11
237  (0) 2020.05.11
236  (0) 2020.05.11
235  (0) 2020.05.11

+ Recent posts