Programming에 대해서 그리고 Blah Blah .... :-)

kakakwon의 이미지

안녕하세요 전 Theory쪽을 공부하는 사람입니다. 글들을 읽어보고 몇자적어 보려 합니다.

1) About the power of Language
C, C++, Java, Object Pascal, Cobol, Small Talk etc. 모두가 똑같습니다. Church's Thesis를 기억한다면 아마도 모든 Language의 Power는 같을 것입니다. (including Turing Machine) 그러나, Quantum Computing의 등장으로 인해서 바뀔지도 모르겠습니다. (저도 Quantum쪽에 대해서는 잘몰라서 ... ) 그러나, 지금의 기술로는 Quantum Computing is far away and they surly cannot solve P ?= NP question.

Application Develop할때는 적절히 환경에 맞는 언어를 선택하시면 될것 같습니다. Unix System Programming에서 C가 많이 사용되며 C++는 특정한 Platform에서 Speed가 중요시될때 쓰여지는 것 같고 Java는 web에서 단연 으뜸인 언어인것 같습니다.

2) About "삽질"
밑에 글어 어떤 분이 삽질이라는 재미있는 표현을 쓰셔서 저도 써봅니다. 그런데 중요한것능 그 삽질이 왜 정말 필요한가인데요. 제가 알기로는 이것은 Halting Problem에서 시작됩니다. Halting Problem에 의하면 Program Verification is not COMPUTABLE! 즉, 어떤 프로그램이 있으면 우리는 그 프로그램이 infinite loop에 있는지 또 어떻게 Spec에서 다르게 행동하는지 모릅니다. 우리가 할수있는 일은 열심히 Test해보는 수밖에요. 그래서 경험이 중요한것 같습니다.

3) About 'programming'
아마도 universal definition은 없을 것입니다. 그러나, 예전부터 프로그래밍은 "fill values in a table"로 생각되어졌습니다 (이 정의는 Mathmatics Community에서 시작됨). Column Head로는 Problem Specification이라고 생각되어지고 Row Head로른 maybe Constraint ... (not sure)
중요한것은 그 테이블의 공백을 우리가 Program하는 것입니다. 저의 개인적인 생각으로는 Programming Maturity는 아마도 경험과 analytical ability입니다. 경험과 Analytical ability모두 오랜기간의 숙련을 거쳐야 하는걸로 생각되며 특히 analytical ability는 programming technique에 관련이 있습니다.

4) Aboput Programming Technique
어떤 사람들의 말을 들어보면 본인은 자바의 Expert라고 합니다. 그런분은 아마도 숙련된 자바 프로그래머라고 생각합니다. 그러나 그분이 프로그래밍 전문가인지는 잘 모르겠습니다. 자바는 Syntax일 뿐이기 때문입니다. (예, 예 ... 물론 It is best language in Web and designed object oriented way and strongly typed and safe & easy. Good!!!)

자바프로그래머가 thread에 대해서 정말 어느정도 깊히 알고 있어야 할까요? 정말 N-tier Application을 만들고자 한다면 정말 깊숙히 Concurrent Programming을 알아야 합니다. 그러나, Concurrent Programming은 Debugging이 훨씬 어렵습니다. It is NON-Deterministic!

자바프로그래머가 probability에 정말 어느정도 깊히 알고 있어야 할까요?
자바 프로그래머가 dynamic programming에 어느정도 깊히 알고 있어야 할까요?

가장 중요한것은 다음과 같은 질문을 생각해야할것 같습니다. 본인이 짠 프로그램이 정말 최고일까요? 더빠른 프로그램을 짤순 없는걸까요? 덜 Memory를 차지하는 프로그램을 짤순있지않을까요? 보다 더 중요하게 정말 짠 프로그램이 정확한 건가요?

5) Functional Programming vs. Object Oriented Programming
저는 큰 자바 fan입니다. 이유는 누군가가 (아마도 전문가가) 이미 많은 클라스를 많들어 놓았기 때문입니다. Linked List data structure를 보더라도 제가 짠 것보다는 아마도 전문가가 짜놓은 것이 한층더 Optimized가 되어있을것입니다.

