알고리즘이 중요하다는 것을 피어에게 어떻게 설득합니까?

StackOverflow https://stackoverflow.com/questions/1654425

  •  11-09-2019
  •  | 
  •  

문제

내 동료는 소규모 컨설팅 회사의 모든 직원의 주간 (일요일 ~ 토요일)을 표시하는 보고서를 작성하고 있습니다. 그가 쓴 코드가있어 대상 주간의 날에 해당하는 열을 보여줍니다. 그의 알고리즘은 다음과 같습니다.

  1. 월 첫날은 요일을 얻으십시오. 일요일이라면 깃발을 0으로 설정하십시오. 그렇지 않으면 하나로 설정하십시오.
  2. 한 달의 모든 날을 반복하십시오. 일요일이라면 깃발을 늘리십시오. 그런 다음 깃발의 값이 표시 될 주와 같으면 현재의 날에 해당하는 열을 표시하십시오. 그렇지 않으면 열을 숨 깁니다.

물론, 깃발은 현재 주가 무엇인지 나타냅니다.

또 다른 알고리즘을 제안했습니다.

  1. 매월의 첫 날은 지정된 주의 첫 번째 (F) 및 마지막 날 (L) 일을 얻으십시오. 예를 들어, 2009 년 10 월 첫째 주는 화요일 1 일에 시작하여 토요일 3 일에 끝납니다.
  2. 1 일 내지 F-1에 해당하는 열을 반복하고 숨기십시오.
  3. F에서 L까지의 일에 해당하는 열을 반복하고 보여줍니다.
  4. L+1에서 일상일에 해당하는 열을 반복하고 숨기고 숨 깁니다.

내 알고리즘의 "어려운"부분은 1 부입니다. 나는 알고리즘의 복잡성이 일정하기 때문에 "이해하기 어려운"것과 같이 "어려운"을 의미합니다. 그리고 내 알고리즘은 루프가 더 엄격하다는 장점이 있습니다. 내 동료 루프는 매월 매일 비교를합니다. 내 것이 아닙니다.

이것은 약간의 예였으며 여기서 과도하게 최적화하는 것이 너무 편집증이라고 말할 수 있습니다. 그러나 그의 프로그래밍 스타일은 실제 성능 크리티컬 코드를 작성할 때 약간 변하지 않습니다.

그의 코드는 또한 이러한 테스트로 가득합니다.

/* doSomething() doesn't change the state of the relevant variables. */
if (condition)
{
    flag++;
    if (flag > test)
        doSomething();
}
else
    if (flag >= test)
        doSomething();

물론 다음과 같이 수행 할 수 있습니다.

if (flag >= test);
    doSomething();
if (condition)
    flag++;

나는 무엇을합니까?!?!?!

편집 : 코드 샘플의 비교를 수정했습니다.

도움이 되었습니까?

해결책

이것이 당신의 임무입니까, 아니면 그의 일입니까? 그것이 그의 경우, 그를하자. 나는 효율성에 번성하는 사람입니다. 사실 무언가가 비효율적으로 보이고 통제 할 수 없을 때 매우 좌절됩니다.

저의 가장 '효율적인'아이디어, 알고리즘 및 코드를 수치심에 넣을 수있는 200 명 이상의 사람들이 있습니다. 아마도, 당신은 담당자로 혼자 갈 수 없습니다. Linus Torvalds 자신이 가입했다면, 그는 우리의 나머지 사람들처럼 1시에 시작했습니다.

당신이 고려해야 할 것은 사람들이 쓰는 코드를 유지할 수 있어야한다는 것입니다. 이것은 그들이 그것을 낳은 것처럼 이해해야한다는 것을 의미합니다. 누군가가 내 자신보다 훨씬 더 효율적인 또 다른 알고리즘을 보여 주더라도 나는 내가 그렇지 않으면 그것을 사용하지 않을 것입니다. 편안한 그것으로.

이것이 공동 프로젝트라면, 당신의 길을 작성하고, 속도를 높이고, 동료들과 함께 매우 인내심을 보인다.

5 년 전에 쓴 내용을 되돌아보십시오. 모든 사람은 그렇게함으로써 배워야합니다 그리고 모두는 자신의 속도, 특히 학습 속도로 일을합니다.

다른 팁

나는 당신의 친구가 올바른 아이디어를 가지고 있다고 생각합니다. 설명하는 데 한 시간이 걸리지 만 특정 성능 목표를 염두에두고 더 빠른 알고리즘보다 정확한 알고리즘을 사용하십시오.

'코드는 기계 x에서 200 마이크로 초 이내에 향후 10 년 동안 몇 달 동안 올바른 결과를 제공 할 수 있어야하는 특정 성능 요구 사항이있는 경우, 그리고 더 간단한 코드는 요구 사항에 실패한 다음 버전 사용을 고려할 수 있습니다.

