비전문가에게 리팩토링을 어떻게 설명합니까?


52

기술이 아닌 사람 (일반적으로 PHB 또는 고객)에게 리팩토링 (및 기술 부채)을 설명하는 방법은 무엇입니까? ( " 눈에 띄는 차이없는데 한 달 동안 작업 비용이 듭니까 ?!")

업데이트 지금까지 모든 답변에 감사드립니다.이 목록은 적절한 사람들을 지적 할 수있는 몇 가지 유용한 유사점을 제공 할 것이라고 생각합니다 (PHB에 대한 참조를 편집하는 것이 현명 할 수 있습니다!)


애플이 어떻게 많은 사람들이 레오파드에서 스노우 레오파드로 바꾸도록 설득했는지 기억이 나지 않습니다. 아마도 가격 : 당시 평소보다 $ 100 적습니다.
mouviciel

이 질문은 산업에서 코드를 다루는 모든 사람에게 놀랍도록 유용한 답변을 제공 할 수 있습니다. 사람들에게주의를 기울이십시오.
joshin4colours

왜 지혜 로운가?
루이스리스

답변:


53

큰 홈 시어터가 있고 물건을 추가하면 천천히 그러나 확실하게 큰 쥐가 뒤쪽에 둥지를 틀고 있습니다.

종종 부품을 교체하는 경우 종종 모든 부품을 교정 할 가치가 있습니다.

물론, 그렇게하면 이전에 작동하던 것이 시작했을 때보 다 더 잘 작동하지 않지만 다시 엉망으로 만들면 상황이 훨씬 쉬워 질 것입니다.

어쨌든 PHB 또는 고객이 이미 익숙한 일부 주제 영역 (예 : 자동차 또는 건설 등)과 유사한 비교를하는 것이 가장 좋습니다.


1
극장을 지속적으로 구축 한 직접적인 결과로 나타나는 나쁜 물건과 반대로 나쁜 물건이 자발적으로 극장으로 기어 들어가는 것처럼 들리기 때문에 최상의 비유는 아닙니다.
doppelgreener

21
@Axidos : "rats nest"는 영어 관용구로 "엉킴을 풀기 불가능 해 보인다"(이 경우 엔터테인먼트 센터 뒤의 코드와 케이블)
HedgeMage 2011

8
개념적으로 그것의 아주 좋은- "쥐 둥지"후 "케이블 필요"
Murph

2
@ 피터 : 우리 모두는 적어도 한 번은 TV 뒤에서 가야한다고 생각합니다. 백 배나 더 나쁜 것으로 설명하고 케이블 사를 도처에 돌리고 이것을 잡아 당겨서 어딘가에 죽은 문명을 발견하십시오.
doppelgreener


41

리팩토링은 모든 것이 깔끔하게 들어갈 때까지 여행 가방을 다시 포장하는 과정과 같습니다. 때때로, 그 과정에서, 왜 그렇게 많은 정크를 거기에서 얻으려고했는지 궁금해합니다.


1
나는 차고 또는 창고와 유추를 게시하려고했지만 이것이 더 좋습니다.
매트 엘렌

또는 때로는 가방을 몇 개 더 사서 소프트웨어 비용이 실제 세계의 비용과 같지 않기 때문에 과체중 요금을 지불하는 것이 큰 도움이되지 않는다는 것을 알고 있습니다. 그런 다음 모든 것을 멋지게 맞출 수 있으며 단일 여행 가방의 제약 조건은 임의적이고 터무니없는 것으로 판명되었습니다.
Dan Rosenstark

+1 훌륭합니다. 공간을 적게 차지하는 것뿐만 아니라 전혀 필요하지 않았으므로 빠져 나갈 수 있다는 것을 알 수 있습니다.
로비 디

21

기술 부채의 개념은 필요하지 않기 때문에 설명하지 않겠습니다. 대신 리팩토링에 초점을 맞추십시오. "더 나은"또는 "향상된"것이 아닌 프로그램 디자인을 변경하는 것이 아니라 변경해야 할 변경을 수용 할 수 있도록 변경하는 것입니다.

자동차 비유가 적합 할 수 있습니다. 자동차에 에어컨을 추가해야하지만 원래는 자동차 용으로 설계되지 않았습니다. 이상한 L 자형 에어 컨디셔너를 만들어야 할뿐만 아니라 다른 것들을 먼저 옮기고 환기 시스템을 바꿔야합니다.

