BIG는 언제 답을 쓰나요?


278

Big Rewrites에 관한 질문을 읽고 나는 내가 대답하고 싶었던 질문을 기억했습니다.

Struts 1.0을 사용하여 오래된 Java로 작성된 끔찍한 프로젝트가 있습니다. Struts 1.0, 관계가 불일치하는 테이블 또는 전혀 관계가 없으며 기본 키 또는 필드가 기본 테이블이 아니지만 고유하지 않은 테이블도 있습니다. 어쨌든 대부분의 응용 프로그램은 "그냥 작동"합니다. 대부분의 페이지는 재사용되고 (붙여 넣은 코드 복사) 하드 코딩됩니다. 프로젝트를 수행 한 모든 사람은 프로젝트를 한 형태 또는 다른 형태로 저주했습니다.

이제 저는이 끔찍한 응용 프로그램을 완전히 다시 작성하도록 상위 경영진에게 제안하는 것을 오랫동안 고려해 왔습니다. 나는 천천히 개인적인 시간을 보내려고 노력하고 있지만, 이것이 실제로 일어날 수있는 일부 전용 리소스가 필요하다고 생각합니다. 큰 기사를 읽었을 때 나는 다시 생각하고 있습니다. 그리고 내 상사에게 내 다시 쓰기를 지원하도록 설득하고 싶을 때 좋지 않습니다. (나는 상당히 작은 회사에서 일하므로 제안서가 승인 될 가능성이 있음)

TL; DR 큰 대답은 언제 다시 쓰며 대답을 지원하기 위해 사용할 수있는 인수는 무엇입니까?



6
오래되었지만 그것은 고전적입니다. Joel의 "당신이 절대하지 말아야 할 것들, 1 부" joelonsoftware.com/articles/fog0000000069.html
Mawg

이것은 좋은 질문입니다. 이 상황은 소프트웨어 엔지니어링에서 자주 발생합니다.
Brad Thomas

답변:


325

죄송합니다. 시간이 오래 걸리지 만 여러 재 작성 프로젝트에서 건축가와 개발자 모두의 개인적인 경험을 기반으로합니다.

다음과 같은 조건에서는 일종의 다시 쓰기를 고려해야합니다. 그 후에 수행 할 작업을 결정하는 방법에 대해 이야기하겠습니다.

  • 개발자 상승 시간이 매우 높습니다. 새로운 개발자를 늘리기 위해 경험 수준별로 아래 시간이 더 걸리면 시스템을 다시 설계해야합니다. 램프 업 시간이란, 새로운 개발자가 첫 번째 커밋을 할 준비가되기까지의 시간을 의미합니다 (작은 기능으로).
    • 대학 밖에서의 신선한 생활-1.5 개월
    • 여전히 녹색이지만 1 개월 전에 다른 프로젝트에서 작업 한 적이 있습니다.
    • 중급-2 주
    • 경험-1 주
    • 상급 레벨-1 일
  • 기존 아키텍처의 복잡성으로 인해 배포를 자동화 할 수 없습니다
  • 기존 코드의 복잡성으로 인해 간단한 버그 수정조차 너무 오래 걸립니다
  • 코드베이스의 상호 의존성으로 인해 새로운 기능이 너무 오래 걸리고 비용이 많이 든다 (새로운 기능은 분리 할 수 ​​없으므로 기존 기능에 영향을 미침)
  • 기존 코드베이스의 상호 종속성으로 인해 공식 테스트주기가 너무 오래 걸립니다.
  • 너무 적은 화면에서 너무 많은 사용 사례가 실행됩니다. 이로 인해 사용자 및 개발자에게 교육 문제가 발생합니다.
  • 현재 시스템에있는 기술은 그것을 요구합니다
    • 기술에 경험이있는 우수한 개발자는 찾기가 너무 어렵다
    • 더 이상 사용되지 않습니다 (최신 플랫폼 / 기능을 지원하도록 업그레이드 할 수 없음)
    • 사용 가능한 훨씬 표현적인 고급 기술이 있습니다.
    • 이전 기술의 인프라 유지 관리 비용이 너무 높습니다

이것들은 꽤 자명하다. 전체 재 작성을 결정하는 시점과 증분 재구성은보다 주관적이므로 정치적으로 더 많은 비용이 청구됩니다. 내가 유죄 판결로 말할 수있는 것은 그것이 결코 좋은 생각이 아니라고 범주 적으로 진술하는 것이 잘못이라는 것입니다.

시스템을 점진적으로 재 설계 할 수 있고 그러한 일에 대한 프로젝트 후원을 전적으로 지원할 수 있다면 그렇게해야합니다. 그래도 문제가 있습니다. 많은 시스템을 점진적으로 재 설계 할 수 없습니다. 다음은이 문제를 방지하는 몇 가지 이유 (기술적, 정치적 모두)입니다.

  • 인위적인
    • 구성 요소의 결합이 너무 커서 단일 구성 요소의 변경 사항을 다른 구성 요소와 분리 할 수 ​​없습니다. 단일 구성 요소의 재 설계는 인접한 구성 요소뿐만 아니라 모든 구성 요소에 대한 간접적 인 변경 사항을 일으 킵니다.
    • 기술 스택은 매우 복잡하여 미래의 상태 설계에는 여러 인프라 변경이 필요합니다. 이것은 완전한 재 작성에서도 필요하지만 증분 재 설계에 필요한 경우 그러한 이점을 잃게됩니다.
    • 구성 요소를 다시 디자인하면 기존 디자인이 너무 허술하여 저장할 가치가 없으므로 구성 요소를 완전히 다시 작성하게됩니다. 이 경우에도 이점이 사라집니다.
  • 주재관
    • 스폰서는 점진적 재 설계로 인해 프로젝트에 대한 장기적인 노력이 필요하다는 것을 이해할 수 없습니다. 필연적으로 대부분의 조직은 점진적인 재 설계로 인해 계속되는 예산 낭비에 대한 식욕을 잃습니다. 이러한 식욕 상실은 다시 쓰기에는 불가피하지만, 스폰서는 부분적으로 완전한 새로운 시스템과 부분적으로 쓸모없는 오래된 시스템으로 분리되기를 원하지 않기 때문에 계속해서 기울어 질 것입니다.
    • 시스템 사용자에게 "현재 화면"이 붙어 있습니다. 이 경우 시스템의 핵심 부분 (프론트 엔드)을 개선 할 수있는 라이센스가 없습니다. 재 설계를 통해 새로운 문제로 시작하므로이 문제를 피할 수 있습니다. 그들은 여전히 ​​"같은 스크린"을 요구하지만, 당신은 조금 더 탄약을 가지고 있습니다.

점진적으로 재 편집하는 데 드는 총 비용은 전체 재 작성보다 항상 높지만 일반적으로 조직에 미치는 영향은 적습니다. 내 의견으로는, 재 작성을 정당화 할 수 있고 슈퍼 스타 개발자가 있다면 그렇게하십시오.

