2016. 2. 17. 13:15

소프트웨어 역사의 주요 인물


소프트웨어 발전에 기여하신 분들을 출생 연도 순으로 정리했습니다. 기술 혁신, 알고리즘 개발 등 학문 및 공학 발전에 이바지 한 분들로 한정한 것입니다.

 

한글 이름 영문 이름 출생 연도
찰스 베비지 Charles Babbage 1791

에이다 러브레이스

Augusta Ada King 1815
조지 George Boole 1815
폰 노이만 John von Neumann 1903
알론조 처치 Alonzo Church 1903

그레이스 호퍼

Grace Murray Hopper 1906
모클리 John William Mauchly 1907
엘런 튜링 Alan Mathison Turing 1912
J 에커트 J Presper Echert 1919
에드가 코드 Edgar Frank "Ted" Codd 1923
더글러스 엥겔바트 Douglas C. Engelbart 1925
메카시 John McCarthy 1927
마빈 민스키 Marvin Minsky 1927
에츠허르 데이크스트라 Edsger Wybe Dijkstra 1930
찰스 앤터니 리처드 호어 Sir Charles Antony Richard Hoare 1934
니클라우스 비르트 Niklaus Wirth 1934
도널드 커누스 Donald Ervin Knuth 1938
엘런 케이 Alan Curtis Kay 1940
데니스 리치 Dennis MacAlistair Ritchie 1941
브라이언 커니핸 Brian Wilson Kernighan 1942
게리 킬달 Gary Arlen Kildall 1942
톰프슨 Kenneth Lane Thompson 1943
찰스 시모니 Charles Simonyi 1948
비야네_스트롭스트룹 Bjarne Stroustrup 1950
리처드 스톨먼 Richard Matthew Stallman 1953
조이 William Nelson Joy 1954
팀 버너스 리 Sir Timothy John "Tim" Berners-Lee 1955
제임스 고슬링 James Arthur Gosling 1955
조슈아 블로흐 Joshua Bloch 1961
마틴 파울러 Martin Fowler 1963
리누스 토르발스 Linus Benedict Torvalds 1969
로버트 마틴 Robert Cecil Martin



[인물 소개 및 업적]


찰스 베비지


영국의 수학자이자 철학자, 발명가, 기계공학자로서 "프로그램이 가능한 컴퓨터" 개념을 창안했다. 배비지는 기계식 컴퓨터를 최초로 개발한 인물로 평가 받고 있으며, 그의 연구 이후 더욱 복잡한 형태의 컴퓨터들이 등장하게 된다. 배비지는 인간의 수작업에 이한 계산으로 인해 자주 오차가 발생하는 것을 확인하고, 이를 개선하기 위해 기계를 이용한 계산 방법을 고안하려 애썼다. 그의 기계적 컴퓨터는 데이터와 메모리를 분리하고, 명령을 입력할 수 있으며, 입/출력 장치를 분리하는 등 현대적 컴퓨터에 사용되는 기법을 포함하고 있었다.


이다 러브레이스


영국 시인 조지 고든 바이런의 유일한 법적 친자이며, 세계 최초의 프로그래머로 알려져 있다. 에이다는 찰스 배비지의 연구에 대한 좋은 이해자이자 협력자였고, 배비지가 고안한 해석기관을 위한 공동작업을 수행한 것으로 널리 알려져 있다. 배비지의 해석기관에서 처리될 목적으로 작성된 알고리즘이 최초의 컴퓨터 프로그램으로 인정되고 있으며, 해석기관을 단순한 계산기 정도로 생각했던 당대의 과학자들과 달리 훨씬 다양한 목적으로 활용될 가능성에 주목해 현대 컴퓨터의 출현을 예측했다. 프로그래밍 언어에 사용되는 중요한 개념인 루프, GOTO 문, IF 문과 같은 제어문의 개념을 소개했다. 또한 서브루린(subroutine)에 대한 개념을 고안하였다.


조지 불


영국의 수학자, 논리학자이다. 논리 대수인 불 대수(Boolean Algebra)를 창안해, 기호논리학 분야에 큰 업적을 남겼다. 부울 대수는 현대 컴퓨터의 논리 연산 기능의 기본 원리이다.


폰 노이만


