요약 : 그것은 달려있다
세부 사항에서
깨끗하고 반짝이는 물건이 필요합니까?
여기에는주의해야 할 것이 있으며, 실제, 측정 가능한 이득과 개인 취향 및 코드를 만질 수없는 나쁜 나쁜 습관 사이의 한계를 식별해야합니다.
더 구체적으로, 이것을 아십시오 :
안티 패턴이며 기본 제공 문제가 있습니다.
- 그것은 더 확장 될 수있다 ,하지만 쉽게되지 않을 수도 있습니다 , 연장
- 이해하기 간단하지 않을 수 있습니다 ,
- 마지막으로, 적어도 여기에는 : 전체 코드 속도가 느려질 수 있습니다.
일부는 KISS 원칙 을 참조로 언급 할 수도 있지만, 여기에는 반 직관적 인 방법이 있습니다. 최적화 된 방법은 단순하거나 깔끔한 아키텍처 방식입니까? 아래의 나머지 부분에서 설명한 것처럼 답이 반드시 절대적인 것은 아닙니다.
YAGNI의 원리는 다른 문제와 완전히 직교하지 않지만 자신에게 질문을하는 데 도움이 : 당신이 그것을 필요로하는 건가요?
보다 복잡한 아키텍처는 유지 관리가 용이 한 것처럼 보이는 것 외에도 실제로 이점이 있습니까?
이 포스터를 큰 포스터에 적어 화면 옆이나 직장의 주방 공간 또는 개발자 회의실에 매달아 놓으십시오. 물론 자신을 되풀이 할 가치가있는 다른 많은 진언이 있지만,이 특정한 것은 "유지 보수 작업"을 수행하고 "개선"하려는 충동을 느낄 때마다 중요합니다.
이해하기 위해 코드를 읽을 때 코드를 "개선"하거나 무의식적으로 만지는 것이 자연 스럽습니다. 그것은 우리가 의견을 가지고 내부에 대해 더 깊이 이해하려고 노력한다는 것을 의미하기 때문에 좋은 일이지만 기술 수준과 지식에 묶여 있습니다 (더 나은 것을 결정하는 방법은 무엇입니까? ...), 우리가 소프트웨어에 대해 알고 있다고 생각하는 모든 가정 ::
- 실제로,
- 실제로해야합니다.
- 결국해야 할 것입니다
- 그리고 얼마나 잘하는지.
실제로 최적화해야합니까?
이 모든 것이 처음에 왜 "최적화"되었습니까? 그들은 조기 최적화 가 모든 악의 근원 이라고 말하며 , 문서화되지 않은 것처럼 보이고 최적화 된 코드를 보게되면 일반적으로 최적화 규칙을 따르지 않았고 최적화 노력이 필요하지 않은 것으로 가정 할 수 있습니다. 평범한 개발자의 허비가 시작됩니다. 또 다시, 아마도 당신의 이야기 일 것입니다.
그렇다면 어느 한도 내에서 수용 할 수 있습니까? 필요하다면,이 한계가 존재하며, 개선 할 여지가 생길 수 있습니다.
또한 보이지 않는 특성에주의하십시오. 이 코드의 "확장 가능"버전은 런타임시 더 많은 메모리를 사용하고 실행 파일에 대해 더 큰 정적 메모리 공간을 제공 할 가능성이 있습니다. Shiny OO 기능에는 이와 같은 직관적이지 않은 비용이 포함되어 있으며 프로그램과 실행 환경에 중요 할 수 있습니다.
측정, 측정, 측정
구글 사람들은 이제 데이터에 관한 것입니다! 데이터로 백업 할 수 있다면 필요합니다.
개발에 소비 된 1 달러당 적어도 1 달러의 테스트와 1 달러 이상의 지원 이 뒤따를 것이라는 오래된 이야기는 없습니다 (그러나 실제로는 훨씬 더 많습니다).
변화는 많은 것들에 영향을 미칩니다.
- 새로운 빌드를 만들어야 할 수도 있습니다.
- 새로운 단위 테스트를 작성해야합니다 (아무것도없는 경우에는 더 확장 가능하며 더 확장 가능한 아키텍처는 버그에 대한 표면이 더 많기 때문에 더 많은 공간을 남겨 둘 수 있습니다).
- 새로운 성능 테스트를 작성해야합니다 (향후에 안정적으로 유지되고 병목 현상이 발생하는 위치를 확인 하기 위해) .
- 이를 문서화해야합니다 (확장 성이 높을수록 세부 사항을위한 더 많은 공간이 필요함).
- 귀하 (또는 다른 사람)는 품질 관리에서이를 광범위하게 다시 테스트해야합니다.
- 코드는 (거의) 버그가 없으며 결코 지원해야합니다.
따라서 여기서 측정해야 할 것은 하드웨어 리소스 소비 (실행 속도 또는 메모리 풋 프린트)뿐만 아니라 팀 리소스 소비 이기도 합니다 . 둘 다 개발 목표에 따라 목표 목표를 정의하고, 측정하고, 설명하고, 조정해야합니다.
그리고 관리자에게는 이것이 현재 개발 계획에 적합하다는 것을 의미하므로 이에 대해 의사 소통하고 분노한 카우보이 / 잠수함 / 블랙-옵스 코딩에 참여하지 마십시오.
일반적으로 ...
네,하지만...
내가 틀리지 말아라. 일반적으로, 나는 당신이 제안한 이유에 찬성 할 것이다. 그리고 나는 종종 그것을 옹호한다. 그러나 장기 비용을 알고 있어야합니다.
완벽한 세상에서 올바른 솔루션입니다.
- 컴퓨터 하드웨어 는 시간이 지남에 따라 더 좋아지고
- 컴파일러와 런타임 플랫폼은 시간이 지남에 따라 향상됩니다.
- 완벽에 가깝고 깨끗하며 유지 관리 가능하며 읽을 수있는 코드를 얻습니다.
실제로:
당신은 그것을 악화시킬 수 있습니다
더 많은 안구가 필요하며, 더 복잡하게할수록 더 많은 안구가 필요합니다.
당신은 미래를 예측할 수 없습니다
필요한 "확장"이 이전 형태로 구현하기가 더 쉽고 빠르지 않았고, 자체 최적화가 필요한 경우에도 절대 확실성을 알 수는 없습니다. .
그것은 경영진의 관점에서 직접적인 이득이없는 막대한 비용을 나타냅니다.
프로세스의 일부로 만들기
여기서는 약간의 변화이며 특정 문제를 염두에 두었습니다. 이 경우에는 일반적으로 괜찮다고 말하지만, 대부분의 사람들에게는 작은 변화, 거의 외과 적 타격 편집에 대한 개인적인 이야기가 있습니다. 코드 뒤에있는 이유 중 하나가되어서는 안되는 것을 만졌습니다.
그러한 결정을 처리 할 수있는 프로세스가 있다면 다음과 같은 개인적인 결정을 내릴 수 있습니다.
- 올바르게 테스트하면 문제가 발생하면 더 빨리 알게됩니다.
- 측정하면 개선되었는지 알 수 있습니다.
- 당신이 그것을 검토하면 사람들이 떨어져 있는지 알 수 있습니다.
테스트 범위, 프로파일 링 및 데이터 수집이 까다 롭습니다
그러나 테스트 코드와 메트릭은 실제 코드에서 피하려고하는 것과 동일한 문제로 인해 어려움을 겪을 수 있습니다. 올바른 것을 테스트하고 미래에 올바른 것입니까? 소지품?
그럼에도 불구하고 일반적으로 더 많은 테스트 (특정 한도까지) 및 측정이 많을수록 더 많은 데이터를 수집하고 더 안전합니다. 나쁜 유추 시간 : 운전 (또는 일반적인 삶)과 같이 생각하십시오 : 자동차가 당신을 고장 났거나 누군가가 오늘 자신의 차를 운전하여 자살하기로 결정했다면, 당신은 세계에서 가장 좋은 운전자가 될 수 있습니다. 기술이 충분하지 않을 수 있습니다. 당신을 때릴 수있는 환경적인 것들이 있으며 인적 오류도 중요합니다.
코드 검토는 개발 팀의 복도 테스트입니다
그리고 마지막 부분이 핵심이라고 생각합니다. 코드 검토를하십시오. 개선 사항을 솔로로 만들면 개선의 가치를 알 수 없습니다. 코드 검토는 "홀 웨이 테스트"입니다. 버그를 탐지하고 과도 공학 및 기타 안티 패턴을 탐지하고 팀의 능력과 일치하는지 확인 하려면 Raymond의 Linus 's Law 버전을 따르십시오 . 다른 사람이 없다면 "최상의"코드를 가질 필요는 없습니다. 그러나이를 이해하고 유지할 수 있으며, 이는 암호화 최적화와 6 계층 심층 아키텍처 설계 모두에 적용됩니다.
마지막 단어로 다음을 기억하십시오.
디버깅은 프로그램을 처음 작성하는 것보다 두 배나 어렵다는 것을 누구나 알고 있습니다. 당신이 그것을 쓸 때 당신이 할 수있는만큼 영리하다면 어떻게 그것을 디버깅 할 것인가? - 브라이언 커니 건