overist
hack insight
overist
전체 방문자
오늘
어제
  • 전체보기 (32)
    • Tech (2)
      • 알고리즘 (5)
      • ETC (4)
      • 블로그 생성 일지 (4)
    • Insight (14)
      • 인생 로그 (1)
      • 인생 쉽게 사는 법 (7)
      • 지나가는 생각 (4)
      • 미분류 (1)
    • 취미 (1)
      • 클라이밍 (1)

블로그 메뉴

  • 홈

공지사항

  • 블로그 이전 완료

인기 글

태그

  • 컴퓨터 공부
  • network
  • 컴퓨터 공학 공부
  • 공부법
  • 허무주의
  • 정보보안 공부
  • 트러블슈팅
  • cloudflare
  • 초인
  • 니체
  • SSL
  • 실존주의

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
overist

hack insight

정보보호학과 학부생의 컴퓨터공학 공부 방법론
Tech/ETC

정보보호학과 학부생의 컴퓨터공학 공부 방법론

2022. 12. 19. 10:56

< 2020년 3월 정보보안 학술 동아리 후배들을 대상으로 작성한 글 >

 

서론

저는 재능충과 탈주자가 많다는 컴퓨터 공학 공부를 중학교 때 한번 실패해 본 사람으로서 대학때 컴퓨터 공학을 공부하며 공부 방법론에 호기심을 가져왔습니다.

2년 동안 동아리로부터 얻은 정보와 다른 컴퓨터 공학과 학생들의 말을 참고하여 정리하던 중 정보보안과 컴퓨터 공학을 공부하는 동아리 회원분들께 도움이 되고파 컨텐츠로 만들어 보았습니다!

이 문서는 학부에서 컴퓨터공학을 처음 접하는 학생이 1~2학년 과정에서 알면 좋을만한 정보들을 다루고 있습니다.

 

컴퓨터 공학이란

대학에서 배우는 컴공 지식은 대개 프로그래밍, 컴퓨터 사이언스 과목으로 이루어져 있습니다.

 

프로그래밍이란?

프로그래밍은 흔히 코딩이라고도 부르며, 컴퓨터에게 일을 시키기 위해 컴퓨터와 소통하는 언어 + 컴퓨터에게 전달하는 방법을 배웁니다.

컴퓨터에게 일을 많이 시키게 되면 게임, SNS, 웹사이트 등과 같은 어떤 서비스를 운영하는 것도 가능해집니다.

기계와 소통해야 한다고 해서 두려워 할 것 없습니다!

아무리 복잡도가 높은 기획도 하나 하나 구체화하면, 다음 예시처럼 작은 논리들의 연속으로 구현이 되니까요.

 

로그인 기능을 만들어야 하는데, 노트에 추상적으로 기획해본다.

  • 👨 유저로부터 ID와 PW를 전달받는다.
  • 🖥️ 계정이 “WJ”, PW가 “1234”면 Admin이다.
  • 🖥️ ID와 PW를 맞추면 Admin 권한을 주고, 그렇지 않으면 입력이 잘못되었다고 경고한다.

기획한 것을 코드로 변환해본다.

$id = $_POST['id'];
if ($id == 'WJ' && $pw == '1234') $_SESSION['admin'] = true;
else print("ID 또는 PW가 틀렸습니다.")

 

 

  • 1. 사용자의 입력값을 가져와서 변수에 저장해라.
  • 2. 변수에 저장했던 값이 내가 원하는 값(ID:WJ, PW:1234)과 일치하는지 판별해라.
  • 3. ID와 PW를 맞추면 Admin 권한을 주고, 못 맞췄으면 "ID 또는 PW가 틀렸습니다" 라는 경고창을 띄워라.

 

우리가 외국어를 배울 때 문법 뿐만 아니라 역사, 문화, 뉘앙스를 배워야 하듯이 컴퓨터에게 알아듣는 언어를 배워 일을 시키기 위해서는 문법 뿐만 아니라 자료 구조, 알고리즘 등과 같은 지식 또한 배우게 됩니다.

 

컴퓨터 사이언스

컴퓨터 사이언스는 코드가 컴퓨터에서 어떤 원리로 동작하는지를 관찰하고 탐구하는 것입니다.

프로그래밍을 언어로 비유한다면 컴퓨터 사이언스는 과학 또는 법으로 볼 수 있습니다.

이름이 사이언스인데 왜 법이라 하냐?

우리가 학창시절 배웠던 과학은 사람의 오감이 관찰가능하고 재경험되는 자연 법칙을 정의한 것입니다. 겨울에 추워져서 애써 심은 농작물들이 얼어 죽는 문제를 해결하기 위해 추워지는 원리를 궁금해했고, 지구를 다루는 자연 법칙을 정의하고 배웠습니다.

세상은 사람이 만들지 않았지만, 컴퓨터는 사람이 만들었습니다.

원리들이 일관되기보단 배우려는 분야 마다 성질이 너무 달라, 그냥 이 분야에 대해 잘 하는 사람 개개인들이 만든 법칙이라고 받아들는게 저는 이해하기 더 수월했습니다.

CS(Computer Science) 기초과목 - 컴퓨터 구조

😱 아니 이걸 어케했노?

를 배웁니다. 컴퓨터에서 일어나는 문제를 해결하려면 사람이 만든 법칙을 배워야 합니다.

최초의 컴퓨터도 앨런 튜링이라는 사람이 논문에서 방탈출 퍼즐 규칙 같은걸로 글과 그림으로 만들었지, 물리적으로 만든 건 아니었습니다.

앨런 튜링의 튜링 머신

공부하시다 다음과 같은 의문들을 해결해나가며, 논리적이고 과학적인 규칙이 전부구나 배우시게 될 것입니다.

  • 왜 CPU/RAM/하드디스크 같은 3대장 구조(폰 노이만 구조)로 나눠서 써야하지? SSD 요즘 빠른데 가격대비 용량 성능 안나오는 램 빼고 쓰면 안되나?
  • 나는 10진법을 좋아하는데 컴퓨터는 왜 2진법을 쓰는데다 소수를 이렇게 이상하게 표현하지?
  • 메모리는 물리적 할당과 논리적 할당도 다르고, OS에서는 메모리를 세그멘테이션, 페이징 같은걸로 나누는데 좋은 건 뭐고 안좋은 건 뭐지?
  • 내 소형 MP3 플레이어처럼 컴퓨터도 아닌 기계에 OS 없이 프로그램 원툴로 돌아가게 하려면 어떻게 해야하지?
  • 네트워킹이 가능해지는 기술적인 원리는 뭐지? TCP/IP 프로토콜 말고 다른 규칙으로 전달할 수는 없나?

역사속의 위인들이나 연구기관에 의해 이미 만들어져있는 것들의 원리를 배웁니다. 하드웨어 단위의 과학, 네트워크 규칙, 암호화하는 원리와 규칙, 운영체제에서 다루는 규칙 등을 다루는데, 심화적인 영역이기도 합니다.

