기술융합

1. 안나 카레니나의 법칙

  • 행복한 가정은 모두 엇비슷하고, 불행한 가정은 불행한 이유가 제각기 다르다.
  • 즉, 성공한 신사업은 모두 엇비슷하고, 실패한 창업아이템은 이유가 제각기 다르다.
  • Uncertainty of NPD

2. Accelerated NPD

  • 신제품을 개발하는 방법론이 Stage Gate를 사용한다.
  • 즉, 컨셉, 개발, 생산/검증, 출시, 성공의 각 단계가 존재하고 이를 넘어가기 위해서는 해야할 일과 충족시켜야 할 일을 수행하였을 때 넘어가게 된다.
  • 세계 일류 기업들의 경우에는 7.5 대 1
  • 국내 이동통신사 서비스의 경우에는 25 대 1의 겅공활률을 가진다.
  • Google 'Accelerated Process', FFE는 시행착오를 최대한 많이 겪게 되면 성공 할 확률이 높다.
FFEE, Accelerated Process를 활용한 프로세스 가속화
전통적 NPDP보다 디자인 변경 비용, Risk 감소하게 된다.
즉, 기술, 인문 융합의 중요성이 증대되고 있다.
사람을 이해하고 고객의 needs를 Catch하는 것이 가장 중요하다. 요구사항 분석이 정말 중요하다는 것이다.

3. Design Thinking

?다이버전트, 컨버전트

Undersatnd(Empathy(Design Ethonography) - Define) - Create(Ideate) - Deliver(Prototype - Test)의 과정으로 이루어진다.

  1. Empathy(공감하기)
    • 공감하기 위해서는 6하 원칙에 의해서 공감한다.(다이버전트(누가, 언제, 어디서, 무엇을), 컨버전트(어떻게, 왜))
    • 특별한 경우에 대해서면 추려내서 처리하도록 한다.(즉 10 X 10 X 10 이라고 하면 1000개나 되므로 핸들링 할 수가 없게 된다.)
    • 다이버전트한 과정이 이루어지게 된다.
    • Ex. 을지로 베스킨 라빈스에서 심야 시간에 매출이 기하 급수적으로 올라간다.
  2. Define(정의하기)
    • 왜 그러한 현상이 일어나는지 정의한다.
  • Create 와 Deliver은 빠르게 반복하면 된다.

4. Service Design

  • Service DEsign, Design Thinking 인문학적 접근의 중요성이 강조되고 있다.

5. 왜 인문학이 중요한가?

  • Drew Paust(하버드 대 총장)
  • 인문학은 모든 학문의 기본
  • 어떤 사물을 인식하면서 맥락 속에서 이해하는 것
  • 다른 사람의 관점에서 그 사람을 이해하려고 하는 과정
  • 우리가 찾아야 하는 가치는 Implicit Needs

명시적 니즈, Pain Point, Articulated Needs Vs 암묵적 니즈, Latent Needs, Unarticulated Needs

6. 무엇을 해야 할까?

  • Needs Finding
    • Focus on Qualitative Data
    • Guided by Rapport(고객의 의견을 듣기)
    • Ethnography(인류학의 한 분야)
      • Design Ethnography - 고고학에서 상상력을 가지고 과거의 것을 구성하는 과정이 Design Thinking 방법과 유사하다. 고고학 박사가 Creative 집단에서 리더 역할을 하는 이유!
  • Concept Creation
    • Brainstorming
    • Bodystorming
    • 다음 단계는?
      • Brain Squeezing
      • Visual Thinking

7. 기술 - 인문 융합의 사례

  • Unix Take out
  • 기존 사용방식에서 예외적으로 사용하는 것이 implicit needs일 경우가 높다.

Q & A

  1. 정량적 접근(알고리즘, 빅데이터)를 통해서 사용자의 니즈를 파악할 수 있는데 굳이 Design Thinking이 필요한 이유가 있나?
    • 정성적인 이해가 없으면 정량적 접근도 어렵다.

컴파일 언어 VS 스크립트 언어

1. 컴파일 언어

  • 사람이 작성하는 코드는 사람이 이해하기 쉽게 만들어진 고급 언어(high-level language)이다. 이를 컴파일을 통해서 컴퓨터가 이해 할 수 있는 저수준 언어로 바꾸게 된다. 즉, 컴파일 언어란, 사람이 작성한 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸기 위해서 컴파일이라는 과정이 필요한 언어를 말합니다. 이와 같은 언어의 종류에는 C, C++, Java가 있습니다. 소스코드 -> 컴파일 -> 머신코드(기계어)
    • 장점 소스 코드를 작성하는 과정에서는 변환 과정이 작동하지 않기 때문에 빠르게 소스코드를 작성할 수 있다는 장점이 있습니다.
    • 단점 프로그램을 실행시킨 뒤 bug가 발생하게 되면, application 실행을 종료하고 source 코드를 수정 한뒤 다시 application을 실행시켜 수정 된 부분을 확인해야 하는 번거로움이 있습니다.

