당신이 만든 프로그램이 어떻게 작동하는지 모른 채 살아도 괜찮습니까?


16

내 말은, 당신이 붙어있을 때 문제를 해결할 수 있고 실제로 사용하는 프로그래밍 언어에 대한 지식으로 해결할 수있는 방법을 모르는 유용한 라이브러리가 있습니다 ... 예를 들어 Boost for C ++ 또는 JQuery for JavaScript 또는 Spring for Java ... 몇 초 만에 문제를 해결하고 실제로 어떻게했는지 신경 쓰지 않습니다 (프로그래밍하는 것과 동일한 언어로 작성 되었음에도 불구하고 ...). 처음부터 내 문제에 대한 솔루션을 작성할 수 있습니까? 아니면 표준 관행입니까?


그들은 개인의 문제를 해결하지 않고 관련 분야의 일반적인 문제에 대한 해결책 일뿐입니다.
Abimaran Kugathasan

따라서 관련 영역에서 일반적인 문제를 해결하는 방법을 모르고 "*** (좋아하는 라이브러리를 여기에 사용하십시오)"라고 말하면 실제로 어떻게 작동하지 않습니까?
Kabumbus

1
당신은 이제까지 확장 프로그램을 프로그램? 솔직히 100 % 완벽한 라이브러리는 없으며 버그도 발생합니다. 이 버그가 사용중인 많은 외부 라이브러리 중 하나에 있고 개발주기가 2 년 단축되면 문제가 발생하면 무엇을 알고 있습니까? 사용중인 라이브러리 중 하나입니다! 솔직히 말해서 : 라이브러리를 빠른 수정으로 사용하는 것은 의미가 없습니다 (적어도 엔터프라이즈 수준의 소프트웨어에는 적합하지 않습니다).
jerluc

5
@jerluc : 표준 라이브러리는 어떤 조직의 코드보다 훨씬 더 잘 개발되고 지원됩니다. 예를 들어, boost 's shared_ptr은 내가 접촉 한 업계의 모든 사람들이 "필수"로 간주하며 boost에서 제공하는 다양한 코드는 내가 작업 한 프로젝트가 문제의 세부 사항에 초점을 맞추고 이미 수행 된 중요하지 않은 작업에 시간을 투자하십시오. 문제가 생길 수 있으므로 선택한 라이브러리를 선택해야하지만 일반적으로 좋습니다. "여기서 개발되지 않았습니다"증후군은 좋지 않습니다.
TZHX 2019 년

@TZHX 필자는 언급 한 내용이 "보일러 플레이트"코드로 간주 될 수있는 줄 바꿈과 같은 작업을 수행 할 수있는 라이브러리에 주로 적용된다고 말하는 데있어보다 명확해야한다고 생각합니다. IO 래퍼를 작성하지 않고 (발명 된 래퍼에 라이브러리를 사용할 수있는 경우) "발명 된 휠"을 신뢰하는 것이 합리적이지만 "어떤 둥근 휠"또는 다른 말로 라이브러리를 신뢰하는 것은 이치에 맞지 않습니다. 일종의 블랙 박스 마술과 그 순간에 필요한 것을 위해 작동합니다.
jerluc

답변:


22

문제를 직접 해결하는 방법을 이해하지 않고 라이브러리를 대신 사용하는 것이 좋습니까?

일반적으로 그렇지 않습니다.

라이브러리는 문제를 해결하는 방법을 파악한 다음 솔루션을 디버깅 한 다음 유지 관리하는 어려운 작업을 줄일 수 있습니다. 그러나 사용하려는 경우 어떻게 작동하는지, 솔루션이 실제로 문제를 해결하는 이유를 이해하는 것이 좋습니다. 정비사로 일하는 경우 자동차, 엔진 및 자동차 엔진을 제작하는 로봇을 발명하는 방법을 몰라도됩니다. 어울리다!

이것이 많은 사람들이 매우 전문화되는 이유입니다. 단일 언어, 단일 플랫폼, 단일 프레임 워크 및 라이브러리 세트로 작업하는 방법 만 배우는 경우가 많습니다.

말하자면, 배울 시간 이 너무 많습니다 . 때때로 당신은 지름길을 가져 가야합니다 – 지름길이지만 그것들이 지름길이라는 것을 아십시오. 아마도 당신은 시간이 있다면 그것을 알아낼 수 있다는 것을 알기 위해 도서관에 대해 충분히 읽었을 것입니다. 또는 실제로 호출해야하는 두 가지 기능 만 파악하면 제대로 호출 할 수 있습니다. 바로 가기인데, 이는 대개 나중에, 누군가 (나이가 많고 경험이 많을 수도 있음) 코드를 수정해야 할 때 가격이 책정됩니다.


