"조기 최적화는 모든 악의 근원"에 대한 오해를 어떻게 처리 하는가?


26

나는 영어의 일반적인 의미에서 "최적화"로 간주 될 수있는 것에 대해 교리 적으로 반대하는 많은 사람들을 만났다. 내가 말하는 내용을 "조기 최적화"로 해석한다는 의미로 그들의 입장에 대한 정당성. 그러나 이러한 견해는 때로는 너무나 엄청나게 설득 되어 가장 순수한 "순진한"구현으로부터의 거의 모든 종류의 알고리즘 또는 데이터 구조 편차 또는 적어도 이전에 수행 한 방식과의 편차를 무시 합니다."성능"또는 "최적화"에 대해 듣지 못한 후 다시 "귀를 열게"하는 방법으로 이와 같은 사람들에게 어떻게 접근 할 수 있습니까? 사람들이 즉각적으로 다음과 같이 생각하지 않고 성능에 영향을 미치는 디자인 / 구현 주제에 대해 어떻게 논의합니까?

이제, "모든 최적화가 미숙하고 따라서 악"에 대한 입장은 이미 웹의 다른 구석 뿐만 아니라 여기에서도 다루어졌으며 , 최적화가 미숙하고 따라서 악한시기를 인식하는 방법에 대해서는 이미 논의 되었지만 불행히도 현실 세계에는 여전히 반 최적화에 대한 그들의 믿음의 도전에 개방적이지 않은 사람들이 있습니다.

이전 시도

몇 번, 나는 "조기 최적화가 나쁘다"↛ "모든 최적화가 나쁘다"고 설명하기 위해 Donald Knuth로부터 완전한 견적을 제공하려고 시도했습니다 .

우리는 시간의 97 % 정도라는 작은 효율성을 잊어야합니다. 조기 최적화는 모든 악의 근원입니다. 그러나 우리는이 중요한 3 %의 기회를 포기해서는 안됩니다.

그러나 전체 견적을 제공 할 때,이 사람들은 때때로 내가하고있는 일이 Premature Optimization ™이라는 것을 더 확신하고 파고 들기를 거부합니다. "최적화"라는 단어가 거의 두렵지 않은 경우가 있습니다. 몇 번의 경우, "최적화 (e | ation)"라는 단어의 사용을 피함으로써 거부하지 않고 실제 성능 개선 코드 변경을 제안 할 수있었습니다. "성능"도 마찬가지입니다. 대신 "대체 아키텍처"또는 "개선 된 구현"과 같은 표현을 사용하십시오. 이런 이유로, 이것은 정말로 이것이 독단적 인 것처럼 보이며 실제로 내가 비판적으로 말한 것을 평가 한 다음 불필요하거나 너무 비싸다고 생각하지 않습니다.


10
글쎄, 당신이 마지막으로 그런 토론을 할 때, 당신은 실제로 가장 순수한 순진한 구현으로 성능이 나빠질 것이라고 측정 했습니까? 아니면 적어도 예상 가동 시간에 대해 대략적으로 추정 했습니까? 그렇지 않다면, 다른 사람들이 그들의 의견으로 완전히 정확했을 수 있습니다. 당신은 알 방법이 없습니다.
Doc Brown

12
@errantlinguist : 프로그램이 실제로 "당밀만큼 느리다면"분명히 Knuth의 "그 중요한 3 %"를 쉽게 감지 할 수 있어야하므로 최적화에 대한 논쟁을 넘어 설 수 있습니다. 그리고 당신이 그것을 감지 할 수 없다면 ... 당신은 아직 숙제를하지 않았으며 아직 최적화 할 준비가되지 않았습니다. 따라서 문제가 어디에 있는지 명확하지 않습니다.
Nicol Bolas

6
@errantlinguist : 해당 코드 섹션이 애플리케이션의 성능 문제로 심각한 증거를 제시했지만 애플리케이션 전체가 필요보다 느리고 여전히 코드를 수정할 필요가없는 경우, 상관 없습니다. 당신은 증거에 근거한 추론에 영향을받지 않는 사람들을 다루고 있습니다.
Nicol Bolas

6
@errantlinguist : 핵심 질문 : 고객 이 해당 영역의 응용 프로그램이 느리다고 불평 했습니까?
로봇 고트

