티스토리 뷰

728x90
반응형

https://pocu.academy/

 

POCU 아카데미 COMP1000 강좌 소개 영상


1. 들어가며

  • 수강하게 된 계기
  • 선수 과목 COMP1500의 필요성

2. 아래의 항목들에 대한 답을 할 수 있는가?
3. COMP1000에서 배우고 느낀 것들 주절주절
4. COMP1000의 풀코스 학기 시스템

  • COMP1500과의 다른점
  • 실습 / 과제
  • 빌드봇과 조교
  • 중간시험 / 기말시험
  • 학습효율 300% 내는 방법

5. 나오며


1. 들어가며

수강하게 된 계기

기본적인 프로그래밍에 대한 전반적인 내용을 다루는 COMP1500 강의를 무사히 이수하고 나서 다른 강의들을 둘러보다가 '소프트웨어 공학용 수학'이라는 제목이 눈길을 끌었다.


[이전에 작성했던 COMP1500 후기는 아래 링크를 클릭하면 보러 갈 수 있음]

 

[POCU Academy] COMP1500(프로그래밍 입문) 리뷰

물리학과를 졸업하고 나서 막연하게 프로그래밍을 배우자고 생각을 했었다. 프로그래밍을 관심에 두게 된 이유는 당시 내가 생각한 '똑똑한 개발자'라면 분야 한정없이 각 분야의 문제점에 대

rhange.tistory.com


소프트웨어 공학용 수학 강의의 목차를 살펴보니 여러 개념들이 보였다. 그러나 내가 제대로 설명할 수 있는 것들이 거의 없었다. COMP1500을 수강하면서 POCU 아카데미에서 가르치는 것들은 전공책 한 권을 가르치는 것이 아니라 정말 필요한 것들만 가르친다는 것을 직접 경험해보았기 때문에 소프트웨어 공학용 수학 강의 풀코스를 등록하였다.

선수과목 COMP1500의 필요성

프로그래밍 기본에 대한 강의가 아니고 수학적 개념에 대한 강의여서 클래스, 매서드, while, for 등에 대한 설명은 없다.

 

본인이 프로그래밍을 배운 적이 없거나 기초가 많이 부족한 상태라면 COMP1500 강의를 우선적으로 듣고 해당 강의를 들어야 수학적 개념에 집중하면서 실습/과제로 주어지는 코드 구현 과제를 수월하게 진행할 수 있다. 학기 중 마주한 코드 실습/과제를 잘 해결하려면 아래의 기본 개념들을 잘 알고 있어야 한다.

 

  • Class, method, variable, instance, constructor
  • 접근제어자(public, private)와 static
  • if문, while문, for문
  • Array, 2D array, List, Dictionary
  • 정렬(sort)
  • 논리 연산자 ( &&, || )
  • 비트 연산자(bitwise operator): |, &, ^, ~, <<, >>
  • 열거형(Enum)
  • 재귀 함수 기본 (하노이탑 코드 구현 가능?)
  • 프로퍼티(property)

 


2. 아래 항목들에 대한 답을 할 수 있는가?

COMP1000 풀코스를 이수하면서 배우고 느꼈던 것들 중에서 유용하고 재밌는 내용들을 아래에 작성해보았다. 각 항목에 대한 답을 할 수 없고 스스로 생각하기에 본인이 답하지 못한 문항들이 중요하다고 느껴졌다면 COMP1000 풀코스를 신청하는 것은 좋은 선택이 될 것이다. (동영상 강의와 풀코스는 하늘과 땅 차이다.)

 

