소프트웨어 결함의 주요 원인은 무엇이며이를 최소화하는 방법은 무엇입니까?


14

결함 을 다음과 같이 정의 합니다.

"응용 프로그램 디자인 또는 코드 내에서 요구 사항에 따라 작동하지 못하게하는 것"

인적 요소, 테스트 부족, 프로토 타입 부족 및이를 완화 할 수있는 아이디어 등 결함의 원인에 대한 아이디어를 찾고 있습니다.


5
"요구 사항"을 "사용자 요구 사항"또는 "예상되는 행동"으로 대체 할 것입니다. 요구 사항조차도 틀릴 수 있기 때문입니다.
mouviciel

요구 사항이 잘못 되었습니까? (그리고 코드가 맞습니까?)

답변:


13

소프트웨어 결함의 주요 원인은 해석입니다.

기능에 대한 고객 해석은 설계자 해석과 다릅니다.

디자이너 해석은 프로그래머 해석과 다릅니다.

대부분의 방법론은이 효과에 대응하는 방법을 고안했습니다. 그러나 결국 우리는 오직 인간 일 뿐이며 완벽하지 않습니다. 게다가, 종종 시간 압력이 있고 대부분의 방법론 마술은 종종 압력을받는 동안 생략됩니다.

테스트는 문제를 조기에 감지 할 수 있습니다. 그러나 테스터조차도 인간이며 100 %를 테스트하는 것은 불가능합니다. 유니버스가 끝나기 전에 해제하려면


내가 그 멍청한 마음 읽기 모듈을 작동시킬 수 있다면, 모든 것이 잘 될 것입니다.
HLGEM

@Gamecat : 전 세계 사람들과 작업 할 때 더욱 악화됩니다. 언어 장벽이있을뿐만 아니라 (적어도 하나 이상의 참가자가 영어를 능숙하지 않은 경우도 있음) 문화적 차이도 있습니다.
Matthieu M.

2
"프로그래머의 해석이 컴파일러의 해석과 다르다"...;)
Alex Feinman

@ 알렉스 : 컴파일러가 내가 작성한 코드로 무엇을 할 것인지 알고 있습니다. 그 지식은 습득하기 쉽지 않았지만 나는 해냈습니다. 이제 컴파일러와 런타임 데이터와 달리 내가 작성하지 않은 코드를 해석했습니다.
David Thornley

@David, 컴파일러를 작성하고 유지 관리하지 않는 한 내부자가 수행하는 작업에 대한 지식은 실제로 진행중인 작업에 대한 추상화이며 실제 응용 프로그램에서 두뇌 공간을 사용할 수 있기 때문에 아마도 최선일 것입니다.
Alex Feinman

8

소프트웨어 결함의 주요 원인은 프로그래머라고 생각합니다.

말하는 아니 그냥 재미로,하지만 난 내 직업에서 관찰 한 가장 큰 문제 중 하나이기 때문에 빈약 한 요구 사항은 프로젝트의 주요 결함 및 유용성 문제를 일으키는 원인이되는 문제 영역의 이해 부족과 함께, 수집.

그 중 일부는 최종 사용자의 용어를 기꺼이 배우거나 이해하지 못해 오해의 원인이됩니다.

그 중 일부는 프로세스 초기에 기술에 대해 너무 일찍 이야기하여 자신이 무엇을 말하고 있는지 또는 왜 중요한지를 알지 못하는 사람들에게 제공됩니다.

가장 좋은 예는 질문 / 답변이 문자로 얼마나 오래 갈지 알아 내려고 노력하는 프로그래머 중 한 명을 들었을 때였습니다. 데이터베이스에서 사용할 크기 필드를 알아 내려고한다는 것을 알고 있었지만 이를 요청하는 부서는 왜 중요한지 또는 그 수를 세는 지에 대해 가장 안개가 끼지 않았습니다. 우리에게는 분명해 보이지만 그들에게는 실제 계시였습니다.


8

결함의 주요 원인은 나쁜 관리입니다 .)

