First Step

Wordbank

  1. Computer: 컴퓨터는 데이터 처리 기계다.

  2. Data: 모든 데이터는 숫자와 문자 데이터로 귀결된 후 0과 1로 변환되어 처리된다. 0과 1 데이터는 산술(사칙연산), 관계(크고 작고 같고), 논리(참 거짓) 연산으로 처리한다.

  3. Computer science: 컴퓨터 과학은 수학에 기초를 둔 과학의 한 분야로서, (정보 자체보다는) 정보의 수집, 전달, 축적, 가공 도구로 사용되는 계산(computation) 이론과 응용을 연구 대상으로 하는 학문이다.

  4. Computational Thinking: 컴퓨팅 사고는 소프트웨어 개발을 하기 전에 선행(precedence)으로 필요하다. 컴퓨터가 문제를 처리하는 방법을 이용하여 복잡한 문제를 효율적(단순하고 논리적)으로 해결하는 사고다. 컴퓨터와 인간의 사고의 가장 큰 차이점은 ‘아주 엄격함’이다. 컴퓨터는 인간보다 더 엄격하게 데이터를 다루고, 더 엄격하게 문제해결 절차(알고리즘)를 나눈다. ‘개념화(conceptualizing, 큰 그림 그리기) – 분해(decomposition, 작은 문제들로 쪼개기) – 추상화(abstraction, 공통적 특성 찾아내기 property & pattern recognition) – 알고리즘 - 병렬 처리(parallel processing, 문제해결을 병행적으로 하기) – 재귀적 사고(recursive thinking, 찾아낸 해법을 문제해결이 완전히 될 때까지 반복적으로 사용하기)’가 대표적 기술이다.

  5. 소프트웨어 개발: 소프트웨어 개발은 코딩이 전부가 아니다. 개발 과정에는 고객 요구사항 분석, 개발 계획, 아키텍쳐 설계(전체 구조논리 요소, 운영체제나 네트워크 등 다른 개념들 간의 논리적 상호관계 등을 생각해내고 정의하는 일), 상세 설계, 구현, 리뷰, 단위 테스트, 통합, 통합 테스트, 시스템 테스트, 인수 테스트, 배포, 유지 보수가 포함한다. 팀원 교육 및 세미나도 개발 과정에 포함되는 업무다.

  6. Data Structure: 자료 구조를 만드는 것은 소프트웨어 구조 설계의 핵심이다. 자료 구조는 단순히 데이터 구조만 정의하는 것이 아니다. 해당 자료 구조를 접근해서 처리해야 할 함수들도 포함한다. 그래서 함수 인터페이스 설계와 연결된다.

  7. Programming: 프로그래밍은 우리 생활에서 만나는 복잡한 문제를 해결하는 창의적 생각(알고리즘)을 컴퓨터(데이터 처리 기계)가 처리하도록 만들어 더 나은 세상을 만드는 일이다. 프로그래밍을 하려면 다음과 같은 최소한의 능력이 필요하다.

  • (1) 문제 해결 능력(알고리즘) - 문제 해결 능력이 가장 중요하다. 문제를 해결할 수 없으면, 프로그래밍 언어 구사 능력과 개발 툴 사용 능력은 소용이 없다.
  • (2) 프로그래밍 언어 구사 능력(알고리즘 표현 도구)
  • (3) 개발 툴 사용 능력(소프트웨어 개발에 필요한 프로그램으로 소프트웨어를 만드는 프로그래밍이나 데이터베이스를 구축하거나, 서버, 클라이언트등을 개발하는데 사용한다)
  1. Algorithm: 알고리즘은 논리적 수행 절차에 따른 데이터 처리를 통한 (정리된) 문제해결 절차다. 알고리즘(문제 해법)과 코딩은 분리할 수 없다. 좋은 알고리즘은 구현 가능성과 이익, 효율, 안정성이 극대화된 것이다. 구현할 수 없는 알고리즘은 개념상으로만 존재할 뿐이다. 구현이 힘든 알고리즘은 이득이 없다. 피보나치 수열을 구하는 알고리즘을 재귀적으로 만들 경우, 숫자가 조금만 커져도 계산 시간과 메모리 사용량이 엄청나게 늘어난다. 실익이 전혀 없다. 반대로, 개념없이 구현된 코드는 아무리 현란하게 짜여 졌어도 효율성과 안정성이 저하되고, 비용은 많이 들지만 효과는 떨어진다. 개념 없는 설계는 구조적 불안정을 만든다. 개념(알고리즘)과 기교(코딩)는 함께 가는 것이 이상적이다. 소프트웨어 개발의 핵심인 복잡성 관리도 고려해서, 적절한 균형을 찾아내야 한다. 문제를 어떻게 풀어야 하는 지를 알려주는 개념(알고리즘)은 구현(코딩) 앞에 선행되어 코딩의 방향을 제시하고, 구현은 개념에 대한 뼈대를 제공하고 구체화시켜 해결책을 현실화 시킨다.

  2. Principle of coding(코딩 원리):

  • 한 단계씩 실행(Step by step)
  • 조건부 실행(Conditional execution)
  • 반복 실행(Loop)
  • 묶어서 재사용(Function and all kinds of reusability - blocked and packaged codes to call and use repeatedly in everywhere)
  1. Coding: 코딩은 단순히 코드를 나열하는 것이 아니다. "복잡함에 대한 간결한 해답을 찾는 활동"이다. 코딩을 잘하는 사람은 간결한 코드로 주어진 문제의 해답을 찾는다. 간결한 코드(Simple Code)는 해야할 일만 찾아내서 하는 것이다. 반드시 필요한 코드만 남겨두는 것이다. 중복된 코드, 비슷한 코드, 불필요한 기능, 필요 없는 주석 등 필요 없다고 생각되는 코드는 과감하게 제거한다. 나중에 있을 변경을 위해 만든 코드도 최소화 한다. 그 이상은 낭비다. ‘그것만으로 족함’이 간결(Simple)이다.