당신이 그것을 끝까지 지켜 볼 정치적 의지가 있다고 확신 할 수있는 경우에만 그렇게하십시오. 이는 경영진과 최종 사용자 모두를 의미합니다. 그것 없이는 실패 할 것이다. 나는 이것이 Joel이 나쁜 생각이라고 말하는 이유라고 가정합니다. 경영진 최종 사용자 바이 인은 많은 건축가에게 양두 유니콘처럼 보입니다. 적극적으로 판매하고 완료 될 때까지 지속적으로 캠페인을 진행해야합니다. 그것은 어렵고, 어떤 사람들은 성공하기를 원하지 않는 것에 대한 명성을 쌓는 것에 대해 이야기하고 있습니다.

성공을위한 몇 가지 전략 :

  • 그러나 그렇게하면 기존 코드를 변환하지 마십시오. 처음부터 시스템을 설계하십시오. 그렇지 않으면 당신은 당신의 시간을 낭비하고 있습니다. 나는 비참하게 끝나지 않은 "전환"프로젝트를 본 적이 없다.
  • 한 번에 한 팀씩 사용자를 새로운 시스템으로 마이그레이션하십시오. 기존 시스템에 가장 많은 어려움을 겪고있는 팀을 식별하고 먼저 마이그레이션하십시오. 그들이 입소문으로 좋은 소식을 전하게하십시오. 이렇게하면 새로운 시스템을 내부에서 판매 할 수 있습니다.
  • 필요에 따라 프레임 워크를 디자인하십시오. 실제 코드를 본 적이없는 I-spent-6 개월 건물-이 프레임 워크로 시작하지 마십시오.
  • 기술 스택을 가능한 한 작게 유지하십시오. 과도하게 디자인하지 마십시오. 필요에 따라 기술을 추가 할 수 있지만 제거하기는 어렵습니다. 또한 계층이 많을수록 개발자가 더 많은 작업을 수행 할 수 있습니다. 처음부터 어렵게 만들지 마십시오.
  • 디자인 프로세스에 사용자를 직접 참여 시키십시오. 그러나이를 수행 하는 방법 을 지시 하지는 마십시오. 좋은 디자인 원칙을 따르는 경우 원하는 것을 더 잘 제공 할 수 있음을 보여줌으로써 신뢰를 얻습니다.

25
Joel의 요점은 다시 작성하면 이전 코드에 축적 된 지식을 잃게된다는 것입니다.
quant_dev

14
@quant_dev는 부분적으로 그렇습니다. 그러나 때때로 다시 쓸 때 오래된 시스템의 많은 버그가 오래된 시스템의 작동 방식 때문이라는 것을 깨닫습니다. 이상적인 시스템의 작동 방식과 엄격하게 관련된 논리는 아닙니다.
Tjaart

13
Joel은 다시 쓰는 동안 응용 프로그램에 새로운 기능을 추가하지 않기 때문에 실패 할 것이라고 말합니다. 재 작성의 유일한 목적은 기술 부채의 일부 또는 전부를 제거하는 것입니다. 물론, 이것은 작은 일이 아니지만 경쟁 업체가 기술적 인 부채를 제거하는 동안 소프트웨어에 새로운 기능을 추가하는 경우 위험합니다.
Robert Harvey

25
나는 이러한 모든 기준에 맞는 코드베이스로 작업했지만 + Big Rewrite는 여전히 실패했지만 어떤 방식 으로든 오래된 혼돈과는 매우 다르지만 처리하지 못하도록 반 구현 된 "새로운 거래"코드를 제공함으로써 상황이 악화되었습니다. 훨씬 더 관리하기 쉽습니다. IMO는 리팩토링이 완전히 불가능한 경우에만 오늘날 고객에게 비용을 초래하는 기능 추가 및 버그 수정에서 모든 초점을 제거해야합니다. 진정으로 해독 할 수없는 코드를 말하는 경우가 아니라면 모듈 식 비트를 꺼내서 더 쉽게 재사용 할 수없는 팀은 아마도 어쨌든 큰 rw에 대해 충분히 재구성 할 수 없습니다.
Erik Reppen

11
이것은 유용한 답변이지만 환상적이지는 않습니다. 어떤 것에 대해서는 잘못된 인상을주기 때문입니다. 예를 들어, "점진적 재평가의 총 비용은 항상 전체 재 작성보다 항상 높다 "는 점을 명심하십시오. "점진적 재평가"는 최소한 일부 부분을 재사용 할 수있는 기회를 제공하기 때문에 해당 문장에서 "항상"이라는 단어는 잘못되었습니다 "완전한 재 작성"은 제공하지 않지만 기존 디자인의 필자는 실제로 그 상황에 있었기 때문에 100K 이상의 LOC 응용 프로그램을 부분적으로 전체 또는 부분적으로 다시 작성하지 않았다는 것을 알고 있습니다.
Doc Brown

109

나는 두 번의 큰 재 작성에 참여했습니다. 첫 번째는 작은 프로젝트였습니다. 두 번째는 소프트웨어 회사의 주요 제품이었습니다.

몇 가지 함정이 있습니다.

  • 다시 쓰기는 항상 예상보다 오래 걸립니다.
  • 재 작성은 고객에게 직접적인 영향 / 혜택이 없습니다.
  • 다시 쓰기 전용 용량은 고객을 지원하는 데 사용되지 않습니다.
  • 100 % 문서가 없으면 다시 작성하면 기능이 손실됩니다.

재 작성은 실제 답변이 거의 없습니다. 아무것도 잃지 않고 많은 위험없이 코드를 리팩토링 할 수 있습니다.

다음과 같은 경우 다시 쓰기가 답이 될 수 있습니다.

  • 다른 언어 나 플랫폼으로 전환하고 있습니다.
  • 프레임 워크 / 외부 컴포넌트를 전환하고 있습니다.
  • 기존 코드베이스는 더 이상 유지 관리 할 수 ​​없습니다.

그러나 리팩토링을 사용하는 느린 접근 방식을 강력히 권장합니다. 덜 위험하고 고객을 행복하게합니다.


11
리팩터링 접근법 +1 기존 시스템을 다시 작성하고 유지 관리 할 시간이나 인력이 부족한 경우가 많습니다.
Ryan Hayes

이것은 현재 데모 앱에 사용됩니다 (최근에 구매 한 고객이 없으며 지금은 가장 좋은 시점이라고 생각합니다).
Jonn

4
@John : 경영진으로서 영업 팀이 아직 고객을 확보하지 못한 응용 프로그램을 다시 작성하는 것은 어려운 일입니다. 정직하게 말해서, 나는 일정 시간을주고 나서 무엇을해야할지 결정했습니다. 관심이 없으면 모든 것을 버리고 다른 것을 선택합니다.
NotMe

4
최근에 Visual Basic 응용 프로그램을 Java로 다시 작성했습니다. 이를 통해 Windows (Java GUI 없음)에서 서비스로 실행할 수있게되었으며 고객에게 이익이되었습니다.

4
"재 작성은 고객에게 직접적인 영향 / 혜택이 없습니다"– 새로운 프레임 워크는 구현이 불가능하거나 비용이 많이 드는 많은 생산성 향상 기능을 "내장"으로 제공하기 때문에 종종 신화입니다. 예를 들어 vb6 앱을 .net 앱으로 업그레이드하면 사용자는 64 비트 아키텍처로 인해 더 큰 파일을 열 수 있으므로 최종 사용자가 인위적으로 작업을 중단 할 필요가 없습니다.
Stephen