5
OP는 실제 질문에 대한 답변이 아닌 의견을 검증 할 사람을 분명하게 찾고 있기 때문에 투표를 마감합니다. 나는 이것이 Workplace.SE에서도 열려있을 것이라고 생각하지 않습니다.
BlueRaja-대니 Pflughoeft

답변:


35

"순수한 순진한 구현"을 먼저 시도하지 말고 "순진한 구현이 그렇게하지 않을 것이라는 것을 미리 알고 있기 때문에보다 정교한 솔루션"을 직접 구현하지 않는 지름길을 찾고있는 것 같습니다. 불행히도 이것은 거의 작동하지 않습니다 . 순진한 구현이 너무 느리거나 너무 느리다는 것을 입증하기 위해 어려운 사실이나 기술적 인 주장 이 없을 때 , 아마도 잘못되었을 것이며, 당신이하고있는 일은 조기 최적화입니다. 그리고 크 누스와 논쟁하려고하는 것은 어려운 사실을 갖는 것과 반대입니다.

내 경험상, 당신은 총알을 물고 "순진한 구현"을 먼저 시도해야하며 (얼마나 이것이 얼마나 빠른지 놀라 울 것입니다) 최소한 다음과 같이 실행 시간에 대한 대략적인 추정을 할 것입니다.

"순진한 구현은 O (n³)이고 n은 100.000보다 큽니다. 언젠가는 실행되지만, 순진하지 않은 구현은 O (n)에서 실행되며 몇 분 밖에 걸리지 않습니다 . "

그러한 주장을 통해서만 최적화가 조기에 이루어지지 않았 음을 확신 할 수 있습니다.

IMHO에는 단 하나의 예외 가 있습니다. 더 빠른 솔루션이 더 단순하고 더 깨끗한 솔루션 인 경우, 처음부터 더 빠른 솔루션을 사용해야합니다. 표준 예제는 조회를 위해 불필요한 루프 코드를 피하기 위해 목록 대신 사전을 사용하거나 큰 결과 집합 대신 필요한 하나의 결과 레코드를 정확하게 제공하는 우수한 SQL 쿼리를 사용하는 것입니다. 나중에 코드에서 필터링됩니다. 그런 경우에는 성능에 대해 논쟁하지 마십시오-성능은 추가이지만 추가로 관련이없는 이점 일 수 있으며, 언급 할 때 사람들이 Knuth를 사용하려고 할 수도 있습니다. 가독성, 짧은 코드, 더 깨끗한 코드, 유지 관리성에 대해 논쟁하십시오.

내 경험으로는 후자의 경우는 드물다. 더 일반적으로 더 복잡한 경우보다 더 이해하기 쉽고 오류가 덜 발생하는 단순하고 순진한 솔루션을 먼저 구현할 수있다.

물론, 어떤 성능이 수용 가능한지, 그리고 사용자가보기에 "너무 느린"시기를 알 수있을만큼 요구 사항과 사용 사례를 충분히 알고 있어야합니다. 이상적인 세계에서는 고객이 공식적인 성능 사양을 얻게되지만 실제 프로젝트에서는 필요한 성능이 종종 회색 영역으로 나타납니다. 사용자는 프로그램이 프로덕션에서 "너무 느리게"작동한다는 사실을 알게 될 때만 사용자에게 알려줍니다. 그리고 때로는 이것이 너무 느릴 때 (사용자 피드백)를 알아내는 유일한 작업 방법입니다. 그런 다음 Knuth를 인용하여 팀원에게 "순진한 구현"이 충분하지 않다고 설득 할 필요가 없습니다.


15
@errantlinguist : 어쩌면 내가 스스로를 분명히하지 않았습니까, 아니면 단순히 듣고 싶지 않은 것이 었습니까? 나의 조언은 : "3 %"또는 "97 %"에 대해 Knuth의 * 철학적 논증 "을 사용하지 마십시오 사실을 지키십시오. 그렇지 않으면 동료들은 아마도 당신의 퍼포먼스 논증이 부적절 할 것입니다.
Doc Brown

4
@errantlinguist : Karl Bielefeld의 답변에 대한 귀하의 의견에 설명 된 경우, "성능"을 사용할 필요없이 모든 주장이있는 것처럼 보입니다. 한 걸음 더 나아가서 그러한 경우에 성능에 대해 논쟁한다면 동료가 옳기 때문에 엄청난 실수를 저지 릅니다. 성능은 일반적으로 거기에 중요하지 않습니다. 단순성, 가독성, 유지 관리 성, 코드 줄이 적지 만 부수적 인 것이 아니라 성능에 대해서는 말하지 마십시오! 그들에게 당신에게 크 누스를 사용할 수있는 가능성을 제시하지 마십시오.
Doc Brown