현대적 컴퓨터의 구조를 설계한 사람이다. 지금까지 거의 모든 컴퓨터는 폰 노이만이 정립한 아키텍쳐를 따르고 있기 때문에 "폰 노이만 머신"이라고도 부른다. 프로그램 내장 방식, 이진법을 컴퓨터에 도입했으며, 순서도와 서브루티, 몬테카를로법을 최초로 사용했다. 1945년 병합 정렬(merge sort)를 만들었고, 간단한 원칙만으로 스스로 진화하는 복잡한 프로그램을 구상했고 이를 오토마톤이라고 명명했다. 유명한 일화는 제자들이 어셈블리어를 만들 당시에 노발대발 했다는데, 그 이유가 '완벽한 신의 언어가 있는데, 그걸 놔두고 저런 조잡한걸 만들려고 하느냐?'였다.


알론조 처치


알론조 처치는 미국의 수학자이자, 논리학자이다. 전산학의 이론적인 기초를 세운 사람 중의 한 명이다. 1936년 람다 대수에 대한 논문을 썼고, 람다 셈법에 대한 처치의 연구는 리스프(LISP) 계열의 프로그래밍 언어 뿐만 아니라, 일반적인 함수형 언어 전반에 큰 영향을 끼쳤다.


그레이스 호퍼


미국의 프로그래머, 수학 교수이자 해군 제독으로 제대한 여성 군인.1906년 뉴욕에서 태어나 후일 바서대학에서 부교수로 수학을 강의했다. 2차대전 발발 직후, 1943년 미 해군에 입대했고 수학적 재능을 이용해 탄도를 계산하는 일과 최초의 컴퓨터 중 하나인 마크Ⅰ의 프로그램을 개발하는 일을 수행하며, 전쟁 이후에는 최초의 상업용 컴퓨터인 유니박(UNIVAC) 개발팀과 함께 프로그램을 개발하고 최초의 컴파일러를 개발하는데 참여했다. 그 후 해군에 복귀해 코볼(COBOL) 언어와 컴파일러 개발에 참여했고 후일 해군 제독으로 전역했다. 또한, 그는 컴퓨터에서 버그라는 단어를 최초로 사용한 것으로 유명하다. 1946년 하버드대학의 컴퓨터 마크Ⅱ를 사용하던 중 컴퓨터에 고장이 발생했는데 컴퓨터에 나방이 붙어 장애를 일으킨 것을 확인하고, 일지에 고장을 일으킨 벌레를 테이프로 붙인 후, 컴퓨터 버그란 이름을 붙였다


존 모클리


J 프레스퍼 에커트와 함께 최초의 전자 컴퓨터인 애니악을 만든 미국의 물리학자이다. 1943년 미국 전쟁성(지금의 국방부)은 펜실베니아 대학교의 공학 교수였던 모클리를 ENIAC 개발을 위한 프로젝트 총괄 책임자로 임명했다. J. 프레스퍼 에커트와 함께 ENIAC을 제작하였으며 이후 EDVAC, UNIAC 등의 컴퓨터를 설계했다.


엘런 튜링


영국의 수학자, 암호학자, 논리학자이자 컴퓨터 과학의 선구적 인물이다. 이론 컴퓨터 과학과 인공지능 분야에 지대한 공헌을 했기 때문에 "컴퓨터 과학의 아버지"라고 불린다. 튜링 기계는 튜링이 알고리즘을 설명하기 위해 도입한 가상의 기계이다. 이 기계는 한정된 종류의 기호 중 하나를 기록할 수 있는 칸들이 무한히 이어진 띠와 각 칸의 정보를 읽고 수정하는 기계로 이루어져 있다. 그리고 튜링 머신의 상태와 칸에 기록된 기호에 따라 지정된 절차를 수행한다. 튜링 머신이 수행하는 절차는 1. 현재 기계가 위치하는 칸의 기호를 수정 2. 띠의 위치 이동 3. 튜링 머신의 상태 변경 이 있다. 현대적 소프트웨어는 그 기본 원리가 튜링 머신에 기초한다.


J 에커트


존 모클리의 제자로서 ENIAC을 설계 및 개발하는 프로젝트에서 수석 엔지니어로 참여했다.


에드가 코드


