저는 실제 로켓 의사가 제작 한 시스템의 유지 보수 작업을 주기적으로 요구받습니다. 시작할 때부터 알기가 너무 어렵다.유지 관리해야 할 가장 불만스러운 프로그램은 무엇입니까?
아니요, 처음부터 시작하겠습니다. 프로젝트 초기에 설계자는 시스템을 확장해야한다고 말했고 확장 성 문제의 원인은 응용 프로그램 및 데이터베이스 서버를 관리하므로이 트래픽을 최소화해야했습니다. 방법? 모든 응용 프로그램 논리를 SQL Server 저장 프로 시저에 저장합니다.
진지하게. XML 메시지를 공식화하는 HTML 프론트 엔드가 응용 프로그램의 상당 부분을 담당합니다. 중간 계층은 XML 메시지를 받으면 문서 요소의 태그 이름을 호출해야하는 저장 프로 시저의 이름으로 사용하고 SP를 호출하여 XML 메시지 전체를 매개 변수로 전달합니다. SP가 반환하는 XML 메시지를 받아 프론트 엔드로 직접 반환합니다. 응용 프로그램 계층에 다른 논리가 없습니다.
은 (은 중간 계층의 일부 코드는 스키마의 라이브러리에 들어오는 XML 메시지의 유효성을 검사이 있었다. 그러나 나는 한 것을 확인하는 후에, 그것을 제거) 메시지의 작은 소수 스키마를 해당했다 2) 메시지는 실제로 이러한 스키마에 부합하지 않았다. 3) 메시지의 유효성을 검증 한 후에 오류가 발생하면 메소드는이를 무시했다. "이 퓨즈 박스는 실시간 세이버입니다. 동전이 미리 설치되어있는 공장에서 나옵니다!")
전에는 잘못한 소프트웨어를 보았습니다. 그것의 제비. 나는 꽤 많이 썼다. 그러나 나는 결코 을과 같은 눈으로 볼 수는 없지만, 번에 번으로이 시스템의 디자인과 프로그래밍에 구현되었습니다.
글쎄, 그는 적어도 그가 알고있는 것과 같이 갔다. 그렇지? 음. 분명히 그가 아는 것은 접근이었다. 그리고 그는 실제로 을 이해하지 못했습니다. 액세스. 또는 데이터베이스.
다음은이 코드의 일반적인 패턴의 미세한 좋아
SELECT @TestCodeID FROM TestCode WHERE TestCode = @TestCode SELECT @CountryID FROM Country WHERE CountryAbbr = @CountryAbbr SELECT Invoice.*, TestCode.*, Country.* FROM Invoice JOIN TestCode ON Invoice.TestCodeID = TestCode.ID JOIN Country ON Invoice.CountryID = Country.ID WHERE Invoice.TestCodeID = @TestCodeID AND Invoice.CountryID = @CountryID
. 쿼리 최적화 프로그램을 신뢰하지 않습니다. 하지만 이건 어때? (원래이 글을 What's the best comment in source code you have ever encountered?에 올리려고했지만,이 한 문장의 주석보다 더 많은 내용을 써야한다는 것을 깨달았습니다. 많은 유틸리티 저장 프로 시저가 끝나면
-- Fix NULLs SET @TargetValue = ISNULL(@TargetValue, -9999)
예, 그 코드가 정확히하고있는 당신 자신이 당신이 화를 구동 할 않도록이 일을 믿을 수 없습니다 수있는 '에는 다음과 같은 코드를 볼 것이다. 변수에 NULL이 포함되어 있으면 호출자에게 값을 -9999로 변경하여 경고합니다. 이 번호는 일반적으로 다음과 같이 사용됩니다.
-- Get target value EXEC ap_GetTargetValue @Param1, @Param2, OUTPUT @TargetValue -- Check target value for NULL value IF @TargetValue = -9999 ...
정말.
이 시스템의 다른 차원에 대해서는 thedailywtf.com의 문서 I Think I'll Call Them "Transactions"을 참조하십시오. 나는 이걸 만들지 않을거야. 맹세코.
나는이 시스템을 사용할 때 볼프강 파울리 (Wolfgang Pauli)의 유명한 학생 반응에 대해 종종 상기시켜줍니다. "그건 잘못이 아니야."
이것은 정말 최악의 프로그램이 될 수는 없지만 30 년 전의 나의 경력에서 내가 가장 열심히 일한 것은 분명하지만 모든 것을 보지 못했습니다. ?
그래서를 ON .... 이것은 정말 통풍구만큼이나 큰 질문이 아닙니다! 당신이 수사학 적으로 묻고있는 것 같아요. ... 흠 ... –
이것은 블로그 또는 [토론 전용 사이트] (http://meta.stackexchange.com/questions/13198/)에 더 적합합니다. –
나는 그것에 대한 대답이 유용 할 수 있다고 생각했기 때문에 질문을했다. 소프트웨어의 오류 분석은 일반적으로 소프트웨어가 완전히 실패한 후에 만 수행됩니다 (해당되는 경우). 수고를 통해서만 살아남은 끔찍한 헛간은 종종 한 두 사람이 정말로 이해합니다. 소프트웨어가 얼마나 유용 할 수 있습니까? 그런 것들은 어떻게 생겨 났으며 그들을 지원하기 위해 어떤 노력이 필요합니까?이러한 질문을 체계적으로 탐구하기는 어렵지만 탐구 할 가치가 있습니다. –