코드 작성을 시작하기 전에 프로그래머가 알고리즘을 설계하는 것이 더 좋은 이유는 무엇입니까?


12

적절한 알고리즘이 프로그램의 품질과 궁극적으로 효율성을 향상시키는 데 실제로 도움이됩니까?

알고리즘 없이도 양질의 프로그램을 만들 수 있습니까?

최신 프로그래밍에서 적절한 알고리즘이 필수입니까?


5
정의에 의하면이 일부 는 경우에도 알고리즘 그것의 좋은 그렇게 나쁘지 .

5
너무 많이 생각하기보다는 코드를 파는 것 외에는 선택의 여지가 없습니다. 대부분의 표준에 의한 영광스러운 알고리즘은 없습니다. 난 그냥 냄새 나는 똥을 연마하려고합니다;)
직업

13
나는 이것이 심각한 질문이라고 믿을 수 없다. en.wikipedia.org/wiki/ 알고리즘
Steven A. Lowe를

2
제목은 합리적이지만 질문 내용은 적습니다. 그는 실제 코드 작성을 시작하기 전에 알고리즘을 수정해야하는지 묻고 있다고 생각합니다.
그렉

9
나는 아니오라고 말합니다. 우연히 목적지를 찾거나 가스가 떨어지기 전까지는 목표없이 운전하는 것이 좋습니다.
jmq

답변:


29

나는이 질문이 역사적 관점을 구걸한다고 생각한다.

"오래된 시절"(이것은 개인적 증인이 아니기 때문에 지금은 그 시대의 나의 재구성 일뿐입니다. 상황을 다르게 경험하면 자유롭게 시정하십시오) HW 공간과 성능은 오늘날과 비교할 때 나빴습니다. 그래서 사람들이 작성한 모든 것이 매우 효율적이어야했습니다. 따라서 그들은 작업을 수행하는 데 필요한 공간 / 시간 성능을 달성하기 위해 최고의 알고리즘을 발명하기 위해 많은 것을 생각하고 연구해야했습니다. 이것의 또 다른 요인은 개발자가 주로 인프라 라고 부르는 것 , 즉 운영 체제, 프로토콜 스택, 컴파일러, 장치 드라이버, 편집기 등에서 작업하고 있다는 것입니다.이 모두는 많은 사람들이 많이 사용하므로 성능이 실제로 차이를 만듭니다 .

오늘날 우리는 심지어 기본 랩탑 (휴대 전화에서도)에서 멀티 코어 프로세서와 기가 바이트의 메모리로 놀라운 HW를 겪고 있습니다. 이는 당연히 많은 경우에있어서 성능-따라서 알고리즘이 중심 문제가되지 않음을 의미하며 빠른 솔루션을 제공하는 것보다 빠른 솔루션을 제공하는 것이 더 중요합니다. OTOH에는 수많은 프레임 워크가있어 문제를 해결 하고 동시에 많은 수의 알고리즘캡슐화합니다 . 따라서 알고리즘에 대해 생각하지 않아도 백그라운드에서 많은 알고리즘을 사용하고있을 수 있습니다.

그러나 여전히 성능이 중요한 영역이 있습니다. 이 영역에서는 코드를 작성하기 전에 알고리즘에 대해 많은 생각을해야합니다. 그 이유는 알고리즘이 디자인의 중심이기 때문에 주변 코드에서 많은 데이터 구조와 관계를 결정하기 때문입니다. 그리고 알고리즘이 제대로 확장되지 않았다는 것을 너무 늦게 알게되면 (예를 들어 O (n 3 ) 그래서 10 개의 항목에서 테스트 할 때 멋지고 빠르지 만 실제로는 수백만을 가질 것입니다) 단단하고 오류가 발생하기 쉽고 생산 코드에서이를 대체하는 데 많은 시간이 소요됩니다. 기본 알고리즘이 적합하지 않은 경우 마이크로 최적화는 도움이되지 않습니다.


1
정답입니다. 당신을 여기에있는 것이 나의 특권입니다 !!!
저비스

5
또한 컴퓨터는 프로그래머보다 훨씬 비쌌으므로 프로그래머가 더 열심히 일하는 것이 합리적이었습니다!

