제로 버그 프로그래머가되는 방법? [닫은]


168

상사는 항상 좋은 프로그래머가 자신이 변경하는 코드가 신뢰할 수 있고 정확하며 철저하게 자체 검증되도록 할 수 있어야한다고 말했습니다. 모든 결과를 완전히 이해하고 변경으로 인한 영향을 이해해야합니다. 나는 이런 종류의 프로그래머가 되려고 최선을 다했지만 (다시 반복해서 테스트하면서) 버그는 여전히 존재한다.

제로 버그 프로그래머가되고 코드의 모든 문자가 어떤 영향을 미치고 영향을 받는지 어떻게 알 수 있습니까?


실제로 나를 제외하고 처음으로 완벽한 코드를 만드는 사람은 없습니다. 그러나 오직 나만이 있습니다. ― Tech Talk : Linus Torvalds, git, Google, 2007 년 8 월 15 일 izquotes.com/quote/273558
JensG


0- 버그 프로그래밍과 같은 것은 없습니다. 수학자 Godel을 읽고 그 이유를 이해하십시오.
Michael Martinez

답변:


365

전혀 코딩하지 마십시오.

이것이 제로 버그 프로그래머가 될 수있는 유일한 방법입니다.

프로그래머가 인간이기 때문에 버그는 피할 수 없습니다. 우리가 할 수있는 모든 것은 버그를 방지하기 위해 최선을 다하고, 버그가 발생할 때 신속하게 대응하고, 실수로부터 배우고, 최신 정보를 유지하는 것입니다.


73
+1 후속 조치 : 또는 비 코딩 (상아탑) 건축가가되어 많은 돈을받을 수 있습니다! 그게 최고입니다.
Martin Wickman

26
실수는 인간의 버그를 신성하게 수정하는 것입니다.
Ward Muylaert

11
나는 버그 수가 적기 때문에 상사가 선호하는 동료를 가졌습니다. 그녀는 어떻게 했습니까? 간단하게 그녀는 다른 사람에게 원하지 않는 버그를 할당했으며 항상 가장 쉽고 작은 기능을 사용했습니다.
toby

46
누가 먼저 말했는지는 모르겠지만 "디버깅이 버그를 제거하는 프로세스라면 프로그래밍은 버그를 처리하는 프로세스 여야합니다."
브루스 Alderman

8
더 나은 방법 : 보스가되어 어떤 일에도 책임을 져야 할 필요없이 사람들이 비참하게 느끼도록하십시오.
biziclop

124

사소한 프로그램에는 버그가 없습니다.

매우 가까워 질 수 있지만 생산성이 떨어집니다. 위험성이 높은 특정 소프트웨어에만 가치가 있습니다. 우주 왕복선 소프트웨어는 내 마음에 온다. 그러나 그들의 생산성은 하루에 몇 줄 정도입니다. 네 상사가 그걸 원한 것 같아

이 소프트웨어는 버그가 없습니다. 인간이 성취 한 것만 큼 완벽합니다. 다음 통계를 고려하십시오. 프로그램의 마지막 3 개 버전 (각 420,000 줄 길이)에는 각각 하나의 오류 만있었습니다. 이 소프트웨어의 최신 11 개 버전에는 총 17 개의 오류가있었습니다.

소프트웨어의 업그레이드를 통해 셔틀이 글로벌 포지셔닝 위성 (Global Positioning Satellites), 프로그램의 1.5 % 또는 6,366 줄의 코드로 변경 될 수 있습니다. 한 번의 변경에 대한 사양은 전화 번호부보다 두꺼운 2,500 페이지를 실행합니다. 현재 프로그램의 스펙은 30 개의 볼륨을 채우고 40,000 페이지를 실행합니다.


3
불가능하지 않다. 그러나 매우 가능성이 낮습니다.
Billy ONeal

36
FB에 버그가 없다고 생각하는 이유는 무엇입니까? Facebook의 보안 및 개인 정보 모델은 큰 버그입니다. 예를 들어, 페이스 북 보스 페이스 북 계정은 지난주 보안 취약점으로 인해 해킹당했습니다.
Stephen C

6
@Elaine Facebook의 철학은 "빠르고 끊어짐"( geek.com/articles/news/… )이며 수많은 실행 버그 ( facebook.com/board.php?uid=74769995908 )가 있습니다. 내 자신으로. 트위터는 자주 다르며 ( engineering.twitter.com/2010/02/anatomy-of-whale.html ) "follow bug"( status.twitter.com/post/587210796/… ).
예브게니 Brikman

9
움직이는 골대를 잊지 마십시오. PerfectProgram 1.0의 기능은 2.0의 버그 일 수 있습니다
Carlos

4
@CodesInChaos : 이론에 따르면 행동을 증명할 수없는 프로그램 이 있다고합니다 . 모든 프로그램 의 행동을 증명하는 것이 불가능하다고 말하지는 않습니다 . 나는 일반적인 프로그램의 대부분이 입증 가능한 유형이라고 생각할 것이다. "중지 문제로 인해 코드가 버그가없는 것은 불가능하다"고 주장하는 것은 이론의 잘못된 적용이다.
endolith

98