2
@errantlinguist : 묻지 말 것-이러한 측면에 초점을 맞추는 것이 정확할 때 이러한 측면에 초점을 맞추고 최종 사용자에게 중요한 차이를 만든다는 것을 입증 할 수없는 경우 성능을 인수로 사용하지 마십시오 .
Doc Brown

2
@errantlinguist : 나는 당신이 그 결론에 어떻게 도달했는지 잘 모르겠습니다. Doc Brown의 대답은 완벽하게 분명해 보입니다. 수용 할 수있는 성과에 대한 사실에 대한 사실을 고수함으로써 동료들과 함께하는 비생산적인 주장을 극복 할 수 있습니다.
jl6

1
소규모의 프로그래밍에는 좋은 조언이지만 건축 설계 수준에서 성능 문제를 무시하면 팀이 문제를 해결하기 전에 많은 일을 할 수 있기 때문에 팀을 막 다른 길로 이끌 수 있습니다. 그리고 문제가 건축적일 때 그 작업의 많은 부분을 재사용 할 수 있다는 보장은 없습니다 (제품을 죽이는 것을 보았습니다). 나는 당신이 당신의 대답에 예외가 있다는 것을 알고 있지만 그것이 적용되는지 알기 위해서는 여전히 질문을해야합니다 그리고 질문을하는 것조차도 잘못한 동료의 동료에게는 끔찍한 일이다.
sdenham

18

스스로에게 물어보십시오 :

  • 소프트웨어가 성능 사양을 충족하지 않습니까?
  • 소프트웨어에 성능 문제가 있습니까?

이것이 최적화해야하는 이유입니다. 따라서 사람들이 반대하는 경우 사양을 표시하고 다시 돌아가서 사양을 충족하지 않기 때문에 최적화해야한다고 설명하십시오. 그 외에는 최적화가 필요하다는 것을 다른 사람들에게 확신시키는 데 어려움을 겪을 것입니다.

견적의 요점은 문제가 없다면 시간과 에너지가 다른 곳에서 소비 될 수 있으므로 불필요한 최적화를 수행하지 않는 것입니다. 비즈니스 전망에서 이것은 완벽하게 이해됩니다.

보조는 최적화를 두려워하는 사람들을 위해 항상 성능 결과를 메트릭으로 백업합니다. 코드가 얼마나 빠릅니까? 이전보다 성능이 얼마나 향상 되었습니까? 이전 버전에 비해 코드를 2 % 만 향상시키기 위해 2 주를 보냈다면 내가 상사라면 기쁘지 않을 것입니다. 이 2 주 동안은 더 많은 고객을 유치하고 더 많은 돈을 벌 수있는 새로운 기능을 구현하는 데 소비 될 수있었습니다.

마지막으로, 대부분의 소프트웨어는 고도로 최적화 될 필요가 없습니다. 일부 특수 산업에서만 속도가 중요합니다. 따라서 대부분의 경우 기존 라이브러리와 프레임 워크를 사용하여 효과를 볼 수 있습니다.


4
좋은 정보이지만, 실제로 성능과 관련된 순간을 토론하는 사람들과 함께 일하는 방법에 대한 내 질문에는 대답하지 않습니다.
착오 주의자

7
"일부 전문 산업에서만 속도가 정말 중요합니다"를 제외하고이 모든 것에 동의합니다. 고객의 관점에서 성능 문제가있는 소프트웨어의 양을 과소 평가한다고 생각합니다.
로봇 고트

@StevenBurnap : 그렇습니다. 실제로 느리지 않은 웹 응용 프로그램이 있습니까?-같은 과학에서 하나를보고 싶습니다.
착오 주의자

1
google.com은 매우 빠릅니다. :-P
로봇 고트

