프로그래머라고하는 알고리즘과 데이터 구조를 이해해야합니까? [닫은]


37

코딩 한 지 6 년이 지났습니다. ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP 등과 같은 모든 종류의 코드로 코딩했습니다. 나는 배열, 맵, 링크 된 목록, 세트 등을 사용했고 내가 같은 사람들을 일하는 모든 곳에서 사용했습니다. 그러나 인터뷰 할 때마다 사람들이 해시, 나무, 스택 및 대기열에 대해 질문 할 가능성이 큽니다. 몇 가지 질문은 정렬 알고리즘을 저글링하는 것에 관한 것입니다. 내가 정말로 그들을 알아야하는지 아니면 프로그래머라고 부르지 말아야하는지 모르겠다. 이 모든 질문을하는 사람들이 저를 선택하더라도 저에게 이런 일을하게하지 않을 것입니다. 이 모든 것을 정말로 알아야합니까?


10
그것은 당신이 어디에서 일하고 누구에게 프로그래머를 부르고 싶은가에 달려 있습니다.
Tim

1
예, 부정적인 형용사 없이는 가능합니다.
duros

답변:


79

접착제 코드를 작성하는 방법 만 알고 있다면 코드 원숭이라고 부를 수 있습니다. 많은 접착제 코드를 작성해야하며 코드 원숭이처럼 괜찮은 생활을 할 수 있습니다. Real Programmer TM 라고 부르고 코드를 처음부터 작성해야 할 때 신뢰할 수 있으려면 알고리즘, 데이터 구조, 메모리 관리, 포인터, 어셈블리 언어 등을 알고이 지식을 사용하여 트레이드 오프를 평가하는 방법을 이해해야합니다.


6
와중에, 나는 "코드 원숭이"라는 용어를 사용하기 위해 지나치게 정치적으로 올바른 사람들에 의해 이것을 망각으로 떨어 뜨릴 것으로 예상했다.
dsimcha

15
"software simian"은 항상 선호되는 용어입니다.
STW

3
전적으로 동의하지 않습니다. "처음부터"작성되는 소프트웨어의 유형은 작성 가능한 사람에게 큰 영향을줍니다. 어떤 소프트웨어는 본질적으로 다른 것보다 정교함이 덜 필요합니다.
Nick Spreitzer

8
+1, 20 %는 동의, 5 %는 "Real Programmer TM", 75 %는 어셈블리 언어를 배우고 고통스러워할만한 척하고자하는데
Carson Myers