2
우리가 최적화하고있는 것이 바뀌었을 것입니다. 그러나 이제는 사람들보다 훨씬 더 복잡한 시스템을 조작해야합니다. 계획, 조직 및 유지 보수에 대한 생각이 부족하면 여전히 당신을 죽일 것입니다.
btilly

1
@btilly, 나는 미리 계획하고 (가능한 한 더 이상은 아님) 유지 관리에 대해 미리 생각하는 것이 매우 중요하다는 데 동의합니다. 그러나 이것이 반드시 알고리즘 설계에 많은 시간을 소비한다는 것을 의미하지는 않습니다. 예를 들어, 함수가 한 달에 한 번 실행되고 완료하는 데 1 시간이 걸리는 경우, 실행 시간을 10 분으로 단축하더라도 알고리즘 조정에 며칠을 소비하는 것은 아마 과도한 일입니다. 이점은 단지 비용을 정당화하지는 않습니다.
Péter Török

2
두 가지 : 첫째, 알고리즘은 프로그램이 얼마나 잘 확장되는지 결정할 수 있으며 종종 중요합니다. 둘째, 요즘 서버에서 많은 소프트웨어가 병렬로 실행됩니다. 즉, 프로그램 Z를 두 배 빠르게 실행하도록 수정하면 프로그램을 실행하는 사람은 Z 서버의 절반이 필요합니다.
David Thornley

14

무언가를 지적하기 위해 :

알고리즘 자체는 문제의 일반적인 단계별 솔루션입니다. 따라서 문제를 해결 한 경우 실제로 알고리즘을 사용했습니다.

여기서 가장 중요한 점은 알고리즘을 사용하여 문제를 해결해야한다는 것입니다. 대부분 코딩으로 넘어 가기 전에 문제에 대해 생각하는 것이 좋습니다.이 단계를 종종 디자인이라고합니다. 그러나 얼마나 많은 방법으로 당신이 이것을 할 것인가는 당신에게 달려 있습니다.

또한 알고리즘 개념을 플로우 차트 와 혼합해서는 안됩니다 (여기서 진행되고있는 것 같습니다). 순서도는 하나의 그래픽 표현 일 뿐이며 알고리즘을 설명하기 위해 옛날에 사용되었습니다. 요즘에는 거의 사용되지 않습니다.

편집하다:

실제로 알고리즘을 표현하는 방법은 여러 가지가 있으며 프로그래밍 언어 코드 자체도 그 중 하나입니다. 그러나 종종 전체 문제를 한 번에 해결하지 않고 개요 만 작성한 다음 빈 칸을 채우는 것이 훨씬 낫거나 쉽습니다.

  • 내가 개인적으로 가장 좋아하는 것은 의사 코드이며, 문제의 알고리즘에 대한 일반적인 추상 개요 만 다루기 위해 pseudocode 로 세부 정보를 얻는 것은 어리석은 일입니다. 실제 코드입니다.

  • 그러나 개요에는 실제 코드를 사용할 수 있습니다. 예를 들어, TDD 사람들은 코딩 할 때 알고리즘을 설계하는 것을 좋아하며, 한 번에 해결할 수 없기 때문에 실제 코드에서 프로그램 실행의 개요를 설계하고 모의 객체 (또는 함수, 메소드)를 사용합니다. .) 나중에 채울 공백으로.

  • UML 활동 다이어그램 은 다형성 및 멀티 스레딩과 같은 새로운 항목에 대한 표기법이 추가 된 구식 플로우 차트의 현대적인 구현으로 보입니다. 나는 실제로 그것들을 많이 사용하지 않았기 때문에 이것이 얼마나 유용한 지 말할 수 없다. 나는 완전성을 위해 그것을 언급하고있다.

  • 또한 상태를 전환하는 알고리즘을 기반으로하는 경우 상태 다이어그램 이 매우 유용합니다.

  • 일반적으로 특정 알고리즘 뒤에 아이디어 를 스케치 해야한다는 의미 는 좋은 방법입니다.


알고리즘을 제시하는 방법에는 여러 가지가 있는데 어떤 방법을 권장합니까? 그리고 왜?
저비스