2. 스크립트 언어

  • 스크립트 언어는 Compiler가 없으며, 이와 같은 과정도 불필요 합니다. 소스코드에 의존적인 언어 입니다. 변수타입을 선언하지 않습니다. Perl, PHP, Python, Ruby와 같은 언어들이 스크립트 언어 입니다.
    • 장점 bug 수정에 있어서 application을 restart하는 것이 아니라 reload를 통해서 확인이 가능하다는 장점이 있습니다.
    • 단점 실시간으로 interpreter를 통해서 기계어로 번역되는 과정을 거치기 때문에 시스템이 느려지게 됩니다. 스크립팅 언어의 속도를 높이기 위한 방법이 있습니다. code caching과 persistent interpreter가 있습니다.

효율적으로 일을 처리하고 생산성을 높이기 위한 방식으로 우리는 일정과 할일을들을 계획합니다. 그렇다면 지금까지 많이 알려진 방식들을 무엇이 있을까요? 한번 살펴 봅시다.

GTD(Getting Things Done)이 무엇인가?

David Allen에 의해 개발된 시간 관리 방식이다.

Task나 Projects를 머리 속에 기억하는 것이 아니라, 외부 Database에 옮긴다.

할 일을 상기 시키는 것이 아니라, 행위를 수행하는 것에 더욱 초점을 맞추게 된다.

그렇다면 어떠한 과정으로 우리는 이를 수행하게 될까요? 5계의 단계가 있으며,

Capture, Clarify, Organise, Reflect, Engage의 과정이 있습니다.

각각의 단계 별로 특성을 살펴 보겠습니다.

1. Capture

Task, Project등 모든 것들을 수집하고 이를 Inbox에 넣어 둬라. 여기서 InBox는 Voice Recorder, 종이, OmniFocus 같은 것들을 사용하면 된다.

2. Clarify

저장된 Task나 Project가 의미하는 것을 명료화하라. 이것이 실행 가능한 것인가? 그렇지 않다면 없애거나 참고용으로 사용한다. 그러한 행위가 2분이하로 걸리는 것이라면 지금 당장 실행하라. 그렇지 않다면 시스템에 저장한다.

3. Organise

이는 Projects, Contexts가 있습니다. Project는 수행 하게 될 일련의 과정들을 말하고, 이를 완료 했을 때 우리는 이를 Done이라고 부른다. Contexts는 물리적인 것입니다. 예를 들어서, 컴퓨터, 장소와 같은 것이다. 즉, Task, Project별로 유목화 하고 이와 관련있는 물리적 맥락(컴퓨터, 장소)를 함께 리스트화 한다.

4. Reflect

주 단위로 당신이 작성한 목록들을 확인하고, 제거하고, 업데이트한다. 여기서 중요한 것은 여러분의 할 일들로 가득차 있는 여러분의 마음을 한결 더 쉽게 내려 놓도록 하는 것이다.

5. Engage

실행할 수 있는 일들을 실행하고, 다음 수행해야 할 목록들을 작성합니다.

GTD데 대해서 더 많이 알고 싶으신 분은 앨런의 책을 보는 것도 추천드립니다.

데이터의 기본 종류에는

  • Contiguous data structures는 연속적으로 또는 인접한 메모리 섹터에 데이터를 저장하는 것을 의미한다. 이와 같은 예로는 Array, Heaps, Matrices, Hash table등이 존재합니다.
  • Linked data Structures는 Pointers에 의해 묶여 있는 메모리의 구분된 섹터로 구성됩니다. 예들은 리스트, 트리, 그래프를 포함합니다.

Contiguous data structures

  1. Arrays

가장 단순한 형태인 선현적인 Array이는 1차원적인 array입니다.

이와 같은 형태입니다. 각 element는 ai라는 형태를 띄게 되며 여기서 i는 정수 값으로서 0~n까지의 값을 가지게 됩니다. 고차원적인 array이는

와 같은 형태를 가지게 됩니다. 여기서의 aij는 i는 row의 값을 j는 column의 값을 가지게 됩니다.

스위프트에서 array를 선언할 수 있는 방법은 3가지가 있습니다.

  1. var array1: Array = [1,2,3,4,5]
  2. var array2: [Int] = [1,2,3,4,5]
  3. var array3 = [1,2,3,4,5]

와 같은 방식으로 배열을 정의할 수 있습니다. 3번째와 같은 방식은 타입을 추론하는 것으로 compile 단계에서 여러분이 입력한 값의 타입을 추론하여 타입을 결정하게 되는 것입니다. 3번째와 같은 방식을 우리는 주로 사용하게 될 것입니다.

지금까지는 1차원적인 Array이였다면 이제는 고차원적인 array를 한번 만들어 보겠습니다.

간단합니다. array를 사위 array로 묶어 주면서 만들어 주면 됩니다. 예를 들어서..

  • var array4 = [[1,2],[3,4],[5,6]]

와 같이 만들어 주면 됩니다.

인자 추출하기

var myIntArray = [1,2,3,4,5] 와 같이 정의 했고 우리가 만약 index값을 알고 있다면 이를 쉽게 추출할 수 있습니다.

myIntArray[1]

또는 for - in loop를 통해서 전체 값을 순환 할 수도 있을 것입니다.

for element in myIntArray { print(element) }