또한 새로운 기능을 수용 할 때 리팩토링하는 것이 더 나은 전략이라고 생각합니다. 그렇지 않으면 "더 나은"것처럼 보이는 디자인으로 디자인을 변경할 수 있지만 실제로는 다음 기능 추가와 관련된 환경에는 적합하지 않을 수 있습니다.


더 나은 성능 또는 더 쉬운 유지 보수를 위해 부품을 자동차로 옮기는 것-자동차의 뚜껑을 들어 올리는 사람에게는 효과적이지만 PHB는 몇 명입니까?
피터 Boughton

3
필요한 변경을 더 쉽게 (또는 가능하게)하기 위해 리팩토링이 수행되고 있음을 강조하기 때문에이 방법이 마음에 듭니다. 리팩토링은 일반적으로 자체적으로 수행되는 것이 아니라 특정 목표를 달성하기 위해 수행되어야합니다.
Kristopher Johnson

그래서 짧은 대답은 다음과 같습니다. 시간을 새로운 기능으로 고려하고 리팩터링하십시오.
Jonathan van de Veen

12

나는 기술 부채라는 용어를 사용하고 그들이 이해하는 것 – 기업 부채와 직접 관련이 있습니다. 기술 부채는 대출을받는 것과 같습니다. 당신은 그것에 관심을 지불합니다. 예를 들어, 새로운 공장을 건설하고 직접 지불하거나 대출을받을 수 있습니다. 대출을 받으면 실제로 장기적으로 더 많은 비용을 지불하지만 조건이 맞으면 재정적으로 의미 가 있습니다 .

그러나 그러한 대출에 대해 25 %의이자를 지불하는 경우 지속 불가능한 입장에 처하게됩니다. 기술 부채와 동일합니다. 때로는 기술적 부채를지는 것이 합리적입니다. 그러나이자가 너무 높아서 지불해야 할 시점이 있습니다. 일부 기술 부채는 주택 융자와 같으며 일부는 신용 카드 부채와 같습니다. 응급 상황에서 신용 카드 부채는 중요하고 귀중한 자산입니다. 그러나 현명하게 사용하지 않으면 은행 (또는 원하는 경우 가구)이 파손될 수도 있습니다.

또 다른 예 : 마케팅 메일 한도에 $ 10,000를 지불하여 향후 더 많은 매출을 올릴 수 있습니다. 당신은 "판매 부채"를 지불하고 있습니다. 이것은 장기 지불에 따른 비용입니다. 이것을 코드 조각을 리팩토링하여 돈을 "지출"하려는 이유와 동일시하십시오. 두 경우 모두 즉각적인 보상은 없지만 향후 더 나은 성능을 위해 스스로를 설정하고 있습니다.

나는 대상 청중이 누구에게나 이야기 할 때 "xxxx 빚"이라는 용어를 유추로 사용하는 경향이 있습니다. 예를 들어, 운영 부채-이제 우리는 잘 작동하는 인쇄기이지만 하루 (또는 일주일) 동안 생산을 중단하고 새 기계로 업그레이드하면 출력을 25 % 늘릴 수 있습니다.

편집- 여기 에 또 다른 걸릴


1
현실적인 경제성을 입증하는 합리적 답변에 +1. 부채는 때때로 합리적이며, 순수 주의자들은 그것을 용납 할 수 없다면 너무 많은 기회를 놓친다.
Macneil

1
그리고 사람들은 오래된 대출에 대한이자를 지불하기 위해 대출을받는 것이 지속 가능하지 않다는 것을 이해합니다.
Christopher Mahan

1
기술 파산
Wayne Molina

4
이것은 끔찍한 대답입니다. (1) 리팩토링에 대한 기술적 설명보다 복잡합니다. (2) 리팩토링의 "이유"에 대해서는 설명하지 않습니다. 리팩토링의 "언제"(즉, 비용 효율적인 경우)를 설명합니다. 아니면이 게시물을 이해하지 못하기 때문에 (1)을 가리킬 것입니다.
Thomas Eding