"Zero-bug programmer"는 조용한 가수와 같은 옥시 모론이지만 지난 60여 년 동안 프로그래밍을 통해 약간의 지혜가 만들어져 다음과 같은 더 나은 프로그래머가 될 것입니다.

  • 겸손하라-당신은 실수를 저지르고있다. 자꾸.
  • 두개골의 제한된 크기를 완전히 인식하십시오. 완전한 겸손으로 과제에 접근하고 재앙과 같은 영리한 속임수를 피하십시오. [에드거 디크 크라]
  • 조합 폭발과 싸우다
  • 변경 가능한 상태 (가능한 경우)를 제거하십시오. 예, 기능 프로그래밍을 배우십시오.
  • 가능한 코드 경로 수 감소
  • 입력 및 출력 공간 (함수)의 크기 (크기)를 이해하고 100 % 테스트 범위에 더 가까워 지도록 크기를 줄이십시오.
  • 항상 코드가 작동하지 않는다고 가정하십시오. 그렇지 않으면 증명하십시오!

2
내 코드가 작동하고 있음을 증명하게되어 기쁩니다 ...하지만 테스트는 그렇지 않다는 것을 증명할 수 있습니다. 공식적인 증거를 말하거나 디버깅 작업을 계획하고 있습니까?
Matthieu M.

이 글에서 가장 유용한 답입니다. @Matthieu : 가능한 모든 2 바이트 조합에 대해 함수가 올바른 결과 (예 : 최대)를 반환한다는 것을 증명할 수 있습니다. 이는 다시 바이트입니다. 그러한 함수를 두 개 이상 가질 수 있으며 이제는이를 묶을 수 있으며 그러한 함수의 가능한 많은 조합을 얻을 수 있습니다.이 함수는 다시 바이트 만 생성합니다. 잘못된 것을 증명할 수 있다는 생각은 잘못되었습니다. 인기가 있지만 잘못되었습니다.
사용자가 알 수 없음

@Matthieu M .: 테스트 결과 상황이 예상대로 작동하고 있음이 입증되었습니다. 모든 항목이 예상대로 작동하고 있음을 증명할 수 있으면 예상치 못한 입력 동작을 처리하고 있음을 증명할 수 있습니다. 일단 그 행동이 무엇인지 그리고 무엇을해야하는지에 대해 정한 후에는 새로운 테스트를 작성하십시오. 이제 예상되는 동작의 일부입니다.
deworde