중간고사까지

  • 숫자 체계에 대해 잘 알고 있는가? (10진법, 2진법, 8진법, 16진법)
  • 각 진법들을 능숙하게 변환할 수 있는가? (예: 10진법 -> 2진법, 2진법 -> 16진법)
  • 컴퓨터의 정수를 저장하는 방식을 설명할 수 있는가?
  • 보수(Complement)가 무엇인지 아는가?
  • 2진수 사칙연산은 어떻게 이뤄지는가?
  • 언더 플로와 오버플로에 대해서 설명할 수 있는가? 이로부터 나타날 문제들을 방지하려면 어떻게 해야 할까?
  • ASCII, 멀티 바이트, 유니코드, UTF-8에 대해서 설명할 수 있는가?
  • UTF-8, UTF-16, UTF-32의 차이점이 무엇인가? 왜 UTF-8을 많이 쓸까?
  • 컴퓨터가 실수를 저장하는 방식을 설명할 수 있는가?
  • 프로그래밍에서 '논리(Logic)'의 용도
  • 명제란 무엇인가?
  • 드 모르간 법칙이란 무엇인가? 프로그래밍에서 이 법칙이 어떻게 사용될 수 있을까?
  • 불 대수(Boolean algebra) / 조건식 / 집합론의 연관성에 대해서 설명할 수 있는가?
  • 비트 연산(bitwise)과 논리 연산 중 무엇이 우선시되는가?
  • 논리 게이트에 대해 설명할 수 있는가? (NOT, AND, XOR, OR, NAND, NOR, XNOR)
  • NAND, NOR 게이트로 다른 모든 게이트를 만들 수 있는가?
  • 과학적 사고방법이 프로그래밍에 중요한 이유를 설명할 수 있는가?

 

기말고사까지

  • 어떤 수 A가 있을 때, A가 '2의 승수(2^N)'인지 아닌지 판별하는 식을 (간략히) 구현할 수 있는가?
  • 수학적 귀납법에 대해서 설명할 수 있는가? 프로그래밍에서 수학적 귀납법이 왜 중요한지 설명할 수 있는가?
  • 재귀 함수가 연산의 성능 향상을 가능하게 해 줄 수 있는가?
  • 분할 정복 알고리듬에 대해 설명할 수 있는가?
  • 벡터(Vector)가 프로그래밍에서 필요한 이유를 설명할 수 있는가?
  • 벡터와 튜플(tuple)의 차이점을 설명할 수 있는가?
  • 튜플과 행렬(matrix)의 차이점을 설명할 수 있는가?
  • 벡터, 행렬 간의 연산을 코드로 구현할 수 있는가? (덧셈, 뺄셈, 내적)
  • 벡터를 축소/확대/회전시키는 방법을 설명할 수 있는가?
  • 순열(permutation), 조합(combination)에 대해 설명할 수 있는가?
  • 실험(또는 시행)[E, Experiment], 표본 공간[S, Sample Space] 그리고 확률[P, Probability] 이 3가지 키워드를 가지고 확률을 정의할 수 있는가?
  • 조건부 확률이란 무엇인가?
  • 결정적 알고리듬과 확률적 알고리듬의 차이점이 무엇인가?
  • 몬테 카를로 알고리듬에 대해 아는가? 간단히 설명할 수 있는가? 예시 하나 들 수 있을까?
  • 베르누이 시행을 설명할 수 있는가?
  • 이항 분포를 설명할 수 있는가?
  • 정규분포와 표준 정규분포의 차이점을 설명할 수 있는가?
  • 평균, 분산, 표준 편차가 무엇인지 설명할 수 있는가?
  • 신뢰도와 신뢰구간이 무엇인지 설명할 수 있는가?
  • z-score가 무엇인지 설명할 수 있는가?
  • 내 수학 점수가 85점이고 우리 반 평균점수가 80점이고 표준편차가 4.2일 때, 내가 상위 몇 % 인지 계산할 수 있는가?
  • 도수분포표와 히스토그램이 각각 무엇인지 설명할 수 있는가?
  • 데이터 비닝(Data binning)에 대해 설명할 수 있는가?
  • 해시 함수란 무엇인가?
  • 해시 함수의 특징을 설명하고 예시를 들 수 있는가?
  • 빅오 표기법에 대해 설명할 수 있는가?
  • 코드를 보고서 해당 코드의 시간 복잡도를 (바로) 계산할 수 있는가?

 


3. COMP1000에서 배우고 느낀 것들 주절주절

위에 작성한 문항들은 풀코스를 진행하면서 매주 배웠던 것들을 복기하면서 작성한 것들이다. 풀코스를 진행하게 되면 15주 스터디가 진행된다. POCU 아카데미의 장점 중의 하나인 과목별 배우는 내용이 스케쥴이 잘 짜여져 있어 강의 내용이 많을지라도 15주간 매주 주어지는 '동영상 학습 범위', '실습' 그리고 '과제' 덕분에 몸소 체득할 수 있는 환경이 만들어져 있다는 것이다.


