어떤 사람들은 영리함이 프로그래밍에서 해로운 것으로 간주되는 이유는 무엇입니까?


89

나는 최근에 다른 추상화 기술과 관련된 많은 질문을 발견했으며 기본적으로 해당 기술이 "너무 똑똑하다"고 대답했습니다. 프로그래머로서의 우리 업무 중 일부는 해결해야 할 문제에 대한 최상의 솔루션을 결정하는 것이며, 영리함이 그렇게하는 데 도움이된다고 생각합니다.

그래서 제 질문은 : 특정 추상화 기술이 영리 그 자체에 대해 너무 영리하다고 생각하는 사람들 입니까, 아니면 반대 이유가 있습니까?

편집 : 이 파서 결합기 는 영리한 코드로 간주되는 것의 예입니다. 나는 이것을 다운로드하고 약 30 분 동안 살펴 보았다. 그런 다음 종이에서 매크로 확장을 밟아 빛을 보았습니다. 이제는 Haskell 파서 결합기보다 훨씬 우아해 보입니다.


116
나는 아마도 당신이 오해하고 있다고 생각합니다. 사람의 영리함 은 미덕이지만 시스템의 영리함은 악의입니다 . 시스템과 코드는 영리하지 않아야하며 수정처럼 명확해야합니다. 그러한 것들을 만들려면 종종 영리한 개인이 필요합니다.
nlawalker


15
@ nlawalker : 나는 지금 그것을 얻는 것 같아요. 사람들은 코드를 "명확한"또는 "간단한"에 대한 반의어로 지칭 할 때 "영리한"이라는 단어를 사용합니다. 왜냐하면 그들은 "명확한"또는 "간단한"에 대한 반의어 인 단어를 사용하기 때문 입니다 .
래리 콜맨

2
@Larry : 그게 무슨 뜻인지 잘 모르겠습니다. 에서와 같이 영리한 , 본 발명의 원본 ingenius 및 암시 적으로 당신은 한 번도 본 적이없는 방법으로 물건을 사용. 때로는 훌륭합니다 (많은 디자인 패턴이 영리합니다).하지만 솔루션의 이질성으로 인해 작업하기가 어려울 수도 있습니다.
doppelgreener

2
댓글 코드가 더 이상 없습니까? 그것이 영리함을 설명하는 곳이므로 다음 사람들이 이해할 수 있습니다. 6 개월 후에 당신처럼
Phil Lello

답변:


207

간단한 솔루션이 장기적인 유지 관리에 좋습니다. 항상 언어에 익숙하지는 않습니다. 복잡한 언어는 주어진 언어의 전문가라도 알아내는 데 시간이 걸립니다. 당신은 파일을 열고 읽기 시작합니다 : "좋아요, 간단하고 간단합니다, 그렇습니다, WTF ?!" 당신의 두뇌는 삐걱 거리는 소리에 멈춰서 이제 복잡한 줄을 멈추고 해독해야합니다. 해당 구현에 대해 측정 가능하고 구체적인 이유가없는 한 "너무 영리합니다".

복잡성이 영리한 방법에서 영리한 클래스로, 영리한 패턴으로 복잡 해짐에 따라 진행 상황을 파악하는 것이 점점 어려워집니다. 잘 알려진 접근법 외에도 "영리한"솔루션을 만드는 데 필요한 사고 과정을 파악해야합니다. 이는 매우 어려울 수 있습니다.

즉, 누군가가 패턴을 이해하지 못하기 때문에 패턴의 사용이 정당화되는 것을 싫어합니다. 학습을 계속하는 것은 개발자의 책임이며 우리가 무언가를 이해하지 못하면 그것을 피하는 것이 아니라 배우는 이유입니다.


7
+1 멋지게 말했다. 균형이 맞다고 생각합니다. 적절한 지식을 가진 사람이 자신을 조금만 생각하여 코드를 이해하기를 기대할 수 있다면 영리한 태도로 의견을 추가 할 수 있습니다. 누군가가 코딩 기술을 입증하기 위해 코드를 이해하는 데 4 배가 걸린다면 – nah! 누군가가 영리한 해결책을 제시 할만큼 영리하다면, 이해할 수 있는지 아닌지를 결정할만큼 똑똑해야합니다. 그렇지 않으면 그것은 단지 과시입니다.
Anne Schuessler

내가 좋아하는 마지막 단락. 나머지는 사실이지만 불행합니다.
Orbling

Zend PHP의 소스 코드를 본 것 같습니다 :)
Tim Post

+1 간단한 패턴은 영리한 패턴 만큼 잘 수행되지 않을 수 있으며 , 말했듯이 개발자가 "영리한"봉투를 이해함으로써이를 계속 추진하는 것은 우리에게 달려 있습니다.
Stephen Furlani

3
실제로 "최소, 직교 적으로 정확"했을 때 "영리한"무언가를하는 것을 정당화해야했던 사람으로서, 나는 정확히 무엇이 영리한 지에 대한 질문에 대한 주관성이 있다고 덧붙이고 싶습니다. 예를 들어, 어떤 사람들은 항상 글을 쓰고 싶어하며 if FuncX() then return true, else return false절대로 글을 쓰려고 하지 않을 것 return FuncX()입니다. 농담이 아닙니다. 말 그대로 그 대화를 나 ve습니다. 사람들은 어딘가에 중단 점이나 무언가를 걸기를 원하기 때문에. :-)
Warren P

102

키스 원리

