[[분류:가져온 문서/자유인사전]] Programming 프로그램을 만드는 작업을 지칭하며, 이 작업을 하는 사람을 [[프로그래머]]라고 한다. 소프트웨어 엔지니어라고도 한다. 이 작업은 문제를 인식하고 그것을 해결하기 위한 소프트웨어를 설계하고 구현하는 과정으로 시작된다. 문제를 해결하기 위해 많은 논의를 거쳐 접근 방식을 디자인하며, 프로그래밍 언어를 사용하여 소프트웨어를 실제로 구현한다. 이후에는 지속적인 유지보수와 개선 작업이 이뤄진다. == 역사 == 증기기관을 동력으로 하는 자동 계산 기계에서 시작하여, 튜링의 이론에 의해 코드가 짜여지고, 사람이 직접 조작하는 진공관을 이용한 전자 계산기로 발전했다. 이후 프로그램 내장 방식과 천공카드를 거쳐, 결국 소프트웨어로 소프트웨어를 만드는 지경에 이르기까지 약 150년이 걸렸다. === 최초의 프로그래머 === 영국의 에이다 러브레이스(서기 1815~1852)는 최초로 영국의 수학자 찰스 배비지(서기 1791~1872)가 고안한 해석기관이라는 공상의 계산기계에 쓸 수 있는 명령의 모음을 수식으로 엮어서 소프트웨어를 개발했다. 그가 개발한 최초의 소프트웨어는 해석기관으로 베르누이 수열을 계속 구할 수 있는 프로그램이였다. 이 사람은 제어문과 함수화 등 현대 고급 프로그래밍 언어의 모델을 제시했다. 하지만 그의 코드는 실물 컴퓨터를 사용하지 않고 코딩되었으며, 이것이 가능한지는 베비지 해석기관을 이해하고 실물을 설계해서 천공카드로 돌려보는 방법밖에는 없다. 아쉽게도 아직까지 해석기관을 실물로 만든 예는 없다. 위와 같이 최초의 프로그래머는 여성이였고, 애니악 때 까지도 많은 여성 수학도들이 컴퓨터 프로그램을 설계했다. 그러나 현재 전 세계에서 가장 많은 급여를 받고 많은 부가가치를 창출해내는 직종은 소프트웨어 공학자들과 프로그래머들이나, 유감스럽게도 여기에 여자 비율은 그렇게 많지 않다. 공과대학 성비는 거의 해마다 계속 벌어지고 있고, 특히 원래 성비가 그나마 붙어있던 컴퓨터공학은 1980년대 이후 급격하게 벌어진다. === 소프트웨어 다루기 === 영국의 수학자 앨런 튜링(서기 1912~1954) 규칙이 있는 기호로 수식이 기록된 길이가 무한한 종이 두루마리를 어떤 기계가 기호를 읽고 기호가 지시하는 규칙대로 움직이면서 다시 어떤 무한한 길이의 종이 두루마리에 기록을 하고, 그 기록을 다시 기계가 읽으면서 기계가 스스로 계산을 할 수 있다는, 꼭 컴퓨터처럼 작동하는 어떤 추상적인 기계를 구상해낸다. 하지만 이것은 결국 당시로써는 공상이였기 때문에 결국 계산기계는 계산하려는 수식에 따라 사람이 기계를 손수 조작하도록 발전한다. 시대가 지나서 진공관이라는 게 발명되고 그 진공관으로 전자를 편의에 맞게 조종할 수 있게 되면서 전자계산기는 전자화 되기 시작한다. 그 중 대표적인 기계가 ENIAC(1945)이다. 하지만 이런 기계도 튜링 머신의 모델을 따르기에는 무리가 있었다. 결국 한 글자 한 글자 사람이 직접 만지고 돌려줘야 하는 불편함이 있었다. 이 때 프로그램을 이루는 숫자들을 여러 개로 나열된 어떤 수를 저장할 수 있는 데에다가 시작점이 아무데나 라도 좋으니까 자릿수 순서대로 전자적인 방법으로 채워놓고 그 숫자 덩어리들을 연산할 수 있는 방법을 폰 노이만(1903~1957) 이라는 사람이 주장한다. 그리고 이를 수은 지연 회로를 메모리로 응용하면서 현실에서 실용할 수 있게 하는데, 이것은 제어장치와 연산장치, 램으로 구성된 현대 컴퓨터의 시초가 된다.(EDSAC, 1947) 그리고 이 프로그램을 저장해놓고 사용하는 방식에 진공관 하나를 이진수 한 자리라고 두는 이진수 컴퓨터가 발명되었다.(EDVAC 1949) 1950년대 중반에 들어서는 트랜지스터의 응용으로 그 동안 크기, 발열, 폭발 등의 문제가 많던 진공관을 대체했다. === 사람이 쓰는 거니까 === 트랜지스터는 점점 작아질 수 있었고, 그래서 더 많이 붙여 넣을 수 있었고, 그래서 더 빠르게 계산이 가능했고, 그래서 더 많은 프로그래밍의 가능성이 열렸다. 그러나 사람이 정한 규칙대로 0과 1을 조합해서 함수를 조작하고 제어하도록 하니까 그걸 만드는 사람, 그 결과를 받아보는 사람, 사람 스스로 복잡하게 되었다. 따라서 일련의 규칙으로 0과 1의 조합을 문자로 나타내고, 이 문자를 다시 0과 1로 풀어서 나타내는 것을 컴퓨터로 구현하기 시작한다. 그리고 실제로 가능했다. 가장 쉬운 방법은 숫자 카드에 구멍을 뚫어서 문자와 숫자 등을 나타내는 방법이였다. 이런 아이디어로 사람이 쓰는 문자를 이용해서 별도의 해석기에 천공카드를 읽혀 사람이 원하는 대로의 규칙을 가진 0과 1의 조합을 컴퓨터에 입력할 수 있게 되었다. 이게 프로그래밍 언어가 나올 수 있었던 이유이다. 이런 식으로 나온 수 많은 사람이 이해할 만한 규칙 중 하나가 '코볼'(1959)이다. 그러나 이 천공카드로 해석기에 읽혀서 다시 컴퓨터에 가져다가 입력을 해서 하는 것은, 사실 디버그는 편하겠지만 당시 기술로는 좀 많이 느렸다. 따라서 인류는 사람이 이해할 만큼 문서화가 가능한 너무 길지 않은 프로그래밍 언어로 프로그램의 전부를 코딩하고, 이 코드들을 한 번에 이진수로 풀어 모아놓고, 이 해석을 한 이진수 모듬을 저장해 놨다가 쓸 때마다 그 이진수 모듬만 메모리에 불러와서 써볼까 하는 생각을 했다. 이게 바로 컴파일이 되었다. 단 이 작업은 프로그램을 사용할 때는 빠르게 사용이 가능 하겠지만, 해석하는 데에는 아무래도 숫자보다 많은 문자가 쓰이고, 시간이 매우 오래걸리고, 저장장치라고는 구멍뚫린 두툼한 종이 두루마리 정도라서, 전자나 자기장을 이용해 데이터를 저장 할 수 있는 저장장치가 대중화 되기 이전까진 쓸 수가 없었다. 하지만 이런 기술은 생각보다 빠르게 발전한다. [[미국]]이 이 기술에 집중 투자를 시작했기 때문이다. == 공부와 소양 == 이하는 아마도 필수적인 소양이다. * 수학 * 물리 * 컴퓨터 공학·과학 * 컴퓨터 자료처리·구조 * 컴퓨터 구조 * 알고리즘[* 수학과 겹친다] * 프로그래밍 언어 * 구글링 실력과 영어 부수적으로는 밑의 소양이 필요하다. 경영 및 기획자들에게 개발팀이 어떤 식으로 문제를 접근했는지, 어떤 방법으로 해결하고 있고, 기획상에서 어떤 문제가 있는지, 정확히 얘기하고 소통할 줄 알아야한다. 기획자와 경영자들이 자신들과 같은 지식을 갖고 있다는 전제하에 대화를 하면 안된다. 하지만 재밌게도 정작 이런 사람들이 모여있는 곳에서는 서로 소통 자체를 매우 공격적으로 하기도 한다. 비단 위의 문제 뿐만 아니고 많은 사람들의 집단지성으로 이루어지는 오픈소스 프로젝트에 참여하거나, 일반 상업프로그램을 만들때 등 다른 개발자들과의 소통이 많을 수 밖에 없는 직종이기 때문에 소통능력은 필요하다. 기본적으로 컴퓨터에 대한 심층적인 수적 논리력과 이해력을 필요한다. 이것 때문에 많은 프로그래머들이 수학을 배우게 한다. == 고등학교 과목 == 프로그래밍은 상업고교 관련 과의 정규과목으로 편성되어 있는데 프로그래밍과 프로그래밍 실무로 분류되어 있다. 디지털미디어고등학교나 선린인터넷고 같이 특성화되거나 수준이 높은 상업고교의 경우에는 아주 심층적으로 다루는 부분이지만, 보통의 상업고교는 학생들의 수준에 맞춰 실습 시 사용하는 컴파일러는 볼랜드 터보 C 이고, 실무 과목에선 Visual basic이다. 2010년 이야기이다. 일반 상업고등학교에서는 도내 실업계 경진대회의 프로그래밍 종목에 도움이 되지 않는 내용을 가르치는 경우가 많다. 이로 인해 실질적으로 배우는 느낌이 들지 않으며, 직업인을 양성하는 목적과는 전혀 상반된다. 사실 상업고등학교에서 프로그래머를 양성한다는 것은 무리가 있는 일이다. 같은 상업고등학교의 인터넷 일반이나 정보통신과 같은 과목은 유익한 것에 비하면 상당히 아쉬운 편이다. 따라서 프로그래머를 지향하는 중학생은 선린인터넷고나 디지털미디어고, 대학 부설 영재고에 진학하거나, 일반계고에 들어가서 대학교의 컴퓨터 공학과에 진학하여 배우는 것이 더 유리하다. == 수능 과목 == 수학능력평가시험 직업탐구영역의 프로그래밍 과목은 백분위가 극과 극으로 나뉜다. 중간이 없는 과목으로 유명하다. 현재는 폐지되었다. [Include(틀:가져옴,O=자유인사전, C=[[https://creativecommons.org/licenses/by-nc-sa/3.0/deed.ko|CC BY-NC-SA 3.0]], L=[[https://web.archive.org/web/20200805224346/https://licentium.net/w/index.php?title=%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&diff=26539&oldid=25120|링크]])]