위에서 작성한 문항들은 말 그대로 배웠던 내용들에 대한 질문 항목을 만들어 본 것이고 강의를 진행하면서 배웠던 것들에 대해서 내 스스로 해당 개념들과 방법 들을 배우면서 프로그래밍에 어떻게 유용하게 적용할 수 있는지를 주절주절 서술해보고자 한다.

 


 

시작은 수학과학적 사고방법이 프로그래머에게 중요한 이유를 설명하며 진행된다. 컴퓨터의 작동 원리를 알기 위해서도 필요하며 컴퓨터를 더 효율적으로 활용하기 위해서도 필요한 개념과 방법임을 강의가 진행됨에 따라 느끼게 된다.


2진법에 대한 개념을 배워 컴퓨터의 데이터 저장 모습을 이해하게 되고 정수와 실수가 어떻게 저장되고 연산되는지를 이해할 수 있었다.

 

16진법은 프로그래머가 사용하기에 매우 좋은 진법이다(2진법은 너무 길다 ㅠㅠ). 과제1에서 진법에 대해서 확실히 몸으로 체험하게 되는데 (코드 과제이기 때문) 이때 'COMP1500의 과제1 처럼 쉽겠지?'라는 방심으로 인해 벼락치기하다가 몸도 힘들고 원하는 점수도 못 받았다. 이때부터 COMP1000은 1500과 결이 다르다는 것을 인지하고 실습/과제가 공개되자마자 일단 1 회독해서 내가 부족한 게 없는지 파악을 했다. 일정을 잡고 빨리 시작하고 하루하루 조금씩 해결 방안을 생각하면서 학습을 진행하게 되었다. 진법 파트를 들으면서 'base64'에 대해서도 자세히 알게 되었다. (예전 코딩 교육을 받을 때 만들었던 프로젝트에서 이미지 전송을 할 때 'base64'로 변환해서 이미지 파일을 전송했는데 그 당시 구글링을 통해서 그렇게 한다고만 알고 그냥 사용했었다.)


비트와 바이트 파트에서는 오디오 파일에서 음질의 차이가 나는 부분에 대해서 알게 되었으며 부호 있는(없는) 정수에서 발생하는 오버플로와 언더플로에 대한 내용을 보면서 프로그래밍에서 수를 막 다루면 안 되겠다고 느꼈다. 컴퓨터에서 정수의 덧셈과 뺄셈이 2의 보수(Complement)로 계산되고 있는 것을 알았을 때 매우 재밌었고 기본 중의 기본을 이해하고 알게 되어서 매우 기뻤다. ASCII 한계와 그로부터 진행된 문자에 대한 인코딩 역사(ANSI, 멀티 바이트[EUC-KR 등], 유니코드) 내용을 들으면서 인간의 고민과 고민을 통해서 현재의 문자열 체계가 잡힌 것을 느낄 수 있었다. 무의식적으로 많은 사람들이 사용하는 'UTF-8'은 과거 수많은 사람들의 고민의 결정체임을 알게 되었다. 비전공자인 나로서는 처음 듣는 엔디언(Endianness)이라는 단어와 리틀 엔디언/빅 엔디언의 개념을 배우면서 UTF-8이 왜 유용한 친구인지에 대해서도 명확히 알 수 있었다.

 


 

컴퓨터의 실수 파트에서는 10진수 실수를 2진수로 변환하는 법을 배웠으며 고정 소수점 수의 한계와 부동 소수점 수의 저장 방식에 대해서 알게 되었다. 10진수 실수를 변수에 할당할 때, 할당한 변수를 다시 사용할 때 정밀도 6을 고려해야 되는 것을 알게 되었으며 서로 다른 두 실수를 비교할 때는 정밀도 9를 기억하면 된다 (IEEE 754). 2진수로 저장하는 컴퓨터의 저장 방식 때문에 그대로 표현할 수 없는 실수(예: 0.1)가 있으며 왜 그런지에 대해서 설명할 수 있게 되었다. 32비트 부동 소수점(IEEE 754)의 원리에 대해서 배우고 10진수 실수 <-> 2진수 실수 <-> 32비트 부동소수점의 계산을 도가 트도록 하게 되었으며 정확도(accuracy)와 정밀도(precision)의 차이를 설명할 수 있게 되었다.

 


 

