[작성자:] snowall

  • 오차

    실험을 통해서 얻게 되는 측정값은 참값과 다를 수 있다. 같을 확률이 사실상 0이다. 따라서 실험 결과를 보강하기 위해서는 반복실험을 통해 여러 개의 측정값을 얻고, 그로부터 참값을 추정하는 방법이 이용된다. 반복실험을 통해서 얻게 되는 측정값은 측정할 때 마다 다른 값이 나올 수 있는데, 측정할 때 마다 다른 값이 나오는 이유는 여러가지가 있을 수 있다. 즉, 실험적 오차, 이론적 오차, 통계적 오차이다.

    실험적 오차는 실험장치를 실제로 만든 것이 설계된 실험 장치와 다를 수 있어서 나타나는 오차이다. 예를 들어, 입자 검출기의 효율이 100%일 것을 전제하고 실험을 설계했을 때, 실제로 입자 검출기는 100% 효율이 나오지 않으므로 그에 따른 오차가 나타난다.

    이론적 오차는 측정값을 이론적으로 해석할 때 나타나는 오차이다. 이론적으로 어떤 현상을 설명할 때 얻게 되는 결과는 구체적인 물리적 수치를 집어넣어서 실제 실험값으로 계산을 하게 되는데, 이 때 사용되는 물리적 수치에 오차가 있기 때문에 나타나는 오차이다.

    통계적 오차는 우리가 측정을 할 때 모집단의 실제 분포를 알 수 없기 때문에 나타나는 오차이다. 즉, 우리가 구할 수 있는 것은 어디까지나 표본공간의 분포이며, 결국 검증할 수 있는 것은 실험 결과에 대한 내용일 뿐 실제 참값과는 다를 수 있다.

    물리학에서 말하는 불확정성 원리는 그 중 통계적 오차들 사이의 관계에 대해 이야기한다. 즉, 실험 오차나 이론 오차가 전혀 없다고 하더라도, 어떤 두 변량의 측정 오차에 대해서는 그 곱을 어떤 값 이하로 줄일 수 없는 경우가 발생한다는 것이다.

  • 프로그래밍 언어 공부하기2

    그렇다면 프로그램은 어떻게 작동하는가?

    컴퓨터가 실제로 수행할 수 있는 명령어는 기계어 뿐이다. 기계어는 0과 1로 이루어진 언어인데, 현재 기계어로 코딩이 가능한 사람은 없다고 봐도 좋다. 역사적으로도 몇명 없었고. 컴퓨터에게 일을 시키려면 기계어로 집어넣어야 하는데 사람은 기계어를 직접 쓸 수 없으니까 사람이 쓴 언어를 기계어로 번역하는 프로그램이 필요하다. 그 프로그램은 어떻게 만들었냐고? 그 프로그램도 기계어를 번역하는 다른 프로그램으로 만든 것이다. 그런식이면 최초에 기계어로 번역하는 프로그램은 어떻게 만들어졌냐고 물어볼 수 있을텐데, 당연히 그때는 프로그램을 기계어로 만들었었다. 옛날에는 기계어도 간단했기 때문에 기계어를 직접 사람이 코딩할 수 있었고, 점점 컴퓨터가 복잡해지면서 인간의 능력으로는 쫒아가기 힘들어지다보니 인간이 알아볼 수 있는 언어와 기계어를 번역하는 프로그램을 만들게 된 것이다. 그런 프로그램도 처음에는 기계어를 이용해서 만들었지만, 차츰 기술이 발전하면서 그런 프로그램을 번역하는 프로그램을 만드는데도 기계어가 아니라 좀 더 높은 수준의 언어를 사용할 수 있게 되었다. 이 글은 컴퓨터 역사에 관한 글은 아니므로 여기서 넘어가도록 하자.

    컴퓨터 프로그램은 그럼 어떻게 만들어야 할까? 앞에서 설명했듯이 컴퓨터가 할 수 있는 것은 사칙연산과 조건판단, 무한반복 뿐이다. 즉, 우리가 컴퓨터에게 시키려는 구체적인 일을 이 세가지 작업의 조합으로 잘게 쪼개야 한다. 그리고 그렇게 쪼개고 나면 세가지 작업을 어떤 순서로, 어떤 방향으로 실행시키는지가 나오는데 그것을 “순서도”라고 한다. 그리고 그것을 구체적으로 어떤 순서로 쪼개서 실행시키는지를 “알고리즘”이라고 한다. 프로그램을 만들기 위해서는 알고리즘을 잘 사용하고, 순서도를 잘 그리는 것이 중요하다.

    순서도는 어떻게 그려야 할 것인가? 인터넷을 검색해 보면 순서도를 그리는데 사용하는 도형들이 나온다. 직사각형, 마름모꼴, 번개표시, 물결표시, 원기둥 등등. 그런 표준 도형을 사용하면 내가 그린 순서도를 다른 사람이 알아보기 쉽게 그리는데 도움이 된다.

    먼저, 프로그램이 뭘 하는지를 적는다. 이렇게 한 문장만 적어놓고 보면 앞서 얘기한 세가지 작업, 사칙연산, 조건판단, 무한반복의 조합으로 써 있을리가 없다. 물론 이미 그렇게 써 있다면 끝나는 것이겠지만. 프로그램이 이 세가지 기본 작업을 통해서 일을 처리하려면, 프로그램이 하는 일을 더 잘게 세분해야 한다. 어떤 단계를 거쳐서 문제를 풀게 되는지, 각 단계마다 어떤 작업을 해야 하는지 등등. 이것을 아주 상세하게 쪼개서 최종적으로 저 세가지 기본 작업의 조합으로 써 있게 되면 순서도 작성이 끝나는 것이다.

    세가지 기본 작업의 덩어리를 함수(function)라고 부른다. 언어나 동네에 따라서는 서브루틴, 메소드 같은 다른 용어를 쓰기도 하지만 아무튼 다 그게 그거다. 어떤 함수는 저 세가지 기본 작업들로 이루어진 덩어리인데, 그 함수를 실행시키면 한 단계의 작업을 처리한다. 이 때, 입력을 받아서 출력을 내놓는 것이다. 그리고 커다란 프로그램은 함수 여러개를 모아서 작업을 처리한다. 함수는 그 내부에서 세가지 기본 작업 뿐만 아니라 다른 함수를 불러와서 쓸 수도 있다. 심지어 자기 자신을 불러와서 사용할 수도 있다.

    결과적으로 프로그램을 만든다는 것은 프로그램 전체가 해야 할 일을 여러개의 함수로 쪼개고, 각 함수를 한줄씩 한줄씩 채워 넣는다는 것이 된다.

    그렇다면, 어떻게 쪼개야 하는가?

    예를 들어, 소설을 쓴다고 하면, 소설은 짧게는 글자로 이루어진 긴 문자열이지만, 거기에는 의미가 담겨있다. 첫 문장과 결말을 안다고 해서 소설을 다 읽은게 아니듯이, 프로그램도 무슨 일을 할지 정했다고 해서 일이 끝나지는 않는다. 장과 절을 나누고, 절은 문단으로 나누고, 문단은 문장으로 나누고, 문장은 단어로 이루어지게 된다. 마찬가지로 컴퓨터 프로그램도 각각의 의미있는 단어를 순서대로 늘어놓아서 컴퓨터가 작동하도록 하는 것이다.

    (이어서…)

  • 프로그래밍 언어 공부하기

    프로그래밍 언어는 컴퓨터 프로그램을 만들기 위해서 알 필요가 있다. 어떻게 공부하면 좋은가.

    먼저, 컴퓨터가 어떻게 작동하는지 알 필요가 있다. 컴퓨터 공학을 정식으로 전공하지 않은 사람들이나 컴퓨터의 구조와 작동원리에 대해서 구체적으로 공부하지 않은 사람들에게 컴퓨터라는 기계는 키보드와 마우스를 움직여서 뭔가를 입력하면 모니터에 원하는 그림을 그려주는 장치일 뿐이다. 그렇다면 프로그래밍을 공부하기 위해서 컴퓨터라는 기계는 어떻게 이해해야 할 것인가?

    컴퓨터는 연산장치, 기억장치, 제어장치, 입력장치, 출력장치로 되어 있다. 다른 형태로 되어 있는 컴퓨터가 있는지, 만들어질 것인지는 나도 잘 모르겠지만, 우리가 현재 컴퓨터라고 부르는 모든 장치는 모두 저 다섯가지 기본 요소를 갖고 있다. 믿을 수 없겠지만, 당신이 지금 사용하고 있는 모든 프로그램, 운영체제라든가, 워드, 엑셀, 게임 같은 것들은 모두 저 다섯가지 기능의 조합으로 이루어진 것이다. 저것들이 구체적으로 어떻게 작동하는가는 굉장히 복잡한 내용이다. 하지만 프로그래밍을 하기 위해서 알아야 하는 것은 저 다섯가지 장치의 역할들이다.

    먼저, 연산장치는 연산을 담당한다. 여기서 말하는 연산이란 숫자를 갖고 하는 사칙연산이다. 그거 맞다. 덧셈, 뺄셈, 곱셈, 나눗셈을 말한다. 연산장치는 외부에서 숫자 두개를 받아서 원하는 사칙연산을 한 후, 그 결과물을 밖으로 내보낸다. 연산장치에 숫자를 전해주거나 그 결과물을 받는 것은 기억장치이다. 기억장치는 그 내부에 숫자를 저장할 수 있는 공간을 여러개 갖고 있는데, 위치를 알려주면 그 위치에 저장된 숫자를 알려주거나, 반대로 위치와 숫자를 넣으면 그 위치에 숫자를 저장하는 기능이 있다. 제어장치는 연산장치에 어떤 연산을 할지 정하거나, 숫자를 기억장치의 어떤 위치에 넣거나 읽어올지 정하는 장치다. 입력장치는 사용자에게서 숫자를 입력받을 수 있다. 정확히 말하면, 기억장치에 숫자를 입력하는 모든 장치를 입력장치라고 한다. 출력장치는 기억장치에 저장된 숫자를 읽어서 외부에서 알 수 있게 내보내는 장치이다. 모든 컴퓨터 프로그래밍 언어에는 컴퓨터가 갖고 있는 이 다섯가지 기능을 사용할 수 있는 명령어가 있다.

    컴퓨터 프로그래밍 언어는 고수준 언어, 저수준 언어, 이런 것들이 있다.(고 한다.) 그것들을 어떤 기준으로 어떻게 구분하는가는 별로 중요한 문제가 아니고, 저수준 언어는 기계어, 어셈블리어가 있고 나머지는 다 고수준 언어라고 생각하면 된다. 특이한 예외로 C언어는 저수준 언어의 특징과 고수준 언어의 특징을 모두 갖고 있는 언어이다.

    예를 들어서, C언어를 생각해 보자. C언어는 가장 널리 쓰이고 있는 언어 중 하나이고, 아마 우리가 살아있을 동안은 계속해서 쓰일 언어이다. C언어에서는 그럼 위의 다섯가지 기능이 어떻게 구현되어 있을까?

    먼저, 기억장치는 변수 선언을 통해서 이용할 수 있다.

    int a=0;

    자, 이런 명령을 쓰게 되면 a라는 이름을 가지는 변수가 생기고 거기에는 0이라는 정수가 들어간다. 이 때, a라는 이름은 실제로는 기억장치의 어딘가에 있는 주소와 연결되어 있다. 그 주소는 실제로는 굉장히 길고 복잡한 숫자로 되어 있는데, 그 주소를 a라고 부르는 것이다.

    연산장치는 +, -, *, /라는 네가지 연산자를 통해서 사용할 수 있다. 물론 여러분이 알고 있는 그 기호 맞다. a와 b라는 두 변수에 숫자를 저장해 두었다고 할 때 a+b라고 쓰면 연산장치는 a에 있는 수와 b에 있는 수를 불러와서 더하는 역할을 한다. c=a+b라고 하면 a+b를 계산한 결과를 변수 c에 저장한다.

    제어장치는 연산장치가 어떤 연산을 어떤 순서로 수행해야 하는지 정해준다. 별다른 지시사항이 없다면 컴퓨터는 시키는 순서대로 연산을 수행한다. 하지만 우리가 실제로 컴퓨터에게 일을 시키다보면 어떤 조건에 따라서 다른 연산을 수행하거나, 특정한 일을 반복하거나 해야 한다. 예를 들어 아무 생각 없이 a+b를 10번 계산해야 한다면, 프로그램에 a+b를 10번 써야 한다. 하지만 이렇게 되면 우리가 생각할 수 있는 모든 경우의 수를 모두 고려하여 처음부터 프로그램에 다 써넣어야 하기 때문에 굉장히 괴로워 질 것이다. 따라서 a+b를 10번 수행하라는 명령 그 자체를 입력할 수 있다면 편리하다. 이 때 사용하는 명령어가 if, for, while과 같은 제어문이다. goto도 있긴 한데 goto는 금단의 명령어, 악마의 유혹, 뭐 그런거라고 알아 두면 된다. if는 조건을 비교해서 조건이 만족되면 주어진 명령어를 수행하고, 조건이 만족되지 않으면 수행하지 않는다. for는 정해진 횟수만큼 명령을 반복하고, while은 다른 입력이 있을 때 까지 명령을 무한히 반복한다.

    입력장치는 키보드, 마우스와 같은 장치에서 받은 신호를 컴퓨터가 이해할 수 있는 수로 바꿔서 기억장치에 집어넣는다. 사실은 하드디스크나 다른 장치에서 들어오는 모든 신호들 역시 입력장치에서 받아올 수 있고, 랜카드나 블루투스처럼 다른 장치와 통신하는 장비 역시 입력장치의 범주에 있다고 볼 수 있다. 즉, 여기서 말하는 입력장치는 기억장치에 수를 넣을 수 있는 모든 장치를 뜻한다.입력장치에 해당하는 C언어 함수로는 scanf()함수가 있다. scanf()는 키보드에서 입력을 받아서 지정된 변수에 집어넣는다. 앞서 말했듯이 변수는 기억장치를 뜻하므로, 이렇게 받은 입력은 기억장치에 들어간다.

    출력장치는 반대로 기억장치에서 수를 읽어와서 다른 장치로 보내는 역할을 한다. 예를 들어 모니터는 컴퓨터의 비디오 메모리에 있는 값을 읽어와서 화면에 점들의 밝기를 조절하여 나타낸다. 스피커라든가, 프린터라든가 하는 모든 장치는 컴퓨터가 갖고 있는 기억장치에서 수를 읽어와서 외부로 보여주는 장치라고 생각하면 된다. C언어에서는 printf()라는 함수를 제공하는데, 이 함수는 주어진 변수에서 값을 읽어와서 화면에 출력하는 역할을 한다.

    우리가 실제로 사용하는 컴퓨터는 이 다섯가지 장치를 하나씩 갖고 있는 것이 아니라, 여러개를 갖고 있다. 화면에 표시할 내용을 결정하는 그래픽카드는 컴퓨터 본체와 별도로 이 다섯가지 장치를 따로 갖고 있어서 컴퓨터 본체가 해야 할 일을 줄여준다. 하지만 모든 컴퓨터 장치는 이 다섯가지 장치들의 협력으로 작동하므로, 결국 우리가 프로그램을 만든다는 것은 이것들을 어떻게 다루느냐의 문제가 되는 것이다.

    이 다섯가지 장치의 역할을 좀 더 추상적으로 얘기하면 이렇게 생각할 수 있다. 컴퓨터가 하는 것은 어떤 수를 입력받아서, 다른 수로 바꿔서 내놓는 일이다. 여기서 입력받은 수에 따라서 내놓는 수는 결정되어 있으며, 어떤 방식으로 바꿀 것인지를 프로그래머가 정해주는 것이다. 그리고, 어떤 방식으로 바꿀 것인지 그 구체적인 방식 그 자체를 알고리즘이라고 한다. 예를 들어, 굉장히 무식한 방식으로 프로그램을 만든다면 1에는 1, 2에는 5, 3에는 9, 4에는 8, … 이런 식으로 결과를 내놓으라고 할 수 있다. 그것도 물론 잘 작동할 수만 있다면 괜찮은 프로그램이다. 하지만 32비트 컴퓨터가 표현할 수 있는 수가 42억개인데, 우리가 42억개의 수에 대해서 하나하나 전부 그 결과값을 지정한다면 그건 코딩이 아니라 고문이라고 해야 할 것이다. 실제 프로그래머들은 그렇게 작업하지 않는다.

    (이어서…)

  • 컴퓨터 프로그램 개발

    컴퓨터 프로그래밍을 공부하려는 사람들이 자의든 타의든 늘어나고 있다. 내가 처음에 컴퓨터 프로그래밍을 공부했을 때에는 초등학교 3학년, 아마 92년이었던 것 같은데, 그 때 아버지 손에 이끌려서 총무처 전산실에서 시행하는 직원 가족 대상 컴퓨터 교육에 갔었을 때이다. 그 때 배운 언어는 GW-BASIC이라는 것인데, 솔직히 그 때는 내가 알파벳도 모르던 시절이었다 보니 뭘 어떻게 해야 하는지 모르고 그냥 보이는대로 코드를 그대로 붙여서 쳤다. 실행되면 뭐 그런가보다 했고, 뭐가 어떻게 되는지는 전혀 이해할 수 없었다. 그 이후로 컴퓨터는 나에게 그냥 오락기였고, 딱히 컴퓨터 프로그램 개발에 대해서 공부할 일은 거의 없었다. 그리고 대학에 가서 대학교 3학년이 되었을 때 처음으로 C언어 프로그램을 만들어서 컴파일 할 수 있었다. 어쨌든, 어디서 정식으로 컴퓨터 프로그램을 공부한 적은 없고 책과 인터넷을 뒤져가면서 공부한 게 전부다. 나중에 방송대에서 컴퓨터과학 전공과정을 이수하기는 했는데 사실 그거는 수업 안듣고 시험만 쳤기 때문에 뭘 배웠다고 하기는 좀 그렇다.

    자, 그럼, 초보자들이 프로그램 만드는 방법을 어떻게 공부하는 것이 좋을까? 이 글에서는 그에 대한 이야기를 하려고 한다. 사람마다 각자 자신만의 방법이 있고, 내가 소개하려는 방법이 가장 좋은 방법이 아닐 수도 있지만 이것은 그냥 내 경험에 기반한 이야기가 될 것이다. 이 글은 컴퓨터를 켜서 워드 프로그램이나 아래한글 프로그램으로 문서를 작성해 본 사람 정도를 대상으로 한다.

    프로그램을 만드는 과정은 기획-설계-코딩-디버깅-검수-출시 단계로 나누어진다. 그중 가장 중요하지 않은 단계는 코딩이다. 의외로 코딩의 중요성이 가장 떨어진다. 가장 중요한 과정은 기획이고, 그 다음으로 중요한 단계는 검수이다. 하나씩 설명해 보자.

    기획은 어떤 프로그램을 만들 것인지 생각하는 단계이다. 이 단계에서는 프로그램이 어떤 작동을 해야 하고, 겉모습은 어떻고, 누가 사용할 것이고, 어떤 상황에서 사용할 것인지 세세히 정하는 것이다. 프로그램을 처음부터 끝까지 혼자서 다 만든다면 크게 문제가 되지 않지만, 여럿이서 협력해서 만드는 경우에는 가장 중요한 과정이된다. 기획이 제대로 되어 있지 않으면 그 프로그램의 개발 과정은 망한다고 보면 된다.

    프로그램의 기획이란 어떻게 하는 것인가? 가장 쉽게 말하면, 앞으로 사용하게 될 프로그램의 사용설명서를 만드는 과정이라고 생각하면 된다. 사용설명서에 적혀있는 내용은 그대로 작동해야 하고, 거기에 적혀있지 않은 내용은 어떻게 될지 모른다. 그것이 가장 중요하다. 따라서 사용설명서는 최대한 자세히 작성해야 한다. 사용설명서는 어떻게 적어야 하는가? 앞에서 적어두었듯이, 사용설명서는 이 프로그램이 어떤 목적을 갖고 있고, 어떤 기능을 하는지 적는 것이다. 윈도우에서처럼 그래픽 인터페이스를 사용하는 프로그램이라면, 어떤 모습을 갖고 있을지 그림을 그리고, 그 그림에서 어느 부분을 누르면 어떤 일이 일어나는지 적는 것이다. 이 부분을 누르면 새로운 창이 뜨고, 저 부분을 누르면 어떤 기능이 처리되는 등등에 대해 설명하는 것이다. 이 설명을 자세하게 쓰면 쓸 수록 더 좋은 프로그램이 만들어진다. 여기에 사용되는 언어는 꼭 이과적이어야 한다거나, 전문용어를 사용해야 한다거나, 그럴 필요는 없다. 중요한 것은 굉장히 구체적이어야 한다는 점이다. 사용설명서를 읽어본 사람들은 알겠지만, 굉장히 쓸데없고 상식적일 것이라고 생각되는 이야기들까지 모두 적혀 있다. 당신이 만든 기획서 역시 그렇게 되어야 한다. 사용자가 이상한 행동을 할 때에 프로그램이 어떻게 반응해야 하는지도 적어야 한다.

    그 다음 설계인데, 기획서를 바탕으로 실제로 무엇을 만들어야 하는지 구성하는 과정이다. 설계는 어떤 언어를 이용해서 만들지, 어떤 프레임워크를 사용할지, 어떤 라이브러리를 사용할지, 어떤 알고리즘을 사용할지 구체적으로 정하는 단계이다. 프레임워크, 라이브러리, 알고리즘 같은 것이 어떤 것들인지 잘 모를 수 있는데, 그것은 프로그래밍 공부를 하다 보면 알게 될 것이다. 설계 단계에서 어떻게 프로그램을 쪼개서 만들 것인지 고민하게 된다. 이 부분에서 프로그래머와 기획자가 굉장히 소통을 많이 해야 한다. 프로그래머는 자신이 이해하지 못한 것은 만들 수 없고, 기획서에 써 있지 않은 것은 만들지 않는다. 프로그래머는 자신이 이해하지 못한 부분을 끝까지 물어봐야 하고, 기획자는 프로그래머가 이해할 때 까지 최대한 상세하고 쉽게 설명을 해야 한다. 안 그러면 그냥 똥 쓰레기 프로그램이 만들어질 뿐이다.

    코딩은 구체적으로 프로그램을 만드는 과정이다. 프로그래밍 언어라는 것은 이 과정에서 쓰인다. 설계된 내용에 해당하는 코드를 작성하면 되는데, 이 부분은 다른 글에서 다시 작성하려고 한다. 대부분의 컴퓨터 학원에서 배우는 것은 이 부분이라고 보면 된다.

    디버깅은 프로그램에 나타난 버그를 잡는 과정이다. 버그는 프로그램이 원치 않는 작동을 하는 경우를 말하는데, 단순히 컴파일이나 작동 과정에서 오류 메시지가 나오는 걸 막는 것을 뜻하는 것이 아니다. 오류 메시지가 나타나는 것은 당연히 다 잡아야 하고, 그게 문제가 아니라 실제로 코드가 원하는 대로 만들어 졌는지 확인하는 과정이다. 예를 들어, 1+1을 수행시켰을 때 2가 나오는 것이 정상적인 작동인데, 3이 나오도록 작동한다면 문제가 되는 것이다. 이런 종류의 문제는 그것이 컴파일 과정에서는 오류가 나타나지 않을 수 있지만, 실제로 작동시켜보면 문제가 나타난다. 이것이 정상적인 작동인지 문제가 있는 작동인지는 프로그래머가 판단할 수 밖에 없다. 이것을 디버깅 과정에서 잡아낸다. 이 과정에서 발견된 오류는 코딩 과정에서의 문제이다.

    검수는 프로그램이 기획한 대로 만들어졌는지 확인하는 과정이다. 검수는 기획자가 직접 하거나, 사용설명서를 읽으면서 제3자가 검수를 하게 된다. 특히, 가능하면 아무것도 모르는 제3자가 사용설명서만 읽으면서 이것저것 사용해 보는 것이 중요하다. 프로그램의 기획 시점에서 알 수 없었던 작동을 사용자가 했을 때 어떤 일이 일어나는지 알아내려면, 편견 없이 사용해 볼 수 있는 사람이 있는 것이 좋다. 예를 들어, 100 이하의 값을 입력할 것이라고 생각하는 위치에 10억이라는 이상한 값을 넣으면 어떤 작동이 일어나는지 등등. 이 과정에서 발견된 문제는 기획 단계에서의 문제이다.

    출시는 이제 다 만들어진 프로그램을 다른 사람들에게 쓰라고 보내주는 과정이다. 이후 이 프로그램을 계속 발전시켜 나가고 싶으면 다른 사용자들이 전달해주는 이야기를 잘 듣고 새로운 기획을 해서 프로그램의 다음 버전에 반영시키는 것이다.

    이제 코딩, 즉 프로그래밍 언어를 어떻게 공부하는지 알아보자.

  • 연결된 것들

    한 분야에서 발견되거나 만들어진 개념이 다른 분야로 넘어가서 사용되는 경우가 있다. 물리적인 의미로 넘어갈 수도 있고, 비유적인 의미로 넘어갈 수도 있다.

    예를 들어, 유체역학의 물질미분은 미분기하학의 방향미분이며 동시에 양자장론의 정준미분이다. 엔트로피는 원래 무질서한 정도를 이야기 하려는 통계역학에서 만들어졌지만 정보의 양을 나타내는 값으로도 사용되면서 정보이론이나 계산과학에서도 사용되고 있다. 통계학에서 나오는 평균은 물리학에서 말하는 무게중심이며, 분산은 관성모멘트에 해당한다.

  • 코딩알바 (백업글)

    1. 페이는 시간으로 계산하는데, 작업 공수라는걸 먼저 산정합니다. 이거는 기획서나 개발명세서나 설계도를 보고 본인이 토탈 몇 시간동안 작업하면 되겠다는 예상입니다. 너무 넉넉하면 갑님이 싫어하고, 너무 쫄리면 본인이 힘들어지니까 정확하게 산출하세요. 여기에 시간당 단가를 곱해서 전체 페이가 계산됩니다. 물론 그거 대로 받을 수 있으리라는 법은 없긴 한데, 그래도 최소한 개발 공수에 최저임금 곱한 값 이상은 받아야겠죠. 전산 개발자 표준 노임 단가 있으니까 한번 찾아보세요.
    2. 임금 후려치기 등의 불이익을 당하지 않게 착수금을 받기로 논의하거나, 계약서에 해당 사항을 잘 써놔야겠죠.
    3. 소유권, 운영권, 저작권 등과 관련해서 계약서에 써 있는 대로 적용됩니다. 이 부분을 포함해서 페이를 결정하세요. 완전히 작업물을 넘기는 거면 더 비싸질 것이고, 사용권만 넘기고 소유권과 저작권을 갖고 있는거라면 조금 싸게 해줄 수 있겠죠.
    4. 본인의 전문성은 중요한게 아니고, 어차피 작업물을 납품하는 시점에서 갑님이 요구한 결과물이 나왔느냐가 중요합니다.
    5. 기존의 코드에서 갈라져나온 애드온, 서버 등의 운영과 소유권은 갑님과 협의해서 꼭 계약서에 적어두세요. 계약 관계에 “당연한 것”은 없습니다. 계약서에 써있으면 괜찮은 것이고, 안 써 있으면 싸움나요.
    6. 계약하기 전에 설계도나 개발명세서나 기획서를 꼼꼼하게 점검하세요. 거기에 써 있는 그대로 개발해야 하고, 거기에 써 있지 않은 것을 계약 이후에 요구하는 건 추가비용이 들어간다고 계약서에 써 두세요. 물론 계약 시점에 받은 설계도와 기획서도 “계약서”에 포함시켜야 합니다.
    7. 본인이 잘 이해가 안가는 부분은 끝까지 따지고 짚어서 명확하게 만드세요. 갑님과 의사소통이 제대로 안되면 개발도 망하고 계약도 망하고 커리어도 망하고 다 망합니다. 아시겠지만, “기능”이란 어떤 “입력”에 대해서 “출력”이 “원하는 형태”로 나와야 하고 “예외” 처리가 분명히 되어야 합니다. 이걸 어디까지 고려할지 상세하게 협의하세요. 의외로 코딩 자체는 힘들지 않아요.
    8. 개발에 대한 책임은 본인에게 있지만, 검수에 대한 책임은 갑님에게 있습니다. 갑님측에 “검수 담당자”를 정해놓고, 그 사람이 오케이 하면 완료된 것으로 생각하면 됩니다.
    9. 개발 다 끝나고, “추가개발”이나 “사후지원” 같은 내용도 미리 계약서에 써 두세요. 언제까지 무상으로 한다, 아니면 무조건 유상이다, 평생 무상이다 등등.
    10. 다시 한번 말하는데, 의사소통이 매우 중요합니다. 뭘 만들어야 하는지 이해되지 않는건 개발하지 마시고, 이해 될 때까지 따지고 명확하게 하세요. 안그러면 망해요. 진짜 망해요… 개발 외주란, 내가 원하는 걸 만드는게 아니라 갑님이 원하는 걸 만들어 주는 겁니다. 갑님이 원하는게 뭔지 이해가 안되면 절대로 만들 수 없어요. 그리고 어차피 저쪽도 월급 받고 하는거고, 본인도 돈 받고 하는 거니까, 만족스러운 결과물을 내기 위해서는 서로 개발 내용을 이해하고 공유하는 것이 중요합니다.
    11. 갑님이 갑자기 일정을 당겨달라고 할 수도 있는데, 그 경우 어떻게 할지 계약서에 미리 써두세요. 추가비용을 받든가, 배째라고 하든가, 뭐 어떻게 하든 상관 없는데 본인이 원하는 바를 갑님과 협의해서 계약서에 쓰세요.
    12. 본인이 어쩌다보니 일정이 늦어질 수도 있는데, 그에 대해서도 계약서에 써두면 좋겠죠. (아마 이건 미리 갑님이 써달라고할 겁니다.)
    13. 뭐 그건 그렇고, 매일매일 작업한 부분에 대한 작업 일지나 수정내역이나 날짜별 코드 백업 등을 남겨두면 좋습니다. 이메일로 갑님측 담당자에게 쏴주시면 더욱 좋죠. 혹시 출근해서 일 하더라도 그렇게 하세요. 비지니스의 세계에서는 계약과 기록이 모든 것을 지배합니다. 어디 안 적어놨으면 그냥 안한거예요…ㅜㅜ 갑님쪽에 버전관리 시스템이나 형상관리 시스템 등이 적용되어 있고 그걸 사용하게 된다면 좋겠지만, 안되면 이메일이라도 써야겠죠.
    14. 혹시 개발에 오픈소스 코드를 가져다가 쓴다면 그 부분도 저작권 확인해서 그냥 써도 되는지, 저작권 클리어 해야 하는지, 새로 개발해야 하는지 등 점검하고 협의하고 계약서에 쓰세요.

  • 식물도 뭘 알아…

    http://via.ntdtv.kr/economy/science/%ec%8b%9d%eb%ac%bc%eb%8f%84-%ec%9e%90%ec%8b%a0-%ed%95%b4%ec%b9%98%eb%a0%a4%eb%8a%94-%ec%82%ac%eb%9e%8c-%ec%95%88%eb%8b%a4-%ec%9d%b8%eb%a5%98%eb%a5%bc-%ec%b6%a9%ea%b2%a9%ec%97%90-%eb%b9%a0.htm

    1. 자신도 납득하기 어려운 결론이면 판단을 유보하면 된다.
    2. 지능이 없다고 하등하다 할 수 없다. 지능 또한 환경에 적응하기 만들어진 표현형의 하나일 뿐, 환경이 변하면 지능이 없는 것이 생존과 번식에 더 유리할 수 있다.
    3. 식물에게 의식이나 감정이 있어서 고등한 것이 아니라, 그냥 식물은 그 자체로 잘 살고 있는 생명체다. 고등하냐 하등하냐를 따지는 것 자체가 진화론을 잘못 이해한 부분이다.
    4. 그건 그렇고, 거짓말 탐지기가 식물의 감정을 측정하는 것이 가능하다는 것 자체에 대해 밝혀진바가 없는데 그걸 어떻게 믿는건가.
    5. ….에휴.
  • 생각을 바꾸는 것

    *늘 그렇듯, 나는 전문적인 철학자는 아니므로 이 이야기들에 대한 참고문헌은 없고 전부 뇌피셜이다. 만약 이 주장에 대한 근거를 요구한다면 댓글로 달아주기 바란다. 그때 가서 찾아보고 없으면 의견을 철회하도록 하겠다.

    예를 들어, 본인이 행복하다고 생각하는 노예에 관한 이야기가 있을 것이다. 모든 사람은 평등하고, 자신의 자유의지가 있고, 천부인권이 주어진다는 것이다. 평등, 자유의지, 천부인권에 대해 구체적인 정의는 사람마다 다를 수 있겠지만, 보편적으로 받아들이는 수준은 있을 것이다. 가령, 평등은 모든 사람이 차별 받지 않고, 사람이라는 것 하나만 인정되면 동등하게 대우받는 것을 뜻한다. 자유의지를 갖고 있다는 것은 모든 사람이 자신의 행동을 함에 있어서 다른 누구의 통제를 받지 않고 행동할 수 있다는 뜻이다. 천부인권은 인권, 즉 인간의 권리가 다른 어디서 주어지는 것이 아니라 인간이라는 사실 하나만으로 주어진다는 것을 뜻한다. 사람이 사람이라는 것을 어떻게 인정할 수 있는지, 자유의지는 항상 통제를 받아서는 안되는지, 인권에 어떤 항목이 포함되는지 등은 사람마다 다를 수 있는데, 그 구체적인 논의는 나중에 할 것이다. 그러니까 평등, 자유의지, 천부인권에 대해서는 이와 같은 내용에 동의한다고 하자.

    이번에 생각해 보려는 대상은 어떤 노예이다. 노예는 행동과 생각이 자유롭지 못하고, 주인에게 예속되어 있는 사람이다. 다시 말해서, 주인이 어떤 행동을 하라고 요구하면 그렇게 행동하고, 어떤 생각을 하라고 지시하면 그렇게 생각을 한다는 뜻이다. 그렇게 하는 대상은 많이 있는데, 그 중 사람인 경우를 노예라고 한다. 이와 같은 노예는 자신의 생각과 행동을 스스로의 자유의지로 통제할 수 없는데, 이런 상황이라면 누구라도 인생이 괴롭고 빠져나가고 싶을 것이라는 점에 동의할 것이다. 즉, 누구도 자발적으로 노예가 되고 싶어 하는 사람은 없으며, 어떤 이유로든 노예가 된 사람이라면 그 상태에서 벗어나고 싶을 것이다. 이와 같은 전제를 두고 보면 노예는 행복할 수 없다.

    만약 행복한 노예가 있다면 어떨까? 노예는 절대로 행복할 수 없을까? 올더스 헉슬리의 “멋진 신세계”라든가 조지 오웰의 “1984”같은 작품을 보면 거기서 등장하는 사람들은 사회와 정부에 예속되어 있는 것 같지만 어떤 이유로든 자신의 삶에 만족하며 행복하게 살아가고 있는 것 같다. 이와 같은 상황에서 우리가 그 사람들의 삶에 개입해서 “당신은 행복하지 않아! 깨달으라고!”라고 말해주는 것은 어떤 의미가 있을까? 그렇게 말해주는 것은 그 사람들의 행복에 기여하는 것일까?

    행복에 대해서 사람들이 보편적으로 인정하는 공통적인 조건이 몇 가지 있다. 가령, 자신이 하고 싶은 일들을 마음껏 할 수 있으면 행복하고, 그렇지 않으면 행복하지 않다. 이와 같은 행복의 기준에는 전제가 하나 숨어있는데, 사람들이 누구나 자유의지를 갖고 있다는 것이다. 자유의지가 있어야 하고 싶은 일이 생기며, 그 경우에만 사람들은 행복할 수 있다. 자유의지가 없는 경우 이와 같은 형태의 행복은 불가능하다. 자유의지가 없는 인간을 어떻게 상상할 수 있느냐고? 아무리 노예라 하더라도 누가 괴롭히면 싫고, 하고싶은 딴 일을 하고 싶지 않을까? 그렇게 생각하는 것이 상식적이다. 하지만 극단적인 경우를 생각해 보자. 그렇지 않다면? 어떤 경우, 노예가 스스로 노예임을 인정하고 자각하고 있으면서 동시에 노예이고 싶어하는 경우가 있을 수 있지 않을까? 그렇다면 그 주변 사람들은 그 노예를 그 상태에서 해방시켜주어야 하지 않을까?

    주인의 말을 들어보자. “난 저 노예에게 먹여주고 재워주고, 심지어 나가려면 나가라고 했는데도, 스스로 붙어있겠다는걸 내가 어떻게 하나?”

    물론 주인의 말이 거짓말일 수도 있다. 대부분의 경우 노예의 주인이 이렇게 말하는 것은 거짓말이다. 하지만 우리는 지금 극단적인, 매우 극단적인 경우를 생각하고 있으니까 저 말이 진실이라고 해 보자.

    이번엔 노예에게 가서 물어보자. “저는 여기서 시키는대로 일하고 살고 먹고 자는 것이 행복합니다. 진짜라고요.”

    물론 이것 역시 대부분의 경우 거짓말이다. 노예는 주인으로부터 이렇게 말하라고 지시를 받고 시키는대로 대답하는 것일 가능성이 매우 높다. 즉, 그렇지 않은 경우는 없다고 봐도 좋다. 하지만 이번에도 극단적인 경우를 생각하고 있으므로 이 대답 역시 진실이라고 해 보자. 노예는 행복하다. 적어도, 노예는 스스로의 자유의지에 의해 행복하다고 느끼고 있다.

    이것은 어떻게 된 것일까?

    아무리 노예가 저런 상태에서 예속되어 있는 것을 스스로 원하고 있다 하더라도, 태어나던 그 시점에서부터 노예이고 싶지는 않았을 것이다. 상식이 있는 사람이라면 자라나면서 노예일 것을 교육받고, 학습하고, 자신의 자유의지를 배우지 못하고, 이것이 행복이라고 배우며 자라났기 때문에 저 상태가 되었다는 것을 추측해 볼 수 있을 것이다. 우리는 여기서 상식이라는 이름 하에 한가지 절대적인 가정을 하고 있다. “태어났을 때 부터 노예이고 싶은 사람은 없다.” 이것 역시 부정하고 싶지만, 사람이라면 우리가 기대할 수 있는 보통의 지능을 갖고 있을 것이고, 그런 경우 “노예이고 싶은 상태”로 자라날 수는 있지만, 반드시 그렇게 되어야 하는 상태로 태어나는 사람은 없다고 볼 수 있다.

    이제 논의를 한 걸음 나가보자. 여기서 말하고 있는 노예는 어릴 때 부터 “노예 교육”을 철저하게 받고 자라서 그 외의 다른 방식의 삶을 생각해 본 적이 없는 상태라고 해 보자. 이와 같은 “노예 교육”이 정당한가, 부당한가, 또는 도덕적으로 올바른가, 그렇지 않은가에 대한 논의는 나중에 다시 생각해 보도록 하고, 지금 논의하려는 것은 이미 이렇게 된 경우에 그 노예에게 “넌 힘들다”라고 가르쳐 주는 상황이다. 즉, 이미 주어진 환경에서 행복하다고 느끼고 있는 사람에게 “넌 힘들게 살고 있는 것이야. 그보다 더 행복하고, 더 좋은 삶을 살 수 있어. 그곳에서 빠져나와”라고 가르쳐 주는 상황이다. 이것은 도덕적으로 올바른가? 그렇다면, 도덕적으로 항상 올바른가? 그렇지 않다면, 어떤 경우에 도덕적으로 올바른가?

    이 노예가 예속 상태에서 빠져나와서 행복하기 위해서는 두가지 사건이 일어나야 한다. 하나는 예속 상태에서 빠져나와야 하고, 두번째는 행복해야 한다. 동어 반복처럼 들리겠지만, 사실이다. 예속 상태에서 빠져나오기 위해서는 노예가 빠져나올 의지가 있어야 한다. 이 노예의 주인은 앞에서 말했듯이 노예가 빠져나가려고 할 경우 얼마든지 보내 줄 용의가 있다. 그리고 우리는 이것이 정말 그렇다고 가정하고 있다. 만약 아무도 그 노예에게 그가 힘들다는 ‘진실’을 가르쳐 주지 않는다면, 그 노예는 현재 상태를 유지하며 살던 대로 살아가려고 할 것이다. 주변에서 그 노예에게 그가 힘들게 살고 있다는 사실을 알려주도록 해 보자. 그는 살면서 그렇게 생각해 본 적이 한번도 없기 때문에 그 사실을 받아들이지 않을 것이다. 자신이 힘들다는 것도 받아들이지 않고, 자신이 불행하다는 것도 받아들이지 않을 것이다. 이런 사람에게 어떻게 하면 자신이 힘들다는 것을 설득할 수 있을까? 아니, 그 전에, 일단 왜 우리는 그에게 그가 힘들다는 것을 알려줘야 할까? 그것이 도덕적으로 올바른 일이기 때문에?

    먼저, 그 노예가 느끼고 있는 행복이 사실은 행복한 것이 아니라는 것을 알려주기 위해서, 먼저 우리가 그것을 확신해야 한다. 노예가 행복하지 않다는 것을 어떻게 알 수 있을까? 아니, 그보다 우리가 다른 사람의 행복을 어떻게 알 수 있을까? 누가 봐도 행복하지 않음을 확신할 수 있을까?

    행복이란 매우 개인적인 감정이다. 즉, 우리는 다른 사람의 외형적 상태나 행동을 보고서 그 사람이 행복한지 그렇지 않은지, 만약 행복하다면 얼마나 행복한지, 아니라면 얼마나 불행한지에 대해 판단할 수 없다. 또한, 내가 어떤 상황에서 행복했다고 해서 다른 사람이 같은 상황에서 같은 행복을 느낄 수 있을 것이라고 추정하는 것 역시 위험한 일이다. 최악의 경우, 내가 행복한 상황에 처했을 때 같은 상황에서 다른 사람은 굉장히 불행할 수 있다. 무엇이 행복인가?

    어떤 사람이 행복한지 아닌지 알아보기 위해서

    (계속…)

  • 최근의 생각들

    페북에 올린 최근 기록들. 다 백업한건 아니고 남길 것들만 뽑아옴.


    우리도 이렇게 머리가 빠르게 돌아가는 천재적인 사업가 출신 대통령이 있었지. 아아 MB가카… 잃어버린 재산은 언제 찾으시렵니까.

    http://news.naver.com/main/ranking/read.nhn?mid=etc&sid1=111&rankingType=popular_day&oid=056&aid=0010586612&date=20180614&type=2&rankingSeq=10&rankingSectionId=104


    예를 들어 자기 자신에 관한 메타 연구가 가능한 학문이 있다. 역사의 역사, 철학의 철학, 수학의 수학, 진화론의 진화론, 진화심리학의 진화심리학(?)… 그리고 그런 것이 안되는 학문이 있다. 물리학, 화학, 신학, …


    이재명이 맘에 들고 그렇진 않은데, 그래도 도지사로서 일을 잘 하지 않을까 하는 기대가 있다. 많이 안 바란다.


    국민일보는 결국 한계가 있는 언론사인가…

    http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=103&oid=005&aid=0001105883


    자유한국당 입장에서는, 지난번에 홍준표 당대표가 대선에 나올 때 경남 도지사 보궐선거 방해하고 나온 것과, 이번에 자유한국당 국회의원이 사퇴하고 지방선거에 나오면서 생긴 보궐선거 참패한게 뼈아픈 실책이 된 것 같다. 물론 그맛에 정치하는 거겠지만.


    투표하세요. 문재인 대통령 지지자도, 문재인이 재앙으로 보이는 사람도, 북한을 싫어하는 사람도, 미국이 싫은 사람도, 투표하면 민주주의가 살아납니다.


    이제 전쟁은 게임으로만 합시다.


    소크라테스가 한 말이 있다. “너 자신을 알아라.”


    요즘 진화심리학 썰이 핫 한 것 같아서 물리학에는 뭐 없나 생각하고 찾아보니 물리학계의 심리학, 양자심리학이 있다. 솔직히 이거보다는 진화심리학이 좀 더 과학적이라는 생각이 들었다.


    박원순이 뭐 다 깨끗할 수는 없겠는데, 자유한국당이 도덕성 갖고 까니까 뭔가 어색하다… 자유한국당 후보들 다 털면 민주당보다 더 많이 걸릴 것 같은데. 편견인가…

    http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=014&aid=0004036752


    물 분자의 종류에 두가지 형태가 가능하다고 한다. 물 분자를 이루는 두 수소 원자의 스핀이 같은 Ortho-water랑 스핀이 반대 방향인 Para-water라고 한다. 이것을 Diazenylium이라는 분자와 반응시켰을 때, Ortho-water보다는 Para-water가 화학반응이 더 빨랐다고 한다.
    뭐 여기까지는 실험 결과인데. 이제 유사과학계에 알려지면 이제 육각수라든가, 물은 답을 알고 있다든가, 해서 물 분자의 두 종류 중 파라워터가 몸에 더 좋고 오쏘워터는 몸에 나쁘고 뭐 그런 식의 마케팅이 시작되지 않을까 걱정스럽다. 아니면 물 마실 때 꼭꼭 씹어 먹으면 파라워터가 많이 생성되서 몸에 좋다든가.

    https://www.livescience.com/62708-water-two-kinds.html?utm_source=lst-newsletter&utm_medium=email&utm_campaign=20180601-lst


    문재인 대통령이 드루킹 특검을 자유한국당에서 추천한 인물로 정했다. 이건 털어서 나올게 없다는 자신감과 함께 정면돌파하겠다는 승부수다. 물론 드루킹 특검에서 과연 김경수가 진짜 아무 관련 없을지, 어떤 문제점이 있을지 나는 확신이 없지만. 적어도 여기서 어떤 결과가 나오든 자유한국당은 조용히 있어야 한다는 것은 분명하다.

    http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=001&aid=0010137498


    “DNA 단백질 유전자 코드”가 “태극”이랑 관련이 있다고? 아니 태극의 4괘는 원래 중국의 8괘에 그 기원이 있고, 8괘가 2진법이랑 관련이 있는건 널리 알려진 사실인데다가, DNA 염기가 4개의 부호로 되어 있고 2진법 2자리 수면 4개의 부호를 나타낼 수 있으니 당연히 관련이 있는건데…


    (침착)
    ….

    그러니까, 아무래도 이거 기조연설 내용이 “우리가 누굽니까? 방송과 통신 연구하는 사람들 아닙니까? 보세요. 통신에 우리가 2진법 쓰죠? 태극기 4괘에도 2진법 있죠? 유전자도 2진법으로 나타낼 수 있죠? 제주도 정낭이 8괘에서 나온거니까 2진법 되죠? 자, 세상은 모두 2진법으로 나타낼 수 있습니다 여러분! 재밌죠?ㅋㅋ” 라고 말한 건데 그걸 두 다리 건너 들은 기자가 기사를 이렇게 쓴 것으로 보인다. 저 기조연설 들은 사람들이 유전자와 태극기 사이의 연관성에 놀랐을리는 없겠지만, 거기 학회에 참석한 사람들 대부분이 아는 사실을 갖고서 2시간동안 떠들수 있다는 사실에는 놀라움을 금치 못하고 잠들었을 것 같다.

    http://m.domin.co.kr/news/articleView.html?idxno=1130471#08sn

     

  • 뇌 복제

    딥 러닝 기법이 발전되면서 흥미로운 일이 벌어지는 것 같다. 필기 인식, 사진 인식, 얼굴 인식, 음성 인식 등에 있어서 굉장히 빠르게 인식률이 올라가고 있다. 또한, 딥 페이크라는 기술을 보면 사진에 나오는 얼굴을 다른 사람의 얼굴로 바꾸는 것이 가능하다. 딥 러닝 기법을 이용해서 어떤 작곡가의 작품과 비슷한 음악을 만들 수 있고, 소설의 문체를 분석해서 유사한 소설을 쓰는 것이 가능하다. 지금 기술로는 굉장히 초보적인 수준이지만, 기술이 발전하고 기계가 발달할수록 더욱 구분 불가능한 위치까지 갈 수 있을 것이다.

    이에 기반해서, 어떤 사람의 행동과 말, 글씨를 모두 학습시켜서 이와 비슷한 행동을 하도록 만들 수 있을 것이다. 그렇다면, 사람이 태어날 때 부터 죽을 때 까지 만들어지는 모든 행동을 입력시켜서 그 사람처럼 행동하고 말하도록 만들 수 있을 것이다. 어떠려나.

    그 다음 이어지는 단계는 나의 확장이다. 이전에도 비슷한 글을 썼던 것 같은데, 나와 같은 뇌를 복제한다고 해서 그것을 나로 느낄 수는 없다. 내가 나로 느끼는 영역을 확장하기 위해서는 뇌가 컴퓨터와 하나가 될 필요가 있다. 과연 그 단계까지 갈 수 있을까?