@ 저비스 : 내 업데이트를 참조하십시오, 나는 그들 중 일부를 나열했습니다.
Goran Jovic

링크는 어디에 있습니까?
저비스

4

좋은 비유는 요리를 시작하기 전에 레시피를 알아야한다는 것입니다. 좋아, 당신이 갈 때 그것을 조정할 수 있지만 시작하기 전에 원하는 것을 여전히 알아야합니다. 양고기 스튜를 만들고 싶다면 빵 한 덩어리를 굽는 것과는 다른 일을 할 것입니다.


알고리즘 = 아이디어 ???
저비스

알고리즘 == 레시피 !!

그러나 동일한 요리사에 따라 요리사마다 다른 요리 방법이 있습니다.
저비스

물론 빵을 구울 때 아내가 빵을 구울 때와 다릅니다. 그러나 기본 부분은 동일합니다 (밀가루, 물, 효모, 소금)
Zachary K

또한 단지 전문 제과점에서 만든 빵 한 덩어리 구매 갈 수있는 상점이있다
JK는.

3

코드는 알고리즘을 구현합니다. 알고리즘을 설계하지 않고 코드를 작성하는 것은 벽을 만들기 전에 집을 페인트하는 것과 같습니다. 알고리즘은 프로그래밍 초기부터 "MUST"였습니다.


확인. 집을 그리는 것은 ABC만큼 쉽습니다. 집이 없어도 계획을 시작할 수 있습니다.
저비스

2
@ 저비스 : 마찬가지로, 다른 부분에 대한 알고리즘을 지정하지 않고 코드의 일부 부분을 계획 할 수 있습니다 (예 : 작동 방식을 결정하지 않고 데이터를 정렬하는 기능이 있는지 결정할 수 있지만 시간에 따라 결정해야 함) 정렬 코드 작성).
Jerry Coffin

1
나는 집을 그리는 것보다 그림을 그리는 것의 비유를 선호합니다. 모든 코딩이 집을 그리는 것과 같다면 다른 직업을 찾게 될 것입니다. 그리고 그림을 그리는 것은 반복적 일 수 있습니다. 알고리즘이 완전히 명확 해지기 전에 실제 코드로 프로토 타이핑을 시작하는 경우가 많습니다. 실제로 가장 자주.
그렉

3

귀하의 언어에 능통하면 품질과 생산성을 향상시키는 데 도움이됩니다. 작은 알고리즘 문제를 해결하는 것은 동일한 MVC를 100 번 반복하는 것보다 훨씬 유용합니다.
유창함을 얻는 다른 방법이 있다고 생각합니다.

현대 프로그래밍 영역에서 알고리즘이 필수가됩니까?
'cool codez'를 작성하는 'php ninja'이 아닌 한 이미 '필수'입니다. 모든 '최고의'회사 (Google, Amazon 등)는 인터뷰에서 알고리즘 경험을 테스트하므로 아무 이유없이 그렇게하지 않을 것입니다.

그러나 원래 시점으로 돌아가서 개선하고 싶다면 끊임없이 도전해야합니다. 그리고 일반적인 작업 (현재 "100 개 이상의 객체에 대한 CRUD 관리자 작성")이 항상 좋은 과제를 제공하지는 않으므로 알고리즘이이를 보완합니다.


1

코딩을 시작하기 전에 최소한 알고리즘에 대한 아이디어가 필요하다고 말하고 싶습니다. 데이터 구조 등을 기반으로 코딩하는 동안 아이디어를 수정하게 될 것입니다.

프로파일 링에서 해당 영역에 성능 문제가 있음을 제안하면 나중에 코드를 다시 수정할 수 있습니다.


1

잘못된 코드를 작성하기 전에 실수를 수정하는 것이 더 빠르기 때문입니다.

보다 유망하게도, 서로 다른 프로그래머들 사이에서 10 대 1의 생산성 차이가 일상적으로 측정됩니다. 생산성이 10 배 수준 인 프로그래머를 보면 실제로 코딩하는 데 가장 적은 시간 을 소비합니다 . 코드 입력 시간이 병목 현상이되어서는 안됩니다. 대신, 요구 사항을 직선, 계획, 테스트 등을 수행하는 데 많은 시간을 소비합니다.

