9 Laws That Every Software Developer Should Know
Medium
소프트웨어 개발에는 법칙이나 원칙으로 알려진 다양한 가이드라인과 관찰 결과가 존재합니다. 이들은 모든 상황에 보편적으로 적용되는 엄격한 공식은 아니지만, 개발 과정을 크게 좌우하는 중요한 프레임워크를 제공합니다. 이러한 원칙은 조직, 팀, 그리고 개인의 생산성에 상당한 영향을 미칠 수 있기 때문에 소프트웨어와 관련된 모든 사람이 이를 숙지하는 것이 유용합니다.
브룩스의 법칙 (Brook's Law)
“늦어진 소프트웨어 프로젝트에 인력을 추가하면 더 늦어진다.” - Fred Brooks
조정 비용(coordination cost) 때문에 프로젝트에 더 많은 개발자를 투입한다고 해서 생산성이 항상 증가하는 것은 아닙니다. 이 법칙은 지연된 프로젝트에 계획 없이 추가 인력을 투입하는 것의 위험성을 강조합니다.
따라서, 너무 큰 팀과 여러 역할을 동시에 수행해야 하는 소규모 팀 사이에서 균형을 찾는 것이 중요합니다.
굿하트의 법칙 (Goodhart's Law)
“측정이 목표가 되는 순간, 그것은 좋은 측정 수단이 아니게 된다.” - Charse Goodhart
특정 지표가 목표나 기준이 되면, 사람들은 그 지표를 충족시키기 위해 행동을 최적화하기 시작하며, 이는 종종 해당 지표가 대표해야 할 근본적인 목표를 훼손합니다.
예를 들어:
코드 라인 수(생산성을 측정하기 위해)
스프린트당 완료된 스토리 포인트(팀 속도를 측정하기 위해)
코드 커버리지(테스트 품질을 측정하기 위해)
이러한 함정을 피하기 위해 데이터 기반 접근법을 완전히 포기할 필요는 없습니다. 대신, 노력을 이끄는 다양한 지표를 활용해야 하며, 지표를 지속적으로 수정하고 재평가해야 합니다. 때로는 정성적인 접근 방식도 고려해야 합니다.
하이럼의 법칙 (Hyrum's Law)
“ API 사용자가 충분히 많아지면, 설계자가 계약서에 명시한 내용과 상관없이 시스템의 모든 관찰 가능한 동작에 의존하는 사용자가 생긴다.” - Hyrum Wright
API 사용자가 늘어나면 설계자가 의도하지 않거나 문서화하지 않은 동작조차도 사용자들이 의존하게 됩니다. 시간이 지남에 따라 사소하고 문서화되지 않은 특이점이나 에지 케이스가 “기능”으로 자리 잡게 되어, API를 변경하거나 개선하려면 누군가의 사용 사례를 깨뜨리지 않고는 어렵게 됩니다.
이 법칙은 시스템이 성장하고 진화함에 따라 하위 호환성을 유지하고 기대치를 관리하는 데 따르는 어려움을 강조합니다.
콘웨이의 법칙 (Conway's Law)
“시스템(광범위하게 정의된)을 설계하는 조직은 그 조직의 커뮤니케이션 구조를 복제한 구조를 만들어낼 것이다.” - Melvin Conway
소프트웨어 구조는 이를 개발한 조직의 구조를 자주 반영합니다. 기존의 팀이나 부서 경계를 무작정 따르게 되면, 원하는 아키텍처나 비즈니스 기능과 잘 맞지 않는 하위 도메인이 생성될 수 있습니다.
Inverse Conway Maneuver(역 콘웨이 기법)는 콘웨이의 법칙을 적극적으로 활용하는 접근 방식으로, 소프트웨어 아키텍처가 특정한 형태를 갖추길 원한다면, 먼저 팀과 커뮤니케이션 패턴을 원하는 아키텍처에 맞게 조직해야 한다는 점을 제안합니다.
리누스의 법칙 (Linus's Law)
“ 충분히 많은 눈이 있다면, 모든 버그는 얕다.” - Eric Raymond
이 법칙은 오픈소스 협업의 본질을 담고 있습니다. 폭넓은 커뮤니티 참여는 폐쇄적인 시스템보다 더 효과적으로 버그를 식별하고 수정할 수 있게 해줍니다. 많은 사람이 코드를 살펴볼수록 누군가는 다른 사람이 놓친 버그를 발견하고 해결할 가능성이 높아집니다.
호프스태터의 법칙 (Hofstadter's Law)
“ 호프스태터의 법칙을 고려하더라도, 예상보다 항상 시간이 더 걸린다." - Douglas Hofstadter
호프스태터의 법칙은 특히 소프트웨어 개발에서 작업에 필요한 시간을 추정할 때 우리의 일관된 부정확성을 상기시켜줍니다.
이는 버퍼 시간을 두고, 기대치를 관리하는 것이 얼마나 중요한지를 강조합니다.
커니핸의 법칙 (Kernighan's Law)
“디버깅은 프로그램을 작성하는 것보다 두 배 더 어렵다. 따라서 코드를 작성할 때 가능한 한 똑똑하게 작성한다면, 그것을 디버그할 수는 없을 것이다. " - Brian Kernighan
지나치게 복잡한 코드를 작성하는 것은 시스템 유지보수에 위험이 될 수 있습니다. 코드가 지나치게 복잡하게 작성되면, 디버깅을 하기 위해 먼저 로직을 해독해야 하므로 문제가 더 어려워집니다.
코드를 단순하고 명확하게 작성하는 것이 중요하며, 이는 디버깅 및 장기적인 개선을 더 쉽게 만들어줍니다.
피터의 원리 (Peter Principle)
“계층 구조에서 사람은 ‘각자의 무능 수준’에 도달할 때까지 승진하는 경향이 있다. " - Laurence Peter
성공은 종종 대가를 수반합니다. 많은 경우, 개인은 자신의 성과를 기반으로 계속해서 더 높은 직책으로 승진하게 됩니다. 하지만 직책의 요구 사항이 개인의 능력을 초과하는 지점에 도달하기도 합니다.
소프트웨어 업계에서는 성공적인 개발자가 관리직으로 승진하는 과정에서 자주 볼 수 있습니다. 이는 종종 기술 전문성과 함께 리더십 및 소프트 스킬이 자연스럽게 성장할 것이라는 가정에 기반합니다. 그러나 뛰어난 개발자가 사람을 관리하거나 팀을 이끌거나 전략적 요구를 처리하는 데 똑같은 재능을 가질 것이라는 보장은 없으며, 이는 새로운 역할에서의 어려움으로 이어질 수 있습니다.
파레토의 원칙 (Pareto Principle)
“ 많은 결과 중 약 80%는 20%의 원인에서 비롯된다. " - Vilfredo Pareto
파레토 원칙은 널리 적용 가능하며, 그 핵심 통찰은 노력을 선택적으로 투입해야 한다는 것입니다.
즉, 대개 80%의 결과를 이끄는 20%의 주요 영역에 집중하는 것이, 노력을 지나치게 분산시키는 것보다 더 큰 성공을 가져옵니다. 이는 품질이 양보다 중요하다는 점과 진정한 결과물이 단순한 작업량보다 더 중요하다는 점을 강조합니다.
중요한 부분에 우선순위를 두는 것이 더욱 의미 있고 지속 가능한 결과를 얻는 데 도움이 됩니다.
번역: [https://ducktopia.tistory.com/139]
원문
다음 내용이 궁금하다면?
이미 회원이신가요?
2024년 11월 13일 오후 1:25