2
@ThomasEding (1) 리팩토링에 대한 설명이 아니라 기술 부채에 대한 설명입니다. (2) 리팩터링시기를 비즈니스 사람에게 설명합니다. 솔직히 말해서 그들은 기술적 이유에 신경 쓰지 않습니다. 그들은 판매를 이끌 다음 기능 이외의 다른 일을하고있는 정당한 이유를 원합니다. 이것이 대부분의 프로그래머가 자신의 상사와 대화 할 수없고 상사가 바보라고 불평하는 이유입니다. 그들은 바보가 아니며 단지 당신과 다른 운전자를 가지고 있습니다.
Nemi

8

봄 청소.

집을 개조하고 있지 않습니다. 방금 물건을 옮기고 먼지를 제거하고 있습니다. 더 이상 사용하지 않거나 더 이상 필요하지 않은 것을 버릴 수도 있습니다. 하지만 당신은 아무것도 추가하지 않습니다.


1
+1 : 이것이 가장 좋은 답변입니다. 거의 모든 사람이 관련 될 수 있습니다. "집에 살면 일이 더럽고 먼지가 많고 정숙합니다. 주기적으로 깊게 청소해야합니다."
Steven Evers

7

" 마우스 트랩을 사용해 본 적이 있습니까? 새로운 기능을 고수하고, 인터페이스를 변경하고, 버그를 수정하면 코드가 그렇게 보일 수 있습니다. 많은 자본을 소비해야 할 시점이 있습니다 (시간과 노력) , 비용이 많이들 것입니다.) 모든 움직이는 부품이 각각의 새로운 변경 또는 추가와 함께 잘 작동하는지 확인하거나 대신 디자인을 리팩토링하기 위해 시간을 따로 설정하여 변경할 때마다 관리해야하는 움직이는 부품이 줄어 듭니다. 수 리팩터링은 어떤 혜택이없는 것을, 최종 사용자의 관점에서,하지만 이점은 새로운 기능이 후 리팩터링을 추가 할 때마다 발생합니다.이 과정이 빠르고, 적은 버그를 소개하고, 그 후 저렴, 리팩토링 된 코드가 전반적으로 더 효율적이라는 것은 말할 것도 없습니다.

왜 우리가 처음에 Mouse Trap처럼 보이게했는지 궁금 할 것입니다.

  • 때때로 무언가를 지금 당장 얻는다는 것은 단지 "작동하게"하기 위해 우아함과 효율성을 희생해야한다는 것을 의미합니다.
  • 프로그래머가 자주 변경함에 따라 사용 가능한 언어 기능 및 기타 기술. 때로는 새로운 기능으로 인해 움직이는 6 개의 부품이 번거롭지 않게 대체 될 수 있습니다.
  • 종종, 특징 C를 특징 A 및 B에 추가 할 때, 우리는 B가 결국 제거되고 D가 추가 될 것이라는 것을 모릅니다. C를 달성하는 한 가지 방법은 B와는 잘 작동하지만 D에서는 잘 작동하지 않을 수 있습니다.

더 나은 마우스 트랩을 구축하기 위해 끊임없이 돌아가서 복잡성을 줄이고 장소를 간소화해야합니다. 많은 기능을 갖춘 소프트웨어와 진정한 고품질 소프트웨어를 갖는 것의 차이점입니다. "


6

대체 텍스트

이것은 홈 시어터 비유의 약간 더 그래픽적인 버전입니다.

새로운 어플라이언스 (일명 새로운 기능)를 하나 더 추가하려면 어딘가에 설치할 수 있습니다.

다른 어플라이언스를 추가하려는 경우 확장 리드를 구매하면 시간이 좀 걸립니다.

그러나 추가 할 때마다 솔루션을 찾기가 더 어려워집니다. 그리고 당신은 자신을 노출하고 위험 1 화재 [일명 버그]의, 당신은 아마도 주까지 모든 방법을 확대 할 수있는 벽에 새로운 소켓을 넣어 사람을 지불하는 거액을 꺼내해야합니다 회로 보드 또는 그 이상.

1 PHB가 잘 이해하지 못하는 또 다른 점 : "만 일어날 있다면 걱정할 것이 무엇입니까?"


5

리팩토링-의류 캐비닛 / 도구 서랍을 구성하는 것과 같습니다.

  • 옷 / 도구를 모두 버리지 마십시오.

  • 당신은 그들이 결코 무질서해서는 안된다고 주장 할 수 있습니다. 그러나 그들은 그렇습니다.

