바퀴를 재발 명하는 것이 정말로 그렇게 나쁜가?


101

프로그래밍에서 그것의 일반적인 지식은 바퀴를 개혁하는 것은 나쁜 이상인지 .

그러나 왜 그렇습니까?

나는 그것이 좋은 것이라고 제안하지 않습니다. 나는 그것이 틀렸다고 믿는다. 그러나 한 번은 누군가가 무언가를 잘못하고 (현명한 프로그래밍) 잘못된 것을 설명하는 이유를 알 수 없습니다.

그것은 나를이 질문으로 인도합니다.

내가 누군가가 이미 언어 / 프레임 워크에 내장 된 무언가의 자신의 방법을 구축하여 바퀴를 재발 명하고있는 것을 본다면. 먼저, 주장을 위해, 그들의 방법이 내장 된 방법만큼 효율적이라고 가정하자. 또한 기본 제공 방법을 알고있는 개발자는 자신의 방법을 선호합니다.

왜 내장 된 것을 자기 자신보다 사용해야합니까?


16
이것은 좋은 질문입니다. 사람들이 바퀴를 재발견해야한다고 생각하지는 않지만, 이러한 아이디어에 도전하여 그들이 견디도록해야합니다.
Jon Hopkins

4
@Demian-사실 꽤 좋은 생각입니다. 당신이 그것을 설명 할 수 있다면 아마 그렇게하는 것이 정당 할 것입니다.
Jon Hopkins

2
모든 결정에서 기본 목표가 무엇인지 물어보고 다른 하위 요소가 기본 목표를 지원하도록하는 것이 좋습니다. 기본 목표가 양질의 제품을 적시에 제공하는 것이라면 기존 코드를 복제하는 것이이 목표를 저해 할 수 있습니다. 기본 목표가 더 나은 생각을 가진 라이브러리를 만드는 것이라면이 목표에 기여할 수 있습니다. 다른 사람을 위해 일한다면, 당신의 질문이 아니라 그들의 관점 에서 질문을 해야 합니다.
gahooa

5
기존 바퀴가 실제로 특정 요구 사항을 충족시키지 못하거나 바퀴 작동 방식을 알고 싶다면 다시 만드십시오! 이 주제에 관한 흥미로운 기사 : codinghorror.com/blog/2009/02/…
lindes

4
Douglas Crockford의 속성 :The good thing about reinventing the wheel is that you can get a round one.
Joel Etherton

답변:


71

내가 한 번 StackOverflow에 게시 한 것처럼, 바퀴를 재창조 하는 것은 대중적인 믿음과는 달리 매우 좋은 선택 입니다. 가장 큰 장점은 소프트웨어를 완전히 제어 할 수 있다는 것 입니다. 자세한 내용은 내 원래 게시물을 참조하십시오 .


14
+1 가장 중요한 점은 자신이 완전히 통제 할 수 있다는 것입니다. 가능한 경우 다른 라이브러리를 디버깅하면 심각한 문제가 발생할 수 있으며, 모든 성숙한 라이브러리에 버그가 없다고 말하는 것이 가장 낙관적입니다.
Orbling

6
Excel 팀은 프로젝트에 영향을 줄 수있는 외부 종속성을 원하지 않기 때문에 자체 컴파일러를 작성하기까지했습니다. 이것은 타당한 점이지만 그 통제가 얼마나 중요한 문제인지는 중요합니다.
Jon Hopkins

6
+1. 이전에는 MFC / VC ++ 프로그래머로 일하면서 다양한 GUI 구성 요소에 타사 라이브러리를 사용했습니다.이 라이브러리는 유지하기가 완전히 악몽이었습니다. 이러한 것들이 소프트웨어에 깊숙이 빠져 들어 제거 할 수 없었습니다 (비현실적인 사람이 몇 달간 노력하지 않고도). 나는 우리 자신의 그리드와 레이아웃 관리자를 굴릴 필요가 없기 때문에 초기 시간 절약이 그 괴물을 유지 해야하는 수년 동안 수십 배나 커졌다는 것을 절대적으로 확신합니다.
Bobby Tables

4
@Guzica는 불행한 선택이 일반화하기에는 충분하지 않으며, 잘 관리되고 좋은 선택이되는 다른 라이브러리가 존재합니다. 문제는 원래 결정이 충분히 연구되었는지 여부입니다.

5
거꾸로, 기존 휠을 사용하는 경우 일반적으로 Google에서 색인을 생성하여 디버깅하는 데 도움이되는 많은 도움을 얻습니다.
Dan Ray

81

에 따라 ..

모든 것과 마찬가지로 맥락에 대한 내용 :

다음과 같은 경우에 좋습니다.

  • 프레임 워크 또는 라이브러리가 너무 무겁기 때문에 제한된 기능 만 필요합니다. 요구 사항에 맞는 초경량 버전을 롤링하는 것이 더 나은 방법입니다.
  • 복잡한 것을 이해하고 배우고 싶을 때 자신을 굴리는 것이 합리적입니다.
  • 당신은 다른 것을 구현할 수없는 다른 것을 제공합니다. 새로운 트위스트, 새로운 기능 등일 수 있습니다.

다음과 같은 경우에 나쁩니다.

  • 기능이 이미 존재하며 안정적이고 잘 알려져있는 것으로 알려져 있습니다 (인기).
  • 귀하의 버전은 새로운 것을 추가하지 않습니다.
  • 버전에 버그 나 제약이 있습니다 (예 : 버전이 스레드로부터 안전하지 않음).
  • 버전에 기능이 없습니다.
  • 사용중인 버전의 설명서가 잘못되었습니다.
  • 교체 한 버전에 비해 단위 테스트가 부족합니다.

2
첫 번째 포인트와 함께 (그리고 네 번째와 반대로), 휠을 다루기가 어렵거나 더 심하지 않은 경우에는 실제로 개선 할 수 있습니다. 이것은 바퀴가 기차 바퀴로 밝혀지고 한 트랙에서만 작동하는 일부 영역의 UI 구성 요소에서 자주 발생합니다.
Magus

