반응형

Java에서 사용자가 정의한 클래스를 java.util.HashMap에서 key 값으로 사용하도록 만들 때, Overriding 메쏘드 중에서 hashCode 메쏘드를 제대로 구현해야 문제없이 작동한다. 사용자 정의 클래스의 몇몇 멤버변수 값들이 다른데도 불구하고 hashCode를 제대로 구현하지 않으면 차이가 없는 것으로 판단할 수도 있기 때문이다.


C++에서는 map<const Key, T>이 비슷한 역할을 하는데, Java처럼 hashCode 함수 대신 operator < 함수를 써서 키값을 비교하는 것으로 생각된다. 

처음에는 operator = 함수만 신경써서 만들고, 실수로 operator < 함수의 내부 구현을 대충 했더니, map의 key로 서로 다른 멤버변수 값을 갖는 클래스를 대입했는데 모두 같은 value를 리턴하는 것이었다.


내 경우에는 네트워크 상의 트래픽을 표현하기 위해 Flow라는 클래스를 아래와 같이 정의했다.


class Flow {

public:

std::string srcIp;

int srcPort;

std::string dstIp;

int dstPort;

int type;

Flow();

~Flow();

};


그리고 실수로 "operator <" 함수를 아래와 같이 간단하게 만들었더니,


bool Flow::operator <(const Flow& ref) const {

return (this->srcPort + this->dstPort) < (ref.getSrcPort() + ref.getDstPort()));

}


source 또는 destination IP 주소가 서로 다른 여러 개의 flow가 모두 같은 key 값을 갖게 되는 문제가 발생했다.


그래서 std::string 형식의 IP 주소에서 숫자를 빼내서 이것들도 모두 더하는 방식으로 operator <를 구현해서 key 값이 서로 달라지도록 만들었다.


bool Flow::operator <(const Flow& ref) const {

return ((convert(this->srcIp) + this->srcPort + convert(this->dstIp) + this->dstPort) < (convert(ref.getSrcIp()) + ref.getSrcPort() + convert(ref.getDstIp()) + ref.getDstPort()));

}


이런 부분에서의 실수는 컴파일 에러에서 전혀 잡히지 않고, 가끔은 Segmentation fault 같은 에러조차 발생시키지 않고서 정상적이면서 의미상으로만 이상하게 작동하기 때문에 앞으로는 더 주의해야 할 것이다.



반응형
블로그 이미지

Bryan_

,
반응형


C/C++, Java로 코딩을 하다가 가끔 접하는 상황이 있는데, 같은 목적을 if-return의 조합과 if-else의 조합 모두로 코딩할 수 있을 때 어느 것을 선택해야 하는지에 대한 것이다.


int runSomeFunction(int a, int b){

if(condition_A){

return A;

} else {

do_something_1();

do_something_2();

}

}


--------------------------------------------------------


int runSomeFunction(int a, int b){

if(condition_A){

return A;

}


do_something_1();

do_something_2();

}


조건이 1개만 있을 때는 둘 사이에 별로 차이가 나지 않는 것 같다. 하지만 첫번째 조건 이후에 또다른 조건을 검사해야 하는 2개 이상의 nested condition이 생기면 조금 다르게 보이기 시작한다.



int runSomeFunction(int a, int b){

if(condition_A){

return A;

} else {

if(condition_B){

   return B;

} else {

   do_something_1();

   do_something_2();

}

}

}


--------------------------------------------------------


int runSomeFunction(int a, int b){

if(condition_A){

return A;

}


if(condition_B){

return B;

}


do_something_1();

do_something_2();

}


아무래도 indent가 nested condition의 수만큼 더 깊어지는(?) 문제가 생긴다. 사실 둘 사이에 성능상의 차이는 거의 없다고 보이고, 결국 코딩 스타일이나 가독성의 문제로 귀결되는 것 같다.


개인적으로는 if-return으로 처리하는 것을 선호하지만, 꼭 모든 경우에 다 if-return이 가독성이 좋다고 보기도 애매할 때가 있다. 가령, nested condition 정도가 심하지는 않으면서 각 조건마다 실행해야 하는 코드의 양이 비슷하면,



int runSomeFunction(int a, int b){

if(condition_A){

do_something_1();

do_something_2();

do_something_3();

do_something_4();

} else {

do_something_5();

do_something_6();

do_something_7();

do_something_8();

}

}


--------------------------------------------------------


int runSomeFunction(int a, int b){

if(condition_A){

do_something_1();

do_something_2();

do_something_3();

do_something_4();

return;

}


do_something_5();

do_something_6();

do_something_7();

do_something_8();

}


