나는 좋은 프로그래머가 아닙니다 (논리적으로) 어떻게 고쳐야합니까? [닫은]


50

자, 여기 내 문제가 있습니다.

나는 대기업에서 일하는 방법에 대해 이야기하고있다 (솔직히 인터뷰가 쉬웠 기 때문에). 내 물건을 모른다는 것이 아닙니다. 나는 자바를 이해하는 데 능숙합니다. 도서관 등입니다.

그러나 논리 문제를 해결하려고 할 때 해결책을 찾기가 정말 어렵습니다.

예를 들어, conversion of decimal to roman솔루션을 보았을 때 간단한 문제라는 것을 알았습니다. 그러나 1-2 시간 동안 시도한 후에는 구현할 수 없었습니다!

나는 바보이며 소프트웨어 엔지니어가 될 가치가 없다고 생각합니다. 퍼즐 해결 능력 은 기본적으로 훌륭한 프로그래머에게 제공되어야합니다. 그러나 퍼즐을 풀려고 할 때 해결책을 찾을 수 없으며 단지 구글을 위로합니다! .... 그리고 나는 그것을 싫어합니다!

직장에서 (xyz 기능 구현과 같은) 문제가 발생했을 때, 나는 그것을 꽤 빨리 다루고 내 작업장에서 존경하지만 전혀 자랑 스럽지는 않습니다. 수학적으로나 논리적으로 현명한 도전적인 문제를 해결하려고 할 때 나는 혼란에 빠지기 때문입니다. 나는 여전히 내가하고있는 일 (엔지니어로서)을 좋아하지만 친구들이 내놓는 어려운 논리 문제를 해결할 수 없다는 사실에 슬퍼합니다.

