문제해결방법론?

주민건·2020년 9월 20일
2

문제해결방법론

목록 보기
1/7
post-thumbnail

*주의*
재미를 위해 문제를 푸는 사람들은 이 글에서는 헬창과 동일합니다.
이하 알창이라고 정의하겠습니다. 문손실이 일어나기 전에 문제를 푸는 사람들을 지칭합니다.
알창분들께서는 "문제해결능력?"부터 읽어주시면 감사하겠습니다.

왜 당신은 문제를 푸시나요?

사람들이 문제를 푸는 동기는 몇 가지로 압축됩니다.
1. 재미
2. 코딩테스트
3. 이외의 동기가 있다면 댓글로 알려주시면 감사하겠습니다

대부분의 사람들은 IT 기업 취직을 하기위해 코딩테스트를 준비하게 됩니다.

준비하는 시기는 보통 대학교에 입학해서 졸업할때까지 입니다.
이직을 원하시는 분들이 잠깐 준비하기도 하죠.

코딩테스트란 이 글을 읽는 대부분이 아실거라 생각합니다.
코딩을 통한 테스트를 말하죠.

(?)

코딩테스트는 기존에 존재하는 자료구조, 알고리즘을 적절히 이용하거나, 새롭게 만들어서 주어진 문제를 제한 시간 내에 해결하는 시험입니다.

코딩테스트를 위해 문제를 풀고, 자료구조, 알고리즘 개념을 익히는 것은 마치 수능을 잘 치기 위해서 국어, 영어, 수학을 공부하는 것과 비슷하죠. 수능에서는 특정 능력을 평가하기 위해 각각의 과목을 통해 시험합니다.

그렇다면 코딩테스트는 어떤 능력을 평가하기 위해 만들어진걸까요?

왜 기업들은 코딩테스트를 할까요?

대학에서 학문을 닦을 수 있는지 판단하기 위한 시험인 수능은
언어력, 수리력, 사고력, 자료해석 능력, 상황판단 능력 등을 확인합니다.

코딩테스트를 알아보기 전, 입사 시험의 한 종류라는 생각에서 시작해봅시다.

입사 시험을 진행하는 이유는
입사 지원자가 과연 회사에 들어와서 주어진 업무를 수행할 수 있는지 판단하기 위함 입니다.

이를 통해 알 수 있는 점은
코딩테스트가 IT 기업에서 소프트웨어 엔지니어로 일할 능력이 있는지 확인하는 과정이라는 것입니다.

소프트웨어 엔지니어가 업무를 소화하기 위해 필요한 역량임과 동시에
코딩테스트를 통해 확인하고 싶은 능력은 무엇일까요?

바로 "문제해결능력" 입니다.

소프트웨어 엔지니어가 왜 문제해결능력이 필요할까요?

문제해결능력?

소프트웨어 엔지니어가 어떤 직업이기에 문제해결능력이 필요한걸까요?

소프트웨어 엔지니어를 알아보기 이전에 엔지니어를 먼저 알아봅시다.

엔지니어란 제한 상황을 고려하면서 주어진 목표와 요구사항을 만족하도록 하는 어떤 무언가를 만들고, 설계하고, 실험하는 직업을 의미합니다.

위 정의를 읽고나서 소프트웨어 엔지니어는 어떤 직업인지 감이 오시나요?

소프트웨어 엔지니어는 엔지니어의 정의에서 "어떤 무언가"를 "소프트웨어"로 바꾸면 어떤 직업인지 알 수 있습니다.

소프트웨어 엔지니어란 제한 상황을 고려하면서 주어진 목표와 요구사항을 만족하도록 하는 소프트웨어를 만들고, 설계하고, 실험하는 직업을 의미합니다.

그럼 문제해결능력은 무엇일까요?

문제해결능력의 정의는 다음과 같습니다.

주어진 제한 사항, 목표를 달성하기 위해 방법을 설계하고 실행에 옮겨서 해결하는 능력

이제 IT 기업에서 소프트웨어 엔지니어를 뽑기 위해 코딩 테스트를 보는 이유를 간략하게 알 것 같습니다.

그렇다면.. 코딩테스트를 통과할 수 있고, 능력있는 소프트웨어 엔지니어가 되기 위한 문제해결능력을 어떻게 연습하면 키울 수 있을까요?

어떻게 연습하지?

모르는 것을 아는 방법에는 구글링만한 것이 없습니다.

여러분의 시간은 소중하기때문에 요약하자면, 여전히 "문제를 많이 풀어보세요!", "깨지고 부서지면서 알아서 배우세요!" 로 수렴하는 이야기입니다.

"어떤 내용은 어떻게 연습해서 이렇게 저렇게 하면 실력이 늡니다!"라는 이야기는 잘 찾기 힘듭니다. 만약 위와 같은 글을 찾았다면 대부분의 광고 글 패턴입니다. (이 글은 광고글이 아닙니다.)

실제로 문제를 많이 푸는 것이 능력을 발전시키는 명확한 방법입니다.
하지만 저희에게 주어진 시간은 많지 않습니다.
다른 재밌는 것들이 많기 때문이죠.

답답한 마음이지만 따로 대안이 없는 상황이죠. 많은 문제를 풀어볼 수밖에 없습니다.