3
기존 작업의 대부분은 '코드 원숭이'만 필요합니다. '코드 원숭이'직종에있는 사람들은 자신의 잠재력에도 불구하고 매일 자신의 지식을 잊어 버리고 매일 자신을 조금 더 '코드 원숭이'로 만드는 경향이 있습니다. :(
cag

32

역사를 모르는 사람들은 역사를 재창조해야한다


75
실제로, 역사를 모르는 사람들 은 모두 50 세에서 술을 사기에 충분히 오래된 O (N log N) 방법을 사용하는 대신 O (N 2) 또는 O (N 3) 방법을 사용하여 이를 재발 명해야 합니다. 상태.
John R. Strohm

@ 존 ROFLMAO-너무 사실!
Steven A. Lowe

3
.... 다시

30

JavaScript와 같은 언어로 작업하면 배열이 벡터, 해시 및 트리 사이의 혼합이며 스택 또는 대기열로 사용될 수 있기 때문에 이것은 매우 쓸모가 없습니다. Array 클래스를 능가하는 JavaScript에서 데이터 구조를 구현해야하거나 구현할 가능성은 거의 없습니다. PHP에서도 마찬가지입니다.

Java OTOH의 경우 차이점이 있습니다. Java의 표준 라이브러리가 필요한 모든 데이터 구조에 대해 제공한다고 가정합니다. 하나:

  1. 이러한 데이터 구조를 알고 구별하고 다양한 상황에서 어떻게 수행되는지 이해해야 올바른 구조를 선택할 수 있습니다.
  2. Java에서는 매우 특별한 경우에 더 나은 속도를 얻기 위해 해시 맵에 대한 자체 구현을 작성하고 싶지 않을 것입니다 (예 : 키를 처리하려는 키가 최적화를 허용하는 특수 제약 조건을 완전히 채우는 경우).

정렬 알고리즘에 관해서는 스스로 알고리즘을 구현할 필요가 없기 때문에 알고리즘을 알거나 이해할 필요가 없습니다. 그러나 그러한 알고리즘이 제공되면이를 이해하고 구현할 수 있어야합니다.

두 가지가 확실합니다.

  1. 이와 같은 지식에 의존하지 않고 프로그래머로 경력을 쌓을 수 있습니다 .
  2. 그것은 가장 확실히 그들을 알고 당신을 해치지 않을 것입니다.

데이터 구조와 알고리즘은 이해하기 쉬운 것입니다. 그리고 그것은 응용 프로그램이나 시스템 엔지니어링의 복잡한 것과 비교할 때 매우 명확하고 공식화 된 것이므로 아주 사소한 것입니다. 그들은 퍼즐에서 하나의 작은 조각이지만, 당신이 시간을 투자 할 의사가 있다면 이해하기 쉽습니다.

따라서 아닙니다, 당신은 그것들을 필요로하지 않지만, 그것들을 아는 것은 당신의 이익 을 위해서만있을 것입니다.


13

이것은 '프로그래머'와 '소프트웨어 엔지니어'사이에 의미 적으로 의미있는 차이가있을 수 있습니다. 이러한 맥락에서 특히, 우리는 여러 프로그래밍 언어와 관련 기술에 대한 지식이 있으며이를 사용하여 원하는 결과를 얻을 수 있음을 알 수 있습니다. 이것은 '컴퓨터 프로그래머'의 훌륭한 작동 정의입니다.

저는 저 자신을 소프트웨어 엔지니어라고 생각합니다. 내 일의 대부분의 일상에서 나는 아마 당신과 같은 일을 할 것입니다. 컴퓨터 언어와 관련 기술을 사용하여 원하는 결과를 얻습니다. 그러나 저는 데이터 구조와 알고리즘에 대해 이해하고 있으며 지식이 훨씬 더 많은 것을 할 수있는 기본적인 토대라고 생각합니다.

종종 – 아직은 아니지만 – 내 직업은 명백한 해결책이없는 복잡한 문제에 대한 해결책을 찾는 것과 관련이 있습니다. 와. 이 과정에서 문제를 분석하고 솔루션을 고안해야하며 때로는이 프로세스가 대규모 아키텍처 영역으로 이동합니다.

이러한 종류의 작업을 수행하려면 이러한 더 깊은 문제에 대한 탁월한 이해가 필요하지만 충분 하지 않습니다 . 다시 말해, 해시 테이블의 작동 방식 또는 힙 정렬에 일반적으로 우수한 성능 특성이있는 이유를 아는 것만으로는 시스템 설계자 또는 선임 엔지니어로는 충분하지 않습니다. 이곳은 논리적 인 출발점이며, 더 깊이 파고 여행을 시작하고 더 큰 문제를 해결하는 데 필요한 경험을 얻을 수 있습니다.

본인의 질문에 대답하기 위해 "무엇을하고 싶습니까? 내 경력은 어디로 갈 것입니까?" 당신이하고있는 일을 계속하기에 만족한다면, 당신이 직면 한 거의 임의적 인 면접 질문을 통과하기에 충분한 데이터 구조와 알고리즘을 배우고 싶을 것입니다.

당신의 경력에서 성장하고 싶고 그에 대한 열정이 있다면, 당신은 가능한 한이 주제들을 포용해야합니다. 그들과 함께 일할 시간이 있고, 열린 마음과 진정한 열정이 있다면, 훌륭하고 흥미로운 것들을 발견 할 것입니다. 내가 퀵소트를 처음 이해 한 날을 절대 잊지 않을 것입니다. 흥분과 발견의 느낌은 내 남은 인생의 대부분을 향한 길을 열었고 나는 그것에 대해 더 감사 할 수 없었습니다. 이제는 소프트웨어 엔지니어로 일하는 것 외에는 아무것도 할 수 없습니다.

당신이 선택한 무엇이든 행운을 빈다.


2
항상 확실한 해결책이 있습니다. 요구 사항이 변경되면 작동이 중지됩니다.) 알고리즘과 데이터 구조에 대한 깊은 지식이 훌륭한 소프트웨어 엔지니어에게는 전제 조건이라고 생각하지 않습니다. 훌륭한 소프트웨어 엔지니어가 가진 지식은 지식에 대한 만족할 수없는 갈증이기 때문에, 당신은 그것 없이는 그것을 거의 볼 수 없습니다.
back2dos

