“좋은 코드”를 작성한다는 것은 무슨 뜻입니까? [닫은]


41

에서 질문 내가 물었다 좋은 코드를 작성에서 나쁜 작가 방해합니다 당신을 존재 여부. "좋은 코드의 의미에 따라 다릅니다"로 시작되는 많은 답변이 있습니다.

"좋은 코드"와 "나쁜 코드"라는 용어는 매우 주관적인 것으로 보입니다. 한 가지 견해가 있기 때문에 다른 사람들의 견해와는 매우 다를 수 있습니다.

"좋은 코드"를 작성한다는 것은 무엇을 의미합니까? "좋은 코드"는 무엇입니까?


15
좋은 코드는 2 년 후에 그것을보고 첫 생각이 "Dude, wtf"가 아닌 경우입니다.
Bobby

답변:


91

좋은 코더는 좋은 풀 플레이어와 같습니다.

당신은 프로 풀 플레이어를 볼 때 처음에는 감동하지 않을 것입니다. "물론, 그들은 모든 공을 넣었지만 쉽게 촬영할 수있었습니다!" 이것은 수영장 선수가 샷을 할 때 어떤 공이 어떤 포켓에 들어갈 지 생각하지 않고 큐볼 이 어디로 갈지 생각 하기 때문 입니다. 다음 샷을 설정하는 데는 엄청난 기술과 연습이 필요하지만,보기가 쉽다는 것을 의미합니다.

이제이 은유를 코드로 가져 오면 좋은 코더는 쉽고 간단하게 보이는 코드를 작성합니다 . 그의 책에서 Brian Kernighan의 많은 사례가이 패턴을 따릅니다. "속임수" 의 일부는 문제와 그 해결책에 대한 적절한 개념을 제시 합니다. 문제를 충분히 이해하지 못하면 솔루션을 지나치게 복잡하게 만들 가능성이 높아지고 통일 된 아이디어를 얻지 못할 것입니다.

문제의 적절한 개념화를 통해 가독성, 유지 보수성, 효율성 및 정확성과 같은 다른 모든 것을 얻을 수 있습니다. 해결책이 매우 간단 해 보이므로 추가 설명이 필요하지 않기 때문에 주석이 적을 것입니다. 좋은 코더는 제품의 장기적인 비전을보고 그에 따라 개념을 형성 할 수 있습니다.


10
"좋은 코더는 쉽고 직관적 인 것처럼 보이는 코드를 작성합니다." << 정확히! 나는 사람들이 보통 좋은 코더가 아주 "영리한"해킹을 쓸 수있는 사람이라고 생각하기 때문이라고 생각합니다. 코드가 깨끗하고 지나치게 "영리한"것이 아니라면 쉬워야합니까?
hasen

3
내 2 센트 : EASY 자동 리팩토링 언어를 사용하면 Java와 C #이 내가 가장 잘 알고있는 두 가지 예입니다. 좋은 코드로 반복해서 쉽게 옮길 수 있습니다. 그렇지 않으면 처음에는 개념을 잘 세워야하지만 닭 꼬리 문제가 있습니다.
Dan Rosenstark 23

3
일부 알고리즘은 본질적으로 복잡합니다. 좋은 코더는 실제로 필요할 때 작성하고 가능한 한 읽기 쉽게 유지하는 데 아무런 문제가 없습니다 .
J-16 SDiZ 4

2
@hasenj : 그렇습니다. 이것은이 실수 때문입니다. 어리석은 사람들은 컴파일러가 이해하는 코드를 작성합니다. 영리한 사람들은 바보 같은 사람들이 이해하는 코드를 작성합니다.
v.oddou

49

분당 WTF

( 원본 )


편집 : 기본 개념은 "좋은 품질"또는 "좋은시"를 규칙에 넣을 수없는 것과 같은 방식으로 "코드 품질"을 규칙에 넣을 수 없으므로 컴퓨터가 "예, 좋은 예술"이라고 말할 수 있도록하는 것입니다. 또는 "아니요, 나쁜시". 현재 유일한 방법은 코드가 다른 사람에게 얼마나 이해하기 쉬운 지 보는 것입니다.


1
우리는 이것이 직장에서 화이트 보드에 붙어 있습니다 :-)
아무도

1
@Cape Cod Gunny도 삼촌 밥의 책에
있었습니다

2
훌륭한 만화를 제외하고는 그것이 실제로 요점에 도달한다고 생각합니다. 좋은 코드는 다른 사람들이 읽고 유지하기에 즐거운 코드입니다.
FinnNk

1
사실, 좋은 코드는 나쁘지 않은 코드입니다. 예를 들어 좋은 코드를 정의하기 어렵고 나쁜 코드를 정의하기가 더 쉽습니다.
Ernelli

