내 공예 (프로그래밍)에 대해 깊이 이해하기 위해 마스터해야하는 프로그래밍 개념은 무엇입니까? [닫은]


13

중요하게, 그렇게 할 수 있고 그렇지 않을 수 있다면, 프로그래밍 방법을 아는 가장 중요한 기초는 무엇입니까? 알고리즘, 반복, 재귀 등?

내가 넣는 곳은 내 질문이있는 곳입니다. 나는 최근 10 명의 프로그래머가 프로그램을 숨기지 못한다는 인터넷 게시물을 읽었다 !

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

프로그래밍을 할 때 실제로 달성하려는 것이 무엇인지, 그리고 기본 도구에 대한 철저한 이해를 원합니다. 기본적으로 바람의 모든 색으로 칠할 수 있기를 원합니다.


3
Jeff Atwood의 게시물은 실제로 깊은 프로그래밍 지식에 관한 것이 아닙니다. 많은 사람들이 프로그래밍에 대한 기본적이고 기본적인 통찰력이 부족하다는 사실과 그러한 기본적인 통찰력이 부족하여 중요한 프로그래밍 기술을 개발하지 못하게하는 방법에 관한 것입니다.
Robert Harvey

2
이 질문이 왜 종결되었는지 이해가되지 않습니다. 5 회 별표로 표시되고 유용한 답변이 많이있는 질문입니다. 이것은 내가 만나고 싶은 일종의 정보입니다. 단순한 대답이 없다고해서 정보가 가치가 없다는 것을 의미하지는 않습니다. 아마도 programmers.stackexchange.com은 질문을 끝내기위한 기준을 다시 평가해야 할 것입니다.
Rocklan

@LachlanB 나는 다시 열기로 투표했다 ... 성공하려면 4 표가 더 필요하다
Michael Brown

나는 이것이 좋은 질문이라고 생각하지만 합리적인 답변은이 사이트의 형식에 비해 너무 길 것입니다. 좋은 대학 커리큘럼은 이러한 개념을 다룰 것이며, 그러한 커리큘럼은 몇 년의 헌신적 인 연구와 실습이 필요하며 실제 프로젝트를 위해 몇 년이 더 소요된다는 사실은 왜 대답이 여기에 맞지 않는지를 분명히해야합니다.
조르지오

답변:


18

이 목록은 시작입니다 ... 당신은 큰 질문을하고 있습니다!

  • 고객이 원하는 것을 명확히하고 기록하는 방법 ( "요구 사항"). 이것은 그 자체로 예술입니다. 이렇게하면 프로그래밍 작업이 훨씬 나아질 것입니다.
  • 계획을 추정하고 계획하는 방법. 사람들은 견적을 요청하고 준비합니다.
  • 다른 사람들의 코드를 건설적으로 검토하는 방법.
  • 디자인 패턴. 이것은 큰 것입니다. 그러나 그것을 위해 그것을 지나치게 사용하지 마십시오.
  • 버그, 문제 및 기능 요청의 차이점에 대해 알아보십시오
  • 프레임 워크 / 라이브러리를 최신 상태로 유지하십시오. 당신은 그것들을 사용할 필요는 없지만, 그들이하는 일과 그들의 프로 / 콘을 알아야합니다. 무언가가 너무 어려워 보인다면 아마도 훨씬 더 쉬운 방법이있을 것입니다.
  • 순서도에 복잡한 알고리즘을 문서화하거나 영어로 작성하는 방법. 누군가 코드를 리버스 엔지니어링하는 데 2 ​​일이 소요될 것으로 예상하지 마십시오.
  • 다른 사람이 이해할 수 있도록 코드 구조를 구성하는 방법
  • 코드 주석 달기
  • 단위 테스트 작성 방법
  • 후드 아래에서 무슨 일이 일어나고 있는지 알 수 있습니다. 예를 들어 웹 서비스 호출-실제로 무엇을하고 있습니까?
  • 논리를 클래스로 추상화하는 방법
  • 코드를 리팩터링하는 방법
  • 꽤 많은 프로그래밍 언어의 요지를 배우십시오. 다른 분야에서 배울 수있는 것에 놀랄 것입니다.
  • 다른 프로그래머에게 무엇을 써야하는지 알려주는 방법.
  • 현재하고있는 일과 이유를 경영진에게 설명하는 방법.
  • Peter가 말했듯이 디버깅 방법. 나는 실제 프로그래머가 추측하는 것이 아니라 디버깅하는 모든 것에 동의합니다.
  • 미치광이와 함께 일하는 법. 거기에는 많은 것들이 있습니다.
  • 터프를 얻는 방법. 작업을 수행 할 수 없으면 세계의 모든 이론이 도움이되지 않습니다.