13

일단 computerworld.com.au이 질문 비얀 스트로브 스트 룹을 "당신은 떠오르는 프로그래머를위한 조언이 있습니까?"
그리고 그는 대답했다"컴퓨터 과학의 기초를 알고 있어야합니다. 알고리즘, 기계 아키텍처, 데이터 구조 등. 응용 프로그램에서 응용 프로그램으로 기술을 맹목적으로 복사하지 마십시오. 현재 수행중인 작업, 작동 방식 및 작동 이유를 알고 있어야합니다. 업계에서 5 년 동안 무엇을 할 것인지 또는 앞으로 무엇을할지 알 수 있도록 일반적이고 유용한 기술 포트폴리오를 수집하십시오.보다 원칙적인 코드를 작성하십시오. "프로그래밍"을보다 전문적인 활동으로 만들고 낮은 수준의 "해킹"활동 (프로그래밍은 크래프트 일뿐 아니라 크래프트 만이 아님) 활동이 적음 필드의 고전과 고급 교과서에서 배우십시오. 쉽게 소화 된 "방법"에 만족하지 마십시오. 가이드와 온라인 문서-정보가 얕습니다. "
그것이 필요한 것에 대한 의심을 분명히하기를 바랍니다.진정한 프로그래머 와 누구나 하나가되기 위해 필요한 것.


4
+1-Stroustrup에 100 % 동의하지만 OP는 자신이하는 모든 일에 바퀴를 재발 명해야한다는 생각을 가져서는 안된다는 점에 유의하는 것이 중요하다고 생각합니다. 컴퓨터 과학 교육이 String 클래스와 MergeSort 및 기타 알고리즘을 구현하는 주요 이유는 선택한 언어로 제공되는 라이브러리를 사용할 때 어떤 일이 벌어지고 있는지 이해할 수 있기 때문입니다. 기초에 대해 잘 이해하고 충분한 라이브러리를
다루면

왜 차의 특정 브랜드와 맛이 그의 관심을 끌 었는지에 대한 철저한 분석, 정당화 및 설명을 위해 수십 개의 문단이 필요한 사람이 생겨나면서 초기 질문의 요점을 완전히 포기했습니다. 그러나 나는 여전히 그를 사랑합니다!
Filip Dupanović

1
솔직히 알고리즘, 머신 아키텍처, 데이터 구조 및 기타 많은 것들에 대해 많은 것을 알고 있습니다. 그렇다고해서 각 타사 라이브러리가 정확히 무엇을하는지 또는 그 뒤에있는 모든 이론을 이해한다는 의미는 아닙니다. 나는 이것이 좋은 조언이라고 생각하지만 앱에 대한 모든 것을 알아야한다고 해석하지는 않습니다.
David Thornley

12

예, 그리고 우리 모두는 그것을합니다!

예를 들어, 일부 Mac 관련 그래픽 코드에서 수정 한 매우 간단한 버그를 살펴 보겠습니다. 버그를 둘러싼 코드에는 여러 단계가 포함되었습니다.

  1. 먼저 Objective C 메소드는 malloc ()을 사용하여 픽셀 버퍼를 할당하고이를 Objective C 오브젝트에 첨부합니다.
  2. 나중에 어떤 일이 발생하면 C 루틴은 Objective C 오브젝트에 메시지를 보내고 픽셀 버퍼를 검색합니다.
  3. C 루틴은 jpeglib를 사용하여 픽셀 버퍼 내용을 압축하고 TCP / IP 연결을 통해 전송합니다.

