> 헤드라인 > 본문

프로그래머라면 여러 언어에 익숙해야 합니다.

-
풀어 주다: 2018-03-12 17:57:47
원래의
2463명이 탐색했습니다.

프로그래머라면 여러 언어에 익숙해야 합니다.

프로그래머가 프로젝트를 시작할 때 내려야 하는 주요 결정 중 하나는 시스템 구현에 사용할 언어 또는 언어 집합을 선택하는 것입니다. 이 결정은 시스템 구현뿐만 아니라 설계에도 영향을 미칩니다. 예를 들어, 객체 지향 언어를 사용해야 할까요, 아니면 절차적 언어를 사용해야 할까요? 우리가 선택하는 언어는 프로젝트와 프로젝트의 일부인 프로그램의 수명 주기에 지대한 영향을 미치므로 우리는 아무 생각 없이 이를 선택하는 경우가 많습니다. 매우 변덕스러운 요인에 따라 너무 많이 사용됩니다. 언어를 선택하세요. 이 언어는 제가 가장 잘 이해하는 언어이며 이 언어로 프로그래밍하는 것을 즐깁니다.

이 결정은 심오하고 장기적인 결과로 이어질 것이기 때문에 우리는 이 선택을 할 때 더 실용적이어야 할까요? 우리는 우리가 선택하는 언어에 따라 맹목적으로 편견을 갖게 될 것입니다. 그리고 때로는 우리가 그 언어를 선택하는 것을 좋아하지 않는 이유가 바로 우리가 그 언어를 선택하는 이유일 수도 있습니다.

마음을 열고 편견을 솔직하게 드러낼 수 있다면, 장식할 때 둥근 구멍에 네모난 못을 맞추는 고통을 어느 정도 완화할 수 있습니다. 프로젝트에 완벽한 언어를 선택하는 데 비결은 없지만 더 좋고 더 적절한 언어를 선택하는 데 도움이 될 수 있는 몇 가지 원칙이 있습니다.

완벽한 언어는 없습니다

이것은 초보자라도 누구나 예상할 수 있는 일이며, 우리 중 많은 사람들이 "물론 이 언어는 완벽한 언어는 아닙니다"라고 인정하지만 동시에 많은 사람들이 우리 중 아직도 "이 언어는 최고의 프로그래밍 언어다"라고 말합니다. 언어가 프로젝트에 가장 적합한 언어라고 말하는 핵심은 프로젝트의 맥락입니다. 즉, 최고의 언어는 특정 범위 내에서만 존재합니다. 이것이 우리의 첫 번째 원칙입니다.

완벽한 언어는 없습니다. 모든 언어에는 장점과 단점이 있습니다.

예를 들어 일반적으로 Java 또는 Python과 같은 런타임 언어를 사용하는 많은 개발자는 C 또는 C++가 메모리 관리와 같은 하위 수준 세부 사항에 중점을 두거나 컴파일 타임 유형에 관심을 갖기 때문에 숨이 막힌다고 주장합니다. 엄격한 세분성 검사 개발자의 분산된 책임을 억누르면서. 우리가 개발 중인 프로젝트가 메모리 관리나 단일 루프에서 발생하는 복사 할당 횟수와 같이 사소해 보이는 작업에 초점을 맞추지 않는 한 이는 사실입니다.

반대로, 프로젝트나 프로젝트의 일부를 작업하는 경우 코드가 얼마나 효율적이어야 하는지, 프로그램이 얼마나 중요하고 안전한지에 대해 편향된 요구를 갖는 것은 당연합니다. 이렇게 지루해 보이는 세부 사항이 바로 수준일 수 있습니다. 우리가 찾고 있는 세분성. 이 새로운 맥락에서 보면 Java 또는 Python의 런타임 특성은 너무 무관심하거나 너무 무관심해 보입니다. 대신, 우리는 메모리가 할당되고 해제될 때 실행되는 이동 할당 및 복사 할당 수를 엄격하게 제어하고 오류가 런타임으로 누출되는 대신 컴파일 타임에 가능한 한 많은 오류를 포착할 수 있기를 원합니다. 런타임 비정상).