간단하고 바보처럼 유지하십시오. 영리한 솔루션은 훌륭하지만 종종 가장 간단한 솔루션이 가장 좋습니다.

“디버깅은 처음에 코드를 작성하는 것보다 두 배나 어렵습니다. 따라서 코드를 가능한 한 영리하게 작성하면 정의에 따라 코드를 디버깅 할만큼 똑똑하지 못합니다.”

브라이언 커니 건


8
반면에 가능한 한 영리하게 코드를 작성하는 경우 코드를 디버깅하는 법을 배워야하며 그렇게하면 더 영리해진다. 아니면 그런 것.
James McNellis

11
@ 제임스 : 아니면 당신은 실패합니다. ;)
Josh K

10
@Josh K : 저는 항상 KISS를 "간단하고 바보처럼 유지하십시오!"라고 알고 있습니다. - en.wikipedia.org/wiki/KISS_principle
Orbling

1
@Orbling : 나는 다르게 그것을 회상했다.
조쉬 K

1
위키피디아 에 따르면, "간단하고 바보가되게하라"고 ? :) 이것이 단순함을 유지하는 것이 어리 석 거나 단순하게 유지한다는 것은 어리석은 사람 이어야 한다는 것을 의미합니까? : P
Mateen Ulhaq

83

바보는 복잡성을 무시합니다. 실용 주의자들은 그것을 겪는다. 전문가들은 그것을 피합니다. 천재가 그것을 제거합니다. -앨런 펄리스


5
좋은 인용문과 단순하고 영리한 것이 될 수 없다는 암묵적인 가정없이 첫 번째 답을 얻으려면 +1
Larry Coleman

15
중요한 것은 코드가 아니라 영리한 프로그래머 여야한다는 것입니다.
Kristopher Johnson

영리한 방법으로 영리한 단어를 오용하는 바보보다 더 나은 인용.
데릭 리츠

30

최상의 솔루션이 항상 가장 영리한 솔루션은 아닙니다. 때로는 간단한 해결책도 똑같이 좋습니다.

소프트웨어에서는 항상 유지 관리 측면에서 생각해야합니다. 코드 조각을 유지하려는 사람에게 너무 영리한 코드라면 영리함이 가치가 없다고 말할 수 있습니다.


3
복잡한 문제에 대한 간단한 해결책은 누구나 얻을 수있는만큼 영리합니다.
JeffO

관리자가 코드를 작성하거나 읽을 수 없기 때문에 지나치게 단순화하고 싶지 않은 경고가 항상 있습니다.
Ken Henderson

@confusedGeek-그러나 유지 보수 프로그래머가 처리 할 수 ​​없다는 것을 알면 영리한 솔루션이 시한 폭탄이됩니다. 여기서는 균형이 중요하며 유지 관리 팀을 알고있는 경우에만 적용됩니다. 당신이 모른다면, 당신의 영리함을 명확하게하는 것이 최선입니다.
Michael Kohne

1
@Michael, 성능 제약으로 인해 코드가 영리해야 할 수 있습니다. 그런 다음 배우는 것이 관리자의 임무이며, 배우지 못하는 경우 새 관리자를 고용하십시오.
Stephen Furlani

@Stephen, 코드가 영리해야한다면, 프로그래머는 왜 필요한지 설명하기 위해주의를 기울여야하므로 관리자는 처음부터 시작할 필요가 없습니다.

26

Brian Kernighan을 인용하려면 :

“디버깅은 처음에 코드를 작성하는 것보다 두 배나 어렵습니다. 따라서 코드를 가능한 한 영리하게 작성하면 정의에 따라 코드를 디버깅 할만큼 똑똑하지 못합니다.”


"... 올바른 영리한 정의를 사용하지 않으면 코드를 이해하고 디버그하기가 간단합니다."
Derek Litz

당신이 엄지 손가락 whcich 사전에 따라, 나는 생각한다. 내 경험상, 어떤 "영리한"코드 (쉽게 이해하기 쉬운 지 아닌지)는 여전히 스펙에서 운 좋은 조합을 이용합니다. 명백한 경우에도 그러한 가정이 변경 될 수 있고 코드의 다른 부분으로 유출되지 않아야하는지 표시해야합니다.
peterchen

당신 말이 맞지만 언어와 구현이 읽고 이해하는 것이 얼마나 쉬운 지에 달려 있다는 경고를 추가하고 싶습니다. 댓글은 도움이되는 대신 코드 잡음 일 수 있습니다. 그리고 그 반대를 의미하기 위해 영리한 것을 사용하는 것이 일반적이지만, 다른 사람들이 자신의 이익을 위해 물건을 오해하지 않도록 더 명확하게 노력해야합니다.
Derek Litz

:)
peterchen


16

코드에 적용 할 때 "Clever"는 거의 항상 "필수없이 복잡한"이라는 완곡 어입니다.

훌륭하고 명확하며 간단한 코드를 읽는 것은 어렵습니다. "영리한"코드를 읽는 것은 라틴시를 다시 한 번 공부하는 것과 같습니다.

사람의 속성 인 "영리한"은 완전히 다른 의미를 갖기 때문에 혼란이 발생합니다. 이 사례는 실제 사람들을위한 소프트웨어를 설계하는 것이 어려운 이유의 예라고 볼 수도 있습니다. 모호하기 때문입니다.