거기에는 끔찍한 일이 많이 있습니다! 몇 가지 사항이 있습니다.

  • malloc ()을 구현하기위한 동적 메모리 할당 자. 메모리가 물리적으로 연속적이고 선형 적으로 주소 지정 될 수 있다고 가정합니다.
  • 기본 다윈 커널 가상 메모리 시스템은 조각난 물리적 RAM과 디스크 공간 (RAM과 다른 물리적 장치)을 물리적으로 연속적이고 선형으로 주소 지정할 수있는 RAM처럼 동적 메모리 할당 자에게 나타나는 것으로 매핑합니다.
  • 목표 C의 목표 시스템
  • Mac OS 런타임 메시징 시스템 및 Objective C 오브젝트와의 상호 작용 방식
  • 이산 코사인 변환 알고리즘을 사용하는 JPEG 손실 래스터 이미지 압축 표준의 jpeglib 라이브러리 구현
  • 다양한 TCP 및 IP 프로토콜 구현을 통해 호출하여 OS 커널로 호출하는 데이터를 전송하기위한 사용자 공간 네트워킹 루틴. 그런 다음 네트워킹을 위해 설정 한 내용에 따라 이더넷 포트, Wi-Fi 칩 또는 USB 또는 Firewire 드라이버의 드라이버를 호출 할 수 있습니다.

모든 것들이 실제로 어떻게 구현되는지에 대한 모든 세부 사항을 이해하고 있습니까? 확실하지 않습니다! 지구상에는 아무도없는 사람이 너무 많을 것 같습니다. 그래서 나는 그것에 대해 걱정하지 않습니다.

그러나 호기심을 갖고 사용하는 라이브러리와 도구에 대해 최소한 조금 배우는 것이 좋습니다. 처음 프로그래밍을 시작했을 때 컴파일러와 운영 체제가 마법이 될 수 없다는 것을 알았지 만 확실히 저에게는 그렇게 보였습니다. 그런 것들에 대한 호기심에 빠지면서 나는 많은 것을 배웠고 지금까지 훌륭한 경력을 쌓았습니다.


1
내가 일상적으로 사용하는 모든 코드를 이해하려면 JPEG를 포함한 데이터 압축, <i> The Nurbs Book </ i>의 모든 것을 포함한 기하학적 데이터 표현, PDF 및 U3D 형식의 복잡성 및 훨씬 더. 나는 모든 것에 대한 언급을 가지고 있지만 결코이 모든 다운 팻을 가지지 않을 것입니다.
David Thornley

나는 작업 코드를 작성하는 데 사용하는 모든 빌딩 블록을 항상 자세히 이해하지는 않지만 이것이 일어날 때 불행하다고 느낍니다. 필요한 경우 기본 구성 요소를 이해하고 인생을 훨씬 쉽게 만들 수 있다는 것을 이해하거나 적어도 아는 것. 할당 기 작동 방식, JPEG 이미지 압축에 사용되는 원리, TCP / IP 작동 방식, 가상 메모리 구현 방식, CPU 작동 방식 등을 알고 있습니다. 좋지만, 세부 사항에 있지 않는 액세스 ... 정말 나쁜 느낌
피에르 아르노

5

라이브러리를 사용하는 주된 이유는 항상 "바퀴를 재발 명"하지 않고 해결하려는 문제를 추상화하는 것입니다. 문제를 직접 해결하려고 할 수 있지만 시간이 더 오래 걸립니다.

그러나 나는 우리가 도서관이 문제를 어떻게 해결했는지 알고 있거나 추측해야한다고 생각합니다. 이것은 일반적으로 라이브러리의 사용자 설명서와 오픈 소스 소프트웨어와 함께 문서화되어 있으므로 언제든지 직접 코드를 볼 수 있습니다.

또한 어쨌든 어려운 부분을 추상화하여 문제를 해결하기 때문에 왜 문제가되지 않습니까?


5

라이브러리는 일반적인 문제에 대한 솔루션을 제공합니다. 해결하려는 특정 문제를 해결할지 결정해야합니다. 그들은 문제를 해결하는 방법을 모르는 대신 할 수 없습니다. 예를 들어, 응용 프로그램에 해시 테이블이 필요하다고 가정하면 해시 테이블이 해결하는 문제를 이해하기에 충분한 지식이 있어야합니다. 사용중인 라이브러리의 성능을 평가하여 애플리케이션에서 작동하는지 여부를 결정할 수 있어야합니다. 부적절한 기술 지식을 다루기 위해 라이브러리를 사용하는 것이 올바른 사용 사례가 아니라고 생각합니다. 라이브러리 사용 결정은 라이브러리 사용이 개발 속도를 높이고 테스트되고 신뢰할 수있는 솔루션을 제공할지 여부를 중심으로해야합니다. 라이브러리를 사용하기로 한 결정은 프로그래머가 주어진 문제를 해결할 수 없다는 것을 중심으로해서는 안됩니다.