진지하게, 좋은 상태에서 일하고, 과로하지 않고, 품질을 낮추고, 적절한 도구를 가지고, 조용한 작업 조건을 유지하는 개발자는 어려운 압력을받는 사람보다 버그가 적습니다.

또한 나쁜 개발자를 고용하는 경영진은 버그 수를 늘리는 데 도움이됩니다.

나쁜 관리 .

(면책 조항 : 개발자를 고용하고 관리해야합니다)


이것이 주요한 문제라고 생각하지 마십시오. 대부분의 개발자는 조용한 조건에서 작업합니다. AnonJr 및 Gamecat에 동의합니다. 문제 영역을 완전히 이해할 수 없으며 빠른 반복 및 테스트 만 도움이 될 수 있습니다.
radekg

1
대부분의 개발자는 조용한 환경에서 어떻게 작동합니까? 작년에 내가 방문한 12 개의 회사에서 아무도 조용하지 않았습니다.

좋은 관리는 당신을 데려 갈 수 있고, 나쁜 관리는 당신을 데려 갈 수 없습니다!
Chris

조용한 작업 환경에 대해 +1 내가 일한 모든 회사는 Dilbertesque 큐비클 농장으로 손톱을 자르고 음식을 먹으며 전화를받는 4 피트 거리의 사람들을 끊임없이들을 수 있습니다.
Bobby Tables

5

한 가지 주요 원인은 보이지 않지만 언급되지 않은 한 가지 원인은 의도하지 않은 다른 코드와의 결합입니다 . 보이지 않는 부작용이 있고, 추상화 계층을 돌파하며, 데이터에 대한 가정 (변수가 없거나, 상수가 아니며 사용자의 입력이 안전하지 않음)을 염려하지 않아도됩니다. 그 자체로 등등.

내가 공부 한 대부분의 개발 관행 N은 프로그램의 복잡성이 적어도 O(N^2)가능 하기 때문에 축소로 귀결된다 O(k^N). 정의 N는 독자에게는 연습으로 남겨 두지 만 여기서 순환 복잡성 같은 것을 생각하고 있습니다. 논리와 데이터를 캡슐화하면 문제를 구획화하여 N을 줄이는 효과가 있습니다.




4

커뮤니케이션 격차. 요구 사항 수집 일정대로. 디자인 문서에서. 기능 사양에서. 코드에서 (프로그래머가 원하는 것과 컴파일러에게 말하는 것 사이의 간격).

사회적 예절. 무능한 사람을 부르는 것은 사회적으로 용납 할 수 없습니다.


3

완전히 이해하지 않고 사물에 빠지다. 기능 요구 사항 또는 기술 아키텍처를 완전히 이해하지 않고 코드 작성을 시작합니다.

프로그래밍은 거의 자동으로 이루어져야하며, 자명하고 이미 마음에 이미 작성된 프로그램을 작성하면됩니다. 실제로 코드에서 수행해야 할 작업을 정확하게 처리하기 위해 코드에 많은 결함이 있음을 알았습니다. 나는 여러 번 유죄를 선고 받았다.


새 직장에 4 개월간, 나는 여전히 "완전히 이해"하는 데있어 작은 비율에 불과합니다. 나는 서두르지 않을 것이다. 당신이 말하는 것은 사실입니다. 그래도 비생산적이기 때문에 짜증이납니다.
DarenW

내가 작업하는 시스템 (2 백만 라인 시스템)을 최고 속도로 올리려면 1 년 또는 2 년이 걸렸습니다. 그럼에도 불구하고 내가 알지 못하는 큰 부분이 있습니다.
Joeri Sebrechts


2

일정 압력 은 확실히 강력한 소스입니다.

돌진 개발자는 시간을내어 요구 사항을 완전히 지정하거나 요구 사항의 의도를 완전히 이해하거나 대안을 완전히 조사하여 최상의 솔루션을 찾거나 변경 사항의 모든 주요 사례와 상호 작용을 완전히 생각하거나 전체 테스트 사례를 개발하거나 모든 단위 테스트를 완전히 수행하거나 전체 통합 테스트를 수행하거나 플랫폼 종속성을 완전히 고려하거나 설치 프로그램을 완전히 테스트하거나 다음 개발자가 이해할 수 있도록 수행 한 작업을 완전히 문서화 ....