품질은 복잡도를 어느 수준까지 줄일 수 있는가에 달려 있다. 복잡도를 관리하려면 올바른 문제 정의, 시스템 구성 요소 결정, 객체의 역할과 책임(Role & Responsibility) 정제, 객체 간의 적절한 협업, 작은 코드가 중요하다. 즉, 올바른 문제 정의와 설계(문제해결 역할과 책임을 나누는 일)다. 이 과정은 한 번에 하기에 힘들다. 코드로 구현되어 동작할 때까지 반복적으로 정제(Refinement)한다. 작은 코드는 줄 수를 말하지 않고, 복잡도를 낮추는 것과 연결된다. 코드와 실행 결로가 더 추가될수록, 복잡함은 증가하고 개발자 정신력은 한계에 이른다. 좋은 코드는 읽기 쉽게 작게(간결하게) 유지한 것이다. 작은 코드는 코드 이해, 테스트와 디버그, 변경, 유지 보수에 유연하다. 작은 코드는 간단하게 만들 수 있어서 인원도 적게 들고 관리도 수월하고 실패하더라도 작게 실패하고 비용도 적게 든다. 작은 코드를 만들려면 좋은 구조가 선행되어야 한다. 좋은 구조는 좋은 코드를 낳고, 좋은 코드는 좋은 성능을 발휘한다. 좋은 구조는 성능 개선도 쉽다. 올바른 문제 정의와 설계가 좋은 구조를 만든다. 좋은 구조는 "추상화(Abstraction), 캡슐화(Encapsulation), 계층화(Layering), 모듈화(Modularization)"등 좋은 요소를 갖는다. 이를 통해 작은 단위에서 가장 큰 단위까지 프렉탈처럼 일정한 패턴을 갖고 있어서 어느 수준에서 바라보더라도 아름다움을 갖는다.

