소프트웨어 개발에서 일상적인 작업의 양과 추정에 미치는 영향


11

소프트웨어 개발에있어 일상적인 작업의 양은 무시할 수 없을 정도로 상대적으로 적어야하며, 이는 소프트웨어 추정의 근본적인 문제라고 확신합니다.

이 결론에 도달하는 방법을 설명하고 논증에 심각한 결함이 있는지 알려주십시오.

  1. 높은 정확도로 추정 할 수있는 모든 것은 일상적인 작업이므로 이전에 수행 된 작업을 의미합니다. 연구와 창의력과 관련된 다른 모든 종류의 작업은 적어도 +/- 20 %의 정확도로 추정 할 수는 없습니다.

  2. 소프트웨어 개발은 ​​반복적 인 작업을 피하는 것입니다. 기본 원칙 중 하나는 DRY입니다 (반복하지 마십시오). 프로그래머가 스스로 반복적 인 일을 할 때마다이 반복을 피하는 추상화를 찾아야 할 때입니다. 이러한 추상화는 반복 된 코드를 함수로 추출하거나 루프에 넣는 것과 같은 간단한 작업 일 수 있습니다. 또한 도메인 별 언어를 만드는 것처럼 더 복잡 할 수도 있습니다. 어쨌든 그것들을 구현하려면 연구 (이전에 해본 적이 있습니까?) 또는 창의성이 필요합니다.

이 두 가지 점에서 위의 결론을 도출합니다.

실제로 나는이 관계가 다른 모든 토론, 블로그 게시물 또는 소프트웨어 추정에 관한 기사에서 언급되지 않은 이유에 대해 꽤 오랫동안 궁금해하고 있습니다. 너무 이론적입니까? 내 가정이 잘못 되었습니까? 아니면 너무 사소한 일입니까?하지만 왜 내가 아는 대부분의 개발자가 +/- 20 % 이상의 정확도로 견적을 수행 할 수 있다고 생각합니까?


7
커널과 같은 영역 외부의 모든 소프트웨어 개발 중 99 %가 수천 번 전에 수행되었습니다. 너무 많은 개발자들이 새로운 멋진 방식으로 모든 것을하고 싶고 같은 오래된 문제를 반복해서 재발 명하려고합니다.
Bent

@Bent : 소프트웨어 개발이 대부분 복사하여 붙여 넣기라는 말입니까? 많은 개발자가 그런 식으로 일하고 유지 관리가 불가능한 코드로 이어지는 경우가 많다는 것을 알고 있습니다. 그러나 그것은 다른 이야기입니다. 누군가가 그런 식으로 일한다고해도 그는 무엇을 복사하고 어디에서 복사해야하는지 알아 내야합니다. 이것은 또한 연구 작업으로 고려할 것입니다.
Frank Puffer

1
@ rwong : 물론 라이브러리를 사용하는 것이 좋습니다. 그러나 라이브러리에서 올바른 기능과 올바른 사용법을 찾는 것은 연구 작업 (lib가 complaex이고 / 또는 잘 모르는 경우)이거나 사소한 것입니다 (만약 당신이 그 기능을 알고 있다면). 당신이 '접착제 코드'라고 부르는 것은 종종 내 경험상 복잡합니다. 이를 구현하는 것이 일상적인 작업은 아닙니다.
Frank Puffer

1
@ JohnR.Strohm : 나는이 특정 책을 읽지 않았지만 COCOMO의 기본 사항에 익숙하지만 실제로는 사용하지 않았습니다. 또한 DeMarco가 쓴 두세 권의 다른 책을 읽었습니다. 내 질문과 관련된 특정 내용에 대한 힌트를 줄 수 있습니까?
Frank Puffer

2
소프트웨어 평가를 위해서는 Boehm의 "Software Engineering Economics"인 @FrankPuffer가 필요합니다. 데 마르코의 책은 그리 멀지 않습니다. SHORT의 대답은 다음과 같습니다. 소프트웨어가 전혀 평가하지 않기 위해 소프트웨어가해야 할 일에 익숙하다면 비교적 일상적인 것으로 간주 할 수 있습니다.
John R. Strohm

답변:


11