72

다음과 같은 경우 다시 작성해야합니다.

응용 프로그램을 다시 작성하고 다시 작성하는 응용 프로그램을 유지 관리하는 비용은 시간이 지남에 따라 현재 시스템을 유지 관리하는 비용보다 적습니다.

현재를 유지하는 데 비용이 많이 드는 몇 가지 요소 :

  • 언어는 너무 오래되어서 프로그래밍 할 때 많은 돈을 알고있는 사람들에게 비용을 지불해야합니다 (COBOL).
  • (안타깝게도 경험에 비추어 볼 때) 시스템은 너무 오래된 하드웨어 아키텍처를 사용하므로 더 이상 만들어지지 않았기 때문에 Ebay 및 COLLECT 부품을 실행하여 실행중인 시스템에 추가해야합니다. 이를 "하드웨어 수명 지원"이라고하며 부품이 점점 부족해지면서 가격이 상승하거나 결국에는 완전히 소진되기 때문에 비용이 많이 듭니다.
  • //Here be dragons.주석이 코드 전체에 걸쳐 너무 복잡해 졌습니다.
  • 이 못생긴 짐승을 항상 패치하기 때문에 다른 프로젝트를 작성하고 회사에 새로운 가치를 더할 수 없습니다.

그것이 바로 내가 참여한 다시 쓰기를 자극 한 이유입니다. 코드는 매우 약하고 새로운 기능을 추가하는 비용이 너무 높아서 다시 쓰지 않는 것이 더 이상 옵션이 아니 었습니다.
Frank Shearar

16
포인트 2에 대해 낄낄 거립니다.
Paul Nathan

4
@Paul : 클라이언트가 나에게 그렇게 말한 후에도 그들이 심각하다는 것을 알았고 다시 작성하기 위해 요구 사항을 수집하고 있음을 알았습니다. 정말 신나는 하루였습니다.
Ryan Hayes

3
문제는 비용을 측정하는 방법입니다.

2
나는이 반응이 재미 있고 진실 된 것을 좋아한다. "적은"바로 앞에 "정량적으로"를 추가하고 싶습니다. 여러 번 주장을하기는 쉽지만 낭비되는 시간을 정량화하는 것이 중요합니다.
Kevin Hsu

17

프로젝트의 구조에 근본적인 변화를 요구하는 경우는 아마도 새롭게 시작하는 시간.

그럼에도 불구하고 새로운 프로젝트에서 재사용 할 가치가있는 코드가 많이있을 수 있습니다.

그래도 공정한 경고에 유의하십시오. 현재 프로젝트는 비즈니스 규칙을 테스트하고 처음부터 실제로 시작하지 않은 수많은 실제 사용 시간으로 수정했습니다.

나는 시간 틀이나 직감이 그러한 과감한 조치의 적절한 척도인지 의심한다. 이 행동 과정에 참여할 분명 하고 방어 적 이며 잘 이해 된 이유가 있어야합니다 .


3
'대규모의 코드를 다시 서명'하는 데 매우주의해야합니다. 이는 사용되지 않는 레거시 코드와 열악한 코드 구조로 이어질 수 있습니다. 리팩토링은 제 생각에 더 나은 솔루션입니다.
mrwooster

1
동의했다. 그 진술의 일부는 '새로운'프로젝트에서 '리 팩터'로 해석되어야합니다. 즉, 이미 그 과감한 길에 이미 헌신 한 경우입니다. 다른 사람들이 언급했듯이 이것은 거의 수행해서는 안되는 극단적 인 희귀 성입니다.
Dan McGrath

1
+1. 또한 다시 작성하는 데 시간이 걸리며 유지 관리를 수행해야하지만 두 코드 기반에서 동일한 변경을 수행해야합니다.
Larry Coleman

12

나는 Kramii의 답변과 Joel의 의견에 동의하지만 다시 작성하는 것이 적절한 경우가 있습니다. 수명이 긴 애플리케이션 (10-20 년 이상 이야기)에서 시간이 지남에 따라 유지 관리 비용이 점점 더 비싸집니다. 빠른 유지 보수 패치를 위해 원래 아키텍처가 희생됨에 따라 코드가 점점 더 스파게티 화되기 때문입니다. 또한 오래된 기술의 개발자는 점점 더 비싸지고 비싸집니다. 마지막으로, 하드웨어는 노화되기 시작하여 기존 애플리케이션을 실행할 새로운 하드웨어, 운영 체제, 프레임 워크 등을 찾기가 점점 더 어려워지고 있습니다. 또한 비즈니스는 발전하고 있으며 구형 시스템은 새로운 시스템뿐만 아니라 조직의 비즈니스 요구를 충족시키지 못할 가능성이 높습니다.

따라서 새로운 유지 보수 비용과 새로운 시스템이 비즈니스에 제공 할 수있는 잠재적 인 이점을 모두 처음부터 다시 작성하는 비용과 비교해야합니다. 수 아주 재 작성의 비용에 대한 견적에 비관적. 거의 항상 비용이 많이 들고 생각보다 오래 걸립니다.



11

중지! 재 작성은 거의 답이 아닙니다 . 종종 리팩토링이 더 나은 방법입니다.


물론, 거기에 있는 재 작성 정당화 할 때가 :

  • 마이그레이션 도구가 존재하지 않거나 저렴하게 쓸 수없는 새로운 플랫폼으로 전환하고 있습니다.
  • 다시 작성할 응용 프로그램은 간단합니다.
  • 원래 응용 프로그램의 소스 코드가 손실되고 복구 비용이 다시 작성하는 것보다 비쌉니다.
  • 기존 응용 프로그램으로 캡슐화 된 대부분의 비즈니스 규칙은 더 이상 적용되지 않습니다.
  • 기존 코드의 활성 사용자는 거의 없습니다.
  • 재 작성을 수행 할 자원 (시간, 재능 및 도구)이 있습니다.
  • 법적 또는 실제적인 이유로 프로덕션 환경에서 기존 응용 프로그램을 실행할 수 없습니다.

다시 쓰기보다 리팩토링을 권장하는 이유를 이해하려면 다시 쓰기와 관련된 사항을 고려하십시오. 당신은해야합니다 :

  1. 기존 응용 프로그램의 뉘앙스를 이해하십시오. 캡슐화하는 모든 미묘한 비즈니스 규칙, 그것이 작동하는 환경 (인간 및 기술적) 및 현재 솔루션의 장단점을 고려할 때 일반적으로 사소한 것은 아닙니다. 이 정보가 존재하는 유일한 장소는 (존재하는 경우) 기존 응용 프로그램의 소스 코드에있는 경우가 많습니다. 재 작성을 수행하는 주된 이유 중 하나는 기존 코드를 이해하고 유지하기가 어렵다는 것입니다.

  2. 테스트되고 신뢰할 수있는 새 응용 프로그램에서이 기능 (또는 업데이트 된 버전)을 재현하십시오. 기존 코드는 개발자가 이해하지 못할 수도 있지만 일반적으로 사용자가 잘 이해합니다. 현재 비즈니스 요구 사항을 충족하지 못할 수도 있지만 최소한 다양한 상황에서 응용 프로그램의 기능을 알려줄 수 있습니다.