즉, 현재 프로젝트에서 PDF 및 U3D 사양에 대한 세부 정보를 알아야합니다. 특정 대학원 프로젝트의 경우 특정 선형 프로그래밍 알고리즘에 대해 많은 것을 알아야했습니다 (단지 내 경우에는 단순하지 않았을 것입니다). 라이브러리를 사용하기 위해 라이브러리가하는 일을 정확히 이해해야한다면 아무 일도하지 않을 것입니다.
David Thornley

구현의 모든 세부 사항을 이해해야한다고 주장하지는 않습니다. 그러나 결과에서 무엇을 기대해야하는지 알아야합니다. 해시 테이블 예제를 다시 가져옵니다. 성능이 떨어지는 경우 이유를 평가하는 방법은 무엇입니까? 내가 생각하기 시작한 첫 번째 것은 내 키 사이의 충돌 속도입니다. 어떻게 작동하는지 모를 경우 어떻게해야하지 않거나 예상하지 못한 방식으로 가설을 세울 수 있습니까?
Pemdas

5

정말 당신에게 달려 있습니다.

작업중인 도구를 잘 이해하면 도구를 더 잘 활용할 수 있습니다.

예를 들어, 나는 jQuery를 거의 사용하지 않지만, 그것을 활용해야 할 때, Mootools와 같은 다른 프레임 워크와 어떻게 공존 할 수 있는지 알아야합니다.

또한 곧 UDK를 사용하여 gamedev로 모험을 할 것입니다. 더 많이 이해할수록 악의에 따라 더 많이 구부릴 수있을 것입니다. 첫 번째, 약간의 추가 시간과 뇌주기를 선택하면 더 쉽고 더 나은 결과를 얻을 수 있습니다.


5

자신의 영역과 프로세스의 일부를 아는 것이 중요합니다.

예를 들어, 이미지 처리 라이브러리를 사용한다고 가정하십시오. 가우시안 블러, 변형 및 색상 공간에 대한 모든 정보를 알아야합니까? 아니요. 그러나 먼저 라이브러리를 사용 하는지 알아야 합니다. 또는 프레임 워크의 정렬 기능. 사용 된 실제 정렬 알고리즘을 알아야합니까? 대부분의 경우 아닙니다. 그러나 왜 데이터를 정렬해야하는지 알아야합니다.

반면에 컴파일러를 작성하는 경우 프로세스 의 일부 이기 때문에 컴파일러 작동 방식을 더 잘 알 있습니다.

jQuery와 같은 특정 프레임 워크는 많이 추상화됩니다. 당신이 할 필요 가 작업하는 방법을 정확하게 알고? 제 그러나 강력한 근본적인 이해를 가진 어떤 라이브러리가이 코드를 작성 당신이 프레임 워크는이 방법을 만들어 더 나은 이유를 이해하고, 그 잠재력에 사용할 수 있기 때문에 당신에게 매우 도움이 될 것입니다하고있다가 .


2

내 경험에 따르면 : 도서관 의존성을 제거 할 수 없기 때문에, 귀하와 귀하의 팀은 문제를 해결하기에 충분히 알아야합니다.

프로그래머로서 우리는 시간이 거의 없으므로 우선 순위가 가장 높은 것을 선택해야합니다. 문제는 최대한 빠르고 부드럽게 해결해야합니다. 이 이유만으로 "사물에 관한 모든 것을 배우는 것"은 다소 중복됩니다.

여기에 추가하고 싶은 것은 "의존성"입니다. 공동체로서 우리 모두는 다른 사람들에게 의존합니다. Java, .NET, API 등 애플리케이션을 구축하기 위해 Giants에 서 있습니다. 많은 사람들에게 효과가 있기 때문입니다. 프레임 워크 또는 API에 문제가있는 경우 다른 사람이 어딘가에 직면했을 가능성이 높으며 해결 방법 / 해결 방법이 있습니다.

여기서 유일한 문제는 어딘가에 제한된 기준으로 자이언츠가 무너 졌을 것입니다. 예를 들어, 일부 OS에서는 플래시가 지원되지 않으며 플래시 없이는 할 수없는 일이 많이 있습니다. 이 가능성은 0보다 크지 만이 경우에는 할 수있는 일이 거의 없습니다. 이러한 경우에만 문제의 실제 위치를 지적하고 큰 해결 방법을 만들 수 있으므로 "후드 뒤에있는 것"에 대한 지식이 유용합니다. 그러나 우리가 투자 할 가치가있는 시간이 확실하지 않습니다.