이론적으로 "완벽한 언어는 없다"는 말이 당연하게 들리지만 개발자로서 우리의 행동은 종종 이 개념에서 벗어납니다. 우리는 우리가 가장 좋아하는 언어가 불완전하다는 것을 알고 있다고 말하지만 우리가 개발하는 프로젝트에 여전히 이 언어를 계속 사용합니다. 그것이 적절한지 여부에 관계없이. 더욱이, 다른 개발자가 우리가 선택한 언어에 대해 의문을 제기할 때 우리는 그 사람의 반박에서 진실을 보기보다는 우리의 선택을 적극적으로 옹호합니다. 기억하세요: 모든 언어에는 장단점이 있습니다. 자신이 마스터한 언어의 장단점을 파악한 후 상황에 맞게 선택하세요.

언어를 좋아하지 않는 이유가 그 언어를 사용해야 하는 이유일 수도 있습니다

직관에 어긋나는 것처럼 보일 수도 있지만 때로는 언어를 좋아하지 않는 이유가 그 언어를 사용하는 이유일 수도 있습니다. 위의 예에서도 C++ 개발자로서의 내 경험으로는 추적해야 할 개념(메모리 관리 및 개체 수명, C++ 프로그래밍의 세 가지 원칙 등)이 너무 많기 때문에 프로젝트를 완료하는 데 시간이 너무 오래 걸리는 경우가 많습니다. .) 간단한 기능은 번거로울 수 있습니다. C++로 몇 주 동안 개발한 후에는 Python, Java 또는 다른 "상위" 언어를 사용하는 것이 선물처럼 보입니다. 하지만 정말 그렇습니까?

때때로 우리는 언어를 좋아하지 않을 수도 있습니다. 언어의 이유는 바로 이유입니다. 우리가 그것을 사용하는 이유. 드라이버나 안전이 중요한 실시간 시스템을 개발하는 경우 위에서 언급한 번거로움에 대한 이유가 이 언어의 가장 큰 장점일 수 있습니다. 예를 들어, C++는 객체가 복사될 때 실행되는 논리를 표현하는 메커니즘을 제공합니다. 이는 효율성과 엄격함이 적절할 때 매우 중요합니다.

이 모든 것이 좋아 보일 수 있으므로 마음에 들지 않는 언어가 더 도움이 될 수 있는 맥락을 정확히 찾아내기는 어렵습니다. 그렇다면 어떤 언어가 도움이 되는지 어떻게 알 수 있나요? 이는 우리의 두 번째 원칙으로 이어집니다:

스스로에게 솔직해지세요: 왜 언어를 좋아하지 않는지 알고, 자신을 증오한다고 독단적으로 생각하지 마세요.

예를 들어 위의 C++ 예에서 제가 오랫동안 C++로 프로그래밍하는 것을 좋아하지 않는 이유는 이 언어는 엄격한 사고가 필요하기 때문입니다. 그렇지 않으면 정글에 갇힌 것처럼 실수하기 쉽습니다( 통과 숲 전체보다는 나무에 더 집중하세요.) 이러한 엄격함은 개발자가 "객체를 스택이나 힙에 생성하는가, 아니면 일부는 스택에 생성하고 일부는 힙에 생성하는가?" 또는 "이 클래스를 확장 가능하게 만들려면 매개 변수를 통해서야 합니다."와 같은 질문을 하는 것을 방지합니다. 아니면 상속?" 그리고 다른 결정들. 다른 언어에서는 개발자가 단순히 객체를 생성하고 객체 지향 상속을 사용하여 이러한 작업을 수행한 후 언어(또는 더 정확하게는 컴파일러나 인터프리터)가 이러한 작업을 처리하므로 다음 기능으로 넘어갈 수 있습니다. 세부 사항.

하지만 솔직하게 말하면 C++의 이러한 기능을 좋아하지 않는 이유는 이러한 세부 사항을 표현해야 하는 부담이 나에게 있기 때문이라는 점을 인정하겠습니다. 다른 언어에서는 이러한 세부 사항에 대한 책임이 없을 뿐만 아니라 이를 표현할 책임도 없습니다. 세부 사항은 개발자로부터 추상화됩니다. 이러한 세부 사항이 필수적인 상황에서 내가 C++를 좋아하지 않는 이유는 바로 내가 이 언어를 사용해야 하는 이유입니다.