5
일반적으로 좋은 코드 회의에서 "WTF?"는 곧 "Oooooh 좋아요 ... 당신이 무엇을했는지 봅니다."
AndrewKS

7

코드를 얼마나 빨리 이해할 수 있는지 외에는 좋은 기준이 없습니다. 간결함 과 가독성 간의 완벽한 타협점을 찾아 코드를보기 좋게 만듭니다 .

"분당 WTF"(위)는 사실이지만 더 일반적인 규칙의 결과 일뿐입니다. WTF가 많을수록 이해가 느려집니다.


1
@rmx : "일을 잘하는"정의
mojuba

2
글쎄, 그 RemoveCustomer방법은 실제로 나사를 조이지 않고 cutomer를 제거한다는 것입니다. 예쁘게 보이도록 몇 시간을 보낼 수 있지만 실제로 작동한다는 의미는 아닙니다. '코드를 얼마나 빨리 이해할 수 있는지'가 '좋은 코드'의 유일한 기준은 아닙니다.
아무도

2
@ rmx : 그러나 버그가 없다는 것은 암시되지 않습니까? 코드가 제대로 작동하지 않으면 코드가 아닙니다 (아직).
mojuba

4
@rmx : 사실은 아닙니다. 코드가 이해하기 쉽다면 결론적으로 코드가 제대로 작동하는지 이해하기 쉽습니다. OTOH, 이해하기 어렵다면, 그것이 일인지 전혀 이해하기 어렵습니다.
pillmuncher

2
@rmx : PS 간단히 말하면, decrement ()는 고전적인 WTF
이므로이

5

당신은 좋은 코드를 작성할 때 ...

  1. 고객은 행복하다
  2. 동료 동료가 코드를 시작점으로 빌립니다.
  3. 6 개월 전에 구축 한 시스템을 수정하라는 새로운 사람 / gal은 방금 질문을 한 적이 없습니다.
  4. 상사는 팀이 사용할 새 위젯을 개발하도록 요청합니다
  5. 오늘 작성한 코드를보고 "2 년 전과 같은 코드를 작성했으면 좋겠다"고 스스로에게 말하십시오.

코드가 좋은지 어떻게 측정합니까?

  • 응답 시간은 얼마입니까?
  • 서버로 몇 번 왕복합니까?
  • 개인적으로 응용 프로그램을 사용 하시겠습니까, 아니면 응용 프로그램이 어수선하다고 생각하십니까?
  • 다음에 같은 방법으로 하시겠습니까?

좋은 코드는 예상대로 작동합니다. 필요할 때 좋은 코드를 쉽게 수정할 수 있습니다. 좋은 코드는 재사용을 위해 재사용 될 수 있습니다.


2
"고객이 만족합니다"는 이것과 직교합니다.

1
@TRA-고객이 만족한다면 요구 사항을 이해하고 예상 한 솔루션을 제공했음을 의미합니다.
Michael Riley-AKA Gunny

6
확실하지만 나쁜 코드는 똑같이 할 수 있습니다.

4

코드

  1. 버그 무료

  2. 재사용 가능

  3. 독립적

  4. 덜 복잡한

  5. 잘 기록 된

  6. 변경하기 쉬운

좋은 코드라고합니다.

좋은 프로그램은 완벽하게 작동하며 버그가 없습니다. 그러나 어떤 내부적 특성이 그러한 완전성을 산출합니까? 그것은 신비가 아닙니다. 우리는 가끔 생각 나게 할 필요가 있습니다. C / C ++, C #, Java, Basic, Perl, COBOL 또는 ASM으로 코딩하든 모든 우수한 프로그래밍은 단순성, 가독성, 모듈성, 계층화, 디자인, 효율성, 우아함 및 선명도 효율성, 우아함과 동일한 시간에 걸쳐 우수한 품질을 나타냅니다. 명확성

출처 : MSDN


단순성, 가독성, 우아함 및 선명도는 모두 동일합니다. 모듈 성과 레이어링은 코드를 명확하고 우아하게 만드는 방법 일뿐입니다. 목록에 남은 유일한 것은 효율성인데, 이는 일종의 묵시적이며, 효율성과 선명도 사이의 타협 문제이기도합니다.
mojuba

이것을 확인하십시오 : goo.gl/hdQt8
Chankey Pathak

2
코드에 버그가 없습니까?
Casey Patton

아뇨. (실용적으로)
Chankey Pathak

효율적인 목록에 추가해야합니다. 속도가 반드시 좋은 코드를 나타내는 주요 지표는 아니지만, 좋은 코드가 불필요하게 느리거나 낭비되는 것은 아닙니다.
Caleb