그런데 해킹 취약점은 프로그래머의 실수, 즉 버그로부터 시작됩니다. 해킹을 하려고 하거나 막으려고 한다면 컴퓨터 세계의 법칙과 원리를 잘 알아야 합니다. 이를 터득한 사람은 마치 마술사처럼 버그로부터 자신이 유도한 동작을 실행하도록 컴퓨터를 속일 수 있습니다.

 

정리

컴퓨터 공학에서는 사람의 말로 표현 가능한 설계를 실행 가능한 프로그램으로 만드는 방법(프로그래밍),

그 프로그램이 컴퓨터에서 구체적으로 어떻게 하드웨어와 상호작용하고 실행되는지를(컴퓨터 사이언스) 탐구합니다.

서론부터 머리 아프고 읽기 귀찮게 설명하는데, 구체적으로 초심자때 레벨 별로 무엇을 어떻게 배워야 하는지에 초점을 맞춰 다뤄보겠습니다.

단계별 컴퓨터공학 공부 방법론

1. LV 1~9. 컴퓨터 공학을 처음 접한 사람

(1). LV 1. 책, 강의, 동아리 교육 따라하기

 

컴퓨터 공학을 처음 접한 사람입니다. 이 사람들은 대개 교재를 따라 비주얼 스튜디오와 같은 통합 개발 프로그램(IDE) 부터 설치하게 됩니다. 아마 제일 처음 만드는 프로그램이 Hello, World를 출력하는 프로그램일 것입니다.

#include <stdio.h> int main(){ printf("Hello World!"); return 0;}

뭔지는 모르겠는데 그냥 따라 합니다.
따라 하니까 어쨋든 책에 나온 실행 결과 사진과 같습니다.

원리는 

1. 비주얼 스튜디오라는 프로그램이 당신의 코드를 기계어로 번역도 해주고,

2. 여러 소스(헤더파일, 윈도우API, 당신의 코드)를 묶어 exe파일로 빌드해주고

3. exe파일을 실행하면 윈도우 OS가 메모리에 로드하고,

4. 로드된 순간부터 순차적으로 기계어들을 한 줄 한 줄 인출하고 적절한 하드웨어에 전달하고 해석하고 등등...

여러 복잡한 과정을 거쳐 콘솔 박스에 표현한 것입니다.

 

위는 C언어 수업에서 배우는 컴퓨터 과학 지식중 하나로, 개인적으로 교재 보면서 이해하는데 꽤나 애먹었던 CS입니다.

처음 배울 땐 처음부터 알 필요도 없고 답답해하지 않아도 됩니다. 선택하는 세부 전공 분야에 따라 파고들어가야할 분야가 달라집니다.

 

  • 컴퓨터는 어떠한 방식으로 데이터를 표현하는지
  • 프로그래밍 언어는 어떠한 방식으로 기계어로 변환되는지
  • OS가 어떻게 빌드된 파일과 하드웨어, 여러 다른 소프트웨어 사이에서 상호작용하는지
  • 네트워크는 어떤 규칙과 절차로 이동하고 보안성이 필요한지

 

LV 1의 초심자들은 이 모든 공부를 C언어와 학부 기초 과목들을 통해 일단 시키는대로 따르며 학습하며 컴퓨터와 친해지게 됩니다.

오늘날의 컴퓨터 교육은 실습부터 하고 원리를 파악해나가는 방식으로 가르쳐줍니다.

원리부터 배우고 문제를 해결하는 고등학교 입시와는 다릅니다.

초심자때는 매 순간 관찰하고, 지난 번에 이해하지 못한 것을 이해하는 데 애를 쓰셔야 할 것입니다.

 

(2). LV 2. 구글링을 통한 문제 해결

printf("asd") 따라 적었는데 실행이 안 된다.

ex printf("%c", 1000); 배웠던 대로 연습문제 풀고 있는데 안 된다.

 

다행히도 당신은 컴퓨터를 공부하고 있습니다.

컴퓨터에서 일어나는 문제는 컴퓨터로 모두 해결할 수 있습니다!

어떻게? 바로 디버깅과 구글링입니다.

  • 디버깅 : 어디서 어떤 문제가 발생하는지 스스로 한줄 한줄 점검하는 과정, (좋은 IDLE는 잘못 된 부분과 원인을 정확히 찾아주곤 함)
  • 구글링 : 이러한 문제를 해결하기 위한 방법을 찾는 과정

무엇을 잘못했건 우리는 문제를 만났을때, 해결해야 합니다.

인터넷이 발달한 오늘날 문제가 잘 해결되지 않을 때, 도움을 받을 수 있는 좋은 방법이 두가지 있습니다.

1) 교수님, 선배님에게 물어본다.
준회원 분들, 특히 1학년 분들은 꼭 선배님들에게 많은 질문을 해보시기 바랍니다. 한 시간동안 고민할 문제를 1초만에 해결해주는 마법을 보시게 될겁니다 😃

특히 동아리 운영진들에게 연락해보세요! 그들은 오히려 좋아해줄겁니다 :)

하지만 항상 사용 가능한 방법은 아닙니다. 교수님이나 선배님이 다 아는것도 아니고, 탐구하려는 노력도 없이 한시간에 한번씩 별 것도 아닌 걸로 물어보면 귀찮아 할 수도 있으니까요.

2) 구글에 검색한다.
기원은 모르겠지만 컴퓨터를 다루는 사람들 사이에서 유행하는 말이 있습니다.

"컴퓨터 공학을 다루는 사람이 영어를 애써 배워온 이유는 구글 스택 오버플로우를 이용하기 위해서다"

인터넷 상에는 정말 많은 지식이 공유되어 있습니다.

선배들에게 질문했을 때 "이렇게 구글에 검색해 봐"라는 답변을 자주 받을 것입니다.

시키는 대로 검색하면 해결 방법을 손쉽게 찾아낼 수 있습니다.

이 때 당신은 겪게됩니다.

'아, 검색만으로 쉽게 문제를 해결할 수 있구나!'
'나는 검색을 통해 상당히 많은, 아니 거의 모든 문제를 스스로 해결할 수 있는 사람이구나!'

'오류 코드를 그대로 복붙해도 해결방법이 나오네?'
'아, 쓸데 없는 말을 지우고 근본 키워드로 다시 검색하니 결과가 나오네?'
'영어로 검색하고 번역기 돌려서 보니 훨씬 좋은 결과가 나오네?'
'개발자 커뮤니티라는 곳도 있잖아? 여기에선 검색으로도 잘 안나오는 문제를 고수들이 빠르게 답변해주네?'
’MDN? Mozilla? 표준 문서에서는 정확하게 아주 깊이있게 알려주네?’

이러한 검색 기술 경험을 터득할 수록 스스로 문제를 해결할 능력을 빠르게 갖추게 됩니다.

저는 이 구글링을 터득하는 경험이 초보자들이 반드시 겪어야 할 튜토리얼 경험이라 생각합니다.

일단 찾아보세요, 어떻게든 방법은 구해집니다!

 

웹 서버 어떻게 만들지?

  • 구글링하면 방법이 나옵니다.

라즈베리파이로 강의 프로젝터도 꺼버리고 공용 에어컨도 조종하는 리모컨 만들수 있을까?

  • 만들고 싶다고 검색하면 뭘 사야하는지 뭘 개발해야하는지 나옵니다.