관계형 데이터 베이스 이론의 창안자. 미국 미시간대학교에서 컴퓨터과학 박사 학위를 받은 후, IBM 에서 근무하다 "A Relational Model of Data for Large Shared Data Banks"라는 논문을 썼다. 코드의 관계형 모멜에 대한 논문에 크게 감명 받은 래리 앨리슨(Larry Ellison)은 지금의 오라클(ORACLE)로 이름을 바꾼 회사를 설립했다.


더글러스 엥겔바트


더글러스 엥겔바트(Douglas C. Engelbart, 1925년 1월 30일 ~ 2013년 7월 2일, 오리건 주 출생)는 노르웨이/스웨덴계 미국인 발명가이다. 그는 특히 컴퓨터 마우스의 발명자로 유명하다. 또한 그래픽 사용자 인터페이스, 하이퍼텍스트, 네트워크 컴퓨터 등 인간과 컴퓨터 상호 작용 분야의 선구자이다.


존 메카시


존 매카시(John McCarthy, 1927년 9월 4일 - 2011년 10월 24일)는 미국의 전산학자이자 인지과학자이다. 인공지능에 대한 연구 업적을 인정받아 1971년 튜링상을 수상했다. 리스프 프로그래밍 언어를 발명했으며, 1956년에 다트머스 학회에서 처음으로 '인공지능'(Artificial Intelligence)이라는 용어를 창안했다.


마빈 민스키


마빈 리 민스키(Marvin Lee Minsky, 1927년 8월 9일 ~ 2016년 1월 24일)은 인공지능(AI) 분야를 개척한 미국인 과학자이다. MIT의 인공지능 연구소의 공동 설립자이며, AI와 관련된 몇 개의 책의 저자이기도 하다.


에츠허르 데이크스트라


데이크스트라는 전산학이 아직 학문으로 완전하게 정립되지 않았던 시절에 전산학의 여러 분야에 걸쳐 많은 공헌을 했다. 그의 다방면에 걸친 업적은 다음과 같다. 데이크스트라 알고리즘을 개발하여 최단경로 알고리즘에 대한 학문적 연구를 시작했다. GOTO문을 사용하지 말 것을 주장했으며, 그의 주장은 1968년에 그의 논문 "GOTO문의 해로움"(Go To Statement Considered Harmful)에 정리되었다. 세마포어에 대한 연구를 처음으로 시작하였다.


찰스 앤터니 리처드 호어


찰스 앤터니 리처드 호어 경, Kt (Sir Charles Antony Richard Hoare, 1934년 1월 11일 ~ )은 영국의 컴퓨터 과학자이다. 애칭 토니 호어(Tony Hoare)로도 불린다. 가장 널리 쓰이는 정렬 알고리즘의 하나인 퀵 정렬을 고안해낸 것으로 유명하다. 그는 호어 이론, 형식 언어의 한 종류로 병행 프로세스간 통신을 기술하는데 이용되는 커뮤니케이팅 시퀀셜 프로세스(CSP)의 개발, 프로그래밍 언어인 Occam에도 영향을 끼친 것으로 알려져 있다.


니클라우스 비르트


스위스의 컴퓨터 과학자이며, 파스칼을 포함한 다양한 프로그래밍 언어를 설계한 것으로 가장 유명하다. 


도널드 커누스


커누스는 컴퓨터 과학 분야에서 가장 권위있는 책인 《The Art of Computer Programming》의 저자로 가장 널리 알려져 있다. 알고리즘 분석 분야를 실질적으로 창조했으며, 이론 컴퓨터 과학의 여러 분야에서 기초적인 중요한 공헌을 했다. TEX 조판 시스템과 메타폰트 폰트 디자인 시스템을 만들었으며 문학적 프로그래밍 (literate programming)의 개념을 처음으로 주장했다.


엘런 케이


앨런 커티스 케이는 미국의 전산학자이다. 객체 지향 프로그래밍과 사용자 인터페이스 디자인 분야의 선구자로 잘 알려져 있다. 


데니스 리치


켄 톰슨(Ken Thompson) 등과 함께 최초의 유닉스(Unix) 시스템을 개발했고, 1971년 최초의 〈Unix Programmer's Manual〉을 썼다. 또한 C 언어를 개발한 후 브라이언 커니핸과 함께 〈C 프로그래밍 언어〉(The C Programming Language)를 기술했다. 커니핸과 〈C 프로그래밍 언어〉책을 썼기에 커니핸이 C 언어 개발에 참여한 것으로 종종 오해받으나 커니핸의 말에 따르면 자신은 C언어 개발에 참여하지 않았다고 한다. 그는 ALTRAN, B언어, BCPL, Multics 등의 개발에도 영향을 끼친 것으로도 알려져 있다.