1
@deworde : 틈새 상황과는 별도로 테스트 아이디어를 이해하지만 가능한 실제 조합 수가 너무 많기 때문에 실제 작업의 대부분을 철저하게 테스트 할 수 없었습니다. 타이밍 문제). 따라서, 틈새 상황과는 별도로 테스트는 지금까지만 진행됩니다 (적어도 명목상의 사례가 통과
Matthieu M.

"전염병과 같은 영리한 속임수를 피하십시오"-이것만으로도 좋은 대답이 될 것입니다. 그대로-훌륭합니다.
BЈовић

25

TDD

TDD의 요점은 해당 코드 행을 요구하는 테스트가없는 경우 단일 코드 행을 작성하지 않는다는 것입니다. 그리고 그것을 극단적으로 받아들이려면 항상 수락 테스트를 작성하여 새로운 기능을 개발하기 시작합니다. 여기 오이 스타일 테스트 작성 이 이상적 이라는 것을 알았습니다 .

TDD 방식은 두 가지 이상의 이점을 제공합니다.

  • 모든 코드는 특정 기능을 해결하기 위해 작성되므로 불필요한 초과 생산이 없습니다.
  • 기존 코드 줄을 변경할 때마다 기능을 중단하면 알림이 표시됩니다

그것은 불가능할 것이므로 제로 버그를 증명하지는 않습니다 (이미 수많은 답변에 의해 지적되었습니다). 그러나 TDD를 배우고 능숙 해지면 (예, 연습이 필요한 기술이기도합니다) 철저한 테스트를 거쳐 내 코드에 대한 확신이 훨씬 큽니다. 더 중요한 것은 기능을 깨는 것에 대한 걱정없이 완전히 이해하지 못하는 기존 코드를 변경할 수 있다는 것입니다.

그러나 TDD는 당신을 완전히 도와주지 않습니다. 시스템 아키텍처와 해당 아키텍처의 함정을 완전히 이해하지 못하면 버그가없는 코드를 작성할 수 없습니다. 예를 들어 여러 요청을 동시에 처리하는 웹 응용 프로그램을 작성하는 경우 여러 요청간에 변경 가능한 데이터를 공유 할 수 없다는 것을 알아야합니다 (성능을 향상시키기 위해 변경 가능한 데이터를 캐시하기 위해 초보자 트랩에 빠지지 마십시오).

TDD에 능숙한 개발 팀은 결함이 가장 적은 코드를 제공한다고 생각합니다.


19

문제는 버그가 인식 하지 못하는 것입니다 . 응용 프로그램이 실행될 모든 환경뿐만 아니라 프로그래밍 언어 / 컴파일러에 대한 백과 사전 지식이 없다면 100 % 버그가없는 코드를 생성 할 수는 없습니다.

많은 테스트를 통해 버그 수를 줄일 수 있지만 결국에는 설명되지 않은 프린지 사례가있을 수 있습니다. Joel Spolsky는 특히 버그 수정 에 관한 훌륭한 기사를 썼습니다 .


1
+1. 꼬인 자매의 말에 따르면, 당신이 모르는 것이 당신을 해칠 수 있습니다 / 당신이 볼 수없는 것은 비명을 지 릅니다.
엔지니어

17

예, 코드에 버그가있는 것은 불가능하지만 버그가 적은 것은 아닙니다. "멍청한 데, 항상 버그가있을 것"이라는 태도는 코드의 버그 수를 줄이는 것을 피하기위한 경찰 일뿐입니다. 완벽한 사람은 없지만 더 나은 사람이되기 위해 노력해야합니다. 본인의 개선 노력에서 다음 사항이 도움이되었다는 것을 알게되었습니다.

  • 쉽지 않습니다. 밤새 개선되지 않습니다. 낙심하지 말고 포기하지 마십시오.
  • 적게 쓰고 더 똑똑하게 쓰십시오. 적은 코드가 일반적으로 더 나은 코드입니다. 미리 계획하고 멋진 디자인 패턴을 만들려고하는 것은 당연하지만 장기적으로 필요한 것을 작성하면 시간을 절약하고 버그를 예방할 수 있습니다.
  • 복잡성은 적입니다. 모호한 복잡한 혼란이라면 계산에 포함되지 않습니다. 코드 골프는 재미 있지만 이해하기는 어렵고 디버그는 더 나쁩니다. 복잡한 코드를 작성할 때마다 다양한 문제에 직면하게됩니다. 일을 간단하고 짧게 유지하십시오.
  • 복잡성은 주관적입니다. 한 번 복잡한 코드는 더 나은 프로그래머가되면 간단 해집니다.
  • 경험이 중요합니다. 더 나은 프로그래머가되는 두 가지 방법 중 하나는 연습하는 것입니다. 실습은 쉽게 작성하는 방법을 알고있는 프로그램을 작성하는 것이 아니라 조금 아프고 생각하게하는 프로그램을 작성하는 것입니다.
  • 더 나아질 수있는 다른 방법은 읽는 것입니다. 프로그래밍에는 배우기 어려운 많은 주제가 있지만 프로그래밍만으로는 결코 배울 수 없으므로 공부해야합니다. 어려운 내용을 읽어야합니다. 보안 및 동시성 같은 것은 불가능합니다. 재난을 정리하여 배우고 싶지 않다면 코드를 작성하는 것만으로 올바르게 배울 수는 없습니다. 내가 믿지 않는다면 gawker와 같은 서사시 보안 문제 사이트를 살펴보십시오. 그들이 시간을내어 보안을 올바르게하는 방법을 배우고 제대로 작동하는 것을 만들지 않았다면 결코 그런 일이 일어나지 않았을 것입니다.
  • 블로그를 읽으십시오. 프로그래밍에 대해보고 생각할 수있는 새롭고 흥미로운 방법을 제공하는 흥미로운 블로그가 많이 있습니다.
  • 더티 디테일을 배우십시오. 언어 및 응용 프로그램의 일부가 모호하게 작동하는 방식에 대한 사소한 세부 사항이 매우 중요합니다. 복잡한 코드 작성을 피하는 데 도움이되는 비밀을 유지하거나 피해야 할 버그가있는 부분 일 수 있습니다.
  • 사용자의 생각을 알아보십시오. 때로는 사용자가 미쳤고 이해하지 못하고 예측할 수없는 방식으로 앱과 함께 작동합니다. 그들이 시도 할 수있는 낯선 것들을 알고 앱이이를 처리 할 수 ​​있도록하기 위해 머리에 들어가야합니다.

8

개인적으로 나는 버그가없는 프로그래밍을 위해 노력하는 것이 시간과 돈 모두에서 더 비싸다고 생각합니다. 제로 버그 또는 거의 제로 버그에 도달하려면 개발자가 철저히 테스트해야합니다. 이는 패치 검토를 위해 코드를 제출하기 전에 모든 것을 회귀 테스트한다는 의미입니다. 이 모델은 비용 효과적이라는 사실을 깨닫지 못했습니다. 개발자가 부지런한 테스트를 수행하고 심층 테스트를 QA 팀에 맡기는 것이 좋습니다. 이유는 다음과 같습니다.

  • 개발자는 테스트에 어려움을 겪습니다. 사실이고 당신은 그것을 알고 있습니다. (저는 개발자입니다!) 우수한 품질 보증팀은 항상 개발자가 절대 생각하지 않는 최첨단 사례를 찾습니다.
  • 개발자는 코딩에 능숙합니다. 그들이 자신이 무엇을 능가하는지 (그리고 보통 어쨌든 자신이 선호하는 것으로) 돌아 오게하십시오.
  • QA 팀은 한 번에 여러 개발자 작업과 관련된 버그를 찾을 수 있습니다.

코드를 작성할 때 버그가 기록 될 수 있습니다. 그렇기 때문에 QA 프로세스를 수행해야하며 모두 개발자의 일부입니다. 물론 이것이 마지막 세미콜론을 작성하자마자 무언가를 제출한다는 의미는 아닙니다. 여전히 업무의 질을 보장해야하지만 과용 할 수는 있습니다 .

동료 검토 및 / 또는 테스트없이 항상 처음으로 작업을 완료하는 직업은 몇 명입니까?


8

제로 버그? Lisp가 필요한 것처럼 들립니다 (회의 론적 경로를 따르고 뮤직 비디오를 피하십시오).

주류 코딩 환경 (Java, C #, PHP 등)에서 버그없는 코드를 달성하는 것은 매우 어렵습니다. 나는 짧은 제어 반복에서 잘 테스트되고 피어 리뷰 된 코드만드는 데 중점을 둘 것 입니다.

코드를 최대한 간단하게 유지하면 버그를 피하는 데 도움이됩니다.

엄격한 컴파일러 경고와 함께 코드 분석 도구 (예 : FindBugs , PMD 등)를 사용하고 있는지 확인하십시오 . 코드와 관련된 모든 종류의 문제가 표시됩니다. 그들이 말하는 내용을 기록하고 버그의 본질을 이해하려고 노력한 다음 프로그래밍 관용구를 변경하여 해당 버그를 다시 도입하는 방식으로 코딩하는 것이 부 자연스럽게 느껴지도록 조치를 취하십시오.


3
때때로 버그는 그곳에 사는 숨겨진 괴물과 같습니다. 반복적으로 테스트하고 자체 코드를 검토하는 동안 숨겨져 있습니다. 그러나 일단 피어 리뷰를 수행하면 괴물이 믿을 수 없을 정도로 눈에 띄고 갑자기 나에게 튀어 나왔습니다. 정말 이상합니다. 인간의 '눈'과 '두뇌'에만 의존하면 버그없는 라인을 만질 수없는 것 같습니다. 모든 경우에 단위 테스트를 수행 할 수있는 것은 아닙니다. 코드 분석 도구? 신나게 들리지만, 나는 그것을 사용한 적이 없으며, 그 분야에 대한 연구를 할 것입니다.
Elaine

Ada가 필요하다고 말하지만 Lisp가 더 재미 있습니다. ;-)
Orbling

1
@Elaine 내가 일하는 곳은 Java 환경이며 코드가 Findbugs 및 PMD를 통과 한 경우에만 팀과 공유 할 수 있습니다. 새로운 팀원은 거부, 분노, 협상, 우울증 및 수용의 5 단계를 거칩니다. 이후 그들은 결코 뒤돌아 보지 않습니다.
Gary Rowe

@Gary Rowe, 나는 그 반응을 이해합니다. lol, 나는 QA 부서가있는 회사에 있었으며 직원들은 매주 그 주에 생산 된 모든 코드를 검사하여 모든 코드 줄이 '규칙을 준수하는지 확인합니다. '(Findbugs / PMD와 같은 도구를 사용했는지 여부는 알 수 없습니다.)하지만 현재 단계와 약간 비슷합니다.
Elaine

1
@ 게리 : 나로부터 논쟁은 없지만, 내가 일한 여러 곳에서 스타일 위반을 버그로 간주합니다. 그리고 "모든 클래스는 패키지 및 클래스 이름을 포함하는 정적 필드 CLS_PKG 및 CLS_NAME을 선언해야합니다"와 같은 스타일 규칙을 갖는 경향이있었습니다. 나는 일반적으로 코딩 표준을 지원하지만, 그런 식으로 나눌 때는 그렇지 않습니다!
TMN

8

"모든 코드를 작성하지 마십시오." 답이 완전히 빠졌습니다. 또한, 당신의 상사는 분명히 바보가 아닌 것 같습니다!

코드가 무엇인지 모르는 프로그래머를 얼마나 자주 본지 기억이 나지 않습니다. 그들의 유일한 개발 철학은 시행 착오 인 것처럼 보였다 (그리고 종종 복사 / 붙여 넣기 / 수정). 시행 착오는 일부 문제를 해결하는 올바른 방법이지만 종종 문제 영역을 분석 한 다음 사용하는 도구에 대한 이해와 약간의 훈련과 부지런함을 바탕으로 매우 구체적인 솔루션을 적용 할 수 있습니다. 처음으로 배포하기 전에 문제뿐만 아니라 대부분의 코너 (잠재적 버그)도 해결했습니다. 코드에 버그가 없음을 보장 할 수 있습니까? 당연히 아니지. 그러나 발생하거나 읽은 모든 버그와 함께 다음에 무언가를 쓰거나 변경할 때 생각하고 싶은 것에 버그를 추가 할 수 있습니다. 이렇게하면 결과적으로 버그가 거의없는 코드를 작성하는 방법에 대한 많은 경험을 얻게됩니다. -여행에 도움을 줄 수있는 더 나은 프로그래머가되는 방법에 대한 많은 자료가 있습니다 ...

개인적으로 모든 줄을 설명 할 수없는 코드는 절대 커밋하지 않습니다. 모든 줄에는 이유가 있으므로 제거해야합니다. 물론 때로는 호출하는 메서드의 내부 작업을 가정 할 수도 있습니다. 그렇지 않으면 전체 프레임 워크의 내부 논리를 알아야합니다.

상사는 기존 시스템에서 작성한 코드의 결과와 영향을 이해해야한다고 말할 권리가 있습니다. 버그가 발생합니까? 물론입니다. 그러나 이러한 버그는 작업중인 시스템 / 도구에 대한 불완전한 이해로 인해 발생하며 모든 버그 수정시 적용 범위가 넓습니다.


"만약 당신이 만나거나 읽을 때마다 다음에 무언가를 쓰거나 바꿀 때 생각하고 싶은 것에 버그를 추가 할 수 있습니다." 그 목적으로 만 보거나 코딩 한 버그와 관련된 Google 문서를 만들었습니다.
Ben

7

다른 의견들이 이미 올바르게 지적했듯이 버그가없는 사소한 소프트웨어는 없습니다.

소프트웨어를 항상 테스트하려는 경우 해당 테스트는 버그가없는 것이 아니라는 사실 만 증명할 수 있습니다.

작업 영역에 따라 소프트웨어의 공식 검증을 시도 할 수 있습니다. 공식적인 방법을 사용하면 소프트웨어가 사양을 정확히 충족시킬 수 있습니다.

물론 소프트웨어가 원하는 것을 정확하게 수행한다는 의미는 아닙니다. 완전한 사양 작성은 거의 모든 경우에 가능하지 않습니다. 기본적으로 오류가 발생할 수있는 위치를 구현에서 사양으로 이동합니다.

따라서 "버그"의 정의에 따라 공식 검증을 시도하거나 소프트웨어에서 가능한 많은 버그를 찾을 수 있습니다.


6

"Hello World!"보다 더 복잡한 것을 쓰지 마십시오. 또는 모든 사람이 사용하지 말라고하면

버그가없는 코드의 예로는 상사에게 문의하십시오.


5

나는 다른 것에 동의합니다. 문제에 접근하는 방법은 다음과 같습니다.

  • 테스터를 구하십시오. 이유는 Joel 테스트를 참조하십시오.
  • 라이브러리를 광범위하게 사용하십시오. 아마도 더 잘 디버깅되었을 것입니다. 저는 Perl의 CPAN 팬입니다.

1
… 그러나 라이브러리를 사용하는 경우 해당 버그로 인해 사용자가 아래로 끌 수 없는지 확인하십시오 (예 : 소스를 가져 와서 감사하거나 필요한 경우 직접 버그를 수정할 수 있음).
millenomi

5

당신은 제로 버그 프로그래머가되기 위해 노력할 수 있습니다. 코드를 작성할 때마다 제로 버그 프로그래머가 되려고 노력합니다. 그러나 나는하지 않습니다

  • 여러 테스트 기술을 사용합니다 (ATDD 이외)
  • 소프트웨어에 대한 공식적인 검증
  • 별도의 품질 관리팀이 있습니다
  • 코드베이스에 대한 각 변경 사항에 대한 철저한 분석
  • 더 안전하고주의를 기울이는 언어를 사용하십시오

필자가 작성하는 소프트웨어에 비용이 많이 들기 때문에 이러한 작업을 수행하지 않습니다. 내가 이런 일을했다면 아마도 제로 버그를 향해 나아갈 것이지만 사업 상 이해가되지는 않을 것입니다.

인프라의 상당 부분이 사용하는 내부 도구를 만듭니다. 테스트 및 코딩에 대한 나의 표준은 높습니다. 그러나 균형이 있습니다. 나는 사람들이 그런 종류의 시간을 한 작품에 넣을 수 없기 때문에 제로 버그를 기대하지 않습니다. X-Ray 기계, 제트 엔진 등을 제어하기 위해 소프트웨어를 제작하는 경우 상황이 다를 수 있습니다. 소프트웨어가 고장 나더라도 생명이 유지되지 않으므로 해당 수준의 보증에 관여하지 않습니다.

보증 수준을 소프트웨어의 의도 된 사용과 일치시킵니다. NASA 셔틀이 사용할 코드를 작성하는 경우 제로 버그 허용 오차가 적당 할 수 있습니다. 추가로 매우 비싼 관행을 추가하면됩니다.


4

"제로 버그"프로그래머가되기위한 첫 번째 단계는 버그에 대한 태도를 바꾸는 것입니다. "일어났다", "QA 및 테스터 향상"또는 "개발자들이 테스트에 어려움을 겪는다"고 말하는 대신 다음과 같이 말합니다.

벌레는 용납 할 수 없으며, 제 힘을 다해 제거하기 위해 모든 것을 다하겠습니다.

이것이 당신의 태도가되면 버그는 빨리 떨어집니다. 버그를 제거 할 수있는 방법을 찾기 위해 테스트 중심 개발을 경험하게됩니다. 더 나은 기술에 대한 무료 조언을 제공하는 많은 책, 블로그 게시물 및 사람들을 찾을 수 있습니다. 연습 을 통해 기술을 향상시키는 것이 중요하다는 것을 알게 될 것입니다 (카타 코딩 또는 집에서 새로운 일 시도). 집에서 공예 작업을 시작하기 때문에 직장에서 더 나은 성과를 내기 시작 합니다. 그리고 좋은 소프트웨어를 작성 하는 것이 가능 해지면 공예에 대한 열정이 커지기를 바랍니다.


2

어떤 의미에서는 상사가 옳습니다. 제로 버그에 접근하는 소프트웨어를 작성할 수 있습니다.

그러나 문제는 (거의) 제로 버그 프로그램을 작성 하는 비용엄청나게 높다는 것 입니다. 다음과 같은 작업을 수행해야합니다.

  • 요구 사항의 공식 사양을 사용하십시오. Z 또는 VDM 또는 기타 수학적으로 소리 표기법을 사용하는 경우와 같이 형식적입니다.

  • 정리 증명 기술을 사용하여 프로그램이 사양을 구현하고 있음을 공식적으로 증명하십시오.

  • 광범위한 단위, 회귀 및 시스템 테스트 스위트 및 하네스를 작성하여 모든 방법으로 버그를 테스트하십시오. (그리고 이것 자체로는 충분하지 않습니다.)

  • 많은 사람들은 (공식 및 비공식) 요구 사항, 소프트웨어 (및 증명)를 검토합니다. 테스트 및 배포.

당신의 상사가이 모든 것을 지불 할 준비가되어 있거나, 모든 일을하는 데 걸리는 시간을 참을 가능성은 거의 없습니다.


1

"제로 버그"상태에 도달했습니다. 사용자에게 문서화되지 않은 기능이거나 새로운 기능을 요구하므로 개선 된 기능이라고 말합니다. 이들 중 어느 것도 받아 들여지지 않는다면 나는 그들 자신의 요구 사항을 이해하지 못했다고 말합니다. 따라서 버그가 없습니다. 프로그래머는 완벽합니다.


1

버그 프리 프로그램을 만드는 단계는 다음과 같습니다.

  1. 기능에 대한 명확한 사양이 없으면 코딩을 시작하지 마십시오.
  2. 테스트 또는 테스트에 의존하지 않는 경우 소프트웨어의 결함을 발견하지 마십시오.
  3. 테스트, 검토 및 생산 중에 발견 된 결함에서 모든 피드백을 결함을 처음 삽입 한 프로세스 및 개발자에게 적용하십시오. 결함이 발견되는 즉시 모든 결함있는 구성 요소를 완전히 폐기하십시오. 체크리스트를 업데이트하고 개발자가 다시 실수하지 않도록 재교육하십시오.

테스트는 버그가 있음을 증명할 수 있지만 일반적으로 그렇지 않다는 것은 쓸모가 없습니다. 피드백과 관련하여-동전을 만드는 동전 만드는 기계가 있고 평균 10 초마다 동전에 결함이 있습니다. 그 동전을 가져 와서 평평하게하고 기계에 다시 삽입하십시오. 재활용 블랭크로 만든 동전은 좋지는 않지만 수용 가능할 것입니다. 100 년대마다 동전을 2 번씩 다시 찍어야합니다. 기계를 고치는 것이 더 쉬울까요?

불행히도 사람들은 기계가 아닙니다. 결함이없는 좋은 프로그래머를 만들려면 모든 결함에 대해 훈련하고 반복하는 데 많은 시간을 투자해야합니다. 개발자는 실제로 배우고 적용하기 어려운 공식 검증 방법에 대한 교육을 받아야합니다. 소프트웨어 개발의 경제학도 이에 반대하고 있습니다. 다른 고용주에게 뛰어 넘기 위해 결함을 줄일 수있는 프로그래머 교육에 2 년을 투자 하시겠습니까? 완벽한 코인을 만드는 기계를 구입하거나 10 개의 코드 원숭이를 더 고용하여 동일한 비용으로 많은 테스트를 만들 수 있습니다. 이 철저한 프로세스를 "기계", 자산으로 인식 할 수 있습니다. 우수한 개발자에 대한 광범위한 교육에 투자하는 것이 성과를 거두지 않습니다.

머지 않아 수용 가능한 품질의 소프트웨어를 개발하는 방법을 배우게 될 것입니다. 그러나 완벽한 코드를 만드는 개발자에게는 시장이 없기 때문에 결함이없는 사람은 결코 없을 것입니다.


명확한 사양을 언급하면 ​​+1입니다. 나는 이것이 2 살짜리 주제라는 것을 알고 있지만, 버그가 프로그래밍 실패와 같다고 가정하는 것이 옳지 않다는 것을 지적하는 유일한 대답이라고 강조해야합니다.
Brandon

0

방어 적으로 프로그램 : http://en.wikipedia.org/wiki/Defensive_programming

누군가가 프로그래밍 규칙을 방어 적으로 따르는 경우 변경 사항을 쉽게 추적 할 수 있습니다. 개발 과정에서 엄격한 버그 보고서 및 doxygen과 같은 확실한 문서와이 기능을 결합하면 모든 코드가 수행하는 작업을 정확히 파악하고 발생하는 모든 버그를 매우 효율적으로 수정할 수 있습니다.


0

이것이 일반적인 골두가 아닌 좋은 방법론 을 오해 한 결과 일 수 있습니까?

내 말은 당신의 상사가 "무결점 방법론" (섹션 5 번 참조)을 듣고 그 의미를 이해하지 못했을 가능성이 있다는 것입니다.
물론, 경영진이 여러분
이해서는 안되는 버그에 찬성하여 새로운 기능의 개발을 연기하는 것은 불편합니다 ... 물론, 그의 보너스를 위협하므로 "좋은 프로그래머는 그렇지 않습니다. 버그가 있습니다 "...

그것은 괜찮 만들 만큼 당신이 수있는 버그를 찾아 그들을 및 수정 (물론, 이유 이내)을.


0

소프트웨어 테스트의 기본 개념 중 하나는 프로그램이 완벽하다는 것을 절대 확신 할 수 없다는 것입니다. 당신은 그것을 영원히 확인할 수 있지만, 모든 입력 / 변수 조합에 대해 테스트조차 빨리 불가능하기 때문에 프로그램이 완료되었다는 것을 결코 증명하지 못합니다.

당신의 상사는 "그냥 타이핑하기 때문에 프로그래밍에 대해 너무 어려운 점을 이해하지 못한 사람들"중 하나처럼 보입니다.


0

우리가 큰 소프트웨어 회사 가 최고의 개발자를 얻는 방법을 알고 있다고 가정하면 ( 제로 버그 프로그래머와 같이 ) Microsoft의 소프트웨어에 버그가 없어야한다고 공제 할 수 있습니다 . 그러나 우리는 그것이 진실과 거리가 멀다는 것을 알고 있습니다.

소프트웨어를 개발하고 특정 수준의 우선 순위가 낮은 버그에 도달하면 간단히 제품을 출시하고 나중에 해결합니다.

간단한 계산기보다 복잡한 것을 개발하지 않으면 버그를 함께 피할 수 없습니다. 지옥의 NASA도 차량과 버그에 중복성을 가지고 있습니다. 그들은 치명적인 실패를 피하기 위해 많은 엄격한 테스트를 거쳤지만. 그럼에도 불구하고 소프트웨어에도 버그가 있습니다.

인간의 본성이 오류를 범하는 것처럼 버그는 불가피 합니다.

버그가없는 것은 100 % 안전한 시스템을 갖는 것과 같습니다. 시스템이 100 % 안전하다면 더 이상 유용하지 않을 것입니다 (아마도 톤과 톤의 콘크리트로되어 있고 외부에 전혀 연결되어 있지 않습니다. 유선 또는 무선이 아님). 완벽한 보안 시스템이없는 것처럼 복잡한 버그없는 시스템은 없습니다.


-1

나는 우리가 인간이고 잘못되기 쉬운 것에 대한 답만 볼 수 있습니다. 그것은 매우 사실입니다 ... 그러나 다른 관점에서 당신의 질문을 봅니다.

나는 버그없는 프로그램을 작성할 있다고 생각 하지만, 일반적으로 10 ~ 12 번 작성된 프로그램입니다. 처음부터 같은 프로그램을 작성하는 13 시간, 당신은 이미 그것을 수행하는 방법을 알고 문제를 알고, 당신이 기술을 알고, 당신은 라이브러리, 언어를 알고 ... 당신이 당신의 마음을. 모든 패턴이 모든 레벨에 있습니다.

이것은 프로그래밍을 가르치기 때문에 매우 간단한 프로그램으로 나에게 발생합니다. 그들은 단순하지만 학생들에게는 어려움이 있습니다. 저는 칠판에서 여러 번 여러 번 해낸 문제에 대한 해결책에 대해 이야기하고 있지 않습니다. 물론 나는 그것들을 알고 있습니다. 내가 아는 개념 (내가 가르치는 개념)을 사용하여 무언가를 해결하는 ~ 300 줄 프로그램을 의미한다. 나는 계획 없이이 프로그램을 작성하고 작동합니다. 모든 세부 사항을 알고 있다고 생각합니다 .TDD가 전혀 필요하지 않습니다. 나는 2 ~ 3 개의 컴파일 오류 (주로 오타와 같은 것들)를 얻습니다. 나는 작은 프로그램을 위해 이것을 할 수 있으며, 일부 사람들은 더 복잡한 프로그램을 위해 그렇게 할 수 있다고 믿는다. Linus Torvalds 또는 Daniel J. Bernstein과 같은 사람들은 마음이 명확하다고 생각합니다. 버그가없는 코더에 가장 가까운 사람들입니다. 만약 너라면당신이 할 수 있다고 생각 하는 것을 깊이 이해 하십시오. 내가 말했듯이 간단한 프로그램에서만이 작업을 수행 할 수 있습니다.

내 생각은 당신이 항상 당신의 수준보다 훨씬 높은 프로그램을하려고하면 (나는 몇 년을 보냈지 만) 혼란스러워하고 실수를 할 것입니다. 문제를 최종적으로 이해하고 문제를 해결하지 못하도록 코드를 복잡하게 만들거나 문제를 해결해야 할 때 갑자기 솔루션을 사용할 수 없다는 것을 갑자기 깨닫는 실수와 같은 큰 실수. TDD는이 경우에 해당합니다. 당신은 당신이 다루고있는 문제를 겪지 않았으므로 강력한 기반을 가지고 있는지 확인하기 위해 모든 곳에서 테스트를합니다. 그러나 TDD는 10,000 피트 비전을 해결하지 못합니다. 당신은 항상 완벽하게 깨끗한 코드로 원을 걸을 수 있습니다.

당신이 새로운 무언가를 시도하지만이 경우에는 단지 수준 이상으로, 당신은 당신의 프로그램이 완벽하거나 거의 완벽하게 얻을 수 있습니다. 나는 당신의 "지식 경계"에 어떤 프로그램이 있는지 아는 것이 정말 어렵다고 생각하지만, 이것이 가장 배우는 가장 좋은 방법입니다. 실제로 프로그램을 처음부터 많이 다시 작성합니다. 어떤 사람들은 그렇습니다. 그러나 사소한 프로그램을 세 번 반복 할 때 처음처럼 흥분하지 않기 때문에 많은 시간과 인내가 필요합니다.

그래서 내 충고는 : 버그가없는 프로그램을 작성할 수있을 때까지 무언가를 이해한다고 생각하지 마십시오. 그리고 당신이 깊이 알고있는 두 가지 개념을 같은 프로그램에 결합 시키십시오. 나는 당신이 처음에 그것을 올바르게 얻을 것이라고 거의 확신합니다. 가장 좋은 방법 중 하나는 처음에는 많은 노력을 기울인 사소한 소프트웨어를 다시 작성하는 것입니다 (지금 Android 앱으로이 작업을 수행하고 있습니다). 다시 시작할 때마다 나는 약간의 재미를 더하기 위해 무언가를 바꾸거나 물건을 추가하고, 나는 더 나아지고 나아질 것이라고 말할 수 있습니다.


-1

imho 버그와 갑작스럽고 신비로운 알고리즘 아티팩트 코딩 프로세스 중에 나타나야합니다. 코드의 영감을주고 강제합니다.
그러나 (보통 테스트 후) 선언 전에 사용될 수있는 모든 변수를 확인하고 나타날 수있는 모든 오류를 처리 할 수 ​​있습니다-고려 된 기능에 대한 요청을받을 때까지 프로그램을 제로 버그로 만들 수 있습니다 프로그램 아키텍처를 논의 할 때는 불가능합니다.)