그리고 일부 프로그래머들은 대부분의 사람들이 따르는 사회적 프로토콜을 이해하기 어렵 기 때문에 코드를 "불필요하게 복잡한"것으로 직접 비난하는 것을 금하기 때문에 영리한 단어의 두 가지 의미를 구별하기가 어려울 수 있습니다 . 일부 사람들이 생각하는 것과는 달리, 궁극적으로 더 나은 "사람들"(즉, 공감과 내성, 인내심이있는 사람들)은 더 나은 개발자를 만든다고 생각합니다. 그들은 누구를 써야하는지 알고 있기 때문에.


5
나는 당신이 사회 규약과 "사람들 [sic]"에 대해 설교하지 않았다면 이것을 찬성했을 것입니다.
Jason Baker

2
괜찮습니다. 상기시켜 주셔서 감사합니다. 나는 너무 설교하는 경향이 있습니다. 그러나 나는 평범한 인간 행동을 다룰 수없는 (많은?) 프로그래머의 무능함 및 / 또는 의지, 그리고 우리 분야에서 볼 수있는 공감과 내성에 대한 전반적인 부족에 푹 빠져있다. 어쩌면 나는 이탤릭체 대신 "사람들"을 따옴표로 묶어야했다. 영어는 제 모국어가 아니며, 훌륭한 개발자가 되려면 코드뿐만 아니라 사람들도 이해해야한다는 점을 짧게 이해하는 방법을 몰랐습니다. 이모.
fzwo

내 답변을 수정했습니다. 더 명확하고 덜 공격적입니까?
fzwo December

첫 번째 문장에 +1하여 처음 몇 개의 답을 얻은 후에 결론을 내 렸습니다.
래리 콜맨

그렇습니다.이 맥락에서 어리석은 사람들이 어떻게 영리하게 사용하고 있는지 분명히 해주셔서 감사합니다!
Derek Litz

9

대부분의 사람들은 "코드가 무엇을하고 있는지 알아 내기에는 너무 많은 해독이 필요하다"라는 측면과

  1. 그것을 유지 / 디버깅하는 것 외에는 아무도 그것을 알아낼 수 없습니다.
  2. 쓴 사람은 그것이 무엇을하는지조차 모릅니다.
  3. 실제로 시작하는 것이 전부가 아닐 수도 있습니다
  4. 기타....

모든 좋은 점이지만, 영리함의 또 다른 부정적인 측면이 있으며 그것은 오래된 자아 문제입니다. 이것은 라인을 따라 문제를 일으킨다.

  1. 다른 사람의 솔루션을 사용하기에는 너무 똑똑한 사람. 같은 고양이를 자신 만의 방식으로 만들 수있는 방법으로 다른 사람들이 한 일을 찾으십시오.
  2. 자신이 문제에 대한 가장 멋진 해결책을 고안했다고 생각하는 사람은 종종 의견을 수렴하지 않을 것입니다.
  3. 명백한 문제가 있거나 사소한 변경이 필요한 경우에도 "자신의"코드를 수정하도록 허용하지 않습니다.
  4. 반대로, 그들은 영리하다고 생각하고 "최신"기술을 사용하여 자신들이 얼마나 영리한지를 입증해야하지만 개인 프로젝트 나 그렇지 않은 코드에서 중요한 부분으로 넘어 가기 전에이를 잘 처리하지 못합니다. 시스템.

우리는 때때로 너무 많은 자존심에 유죄를 선고 받지만 팀을 방해 할 때 문제가됩니다.


8

Good Clever-영리한 코드 라인과 비영리 한 대안 라인의 비율이 높습니다. 20000을 작성하는 데 도움이되는 20 줄의 코드는 매우 우수합니다. 좋은 영리한 일은 자신을 구하는 일입니다.

Bad Clever-작성된 코드 라인과 코드 라인 간 비율이 낮습니다. 5 줄의 코드를 작성하지 않아도되는 한 줄의 영리한 코드는 Bad Clever입니다. 나쁜 영리는 "구문 자위"에 관한 것입니다.

참고 : 나쁜 영리한 사람은 거의 "나쁜 영리한 사람"이라고 불리지 않습니다. 그것은 종종 "아름다운", "우아한", "간결한"또는 "간결한"이라는 별칭으로 여행 할 것입니다.


흥미로운 답변이지만, 해당 코드를 작성한 사람이 아닌 다른 사람이 실제로 "Bad Clever"라고 부르는 코드가 실제로 "아름다운"등으로 지칭됩니까?
Larry Coleman

2
다릅니다. Objective-C / C ++ / C에서 현상은 일반적으로 개인으로 제한됩니다. Perl과 Ruby에서는 종종 전체 커뮤니티가 Bad Clever가 "아름다움", "우아함"등의 가치를 공유하게 될 것입니다.
user8865

1
@ user8865 : 또한 "Good Clever"코드는 원래 정의보다 3 배나 작은 코드이므로 디버그하기가 훨씬 쉽습니다.
Larry Coleman

2
아, 펄 프로그램은 이제 거의 정의에 따라 매우 훌륭합니다.

7

모든 사람의 영리한 정의가 궁금합니다.

개인적으로, 나는 어렵고 복잡한 문제를 겪었을 때 매우 영리한 것처럼 느껴지고 수용 가능한 수준의 효율성을 유지하면서 매우 간단하고 직접적인 방법으로 구현했습니다.

tl; dr 코드 검토 중에 리뷰어가 "와우, 그것이 생각했던 것보다 쉬웠습니다."라고 말하면 "wtf는이 모든 것"입니다.