다시는 못 볼 줄 알았던 집합(Set)을 다시 마주하였으며 프로그래밍에서의 집합의 활용에 대해 배우게 된다. 집합의 특징과 연산에 대해서 복습하면서 '드 모르간의 법칙'의 중요성을 깨닫게 된다. 명제와 논리를 배우고 익힘으로써 참과 거짓에 대한 명확한 정의를 내릴 수 있게 되었으며 조건문 코드를 효율적으로 작성하는 법을 배웠다.

 

집합 -> 명제 -> 불 대수(boolean algebra) -> 논리 회로의 순으로 학습해나가면서 각각의 개념들이 모두 같은 선상에 있음을 느낄 수 있었다. 각 개념에서 중요한 개념은 '드 모르간 법칙'이었다. 논리 게이트를 배우면서 '게이트는 돈이다'라는 문장의 뜻을 이해하게 된다.

 

조건명제와 증명 부분을 들으면서 프로그래머에게 가장 중요한 능력 중의 하나가 논리력임을 체감했다. 참/거짓을 구분할 줄 알고 핵심을 간파할 줄 알아야 효율적이고 모든 사람이 힘들지 않고 이해할 수 있는 코드를 작성할 수 있겠다고 생각했다.

 

과학적 사고방법에 대한 포프님의 생각을 들으면서 '코드 구현/디버깅/수정' 할 때 문제를 인식하고 핵심을 파악하고 그것을 바탕으로 계획을 작성하는 자세를 배울 수 있었다.

 


 

학기 후반에서는 2진수를 활용한 꼼수들을 배웠으며 비트 플래그비트 마스킹을 활용한 데이터 패킹을 통해 데이터 저장 공간을 줄이는 방법과 효율적으로 해당 데이터들을 정렬할 수 있는 방법을 알게 되었다.

 

학창 시절 쓱 지나쳤던 수학적 귀납법을 다시 마주하면서 이 친구의 실용성을 몸소 느낄 수 있었다. (N번 처리할 연산을 1번으로 만드는 것에 대한 보증인 같은 친구였다.) 그리고 COMP1500 수업에서 만났던 재귀함수를 다시 만나 재귀 함수의 두 번째 역할(분할 정복)을 알게 됨으로써 재귀 함수의 중요성을 더욱 실감할 수 있었다. 이진 탐색병렬 알고리듬에 대한 내용을 이 부분에서 접할 수 있다.

 

회사에서 갑작스럽게 맡게 된 빅데이터 유지보수 프로젝트를 맡게 되었는데 6년 전에 만들어 놓은 파이썬 프로그램에는 멀티 스레딩을 사용하고 있고 다수의 서버를 사용해서 Hadoop에 데이터를 저장하고 Spark을 사용하여 실시간 분산 처리를 하고 있다. (프로젝트 시작할 당시 하나도 모르는 것들이라 급하게 겉핥기 식으로 공부함) 멀티 스레딩과 분산 시스템에 대한 내용도 챕터 마지막 부분에 배울 수 있으며 빅데이터 시스템이라는 것에 대한 공포(?)를 해소 할 수 있었다. 빅데이터는 데이터가 너무 많아서 여러 대의 서버를 사용할 뿐이다. 기본을 알면 쉽게 해낼 수 있을 거라고 스스로 생각했다.

 


 

벡터에서는 벡터를 제대로 알고 있는 자와 그렇지 않은 자가 코드를 작성할 때 마주치는 상황들에 대한 내용을 보면서 프로그래밍에서 많은 영역에서 활용되고 있는 벡터에 대해서 다시 생각하게 되었다. 모르는 사람은 안 쓰고 아는 사람은 쓰는 녀석이며 알고 쓰는 사람의 코드는 효율적이게 될 것이다. 머신러닝을 다루면서 feature라는 단어를 많이 들으면서 column을 왜 feature라고 부르지(?)라고 생각했던 적이 있었다. 강의로부터 그 이유를 알게 되었으며 머신러닝에서 feature 벡터에 어떤 식으로 가중치를 매겨서 결과를 도출하는지를 알게 되었다.

 

행렬의 개념을 복습하고 벡터와 행렬이 프로그래밍에서 연산처리에 유용한 이유를 배우고 벡터와 튜플의 차이점벡터, 튜플이 행렬과 다른 점에 대해서도 배운다.

 


 

경우의 수에서는 여전히 헷갈리던 순열과 조합에 대한 개념을 다시 바로 잡았으며 특히 중복 조합에 대한 포프님의 풀이 접근 방식은 매우 간단하고 아름다웠다.

 

