라이브러리와 코드 스 니펫을 많이 사용하지 않는 구체적인 이유가 있습니까? [닫은]


42

전반적으로 나는 약 8 년 동안 프로그래밍을하고 있으며, 나는 "일을 끝내기 위해"오픈 소스 라이브러리와 스 니펫 (GitHub!)에 점점 더 의존하고있는 것 같습니다. 나는 시간 안에 나 자신의 구현을 쓸 수는 있지만 전반적인 디자인에 집중하고 싶다는 것을 알고 있습니다.

이것이 정상입니까 (비 기업 환경)? 내 "프로그래밍"이 다른 라이브러리를 함께 붙이는 것 이상으로 잘못되면 어떻게 될까요?

"바퀴를 재발 명하지 마십시오"에 대해 알고 있지만 더 이상 단일 바퀴를 발명하지 않으면 어떻게됩니까?


3
"비 회사 환경"또는 사람들이 협력 하지 않는 환경 을 의미 했습니까 ?
Bryan Oakley

우리가 인터페이스와 추상 클래스로 작성하는 이유는 라이브러리가보다 보편적이고 덜 의존적이며 더 유연 해
졌다고 생각했습니다

1
사실, 아버지의 벨트가 벗겨지는 것은 너무 나쁩니다.
Thomas Eding

경의를 표하고 신용이 필요한 곳에서 신용을주는 것을 잊지 마십시오. 이 코드를 자신의 것으로 주장한 경우, The Belt는 확실히
hanzolo

3
아니요, 프로그래머가 나쁜 것은 아니지만 더 좋은 프로그래머는 아닙니다.

답변:


85

바퀴를 재창조하는 대신 라이브러리 사용 : 훌륭합니다! 모두가 그렇게해야합니다. 이미 수행 한 일에 대한 대가를받지 않습니다.

스 니펫 사용 : 복사하여 붙여 넣은 내용을 이해하고 다른 스타일과 접근 방식의 패치 워크 대신 일관성을 유지하기 위해 시간을 투자하는 한 아무 문제가 없습니다.


그것이 내가 생각했던 거죠. 어쩌면 내가 :)이 느낌 없애 오픈 소스 프로젝트를 시작한다
헨릭 P. Hessel

25
나에게서 +1 사람들은 이해하지 못하는 코드를 사용해서는 안됩니다. 스 니펫과 라이브러리에 적용됩니다.
Tim Post

5
스 니펫이 진행되는 한 항상 코드 자체를 다시 작성하여 작동 방식을 확신합니다. 도서관, 나는 그것이 어떤 이유로 든 나를 위해 작동하지 않는 한 다시 쓰지 않습니다.
Rei Miyasaka

12
팀 :에 대해서는 라이브러리, 내가 이해하지 않아도 방법 은 무언가를 내가 알고있는만큼, 무엇 은하지 않습니다. 예를 들어, 우리 중 많은 사람들이 암호화 라이브러리를 사용합니다. AES의 작동 방식을 모르지만 AES의 기능과 사용시기를 알고 있습니다.
user281377

@Rei Miyasaka 스 니펫은 종종 독립형 라이브러리보다 품질이 낮은 것 같습니다. 나 자신이 사용한 스 니펫의 여러 부분을 리팩터링해야했다.
Henrik P. Hessel

24

좋은 프로그래머는 좋은 코드를 작성합니다. 훌륭한 프로그래머는 훌륭한 코드를 훔칩니다.


라인 +1 원래인가요?
apoorv020

나는 그것이 이상한 속담이기를 바란다.
dan_waterworth

저는 iPhone에 있지만 Pablo Picasso (프로그래머를 아티스트로 교체)의 인용이라고 생각합니다.
Henrik P. Hessel

21
피카소는 말했다 Good artists copy, Great artists steal.
dan_waterworth

3
좋은 인용문. 내가 그것을 훔칠 것 같아요 ^ H ^ H ^ H ^ H ^ H 재사용.
Sane Wonko

