Does Java need Checked Exceptions?

Tags:

Does Java need Checked Exceptions?

자바만이 예외를 반드시 잡도록 표시할 수 있는 기능을 갖고 있습니다. 하지만 이런 기능이 소프트웨어의 모든 reliability를 검증할 수 있을까요. 타입이라는 것이 모든 것을 검증할 수 있을까요. 정답은 당연하지만 ‘아니요’라는 것입니다.

루비같은 언어는 심지어 변수의 타입마저도 없애는데, 역시나 이로 인한 오타 문제 (예를들어 abc = 3이라고 해놓고 puts abb라고 찍는 문제)를 해결하기 위해 TDD를 강조하는 듯 합니다. 사실은 perl처럼 -w 옵션이 있어서 paranoia mode 로 변수의 잘못된 사용을 검증해내도록 할 수 있으나 완전하지 않습니다.

그런데 문제는 TDD의 테스트 케이스로 커버되지 않는 경우이고, 그걸 해결하기 위해서는 Test Case의 Coverage가 얼만큼인가하는 평가 문제가 등장하는 듯 합니다. 그럼, 모든 경우를 다 테스트 하기위해서는 분명히 모든 분기마다 테스트가 다 있어야하고 만약 분기문의 수가 n이라면 2^n개의 테스트 케이스가 필요할 테고, 당연히 이는 지수적으로 증가합니다. (만약 누군가 SE를 전공한다면 이 지수 증가의 문제를 어떻게 해결하는지 답해주세요.)

반면, code inspection을 통한 코드의 질 검사 역시 디버깅이나 테스트 만큼 좋은 효과가 있다고 이야기됩니다. 그렇다면, pair programming, TDD, code inspection phase의 세가지 조합이 좋은 소프트웨어를 위한 발걸음이 되겠죠.

그러나 이들도 모든 문제를 해결하지는 못합니다. 만약 모든 문제를 해결하는 방법론이 있다면 지금 우리가 이처럼 버그 많은 세상에 살지도, 보안 버그에 시달리지도 않을 것입니다. 대부분의 치명적인 버그가 stack smashing이나 integer overflow같은 것임을 감안한다면 말이죠..

TDD를 제대로 공부해 본적이 없었지만, 만약 정말 동적인 언어가 다음 세상의 대안으로 떠오르려면 다음과 같은 문제가 해결되야 할 듯합니다.

1) 동적 언어의 변수 타입을 컴파일 타임에 검사하는 기능
2) 동적 언어의 code completion을 코드 저장중간에 해내는 기능
3) TDD 테스트 케이스 개발을 위한 체계적인 방법론

1과 2는 대충 어떻게든 특정 정도까지 해낸다고 하더라도, 3번은 결코 풀기 쉽지 않은 문제가 될 것입니다. 이런 것들도 흥미로운 연구 주제라고 생각이 듭니다.

한편, 요즘은 사실 개발이라는 것은 알고리즘과의 싸움이 아닌가, 특히 21세기형 소프트웨어 개발자의 연구주제는 한정된 메모리를 가지고 무지막지한 사이즈의 데이터를 디스크에 저장한 상태로 빠르게 해결하는 것이 아닌가 하는 생각이 듭니다. 특히 이 부분에서는 storage보다는 speed가 주요 관건이 되겠죠.

또 다른 한편으로 지금까지의 디스크 기반 검색기법들은 지나치게 비 알고리즘적이라는 생각이 듭니다. 원래 CS와 Business Management의 사람들이 다르듯, network하는 사람/db하는 사람/알고리즘 하는 사람/인공지능 하는 사람의 성격이 서로 다르다고 하죠. 그것처럼 디스크에 저장한 뒤 알고리즘적으로 뭔가를 찾거나 저장하는 연구는 대부분 db에서 해왔는데, 지금까지의 방법은 메모리상의 알고리즘과는 매우 다르다는 생각이 듭니다.

