결코 우아하지 않다

6607 단어

우아한 코드는 항상 사람을 즐겁게 한다. 예를 들어 아래에 두 단락의 코드가 있는데 모두 같은 기능을 실현했다. 코드 A를 보고 코드 B를 볼 때 너도 심신이 유쾌한 느낌이 들지 않니?
 
코드 A:
 
 1 //          ,     ,   +1     。
 2 int a;
 3 printf("");
 4 fflush(stdin);
 5 scanf("%d", &a);
 6 
 7 //       
 8 if (a % 2 == 0) 
 9 {
10   printf("   :%d
", a); 11 } 12 else 13 { 14   a = a + 1; 15   printf(" :%d
", a); 16 }

 
 
 
 
코드 B:
 
1 //          ,     ,   +1     。
2 int a;
3 printf("");
4 fflush(stdin);
5 scanf("%d", &a);
6 
7 //    
8 printf("   :%d
", a + a % 2);

 
 
 
 
9줄 코드를 1줄 코드로 만들고도 똑같은 기능을 할 수 있는 넉 냥 천 근의 맛이 나고 우아함도 이렇게 생겼다.
그러나 코드가 적을수록 우아해지는 것일까?대부분의 경우 그렇지만 절대적이지는 않다. 맹목적인 추구는 종종 그 반대이다. 가장 뚜렷하고 의견적인 예는 바로 아래의 코드이다.
 
1 //             
2 int a = 0;
3 int i = 2;
4 a = (++i) + (++i) + (++i);
5 printf("%d
", a);

 
 
 
 
 
사실 오늘은 주로 위의 코드에 대해 이야기하고 싶습니다. 많은 기업의 면접 문제에서 이와 같은 문제가 자주 등장합니다. 저는 개인적으로 면접 문제에서 이런 문제가 나온 기업은 무책임하고 무책임한 인사부나 기술부를 가지고 있다고 생각합니다.
왜 이런 문제를 시험해야 하는지, 나는 세 가지 이유가 있다고 생각한다.
1. 우리 회사에서 이런 코드는 우아하고 효율적인 코드로 여겨진다. 회사의 기존 프로그램에서 이런 코드를 작성했다. 우리는 새로 가입한 구성원에게 이런 코드를 읽을 수 있도록 요구한다. 심지어 장래에 회사에 가입한 후에 새로운 구성원도 이런 코드를 쓸 수 있다.
2. 우리 회사에서 우리는 이런 농축 코드가 난해하고 이해하기 어렵다고 생각하기 때문에 우아하지 않거나 위조 우아하다고 생각한다.비록 우리는 실제 프로젝트에서 이런 코드를 작성하지 않을 뿐만 아니라 신입사원에게 회사에 가입한 후에 이런 코드를 작성하도록 요구하지 않을 것이다. 그러나 우리는 여전히 그것을 면접 문제에 넣는다. 왜냐하면 우리는 신입사원이 기술이 뛰어나고 가슴에 익숙한 조작부호의 우선순위가 어느 정도 일부 문제를 설명할 수 있기를 바란다.
3. 우리 회사에서 면접 문제는 모두 다운로드한 것이거나 역사가 남긴 것이다. 그런 문제는 보기에 매우 높고 우리 회사도 매우 높아 보일 수 있으니 남겨 두어라.
안타깝게도 대부분의 기업이 세 번째 이유죠.
 
코드가 줄어들었지만 여전히 같은 기능을 실현할 수 있으니 자연히 대단하다.그러나 과연 같은 기능을 실현할 수 있을까?시험을 통해 위의 이 코드가 서로 다른 컴파일러에서 얻은 결과가 다르다는 것을 발견하였다.
l VS2010에서 VC++ 콘솔 항목을 새로 만듭니다. 실행 결과는 다음과 같습니다. 15
먼저 세 개의++i를 실행하게 하면 i는 5가 되고, 그 다음에 5+5+5=15가 된다.
l VC++ 6.0에서 Win32 콘솔 프로젝트를 새로 만듭니다. 실행 결과는 다음과 같습니다. 13
왜 결과가 13인지 나도 이해가 안 돼.
l VS2010에 새 C# 콘솔 프로젝트를 만들었습니다. 실행 결과는 다음과 같습니다. 12
먼저++i를 얻으면 3을 얻고, 다시++i를 얻으면 4를 얻고, 다시++i를 얻으면 5를 얻는다.
그리고 3+4+5=12.
 
VC++6.0 시대에 이런 면접문제가 나온 것은 나무랄 데가 없다.그러나 시대가 변화하고 있기 때문에 현재는 (++i)+(++i)+(++i)를 시험하는 것이 적합하지 않다. 왜냐하면 서로 다른 컴파일러에서 서로 다른 결과를 얻을 수 있기 때문이다.
만약 두 번째 이유로 유능한 사람을 찾으려고 이런 문제를 면접문제에 넣었다면 얼마나 좋은 선수였기에 이 문제를 정확하게 대답할 수 있었을까?나는 표준 답안은 다음과 같아야 한다고 생각한다. "이 문제는 VC++6.0에서 13을 출력하고, VS2010에서 C++로 15를 출력하며, C#로 12를 출력한다."그리고 각종 결과의 계산 과정을 첨부한다.나는 이런 명수가 매우 적을 것이라고 생각한다. 만약 정말 면접 문제에 이 문제를 넣는다면 기업은 최고의 명수를 찾지 못할 뿐만 아니라 오히려 일반적이고 괜찮은 명수를 많이 놓칠 것이다.
첫 번째 이유 때문에 우아한 코드를 쓸 수 있는 파트너를 찾으려면 더욱 믿을 수 없다. 첫째, 이런 코드는 우아한 것이 아니다. 왜냐하면'같은 기능을 실현하는 것'이 없기 때문에 컴파일러에 따라 결과가 다르기 때문이다.
 
결론: 코드를 더 적게 농축해도 똑같은 기능을 실현할 수 있다. 대부분의 경우 우아한 방법이지만 두 가지를 고려해야 한다. 첫째, 코드를 어렵게 만들지 말아야 하고, 둘째, 서로 다른 컴파일러에서 서로 다른 결과가 나타나지 않도록 해야 한다.
 
PS: 주제에 맞지 않을지도 몰라요. 수준이 제한되어 있으니 아낌없이 가르쳐 주세요.

좋은 웹페이지 즐겨찾기