2

언급해야 할 또 다른 사항은 외부인 테스트가 없다는 것입니다. 개발자는 테스트를 작성하고 실행할 때 실제 요구 사항이 아닌 해석 만 테스트합니다. 개발자가 작성한 단위 테스트는 일부 버그를 포착하는 데 유용하지만 대부분의 버그는 이러한 테스트를 통과했지만 사용자가 원하거나 필요로하는 것은 아닙니다. 개발자가 아닌 다른 사람에 의해 테스트되지 않은 소프트웨어는 테스트되지 않습니다 (그리고 개발자의 테스트를 실행한다는 의미는 아닙니다).


2

소프트웨어 엔지니어링은 본질적으로 복잡하기 때문입니다. 에세이 "No Silver Bullet"은 이에 대해 논의합니다.

아이러니하게도, 여기에 나오는 다른 많은 답변들은 그 에세이의 언어로 "사고 적으로 복잡한"주제에 대해 다루지 만, 실제로 소프트웨어 개발자들이하는 대부분의 작업은 "본질적으로 복잡하다". 소프트웨어는 어렵고, 소프트웨어에는 버그가있을 것이며, 우리의 임무는 소프트웨어를 다루는 것입니다.


1

상태 머신의 네트워크로서 소프트웨어를 이해하지 못하고, 동작의 기본 원리 (상태, 결정 및 전환) 및 상태 머신의 상호 작용.


1

모든 오류를보고하는 코드와 자동으로 실패하는 코드 작성


1

"일어날 수 없다"거나 일어날 가능성이없는 것들을 확인하지 못하는 것은 큰 일입니다. 때로는 완벽한 것이 선의 적입니다. 잘 고려 된 예외 계층 구조의 가치가 없다면, 빠르고 더러운 처리는 항상 아무것도 아닌 것보다 낫습니다. 나는 거대하다릴리스 빌드에서 성능에 거의 영향을 미치지 않는 단식, 단언, 단언 등의 팬. 모든 입력 데이터를 제어하는 ​​빠르고 더러운 일회성 스크립트에서도 일반적으로 assert와 동일하지만 항상 유지되는 함수를 사용하여 일부 빠른 / 더러운 오류 처리를 수행합니다. 내 경험에 따르면, 발생하지 않을 수 있거나 발생할 수 없다고 생각되면 사용자 친화적 인 오류 메시지로 정상적으로 실패 할 필요는 없지만 최소한 다음과 같은 오류 메시지로 빠르게 실패해야합니다. 프로그래머에게 무엇이 잘못되었는지에 대한 힌트를 제공합니다.

편집 : 관련된 유용한 전술 중 하나는 assert를 주요 디버깅 도구로 사용 하고 디버깅 세션이 끝난 후에도 그대로 두는 것입니다 . 그 시점부터 코드베이스에는 관련 버그가 다시 발생하기가 매우 어려워지는 내장 검사 기능이 내장되어 있습니다. 이것은 단위 테스트하기 어려운 코드에 특히 유용합니다.


1

소프트웨어 결함의 주요 원인은 코드 작성입니다.

적은 코드를 작성하면 버그가 줄어 듭니다 ;-)


0

한 수준에서 관리. 그러나 그것은 단지 PHB가 아닙니다. 코드 자체의 관리입니다. 이는 회사 관리의 반영 일 수도 있고 아닐 수도 있습니다.

전체 "라이프 사이클"의 참가자는 품질에 완전히 투자하고 죽지 않는 제품을 만들어야합니다 . 적절한 추상화 안정성을 고려할 때 소프트웨어 자체는 절대로 깨지지 않을 것 입니다. 소프트웨어 생성자가 완벽한 작동에 관심이 있는지 여부는 문제 일뿐입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.