이부분에 대해서는 확실히 말하기는 힘들지만, 예를 들어 algorithm을 하는 사람은 트리에서 검색을 한다고 하면 부모 a에서 자식 b로 가고 b에서 c로 가고, 그러니까 검색의 경로는 tree의 path length인데 이것이 O(logN)이다는 식으로 생각하죠. 하지만 디스크 기반 다차원 인덱스 구조인 R* tree같은 것을 생각해보면, 이러저러하게 구조를 만들고 몇개를 묶어 하나의 블록으로 놓고 그것을 다시 상위에서 또 묶어 또 블록으로 묶어주고.. 뭐 이런식으로 문제를 풀기위한 구조를 생각해내려는 것이 아닌가 하는 생각이 듭니다. 아 말로 하기 참 힘들군요 ㅎㅎ

또 다른 예를 생각해보면, 음.. 예를들어 fibonacci를 recusion으로 짰다면 T(N) = T(N-1) + T(N-2)인데 T(1)=1이니까 이를 시그마해서 어쩌구라고 생각하면 알고리즘 연구하는 사람들의 방식이고, 이것을 만약 내가 버퍼를 잡고 이것안에 T(0..N/r)까지의 결과를 저장해두고 이것을 디스크에 저장하고/부르는데, 캐시가 어쩌구 하는 식으로 생각한다면 디비를 연구하는 사람들의 방식이 아닌가 생각이 됩니다. 만약 그냥 정말 수학문제 풀듯이 디스크 상에서 돌아가는 알고리즘을 연구한다면 분명 전혀 다른 해결방법이 도출되지 않을까.. 라고 매우 추상적으로 요즘 생각하고 있습니다.

너무 추상적이군요;; 흐흐. 그러나 어쨌든 말로는 쉽게 하지 못하겠지만 경영부전공을 하다 한과목 앞에서 포기한 저로서는 분명히 경영전공자와 CS전공자의 차이는 있었고, 마찬가지로 CS내에서도 분야마다 사람들의 사고방식에 차이가 있다고 느껴집니다. 그리고 그 간극을 메꾸는 식으로 사고할 수 있다면 좋을텐데라고 생각하고요.

Comments

5 responses to “Does Java need Checked Exceptions?”

  1. abraxsus Avatar
    abraxsus

    음.. 자세히는 잘 모르겠고,
    피보나치를 풀겠다고 하면 나같으면 걍 피보나치 일반항을 때려넣겠네..
    막강 constant time&space아니겠나..
    음..

  2. 공성식 Avatar
    공성식

    재밌는 글이군요.
    저는 경영학을 전공했고, 프로그래밍은 cargo cult 식으로 배웠는데요,
    사실 경영학과 CS 간에 어떤 차이가 있는지는 잘 모르겠습니다.
    경영학은 좀 뜬구름 잡는 식의 이야기가 많고 프로그래밍은 뭔가 구체적인 이야기를 할 수 있다는 점이 학문적으로는 좀 다른 것 같아요.
    근데 학문의 적용 면에서는 오히려 경영자들이 더 현실적이고 프로그래머는 좀 이상적이라고나 할까요…

    코딩의 세계는 머리속에서 존재하는 버추얼한 느낌이 많이 듭니다.
    저는 그래서 코딩이 더 좋지만…

  3. MKSeo Avatar
    MKSeo

    @abraxsus: 매우 잘못 만든 메타포였어 피보나치 얘기는;;;; 느껴진다고 말로 다 할 능력이 안되네 내가;;

    @공성식: 음.. 사람이 달라요, 경영학도와 컴퓨터 과학도는. 어떻게 사람과 대화하는가, 심지어 뭘 하고 노는지도 많이 다를걸요;; 그렇지 않은가요;

  4. MKSeo Avatar
    MKSeo

    p.s. 음.. 가령 이런 예도 있죠.. 예전에 네트웍 수업들을때 강사님이 해준 얘긴데, ‘네트웍을 공부하는 사람들은 필기를 예쁘게 한다. 남자인데도 강의 노트에 깨알같이 정리를 잘 하더라’라고 하더군요. 아마 네트워크의 특성상 암기가 많고, 따라서 필기가 많고, 따라서 정리를 잘해야하고, 그러다보면 성격도 바뀌고.. 이렇게 되지 않을까요?

  5. abraxsus Avatar
    abraxsus

    그래.. 어쩐지 내가 네트웤쪽으로 애정이 안가더라니…
    일단 수많은 약어들에 압도당했음..
    동감!

Leave a Reply

Your email address will not be published. Required fields are marked *