24

코딩은 실제로 가장 낮은 수준의 프로그래밍입니다. 추상화 수준이 높을수록 프로그래머가 향상됩니다. 올바른 라이브러리 (오픈 소스 라이브러리 일 필요는 없음)를 선택하고 올바르게 연결하고 구성을 유지 관리하는 것은 모든 것을 직접 작성하는 것보다 훨씬 어렵지만 더 효율적이고 시간과 비용이 절약됩니다.


13

나는 내 자신의 라이브러리를 작성하는 것을 좋아합니다. 또한 제 프로젝트를 제 시간에 완료하는 것을 좋아합니다. 시간이 지남에 따라 대부분의 훌륭한 프로그래머는 유용하고 재사용 가능한 비트 모음을 작성합니다. 나는 당신에 대해 잘 모르지만, 5 년 전에 쓴 도서관을 사용할 때마다 기분이 좋아집니다.

아무것도 절대적으로 테스트 시간이 지남에 사랑을 받고있는 라이브러리 코드를 사용하여 문제가. 작동 방식을 알고 복잡성을 믿을 수 있으며 신속하게 구현할 수 있습니다.

즉, 라이브러리의 코드를 이해한다고 가정합니다. 충분한 시간이 주어지면 비슷한 품질의 것을 구현할 수 있다고 가정합니다.

나는 표준 C 라이브러리를 구현할 있는 정말 좋은 C 프로그래머를 알고 있습니다 . 취미 시간 동안 가장 즐거웠 던 것은 HelenOS의 C 라이브러리에서 작업하는 것이 었습니다.

따라서 계속 궁금해하고 배우는 한 라이브러리 코드를 사용하는 데 아무런 문제가 없습니다. 사용 방법을 이해하려는 노력이 아니라면 이해하지 못하는 코드를 사용 해서는 안된다는 것은 말할 나위 도 없습니다.


당신은 jQuery에 대한 나의 혐오감을 +1 설명했습니다.
aaaaaaaaaaaa

5

이 질문에서 다른 것보다 더 나아갈 것입니다. 라이브러리의 "클라이언트"개발자가 해당 라이브러리의 코드를 "이해"할 필요는 없다고 생각합니다.

나는 비교적 새로운 아이폰 개발자입니다 (일부와 비교). 내가 직접 만들 수 없었던 매일 사용하는 많은 라이브러리가 있으며 그 코드는 내 머리 위에 있습니다. 조금만 제공해도 중요하지 않습니다.

1) 해당 라이브러리에 대한 인터페이스를 완전히 이해합니다 (ASIHTTPRequest ninja입니다!)
2) 일반적으로 광범위하게 사용되는 라이브러리를 선택하므로 문제가 있는지 잘 조사하고 확신 할 수 있습니다. (예 : ASIHTTP, Stig Brautaset의 JSON 라이브러리, Facebook의 obj-c 라이브러리 등)
3) 실패 2 번, 길을 고르고 찾기 / 수정 / 사용자 정의가 필요한 항목을 찾거나 수정 / 사용자 정의 할 수 있을 정도로 간단 합니다. .

그 # 2는 이것의 논쟁적인 부분이 될 것입니다. 사실 저는 오픈 소스 커뮤니티에 의존하고 있습니다. 개발자 커뮤니티는 저보다 경험이 많고 똑똑 할 것입니다. 그러나 이것이 오픈 소스의 핵심입니다. 그래서 당신은 간다.


3

라이브러리 사용에 대한 경고를 던지고 싶습니다. Perl an R (및 일부 Java)의 과학 라이브러리를 자주 사용하는 사용자는 끔찍한 오버 헤드 비용을 피하기 위해 종종 라이브러리를 해킹해야했습니다. 라이브러리를 사용하는 것은 좋지만 점점 더 많은 라이브러리가 다른 라이브러리에 의존합니다. 다른 라이브러리는 표준 라이브러리를 사용하여 다소 일반적인 작업을 수행하는 세 번째 라이브러리를 호출합니다. 그리고 프로세스의 각 단계에는 입력 및 출력을 확인해야합니다. 이러한 검사 중 상당수는 완전히 중복되지만 그럼에도 불구하고 응용 프로그램의 무게를 weigh니다. 그리고 루프에서 사용될 때, 무게가 아주 무거워지기 시작할 수 있습니다.