1
tl; dr에 대한 LOL, 프로그래머가 얼마나 느리게 읽는다고 생각하십니까? 그렇다. 나는 현존하는 것과는 정반대의 의미로 영리한 오용을 절대 멸시한다. 멍청한 / 무지한 / 악한 개발자 및 관리자는 실제로 "너무 똑똑"하다고 생각하는 사람을 고용하지 않기 위해 이것을 사용합니다.
Derek Litz

6

나열된 이론 답변 외에도 종종 이것은 다른 모든 사람들에게 너무 영리한 상황에서 사용됩니다.

최고 수준의 성능 집약적 팀과 중간 수준의 유지 보수 팀 사이를 이동하여 "너무 영리한"내용의 실제 차이점을 확인하십시오.

이론적 논증을 제외하고, 너무 영리한 것은 종종 가장 숙련 된 팀원이 합리적으로 작업 할 수있는 것에 근거하기 때문에 환경과 매우 관련이 있습니다.


우수 : "너무 영리한 팀은 기술이
부족한 팀원

귀하의 위치에 따라 이것은 때때로 "excellent"보다 약간 낮습니다 :-)
Bill

누가 가장 숙련 된 팀원을 걱정합니까? 거의 모든 팀에는 (몇 가지 예외가 있다고 확신하지만) 자신을 프로그래머라고 부르는 사업이 전혀없는 최소한 한 명의 구성원이 있습니다.
dsimcha

1
바라건대 당신은 그들이 더 나아지기를 원하지만, 그것이 성공하지 못하더라도 팀원으로 그들을 처리해야하며 그들은 일부 작업에 참여할 수 있어야합니다. 나는 현재 이것을 람다 식으로보고 있습니다. 내가 함께 일하는 많은 사람들은 아직 그들을 얻지 못해 너무 영리하다고 생각합니다. 그들이 우리의 많은 문제를 매우 효율적이고 우아하게 해결함에 따라 불행한 일이지만, 중간 계층에 속한 사람이 없다면 소프트웨어를 지원할 수없는 경영진에게 갈 것입니다.
Bill

@ 빌 : 람다 함수 ??? 간단한 것을 이해하지 못하는 사람은 명시 적으로 배우도록 요청받은 후에도 전문 프로그래머가 될 수 없습니다.
dsimcha

6

때때로 나는 너무 영리해서 내가 틀렸다.


1
일어날 수 있습니다. 때로는 무언가가 잘못되었습니다.
bobobobo

그들은 그런 이론들을 요한이라고 부릅니다. 이론은 때때로 잘못 될 수 있고 잘못 될 수있다. :) 영리하지 말고 가능한 한 영리하려고 노력하는 것을 의미하지는 않는다. 우리는이 세상에서 어떻게 다른 지도자가 될 것입니까! "아, 그러나 사람의 손이 닿는 범위를 넘어서야한다. 아니면 천국은 무엇인가?"
Derek Litz

4

솔루션을 측정하는 방법은 성능, 유지 관리 가능,시기 적절하고 저렴한 것입니다. 영리한 것이 그 특성에 부정적인 영향을 미치지 않는 한 해결책의 일부가 될 수 있다고 생각합니다.


개발과 관련하여 "저렴한"을 긍정적으로 사용하기위한 +1
Gary Rowe

나는 성능이 좋지 않은 '영리한'코드를 너무 많이 보았다!
HLGEM

더 유용한 측정 항목이 있지만 프로젝트에 따라 좋은 측정 항목이 될 수 있으며 종종 서로 상충되기 때문에 성공하려면 서로 강조해야합니다.
Derek Litz

3

영리한 코드 + 이해할 수있는 코드 <= 간단한 코드를 만드는 데 필요한 주석의 양이면 영리한 코드로 가십시오. 매번

"영리한 코드"를 작성하는 사람들이 의도적으로 코드를 제대로 작성하지 못하는 경우 문제가 발생한다고 생각합니다. 처음에는 이해할 수 없기 때문에 앞으로 오는 세대가 얼마나 영리한지 "감사"하는 데 시간을 소비해야하기 때문입니다.


글쎄, 또는 그들은 단지 다음 사람에 대해 생각하지 않기 때문입니다. 나는 생각하지 않는 나무 늘보와 나쁜 습관으로 적절하게 설명 할 수있는 것을 지적 이기주의의 원인이라고 확신하지 못한다. 그러나 실제로 코드를 한눈에 이해할 수 없으면 주석이 필요하며 코드 + 주석이 다른 방법보다 길거나 (LOC 또는 시간이 더 길면) 필요한 것보다 열심히 노력하고 있습니다.
Dan Ray

좋은 대답입니다. (+1 할 수 없으며, 아무것도 남지 않습니다.) 사람들이 영리한 코드를 작성하는 데 시간을 소비하지 않고 다른 사람들이 코드를 이해하는 데 시간을 소비하지 않으면 덜 효율적인 경우에도 덜 간단한 코드를 선호합니다. 그러면 기술 발전이 이루어지지 않을 것입니다.
Orbling

가장 좋은 답변입니다. 만트라 : 간단한 기준선, 시작 코드를 작성하고 모든 사람이 일어날 때 느리고 ... 읽을 수없는 원 라이너로 끓일 때 주석으로 만듭니다. 그것이 당신이 당신의 언어로 모든 더러운 속임수를 배우는 방법입니다!
Droogans