컴퓨터 공학도에게 있어 첫 관문이자, 이를 경험하지 않은 사람과 차별화되어 공부 효율이 달라지는 정말 중요한 단계입니다.

사실 대학 안나오고 인터넷 문서만으로 독학한 개발자나 해커들도 있습니다. 중학생인데 학부과정보다 잘하는 사람도 있습니다.

요즘은 모르겠는데 예전에는 네이버 지식인과 같은 곳에 공부 방법을 검색하면 이런 답변이 자주 달렸습니다.

학원 다 상술이니까 가지 마시고, 대충 C언어부터 배우시고 독학 해보세요.

성의없지만 맞는 말이기도 합니다. 효율적인 방법이에요.

옛날에야 공부하는 방법이나 기술을 가르쳐주는 곳이 없어 학교를 갔지만, 요즘은 인터넷 문서의 발달로 독학으로도 가능한 것입니다.

동아리와 선배의 존재, 성장에 필요한 멘토와 라이벌의 존재, 학연과 인맥, 사회에서의 대졸의 인식 등을 고려하면 아직 대학의 가치는 유효하다고 봅니다. 이외에도 학계로의 진출 자격, 교수님의 전공 지식을 얻고 사회를 보는 시각을 얻는다는 이점도 있을 것입니다.

이렇게 책이나 강의, 동아리로부터 배우고 실습하는 경험을 반복하고 검색(문제를 해결력) 능력 까지 터득한다면 당신은 1차 전직의 시점까지 점점 다가가게 될 것입니다.

(3). LV 3~9. 선 실습 후 탐구

앞서 책이나 강의를 따라 공부하라고 하였는데, 처음엔 아무것도 모르니 책으로 배우는 것이 당연하지만 구글링을 배운 이후라면 하려는 것을 일단 하고 막히는 부분을 찾는 것이 낫습니다.

이 세상 그 어느 프로그래머도 책에 의존하는것을 권장하지 않습니다. 고급 프로그래밍이나 심화 단계의 기술을 공부할 때도 마찬가지입니다.

이거 하고싶은데 필요한게 뭐지? 이땐 어떻게해야하지?

반드시 직접 작성하고 실행하고 의문점을 탐구하는 것 만 못할 것입니다.

앞서 말했고 뒤에도 서술할 것 이지만 프로그래밍 공부는 고등학교 공부와 다릅니다.

고등 수학은 미분을 하기 위해 극한을 먼저 배워야 하는 것이고, 적분을 하기 위해 구분구적법을 먼저 배워야 하지만 컴퓨터는 실행 결과로부터 원리를 역으로 탐구합니다.

과학은 관찰의 학문이라 하였습니다. 원리부터 공부해도 되지만 실습해서 관찰하는 것이 배움에 훨씬 재미와 효율을 더해줍니다. 컴퓨터 과학은 실습을 통해 입력과 결과를 눈으로 확인할 수 있습니다.
책만 봐서는 관찰의 경험을 빠드리기 쉽습니다.

코딩을 통해 눈으로 보이지 않는 컴퓨터 논리 구조를 입력과 결과로 관찰하며 경험할 수 있습니다.

이미 버스가 있는데 걸어갈 필요가 없습니다.

(2022 후술 : 고레벨로 가면 또 구글링을 멀리하고 표준 문서 지향적으로 다시 바꿔야 합니다.)

LV1~LV9 정리

  1. 컴퓨터 공학을 처음 배우는 학생들은 예제를 직접 실습하며 프로그램을 만들기 시작한다. 처음엔 왜인지는 몰라도 따라 하면 이런 저런 프로그램을 만들 수 있게 된다.
  2. 작성한 코드가 실행이 안될 때, 뭔가 만들고 싶은데 방법을 모를 때 멘토들에게 물어가며 해결하다가 구글링 기술을 터득하고 "막히는 것을 스스로 해결할 능력"을 갖게 된다.
  3. 모든 예제는 직접 실행하고 궁금한 것을 탐구한다. 책을 읽는 것 보다 실습과 관찰에 의존해야 한다.

여기 까지 동아리나 다른 교육기관 없이 평균적인 컴퓨터 공학과 학생이 수업에 의존하여 학습한 수준으로 1년 정도의 시간이 소요된다고 생각합니다.

학술동아리인 우리 동아리에서는 1학기 기간 동안 기초교육을 통해 LV 9단계 이상까지 충분히 완성할 수 있습니다.

2. LV 10. 1차 전직, 원하는 프로그램을 기획하고 설계하고 완성해낼 수 있는 사람

 

당신이 LV 9까지 왔다면 컴퓨터 공학과에서 가르쳐 주는 필수 프로그래밍 교육 수준을 이미 달성하였습니다. 컴퓨터공학과 1학년 커리큘럼의 수준, 갓 정회원으로 등업한 우리 동아리 회원의 수준이라고 봅니다.

1차전직을 하면 기쁜 사실 한가지,

1차 전직 이후에는 특수 스킬을 사용할 수 있습니다!

앱 개발, AI 머신러닝과 같은 특수스킬을 도전할 최소조건이 달성된 것입니다.

이 때부터 당신은 혼자 힘으로 프로그램을 만들 수 있는 것은 아니더라도 '부족한 것을 공부해내면서 만들어 낼 수' 있습니다.

 

이 등급에 도달한 사람은 다음과 같은 것을 이해할 필요가 있고, 시도할 수 있습니다.

1️⃣ 싹이 보이는 사람들, 재능러들의 마인드

2️⃣ 다양한 프레임워크에 도전

3️⃣ 1~7일 동안 물고 늘어질 수 있는 프로젝트 단위 실습

 

(1) 싹이 보이는 사람들, 재능러들의 마인드

컴퓨터 공학과에선 재능충들을 이길 수 없다는 얘기가 있습니다.

위와 같이 말하는 개발자의 자질을 가진 사람, 재능충이라는 사람들에 대해 얘기해보겠습니다.

초등학교 때 친구들 사이에서 프리 메이플, 프리 바람의나라 라는 게 유행한 적이 있었습니다.

초딩들이 운영자가 되어 현질템을 뿌릴 수 있는 크랙 서버와 클라이언트였죠.

어떻게 초등학생이 게임 서버를 운영할 수 있었을까요?

그들의 사고 과정은 다음과 같습니다.

1️⃣ 메이플 스토리 레벨업이 너무 힘들다. 2008년 당시 레벨 30 찍는데 2주일은 걸렸던 것 같다.

2️⃣ 친구가 프리메이플이란걸 설치하면 하루만에 3차전직까지 할 수 있다고 한다!

3️⃣ 나도 해야지. 친구한테 물어보니 이 블로그에 들어가면 설치 파일이 있다더라.

4️⃣ 설치한다. 실행한다. 친구에게 자신의 서버에 접속하는 방법이 적힌 블로그를 알려준다.

 

저는 이런 친구들이 프로그래밍의 자질, 재능을 가졌다고 생각합니다.

  1. 이것을 하고싶다.
  2. 조사하고 공부한다.
  3. 만들어서 배포한다.