EDGE 모바일 연결에서 google.com을 사용해보십시오. 그렇습니다. 우스운 가장자리 사건이지만 확실히 빠르지 는 않습니다 . ;) (실제로 의도되지 않은
잘못된 표현

7

퍼포먼스와 관련된 순간을 토론하는 사람들과 함께 일하는 방법?

그룹의 전략적 방향을 기반으로하는 공유 원칙으로 시작하십시오.

내 원칙 :

코드 작성에 대한 나의 개인적인 원칙은 먼저 내 프로그램의 정확성을 목표로 삼은 다음이를 프로파일 링하고 최적화가 필요한지 결정하는 것입니다. 다른 프로그래머가 내 코드의 잠재적 인 소비자이기 때문에 내 코드를 직접 프로파일 링하고 느리면 사용하지 않기 때문에 내 코드의 경우 속도가 특징입니다.

소비자가 고객 인 경우 빠른 코드가 필요한지 고객에게 알려줍니다.

그러나 코드에서 선택할 수있는 더 나은 선택이 있습니다. 차라리 몇 가지 이유로 첫 번째 초안에서 바로 얻을 수 있습니다.

  1. 처음에 올바르게 이해하면 구현 (정보 숨기기 활용)을 잊을 수 있으며 TODO로 코드를 어지럽히 지 않습니다.
  2. 다른 사람들 (특히 직업에 대해서만 배우는 사람들)은 그것이 올바른 방식으로 수행되는 것을보고 앞으로도 같은 스타일의 코드를 배우고 사용합니다. 반대로, 그들이 내가 잘못한 것을 본다면, 그들도 그렇게 잘못 할 것입니다.

최적화가 필요하다고 가정

이것이 최적화가 필요한 코드에서 정말로 중요한 부분이라고 가정하면 Schlemiel the Painter 의 비유를 말 하거나 나머지 인용문을 강조 할 수 있습니다.

"프로그래머는 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하는 데 많은 시간을 낭비하며, 이러한 효율성에 대한 시도는 실제로 디버깅 및 유지 관리를 고려할 때 강력한 부정적인 영향을 미칩니다. 97 %의 시간 : 조기 최적화는 모든 악의 근원입니다. 그러나 우리는 그 중요한 3 %의 기회를 포기해서는 안됩니다. " -도널드 크 누스

추가 복잡성 비용 측정

복잡성 유지 관리 측면에서 실제 비용이 발생하는 경우가 있습니다. 이 경우 보조 구현을 다른 함수 또는 서브 클래스에 유지하고 동일한 단위 테스트를 적용하여 올바른지 의심 할 여지가 없습니다. 나중에 코드를 프로파일 링하고 순진한 구현으로 병목 현상이 발견되면 최적화 된 코드로 전환하여 프로그램을 대폭 향상시킬 수 있습니다.

지도

때때로 문제는 자아입니다. 어떤 사람들은 다른 사람이 자신보다 더 옳은 것보다 차선책이나 버그가있는 코드를 사용하려고합니다. 아마도이 사람들과 일하는 것을 피하고 싶을 것입니다.

리더십, 특히 사람들에 대한 위치 적 권한이없는 경우, 합리적인 제안을하고 다른 사람들을 합의에 이르게하는 것에 관한 것입니다. 팀을 마음의 회의로 안내 할 수 없다면, 그 문제는 압박 할 가치가 없을 것입니다. 아마 더 큰 물고기가 튀김 일 것입니다.


6

앞으로 나아갈 길은 실제 인용문과 다양한 해석을 잊는 것입니다. 그것은 전문가에 의해 특정 인용문에 너무 집중하는 독단적 방법입니다. 누가 Knuth가 항상 옳다고 말합니까?

대신 당신이 동의하지 않는 동료들과 함께 개발하고있는 소프트웨어 인 프로젝트에 집중하십시오. 이 소프트웨어에 허용되는 성능 요구 사항 은 무엇입니까 ? 이보다 느립니까? 그런 다음 최적화하십시오.

"최적화"라고 할 필요는 없습니다. 구현이 요구 사항을 준수하지 않으면 정의상 버그이기 때문에 "버그 수정"이라고 부를 수 있습니다.

보다 일반적으로 최적화와 관련하여 두 가지 가능성이 있습니다.

  1. 최적화 된 코드는 더 짧고 이해하기 쉬우 며 유지 관리하기도 쉽습니다.

  2. 최적화 된 코드는 이해하기가 더 복잡하고, 작성 및 테스트에 더 오랜 시간이 걸리거나, 요구 사항이 예상치 못한 방식으로 변경 될 경우 향후 변경하기가 더 복잡합니다.

사례가 (1)이면 최적화에 대해 논쟁 할 필요조차 없습니다. 그러나 만약 (2)가 사실이라면, 당신은 절충 결정에 관여하고 있습니다. 이것은 실제로 기술적 결정이 아닌 비즈니스 수준의 결정입니다. 이점과 비교하여 최적화 비용을 측정해야합니다. 이점이 있기 위해서는 비 효율성은 사용자 경험이 나쁘거나 하드웨어 또는 기타 리소스 비용이 크게 증가함에 따라 처음부터 문제가되어야합니다.


글쎄, 나는 당신의 첫 문장에 전적으로 동의합니다. 그러나 공식적인 방식으로 성능 요구 사항을 명시 적으로 지정하지 않고도 소프트웨어가 "사용 목적에 따라 성가 시게 느려질"수 있다고 확신합니다.
Doc Brown

@DocBrown : 물론, 어쨌든 개발자가 아닌 너무 느리게 결정하는 것은 고객입니다.
JacquesB

성능 요구 사항을 명시 적으로 명시한 비즈니스 요구 사항을 본 적이 없습니다.
착오 주의자

@errantlinguist : 내 경험상 온라인 상점과 같은 고객 중심 비즈니스에서는 일반적입니다. 그러나 회사 내부에서 사용하기위한 도구 및 응용 프로그램의 경우 사용자 경험은 일반적으로 프로젝트 소유자에게 문제가되지 않습니다.
JacquesB

4

나는 문맥 에서 전체 인용문 이 유익 하다고 생각합니다 . Reddit에서 작성한 게시물에서 주제를 복사합니다.

효율성의 성패가 학대를 초래한다는 것은 의심의 여지가 없습니다. 프로그래머는 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하는 데 많은 시간을 낭비하며, 이러한 효율성 시도는 실제로 디버깅 및 유지 관리를 고려할 때 큰 부정적인 영향을 미칩니다. 우리는 시간의 97 % 정도라는 작은 효율성을 잊어야합니다. 조기 최적화는 모든 악의 근원입니다.

그러나 우리는이 중요한 3 %의 기회를 포기해서는 안됩니다. 훌륭한 프로그래머는 그러한 추론을 통해 만족에 빠지지 않을 것입니다. 코드가 확인 된 후에 만 ​​가능합니다.

-Donald Knuth, Statements , ACM Computing Surveys, Vol 6, No. 4, 1974 년 12 월, p.268 로 이동하여 구조화 된 프로그래밍

요점과 함의는 최적화에 너무 일찍 관심을 두는 것보다 걱정해야 할 것이 더 중요하다는 것입니다. 확실히 데이터 구조와 알고리즘 (이것은 3 %)을 신중하게 고려해야하지만 낮은 수준의 최적화가 확실하다는 것이 확실해질 때까지 빼기가 모듈로 (97 %)보다 빠를 지 걱정할 필요가 없습니다. 필요한.

전자는 동료가 생각하고 있다는 점에서 반드시 최적화는 아니지만, 잘못 선택된 알고리즘과 데이터 구조는 차선책 이라는 점에서 최적화입니다.


2
Knuth는 알고리즘의 시간 복잡성을 분석하고 그에 따라 디자인을 선택하는 것이 조기 최적화라고 생각하지 않는다고 덧붙일 수 있습니다.
sdenham

3

내 경험상, 당신이 이런 종류의 최적화에 대해 정기적으로 반대한다면 사람들은 실제로 최적화에 대해 불평하지 않습니다. 그들은 당신이 최적화의 이름으로 무엇을 희생하고 있는지 불평하고 있습니다. 일반적으로 가독성, 유지 관리 성 또는 적시성입니다. 코드가 동일한 시간에 제공되고 이해하기 쉽기 때문에보다 효율적인 데이터 구조와 알고리즘을 사용하는 경우 사람들이 신경 쓸 필요가 없습니다. 이 경우 내 제안은 코드를보다 우아하고 유지 보수 가능하게 만드는 것입니다.

다른 사람의 코드와 관련하여 이런 종류의 반대를 받고 있다면 대개 상당한 양의 재 작업을 제안하기 때문입니다. 이러한 경우에는 노력을 기울일 가치가 있음을 나타내거나 코드를 작성하기 전에 설계 단계에서 더 일찍 참여하려고 시도하기 위해 실제 측정이 필요합니다. 다시 말해, 3 %임을 증명해야합니다. 정확히 마음에 들지 않는 코드를 모두 다시 작성하면 어떤 것도 달성 할 수 없습니다.


불행히도 실제로 반대의 경우를 수행했습니다. 예를 들어 DequeJava 표준 라이브러리 ArrayList의 코드를 사용하여 코드 작업 중에 스택으로 사용되는 대량의 논리를 대체하기 위해 사용했습니다. 검토 변경. 다시 말해, 검토자는에 익숙하지 않기 때문에 더 느리고 버그가 발생하기 쉬운 더 많은 코드를 원했습니다 Deque.
착오 주의자

3
10 년 동안 당신의 언어로 된 것을 배우고 싶지 않다는 것은 프로그래머에게 유독 한 태도이며, 원래 설명했던 것보다 훨씬 더 깊은 문제입니다. 개인적으로 그러한 상황에서는 조언을 거부하고 필요한 경우 경영진에게 이관합니다.
Karl Bielefeldt

5
@errantlinguist : 리뷰어가 깨끗하고 간단한 솔루션을 대체하는 것으로 더 나쁘고 (더 복잡한 것을 의미하는) 솔루션을 제안했을 때 이에 대해 논쟁해야합니다. 성능에 대해 논쟁하지 마십시오! 진지하게, 그 토론에서 "성능"이라는 단어를 사용하지 마십시오. 가독성과 유지 관리성에 대해서만 논쟁하십시오. 검토자가 자신의 잘못된 코드를 주장하면 이관합니다.
Doc Brown

+1 왜이 답변에 공감 투표가 아닌 공감 투표가 허용되는 대답인지 확실하지 않습니다. 문제를 처리하는 방법과 실제 근본적인 문제가 무엇인지에 대한 분석을 제안합니다 (즉, 아무도 코드를 완전히 다시 작성해야한다고 말하고 싶지 않습니다).
Andres F.

2

이 인용문에 대해 실제로 많은 오해가 있으므로 실제 문제가 무엇인지 되돌아가는 것이 가장 좋습니다. "최적화"해서는 안되는 문제는 아닙니다. "최적화"는 결코해야 할 일이 아닙니다. 아침에 일어나지 말고 스스로에게 "이봐 요, 오늘 코드를 최적화해야합니다!"라고 말하지 마십시오.

이로 인해 노력이 낭비됩니다. 코드를보고 "더 빨리 만들 수 있습니다!"라고 말하면됩니다. 처음에는 충분히 빠른 무언가를 더 빨리 만들기 위해 많은 노력을 기울입니다. 약간의 코드를 4 배 빠르게 만들었다는 사실에 자부심을 느낄 수 있지만,이 코드가 버튼을 눌렀을 때 발생하는 계산이고 처음에는 사람에게 표시하기 전에 10msec가 걸린다면 아무도 망할 것입니다.

이것이 "조기 최적화"의 "조기"입니다. 언제 "미숙"하지 않습니까? 고객이 "너무 느리게 느리면 고치세요!"라고 말할 때 그때 코드를 파고 더 빠르게 만들려고 노력합니다.

그렇다고 두뇌를 꺼야한다는 의미는 아닙니다. 그렇다고 10,000 개의 고객 레코드를 단일 링크 목록으로 유지해야한다는 의미는 아닙니다. 당신은 항상 당신이 생각하는 것의 성능 영향을 이해하고 그에 따라 행동해야합니다. 그러나 아이디어는 의도적으로 더 빠르게 만들기 위해 여분의 시간을 소비하지 않는다는 것입니다. 당신은 단순히 다른 선택들 중에서 더 우수한 선택을 선택하는 것입니다.


그렇다고 두뇌를 꺼야한다는 의미는 아닙니다. 그렇다고 10,000 개의 고객 레코드를 단일 링크 목록으로 유지해야한다는 의미는 아닙니다. > 나는 그것에 대해 100 % 동의하지만 실제로는 그런 식으로 사용되는 링크 된 목록을 보았으며 "만지지 마십시오"라고 들었습니다.
착오 주의자

좋은 정보이지만, 실제로 성능과 관련된 순간을 토론하는 사람들과 함께 일하는 방법에 대한 내 질문에는 대답하지 않습니다.
착오 주의자

3
슬프게도, "단일 연결리스트"는 무작위적인 예가 아니라 개인적으로 부딪친 것이 었습니다.
로봇 고트

1

잘못한 일을하거나 올바른 일을 할 수 있습니다.

종종 일이 잘못되고 코드가 리팩토링되어 올바른 방식으로 완료됩니다. 새 코드를 작성하려고하고 큰 페널티없이 올바른 방법으로 작업을 수행 할 수 있다는 것을 알고 있다면 올바른 방법으로 잘못하는 것입니다. (성능 테스트 등을 수행 한 후에는 몇 가지 사항을 변경해야 할 수도 있습니다.하지만 괜찮습니다. 또는 완전히 순진한 구현은 거의 불가능합니다.)

a) 미래에 도움이 될 것임을 알거나 b) 차선책이 길을 따라 문제를 일으킬 수 있다는 것을 아는 경우 반드시 조기 최적화는 아닙니다. 정말 체스 게임과 같습니다.