나는 비슷한 줄을 따라 비슷한 내용으로 다른 질문에 대답했다.

전문 코드를 렌더링 할 때 기억해야 할 팁, 지침, 요점은 무엇입니까?


1
+1 : 스터프 완료! 몇 년 전에 나는 이것이 엔지니어의 결정적인 특징이라고 말하는 rant를 게시했다. 때로는 예쁘지 않고 때로는 다시 돌아가서 다시해야하지만 하루가 끝나면 일이 끝 납니다!
피터 로웰

@ PeterRowell : 당신은이 흥미로운 읽을 거리를 찾을 수 있습니다 : brandonsavage.net/when-to-write-bad-code
Marjan Venema

불행히도이 질문은 실제로 사이트의 Q & A 철학과 형식에 맞는 것이 아니라 답변의 가치를 최소화하지는 않습니다. 확장하고 각 요점에 대해 약간의 설명을 추가하려는 경우 커뮤니티 블로그에 대한 훌륭한 블로그 게시물을 작성 합니다.
yannis

@MarjanVenema : 예, 나는 그에게 완전히 동의합니다. 80 년대에는 코딩을 시작하기 전에 승인을 받기 위해 새로운 편집자에 대한 사양을 작성해야했습니다. 나는 이해하지 못하는 것을 묘사하는 방법을 알아 내려고 일주일 이상 그 빈 화면을 쳐다 보았다. 저의 관리자는 저의 진전 부족에 대한 불만을 표명했습니다. 3 일의 주말 후에 그는 책상에 초안을 썼습니다. 그는 무슨 일이 일어 났는지 물었고 주말에 편집자를 썼고, 내가 일한 것에 대한 사양을 썼다고 말했습니다. 코드 일부를 다시 작성했지만 대부분 리팩터링 / 정리였습니다.
Peter Rowell

1
@YannisRizos-이것에 대한 블로그 작성에 관심이 있습니다. 지침이 담긴 이메일을 보내시겠습니까 아니면 그냥 작성해야합니까?
Rocklan

22

" "이라는 제목 아래에는 쉽게 50 % 이상의 시간이 걸리는 것이 있습니다.

디버깅하는 방법을 배웁니다.

이것은 과학적 방법을 배우는 것을 의미합니다 . 나는 그것을 정말로 배우는 것을 의미 합니다. 그리고 잔인한 자기 정직으로 그것을 적용하십시오 . 자신이 알고있는 사실, 사실이 아닌 사실 및 모르는 것을 정확하게 진술하는 방법을 배웁니다 . 당신이 엉성 잘못된 카테고리에 항목을 할당 할 때마다, 당신은 단지 당신의 인생을했습니다 많이 힘들어.

"알다"대신 "생각한다"라고 말하는 법을 배우십시오. 당신이 무언가를 "생각"할 때 "알다"라고 말하고, 그것을 증명할 수 있습니다!

많은 버그는 사소한 것이지만 코드가 무엇인지 알아야한다는 것을 알기 어렵 기 때문에보기가 어려울 수 있습니다. 설명 할 친구를 찾으십시오. 그들에게 "전문가 바보"를 요구하십시오 : 당신의 코드를 모르지만 BS를 지나칠 수없는 사람. 그들에게 묘사하는 도중에 갑자기 멈추고 말하기를, "그래서 ... ... ...를 볼 수 있습니다 ... sh * t. 감사합니다."라고 놀라지 마십시오.