이런 경우에는 if-else가 서로 다른 조건에 대한 코드들의 차이를 알아보기에 더 좋은 것처럼 보인다.


if-return이 가장 효과적일 때를 생각해 본다면, 초반에 input parameter라던지 변수의 null 여부 같은 것을 확인해서 함수/메쏘드 나머지 부분의 실행 여부를 판단해야 할 때가 아닐까?


int runSomeFunction(int a, int b){

if(var_A == NULL) return;

if(var_B < 0) return;


do_something_1();

do_something_2();

do_something_3();

do_something_4();

}



결론적으로, if-else와 if-return 사이에 성능의 차이는 별로 없기 때문에 본인의 코딩 스타일과 가독성을 생각해 가면서 그때그때 상황에 맞게 정하는 수밖에 없겠다. Indentation을 많이 하는 것을 선호하지 않는다면 if-return 조합으로 코딩하는 비중이 좀더 늘어나는 정도로 생각하면 될 것 같고, 그게 꼭 정답이라기보다는 개인마다 가독성에 대한 기준도 다르니까, 맞춰서 쓰면 될 것이다.



<참고자료>

[1] http://stackoverflow.com/questions/9267643/if-return-vs-if-else-efficiency


반응형
블로그 이미지

Bryan_

,
반응형

오늘 어쩌다 뉴스기사를 보게 되었는데,


[이코노미조선] 커피 달고 사는 직장인들…파킨슨병에 치매까지 발전 가능해 [1]


그런데 황당한 것은, 구글에 "커피 파킨슨병"으로 검색하면,



이런 내용들이 일관되게 첫 페이지에 검색 결과로 나온다. 게다가 위의 3개 기사는 모두 의학저널에 게재된 논문의 결과를 인용하고 있으며, 각 기사마다 인용하는 논문과 그 연구를 진행한 연구팀이 다 다르다.


[2] 미국 하와이 호놀룰루 재향군인 메디컬 센터, 미국의학협회지(JAMA), Neurology 분야 저널 랭킹 9위

[3] 캐나다 맥길 대학 의과대, 신경학(Neurology) 저널, Neurology 분야 저널 랭킹 10위

[4] 미국 마이애미 대학교 의과대학, Archives of Neurology, Neurology 분야 top 50위 안에는 없음.


더 확실하게 보기 위해서 좀더 상위 랭킹에 있는 저널에도 카페인(또는 커피)가 파킨슨병에 미치는 영향을 분석한 연구가 있는지 봤더니, 있었다.


[5] Alberto Ascherio MD et al., "Prospective study of caffeine consumption and risk of Parkinson's disease in men and women", Annals of Neurology, doi:10.1002/ana.1052, 2 May 2001.


Neurology 분야 top 랭킹 4위 저널에서도 위와 같이 연구결과가 있었고, 카페인을 전혀 섭취하지 않는 성인남성에 비해 카페인 섭취량이 많은 성인남성이 파킨슨병 발병 위험이 42%로 나왔다.



반면에 저 이코노미조선 기사 [1]에서는 연구 결과에 대한 인용이 전혀 없고, 다만 커피를 많이 마실 때 발생할 수 있는 손떨림 같은 증상과 파킨슨병에서도 일어나는 유사 증상을 근거 없이 연관지어서 설명하고 있을 뿐이다.


커피를 과다하게 마셔서 수전증이 일어나는 것은 사실이고,

파킨슨병의 초기 증상으로 손떨림이 일어나는 것도 사실이다.

그러나 커피를 과다하게 마시기 때문에 파킨슨병 발병으로 이어진다는 근거는 어디에도 없다.



결론적으로 "CEO 뇌 건강"이라는 중요하고 무게감 있어 보이는 특집을 달고 나오는 기사가 공신력 있어 보이는 신경학 분야 국제저널 top 4위, 9위, 10위의 연구 결과들을 모두 공격하는 위엄(?)을 보여주고 있다.


물론 의학 쪽으로는 연구가 워낙 case-by-case이기도 하고, 각 연구 결과마다 통제변인이 다양할 뿐더러, 통제변인 중 일부를 조금만 바꿔도 상관관계가 없어지거나 반대로 나타나는 등 온갖 복잡한 상황이 다 일어나는 것은 충분히 인정할 수 있다. 하지만 그 case-by-case 때문에 커피가 파킨슨병에 나쁘다는 이야기를 하고 싶으면 최소한의 근거로 공신력 있는 연구 결과를 인용했어야 한다.