6) Is Computer Science(전산학) science or art?
전 Art라고 생각합니다. :) Even mathematics seems to be an art.
Software engineering is surly an art since there is no way to tell if your (OO) design is best one.

7) Is computer science academia competitive to other countries?
절대 아니지요. 우리는 인터넷 강국이지. 안타깝게도 Computer Science 강국이 아닙니다. 저는 개인적인 생각으로 교수들한테 책임이 있다고 생각합니다. 서울대나나 카이스트에가서 교수 Research Activity를 보십시오. 전는 깜짝 놀랬습니다. 논문게재를 몇년이상 안한교수들이 태반입니다. 정말 대학원에 가고싶은 학생이 있다면 그 교수의 논문을 보고 가야하는데 몇년 이상된 논문을 봐야하나요? (그 몇년동안 아마도 장족의 발전이 있었을 것입니다) 국민의 세금으로 녹을 먹는 사람들이 Research는 안하고 무엇을 하는지 정말 궁금합니다. (몇몇 정말 연구를 열심히하시는 분들 제외)
제가 Theory쪽을 해서인지 그쪽은 아예 교수 인원조차 1-2명 밖에 안되더라고요. 저는 교수들 연구 감독하는 시민단체가 필요하다고 생각됩니다.

8) 결론은 우리가 열심히 해야겠지요. :)

감사합니다. :)

미친눅대의 이미지

전산학에 대해서 생각하게 만드는 좋은 글이네요.

notpig의 이미지

좋은 글인데 몇가지 이야기하고픈 말이있어서

2) 번에서
아무런 제약 조건이 없이 모든 프로그램에 대해선 이론적으로 불가능하지만...
일반적으로 사용되는 대부분의 씨 나 자바와 같은 프로그램에서는 가능합니다.
( finite 하다는 제약사항이 붙지만...대부분의 프로그램은 finite 합니다.)

같은 이유로 대부분의 프로그램에서 program verification 역시 가능합니다.

imyejin의 이미지

모든 프로그램은 정의상 finite 합니다. 모든 자연수 하나하나의 크기는 유한하죠. 하지만 크기가 유한한 자연수를 "모두" 모아 놓으면 집합의 크기가 무한한 집합인 자연수의 집합이 됩니다. 프로그램 하나하나로서는 그 자체는 finite 한데, 문제는 그것이 infinite 한 실행 시간이나 메모리 공간를 필요로 할 수 있을 뿐이죠. 따라서 프로그램이 finite 하기 때문에 verify 할 수 있다는 것은 일단 맞지도 않는 말이며, 맞다 하더라도 아무런 추가적인 정보도 주지 못합니다.

아마도 말씀하시려는 바는 대부분의 프로그램이 finite 한 리소스(시간 혹은 메모리 공간)를 요구한다는 것 같다는 생각이 듭니다만 (그것은 실제 물리적으로 존재하는 컴퓨터 구조의 한계상 당연하므로), 이런 상황에서 실제로 리소스를 verify 한다는 것은 일정량 이상 사용하지 않는다는 것을 verify 하는 일일 것입니다. 이게 어째서 거의 무조건 가능하단 말인지요?

그리고 무엇을 verify 한다는 것인지도 명확하지 않은 상태에서 program verification 이 대부분의 프로그램에서 가능하다는 것이 무엇을 말하는지도 분명치 않습니다. 여러가지로 혼란스러운데 다시 한번 확실히 정리해 주시면 감사하겠습니다.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

notpig의 이미지

나중에 시간이 되면 이야기를 자세히 하겠지만...
(무엇보다..지금 자세히 기억이 안나네요..)

이론적으로
튜링 머신 같은경우엔 infinite 한 메모리 공간을 가정하는걸로 기억합니다.

때문에 모든 프로그램을 검사할수 있다고 이야기 할려면 이런 infinite 한 메모리 공간에서 동작하는 프로그램에 대해서도 보장할수 있어야합니다.
(halting problem 은 이때문에 모든 프로그램에서 검사하는것이 불가능하다고 증명한 걸로 알고 있습니다.)
이론적으론 int, long 등으로 나눌 필요없이 그냥 정수로 선언하면 됩니다.

