치환에 의한 프로그래밍
Programming by permutation순열을 통한 프로그래밍은 소프트웨어 개발에 대한 접근법이며, 작은 변경(변환)을 반복하여 원하는 대로 동작하는지 테스트하여 프로그래밍 문제를 해결합니다.프로그래머가 코드를 완전히 이해하지 못하고 1개 또는 여러 개의 작은 수정으로 올바른 코드가 생성될 수 있다고 믿는 경우 이 접근법이 매력적으로 보일 수 있습니다.
이 방법은 다음과 같은 경우 효율적이지 않습니다.
- 코드 베이스의 범위가 큰 자동 회귀 테스트가 간단하게 실행되고 있지 않습니다.
- 일련의 작은 수정은 코드에 검출되지 않은 새로운 버그를 쉽게 도입할 수 있으며, 시작점보다 더 정확하지 않은 "오류"를 초래할 수 있습니다.
- 테스트 주도의 개발이 없으면 실증 테스트를 통해 솔루션이 관련 사례의 전체 또는 중요한 부분에 대해 기능하는지 측정하는 것은 거의 불가능합니다.
- 버전 관리 시스템(GIT, Mercurial, SVN 등)을 사용하지 않거나 변경 내용이 가시적으로 반영되지 않는 상황을 재설정하기 위해 반복 중에 사용하지 않습니다.
- 많은 잘못된 시작과 수정은 보통 만족스러운 끝점에 도달하기 전에 일어난다
- 최악의 경우, 코드의 원래 상태는 돌이킬 수 없을 정도로 손실될 수 있다
치환에 의한 프로그래밍은 생성된 코드의 품질에 대해 거의 또는 전혀 확신을 주지 않습니다.이는 공식적인 검증과는 정반대입니다.
API가 충분히 문서화되지 않은 경우 프로그래머들은 종종 치환에 의해 프로그래밍을 강요당합니다.이러한 명확성의 결여로 인해 다른 사람들은 참조 코드에서 복사하여 붙여넣기를 하게 됩니다. 참조 코드는 올바른 것으로 추정되지만, 그 자체는 순열로 프로그래밍된 결과 작성되었습니다.
프로그래머가 작은 바리에이션 세트 중 정확히 하나는 동작해야 한다는 것을 논리적으로 설명할 수 있는 경우, 치환에 의한 프로그래밍은 올바른 코드로 이어지며(그 후 검증될 수 있음), 다른 (잘못된) 바리에이션에 대해 생각할 필요가 없게 됩니다.
예
예를 들어, C의 다음 코드샘플(큰 문자열에서 일련의 숫자를 검색하여 복사하려고 함)에는 몇 가지 문제가 있습니다.
#실패하다 <stdio.h> #실패하다 <문자열>h> #실패하다 <ctype.h> 인트 주된(무효) { 컨스턴트 차* 완충 장치 = "123파운드"; 차 목적지[10]; 인트 i = 0; 인트 j = 0; 인트 l = 스트렌(완충 장치); 하는 동안에 (i < > l) { 한다면 (숫자(완충 장치[i])) { 목적지[j++] = 완충 장치[i++]; } ++i; } 목적지[j] = '\0'; 인쇄물(%s\n", 목적지); } 우선, 그것은 정답을 제시하지 않는다.주어진 시작 문자열을 사용하면 정답이 "123"일 때 출력 "13"이 생성됩니다.구조적 문제를 인식하지 못하는 프로그래머는 "아, 추가 증가분이 있습니다."라고 말하며 하나의 문장에 집착할 수 있습니다."+i" 행은 삭제되지만 코드를 테스트하면 무한 루프가 발생합니다."아이고, 잘못된 증분입니다."앞의 문장이 다시 추가되고 그 위의 행이 변수 i의 사후 증가를 삭제하도록 변경됩니다.
한다면 (숫자(완충 장치[i])) { 목적지[j++] = 완충 장치[i]; } 이제 코드를 테스트하면 정답인 "123"이 나옵니다.프로그래머는 만족하며 한숨을 내쉬었다. "자, 됐다.이제 다 끝났습니다.기타 다양한 입력 문자열을 사용한 추가 테스트에서 이 결론을 확인할 수 있습니다.
물론 다른 문제도 남아 있다.프로그래머는 코드를 완전히 이해하는데 번거로움을 겪지 않기 때문에 인식되지 않습니다.
- 입력에 다음과 같이 숫자가 아닌 문자로 구분된 여러 숫자가 포함되어 있는 경우
"123ab456"수신처는, 모든 디짓(연결된 번호)을 수신합니다. - 입력 문자열이 대상 배열보다 크면 버퍼 오버플로가 발생합니다.
- 입력 문자열이 다음 값보다 긴 경우
INT_MAXstrlen()이 type 값을 반환하기 때문에 동작이 정의되지 않았습니다.size_t부호 없는 정수이며, 보다 넓을 수 있습니다.int. - 한다면
char부호 있는 타입으로 입력 문자열에는 다음 범위를 벗어나는 문자가 포함되어 있습니다.0..UCHAR_MAX정수 승격 후 콜은isdigit()에 정의되지 않은 동작이 있습니다.
한정된 입력 문자열 세트에 대해서는 정답이지만 완전히 정답은 아닙니다.프로그래머가 코드를 이해하려고 하지 않았기 때문에 오류는 나중에 테스트 단계를 거쳐 발견됩니다.
'시행착오', '생성과 테스트', '포크와 희망',[1] '버드샷 방법', '밀리언 몽키즈 프로그래밍 스타일'이라고도 합니다.
레퍼런스
- ^ Catania, Anthony (1987). ""ever, although there are some algebraic skills, topics on factorization, rational."". Mathematics and Computer Education. University of Michigan. 21: 74.