컴퓨터 프로그래밍
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
컴퓨터 프로그래밍은 컴퓨터가 특정 작업을 수행하도록 지시하는 일련의 명령어, 즉 프로그램을 설계하고 구현하는 과정이다. 프로그래밍 가능한 장치는 고대부터 존재했으며, 9세기에 프로그래밍 가능한 시퀀서와 1801년의 자카드 직기와 같은 초기 사례가 있었다. 1843년 에이다 러브레이스는 찰스 배비지의 해석기관을 위한 알고리즘을 발표하며 최초의 컴퓨터 프로그래머로 여겨진다. 20세기에는 기계어, 어셈블리어, 고급 프로그래밍 언어가 등장하며 프로그래밍 방식이 발전했다. 프로그래밍 언어는 다양한 프로그래밍 스타일을 지원하며, 소프트웨어 개발은 요구사항 분석, 설계, 구현, 테스트, 유지보수 단계를 거쳐 진행된다. 프로그래머는 소프트웨어를 작성하고 유지보수하며, 프로그래밍 학습은 학문적 연구, 교육과정, 상업적 자료를 통해 이루어진다. 최근에는 소프트웨어 교육이 의무화되고, 인공지능의 발전에도 불구하고 프로그래밍 기술의 중요성은 더욱 커지고 있다.
더 읽어볼만한 페이지
- 소프트웨어 개발 - 컴퓨터 과학
컴퓨터 과학은 컴퓨터와 관련된 현상을 연구하는 학문으로, 계산 이론, 하드웨어 및 소프트웨어 설계, 문제 해결 등을 포괄하며, 수학, 공학 등 여러 분야와 융합하여 발전해 왔다. - 소프트웨어 개발 - 스파이웨어
스파이웨어는 사용자의 동의 없이 설치되어 개인 정보를 수집하거나 시스템을 감시하며, 다양한 형태로 존재하여 광고 표시, 정보 탈취, 시스템 성능 저하 등의 피해를 유발하는 악성 프로그램이다. - 컴퓨터 프로그래밍 - 순서도
순서도는 컴퓨터 알고리즘이나 프로세스를 시각적으로 표현하는 도구로, 흐름 공정 차트에서 기원하여 컴퓨터 프로그래밍 분야에서 알고리즘을 설명하는 데 사용되며, 다양한 종류와 소프트웨어 도구가 존재한다. - 컴퓨터 프로그래밍 - 의사코드
의사코드는 컴퓨터 과학 및 수치 계산 분야에서 알고리즘을 설명하기 위해 사용되는 비표준적인 언어로, 자연어와 프로그래밍 언어의 요소를 혼합하여 알고리즘의 논리적 흐름을 이해하기 쉽게 하고 프로그래머가 실제 코드로 구현하기 전에 알고리즘을 설계하고 검토하는 데 유용하다. - 컴퓨터에 관한 - 고속 패킷 접속
고속 패킷 접속(HSPA)은 3세대 이동통신(3G)의 데이터 전송 속도를 높이는 기술 집합체로, 고속 하향/상향 패킷 접속(HSDPA/HSUPA)을 통해 속도를 개선하고 다중 안테나, 고차 변조, 다중 주파수 대역 활용 등의 기술로 진화했으나, LTE 및 5G 기술 발전으로 현재는 상용 서비스가 중단되었다. - 컴퓨터에 관한 - 데이터베이스
데이터베이스는 여러 사용자가 공유하고 사용하는 정보의 집합으로, 데이터베이스 관리 시스템을 통해 접근하며, 검색 및 갱신 효율을 높이기 위해 고도로 구조화되어 있고, 관계형, NoSQL, NewSQL 등 다양한 모델로 발전해왔다.
컴퓨터 프로그래밍 | |
---|---|
컴퓨터 프로그래밍 | |
정의 | |
설명 | 컴퓨터나 계산 장치에 의해 실행될 수 있는 컴퓨터 프로그램 또는 컴퓨터 소프트웨어를 만드는 과정 |
다른 용어 | 프로그램 작성, 코딩 |
주요 활동 및 단계 | |
활동 | 요구사항 분석 기능 명세 구조 설계 구현 테스팅 배치 유지보수 |
개발 모형 | |
모델 | 애자일 소프트웨어 개발 클린룸 DSDM 순차점증적 개발 반복형 개발 RAD RUP 나선 모형 폭포수 모델 익스트림 프로그래밍 스크럼 V 모델 TDD |
지원 활동 | |
활동 | 구성 관리 문서화 품질보증 프로젝트 관리 사용자 경험 설계 |
도구 | |
도구 | 컴파일러 디버거 프로파일러 GUI 디자이너 통합 개발 환경 |
2. 역사
컴퓨터 프로그래밍의 역사는 컴퓨터의 발전과 함께 진화해왔다.
특정한 프로그래밍 언어로 쓰인 프로그램은 기계어로 번역되어 컴퓨터에 의해 실행된다. 어떤 프로그래밍 언어도 기계어로 번역이 가능하다. 프로그래머가 기계 부호로 직접 작성하는 것은 매우 어려운 작업이기 때문에, 낮은 수준에서의 컴퓨터 제어가 필요한 경우 어셈블리어를 사용한다.[8]
서로 다른 프로그래밍 언어는 다른 프로그래밍 유형을 지원하며, 분야에 따라 적합한 언어가 존재한다. 또한 언어마다 프로그래머가 알고리즘을 구현할 때 구체적인 방법과 수준의 차이가 있어, 사용 편의성과 성능 사이에서 적절한 타협이 이루어진다.
2. 1. 초기 역사
9세기 초, 페르시아의 바누 무사 형제는 《독창적인 장치의 책》에서 자동화된 기계식 플루트 연주자를 설명했는데, 이는 프로그래밍 가능한 시퀀서였다.[3][4] 1206년에는 아랍의 엔지니어 알 자자리가 프로그래밍 가능한 드럼 머신을 발명했다. 이 기계는 못과 캠을 통해 음악 기계 자동 인형이 다른 리듬과 드럼 패턴을 연주하도록 만들 수 있었다.[5][6]1801년, 자카드 직기는 구멍이 뚫린 일련의 카드 스톡 카드인 "프로그램"을 변경하여 완전히 다른 직물을 생산할 수 있었다. 최초의 컴퓨터 프로그램은 일반적으로 1843년 수학자 에이다 러브레이스가 찰스 배비지의 해석기관으로 베르누이 수를 계산하는 알고리즘을 발표한 때로 거슬러 올라간다.[8] 그러나 찰스 배비지 자신도 1837년에 해석기관을 위한 프로그램을 작성했다.[9][10]

