깊은 프로그래밍 지식 개발


136

때때로 Jon Skeet 및 Eric Lippert와 같은 사람들이 쉽게 대답 할 수있는 스택 오버 플로우의 에지 케이스 및 기타 이상한 점에 대한 질문을 보았습니다. 이 언어와 그 복잡한 것에 대한 깊은 지식을 보여줍니다 .

당신은 사용하기 위해 생각할 수도 foreach루프를 컬렉션이 구현해야하는 이상 반복된다 IEnumerable거나 IEnumerable<T>. 그러나 실제로는 이것이 요구 사항이 아닙니다. 컬렉션의 형식에는이라는 공용 메서드 GetEnumerator가 있어야하고 공용 속성 getter가있는 형식과을 반환하는 Current공용 메서드가 MoveNext있어야합니다 bool. 컴파일러가 이러한 요구 사항을 모두 충족한다고 판단 할 경우 해당 메소드를 사용하도록 코드가 생성됩니다. 이러한 요구 사항은 우리가 객체가 구현하고 있는지 확인합니까 충족되지 않은 경우에만 IEnumerableIEnumerable<T>.

알아두면 좋은 일입니다. Eric이 왜 이것을 알고 있는지 이해할 수 있습니다. 그는 컴파일러 팀에 있기 때문에 알아야합니다. 그러나 내부자가 아닌 그러한 깊은 지식을 보여주는 사람들은 어떻습니까?

C # 컴파일러 팀에 소속되지 않은 필사자 만이 어떻게 이런 것들을 알아낼 수 있습니까?

구체적으로, 이러한 사람들이 그러한 지식을 체계적으로 뿌리 뽑고 탐구하고 내면화하는 데 사용하는 방법이 있습니까?


10
저는 이것이 오픈 소스 소프트웨어가 빛나는 곳이라고 생각합니다. 프레임 워크 / 시스템 / 라이브러리를 완전히 시작할 수있는 것이 좋습니다. WinForms로 작업 할 때보 다 Qt로 작업 할 때 프레임 워크 내부를 더 잘 이해할 수있었습니다.
Vitor Py

2
특별한 군중 앞에서 바보처럼 보이지 않는 것 외에이 특정한 예를 언제 알아야합니까? 그들은 이것을 바보로 증명했습니다. 그 외에도 Effective C #, Java, C ++ 등 시리즈에는 멋진 것들이있을 수 있습니다. Eric Lippert의 블로그도 좋은 소스입니다. 일반적으로, 우리는 "100 년 동안 살면서 100 년 동안 배우고 바보"라고 말하는 것처럼 모르는 것을 종종 알지 못합니다.
Job

26
노력할만한 가치가 있습니까? 나는 이중 언어이며 몇 가지 다른 언어를 배우려고 노력하고 있습니다. 나는 수학 수업을 들었지만 충분하지는 않았습니다. 테니스를 반 정도하는 법을 배우고 나비 스트로크로 수영하는 법을 배우고 싶습니다. 더 여행하고 싶습니다. Clojure를 배우고 싶습니다. 내가 원하지 않는 것은 Michael Phelps 등과 같은 수영장에서 일주일에 30 시간을 소비하는 한 언어 전문가, 수학 박사 학위를 소지하는 것입니다. Lippert와 Skeet의 지식은 그들이 다른 경험을 놓치면서 하나 또는 몇 가지 일에 노력하십시오. 아마 직업을 바꿀까?
Job

10
"Eric이 이것을 알고있는 이유를 이해할 수 있습니다. 그는 컴파일러 팀에 속해 있으므로 알아야합니다." 그는 처음부터 생각했기 때문에 이것을 알고있을 가능성이있다 . 나는 그가 다음과 같이 작동한다는 것을 '발견'해야 의심 :)
Alex ten Brink

10
@Alex : 실제로 C # 3 구현을 시작한 이후로 실제로 C #에서만 작업했습니다. "foreach"사양은 6 년 전에 작성되었습니다. 나는 아직도 언어에 관한 미친 역사적 것들을 매일 발견합니다. 예를 들어, 오늘 ((A + B) + C)-(A + C) = A + B + C이지만 ((A + B) + C)-(B + C) = A 이상하다!
Eric Lippert

답변:


167

먼저 친절한 말에 감사드립니다.