브라이언 커니핸


C를 만든 데니스 리치와 함께 최초의 C언어 해설서인 〈C 언어 프로그래밍〉를 써서 널리 알려져 있다. 커니핸은 자신은 C 언어의 탄생에 전혀 기여하지 않았다고 밝혔다. 그는 dirtroff를 비롯한 수많은 유닉스 프로그램을 작성했다. 선 린과 함께 그래프 분할과 외판원 문제를 푸는 유명한 휴리스틱을 개발하였다. 전자는 커니핸-린 알고리즘 (줄여서 KL), 후자는 린-커니핸 알고리즘 (줄여서 LK)이라고 부른다.


게리 킬달


게리 알렌 킬달은 운영 체제 CP/M과 GEM의 개발자이며, 디지털 리서치(Digital Research)의 설립자이다. 윈도와 메뉴로 동작하는 사용자 인터페이스를 갖춘 선점형 멀티태스킹 운영 체제를 도입했다. 최초의 디스크 트랙 버퍼링 체계, 미리 읽기 알고리즘, 파일 디렉터리 캐시와 램 디스크 에뮬레이터의 창조, 1980년대에 바이너리 재컴파일러의 도입, 최초로 마이크로프로세서에 특화된 프로그래밍 언어와 컴파일러 제작 등의 업적을 이루었다.


켄 톰프슨


케니스 레인 톰프슨은 미국의 컴퓨터 프로그래머로, AT&T 벨 연구소에서 유닉스와 플랜 9 운영 체제의 개발을 주도했다. C언어의 모체가 된 B언어를 개발하기도 했다. 2006년부터 구글에서 근무하면서 고 언어의 개발에 참여했다. 그밖에 정규표현식, QED 편집기, UTF-8 인코딩 등의 개발에도 기여했고, 체스 기계 벨의 개발에도 동참했다. 1983년에 유닉스 개발과 관련된 공로로 데니스 리치와 함께 튜링상을 수상했다.


찰스 시모니


헝가리 태생의 미국 소프트웨어 개발자, MS에서 근무하면서 MS Word 와 Excel을 개발했다. "헝가리안 명명법"이라 불리는 코딩 스타일을 창안했다.


비야네_스트롭스트룹


리처드 스톨먼


빌 조이


팀 버너스 리


제임스 고슬링


조슈아 블로흐


마틴 파울러


리누스 토르발스


로버트 마틴



켄트 벡,  조엘 스폴스키, 제프 맷우드, 앤디 루빈, 롭 파이크, 마츠모토 유키히로, 귀도 반 로섬, Robert Donner, Curt Johnson (mine sweeper), Robert sedgewick, GoF, three amigos, 허먼 훌러리스, 레이 오지, 와츠 험프리, 마크 안드레센, 마가렛 해밀턴, 앤더스 해즐스버그, John Vincent Atanasoff, 제프리 리처

Posted by 곽중선
2016. 1. 27. 19:56

[문제 제시]

"임의의 문장을 입력 받아 해당 문장에서 한글 단어만 추출하려면 어떻게 해야 할까요?

문장 부호, 공백 문자, 특수 문자 등 한글 이외의 문자를 모두 제외해야 합니다. 

이러한 프로그램을 가장 효율적(빠르거나, 메모리를 적게 쓰거나)으로 동작하게 하려면, 무엇을 고려해야 할까요?"


[프로그램 개발 절차]

위와 같은 문제를 아래의 4단계에 걸쳐 개발하려고 합니다.


분석 > 설계 > 개발 > 성능/기능 테스트


[소프트웨어 개발에서 분석이란? 그리고 어떻게?]

소프트웨어 개발에서 '분석'은 '무엇(what)'을 만들 것인지를 정의(파악)하는 단계입니다. 머리가 좋거나, 지식을 많이 쌓은 사람만이 할 수 있는 것은 아닙니다. 분석이라는 단어부터 어렵게 느껴질 수 있는데, 영어 단어인 analysis의 어원을 살펴봅시다.