복잡한 것을 의미하기 위해 영리한 것을 사용한다면, 로깅을 통해 이해할 수있는 복잡한 코드를 개인적으로 작성했습니다. 복잡한 코드를 작성할 계획은 없었지만 당시에는 시간이 절약되었지만 # TODO를 추가하여 크게 수정해야 할 경우 간단하게 다시 작성해야 할 수도 있습니다.
Derek Litz

3

좋은 인용구가 종종있는 것처럼, 내가 본 다른 인용문에 대한 인용구가 떠 오릅니다.

말을 바꾸려면 :

모든 똑똑한 사람은 단순한 복합물을 만들 수 있으며, 복합물을 단순하게 만드는 데 천재가 필요합니다.

복잡한 아이디어를 이해하고 이해하기 쉽게 단순화하면 생성자의 영리함을 알 수 있지만 간단한 아이디어를 취하고 복잡하게 만드는 것은 생성자가 영리한 것으로 보이기를 원합니다.


그렇습니다. 코드 기반을 복잡하게 만드는 것이 영리하고 싶어한다는 자아 중심적인 아이디어입니다. 당신은 영리하거나 영리하지 않습니다. 슬프게도, 초기 학습 단계에서 사람들은 자신보다 더 영리하다고 생각합니다. 나중에 그들은 자신이 얼마나 영리하지 않은지를 알고 실제로 지식의 차이를 메 우면 영리한 코드를 작성합니다.
Derek Litz

2

'영리한'솔루션을 파악하기 어려운 경우 사용해서는 안됩니다. 예를 들어 부작용을 통해 복잡한 계산을 한 줄로 축소 할 수 있다면 영리합니다. 그러나 다른 사람이 세상에서 무엇을했는지 알아내는 데 1 시간이 걸리면 너무 영리합니다.


2
충분하지만 코드를 이해할 수없는 사람이 언어의 모든 기능에 익숙하지 않은 경우 답변이 변경됩니까?
래리 콜맨

2
적어도 IMO는 다릅니다. 언어의 특징에 익숙하지 않은 사람은 영리한 것을 판단 할 수있는 위치에 있지 않습니다.
Joe D

@Larry : 반드시 그런 것은 아닙니다. 나는 그것을 읽는 사람이 기본 / 낮은 고급 수준이라고 가정합니다. 그리고 그것이 복구 할 수없는 복잡한 것을 시작하면 코드가해야 할 일을 설명하는 블록 주석을 넣을 차례입니다. 실제로 수행중인 작업을 이해하기위한 참조 프레임을 설정하는 데 도움이됩니다. 주석은 높은 수준이어야합니다.-계산을 작성하고 프로세스를 설명하십시오. 코드를 반복하지 마십시오. 에있는 사람은 코드를 읽을 때 (이상적으로) 이해할 수 있어야합니다. 어쨌든 목표입니다.
Michael K

2

제 생각에는 영리 그 자체는 문제가되지 않습니다. 일반적으로 "영리한"(sarcasm없이) 및 "inightfull"코드를 혼동 할 수 있습니다. 내가 문제로 생각하는 것은 일반적으로 "영리한"(sarcasm 포함) 코드에 암시적인 보이지 않는 요구 사항이 포함되어 있기 때문에 시간이 지남에 따라 디버그 및 유지 관리가 더 어렵다는 것입니다.

영리한 몇 가지 알려진 알고리즘이 있습니다. Quicksort 는 IMO 중 하나입니다.

"영리한"(sarcasm 포함) 코드는 일반적으로 설정중인 변수와 "영리한"코드와 실제로 연결이 끊어진 시스템 상태 (이전에 열린 파일, 네트워크 연결, 데이터베이스 등)에 대해 가정합니다.

"영리한"코드를 올바르게 유지하기 위해 두뇌에로드해야하는 데이터의 양은 일반적으로 큰 편익 비를 갖기 위해 크다.


1

"영리한 코드"는 프로그래머가 정말 열심히 생각하거나 고급 기술을 사용하여 작성해야하는 코드입니다. 이 문제는 Brian W. Kernighan이 가장 잘 표현한 특정 "영리한 마진"에 대한 필요성을 무시합니다.

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


1

어떻게 생겼는지 때문에 영리 창조성의 버스트의 개발자에게 간단하게 전달할 수있는 혼란 과 단지가 될 읽을 수없는 , 이상 유지할 블록 모호한 수수께끼 다른 사람을 위해.

그래도 훌륭하고 영리하며 성능이 좋은 수수께끼 블록이지만 경험이 있다면 매체를 유지하는 데 비즈니스 비용 (개발자 아님)이 훨씬 더 많이들 것이라는 사실을 종종 알게 될 것입니다. 또는 장기. 따라서 동료 개발자의 열망을 진정시키는 것을 선호합니다.

물론 영리함에 대한 정당성이 있다면 예외입니다. 그리고 당신이 방금 쓴 난독 한 것과 함께 제공되는 좋은 문서가 있다면. 그 영리한 코드 조각에 대해 언급 했습니까? 의도, 왜 그런지, 어떻게 행동해야하는지 설명하십시오.

정당성이 없다면, 아마도 조기 최적화, 과도 엔지니어링 또는 YAGNI 종류의 문제 일 것입니다. 간단한 일을하기 위해 15 단계의 간접적 인 지시가 필요하다면, 이전 범주에도 속할 가능성이 높습니다. 문서화되어 있지 않으면 문제 일뿐입니다.