학창 시절 흥미를 못 느껴 열심히 공부하지 않았던 확률에서는 베르누이 시행이항 분포의 개념을 제대로 확립함으로써 현실 세계에서 문제를 해결할 수 있는 도구를 습득하게 되었다.

 

확률론적 알고리듬 중의 하나인 몬테 카를로 알고리듬을 배우면서 예전에 반도체 공부를 하면서 봤던 6-시그마에 대한 개념과 그것을 달성하기 위해서 전수조사를 하는 게 아닌 몬테 카를로 알고리듬을 통해서 실현할 수 있음을 깨달았다. 소수를 판별하는 기막힌 방법이기도 했었다.

 

통계에 들어가서는 정규분포의 탄생의 역사를 들으면서 원래의 역할이 분포를 보기 위함이 아닌 오차를 추정하기 위한 것이었음을 알게 되었다. 정규분포와 표준 정규분포의 차이에 대해 설명할 수 있게 되었으며 이제는 평균과 표준편차가 주어지면 나의 데이터(예: 키, 몸무게, IQ 등)가 상위 몇 %에 해당하는지 바로 계산할 수 있게 되었다. 나중에 사람들의 관심사를 조사할 경우가 생긴다면 적당한 수의 사람들을 조사해서 신뢰도를 설정하고 신뢰 구간을 계산하여 활용할 수 있다.

 


 

정형 데이터인 숫자 데이터를 가지고 구간을 설정하여 분류하는 데이터 비닝(data binning)의 하나인 도수 분포표와 이를 시각화한 히스토그램(histogram)의 개념을 제대로 배웠다.

 

비정형 데이터인 문자열은 어떻게 비닝 하는지에 대한 답으로 해시 함수가 나타났음을 알게 되었다. 해시 함수의 성질과 종류와 해시 함수를 선택할 때 고려해야 할 기준(속도, 분포)에 대해 알게 되었다.

 

근사(approximation)의 개념을 익히고 데이터의 패턴에 따라 최적선(best-fit line)과 곡선 맞춤(curve fitting) 중에 어떤 것을 사용하는 것이 좋은 선택인지 알 수 있게 되었다. 이산 분포되어 있는 데이터 모두를 가지고 if문을 적용하다간 너무 답이 없는 상황이 벌어지기에 근사식으로부터 입력한 데이터의 값을 도출해내는 것이 합리적이다.

 


 

마지막으로 많이들 들어본 빅오표기법에 대한 내용을 배운다. 빅오 표기법의 표현 방식과 종류 그리고 크기 비교를 배웠으며 가장 중요한 소스 코드를 보고 시간복잡도가 얼마나 되는지 쉽게 파악하는 방법을 배웠다. 그리고 시간 복잡도를 개선하는 방법에 대해서도 알게 된다. 지수와 로그에 대해서 어려워하는 분들을 위한 지수/로그에 대한 짤막한 설명을 마지막으로 수업이 끝난다.

 


4. COMP1000 풀코스 학기 시스템

COMP1500과의 차이점

  • 실습/과제가 소스코드 작성인 COMP1500와 달리 COMP1000 실습에는 퀴즈가 있음 (배운 개념을 능숙하게 사용할 수 있는지 계산 문제의 퀴즈)
  • 실습/과제 중 게이트 구현 문제가 있음. 소스 코드로 구현하는 것이 아닌 POCU 아카데미에서 자체 제작한 GUI 프로그램을 사용해서 논리 회로 구현하는 문제가 있음
  • COMP1500의 과제1 체감난이도(맛있음)와 COMP1000 과제1 체감 난이도(꽤 매움) 온도차가 매우 큼
  • 수학 강의이므로 COMP1500처럼 프로그래밍에 대한 개념을 중심으로 가르치지 않음. 그러므로 프로그래밍 기본이 부족하면 코드 과제에서 막힐 수 있으므로 본인의 실력을 파악 후에 선수 과목을 들을지 말지를 결정한 다음 본 강의를 듣는 것을 추천
  • COMP1000에서는 중간고사 / 기말고사칠 때 수학 계산을 위해서 A4 용지 2장 + 펜을 사용하는 것이 가능