리팩토링의 큰 장점은 다음과 같습니다.

  • 한 번에 하나의 작은 조각을 가져갈 수 있습니다.
  • 기존의 작동중인 응용 프로그램과 관련하여 모든 변경 사항을 테스트 할 수 있습니다.
  • 기존 코드의 작동 방식에 대한 가설은 약간의 변경을 수행하고 발생하는 사항을 관찰하여 테스트 할 수 있습니다.
  • 변경 사항은 종종 한 번에 모든 단계가 아닌 단계적으로 사용자에게 전달 될 수 있습니다.
  • 리팩토링 초기 단계에서 학습하면 리팩토링의 이후 단계에 정보를 제공 할 수 있습니다.
  • 프로세스를 도중에 버려도 사용자 나 개발자에게 혜택을 제공하기 위해 완료 해야하는 다시 쓰기와는 대조적으로 더 깨끗한 코드 기반이라는 이점이 있습니다.

다시 작성하면 많은 새로운 버그가 발생하고 새로운 코드베이스에 혼란이 가해집니다.


2
리팩토링이 재 작성보다 더 자주 왜 더 나은지 설명하면서이 답변을 확장 할 수 있습니까? 그리고 때 것입니다 재 작성은 해답이 될?
gablin

가장 자주 다시 작성하는 것이 다른 복장에서 동일한 엉망이라는 사실을 감안할 때 당신은 옳습니다. 그 단일 문제를 제거 할 수 있다면 틀린 것입니다. 올바른 사람들이 할 때 절대적인 것은 없습니다.
JensG

10

이 그래픽은 응용 프로그램의 코드 기반 품질 및 비즈니스 가치에 따라 달라질 수 있습니다.

여기에 이미지 설명을 입력하십시오

차트는 레거시 소프트웨어의 리엔지니어링이 정당화 될 때와 그렇지 않은 경우에 대한 가이드 인 것처럼 가장합니다. 예를 들어 소프트웨어의 비즈니스 가치가 높고 코드 품질이 좋지 않은 경우 리엔지니어링이 정당화됩니다.


4
왜 비즈니스 가치가 낮은 프로젝트를 재 작성하는 데 투자 하시겠습니까? 그냥 긁어!
Jørgen Fogh 2016 년

그것이 "대체 또는 ..."라고 말하는 이유입니다. 가치있는 것을 대신 할 수 있습니다. 또는 가치있는 무언가로 만드십시오. 그러나 당신은 요점을 가지고 있습니다. "스크랩 제거"옵션을 추가하기 위해 편집하겠습니다.
Tulains Córdova 2016 년

8

나는 내 직업에서 큰 재 작성이 답인 유일한 상황에 있다고 생각합니다.

회사 합병, 시스템 기능면에서 겹침 많은 시스템이 병합 및 폐기되었으며 다른 시스템은 여전히 ​​처리 중입니다.

나는 여전히 살아있는 다른 회사로부터 시스템을 물려 받았습니다. 그것은 거대한 코드베이스를 가지고 있으며 우리 부서와 매우 유사하지만 완전히 다른 디자인과 프레임 워크를 가진 여러 부서를 지원하는 데 사용되었습니다. 그것을 사용하는 비즈니스 부문이 하나뿐이므로 좀비 상태 에서이 일을 살릴 수있는 충분한 돈을 벌 수 있습니다. 모든 오래된 전문 지식이 사라졌으며 문서가 없습니다. 지원 부담은 높고 매주 실패합니다. 회사가이 특정 비즈니스 부문을 지원 한 적이 없기 때문에 회사 시스템에 통합되지 않았으므로 기능이나 전문 지식이 없습니다.

이것이 다시 쓰기가 필요한 경우 인 것 같습니다. 이 거대 거인을 알아 내고,이 비즈니스 전용 기능의 비트를 뽑아 내고, 기존 시스템에 추가해야 할 부분을 다시 써야 할 것 같습니다. 그렇게되면 기존 시스템이이 새로운 부문을 지원할 수 있으며이 짐승은 불행에서 벗어날 수 있습니다. 그렇지 않으면 나는 정신을 잃을 것이다.


고용주가 고객과 대화하고 상황을 설명하여 고객을 도울 수있는 최선의 방법이 무엇인지 알아 내야합니다. 장기적으로 비용을 절약하기 때문에 초기에 더 많은 비용을 지불해야하는 경우에도 마찬가지입니다.

7

Y2K를 처리하도록 업그레이드 된 두 개의 DOS 응용 프로그램이있는 소규모 소프트웨어 회사에서 일한 후 Windows 16 비트 응용 프로그램으로 다시 작성된 다음 하나의 추가 '작은'기능을 갖춘 32 비트 응용 프로그램으로 완전히 다시 작성했습니다. 전체 고객에게 영향을 미치는 1 명의 고객).

한 사람이 한 달에 16 비트 코드를 32로 옮기는 것이 가능했지만 NOOOOOOOOO, 우리는 Soooooooooo가 훨씬 더 나아지도록 다시 작성해야했습니다. 이것은 다른 산업에 적용될 수 있으며, 시작하기 전에 전체 사양과 의사 코드를 가질 수 있습니다. 사양이 만들어졌지만 실제 코드를 작성하는 데 시간이 걸리지 않았습니다. 그것은 16 비트 '시작'보다 더 많은 버그로 늦게 릴리스되었습니다 (v.3.0에 있었고 마지막으로 누군가가 새로운 버그를보고하지 않고 거의 일주일에 한 지점까지).

동일한 응용 프로그램을 3-4 번 다시 작성하면 약간의 개선이 이루어질 것이라고 생각하지만 GUI 프런트 엔드가 그렇게 많이 정당화 될 수는 없다고 생각합니다.

이것은 기술 지원 책임자로서의 첫 번째 IT 작업이었습니다. 배포 용 소프트웨어를 개발하지 않는 방법에 관한 책을 써야합니다. 분명히 많은 실수를했지만 응용 프로그램을 계속해서 다시 작성한다는 사실은 부적합을 심화 시켰습니다.


5

코드와 Struts를 사용하지 않는 경우와 매우 유사한 경우가있었습니다. 내가 대신 한 것은 특히 엉뚱하고 많은 문제를 일으키는 대상 지역이었습니다. 이 목표 접근 방식은 점진적으로 개선되었습니다.

2 년 동안 우리는 개선 작업과 함께 비트와 조각을 리팩토링하는 작업을했습니다. 우리는 항상 '경화'작업을 프로젝트 계획으로 수행했습니다. 제대로 작동하지 않는 특정 영역에 집중함으로써 우리는 벅에 가장 큰 타격을 입었습니다. 효과가 있었던 것은 우리가 홀로 남겨둔 것입니다. 또한이 작업은 정상적인 개발 과정에서 수행되어 릴리스되었다는 것이 중요합니다. 큰 재 작성 문제는 1 년 이상 지속되었다가 다시 돌아올 때마다 모든 것이 바뀌고 불쾌한 버그가 완화되어 ROI를 잃어버린 것입니다.

우리는 모든 것을 다시 쓰지 않았습니다. 우리는 그 플랫폼을 새로운 작업에 사용하지 않고 새로운 프로젝트를위한 새로운 플랫폼을 만들었습니다. 승인을 받고 합리적인 시간 내에 훌륭한 제품을 제공했습니다.