특정 범위의 인덱스 값을 가져올 수도 있습니다.

var someSubset = myIntArray[2...4] print(someSubset)

2차원적인 array를 생성해 보도록 하겠습니다.

var my2DArray = [[1,2],[3,4],[5,6]]

var element = my2DArray[0][0] var element2 = my2DArray[1][1]

Adding elements

다양한 method를 통해서 adding 할 수 있는데 먼저 뒤에 붙이는 것, 특정 index에 넣는 것을 보겠습니다.

var array2 = [1,2,3,4,5] array2.append(7) print(array2) array2.insert(6, at: 5) print(array2)

elements 지우기

이미 선언한 array2에서 element를 지워보도록 하겠습니다.

array2.removeLast() print(array2)

특정 인덱스의 element를 지울 수도 있습니다.

array2.remove(at: 5) print(array2)

'DataStructure' 카테고리의 다른 글

Array  (0) 2017.03.26

DataStructure를 왜 사용하는가?

Array를 사용하는 이유는 이렇게 생각해 볼 수 있다. 예를 들어서, 우리가 관리해야 하는 data들이 많아 지게 되면 이를 관리하기 위한 방법을 생각하게 될 것이다. 이를 쉽게 관리하기 위해서 우리는 유사한 데이터들을 특정한 조건으로 모으는 과정을 거치게 될 것이고 분류된 하나의 덩이리가 또 다른 조건으로 분류되는 과정을 거치게 되고 이와 같이 데이터를 묶는 방식에 대한 개념을 우리는 데이터의 구조화라고 합니다.

쉬운 예를 들어 보겠습니다. 학교를 예로 들어보면 학생이 3명이었던 시골 학교가 인근에 산업 시설이 들어서게되고 고속도로와 같은 인프라가 형성되어 학생들의 수가 500명으로 늘어 났다고 생각해 봅시다. 학교측의 입장에서는 학생들을 관리하기 위해서 동일한 나이의 학생들을 먼저 "학년"이라는 기준으로 묶고, 같은 학년의 학생들 중 유사한 각반 별로 학력 수준이 고루 퍼질 수 있도록 "반"을 배치하도록 합니다. 각 반에서는 학생들 고유의 "번호"를 부여하여 선생님의 입장에서 더욱 관리하게 쉽게 되겠지요. 이와 같은 것을 우리는 데이터를 구조화 했다라고 생각할 수 있는 것입니다.

이와 같은 데이터를 구조화하는 방법들에 대해서 우리는 배울 것입니다. 준비 되셨으면 이제 시작해 보도록 하겠습니다.

Array

데이터를 구조화하는 방법 중 Array라는 것이 있습니다. Java라는 언어를 기준으로 우리는 학습할 것이기 때문에 Array를 만드는 방법 부터 살펴 볼 필요가 있습니다.

Int numbers1 = new Int[4];

numbers1[0] = 1;

numbers1[1] = 2;

numbers1[2] = 3;

numbers1[3] = 4;

용어를 먼저 설명해 보도록 하겠습니다. Element, Index, Value가 가지는 의미는 우리가 알 고 있어야 합니다. Index는 앞선 예에서 말을 해보면 학생들의 번호라고 생각하면 됩니다. Value는 그렇다면 학생들의 이름이라고 생각하면 됩니다. 여기서 더 나아가면 index와 value가 묶여 있는 것을 하나의 element라고 생각하시면 됩니다. 이제는 Array를 조금 더 쉽게 만들어 보도록 하겠습니다.

Int numbers2 = new int[]{1,2,3,4,}; 또는 Int numbers3 = {1,2,3,4}; 와 같이 만들 수도 있습니다.

Array와 함께 쓰이는 반복문

배열의 존재 목적은 데이터를 구조화해서 반복적인 일을 컴퓨터에게 일임하기 위해서 우리는 코딩이라는 것을 하게 됩니다. 반복문 중 while문과 for - in 문에 대해서 알아 보도록 하겠습니다. while(numbers1.lenght > i) { System.out.println(numbers1[i]); i++1; } 와 같이 사용할 수도 있고, 동일한 결과값을 가지는 for(i=0;i>numbers.1lenght;i++){ System.out.println(numbers1[i]); } 와 같이 사용할 수 있습니다.

Array의 장, 단점

Array는 생성될때 크기가 정해지게 되므로 index값을 넘어서는 수를 호출하게 되면 오류를 발생시키며, Element의 더이상의 추가도 불가능하다는 단점을 가지게 됩니다. 또한, 다른 데이터 구조에 비해서 기능도 현저히 작은 편입니다. 하지만 우리는 이것을 왜 쓸까요? 기능도 상대적으로 적고, 활용가능성도 제한적이지만 이러한 특징들을 다시 작고 가볍다는 특징, 더불어 메모리를 적게 차지한다는 장점을 가지게 되어, 부품의 최소단위로서의 활용도를 극도로 높이게 된다는 장점을 가집니다.

다음으로 List에 대해서 배워 보도록 하겠습니다.

'DataStructure' 카테고리의 다른 글

Fundamental data structures  (0) 2017.03.27

+ Recent posts