1
이해하기 힘들어 방금 그래프 분석을하지 않았으므로 이제는 분석했습니다. 이제 프레임 워크를 사용하는 것에 대해 확신합니다
JasTonAChair

1
기존 라이브러리보다 문제 공간을 더 잘 이해하는 경우 "적절한"열에 4 번째를 추가합니다 (적용하지는 않지만). Java의 사실상 표준 시간 라이브러리 Joda는 기본 제공 작업이 어렵 기 때문에 작성되었으며 이제는 원래 joda-time을 작성할 때보 다 문제를 훨씬 잘 이해했기 때문에 Java 8의 표준 시간 라이브러리로 다시 작성되었습니다.
Morgen

55

"자신의 방법을 선호하기 때문에"고의로 바퀴를 재발 명하는 개발자의 경우는 매우 드물다고 생각합니다. 대부분 무지와 때로는 완고함에서 비롯됩니다.

그게 다 나쁜가요? 예. 왜? 기존 휠은 시간이 지남에 따라 제작되었을 가능성이 높기 때문에 이미 많은 환경에서 다양한 종류의 데이터에 대해 테스트되었습니다. 기존 휠의 개발자는 이미 발명가가 상상조차 할 수없는 어려움과 어려움을 겪었습니다.


3
또는 게으름-대안을 찾기 위해 귀찮게 할 수 없으며 코드를 작성하기 위해 갈 때 덜 흥미 롭습니다.
Jon Hopkins

9
필자는 라이브러리 / 프레임 워크 xyz가 "올바른 방법"을 수행하는 방법을 모르는 나쁜 프로그래머에게만 해당되는 태도를 가지고 바퀴를 다시 발명하는 많은 사례를 보았습니다. 도대체, 나는 SO 사이트에서 그 주장을 (어떤 방식 으로든 다른 방식으로) 보았다.
Bill

2
... 현재 또는 후속 개발자에 대해 반복적 인 유지 관리 부담이 발생합니다.
gahooa

2
이것이 제가 몇 년 동안했던 일입니다. 해당 기능이 이미 내장되어 있다는 것을 몰랐기 때문에 언어로 내 기능을 롤백했습니다.
Matchu

1
거의 3 년 전에이 게시물 (geez)을 작성한 이후로, 나는 첫 문장에서 "꽤 드문"이라고 묘사 한 개발자를 고용하고 해고했습니다. 그는 한 달 동안 지속되었습니다. 우리가 여기서 어떻게하는지 말해 주면 그는 "네가하는 말을 듣는다"라고 말할 것입니다. 문구의 말미에 "...하지만 잘못되고 나는 비밀리에 모든 것을 비밀리에 할 것"이라는 말을 들으려면 한 달이 걸렸습니다.
Dan Ray

22

스퀘어 휠을 재발 명해야합니다. 빨 아 먹는 노력은 복제되어야한다. 아마도 그 방법에 대한 문서가 부족할 수도 있고, 다른 프로그래머는 그것을 이해하려고하기보다는 자신의 것을 작성하는 것이 더 쉽다고 생각합니다. 메소드가 호출되는 방식이 어색하고 프로그래밍 언어의 관용구에 맞지 않을 수 있습니다.

결함이 무엇인지 물어보십시오.


9
+1 좋은 은유 "사각 바퀴를 재발 명해야한다" .
Orbling

"제곱 바퀴 재발견"+1
Tintu C Raju

17

일반적으로, 원하는 기능 또는 그와 비슷한 기능이 내가 사용하는 언어 의 표준 라이브러리 에 있으면 바퀴를 재발 명하지 않습니다 .

그러나 제 3 자 라이브러리를 통합 해야하는 경우 라이브러리가 얼마나 널리 사용되고 존중되는지에 따라 판단이 필요합니다. 내 말은, Boost 또는 Bob의 Kick-ass String-Parsing Tools 1.0에 대해 이야기하고 있습니까?

라이브러리가 업계에서 일반적으로 잘 알려져 있고 높이 평가 되더라도 여전히 타사의 의존성 입니다. 프로그래머는 일반적으로 코드 재사용의 미덕에 중점을 두면서 종종 종속성의 위험을 무시합니다. 서드 파티 종속성이 너무 많은 프로젝트는 서서히 유지 보수의 악몽으로 바뀌기 때문에 장기적으로 무너질 수 있습니다.

따라서 기존 코드를 활용하는 것이 좋지만 종속성은 좋지 않습니다 . 불행하게도,이 두 진술은 서로 상충되므로 트릭은 올바른 균형을 찾으려고 노력하고 있습니다. 따라서 수용 가능한 종속성 을 식별해야합니다 . 내가 말했듯이, 언어의 표준 라이브러리에있는 모든 것은 수용 가능한 의존성 일 가능성이 높습니다. 거기에서 이동, 높은 산업 전반에 걸쳐 간주 라이브러리는 (C ++이나 자바 스크립트를 jQuery를위한 부스트 같은) 일반적으로 허용 -하지만 그들은 여전히 적은 그들이 있기 때문에 표준 라이브러리보다 더 바람직 표준화 된 라이브러리보다 안정적인 경향이있다 .

상대적으로 알려지지 않은 라이브러리 (예 : SourceForge의 최신 업로드)는 매우 위험한 종속성이므로 소스 코드에 익숙하지 않은 경우 프로덕션 코드에서 이러한 코드를 피하는 것이 좋습니다.

정말 균형 잡힌 행동입니다. 그러나 요점은 맹목적으로 "코드 재사용이 좋다! 바퀴가 나쁘다!"라는 것이다. 위험한 태도입니다. 타사 코드 활용의 이점은 종속성을 도입 할 때의 단점에 대비 해야합니다 .


3
+1. 나는 같은 방식으로 느끼는 경향이 있습니다. 기존 휠을 사용하여 기존 휠이 이미 존재하는 경우보다 의존성 번거 로움을 유발할 경우 작은 휠을 재발 명하는 것이 훨씬 더 좋습니다.
dsimcha