훌륭한 코드는 관리자가 항상 그것을 이해하기 위해 100 %에 있어야 할 필요는 없습니다. 좋은 코드는 영리합니다. 훌륭한 코드는 거의 효율적일 수 있지만 다른 여러 측면에서는 더 좋습니다. 훌륭한 코드는 애플리케이션 디자인을 따르기 위해 15 개의 뷰가있는 IDE가 필요하지 않습니다.

참고 : 이봐, 나는 영리하다고 생각하지만 WTF를 이끌어 낸 몇 가지 물건을 썼습니까? -공동 개발자가 아닌 경우-관리자의 입에서. 그들의 관점에서 그것을 봐야합니다.


답변 해주셔서 감사합니다. 당신은 "영리한"것이 내가 생각한 것을 의미하지 않는다고 말하는 다른 사람들과 동의하는 것 같습니다.
Larry Coleman

1

나는 경향이 영리 ,하지만 난 할 노력하고 우아한 .

코드를 개발 이제 다른 사람들이 시도하고 피할 것을 나중에 .


1
어서 ... 영리함은 우아함과 동의어입니다, 당신의 두뇌는 마케팅되었습니다. 그렇습니다, 나는 그 단어를 만들었습니다. 그것은 당신의 두뇌가 진실 대신 마케팅에 영향을 받는다는 것을 의미합니다.
데릭 리츠

우아함 : 단순 하고 영리합니다. cromulent 무엇이든 @DerekLitz +1.
kevpie

1

이것은 내 경험과 다른 답변을 바탕으로 문제에 대한 나의 이해입니다.

  1. 작성하는 데 영리하지만 읽기 쉽고 유지 보수가 가능한 코드는 유해한 것으로 간주되지 않습니다. 그러나 대부분의 개발자는 이러한 종류의 코드를 "영리한"것으로 부르지 않습니다. 그들은 "우아한"과 같은 다른 용어를 사용할 수 있습니다. 그러한 코드가 존재하는지에 대한 논쟁이있을 수도 있고 없을 수도 있습니다.
  2. 언어에 익숙한 노련한 개발자라도 이해하기 위해 상당한 시간과 노력이 필요한 생산 코드는 "영리한"것이며 모든 사람에게 해로울 수 있습니다.
  3. 경험이없는 개발자가 상당한 시간과 노력을 요구하는 생산 코드는 일부 사람들에게 유해한 것으로 간주됩니다. 나는 어느 쪽이든 대답을 보았고 모든 것을 "최소 공통 분모"로 유지하는 것을 선호한다고 명시 적으로 말한 개발자와 함께 일했습니다.

현대의 서구 문화 전체가 LCD 인 것 같습니다. 프로그래밍도 마찬가지 여야합니다. 안좋다.
Orbling

@Orbling : 그렇습니다. 그러나 즉시 만족하는 것을 잊지 마십시오.
Larry Coleman

나는 당신의 경험 포인트를 좋아합니다. 사람들이 지식과 ​​이해를 공유함으로써 반복적 인 개선을 위해 노력하지 않고 서로에게 투자하지 않는 것은 슬픈 일입니다. 대신에 우리는 휠에 톱니 바퀴가 있어야 시간이 다가올 때 쉽게 교체 할 수 있습니다. 이를 통해 우리는 진보를 방해하고 있습니다. 우리는 또한 짧은 자신을 판매하고 있습니다 ...
Derek Litz

1

나는 남자를 안다. 그는 내가 만난 가장 훌륭한 사람 일 것이다. 그는 확실히 믿을 수없는 코더입니다. 아마도 평범한 프로그래밍 절단 측면에서 평생보다 더 좋을 것입니다. 그는 단어 문서를 입력하는 것처럼 코드를 작성하며 사용자가 믿지 않는 것처럼 연결된 목록을 되돌릴 수 있습니다. 매우 복잡한 코드를 작성하는 것에 대해 이야기하고 싶다면, 그는 당신의 남자입니다. 그러나 팀 환경에서 그와 함께 프로젝트를 진행하는 것은 매우 흥미 롭습니다. 그는 비즈니스 문제를 직접 목표로 삼고 논리적이고 효율적이며 간결한 솔루션을 제공 할 수 없습니다. 그에게 1000 줄의 코드 목록은 100보다 낫습니다. IDE 또는 프레임 워크를 통해 제공되는 도구를 사용하는 대신 자신의 초 최적화 된 도구를 사용할 것입니다.

이 복잡한 일을 할 수있는 그의 능력에 감탄하는 동안, 내가 필요한 것은 문제를 해결하고 발전 할 수있는 사람입니다. 말하거나 인정하는 것은 좋지 않지만 때로는 사업 환경에서 모든 것이 문제이며 문제를 해결하고 인생을 살아야합니다. 나중에 다시 돌아와서 지옥을 리팩토링하여 향상시킬 수 있습니다. 귀하의 코드. 영리한 사람과 엉덩이의 고통 사이에는 훌륭한 선이 있습니다. 우리 팀의 모토는 항상,이 상황에서 작동하고 거기에서 갈 수있는 가장 간단한 것입니다. 때로는 단순한 것이 항상 답이 아니라 시작하기에 좋은 곳입니다.