5

그래서 여기 책상에 앉아 큰 aspx 파일 하나의 절대 혼란에 대한 코드를 작성하고 그 뒤에 데이터베이스를 작성하고 MS Access 인터페이스를 MsSQL로 대체하기 시작했습니다.

이 ASP 프로그램은 다음과 같은 것들로 가득합니다.

  • include(close.aspx) 내부에는 마지막으로 열린 데이터베이스 연결을 닫는 한 줄의 코드가 있습니다.
  • 레거시 코드가 무작위로 주석 처리되었습니다.
  • 보안 고려 사항 없음
  • 스파게티 코드, 수천 줄. 하나의 파일로 모두.
  • 이름 뒤에 명확한 의미가없는 함수와 변수

약간의 변화가 필요하다면, 악몽 모드에서 kal-toh의 5 번의 동시 게임을하는 것과 같습니다.

나는 기능을 복제하고 업계의 다른 사람들이 사용자 정의하고 판매 할 수있는 제품을 만들기 위해 고용되었습니다. 문제는이 문제가 지난 10 년 동안 모든 단일 비즈니스 요구를 충족시키기 위해 쓰여졌다는 것입니다.

우리가 제품을 팔고 싶지 않다면 아마도 그들이 원하는 대부분의 일을하기 때문에 다시 쓰지 않아도되었을 것입니다. '같은 일을하십시오.'


4

: Spolsky 조엘이에 훌륭한 기사가 당신이 할해서는 안 것들, I 부

당신이 말할 수있는 제목에서, 그것은 한면 (그는 왜 코드를 던져서는 안되는지에 대해 이야기합니다) IMO, 그것에 많은 진실이 있습니다. 나는 최근에 일부 개발자들이 말한 Excel 25 주년에 채널 9 비디오를 보았습니다. 오늘도 소스를 살펴보면 개정판을 확인하고 20 년 전에 작성된 Excel에서 사용한 코드로 돌아갑니다.

당신은 100 % (심지어 넷스케이프 Joels 조)에서 (실수를 할 때) 확인 될 수없는 나는 조엘의 기사는 하나님이 보낸 것처럼 내가 비관적이 될 수 있으며, 코드 사고가 난 항상 두 번째 더 잘 쓸 수 버리는 사랑하기 때문에, 느낌 시간, 그러나 나는 지금 단지 이것이 비용이 많이 드는 것을 깨달았습니다 .

구체적으로 대답하려면 철저한 비용 대 가치 분석 을 수행해야 한다고 말하고 싶습니다 .

내 현실 세계 : Silverlight 앱 지금까지 v0.6을 개발 중이므로 코드를 복잡하게 만드는 비동기 호출이 엉망입니다. 이번 주에 Reactive Extensions를 발견 한 후 실제로 대부분의 코드를 다시 작성하려고하지만 고객에게 무엇을 알려야합니까? 이 프로그램은 완벽하게 잘 작동하지만 (일부 메모리 누수가 발생하더라도) 신경 쓰지 않습니까? 나는 그들에게 무언가를 다시하고 싶어서 2-3 주 더 걸린다고 말할 수는 없다. 그러나 코드분기하고 자유 시간에 코드를 다시 작성 / 재생합니다 .

내 2 센트 만 괜찮아요!?


디자인 할 때 아직 모르는 것이 있기 때문에 첫 번째 구현은 종종 차선책입니다. 일반적으로 올바른 작업을 수행했기 때문에 처음부터 시작하는 대신 모양으로 리팩터링 할 있습니다. 그렇지 않은 경우 이는 개념 증명이므로 자주 폐기해야합니다.

분기의 경우 +1 많은 사람들이 오래된 코드를 버리고있는 것처럼 보이기 때문에 "다시 쓰지 마십시오"라고 말합니다.하지만 그렇지 않습니다. 병렬 코드베이스를 가질 수 있습니다.
lunchmeat317 1

공정하게 말해서, 당신이 Joel Spolsky에게 조언을 구하는 사람이라면, 당신은 완전히 다시 쓰지 말아야합니다. :-) 그렇지 않으면, 모든 이해 당사자들이 Joel의 주장이 중요하지 않은 이유를 설득 할 수있는 경우에만 다시 쓰십시오. 특정한 경우에.
gnasher729 2016 년

3

기존 솔루션은 확장되지 않습니다.

MS Access를보고 있습니다.


당신이 올바른 것을보고 있는지 잘 모르겠습니다. Jet Red는 AFAIK로 확장 할 수 없었습니다.
JensG

이것은 질문에 어떻게 대답합니까?
gnat

3

Joel에 따르면, 큰 재 작성은 회사가 할 수있는 최악의 전략적 실수하나입니다 .

하지 말아야 할 것, 1 부

... 처음부터 시작할 때 처음 보다 더 나은 일을한다고 믿을만한 근거없다는 것을 기억하는 것이 중요합니다 . 우선, 버전 1에서 작업 한 것과 동일한 프로그래밍 팀이 없을 수도 있으므로 실제로 "더 많은 경험"이 없습니다. 오래된 실수를 대부분 다시 만들고 원래 버전에는 없었던 몇 가지 새로운 문제를 소개합니다.

낡은 만트라 는 버려야하는 대규모 상업 응용 프로그램에 적용 할 때 위험합니다. 실험적으로 코드를 작성하는 경우 지난 주에 더 나은 알고리즘을 생각할 때 작성한 함수를 제거 할 수 있습니다. 괜찮아. 사용하기 쉽도록 클래스를 리팩토링 할 수 있습니다. 그것도 괜찮습니다. 그러나 전체 프로그램을 버리는 것은 어리석은 짓이며, 넷스케이프가 실제로 소프트웨어 산업 경험을 가진 성인의 감독을 받았다면, 그렇게 나쁘게 발을 딛지 않았을 수도 있습니다.


5
네. 나는 그것에 반론을 찾고 있었다. 때때로 수행해야합니다.
Jonn

3
Joel의 기사를 참조하지 않고 모든 다시 쓰기 인수가 완전하지는 않습니다. 내가 말한 것은 기사에 몇 가지 좋은 점이 있지만 자신을 생각하는 것을 망칠 수 있습니다. 아마도 당신은 왜 기사에 동의하는지 말해야 할 것입니다. 나는 개인적으로 Joel에 동의하지 않습니다. 간혹 구덩이 속으로 빠져 나가는 것보다 새로운 구멍을 파는 것이 더 낫기 때문입니다. 어쨌든, 재 작성은 잠재적 인 비즈니스 프로세스를 재평가를 위해 표면에 가져올 것이라고 생각합니다.
Ahmad

Joels의 기사는 나쁜 일 어떻게 진행될 있는지주의 깊게 설명합니다 .

6
Joel은 Netscape Navigator 브라우저의 예를 사용합니다. 그것은 큰 예산으로 경쟁에 대항하는 거대한 성장 곡선의 한가운데에 있었던 소비자 제품입니다. Netscape에게는 전략적인 실수였습니다. 반면, 내부 사용자 정의 "엔터프라이즈"소프트웨어 프로젝트는 다릅니다. 당신은 시장 점유율을 서두르지 않습니다. 모든 사용자가 경쟁력있는 제품을 떠날 위험은 없습니다. 그것은 비즈니스 결정에 달려 있습니다 : 재 작성 비용이 장기적으로 스스로를 지불하고 /하거나 비즈니스 목표를 달성하는 가장 좋은 방법입니까?
Scott Whitlock