14

사람들이 바퀴를 재발견하지 않으면 세상은 이것들로 가득 차게 될 것입니다. 여기에 이미지 설명을 입력하십시오

다음은 직장에서 나온 대화입니다.

- I would like to add some colors to the output of this program.
- Oh, there is this library called Colorama ..

휠을 재발 명하거나 Colorama를 사용하는 두 가지 옵션이 있습니다. 각 옵션의 결과는 다음과 같습니다.

Colorama 사용

  • 어쩌면 조금 더 빨리 달리기
  • 사소한 것에 대한 타사 종속성 추가
  • 당신은 Colorama를 사용하기 전과 같이 계속 바보입니다

바퀴 재발견

  • 일부 프로그램에서 색상을 표시하는 방법을 이해합니다
  • 모든 터미널에서 특수 문자를 사용하여 색상을 지정할 수 있음을 배웁니다.
  • 앞으로 사용할 프로그래밍 언어로 색칠 할 수 있습니다
  • 프로젝트가 깨질 가능성이 적습니다

보시다시피, 모두 상황에 달려 있습니다. 바퀴를 재발 명하는 것은 내가 자주 생각하고 스스로 생각하고 다른 사람들이 나를 생각하지 않기를 원하기 때문에 매우 자주하는 일입니다. 그러나 기한이 지났거나 구현하려고 시도하는 것이 많고 이미 존재하는 경우 거기에있는 것을 사용하는 것이 좋습니다.


2
+1은 100 % 동의하지 않지만 아이디어를 전달하는 데 사용 된 이미지를 좋아했습니다.
Tulains Córdova '12

이 답변은 고용주가 자신의 교육적 이익을 위해 바퀴를 재발 명하는 사치를 지불한다는 것을 우회합니다. 아마도 당신은 자신의 시간에 그렇게해야합니다. 요청을 받으면 고용주는 아마도 가장 빠른 시간 안에 작업을 원하고 Colorama가 그 일을하면 그 일에 착수한다고 말할 것입니다.
Neil Haughton

2
@NeilHaughton 제가 본 "나의"교육 혜택은 또한 고용주의 혜택이기도합니다.
Pithikos

흠 ... 물론 당신의 고용주가 그런 식으로 그것을 보지 못할 수도 있습니다.
Neil Haughton

도서관 Colorama는 그 자체가 바퀴의 재창조였습니다. 터미널에 특수 문자를 통해 색상을 표시하는 인터페이스가 이미 있었고 사람들이 나오기 전에 이미 색상을 표시했습니다. Colorama 라이브러리는 목표를 달성하는 방법을 인터페이스에 재창조합니다. 따라서 아마도 개선 된 바퀴를 사용할 것인지 아니면 프로젝트에서 낡은 바퀴를 사용할 것인지에 대한 질문입니다. 이 경우 휠을 재창조하면 Colorama2가 제공 한 것보다 훨씬 더 "향상된"Colorama2를 구축하게됩니다.
Ski

13

휠을 재창조하는 유용한 이유 중 하나는 학습 목적입니다. 그러나 본인의 시간에하는 것이 좋습니다. 더 많은 사전 통조림 솔루션이 제공되고 더 많은 추상화 수준이 제공됨에 따라 우리는 훨씬 더 생산적으로되었습니다. 우리는 몇 번이나 자주 조정되었던 일반적인 것들보다는 비즈니스 문제에 집중할 수 있습니다. 그러나 이러한 이유로 솔루션을 직접 구현하여 기술을 연마하고 많은 것을 배울 수 있습니다. 반드시 프로덕션 용도로 사용할 필요는 없습니다.

또 다른 문제는 사라질 수있는 회사의 타사 라이브러리에 대한 의존성이 우려되는 경우 소스 코드를 가져 오는 옵션이 있는지 또는 적어도 두 가지 다른 선택 사항이 있는지 확인하십시오.

그런데 직접 구현하기로 선택한 경우 암호화 또는 기타 보안 관련 기능을 위해이 작업을 수행하지 마십시오. 이를 위해 확립 된 (완전히 테스트 된) 도구를 사용할 수 있으며, 오늘날이 시대에는 너무 위험합니다. 그것은 그만한 가치가 없으며, 팀이이 일을하고 있다고 들으면 무섭습니다.


+1 학습 관점에서 아주 좋은 점은 라이브러리를 효과적으로 사용하기 위해서는 그것이 어떻게 작동하는지 친밀하게 알아야합니다. 나는 도구의 블랙 박스 사용을 좋아하지 않는다. 또한 암호화 라이브러리의 우수한 점은 해당 점수에 자신을 굴리기가 너무 위험합니다.
Orbling

제 3 자 라이브러리가 사라질 우려가있는 경우 한 라이브러리를 다른 라이브러리로 쉽게 교체 할 수있는 프로그래밍 인터페이스를 작성하는 것이 좋습니다.
user8865

좋은 점-우리는이 목적으로 만 어댑터 패턴을 사용했으며, 최근에 타사 FTP 라이브러리를 교체해야 할 때 절약했습니다.
Mark Freedman

9

처리 / 속도 (즉, 실행 속도)와 거의 일치하지 않는 개발 속도의 두 가지 효율성이 있습니다. 이것이 기존 솔루션을 사용할 수있는 합리적인 복잡성의 문제에 대한 첫 번째 이유입니다 . 기존 라이브러리를 연구하고 구현하는 것보다 코딩을하는 것보다 훨씬 빠릅니다 .

두 번째 이유는 기존 라이브러리 (성숙하다고 가정)가 테스트되고 작동하는 것으로 입증 되었기 때문 입니다. 아마도 개발자보다 훨씬 광범위한 시나리오에서 테스트 팀이 새로 작성된 루틴을 수행 할 수있을 것입니다. 제로 노력.

