프로그래머가 때때로 자신의 코드에 대해 100 % 명확성을 갖지 않는 것이 정상입니까? [닫은]


19

나는 전문 프로그래머가 아니기 때문에 이것이 이유 일 수도 있지만, 최근에 만든 체스 게임과 같은 복잡한 코드를 만들 때마다 올바른 코드를 작성하여 프로그램을 작동시킬 수 있음을 알게되었습니다. 나는 나중에 또는 몇 초 후에 그것을 발견하지만!-나는 종종 멈추고 생각해야합니다. 어떻게 작동합니까?

그뿐만 아니라 코드에 대해 생각하지 않는 경향이 있으며 대신 입력합니다. 예를 들어, 체스 게임에서 움직임을 처리하기 위해 5 차원 배열을 사용하기로 결정했는데 너무 많은 의식적인 생각없이이 작업을 수행 할 수 있다는 것을 알았습니다. 그러나 멈추고 그것을 읽었을 때, 나는 전체 5 차원 개념을 머리로 쓰는 것이 어려웠으며, 내가 한 일과 코드 자체가 어떻게 작동하는지 완전히 이해하는 데 몇 분이 걸렸습니다.

프로그래머가 복잡한 코드를 작성할 때 절반의 시간을하는 일을 이해하지 못하는 것이 정상입니까?


13
영리하기에는 너무 열심히 노력하고 있다는 표시입니다. 직접 읽는 데 어려움이있는 경우 더 단순하고 모듈화 된 코드를 작성해야합니다.
SHODAN

3
이 오버 복잡하거나 좋지 설계 코드의 냄새한다는 의미에서 다른 (통찰력) 답변에 추가하려면 (우리 대부분은 그 단계를 통과했다,하지 걱정을 할) : 문서를 . 변수 / 메소드 / 클래스 / 모듈에 적절한 이름을 부여하고, 각 함수에 적절한 설명을 추가하고, (다른 방법이 없을 때) 복잡한 스 니펫을 사용하는 이유와 방법을 설명하는 간단한 인라인 주석을 작성하여 암호.
SJuan76

4
나는 결코 내 자신의 코드를 통해 100 % 선명도가 없습니다.
코드 InChaos

2
그 5D 배열은 추상화를 사용하는 것처럼 들립니다.

3
개발자가 코드를 100 % 명확하게 유지하고 있습니까?
Johan

답변:


30

아니요, 정상이 아닙니다 1 . 적어도 좋은 프로그래머에게는 정상이 아닙니다. 누군가가 프로그래밍을 배우는 것은 정상일 것 입니다 .

소프트웨어 작성은 작동 할 때까지 코드 줄을 묶는 것이 아닙니다. 코드를 이해하기 쉽도록 의식적으로 작업해야합니다. 내가 한 번 존경하는 프로그래머 는 "코드가 쓰여진 것보다 더 많이 읽혀진다" 고 말했다 . 그것이 완전히 명백해야하지만, 그가 나에게 말할 때까지 내가 알지 못했던 것은 사실이었습니다. 대부분의 코드는 한 번만 작성되고 한 번 또는 두 번 더 다시 작성되지만 소프트웨어 수명 기간 동안 코드를 자주 읽게됩니다.

코드를 작성한 후 몇 분 동안 이해하기 어려운 코드를 찾으면 코드가 너무 복잡하다는 신호입니다. 코드 추가를 중단하고 더 나은 방법을 찾으십시오. 예를 들어, 5 차원 배열은 거의 좋은 생각이 아닙니다. 정말 똑똑한 프로그래머라도 복잡한 데이터 구조를 이해하는 데 어려움을 겪고 있습니다.

코드 가독성에 대해 말 해준 같은 프로그래머도 "데이터 구조를 보여 주면 코드 작동 방식을 알려줄 수있다"고 말했다 . 좋은 코드는 깨끗하고 이해하기 쉬운 데이터 구조로 시작한다는 의미입니다. 데이터를 올바르게 설계하면 코드는 거의 부차적 인 문제입니다. 분명히 소프트웨어는 단순한 데이터 이상의 것이지만 데이터로 시작 하기 때문에이 문장은 다소 과장된 것 입니다. 따라서 깨끗하고 이해하기 쉬운 데이터 구조를 만드는 작업을 수행하면 코드를 이해하기가 훨씬 쉬워집니다.


1 물론 가장 똑똑한 프로그래머조차 이해하기 어려운 코드가 있습니다. 일부 문제는 본질적으로 복잡합니다. 그러나 대다수의 프로그래머가 작성한 대부분의 코드는 이러한 유형의 코드가 아니라고 말하고 싶습니다.


8
[1] 더 비관적 인 관점에서 볼 때, 그것은 정상이지만 좋지 않습니다.
Dan