3

익숙한 것 같습니까?

필립스는 새 제품의 디자인을 볼 기회를주었습니다. 개발이 진행됨에 따라 점점 불안 해졌고 우려 사항을 관리자에게 알리기 시작했습니다. 나는 그에게 디자인이 "깨끗하지 않다"고 Dijkstra의 디자인이 아름다운 방식으로 "아름다워야"한다고 반복해서 말했다. 그는 이것이 유용한 의견이라고 생각하지 않았다. 그는 우리가 예술가가 아닌 엔지니어임을 상기시켰다. 그의 마음 속에서 나는 단순히 내 취향을 표현하고 있었고, 그는 판단을 내릴 때 어떤 기준을 사용하고 있는지 알고 싶었습니다. 나는 그에게 말할 수 없었다! 위반 한 원칙에 대해 설명 할 수 없었기 때문에 내 의견은 단순히 무시되었고 작업은 계속되었습니다. 내“맛”을 설명하고 동기를 부여 할 방법이 있어야한다는 것을 감지하고, 좋은 디자인과 나쁜 디자인을 구별 할 수있는 원리를 찾기 시작했습니다. 엔지니어는 매우 실용적입니다. 그들은 아름다움에 감탄하지만 유용성을 추구합니다. “아름다움”이 유용한 이유에 대한 설명을 찾으려고 노력했습니다.

나머지는 여기를 참조 하십시오 .


1
@mlvljr의 게시물에 대한 링크가 깨 졌으므로 다음은 Google 도서 페이지에 대한 링크입니다. books.google.co.in/…
balajeerc