사소한 버그에는 기술이 필요합니다. 알래스카의 Wolf Fence는 타이밍과 관련이없는 대부분의 버그를 빠르게 조명 할 수있는 고전입니다. 알래스카 어딘가에 늑대가있다. 상태를 반으로 자르는 울타리를 만드십시오. 늑대는 어느쪽에 있습니까? 그 쪽을 반으로 자릅니다. 오히려 헹구고 반복하십시오. 코드에서 잘 선택된 곳에서이 작업을 20 번 수행하면 버그 (늑대)가 1/1048576이 될 수있는 영역이 줄어 듭니다. 늑대를 죽여

팁 : 신체적, 정신적 또는 다른 종류의 손파 를 찾으 십시오. 귀하 (또는 동료)가 코드의 일부에 대한주의를 기울이거나 전환하거나 최소화하는 즉시 완전히 열렬하게 진행 됩니다. 버그를 아는 영역은있을 수 없기 때문에 d * mn 항목을 찾는 데 몇 시간 / 일을 보냈지 만 여전히 찾을 수는 없지만 버그의 가장 높은 확률 위치입니다. 아무도 'bye'를 얻지 못하고 아무도 (머신, OS, 컴파일러 또는 당신을 포함하여 ) 어떤 종류의 "적절한 존중"도 얻지 못합니다. 버그가 있습니다. 기간. 문장의 끝. 이제 d * mn을 죽이십시오.

나는 그 자체로 주제로 디버깅을 가르치는 학교가 없다는 것을 알고 있습니다. IMNSHO, 이것은 (대학 / 교수가) 당신에게 프로그래머가되는 것을 가르치지 않고, 대신, 당신이 그들처럼 되라고 가르치고 있다는 가장 눈에 띄는 증거 일 수 있습니다. 거친? 혹시. 진실? 자신의 마음을 구성하십시오. 이제 그것을 증명하십시오.


조회 및 리팩토링을 사용하여 Kent Beck에서 설명하는 기법 인 Saff Squeeze에 관심이있을 수 있습니다 . Hit 'em High, Hit'em Low : 회귀 테스트 및 Three Rivers Institute의 Kent Beck의 Saff Squeeze (Abstract : To 결함을 효과적으로 격리하고, 시스템 수준 테스트로 시작하여 결함을 입증하는 가장 작은 테스트가 나올 때까지 점진적으로 인라인하고 정리합니다.) 테스트 및 IDE 리팩토링 기능을 사용하여 Wolf Fence와 매우 흡사합니다.
Jörg W Mittag

1
훌륭한 답변-누구나 코드를 작성할 수 있으며 실제 프로그래머는 디버그합니다.
Rocklan

@ JörgWMittag : 저는 자동 회귀 테스트의 열렬한 팬입니다. 나는 80 년대 중반에 검색 엔진 프로젝트에서 처음으로 그것을 사용했고, 무해한 코드 조각에 대한 "사소한"변화로 나타난 후에 빠질 것들에 충격을 받았습니다. (참고 : 이것은 C의 SLOC가 200,000 개 이상이며, 메모리 관리 문제는 우리 존재의 한계였습니다.)
Peter Rowell

3

특히 우선 순위가 지정된 목록을 원한다면 누구든지 결정적으로 또는 정식으로 대답 할 수있는 매우 큰 질문입니다. 거기에는 많은 프로그래머가 있으며 그들은 매우 다른 일을하고 있습니다. 물론 기본 사항은 동일하게 유지되지만 메모리에서 계속 활동 해야하는 것은 실제로 다를 수 있으며 실제로 예쁘게 유지할 수있는 많은 작업이 있습니다. 더 깊이 가지 않고 높은 수준.

비록 당신은 일대일 거래가 아니라 더 나은 개발자가되는 방법에 대해 정말로 걱정하는 것 같습니다. 나는 그 훌륭한 것을 발견하고, 프로그래밍 방법을 배우는 데 도움이 된 몇 가지를 공유 할 수 있습니다.

거의 모든 프로그래밍이 알고리즘과 데이터 구조로 귀결됩니다. 그것들은 차례로 더 큰 질문의 예입니다. 실제 세계의 사물과 프로세스를 컴퓨터가 이해할 수있는 표현으로 어떻게 모델링합니까? 방금 시작한 경우, 데이터 구조 및 알고리즘 구현에 익숙해지기 위해 Java, Python 등의 고급 프로그래밍 언어를 사용하는 것이 유용 할 수 있습니다.