적어도 지금까지의 결과들을 놓고 봐서는, "카페인이 파킨슨병의 발병을 방지하거나, 치료효과를 주기도 한다"는 명제가 더 우세한 상태다. 이것을 뒤집고 싶으면 마찬가지로 신경학 분야의 최상위 랭킹 저널에 누구든지 납득할 만한 실험 환경과 수치화된 데이터를 근거로 조심스럽게 설득을 시작해야 하는 것이지, 조선비즈의 기사처럼 오히려 비논리적으로 주장해서는 안 된다.




<참고자료>


[1] [이코노미조선] 커피 달고 사는 직장인들…파킨슨병에 치매까지 발전 가능해

http://biz.chosun.com/site/data/html_dir/2017/03/27/2017032703095.html?main_hot2

[2] 커피 파킨슨병 예방 효과, http://www.foodnews.co.kr/news/articleView.html?idxno=3377

[3] 하루 커피 2잔이면 파킨슨병 치료도 가능해 

http://news.khan.co.kr/kh_news/khan_art_view.html?artid=201208022152401&code=930401 

[4] 담배와 커피가 파킨슨병 발병위험 낮춘다

http://www.sciencetimes.co.kr/?news=%EB%8B%B4%EB%B0%B0%EC%99%80-%EC%BB%A4%ED%94%BC%EA%B0%80-%ED%8C%8C%ED%82%A8%EC%8A%A8%EB%B3%91-%EB%B0%9C%EB%B3%91%EC%9C%84%ED%97%98-%EB%82%AE%EC%B6%98%EB%8B%A4

[5] Alberto Ascherio MD et al., "Prospective study of caffeine consumption and risk of Parkinson's disease in men and women", Annals of Neurology, doi:10.1002/ana.1052, 2 May 2001.

http://onlinelibrary.wiley.com/doi/10.1002/ana.1052/full



반응형
블로그 이미지

Bryan_

,
반응형

작년(2016년) 이맘때쯤에 연구를 하다 말고(ㅜㅜ) 구글 코리아에 지원을 했다가 떨어졌었다. 벌써 1년이나 지났다.


구글 채용 절차는 서류전형(온라인으로 CV 보내는 게 전부), 전화 일반면접(대화와 질의응답), 전화 코딩면접, 현장면접, 입사의 순서인데, 작년에 지원하던 당시에 나는 전화 코딩면접만 두 차례 겪어보고 떨어졌다. 기왕 떨어지더라도 현장면접까지는 가 봤어야 하는데, 내가 현장면접을 할 정도의 실력이 되지 못했다는 반증이니 달리 할 말이 없다. ㅠㅠ 그래서 현장면접에서 어떻게 해야 하는지에 대해서는 한 마디도 쓸 수 없다. 나중에 혹시 또 지원하게 되면 + 현장면접까지 겪어볼 수 있게 된다면 그 때 추가하는 걸로

 

비록 1년 전의 일이지만 그 당시의 경험을 따로 어딘가에 기록해 두지 않았기에, 여기에 기록하면서 앞으로 professional (우리말로 딱 표현하려니 잘 떠오르지 않는다)한 소프트웨어 엔지니어 또는 연구원이 되기 위해서 어떤 노력을 해야 할 지 생각을 정리해보려 한다.

 

일단 구글의 소프트웨어 엔지니어 채용 스타일은 굳이 쓰지 않더라도 잘 알려져 있고, 유튜브에는 구글 코리아가 올린 현장면접 예시 영상도 있다. [1] 게다가 최근 구글의 채용 스타일을 꽤 많은 IT 대기업들이 따라 하고 있다. LG전자 CTO의 소프트웨어 직군 면접의 일부도 그랬었던 기억이 있다.

 


*지원부터 전화면접까지의 과정 개요


나는 링크드인에서 구글 코리아 소프트웨어 엔지니어 지원 페이지에 CV를 보냈는데(링크드인 프로파일을 CV로 변환해서 첨부함), 서류 통과 후에 구글 재팬(?)에서 영어로 면접을 보자는 메일이 왔다. 그래서 전화상으로 대화를 하고 질의응답을 하는 면접은 구글 재팬에서 일하는 소프트웨어 엔지니어와 영어로 진행했다. 지원대상은 구글 코리아였는데 왜 구글 재팬에서 연락이 왔는지는 잘 모르겠다. 그냥 어느 branch에 가던지 상관 없이 회사 전체적인 입장에서 면접 가능한 엔지니어를 배정한 것인지, 아니면 일본 branch에서 실제로 관심이 있었는지는 알 수 없다.

 

전화상의 코딩이 아닌 일반면접 후에 전화 코딩면접을 할 때에는 다행히도 구글 코리아에서 한국인 소프트웨어 엔지니어가 전화를 걸어 와서 한국어로 편하게(?) 면접을 진행할 수 있었다.