1
"5 차원 배열"이 단순히 4 튜플 또는 5 튜플에서 전략으로의 맵인 경우 작성자는 해시 테이블 또는 도우미 조회 기능을 사용할 수 있습니다. 그러나 저자가 배열을 초기화하는 메커니즘 (중첩 된 루프)을 코딩하는 데 대부분의 시간을 소비한다면 실제 "알고리즘 통찰력"은 "기계적 코드"더미에서 익사하게됩니다. 프로그래머는 후자의 종류의 노이즈를 별도로 유지하려고합니다. 따라서 좋은 프로그래머는 이러한 기계적인 코드를 저장하기 위해 라이브러리를 작성하는 방법을 알아야합니다.
rwong

1-D 배열은 선, 2-d는 격자, 3-d는 입방체, 4-d는 입방체 선, 5-d는 입방체 격자 등입니다. 체스와 관련하여 복잡한 데이터 구조가 필요합니다.
user2785724

15

이것에는 두 가지 종류가 있습니다 : 1.) 혼란 2.) 행복한 무지

첫 번째는 나쁘고 시간과 경험으로 사라질 수 있습니다.

두 번째는 프로젝트가 커지면 좋은 것입니다. 코드로 작업 할 수 있도록 모든 구현 세부 사항을 기억해야하는 경우 문제가 있습니다 ( "정보 숨기기"참조).

모든 개발자는 코드의 작동 방식을 잊어 버리므로 다른 새로운 개발자가 자신에게 알려지지 않은 프로그램의 다른 부분을 손상시키지 않고 코드를 이해하고 유지할 수있는 방식으로 코드를 작성합니다.

따라서 "알지 못하는 것"은 실제로 소프트웨어 개발에서 일정합니다. 이는 소프트웨어를 관리하는 방법인지 여부입니다.


1
구현 세부 사항이 실제로 잊혀지기 때문에 상식적인 패턴 과 규칙을 사용하여 프로그래밍하는 것이 얼마나 중요한지에 대해 중요한 점을 다루고 있습니다. 그러나 코드의 패턴과 규칙이 합리적이면 필요할 때 컨텍스트에서 세부 사항을 다시 선택하기가 쉽습니다. 다른 한편으로, 코드가 모두 모 놀리 식이고, 어리 석고, 너무 영리하다면, 결국에는 세부 사항을 잊어 버릴뿐만 아니라 코드를 유지하려고하는 다른 프로그래머들은 훨씬 더 힘든 시간을 가질 것입니다.
Craig

12

사람들이 인정하는 것보다 더 일반적이라고 말하고 싶습니다. 브라이언 커니 건조차도 언급했다.

디버깅은 처음에 코드를 작성하는 것보다 두 배나 어렵습니다. 따라서 코드를 최대한 영리하게 작성하면 정의에 따라 코드를 디버깅하기에 충분히 똑똑하지 않습니다.

매장으로 운전할 때 페달과 스티어링 휠의 위치를 ​​세부적으로 조정합니다. 이것은 현재 매우 쉽습니다. 이제 그 조정 내용을 종이에 기록하여 상점에 지시가 필요한 친구에게 주었다고 상상해보십시오.

마찬가지로, 우리는 한 수준의 추상화에서 코드를 작성하는 것을 좋아하지만 여러 상위 계층의 추상화에서 코드를 읽는 것을 좋아합니다. 우리가 선호하는 코드 작성 및 읽기 방법은 상충됩니다. 즉, 코드를 쉽게 읽을 수있게하는 것은 일반적으로 다른 기술을 가진 별도의 의식적인 단계입니다.

좋은 프로그래머를 만드는 것은 방금 쓴 것을 읽는 데 어려움이 있고 그 시점에서 추상화를 만듭니다. 더 나은 프로그래머는 매번 더 까다로워 여러 번 수행합니다. 결국 숙련 된 프로그래머는 프로세스를 따라 더 시작하지만 방금 쓴 내용을 읽은 후에도 여전히 개선의 여지를 볼 수 있습니다.


나는 브라이언과 그 의견에 동의 하지 않아야 합니다. 디버깅을 좋아합니다 . 나는 업계에서 내가 아는 몇 안되는 사람 중 하나이지만 그 코드를 작성하지는 않습니다.
James Snell

@JamesSnell 그는 디버깅이 나쁘거나 불쾌하다고 말하지 않았으며 단지 어렵다고 복잡한 코드를 디버깅하는 것이 훨씬 어렵다고 말했습니다.
cbojar

5

나는 이것이 경험과 함께 사라질 것이라고 생각합니다.