당신이 C 번호에 대한 깊은 지식을 얻고 싶은 경우에 그것은 의심 할 여지없이 장점 언어 사양, 디자인 노트 10 년, 소스 코드, 버그 데이터베이스를 가지고, 그리고 앤더스, MADS, 스콧과 피터 단지 복도. 나는 확실히 운이 좋다. 그것에 대해 의심의 여지가 없다.

그러나 이러한 이점이 없어도 주제에 대한 깊은 지식을 얻는 것이 여전히 가능합니다.

Microsoft에서 시작했을 때 Internet Explorer 3과 함께 제공되는 JScript 인터프리터로 작업하고있었습니다. 당시 관리자는 제가 얻은 최고의 조언 중 일부를 말해주었습니다. 그는 JScript 언어의 구문과 의미에 대해 Microsoft에서 인정받는 전문가가되기를 원했으며 JScript의 이러한 측면에 대한 질문을 찾고 대답함으로써 이에 대해 이야기해야한다고 말했습니다. 특히 내가 알지 못하는 질문에 대답 할 수 있습니다.

분명히 StackOverflow와 다른 공개 Q & A 포럼은 그런 종류의 소방 호스에서 술을 마시는 것과 같습니다. 그 당시 comp.lang.javascript와 내부 Microsoft "JS User"포럼을 종교적으로 읽었으며 관리자의 조언을 따랐 습니다. 대답을 모르는 언어 의미 에 관한 질문을 보았을 때 알아 내 사업.

그런 "딥 다이빙"을하고 싶다면 신중하게 선택해야합니다. 이 날에 나는 현저 브라우저 객체 모델이 어떻게 작동하는지 알지. 지난 몇 년 동안 C # 언어 전문가가되는 데 집중 해 왔기 때문에 기본 클래스 라이브러리의 다양한 클래스가 작동하는 방식에 대해 무지합니다. 구체적인 지식을 소중히 여기는 직업이 있다는 점에서 운이 좋았습니다. 직업이나 재능이 일반 주의자가되기에 더 깊다면 깊이가는 것은 효과가 없을 수도 있습니다.

블로그를 작성하는 것도 큰 도움이됩니다. 다른 사람들에게 복잡한 주제를 설명하도록 요구함으로써, 나는 항상 다양한 주제에 대한 내 자신의 부적절한 이해에 직면해야합니다.


14
이 주제를 벗어나지 말고이 답변을 읽은 후에 왜 여기 또는 스택 오버플로에 대해 질문하지 않은지 궁금합니다. 이 시점에서 동료, 블로그 등이 충분합니까? 우리가 알아야 할 SO보다 더 나은 리소스가 있습니까?
Matthew 읽기

6
아마도 당신은 그가 말하는 것을 오해했을 것입니다. 반 직관적으로, 그는 물건을 배우기 위해 질문하지 않고 질문에 대답했습니다 .
jhocking 2013

65

대화의 "구루"쪽에 한두 번 있었다면, 나는 당신이 프로그래밍 언어 나 시스템에 대한 "심층 지식"으로 인식하는 것이 종종 "구루"가 최근에 고투하고있는 결과라고 종종 말할 수있다 똑같은 문제를 해결하기 위해 한 달. 사람들이 어떤 질문에 대답 할 것인지 선택할 수있는 포럼에서 특히 그렇습니다. Jon Skeet과 Eric Lippert 같은 사람들도 한 번에 Hello World를 배워야했습니다. 그들은 다른 사람과 마찬가지로 한 번에 하나의 개념을 선택합니다.


1
아주 좋은 지적입니다. 나는 오랜 연구를 시작할 때 종종 내가 일찍 배운 것들로 인해 내가 대답 할 수있는 질문을 찾는다는 것을 종종 발견합니다.
Matthew 읽기

47

Yogi Bhajan의 역설 :

"무엇을 배우고 싶다면 그것에 대해 읽으십시오. 무언가를 이해하고 싶다면 그것에 대해 쓰십시오. 무언가를 마스터하고 싶다면 프로그램 하십시오."

프로그래밍은 궁극적 인 교수 과제와 같습니다. 컴퓨터 교육은 물건을 잘 아는 것, 또는 그것을 배우는 법을 배우기 위해 필요한 것을합니다.

예를 들어 물리학을 배우려면 물리 엔진을 작성하십시오. 체스를 배우려면 체스 게임을 프로그래밍하십시오. 깊은 C # 지식을 배우려면 C # 컴파일러 (또는 다른 도구)를 작성하십시오.


2
프로그래밍은 또한 가장 모호하지 않은 방식으로 글쓰기 (물론 사람들이 읽을 수있는)를위한 적당한 시도입니다.
vpit3833