주어진 단일 프로젝트에서 이것은 사실 일 수 있습니다. 그러나 여러 회사에서 여러 회사에 대해 여러 개의 유사한 프로젝트를 수행하는 경우 약간의 차이만으로도 기본적으로 동일한 문제를 여러 번 '해결'할 수 있습니다.

예를 들어 데이터 액세스 계층을 여러 번 작성 했으므로 이제는 인기있는 ORM을 사용하는 대신 '긴 손'을 선호합니다. 타사 구성 요소의 새로운 문제를 찾아서 해결하는 것보다 알려진 솔루션으로 '일상적인 문제'를 처리하는 것이 더 빠르고 쉽습니다.

분명히 다른 사람의 시스템에서 알 수없는 단점을 추가하지 않고 반복 코드를 단순화하기 위해 자체 ORM을 작성할 수는 있지만이 코드는 당시 근무했던 회사에 속할 것이며 다른 개발자는 이처럼 기발한 것을 발견 할 것입니다 기타 타사 ORM.

마찬가지로 내 경험상 대부분의 프로그래밍은 비즈니스 프로세스의 자동화이며 각 비즈니스는 프로세스가 고유하다고 생각하기를 원하지만; 실제로는 그렇지 않습니다.

추정이 쉽다는 것은 말할 것도 없습니다! 더 쉽지만 요즘 추정 문제는 코딩 시간보다 요구 사항이 부적절하기 때문입니다.

요구 사항은 세 가지 범주로 분류되는 경향이 있습니다.

  1. 모호한 세부 사항은 개발자에게 남았습니다.

"웹 사이트를 만들어주세요. 멋지고 위젯을 판매해야합니다."

예상치 못한 어려운 문제가 발생했을 때 요구 사항을 기능적으로 동등한 것으로 변경하고 문제를 피할 수 있으므로 추정하기가 가장 쉬운 경향이 있습니다.

  1. 매우 구체적

"헤더 배경색을 # ff1100으로"

매우 빠르게 수행하고 다시 한 번 추정하기 쉽습니다. 그러나! 요구 사항은 변경 될 수밖에 없습니다. "음, 아니 다른 생각을 해보자"또는 "잠깐만! 나는 한 페이지에서만 의미했다!" "헤더 색상에 만족할 때까지의 시간"의 실시간 범위는 코딩 추정치와 관련이 없습니다.

  1. 모호한 세부 사항 가정

"페이스 북처럼 웹 사이트를 만들어 줘"

여기에 여러 가지 언급되지 않은 가정, "물론 다른 로고를 원할 것", "무한 스크롤이 있어야합니다", "10 억 사용자까지 확장 가능해야합니다!" 추정을 효과적으로 제어합니다. 개발자는 모든 것을 생각하고 예상을 "1 meeelion man hours"를 넘어서게하거나, 기본 기능 만 필요하다고 생각하고 가정하며 너무 낮은 추정치를 제공합니다. "오, 일주일에 두 번, ibook에 페이스 북을 넣고 싶다고 생각하십니까?"

경험이 있으면 코딩 속도는 매우 빠르지 만 설계 요구 사항은 (일반적으로) 하드 비트이며, 이는 비코 더로 점점 더 밀려납니다. 민첩한 방법론으로 개발자가 아닌 '비즈니스'로이 책임을 옮겨 코딩 속도를 높입니다.


부적절한 요구 사항에 대해 작성한 내용에 전적으로 동의하지만 다른 이야기입니다. 답의 첫 부분에서 당신은 종종 당신이하는 일의 많은 부분이 일상이되도록 잘 알려진 기술을 계속 사용한다고 말합니다. 추가 추상화없이 의도적으로 수행합니다. 이것은 아마도 사용중인 기술에 따라 2-5 년 정도 짧은 기간 동안 잘 작동합니다. 그러나 일부 경쟁 업체만큼 프로세스를 개선하지 않은 것을 알 수 있습니다. 또한 나중에 코드를 유지 관리 할 다른 개발자에게 문제가있을 수 있습니다.
Frank Puffer

분명히 타사 제품을 절대 사용하지 않는 것 같습니다. 요점은 도구 X로 이미 무언가를 수행하는 방법을 알고 있다면 추정이 쉽다는 것입니다.
Ewan