실습 / 과제

  • 매주 주어지는 실습(lab)과 3주 간격으로 주어지는 과제(assignment)를 해결해야 하기 때문에 동영상 강의로만 듣고 끝내는 상황보다 개념 이해가 더 잘되며 배운 것들이 몸으로 익혀짐
  • 매주 주는 실습은 그 주에 들어야 하는 강의 내용으로 충분히 풀 수 있음.

빌드봇과 조교

  • POCU 아카데미의 마스코트 빌드봇(build bot)이 COMP1000에서도 대기 중
  • 빌드봇은 퀴즈를 제외한 실습/과제의 점수를 채점해주며 어떤 테스트가 통과했고 어떤 테스트가 통과하지 못했는지 알려준다.
  • 무한루프가 발생하는 코드를 제출한 경우에는 테스트 통과 여부를 확인할 수 없이 '크래시 에러' 문구만 보이므로 무한루프 발생 여부는 본인의 컴퓨터에서 디버깅으로 미리 잡자
  • 학기를 진행하는 동안 이슈 사항이나 빌드봇 문제에 대해서는 조교에게 문의할 수 있다.
  • POCU에서 추천하는 방향은 스스로 문제 해결을 할 수 있는 프로그래머를 양성하는 것이기에 개인적으로 아래와 같은 흐름으로 문제 해결을 하는 습관을 들이는 것을 추천한다.
    1. 실습/과제 중에서 막히는 부분을 마주한다.
    2. 동영상 강의에서 해당 부분에 대한 내용이 있었는지 복기해본다. (실습/과제 내용이 꼭 동영상 강의에서 배운 것에서 나오진 않음. 스스로 구글 검색을 통해서 찾아야 하는 내용도 있을 수 있음)
    3. 강의에서 나오지 않은 부분은 구글 검색을 통해서 알아본다. (영어로 검색하면 더 잘 나옴, 영어에 익숙하지 않다면 구글 번역기를 사용해서라도 영어로 검색을 해보자)
    4. 검색을 통해서 알아낸 정보를 가지고서도 해결 방법이 떠오르지 않다면 본인이 찾은 내용을 바탕으로 생각하는 바를 Slack(풀코스 등록하면 일정을 안내받고 수강생분들과 이야기할 수 있는 협업 도구)에 올려서 다른 수강생분들의 의견을 들을 수 있음. (조교가 답변을 해주기도 함)
    5. 제출한 코드에 대한 채점 결과를 받았는데 통과하지 못한 경우
      1) POCU 실습/과제 페이지에서 제공하는 '테스트 케이스'를 일단 통과했는지 확인
      2) 풀코스 수강생에게 제공하는 '위키'에 들어가서 해당 실습/과제에 대한 이전 수강생들이 작성한 테스트 케이스를 실행해봐서 모두 통과하는지 확인
    6. 본인이 제출한 코드에 대한 빌드봇의 결과에 대해서 도저히 갈피를 잡을 수 없을 때는 조교에게 해당 빌드 번호를 알려준 다음 힌트를 요청할 수 있음. (해당 학기 조교에 따라서 힌트 주는 정도는 다를 수 있음) 

중간시험 / 기말시험

  • 7주 차, 15주 차에 중간고사, 기말고사 시험을 침
  • POCU에서 제공하는 크롬 확장 프로그램 설치 후 웹캠을 켠 상태로 진행함
  • 시험이 매우 엄격하므로 지켜야 할 사항을 반드시 지켜서 0점을 받는 상황을 마주하지 않도록 하자. ( 브라우저 시험 보는 창을 제외하고는 창/탭 모두 꺼야 함, 도중에 화장실 가는 것 등 )
  • 주중에 학교나 일을 하는 사람의 경우 주말에 시험을 치르는 것을 추천하며 벼락치기는 비추. 개인적으로 오전에는 정리한 내용들을 복기한 다음 두뇌가 가장 활성화되는 오후 1~2시쯤 시험을 치르는 것을 추천 (아침에 일찍(7시쯤?) 일어났다는 전제하에)
  • 하루 종일 공부하다가 저녁이나 밤에 시험 치르는 것은 비추함. 두뇌가 이미 탈진 상태일 것이므로