코드처럼. 특히 시간이 지남에 따라 성장함에 따라.

그리고 당신이 그것을 청소하지 않으면, 당신은 당신이 항상 좋아하지만 찾을 수없는 사랑하는 티셔츠 또는 렌치에 무슨 일이 있었는지 궁금해 할 것입니다!


4

"코드 유지 관리" 라고 말하고 싶습니다 . 비 기술적 인 사람이 친숙하고 비 기술적 인 세계관에 맞는 단어를 사용하는 것이 중요합니다. 비전문가 (고객)가 응용 프로그램 유지 관리에 익숙한 경우 코드 유지 관리 및 응용 프로그램 유지 관리를 쉽게 수행 할 수 있습니다. 동일하지 않더라도 여기서 최종 고객은 개발자이거나 시스템을 유지 관리하는 사람들이라고 설명 할 수 있습니다.


1
기술이 아닌 사람이 응용 프로그램 유지 관리에 익숙하십니까? 나는 할머니에게 물었다. 그녀는 내가 찾은 가장 기술적 인 사람이 아니었다. 또한 : 비전문가는 코드와 응용 프로그램의 차이점을 알지 못하기 때문에 ( "코드가 응용 프로그램 인 경우 응용 프로그램은 코드입니다") 비유가 작동하지 않습니다.
마틴

2
내가 일했던 곳에서 마케팅 및 projman 유형은 "유지 관리"가 "릴리스 후 버그 수정"을 의미하는 것으로 이해했으며 리팩토링이 버그를 수정하고 있다고 주장하는 것은 무의미합니다.

저에게 비 기술적 인 사람은 고객입니다. 고객이 어떤 응용 프로그램 유지 관리인지 알고 있으면 코드 유지 관리도 이해해야합니다.
Amir Rezaei

"코드 유지 보수"는 코드가 닳거나 찢어 지거나 소진되는 것처럼 들립니다. 일반적인 사용은 부품에 스트레스를 주거나 유체를 사용하기 때문에 자동차를 유지 보수해야합니다. 응용 프로그램은 그렇지 않습니다. 하드 드라이브에있는 코드는 자체적으로 "연령"또는 "나쁜"상태가 아닙니다.
Dan Ray

유지 보수에 대한 몇 가지 예를 보여 드리겠습니다. 성능 문제. 구성 요소, 전체 시스템 또는 응용 프로그램이 VB로 작성되고 Microsoft는이를 지원하지 않습니다. OS는 코드 기반 기술을 지원하지 않습니다. 보안 문제들. 이러한 문제에 대한 유지 관리는 최종 사용자가 알 수있는 새로운 기능을 추가하지 않지만“응용 프로그램”을 유지하는 데 중요합니다.
Amir Rezaei

4

고객이 필요로하는 경우 처음부터 자동차를 맞춤화하는 것을 전문으로하는 자동차 정비공이라고 가정 해보십시오. 자신의 초대형 리무진에 항상 새롭고 반짝이는 것을 넣을 때마다 가게에 돌아 오는이 고객이 있습니다.

멋진 사운드 시스템이 설치되면 전선을 통과시키고 올바르게 연결하는 작업을 부지런히 수행하십시오. 그는 하루 후에 외출하고 평소처럼 행복하고 잘 지불합니다.

다음 달에 그는 다시 오지만 이번에는 본격적인 홈 시어터를 설치하고 싶어합니다. 다시 한 번, 당신은 리무진에 들어갑니다. 전문가이기 때문에 사운드 시스템을 다시 방문하고 자동차 주변의 와이어를 연결하기위한 튜브 시스템을 설치하여 유지 관리를 더 쉽게 만듭니다. 이 방법으로 전선을 보호하고 빼기 쉽고 더 추가해야 할 경우에도 쉽게 수행 할 수 있습니다. 따라서 오래된 전선을 벗기고 튜브를 설치 한 다음 사운드 시스템과 시네마 용 추가 전선을 통과시켜 모두 닫으면 완료됩니다.