@balajeerc 감사합니다 (링크도 수정되었으므로 동일한 pdf의 Springer 호스팅 버전을
가리킴

1

자연어 코드 품질 기준 (최소 복사 / 붙여 넣기, 스파게티 없음 등)을 제외하고는 좋은 산업 코드는 항상 약간 순진하고 너무 장황하게 보입니다.

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

반대로

Record r = cache.get(i++, false);

그러나 않습니다 do_not_create = false평균 "통과 false는 AS do_not_create또는"패스가 만들어집니다 그래서 인자 " false는 AS do_create가 생성되지 않도록 인수"? 인수 이름을 사용할 수있는 언어에서는 선호합니다 cache.get (key:i, create: false); i += 1;.
PJTraill

1

아마도 그 반대를 설명함으로써 대답이 도움이 될 것입니다 (그리고 여기에 XKCD 를 얻는 것은 변명입니다 ).

대체 텍스트

좋은 코드는

  • 이해하기 쉬운
  • 유지 보수가 쉽고
  • 한 가지 문제 만 해결하려고하지 않습니다
  • 개발자가 대안을 찾지 않도록 오랫동안

예를 들어

  • 아파치 커먼즈
  • 스프링 프레임 워크
  • 동면 프레임 워크

1

간단하게 "유지 가능"으로하겠습니다

모든 코드를 유지해야합니다. 작업을 필요 이상으로 어렵게 만들 필요가 없습니다.

독자 가이 간단한 요구 사항을 이해하지 못하거나 철자가 필요한 경우 해당 독자는 코드를 작성해서는 안됩니다 ...


1

좋은 코드는 사람마다 다르며 함께 일하는 언어도 좋은 코드로 간주되는 것에 영향을 미칩니다. 일반적으로 프로젝트에 접근하면 다음 사항을 찾습니다.

  • 프로젝트는 어떻게 구성되어 있습니까? 소스 파일이 깔끔하게 정리되어 있고 너무 많은 노력없이 코드를 찾을 수 있습니까?
  • 코드는 어떻게 구성되어 있습니까? 파일 헤더를 사용하거나 자체 파일에있는 각 클래스를 사용하는 등 파일의 코드가 수행하는 작업이 명확하게 문서화되어 있습니까? 응용 프로그램에서 더 이상 사용되지 않는 기능이 파일에 있습니까?
  • 기능은 어떻게 구성되어 있습니까? 변수가 선언되는 곳에 명확한 패턴이 있습니까, 아니면 상당히 임의의 패턴입니까? 코드에 논리적 인 흐름이 있으며 불필요한 제어 구조를 피합니까? 코드로 모든 것이 명확하게 문서화되고 필요한 곳에 자체 문서화되고 주석은 코드가 수행하는 이유 및 / 또는 방법을 명확하게 표현합니까?

이 모든 것 외에도 응용 프로그램 디자인이 전체적으로 의미가 있습니까? 응용 프로그램에 상주하는 코드는 세계 최고 일 수 있지만 응용 프로그램의 전체 디자인이 이해가되지 않으면 여전히 문제가 될 수 있습니다.


1

가독성에 친절하게 동의하지 않겠습니다. 아니요, 완벽하지는 않습니다. 좋은 코드를 읽을 수 있어야하며 충분한 주석으로 쉽게 얻을 수 있습니다.

그러나 나는 두 가지 종류의 WTF를 고려합니다. 프로그래머가 프로그래밍 101보다 더 많은 것을 얻었는지 궁금한 것과 코드의 성실성을 절대 이해하지 못하는 것입니다. 일부 코드는 처음에는 매우 이상하게 보일 수 있지만 실제로는 어려운 문제에 대한 매우 독창적 인 솔루션입니다. 두 번째는 WTF 미터에 포함되어서는 안되며 주석으로 피할 수 있습니다.

매우 읽기 쉬운 코드는 매우 느릴 수 있습니다. 덜 읽기 쉬운 솔루션은 속도를 크게 향상시킬 수 있습니다. R은 자주 사용되는 언어의 훌륭한 예입니다. 우리는 가능한 한 for-loops를 피하는 것을 좋아합니다. 일반적으로 읽을 수는 없지만 가장 빠른 코드가 더 나은 코드라고 생각합니다. 즉, 개선이 실제로 진행되지 않고 코드의 기능을 설명하기에 충분한 주석이 삽입됩니다.

또한 많은 과학 응용 프로그램에서 메모리 관리는 매우 중요합니다. 매우 읽기 쉬운 코드는 메모리 사용에있어 부주의 한 경향이 있습니다. 더 많은 객체가 생성됩니다. 경우에 따라 메모리를 똑똑하게 사용하면 코드를 다시 읽을 수 없게됩니다. 그러나 예를 들어 기가 바이트의 DNA 서열을 저글링하면 메모리가 중요한 요소입니다. 다시 한 번, 가독성에 관계없이 메모리를 많이 사용하지 않는 코드가 더 나은 코드라고 생각합니다.

예, 좋은 코드에는 가독성이 중요합니다. 나는 Uwe Liggis의 adagium을 알고 있습니다. 그러나 내 분야 (통계 유전체학)에서 일주일의 계산 시간과 40Gb 이상의 메모리 사용량은 비정상으로 간주되지 않습니다. 따라서 두 배의 속도와 메모리의 절반을 향상시키는 것이 가독성의 추가 비트보다 훨씬 가치가 있습니다.


예외없이 규칙 / 규칙 없음
user2664856

1
당신의 의견에 동의하지 않습니다 : 당신은 당신의 필드 속도가 매우 중요하다고 말하고 가독성보다 더 중요하다고 말합니다. 동의하지 않습니다. 올바른 균형을 유지하기 위해 노력해야합니다. 예를 들어 높은 수준의 인터페이스와 같이 속도가 필요하지 않은 경우 유지 관리가 쉬운 것을 선호 할 수 있습니다. 속도가 필요한 경우 동의합니다. 어려운 규칙보다는 상식을 사용하는 것이 좋으며 어쨌든 조기 최적화를 피해야합니다.
BlueTrin

@BlueTrin 왜 하이 퍼포먼스 소스 코드를 브레인 컴파일하고 거기에서 무슨 일이 일어나고 있는지에 대해 문서화하지 않겠습니까?
mlvljr

1

다른 프로젝트에서 일하는 동료가 와서 각 코드 블록을 넘지 않고 내가하고있는 일을 이해할 수있을 때 좋은 코드를 작성하고 있음을 알고 있습니다. 무엇을하고 있는지 보여줍니다.
그 대신에 "잠깐만 요!" 그는 "오, 알았어. 네가 거기서 뭘했는지 알아."

좋은 코드에는 몰래 해결 방법이나 '해킹'이 많이 없습니다. 당신이 그것을 쓰는 동안, 당신은 또한 스스로에게 "나는 이것이 그것을하는 좋은 방법이 아니라는 것을 알고 있습니다. 그러나 나는 지금이 방법으로해야 할 것입니다. 나는 상기시킬 것입니다. 나중에 개선하기 위해 ... "


1

'좋은'코드에는 많은 기능이 있지만 가장 중요한 IMHO는 가독성과 유지 관리 성입니다.

코드 에는 버그 포함되어 있으며 확장 및 재사용 이 가능 하며 어느 시점에서 다시 리팩터링 되어야 합니다. 당신은 애초에 자신에게 호의를 베풀고 장애물을 두지 않았습니다.

물론,이 복잡한 복잡한 알고리즘을 사용하되 문서화에 약간의 시간이 더 걸리지 만 코드가 명확하고 일관성이 있어야합니다.

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