반대로, 일시 정지없이 코딩을하는 프로그래머를 살펴보면, 예측 가능한 문제가 발생할 때 필연적으로 코드를 반복해서 작성해야하며, 최종 결과는 유지 관리가 쉽고 버그가 많습니다. (우연히 당신은 소프트웨어 개발에 소비되는 돈의 평균 80 %가 유지 보수 단계에 있다는 것을 알고 있었습니까?


당신은 절대적으로 맞습니다.
저비스

1

일반적으로 알고리즘과 데이터 구조가 먼저 코드화됩니다. 그러나 그것은 프로그래밍 영역에 많이 의존합니다. 나는 많은 응용 수학 형식 작업을 수행했으며 실제로 당시의 폭포 모델을 내려다 보았습니다. 낮은 수준에서 중간 수준의 알고리즘을 당연한 것으로 간주 할 수 없었기 때문입니다. 쓰지 않은 서브 시스템의 존재를 중심으로 큰 구조를 설계 한 다음 게임에서 후반에 중요한 서브 시스템 중 하나에 대한 수학이 제대로 수행되지 않는다는 것을 발견하십시오. 그래서 나는 항상 가장 도전적인 하위 시스템에 대해 먼저 생각했고, 의심 할만한 이유가 있다면, 먼저 그것들을 작성하고 테스트했습니다. 그러나 일부 문제 영역의 경우 많은 계획 없이도 계속 진행할 수 있습니다.


동의합니다.
저비스

여기서는 하향식 디자인과 상향식 디자인의 차이점에 대해 이야기하고 있습니다. 이는 다른 문제입니다. "앞으로 쟁기질"할 때 여전히 일종의 알고리즘을 구현하고 있습니다. 아마도 알고리즘이 자신에게 명백해 보이거나 이미 문제에 대해 잘 알고 있기 때문에 그러한 용어로 생각하지 않을 수도 있지만, 알고리즘이 아직 존재하지 않는다는 의미는 아닙니다.
Caleb

0

섹션에서 알고리즘을 디자인 한 다음 해당 섹션을 분할하고 각 섹션을 개별적으로 코딩하십시오. 이렇게하면 두 가지 관점을 혼합 할 수 있습니다.

  1. 언어 기능을 사용하여 알고리즘 작동
  2. 코드를 생각하기 전에 아이디어를 언어와 통합하지 마십시오. 언젠가 알고리즘을 다른 언어로 이동해야합니다.

얍! 알고리즘이 언어 독립적이라는 것을 알고 있습니다. 기존 프로그래밍 언어를 사용하여 동일한 알고리즘을 표현할 수 있습니다.
저비스

0

나를 위해, 그것은 거의 모든 코드입니다. 생산성이 가장 높은 프로그래머에게는 이것이 사실이라고 생각합니다. 텍스트를 작성하는 것만 큼 쉽게 코드를 작성할 수 있습니다.

가능한 한 요구 사항을 실행 가능한 테스트 (코드)로 캡처하려고합니다. 디자인은 단지 고급 코딩입니다. 대상 언어로 디자인을 캡처하여 다른 형식으로 디자인 한 다음 번역하는 것이 더 빠르고 정확합니다.

대부분의 사용자가 텍스트 요구 사항을 효과적으로 검토 할 수 없다는 것을 알게되었습니다. 순차적 사용 사례에서는 문제가 없지만 사용 사례는 UI의 모든 측면을 캡처 할 수 없습니다. 가장 좋은 점은 구현시 첫 번째 작업을 수행하고 사용자가 시도하고 의견을 얻고 그에 따라 코드를 수정하도록하는 것입니다.


0

앉아서 코딩을 시작하면 "디자인"여부에 관계없이 알고리즘을 염두에 두어야합니다.

완전한 알고리즘을 염두에두고 앉아 코딩을 시작하면 다음 중 하나를 수행하게됩니다.

1) 키를 무작위로 으 깨기. 아마도 컴파일러 오류가 발생합니다.

2) 원하는 것을 제외하고는 아무것도 할 수있는 컴파일 가능한 코드 작성