1
잘 모르겠습니다. 이것은 프로그래밍에 대한 신비한 접근 방식처럼 들립니다. 시행 착오를 통해 또는 divining 막대를 사용하여 효과적으로 프로그래밍하지 않습니다. 의도적으로 디자인합니다. 그리고 버그는 여전히 자랍니다. 그래서 당신은 그것들을 고칩니다. 그러나 무엇보다도 버그가 없도록 의도적으로 코드를 디자인 해야합니다.
Craig

-1

아마도 당신이 얻는 버그의 본질에 대해 더 많이 생각해보십시오. 버그가 일반적으로 경미한 감독이라면, 더 나은 테스트에 중점을두고 약간의 코드 교정이 도움이 될 것입니다.

그러나 버그가 최적이 아닌 프로그래밍 결정으로 인한 경향이 있다면 더 나은 디자인에 더 많은 노력을 기울여야 할 것입니다. 이 경우 결함이있는 코드에 패치를 적용하면 향후 유지 관리가 더 복잡해지기 때문에 소프트웨어의 품질을 높이기 위해 테스트에 너무 의존 할 수 있다고 생각합니다. 한편으로는 버그를 찾아서 고칠 때 버그가 줄어들지 만, 다른 쪽 버그는 앞으로 나올 버그에 대비합니다.