1880년대, 허먼 홀러리스는 기계 판독 가능한 형태로 ''데이터''를 저장하는 개념을 발명했다.[11] 1940년대 후반에는 IBM 602 및 IBM 604와 같은 유닛 레코드 장비가 제어판을 통해 다른 작업을 위해 프로그래밍할 수 있게 되었고, 최초의 전자 컴퓨터도 마찬가지였다. 그러나 1949년에 도입된 저장 프로그램 방식 컴퓨터의 개념으로 프로그램과 데이터는 모두 컴퓨터 메모리에서 동일한 방식으로 저장되고 조작되었다.[12]
2. 2. 기계어와 어셈블리어
초기 컴퓨터 프로그래밍은 기계어를 직접 사용하는 방식으로 이루어졌다. 기계어는 특정 기계의 명령어 집합으로, 종종 이진수 표기법으로 작성되었다.[37] 프로그래머가 기계어 코드를 직접 나열하는 것은 매우 어려운 작업이었기 때문에, 기계어 명령어에 대한 일대일 연상 기호(니모닉) 대응인 어셈블리어가 개발되었다. 어셈블리어를 통해 프로그래머는 명령어(예: ADD X, TOTAL)를 텍스트 형식으로 기술할 수 있게 되었다. 어셈블리어는 각 연산 코드에 대한 약어와 주소를 지정하기 위한 의미 있는 이름을 사용했다.[37] 그러나 어셈블리어는 기계어의 다른 표기법에 불과하므로, 명령어 집합이 다른 두 기계는 어셈블리어도 다르다.2. 3. 고급 프로그래밍 언어의 등장
고급 프로그래밍 언어는 프로그램 개발 과정을 더 간단하고 이해하기 쉽게 만들었으며, 기본적인 하드웨어에 덜 의존적이게 하였다. 최초의 컴파일러 관련 도구인 A-0 시스템은 1952년에 그레이스 호퍼에 의해 개발되었다.[13][14][15] 1957년에는 기능적인 구현을 가진 최초로 널리 사용된 고급 언어인 포트란(FORTRAN)이 등장했고,[16] 곧이어 상업적 데이터 처리를 목표로 한 코볼(COBOL)과 컴퓨터 연구를 위한 리스프 등 많은 다른 언어들이 개발되었다.이러한 컴파일된 언어는 프로그래머가 구문적으로 더 풍부하고 코드를 추상화할 수 있는 용어로 프로그램을 작성할 수 있도록 하였다. 또한 컴파일 선언과 휴리스틱을 통해 다양한 기계 명령어 집합을 쉽게 대상으로 삼을 수 있게 하였다. 컴파일러는 중위 표기법을 사용하여 수식을 입력하여 계산을 지정할 수 있도록 함으로써 프로그래밍을 더 쉽게 만들어 컴퓨터의 성능을 활용했다.[1] 예를 들어 1954년에 개발된 포트란(FORTRAN)을 통해 연산을 수식처럼 직접 기술할 수 있게 되었다(예: Y = X*2 + 5*X + 9). 이 프로그램의 소스 코드는 컴파일러라고 하는 특별한 프로그램으로 기계의 명령어로 변환된다.
2. 4. 프로그래밍 학습의 역사
컴퓨터 프로그래밍 방법에 대한 구체적인 지침을 담은 최초의 책은 모리스 윌크스, 데이비드 휠러, 스탠리 길의 ''Preparation of Programs for an Electronic Digital Computer'' (1951)로, 세계 최초의 저장 프로그램 방식 컴퓨터 중 하나인 EDSAC에서 기본적인 연산을 처리하기 위한 일반적인 서브루틴을 제공했다.[26]고급 프로그래밍 언어가 등장하면서 FLOW-MATIC, COBOL, FORTRAN, ALGOL, 파스칼, 베이직, C 등 다양한 언어의 키워드, 프로그램 흐름 관리, 데이터 처리 및 기타 개념을 설명하는 수많은 책과 자료가 나왔다.[26] 초기 프로그래밍 입문서로는 마샬 H. 루벨의 ''A Primer of Programming for Digital Computers'' (1959)가 있으며, 코딩 시트 작성, 카드 펀치 생성, IBM 초기 FORTRAN 시스템의 키워드 사용에 대한 단계별 지침을 담고 있다.[29] 다니엘 매크래켄의 ''A Guide to FORTRAN Programming'' (1961)은 학생과 사무직원을 포함한 더 많은 사람들에게 FORTRAN을 소개했다.
1961년 앨런 펄리스는 카네기 기술 연구소의 모든 신입생이 컴퓨터 프로그래밍 과정을 이수해야 한다고 제안했고,[30] 그의 조언은 전문 프로그래머를 위한 정기적인 정보 출처였던 ''Computers and Automation''에 발표되었다.
프로그래머는 곧 다양한 학습 자료를 사용할 수 있게 되었다.[26] ''프로그래머 참조''에는 언어와 관련된 키워드와 함수, 컴파일러 및 관련 시스템에 대한 기술 정보가 알파벳순으로 나열되어 있었다. 초기 예로는 IBM의 ''Programmers’ Reference Manual: the FORTRAN Automatic Coding System for the IBM 704 EDPM'' (1956)이 있다.
시간이 지나면서 자습서 또는 단계별 형식으로 언어의 기능을 제시하는 ''프로그래머 가이드'' 장르가 등장했다.[26] 많은 초기 입문서는 “Hello, World” 프로그램으로 시작했는데, 이는 개발자가 특정 시스템에서 생성할 수 있는 가장 짧은 프로그램을 보여주었다. 이후 프로그래머 가이드는 변수 선언, 데이터 형식, 수식, 흐름 제어, 사용자 정의 함수, 데이터 조작 등 핵심 주제를 설명했다.
초기이자 영향력 있는 프로그래머 가이드로는 존 G. 케메니와 토마스 E. 커츠의 ''BASIC Programming'' (1967), 캐슬린 젠슨과 니클라우스 비르트의 ''The Pascal User Manual and Report'' (1971), 브라이언 커니핸과 데니스 리치의 ''The C Programming Language'' (1978)가 있다.[26] 대중을 위한 유사한 책(훨씬 가벼운 어조)으로는 밥 알브레히트의 ''My Computer Loves Me When I Speak BASIC'' (1972), 앨 켈리와 이라 포울의 ''A Book on C'' (1984), 댄 구킨의 ''C for Dummies'' (1994)가 있다.
전문 프로그래밍 관행을 소개하는 수많은 책과 학술 저널도 있었으며,[26] 이들 중 다수는 컴퓨터 과학, 소프트웨어 공학 또는 관련 분야의 대학 과정을 위해 설계되었다. 도널드 크누스의 ''컴퓨터 프로그래밍의 예술'' (1968년 이후)은 수백 가지의 계산 알고리즘과 그 분석을 제시했다. 브라이언 W. 커니핸과 P. J. 플로거의 ''The Elements of Programming Style'' (1974)은 프로그램이 컴파일러뿐만 아니라 사람이 읽을 수 있도록 작성되어야 한다는 프로그래밍 ''스타일''에 관심을 두었다. 존 벤틀리의 ''Programming Pearls'' (1986)은 전문적이고 학문적인 맥락에서 프로그래밍의 예술과 기술에 대한 실용적인 조언을 제공했다. 학생들을 위해 특별히 디자인된 교재로는 더그 쿠퍼와 마이클 클랜시의 ''Oh Pascal!'' (1982), 알프레드 아호의 ''Data Structures and Algorithms'' (1983), 다니엘 왓의 ''Learning with Logo'' (1983)이 있다.
개인용 컴퓨터가 대중 시장 상품이 되면서, 전문가, 아마추어, 일반 사용자들에게 컴퓨터 프로그램 작성법을 가르치는 수천 권의 교양서와 잡지가 출판되었다.[26] 데이비드 아흘(David Ahl)의 ''BASIC Computer Games, Microcomputer Edition''(1978), 로드니 자크스(Rodnay Zaks)의 ''Programming the Z80''(1979), 앤디 존슨-레어드(Andy Johnson-Laird)의 ''Programmer’s CP/M Handbook''(1983), 미첼 와이트(Mitchell Waite)와 와이트 그룹(The Waite Group)의 ''C Primer Plus''(1984), 피터 노턴(Peter Norton)의 ''The Peter Norton Programmer’s Guide to the IBM PC''(1985), 레이 던컨(Ray Duncan)의 ''Advanced MS-DOS''(1986), 마이클 할버슨(Michael Halvorson)과 데이비드 리그머(David Rygymr)의 ''Learn BASIC Now''(1989), 찰스 페츠올드(Charles Petzold)의 ''Programming Windows 3.1''(1992), 스티브 매코넬(Steve McConnell)의 ''Code Complete: A Practical Handbook for Software Construction''(1993), 안드레 라모스(André LaMothe)의 ''Tricks of the Game-Programming Gurus''(1994) 등이 이러한 학습 자료의 예이다.
PC 소프트웨어 산업은 프로그래밍 입문서와 튜토리얼뿐만 아니라 고급 소프트웨어 개발자를 위한 서적을 제공하는 애디슨-웨슬리(Addison-Wesley), IDG, 매클밀란(Macmillan Inc.), 맥그로힐(McGraw-Hill), 마이크로소프트 프레스(Microsoft Press), 오라일리 미디어(O’Reilly Media), 프렌티스 홀(Prentice Hall), 시벡스(Sybex), 벤타나 프레스(Ventana Press), 와이트 그룹 프레스(Waite Group Press), 와일리(Wiley (publisher)), 웍스 프레스(Wrox Press), 지프-데이비스(Ziff-Davis) 등 수많은 출판사의 설립을 촉진했다.[31]
컴퓨터 잡지와 학술지는 전문 프로그래머와 아마추어 프로그래머를 위한 학습 콘텐츠를 제공했다.[26] ''아미가 월드(Amiga World)'', ''바이트(Byte (magazine))'', ''커뮤니케이션스 오브 더 ACM(Communications of the ACM)'', ''컴퓨터(Computer (magazine))'', ''컴퓨트!(Compute!)'', ''Computer Language (magazine)'', ''컴퓨터 앤 일렉트로닉스(Computers and Electronics)'', ''닥터 돕스 저널(Dr. Dobb’s Journal)'', ''IEEE 소프트웨어(IEEE Software)'', ''맥월드(Macworld)'', ''PC 매거진(PC Magazine)'', ''PC/컴퓨팅(PC/Computing)'', ''유닉스월드(UnixWorld)'' 등이 이러한 자료에 포함된다.
2000년대부터 2010년대까지 프로그래머들이 정보 접근성 확대를 위해 인터넷 자원으로 이동하면서 컴퓨터 서적 및 잡지 출판사의 영향력이 크게 감소했다.[32] 이러한 변화는 프로그래밍 기술을 배우는 새로운 디지털 제품과 방법을 가져왔다. 전환 과정에서 출판사의 디지털 서적은 기존에 인쇄물로 제공되던 정보를 새롭고 확장되는 독자층에 전달했다.
코딩 학습을 위한 중요한 인터넷 자원으로는 블로그, 위키, 비디오, 온라인 데이터베이스, 구독 사이트, 코딩 기술에 중점을 둔 맞춤형 웹사이트가 포함되었다.[32] 유튜브(YouTube) 비디오, Lynda.com 자습서(후에 링크드인 러닝(LinkedIn Learning)으로 변경됨), 칸 아카데미(Khan Academy), 코드카데미(Codecademy), 깃허브(GitHub), 수많은 코딩 부트캠프 등 새로운 상업적 자원이 등장했다.
대부분의 소프트웨어 개발 시스템과 게임 엔진에는 통합 개발 환경(integrated development environment, IDE), 맥락 민감형 도움말(context-sensitive help), API, 기타 디지털 자원을 포함한 풍부한 온라인 도움말 자원이 포함되어 있었다.[32] 상업용 소프트웨어 개발 키트(software development kit, SDK)는 설치 가능한 하나의 패키지에 소프트웨어 개발 도구와 설명서를 제공하기도 했다.
애플, 마이크로소프트(Microsoft), 오라클, 구글(Google), 아마존과 같은 상업 및 비영리 단체들은 개발자를 위한 학습 웹사이트를 게시하고, 블로그를 만들고, 프로그래밍에 대한 뉴스피드와 소셜 미디어 자원을 구축했다.[32] 마이크로소프트 개발자 네트워크(Microsoft Developer Network, MSDN)과 같은 자원을 포함하여 프로그래머를 위한 지원을 제공하는 기업 웹사이트도 구축되었다. Hour of Code(Code.org)와 같은 현대적인 운동은 프로그래밍 학습이 디지털 학습 전략, 교육 의제 및 기업 자선 사업과 어떻게 연관되었는지를 보여준다.
3. 프로그래밍 언어
프로그래밍 언어는 소프트웨어 개발에 필수적이며, 가장 단순한 응용 프로그램부터 가장 정교한 응용 프로그램까지 모든 소프트웨어의 기본 구성 요소이다. 특정한 프로그래밍 언어로 쓰인 프로그램은 기계어로 번역되어 컴퓨터에서 실행되며, 어떤 프로그래밍 언어도 기계어로 번역이 가능하다.
서로 다른 프로그래밍 언어는 서로 다른 프로그래밍 스타일(프로그래밍 패러다임)을 지원한다. 이상적으로는 현재 작업에 가장 적합한 프로그래밍 언어가 선택되어야 한다.
앨런 다우니는 그의 저서 ''How To Think Like A Computer Scientist''에서 대부분의 프로그래밍 언어에 나타나는 몇 가지 기본적인 명령어를 다음과 같이 제시했다.[45]
- 입력: 키보드, 파일 또는 기타 장치에서 데이터를 수집한다.
- 출력: 화면에 데이터를 표시하거나 파일 또는 기타 장치로 데이터를 보낸다.
- 산술 연산: 덧셈과 곱셈 같은 기본적인 산술 연산을 수행한다.
- 조건부 실행: 특정 조건을 확인하고 적절한 일련의 명령문을 실행한다.
- 반복: 일반적으로 약간의 변형을 가진 어떤 작업을 반복적으로 수행한다.
많은 컴퓨터 언어는 공유 라이브러리에서 제공하는 함수를 호출하는 메커니즘을 제공한다. 라이브러리의 함수가 적절한 런타임 규칙(예: 인수 전달 방법)을 따르는 경우, 이러한 함수는 다른 언어로 작성될 수 있다.
3. 1. 프로그래밍 패러다임
오늘날까지 프로그래밍 발전에 기여한 주요 패러다임은 다음과 같다.- 구조적 프로그래밍: 명령어에서 명령어로 직접 이동하는 대신, 논리적인 순차 및 반복 구조를 사용하여 로직의 추상화를 목표로 한다.[45]
- 함수형 프로그래밍: 변수 사용에 따른 부작용 발생을 최소화하려고 시도한다.[45]
- 논리 프로그래밍: 선언형 프로그래밍을 가능하게 한다.[45]
- 객체 지향 프로그래밍: 데이터와 절차의 직교화를 추진하여 인간의 개념 구성에 가까운 표현을 가능하게 한다.[45]
프로그래밍에는 문자를 사용하는 언어 외에도, 시각 언어나 도형 언어로 기술하는 비주얼 프로그래밍도 있다.[45]
3. 2. 언어 선택
프로그래밍 언어 선택은 여러 요소를 고려하여 결정된다. 회사 정책, 작업 적합성, 타사 패키지 가용성, 개인적 선호도 등이 고려 대상이다.[45] 이상적으로는 현재 작업에 가장 적합한 프로그래밍 언어를 선택해야 하지만, 현실적으로는 해당 언어를 사용할 수 있는 프로그래머 수, 컴파일러 가용성, 프로그램 실행 효율성 등을 고려해야 한다.프로그래밍 언어는 "저수준"에서 "고수준"까지 다양한 수준으로 나뉜다. "저수준" 언어는 기계 지향적이고 실행 속도가 빠르지만, "고수준" 언어는 더 추상적이고 사용하기 쉬우나 실행 속도가 느리다. 일반적으로 "고수준" 언어로 코딩하는 것이 "저수준" 언어로 코딩하는 것보다 쉽다.
앨런 다우니는 그의 저서 ''How To Think Like A Computer Scientist''에서 대부분의 프로그래밍 언어에 나타나는 몇 가지 기본적인 명령어를 다음과 같이 제시했다.
- 입력: 키보드, 파일 또는 기타 장치에서 데이터를 수집한다.
- 출력: 화면에 데이터를 표시하거나 파일 또는 기타 장치로 데이터를 보낸다.
- 산술 연산: 덧셈과 곱셈 같은 기본적인 산술 연산을 수행한다.
- 조건부 실행: 특정 조건을 확인하고 적절한 일련의 명령문을 실행한다.
- 반복: 일반적으로 약간의 변형을 가진 어떤 작업을 반복적으로 수행한다.
3. 3. 주요 프로그래밍 언어
현대 프로그래밍 언어 중 가장 인기 있는 언어를 판별하는 것은 매우 어렵다. 프로그래밍 언어의 인기를 측정하는 방법에는 해당 언어를 언급하는 구인 광고 수를 세거나, 해당 언어를 가르치는 책과 강좌의 판매량을 세는 방법 등이 있다.[23]일부 언어는 특정 종류의 애플리케이션에 매우 인기가 있는 반면, 어떤 언어는 다양한 종류의 애플리케이션을 작성하는 데 정기적으로 사용된다. 예를 들어, C언어(C (programming language))는 임베디드 소프트웨어에서 사용된다. 많은 애플리케이션은 구축 및 사용에 여러 언어를 혼합하여 사용한다. 새로운 언어는 일반적으로 이전 언어의 구문을 기반으로 새로운 기능을 추가하여 설계된다. 예를 들어, C++은 C에 객체 지향 기능을 추가하고, 자바(Java (programming language))는 C++에 메모리 관리 및 바이트코드를 추가했지만, 그 결과 효율성과 저수준 조작 기능이 저하되었다.[24]
4. 소프트웨어 개발
소프트웨어 개발은 컴퓨터 프로그램, 데이터 및 관련 문서를 만드는 과정이다. 여기에는 문제 인식, 기획, 도구 (하드웨어, 플랫폼, 프로그래밍 언어 등) 선택, 프로그래밍, 디버깅, 사용자 공개, 유지보수 등이 포함된다.[17][18]
어떤 개발 방식을 사용하든, 최종 프로그램은 다음의 기본적인 속성을 충족해야 한다.[19] 이러한 속성들은 디버깅, 향후 개발 및 사용자 지원에 드는 시간과 비용을 절감하는 데 중요한 역할을 한다.
- 신뢰성: 프로그램 결과가 얼마나 정확한지를 나타낸다. 알고리즘의 정확성과 프로그래밍 실수를 최소화하는 것이 중요하다.
- 강건성: 프로그램이 버그 외의 오류로 인한 문제를 얼마나 잘 예측하고 처리하는지를 나타낸다. 잘못된 데이터, 자원 부족, 사용자 오류 등을 고려해야 한다.
- 사용성: 사용자가 프로그램을 얼마나 쉽게 사용할 수 있는지를 나타낸다. 사용자 인터페이스의 명확성, 직관성 등이 중요하다.
- 이식성: 프로그램의 소스 코드를 다양한 컴퓨터 하드웨어 및 운영 체제 플랫폼에서 얼마나 쉽게 실행할 수 있는지를 나타낸다.
- 유지보수성: 현재 또는 미래의 개발자가 프로그램을 얼마나 쉽게 수정할 수 있는지를 나타낸다. 초기 개발 시의 좋은 관행이 유지보수성에 큰 영향을 미친다.
- 효율성/성능: 프로그램이 소비하는 시스템 자원(프로세서 시간, 메모리 공간 등)의 양을 나타낸다. 효율성은 자원 사용을 최소화하는 것을 의미한다.
테스트 자동화 및 적합도 함수를 사용하면 앞서 언급한 속성들을 유지하는 데 도움이 될 수 있다.[20]
컴퓨터 프로그래밍의 학문 및 공학 분야에서는 주어진 문제에 대해 가장 효율적인 알고리즘을 찾고 구현하는 데 중점을 둔다. 알고리즘은 빅 O 표기법을 사용하여 '차수'로 분류되며, 이는 입력 크기에 따른 자원 사용량을 나타낸다. 전문 프로그래머는 다양한 알고리즘과 그 복잡성을 이해하고, 상황에 가장 적합한 알고리즘을 선택한다.
4. 1. 소프트웨어 개발 과정
소프트웨어 개발 과정에는 다음과 같은 주요 단계들이 있다.- '''요구사항 분석:''' 해결해야 할 문제를 정확히 정의하고, 프로그램이 어떤 기능을 해야 하는지를 결정한다. 유스 케이스 분석과 같은 방법이 활용될 수 있다.[39]
- '''설계:''' 프로그램의 전체적인 구조를 설계하고, 어떤 알고리즘과 자료 구조를 사용할지를 선택한다. 객체 지향 분석 및 설계(OOAD)나 모델 기반 아키텍처(MDA)와 같은 모델링 기법이 사용될 수 있으며, 통합 모델링 언어(UML)가 표기법으로 활용된다. 데이터베이스 설계에는 엔티티-관계 모델(ER 모델링)이 사용되기도 한다.
- '''구현:''' 실제로 프로그래밍 언어를 사용하여 코드를 작성한다. 이를 '''코딩'''이라고도 부른다. 명령형 언어(객체 지향 또는 절차적), 함수형 언어, 논리 프로그래밍 언어 등 다양한 프로그래밍 패러다임이 사용될 수 있다.
- '''테스트:''' 프로그램이 요구사항대로 올바르게 동작하는지 검증하고, 버그를 찾아 수정(디버깅)한다. 테스트 주도 개발과 같이 테스트를 먼저 작성하는 방식도 있다. 통합 개발 환경(IDE)이나 독립적인 디버거가 사용될 수 있다.
- '''유지보수:''' 프로그램이 완성된 후에도 사용자의 요구에 따라 기능을 개선하거나 새로운 기능을 추가하고, 발견된 버그를 수정하는 과정이 필요하다.
이러한 과정들은 폭포수 모델처럼 순차적으로 진행될 수도 있고, 애자일 소프트웨어 개발처럼 짧은 주기를 반복하며 점진적으로 개발될 수도 있다. 어떤 개발 방법을 사용하든, 효율성, 신뢰성, 강건성, 이식성, 가독성과 같은 소프트웨어의 기본적인 품질 속성을 확보하는 것이 중요하다.[43]
4. 2. 소프트웨어 개발 방법론
소프트웨어 개발에는 여러 가지 방법이 있다.널리 사용되는 모델링 기법에는 객체 지향 분석 및 설계(OOAD) 및 모델 기반 아키텍처(MDA)가 있다. 통합 모델링 언어(UML)는 OOAD 및 MDA에 사용되는 표기법이다.
소프트웨어 개발 프로세스에는 여러 가지 방법이 있다.
- '''폭포수 모델''': 각 단계를 순차적으로 진행하는 전통적인 개발 방법론이다.
- '''애자일 소프트웨어 개발''': 짧은 주기로 개발과 테스트를 반복하여 변화하는 요구사항에 유연하게 대응하는 방법론이다.
- '''객체 지향 개발''': 객체 지향 프로그래밍 개념을 기반으로 소프트웨어를 개발하는 방법론이다.
- '''모델 기반 개발''': 모델을 중심으로 소프트웨어를 개발하는 방법론이다.
5. 디버깅
디버깅은 소프트웨어 개발 과정에서 매우 중요한 작업이다. 프로그램에 결함이 있으면 사용자에게 상당한 영향을 미칠 수 있기 때문이다. 일부 프로그래밍 언어는 컴파일러가 다른 언어만큼 많은 검사를 수행하도록 요구하지 않기 때문에 특정 종류의 오류가 발생하기 쉽다. 정적 코드 분석 도구를 사용하면 이러한 문제의 일부를 감지하는 데 도움이 될 수 있다.
일반적으로 디버깅의 첫 번째 단계는 문제를 재현하는 것이다. 하지만 병렬 프로세스나 특이한 소프트웨어 버그와 같이 이 작업은 간단하지 않을 수 있다. 또한 특정 사용자 환경과 사용 이력으로 인해 문제를 재현하기 어려울 수도 있다.
버그가 재현되면 프로그램의 입력을 단순화하여 디버깅을 용이하게 할 필요가 있을 수 있다. 예를 들어 컴파일러의 버그로 인해 큰 소스 파일을 파싱할 때 컴파일러가 충돌하는 경우, 원래 소스 파일의 몇 줄만으로 동일한 충돌을 재현할 수 있는 테스트 케이스를 단순화하는 것으로 충분할 수 있다. 이를 위해 시행착오 또는 분할 정복 방식이 필요하다. 프로그래머는 원래 테스트 케이스의 일부를 제거하고 문제가 여전히 존재하는지 확인한다. GUI에서 문제를 디버깅할 때 프로그래머는 원래 문제 설명에서 일부 사용자 상호 작용을 건너뛰고 나머지 작업만으로 버그가 나타나는지 확인할 수 있다. 스크립팅과 브레이크포인트 설정도 이 과정의 일부이다.
디버깅은 종종 IDE를 사용하여 수행된다. GDB와 같은 독립형 디버거도 사용되는데, 이러한 디버거는 일반적으로 시각적 환경을 덜 제공하고 보통 명령줄을 사용한다. Emacs와 같은 일부 텍스트 편집기는 시각적 환경을 제공하기 위해 GDB를 호출할 수 있다.
버그가 가득한 프로그램은 사용할 수 없으므로, 디버깅은 중요하다. C언어나 어셈블리어는 숙련된 프로그래머라도 버퍼 오버런, 잘못된 포인터, 메모리 초기화 누락 또는 해제 누락과 같은 버그를 만들기 쉽다. 버퍼 오버런은 인접한 메모리 영역을 파괴하여 전혀 관련 없는 부분에서 프로그램에 이상이 발생하는 원인이 된다. 따라서 C언어나 C++ 프로그래밍을 위해 Valgrind, Purify, BoundsChecker와 같은 메모리 디버거가 개발되어 왔다.
Java, C#, PHP, Python과 같은 언어에는 그러한 문제가 거의 없지만, 성능은 낮다. 그러나 데이터베이스 접근이나 파일 입출력이 성능을 결정짓는 분야에서는 이러한 언어의 성능으로도 전혀 문제가 없다. 또한 최근에는 이러한 언어의 처리계에서도 성능이 향상되고 있다.
6. 프로그래머
프로그래머는 프로그래밍 언어를 사용하여 컴퓨터 소프트웨어를 작성하는 사람을 말한다. 프로그래밍을 하려면 컴퓨터 과학을 중심으로 프로그래밍 자체에 대한 능력과 지식, 그리고 작성하려는 프로그램이 대상으로 하는 문제 영역 등에 대한 능력과 지식이 모두 필요하다.
프로그래밍은 미디어에서 다소 수학적인 과목으로 제시되었지만, 일부 연구에 따르면 뛰어난 프로그래머는 자연어에 대한 능숙한 기술을 가지고 있으며, 코딩을 배우는 것은 외국어를 배우는 것과 유사하다고 한다.[33][34]
20세기 후반, 선진국에서 프로그래머는 매력적인 직업 중 하나로 여겨졌다. 그러나 개발도상국의 저렴한 노동력을 프로그래밍에 이용하는 경향이 강해지고 있다.
6. 1. 프로그래머의 역할
컴퓨터 프로그래머는 컴퓨터 소프트웨어를 작성하는 사람들이다. 프로그래머의 업무는 일반적으로 다음을 포함한다.[33][34]업무 | 내용 |
---|---|
요구사항 분석 | 소프트웨어가 해결해야 할 문제를 정의하고, 필요한 기능과 제약 조건을 파악한다. |
소프트웨어 설계 | 소프트웨어의 전체 구조를 설계하고, 구성 요소 간의 관계를 정의한다. |
코딩 | 프로그래밍 언어를 사용하여 소프트웨어의 기능을 실제로 구현한다. |
디버깅 | 소프트웨어의 오류를 찾아내고 수정한다. |
소프트웨어 테스트 | 소프트웨어가 요구사항대로 동작하는지 확인하고, 품질을 평가한다. |
소프트웨어 유지보수 | 소프트웨어의 버그를 수정하고, 새로운 기능을 추가하며, 사용자 지원을 제공한다. |
소프트웨어 문서화 | 소프트웨어의 사용법, 설계, 구현 방식 등을 설명하는 문서를 작성한다. |
이 외에도 프로그램 작성자 이외의 사람이 프로그램을 사용하는 경우, 사용 방법이나 기능에 대한 질문을 받을 수 있다. 프로그램을 의도한 대로 작동하게 하려면, 이러한 문의에 대응할 필요도 있다.
일반적으로 프로그래밍을 직업으로 하는 경우, 이러한 작업이 공정에 포함된다. 대규모 프로그래밍에서는 이러한 작업을 분업하는 경우가 많다.
이러한 업무는 소프트웨어 공학이라는 학문의 소프트웨어 개발 프로세스 분야에서 다루어진다.
인공지능에 의한 프로그래밍이 발달하면 프로그래밍 기술은 불필요하게 될 것이라고 오해하는 사람도 있을지 모르지만, 2023년 체계적인 문헌 분석에 따르면 인공지능의 등장 이후에는 프로그래밍 기술이 오히려 그 이상으로 중요해진다는 점을 보여준다.[44]
7. 프로그래밍 관련 자격증 (한국)
8. 최근 동향 및 전망
20세기 후반, 선진국에서 프로그래머는 인기 있는 직업 중 하나였다. 그러나 개발도상국의 저렴한 노동력을 프로그래밍에 활용하는 경향이 강해지고 있다. 이러한 추세가 지속될지, 그리고 어떤 영향을 미칠지는 아직 불확실하다.[49]
프로그래밍 언어를 사용하면서 기계어로 직접 프로그래밍할 필요가 없어진 것은 일종의 "프로그래밍리스"라고 할 수 있으며, 이는 매우 성공적인 사례이다. 초기 프로그래밍 언어 연구는 "자동 프로그래밍" 등으로 불렸다. 현대에는 애플리케이션 소프트웨어를 사용하는 것만으로도 컴퓨터 활용 범위가 매우 넓다는 점도 "프로그래밍리스"의 일종으로 볼 수 있다. 이론적으로 도메인 특화 언어 중 튜링 완전하지 않은 것은 범용 언어가 아니므로, 이를 사용한 컴퓨터 활용도 "프로그래밍리스"라고 할 수 있다. 또한 GUI를 이용한 설정이나 드래그 앤 드롭으로 애플리케이션을 개발하는 것을 프로그래밍리스 또는 노프로그래밍이라고 부르기도 한다.[49]
8. 1. 한국의 프로그래밍 교육
2018년부터 초·중등학교에서 소프트웨어 교육이 의무화되었다. 대학에서는 컴퓨터 과학 관련 학과뿐만 아니라 비전공자를 위한 프로그래밍 교육도 확대되고 있다. 민간 부문에서도 다양한 코딩 교육 프로그램이 운영되고 있다.참조
[1]
웹사이트
What is coding
http://yearofcodes.t[...]
2014-03-03
[2]
웹사이트
What is programming
http://yearofcodes.t[...]
2014-03-03
[3]
논문
On the prehistory of programmable machines: musical automata, looms, calculators
Elsevier
[4]
논문
Loudspeakers Optional: A history of non-loudspeaker-based electroacoustic music
Cambridge University Press
2017
[5]
논문
The Museum of Music: A History of Mechanical Instruments
1967-10-01
[6]
웹사이트
A 13th Century Programmable Robot
https://web.archive.[...]
2007
[7]
서적
A Brief History of Cryptology and Cryptographic Algorithms
Springer Science & Business Media
2013
[8]
논문
Lovelace & Babbage and the Creation of the 1843 'notes'
[9]
논문
The Computer Programs of Charles Babbage
[10]
논문
The First Computer Program
https://refubium.fu-[...]
[11]
웹사이트
Columbia University Computing History – Herman Hollerith
http://www.columbia.[...]
Columbia.edu
2020-03-10
[12]
웹사이트
Memory & Storage Timeline of Computer History Computer History Museum
https://www.computer[...]
2021-06-03
[13]
서적
Proceedings of the 1952 ACM national meeting (Toronto) on - ACM '52
1952
[14]
논문
Computers Then and Now
[15]
웹사이트
The World's First COBOL Compilers
http://www.computerh[...]
[16]
뉴스
Fortran creator John Backus dies
https://www.nbcnews.[...]
2007-03-20
[17]
간행물
NIST To Develop Cloud Roadmap
https://www.informat[...]
2010-11-05
[18]
뉴스
What is it based on
1984-04-09
[19]
웹사이트
Programming 101: Tips to become a good programmer - Wisdom Geek
http://wisdomgeek.co[...]
2016-05-19
[20]
서적
Fundamentals of Software Architecture: An Engineering Approach
O'Reilly Media
[21]
논문
Improving computer program readability to aid modification
[22]
웹사이트
Readability
http://docforge.com/[...]
[23]
웹사이트
SSL/Computer Weekly IT salary survey: finance boom drives IT job growth
http://www.computerw[...]
2007-09-11
[24]
웹사이트
The Cobol Brain Drain
http://www.computerw[...]
Computer World
2012-05-21
[25]
웹사이트
Photograph courtesy Naval Surface Warfare Center, Dahlgren, Virginia, from National Geographic Sept. 1947
https://www.national[...]
2020-07-15
[26]
서적
Code Nation: Personal Computing and the Learn to Program Movement in America
ACM Books
2020
[27]
서적
2014 Worldwide Software Developer and ICT-Skilled Worker Estimates
International Data Corporation
2014
[28]
서적
The Computer Boys Take Over: Computers, Programmers, and the Politics and Technical Expertise
The MIT Press
2010
[29]
서적
Code Nation: Personal Computing and the Learn to Program Movement in America
ACM Books
2020
[30]
논문
The role of the digital computer in the university
1961
[31]
서적
Code Nation: Personal Computing and the Learn to Program Movement in America
ACM Books
2020
[32]
서적
Code Nation: Personal Computing and the Learn to Program Movement in America
ACM Books
2020
[33]
논문
Relating Natural Language Aptitude to Individual Differences in Learning Programming Languages
2020-03-02
[34]
웹사이트
To the brain, reading computer code is not the same as reading language
https://news.mit.edu[...]
2020-12-15
[35]
웹사이트
What is coding
http://yearofcodes.t[...]
2014-03-03
[36]
웹사이트
What is programming
http://yearofcodes.t[...]
2014-03-03
[37]
웹사이트
A 13th Century Programmable Robot
http://www.shef.ac.u[...]
[38]
문서
タイムシェアリングシステムの発達
[39]
논문
Making the Invisible Visible: Guidelines for the Coding Process in Meta-Analyses
http://journals.sage[...]
2022-10
[40]
웹사이트
http://catb.org/jarg[...]
[41]
문서
アクションゲームにおける1フレーム中の計算可能性
[42]
문서
アセンブリ言語
[43]
문서
デバッグとバグの種類、特異なバグ
[44]
논문
A Systematic Review of the Challenges in Teaching Programming for Primary Schools’ Students
https://publisher.ut[...]
2023-03-30
[45]
서적
実践F# 関数型プログラミング入門
https://books.google[...]
技術評論社
[46]
웹사이트
Survey of Job advertisements mentioning a given language
http://www.computerw[...]
[47]
웹사이트
What Are The Benefits Of Chat GPT-4 Over GPT-3.5
https://mytasker.com[...]
2023-05-26
[48]
웹사이트
ChatGPT Copyright: Everything you need to know
https://neuroflash.c[...]
2023-02-21
[49]
웹사이트
ノンプログラミング が熱い!7つの背景
https://xeex-product[...]
2017-11-13
[50]
논문
Relation between Alice software and programming learning: A systematic review of the literature and meta‐analysis
https://bera-journal[...]
2017-11
[51]
논문
Hackers and Painters
http://www.paulgraha[...]
2003-00-00
[52]
서적
ハッカーと画家
オーム社
[53]
문서
プログラマが知るべき97のこと/コードは設計である
[54]
문서
COBOL
[55]
문서
初級システムアドミニストレータ試験、基本情報技術者試験
[56]
문서
Perl
[57]
서적
순서도 작성
정익사
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com