4
그 인용문은 체스 예제를 읽을 때까지 정말 깊게 들렸습니다. 불행히도 체스 AI를 프로그래밍한다고해서 더 나은 체스 플레이어가되지는 않습니다 (기본적으로 Min-Max 트리에서 검색합니다). 여전히 +1
bughi

1
@bughi 어쩌면 당신은 규칙을 마스터 할 수 있습니다 : D
Julio Rodrigues

@bughi, '프로그램'은 코드 작성과 항상 관련이있는 것은 아닙니다. 상자 밖으로 조금 생각하십시오.
Nitesh Verma

25

내가 아는 한, 이것을 배우는 방법은 다음과 같습니다.

  • Eric Lippert와 같은 누군가로부터 그것에 대해 읽으십시오
  • 문제를 직접 경험하고 해결하십시오.

두 번째 방법은 시간이 더 오래 걸리지 만 더 깊은 이해를 가져올 수 있습니다 (항상 그런 것은 아님).


17
아니면 둘다. [15 글자]
Michael K

23

나는 다음과 같이 말할 것이다.

가장 일반적인 작업을 수행 할 수있는 수준에서 상대적으로 유용한 언어 스택 (실제 작업에 필요한 언어)을 학습 한 후에는 적어도 하나 이상의 깊이를 공부할 때까지 더 많은 언어 학습을 중단하십시오. 제 생각에 현재 업계에서 문제의 일부는 사람들이 다른 언어로 넘어 가기 전에 언어의 처음 5-10 % 만 배우는 것입니다. 작업에서 가장 일반적인 작업을 수행 할 수있는 기능이 있으면 한 가지만 살펴보십시오. (깊이를 얻은 후에는 넓어짐으로 돌아가서 둘 사이를 앞뒤로 이동할 수 있습니다.)

더 복잡하고 어려운 과제에 대한 자원 봉사자. 문제를 해결하기 위해 깊이있게해야합니다. 작업 할 곳이없는 경우 개인 프로젝트를 수행하거나 시작해야 할 오픈 소스 작업을 찾으십시오. 직업에 흥미로운 문제가 없다면,보다 도전적인 직업을 찾으십시오.

30 일 유형의 서적에 대한 Learn X 대신 한 언어로 고급 서적을 읽으십시오 (예 : SQl Server의 경우 성능 조정 및 데이터베이스 내부에 대한 독서를 포함 함).

여기에서 흥미로운 질문과 그들이 묻는 다른 장소를 읽고 스스로 해결해보십시오. 배우고 싶다면 먼저 다른 답변을 읽지 말고 문제를 해결하십시오. 질문에 이미 답변 된 경우에도 답변을 찾으면 더 많은 정보를 얻을 수 있습니다. 질문보다 더 나은 답변을 찾을 수도 있습니다.

몇 가지 어려운 질문을하십시오. 당신이 주어진 답을 평가하십시오, 단지 사용하지 마십시오. 답이 효과가 있거나없는 이유를 이해해야합니다. 그 답을 연구의 시작 장소로 사용하십시오.

해당 분야의 알려진 전문가가 제공하는 유용한 기술 블로그를 찾아 읽어보십시오.

지식을 다 쓴 후에는 그만 버리십시오. 유지하는 법을 배우십시오. 대부분의 전문가는 일반적인 구문을 찾을 필요가 없습니다. 그들은 문제에 직면 할 때마다 바퀴를 재발 명할 필요가 없습니다. 그들은 이전에 비슷한 문제에 어떻게 접근했는지 기억하기 때문입니다. 그들은 점들을 연결할 수 있고 2 년 전에했던 문제 X가 현재 가지고있는 문제 Y와 얼마나 비슷한 지 볼 수 있습니다 (그러한 사람들이 그와 같은 관계를 맺을 수있는 것처럼 보이지 않음). 결과적으로 더 흥미로운 주제를 연구하는 데 더 많은 시간을 할애 할 수 있습니다.


좋은 대답입니다. 하지만 궁금한 점이 있습니다. 지식을 유지하고 점을 연결하는 데 어떻게 도움이됩니까?

나는 당신이 배운 것을 기록 할 것을 제안합니다. 나는 Evernote에서 이것을하기 시작했고, 몇 년 동안, 나는 내 노트에서 살 수 있다는 것을 알았습니다. 천천히, 나는 또한 나의 메모가 프레젠테이션으로 만들어 질 수있는 시점에 도달했다.
시바 수 브라마 니안