복잡한 시스템을 작성하는 경우 미래와 다른 사람이 모두 이해할 수있는 깨끗하고 유지 관리 가능한 코드를 작성할 수 있어야합니다. 본질적으로, 지금하고있는 일은 확장 할 수 없습니다.

6 개월 전에 작성한 코드를보고 "도대체 무슨 일이 일어나고 있습니까?" 더 코드.

출처 : 결코 5 차원 배열을 사용하지 않았습니다 :)


3
@ 83457-5d 배열은 2d 문제의 열악한 모델이기 때문입니다. 실제로 좋은 코드라고 생각하면 codereview.stackexchange.com으로 가져 와서 어떤 답변을 얻을 수 있는지 확인하십시오.
James Snell

2
@ 83457-그것이 '지옥처럼 혼란 스럽다'면 당신은 스스로 대답했습니다. 기술 수준에 관계없이 5D 배열이 혼란 스럽지는 않지만 대부분의 사람들에게는 그렇지 않을 수 있습니다.
dbasnett

2
@ 83457 지옥으로 혼동되는 것은 이미 그것을 사용하지 않는 좋은 동기가되어야합니다.
Fabio Marcolini

3
각 차원에 대한 정당한 이유가있는 한 5D 배열을 피할 이유가 없습니다. 복잡한 키가있는 사전이나 여러 가지 저 차원 배열과 같은 더 나은 솔루션이있을 수 있지만 5D 배열이 체스 AI와 같은 까다로운 문제에 적합하다고 상상할 수 있습니다.
코드 InChaos

2
@CodesInChaos 그것들은 단지 배열이 아니라는 것을 제외하고는 의미있는 시퀀스를 나타냅니다 (예 : 중첩 된 디시 슨 트리). 그것들의 이름을 적절하게 지정하고 그것들을 남용 할 수 없도록 타입을 제공함으로써 (그 타입이 배열에 대한 파이썬 래퍼 인 경우에도), 코드를 더 명확하게하고 버그를 거의 포함시키지 않을 것입니다.
deworde

5

"정상"은 매우 주관적이므로 나는 매우 일반적이지만 피해야합니다.

"좋은 코드"의 특징 중 하나 (명백한 것이 있다고 들었습니다)는 명확성입니다. 근본적인 문제가 허용하는 한 분명해야합니다. 문제가 복잡하면 코드도 복잡 할 것이지만, 그건 고유 반대로, 복잡한 사고 (내가 처음에이 구별 들어 복잡성 리치 키스 마크 야의 이야기 ) 어긋나 도입하거나 적절한 도구, 패턴, 기술을 사용하지 않는 및 관행.

명확성의 부족이있을 때 경우가 있습니다 허용 당신은 당신이 한 마케팅 캠페인이 간다 마지막 것입니다 알고있는 프로모션 현장을 작성하는 경우 문제가 예를 들어, 매우 복잡한없는 경우에도. 이는 유지 관리 할 수없는 폐기 코드입니다. 다른 (대부분의 경우) 해당 코드를 유지 관리하는 데 많은 비용이 들기 때문에 허용되지 않습니다. 그러나 일반적입니다.

관련 :

  • 이해가 재 작성을 의미 할 때 -코드 이해 문제에 관한 기사.
  • 효과적인 ML -ML / OCaml 사이에서 "리더"(예 : 관리자)를위한 코드 작성 방법에 대한 긴 이야기 : "라이터보다 선호하는 리더" 어떤 언어를 사용하든 상관없이 시청하는 것이 좋습니다.

2

나는 그것이 정상이라고 생각하지 않지만 언급 한 체스 프로그램과 같은 매우 복잡한 프로그램의 경우 확실히 가능하다고 생각합니다.

몇 년 전, 나는 대학원에 다닐 때 (그래서 나는 여전히 큰 프로그램을 작성하는 데 상대적으로 경험이 없었습니다), 첫 번째 실제 컴파일러를 썼습니다. 파싱은 간단했지만 4 개의 다른 마이크로 프로세서 명령어 세트를 대상으로해야했습니다. 컴파일러를 자체 언어로 작성하려고했기 때문에 먼저 필자가 꼭 필요한 언어의 기능 만 사용하고 어셈블리 언어로 첫 번째 코드 생성기를 작성하고 언어 하위 집합에 대해 올바른 코드를 생성했는지 테스트했습니다. 그런 다음 컴파일러를 사용하여 그때부터 컴파일하고 나머지 기능을 추가하고 컴파일러 자체에서도 사용할 수있었습니다.

그런 다음 각 마이크로 프로세서에 대한 백엔드 코드 생성기를 작성하고 모두 올바른 코드를 생성하는지 테스트했지만 수정하는 동안 최적화되지 않았습니다. 그런 다음 각 코드 생성기에 대한 최적화 프로그램을 작성했습니다.