고객이 기존 사운드 시스템을 교체하도록 요청하지 않았다는 사실을 알고 교체 및 튜브 비용의 일부를 긁어 냈습니다. 그러나 당신은 여전히 ​​거래에서 돈을 버는 것입니다. 당신이 처음했던 것처럼 시스템을 함께 던져 버린 것만 큼은 아닙니다.

한 달 후 그는 돌아와서 이번에는 조명 시스템을 원하고 이전 주에 이전 스피커를 손상시킨 새로운 스피커를 원합니다.

모든 것을 깔끔하고 깔끔하게 유지했기 때문에 튜브를 통해 새로운 조명 와이어를 빠르게 작동시키고 시스템을 설치하고 스피커를 교체 할 수 있습니다. 그러나 이번에는 당신이 훨씬 더 빨리 끝났으며, 리팩토링 은 게임에서 당신을 계속 유지함으로써 지불했습니다.

완벽하게 좋은 전선을 리핑하고이 여분의 튜브를 모두 설치 한 것에 대해 당신을 비 웃었던 경쟁자는 여전히 그의 고객 만족을 위해 고군분투하고 있습니다. 물론 그는 대부분의 시간보다 빨리 끝났지 만 시간이 지남에 따라 고객은 점점 더 지연되고 작업의 전반적인 품질이 저하되고 있다고 불평합니다.

이를 살펴보면 비즈니스에 머무를뿐만 아니라 최고의 총을 목표로하는 목표는 고객의 요구를 충족시키기 위해하는 일과 삶의 질을 향상시키기 위해하는 일의 균형을 유지하는 것입니다. 고객이 두 가지 모두를 지불하는 경우는 드물기 때문에 면밀히 관리해야합니다. 2 배의 비용으로도 사전에 능동적으로 행동함으로써 유지 관리 비용을 생산성의 안정적인 비율로 유지할 수 있습니다.

소프트웨어는 고객과 관리자가 효과를 느끼기 전에 프로그래머가 디지털 덕트 테이프로 아주 오랫동안 재생할 수 있다는 점을 제외하면 동일합니다. 불행히도 그 당시에는 일을 다시 수행하는 비용은 존재하는 덕트 테이프의 양과 상기 덕트 테이프의 평균 수명과 관련하여 기하 급수적으로 증가합니다.

따라서 시스템을 계속 리팩토링하는 것이 중요합니다. 종종 경험을 통해 똑같은 일을하는 더 효율적인 새로운 방법을 보여 주거나 유사한 기능을 결합하고 중복을 악용 할 수 있습니다. 이것이 우리가 시스템을 간결하고 의미있게 유지하는 방법입니다. 시간은 수요를 충족시키기 위해 시스템을 지속적으로 리팩토링하면 유지 보수에 투입되는 양을 제어함으로써 생산성을 일정하게 유지할 것임을 보여줄 것입니다.

덕트 테이프를 배치하면 차선의 시스템을 운반하는 비용으로 생산성이 순간적으로 향상됩니다. 시스템의 다른 측면을 해칠 때 즉각적인 생산성을 선호 할 때마다 기술 부채가 발생합니다. 차용 자본에 대한이자가 차용 시간이 빨리 유지 보수를 더 많이 발생시키고 시스템 취약성을 증가시켜 팀이 생성보다는 유지 보수에 추가 자원을 소비하게하므로 부채 비유는 좋습니다. 차입이 계속 줄어들지 않으면 대부분의 자원은이자 상환에 사용되어 개선이 거의 이루어지지 않습니다. 기술 부채는 대부분의 자원이 시스템을 연삭 상태로 유지하여 가능한 다른 모든 개선 사항을 중단시키는 데까지 기술 자원을 낭비합니다.