감독에 문제가 있거나 디자인에 문제가 있는지 판단하는 한 가지 방법은 버그를 수정하는 데 얼마나 많은 노력이 필요한지 고려하는 것입니다. 수정이 큰 경향이 있거나 잘 이해하지 못한다고 생각 될 경우 개선 될 수있는 코드 디자인을 보여줍니다.

연습과 검토를 통해 개발할 수 있고 비슷한 문제가있는 사람들에 대해 읽을 수있는 코드에 대한 좋은 맛이 나온다고 생각합니다.

궁극적으로 버그를 전혀 예상하지 않는 것은 무의미하지만, 버그 수준이 낮지 않은 한 버그 수를 줄이려고해도 아무런 해가 없습니다. 그러면 버그가 발견 된 시간과 시간 사이에 절충이됩니다. 잡히지 않는 버그.


-2

내가 당신이 의미하는 경우 : "코드를 작성하는 동안 버그 제로"-> 그것은 좋은 목표이지만 꽤 불가능합니다.

그러나 당신이 의미하는 경우 : "제공된 코드에 버그가 없음"-> 가능하며 그러한 환경에서 일했습니다.

코드 품질이 매우 높고 100 %에 가까운 테스트 범위 (단위 테스트 + 승인 테스트 + 통합 테스트) 만 있으면됩니다.