http://en.wikipedia.org/wiki/Halting_problem#Can_humans_solve_the_halting_problem.3F

여기에 나와있는 예제 프로그램같은 경우엔 infinite 한 메모리 공간에선 loop 를 빠져 나오는지 알 수 없습니다.

하지만 실제 우리가 사용하는 컴퓨터에서 동작하기 위한 C 혹은 자바로 작성되었을 경우엔 사용할수 있는 메모리가 finite 하기 때문에
얼마만큼의 시간이 걸릴진 알수 없어도 이론적으론 주어진 메모리에서 결과가 나올지 계산 가능합니다.

좀 두서없이 써서 나중에 좀더 자세히 글을 쓰도록 하겠습니다.

imyejin의 이미지

제목을 보면 뻥셔널하고 OO하고 뭔가 같이 이야기하시려는 듯 하다가 자바 이야기만 하고 마시네요. 혹시 Java에 요즘 closure인가가 들어갔다고 자바도 좀 뻥셔널하다는 뜻인지 헷갈립니다.

그리고 1번에서 퀀텀 컴퓨팅과 NP 및 P 이야기 자체에 틀린 말씀은 없는 듯 합니다만 원래 NP와 P가 같으냐 아니냐의 이론적인 문제 자체가 컴퓨터 하드웨어가 바뀐다고 해서 바뀔 성질의 문제는 아닙니다. NP는 무한 병렬 연산이 가능한 컴퓨터로 해를 찾는 데 다항식 시간이 걸린다는 이야기니까 말하자면 이미 어떤 컴퓨팅 모델을 정해 놓은 것이나 마찬가집니다. 그런 것에 가까운 컴퓨터를 만들면 NP문제를 다항식 시간 안에 푸는 게 가능해 질지는 몰라도 그것이 NP 문제라는 사실은 변하지 않으며 NP=P가 되는 것도 아닙니다. 이미 알고 쓰셨겠지만 혼동의 여지가 있을까봐 강조합니다.

또 6번에서 Computer Science는 당연히 이름대로 Science죠. SE는 이름 자체가 엔지니어링이 붙은 만큼 Art에 가까운 경우도 있지만 (그것도 세부적으로 들어가면 아닌 특징이 다른 분야도 당연히 있겠지만요), 측정치(measure)를 정할 수 있는 인공지능이나 (얼마나 잘 학습하고 분류하는가에 대한 측정방법을 정할 수 있겠죠), 네트웍 및 분산 시스템 효율, 알고리듬 설계에 대한 점근적 효율 등에 대한 분석 등 아주 많은 분야가 바로 전통적인 의미에서의 science입니다. Theory of Computation, Programming Language Theory 쪽과 같은 전통적인 CS 이론 분야는 주로 기다 아니의 문제가 많은 오히려 수학에 좀더 가깝다고도 할 수 있죠.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

notpig의 이미지

추가로
7) CS 강국이 아니라는건 동의합니다.
다만 그 이유는 학교 교수들보단 정부 기관때문이라는게 정확할 껍니다.
정부에서 평가할때 IEEE Transaction 에 논문 1편 보다 듣도못한 SCIE 논문지 2편이 훨 점수가 많거든요.

추가로 레퍼런스한 논문수가 100 개이상인 컨퍼런스 논문보다 남들이 읽어주지 않는 논문지 논문이 더 좋게 평가받고 많은 연구비를 받습니다.

아마 몇년이상 논문 계제를 안했다는건 그냥 업데이트를 안한것일 가능성이 높습니다.
대부분 논문은 꾸준히 냅니다...질은........모르겠습니다...

gurugio의 이미지


실례지만 theory라고 하시면 정확히 어떤 학문인가요?

이분야에 소프트웨어공학같이 공학이라고 이름지어진 학문들이 있다고 알았지만
theory라고 불리는게 어떤 학문들인지 잘 모르고 있었습니다.
어떤 학문들이 theory라고 불리는지 알려주시길 부탁드립니다.

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.
http://www.asmlove.co.kr
http://blog.naver.com/gurugio

notpig의 이미지