셋째, 지원하기가 더 쉽습니다. 뿐만 아니라 않는 다른 사람의 지원을하고 향상 (도서관 / 구성 요소를 썼다 누구든지), 그러나 그것은 다른 개발자가 잘 알고 이해 할 수 있어야하고, 향후의 코드를 유지하는 것이 훨씬 더 가능성 에 진행 최소화 모두, 소송 비용.

그리고 기능적 동등성을 가정하는 것은 일반적으로 그렇지 않습니다. 종종 도서관은 유용하다고 생각되는 기능을 제공하지만 건물을 정당화 할 수는 없으며 모든 기능을 갑자기 무료로 이용할 수 있습니다.

빌트인 기능으로는 할 수없는 일을하고 싶거나 그렇게함으로써 얻을 수있는 진정한 이점이 있거나 쉽게 구할 수있는 옵션이 성숙하지 않은 곳에서 스스로 롤업해야 할 이유가 있습니다. 많은 개발자들이 생각하는 것보다 덜 일반적입니다.

게다가, 이미 해결 된 문제를 해결하기 위해 시간을 보내고 싶습니까? 예, 배우는 좋은 방법이지만 프로덕션 코드에 적합한 솔루션을 사용하여 비용을 지불해서는 안됩니다. 우리가 이야기하고 있다고 가정합니다.


2
마지막 줄 : 그들이 어떻게 해결되는지 알기 위해. 프로그래밍은 결국 경험에 달려 있습니다.
Orbling

@Orbling-충분히 공평하지만 프로덕션 코드에서 그렇게해서는 안되며 질문이 말하는 것이라고 가정합니다. 수정한다.
Jon Hopkins

@Jon Hopkins : 자신의 시간에하지 않는 한, 잘 제작 된 코드는 일반적으로 학습을 따릅니다.
Orbling

@Orbling-나는 당신이 학습을 위해 무언가를 배우지 말고 그것을 프로덕션에 넣지 말아야한다고 주장합니다. 어떤 경우에는 프로덕션 코드가 가장 좋은 솔루션이거나 학습을위한 것이어야합니다. 그것들이 겹치는 시간이 있지만 자신의 롤링이 진정으로 최고의 해결책이 아니라면 이것은 그들 중 하나가 아닙니다.
Jon Hopkins

@Jon Hopkins : 이상적으로는 가능하지만 사용 가능한 라이브러리를 안정적으로 서비스 할 수없는 지점에 이르기까지 팀에 어떤 일을하는 방법을 아는 사람이없는 경우가 종종 있습니다. 대부분의 사람들이 그것을 부르는 학습 또는 "연구"는 필수입니다. 그렇습니다. 그것은 학습을 위해 정확히 배우는 것이 아니라 미래의 위험을 피하는 법입니다.
Orbling

9

물론 무지와 오만에서 변덕에 바퀴를 재발 명하는 것은 나쁜 일이 될 수 있지만, IMHO 진자가 너무 멀리 흔들 렸습니다. 원하는 것을 정확하게 수행 하고 더 이상 아무것도 하지 않는 바퀴를 갖는 것에는 엄청난 이점이 있습니다 .

기존 휠을 볼 때 종종 휠을 필요로하는 것보다 더 많이 수행하거나 내부 플랫폼 효과로 인해 불필요하게 복잡하거나 필요한 핵심 기능이 누락되어 있습니다. 이미 존재하는 것 위에 구현하십시오.

또한 기존 휠을 사용하면 종종 원하지 않는 프로젝트에 제약 조건이 추가됩니다. 예를 들면 다음과 같습니다.

  • 기존 휠에는 다른 언어 및 / 또는 프로그래밍 스타일이 필요합니다.
  • 기존 휠은 레거시 버전의 언어 (예 : Python 3 대신 Python 2)에서만 작동합니다.
  • 효율성, 유연성 및 단순성간에 상충 관계가있는 경우 기존 휠은 사용 사례에 적합하지 않은 선택을합니다. (나는이 경우에 내가 직접 작성한 라이브러리의 기능조차도 재창조하는 것으로 알려져 있습니다. 일반적으로 현재 내 특정 부분에서 매우 빠른 것이 필요할 때 일반적으로 합리적이고 효율적으로 함수의 라이브러리 버전을 작성했기 때문입니다. 케이스.)
  • 기존 휠에는 새로운 코드의 경우 완전히 쓸모없는 톤의 레거시 크래프트가 있지만 그럼에도 불구하고 인생은 어려워집니다 (예 : Java 라이브러리는 제네릭 전에 작성 되었기 때문에 crappy 컨테이너 클래스를 사용하도록 강요합니다) .
  • 기존 휠이 문제를 모델링하는 방식은 사용 사례에 편리한 것과 완전히 다릅니다. (예를 들어, 노드 객체와 참조로 표시된 직접 그래프를 사용하는 것이 편리하지만 기존 휠은 인접 행렬을 사용하거나 그 반대의 경우도 있습니다. 데이터를 열 순서대로 배치하는 것이 편리하지만 기존 휠은 행 메이저 또는 그 반대로 주장합니다.)
  • 라이브러리는 코드를 배포하려는 모든 곳에서 시작하고 실행하는 데 큰 번거 로움이되는 방대한 양의 의존성을 추가합니다. 반면에,이 경우에는 때로는 원하는 기능을 새로운 작은 라이브러리로 추출하거나 라이브러리가 오픈 소스이고 코드베이스가 그렇게 간단하게 만드는 경우 복사 / 붙여 넣기 만하면됩니다. (나는 심지어 다른 사람들뿐만 아니라 내가 직접 작성한 비교적 큰 라이브러리 로이 작업을 수행했습니다.)
  • 기존 휠은 사용 사례와 관련이없고 불편한 일부 표준을 pedantically 호환하려고 시도합니다.

바퀴가 당신의 목적에 맞다면 그것을 사용하고, 그렇지 않으면 그것을 사용하는 새로운 바퀴를 만드십시오. 어떤 식 으로든 독단적이지 마십시오.
Neil Haughton

5