나는 사람들이 잘못을하는 것이 아니라 옳은 일을하기를 원한다고 생각합니다. 동료들과 대체 전략을 논의 할 때 이것을 사용하십시오.


5
"잘못된 길"이나 "올바른 길"은 결코 없습니다. 일반적으로 "나의 신, 어떻게 이럴까!"의 연속체에서 실행되는 무한한 방법이 있습니다.? "John Carmack과 Donald Knuth는 페어 프로그래밍 중에이를 개선 할 수 없었습니다."
로봇 고트

@StevenBurnap 이것은 사실입니다. 그러나 개인에게는 일반적으로 몇 가지 올바른 방법과 많은 잘못된 방법이 있다고 생각합니다. (우리가 더 나은 프로그래머가됨에 따라 스펙트럼이 바뀌기 시작합니다. 예전의 "올바른 길"은 때때로 새로운 "잘못된 길"이 될 수 있지만, 새로운 올바른 길은 예전의 길보다 낫습니다. 당신에게 가장 적합한 가장 좋은 방법 입니다. 이를 통해 우리는 더 나은 프로그래머가되고 더 나은 팀원이되고 (멘토링!) 더 나은 코드를 작성하게됩니다.
lunchmeat317

" 사람들이 잘못하기보다는 옳은 일을하기를 원한다고 생각합니다. "-문제는 옳고 그른 것에 대한 의견 이 매우 다르다는 것입니다. 어떤 이들은 심지어 문자적인 의미로 그것에 대해 거룩한 전쟁을 시작하기도합니다.
JensG

1

이것은 프로그래밍 문제가 아니라 통신 문제처럼 보입니다. 사람들이 자신의 방식을 느끼는 이유를 이해하고 자신의 방식이 더 나을 것이라고 생각하는 이유를 결정하십시오. 그렇게했을 때, 다른 사람들에게 왜 그들이 틀 렸으며 당신이 옳은지를 말하는 것이 목표 인 대립 논쟁을 시작하지 마십시오. 당신의 생각과 느낌을 설명하고 사람들이 그것에 반응하게하십시오. 어떤 합의에 도달 할 수없고 이것이 정말로 중요한 문제인 것 같으면 팀 전체에 심각한 문제가있을 수 있습니다.

실제 프로그래밍에 더 초점을 맞추고, 직감이 있다고 생각하는 것에 대해 긴 논쟁에 시간을 낭비하지 마십시오. 누군가 웹 응용 프로그램에서 요청 당 한 번 호출되는 메서드를 작성하고 실제로 O (n (2)) 시간 문제라는 것을 알고있을 때 시간 복잡성이 O (n ^ 2) 인 경우, 그러한 경우 더 똑똑하지 마십시오.

그러나 인간으로서 우리 프로그래머는 병목 현상이 발생할 응용 프로그램의 부분을 추측하는 것이 정말 나쁩니다. Eric Lippert는 블로그 게시물 에서이 흥미로운 주제에 대해 글을 씁니다 . 항상 유지 보수성을 선호하십시오. 결과적으로 더 많은 정보가 있으면 결국 발견되는 모든 성능 문제를 쉽게 (상대적으로) 해결할 수 있습니다.


답변을 편집하고 내용을 좀 더 상세하게 살펴보면 다운 보터가 피드백을 추가 할 수 있습니까? :)
sara

나는 downvoter는 아니지만 첫 번째 단락은 당면한 문제를 해결하는 데 도움이되지만 나머지는 실제로 성과와 관련된 순간을 토론하는 사람들과 함께 일하는 방법에 대한 내 질문에 대답하지 않습니다. (여전히 좋은 조언이지만).
착오 주의자

기본적으로 마지막 두 단락에서 살펴보고 싶은 것은 "이러한 최적화는 중요하지 않을 수 있습니다"입니다. 이 경우에는 싸움을 선택하는 것이 좋습니다.
sara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.