+1 잘 표현되어 있습니다. '귀하의 질문에 대답하기 위해 "무엇을하고 싶습니까? 내 커리어와 함께 어디로 갈까요?"
Bill

11

직업이 무엇인지에 달려 있습니다. 이런 종류의 것들은 상당히 표준적인 면접 질문이지만, 상당히 상상력이 많고 아마도 직업과 관련이 없을 수도 있습니다. 확실히 당신이 열거 한 기술을 사용하는 직업이 아닙니다.

인터뷰 질문으로 가면 일반적인 프로그래밍 능력이나 지식이 아니라 컴퓨터 과학 학위를 받았는지 기억할 수 있는지를 잘 판단 할 수 있습니다.

나는 당신이 인터뷰를 통해 얻을 수 있도록이 물건을 배우거나, 당신이 이러한 것들을 요구하는 곳이 당신을위한 것이 아니라는 것을 받아 들일 것을 제안하지만, 아니, 당신은 프로그래머에게 전화하기 위해 그것들을 알 필요가 없습니다.


1
답변 주셔서 감사합니다. 나는 json css ajax javascript jquery 등을 사용하여 사용자 인터페이스 측면에서 좋은 사람이 필요하다고 생각하는 우스운 인터뷰 사람들과 공유 할 것입니다. 그들은 어떻게 웹 서버를 작성할 것인지 물었습니다. 단어 파일에서 save를 누르면 어떻게됩니까
sushil bharwani

2
@sushil-나는 그것이 당신이 일하고 싶지 않은 곳이라고 생각합니다 ...
Jon Hopkins

@sushil : @Jon Hopkins에 전적으로 동의합니다. 그런 일을하는 것보다 좋은 일을 기다리는 웨이터로 일하는 것이 더 좋습니다. 무능한 멍청이를 상사로 두는 것은 당신을 극도로 좌절시키고 개인 발전에 방해가 될 것입니다.
back2dos

6

좋은 질문입니다. Javascript 또는 Java 또는 VC ++는 처음부터 연결된 목록 또는 해시 테이블을 만들 필요가없는 슈퍼 스마트 프로그래밍 언어입니다. 그러나 여전히 서로를 사용할 때를 결정할 수있는 능력, 각각의 성능 페널티 및 보너스 등이 있어야합니다.

나는 많은 API 프로그래머 ( 일명 코드 원숭이)를 인터뷰했으며, 대부분의 인터뷰에서 그들은 성능 효율적이고 확장 가능한 시스템을 설계하지 못했습니다. 결론 : 많은 양의 API를 아는 것은 빵을 얻을 수 있지만 버터의 경우 컴퓨팅의 기초부터 시작해야합니다.


감사합니다. 조언을 구하고 그 주제에 대해 배우기 시작할 것입니다
Mahmoud Hossam

3