나는 기존의 것을 발견하기 전에 그것을 구축했기 때문에 종종 내 자신을 사용하며 모든 인스턴스를 찾아 교체하기에는 너무 게으 릅니다. 또한 기존 방법을 이해하지 못하는 동안 내 방법을 완전히 이해합니다. 그리고 마지막으로, 나는 기존의 것을 완전히 이해하지 못하기 때문에 현재의 모든 것이 완전히 수행되는지 확인할 수 없습니다.

코딩해야 할 것이 많으며 프로덕션에 영향을 미치지 않는 한 무언가를 다시 코딩 할 시간이 없습니다.

실제로 오늘날에도 여전히 사용되는 하나의 ASP 웹 앱에는 데이터를 표 형식으로 표시하고 정렬 / 편집 할 수있는 완전한 기능의 차트가 있지만 데이터 그리드는 아닙니다. 처음 asp.net을 배우고 데이터 그리드를 몰랐을 때 몇 년 전에 지어졌습니다. 내가 당시에 무엇을했는지 전혀 알지 못했기 때문에 코드가 무섭습니다. 그러나 작동하고 정확하며 수정하기 쉽고 충돌하지 않으며 사용자가 그것을 좋아합니다.


2
그것은 그것을 대체하지 않고 처음부터 그것을하지 않는 이유입니다. 나는 대안이 존재한다는 것을 알면서도 똑같이하지 않을 것이라고 가정합니까?
Jon Hopkins

@ Jon lol은 확실히 아닙니다! 그리고 원래 개발자가 왜 기존 방식보다 자신의 방식을 선호하는지에 대한 질문을 읽었습니다. 일부까지 - 투표를 다시 읽는 나에게 그 질문의 반대를 실현하게 이제 질문은 질문했다,하지만이 관련 보이기 때문에 나는 여기에 대답을 떠날거야하고 있어요
레이첼

4

바퀴를 재창조하는 것은 바퀴의 작동 방식을 배우는 좋은 방법이지만 자동차를 만드는 좋은 방법은 아닙니다.


4

나는 현재 저렴한 스케이트를 위해 일하고 있습니다.

경제를 기반으로 합리적인 결정을 내리는 대신 "구축 또는 구매"간에 결정을 내릴 때 관리자는 "구축"을 선택했습니다. 즉, 구성품 또는 도구에 대해 수천 달러를 지불하는 대신, 수개월에 걸쳐 자체 제품을 제작하는 데 소비합니다. 다른 회사에서 휠을 구입하면 예산에서 나오는 돈이 들며 이는 관리상의 연말 보너스에 포함됩니다. 프로그래머의 시간은 자유롭기 때문에 연말 보너스에 포함되지 않습니다 (모든 것을 "제 시간에"정하지 않은 것에 대해 프로그래머를 찌르는 추가 혜택과 함께), 재발 명 된 바퀴는 자유 바퀴 입니다.

합리적 회사에서는 다른 사람이 만든 바퀴를 구매할 때의 바퀴 대 재구매 비용의 이점은 단기 및 장기 비용뿐만 아니라 새로운 위젯을 만들 수 없기 때문에 기회 비용 손실을 기반으로합니다. 바퀴를 재발견. 당신이 바퀴를 재발 명하는 데 매일 매일 새로운 것을 쓸 수 없습니다.

빌드 대 구매에 대한 프레젠테이션 .
빌드 대 구매 기사 .

내가 누군가가 이미 언어 / 프레임 워크에 내장 된 무언가의 자신의 방법을 구축하여 바퀴를 재발 명하고있는 것을 본다면. 먼저, 주장을 위해, 그들의 방법이 내장 된 방법만큼 효율적이라고 가정하자. 또한 기본 제공 방법을 알고있는 개발자는 자신의 방법을 선호합니다.

왜 내장 된 것을 자기 자신보다 사용해야합니까?

빌트인 버전에는 더 많은 사람들이 타 버릴 것입니다. 따라서 사제 코드보다 더 많은 버그를 찾아 수정하십시오.

마지막으로, 로컬 개발자가 떠날 때 다른 사람 이 작성한 코드를 유지 관리해야 할 때 완전히 리팩토링되고 프레임 워크의 내용으로 대체됩니다. 현재 고용주가 수년 동안 최신 버전의 VB로 마이그레이션 한 코드 (가장 오래된 제품이 약 20 년 동안 시장에 출시 된 코드)를 가지고 있기 때문에 이것이 일어날 것이라는 것을 알고 있습니다. 내 사무실에서 가장 오랜 기간 근무한 개발자는 17 년 동안 근무했습니다.


공평하게 말하면, 때때로 "표준"버전은 표준 버전이 개발되기 전에 대부분의 사람들이 한 일을 재창조하기 위해 만들어졌습니다. IOW, 표준은 "최고의 재창조"를 의미합니다. 그러나 응용 프로그램 코드는 기존의 비표준 버전에서는 사실을 가정하지만 새로운 표준 버전에서는 거짓으로 가정하기 때문에 잘 테스트되고보다 강력하고 버그가 수정 된 표준 버전으로 전환하면 버그가 발생할 수 있습니다.
Steve314

1
합리적 회사에서 공급 업체 잠금이 수용 가능하다고 결정되면, 구매자 (제공자이며 제공 업체의 오퍼링에 의존하는 회사)는 다양한 비즈니스 사고에 대한 헷지뿐만 아니라 제공 업체와 좋은 비즈니스 관계를 구축해야합니다. 예 : 지원 / 수정 버그 제공, 가격 인상, 계약 조건 변경, 사소한 소송 또는 사업을 완전히 떠나는 것을 거부합니다. 이 헤징은 비용의 일부이며 종종 무시됩니다. (사내 개발 비용이 무시되는 것처럼) 참고 :이 비용은 기본 제공 오퍼링에는 존재하지 않습니다.
rwong

잘못 안내 된 cheapskate 고용주가 다른 방법보다 더 많은 유급 노동을 효과적으로 제공하고 있다는 사실을 잊지 않습니까? 당신은 그것에 대해 불평하는 대신 그들을 격려해야합니다!
Neil Haughton