"어떤 학문들이 theory라고 불리는지 알려주시길 부탁드립니다."
에 대해서만 제가 답변하도록 하겠습니다.

http://en.wikipedia.org/wiki/Computer_science#Fields_of_computer_science

lifthrasiir의 이미지

theory라고 해도 전산학의 분야는 꽤 많은 편입니다. 제 개인적인 생각으로는 글의 내용에서 추정하기에 theoretical computer science 같아 보입니다만... :S (imyejin 님께서 언급하신 Theory of Computation을 보통 이렇게 부르죠?)

gurugio의 이미지

저는 석사를 마쳤지만 공부를 하도 안해서
theoretical computer science 가 뭔지 잘 모르겠습니다.

컴파일러 이론, 양자 컴퓨터, 수치연산 등등 몇가지 연구 주제들을
이름은 들어봤지만 제가 무지해서 theory인지 engineering인지 구분을 못하겠더라구요.

학계에 대한 비판도 많이 듣고 저도 만히 비판했지만
제 출신 학교에서 많은 교수님들이 고생하시는걸 봐서 그런지
요즘에는 그냥 쩝.. 합니다.

글쓰신 분은 저보다 많이 학문을 하신분 같으신데
어떤 학문을 하고 계신지 소개좀 해주세요 ;-)
제가 워낙 academic? 학문적인? 공부가 부족해서
요즘 목마름을 느끼고 있습니다.

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.
http://www.asmlove.co.kr
http://blog.naver.com/gurugio

iolo의 이미지

이론도 좋지만...
영어가 불필요하게 많으므로~
패스=3=3=333

----
the smile has left your eyes...

----
the smile has left your eyes...

lifthrasiir의 이미지

그냥 생각나는 대로 끄적여 봅니다.

1)
"Quantum Computing is far away and they surly cannot solve P ?= NP question." 얘기는 imyejin 님께서 말씀하셨으니 생략.
QC는 잘 모르겠습니다. 일단 양자 컴퓨터가 있다 쳐도 이걸 통상적인 방법으로 프로그래밍하기에는 매우 무리가 있어 보입니다. (shor's algorithm 같은 거 보면 참 뭐시기하죠.) 제 생각에는 언어는, 좀 더 정확하게는 언어의 패러다임은 크게 변하지 않은 채 컴퓨터의 하부 구조만이 (엄청난) 영향을 받거나, 그도 아니면 컴퓨팅 포퍼먼스가 비약적으로 향상되면서 프로그래밍이라는 것 자체의 의미가 크게 변화하지 않을까... 싶습니다. 뭐랄까 좀 더 모호성을 갖춘 object에 대한 기술이 가능하게... 말이죠.
넵 뻘소리입니다; 무시하셔도 좋습니다.

2)
모든 프로그램에 대한 verification은 불가능하지만 practical한 의미에서는 어느 정도 가능하지 않나요? :) 아직은 갈 길이 멀다는 데는 동의합니다.
그리고 좀 생각해 보면 우리가 다루는 프로그램들 중에 infinite loop는 많이 쓰진 않는다고 봅니다. while 조건에 넣기 애매해서 고쳐 쓴 infinite loop 말고, 진짜로 infinite loop가 유용한 경우를 좀 생각해 보면 event loop라거나 하는 I/O 관련된 것들이 있는데 얘네는 좀 다른 경우죠.

5)
functional programming은 프로그래밍에 대해 생각하는 방법을 바꾼 것이라고 생각합니다. OOP와 수직적인 관계니까 vs.라는 말을 붙이긴 좀 그렇네요. 그리고 언급하신 내용은 OOP의 장점이라기보다는 모듈화의 장점 아닌가 싶습니다. (OOP가 모듈화를 쉽게 해 주는 경향이 있긴 하지만 functional programming, logic programming에서도 여전히 적용 가능한 부분입니다)

kakakwon의 이미지

안녕하세요 저는 처음 이글을 썼던 사람입니다. 죄송하지만 이다음 문장부터는 영어로 쓰겠습니다. 제가 영어를 잘쓴다는 것이 아니라 저는 외국에서 학부를 나왔던 만큼 컴퓨터 용어를 쓸때 우리나라 용어를 잘 모르겠습니다. (예를 들면 저는 array는 아는데 이게 한국말로 뭘로해야할지 모릅니다.)

