유능한 프로그래머가 자신의 최단 경로 알고리즘을 생각 해낼 수 있어야합니까?


58

컴퓨터 프로그래머로서의 능력에 대한 자신감이 위기에 처해 있습니다.

어제 나는 그래프에 대한 가장 짧은 경로 알고리즘을 생각해 보았고 몇 시간 후에 나는 수건에 던져서 Dijkstra의 알고리즘을 배웠습니다.

이것은 좋은 프로그래머가 몇 시간 안에 "재발 명"할 수있는 것입니까, 아니면 비현실적입니까?

글쎄, 적어도 나는 거품 종류를 재발견 할 수 있었다 : D


7
UI를 20 년 동안해온 사람은 짧은 시간 안에 다른 도메인의 문제에 대한 해결책을 찾는 데 어려움을 겪을 것입니다.
Coder

38
SE 사이트에서 많은 시간을 보내면 모두에게 자신감이 생길 수 있습니다. (그것은 나쁜 것이 아닙니다). 인생의 행복은 무엇을 받아들이는 것과 그것을 바꾸려는 욕구 사이의 완벽한 균형을 찾는 것입니다.
TrojanName

2
나는 그것을 스스로 재발 명 할 수 없었지만 그것이 어떻게 작동하는지 기억하려고합니다. 다음 애니메이션을 이해하십시오 : upload.wikimedia.org/wikipedia/commons/2/23/…
Job

6
지역 천재의 @Brian Tragedy. 이제는 더 이상 최고가 될 수 없습니다.
Rei Miyasaka

7
좋은 컴퓨터 과학자 는 컴퓨터 프로그래머 나 소프트웨어 엔지니어 일 필요는 없지만
Neil McGuigan

답변:


118

좋은 프로그래머는 문제를 해결하기 위해 이미 훌륭한 알고리즘이 작성되었으며 바퀴를 재발 명하는 데 시간을 낭비하지 않는다는 것을 알아야합니다.

Dijkstra가 몇 시간 만에 최단 경로 알고리즘을 생각해 냈기 때문에 누군가가 '좋은 프로그래머'인지 판단하는 데 사용하는 표준이 될 것 같습니다.


25
@Nakilon-기존 솔루션을 무시하는 프로그래머는 시간을 낭비하고 있으며 시간을 낭비하지 않으면 더 나쁜 솔루션을 만들고 있습니다. 참조 : 모두 자신의 암호 해싱 구성표와 bcrypt를 만드는 경우
복원 Monica Monica

10
@GSto는 : 위키 백과에 첫번째 참고 주문에 따라 20 분 : 위키 백과에 따르면, 다 익스트라는 시간 이내에 알고리즘 함께했다 en.wikipedia.org/wiki/Dijkstra%27s_algorithm을
woliveirajr

9
비교적 간단한 알고리즘이지만 Dijkstra는 매우 재능이 있으며 이론 물리학 및 고급 수학 교육을 받았습니다. 알고리즘 설계 능력을 향상시키기 위해 몇 년 동안 증거를 작성하는 것만 큼 좋은 것은 없습니다.
케빈 클라인

19
@woliveirajr-글쎄, 뉴턴은 운동 법칙을 생각해 내기 위해 같은 시간이 걸렸다 고 확신한다. 먼저 20 년 동안 생각해 본 후.
Rook

6
@Nakilon-그렇기 때문에 모든 사람들이 C로 모든 것을 씁니다. 그렇지 않으면 다른 사람의 고급 언어를 사용하는 코더 일뿐입니다. 아 잠깐, 나는 어셈블리를 의미합니다. 그렇지 않으면 당신은 다른 사람의 저수준 언어를 사용하고 있습니다. 잠깐, 전기 회로를 변경하기 위해 스위치를 뒤집는 것을 의미합니다. 그렇지 않으면 다른 사람의 명령 집합을 사용하고 있습니다. 또는 이미 존재하는 것을 사용하고 새로운 것을 만들기 위해 노력할 수 있습니다. Dijkstra 알고리즘을 사용하는 프로그램과 같은 새로운 것을 발명 할 때 왜 Dijkstra의 알고리즘을 다시 발명하는 데 시간이 낭비됩니까?
Monica Reinstate Monica

