세 가지를 모두 달성하기는 어렵다고 생각합니다. 두 사람은 가능할 수 있다고 생각합니다. 예를 들어, 경우에 따라 효율성과 가독성을 얻을 수 있다고 생각하지만 미세 조정 된 코드로는 유지 관리가 어려울 수 있습니다. 지구상에서 가장 효율적인 코드 는 인텔이 인라인 어셈블리로 작성하는 손 SoA 벡터화, 멀티 스레드 SIMD 코드를 이해하거나 가장 자르지 않는 한 대부분의 사람들에게 명백한 것처럼 유지 관리 성과 가독성 이 모두 부족 합니다. 2 개월 전에 게시 된 40 페이지의 수학적 논문과 하나의 엄청나게 복잡한 데이터 구조를위한 12 개의 라이브러리가있는 업계에서 사용되는 첨단 알고리즘.
미세 효율
대중의 의견과 상반 될 수있는 한 가지 제안은 가장 똑똑한 알고리즘 코드가 가장 미세 조정 된 간단한 알고리즘보다 유지 관리가 더 어렵다는 것입니다. 확장 성 향상으로 마이크로 튜닝 된 코드 (예 : 캐시 친화적 액세스 패턴, 멀티 스레딩, SIMD 등)에 대한 벅에 더 많은 수익을 거둘 수 있다는 아이디어는 적어도 매우 복잡한 산업에서 일한 적이있는 도전입니다. 데이터 구조 및 알고리즘 (시각적 FX 산업), 특히 메시 처리와 같은 영역에서 강타가 클 수 있지만 새로운 알고리즘 및 데이터 구조를 도입 한 이후로 이전에 들어 본 적이없는 새로운 알고리즘 및 데이터 구조를 도입하면 비용이 매우 비쌉니다. 새로운. 또한, 나는
따라서 알고리즘 최적화가 항상 메모리 액세스 패턴과 관련된 최적화보다 우선한다는 아이디어는 항상 내가 동의하지 않은 것입니다. 물론 버블 정렬을 사용하는 경우 마이크로 최적화의 양이 도움이 될 수는 없지만 ... 이유가 항상 그렇게 명확하지 않다고 생각합니다. 그리고 알고리즘 최적화는 마이크로 최적화보다 유지하기가 더 어렵다. 예를 들어, 클래식하고 간단한 BVH 알고리즘을 사용하고 유체 시뮬레이션을 알고리즘 적으로 가속화하는 최첨단 방법을 위해 Dreamwork의 OpenVDB 코드보다 작은 부분을 미세 조정하는 Intel의 Embree가 유지 관리가 훨씬 쉽다는 것을 알았습니다. 그래서 저는 업계에서 인텔이 현장에 들어 섰을 때 컴퓨터 아키텍처에 익숙한 사람들이 더 많이 마이크로 최적화하는 것을보고 싶습니다. 수천 개의 새로운 알고리즘과 데이터 구조를 생각해내는 것과는 반대로 효과적인 마이크로 최적화를 통해 사람들은 잠재적으로 새로운 알고리즘을 발명해야하는 이유를 찾을 수 있습니다.
거의 모든 단일 사용자 작업에 고유 한 데이터 구조와 그 뒤에 알고리즘이있는 레거시 코드베이스에서 근무했습니다 (수백 가지의 이국적인 데이터 구조 추가). 그리고 그들 대부분은 성능 특성이 매우 왜곡되어 매우 좁게 적용되었습니다. 시스템이 더 광범위하게 적용 가능한 수십 개의 데이터 구조를 중심으로 회전 할 수 있다면 훨씬 쉬웠을 것입니다. 캐시 미스와 관련된 엄격한 읽기 전용 목적으로도 안전하게 사용할 수없는 수백 개의 마이크로 페시 화 된 데이터 구조 간의 차이를 의미하는 경우 마이크로 최적화가 유지 보수성을 크게 향상시킬 수 있기 때문에이 사례를 언급했습니다. 맞은 대.
기능적 언어
한편 내가 만난 가장 유지 보수가 쉬운 코드 중 일부는 기능적 언어로 작성 되었기 때문에 상당히 효율적이지만 읽기가 매우 어려웠습니다. 일반적으로 가독성과 uber 유지 관리 성은 상충되는 아이디어입니다.
코드를 한 번에 읽기 쉽고 유지 관리 가능하며 효율적으로 만드는 것은 정말 어렵습니다. 일반적으로 유지 보수성에 대한 가독성 저하 또는 효율성에 대한 유지 보수성 저하와 같이 둘 중 하나는 아니지만 둘 중 하나에서 조금 타협해야합니다. 일반적으로 다른 두 가지를 많이 찾으면 유지 관리가 용이합니다.
가독성 대 유지 관리
이제 말했듯이 가독성과 유지 관리 성은 조화로운 개념 이 아니라고 생각 합니다. 결국, 대부분의 필사자들에게 가장 읽기 쉬운 코드는 인간의 사고 패턴에 매우 직관적으로 매핑되며, 인간의 사고 패턴은 본질적으로 오류가 발생하기 쉽습니다. " 이런 일이 발생하면 이렇게하십시오. 그렇지 않으면 그렇게하십시오. 그렇지 않으면 그렇게하십시오. 이 시스템이 서로 상호 작용하는 경우이 시스템이이를 수행 할 수 있도록 이런 상황이 발생해야합니다 ... 오,이 이벤트가 트리거 될 때 해당 시스템은 어떻습니까?"나는 정확한 인용문을 잊었지만 누군가 로마가 소프트웨어처럼 지어 졌다면, 벽에 새가 내려 앉아 넘어 질 것이라고 생각했다. 대부분의 소프트웨어가 그런 경우이다. 우리가 자주 걱정하는 것보다 더 연약하다. 겉보기에 무해한 몇 줄의 코드가 여기에 있으며 전체 디자인을 다시 생각하게 만드는 시점까지 중단시킬 수 있습니다. 가능한 한 읽기 쉬운 것을 목표로하는 고급 언어는 그러한 인간 디자인 오류에 대한 예외가 아닙니다. .
순수한 기능적 언어는 실현 가능할 정도로 접근하기 어려운 수준에 가깝습니다 (취약점에 가깝지는 않지만 대부분에 비해 상대적으로 더 가깝습니다). 그것은 부분적으로 인간의 생각에 직관적으로 매핑되지 않기 때문입니다. 읽을 수 없습니다. 그들은 가능한 최소한의 지식을 사용하고 부작용을 일으키지 않고 가능한 한 적은 특수 사례로 문제를 해결해야하는 사고 패턴을 우리에게 강요합니다. 그것들은 매우 직교하며, 코드를 놀라게하지 않고 자주 변경하고 변경할 수 있기 때문에 모든 것을 다시 쓰지 않고도 전반적인 디자인에 대한 생각을 바꾸는 시점까지 드로잉 보드의 디자인을 다시 생각해야합니다. 그것보다 유지하기가 쉽지 않은 것 같습니다 ...하지만 코드는 여전히 읽기가 어렵습니다.