First of all, I would like to thank all of you who replied my "blah blah". At the same time, I am sorry for late correspondence.

1) re: for "약간 이상한 점이있는것 같아"
How do we know one program generate correct output? It maybe possible to know it by "looking" at it, but not automatically. If one person generate a test program that waits 100 minitues to check if an original program outputs correct one. Then, I will make another programm that generate correct after 102 minutes. This is what I meant.

2) re: for "나중에 시간이 되면"
My answer is consistent to 1). It is not about memeory but time. Can we make a test program that checks if one program terminates? I would say no.

3) re: for "functional vs OO 도 이상한 점이 있군요"
i) I am not sure what the point is. Of course, it is not problem of hardware. It is about our intellectual possibility. P?=NP is still open problem. Of course, many people belives it is P != NP, including me :).

ii) I said I thought it is not science. Of course, you can freely think computer science is science. For me, it is no. Since you mentioned AI, I would bravely say here that the level of AI is now level of cockroach. Yes, you are right. AI measures how much it can measure "learning" and so on. In my point of view, AI is still in very primitive level. Do AI programs solve NP-complete problems? Definitely no. AI programs solve NP-complete problems under many practical input. But, Steven Cook wrote a paper that one can generates hard SAT solving instances. And, most of AI programs takes exponential time to solve such inputs with respect to the size input. Even many mathematicians say mathematics are "Art". Well, computer science is definitely not harder science than mathematics. (Sorry for analogical arguments here, but I emphasize that writing proof for theorems is an art not science.)

iii) I agree that theoretical computer science is a stream of mathematics. Alan Turing was mathematician and many greate theoretical computer scientist have been from mathematic fields.

4) re: for "CS 강국".
That was actually my assumption. And, yes you may be right. I want to know why professors do NOT update their pages. If we look up others' web sites, actually many good computer scienctists update their publications. I would say the reasons are following: First, it is transparent. Professors are subsidized by government where we pay tax. Their main duty is to do research. How do we know they do research? Or, just playing around with their kids? (Sorry for extreme guess). Secondly, publication transparency is very important to people who intend to go for MS or Ph.D. Third, I would like to know the reason why they don't update. Why NOT? I don't personally buy arguments such as "because it is not important" or "we are just lazy ..."

5) re: for "실례지만 theory라고"
Alas, it is difficult question. Generally, theoretical computer science includes the following areas.
a. Algorithms, Lower Bounds, Graph Theory, Coding Theory, Probabilities (Generally, Discrete Mathematics)
b. Some things that related with above. Even database people may have to know some of above. They are interested in "Petri Net", "Indexing Structures" and so on. Let me tell you this Google's success is based on their page ranking algorithm which is heavily related to stochastic processes, where one has to probability well ...

6) At last, I would like to finish my writing apologies. Please, correct me if there is any suspicious point and you feel that I "attacked you". I wrote my writing basically within philosopy of "to find out what is right" but NOT "who is right". Another apology will be based on the fact that I am coming this site not very "often" and actually I am kind of newbie here. Thank you very much your time and attention to my writing. Have a good day!

notpig의 이미지

halting problem 에 대해서 제가 아는건 아래 링크입니다.

http://research.microsoft.com/Terminator/

그리고 당연히 이외에도 다양한 연구가 진행되어있습니다.

모든 프로그램에 대해선 보장 하지 못하지만 대부분의 프로그램은 검사 가능합니다.

"How do we know one program generate correct output?"
static analysis 혹은 software model checking 과 같은 키워드로 검색해보시면 automatic 하게 검사하는 관련 연구들을 찾을 수 있습니다.

JuEUS-U의 이미지

한글 좋은게 뭡니까 -_-
그냥 "어레이"라고 쓰세요 ㅋㅋㅋ
이렇게는 잘 쓰지 않지만 그래도 이해하는데는 문제 없습니다.
그리고 어차피 전산쪽 용어는 거의 다 영어 발음 그대로 씁니다...
으으으으음.... 생각해보니 그냥 영어로 쓰는게 읽기 편하겠군요 =ㅅ=;;;