컴퓨터 프로그램 개발도 위와 다르지 않습니다.

  1. KF94 공적 마스크의 분배 현황을 맵으로 안내하고싶다.
  2. 웹서버 만드는법을 조사하고 공부한다.
  3. 웹사이트를 만들어서 배포한다.

저는 감히 초등학생인 프리메이플 운영자 친구들이 코로나19 확진자 맵 사이트를 진심으로 만들고파 하였다면 끝내 만들었으리라고 생각합니다. CMS(WIX같은 서비스)와 같은 툴과 지도API를 적절히 이용한다면 웹 서버 제작 과정에 코딩이 필요하지 않을 수도 있습니다. (제대로된 서비스를 진심으로 만들고파 했다면 코딩마저 유튜브로 공부했을 것입니다.)

원하는 것을 만들어내고자 하는 마음가짐, 당장 몰라도 일단 하면서 부딛히는 마음가짐이 컴퓨터로 밥 벌어 먹고 사는 사람의 자질이라고 생각합니다. 그것이 비록 복잡한 원리와 과정을 수반하지 않더라 해도 괜찮습니다.

누가 뭐라하든 어쨋든 난 하고싶고, 하고싶은건 해낸다.

이런 도전의식이 성장에 있어 정말 중요합니다.

만들 수 있을 만한건 실제로 개발해보세요! 일단 시작하면 방법은 구해집니다.

이미 LV 1~9에서 구글링을 통한 문제해결 경험이 큰 도움으로 작용할 것입니다.

 

✏️ 잭은 가족같던 이웃을 췌장암으로 잃고, 왜 암을 진작 못찾았는지 인터넷으로 알아보니 검사 수준이 형편없었다고 한다. 자신이 더 나은 진단법을 만들 수 있겠다고 생각하고 인근 대학 연구소와 구글링의 도움을 받으며 발명해낸다.

발명의 자질, 개발의 자질

"누가 뭐라하든 어쨋든 난 하고싶고, 하고싶은건 공부해서라도 해낸다"

 

(2) 만들고자 하는 분야의 개발환경, 프레임워크 학습

프로그래머에게 있어 개발 환경은 정말 중요합니다.

LV 1인 사람에게 C언어 개발 환경, stdio.h와 같은 라이브러리가 없었다면 어떻게 되었을 지 상상이 가시나요?

컴퓨터 구조와 전산학을 익히고 OS 함수들을 배우고 출력 함수를 직접 디자인해야만 겨우 Hello World를 출력하는 프로그램을 만들 수 있었을 것입니다.

C언어의 stdio.h처럼 이렇게 남들이 만들어 놓은 설계를 그대로 가져다 사용할 수 있는 도구들이 바로 라이브러리, 모듈, 프레임워크 들입니다.

차이가 있는 개념들이지만, 생산성, 협업이라는 목적으로부터 설계됐다는 점은 같습니다.

LV 10부터는 타 언어와 환경으로의 확장이 수월합니다. 이미 초보자 시절동안 겪었던 예제들로부터 코딩능력 또는 알고리즘 능력이 다소 갖춰져 있기 때문입니다.

이 능력은 문제 해결 능력이라고도 부르며, 사람의 말로 표현한 설계를 코드로 바꿔본 경험, 코드로부터 알고리즘이 어떻게 구성되어있는 것인지 노트에 말로 풀어 써본 경험으로부터 나옵니다.

 

언어를 이동할 때도 처음에 문법과 방법이 약간 상이할 수 있지만 이미 익힌 코딩능력, 알고리즘 설계등을 적용 하는 것은 대동소이하며 이 문제 해결 능력이 프로그래밍에 있어 가장 중요한 부분입니다.

(2022 후술 : 고레벨로 성장하면 언어나 디자인 패턴의 장점과 철학을 생각 하는 것도 필요합니다.)

C++ 고수는 파이썬 문법을 며칠만 배워도 파이썬으로도 고수가 될 수 있습니다.

표현이 다소 어렵지만 프로그래밍 언어는 언어마다 발달 특색이 있습니다.

  • C언어 : 표현의 고급화(사람의 언어로 표현, 호환성의 발달)
  • C++, JAVA : 방법의 고급화 (객체지향, 모든 것을 사물처럼 표현, JAVA는 컴파일 환경까지 고급화)
  • Python, Javascript : 실행방식의 고급화 (인터프리터언어, 실행파일을 만드는 과정 없이 실행, 높은 생산성)

타 언어를 경험해 보는 것은 학습 비용이 얼마 안 걸릴 수도 있습니다. 직접 해보시면 알게됩니다. 이 언어는 이런 경향과 특색을 가진다는 것을, 문제 해결 과정은 거의 다를 바 없다는 것을. 타 언어를 터득하면 좋은 점은 언어 고유의 장점을 살려 개발할 수 있기도 하지만, 언어가 갖고 있는 라이브러리, 모듈, 프레임워크를 사용할 수 있는 것이 가장 좋은 점이라고도 볼 수 있습니다.

 

파이썬을 이용하면 머신러닝 프레임워크인 텐서플로우를, JAVA를 이용하면 웹개발 프레임워크인 Spring을 사용할 수 있습니다.

인생은 짧으므로 많은 것을 만들고 경험하기 위해선 프레임워크 사용은 필수라고 봅니다.

학원에서 주로 가르치는 것이 프레임워크입니다. 코딩 국비교육 학원에서는 3개월에서 6개월 사이 단기간에 취업까지 시켜줍니다.

이런 단기 교육이 한계는 있지만 한 프레임워크만큼은 전문성을 가지고 있는, 어엿한 주니어 개발자로 키워줍니다. 고등학생도 프레임워크 전문성을 길러 외주활동을 하며 돈을 버는 학생들도 꽤 있다고 합니다.

프레임워크 하나만 잘 다뤄도 직업을 가질 수 있습니다!

검사의 파워 슬래시, 마법사의 매직 클로처럼 이런 고유 기술들을 하나 하나 익힘으로써 성장하고
생산성있게 남들에게 팔만한 서비스를 개발할 능력을 갖게 됩니다.

프레임 워크를 널리 아는 것, 많은 프레임워크를 활용할 수 있는 것도 능력입니다.

단 프레임워크 하나 잘 한다고 근자감을 가지면 안됩니다. 툴이나 도구에 의존해선 안됩니다.
오토핫키만 잘 다룬다 해서 그 사람은 C++로 win32API를 쓰는 사람보다 다양한 것을 해낼 수 없습니다.
필요한 것을 만들기 위한 도구로 생각해야지, 몇 가지 프레임워크에만 의존하고 자신의 실력을 재단한다면 그 환경이 아니고선 아무것도 아닌 사람이 됩니다.

(3) 모방과 도전

LV 10부터는 원하는 것을 탐구하면서 만들 수 있는 최소한의 능력을 갖게 됩니다. 동아리에서 준회원을 정회원으로 인정하는 시기가 이 때입니다. 시간이 비록 오래 걸릴지라도, 의지만 있다면 스스로 방법을 찾고 문제를 해결하며 프로그램을 완성해 낼 수 있습니다.