나는 Joel이 "열심히 배워야한다는 결정이 문서화되어 있지 않은지 전혀 모른다"는 핵심 개념에 부딪쳤다 고 생각했습니다.
MathAttack

2

절대로 리팩터링하지 마십시오. 진실은 코드가 당신에 의해 작성된 것입니다-당신은 더 잘 할 수 없습니다.

기술을 바꾸고 싶지 않다면 코드에 구조가 부족합니다 (필자는 PHP 웹 사이트에서 아주 오래 전에 그것을 보았습니다. 작성자는 include / class / function 대신 spahgetti를 복사 / 붙여 넣기했습니다). 매우 나쁘게 쓰여졌습니다.

모든 것은 블랙 박스로 설계되어야합니다. 모듈 식, 간단한 API, 내부에있는 것이 ... 덜 중요합니다 :) 스파게티가 있으면 블랙 박스 내부에서 닫을 수 있으므로 좋은 코드를 오염시키지 않습니다.



+1 귀하의 의견이 마음에 듭니다. 새로운 API 세트로 ​​다시 작성하는 것에 대한 귀하의 생각을 알고 싶으십니까? (아래 내 답변 참조)
gideon

예, 이것들은 좋은 지적입니다. Microsoft는 winXP 코드를 다시 작성했으며 최초 Vista 정품 버전에서는 파일 삭제 / 복사를 할 수 없었습니다. 그들이 코드베이스를 발전시킬 때 우리는 지속적으로 더 나은 품질을 얻고 있지만 (W3.11 => W95 => W98 => ME => XP) Vista는 많은 핵심 부분을 재 작성한 것이 재앙이었습니다. 새로운 API의 경우 ... 현재 코드를 손상시키지 않고 분리하고 더 높은 계층에서 새 API를 사용합니다. 예 : 핵심 클래스는 그대로 유지되지만 새로운 API를 사용하여 통합됩니다. 모든 것이 너무 지저분하지 않으면 0부터 시작하는 것 외에는 아무것도 할 수 없습니다.
Slawek

1
"... 진짜로 코드를 작성했다면 더 잘 할 수 없을 것입니다." 담당자가 충분하면이 게시물에 투표를 하시겠습니까? 그것은 패배하고 비현실적이며 사람들이 어떤 방식 으로든 그들이 작성한 코드가 과거에 작성한 코드를 개선 한 것으로 발전 할 수 없다는 것을 암시합니다.
JᴀʏMᴇᴇ

1
@ JᴀʏMᴇᴇ : 동의-처음으로 구현할 때 아무것도 배우지 못하고 경험을 얻지 못했거나 더 많은 지식 / 경험 / 지견을 가지고 더 나은 일을 할 수 없다면; 당신은 프로그래머가 아닌 감자입니다.
Brendan

2

다시 쓰기를 정당화하는 주된 이유는 플랫폼 변경 때문이라고 생각합니다. 예를 들어 Windows 데스크톱 GUI 응용 프로그램이 있고 회사 소유자가 다음 버전을 웹 기반 응용 프로그램으로 사용하기로 결정한 경우. 항상 그런 것은 아니지만, 원래 개발자가 모듈 식이고 재사용 가능한 코드를 거의 작성하지 않은 경우를 제외하고는 대부분의 경우이 작업을 다시 작성해야합니다.


2

"XI로 갈 예정이라면 여기서부터 시작하지 않을 것"이라는 고전적인 농담이 있습니다.

나는 한 번 일을했는데, 고용주의 주된 동기는 비즈니스 크리티컬 한 앱을 오랫동안 재 작성하기 위해 인재를 배에 태우는 것이었다. 내가 묻지 못한 질문은 왜이 상황에서 처음에 왔습니까? 원인이 있었는지 여부에 관계없이 적기 였을 것

  • 짐승을 유지하고 점진적으로 리팩터링하는 기능을 추가해야하는 압력이 너무 많음

  • 부서에서 너무 적은 능력,

  • 점진적인 작업을 위해 고객 또는 관리인이 너무 적음

또는 무엇이든지, 그리고 이것은 문제가 참을 수없는 수준에 도달 할 때까지 ster 거리게합니다.

따라서 대규모 재 작성이 아마도 매우 나쁜 생각이라는 점에서 Joel과 동의 할 것입니다. 주요 재 작성이 필요한 이유의 근본 원인이 모두 해결되었다는 확고한 증거가 없다면 , 귀하는 가능성이 높습니다 적절한 과정에서 문제를 반복 할 것입니다.


2

재 작성을 통해 조직이 경쟁 우위를 점하거나 현재 아키텍처가 수용 할 수없는 방식으로 고객에게 더 나은 서비스를 제공 할 수있는 전략을 추구 할 수있는 경우가 정답입니다.

대신, 재 작성은 종종 관리 문제를 완화하기 위해 발생합니다.

  • 모든 것이 .NET에 있어야합니다.
  • 개발자들은 코드가 짜증나고
  • 우리는 기술적으로 뒤쳐지고 있습니다.
  • 시스템을 지원할 리소스를 찾을 수 없거나 매우 자주
  • 10 년이 지났으므로 시간입니다.

이러한 걱정의 대부분은 구체화되지 않으며, 만일 그렇다면, 처리 될 수 있습니다. 그러나 마지막 것은 최악입니다. 본질적으로 : 우리는 이유가 없습니다.

예, 자동차와 마찬가지로 시스템에 마모 징후가 나타납니다. 일상적인 서비스를 통해이를 완화 할 수 있습니다. 약간의 예방 유지 보수가 먼 길을가는 것에 대해 그들이 말하는 것을 알고 있습니다. 투자로서 일상적인 서비스 (예 : 리팩토링 및 표준화)는 거의 항상 재 작성보다 비용이 적게 듭니다.

그러나 결국 재 작성이 필요할 것으로 예상해야합니다. 날짜를 설정하고 임시 계획을 세우십시오. 그러나 날짜가 다른 전략적 목표를 실현하기 위해 지연이 가까워 질수록 다음과 같은 설득력이 있습니다.

최근 몇 년간 우리는 적시에 또는 비용이 많이 드는 방식으로 그들의 요구를 수용 할 수 없었기 때문에 큰 계정을 확보 할 기회를 잃었습니다. 우리 시스템은 확장 가능한 아키텍처를 사용하여 다시 작성되어 커스터마이제이션을 연결할 수 있습니다 (현재와 같이 하드 코딩되지 않음). 이를 통해 특별한 요구가있는 고객을 수용하는 시간과 비용이 크게 줄어 듭니다. 더 많은 계정을 확보하고 현재 고객의 요구를 더 잘 충족시킬 수 있습니다.


그 방향으로 리팩토링 할 수 있어야합니다. 리팩토링 할 때는 다음 기능을 쉽게 작성할 수 있도록 필요한 유연성을 만들어야합니다.
Ian

1