iolo의 이미지

여기는 대한민국이고,
이 곳은 한글에 익숙한 사람들을 대상으로 하는 사이트입니다.

이 곳에 오시는 분들이 저 정도의 영어를 못 읽을 리는 없겠지만,
굳이 여기서 토론을 하시겠다면 어느 정도의 한글 공부가 필요하실듯...
말씀하신대로라면 "array"에 대해서 얘기했는데, 댓글에 "배열"이 어쩌구 하면 이해를 못하신다는 얘기아닙니까? 그럼 토론이라는게 애초에 불가능하지요.

학부를 미국에서 하셔서 영어에 익숙하지만, 한글을 잘 모르겠다고 하시니...
영어권 커뮤니티에 이 글을 포스팅하시고 의견들을 이곳 분들을 위해서 정리해주시면 많은 도움이 되겠네요.

----
the smile has left your eyes...

----
the smile has left your eyes...

tinywolf의 이미지

아마도 학문적 논의를 하기에는 우리 말이 많이 서투신가 봅니다.

ㅡ_ㅡ;

codepage의 이미지

요즘 전산 관련 학과의 분위기에 대해서는 잘 모르겠지만.
신입사원 뽑을려고 졸업자들 면접볼때..
몇가지 질문 던져보면 공부를 너무 안한다는 느낌이 듭니다.
그리고 학과도 어떤 학과들은 너무 유행에 민감하다고나 할까요.

이러한 느낌이 부디 저 혼자만의 느낌이기를 바라겠습니다.

tinywolf의 이미지

전 뭐... 7번만 얘기해 보자면..

저희 연구실에서 했던 건교부 관련 과제는
무려 "컴퓨터공학과"에 맡긴 일이고..
"컴퓨터"와 "카메라"만 사용하는 프로젝트임에도 불구하고..

정부에서 준 그 많은 "세금" 중 재료비 항목에서..

"컴퓨터 부품은 구입하면 안됩니다."라는 얘기를 들어서 기막혀 하고 있는 중입니다.

- 그러면 카메라와 렌즈 구입은 가능합니까?
"어떤 과제라도 당연히 완제품은 구입할 수 없습니다."
- 그럼 A4용지라도 잔뜩 사도 될까요?
"쌓아 놓고 사용할 수 있는 사무용품도 안됩니다."
- 대체 뭘 살 수 있는 겁니까?
"시약이라도 구입해서 쓰세요."
- 여긴 컴퓨터공학과이고 과제 내용도 컴퓨터만 쓰는데요?

결국 적절한 프린터 토너와 사무용품을 구입하는 선에서 합의했습니다.

우리나라에서는 절대로 IT 연구를 지원해 주지 않습니다.

(제가 영어 실력이 딸려서 영어를 다 해석해 보지는 않았습니다 ㅈㅅ)

ㅡ_ㅡ;

Darkcircle의 이미지

프로그래밍 언어도 언어의 한 종류일 뿐이라...
프로그래밍에 있어서는 절대적인 고수라든지 전문가는 없다고 봅니다...
다만 사고적 측면을 기준으로 고려하자면 Expert 한 분이라면
누구보다 조금 더 월등할 수는 있겠지요 =)

---------------------------------------------------------------
실수하지 말아야 하는데 . . . Orz

---------------------------------------------------------------
폐인이 되자 (/ㅂ/)

soungno의 이미지

도대체 의사 소통이 힘든 글이네요
물론 이유가 있겠지만, 글이란 서로의 생각과 의미를 교환할 수 있어야 하지 않을까요?
프로그램 개발 이라는 것도 결국 그런 맥락으로 생각 할 수 없을까요?
즉 컴퓨터 , CPU, 컴파일러 등 그런 기계적 요소가 아닌, 문제 해결을 위한 의미론적 기술의 문제로...
즉 켄트벡이 말하는 커뮤니케이션이 가능한 코드, 사람을 위한 프로그래밍 을 추구 해야 하지 않을까요?

잘 가야지.