한마디로 LV 10의 프로그래머는 "무엇이든 할 수 있는 잠재력이 있는 사람"입니다.

초보자 때 렙 올리기 쉬운 게임과는 반대로, 인생은 LV10까지 올리기가 어려운 것이지 LV10부터 더 쉽습니다.

 

  1. 무언가를 하고싶다.
  2. 조사하고 공부한다.
  3. 만들어서 배포한다.

이를 정보보안을 공부하고싶은 컴퓨터공학 학부생에게 적용해본다면

  1. CTF에서 상타고싶다. 동아리 연혁을 보니 저 선배님은 내 나이때 국내 최우수였잖아?
  2. 해킹을 잘하려면 여러 일단 기초 해킹기법부터 분석해보라고 한다. 시스템 해킹으로는 버퍼오버플로우, 웹 해킹으로는 SQL인젝션이 있다고 한다.
  3. 취약환경을 따라 만들고 해킹을 실습하고 공유(세미나 발표)한다. 갈고 닦은 실력으로 CTF에서 상탄다.

스마트카를 해킹하고싶은 고학년 정보보안 학부생에게 적용해본다면

  1. 스마트카를 해킹하고싶다.
  2. 연구실에 학부인턴으로 들어가거나 BoB같은 연수기관을 가면 해킹 연구용 스마트카를 제공해준다고 한다.
  3. 공부해서 해킹한다. 연구결과를 공유(논문 게재, 세미나 발표)한다.

동아리에서 멋지고 남들에게 도움되는 발표를 하고싶은 회원에게 적용해본다면

  1. 발표 잘하고싶다.
  2. 알아보니 PPT는 감성 위주의 발표로 해야하고, 기술 발표 같은 것은 프로그램 소스코드 보다는 알고리즘과 원리를 시각적이고 명확하게 전달하는 것이 좋다고 한다.
  3. 시각적으로 정리 잘된 PPT를 만들어서 예비 발표 연습까지 완벽히 마무리한 후 발표한다.

해커톤이나 공모전에서 상 타고 싶은 사람에게 적용해 본다면

  1. 수상하고싶다.
  2. 해커톤을 잘하려면 필수로 준비해가야 하는 것은? 쓸만한 서비스를 만드는 것이 포인트 인 것 같다. 그러기 위해 필요한건 실패하더라도 많은 대회 도전 경험이다.
  3. 선수지식을 쌓고 대회에 나가 팀원들과 협업하다 우승한다.

뭔가 되게 말장난 같기도 하지만, 위 예시를 보시면 알 것 같습니다. 재능이란 결국 자신감과 간절함임을.

 

3. LV 30. 2차 전직, 중~고급 규모(한 달)의 프로젝트, 연구과제를 스스로 해낼 수 있는 사람

 

2차 전직을 하기 위해선 1차전직 경험치를 먼저 끝까지 채워내야합니다. 여기서부턴 피말리는 집요함이 필요하기 때문입니다. 경험치도 모자란데 전직을 했다간 자신감이나 도전욕구가 다칠 수도 있습니다.

다양한 도전과 프로젝트 경험이 필요합니다. 저도 2차전직을 막 시작하는 단계에 있습니다.

LV 29까지는 LV 1~9때와 같이 모방하고 탐구하는 것 만으로 대개 7일 이내의 중간 수준 과제를 해결해낼 수 있었습니다.

근데 LV 30부터는 다릅니다. 한 달에서 두 달 정도 투자해하는 규모의 단계입니다.

(1) 심화 기술 연구

해킹을 공부하고자 하는 사람은 기본적인 해킹 기법을 터득하였다면 이후엔 프레임워크 취약점, 오픈소스 취약점을 분석하는 것이 좋습니다.

연구 타겟으로는 CVE 최신 취약점 분석 문서, 해킹 최신 동향을 담은 연구 저널이나 논문을 분석하고 실습하는 것입니다.

국내외에 잘 분석된 보고서도 있고, 고난이도의 주제를 다루는 기술 블로그의 문서들도 많습니다.

LV 29까지는 간절함만 있다면 해결할 수 있지만 2차 전직부터는 집요함까지 필요하다고 할 수 있습니다.

해킹에의 도전자들이 가장 잘 무너지는 넘사벽이자 넘어서는 순간 해커로서의 등급이 달라지는 단계라고 합니다.

건강 상하는거 신경 안쓰고 오랜 기간 집요하게 분석에 매진해서 소스코드를 분석하고 취약점을 스스로 찾아낸 사람. 위자드 해커, 버그헌터의 반열에 들어서는 것입니다.

(분야에 따라 이를 일찍 경험할 수도, 경험하는 데 오랜 시간이 걸릴 수도 있습니다.)

 

정보보안은 하이리스크 하이리턴!

  • "크롬을 해킹하고싶다면, 엔진을 구성하는 코드와 함수를 모두 분석해야죠"

 

(2) 어려운 과제에 계속 도전

큰 것을 해낼 수 있다면 하고싶었으나 막막하여 하지 못했던 것들, 예전에 도망친 것들, 상상으로만 꼭 해보고싶었던 것들을 떠올려보세요.

  1. 롯데리아에 갔는데 키오스크와 공용WIFI가 같은 망에 있을 것 같다. 해킹해볼까?
    • 암호학과 네트워크 지식의 보충이 필요하겠군.
  2. 카카오톡 삭제된 메시지를 복원할 수 있을까?
    • 관련 포렌식 기술인 메모리 포렌식을 알아봐야겠군.
  3. 올림픽에서 군무를 추는 드론 무리들을 원격조작할 수 있을까?
    • C&C 서버처럼 명령하는 마스터 PC가 있을 것 같고, 네트워크와 임베디드 시스템의 해킹기술이 필요하겠군.
  4. 스마트 도어락을 해킹할 수 있을까?
    • U-ART와 JTAG 단자를 물리면 임베디드 장치에 입력이나 디버깅을 할 수 있다던데. 이 중국산 도어락은 해킹이 된다더라.
  5. Mnet 1분 듣기 제한을 해제할 수 있을까?
    • 리버스 엔지니어링으로 프로그램 크랙에 성공한 사람이 있다던데...
  6. 정부기관에서 외주 업체에 아웃소싱하여 매년 수천만원의 세금을 투자하는군. 내가 컴퓨터를 모르는 공무원도 쉽게 다루는 CMS 서비스를 개발해서 세금 낭비를 줄여볼까?

단 해킹 실습은 허가받지 않고 해선 절대로 안됩니다.

??? : 누가 뭐라했건 하고싶은걸 해내라며요?

법의 테두리 외에서까지 하는 실습은 질 좋은 실습이 아닙니다. 자의든 미필적고의든 누군가 피해볼 수도 있는 실습보다는 본인이 직접 환경구축까지 하면서 하는 실습이 낫습니다.

떳떳하지 못한 해킹은 발표하지도 못하고, 환경 구축을 하면서 배우는것도 많습니다.

이 분야에 정석은 없는 것 같습니다. 첫 시작부터 실습 위주로 배웠듯이, 이 단계에 와서도 마찬가지입니다. 늘 새로운 것을 실습하고, 연구하고, 정리합니다. 프로젝트를 하나 하나 해결해나가며 몰랐던 지식을 습득하고, 못했던 문제를 해결하고, 관찰하면서 성장합니다. 그렇게 많은 프로젝트 경력이 곧 실력이 됩니다.