그 옆에 라이브러리가 항상 역 호환성을 유지하거나 버그를 포함하고 있는지 확신 할 수 없습니다. 실제로 모든 라이브러리에는 몇 가지 버그가 있습니다. 이것이 코드의 특성입니다. 따라서 라이브러리에 대한 의존도가 높을수록 코드에 더 많은 버그를 입력 할 수 있습니다. 그리고 그 버그는 라이브러리를 다시 해킹하지 않고는 쉽게 해결할 수 없습니다.

라이브러리를 사용하는 것은 매우 현명한 결정이지만 라이브러리와 해당 동작을 잘 알고있는 경우에만 가능 합니다.

나는 아프고 컴퓨터가 저렴하지만 여전히 그렇다는 것을 알고 있습니다. 생각하지 않으면 더 많은 상처를 줄 수 있습니다.


3

일반적으로 대량의 소스 코드를 복사하는 것은 좋지 않습니다. 회사에서 다른 응용 프로그램 용으로 코드를 개발 한 경우 두 응용 프로그램에서 사용할 라이브러리로 코드를 추출하여 코드를 재사용 해야 합니다. 코드를 복사해서는 안됩니다. 코드를 복사하면 하나의 공통 사본 대신 2 개의 사본을 유지해야합니다.


3

코드 재사용은 매우 좋은 생각입니다. 중복성을 줄이고 유지 관리 성을 향상시킵니다.

제목은 코드를 라이브러리로 사용하고 있다고 제안하지만 질문의 텍스트는 소스 코드를 새 프로젝트에 복사하고 있음을 암시합니다. 가능한 한 다른 개발자의 코드를 라이브러리로 사용하려고합니다.

코드가 잘못되었거나 어쩌면 고장이 나거나 응용 프로그램에 잘 맞지 않는 모델을 기반으로하는 경우 문제가 있습니다. 이 경우 주어진 방식으로 작성된 이유 를 이해하는 것보다 일부 또는 모든 코드를 스크랩하고 처음부터 시작하는 것이 더 간단 할 있습니다 . 그러나 다른 코드는 참고 용으로 남겨 두십시오. 해결 방법이 확실하지 않은 문제가 발생할 수 있습니다. 다른 개발자가 아마도 같은 문제를 겪었을 가능성이 있으며, 그들이 어떻게 해결했는지 볼 가치가 있습니다.


당신은 저를 거기에 데려 갔다. 나는 또한 다른 경우 (라이브러리가 아닌) 다른 사람의 작업 코드를 복사하는 것을 언급합니다. 제 경우에는 합법적입니다. 어떻게 생각해?
Arman

1
@Arman 아직도 좋은 생각입니다. 유지 관리 측면에서 볼 때 원래 개발자가 코드에서 버그를 수정해도 여전히 버그가 있기 때문에 좋지 않습니다. 적어도 코드는 두 프로젝트에서 상당히 유사하기 때문에 아무 것도하지 않는 것이 좋습니다. 버그 수정을 많이 할 필요없이 별도로 적용 할 수 있습니다.
pswg

: 마지막 질문 : 예를 들어, Mason이 말한 것처럼, 예를 들어 라이브러리의 스트레스를받는 2500 줄의 코드가 내 작업을 시작하는 데 다소 유용하다는 것을 알았습니다. 나에게 좋은 것 같아? 윤리적인가?
Arman