나는 사기를 느낀다 :(

TL; DR : 실제적인 관점 (제품의 기능 구현)에서 물건을 이해하지만 ProjectEuler의 문제를 해결하려고 할 때 심하게 짜증납니다! 그리고 나는 뇌 를 갈아야 합니다!

그래서 내 질문은 :

  1. 수정하려면 어떻게해야합니까? 오일러 문제를 해결하고 시작해야합니까? 몇 가지 기본 문제를 해결하는 데 몇 시간이 걸리더라도 ?
  2. 아니면 기본으로 돌아가서 기본 수학을 공부해야합니까?
  3. 난 정말 퍼즐 해결 재미를 찾을 수 없습니다. 그러나 나는 내 자신을 위해 그것을 재미있게 만들고 싶다! 더 잘 이해하면 좋을 것 같아요!

추신 : 저는 CS 교육을받은 적이 없습니다 (저학년은 전기). 그러나 그것은 짜증나는 개발자라는 변명이 아닙니다.

감사!


3
그것이 당신을 위해 재미 해결 퍼즐이 아니라면 왜 귀찮게!
V4Vendetta

3
그것을 해결하기 힘든 시간이 있기 때문에 재미가 없습니다. 내가 그것을 잘한다면, 나는 그것을 좋아할 것입니다!
John

1
당신은 항상 시도 할 수 (당신이 경우, 심각 중독성을 경고 하다 퍼즐 해결에)
Benjol

2
아무것도 기본적으로 제공 되지 않습니다. 가장 기본적인 기술조차도 학습이 필요합니다. 나는 필요한 능력을 훈련시키기위한 운동장으로 미적분학과 고전 역학을 추천하지만, 다른 많은 과목들 (전적으로 수학이 아닌 것을 포함하여)은 같은 것을 할 수 있습니다.
SK-logic

3
@John 확인했습니다. 어려운 문제였습니다. 5 분 안에 해결할 수 없다면 기분 나쁘지 않아야합니다. 로마 숫자에 대한 Wiki를 읽은 후 결과를 다른 구현 결과와 비교하여 만 버그를 수정할 수있었습니다. 나는 (다른 많은 사람들처럼) IL이 유효한 숫자라고 생각했다. 잘못된. XXXIX가 올바른 숫자입니다. 또한 다른 구현을보고 최적화해야했습니다 (II, III, XX, XXX 등을 사전 캐싱했지만 쓸모가 없습니다). 기분 나빠하지 마세요!
xanatos

답변:


24

먼저, 이것이 당신의 기술의 약점으로 보는 것이 훌륭합니다. 실제로 어디에서 개선해야하는지 알기 때문에 훨씬 쉽게 수행 할 수 있으며 생각보다 낫다는 것을 나타냅니다.

여러 번 본 적이있는 주요 문제는 "문제 해결 툴셋"이 없다는 것입니다. 문제가 발생하면 어떻게해야합니까? 그것을 해결하는 방법은 무엇입니까? 나는 수학에 느리지 만 작은 수학 도구를 함께 사용하는 방법을 알고 있기 때문에 미적분학을 시작했습니다.

따라서 문제 해결을 위해 노력하는 것 외에도 그렇게 할 때 어떤 도구와 기술을 사용하는지 살펴 봐야합니다. 직장에서 새로운 기능을 사용하려고한다면 IDE, 디버거, 설명서, 인터넷, 소스 코드없이 그냥 앉아 있습니까? 당연히 아니지!

문제를 해결하기 위해, 당신은 단지 그들을 모르는 도구 .... 있습니다 아직 . Wikipedia 기사 에는 문제 해결 기술에 대한 링크가 있습니다. 그러나 가장 중요한 도구는 과학적 방법 입니다. Wikipedia 기사 에는 실용적인 접근 방식이 포함되어 있습니다.

  1. 질문 정의
  2. 정보 및 자료 수집 (관찰)
  3. 해설 가설을 세우십시오
  4. 실험을 수행하고 재현 가능한 방식으로 데이터를 수집하여 가설을 테스트합니다.
  5. 데이터 분석
  6. 새로운 가설의 출발점으로 작용하는 데이터 해석 및 결론 도출
  7. 결과 게시
  8. 재시험 (자주 다른 과학자들이 수행)

이 방법으로 모든 문제를 해결할 수 있습니다! 많은 사람들이이 단계를 거치지 않습니다. 코드 테스트를 거부하는 개발자와 같습니다. 조금도. 그는 버그가 존재하는지 알아내는 데 문제가 있습니다.

마지막으로, 문제 해결을위한 다른 기본 도구는 간단한 단계 로 도구를 분해하는 것 입니다. 예를 들어, Euler 프로젝트 의 첫 번째 문제는 다음과 같습니다.

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

여기에는 두 가지 사실과 문제가 있습니다. 사실 1은 10 이하의 3 또는 5의 배수를 정의하는 방법을 보여줍니다. 3 * 1,3 * 2,3 * 3,5 * 1은 모두 유효합니다. 5 * 2는 10과 같기 때문이 아닙니다. 그리고 사실 2는 23을 얻기 위해 그것들을 더한다고 말합니다.

따라서 이미 값을 찾는 방법이 있으며이를 합산하여 합을 구할 수 있습니다. 물론 사실을보고 간단한 순서의 역순을 적용 할 수 있습니다. 3, 5, 6 및 9는 3 또는 5의 배수입니다. 즉, 3 % 3, 5 % 5, 6 % 3, 9 % 3은 모두 0의 모드를 제공합니다. 따라서 다른 접근 방식은 999에서 1을 거쳐 각 숫자를 3과 5로 계수하는 것입니다. 값 목록을 수집하고 함께 더하십시오.

필자는 프로그래밍 세계에서 작은 도구를 사용하는 훌륭한 예로 유닉스 프로그래밍 기술을 제안 합니다. 그것들을 연결하면 매우 복잡한 문제를 해결할 수 있으며, 이러한 개념이 도움이 된 횟수를 셀 수 없습니다.


19

많은 프로그래머들도 자연스러운 "퍼즐 솔버"이지만 프로그래밍보다 훨씬 더 많은 것들이 있습니다. 모든 프로그래머가 흥미로운 알고리즘 문제를 해결하는 데 중점을 둔다면 멋진 문제를 해결할 수있는 많은 소프트웨어가있을 수 있지만 그 중 어느 것도 사용할 수 없거나 유지 관리 할 수는 없습니다.

나는 내 작업에서 "퍼즐 해결"유형의 과제가 상대적으로 적다는 것을 알았습니다. 대부분의 과제는 오래된 코드를 연구하고, 새로운 API를 배우고, 사람들이 3 년 안에 맹세하지 않는 방식으로 일부 구성 요소의 아키텍처를 설계하는 것입니다. 이 모든 것이 도전적이지만 논리 퍼즐 종류는 아닙니다. 반면에, 컴파일러 최적화 알고리즘에 대해 대부분의 시간을 소비하고 그에 능숙한 동료가 있습니다.

프로그래머가 "내가하는 일을 어떻게 더 잘할 수 있을까?"에 대해 끊임없이 생각하는 것이 중요하다고 생각하지만, 좋은 프로그래머가되기 위해서는 반드시 퍼즐 해결에 능숙해야하는 것은 아닙니다.

개인적으로, "mystery geocaches"를 해결하여 퍼즐 해결 문제를 해결했습니다 .


그러나 많은 핫 스타트 업 만이 퍼즐 해결 기술을 강조합니다. 페이스 북을 가져 가라. 퍼즐 해결에 능숙하지 않다면 지원할 자격도 없습니다!
John

6
페이스 북은 수천만 개의 CV를 거르지 않아도되는 첫 번째 점검으로 퍼즐 로봇을 가지고있다. FB를 위해 정말로 일하고 싶다면 그러한 종류의 문제를 해결할 수 있어야하지만 다른 좋은 곳이 많이 있습니다.
JesperE

환상적인 답변. =>
Hartley Brody

9

당신이 더 많이 알수록 알수록, 당신은 당신이 아는 것을 더 많이 깨닫게됩니다.

그것에 낙담하지 마십시오. 부족한 부분에 대해 계속 배우고 노력하십시오.

이제 귀하의 질문에. 내 제안은 eule r 프로젝트 의 문제에 대한 작업을 시작하는 것 입니다.

이것에 대한 나의 이유는 간단합니다. 가장 인기있는 질문부터 시작하십시오. 이들은 일반적으로 해결하기 쉬운 문제입니다.

문제가 발생하면 문제를 해결하고 직접 해결하고 다른 접근법을 시도하십시오. 프로젝트 오일러가 작동하는 방식으로 답변을 확인하고 테스트 할 수 있습니다.

이 문제를 해결할 수 없다고 판단되면 문제를 조사하십시오 (답을 찾지 않음). 다시 시도하지 마십시오.

문제를 해결하면 프로젝트 오일러에는 각 언어 구현에 대한 최상의 답변을 보여주는 섹션이 있습니다. 선호하는 언어로 답변을 살펴보고 해결책과 생각을 이해하십시오.

이제 제공 한 답변을 닫고 다시 해결 될 때까지 스스로 다시 시도하십시오.

충분히 연습하면 이러한 문제를 해결하기위한 논리와 생각이 쉬워지고 쉬워집니다.


4

대부분의 프로그래밍 작업에는 많은 로직이 필요하지 않습니다. 그러나 이들은 당신이 좋아하는 직업이 아닐 수도 있습니다.

일반적인 지침으로 알고리즘과 구조를 배우십시오. Skiena의 The Algorithm Design 매뉴얼을 조언 할 수 있습니다. 이것들을 알면 문제를 분류하기 시작할 것입니다. 이것은 여행하는 세일즈맨 문제처럼 보입니다. 여기에서는 트리를 사용할 수 있습니다. 여기서는 이진 검색을 사용할 수 있습니다 ...

프로젝트 오일러에는 다양한 종류의 퍼즐이 있습니다. 이것들 대부분은 기본 수학 지식으로 쉽게 할 수 있습니다. 이 알고리즘 중 몇 가지를 알고 나면 더 쉽게 해결할 수 있습니다.


2

나는 당신이 프로그래밍에 대한 여행을 시작했다고 믿습니다. 그래서 가장 먼저 파악하고 이해하는 데 시간이 걸리면 문제가되지 않는 것 같습니다. 그것이 시도하는 것의 유일한 차이점은 와우 와 같은 것을 배우는 것입니다 ! ! 마지막으로 내가 이해하지 못한 것은 십진수가 필요하고 두 배가 아니라는 것입니다.

퍼즐을 푸는 데 관심이 없다면 헤드 헌팅을하지 말고 코드베이스를 알고 나면 다른 논리적 인 문제가 떠오를 수 있습니다. . (당신이 약간의 실수를하더라도 걱정하지 마십시오. 왜 방법론에 결함이 있는지 알 수 있습니다. 따라서 예리한 관찰자와 적절한 청취자가 되십시오)

정착하는 데 시간이 걸리고 모든 실린더에서 발사 될 수 있습니다. 말할 필요도없이 구글이나 SO에서 솔루션을 찾고자하는 충동을 피하고, 끝까지 노력을 기울이고 의심이 있거나 절대적으로 우 둔 경우에만 브라우저를 시작하십시오.


1

당신의 약점을 아는 것은 실제 강점이므로 더 나은 게임을 얻기 위해 무엇을 연구해야하는지 알고 있습니다.

내 조언은 논리 문제를 해결하는 많은 코드를 읽는 것입니다. 모든 사람은 퍼즐을 푸는 데있어 자신 만의 스타일을 가지고 있습니다. 코드를 읽으면이를 수행하는 방법을 배울 수 있습니다. 또한 코드를 이해하면 문제를 설명하는 수학적 이론을 지적 할 수 있으므로 근본적인 문제에 대해서도 배울 수 있습니다.

건배, 카를로


1

나는 이것에 추가해야한다고 생각합니다.

선택한 답변에서 이미 언급했듯이 약점을 아는 것이 큰 이점이며 문제 해결 기술을 배우기위한 몇 가지 기본 도구가 있습니다. 그러나 대답에서 부족하다고 생각하는 것은 단지 어려운 문제를 수행하는 방법을 찾는 것입니다. 시도하는 모든 문제를 완전히 끝내는 데 고집을 부리지 마십시오. 문제 해결 주제에 관한 책을 읽는 것과 마찬가지로 코드를 많이 읽는 것이 좋습니다. 그러나 코드를 작성하는 것이 거의 더 중요합니다.

어떤면에서 우리는 같은 약점을 공유합니다 (하지만 생각만큼 나쁘지는 않습니다). 내 문제 해결 기술을 연습하기 위해 항상 일부 프로젝트 Euler 또는 HackerRank 문제를 해결하고 있습니다. 쉬운 문제라면 7 가지 프로그래밍 언어를 골라 모든 언어로 해결하려고합니다. 더 어려운 문제의 경우, 문제에 대한 시간을 합리적으로 유지하기 위해 서로 매우 다른 3 개의 언어를 선택할 수 있습니다. 모든 문제에 대해 해결책을 찾은 후에는 다른 사람들이 생각 해낸 해결책을 찾아서 이해해야합니다. 일부 솔루션을 이해하지 못하면 언제든지 StackOverflow에 게시하거나 아마도 프로그래머 스택 교환이나 다른 곳에 게시 할 수 있으며 사이트에 귀하의 질문에 대답 할 수있는 사람이 있다고 확신합니다 (아무도 드물지 않습니다).

하지만 기본적으로 읽기뿐만 아니라 연습을 많이하고 연습을 많이하십시오. 스포츠와 마찬가지로 명확한 사고에는 시간과 노력이 필요합니다.

문제에 대한 생각을 돕기 위해 할 수있는 또 다른 일은 먼저 해결할 문제에 대한 테스트 스위트를 작성하는 것입니다. 먼저 완전히 이해하지 않으면 문제에 대한 좋은 테스트를 작성할 수 없습니다. 다른 언어로이 작업을 수행하면 다른 테스트 기술을 동시에 교육 할 수 있다는 이점이 있습니다.

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