이것은 우리가 언어에 대해 화를 내는 기능을 사용하고 눈살을 찌푸려야 한다는 것을 의미합니까? 어쩌면 다른 방식으로 볼 수도 있습니다. 이러한 기능을 단점으로 보는 대신 작업을 완료하는 데 필요한 요소로 받아들여야 할 수도 있습니다. “이런 비극이군요”라고 말하는 대신 “이런 언어로 이런 일을 할 수 있어서 하느님께 감사드립니다.”라고 말해야 합니다. 어떤 상황에서는 이러한 능력이 선물이 될 수도 있고 어떤 경우에는 부담이 될 수도 있다는 점을 기억하십시오. 언어의 특정 기능이 마음에 들지 않는 이유에 대해 스스로에게 솔직해지세요.

다른 언어에 익숙해질수록 좋습니다

이를 위해 우리가 이야기하고 싶은 세 번째 원칙은 다음과 같습니다.

당신이 가지고 있는 유일한 도구가 망치뿐이라면 모든 문제는 못처럼 보일 것입니다.

이 규칙은 소프트웨어 엔지니어링에는 적용되지 않지만 많은 소프트웨어 개발 상황의 특징을 뚜렷하게 나타냅니다. 우리는 언어나 언어 지원 도구(예: Java의 JMS, Python의 ASYNCIO, Rails의 Ruby 등)가 존재한다는 것을 알고 있기 때문에 선택하는 경우가 많습니다. 우리에게 익숙한 유일한 언어가 Java라면 우리는 직면하는 모든 문제를 Java의 맥락에 맞게 조정할 것입니다. 예를 들어, "통신 애플리케이션을 위한 라우팅 프레임워크를 만들어야 합니다. Java에서 이를 어떻게 수행합니까?" 이는 우리가 사용할 수 있는 도구를 제한하고 작업에 적합한 도구를 선택하는 능력을 인위적으로 제한합니다.

이 문제에 대한 해결책은 시야를 넓히고 다른 언어의 기능과 복잡성을 이해하는 것입니다. Andrew Hunt와 David Thomas가 "The Pragmatic Programmer"에서 제안한 것처럼 매년 새로운 언어를 배우는 것이 좋은 습관입니다. 말처럼 쉽지는 않습니다. 언어를 배우는 것은 사람마다 다른 의미를 갖습니다. 또 다른 파생 문제는 우리가 진행 중인 프로젝트에만 이 언어를 사용하는 경우가 많아 다른 언어를 배우는 것이 쓸모없다는 것입니다. 예를 들어, 제가 Android 개발자이고 기본적으로 매일 Java만 사용한다면 C#을 배우는 것이 시기적절한 시간 낭비처럼 보일 수 있습니다.

환상에 속지 마세요. 다른 언어를 배우는 것의 장점은 문제를 다른 관점에서 볼 수 있고 문제에 가장 적합한 도구를 사용할 수 있다는 것입니다. 그러기 위해서는 다른 언어와 관련된 주의사항과 개발자가 해당 언어를 사용하여 문제를 해결하는 방법을 배워야 합니다. 예를 들어, 개발자가 C++에서 메타프로그래밍을 수행하려는 경우 C++에서는 TMP(템플릿 메타프로그래밍)를 사용할 수 있지만 Java에서는 리플렉션을 사용할 수도 있습니다. 다른 언어가 비슷한 문제를 어떻게 해결하는지 이해하면 우리가 그것을 쓸모없다고 생각할 위험이 줄어듭니다.

또 다른 예로, 클래스의 런타임 특성을 변경할 수 있어야 하는 경우 C++의 복잡성에 깊이 익숙한 C++ 개발자는 이 컴파일 타임 언어의 경계를 확장하는 솔루션을 만들어내고 싶은 유혹을 받을 수 있습니다. . 그리고 역시 Java에 대한 지식이 있는 또 다른 C++ 개발자는 "저는 C++를 좋아하지만 이 문제를 해결하는 데는 Java의 런타임 리플렉션이 더 적합합니다."라고 말할 수 있습니다.

프로그래밍이 너무 많기 때문에 개발자는 언어를 선택할 수 있습니다. , 그래서 어떤 언어를 배울 것인지 우선순위를 정하는 것이 중요합니다. 오늘날 가장 인기 있는 언어부터 시작하는 것이 좋습니다. ", 등.).