3) 문제의 작은 부분을 해결하기 위해 코드를 작성하고 집계 방식으로 진행할 때 코드를 작성하지만 실제로 생각하지는 않습니다. 따라서 결국 문제가 해결됩니다. 그러나 코드는 매우 효율적이지 않으며 역 추적 및 시간 낭비 가능성

따라서 사람들은 보통 머리에 알고리즘을 사용하여 프로그래밍합니다. 그것은 종이나 다른 매체에 반해 있거나 추론되었을 수 있습니다.

키보드에서 떨어진 문제, 특히 프로그래머로서의 초기에 대한 공격에 대해 생각하는 것은 좋은 훈련이 될 수 있습니다. 다른 답변에서 알 수 있듯이, 경험이 많을수록 "즉석에서"좀 더 다루기 쉬운 문제를 더 잘 코딩 할 수 있습니다. 그러나 어렵거나 큰 문제의 경우 키보드에서 생각하고 디자인하는 것이 유용합니다. 코드와 관련하여 언어 구성과 관련하여 가장 즉각적인 작업에 접근하는 방법에 대해 생각할 가능성이 높습니다. 문제. 예를 들어, 펜과 종이의 문제에 대해 생각하면 코드의 언어 측면에서 더 많은 자유를 얻게되고보다 추상적 인 수준에서 생각할 수 있습니다.


0

소프트웨어 구축을 근본적으로 가치있는 것의 구축에서 무언가로 보는 것을 그만 둘 필요가 있습니다. 그렇지 않습니다. 따라서, 다른 어떤 것과 마찬가지로, 간결한 계획이나 디자인은 항상 필요합니다.

적절한 알고리즘이 프로그램의 품질과 궁극적으로 효율성을 향상시키는 데 실제로 도움이됩니까?

적절한 건축 계획 / 도식이 양질의 주택을 효율적으로 건설하는 데 도움이됩니까?

알고리즘 없이도 양질의 프로그램을 만들 수 있습니까?

적절한 건축 계획없이 양질의 주택을 효율적으로 건설 할 수 있습니까? 당으로 무한 원숭이 정리 , 확률, 영원을 위해 무작위로 입력 그래 (단지 백만 같은 원숭이는 결국 셰익스피어의 전집을 입력합니다.

최신 프로그래밍에서 적절한 알고리즘이 필수입니까?

코드 원숭이가되고 싶지 않고 똥처럼 보이고 작동하는 소프트웨어를 제공하지 않으려면 반드시 그래야합니다. 코드를 유지하기 어려운 것처럼 보이기 때문에 내가 구해야했던 모든 프로젝트는 그 질문에 대한 부정적인 대답으로 시작했습니다.

사실, 현대 프로그래밍은 카우보이 프로그래밍 소프트웨어 엔지니어로부터 멀어졌으며, 필요한 경우 일종의 계획 세웠습니다 .

알고리즘 및 데이터 구조 라이브러리 (예 : C ++ 또는 Java 컬렉션 라이브러리의 Boost)가있는 경우에도 해당 알고리즘을 적절하게 사용하고 합리적이고 높은 수준으로 구성하는 방법을 알아야합니다. 레벨 알고리즘.


-2

더 좋지 않습니다. 아무것도 "디자인"하지 않는 것이 좋습니다. 그것은 프로그램을 쓰지 않는 사람들을위한 것입니다. 문제의 실제 경험이있는 사람들은 알고 있습니다. 수학자, 엔지니어 또는 물류 전문가라면 다른 곳에서 프로세스를 수행해야합니다. 그러나 그것은 '프로그래밍'이 아닙니다.

먼저 일종의 테스트 및 벤치 마크를 수행하십시오.

그런 다음 무엇이든 쓰십시오. 시간이 부족하거나 더 이상 개선 할 수 없을 때까지 refactor-rewrite -loop를 수행하십시오.

많은 사람들이 실제로 컴퓨터에서 아무것도하지 않고 컴퓨터로 일을 할 수 있다고 생각하는 것 같지만, 이것이 가장 일반적인 신화 중 하나라고 생각합니다. 건축 우주 비행사.

또한 Algo를 작성하기 전에 최적화 할 수 없습니다.

IOW, "금속에 가까이 머 무르십시오".

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.