54

이것은 좋은 프로그래머가 몇 시간 안에 "재발 명"할 수있는 것입니까, 아니면 비현실적입니까?

첫째, 당신은 아마도 이론적 인 컴퓨터 과학과 프로그래밍을 혼동하고있을 것입니다. 환상적인 프로그래머는 컴퓨터 과학에 좋은 기초가 필요하지만 환상적 일 필요는 없습니다. Dijkstra는 컴퓨터 과학에 환상적이었습니다.

두 번째로, 나는 그래프를 잘 이해 한 사람은 약간의 생각 후에 자신의 그래프 순회를 개발할 것으로 기대합니다. 그러나 최단 경로 알고리즘은 아닙니다 . Dijkstra의 알고리즘은 특히 매우 정교합니다. 일단 이해하면 맹목적으로 명백합니다. 그러나 대부분의 방법입니다.

당신은 아마 파생 수있는 어떤 종류의 물건을 시도하고 생각에게 시간을주고 나서 최단 경로 알고리즘을. 그러나 몇 시간 또는 며칠이 걸리더라도 실망하지 마십시오. 이것은 완전히 정상입니다.

(주의 : 글쎄, 몇 시간 만에 문제를 무력화 할 수 있어야하지만, 상당히 작은 그래프에서도 작동하는 알고리즘을 생성하지는 않습니다.)


56
걱정하지 마십시오. 무차별 대입이 작동하지 않으면 충분히 사용하지 않는 것입니다.
로비

2
이론적 CS와 프로그래밍의 차이를 강조하기 위해 +1. 프로그래밍은 실제 문제 해결이며 이론적 CS는 프로그래밍을 지원하기 위해 존재합니다. 그러나 이론적 CS는 대부분의 사람들의 일상적인 프로그래밍에서 100 % 필수는 아닙니다.
Phil

17

이것은 좋은 프로그래머가 몇 시간 안에 "재발 명"할 수있는 것입니까, 아니면 비현실적입니까?

비현실적입니다. 사람들은 몇 시간 만에 알고리즘을 사용하지 않습니다. 많은 노력과 노력이 필요합니다. 블로그 를 인용하려면 :

도널드 크 누스 (Donald Knuth)의 말을 인용 한 벤틀리는 Programming Pearls에서 "1 진 바이너리 검색이 1946 년에 출판되었지만, n의 모든 값에 대해 올바르게 작동하는 최초의 바이너리 검색은 1962 년까지 나타나지 않았다"고 말했다.

Bentley의 버전도 큰 세트로 구현할 때 문제가있었습니다.

또한 훌륭한 프로그래머는 어떤 도구를 사용할 수 있는지, 언제 사용할 것인지 알고 있습니다. 독창성이나 다른 일을하는 데있어 추가 포인트를 얻지 못합니다. 제대로 작동하고 잘 작동하기를 원합니다.


1
블랙 잭, 나는이 포럼에 참여하여 벤틀리가 당신이 말한 것을 말하지 않았다는 것을 지적했다. 크 누스는 말했다. 그리고 벤틀리는 그를 인용했다. 내가 당신의 의견을 읽을 때 나는 당신이 좋은 지적을했다고 생각했지만, 나는 나의 출처를 확인하고 Bentley에 대해 들어 본 적이 없다. 그러나 나는 Knuth에 대해 들었고 그가 말한 것을 신뢰할 수 있습니다. 다음 번에 소스를 더 잘 확인하십시오.
Richard