@Arman 합법적이라면 윤리적 일 수도 있습니다. 같은 조직의 개발자가 작성한 경우 일반적으로 조직은 코드를 소유하며 조직 정책에 따라 코드를 사용할 수있는 모든 권한을 갖습니다. 다른 조직에서 작성된 경우 해당 조직의 허가가 필요합니다. 일반적으로 코드에 라이센스가 적용되지 않는 경우 원래 개발자는 실제로 사용 방법에 신경 쓰지 않지만 항상 개발자에게 눈에 띄는 코드 주석 (가능한 경우 링크 포함)으로 표시합니다.
pswg

4
이상적으로 는 복사 된 코드의 작동 방식 을 이해해야 합니다.
Mike Partridge

1

일반적으로 좋은 생각이므로 법적 문제가 없습니다.

그러나 라이브러리가 수행하는 작업과 수행 방식을 이해하는 데 시간을 투자하십시오. "매직"라이브러리를 사용하여 이해하지 못하는 것들을 처리하는 것은 잘못 사용했기 때문에 그 일부를 폭파시키는 좋은 방법이며, 그것을 고치는 방법을 모릅니다.


1
관대 한 동료 프로그래머가 만든 수백 줄의 코드를 "복사하여 붙여 넣기"가 여전히 윤리적인지 궁금합니다.
Arman

2
@Arman : 물어보세요.
메이슨 휠러

1
라이센스가 허용한다면 왜 윤리적이지 않습니까? 일을하려고하는데 한 바퀴가 이미 발명되어 무료로 이용할 수있게된다면, 재발 명하는 데 1 분의 시간을 낭비하는 것은 잘못 (즉 비 윤리적)입니다. 휠을 재창조하는 방법을 배워야한다면 완전히 다릅니다.
다리우스 X.

1

법적으로 코드를 재사용하면 단점과 단점이 거의 없습니다.

  1. 작업이 완료됩니다. 이것은 전문 개발에있어 더 중요한 것입니다. 궁극적으로, 대부분의 비 프로그래머를 방해 할 수있는 일을하는 방법을 알고 있기 때문에 보수가 좋은 직업입니다. 재사용을 통해 해당 목표를 더 빨리 달성 할 수 있으므로 업무에서 더 가치가 있습니다.
  2. 당신은 물건을 배웁니다. 이것이 자기 개선의 더 중요한 이유입니다. 다른 사람이 작성한 좋은 코드를 읽는 것보다 코딩을 향상시키는 더 좋은 방법은 없습니다. 다른 사람들이 작성한 나쁜 코드조차도 보통 무언가를 가르쳐줍니다! 또한 다른 사람이 이미 작성한 솔루션을 읽고 개선하는 것보다 라이브러리, API, 언어 또는 도메인의 작동 방식을 이해하는 더 좋은 방법은 없습니다. 당신은 기존의 코드를 재사용하는 경우에는 기존의 솔루션은 이제까지 없기 때문에 두 가지가 보통 일이 아주 당신이 필요 - 그리고 지식 향상에서 오는 곳에는 소스 땜질 계속되는입니다.

그것이 저의 목표이며 배우는 것입니다. 지금은 프로젝트를 끝내는 것보다 더 가치가 있습니다. 그렇기 때문에 작은 노력으로 (도서관을 언급하는 것이 아니라) 누군가의 작업을하려고 할 때 기분이 나빠집니다.
Arman

1

라이브러리와 코드 스 니펫 사용량이 많은 프로그래머가 나쁜 프로그래머입니까?

적절한 위치에서 라이브러리 및 코드 스 니펫을 사용하는 경우 '아니오' 라는 것은 나쁜 프로그래머라는 의미는 아닙니다. 그것은 당신이 적절한 장소에서 다른 사람들의 지혜를 적용 할 수있는 똑똑한 프로그래머라는 것을 의미합니다.

하나...

라이브러리와 코드 스 니펫 을 찾는 데 시간이 걸리므로 직접 코드를 작성할 수없고 사소한 작업을 구현하기 위해 라이브러리와 코드 스 니펫을 찾는 데 몇 시간을 소비해야한다면 '예' 입니다.