이러한 상황에 대해 제가 나름대로 생각해본 결과는 다음과 같습니다.
1. 스스로도 구체적으로 어떻게 노력해서 능력이 발전했는지 모릅니다. 그래서 말할 수 없는 상황입니다.
2. 효율적으로 공부하고자 생각해본 적이 없습니다. 공부법에 대해 생각하는 사람은 많지 않습니다.
3. 능력을 키우는 방법에 대해 알고 있지만, 설명하기 어려웠을 수 있습니다.

정말로 많은 문제를 풀어야만 능력을 키울 수 있을까요?

그러니 토의합시다.

사람의 인지능력은 근육과 유사합니다.
쓰면 쓸수록 발달하고, 효율적으로 발전시키는 방법이 존재합니다.

운동과 같이 목표에 따른 구체적 단계별 전략이 필요합니다.

예를 들어, 등근육을 발달시키고자 한다면 턱걸이를 하는 것이 효과적입니다.
만약 턱걸이를 1개도 못하겠다면 앉은 상태에서 턱걸이를 합니다.
이후 근력이 늘었을 때, 서서 턱걸이를 합니다.

악기나 체스와 같이 적절한 멘탈 모델 설계가 필요합니다.

오랜 기간 논의된 모델에 의해
악기를 잘 다루기 위해서 밟아야하는 효율적인 단계, 무조건 거쳐야하는 과정,
체스를 잘 두고 위해서 밟아야하는 효율적인 단계가 존재합니다.

문제해결능력, 컴퓨터과학은 앞서 말한 학문들에 비해 기간이 짧아서, 공부법에 대한 경쟁이 일어나지 않아서, 공부법에 대한 논의가 충분히 일어나지 않았습니다.

공부법과 멘탈 모델이 적절히 발달하지 못해서 생기는 높은 허들로 인해
ps 공부에 진입하기 어렵고, 진입해서 학습을 지속적으로 해나가는데에도 어려움이 있습니다.

근본적 사고 모델에 대한 고민 없이 문제 푸는 스킬만 얻어서는 한계가 있습니다.

저도 마찬가지로 문제를 푸는 사람이고, 능력을 키우고 싶은 사람입니다.
조금 더 능력을 효율적으로 발전시킬 수 있는 방법이 없는지 찾고 싶습니다.
제가 찾아낸 길을 공유하면서 해당 길을 좀 더 짧게 만들거나 발전시키고 싶습니다.

앞으로의 글에서 저의 생각 단계를 공유할 것이고,
여러분들이 자신의 멘탈 모델을 인지하고 개발하고 공유하여 다 같이 발전시키는 것에 목적이 있습니다.

짧게 요약하면 아래와 같습니다.

글의 목적

  • 문제해결능력을 위한 문제 풀기는 어떻게 하는가?
    (내가 크기를 키우고 싶은 근육이 있으면, 해당 근육을 키울 수 있는 운동을 한다.)
  • 효율적인 연습은 무엇인가?
    (운동 방법은 무엇인가?)

아ㅡㅡ 그래서 능력을 키울려면 어떻게 하면 될까요?

우선, 자신이 문제 풀 때 어떻게 생각이 흘러가는지 파악해야합니다.
생각의 흐름을 아는 것이 중요합니다.

흐름을 파악하면 어느 부분에서 비효율적인지 알 수 있게되고, 개선할 수 있는 기회가 생깁니다.

어떠한 문제 A가 있다고 했을 때, 당신이 문제를 해결하면서 드는 생각을 모두 적어보세요.
어떠한 형태로든 좋습니다. 추상적인 생각의 흐름을 글로 구체적으로 표현해보시길 바랍니다.

그 다음으로 생각의 절차 혹은 패턴을 분석해보세요.

자기 나름대로 생각을 모델링하는 것입니다.

요약하면 다음과 같습니다.

생각의 흐름 파악
1단계: 생각 펼쳐놓기
2단계: 생각 정리하기
3단계: 생각 분류하기

예를 들어, A라는 문제를 푸는 상황입니다.

1단계
A 문제를 켰다.
아 이 문제에서는 이런 걸 구하는 구나.
구하려면 어떻게 해야할까.
이런 조건들이 존재하네.
이렇게 하면 문제가 풀릴까?
아 배고프네, 치킨시켜먹어야지.

2단계
A 문제를 켰다.
아 이 문제에서는 이런 걸 구하는 구나.
구하려면 어떻게 해야할까.
이런 조건들이 존재하네.
이렇게 하면 문제가 풀릴까?
아 배고프네, 치킨시켜먹어야지.

3단계
A
이런 조건들이 존재하네.
아 이 문제에서는 이런 걸 구하는 구나.
B
구하려면 어떻게 해야할까.
이렇게 하면 문제가 풀릴까?
C
A 문제를 켰다.
아 배고프네, 치킨시켜먹어야지.

각 단계에 대한 기록은 별개로 존재해야됩니다.
예를 들어, 1단계에서 2단계 진행한다고 1단계에 덮어쓰면 안됩니다.
따로 기록하지 않으면 생각을 백트래킹하기 어려워집니다.

다음 시간에는 제가 가지고 있는 생각의 절차를 공유하겠습니다.

공유된 생각 절차와 자신의 생각 절차를 비교해보며, 더 나은 방법을 찾아보고 공유해주세요!

profile
Learning Engineer

0개의 댓글