전화 코딩면접은 두 번을 했는데, 사실 전화 코딩면접은 한 번만 하고 당락을 결정하는 게 일반적인 듯 하다. 내가 왜 전화 코딩면접을 두 번 했는지 정확한 이유는 사실 알 수 없다. 굳이 추측하자면, 내가 첫 번째 전화면접 후에 당락의 경계선 상에 놓이게 되면서 현역 엔지니어들이 보기에 긴가 민가해서(…) 한 번만 더 기회를 줘 보자고 생각했을 지도 모르겠다.

아니면 조금 더 부정적으로 보자면, 내가 비록 첫 번째 전화면접에서 망했지만(ㅠㅠ) 그럼에도 불구하고 혹시나 지원자가 애석하게도 문제가 잘못 걸려서 못했을 지도 모르니 다른 문제를 내서 한번 더 역량을 발휘할 기회를 줘 보자는 생각이었을 수도 있다. 결국 두 번째 전화면접 이후에 다시 구글 재팬에 있던 맨 처음 전화로 얘기했던 엔지니어로부터 탈락 통보를 이메일로 받았다.

 

전화 코딩면접 진행 과정은 잘 알려져 있듯이 사전에 이메일로 공유된 구글 문서를 켜고, 휴대폰으로 걸려오는 전화를 통해서 문제를 전달받고, 30분 동안 그 문제를 해결하는 코드를 구글 문서에 작성한다. 중간에 엔지니어와 계속 전화상으로 대화하면서 진행한다.

 

첫 번째 전화 코딩면접 때는 문제를 정확하게 이해하지 못하는 바람에 알고리즘 제시는 못했고, 어찌됐든 컴파일 에러나 로직 에러(스택오버플로우, 익셉션 따위) 없이 돌아가는 코드를 제출하기는 했다.

두 번째 전화 코딩면접 때는 문제를 제대로 이해했고 어떻게 해결하면 되는지 해결 방법도 개념상으로는 맞게 제시했지만, 막상 내가 짠 코드에 컴파일 에러뿐만 아니라 스택오버플로우 문제마저 있는 상태로 제출해 버렸다. ㅠㅠ

(문제가 무엇인지는 왠지 함부로 공유하면 안될 것 같아서 일부러 언급하지 않았다.)

 

 

위의 두 차례의 전화 코딩면접을 겪으면서 나의 어떤 부분이 부족했는지를 생각해 보았다.

 

*알고리즘과 코딩실력: 두 마리 토끼 모두 잡기


위에 언급했듯이 나의 첫 번째와 두 번째 코딩면접 결과를 보면 알고리즘 이해도코드의 완성도, 이 두 가지 측면에서 서로 다른 한계를 갖고 있었다. 알고리즘을 정확히 이해해서 문제 해결방법을 제대로 짚기도 해야 하지만, 결국 그걸 주어진 시간 안에 집중적으로 코딩해서 실제로 돌아가는 코드를 만들어내는 능력이 있는지도 같이 검증하는 것이 아닐까 싶다.

구글 입장에서도 이익을 극대화하려면 같은 소프트웨어 엔지니어라도 기본기가 있어서 재교육 비용이 가급적 적게 드는 인재를 원할 테니까 당연한 것일 수 있다. 면접 과정에서 프로그래밍 언어의 선택권이 지원자에게 있는 만큼, 그만큼 지원자 입장에서 가장 자신있는 프로그래밍 언어를 들고 왔을 테니 적어도 문제없이 코드를 짤 수 있어야 한다는 전제가 깔려 있을 것 같다.

 


*코딩면접 이전의 일반 전화면접의 중요성