(당신이 게시 한 코드 샘플은 실제로 덜 복잡하기 때문에 분명히 당신의 방식이 더 좋습니다.)

귀하의 설명에서, 나는 당신의 동료와 동의하지 않는지 확실하지 않습니다. 여기서 주요 문제는이 코드 조각이 성능 병목 현상.

설득 알고리즘으로 전환하려면 문제의 응용 프로그램을 프로파일 링하십시오 이 코드가 성능이 중요하다는 것을 보여주세요. 그런 다음 변경하고 다시 프로파일 링하십시오. 그렇게하면 당신은 있습니다 비교를위한 객관적인 기초.

두 알고리즘 사이에 의미있는 차이가 있다면 두 사람은 스위치를 만드는 것이 가치가 있는지 여부를 논의 할 수 있습니다.

웹 애플리케이션의 페이지로드 시간에 대해 걱정하는 경우의 교훈을 기억하십시오. 고성능 웹 사이트 그리고 야후 성과 지침 - CSS, JavaScript 및 Caching을 처리하는 방법은 서버에서 실행되는 알고리즘을 최적화하는 것보다 훨씬 큰 영향을 미칩니다.

측정없이 최적화를 옹호하는 것은 순진한 알고리즘의 성능 영향을 무시하는 것만 큼 위험합니다.

당신은 분명히 당신이 틀 렸기 때문에 방해해서는 안됩니다 ... 두 코드의 코드는 동일하지 않습니다. 조건 = 1, flag = 0 및 test = 1을 취하십시오.

g'day,

알고리즘 단순성을 선호해야합니다 그것은 당신의 제약 내에서 수행됩니다 실질적인 이득을 제공하지 않는 영리하고 지나치게 복잡한 알고리즘. 내 경험상 이런 종류의 지나치게 영리한 트릭은 미래의 유지 보수 악몽 일 가능성이 높습니다!

이 아이디어는 다음 인용문으로 더 잘 표현됩니다.

"유능한 프로그래머는 자신의 두개골의 엄격히 제한된 크기를 완전히 알고 있습니다. 따라서 그는 프로그래밍 작업에 완전한 겸손으로 접근하며, 무엇보다도 전염병과 같은 영리한 속임수를 피합니다." - 그의 1972 년 ACM Turing 강의에서 Edsger Dijkstra "겸손한 프로그래머"

BTW 그 종이는 훌륭한 읽기입니다! 온라인에서 제공되는 다른 많은 논문과 함께 ewdijkstra 아카이브

HTH

건배,

나는 여기서 문제를 보지 못한다 ... 그의 버전은 목표를 달성하는 작은 로터리 방법이 있지만, 그는 거기에 도착한다.

내가 말하려고하는이 진술은 맥락에서 벗어나지 않아야합니다. 그러나 항상 그렇게하는 사람들이있을 것입니다. 무언가를하지만, 그는 자신의 방법이 얼마나 추악해도 결과를 얻는 방법을 알고 있습니다.
아무도 무언가에 대한 올바른 알고리즘을 모른다면 진정한 생명 의인이 될 수 있습니다 ... 기회는 그가 할 것입니다. 오리 테이프 어떻게든.

여기서는 일반적인 감정에 동의합니다. 성능 개선으로 인해 코드를 읽기가 훨씬 더 어려워지면 그러한 변화를위한 충분한 이유가 더 나은 것이 더 나았습니다.

반면에, 그것이 우리가 항상 정착해야한다는 의미는 아닙니다. 가장 먼저 떠오르는 것. 때로는 똑같이 읽을 수 있거나 거의 그렇게 명백하게 뛰어난 대안이 있습니다.

동료에게 알고리즘 선택을 진지하게 받아들이도록 설득하려면 전투를주의 깊게 선택해야합니다. 그의 세상을 뒤집어 놓고 찾은 모든 사건에서 문제를 강요하려고하지 마십시오. 명백히 우수하고 명확한 교체 알고리즘을 생각할 수있을 때만 제안을 시작하고 그가 저항 할 때 물러날 준비를하십시오.

당신이 끔찍한 느낌이 들면, 당신은 그에게 힌트를 주거나, 주요 질문을하거나, 다른 기술을 스스로 알아낼 수 있도록 생각할 수있는 다른 기술도 할 수도 있습니다.

나도 네 아픔을 느낀다. 프로그래머는 본질적으로 수염입니다. 모든 사람은 프로그램 구성을위한 자신의 원칙과 규칙을 가지고 있습니다. 다른 의견이 그 중 일부와 충돌하면 프로그래머의 의견을 바꾸는 것은 마천루 건물의 기본 기둥을 움직이는 것과 같습니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top