9

전문가가 되려는 언어의 언어 사양을 깊이 연구하여 시작할 수 있습니다 . 예를 들면 다음과 같습니다.


3
좋은 대답-예를 들어 링크 된 C # 사양의 15.8.4 섹션은에 대한 구현을 다루고 foreachEric Lippert의 인용 된 블로그 게시물에 설명 된 동작을 설명합니다. "foreach가 실제로 어떻게 작동 하는지 궁금합니다 ." 와 같은 생각을하는 사람이 있다면 이 곳을 찾아 보는 것이 좋습니다.
Carson63000

6

가져 반사경 또는 다른 디 컴파일러를 (지금 지불 이후)하는 방법과 내부의 작업 내용을 가장 많이 사용되는 .NET 라이브러리의 일부를 개방 시작합니다. C #통해 CLR 과 같은 책과 결합 하면 상당히 깊어 질 것입니다.


5
실제로 BitConverter클래스 에서이 작업을 수행 하고 IsLittleEndian시스템 별 플래그를 발견했습니다 .
Robert Harvey

LOL. isLittleEndian의 +1
Rudy

4

나는 comp.lang.c++.moderated그 시점에서 코드를 작성하기 위해 열심히 노력하지는 않았지만 C ++ 에서 몇 년간 놀아서 그러한 지식을 개발했습니다 . 그래도 내가 어떻게 말할 수 있는지 잘 모르겠습니다.

저는 프로그래밍 언어에 대해 두 가지 종류의 지식이 있다고 생각합니다.

  1. 언어에 대한 간단한 지식과 함정을 피하는 방법을 알고 있습니다.
  2. 효과적으로 문제를 해결하는 방법을 알고 있습니다.

2 번은 언어로 프로그래밍하고 다른 사람들의 코드를보고 만 달성 할 수 있지만, 1 번은 토론 포럼에서 언어에 대해 많은 시간을 들여서 사람들이 어떤 종류의 질문을하고 있는지, 답변이 있습니다. StackOverflow도 좋은 곳입니다.


4

깊은 지식과 프로그래밍 전문 지식은 모든 추상화 수준에서 편안함을 의미합니다. 즉

  • 라이브러리 및 API
  • 언어 의미론
  • 컴파일러 최적화
  • 컴파일러 내부 및 코드 생성
  • 런타임 및 가비지 수집기 동작
  • 건축 및 지침 세트 문제

지난 15 년 동안 내가 본 모든 것은 실제로 컴파일러와 런타임에 들어갈 수있는 경우에만 매우 능숙해질 수 있다는 것을 보여주었습니다. 당신은 추상화의 다음 단계에서 소프트웨어를 단계를 가지고 추론 (건물)을 시작하기 위해 자신을 강제 할 수 있습니다 스택의 낮은 있지만, 전문 지식의 유일한 방법.

우리에게 필요한 것은 추상화를위한 언어입니다. 기계가하는 일을 실제로 알기 위해 프로그래밍 언어가 어떻게 설계되고 구축되는지 이해해야합니다.


3

훌륭한 매뉴얼을 읽으십시오. 이것은 특별히 깊은 지식이 아닙니다. C # 언어 사양 섹션 8.6.4에 게시되어 있습니다 . 사용하는 언어에 대한 사양을 최소한 감추고 모든 내장 라이브러리에 대한 설명서를 감추는 습관을 가져야합니다.

어쨌든 이것은 깊은 지식에 대한 나의 생각이 아닙니다. 단지 흥미롭지 않은 구현 세부 사항입니다. 디자이너가 객체가 Iterable을 구현하는지 확인하는 대신 왜 더 역동적 인 방식으로 수행했는지 설명하면 더 흥미로울 수 있습니다.


1
C # 언어 사양을 "스키밍"하는 것은 없다고 생각합니다.
Robert Harvey

@RobertHarvey : 연산자 우선 순위 및 선언 구문과 같이 이미 알고있는 사항을 포괄하는 대부분의 공식 언어를 훑어 볼 수 있으며 C # foreach 또는 Java 열거 형 생성자의 정확한 동작과 같이 예기치 않은 유용한 세부 사항에 집중할 수 있습니다.
케빈 클라인

주석이 달린 표준 버전을 구입할 수 있습니다. 지금은 조금 날짜가 있지만 주석은 다루는 언어 부분에 여전히 흥미 롭습니다.
Jørgen Fogh 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.