따라서 궁극적으로 문제는 우리가해야하거나하지 말아야하는 것이 아니라 관리자와 고객이 디지털 덕트 테이프를 사용하여 인위적으로 부풀린 생산성 수치에 의존 할 수 있다고 생각하는 것이 윤리적입니다. 어떤 사람들은 그것이 사업 결정이라고 생각하지만, 솔직히 이것은 관리자가 이해하지 못하기 때문에 그렇게 결정됩니다. 결국 누군가는 리팩토링을 많이하거나 새로운 시스템으로 마이그레이션하여 부채를 지불해야합니다. 프로그래머, 시스템 유지 보수를 유지하는 것은 궁극적으로 우리에게는 작업의 본질적인 부분이기 때문에 리팩토링을 요구할 필요가 없습니다.이를 이해하지 못하면 소프트웨어 엔지니어링이 무엇인지 이해하지 못합니다. 이것은 이미 중요한 부채가 발생한 시스템이 있고이 부채를 상환하려면 지불 인의 결정이 필요하다는 것을 알았습니다. 당신의 직업은 그러한 상황이 최소한 차용을 멈추기 위해 당신의 역할을하는 것입니다. 이 부채가 발생했습니다미국은 아마도 우리가 더 잘 알지 못했기 때문에 그것을하라는 압력을 받았기 때문에 여전히이 빚을졌으며, 빚을 이해하지 못하도록 빚을 건 사람들은 종종 그것을 제대로 관리 할 수 ​​없습니다.

여기 당신의 소프트웨어가 다 있습니다. 당신이 그것을 좋아하기를 바랍니다 .... 그런데, 난 신용 카드를 최대한 사용했습니다.


3

리팩토링의 요점은 설계를 단순화하고 비 효율성을 제거하는 것입니다. 이를 통해 버그를 쉽게 수정하고 향후 새로운 기능을 추가 할 수 있습니다.

디버깅은 처음에 코드를 작성하는 것보다 두 배나 어렵습니다. 따라서 코드를 가능한 한 영리하게 작성하면 정의에 따라 코드를 디버깅하기에 충분하지 않습니다.

코드에 새로운 기능을 계속 추가하면 리팩토링이 빠르게 비용을 지불합니다. 오류율이 낮고 디버깅 속도가 빠르고 수정이 빠릅니다.


그러나 clever == 0그렇게 2 * clever == 0...
토마스 대한 수정 사항

3

소프트웨어 작성은 큰 논픽션 책이나 백과 사전을 작성하는 것과 매우 유사합니다.

첫 번째 초안은 항상 짜증납니다. 항상 재구성하고, 필요하지 않은 섹션을 제거하고, 전체적으로 일관된 스타일을 보장함으로써 항상 향상 될 수 있습니다.

수정해야 할 때마다 가장 간단한 작업은 새 섹션을 추가하고 몇 단어를 변경하는 것입니다. 그러나 개정 내용이 쌓이면 책의 구성이 사라지기 시작합니다. 따라서 추가 재구성 단계를 거쳐야합니다. 그렇지 않으면 책이 말도 안되는 혼란이됩니다.


3

데스크톱 컴퓨터를 예로 들어 보겠습니다. 타워, 모니터, 키보드, 마우스, 프린터, 스캐너 및 스피커가 있습니다. 궁극적으로 원하는 것은 멋진 책상입니다. 맹목적으로 연결하면 몇 분 후에 모든 것이 원하는 방식으로 설정됩니다. 글쎄 ... 거의 원하는대로.

하루 후에 스피커의 밸런스를 변경하면 실수로 왼쪽 및 오른쪽 스피커를 잘못된 영역에 놓았으므로 위치를 바꾸고 싶습니다. 하지만 아뇨! 꼬인 끈으로 된 정글이 있습니다. 스피커 이동을 계속하면 마우스 코드가 연결되고 마우스가 스피커와 함께 드래그됩니다. 또한 키보드에는 느슨 함이 없습니다. 책상에서 무릎 위로 키보드를 옮길 수있었습니다.

마우스와 키보드를 뽑았다가 다시 삽입하면 모든 것이 고정됩니다. 그러나 이것은 향후 재구성 및 향후 추가에 도움이되지 않습니다. 또한 정글을 통해 마우스와 키보드 코드를 짜는 것은 번거 롭습니다.

더 나은 해결책은 모든 코드를 다시 연결하여 각 코드가 다른 코드를 방해하지 않는 깔끔한 방법으로 다시 연결하는 것입니다. 이제 미래의 변화는 쉽고 계속 쉽습니다. 당신은 나중에 큰 이익을 위해 약간의 선불 투자합니다.

핵심은 원래 솔루션이 대부분 작동했다는 것입니다. 그것은 리팩토링에 관한 것입니다 : 그것은 처음부터 작동하지만, 미래의 변화를 쉽게하기 위해 (스피커 이동) 이미 존재하는 방법을 변경해야합니다.