다양한 경험은 세부 전공을 결정할 때에 당신이 원하는 분야로 선택할 때도 도움을 줄 것입니다.

'악성코드 분석은 코드 읽느라 토나와서 싫어, 웹해킹은 하루종일 게싱해야하고 유사해킹 같아서 싫어, 난 과학적이고 간지나는 시스템 해킹이 가장 좋아, 역시 난 시스템 해킹이나 커널 버그 헌팅이 재밌어.'

2학년을 거치며 가졌던 생각들

이번 파트는 선배님들로 부터 얻은 팁들과 학부 2년간 겪은 개인적인 고민을 서술하였습니다.

이후 단계인 3차전직 부터는 제가 레벨이 미치지 못하여 서술하지 못하였습니다.

레벨업 하게 되거든 2편도 연재해보겠습니다 :)

혹시 이후의 공부 방법론에 대해 피드백 주신다면 경청하고 첨부하도록 하겠습니다! 🙂

계속 레벨업 하기 위해…

프로젝트만 해내면 뭐든 다 해낼 것 처럼 서술했지만 분명 이후 단계에선 저도 알지 못한 문제에 부딛히게 될 것입니다. 이후의 단계에선 기존의 시행착오를 통해 자신의 습관을 개선하는 것도 필요하다고 합니다.

실패의 경험도 중요합니다. 불편함과 불안정성을 느끼고 고민해 볼 필요가 있습니다. 스스로 불편함을 느끼고 개선하는 것도 능력이라 합니다.

취업 컨설턴트로부터 들었던 말로, 주 언어를 잘 다루는 것은 좋지만 해커들이 PHP 만능론과 같은 신념에 빠져 JAVA를 의도적으로 피한다고 하는데, 이는 취업시장에서 다소 불리하다고도 합니다. JAVA가 오늘날 가장 매력있고 편한 언어는 아니더라도, 가장 자주 쓰이는 언어이기 때문이라고 합니다.

하나 잘 판 것은 좋은 능력이지만 근자감에 빠지면 안됩니다. 오늘날 세계에는 무수한 환경이 있기 때문입니다. 새로운 환경을 요구받는다면 겸손한 자세로 부족한 부분을 학습할 필요가 있습니다. 2차전직 정도의 수준에 도달하거든 "난 어떠한 새로운 환경에도 적응할 수 있는 사람"이라는 자신감이 생기고 학습능력을 크게 향상시켜 줄 것입니다.

개인적으로 생각하는 공부 방법론의 가치 : 탈주자들이 왜 많을까?

사실 안 좋은 얘기지만 컴퓨터 공학과는 적성이 안맞아서 탈주하는 사람이 많다고도 합니다.

이미 오늘날의 대학생들은 다 아는 사실이겠지만, 실제로 이공계조차도 취업자 전공일치율은 그다지 높지 않습니다.

위에서 서술한 프로그래머의 자질가 없다면 독학도 불가능하다고 봅니다. 저는 중학생 때 3년간 정보영재교육원에서 프로그래밍 꽤 오래 배웠지만, 흥미도 없고 뭘 하고자 하는 의지도 없었기에 재미도 없었고 수험생활동안 대부분의 지식을 까먹어버렸습니다.

이렇게 탈주하고 흥미를 상실하는 원인은 이러한 컴퓨터 공부 방법론을 알려주는 데가 없다는 것이었다고 생각합니다.

저는 정말 운좋게도 좋은 동아리에 들어와서 이러한 방법론에 맞춰 교육받을 수 있었고, 스스로 레벨도 많이 올렸고, 운영진까지 겪고 많은 정보를 얻게되면서 2차 전직을 목표로 하는 단계까지 왔네요. 동아리의 공이 가장 컸다고 생각하고 감사하고 있습니다.

저는 고등학교 2학년때 스터디코드라는 공부법 강의를 들었습니다.

고등학교 1학년 말때 전과목 5등급을 받았다가 고3 수능 당일 처음 수학 1등급을 받으며 국수영사탐 21415 등급으로 레벨업 했었는데, 누군가에겐 좋은 성적이 아닐지라도 저에게는 다소 의미있는 성적이었습니다. 공부법을 배우지 못했더라면 절대 이만큼 성장하지 못했을 것이라 생각합니다.

1학년 때는 성적은 잘 받고싶어도 해도 안되는 공부였는데, 공부법을 익히고 난 이후로는 "이렇게 이만큼 공부하면 좋은 학교 갈 성적 나온다"라고 확신을 갖게 되었어요.

학습자에게 있어 학습 방법을 알고 모르고는 정말 차이가 큽니다.

막연한 노력은 자신을 배반할 것이기에 자기방어적으로 의지를 갉아먹는다고 합니다. 욕심만 있고 능력이 안되는 건 정말 불행한 일이고, 결국 도망치게 되거든요.

고등학교 2학년 부터는 육체적으론 힘들지라도 정신적으로는 힘들지 않았습니다. 1학년 때는 야자에 적응하기 싫어 입시에 불만을 가지곤 했었는데, 2학년 때부터는 노력에 확신이 생겨 주말 자율학습까지 스스로 즐겨 나왔었습니다.

컴퓨터 공학에 있어서도 구글링이나 선배님들을 통해 방법론을 터득한 뒤로부터는 컴퓨터 공부에 적성이 맞는지 생각해보지 않아도 되게 되었습니다. 영재교육원때의 트라우마는 이미 없어졌고 오히려 그때 알았으면 좋았을 걸 하는 미련만 남았습니다.

쌩 초보때 이런거 생각해본 사람?

본문에서 계속 반복했던 말이지만 컴퓨터 공부를 하면서 입시 공부와 컴퓨터 공부는 상당히 괴리가 있었습니다.

개념 원리부터 알고 문제에서 고민하던 입시 공부와는 달리 컴퓨터는 실습 위주였습니다.

'그래서 Hello World 만들어서 나오는 이 창이 대체 뭔데?! 난 이거 스스로 못만드는데? 왜 콘솔창을 만드는 법 부터 배우지 않는거지?'

printf 함수 쓸 때부터 답답했었습니다.

'이만큼만 이해해도 되는건가? 컴퓨터 데이터는 이진수로 이루어 져있다면서 문자는 어떻게 표현하는거지? 설마 모니터의 검은점이 0이고 1이 흰색인가?'

16년도 1학기, 18년도 2학기 동아리 운영진분들로부터 "일단 이렇게 해봐라, 이건 이렇게 해라. 그거 구글에 이렇게 검색해볼래?"이런 조언을 받으면서 익숙하진 않지만 이렇게 하는거구나, 궁금한건 검색하면 다 알려준다는 사실을 알고나서는 욕심껏 공부해낼 수 있었습니다.

실습 지향적 학습

글 본문에서 이미 자주 서술하였지만, 컴퓨터 공부의 핵심 코드는 선 실습 후 탐구 인 것 같습니다.