어느 시점에서 데이터 구조와 알고리즘을 가지고 놀면서 "컴퓨터에게 무엇을해야하는지, 실제로 그것을하는 컴퓨터에 어떻게 하는가?" 그런 다음 컴퓨터가 실제로 계산하는 방법-메모리와 CPU가 함께 작동하여 명령을 실행하는 방법, 운영 체제가 하드웨어를 추상화하는 방법을 통해 특정 하위 수준으로 코딩하지 않고 파일을 여는 프로그램을 작성할 수 있습니다. 하드 드라이브 인터페이스.

알고리즘과 데이터 구조가 실제 문제를 모델링하는 방법과 컴퓨터가 실제로 계산을 수행하는 방법을 시작하는 것이 좋습니다. 후자를 아는 것은 OO 및 스크립팅 언어보다 훨씬 적은 연기와 거울을 사용하는 C와 같은 하위 수준의 언어를 마스터 링하는 데 매우 유용합니다. :)


2

YAGNI : "실제로 필요할 때 항상 구현하고, 필요할 때만 예측하면 안됩니다."

내 경험상, "프로그래머"가 장래에 많은 경우를 예측하고 코드를 추가하여 코드를 "향상시켜"예상하는 것이 일반적입니다! 대부분의 경우 추가 한 코드는 코드를 부풀리고 코드를 복잡하게 만듭니다.


1

프로그래머가되는 것에 대해 알아야 할 가장 중요한 점은 코드 작성이 갈등하다는 것입니다. 그리고 생산에 대한 대가를 지불하는 것에 대한 일과 같은 "청색"태도는 비 의식적인 학습보다 훨씬 더 멀어 질 것입니다.

구역에 들어가는 법을 배우십시오. 그것은 당신이 당신의 업무에만 집중할 때 정신 상태를 의미하며, 당신의 머리에 많은 것들을 유지하고 그것들이 한 번에 어떻게 상호 작용하는지 시작할 수 있습니다. 당신이 마음대로 존에 들어가는 습관에 빠져 있으면 나머지에 대해 걱정하기 시작하십시오. 일종의 코드와 같은 코드를 만들어 내기 전에는 나머지는 사실상 쓸모가 없습니다.

편집하다:

당신이 이것을 믿지 않고 당신이 저를 공언했다면, 당신이 20 년 동안 그렇게하겠다는 결심이 있는지 모르겠다는 것을 믿습니다. 나는 이것을 받아들이 기 때문에 내가하는 것을 안다. ;)


0

이 질문과 관련이있는 최근 질문과 답변 에는 다른 블로그 에서 동일한 문제를 설명하는 이 블로그 링크가 있습니다.

아마도 모든 개발자에게 가장 중요한 개념은 "겸손"입니다. ... 모두 동의하지 않으면 솔루션을 탐색 할 수 있습니다. 프로그래밍에 대한 블로그를 작성하는 사람들의 대부분은 최상위 백분위 수에 있으며, 문제는 아직 자기애 적 경향을 제어하지 못하는 사람들입니다. .... 그래서 그들은 블로그입니다 ..... 이러한 블로거를 식별하고 맹세를 무시

링크 된 블로그는 정말 난폭 한 일에 지나지 않습니다. 모든 산업 분야에서 최근 졸업생은 쓸모가 없으며 유용하고 생산적으로 만드는 데 몇 년이 걸린다고 불평합니다. 아마도 문제는이 선포 한 전문가들이 실제로 너무 많은 것을 기대하고 일단 FizzBuzz를 해결할 수 없을 것이라는 사실을 잊었을 것입니다. 모든 사람이 상위 10 %를 차지할 수있는 것은 아닙니다. 정의에 따르면 프로그래머의 절반이 평균 이하입니다.


나는 사람들이 많이 찬성한다는 것에 동의하지만, 위에서 언급 한 게시물의 요점은 FizzBuzz를 해결하는 방법을 모르는 사람들 은 초보자 일뿐 만 아니라 랩핑이 필요한 프로그래밍 작업을 신청하고 있다는 것입니다 프로그래밍 관용구에 대한 당신의 머리. 나는 겸손에 관한 요점에 대해 당신에게 동의하지만, 많은 사람들이 그것이 무엇인지 알지 못하는 것 같습니다.
RuslanD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.