8
@Richard-코멘트는 "Bendingley는 프로그래밍 진주에서."라고 말했다. Knuth가 처음으로 말했지만 내 소스는 TAoCP가 아닌 Programming Pearls이므로 Bentley가 쓴 것을 썼다. 나는 벤틀리가 창시자라고 주장하지 않았다. 나는 단지이 책에서 말한 것을 인용했다. 책에 나오는 많은 자료는 저자 스스로 발명 한 것이 아니기 때문에 왜 그런 식으로 볼 수 있을지 모르겠습니다.
BlackJack

Bentley에게만 견적을 제공함으로써 Knuth의 신용에 실패하고 "Bentley 's"진술이 잘못된 경우 Bentley는 단순히 정보를 퍼 뜨리지 않고 잘못된 정보를 생성 한 위치에 두게됩니다. 엄밀히 말하면 벤틀리가 말한 것을 말하지 않았습니다. 만약 그렇다면 벤틀리가 크 누스가 그렇게 말했다고 말했을 것입니다. 인용문은 여기에서 잘 사용되지만 인용 된 문맥에서 제외됩니다.
Richard

3
@Richard-내가 인용 한 인용문은 블로그에서 직접 인용 한 것입니다.이 글은 책에서 직접 인용 한 것입니다. 성명서에 많은 문제가 있으면 블로그 작성자에게 연락하여 변경하도록하십시오.
BlackJack

1
@Richard와 BlackJack : 당신은 정확하지만, 원저자에 대한 귀속은 진술에 신뢰와 맥락을 더합니다. 나의 편집은 충분해야한다.
Steven Evers

9

선택할 수있는 것보다 더 나은 솔루션을 찾을 수 없을 것입니다.

"최고"(귀하의 경우 가장 짧은) 것으로 생각되는 것보다 더 나은 알고리즘으로 나오는 것은 모든 사람이 할 수있는 일이 아닙니다. 아마도 불가능할 수도 있습니다.

훌륭한 프로그래머는 알고리즘의 배후에있는 논리를 이해하고 동일한 문제를 해결하려고 시도하는 다른 알고리즘보다 왜 나쁘거나 나쁘거나 (특정 문제에 부적합한지) 이해해야합니다.

그는 또한 특정 문제를 해결하기위한 최선의 방법인지 알 수 있어야합니다.

어쨌든 연습하고 싶다면 여전히 알고리즘을 직접 구현하여 마음을 사용하여 문제를 해결하려고 시도 할 수 있습니다. 최선이 아닐 수도 있지만 문제를 해결하는 것이 좋습니다.


6

이것은 "소프트웨어 엔지니어링"(프로그래밍이라고 부르는 것)과 다른 엔지니어링 분야의 차이점에 대해 읽은 것을 상기시킵니다. 생각해 보면 원래 디자인 패턴 책인 것 같습니다. 나는 여기 누군가가 그의 머리 꼭대기에서 그것을 인용 할 수 있다고 확신합니다.

어쨌든 (알고리즘 디자인에 정확히 맞지는 않지만) 요점은 엔지니어링 분야가 체계화되어 있다는 점입니다. 토목 기술자는 I- 빔을 재발 명하는 데 시간을 소비하지는 않지만 프로그래머는 항상 그렇게합니다. 문제 (그리고 나는 단지 많은 사람들의 감정을 반향하고 있다는 것을 알고 있습니다)는이 행동이 낭비적이고 오류가 발생하기 쉽고 해결책보다 자아를 제공한다는 것입니다.

컴퓨터 과학으로 인해 프로그래밍이 가능해졌으며 두 가지 모두를 좋아합니다. 그러나 저는 컴퓨터 과학자보다 훨씬 나은 프로그래머입니다. 오후에 Dijkstra의 알고리즘을 다시 만들 수 없기 때문에 무능하다고 비난하지 않습니다. 최단 경로 그래프 알고리즘을 통해 해결할 수있는 문제를 인식하지 못하면 프로그래머로서의 역량에 의문을 제기 할 것 입니다.