알 수 없는 개념 또는 알고자 하는 미지의 코드에 봉착했을 때 구글링이나 멘토를 활용하여 문제를 해결하면서 실력이 늘었습니다. 목표를 먼저 만들고, 해결하는 식으로 공부했었죠.

마찬가지로 1~2학년 후배님들께선 초보자 단계를 지난 뒤에는 프로젝트 위주의 공부를 목표로 잡으면 좋겠습니다.

프로젝트는 자신의 수준에서 도전해볼 만한 그 무엇이든 좋습니다.

  1. 프리메이플 서버가 필요하다.
  2. 네이버에 검색했더니 서버 자동설치하는 프로그램이 나왔다.
  3. 만들었다. 친구에게 공유한다.

어린 초등학생이 남들이 봤을때 굉장해 보이는 일을 해내듯이요.

프로젝트를 우선 잡고 이후에 개발하는 것이죠.
자신이 만들고 싶은 서비스가 있는지 노트에 기록하는 것도 도움이 됩니다.

 

 

 

1학년 때 제 첫 해킹은 동기님의 코드게이트 시연 동영상 공모전에 나온 해킹이 너무 멋있어 나도 해보고싶다는 마음에서였습니다.

  1. 로그인 탈취를 해보고싶다.
  2. 조사해보니 게시판과 회원가입 기능이 필요하다고 한다. 이건 얼마전에 만들었고, 뉴비팀에서 후배가 게시판 기능을 만들었다. 나도 만들어보자.
  3. 만들었다. 해킹했다. 발표했다.

XSS를 실습하겠다고 웹팀장에게 말했을 때 저는 그게 무슨 원리로 동작하는지 사실 잘 몰랐습니다.

웹 프로그래밍을 배우고 영상을 다시보니 할 만해 보였고, 욕심이 있었고, 구글링하며 공부했고, 만들었습니다.

선배님들께도 정말 정말 많이 들은 이야기지만 뭐든 흥미있는 것에 도전하면 어떻게든 됩니다. 하고싶은게 뭔지 모르겠다 라고 말하는 사람은 주변 라이벌이나 선배의 연구 성과나 작품을 보시는게 도움 될 것이라 봅니다. 동아리에서 흔히 보일 겁니다. 아 내용은 못알아먹겠지만 아무튼 숨겨놓은 서버에 몰래 침투했다고? 정말 멋진걸?

운영체제같은 컴퓨터 과학을 배울 때도 마찬가지로 프로젝트로 할 수 있습니다. 대학 강의에서 과제가 의미있는 이유입니다. 운영체제를 만들어보면 그것 또한 프로젝트이자 실력이 되며 남들에게 자신이 얼만큼 이해하였는지조차 증명할 수 있습니다.

 

대학생때부터 커리어 관리

많은 도전들이 모여 자신의 커리어, 실력이 됩니다.

회사에서 이력서를 볼때 가장 가치있게 평가하는 것이 과제->연구->발표->보충 사이클의 프로젝트를 얼마나 많이 성공적으로 수행했는지라고 합니다.

알고리즘은 본문에 따로 서술하지 않았는데, 프로그래머스에서 공부할 수도 있지만 이 또한 프로젝트 위주로 실전 개발하며 만드는 것이 더욱 재밌을 것 같습니다.

LV. 30부터 봉착하는 한 달 이상의 대규모 분석 과정에서 알고리즘은 필수라고 볼 수 있습니다.

전 동아리에서 CTF와 워게임 위주의 해킹기법만 공부했더니 오픈소스 분석에 너무 시간이 걸려 지칩니다.

현재 저 자신에게 가장 부족한 부분이 개발 능력이라고 생각하는데, 해킹 동아리라며 개발을 배척하지 말고 동아리에서도 개발 공부도 했으면 좋겠습니다. 결국 보안을 공부하기 위해선 개발을 공부해야 하니까요.

동아리에서 회원과의 올바른 상호작용

신입생의 기초 교육을 담당하는 동아리 운영진 또는 교육자는 이와 같은 것들을 교육하는 것을 목표로 삼으면 됩니다.

  1. 기초 과정에서 코드로 뭔가를 만들어 내는 경험
  2. 문제가 발생했을 때 선배나 구글을 통해 정보를 찾아 해결하는 경험
  3. 어느 정도 준비가 된 초보자가 작은 목표(버퍼오버플로우, 워게임 올클리어, ...)를 성공해내는 경험

이를 도와주고 성장을 유도하는 것입니다. 이런 프로젝트와 문제해결 경험은 일반적인 대학 수업 과정보다 동아리에서 활발하게 이루어집니다.

  1. 시야를 넓혀주고 성장의 모형이 되어줄 멘토들의 존재
  2. 학습과 프로젝트를 함께할 친구나 라이벌들의 존재
  3. 스터디에서 구성원으로 인정받기 위한, 실력을 증명하기 위한 학술 세미나의 존재
  4. 대외활동의 정보와 팀원

등 학술 동아리의 이점은 초심자에게 있어 정말 지대하다고 하겠습니다. 유용하게 이용하십시오. 만약 유용했고 고마웠다면 성장해서 후배들에게 갚으십시오.

학술 동아리나 교육 기관의 운영진들은 운영을 위해 채찍과 당근을 적절히 사용해야 할 필요가 있습니다.

잘못된 방식으로 활동하거나 대충 적당히 활동하는 회원은 적극적으로 견제해야합니다. 당장의 견제는 아프더라도 잘못된 걸 지적하지 아니하고 방치하게 된다면 집단은 도태됩니다. 영양가 없는 모임에 고수들은 등돌릴 것이고 배움을 원하는 후배들도 갈증을 해결하지 못하고 떠날 것입니다. 당장 욕하기 싫다고 잘못된 걸 지적하지 않는 것은 좋지 않은 상황을 초래할 것입니다.

관심을 갖는 것도 중요합니다. 학생이든 어른이든 성장할 때 웃사람의 관심은 성장의 재미를 폭발시킵니다. 잘한 부분은 잘했다, 못한 부분은 더 하는게 좋겠다고 적극적으로 관심을 가져야 합니다.

"이정도면 잘했습니다." "완벽합니다."

  • 대충 코멘트를 남기는 것은 무관심이나 다를 바 없습니다.

"코드 한줄 한줄 주석처리했구나? 정말 열심히 한 티가 나네, 잘했어! 근데 첨부된 사진에서 패킷 캡쳐링 도구가 Request를 Trap하지 않았는데 어떻게 패킷을 캡쳐한거야? 이 부분 다시 보고 코멘트 남겨줘"

  • 최소 이정도는 돼야 관심을 준다고 할 수 있겠습니다.

동아리는 사람이 모여 활동하는 곳으로, 성장을 원하는 사람이 혼자 하는 것 보다 동아리가 나은 이유는 활동을 함께 하는 그룹에서 발표의 시간을 통해 서로의 실력을 견제하며 자의로든 타의로든 평가하기 때문입니다. 실력이 낮다면 높이기 위해, 실력이 높다면 뒤쳐지지 않기 위해 모두 구성원으로서의 역할을 해내려 하게 되는 것이죠.