그 가능성에 대처하기 위해 해결책이 있다고 생각합니다. 대부분의 프로그래머는 라이브러리의 "표면 작업"을 쉽게 잡을 수 있기 때문에 때로는 매우 잘 이해하는 사람이 필요합니다. 각각이 약 1,2 개의 유용한 라이브러리 / 도구 / "기술 세트"를 전문 으로하는 팀을 구성하려고합니다 . jQuery에 대한 좋은 경험이 있고, 데이터베이스에 대한 전문 지식이있는 사람입니다.


2

또 다른 관점은 보안입니다. 정확한 내부 작업을 모르는 라이브러리를 사용하면 정확히 무슨 일이 일어나고 있는지 가정합니다. 각 실패한 가정은 악의적 인 공격자에 대한 공격 경로를 열 수 있습니다.

Quicksort를 호출 할 때는 최악의 경우 동작에 대해 알고 있어야합니다. 다른 방법으로 공격자는 최악의 데이터를 주입하고 DoS를 수행 할 수 있습니다.

압축 라이브러리를 호출 할 때 일부 데이터가 더 적은 바이트로 압축되면 원본보다 더 많은 바이트로 "압축"하는 데이터가 있어야합니다. 따라서 출력 버퍼가 [더 적은 바이트로] 압축하기 때문에 입력 데이터의 크기 만 필요하다고 가정하면 버퍼 오버 플로우가 발생하기를 기다리는 것입니다.

당신의 가정이 사실임을 증명할 수 있도록 당신이 할 일들에 대한 충분한 기초를 알아야합니다. 그렇지 않으면 라이브러리는 명시 적으로이를 처리해야합니다. 예를 들어 제공된 출력 버퍼가 충분히 크지 않은 경우 예외가 발생합니다.


1
고정 크기의 버퍼를 할당 아무것도하는 일이 기다리고 버퍼 오버 플로우입니다. 동적 배열을 지원하고 수신자가 자체 버퍼를 관리하도록하는 언어를 사용하는 것이 훨씬 좋습니다.
메이슨 휠러

1

작동한다고 확신하는 한 사용하는 모든 것을 이해하지 않아도됩니다. lib의 버그에 물린 후에는 작동 방식, 작동 방식 및 작동하지 않는 이유를 확인할 시간이 있습니다. 물론 당신은 항상 당신이 필요하지 않더라도 후드 아래를 볼 것을 환영하고 격려합니다.

프로그래밍에서 어려운 점 중 하나는 모든 문제를 스스로 해결하려는 유혹을 극복하는 것입니다.


1

괜찮지 만 위험합니다. 일반적인 관행으로, 그가 개발 한 것에 대한 작업을 알아야합니다.


1

킨다 ...

라이브러리 또는 프레임 워크가 수행하려는 작업의 일반적인 요지를 얻는 한 괜찮습니다. 내부 부품에 관해서는 그렇지 않습니다. 실용적인 접근 방식을 취하십시오. 그것은 작동하고, 내가 원하는 것을했습니다.

요점은 작은 세부 사항들로 가득 차 버리지 않고 이미 지독한 아이디어를 구현하는 것입니다.

요점은, 당신은 모든 것을 알지 못할 것입니다. 진지하게, 당신은 모든 것을 조사 할 시간이 거의 없습니다. 왜냐하면 그것은 당신의 아이디어를 창조하려는 주요 목표에서 당신을 혼란스럽게 할 것이기 때문입니다. 주말마다 자유 시간을 설정하여 주제에 관한 챕터 등을 읽을 수 있습니다.

하지만 여가 시간이 많지 않으면 모든 것을 알아 내려고하지 마십시오. 이런 식으로보십시오. 프로그래밍 언어의 이유는 우리가 어셈블리 코드를 수행하지 못하게하는 것입니다. 어셈블리 코드의 이유는 1과 0을 수행하지 못하도록하기위한 것입니다. 나는 당신이 그 메커니즘의 세부 사항을 모두 알아야 할 필요는 없다고 생각하지만 일반적인 요점 만 알고 있습니다. 가비지 수집기와 마찬가지로 포인터 / 메모리를 처리한다는 것을 알고 있으며 사용하는 마술처럼 깔끔한 알고리즘을 신경 쓰지 않고 작동합니다 (필요한 것). 어쩌면 그것의 단점이지만 meh. 물론 당신은 당신이 그것을 다루어야하는 분야에 있습니다. 그럼 당신은 어쨌든이 질문을하지 않을 것입니다. 하하의 일의 일부입니다.

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