즉, 알고리즘에 대해 생각하고 새로운 알고리즘을 디자인하고 구현하려는 것은 (잠재적으로) 재미 있고 (거의) 항상 유익한 것이라고 생각합니다. CS 시간과 프로그래밍 시간을 명확하게 분리하려고합니다. 프로그래머의 경우, 특히 (유급) 시간이 실제 문제를 해결하는 데 더 많은 시간을 소비하는 것이 좋습니다. 게다가 CS 시간은 거의 항상 자신감을 떨어 뜨립니다.


아이러니 ... 어디서나 댓글을 달 수 있다면, 그 특권을 얻은 답을 삭제해야합니까? 이를위한 배지가 있어야합니다.
Keith Layne

있다 - 징계 명성은 당신이 1 아래로 돌아올거야 다시 계산됩니다 경우, 그러나
ChrisF

그렇습니다. 그것이 바로 제 요점입니다. 저는 그 시점에서 IMO 분야를 넘어 설 것입니다. 삭제 하기 전에 내 답변을 주석으로 변환 하면 모든 것을 가질 수 있습니다 ... 삭제하면 새로운 사용자 상태로 돌아갈 수있는 UberDisciplined라는 새 배지를 제안합니다. :)
Keith Layne

3

다른 사람들이하는 것과 똑같은 것을 눈치 채지 못할 것입니다. 나는 그것이 우리가 살아야 할 삶의 사실 일 뿐이라고 생각합니다. 많은 부분이 수동 학습과 그 결과로 개발 한 정신 모델에 달려 있습니다.

나는 학교에서 DeMorgan의 법을 가르쳐야 일관되게 수행 할 수있는 매우 지능적이고 유능한 프로그래머를 알고 있습니다. 나는 Dijkstra의 알고리즘을 스스로 알아 냈습니다. (그리고 나는 그것을 자랑스럽게 생각합니다) 거품 정렬을 이해할 수있을 때까지 정말 오랜 시간이 걸렸습니다.

더 유명하게도, 매듭 이론의 전문가가 될 것이라고 생각하는 아인슈타인은 열 살쯤 될 때까지 자신의 신발 끈을 묶을 수 없었습니다.

자신 이 명시 적으로 가르치지 않았다면 다른 사람들이 결코 알지 못했을 많은 것들을 자신도 모르게 재창조했을 가능성이 높습니다 .


3

나는 대부분의 답변이 말하는 것에 대해달라고 간청합니다. Dijkstra의 알고리즘에서 어떤 수준의 프로그래머도 스스로 올 수 있다고는 생각하지 않지만 문제를 해결하기 위해 어떤 방법 (효율적이든 아니든)을 생각해 낼 것입니다.

예를 들어, 당신은 당신이 스스로 거품 정렬을 만들 수 있다고 사이드 코멘트로 말했다. 나는 정렬 알고리즘 중 가장 악의적 인 것을 알고 있지만 문제를 해결할 수있는 방법을 찾았습니다. 그래서 프로그래머가 할 수있는 것으로 기대합니다. 문제를 해결할 방법을 찾으십시오.

물론 다른 사람들이 수행 한 솔루션을 조사하고 찾는 것도 효과가 있지만 그 시점의 극단은 자신을 생각하지 않는 프로그램이며 Google 검색의 개요 인 프로그램입니다.

나는 실제로 원하는 것보다 더 거칠게 들린다 고 생각하지만 내 요점은 : 솔루션이 버그가 있거나 지저분한 경우에도 프로그래머가 문제에 대한 해결책을 제시 할만 큼 창의적이어야한다고 생각합니다.


따라서 귀하의 사례로 돌아와서 Dijkstra의 알고리즘을 생각해 내야한다고 생각하지는 않지만 무한 루프로 끝나지 않고 여러 가능성을 시도하고 최단 경로를 찾는 알고리즘을 작성할 수 있다면, 그럼 당신은 내 승인을 얻었습니다.

(BTW 승인은 무료 세차 쿠폰과 동일한 순서로 계산됩니다.)


