컴퓨터공학과(& 기타 유사 4년제학과)에서 맨 처음 가르쳐야 할 것

보통 컴퓨터공학과, 내지는 이와 유사한 이름 등의 4년제 IT학과 혹은 학부의 경우, 1학년때의 커리큘럼은 거의 같습니다.

일단 1학기는 닥치고 C를 배우고, 양념으로 VB나 자바 등을 배우죠. 즉, 처음 들어와서 언어부터 떼고 시작하게 됩니다.

글쎄요, 저는 이 커리큘럼에 문제가 많다고 생각합니다.

일단 들어온 학생 중 대부분은 과 이름에 낚에서 왔거나, 커리큘럼을 쳐다보지도 않았거나, 컴퓨터공학과가 파코즈 정도 되는 줄 알고 들어온 애들이 대부분입니다. (실제로 후배 중 하나는 컴퓨터공학과에서 IBM호환 PC 하드웨어 배우는 줄 알고 우리 학부 들어왔답니다-_- 내가 미쳐-_-)

한 마디로 컴퓨터공학과가 뭘 하는 동네인지도 모르고 대충 점수 맞춰 온 애들이 대부분입니다(사실, 컴퓨터공학이라는 말에는 엄청난 세부 분야를 아우르는 통칭입니다만, 어쨌든 패스). 이런 애들에게 시작부터 언어를 가르쳤다간, 애들의 자퇴율 및 전과율만 높여주게 되죠.

이렇게 컴퓨터에 대해서 아무것도 모르는 애들을 앉혀다 C를 가르치고, 레포트를 내 주니 매년 좀 알려졌다 싶은, 진입장벽이 낮은 개발자 사이트들은 레포트철마다 애들 숙제에 시달리게 됩니다.

물론 애들이 하고자 하는 의욕이 없어서 그럴 수도 있지만, 가장 기본적인 것을 모르고 있어서 그런 것 같다는 생각이 듭니다.

즉, 컴퓨터에게 줄 명령은 알고 있어도, 명령을 주는 방법을 모르는겁니다.

애들은 죽어라 scanf나 printf를 외웁니다. 그게 대충 뭘 하는지는 압니다. 하지만 막상 "숫자를 입력받아 그 숫자를 출력해라"라는, 단순한 입력->출력 구조의 몇 바이트짜리 프로그램도 못 짭니다. 단순히 입력받아서 그대로 찍는 것도 그럴진대, 조금 더 복잡한 요구사항이 나오면 더 해괴망측한 코드가 나와버립니다.

예를 들어 위의 요구사항이 "입력받은 값을 a에 저장하고 출력하라"로 구체화가 되었다고 봅시다. 그럼 꼭 이렇게 코딩하는 인물이 나오게 되죠.

int a;

printf("%d", a);

뭐어 위 코드로도 값은 나옵니다. 그게 유저가 의도한 바이냐 아니냐가 문제지만. scanf("%d", a); int a; printf("%d",a);는 그나마 중수들-_-

초반부터도 저런 어려움을 겪고, 좀 아는 사람들의 설명도 그다지 이해가 되지 않고, 대1이면 놀고도 싶은 때인데 프로그래밍이 발목을 잡고, 이건 아무리 공부해도 답이 안 나오니 일찌감치 포기하는 애들이 속출하죠.

어쨌든 처음 언어를 배울 때 고생하는건 언어의 문법이 어렵다거나 해서가 아니라, 컴퓨터에게 어떻게 명령을 내릴 것인가, 즉 알고리즘을 어떻게 짤 것인가를 몰라서 어려움을 겪는 것이라고 봅니다.

제가 초등학교 2학년때(그러니까 지금으로부터 정확히 14년 전) 컴퓨터 학원에서 맨 처음 배운 게 순서도 그리는 연습이었습니다. 순서도 도형만 한 달 넘게 그리고 나서야 GW-BASIC을 실행시키고, 베이직 코드를 짜 넣기 시작했습니다.

순서도 그리는 연습 하면서 귀에 딱지 얹도록 들은 것 역시 있습니다. 프로그램 순서는 입력->처리->출력이네, Garbage in Garbage Out이네, 등등등등의 것들 말이죠.

이처럼 시작부터 언어를 배운 게 아니라, 일단은 어떻게 명령을 해야 컴퓨터란 놈이 알아먹을까 부터 간단히 배우고 나서 코딩으로 넘어가니, 그만큼 삽질이 줄었죠.

소프트웨어 공학의 사실과 오해라는 책에서 저자 역시 학생들을 가르칠 때 코드를 쓰는 연습보다 코드를 읽는 연습을 시키라고 하는데, 저도 이 이야기에 70%정도 동감합니다. 초보자들은 코드를 쓰는 것 자체, 다시 말해 언어의 문법을 배우는 것 보다는 코드를 쓰는 방법, 즉 순서(=순서도)나 컴퓨터에 명령을 내리는 방법(=알고리즘)을 먼저 배워야 한다고 생각합니다.

일단 한 학기 정도 순서도를 열심히 그리게 하다보면, 2학기부터 본격적으로 C문법을 가르쳐도 1학기부터 C를 잡은 애들보다는 낫지 않을까 싶습니다.

적어도 입력-처리-출력이라는 아주 기본적인 개념은 알고 있을테니, int a; scanf("%d", a); printf("%d", a);라는 아까보단 좀 나은 코드를 작성할 수 있겠죠. (하지만 여전히 문제는 있다는거-_-)

P.S. 순서도 대신 의사코드(psudo-code)로 가르치면 역효과입니다-_-;;;

by 별자리점 | 2007/10/18 00:47 | 이판사판공사판 | 트랙백 | 덧글(6)

트랙백 주소 : http://bluecode.egloos.com/tb/3862625
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by kiva at 2007/10/20 00:21
컴퓨터가 뭔지부터 가르쳐야돼. 프로그래밍언어가 왜 필요한지랑.
Commented by 사과농축액 at 2007/10/21 16:33
int a; scanf("%d", a); printf("%d", a); <- 요게뭐니. 너무 하잔아 ㅡㅡ;

이런 글 쓸려면은 적어도 오타정도는 확인 했어야지.

전체적인 알고리즘도 중요하지만 아무리 알고리즘이 좋다고한들 그걸 구현할만한 언어적 스킬이 없다면 도로묵이지 뭐!!
Commented by 별자리점 at 2007/10/21 18:35
사과농축액 // 의도된 오타다 이놈아
Commented by 201系 at 2007/10/23 04:28
.....뭐가 오타인지, 아니 그것보다 저 문장이 무슨 뜻인지 조차 모르겠습ㄴ.... <-
Commented by 클랴 at 2007/10/31 19:51
94년쯤인가... scanf("%d", a); 라고 했다가 볼랜드 C++ 2.0에서 따운되는 이유를 못찾아서 한시간쯤 헤멘 기억이 납니다. 아아 무서운 & 여
Commented by 공고생 at 2009/09/08 11:53
후....
c언어나 자바 배워서
컴투스 들어가고싶은데 ㅋㅋㅋㅋ
많이 어렵나요?.........ㅋ
공고에서 c언어 맛만봣는데
어렵더군요 ㅠㅠ

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