analysis는 'ana(up to)'와 'lysis(untie)'가 결합하여 얽히고 뭉쳐 보이지 않던 것을 물러지게(lys) 하면 그 속에 무엇이 있는지'를 알게 됩니다.

출처 - lose 에 대하여


분석 (分析) : 한자로는 '나눌 分', '쪼갤 析' 영어의 어원과 크게 다르지 않습니다. 분석이란, 주어진 과제(혹은 문제)를 좀 더 잘게 쪼개서 문제를 명확히 이해하는 과정입니다. 잘게 쪼개다 보면 미쳐 생각하지 못했던 부분들이 드러나기도 합니다. 그리고 분석 과정에서 새로운 의문점이 드러나기도 합니다. 분석 과정은 문제를 쪼개보고, 의문점이 발생하면 이해를 위해 문제를 다시 검토하거나, 심하면 문제를 재정의합니다. 


개발이나 설계를 하기 전에 분석하는 이유는 "구현"할 수 있는 문제인지를 파악하고, 처음 문제에서 미쳐 드러나지 않은 숨은 위험요소를 찾아내며 구현할 수 없다면 문제를 재정의하거나, 주어진 자원(시간, 비용)으로 풀 수 없다면 전체 계획을 수정하기 위한 작업입니다. 또한, 분석 결과는 설계와 구현하는데 필요한 사양(specification)으로 활용됩니다.


["한글 단어 추출" 문제 분석]

먼저, 주어진 문제를 한 문장씩 나누어 봅니다.


1. 임의의 문장을 입력 받아 해당 문장에서 한글 단어만 추출한다.

2. 문장 부호, 공백 문자, 특수 문자와 한글 이외의 문자를 모두 제외해야 한다.

3. 가장 효율적(빠르거나, 메모리를 적게 쓰거나)으로 동작해야 한다.


다시 쪼갤 수 있다면 쪼개 봅니다. 모호한 것들을 제거해 나갑니다. 새로운 의문점이 드러날 수도 있습니다.


1. 임의의 문장을 입력 받아 해당 문장에서 한글 단어만 추출한다.


: 임의의 문장을 어떻게 입력 받을 것인가? 사람이 직접 입력하는지, 웹 사이트의 주소를 입력 받는지, 아니면 파일을 선택하는지?

: 한글 단어는 정확히 명사를 추출한다는 것인지? 아니면, 문장성분(예를 들어 주어+조사)을 의미하는 것인지?


2. 문장 부호, 공백 문자, 특수 문자 등 한글 이외의 문자를 모두 제외해야 한다.


: 영어, 숫자 문자도 제외하는가?


3. 가장 효율적(빠르거나, 메모리를 적게 쓰거나)으로 동작해야 한다.


: 빠른데 메모리를 많이 쓰거나, 느린데 메모리를 적게 쓴다면 둘 중 어느 쪽이 나은 결과인가?


문제에서 제기되지 않았지만, 다른 의문도 발생할 수 있습니다.


- 입력 텍스트의 다양한 텍스트 인코딩(UTF-8, EUC-KR)을 지원해야 하는가?

- 형태소 분석기를 적용해야 하는가?

- 어떤 언어를 개발해야 하는가?

- 어떤 플랫폼 (웹, PC 어플리케이션, 모바일)에서 동작해야 하는가?

- 처리 결과는 데이터베이스에 저장해야 하는가?


위와 같은 의문점에 대한 답을 구한 후에, 요구사항(세부 문제 항목)을 나열하면 간단한 '요건 분석'을 마쳤다고 할 수 있습니다.


Posted by 곽중선
2015. 12. 29. 15:20