4

바퀴를 재발 명하는 것은 때로는 필요한 것을 할 표준 기성품 바퀴가 없다는 것입니다. 다양한 크기, 색상, 재료 및 구성 모드로 좋은 휠이 많이 있습니다. 그러나 언젠가는 녹색 알루마이트 처리 된 알루미늄으로 제작 된 가벼운 휠이 필요합니다. 이 경우 자신이 직접 만들어야합니다.

이제는 모든 프로젝트에 대해 자신의 바퀴를 만들어야한다고 말하는 것은 아닙니다. 대부분의 물건은 표준 부품을 사용하고 더 좋을 수 있습니다. 그러나 때때로, 당신은 표준 부품이 작동하지 않는다는 것을 알고 있습니다.

가장 중요한 것은 언제 자신을 만들지 아는 것입니다. 자신 만의 디자인을 시작하기 전에 표준 부품이 할 수있는 것과 할 수없는 것을 잘 알고 있어야합니다.


4

휠을 재발 명할지 여부는 비용 / 이익입니다. 비용은 분명합니다 ...

  • 재창조하는 데 많은 시간이 걸립니다.
  • 발명 한 내용을 문서화하는 데 시간이 더 걸립니다.
  • 당신은 당신이 발명 한 것을 이미 알고있는 사람들을 고용 할 수 없습니다.
  • 나쁜 것을 재발 명하기가 너무 쉽지 않아 나쁜 디자인으로 인한 문제에 대한 지속적인 비용이 발생합니다.
  • 새로운 코드는 새로운 버그를 의미합니다. 오래된 코드는 일반적으로 대부분의 버그가 이미 제거되었으므로 알지 못하는 문제에 대한 미묘한 해결 방법이있을 수 있으므로 새로운 디자인에서는 해결할 수 없습니다.

마지막은 중요합니다. 블로그 포스트는 여러분이 이해하지 못하는 많은 오래된 균열이 실제로 필수적인 버그 수정이라는 점을 바탕으로 "오래된 코드를 버리고 처음부터 다시 시작하는 경향"에 대해 경고하는 어딘가에 있습니다. IIRC, Netscape에 대한 경고가 있습니다.

장점은 ...

  • 기존 라이브러리에없는 기능을 추가 할 수있는 기능 예를 들어, 반복자 / 커서 인스턴스를 "유지"하는 컨테이너가 있습니다. 삽입과 삭제는 반복자를 무효화하지 않습니다. 벡터를 가리키는 반복기는 벡터의 초기에 삽입 및 삭제와 상관없이 동일한 인덱스가 아닌 동일한 항목을 계속 가리 킵니다. 표준 C ++ 컨테이너로는 그렇게 할 수 없습니다.
  • 특정 요구 사항을 대상으로하고 우선 순위를 존중하는보다 전문화 된 디자인 (그러나 내부 플랫폼 효과에 대한 경향을주의하십시오).
  • 완전한 제어-일부 타사는 애플리케이션의 절반을 다시 작성해야하는 방식으로 API를 다시 디자인하기로 결정할 수 없습니다.
  • 완전한 이해-당신은 그런 식으로 디자인했기 때문에 어떻게 그리고 왜 그렇게했는지 완전히 이해해야합니다.
  • 편집 다른 라이브러리에서 얻은 교훈을 모방하는 방법을 선택하여 같은 함정에 빠지지 않고 배울 수 있습니다.

한 가지-타사 라이브러리를 사용하면 바퀴를 재발견 할 수 있습니다. 이미 잘 사용되고 잘 테스트 된 자신 만의 고대 라이브러리가있는 경우이를 폐기하기 전에 신중하게 생각하여 타사 라이브러리를 사용하십시오. 장기적으로는 좋은 생각이 될 수 있지만, 거기에 가기 전에 엄청난 양의 작업과 (라이브러리 간의 미묘한 의미 차이로 인해) 많은 놀라운 일이있을 수 있습니다. 예를 들어, 내 컨테이너에서 표준 라이브러리 컨테이너로 전환했을 때의 효과를 고려하십시오. 호출 코드의 순진한 번역은 표준 라이브러리 컨테이너가 반복자를 유지하지 않는다는 사실을 허용하지 않습니다. 나중에 "책갈피"로 이터레이터를 저장 한 경우 간단한 번역을 사용하여 구현할 수 없었습니다.


3

필요한 것을 수행 하는 작동하는 구성 요소 가 있다면 왜 자신의 버전을 작성하고 디버깅하는 데 시간을 소비합니까? 마찬가지로, 이전에 비슷한 기능을 수행하기 위해 이미 코드를 작성했다면 왜 다시 작성해야합니까?

Joel은 Not-invented-here에 관한 기사 를 작성 했습니다.이 기사에서는 코드 및 소프트웨어 재 작성이 유용하지 않을 때에 대해 설명합니다.


3

휠을 재창조하는 것이 어떻게 작동하는지 배울 수있는 좋은 방법이 될 수 있습니다. 본인의 시간에 그러한 목적을 위해 재발 명하는 것이 좋습니다.

예를 들어 JavaScript 코드를 처음부터 작성하지는 않습니다. 대신 jQuery로 시작하여 해당 프레임 워크 위에 응용 프로그램을 빌드합니다.


3

내 개인적인 경험 법칙 :

당신이 배우는 동안 바퀴를 재창조하는 것이 좋습니다. 마감 기한이있는 경우 기존 바퀴를 사용할 수 있습니다.


3

"나쁜"또는 "악한"이라는 말은 오히려 강한 말입니다.

항상 그렇듯이 내장 구현보다 개인 구현을 선택해야하는 이유가 있습니다. 예전에는 C 프로그램이 런타임 라이브러리에서 버그를 겪을 수 있으므로 단순히 자체 구현 제공 해야합니다 .