모든 최적화를 추가 한 후 코드 생성기의 출력을 테스트 할 때 컴파일러가 생성 한 코드에 자주 놀랐습니다. 손으로 직접 코드를 작성하는 방식이 아니었지만 정확하고 간결했습니다.

코드 생성기가 수행 한 코드 중 일부를 생성 한 방법이 명확하지 않은 경우, 직접 로직을 살펴 보려고했지만 방금 포기한 시간이있었습니다. 많은 추적 출력을 추가했다면 그것을 따라갈 수 있었지만 생성 된 코드가 만족 스럽기 때문에 귀찮지 않았으며 다른 프로젝트를 진행해야했습니다.


당신은 탄탄한 기초를 가진 매우 훌륭한 교육을 받았으며, 당신은 지식을 매우 높은 수준으로 내면화 한 것 같습니다. 나는 이것이 전형적인 프로그래머들에게는 다소 드문 것 같아요. 저를 포함한 대부분의 일반적인 프로그래머는 기술이 너무 빠르게 변하기 때문에 오늘날의 작업에 필요한 지식을 따라 잡기 위해 고심해야합니다.
rwong

@rwong 감사합니다. 대부분의 경험입니다. 저는 46 년 동안 프로그램을 작성해 왔으며 곧 종료 할 의사가 없습니다.
tcrosley

2

여기에 괜찮은 답변이 많이 있습니다.

나는 이것에 몇 가지 걸릴 수 있습니다.

하나는 코드가 작동하는 이유를 이해하지 못하면 a) 아마도 작동하지 않는 것 같습니다 (아마도 작동하는 것처럼 보일 것입니다. ) b) 문제 도메인을 충분히 이해할 수 없었습니다. 코딩을 시작했거나 시작하기 전에 문제 도메인을 더 작고 단순화 된 단위로 분류하지 않았습니다.

또 다른 하나는 실제 키가 코드에서 상식 패턴과 규칙을 사용하는 것입니다. 그것은 하나의 작은 게시물이 다룰 수있는 것보다 훨씬 더 큰 주제입니다. 그러나 "Code Complete"및 "Writing Solid Code"와 같은 오래된 대기 모드를 포함하여 주제에 관한 좋은 문헌을 찾으십시오.

구현 세부 사항이 변경되었습니다. 유일한 실제 상수는 코드의 기능적 목표입니다. 둘 이상의 함수를 작성하면 시간이 지남에 따라 세부적이고 구체적인 구현 세부 정보를 잊게됩니다. 그러나 조각을 만들 때 조각이 어떻게 작동하는지 확실히 이해해야하며 전체 다이어그램을 그리고 조각이 함께 작동하는 방식을 이해할 수 있어야합니다.

패턴을 사용하고 상식 규칙을 따르는 경우 코드를 다시 볼 때 특정 구현 세부 사항을 선택하는 것이 훨씬 쉽습니다. 또는 전에 코드를 본 적이없는 사람이 처음으로 코드를 보았을 때. 또한 시간이 지남에 따라 이러한 규칙과 패턴을 따르면 구현 세부 사항이 규칙과 패턴 자체에서 두드러지며 이는 코드를 이해하기 쉽게 만드는 또 다른 요소입니다.

소프트웨어로 다루는 대부분의 문제는 본질적으로 복잡합니다. 소프트웨어 디자인은 복잡성을 관리하는 연습입니다.


1

나는 그것을 보통 이라고 부르지는 않지만 분명히 일어날 수 있습니다. 문제의 코드를 작성한 직후에 문제가 발생하면 코드가 불필요하게 복잡하고 단순화되거나 쉽게 산만해질 수 있습니다. :)

그러나 코드를 정리하고 다른 프로젝트에 집중 한 후 몇 주, 몇 달 또는 몇 년 후에 코드를 다시 가져와도 코드를 다시 알아 내야한다는 것은 그리 놀라운 일이 아닙니다.

그러나 이것에 대해 할 수있는 일이 있습니다. 당신이 말한 바에 따르면, 코드를 작성할 때 코드에 대해 충분히 생각하지 않아서 미래의 자기 자신이 진행중인 일을 이해하기가 어려워지고 있습니다. 이 지식을 유리하게 활용하십시오 : 이것은 체계적이고 체계적으로 문서화되고 이해하기 쉬운 코드를 생성하기위한 최고의 동기입니다. 코드의 품질을 관리하지 않으면 어떤 일이 발생하는지 직접 경험할 수 있습니다. 그것을 알면 장기적으로 더 나은 프로그래머가 될 것입니다. 소프트웨어 프로젝트에 대해 공동 작업 할 때 동료는 이해할 수있는 코드를 작성해 주셔서 감사합니다. 그리고 코드의 결함률도 향상됩니다.

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