학습효율 300% 내는 방법

  • 동영상 강의는 3주 치를 앞당겨서 미리 공부해놓는다. (과제들의 경우 3주의 기간을 주는 만큼 문제의 내용이 3주치 강의 내용을 포함하기 때문에 미리 3주치 강의를 들어놓으면 과제들을 바로 시작할 수 있음)
  • 퀴즈 유형의 실습의 경우 여러 번 시도할 수 있음. 해당 실습의 목적은 주어진 수학 문제를 '빠른 시간'에 '정확하게' 풀 수 있는 상태가 되는 것임. 그러므로 자동적으로 풀 수 있도록 여러 번 시도하는 것을 추천 [저는 주어진 풀이 시간의 반 정도(10분 주어지면 5분 내로) 이내로 백점만점 연속 3회 맞는 것을 목표로 했었음]
  • 수업/실습/과제에서 이해가 안 되는 부분은 스스로 먼저 찾아보는 습관을 들인다. (네이버로 검색하지 말고 구글로 검색하자. 네이버는 맛집 찾거나 쇼핑할 때 사용하자)
  • 스스로 찾아보았는데도 이해가 되지 않는 부분은 Slack에서 같이 학기 진행 중인 수강생분들에게 물어보자.
  • 매주 강의/실습/과제에 대한 질문을 구글 Docs를 통해 받고 있으므로 이해하지 못한 부분을 '잘~'(대답할 수 있게) 정리해서 질문을 올릴 수 있다. (해당 주차 끝나면 접수받은 질문들에 대해서 포프 선생님이 답변을 해주신다.)
  • 매주 배우는 것들을 미리미리 정리해놓는다. 정리한 것들을 기반으로 본인이 확실하게 모르는 부분은 다시 공부한다. (이런 습관을 들여놓으면 중간/기말고사 치르는 게 한결 수월해진다.)
  • 빌드봇에게 코드 제출하기 전에
    1) POCU 실습/과제 페이지에서 제공하는 테스트 케이스를 먼저 통과하자.
    2) 위키에 올라와 있는 이전 수강생분들이 올린 테스트 케이스가 있다면 이것도 통과하는지 확인하자.
    3) 그다음 빌드봇에게 코드 제출하자. (단 한 번의 제출로 100점을 맞으면 one shot one kill 배지를 받을 수 있다.)

 

 

가이드: 풀코스 수강을 통해 획득할 수 있는 업적 소개 | POCU 블로그

프로그래밍 실력 Level-Up! | 사장님께 인정받는 개발자 되기 | 프로그래밍계의 소림사 네카라쿠배 개발자도 강추하는 프로그래머 Level-Up 강의! POCU 아카데미가 올해 연봉협상을 책임지겠습니다!

blog.pocu.academy

  • 각 주차의 실습/과제가 끝나면 소스 코드를 공유해서 다른 사람으로부터 배울 점은 흡수하고 본인의 소스 코드에서 고칠 점은 고쳐나가자.

 

5. 나오며

COMP1500이 "프로그래밍을 할 수 있는가?"의 느낌이었다면 COMP1000은 "프로그래밍을 잘할 수 있는가?"의 느낌이었다.


컴퓨터가 숫자를 어떻게 저장하는지 몰라도 변수 할당과 연산을 할 수 있다. 하지만 양수가 갑자기 음수가 되거나 숫자가 갑자기 작아지는 문제가 발생했을 때 그 원인을 파악하지 못해 문제를 해결하지 못하는 개발자가 있다. 실수 계산에서 입력한 값이 아닌 소수점이 즐비하게 늘어진 수가 나왔을 때, "이게 뭐시던가?"하고 넘겨버릴 수도 있다.


한 줄의 논리식으로 나타낼 수 있는 것을 즐비하게 늘여서 코드를 작성할 수도 있으며 본인은 그것을 자랑스럽게 생각할 수도 있다. 드 모르간 형님을 알아놓으면 내가 하는 행동이 모두(자신 포함)에게 좋은 행동인지 아닌지 검토할 수 있다.


과학적 사고방법을 자신의 기본 사고방식으로 탑재해 놓으면 문제를 해결하는 데 시간을 줄일 수 있다. 문제가 생기더라도 올바른 길을 바라보고 믿고 나아갈 수 있다.

 

2진수를 다룰 수 있고 2진수 특성을 알고 있으면 프로그램 성능 향상에 도움이 된다. 수학적 귀납법을 알고 있으면 O(n) 상황을 O(1)로 만들 수 있다. 재귀를 알면 O(n)을 O(log n)으로 만들 수 있다.