JVM이 매우 엄격하게 정의 되었기 때문에 Java 프로그램에는 적용되지 않지만 일부 알고리즘은 여전히 ​​제대로 이해하기가 매우 어렵습니다. 예를 들어 Joshua Bloch는 Java 런타임 라이브러리의 기만적으로 간단한 이진 검색 알고리즘에 버그가 어떻게 포함되어 있는지 설명했으며 9 년이 걸렸습니다.

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

향후 Java 배포에서 발견, 수정 및 배포되었습니다.

내장 이진 검색을 사용하면 Sun에서이 버그 수정을 찾고 수정하고 배포하는 데 많은 노력을 기울임으로써 시간과 비용을 절약 할 수있었습니다. "적어도 Java 6 업데이트 10이 필요합니다"라고 말하면 작업을 활용할 수 있습니다.

이 오류를 포함 할 가능성이있는 자체 구현을 사용하는 경우 먼저 버그를 표시해야합니다. 이 특정 데이터는 LARGE 데이터 세트에만 표시된다는 것을 감안할 때 프로덕션 어딘가에서 발생할 수 있습니다. 즉, 고객 중 하나 이상이 영향을 받고 버그 수정을 찾아 수정하고 배포하는 동안 실질 돈을 잃을 가능성이 높습니다.

따라서 자신의 구현을 선호하는 것은 완벽하게 유효하지만 그 이유는 다른 사람의 작업을 활용하는 것보다 비용이 많이 들기 때문에 그 이유가 더 좋습니다.


버그 수정을 배포하기 위해 플랫폼에 의존하는 +1 반면에 버그 수정 배포 여부는 플랫폼 공급 업체에 달려 있습니다. 다른 공급 업체 가 다음을 선택할 수 있습니다. (1) 버그 수정 배포; (2) 주요 버전 업그레이드까지 버그 수정을 보류합니다. (3) 최신 버전의 사용자에게 버그 수정을 배포하되, 이전 버전을 거부합니다. (4) "대규모 비 호환성"으로 인해 "제한된 사용자에게만 영향을 줄 수있다"고 주장하면서 모두 수정을 거부합니다.
rwong

@rwong, 내장 루틴에서 버그 발견하면 가장 좋은 방법은 자신의 고정 버전을 제공하는 것입니다. 이것은 "그래야 할 아주 좋은 이유"에 속한다.

ørn : 제 요점은 당신이 언급 한 자비로운 벤더 외에 다른 종류의 벤더도 있다는 것입니다.
rwong

이 경우 @rwong은 "개인 구현을 선택해야하는 아주 좋은 이유"에 해당합니다.

3

나는 최근 이 주제에 대한 나의 생각블로그올렸다 . 요약:

  1. 그건 거의 항상 그 함수 그게 전부는 언어에 내장 된 경우 특히, 자신을 구축하는 악마. 그러나 인터넷에서 찾은 미성숙하고 의심스럽게 유지 관리되거나 잘못 문서화 된 프레임 워크를 평가하는 경우 자신의 글을 작성할 가능성과는 별개입니다.

  2. 나는 바퀴를 재발 명하는 것이 소프트웨어 안티 패턴과 상당히 끔찍한 생각이라고 생각 합니다 . 이는 원래 솔루션을 개선 할 수 없음을 의미합니다. 말도 안 돼요 소위 휠이 밤새 쓸모 없게되거나 소유자가 휠 유지를 중단 할 수 있습니다. 휠은 사용되는 시스템마다 값이 다릅니다. 따라서 더 나은 휠을 발명하는 것이 종종 가능합니다.

  3. 자체 프레임 워크를 만들면 얻을 수있는 주요 이점 중 하나는 다른 사람의 버그에 대해 책임을지지 않아도된다는 것입니다. (이것은 아마존의 철학 입니다.) 다음과 같이 생각하십시오. 고객에게 알리는 것이 더 좋은 방법은 무엇입니까? -

    "우리 웹 사이트가 고장났습니다. 다른 사람의 잘못이었고, 우리는 그 제작자와 버그를 기록했습니다. 기다리지 않고 우리가 할 수있는 일은 없습니다. 우리는 계속 업데이트 할 것입니다."

    "우리의 웹 사이트가 망가 져서 바로 고칠 수있었습니다."


0

어쩌면 그것은 효율적이지만 강력합니까? 자신의 롤링보다 라이브러리를 사용하는 가장 강력한 이유는 프레임 워크에 너무 많은 사람들이있어 버그를 빨리 찾아서 수정할 수 있기 때문입니다. 사내에서 개발 된 라이브러리는 많은 기능을 제공 할 수 있지만 수백만 명의 사용자가있는 라이브러리와 경쟁하여 거의 모든 사용 사례에서 테스트를 제공 할 수는 없습니다. 사내에서 그런 종류의 테스트를 이길 수는 없습니다.


0

글쎄, 자신의 방법은 프레임 워크만큼 효율적이지만 대부분의 프레임 워크에는 여전히 버그가 있으며 프레임 워크가 없기 때문에 즉시 사용할 수있는 솔루션을 제공 할 수 없기 때문에 매우 드 rare니다. 생각할 수없는 대부분의 프로그래머는 프레임 워크 수준에서 아무 것도 쓰려고하지 않습니다. 그들은 기성품 솔루션을 찾기 위해 Google을 검색합니다. 모든 현명한 프로그래머는 먼저 필요한 기능을 갖춘 무료 프레임 워크가 있는지 확인한 다음없는 경우 직접 솔루션을 작성합니다. 때로는 현재 프로젝트 상황을 설명하기가 너무 어려워 개발자가 최고의 판사입니다.

바퀴를 재발 명하는 것은 나쁘지 않으며, 게으른 사람들이 열심히 일하지 않도록 진술했습니다. 프레임 워크 작가들도 재창조합니다. COM이 제공하는 기능을 수행하기 위해 전체 .Net 프레임 워크가 다시 개발되었습니다.


0