이 경우 추정뿐만 아니라 구현도 쉬워진다. 전체 프로젝트가 이와 같다면 운이 좋다. 그러나 내 경험상 이것은 작은 프로젝트에서만 발생합니다. 제가 10 일을 초과하는 대규모 프로젝트는 새로운 개념이나 기술이 필요했기 때문에 대부분의 작업을 일으켜 표준 작업에 대한 노력을 무시할 수있었습니다.
Frank Puffer

'최고의 프로그래머'화염 전쟁에 빠지지 마십시오. 모든 메신저 말은 덜 새로운 일보다 더 많은 일을 한 것입니다. 모든 프로젝트에서 대부분의 기능에 새로운 기술을 사용해야하는 경우 ... 이상하게 보입니다
Ewan

@Ewan "개념 또는 기술". 나에게 첫 번째는 비즈니스 규칙 및 / 또는 디자이너가 원하는 것과 관련이 있습니다. 새로운 기술에 관한 것이 아닙니다.
이즈 카타

6

왜 내가 아는 대부분의 개발자는 +/- 20 % 이상의 정확도로 추정을 수행 할 수 있다고 생각합니까?

실제 문제보다 문제에 대한 인내심을 추정하기 때문입니다.

튀는 공에 애니메이션을 적용하려면 하루, 일주일, 한 달 또는 1 년 동안 공을 보내면서도 튀는 공의 애니메이션을 볼 수 있습니다. 바라건대 내가 더 많은 시간을 할애하는 것이 좋을 것입니다. 그러나 어떤 시점에서 나는 말도 안됩니다.

볼 바운스를 만드는 데 얼마나 많은 노력을 기울이는가는 시간을 절약 할 수있는 기능입니다. 내 기술 수준이 잘리지 않으면 거기에 앉아있는 공이 생길 수 있습니다. 그러나 마감 시한이되었을 때 마감 시한이 미끄러지거나 화면에 공이 들어가야합니까? 폭포는 볼 바운스를 주장하고 일정이 미끄러졌다. 애자일은 공을 꺼내라고 말합니다. 적어도 우리는 사람들이 수신 거부에 대해 얼마나 신경을 쓰는지 알게 될 것입니다. 그래서 품질이 떨어졌습니다.

나는 공이 튀어 오를 수 있도록 노력하지만 마감일이 다가 오면 아무것도 아닌 것보다 정적 공을 만드는 것이 좋습니다. 따라서 대안에 대해 이야기하기 전에 문제에 대해 합당한 시간을 소비 한 것으로 보이는 시간을 기준으로 시간을 추정합니다. 때로는 공이 튀지 않을 수도 있습니다. 때로는 괜찮습니다. 한 달 동안 사라지는 것은 괜찮습니다.


좋은 지적입니다. 기본적으로 견적은 특정 기능이 고객 (또는 제품 소유자)에게 어떤 가치가 있는지에 근거해야한다는 것을 말합니다. 개인적으로 나는이 접근법을 좋아하지만 내 경험상 이것은 민첩한 환경에서도 소프트웨어 추정이 일반적으로 이해되는 방식이 아닙니다. 한 가지 단점은 기능의 고객 가치에 대한 정보가없는 경우가 많다는 것입니다. 또 다른 단점은 고객에게 기능을 직접 표시하지 않는 작업 패키지를 처리 ​​할 수 ​​없다는 것입니다.
Frank Puffer

@FrankPuffer 나는 민첩한 방법으로 이것을 명확히하지 못한다는 것에 동의하지 않습니다. 특히 SCRUM은 기능의 가치가 너무 높아질 때까지 개발자에게 평가하지 않아도됩니다. 즉, 실제로는 예정된 시간, 즉 시간 평가만으로 예정되어 있습니다. 애자일 방법은 특히이 방법에 적합합니다. 먼저 비즈니스 가치가 가장 높은 기능을 식별 한 다음 평가 한 후 실제로 수행하는 데 걸리는 시간을 확인하십시오. 오히려 헹굼 반복. 이 과정을 몇 번 반복하면 예상 소요 시간과 실제 개발 시간을 잘 알 수 있습니다.
RibaldEddie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.