3
유능한 프로그래머가 버블 정렬 또는 이와 동등한 기능을 사용할 수 있어야한다는 데 동의합니다. 실제로 구현하고 시험해 보는 데 시간을 생산적으로 사용하는 것일 수도 있습니다. 아마도 문제를 더 잘 이해하기 위해서 일 것입니다. 그러나 유능한 프로그래머는 생산 코드에서 실제로 사용하지 않을 것이라고 말해야 한다고 생각합니다 . 그렇게하면 내년에 고객이 다시 와서 처리 할 데이터가 더
많아짐에

알고리즘을 발명 할 수 있는지 누가 신경 써야하는지 알 수 없다면 누가 신경 쓰나요? 자기 비판은 프로그래머에게 창의력만큼 중요합니다. 오히려 자신의 솔루션이 너무 오래 걸리거나 최선이 아닐 것임을 알면 신속하게 인정하는 프로그래머와 함께 일하고 싶습니다. 그렇지 않으면 자아가 멍해져 모든 바퀴를 재발 명하려는 프로그래머보다 그렇습니다.
Rei Miyasaka

나는 두 가지 점에 동의하지만, 우리는 두 가지 다른 것을 측정하고 있다고 생각합니다. 하나는 프로그래머가 문제를 해결할 수있는 능력입니다 (필수 사항). 다른 하나는 자기 비판 (필자는 프로그래밍에 대한 것이 아니라 삶에 대한)이라고 생각하고 코드를 판단하는 능력 (매우 바람직합니다)입니다. 또한 영원히 취하는 솔루션은 실제로 솔루션이 아니라고 말할 수 있습니다. ;)
Alpha

2

그렇습니다.

그것은 버블 정렬과 같은 도덕적 인 것일 수도 있지만, 훌륭한 프로그래머는 적어도 작동하는 무언가를 생각 해낼 수는 있지만 비효율적이라고 생각합니다.

말할 필요도없이, 특정 문제가 발생할 경우, 좋은 프로그래머는 먼저 라이브러리를 만들거나 게시 된 알고리즘을 사용하여 구현하기 쉬운 지 먼저 살펴볼 것입니다.

물론 많은 프로그래밍 작업이 훨씬 덜 어려워서 모든 사람이 그러한 어려운 문제를 해결할 수있는 것은 아닙니다. 그러나 이전의 과학적 연구에 의존 할 수없는 복잡한 프로젝트 관련 문제가있을 수 있기 때문에 팀에 그런 마음을 가진 사람이 필요합니다.


1

걱정 하지마

Perl Programmer로서 나는 결코 바퀴를 재발 명 하지 않는다 . 이것이 CPAN의 일입니다. 간단하고 잘 지원되는 알고리즘 또는 모듈이있는 경우이를 사용합니다. 좋은 모듈이 없다면 우리 는 바퀴를 발명 합니다. 이것이 Perl의 가장 큰 것 중 하나입니다.

그래서 내가 말하는 것은 이것입니다.

  1. 나는 바퀴를 재발 명하지 않지만 당신이 할 때 ...
  2. 완전히 재발 명하지 말고 ...
  3. 할 수 없어도 걱정하지 마십시오. 이것이 우리에게 프로그래밍 커뮤니티가있는 이유입니다 :-).

재발 명에 관한 것이 아니라 일반적인 문제 해결에 관한 것입니다. 스스로 물건을 발명하려고 시도하지 않으면 결코 향상되지 않습니다.
Nils

0

그래프 이론과 그에 적용되는 알고리즘은 표면에서 단순 해 보이지만 일반적으로 그리 멀지 않습니다. 비교 차 (평면) 그래프의 형성은 예를 들어 언뜻보기에는 간단하다고 생각할 것입니다. 작년에 나는이 문제 (Kuratowski 하위 그래프 제거를 통한 평면성)를 광범위하게 조사했다. 이 경험을 통해 이러한 알고리즘을 작성하는 사람들은 일반적으로 박사 학위 조사 기간을 보내고 때로는 연구가 팀에서 이루어 졌다는 것을 알 수 있습니다. 그리고 연구원 으로서 , 그것은 그 기간 동안 그들의 유일한 작업 초점입니다. 우리의 지상 엔지니어가 동일한 것을 기대할 수 있다고 생각하는 것은 합리적이지 않습니다. 다른 누군가가 옳게 말했듯이, 일단 해결책이 당신 앞에 있으면 맹목적으로 분명합니다. 항상 그런 것 같습니다!