원하는 기능을 제공하려면 완전히 새로운 기술로 전환해야합니다.

"완전히 새로운": 다시 작성하려고하지만 동일한 플랫폼을 사용하려는 경우 리팩토링 및 신중한 재구성이 더 나은 솔루션 일 것입니다. 여기서 사용되는 "플랫폼"은 다소 모호합니다. 언어를 포함하고 OS (Linux에서 Windows로 확장하거나 그 반대의 경우도 마찬가지)를 고려하지만 프레임 워크는 아닙니다 (예 : Struts를 Spring으로 교체).

"원하는 기능을 제공 할 필요가있다": 2000 년 무렵, 자바에서 주요 서버 구성 요소를 C ++에서 다시 작성하여 즉시 사용 가능한 스레딩, 객체 캐시 및 클라이언트 제어 트랜잭션을 가능하게하는 프로젝트를 시작했다. 그 당시에는 지원해야 할 C ++ 용 스레딩 라이브러리가 여러 개 있었으며 데이터베이스 코드의 대부분을 스레드 가능하게하려면 거의 전체를 다시 작성해야했습니다. 클라이언트 제어 트랜잭션에 관해서는 ... 이전 아키텍처에서는 발생하지 않을 것입니다.

그럼에도 불구하고 현재 시스템의 동작에 대한 자세한 지식을 갖고 11 년 동안 사마귀가 많이 발생하지 않은 비교적 깨끗한 코드라는 점을 제외하고는 다시 쓰지 않았을 것입니다.


0

다시 시작해야 할 시점을 결정하려면 현재 프로젝트에서 계속되는 가치가 처음부터 가치에 미치지 못하는 부분을 해결해야합니다.

이것이 어려운 이유는 실제로 시작할 때까지 새 프로젝트에서 팀의 개발 속도를 정확하게 추정하기 때문입니다. 즉, 새 프로젝트에서 개발 속도에 대한 매우 보수적 인 추정치를 사용하여 프로젝트가 가치있는 투자 수익을 제공 할 것으로 예상되면 새로 시작할 비즈니스 사례가 있습니다.


0

내 측정 항목을 사용하면 다시 쓰기를 정당화하기 위해 두 가지 조건을 만족시켜야합니다.

  1. 재 작성 후 새로운 기능은 더 쉽고 빠르며 버그가 적습니다.
  2. 재 작성은 현재 새 기능을 추가하는 것보다 시간이 덜 걸리거나 같습니다.

그럼에도 불구하고 다시 쓰기 범위를 제한하려고합니다. 예를 들어, 모듈성에 대해 모르는 C 프로그래머의 사고 방식으로 C ++로 작성된 회사의 일부 레거시 소프트웨어가있었습니다. 최종 결과는 여러 클래스와 DLL에 걸쳐있는 유한 상태 머신 형태의 speghetti 코드였습니다. 우리는 코드에 내장 된 가정과는 매우 다른 새로운 요구 사항이 있었으며이 회사의 특허 가치 부가 고객의 일부가 될 것입니다.

다른 기능을 구현하는 코드와 함께 시간을 보낸 후, 몇 가지 스위치 설명 중 변경해야 할 스위치 문 등을 파악하는 데 얼마나 오래 걸 렸는지 잘 알고있었습니다. 거대한 유한 상태 머신-기존 코드를 확장하는 것보다 시간이 덜 걸립니다. 나는 3이었던 DLL을 하나의 DLL로 통합하고 훨씬 중요한 객체 지향 구조를 제공하여 중요한 새로운 기능을 훨씬 쉽게 수행하고 새로운 기능을 쉽게 추가 할 수있게했습니다.

다시 작성해야하는 라이브러리를 사용하는 다른 세 가지 응용 프로그램이 있었으므로 해당 프로그램을 완전히 다시 작성하고 싶지는 않았습니다. 범위는 라이브러리와 라이브러리를 기존 소프트웨어에 바인딩하는 데 필요한 것으로 제한되었습니다. 내 추정치가 크게 떨어지지 않았고 작업 비용은 스스로 지불했습니다. 재 설계 직후에 새로운 기능을 추가해야했습니다. 오래된 구조로 일주일이 걸렸던 것은 새로운 구조로 하루 만 걸렸습니다.


0

OP는 프로젝트의 범위를 나타내지 않지만 내가 취한 주요 단서는 "오래된 [libs]를 사용하여 오래된 [언어 / 방언]으로 작성되었습니다."라는 글은 다시 작성의 주요 동인입니다. 실제로, 시장 장수 기간이 길었던 대부분의 프로젝트는 결국 컴파일러 / 통역사 / 운영 체제 업데이트를 수용하는 것이 코드 기반을 유지 관리하는 데 중요한 작업이라는 것을 깨닫게됩니다.

요컨대, 나는 다시 쓰기 단계를 계획하고 libs의 업데이트 우선 순위를 매길 것입니다. 그 과정에서 다른 최적화를 몰래 엿볼 수도 있지만, 이후 단계에 대한 일부 변경 사항을 연기 할 계획은 일정을 유지하고 "고착되지"않는 좋은 방법 일 수 있습니다.


0

글쎄, 기존 코드베이스를 버릴 수있는 가상 시나리오를 상상할 수 있습니다 (버키 볼의 무게와 부피가 0 인 가상의 상황, 간과 된 기능과 버그를 추가하기 위해 몇 주 또는 몇 달의 생산성을 잃어 버릴 경우 아무도 신경 쓰지 않습니다) 시스템에 대한 수정 및 시스템이 너무 사소하고 조직이 싫어하는 곳으로 10 분 만에 서버의 모든 것과 군대를 메모장 ++ 및 넷북으로 대체하고 모든 사람의 생산성과 도덕성을 향상시킬 수 있습니다.)

거의 모든 실제 시나리오에서 리팩토링을 권장합니다. ^ _ ^. 문서화되지 않은 법률 및 비즈니스 요구 사항이 팝업되기 시작하고 마지막 순간을 함께 해킹하는 마지막 순간이 다시 시작될 때 다시 예상 할 수없는 숨겨지고 예상치 못한 비용이 너무 많은 경향이 있습니다.

== 더 좋은 것을 위해 리팩토링을하고 물건 ==