2

그것은 전날 밤에 거칠고 미친 파티 후에 집안을 청소하는 것과 같습니다.

거실이 완전히 쓰레기라고 가정 해 봅시다. 집은 여전히 ​​집이고 거실은 여전히 ​​거실입니다. 그것은 작동하지만 그것이 될 수있는 방식이 아닙니다. 혼란을 쳐다 본 후에는 청소가 필요하다는 것을 알게됩니다.

쓰레기를 포장하기 시작합니다. 벌써 좋아 보인다 따라서 방을 둘러보고 가구를 똑바로 세우기로 결정합니다. 한 조각을 다시 넣은 다음 다음 조각을 넣습니다. 와우, 방은 정말 좋아 보인다. 당신은 자랑 스럽습니다.

여동생이 들어 와서 방이 쓰레기처럼 보이면 책장을 고치고 카펫을 진공 청소기로 청소해야합니다. 그녀가 옳아. 방은 정말 좋아 보인다.

주변을 둘러보고 창 높이가 모두 같은 높이에 있으면 훨씬 더 잘 보일 것입니다. 끝난. 와우, 방은 훌륭하다.

코드를 같은 방식으로 취급하십시오.


1
나는 그것을 좋아하지만 부엌 청소로 바꿀 것입니다. 한동안 요리는 없지만 나중에는 나아질 것입니다. PHB는 회사 시간에 파티를하는 데 어려움이있을 수 있습니다. :)
Jaap

괜찮은 비유이지만 독자들이 알아야 할 한 가지 결함이 있습니다. 집을 청소하지 않으면 집은 시간이 지남에 따라 말 그대로 쓸모 없게됩니다. 프로그램과는 달리 이런 일은 일어나지 않습니다.
토마스 에딩

1

쉬운!

예를 들어 보자 ... 모두가 인생에서 사랑하는 사람에게 편지를 썼습니다. 편지에서 우리는 일반적으로 작곡에도 관심을 기울이기 때문에 사랑하는 사람이어야합니다.

그래서, 당신은 당신의 텍스트를 가지고 있습니다 ... 의미는 어느 쪽이든 통과하지만 당신은 모든 것이 멋지게 들리기를 원합니다 ! 권리?

리팩토링, 같은 것 ... 같은 정보 조각, 다소 작지만 구성이 더 좋습니다. 그리고 아마도 독자가 더 잘 검토하게 될 것입니다.

또 다른 예-잡지 기사 쓰기. 두 작가는 둘 다 "그들의 물건"을 알고 있지만, 유일한 차이점은 하나는 "쓰기 방법"을 알고 다른 하나는 그가 이와 같은 답변에서 쓰는 법을 배운 것입니다.

누구의 기사를 기억하십니까?


1

극장을 짓는 것과 같이 실제 세계의 것들과의 모든 비유는 끔찍합니다.

리팩토링 코드는 ... 리팩토링 코드와 같다고 설명해야합니다. 물리적 아날로그가 아닌 방식으로 소프트웨어를 변경할 수 있습니다. 일이 점점 더 복잡 해짐에 따라 코드베이스의 크고 작은 부분을 리액터 (또는 원하는대로 다시 실행)하여 복잡하지 않고 복잡성을 계속 증가시킬 수 있어야합니다.

왜 우리는 리팩토링합니까? 리팩토링되지 않은 코드는 유지 및 변경하는 데 분당 비용이 더 많이 들고 결국 더 문제가되기 때문입니다.

리팩토링에서 흥미로운 점은 코드베이스를 다시 실행하지만 최소한 처음부터 기능은 동일하게 유지된다는 것입니다.


/ 모든 비유 /? 나는 매우 동의하지 않습니다. 당신은 더 창의적이어야합니다. 또한 OP의 질문에 대답하지 않습니다.
Thomas Eding

귀하의 의견에 감사드립니다. 나는 두 번째 요점에 동의하지 않는다. 사실, 나는 그 질문에 대답하고있다. 그러나 지금 당장 당신을 위해 편집하겠습니다.
Dan Rosenstark

0

리팩토링은 무언가를 정리하고 물건을 '숙박'하기위한 새로운 장소를 제공하는 것과 같습니다