이 부분은 이전 포스팅(http://skylit.tistory.com/189)에서도 썼지만, 채용에서 떨어진 후에 다시 생각하면서 반복해서 쓰게 되었다.

지금 다시 생각해 보면, 전화 코딩면접을 하기 전에 구글 재팬 소프트웨어 엔지니어와 나눴던 대화가 의외로 중요했으리라는 생각이 든다. 그 당시에 나 자신의 역량에 대해서 여러 분야별로 1~10점 사이의 점수를 매겨 보라는 질문을 받았는데, 그 때 멋모르고 Java 언어를 조금 높게(7) 제시했더니 엔지니어가 살짝 당황하는 눈치였다. 그리고 이어서 들어오는 Java 언어의 자세한 속성들에 대한 질문에서 제대로 대답하지 못하고 실컷 털리고 보니 내가 점수를 뻥튀기한 셈이 되어 버렸다. ㅜㅜ

그리고 알고리즘은 내가 4점 또는 5점이라고 대답했던 것 같다. 이 경우는 비록 그 당시에 대답하던 당시에는 나의 가감없는 실제 실력을 그대로 보여주는 점수라고 할지라도, 차라리 그 전에 미리 알고리즘 개념을 복습을 좀 하고서 6점 정도가 된다고 자신 있게 이야기할 수 있어야 했다. 알다시피 구글은 알고리즘을 특히나 중요하게 생각하는데 이미 그 역량에서 내가 한 수 접고 들어간 것이다. ㅜㅜ

, 코딩이 아닌 일반 전화면접이고 그냥 대화를 나눈다는 식으로 안내가 오더라도 그 메일에 속지 말고(?) 전산학의 주요 분야를 충분히 복습해야 한다.

 


*트렌드보다는 기본기가 충실한 것이 더 중요하다.


IT분야의 큰 트렌드에 따라 시기별로 회사가 유난히 원하는 소프트웨어 엔지니어의 종류도 어느 정도 있게 마련이다. 가령 2000년대 중후반에는 정보검색 기술, 2010년대 초반에는 빅데이터, 수 년 전부터 지금까지는 IoT와 클라우드, 최근에는 인공지능 등

그런데 구글은 일반 소프트웨어 엔지니어 채용 과정에 있어서는 그런 트렌드를 별로 고려하지 않는 듯한 느낌이 들었다. (트렌드에 적합한 실력 있는 인재는 그 회사를 인수하는 방법으로 충당하는 것일지도?)

내가 얼마나 지금의 트렌드에 적합한 인재인지에 대한 자기PR은 서류 전형에서 조금이나마 영향을 줄 수는 있을 지도 모른다. 하지만 전화 코딩면접에서는 정말 내가 학사인지 석사인지 박사인지는 전혀 중요하지 않았고, 내가 석/박사과정을 하면서 나름대로 확보했다고 생각되는 경쟁력에 대해서는 통화를 시작할 때 단 한번 물어보고 끝났다. 예를 들면,

 

첫 번째 전화 코딩면접 당시:

엔지니어: 지금 박사과정 하면서 어떤 연구를 하고 있죠?

: , IoT 서비스 플랫폼을 개발하고 그 중에서도 무선 네트워킹을 서비스 종류별로 효율적으로 해주기 위해서 블라블라~~~ … (1분 뒤)


엔지니어: , 잘 알겠습니다. 자 그럼 문제를 내도록 하죠.

: ……

 

두 번째 통화에서도:

엔지니어: 최근에 연구하면서 무엇을 개발했나요?

: , 라즈베리파이와 일반 가전기기를 연동해서 스마트한 IoT 기기로 만들고 그들을 서로 연결해서 블라블라블라~~ (1분 뒤)


엔지니어: 그 과정에서 무엇이 가장 어려웠나요?

: (오 의외로 다른 질문이!) 

: , IoT 기기들을 실제로 회의실, 휴게실 같은 공간에 설치하고 IoT 소프트웨어 플랫폼 올리고 우리만의 스마트 기기 코드를 짜서 올려서 돌아가게 만들 때 블라블라블라~~ (1분 뒤)


엔지니어: , 알겠습니다. 그럼 문제를 내겠습니다.

: …… (ㅠㅠ)

 

결론적으로, 구글은 나의 석/박사 연구주제나 논문에 관심이 없다. ㅠㅠ /박사과정을 통해서 습득한 연구능력이 산업 현장에서 일어나는 문제를 제대로 정의해서 해결 방법을 체계적으로 제시하는 것으로 발현이 되는지를 코딩면접을 통해서 검사할 뿐이다. , 내가 과거에 석/박사 연구를 얼마나 체계적으로 잘 수행했는지를 확인하는 대신, 그렇게 연구를 잘 했으니까 instant하게 주어지는 문제 상황에 대해서도 본인이 잘 대처하는지 증명해 보라는 식이다.

 

해외, 국내를 막론하고 차라리 다른 회사들이라면 나의 박사학위 연구 주제에 대해서 물어볼 만도 하고, 어느 학회나 저널에 냈는지에 관심을 가져 주거나 연구실에서 수행한 프로젝트가 회사가 필요로 하는 일과 얼마나 연관성이 높은지 정도를 생각해볼 만도 한데, 구글 소프트웨어 엔지니어는 그런 거 없다. 그냥 소프트웨어 엔지니어 개인이 기본기와 문제해결능력이 충분하면 어떤 문제를 던져 줘도 잘 해결할 것이라는 단 하나의 원리만 갖고서 채용하는 것처럼 느껴졌다.

물론 구글도 개발이 아닌 연구 부서가 없을 리가 없겠지만 잘 알려져 있지 않으니까적어도 구글이 생각하는 소프트웨어 엔지니어 범주에서는 학위를 별로 신경쓰지 않는 것만은 확실하다.

 

이것을 바꾸어 생각해 보면, 결국 내가 석/박사과정을 충실하게 보냈는지를 과거 기록에 의존하지 않고 검증하는 것과 같다. 모든 교수님들이 얘기하듯이 대학원에서 배우는 핵심은 문제 정의와 문제 해결 능력이고, 이것은 스펙만으로 일대일 대응으로 증명되지는 않는다. , 문제해결능력이 뛰어난 석/박사가 논문을 잘 쓰고 프로젝트를 성공적으로 수행하는 것은 참이 되지만, 좋은 논문실적과 좋은 프로젝트 수행 실적이 개인의 문제해결능력을 역으로 증명해 준다고 볼 수는 없다는 것이다.

 


*결론: 어려운 문제를 대하는 태도의 문제


비록 전화 코딩면접에서 떨어졌지만, 내 입장에서는 꽤 중요하고 값진 경험이었다. 내가 알고리즘 설계와 코딩 실력이 어느 정도 되는지를 점검할 수 있는 기회였고, 한편으로는 말로 설명하는 나의 역량과 실제로 드러나는 나의 생산성 사이에 존재하는 괴리를 직접 확인할 수 있었다.


최근에 자꾸 연구과제 등 신경쓸 것이 많다는 핑계로 개인연구가 점점 미뤄져 가는 현실을 한탄하고 있지만, 정작 이러한 도전적인 상황에서 문제해결능력과 코딩면접 때와 같은 집중력으로 지금의 상황을 돌파해 내지 못하는 내 모습을 다시 확인할 수 있었다. ㅜㅜ 내가 박사학위를 내 손으로 내 실력으로 받기 위해서는 지금의 내 모습에서 한두 단계는 더 역량을 업그레이드해야 한다는 것도 다시 느끼게 되었다.


개인연구에서 제시하는 문제 상황을 시뮬레이션이나 실험 코드로 구현해서 측정하고 그걸 증명하는 과정에서 쉽게 코딩이 되지 않을 때가 자주 있는데, 사실 그 때 문제를 해결하는 것이 어쩌면 구글 전화 코딩면접을 하는 과정과 다를 바가 없는 것 아닐까? 어려움에 봉착했을 때, 귀찮아하면서 좀더 쉬운 과제 문서작업이나 연구실 허드렛일들(서버 관리 등)을 하며 의도적으로 회피했던 내 모습이 부끄럽다. 그럴 때 문제에 직면해서 해결 방법을 설계하고 그 방법을 집중해서 구현하면서 (비록 에러가 나거나 버그가 발생하더라도) 반복적으로 검증함으로써 점차 나만의 문제 해결 능력과 코딩 능력을 쌓아 가는 태도가 필요하다.


무턱대고 방향성 없이 하는 노력이 아니라, 나의 궁극적인 목표(박사학위)를 달성하는 과정에서 일어나는 온갖 문제들을 어떻게 해결할 지를 생각해 가면서 꾸준하게 집중적으로 노력하는 나 자신이 완성될 때까지는 힘들지만 매일매일 회피하지 말고 노력해야 하겠다.


 

<참고자료>

[1] https://www.youtube.com/watch?v=BF3FLDAzWxo


반응형
블로그 이미지

Bryan_

,
반응형


역시 뭘 해도 정부/공기관 사이트가 가장 말썽이다.


안 그래도 일반 사기업 웹사이트에서도 불편한 온라인 결제 또는 공인인증 관련된 작업이 정부 사이트에서는 문제가 몇 배로 증폭되는 경우를 쉽게 볼 수 있다.

여기서는 그 여러 경우들 중에서 우체국 쇼핑몰의 사례를 설명한다.



*발단: 우체국에서 쇼핑을 하고 싶을 뿐인데...


아내가 집 컴퓨터(윈도우 10)에서 우체국 쇼핑(http://mall.epost.go.kr)에서 대추차를 사려고 했는데, 크롬 브라우저에서도 실패하고, 인터넷 익스플로러에서도 마찬가지로 결제가 안돼서 주문을 실패했다고 한다. 그러면서 나한테 사이트 링크를 보내 주면서 대신 좀 결제해 달라고 요청을 해 왔다.


이 때까지만 해도 나는 그래도 플러그인 설치가 좀 많을 뿐이지 문제없이 잘 될 거라 생각하고, 연구실 PC에서 크롬 브라우저를 통해 우체국 쇼핑몰에 들어가 보았다.



*문제의 시작


일단 맨 처음 우체국 쇼핑몰 사이트에 들어가면 내가 어디서 무엇을 하던지 관계없이 다짜고짜 nProtect Online Security 1.0부터 설치를 강요한다. 이미 내 PC에는 금융권 사이트를 방문하기 때문에 nProtect Online Security가 설치되어 있지만 그런 것은 전혀 상관없다. 무조건 설치해야 한다.

사실 nProtect 자체를 설치하는 과정에서는 문제가 일어난 적은 없었기에, 군말 없이 그냥 설치했다. 설치를 거부하고 맞서 봐야 웹페이지가 더 진행되지도 않을 테니 얻을 수 있는 이득도 없고...



본격적인 문제는 "결제"를 진행할 때부터 일어났다. 일단 상품 페이지에서 결제하기 버튼을 눌렀더니, 이제 크롬에서는 NPAPI를 지원하지 않기 때문에 결제를 할 수 없다는 안내가 뜬다.




그래, 그럴 수 있다.

저기 최상단에 표시되는 KG Inicis 로고만 봐도 알 수 있다.


KG Inicis도 간편결제 서비스가 있겠지만, 아마 우체국 쇼핑몰에 붙어 있는 것은 액티브X 같은 플러그인 방식이니까 저런 경고가 떴겠지. 만약 결제 옵션이 정말로 카드결제밖에 없었다면, 저 안내 메세지는 사실이고 나는 선택의 여지 없이 인터넷 익스플로러를 썼을 것이다. 



하지만...


하지만 아이러니하게도, 주문 페이지의 맨 아래쪽에 가 보면 저 경고 메세지와 아무런 관련이 없는 "간편결제" 옵션이 그것도 한두 개도 아니고 다섯 개나 있다.


(우체국 쇼핑몰에서 2017년 3월 현재 지원하는 간편결제 옵션들.)



아니 왠일로 우체국 쇼핑몰에서 간편결제를 다섯 개나 지원하는 것일까? 

나는 간편결제가 단 한 개도 없을 줄 알았는데, 저 정도면 꽤 잘 해주는 거잖아?

그러면 우체국 쇼핑몰이 간편결제의 본래 목적과 의미를 알고 있는지 의심이 가기 시작한다. 


간편결제는 운영체제나 브라우저, 플러그인에 상관 없이 어디서나 문제없이 동일한 방법으로 결제하기 위해서 나온 개념이다. 윈도우를 쓰든, 맥OS를 쓰든, 리눅스를 쓰든, 심지어 스마트폰 OS에서도 아무 웹브라우저나 켜서 결제를 진행해도 문제없이 잘 되어야 간편결제다. 따라서 간편결제에서는 크롬 브라우저가 NPAPI가 되고 말고가 상관이 없어야 하는 것이다. 그런데 우체국 쇼핑몰은 결제 옵션에서는 간편결제를 걸어 놓고, 팝업창에서는 크롬에서 더이상 결제할 수 없다는 이율배반적인 안내를 하고 있다. 


우체국 쇼핑몰에서 "신용카드(일반)" 또는 "휴대폰결제" 같은 옵션을 선택했을 경우에는 저 경고가 유효했을 텐데 그걸 선택적으로 표시하지 않고 일단 무조건 경고창이 뜨도록 웹페이지를 잘못 만든 것은 아닐까 하고 추측해 본다.



*비극의 정점


일단 간편결제 옵션이 있고 간편결제 본래의 목적을 믿으니까, 나는 위의 팝업 경고를 무시하고 결제를 진행해 보기로 했다. 마침 계정을 가지고 있는 "시럽페이"를 선택하고 "결제하기" 버튼을 눌렀더니...


(윈도우10, 크롬 브라우저에서 "시럽페이" 간편결제를 진행하고 나서 표시된 먹통 상황)


...역시 헛된 기대를 했던 것일까?

시럽페이 결제를 진행하는 팝업 페이지까지는 떴는데, 그 뒤로 더는 진행하지 못하고 결국 크롬은 먹통이 되었다.

저 화면에서 팝업창을 종료하고, 크롬 브라우저 창까지 종료 버튼을 눌렀는데 거의 10여 초를 넘게 기다리고 나서야 종료가 되는 것이었다.


...하지만 여기서 끝이 아니었다. 이렇게 결제만 실패하고 상황이 종료되면 그나마 다행이었을 것이다. 이후로 윈도우10은 거북이마냥 대부분의 명령에 반응을 한참 느리게 하기 시작했고, 심지어 "작업 관리자"는 아예 실행조차 되지 않았다. 분명히 우체국 쇼핑몰에서 결제하기 전까지는 멀쩡하던 컴퓨터가 위와 같이 결제 시도를 한번 하고 나서는 아주 못 쓸 상태가 되고 말았다.


결국 재부팅하기로 결정하고 윈도우10에서 시스템 재시작을 시켰는데, 그마저도 되지 않는 것이었다. "다시 시작하는 중" 화면만 10분이 지나도록 바뀌지 않는 상황을 겪고 나서, 결국 본체의 Reset 버튼을 눌러야만 했다. 리셋 버튼을 누르는 행위가 PC 하드웨어에 무리를 줄 위험이 있다는 것은 말하지 않아도 누구나 알고 있을 것이다.


분명히 말하지만 내 PC는 우리은행, 국민건강보험 사이트 외에는 들어가서 뭔가 설치한 적이 없는 꽤나 청정한(?) 상태였고, 오피스나 개발환경 외에 특별한 프로그램이 설치되어 있지도 않은 상태였다.


...이렇게 내 연구실 PC는 만신창이가 되었다.



(시럽페이 소개 페이지의 일부.

간편결제는 위와 같이 아무 데서나 잘 되니까 간편한 것이다.)




*간편결제도 간편하지 않게, 이것이 정부의 능력?


정말 여러가지 의미로 대단하다.

일개 사기업의 간편결제 따위는 정부 앞에 아무 것도 아니라는 것을 보여주기라도 하듯이, 간편결제도 불편하게 만드는 공기업의 능력이 참 대단하다.

개인 쇼핑몰만도 못한 안정성을 개선할 생각은 없고, 모든 사용자를 강제로 인터넷 익스플로러를 쓰도록 해서 군말없이 위에서 시키는 대로나 하라는 경직된 문화가 어쩜 이렇게 온라인 상에서도 예외 없이 일관되게 나타나는지 참 대단하다.




*인생사 새옹지마?


윈도우 PC가 재부팅되기를 기다리는 동안, 혹시나 해서 연구실에서 쓰고 있는 우분투(Ubuntu; 리눅스 운영체제의 한 종류)에서 우체국 쇼핑몰을 방문해 보았다. 정말로 아무런 기대를 갖고 있지 않았다. 그냥 못 먹는 감 찔러나 보는 심정이었다.




...어?


원래 윈도우 PC에서는 일단 방문하자마자 nProtect Online Security부터 설치하라고 시키더니 여기서는 아무 것도 뜨지 않는다. 로그인을 하는 동안에도 아무 문제가 없었다.


일단 사려고 했던 대추즙 주문 페이지까지 가 보았다.

크롬에서 NPAPI 때문에 결제할 수 없다는 경고창조차 뜨지 않았다. (?!)

갑자기 기대감이 생겨서 시럽페이를 선택하고 결제하기 버튼을 눌렀더니...



...어? (2)


여기서부터는 윈도우 PC의 크롬 브라우저에서는 안되던 것인데 결제가 계속 문제없이 진행이 되는 것이었다.


(우분투에서 시럽페이를 통해 우체국 쇼핑몰 결제가 완료된 화면)


...어? (3)


결국 우분투에서 결제까지 문제없이 완료했다.


...

......

..........

...뭐지 이 이상한 기분은?


윈도우에서는 페이지 하나 넘어가기도 힘들고 PC가 통째로 먹통이 되는 그 난리통에, 거의 기대할 수 없는 다른 운영체제에서 아무 문제없이 간편결제 본연의 기능을 써서 결제를 성공하다니. 그것도 공공기관 사이트에서?


굳이 이유를 알 필요가 있겠냐마는, 추측해 보자면 윈도우가 아닌 다른 운영체제에 대해서 예외처리를 해 주지 않았기 때문에 오히려 절차상 걸리는 것 없이 잘 진행된 것이 아니었을까? (물론 일반 카드결제를 시도하면 당연히 안 될 것이다.)

이 상황을 더 이상은 어떻게 설명을 못하겠다. =_=;;


결론을 내리자면, 국민 대다수가 쓰는 윈도우 운영체제에서는 있는 대로 권력을 행사해서 플러그인 설치를 강요하고 웹 브라우저 선택권을 박탈할 뿐만 아니라 간편결제마저 무력화시키는 우체국 쇼핑몰이, 의외로 윈도우가 아닌 다른 운영체제에서 기대치 못한 편의성을 보여 주었다는 것?

(이게 뭐냐고 ㅜㅜ)


우체국 쇼핑몰은 자사의 매출을 올리고 싶으면 제발 구색만 갖추지 말고, 간편결제는 진짜로 본연의 기능대로 잘 작동할 수 있도록 결제 시스템을 치밀하게 수정하기를 바란다.

반응형
블로그 이미지

Bryan_

,