기존의 증분 방식으로 레거시 코드를 리팩토링

  1. 기회가 있다면 UML로 변환하고 작은 아키텍처가 무엇인지 문서화하십시오.
  2. 버전 관리를 사용하는 경우 일부 코드 이탈 보고서를 생성하고 어떤 파일 및 파일 섹션이 가장 자주 변경되었는지 파악하십시오. 그들이 당신이 먼저 다루고 싶을 영역이 될 것이므로 이것들을 기록해 두십시오.
  3. 코드를 변경하기 전에 항상 테스트 범위를 추가하십시오 (추악한 전체 스택 기능 테스트도 수행됨). 복잡한 복잡한 절차 코드 추출 로직을 다루는 경우 합리적으로 명명 된 메소드 또는 함수로 변경하고 가능한 경우 새 메소드를 확인하는 테스트 케이스를 추가하십시오. 신이 끔찍한 해킹을 할 수 있도록하고 가능한 경우 여백 폭이나 제목과 같이 일반적으로 조정 된 변경 사항이 있으면 변경 사항을 매개 변수화하여 다음 번에 업데이트하는 것이 조금 더 간단합니다.
  4. 어댑터 패턴을 사용하고 논리적으로 명명 된 클래스 및 메소드로 크래커 코드의 숨겨진 비트를 숨기면 대부분의 일반적인 작업에서 다른 개발자가 수행하는 무서운 비트에 대해 걱정할 필요가 없습니다. 당신이 그 날의 일상 생활을 망치지 않도록 살인 된 좀비 전 가족 구성원을 헛간으로 유지하는 멋진 가족과 같이, 그 훌륭한 작은 깨끗한 방법과 수업 뒤에 당신은 그 레거시 코드 뒤에 숨겨져 있습니다. 농장. . . 일반적으로.
  5. 코드를 계속 정리하고 정리하면 테스트 범위가 계속 향상됩니다. 이제 더 많은 자신감을 가지고 필요할 때 / 필요할 때 더 많은 코드를 더 깊이 파고 "재 작성"할 수 있습니다.
  6. 코드베이스를 계속 개선하기 위해 추가 리팩토링 접근법을 반복하거나 적용하십시오.

추상화에 의한 분기

  1. 제거하려는 코드 (영구 계층, PDF 생성기, 송장 집계 메커니즘, 위젯 생성기 등)에서 문제점을 정의하십시오.
  2. 일반적인 작동과 함께이 기능을 대상으로하는 코드베이스에 대해 일부 기능 테스트 사례 (자동 또는 수동이지만 자동화 된 것으로 알고 있음)를 실행하십시오 (필요한 경우 쓰기).
  3. 기존 소스베이스에서 해당 구성 요소와 관련된 로직을 합리적인 인터페이스가있는 클래스로 추출하십시오.
  4. 모든 코드가 이제 새로운 인터페이스를 사용하여 이전에 코드 전체에 무작위로 분산 된 활동 X를 수행하고 있는지 확인하십시오 (코드베이스를 지정하고 새 클래스에 추적을 추가하고 호출해야하는 페이지 등을 확인하십시오). 단일 파일을 수정하여 사용할 구현을 제어 할 수 있습니다. (개체 레지스트리, 팩토리 클래스, IActivityXClass = Settings.AcitivtyXImplementer ();)
  5. 모든 활동 X가 새 클래스에 던져져도 여전히 모든 기능이 작동하는지 확인하는 기능 테스트 케이스를 다시 실행하십시오.
  6. 새 활동 X 랩퍼 클래스 주위에서 가능한 경우 단위 테스트를 작성하십시오.
  7. 레거시 클래스와 동일한 인터페이스를 준수하는 레거시 구현보다 적은 스파게티 로직으로 새로운 클래스를 구현하십시오.
  8. 새 클래스가 레거시 클래스에 대해 작성한 단위 테스트를 통과하는지 확인하십시오.
  9. 레지스트리 / 팩토리 메소드 / 이전 클래스 대신 새 클래스를 사용하도록 변경하여 코드를 업데이트하십시오.
  10. 기능 테스트가 여전히 통과하는지 확인하십시오.

공개 폐쇄 원칙 및 공통 비즈니스 로직 / 지속성 계층

어느 정도까지는 프레젠테이션, 비즈니스 및 지속성 계층을 분리하고 레거시 솔루션과 완전히 역 호환되거나 최소한 레거시 솔루션으로 입력 된 데이터를 처리 할 수있는 새로운 앱을 작성하여 벗어날 수 있습니다. 아마도이 방법을 권장하지는 않지만 때로는 시간 / 일정 / 자원 / 필요한 새로운 기능의 합리적인 절충안입니다.

  • 최소한 프리젠 테이션 계층을 비즈니스 및 지속성 계층에서 분리하십시오.
  • 동일한 공통 비즈니스 및 지속성 계층을 사용하는 새로운 UI 및 더 나은 프리젠 테이션 계층을 구현합니다.
  • 새 UI로 작성된 데이터가 이전 UI를 손상시키지 않는지 확인하십시오. (새 도구 사용자가 이전 도구 사용자를 방해하면 뜨거운 물에 빠지게됩니다). 이전 버전과의 호환성을 위해 노력하고 있다면 모든 것을 동일한 지속성 계층에 저장해야합니다. 새 도구와의 호환성을 원한다면 새 데이터베이스와 새 테이블 또는 확장 테이블을 사용하여 레거시 시스템에없는 데이터를 추적하십시오.
  • 새로운 기능 및 지속성 계층 요구 사항의 경우 새 테이블을 추가하고 메서드는 기존 레거시 논리를 변경하거나 기존 테이블에 열, 제약 조건을 추가하지 않습니다. 예를 들어 고용주 비상 연락처 추적을 시작해야하고 일부 다른 필드가 기존 직원 테이블을 수정하지 않는 경우 (기존 데이터가 해당 테이블에 대해 어떤 가정을하는지 모릅니다) 확장 테이블 employee_ext id, employee_id, emergency_contact_id 등을 추가합니다.
  • 사용자를 새 시스템으로 천천히 마이그레이션하십시오. 가능하면 레거시 시스템을 읽기 전용 모드로 설정하거나 X 날짜 이후에는 더 이상 사용할 수 없다는 경고를 추가하십시오.
  • 새로운 UI에서 우선 순위가 누락 된 기능 또는 비즈니스 요구 사항을 구현
  • 사용자 기반 롤오버.
  • 비즈니스 로직 및 지속성 계층 사용자에게 다른 리팩토링 방법론을 계속 정리합니다.

0

Refactor vs Rewrite space에 세 번째 범주가 있다고 말하고 싶습니다. 언어 버전, 컴파일러 및 라이브러리를 업데이트하고 있습니다. 때로는 현대적인 코딩 기술을 채택하는 것이 큰 이점이 있습니다.

예를 들어 v7 코드는 v2보다 훨씬 더 깨끗하고 안전하며 간결합니다. Elvis 및 null 통합 연산자와 같은 기능이 도움이됩니다.

스위칭 컴파일러는 새로운 코드를 구식 코드로 전환 할 수도 있습니다. 따라서 작업하고 구현하기가 더 쉬울 수있는 새로운 라이브러리가있을 수 있습니다. 네트워킹은 다양한 구현 문제의 좋은 예입니다.

또한 임베디드 리눅스 시스템 ... svn에서 git로 전환하는 새로운 도구를 설치하는 것을 고려하십시오. 또는 시스템 등에 Vi를 추가하십시오.

항상 리팩토링 대 다시 쓰기 일 필요는 없습니다. 아키텍처는 아마도 개선이 필요할 수도 있지만 작동합니다 ... 어쩌면 코드 작성 방법에 대해 생각해야 할 수도 있습니다.


-2

사람들 이 기존 앱을 다시 작성 하는 것을 본 적이 없다고 생각 합니다.

사람들이 다른 아키텍처, 기술 등을 사용하여 이전 세대와 공통된 기능을 가진 완전히 새로운 앱을 작성하고 있습니다. 앱 2.0이라고하지만 실제로는 원본과 공통점이 거의 없습니다.

그러나 이것은 실제로 기능 패리티를 달성하려는 의미에서 원본의 "다시 쓰기"가 아닙니다.

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