"물론 그래도 여전히 프로그래머라고 부를 수 있습니다"라고 덧붙입니다. 그러나 어떤 종류의 프로그래머가되고 싶습니까? 최고의 프로그래머는 이론적 기초에 적어도 약간의 근거가 있다고 생각합니다. 그들은 특정 데이터 구조 / 알고리즘과 함께 제공되는 트레이드 오프를 선택 했는지 알고 있습니다. 인터뷰에 참여한 개발자는 동일한 전문 용어를 사용하지 않더라도 최소한 기본적인 이해를 할 것으로 기대합니다 (용어를 모르는 경우 다른 개발자와 의사 소통하기가 더 어렵다는 것을 의미합니다).


2

알고리즘에 대한 지식을 통해 선택이 어떻게 확장 될지 자신있게 말할 수 있습니다 ! 나는 개인적으로 이것을 수석 프로그래머가되기 위해 필요하다고 생각합니다.



1

그것은 프로젝트에 달려 있습니다 : 저는 컴퓨터 엔지니어의 BEng이고 분석가 프로그래머로 일하고 있습니다.

디자인 (테스트, 문서, 코드 디자인)에서 일하는 데 많은 시간을 보냈습니다. 그러나 버그 (또는 나쁜 성능)를 찾거나 새로운 데이터 구조를 코딩해야 할 때 (응용 프로그램의 요구 사항이 매우 새롭기 때문에) 알고리즘의 문제가 어디에 있는지 이해해야하며 그를 수정해야합니다 ( 나는 이것을 잘하지 못했습니다. :))

고전적인 알고리즘과 데이터 구조는 개발자 세계에서 일종의 "사전 패턴"입니다.

훌륭한 링크들 :


1

당신은 지금 좋은 프로그래머 일지 모르지만 데이터 구조, 알고리즘 및 컴퓨터 과학의 다른 주제에 대한 지식은 여러면에서 자신을 향상시키는 데 확실히 도움이 될 것입니다.

  • 일을하는 데 더 효과적이고 빠를 수 있습니다. 이미 컴퓨터 과학 학위를 가지고 있고 이러한 주제를 많이 알고있는 사람들조차도 자신을 향상시키기 위해 최신 기술을 접하는 경향이 있습니다.

  • 또한이 지식은 프로젝트의 기술적 측면을 더 잘 이해할 수 있기 때문에 프로그래머가 관리 트랙으로 나중에 이동하는 경우에도이 지식이 좋습니다.

  • 물론 데이터 구조와 알고리즘은 인터뷰에서 많이 요구되므로이를 아는 것이 유용한 또 하나의 이유입니다.


0

해시, 트리, 스택, 대기열 및 정렬 알고리즘에 대해 언급합니다. 글쎄, 당신이 언급 한 기술은 주로 웹 페이지 및 웹 스크립팅 관련입니다. 최소한 나무를 확실히 이해해야 DOM을 잘 사용할 수 있습니다. 그러나 스크립팅이 필요한 모든 것이라면 아마도 괜찮을 것입니다. 실제 프로그래머를위한 대부분의 도구는 필요하지 않습니다. 그러나 이는 대부분의 웹 스크립팅을 구성하는 문자열 저글링과 대부분의 사람들이 "프로그램 작성"을 고려하는 것 사이에 큰 차이가 있기 때문입니다.

나는 매일 해시와 트리를 사용하여 실제 작업을 수행하고 스택과 대기열을 덜 자주하지만 자주 사용합니다. 정렬은 기본적으로 해결 된 문제입니다. 모든 언어에는 표준 라이브러리에 퀵 정렬이 내장되어 있고 기본 컬렉션 유형에 대한 정렬 방법 등이 있지만 퀵 정렬의 성능이 심각하게 저하 될 수있는 상황과 정렬을 지연시키는 올바른 전략을 알아야합니다.

이러한 원칙과 작동 원리를 모르면 작동하는 코딩 솔루션을 해킹 할 수는 있지만 품질이 좋은 솔루션은 아닙니다. 느리게 실행되고 읽기 어려우며 수정, 재사용 또는 확장하기가 어렵습니다. 따라서 훌륭한 프로그래머가되는 법을 배우려면 알고리즘과 데이터 구조를 반드시 읽어야합니다. 실제로 코드 품질을 향상시킵니다.

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