언어는 수단이지 끝이 아닙니다

이것은 네 번째이자 마지막 원칙으로, 가장 철학적으로 들릴 수도 있지만 가장 중요하다고도 할 수 있습니다.

프로그래밍 언어는 수단이지 끝이 아닙니다. .

언어 표준 작성자나 컴파일러 작성자가 아닌 이상 프로그래밍 언어를 목적이 아닌 수단으로 다루어야 합니다. 목적은 프로젝트를 완료하는 것입니다. 궁극적인 목표는 프로젝트를 완료하는 것이지 목적을 달성하는 것이 아닙니다. 특정 언어를 사용하세요. 이는 모든 개발자가 언어에 대해 자신이 좋아하거나 싫어하는 것을 요구할 권리가 없다는 것을 의미하지는 않습니다(사실 우리가 솔직하게 말하면 이러한 좋고 싫음이 우리에게 유리할 수 있습니다. 위의 두 번째 원칙) 그러나 언어의 기능이 프로젝트의 요구 사항에 실제로 맞지 않는 한 "이것은 언어의 이 기능을 사용할 수 있는 좋은 기회입니다."와 같은 결정을 내리도록 스스로를 속여서는 안 됩니다.

언어는 당면한 문제를 해결하는 방법을 표현하는 방법일 뿐이라는 점을 기억하는 것이 중요합니다. 해결하려는 문제 영역을 가장 잘 표현하는 언어를 선택하세요.

고려해야 할 기타 사항

언어를 선택할 때 고려해야 할 몇 가지 추가 사항은 다음과 같습니다.

언어가 다른 언어와 상호 작용하는 방식을 고려하세요. 예를 들어 Python이 대부분의 프로젝트에 가장 적합한 언어라고 결정했지만 매우 높은 수준의 세분성 또는 효율성이 필요한 잘 정의된 구성 요소가 프로젝트에 있는 경우(C 또는 C++에 더 적합함) 이 프로젝트에서 Python을 사용할 수 없다는 의미는 아닙니다. 대신 Python을 사용하고 C 또는 C++로 특정 구성 요소를 작성한 다음 Python C API를 사용하여 이 구성 요소에 인터페이스하는 것을 고려해 보세요. 그러한 솔루션을 공식화하려면 Python에 C API가 있다는 것을 알아야 합니다. 따라서 가장 널리 사용되는 언어의 이러한 기능을 아는 것이 도움이 됩니다.

미들웨어를 사용하면 여러 언어를 사용할 수 있습니다. 예를 들어, 통신해야 하는 두 개의 애플리케이션(예: 모바일 장치 및 서버 애플리케이션)이 있는 경우 이는 동일한 언어를 사용해야 한다는 의미는 아닙니다(물론 이것이 최선의 결정이라고 판단하면 동일할 수 있습니다). . 모바일 장치가 Android 휴대폰이고 서버 애플리케이션이 Python 애플리케이션으로 완벽하게 적합한 경우 RabbitMQ와 같은 메시지 브로커를 사용하면 두 언어를 동시에 사용하여 통신할 수 있습니다. Android 애플리케이션은 Java RabbitMQ API를 사용할 수 있습니다. , 서버 애플리케이션은 Python RabbitMQ API를 사용할 수 있습니다.

다른 언어의 특징을 포용하세요. Java 개발자라면 패키지를 사용하여 소스 코드의 논리 단위를 분리할 것입니다. Python 개발자라면 Python의 패키지 구조를 사용하여 C++ 개발자라면 마찬가지입니다. 네임스페이스를 사용하거나 클래스 이름 접두사(예: "DZone_MyClassName")를 사용합니다. 당신이 말하는 언어의 특별한 특징을 이해하고 포용하세요. 로마에서는 로마인이 하는 대로 행동하세요. 그렇지 않으면 이탈리아어 악센트로 독일어를 말하는 것과 같을 것입니다. 왜냐하면 설명이 아닌 것처럼 들리는 단어의 이탈리아어 발음을 선호하기 때문입니다. 물론, 언어의 특징이 오래전부터 존재했을 수도 있지만, 이 경우에는 이유가 있을 것입니다. 그 이유를 반드시 이해해야 합니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