메아리 저널

이번 학기에 프로그래밍의 이해라고 SICP 가지고 스킴으로 이것저것 하는 과목의 조교를 맡고 있는데, 뭐 원래 랩 세션 같은 게 없는 과목이라 조교가 할 일이 많지 않을 법 했지만 어젯밤에 숙제 채점을 하니 이건 뭐 삭신이 쑤셔서 조교질도 놀면서 할 수 없구나… 생각이 들었다. 음.

원래 대학원생 조교라는 사람들은 자기 할 일도 바쁜데 학교에서 조교 하라고 하길래 조교를 하는 것이기 때문에 첫째로 게으르고, 둘째로 시간이 없다. 이 말은 뭐냐 하면 나같이 굉장히 꼼꼼하게 채점을 하려고 노력하는 조교라도 일정 시간이 지나면 귀찮아져서 대강 대충 하게 되는 것이다. 그러니 좋은 점수를 받으려면 조교의 부담을 최대한 줄여 주는 쪽으로 가는 것이 좋다. 자료 구조를 썼으면 자료 구조 설명을 쓰든지 그림을 그려 놓던지, 코드를 잘 리팩토링해서 조교가 코드 검증할 때 나눠서 검증할 수 있게 하던지, 이도 저도 아니면 글씨나 잘 쓰던지… 나도 학부 때 이걸 잘 했다고는 못 하겠지만 조교를 편하게 하면 좀 더 점수를 잘 받을 가능성이 있는 건 사실이다. (왜냐하면 보통 그 과정에서 자기 틀린 걸 확인하는 경우도 있거든.) 학생들은 이걸 좀 유념하면 좋겠고.

이번 숙제에서 가장 어려운 문제가 맨 마지막에 데크(deque)1를 짜는 문제인 듯 하다. 스킴에서 이걸 구현하려면 각 노드가 앞뒤로 연결된 리스트가 필요한데 그냥 큐 구현하듯이 만들고 상수 시간 연산을 O(n)으로 구현한 녀석들이 보이기도 하고, (응당 동일해야 할) 머리와 꼬리를 뒤바꿨을 때의 코드가 원래 코드와 서로 같지 않은 경우도 꽤 있었으며, 원소 삭제 시에 데크가 비었을 때 말고도 데크에 원소가 하나 있을 때도 체크해야 한다2는 걸 간과한 학생들도 수두룩하다. 처음 열 명 정도는 코드를 일일이 하나 하나 검사해 가면서 성질을 파악했는데 워낙 비슷하게 틀리는 놈들이 많으니까 하나 하나 읽는 건 포기하고 그냥 체크리스트를 만들어 가면서 채점을 했는데, 생각보다 많은 학생들이… 맞는 코드를 똑같이 쓴 것도 아니고 틀린 코드를 똑같이 써서 (세부적인 것, 예를 들어 (car (cdr x))(cadr x)냐 등의 차이는 있다) 이게 흔히 범하는 실수인지 베껴서 낸 건지 도저히 알 수가 없다. 자료구조에 대한 아이디어가 없단 말인가. 이런.

하여튼 이제 여섯 시간 걸려서 채점 반 끝냈으니… 다른 조교한테 나머지 답안을 받아 와야 겠다. 사실은 내가 받은 답안 중에 스테플러로 제대로 안 찍어 내서 서로 섞여 있는 것 같은 녀석들도 있는데… 과연 나머지 답안에 내가 원하는 종이가 들어 있을까? -_- 없으면 0점 처리지 뭐.


  1. 머리와 꼬리에 상수 시간만으로 값을 넣고 뺄 수 있는 큐 비스무리한 자료구조. 

  2. 이걸 안 하려면 흔히 보초(sentinel)라고 부르는, 데크 앞 뒤에 안 쓰는 노드를 하나씩 더 넣어서 특수한 경우를 없애는 테크닉을 쓸 수도 있다. (대신 empty-deque? 같은 게 살짝 달라져야 한다.) 이렇게 구현했다면 코드를 다시 읽으면서 일일이 맞는지 체크를 해야 할텐데, 아직까지는(?) 이렇게 짠 사람은 없는 듯 하다. 


텀블러를 씁니다.