내 생각에 그것을 배울 수있는 가장 좋은 책은 GOOS 입니다. 그러나 물론 책으로는 충분하지 않습니다. 일부 사용자 그룹으로 이동하여 이에 대해 논의해야합니다. 강의, 회의 등 제로 버그 품질은 쉽지 않습니다.

우선 당신은 정말 높은 품질에 관심이 있고 그것을 기꺼이 지불 할 보스가 필요합니다.


-3

프로그래머의 솔루션 :

  • 프로그래밍을 중지하십시오.
  • 기계적인 컴퓨터를 만드십시오.
  • 기계적 마모가 발생하지 않도록 5 년마다 교체하십시오.

사용자 솔루션 :

  • 컴퓨터 사용을 중지하십시오.
  • 모든 것을 수동으로 수행하십시오.
  • 항상 다른 사람에게 결과를 다시 확인하도록하십시오.

-3

제로 버그 프로그래머가 되려면 단순히 프로그래밍 / 코딩 할 수 없다는 데 동의합니다. 버그를 만나고 개발하는 것은 모든 프로그래머의 삶의 일부입니다. 노련한 개발자는 마음에 손을 대면 결코 코드에 버그가 발생하지 않았습니다.


-4

다른 엔지니어와 페어링하십시오. 실패한 테스트를 작성하십시오. 실패한 시험에 합격하려면 모든 문자를 입력해야합니다. 코드를 리팩터링하여 더 간단하게 만듭니다. 다른 실패한 테스트 등을 작성하십시오.

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