벡터와 행렬을 제대로 알고 다룰 수 있으면 머신러닝을 이해하는 데 도움이 된다. (모르고 그냥 쓰는 상황을 피할 수 있다는 말이다) 튜플을 제대로 다룰 줄 알면 다룰 수 있는 자료 구조의 영역이 넓어진다.


경우의 수를 제대로 셀 줄 알면(순열, 조합을 제대로 다룰 줄 알면) 세상을 보는 시야가 넓어짐과 동시에 세상의 문제를 풀 수 있는 도구가 늘어난다. 이 도구를 제대로 쓸 줄 알면 확률이라는 도구도 따라온다.

15주간의 짧지 않은 기간이었지만 프로그래머로써의 기본을 갖추고 싶은 나의 욕망을 채워주는 코스였다.


POCU 풀코스 학기 시스템은 수강생에게 프로그래머로써 물고기 잡는 법을 가르쳐주는 것이 목표라고 한다. 뭔가를 먹여주는 것에 익숙한 사람들은 환경에 익숙하지 않을 수도 있다.

 

학기마다 다르겠지만 Slack의 채팅방이 조용한 경우가 많다. COMP1500 때보다 COMP1000은 더 조용했다. 독서실 같은 느낌이 들기도 했고 학문하는 코스 느낌도 들었고 이번엔 똑똑한 사람들만 모였나 하는 생각도 들었다. (하지만 과제나 시험 성적 발표된 걸 보면 꼭 그렇지도 않았다.)

 

그렇기 때문에 본인이 학기를 진행하면서 스스로 만족하고 궁금한 점이 없다면 그대로 쭉 성실히만 진행해도 많은 부분에서 배우고 익혀갈 수 있지만 스스로 모르는 부분이나 알고 싶은 부분에 대해서는 용기를 가지고 먼저 채팅방에 질문을 해야 한다. 질문하지 않으면 본인에게 필요한 것을 얻을 수 없다. 그리고 그보다 더 중요한 것은 본인이 필요로 하는 것을 '스스로 찾아보는 행동'을 했었느냐이다.

 

다른 사람의 질문에 답을 해주는 것도 좋다. 질문에 대답을 해 줄 여유가 없어서 못해주는거라면 이해가 되지만 자신도 모르는 부분에 대한 질문을 보았을 때, 찾아보고 대답해준다면 생각보다 그 내용이 머릿속에 오래 남는다.


평소 내가 가지고 있는 독서의 특징 중의 하나는 '어떤 한 권'의 책을 50명의 사람이 읽었다면 책에서 말하는 기본적인 내용(주제)를 제외한다면 각자가 내놓는 책에 대한 생각은 모두 다르다는 것이다. POCU 아카데미의 풀코스도 이와 약간 닮은점이 있다면 동영상 강의에서 알려주는 내용은 기본값이라고 한다면 들었던 내용 중에서 강사님이 더 알아보면 좋은 주제에 대해서는 직접 알려주지 않고 찾아보라고 하시거나 강의 중에서 답을 알려주지 않고 문제만 던져주시는 경우가 있다.

 

해당 문제 고민해보고 가능하면 Slack에서 사람들과 논의해보라고 하신다. 그 뿐만 아니라 실습/과제를 하면서 잘 이해가 안되거나 더 궁금한 부분에 대해서 스스로 찾아보거나 Slack에 질문을 공유해서 다른 사람들과 나누고자 행동하는 분들이 있다. 매 학기마다 수강하는 사람들은 달라질 것이기에 학기마다 배우는 정도가 다른 것도 POCU 아카데미 시스템의 매력 중의 하나인 것 같다.


POCU 아카데미에서 배우는 지식들이 물리학에서 말하는 '제 1원리'와 결이 같다고 생각하며 글을 마무리한다.

 

도대체 무슨 생각인지 모르겠다. 사람들은 암기 따위로 뭔가를 알 수 있다 믿는 것 같은데, 이런 이해 과정 없이 만들어진 지식은 취약하기 짝이 없다! 

- 리처드 파인만

 

소프트웨어 공학용 수학 - POCU

정규 학기 ₩800,000 (학기) + ₩220,000 (동영상 강좌) 총 가격: ₩1,020,000

pocu.academy

 

202205 학기 COMP1000 성적표

728x90
반응형