쉽고 간단하며 많은 시간이 소요될 수 있습니다. 때때로 나는 그 사람 X를 추가하여 X가 엄청난 혼란을 겪었고 그것을 정리해야합니다.


0

나는 여기서 아무도 언급하지 않은 또 다른 예를 생각했다.

방정식을 재정렬 할 때 의미를 바꾸지 않고 더 읽기 쉽고 사용하기 쉽도록 '주변을 움직입니다' .


1
PHB 또는 고객 인 경우 (누가이 리팩토링 노력에 대한 비용을 지불 할 것인지) 왜 관심을 가져야합니까? 코드는 (내 관점에서) 작동
댄 Pichelman

0

그들에게 간단한 수학 방정식을 줘. 예를 들면 다음과 같습니다.

어느 것이 더 간단합니까?

y = x + x

또는

y = 2x

리팩토링은 간단한 수학 방정식 대신 알고리즘을 사용한다는 점을 제외하고는 비슷한 개념입니다. 주요 아이디어는 동일한 결과를 얻을 수 있기 때문에 두 가지 방식으로 전환 할 수 있다는 것입니다.

수행 할 수있는 가장 간단한 리팩토링은 이름을 바꾸는 것입니다.

doX() { ... }
{
   doX()
}

의미가 무엇인지 알지 못하기 때문에 doX라고하는 것을 원하지 않기 때문에 이름을 좀 더 설명이 필요한 다른 이름으로 바꾸고 사용했던 곳을 대체합니다.

doBusinessTransaction() { ... }
{
   doBusinessTransaction()
}

이렇게하면 사람들이 애플리케이션을 이해하고 수정하는 시간이 줄어들 기 때문에 문제 나 개선이있을 때 나중에 비용을 절약 할 수 있습니다. 추가 비용을 절감 하기 위해 사용중인 언어에 따라 자동으로이 작업을 수행 하는 무료 도구가 있습니다. 이러한 도구는 또한 제한적이지 않으며 라이센스를 직접 사용하는 경우 별도의 승인없이 별도의 조치를 취해야합니다.


1
모든 사람들이 이해할 수 있고 코드 자체와 유사하기 때문에이 비유를 정말 좋아합니다.
Venkat D.

감사합니다, 심지어 내 블로그에도 게시했습니다 trajano.net/2013/05/refactoring-explained
Archimedes Trajano

0

그림은 천 단어를 말합니다. 예를 들어 리팩토링에는 두 가지 사용 사례가 있습니다.

  • 일이 제대로 완료되지 않은 경우 :

일이 제대로 이루어지지 않을 때 리팩토링

  • 일이 지루할 때 :

일이 지루할 때 리팩토링

참고 문헌


XKCD는 일상적인 작업을보다 효율적으로 만들면 다른 방법보다 훨씬 많은 작업을 수행 할 수 있다는 사실을 무시할 가치가 있습니다. 따라서 작업의 추가 성능에서 얻는 가치를 고려해야합니다.
bdsl

@bdsl 즉에 덮여 workplace.se
폴 Sweatte

0

리팩토링 에서 주어진 답변을 고려하고 기술이 아닌 사람에게 설명하지 마십시오. 리팩토링은 다음에 대해 알 필요가없는 기술 활동입니다.

물론 많은 사람들이 품질에 따라 결정되지만 일정에 따라 더 많이 결정한다고 말합니다. 이 경우 더 논란의 여지가있는 조언을합니다 : 말하지 마십시오!

파괴적인가? 나는 그렇게 생각하지 않습니다. 소프트웨어 개발자는 전문가입니다. 우리의 임무는 가능한 한 빨리 효과적인 소프트웨어를 만드는 것입니다. … 일정 중심의 관리자는 내가 할 수있는 가장 빠른 방법을 원합니다. 내가하는 일은 내 사업이다. 가장 빠른 방법은 리팩토링하는 것입니다. 따라서 리팩터링합니다.

(리팩토링, Martin Fowler, 2000, 61 쪽)

물론 리팩토링 이외의 작업을 한 달 동안 보내면 효과가 없지만 어쨌든 일반적으로 나쁜 생각이라고 생각합니다. 현재 또는 다음 작업을 쉽게하는 데 필요한 정도로 리팩터링하는 것이 훨씬 좋습니다. 또는 방금 작업 한 코드를 정리합니다.

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