큰 프로젝트는 기능을 나누어 작은 단위 프로젝트로 만들어 해야 한다. 단, 큰 틀을 먼저 만들고 작은 부분으로 나누어야 한다. 모든 것을 내부에서 만들려는 생각도 좋지 않다. 프로젝트에서 핵심 기술을 제외하고 범용 부분은 외부의 검증된 코드(최적화된 코드)를 사용하면 된다.

  1. 절차지향 언어: 절차지향 언어(procedure-oriented programming)는 연산, 대입, 판단, 입출력 등의 작업을 실행 절차(순서)를 지정해서 프로그램을 작성하는 방식이다. 원칙으로 쓰여진 순서를 따라 구문 요소가 실행되는 프로그램 언어인 COBOL, FORTRAN, C, Pascal, BASIC 등이 절차지향 언어다. 절차지향 언어는 문제 해결 순서와 절차 표현이 쉽다는 장점이 있지만, 모듈이 처리하는 데이터는 전혀 고려하지 않아서 현실 세계의 크고 복잡한 문제를 프로그램으로서 표현하는 것이 어렵다. 사실, 세상에 있는 모든 것은 객체이고, 객체들이 모여 ‘서로 상호작용’하며 작동한다는 현실 세계를 반영하지 못한다.

  2. 객체지향 언어: 객체지향언어는 현실 세계를 사람이 생각하는 방식으로 표현한다. 절차지향 언어는 흐름(Flow)을 중시 하지만, 객체지향 언어는 명확한 역할을 가진 객체들 간의 협업을 중시한다. 같은 목적이나 기능을 갖는 변수와 함수를 하나로 묶어서 객체(object)로 만들고, 그 객체들끼리 상호 통신하며 프로그램 전체가 작동하도록 한다. 객체지향이 등장한 이유는 모듈화로 ‘재활용’을 높이자는 의도에서 시작했지만, 사람이 사물을 대하는 태도와 유사하다. 세상이 돌아가는 모습과 유사하다. 모든 사물은 존재하는 이유, 목적, 쓰임새와 하는 일이 정해져 있다. 우리는 사물의 내부 구성을 모르지만, 그 사물을 이용해서 어떤 일을 처리할 수 있다. 우리는 어떤 결과를 얻기 위해 사물에 요청을 보낼 뿐이다. 그 일을 직접 담당하는 것은 사물이다. 사물(객체)는 자신의 내부를 우리(외부)에게 보여주지 않고 스스로 알아서 일 처리를 하고 결과만 알려준다. 객체지향 언어는 다양한 객체를 만들고, 객체들을 모아 하나의 모듈(컴포넌트)을 만든다. 그리고 여러 모듈들을 결합하여 모듈 간 연관성을 식별해 모델링하고, 이를 기반으로 소프트웨어를 완성한다. 객체지향 프로그래밍은 오류가 발생하면 프로그램 전체를 살펴보지 않고 각 객체를 살펴 수정하면 된다. 훨씬 효율적이다.

  3. HTML: 하이퍼텍스트 마크업 언어(HyperText Markup Language)는 웹페이지에서 콘텐츠를 ‘작성’하고 정의하는 데 사용한다.

  4. CSS: 작은 계단식 폭포 스타일 시트(Cascading Style Sheets)는 웹페이지 콘텐츠에서 동일한 속성을 가진 모양이나 표현을 ‘우선순위가 있는 연속 흐름 방식’으로 작성하는 데 사용한다. 같은 웹페이지라도 익스플로러, 크롬, 사파리 등에서 약간씩 차이가 있는 이유는 각 브라우저의 기본 CSS 차이 때문이다.

  5. HTTP: 하이퍼텍스트 전송 규약(Hypertext Transfer Protocol)은 HTML 문서를 웹(Web) 상에서 ‘전송’하는 데 사용한다.

  6. JavaScript: 자바스크립트(JavaScript)는 웹사이트나 애플리케이션 안에 특별한 상호 작용이나 동적 기능을 넣기 위한 목적으로 만들어졌고, 브라우저에서 실행되는 대표적인 객체지향 프로그램 언어다. 대부분 프로그램 언어는 ‘숫자’를 1급시민으로 취급하지만, 자바스크립트는 first-class function(함수를 1급시민으로 취급)을 지원한다. 함수를 일급시민으로 취급하면, 함수를 (대부분 프로그램 언어에서 1급시민으로 취급하는 ‘숫자’처럼) 변수(variable)에 담을 수 있고, 인자(parameter)로 전달할 수 있고, 반환값(return value)으로 전달할 수 있다.

  7. Node.js: 웹 개발은 크게는 웹페이지 디자인이나 버튼 기능처럼 사용자가 볼 수 있는 프론트엔드(Front-end) 부분과 사용자가 눈에 볼 수 없는 백엔드(Back-end) 부분으로 나뉜다. 자바스크립트는 주로 프론트엔드 부분에서 활용되었으나, 2009년 11월에 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용하는 소프트웨어 플랫폼인 노드.js가 공개되면서 서버단 기술까지 제어할 수 있는 힘을 갖게 되었다. 프로그래머 입장에서도 새로운 언어를 배우지 않고 서버 기술을 빨리 익히고 응용할 수 있다. 라이언 달(Ryan Dahl)이 개발한 노드.js는 자바스크립트 엔진 ‘V8’ 위에서 동작하면서 Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 자랑한다. 노드.js의 장점은 비동기 프로그래밍이다. 이벤트를 요청하고 곧바로(동기적으로) 결과를 받지 않아도 되기 때문에 (결과값을 기다린 후 다음 작업으로 넘어가는 방식을 취하지 않기 때문에) 다양한 요청을 처리할 수 있다.

  8. Ajax: 비동기식 자바스크립트 XML(Asynchronous Javascript And XML)의 약자로, 하이퍼텍스트 표기언어(XML)로 구현하기 힘든 비동기적 작업을 구현하는 기술이다. Ajax를 사용하면 최소로 필요한 데이터만을 웹서버에 동기적으로 요청해서 받고, 나머지 작업은 비동기적으로 웹서버가 처리를 하게 하여 대역폭 낭비를 줄이고, 웹서버의 데이터 처리 부하도 줄이고, 애플리케이션 응답성도 높일 수 있다.

  9. UI: 사용자 인터페이스(User Interface)는 시스템이 사용자를 대면하는 접점을 총칭한다. 인터페이스는 ‘연결점’이고 상호간의 통신이나 작업을 위한 ‘약속’을 의미한다.

  10. API: 응용 프로그램 인터페이스(Application Programming Interface)는 특정한 운영체계(OS)에 최적화된 화면 구성이나 특별한 프로그램 동작에 필요한 함수들을 미리 작성하여 모아 놓은 라이브러리에 ‘접근하는 규칙들을 정의’해 넣은 것이다. 프로그램과 운영체제나 데이터베이스 관리 시스템 사이의 통신에 사용되는 언어나 메시지 형식으로 되어 있고, 매개 역할을 하기 때문에 인터페이스 이름이 붙어 있다. 표준화한 API를 사용하면 주변 기기와 운영체계(OS)나 브라우저 충돌을 신경 쓰지 않고 프로그램 개발을 할 수 있다.

  11. Open API: 특정 서비스를 제공하는 서비스 업체가 자신들의 서비스에 접근할 수 있도록 그 규칙(API)을 외부에 공개한 것이다. 예를 들어, 페이스 북이 공개한 로그인 API를 사용하면 자신의 웹 사이트에서 따로 로그인 프로그램을 작성하지 않고 “페이스 북 로그인” 기능으로 대체할 수 있다. 내 사이트 방문자는 이 기능 덕분에 회원가입을 다시 하지 않아도 된다.

  12. Platform: 플랫폼은 어떤 사건(혹은 일)이 일어나는 ‘토대’다. 기차가 도착하고, 기차를 타려는 사람들이 대기하는 장소가 플랫폼이다. 소프트웨어 개발에서는 응용 프로그램이 ‘동작하는 환경’을 제공하는 것(토대)이 플랫폼이다. 따라서, 플랫폼은 호출을 받아 일을 처리하는 곳이다. 참고로, 운영체제(OS: Operating System)는 엄밀하게 말하면 플랫폼이 아니다. 운영체제는 하드웨어 자원의 관리를 맡고 있는 소프트웨어다. 운영체제는 소프트웨어이기에 플랫폼(동작 환경)을 필요로 한다. 응용 프로그램은 운영체제 위에서 확장된 기능과 데이터의 해석 등을 담당하는 소프트웨어다.

  13. Framework: 프레임워크는 운영체제나 플랫폼 위에서 (사용자의 추가적 코딩없이) 그 자체로 완벽히 동작하는 응용 프로그램이다. 사용자는 프레임워크 코드 자체를 변경할 수 없다. 사용자는 프레임워크가 정의한 동작을 재정의(응용) 하는 형태로만 코드를 추가할 수 있다(Extensible). 프레임워크는 응용이 쉽지만 높은 의존성을 갖는다. 반면에, 개발 토대만 제공하는 플랫폼은 응용 프로그램 개발이 불편하지만 확장이나 변경이 자유롭다.

  14. Mashup: 매쉬업(mashup)은 API를 이용해 2개 이상의 정보나 서비스를 합쳐 하나의 새로운 프로그램(SW, 서비스, 데이터베이스)을 만드는 것이다. 장점은 비용이 적게 들고, 개발기간이 짧다. 단점은 API로 제공되는 기존 서비스의 틀을 벗어나기 힘들다. 예를 들어, 구글 지도 API와 부동산 매물 정보를 결합하여 구글이 최초로 만든 매쉽업 프로그램은 하우징 맵스(http://www.housingmaps.com)는 서비스 업데이트가 중지된 상태다.