이런 학술적인 목표를 반드시 베이스로 해야하지만 사람이 모이기 위해서는 잘 노는 것도 중요합니다.
어차피 비슷한 나이에 사회 초년생이 될 사람들입니다. 좋은 정보를 교류하는데는 선후배 서열 가릴 것도 없다 했습니다. 일 년에 몇 번 없는 동아리 행사를 적극 참여해보시기 바랍니다.

기껏 모였는데 부디 컴퓨터 얘기는 하지 마시길...

안 좋은 질문, 안 좋은 태도

일단 1차전직 / 2차전직 까진 한 것 같은데 뭘 해야할 지 모르겠다.

주변의 멘토에게 이런 말을 했다가는 욕을 먹을 수도 있는 질문입니다.

먼저 멘토 멘티 관계를 보자면, 멘토에게 뭔가를 물어볼 땐 최소한 멘티는 뭐라도 해봤어야 합니다.

"나 살빼고싶은데 뭐부터 해야할지 모르겠다" 라고 질문하는 사람에게는 아무 말도 해줄 수 없습니다.

"웨이트 10세트에 유산소 20분 정도 하는데 변하는게 별로 없는 것 같다" 처럼 최소한의 고민이 담겨있어야 멘티로서 배움의 자세를 갖춘 것이고 멘토는 해줄 말이 있는 것입니다. 윈윈하는 관계죠.

질문에 대한 답을 하자면, 하고싶은 것을 해야 하는 것입니다. 저는 코딩을 잘 해야 하기 때문에 잘 하는 사람을 본 적이 없습니다. 뭔가를 해내기 위한 도구로 프로그래밍을 배웠습니다.

시공간적으로 가까이이 있는 주변 사람의 프로그래밍 성장기를 물어보십시오. 대개 다음과 같은 형식으로 대답할 것입니다.

  1. 수강신청 사이트 몰래 해킹해서 수강신청 올클 하고싶다. 소켓 프로그래밍과 자바 프레임워크의 응용이 필요하다는데, 내가 만들어보자. (이 이야기의 주인공은 코딩을 배운지 1학기만에 도전에 시작했고, 프로그램을 완성했고, 처벌받음)
  2. 아 하나도 못알아먹겠는데 저 선배님들, 동기들은 왜이렇게 잘하지? 쪽팔리고 열받는다, 나도 좀 경험하고싶고 인정받고싶다.
  3. 프로그래밍 그냥 배우는대로 배워졌고, 다 이해 못해도 늘 필요한것 찾아서 공부하고 뽑아 썼다. 꼭 다 알아야 할 필요가 있나? 코딩을 배우고 나니 해킹이 제일 재밌어보였고 해커로서의 정체성을 갖고싶었다. 당장 해킹 해내거나 CTF 문제 풀 수 있는거 아니더라도 풀이 보면서까지 공부했다.

그래, 재능있는 사람들은 잘 하겠지. 초보자인 나에게 있어 해킹이란 것은 당장 힘들어보이니 전공지식이든 뭐든 쌓고 나서 나중에 하겠다.

나중에 가서는 과연 잘 할까요?

하고싶은 걸 당장 못하게 하는 내 주변의 모든 문제를 해결해내버리는 자세, 어쨋든 하기 위해 해결하는 문제 해결 능력이 바로 컴퓨터공학 전공자의 특별한 자산인 컴퓨팅적 사고능력입니다.

일상생활속 군대나 아르바이트에서도 실세들에게 있는 능력입니다.

'저사람은 어딜 가든 뭘 하든 잘 적응하고 잘 해낼 것 같다. 일 잘한다, 능력 있다.'

문제에 직면하고, 부딛히면서 해내는 태도가 중요합니다. 그런데 문제에 직면조차 하지 않고 도망가는 것은 배우는 사람에게 적합한 태도가 아닙니다. 당장 못할 것 같으니 나중에 보자는 것은 목표로부터 더욱 멀어지게 만드는 태도입니다.

바람직한 학습자는 '네트워크 해킹을 하기위해 학과에서 가르쳐주지 않는 소켓 프로그래밍을 혼자서라도 찾아봐야지'라는 생각을 할 것입니다.

여러 선배님과 멘토들로 받은 감사한 조언들

학문에 몰입하는 학자들을 가까이 하십시오.시작하는 절차를 생략하십시오. 우리는 시작에 구태여 의미를 부여하고 길일이나 적일을 찾다가 실기합니다.시·공간적으로 멀리 있는 위대한 학자보다 ‘자신보다 조금 더 나은, 그렇지만 가까이 있는 사람들’을 모델로 삼으십시오.

"20살이 될 때 까지 이뤄둔 게 없는건 부끄러운 거다, 정신차려라. 당연한게 아니다."

"애트리, 키사에서 진행하는 대학생 대상 프로그램을 잘 보아라. 대학생들과 경쟁하며 대학생만이 누릴 수 있는 특권이다. 정보를 공유하는 인간관계도 중요하다, 이런 덴 선후배도 없다."

"학부생은 학부생 다워야한다. 1학년이 연구실 가봤자 뭘 배울 수 있나? 조급하게 성과를 바라기보단 기반을 다지는 시기다. 성과는 인내를 거친사람만 얻을 자격이 있다."

"다른 고수 해커들을 보면서 의욕을 고무시켰다. 주변에 라이벌같은 친구,선후배를 만드는 것도 좋은 방법이다. 의지가 떨어질 때 가까운 라이벌과 멘토는 존재 자체만으로도 자극이 될 것이다."

"워게임 올클과 CTF에 부딛히며 공부했다. 처음엔 당연히 문제들 절망적으로 안풀리는데 상타고싶어 모르는걸 스스로 찾아가며 공부했다. 상 타고싶어 공부했고 실력 쌓아서 상 탔는데, 정말 기분 좋았다. 다른 회원들도 교내에서 CTF 같은 것 좀 자주 하면서 우물 밖의 고수들이랑 경쟁하고 성장했으면 좋겠다. 교내에만 있는건 가만히 있는것과 다름 없다."

"버그헌팅 경력이 있으면 모의해킹 회사에서 환영한다, 뭘 시켜도 잘할테니까. 그걸 위해 알아야 할 부분은 리버싱 당연히 잘해야하고, CS 기본기도 있고, 퍼져도 만들어 본 사람. 성격적인 부분은 호기심도 많았으면 한다."

"높은 수준의 해커가 되고싶다면 반드시 컴퓨터 사이언스를 탄탄히 하고, 해킹 전 수십일이 걸리는 피말리는 과정이 즐겁기 바란다. 그렇지 않으면 매일 매일 트렌드가 바뀌는 이 분야에서 무너질 것이다. 문서에 의존하지 말아라, 반드시 직접 해보는 것만 못할 것이다"

저작자표시 (새창열림)
    'Tech/ETC' 카테고리의 다른 글
    • 사이드 프로젝트 - Net Time Tester
    • 깃허브 이슈 로그가 쌓이는 문제 (이슈 작성 전략)
    • 좋은 주니어가 되기 위한 이력서/포트폴리오 작성법
    overist
    overist
    갓생살이를 위한 블로그

    티스토리툴바