객체 지향 기법에 대한, 그럴 것이라고 알려진 혹은 지레짐작하는 오해들

 

  • 그 자체로 좋은 성능을 내는 소프트웨어를 만들 수 있는 기술이 아니다.
    좋은 성능을 내는 소프트웨어 만들고자 하면, 알고리즘과 자료구조 이론을 공부하라.

  • 더 나은 알고리즘(적은 메모리와 CPU 사용)을 위한 기초도 아니다.
    좋은 알고리즘을 작성하는 능력은 논리적 사고와 수학적 문제해결 능력에서 비롯된다.

  • 좀 더 짧은 코드를 작성할 수 있는 기술 조차 아니다.
    더 짧은 코드를 작성하는 것은 남들이 작성한 좋은 코드를 많이 읽어 보고,다양한 유형의 코드를 직접 작성하며 수련해야 한다.

  • 버그를 줄여주는 혹은 버그 발생 확률을 줄여지는 않는가?
    인간은 완벽하지 않다. 다만, 신중한 태도와 지루한 반복 테스트 혹은 다양한 테스트 케이스 작성을 미루지 않는 정신 지구력을 통해 버그를 줄일 수 있다.

  • 복잡한 문제를 쉽게 풀 수 있는 마법은 더욱 더 아니다.
    복잡한 문제를 코드로 잘 풀어내는 능력은 천재적인 능력에서 비롯되는 것보다 많은 코드를 읽어 보고, 다양한 문제를 더 많이 풀어보고, 새로운 해법을 끊임없이 고민하는 노력을 통해 얻어진다.

  • 더 깊은 수준의 지식을 자랑할 수 있는 난이도 높은 기술도 아니다.
    객체지향 기술은 더 이상 소수의 전문가가 숨기고 있는 보물이나, 감추어진 비밀이 아니다. 누구나 인터넷과 서적을 통해 익힐 수 있다. 수많은 가이드와 예제가 나와 있다.

  • 머리가 좋아지는 사고력 훈련 코드 혹은 두뇌 비타민?
    말도 안된다.
    객체지향을 사용하지 않는 프로그램과 더 복잡한 프로그램도 많고, 어떤 객체지향 전문가도 객체지향이 최상의 프로그래밍 기법이라고 말하지 않는다.


객체 지향의 진실


  • 객체지향은 코드를 보다, 단순하고, 이해하기 쉽고, 추가/변경/조합하기 쉽도록 만들기 위한 것이다.
    (그런데, 정작 객체지향을 배운 사람이 더 복잡하게 설계하는 일도 많다. 그래서 오해가 늘었다.)

  • 높은 성능(CPU와 메모리를 적게 사용하는 것)의 소프트웨어는 객체지향 설계의 관심사가 아니다.
    성능이 무엇보다 중요하다면, 비객체지향 언어를 배우거나 찾아보라.

  • 객체지향은 가장 거대한 형태의 소프트웨어를 가장 단순한 코드들의 집합으로 구현하며,각각의 코드 블록(클래스 혹은 인터페이스 그리고 메소드 등)의 형태는 가장 단순한 형태로 유지하려는 노력이다. 
    이를 통해, 복잡함이 통제할 수 없는 수준으로 증가하는 것을 방지하고, 문제가 발생하더라고 원인을 알기 쉬우며, 많은 사람들이 협력하는 프로젝트 내에서 조차 다수가 상호협력하면서 또한 독립적인 개발이 가능하게 만든다는 얼핏 이율배반적인 목표를 이추구하는 것이다.

  • 객체지향의 목표는 기계지향(기계에 친숙한) 코드가 아니라, 인간 지향(사람의 사고 흐름에 가까운)의 코드를 작성하는 것이다.
    그런데, 여기서 함정은 객체지향이 서양 철학과 언어 체계에 근접해 있다는 것이다.
     그러니, 조금 버겁더라도 가급적 코드(혹은 주석)를 영어 문장으로 읽어보는 시도를 해 볼 필요가 있다.

  • 객체지향은 절차 지향의 함정에서 벗어나기 위한 노력이다. 절차 지향으로 코드(혹은 논리)의 흐름을 이해하고, 작성하는 습관은 자연스러울 수 있다. (flow-chart 는 절차지향의 설명하는 가장 직관적인 사례다.)
    절차지향의 문제를 깨닫지 못하는 한, 당신은 제대로 객체지향을 받아들이기 어려울 것이다.

  • 객체지향은 수많은 사례에서 연구, 발견 그리고 제안된 우수한 소프트웨어 설계 기법들을 설계자 뿐만 아니라 코드를 만들어 내는 개발자들이 직접 타이핑하는 순간에 쓸 수 있게끔 하려는 노력이다. 따라서, 객체지향 언어 문법과 코드와 패턴은 성능과는 아무런 상관이 없는 관용어(idiom)로 가득차 있다.


Posted by 곽중선