죄송합니다.이 사람의 품질에도 불구하고 복잡한 것을 코딩 할 수 있도록 만났지만 그는 바보입니다. 사람들은 다른 특성에 관계없이 바보가 될 수 있습니다. 당신이 정말로 개발에서 원하지 않는 것에 대한 당신의 진술은 재능있는 사람에게 분명합니다. 만약 그가 진정으로 똑똑하다면, 당신은 그에게 호의를 베풀고 대신 그의 재능으로 어리석은 일을하도록해야합니다. 당신은 유휴 상태에서 등 뒤에서 불평함으로써 그와 그 주변 사람들에게 장애를 겪고 있습니다. 그가 똑똑하지 않다면 해고해야 할 수도 있습니다.
데릭 리츠

나는 수십 년 동안 매일 지능적인 사람들을 다루는 기본 자원과 관계가 있으며, 그들 중 일부는 팀 환경에서 생산성을 발휘할 수있는 몇 가지 지식이 부족합니다. 최소한 문제에 대해 알려 주면 스스로 알아낼 수 있습니다.
데릭 리츠

1

이러한 맥락에서 "영리한"은 "자신의 이익을 위해 너무 영리하다", 즉 지금은 작동하지만 나중에 이해하고 변화시키는 악몽이 될 것임을 의미합니다.

특히 프로그래밍 언어의 모호한 기능을 악용하거나 이상한 부작용을 사용하거나 대상 언어의 문제를 해결하는 기괴한 방법 인 경우 트릭입니다.


0

나는 간단한 솔루션을 선호하고, 루비 방식을 정말로 좋아합니다. 예를 들어 목록에서 처음 두 요소를 합산하려는 경우. 먼저 목록을 잘라서 크기 = 2가되도록 한 다음 합산하십시오.

일단 3 대신 1 목록을 사용하고 유지 관리 / 변경하기가 매우 어려운 하나의 큰 기능을 만들었 음을 기억합니다.

오늘날의 세계에서 우리는 성능을 위해 코드 명확성을 희생 할 필요가 없습니다 (c ++을 제외하고는 필요하지 않지만 그렇게 할 것입니다).


0

일반적으로 코드에서 문제를 해결하기 위해 '영리한'일 필요가있을 때. 해결 방법이 매우 간단하지 않은 경우 특정 조건을 가정 할 때 혼란 스 러운 얼굴이 많거나 다른 경우 이상한 부작용이 발생합니다 (코드 작성시 100 % 정확할 수 있음)