0

이것은 좋은 프로그래머가 몇 시간 안에 "재발 명"할 수있는 것입니까, 아니면 비현실적입니까?

최단 경로와 같은 잘 알려진 문제에 대한 알고리즘을 독자적으로 발명 할 수 있다면 나쁜 프로그래머 가 될 것 입니다.

그것은 당신이 무시하고 의미 것 최단 경로 문제에 꽤 역사를 (| V가 | ^ 4) 다 익스트라의이다 (1984 년에 발표 된 O (E + V 로그 V) 알고리즘으로 1955 년에 출판 알고리즘으로하는 O에서 진행 피보나치 나무와 알고리즘). 이미 고안된 알고리즘보다 더 나쁘게 수행된다는 보장이 거의 있습니다. 더 나쁜 것은 알고리즘에 차이가 있거나 잘못되어 알고리즘을 잘못 만들 가능성이 있다는 것입니다. 또한 알고리즘을 생각하고 구현하고 기존 알고리즘을 재사용하는 데 걸리는 시간보다 테스트하는 데 훨씬 더 많은 시간이 소요됩니다.

알고리즘 설계는 알고리즘 설계자에게 맡기십시오. 프로그래머는 결과의 소비자입니다. 프로그래머는 알고리즘을 결합하여 실제 작업을 수행하도록합니다. 경찰관은 일을하거나 법을 잘 지키기 위해 법을 재발 명 할 필요가 없습니다.

또한 약간 복잡한 알고리즘에 대해 알고리즘을 직접 구현하는 대신 전문가가 만든 구현을 사용하는 것이 좋습니다. 그것은 정확할 가능성이 더 높으며, 그들이 당신보다 더 빠르게 만들 가능성이 높으며 많은 시간을 절약 할 수 있습니다. 이는 일반적으로 전문가 만 제공 할 수있는 추가 보안 요구가 있으므로 암호화 알고리즘의 경우 특히 그렇습니다.


암호화 알고리즘은 구현을 쉽게 확인할 수 있습니다. 알려진 올바른 테스트 벡터는 공개적으로 지정된 알고리즘에 대해 수십 개이며 정확하거나 그렇지 않습니다. (맞춤 구현으로 차선의 성능을 얻을 수는 있지만, 정확하다면 제대로 작동 할 수 있습니다.) 암호화에서 어려운 부분은 난수 생성, 원시 키 및 키 확장 테이블을 메모리 내에서 적절하게 처리하는 것과 같은 것입니다. 사용자 입력 (소싱 등) 처리, 암호 해독 된 데이터가 유효한지 파악할 수있는 항목 저장 등.
CVn

나는 프로그래머가 알지 못하는 타이밍 공격 등에 대해 더 많이 생각하고있었습니다. 항상 문제는 아니지만 중요한 문제입니다. 또한 암호화 프리미티브를 결합하는 것은 일반적으로 예상대로 작동하지 않으며, 이는 보안의 어려운 부분이기도합니다.
Alex ten Brink

타이밍 공격 등은 확실히 유효한 문제이지만 (암호화뿐만 아니라) 구현의 감수성은 정확성에 영향을 미치지 않는다고 주장 합니다 . 그리고 타이밍 공격을 가능하게하는 것 이상으로 암호화 방식을 망칠 수있는 많은 방법이 있습니다. Bruce Schneier는 자신의 Doghouse 시리즈 를 운영했습니다 . 나는 최근에 아무것도 보지 못했지만 많은주의적인 예가 있습니다. google.com/search?q=site%3Aschneier.com+%22the+doghouse%22
CVn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.