How to think like a programmer

요즘 CS101 과목 조교를 하고 있습니다. 이 과목은 갓 대학에 입학한 학생들이 자바 언어를 배우는 과목입니다. 이 과목의 실험(프로그래밍하고 검사받는..) 조교를 하다보니 ‘일반인’의 사고는 우리 프로그래머와 완전히 다르다는 것을 깨닫게 되더군요.

예를들어, 예외 없이 모든 책들은 hellow world 예제로 시작합니다. 그러면 자바는

public class Blah {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

이 정도까지는 대강 따라합니다. 그냥 되니까요. 하지만 문제는 서서히 드러납니다. 예를들어서 두 점의 좌표를 기억하는 클래스가 있고

class Point {
    private double x;
    private double y;

  public void setX(double x2) {
    x = x2;
  }

  // and some setters and getters
}

나중에 이 Point를 사용해 무언가 유용한 일을 한다고 하죠. 그러면

class Circle {
  private Point center;
  private double radius;
  
  // some setters and getters here
}

오늘 여러 학부생의 코드를 봐주다보니, 여기서 “왜 Point를 써야하는가”, “왜 getter와 setter를 써야하는가”, “getter와 setter의 차이점은 무엇인가(이 질문이 왜 나오는지 이해가 되시나요? 아예 instantiation같은 개념도, 변수에 대한 개념도 거의 없는 상태입니다.)”, “public static void main(String[] args) 는 무엇인가” 등 정말 밑도 끝도 없는 질문들이 많았습니다. 물론 저는 제 나름의 best practice나 제 나름의 식견을 피력하지만, 그것이 얼마나 먹혀들어갈지는 의문입니다.

예를들어, “왜 setter와 getter를 써야하는가”란 질문에 ‘미래의 비즈니스 로직의 변경에 유연한 대처를 하기 위해서 주로 setter와 getter를 쓰는데, 그 로직의 변경이 일어날지 안일어날지도 모르는 상황에서 미리 setter와 getter를 만드는 것이 불필요한 일일 수 있다는 반론이 가능한 것은 사실이다. 하지만 자바에서는 통상적으로 변수를 선언하면 private 으로 만들고 이에대한 getter와 setter를 작성한다’고 대답하지만 이 답의 몇 퍼센트나 이해할까요.

우리가 흔히 아주 당연하게 받아들이고 있는 것들 – Object, Instance, Class, Variable, Method, Parameters, Return statement등 – 을 그 학생들은 전혀 이해하지 못합니다. static도 모르고, array도 모르고….

루비는 어떨까요? 루비는 이런 질문에 답해줄까요? 일단 루비는 2가지 이유로 적당한 대안이 되지 못합니다. 첫번째 이유는 부족한 문서때문이고, 두번째 이유는 어려운 언어이기 때문입니다. 예를 들어 루비는 hello world까지는 다음과 같이 넘어갑니다.

puts "Hello World"

다음, OOP는 반드시 짚고 넘어가게 되겠죠. 그러면 그 순간 또다시 왜 attr_accessor를 써야되는가부터 시작한 질문 러쉬가 들어올 것입니다. 이렇게 놓고 곰곰히 생각해봤더니 문제는 OOP가 무엇인가를 이해시키는 것이 어렵다는 것을 깨달았습니다. 과거에는 기껏해야 프로그램에 구조 – 구조체, 함수 등 – 를 부여하는데 지나지 않았던 문제 해결 기법이 이제는 객체 지향으로 탈바꿈 하면서 learning curve가 갑자기 높아져버린 것입니다. 아마도 한학기가 지나고나면 대다수 학부생들은 OOP가 뭔지는 모르고, 기껏해야 어떻게 하면 상속을 좀 더 할 수 있을까라는 쓸모없는 생각만 머리속에 남겠죠.

BASIC 이 돌아오지 않는한 이 문제는 쉽사리 풀리지 않을 거란 결론을 내린 하루였습니다. ㅎㅎ

Similar Posts:

Comments 9