따라서 영리한 == 혼란스러운 == bad :( 그러나 제한된 문제에 대한 실용적인 솔루션으로 사용했을 때도 훌륭합니다.


0

맥락과 이해를 돕기 위해 다시 인용 :

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

브라이언 케르 니건이 여기에 썼던 것은 분명히 컨볼 루션과 관련이 있으며 그는 실수로 영리한 단어를 사용했습니다.

"디버깅은 처음에 코드를 작성하는 것보다 두 배나 어렵습니다. 따라서 코드를 가능한 한 [복잡하게] 작성하면 정의에 따르면 디버그하기에 충분히 똑똑하지 않습니다."

회선:

A thing that is complex and difficult to follow.

영리한:

Showing intelligence or skill; ingenious

교육을받은 프로그래머는 간단한 코드가 독창적이라는 것을 알고 있습니다. 가능한 영리한 코드는 정의상 단순해야합니다. 교육을받은 프로그래머는 전염병과 같은 복잡한 코드로 작업하거나 작성하지 않아도됩니다. 또한 기회가있을 때마다 복잡한 코드를 영리한 코드로 바꿉니다. 코드는 일반적으로 복잡하게 시작되고 프로그래밍에 대한 인간의인지 능력에 대한 이해와 영역에 대한 지식이 경험과 공유 된 지식을 통해 더 잘 이해되므로 영리하게 접근합니다.

이 인용의 인기와 Brian Kernighan이 업계에서 꽤 인기가 있기 때문에이 단어의 오용은 사회적으로 부정적인 영향을 미치며 솔직히 그 사람이 해결 한 것을보고 싶습니다. 이 기사를 작성하기 전에 간단히 전자 메일을 보낼 수 있는지 확인하려고했지만 이해했던 전자 메일 연락처 정보를 찾을 수 없었습니다.

내가 본 부정적인 사회적 영향은 이제 더 영리한 동료를 괴롭히는 다른 프로그래머들입니다. 그들은 이제 영리함을 문제로보고 있기 때문입니다. 실제 문제는 새로운 일관적인 방식으로 일을함으로써 영리하다고 생각하고 더 큰 공동체를 이해하고 영리한 아이디어를 최대한 재사용하는 대신 이점이 없을 때 끊임없이 새로운 것을 발명하는 바보 같은 동료입니다.

나는 종종 자신의 것을 발명하는 것보다 이해를 얻는 것이 더 어렵다는 것을 분명히해야합니다 . 비현실적인 마감일에 대한 업계의 일반적인 문제로 인해 작은 틈새 문제에 대한 자신의 발명은 시간을 절약하는 데 사용됩니다. 이것은 유용하고 재사용 가능한 것들이 일반적으로 더 큰 틈새 시장을 대상으로하거나 발명에 유용한 추상화를 제공한다는 관찰에 근거합니다. 또한 사람들이 더 큰 돈을 벌기 위해 큰 틈새 시장을 목표로 삼는다 는 사실 에 근거하고 있습니다. 이는 종종 광범위한 응용 분야에 사용할 수있는 복잡성으로 인해 도구를 사용하기가 매우 어려워집니다.

또 다른 부정적인 사회적 영향은 이것이 우리의 자아 중심 세계에서 우리 자신의 이해 부족을 즉시 거부하고 일단 이해되면 아이디어가 실제로 이해 되더라도 복잡한 코드를 작성하기 때문에 진보와 이해하려는 욕구를 방지한다는 것입니다 아주 영리합니다.

TODO 참고 자료를 인용하고 싶지만 정보 공유 능력을 방해하지 않는 참고 자료가 부족하므로 정보의 출처로 기억하는 내용을 빠르게 인용하고 실제 정보를 찾을 수 있습니다. 하루 (또는 당신은 나를 위해 그것을 찾을 수 있습니다! :)

  • Guido Van Rossum의 이벤트 루프 및 이벤트 루프에 대한 이야기
  • Y-Combinator에서 영리한 사람들을 고용하지 말라고 언급 한 GitHub 직원
  • 파이썬 커뮤니티에서 진행되는 많은 토론과 학습. 파이썬 커뮤니티는 특히 새로운 아이디어에 대해 비판적이지만 이해하지 못하는 새로운 아이디어를 무시하지 않으며, 일반적으로 처음에는 복잡한 것으로 보였던 기능을 핵심 언어 기능 / 패키지로 볼 수 있습니다.
  • 내 10000 발 관찰을 기반으로 한 내 자신의 경험과 전문적인 의견. 나는 실제로 모든 것을 깨달을 수있는 구체적인 내용을 볼 수는 없습니다.

자신의 인용을 자유롭게 추가하십시오! 또한 내 텍스트에 쉼표를 자유롭게 추가하십시오. 꽤 오랫동안 영어로 쉼표 사용법에 대한 지식을 새로 고치지 않았습니다 ...


-1

사람들은 종종 언어, 숙어 및 패턴을 모르기 때문에. 그들은 책을 가져 가서 배울 수는 있지만 배울 수는 없습니다. 그리고 그러한 사람들 때문에 간단한 코드를 작성해야합니다.

영리하지 않습니다. 지식입니다.


2
나는 확실히 이것에 동의하지 않습니다 (-1 가치는 없지만). 이 인수를 사용하면 관리자가 학교를 다니고 있고 무슨 일이 일어나고 있는지 이해하지 못했기 때문에 실행 취소 / 다시 실행 트랜잭션 스택을 처리하기 위해 명령 패턴을 구현하지 않을 것이라고 말할 수 있습니다. 어떤 시점에서 당신은 그들이 그것을 모른다면 그것을 배울 필요가 있다고 말해야합니다.
Ken Henderson

@confusedGeek 그렇습니다. 무지에 대한 선은 어디에 있습니까?
Orble

@Orbling, 솔직히 그것은 어려운 부분이며 어느 정도 상황에 달려 있습니다. 내가 사용하는 일반적인 가이드는 합리적으로 숙련 된 개발자 (사용 된 기술에 대해 잘 알고 있음)가 그것을 익힐 수 있다면 아마 괜찮을 것입니다. 이들이 불가능한 경우 리팩토링해야합니다 (또는 채용 관행을 검토하십시오).
Ken Henderson

@confusedGeek Aye, 현명하게 들립니다. 리트머스 테스트는 아마도 자신과 같은 구경의 개발자가 당신이 충분히 빨리 한 일을 쉽게 이해할 수있을 것입니다. 그렇지 않은 경우 더 쉬운 방법이 있으면 변경해야합니다. 때로는 더 쉬운 방법이 없습니다.
Orbling

-1. 최저 공통 분모를 코딩하지 마십시오. 불필요한 복잡성은 나쁘지만 일부 영리함으로 인해 코드가 훨씬 더 건조 해지면 가치가 있습니다.
dsimcha

-1

여기 어디에서나 언급 된 징계라는 단어를 찾을 수 없었기 때문에 칩을 넣을 것입니다. 답변 을 게시 하고 싶지는 않지만 문제에 대한 다른 통찰력을 공유하려고합니다. .

영리한 개발자가 좋습니다.

그러나 영리하기 전에 다른 특성이 있습니다. 당신은 내가 징계 에 대해 이야기 할 것임을 깨달았을 것입니다 . 영리하고 훈련되지 않은 개발자는 시스템의 장기적인 유지 관리 능력이 매우 나쁠 수 있습니다.

버그가 발생하거나 새로운 요구 사항이 발생한다고 가정 해 봅시다. 영리한 개발자가 곧 로컬 수정 몇 가지로 2 분 안에 작업이 완료 될 것임을 알 수 있습니다. 해당 개발자가 훈련을 받으면 해당 수정 사항을 소스 코드에 적용하지 말고 대신 시스템에 원하는 동작을 구성 할 수있는 의미있는 방법을 찾으십시오. 이렇게하면 다음에 특정 코드 조각을 수정해야 할 때 관리자는 코드를 이해하고 아무 것도 훼손하지 않고 새로운 변경 사항을 쉽게 구현할 수 있습니다. 그렇지 않다면, 당신은 잘 그림을 얻는다.


"사기가 나아질 때까지 구타가 계속됩니다"
gnat

@gnat 의미 하는가? 조금 정리하기; 나는 개발자에게 강요되는 것으로 훈련을받지 않습니다. 좋은 성격 특성입니다. 일반적으로 소프트웨어를 유지 관리 한 후 똑똑한 사람들이 개발 한 것입니다. 문제는 관리자 위치에 있지 않은 영리한 사람들이 다른 사람들이 찾을 수 있도록 영리한 폭탄을 모든 곳에 두는 것입니다.
dkateros
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.