어떤 사람들에게는 모욕적이지만, 나는이 용어가 어떤 형태의 엔지니어가 사용하거나 물건을 만들거나 디자인하는 주제와 관련하여 항상 불분명하다는 것을 알았습니다. 실제로, 나는 오늘날과 같이 빠르게 변화하는 세상에서 혁신을위한 압력을 고려할 때 그것이 도움이되지 않는 것으로 볼 수밖에 없습니다. 자신을 반복하거나 적절한 기존 솔루션을 무시하는 것이 결코 현명하지는 않지만 실제로 녹색 글자로 가득 찬 검은 화면을 쳐다 보지 않는 이유가 있습니다.

나는 그것이 "파산하지 않으면 그것을 고치지 말라"는 것을 이해하지만, 그러한 문구는 어떤 사람들에게는 무지하게 들릴 수 있다고 생각합니다. 그러나 우주 여행, 경주, 운송 등의 요구에 맞게 휠을 재발 명하려는 현재의 노력으로 "바퀴를 재발 명하지 마십시오"는 무지하고, 소리가 나지 않는 한 영리하지 않습니다.

저의 배경은 많은 프로젝트를 주도하는 것으로 구성되어 있으며 많은 인턴 및 다른 형태의 녹색 개발자와 협력해야했으며 일부 사람들은 '멍청한'이라고하는 많은 순진한 질문을 처리해야했으며 사람들을 토끼를 쫓지 못하게해야했습니다. 그들의 작업 범위를 벗어난 전체. 그러나 나는 결코 혁신이나 창의성을 낙담시키지 않을 것이며, '바람을 재발 명'하는 것에서 큰 것들이 오는 것을 보았습니다.

질문에 대한 나의 실제 답변 : 바퀴를 재발 명하는 것은 두 가지 상황 만 있습니다.

  1. 실제로 필요하지 않은 경우
  2. 당신이 할 수있을 때 그것을하는 다른 사람이라면

편집 : 나는 드라이브 바이 다운 투표로 내가 일부를 화나게했음을 알 수 있습니다. 내가 추가하고 싶은 한 가지는이 문구가 항상 내 주요 애완 동물 인 것입니다. 나는 내 두 센트가 다소 트롤처럼 들릴지 모른다는 것을 알고 있지만, 트롤, 화재 또는 불쾌감을 줄 의도는 없습니다.


0

"바퀴 재발견"에 대한 주장은 종종 라이브러리 사용을 선택하는 잘못된 맥락에서 사용되지만 거의 비슷한 것은 아닙니다.

최근에 인기를 얻었고 양식을 처리하는 데 도움이되는 라이브러리 'forms-plus'를 평가한다고 가정 해 봅시다. 멋진 방문 페이지, 현대적인 멋진 그래픽 및 주변에 컬트를 만드는 방법을 맹세하는 컬트 (공동체를 의미하는 문화)가 있습니다. 그러나 "forms-plus"는 "forms"의 추상화입니다. "형태"는 가능했지만 다루기가 번거로워서 더 쉽게 만드는 추상화가 대중화되고 있습니다.

새로운 추상화가 항상 일어나고 있습니다. 그것들을 바퀴와 비교하기는 어렵습니다. 실행해야하는 모든 복잡한 장치에 대한 새로운 제어 장치 및 새로운 설명서와 비슷합니다.

이 새로운 장치 "forms-plus"의 평가는 개인적인 경험에 따라 다르게 보일 것입니다. 이전에 양식을 작성하지 않은 경우 "forms-plus"는 시작하기가 쉽기 때문에 매우 매력적입니다. 단점은 "forms-plus"가 누출 추상화로 밝혀지면 여전히 "forms"를 배울 필요가 있다는 것입니다. "forms-plus"없이 양식을 작성하는 경우 새 도구를 배우는 데 필요한 시간을 고려해야합니다. 거꾸로 나는 이미 "양식"을 알고 있기 때문에 그 위에 추상화를 두려워하지 않습니다. 단기적으로는 새로운 초보자에게는 더 큰 이점이있을 것입니다. 무언가 개선되지 않으면 새 라이브러리가 없을 수도 있기 때문입니다. 장기적인 혜택은 추상화 품질, 채택률,

새로운 추상화 "forms-plus"를 사용하는 것과 베어 본 "forms"을 사용하는 것의 이점과 단점을 신중하게 평가 한 후 결정을 내립니다. 내 개인적인 경험에 기반한 결정은 다른 사람들이 다른 결정을 내릴 것입니다. 베어 본 "양식"을 사용하기로 선택했을 수도 있습니다. 어쩌면 나중에 폼 플러스 (forms-plus)는 더 많은 움직임을 가져와 사실상 표준이되었습니다. 그리고 시간이 지남에 따라 내 자신의 구현에 털이 생겨서 양식 플러스가하는 일을 많이 다루기 시작했을 것입니다. 이 시점에 오는 사람들은 내가 바퀴를 재발 명하는 데 열중하고 기존 라이브러리를 대신 사용해야한다고 비난하기 위해 끌릴 것입니다. "forms-plus"에 대한 결정을 내려야 할 당시에는 "forms-plus"에 대한 다른 대안이 여러 개 있었을 수도 있습니다.

결국 올바른 도구를 선택하는 것은 복잡한 결정이며 "바퀴의 재창조"는 매우 유용한 관점이 아닙니다.


-1

나는 이것에 관한 작은 기사를 썼다-http: //samueldelesque.tumblr.com/post/77811984752/what-re-inventing-the-wheel-can-teach-you

내 경험상 재발 명은 실제로는 길고 지루하지만 훌륭했습니다. 사용할 프로그래밍 모델을 정확히 모른다면 직접 작성하십시오 (시간과 에너지가있는 경우). 이것은 프로그래밍 모델이 정확히 무엇을 의미하는지 알려줄 것이며 궁극적으로 더 나은 프로그래머가 될 것입니다. 물론, 당신이 클라이언트를 위해 일하고 있고 빨리 무언가를 가져와야한다면, 당신은 아마도 약간의 연구를하고 당신에게 맞는 소프트웨어를 찾고 싶을 것입니다.

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