상사는 항상 좋은 프로그래머가 자신이 변경하는 코드가 신뢰할 수 있고 정확하며 철저하게 자체 검증되도록 할 수 있어야한다고 말했습니다. 모든 결과를 완전히 이해하고 변경으로 인한 영향을 이해해야합니다. 나는 이런 종류의 프로그래머가 되려고 최선을 다했지만 (다시 반복해서 테스트하면서) 버그는 여전히 존재한다.
제로 버그 프로그래머가되고 코드의 모든 문자가 어떤 영향을 미치고 영향을 받는지 어떻게 알 수 있습니까?
상사는 항상 좋은 프로그래머가 자신이 변경하는 코드가 신뢰할 수 있고 정확하며 철저하게 자체 검증되도록 할 수 있어야한다고 말했습니다. 모든 결과를 완전히 이해하고 변경으로 인한 영향을 이해해야합니다. 나는 이런 종류의 프로그래머가 되려고 최선을 다했지만 (다시 반복해서 테스트하면서) 버그는 여전히 존재한다.
제로 버그 프로그래머가되고 코드의 모든 문자가 어떤 영향을 미치고 영향을 받는지 어떻게 알 수 있습니까?
답변:
전혀 코딩하지 마십시오.
이것이 제로 버그 프로그래머가 될 수있는 유일한 방법입니다.
프로그래머가 인간이기 때문에 버그는 피할 수 없습니다. 우리가 할 수있는 모든 것은 버그를 방지하기 위해 최선을 다하고, 버그가 발생할 때 신속하게 대응하고, 실수로부터 배우고, 최신 정보를 유지하는 것입니다.
사소한 프로그램에는 버그가 없습니다.
매우 가까워 질 수 있지만 생산성이 떨어집니다. 위험성이 높은 특정 소프트웨어에만 가치가 있습니다. 우주 왕복선 소프트웨어는 내 마음에 온다. 그러나 그들의 생산성은 하루에 몇 줄 정도입니다. 네 상사가 그걸 원한 것 같아
이 소프트웨어는 버그가 없습니다. 인간이 성취 한 것만 큼 완벽합니다. 다음 통계를 고려하십시오. 프로그램의 마지막 3 개 버전 (각 420,000 줄 길이)에는 각각 하나의 오류 만있었습니다. 이 소프트웨어의 최신 11 개 버전에는 총 17 개의 오류가있었습니다.
소프트웨어의 업그레이드를 통해 셔틀이 글로벌 포지셔닝 위성 (Global Positioning Satellites), 프로그램의 1.5 % 또는 6,366 줄의 코드로 변경 될 수 있습니다. 한 번의 변경에 대한 사양은 전화 번호부보다 두꺼운 2,500 페이지를 실행합니다. 현재 프로그램의 스펙은 30 개의 볼륨을 채우고 40,000 페이지를 실행합니다.
"Zero-bug programmer"는 조용한 가수와 같은 옥시 모론이지만 지난 60여 년 동안 프로그래밍을 통해 약간의 지혜가 만들어져 다음과 같은 더 나은 프로그래머가 될 것입니다.
TDD의 요점은 해당 코드 행을 요구하는 테스트가없는 경우 단일 코드 행을 작성하지 않는다는 것입니다. 그리고 그것을 극단적으로 받아들이려면 항상 수락 테스트를 작성하여 새로운 기능을 개발하기 시작합니다. 여기 오이 스타일 테스트 작성 이 이상적 이라는 것을 알았습니다 .
TDD 방식은 두 가지 이상의 이점을 제공합니다.
그것은 불가능할 것이므로 제로 버그를 증명하지는 않습니다 (이미 수많은 답변에 의해 지적되었습니다). 그러나 TDD를 배우고 능숙 해지면 (예, 연습이 필요한 기술이기도합니다) 철저한 테스트를 거쳐 내 코드에 대한 확신이 훨씬 큽니다. 더 중요한 것은 기능을 깨는 것에 대한 걱정없이 완전히 이해하지 못하는 기존 코드를 변경할 수 있다는 것입니다.
그러나 TDD는 당신을 완전히 도와주지 않습니다. 시스템 아키텍처와 해당 아키텍처의 함정을 완전히 이해하지 못하면 버그가없는 코드를 작성할 수 없습니다. 예를 들어 여러 요청을 동시에 처리하는 웹 응용 프로그램을 작성하는 경우 여러 요청간에 변경 가능한 데이터를 공유 할 수 없다는 것을 알아야합니다 (성능을 향상시키기 위해 변경 가능한 데이터를 캐시하기 위해 초보자 트랩에 빠지지 마십시오).
TDD에 능숙한 개발 팀은 결함이 가장 적은 코드를 제공한다고 생각합니다.
예, 코드에 버그가있는 것은 불가능하지만 버그가 적은 것은 아닙니다. "멍청한 데, 항상 버그가있을 것"이라는 태도는 코드의 버그 수를 줄이는 것을 피하기위한 경찰 일뿐입니다. 완벽한 사람은 없지만 더 나은 사람이되기 위해 노력해야합니다. 본인의 개선 노력에서 다음 사항이 도움이되었다는 것을 알게되었습니다.
개인적으로 나는 버그가없는 프로그래밍을 위해 노력하는 것이 시간과 돈 모두에서 더 비싸다고 생각합니다. 제로 버그 또는 거의 제로 버그에 도달하려면 개발자가 철저히 테스트해야합니다. 이는 패치 검토를 위해 코드를 제출하기 전에 모든 것을 회귀 테스트한다는 의미입니다. 이 모델은 비용 효과적이라는 사실을 깨닫지 못했습니다. 개발자가 부지런한 테스트를 수행하고 심층 테스트를 QA 팀에 맡기는 것이 좋습니다. 이유는 다음과 같습니다.
코드를 작성할 때 버그가 기록 될 수 있습니다. 그렇기 때문에 QA 프로세스를 수행해야하며 모두 개발자의 일부입니다. 물론 이것이 마지막 세미콜론을 작성하자마자 무언가를 제출한다는 의미는 아닙니다. 여전히 업무의 질을 보장해야하지만 과용 할 수는 있습니다 .
동료 검토 및 / 또는 테스트없이 항상 처음으로 작업을 완료하는 직업은 몇 명입니까?
제로 버그? Lisp가 필요한 것처럼 들립니다 (회의 론적 경로를 따르고 뮤직 비디오를 피하십시오).
주류 코딩 환경 (Java, C #, PHP 등)에서 버그없는 코드를 달성하는 것은 매우 어렵습니다. 나는 짧은 제어 반복에서 잘 테스트되고 피어 리뷰 된 코드 를 만드는 데 중점을 둘 것 입니다.
코드를 최대한 간단하게 유지하면 버그를 피하는 데 도움이됩니다.
엄격한 컴파일러 경고와 함께 코드 분석 도구 (예 : FindBugs , PMD 등)를 사용하고 있는지 확인하십시오 . 코드와 관련된 모든 종류의 문제가 표시됩니다. 그들이 말하는 내용을 기록하고 버그의 본질을 이해하려고 노력한 다음 프로그래밍 관용구를 변경하여 해당 버그를 다시 도입하는 방식으로 코딩하는 것이 부 자연스럽게 느껴지도록 조치를 취하십시오.
"모든 코드를 작성하지 마십시오." 답이 완전히 빠졌습니다. 또한, 당신의 상사는 분명히 바보가 아닌 것 같습니다!
코드가 무엇인지 모르는 프로그래머를 얼마나 자주 본지 기억이 나지 않습니다. 그들의 유일한 개발 철학은 시행 착오 인 것처럼 보였다 (그리고 종종 복사 / 붙여 넣기 / 수정). 시행 착오는 일부 문제를 해결하는 올바른 방법이지만 종종 문제 영역을 분석 한 다음 사용하는 도구에 대한 이해와 약간의 훈련과 부지런함을 바탕으로 매우 구체적인 솔루션을 적용 할 수 있습니다. 처음으로 배포하기 전에 문제뿐만 아니라 대부분의 코너 (잠재적 버그)도 해결했습니다. 코드에 버그가 없음을 보장 할 수 있습니까? 당연히 아니지. 그러나 발생하거나 읽은 모든 버그와 함께 다음에 무언가를 쓰거나 변경할 때 생각하고 싶은 것에 버그를 추가 할 수 있습니다. 이렇게하면 결과적으로 버그가 거의없는 코드를 작성하는 방법에 대한 많은 경험을 얻게됩니다. -여행에 도움을 줄 수있는 더 나은 프로그래머가되는 방법에 대한 많은 자료가 있습니다 ...
개인적으로 모든 줄을 설명 할 수없는 코드는 절대 커밋하지 않습니다. 모든 줄에는 이유가 있으므로 제거해야합니다. 물론 때로는 호출하는 메서드의 내부 작업을 가정 할 수도 있습니다. 그렇지 않으면 전체 프레임 워크의 내부 논리를 알아야합니다.
상사는 기존 시스템에서 작성한 코드의 결과와 영향을 이해해야한다고 말할 권리가 있습니다. 버그가 발생합니까? 물론입니다. 그러나 이러한 버그는 작업중인 시스템 / 도구에 대한 불완전한 이해로 인해 발생하며 모든 버그 수정시 적용 범위가 넓습니다.
다른 의견들이 이미 올바르게 지적했듯이 버그가없는 사소한 소프트웨어는 없습니다.
소프트웨어를 항상 테스트하려는 경우 해당 테스트는 버그가없는 것이 아니라는 사실 만 증명할 수 있습니다.
작업 영역에 따라 소프트웨어의 공식 검증을 시도 할 수 있습니다. 공식적인 방법을 사용하면 소프트웨어가 사양을 정확히 충족시킬 수 있습니다.
물론 소프트웨어가 원하는 것을 정확하게 수행한다는 의미는 아닙니다. 완전한 사양 작성은 거의 모든 경우에 가능하지 않습니다. 기본적으로 오류가 발생할 수있는 위치를 구현에서 사양으로 이동합니다.
따라서 "버그"의 정의에 따라 공식 검증을 시도하거나 소프트웨어에서 가능한 많은 버그를 찾을 수 있습니다.
당신은 제로 버그 프로그래머가되기 위해 노력할 수 있습니다. 코드를 작성할 때마다 제로 버그 프로그래머가 되려고 노력합니다. 그러나 나는하지 않습니다
필자가 작성하는 소프트웨어에 비용이 많이 들기 때문에 이러한 작업을 수행하지 않습니다. 내가 이런 일을했다면 아마도 제로 버그를 향해 나아갈 것이지만 사업 상 이해가되지는 않을 것입니다.
인프라의 상당 부분이 사용하는 내부 도구를 만듭니다. 테스트 및 코딩에 대한 나의 표준은 높습니다. 그러나 균형이 있습니다. 나는 사람들이 그런 종류의 시간을 한 작품에 넣을 수 없기 때문에 제로 버그를 기대하지 않습니다. X-Ray 기계, 제트 엔진 등을 제어하기 위해 소프트웨어를 제작하는 경우 상황이 다를 수 있습니다. 소프트웨어가 고장 나더라도 생명이 유지되지 않으므로 해당 수준의 보증에 관여하지 않습니다.
보증 수준을 소프트웨어의 의도 된 사용과 일치시킵니다. NASA 셔틀이 사용할 코드를 작성하는 경우 제로 버그 허용 오차가 적당 할 수 있습니다. 추가로 매우 비싼 관행을 추가하면됩니다.
"제로 버그"프로그래머가되기위한 첫 번째 단계는 버그에 대한 태도를 바꾸는 것입니다. "일어났다", "QA 및 테스터 향상"또는 "개발자들이 테스트에 어려움을 겪는다"고 말하는 대신 다음과 같이 말합니다.
벌레는 용납 할 수 없으며, 제 힘을 다해 제거하기 위해 모든 것을 다하겠습니다.
이것이 당신의 태도가되면 버그는 빨리 떨어집니다. 버그를 제거 할 수있는 방법을 찾기 위해 테스트 중심 개발을 경험하게됩니다. 더 나은 기술에 대한 무료 조언을 제공하는 많은 책, 블로그 게시물 및 사람들을 찾을 수 있습니다. 연습 을 통해 기술을 향상시키는 것이 중요하다는 것을 알게 될 것입니다 (카타 코딩 또는 집에서 새로운 일 시도). 집에서 공예 작업을 시작하기 때문에 직장에서 더 나은 성과를 내기 시작 합니다. 그리고 좋은 소프트웨어를 작성 하는 것이 가능 해지면 공예에 대한 열정이 커지기를 바랍니다.
어떤 의미에서는 상사가 옳습니다. 제로 버그에 접근하는 소프트웨어를 작성할 수 있습니다.
그러나 문제는 (거의) 제로 버그 프로그램을 작성 하는 비용 이 엄청나게 높다는 것 입니다. 다음과 같은 작업을 수행해야합니다.
요구 사항의 공식 사양을 사용하십시오. Z 또는 VDM 또는 기타 수학적으로 소리 표기법을 사용하는 경우와 같이 형식적입니다.
정리 증명 기술을 사용하여 프로그램이 사양을 구현하고 있음을 공식적으로 증명하십시오.
광범위한 단위, 회귀 및 시스템 테스트 스위트 및 하네스를 작성하여 모든 방법으로 버그를 테스트하십시오. (그리고 이것 자체로는 충분하지 않습니다.)
한 많은 사람들은 (공식 및 비공식) 요구 사항, 소프트웨어 (및 증명)를 검토합니다. 테스트 및 배포.
당신의 상사가이 모든 것을 지불 할 준비가되어 있거나, 모든 일을하는 데 걸리는 시간을 참을 가능성은 거의 없습니다.
버그 프리 프로그램을 만드는 단계는 다음과 같습니다.
테스트는 버그가 있음을 증명할 수 있지만 일반적으로 그렇지 않다는 것은 쓸모가 없습니다. 피드백과 관련하여-동전을 만드는 동전 만드는 기계가 있고 평균 10 초마다 동전에 결함이 있습니다. 그 동전을 가져 와서 평평하게하고 기계에 다시 삽입하십시오. 재활용 블랭크로 만든 동전은 좋지는 않지만 수용 가능할 것입니다. 100 년대마다 동전을 2 번씩 다시 찍어야합니다. 기계를 고치는 것이 더 쉬울까요?
불행히도 사람들은 기계가 아닙니다. 결함이없는 좋은 프로그래머를 만들려면 모든 결함에 대해 훈련하고 반복하는 데 많은 시간을 투자해야합니다. 개발자는 실제로 배우고 적용하기 어려운 공식 검증 방법에 대한 교육을 받아야합니다. 소프트웨어 개발의 경제학도 이에 반대하고 있습니다. 다른 고용주에게 뛰어 넘기 위해 결함을 줄일 수있는 프로그래머 교육에 2 년을 투자 하시겠습니까? 완벽한 코인을 만드는 기계를 구입하거나 10 개의 코드 원숭이를 더 고용하여 동일한 비용으로 많은 테스트를 만들 수 있습니다. 이 철저한 프로세스를 "기계", 자산으로 인식 할 수 있습니다. 우수한 개발자에 대한 광범위한 교육에 투자하는 것이 성과를 거두지 않습니다.
머지 않아 수용 가능한 품질의 소프트웨어를 개발하는 방법을 배우게 될 것입니다. 그러나 완벽한 코드를 만드는 개발자에게는 시장이 없기 때문에 결함이없는 사람은 결코 없을 것입니다.
방어 적으로 프로그램 : http://en.wikipedia.org/wiki/Defensive_programming
누군가가 프로그래밍 규칙을 방어 적으로 따르는 경우 변경 사항을 쉽게 추적 할 수 있습니다. 개발 과정에서 엄격한 버그 보고서 및 doxygen과 같은 확실한 문서와이 기능을 결합하면 모든 코드가 수행하는 작업을 정확히 파악하고 발생하는 모든 버그를 매우 효율적으로 수정할 수 있습니다.
우리가 큰 소프트웨어 회사 가 최고의 개발자를 얻는 방법을 알고 있다고 가정하면 ( 제로 버그 프로그래머와 같이 ) Microsoft의 소프트웨어에 버그가 없어야한다고 공제 할 수 있습니다 . 그러나 우리는 그것이 진실과 거리가 멀다는 것을 알고 있습니다.
소프트웨어를 개발하고 특정 수준의 우선 순위가 낮은 버그에 도달하면 간단히 제품을 출시하고 나중에 해결합니다.
간단한 계산기보다 복잡한 것을 개발하지 않으면 버그를 함께 피할 수 없습니다. 지옥의 NASA도 차량과 버그에 중복성을 가지고 있습니다. 그들은 치명적인 실패를 피하기 위해 많은 엄격한 테스트를 거쳤지만. 그럼에도 불구하고 소프트웨어에도 버그가 있습니다.
인간의 본성이 오류를 범하는 것처럼 버그는 불가피 합니다.
버그가없는 것은 100 % 안전한 시스템을 갖는 것과 같습니다. 시스템이 100 % 안전하다면 더 이상 유용하지 않을 것입니다 (아마도 톤과 톤의 콘크리트로되어 있고 외부에 전혀 연결되어 있지 않습니다. 유선 또는 무선이 아님). 완벽한 보안 시스템이없는 것처럼 복잡한 버그없는 시스템은 없습니다.
나는 우리가 인간이고 잘못되기 쉬운 것에 대한 답만 볼 수 있습니다. 그것은 매우 사실입니다 ... 그러나 다른 관점에서 당신의 질문을 봅니다.
나는 버그없는 프로그램을 작성할 수 있다고 생각 하지만, 일반적으로 10 ~ 12 번 작성된 프로그램입니다. 처음부터 같은 프로그램을 작성하는 13 시간, 당신은 이미 그것을 수행하는 방법을 알고 문제를 알고, 당신이 기술을 알고, 당신은 라이브러리, 언어를 알고 ... 당신이 볼 당신의 마음을. 모든 패턴이 모든 레벨에 있습니다.
이것은 프로그래밍을 가르치기 때문에 매우 간단한 프로그램으로 나에게 발생합니다. 그들은 단순하지만 학생들에게는 어려움이 있습니다. 저는 칠판에서 여러 번 여러 번 해낸 문제에 대한 해결책에 대해 이야기하고 있지 않습니다. 물론 나는 그것들을 알고 있습니다. 내가 아는 개념 (내가 가르치는 개념)을 사용하여 무언가를 해결하는 ~ 300 줄 프로그램을 의미한다. 나는 계획 없이이 프로그램을 작성하고 작동합니다. 모든 세부 사항을 알고 있다고 생각합니다 .TDD가 전혀 필요하지 않습니다. 나는 2 ~ 3 개의 컴파일 오류 (주로 오타와 같은 것들)를 얻습니다. 나는 작은 프로그램을 위해 이것을 할 수 있으며, 일부 사람들은 더 복잡한 프로그램을 위해 그렇게 할 수 있다고 믿는다. Linus Torvalds 또는 Daniel J. Bernstein과 같은 사람들은 마음이 명확하다고 생각합니다. 버그가없는 코더에 가장 가까운 사람들입니다. 만약 너라면당신이 할 수 있다고 생각 하는 것을 깊이 이해 하십시오. 내가 말했듯이 간단한 프로그램에서만이 작업을 수행 할 수 있습니다.
내 생각은 당신이 항상 당신의 수준보다 훨씬 높은 프로그램을하려고하면 (나는 몇 년을 보냈지 만) 혼란스러워하고 실수를 할 것입니다. 문제를 최종적으로 이해하고 문제를 해결하지 못하도록 코드를 복잡하게 만들거나 문제를 해결해야 할 때 갑자기 솔루션을 사용할 수 없다는 것을 갑자기 깨닫는 실수와 같은 큰 실수. TDD는이 경우에 해당합니다. 당신은 당신이 다루고있는 문제를 겪지 않았으므로 강력한 기반을 가지고 있는지 확인하기 위해 모든 곳에서 테스트를합니다. 그러나 TDD는 10,000 피트 비전을 해결하지 못합니다. 당신은 항상 완벽하게 깨끗한 코드로 원을 걸을 수 있습니다.
당신이 새로운 무언가를 시도하지만이 경우에는 단지 수준 이상으로, 당신은 당신의 프로그램이 완벽하거나 거의 완벽하게 얻을 수 있습니다. 나는 당신의 "지식 경계"에 어떤 프로그램이 있는지 아는 것이 정말 어렵다고 생각하지만, 이것이 가장 배우는 가장 좋은 방법입니다. 실제로 프로그램을 처음부터 많이 다시 작성합니다. 어떤 사람들은 그렇습니다. 그러나 사소한 프로그램을 세 번 반복 할 때 처음처럼 흥분하지 않기 때문에 많은 시간과 인내가 필요합니다.
그래서 내 충고는 : 버그가없는 프로그램을 작성할 수있을 때까지 무언가를 이해한다고 생각하지 마십시오. 그리고 당신이 깊이 알고있는 두 가지 개념을 같은 프로그램에 결합 시키십시오. 나는 당신이 처음에 그것을 올바르게 얻을 것이라고 거의 확신합니다. 가장 좋은 방법 중 하나는 처음에는 많은 노력을 기울인 사소한 소프트웨어를 다시 작성하는 것입니다 (지금 Android 앱으로이 작업을 수행하고 있습니다). 다시 시작할 때마다 나는 약간의 재미를 더하기 위해 무언가를 바꾸거나 물건을 추가하고, 나는 더 나아지고 나아질 것이라고 말할 수 있습니다.
imho 버그와 갑작스럽고 신비로운 알고리즘 아티팩트 는 코딩 프로세스 중에 나타나야합니다. 코드의 영감을주고 강제합니다.
그러나 (보통 테스트 후) 선언 전에 사용될 수있는 모든 변수를 확인하고 나타날 수있는 모든 오류를 처리 할 수 있습니다-고려 된 기능에 대한 요청을받을 때까지 프로그램을 제로 버그로 만들 수 있습니다 프로그램 아키텍처를 논의 할 때는 불가능합니다.)
아마도 당신이 얻는 버그의 본질에 대해 더 많이 생각해보십시오. 버그가 일반적으로 경미한 감독이라면, 더 나은 테스트에 중점을두고 약간의 코드 교정이 도움이 될 것입니다.
그러나 버그가 최적이 아닌 프로그래밍 결정으로 인한 경향이 있다면 더 나은 디자인에 더 많은 노력을 기울여야 할 것입니다. 이 경우 결함이있는 코드에 패치를 적용하면 향후 유지 관리가 더 복잡해지기 때문에 소프트웨어의 품질을 높이기 위해 테스트에 너무 의존 할 수 있다고 생각합니다. 한편으로는 버그를 찾아서 고칠 때 버그가 줄어들지 만, 다른 쪽 버그는 앞으로 나올 버그에 대비합니다.
감독에 문제가 있거나 디자인에 문제가 있는지 판단하는 한 가지 방법은 버그를 수정하는 데 얼마나 많은 노력이 필요한지 고려하는 것입니다. 수정이 큰 경향이 있거나 잘 이해하지 못한다고 생각 될 경우 개선 될 수있는 코드 디자인을 보여줍니다.
연습과 검토를 통해 개발할 수 있고 비슷한 문제가있는 사람들에 대해 읽을 수있는 코드에 대한 좋은 맛이 나온다고 생각합니다.
궁극적으로 버그를 전혀 예상하지 않는 것은 무의미하지만, 버그 수준이 낮지 않은 한 버그 수를 줄이려고해도 아무런 해가 없습니다. 그러면 버그가 발견 된 시간과 시간 사이에 절충이됩니다. 잡히지 않는 버그.
내가 당신이 의미하는 경우 : "코드를 작성하는 동안 버그 제로"-> 그것은 좋은 목표이지만 꽤 불가능합니다.
그러나 당신이 의미하는 경우 : "제공된 코드에 버그가 없음"-> 가능하며 그러한 환경에서 일했습니다.
코드 품질이 매우 높고 100 %에 가까운 테스트 범위 (단위 테스트 + 승인 테스트 + 통합 테스트) 만 있으면됩니다.
내 생각에 그것을 배울 수있는 가장 좋은 책은 GOOS 입니다. 그러나 물론 책으로는 충분하지 않습니다. 일부 사용자 그룹으로 이동하여 이에 대해 논의해야합니다. 강의, 회의 등 제로 버그 품질은 쉽지 않습니다.
우선 당신은 정말 높은 품질에 관심이 있고 그것을 기꺼이 지불 할 보스가 필요합니다.