0

아니요. 프로그래머는 이미 존재하는 라이브러리를 사용해야합니다. 바퀴를 다시 발명하지 않습니다. 더 나은 방법이 있다면 갈 수 있습니다. 그렇지 않으면 동일한 코드를 작성하는 데 실제로 무엇을합니까? 유일한 것은 코드가 무엇인지 (그리고 중요한 경우에만) 알아야한다는 것입니다.


0

다른 답변의 이유 외에도 코드를 사용하지 않으면 (문제에 적합하다면) 비 윤리적 인 것으로 간주 될 수 있습니다.

  1. 고의로 고용주 시간을 낭비하거나
  2. 의도적으로 더 작은 제품을 제공하고있을 수 있습니다.

둘 다 미리 결정하기 어렵다는 것을 명심하십시오.

또한 일반적으로 Anit 패턴이라고하는 Not Invented Here 를 참조하십시오.


0

완료 목적으로 반론을 허용 하십시오 : http://web.archive.org/web/20150326134617/https://michaelochurch.wordpress.com/2015/03/25/never-invent-here-the-even-worse -여기서 발명되지 않은 형제 /

"Never Invent Here"(NeIH)라고하는 사고 방식. 이러한 사고 방식으로 인해 외부 자산이 과대 평가되고 종종 암시 적으로 신뢰되므로 엔지니어가 기성품 자산에 적응하는 데 더 많은 시간을 소비하고 자체 자산을 구축하는 데 걸리는 시간이 줄어 듭니다.

항상 균형이 있습니다.


-2

절대적으로 필요한 경우를 제외하고는 라이브러리를 사용하지 않습니다. 종속성은 이식성과 수명을 제한합니다. 저는 34 년의 소프트웨어 개발 경험을 가지고 있으며 침식 (변경)에 의해 파괴되지 않고 적어도 1 년의 프로그램을 3 년 이상 지속하고 싶습니다.

COM (Component Object Model), 17 년 전의 대답, 이론 상으로는 실제로 의심스럽고 재사용 가능한 구성 요소가 아니라 실제로는 기본 구성 요소 만 사용하고 필요한 경우에만 사용합니다.

API와 SDK는별로 사용되지 않습니다. 라이브러리에서 실제로 사용하는 코드 줄 수를 세분화하면 코드를 작성하는 데 시간을 소비하는 데 시간이 걸린다고 생각합니다. SDK 사용을 완전히 중단했습니다.

프레임 워크 : Zend, Silverlight, WCF, .NET, 계층화 된 시스템, 예. 초기 개발 속도를 높일 수 있지만 한계에 도달했을 때 균열을 해결하는 데 소요되는 시간은 그만한 가치가 없습니다. 그들은 몇 살이고 침식에 불 침투성입니까?

내 라이브러리만으로 JavaScript 및 HTML로갔습니다. 가장 일반적인 문 유형 만 사용하여 JavaScript를 제거했습니다. 나는 10 년 안에 지속될 무언가를 쓸 수 있기를 바랍니다.


이 문제의 일부는 라이브러리가 아니라 언어와 프로그래밍 도구의 지속적인 기술 변화로 인해 새로운 기술에서 새로운 라이브러리를 찾아서 똑같은 일을해야합니다.
gbjbaanb

-2

모든 것이 다릅니다. 게임을 코딩하는 경우 라이브러리 (예 : Allegro)를 사용하기 때문에 만들어 지지만 다른 사람들의 코드를 복사 / 훔치기 / 빌려주는 경우 실제로 프로그래머로 간주 될 수 없습니다. 나는 바퀴를 재발 명하는 것이 아니라 합리적인 지점으로 말합니다. 다른 사람들이 작성한 스 니펫 프로그램 전체를 만들지 마십시오. 컴퓨터에 앉아 직접 코드를 훔치지 마십시오. 요즘 사람들은 너무 게으르고 그냥 복사하여 붙여 넣습니다.

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