2018년 4월 18일 수요일

Good bye my friend

어제 하루는 갑자기 회사에 가기 너무너무 힘들고 귀찮아 아침에 급히 휴가를 냈습니다.
그리고 지난 주말에 IKEA에 가서 이전에 봐 둔 가구들을 사다 하루 종일 조립하고, 주말 사이 우박이 쌓여 만들어진 얼음들 깨고 부수고 치운 덕에 오래간만에 어깨와 허리가 욱신욱신 하네요. 그런데 어깨와 허리 보다 마음이 더 아픈 일이 생겼습니다.

 가구 조립을 마치고 드라이브 웨이의 얼음을 다 치운 후 샤워를 하려는데, 페이스북 메신져에서 띠링~ 하고 새 메시지를 알려옵니다.

 "어라? 이 친구 요즘에 연락해도 답장도 없어서 전화번호도 바뀌고 페북도 끊은 줄 알았는데 왠일이지?"

  연락이 온 친구는 매우 조용하고 차분한 성격을 가진 저와 비슷한 또래의 (고교시절 이야기를 할 때 연도를 보니 3~4살 정도 많은 것으로 추정) 일본인 친구입니다. 성격이 워낙 조용하다보니 같이 어울려 놀은 기억은 딱히 없지만, 짧게나마 1년간 학교를 다니며 모든 전공 과목을 같이 들었고, 모든 과목의 팀 프로젝트를 같이 했던 친구죠. 평소에 자주 만나는 사이는 아니였지만, 제가 토론토에 살 때에는 한두달에 한 번 정도 서로 만나 커피 한잔을 하며 짧게나마 서로의 안부도 묻고 근황 이야기도 했었고, 제가 옥빌로 이사를 간 이후에는 간혹 이메일이나 페북 메신져, 전화 등을 통해 연락을 했었습니다. 그러다 반년 정도 전에 이 친구가 위니펙으로 이사를 가게 되었는데, 그 이후 한동안 연락두절 상태였죠. 사기꾼이 아니라 편하다고??? 좀 이상하게 보일 수도 있지만, 제가 다녔던 학교에는 특정국가 출신 학생이 과반수 이상인데, 그 특정국가 출신 학생들 중 다수가 그런 특징이 좀 있었습니다. 팀 프로젝트에서 각자가 해야 할 기본적인 일에 책임을 다하지 않으면서, 자신의 실력과 능력의 과대포장에는 뛰어나 쓸데없이 많은 일을 하겠노라고 commitment를 많이 합니다. 그리고 당연히 그를 지키지 못하죠. 설상가상으로 프로젝트에 문제가 생기면 뛰어난 공작능력으로 본인이 아닌 다른 사람들의 문제로 프로젝트가 산으로 가고 있다고 포장을 잘 하다보니 놀 때에는 따로 가리지 않고 다 같이 놀았어도, 프로젝트 팀을 꾸릴 때에는 저와 비슷한 문화/성향을 지닌 홍콩/대만/중국/일본 등 동아시아 국가 출신 학생들이나 우리의 형제국가인 터키 출신 학생들과 주로 했습니다. 적어도 그들은 over commitment나 블러핑은 하지 않으니까요. 특히 30대 이상 아저씨들과 주로 팀을 했는데 실력의 정도를 떠나 30대 이상인 경우 최소한의 책임감이 있어 같이 일을 함에있어 서로 불편한 일이 없었거든요.

 사실 이 친구의 성격은 저와 썩 맞는 것은 아닙니다. 더구나 안그래도 저의 영어 실력이 한참이나 부족한데 이 친구 역시 영어를 잘 못해 서로 모국어가 아닌 영어로 이야기 하다보면 대화의 맥이 끊기고 답답하기 그지 없습니다. 영어 네이티브이거나 잘하는 친구와 이야기 할 때엔 제가 개떡같이 이야기 해도 상대방이 찰떡같이 알아듣기도 하고, 제가 모르는 어휘나 표현이 나와 이해를 못하면 귀신같이 알아채고 보다 쉬운 어휘나 표현으로 rephrase를 해 주거나, 정 안되면 그 단어의 뜻을 설명 해 주어 상대방은 좀 귀찮을지언정 대화가 이어지는데 반해 이 친구와 영어로 이야기를 하다보면 서로의 모국어 억양과 발음이 달라 쉬운 단어도 서로 못알아듣기도 하고, 영어도 못하는 것들이 그 와중에 각자 자신만 아는 어휘나 표현이 있어서 서로 이해를 못하는데, 다른 동의어로 대체하여 rephrase 할 능력은 없다보니 서로 이해하지 못하고 그냥 웃으면서 넘어가는 경우도 참 많죠.
그래도 1년간 모든 전공과목들을 같이 듣고 프로젝트를 같이 하면서 같이 잘 지냈습니다. 학교에서 팀 프로젝트를 하기 위해서는 각 과목마다 마음에 맞는 친구가 2-3명 정도는 있어서 같이 팀을 꾸려야 편한데, 이 친구는 실력이 아주 뛰어나 제가 편하게 프로젝트에 얹혀 갈 수 있게 해주지는 못했지만, 적어도 다른 학생들과는 달리 성실했고, 자기 실력과 할 수 있는 일의 범위에 대해 블러핑도 안했고, 저와 나이도 얼추 비슷했던지라 계속 붙어 다녔죠.

 첫 학기가 시작되고 얼마 지나지 않아 제가 FSWP로 영주권 신청을 할 때에 저는 이 친구에게도 졸업을 기다리지 말고 FSWP 지원을 해 볼것을 권유 했었습니다. 이 친구도 어학 점수만 6.5 이상 나오면 FSWP로 지원이 가능했기 때문이죠. 그런데 이 친구는 1년이 조금 넘는 오랜 기간에 걸쳐 패스웨이를 한 후에 시험 없이 학교에 입학을 한 친구입니다. 1년넘게 패스웨이가 걸린만큼 원래 영어를 잘 하지 못하기도 했고, 한 번도 영어 시험을 본 적이 없던터라 IELTS 시험을 보는 것에 상당한 부담을 가지고 있더군요. 그래서 시험보기 무섭다며 제가 FSWP 준비를 차근차근 해 나아갈 때 차일피일 미루고 또 미뤘습니다. 그러다 그 해 가을 제 FSWP 이민 프로세스가 진행되는 것을 지켜본 이 친구는 드디어 IELTS 시험 준비를 하면서 시험 예약을 하기 시작했는데, 아직 FSWP 67점은 안되었지만 거의 그에 근접할 수준의 성적표를 받은 시점에, 그 해 SW Engineer NOC의 FSWP 티오가 마감이 되고 말았습니다. 그래도 다음 해를 위해 그 친구는 계속 시험을 치뤘지만 2015년이 되어 Express Entry에 대한 모든 것이 알려진 이후에는 사실상 FSWP 이민을 포기하고 영어 시험 준비도 중단을 했었습니다.

 결국 저는 입학 후 1년이 안되어 영주권을 받았고, 바로 회사에 나가 일을 하기 시작했지만, 이 친구는 원래 계획대로 PGWP를 위해 계속 학교를 다녀야만 했습니다. 이 친구가 하던 프로그램은 코업이 있는 프로그램이였습니다. 그 당시만 해도 대부분의 컬리지 학생들이 코업 일을 구했던 시기였습니다. 하지만, 이 친구는 코업을 구하지 못해 중간에 강제 방학을 맞이하기도 했고, 결국에는 졸업 전까지 코업을 못하여 프로그램도 논 코업 프로그램으로 변경하여 졸업을 했죠. 그렇게 졸업을 하고 이제 진짜 일을 구할 시기가 되었는데, 이 친구의 캐나다 취업운은 졸업을 해도 별로 나아지지 않았습니다. 어찌된 영문인지 제가 보기엔 이 친구보다 실력도 부족하고 영어를 더 잘하지도 않는 다른 친구들도 결국엔 어떻게든 취업을 했지만, 이 친구는 면접 과정까지 가는 것도 쉽지 않았습니다. 한 번은 저희 회사에 오픈된 포지션과 매칭이 되기에 이 친구를 추천하려 했는데 HR에 연락을 하니, 방금 전에 인터뷰 본 지원자를 채용하기로 해서 해당 포지션은 지금 close 될 것이라고 해서 인터뷰도 진행하지 못했습니다.

 2년이 조금 넘는 시간이 흐르고 흘러 힘겹게 전공 관련 일자리를 구했는데, 그 친구의 PGWP의 남은 기간은 1년이 채 안된 시점이였습니다. 이 친구가 원래 생각했던 CEC를 위해서는 (또한 다른 대부분의 이민을 위해서는) 1년 이상의 경력이 필요한데, 남은 워크퍼밋 기간을 풀로 다 채워도 1년 경력이 안나오는 상황이 된 것이죠. 그 때부터 이 친구는 저에게 종종 연락을 하기 시작했습니다. 혹시 이런 상황에서 가능한 이민 프로그램을 아는지, 그런 케이스를 본 적이 있는지 많이 물어봤었습니다. 정확한 기간은 잘 모르겠지만 아마 1-2달 정도 짧은 기간이였던 것 같은데, 이 친구는 회사를 다니면서 회사의 주정부 이민 지원 등 여러가지 가능성들에 대해 이러저리 알아 보았지만, 1년 미만으로 남은 현재의 워크퍼밋으로는 토론토에서 영주권을 받을 길이 없다는 결론을 내렸던 것 같습니다. 그리고는 어느날 갑자기 위니펙으로 날아갔죠. 위니펙에서는 6개월만 일을 하면 주정부로 이민을 할 수 있다는 말을 남기고 말이죠.

 처음 위니펙에 간 이후에는 간혹 직장은 구했는지, 이민은 계획대로 잘 진행 중인지 안부차 연락을 하면 "여긴 벌써 겨울이 시작되나봐", "토론토는 참 따뜻한 도시였어" 등 조금 다른 이야기들의 답변이 오더군요. 그러더니 어느 순간부터는 메신져로 연락을 해도 답장이 없고, 전화도 받지 않았습니다. 아마 전화는 이미 위니펙으로 넘어가면서 지역번호가 바뀌면서 번호가 변경되었을 것이라고 예상은 했고, 메신져는 페북을 끊었나 생각했죠. 그렇게 썩 친하다고 말하기는 힘들지만 저도 힘들었던 학생시절에 함께 했던, 그리고 한동안 연락이 두절되어 궁금했던 그 친구에게 오래간만에 연락이 온 것입니다.

 하지만, 이렇게 온 메시지는 그다지 긍정적이지 않은 메시지였습니다.

 "나 7월 말에 일본행 '편도' 항공권을 예약 했어"

저의 손가락들은 한동안 핸드폰 화면 위에 머물렀습니다. 그냥 일본행 항공권을 샀다고 하면

 "휴가가니? 잘 다녀와"

 "너 고향이 어디라고 했지? 맛있는 거 많이 먹고 와"

등의 인사라도 할텐데, '편도' 라는 이 한 마디가 지금 이 친구의 상황에 부정적인 모든 것을 내포하고 심하게 어두운 기운을 뿜어내고 있었습니다.
이 친구가 구지 애둘러서 '편도' 티켓을 샀다고 애둘러 말 한 상황에서 스스로 아픔을 꺼내기 전에 제가 들추고 싶지 않았습니다. 그래서 저도 애둘러서 이상한 소리들만 한동안 한 것 같아요.

 "Is it still cold in Winnipeg? Entire my village became arena due to frozen rain during last weekend."

 "We should meet once again sometime. Let's drink Sake and Biru at that time."

 "Try to visit gorgeous places before you leave. Have you been Banff?"

 "I think you must see Aurora at once."

 ...

 얼추 계산을 해보니 이 친구가 15년 여름 학기를 마치고 졸업을 했으니, 올해 8월 즈음이면 PGWP가 만료되는 것 같습니다. 그래서 작년 9월인가 10월 즈음에 위니펙으로 이사를 갔던 것이고, 현재는 당장 오늘 취업을 한다 해도 워크퍼밋 만료 전 까지 매니토바에서 6개월의 경력을 만들 수 없으니 포기를 한 것 같네요. 

어쩌다보니 오래간만에 연락을 하는데 서로 정작 하고싶은 이야기는 꺼내지도 못하고 서로 변죽만 울리는 상황에서 그냥 진심으로 하고싶은 말 한마디를 했습니다.

 "If you have a chance to come to Oakville or near to Oakville, please contact me. I would like to serve a dinner once, indeed!" 

하지만 제 말에 이 친구가 마지막으로 보낸 메시지가 더 마음아픈 말이였습니다.

 "Thank you, but I don't think I will come to Canada again."

저의 빈약간 기억력에 정확히 캐나다였는지 미국이였는지는 기억이 가물가물하지만 이 친구는 20대 때에도 이민을 위해 북미에 몇년간 머물렀던 적이 있었고 실패하여 일본으로 돌아간 경험이 있었습니다. 그리고 30대 후반에 (혹은 40대 초반) 재 도전을 했지만 40대가 된 지금 이렇게 다시 한 번 영주권을 받지 못하고 일본으로 돌아가는 상황이 되었으니, 다시는 안올 것 같다는 그의 말은 정말일 것 같네요.

 이 친구는 워낙 말이 느리고, 말주변도 별로 없지만 (처음엔 단순히 영어를 못한다고 생각했는데, 학교 영어과목 강사 중 한 분이 일본에서 오랜기간 강사 생활을 하여 일본어를 아주 잘 했는데, 그 분 말에 의하면 이 친구는 일본말도 대화의 템포가 상당히 느린 편이라고 하더라고요) 성실하고 착한 친구였는데... 무언가 질문을 던지면 10-20초 후에나 full sentence를 만들어서 대답하는 그 친구의 화법이 행여 취업 길을 막은 것은 아닐까 생각도 듭니다. 저는 영어를 참 못하지만 그래도 제가 아는 내용이면 비문이더라도 휘릭휘릭 대답은 합니다. 단, 한국말과 비슷하게 주어가 생략된 말은 매우매우 자주 하는 편이고, 시제와 단/복수도 거의 생각 안하고 마구잡이로 말하는 편이며, 심지어 수동/능동 또한 제 멋대로 바꿔 그냥 제 입에 잘 붙는 말을 해버리는 편입니다. '난 내 할 말을 내가 알아서 다 한 것으로 나의 임무를 마쳤으니 너는 니가 알아서 내 말을 이해하는 것으로 너의 임무를 다 하거라.' 라는 식으로 말이죠. 그런데 이 친구는 대화의 템포는 참 숨 넘어가게 느리지만, 이 친구가 하는 말들을 곱씹어보면 마치 성문 종합영어 예문에서 봤던 것 같은 완성형 문장을 만들어서 하거든요.

 5년 밖에 안된 저의 이민 생활이지만 간혹가다 이런저런 이유로 지인들이 각자의 모국으로 돌아갈 때면, 그다지 친하게 지낸 사람이 아니더라도 왠지 모를 허전함이 밀려오곤 하는데, 참 헤어짐이라는 것은 적응하기 쉽지 않은 이벤트 같습니다.

한국에서는 몰랐는데 이민 생활을 하면서 생긴 허전함이라고나 할까요? 그가 다시 캐나다로 올 일은 아마도 없을 것 같고, 저도 딱히 일본에 갈 것 같지도 않으니 앞으로 서로 볼 기회는 없을 것 같지만, 부디 일본에서 세번째로 다시 시작하는 그의 삶에는 어려움이 없이 잘 풀리기를 진심으로 빌어봅니다.

2018년 4월 6일 금요일

SW Developer라는 직업 - 개발자는 무슨 일을 할까?

안녕하세요.

아래 글은 제가 얼마 전에 다른 카페에 올렸던 글인데, 최근 1-2년 사이에 저에게 메일이나 행아웃 등으로 연락을 주시는 분들의 연령대가 낮아지고, 아직 개발자 커리어를 시작하기 이전에 고민을 하시면서 연락을 주시는 분들도 많아 제 블로그에도 포스팅을 합니다.

주제에는 벗어나는 이야기이지만 최근 1-2년 사이에 현재 고등학생이시거나, 대학생이신 10대 후반에서 20대 초중반이신 분들이 이민에 부쩍 관심을 가지시는게 아닌가 싶기도 합니다. 블로그를 처음 시작했던 시기만 해도 저와 비슷한 또래이거나 저보다 좀 더 형님 세대에서 연락을 많이 주셨는데, 요즘에는 오히려 30세 미만이신 분들이 더 많은 것 같네요. 미세먼지 때문인지, 아니면 좀 더 개방되고 세계화 된 환경에서 성장하셔서 더 빨리 더 넓은 곳으로 눈을 돌리시는 것인지는 모르겠지만, 요즘 메일을 보면 조금 신기하기도 합니다. 아, 어쩌면 Express Entry 이후로 나이가 차면 이민이 힘들어져서 미리 포기하시는 분들이 많아져서 그럴 수도 있겠고요.

그러면 카페에서 옮겨 온 글을 시작합니다.

===================================================================

이미 개발일을 하고 계신 분이라면 별다른 이야기도 없고 어쩌면 너무 저수준의 이야기만 풀어놓아 제 생각과 많이 다를 수도 있습니다. 하지만 어쩌겠습니까. 제가 그렇게 훌륭한 지적수준을 지니지 못했고 그냥 열심히 하는 개발자일 뿐인지라 웬만한 것은 다 단순하게 생각하고 처리하니 제 생각도 그 수준에 머물러 있는 것을요...

개발자라는 직업에 대해 생각해보면 이는 분명 전문 기술직입니다. 

일을 하기위해서는 정규교육이건 독학이건 일정 수준 이상의 학습과 경험을 갖추어야 합니다. 또한 개발자라는 직업은 지식 노동자입니다. 육체노동이라고 하면 타이핑을 하고 마우스를 컨트롤 할 때 필요한 손가락과 손목운동 정도입니다. (하지만 거북목 증후군과 터널 증후군이 빈번한 것은 비밀이에요)

그런데, 다른 지식노동 전문 기술직과는 조금 다른 것이 정규교육을 전혀 거치지 않은 사람들도 얼마든지 이 직종에 종사할 수 있으며 또 잘 할 수 있습니다. 근본적인 이론은 아무래도 학사 이상의 교육을 받는 것이 좋겠지만, 업무 자체를 처리함에 있어서는 독학으로 혼자 공부해도 별다른 무리가 없기도 합니다. 온라인에 워낙 많은 학습자료들이 있기 때문이기도 하지만, 기술 변천이 매우 빠른 분야 중 하나인지라 배운 지식을 그대로 활용하는 것 보다 더 중요한 것은 기존에 알고있는 내용을 기반으로 새로운 기술을 빨리 습득하고 활용하는 능력이기 때문이기도 합니다.

아주아주 단순하게 살기위해 노력하는 저의 머리에서는 SW 개발이라는 일을 '긴가민가의 공학' 이라고 생각합니다.
즉 true or false에 대해 계속해서 명확하게 정의하고 확인하는 과정이 무한히 반복되면서 제품이 만들어지고 작동하게 됩니다.



컴퓨터는 0과 1 외에는 아무것도 모른다는 말을 이미 들어보셨을 것입니다. 네, 양자 컴퓨터가 아직 없는 지금은 컴퓨터에서 하는 일이라고는 따지고 보면 0과 1을 처리하는 것 외에는 없습니다.  아무리 복잡한 시스템이라고 해도 이는 마찬가지입니다.

SW 공학은 다른 공학분야들에 비해 근래에 생긴 분야입니다. 그렇다보니 여기에서 만들어내는 제품들은 보통 기존 아날로그 방식의 프로세스나 물건 등을 디지털화 하여 사람보다 좀 더 빠르게 처리하도록 만들죠.
고급 개발자들은 상황이 다르겠지만, 저와같은 저랩 개발자라면 아무리 크고 복잡한 상황이라도 계속해서 단순화하고 분할하여 '긴가민가'의 논리로 모든 것을 처리할 수 있는 단계로 나누는 것만 잘해도 일을 하는데 큰 문제가 없습니다.

10년 전에 제가 했던 일을 다시한 번 떠올려 예를 들어보겠습니다.

요즘 스마트폰에서는 어떤지 모르겠는데, 예전 피쳐폰을 생각 해 보시면 지인에게 전화를 걸 때에 보통 두 가지 중에 한가지 방법으로 전화를 걸으셨을 것 같습니다.
하나는 단축 다이얼 기능으로 0-9까지 번호 중 하나를 길게 눌러서 미리 설정 해 둔 번호로 바로 전화가 걸리게 하는 것이고, 다른 하나는 일명 '초성 검색'으로 이름의 초성만을 입력하면 그 초성과 매칭되는 사람들이 리스팅 되어 사용자가 선택하여 전화를 걸 수 있게 하는 것이지요.
아, 전화번호를 그냥 통채로 외워서 전화를 걸고 계시다고요? 폰북에 들어가 ㄱ-ㅎ까지 주루룩 검색을 하신다고요? 만약 그렇다면 당신은 핸드폰 문화가 퍼지기 시작했던 90년대 말에 이미 중년에 접어드신 분들이거나, 매우 강한 아날로그 적 감성을 지닌 예외적인 분들 일 것입니다.

먼저 단축 다이얼 기능을 단순화하여 보면 이렇습니다.

핸드폰의 키패드는 매 xx millisecond마다 계속해서 사용자가 버튼을 눌렀는지 안눌렀는지 확인을 합니다.
    - 0번키 지금 눌려있니? 아니니?
    - 1번키 지금 눌려있니? 아니니?
    - 2번키 지금 눌려있니? 아니니?
     ...

예를 들어서 사용자가 1번 버튼을 누르면 눌리자마자 기계가 버튼이 눌린 것을 인식하고 동작하는 것이 아니라, 아주 짧은 시간이지만 매 xx millisecond마다 각 개별 버튼의 눌림 상태를 확인해서 눌린 것인지 아닌 것있지 알아내는 방식이지요.

버튼이 눌린 상태에서도 핸드폰은 계속해서 xx millisecond마다 각각의 버튼을 한 번 씩 돌아가면서 눌림 상태가 true인지 false인지 지속적으로 확인을 합니다.

그러다가 특정 순간에 1번 버튼의 눌림 상태가 True에서 False로 바뀌면 또 다른 긴가민가 테스트를 합니다.

    - 버튼이 눌린 후 떼어질 때 까지 시간이 1초보다 크니 아니니?

만약 1초 보다 오랜 기간동안 눌려 있었다면 이건 버튼 길게누름으로 인식을 하게되어 단축 다이얼로 동작을 하게 합니다. 만약 1초 미만으로 눌렸다면 일반 버튼 누름으로 인식을하고 단순히 화면에 1을 출력하고 끝내죠.

1초 이상 눌린 경우엔 다시 한 번 긴가민가 테스트를 진행합니다.

    - 1번 단축 다이얼이 설정이 된 적이 있는지 아닌지 긴가민가 테스트를 합니다.

기라면, 이미 등록된 번호를 가져와 전화 걸기를 합니다.

아니라면, 사용자에게 1번 단축다이얼을 등록 할 것인지 아닌지 물어보는 화면을 뿌립니다. 그리고 사용자의 입력이 Yes인지 No인지 다시 한 번 확인을 하죠.

조금은 더 복잡하지만, 한글 이름의 초성검색 기능도 따지고 보면 다 이러한 식의 긴가민가 테스트의 반복입니다. (검색속도 향상을 위해 초성들 따로 인덱싱을 하는 등의 로직이 추가되었지만, 아주아주 기본으로 보자면 그러합니다)

초성 검색은 따로 초성검색 메뉴로 들어가지 않고 그냥 전화기 메인 화면에서 숫자를 누르면 누른 숫자와 매칭되는 전화번호 검색이나 혹은 누른 숫자키에 매칭되는 한글 초성으로 검색이 됩니다.

위에 버튼 길게눌림 긴가민가 테스트를 통해 버튼 짧게 눌림을 인식했다고 가정하고...

    - 눌린 숫자와 매칭되는 한글이 자음이니 모음이니?

모음인 경우라면 이건 그냥 숫자키로 인식합니다. (중성 검색 기능은 없기에...)

이런 식의 키 입력이 지속되어 계속해서 한글 자음과 매칭되는 숫자 키가 눌렸다고 가정하면, 버튼이 눌릴 때 마다 또 이런 테스트를 합니다.

    - 지금 2글자 이상 입력을 한 것이니 아니니?

초성검색은 보통 2자 이상 입력을 할 경우에만 동작을 시작하기에 (1글자로 검색을 하려면 워낙 많은 검색 결과가 나오기에...) 이런 검사를 합니다.

만약 입력한 버튼 중에 초성과 매칭되지 않는 숫자가 섞여있다면 지금까지 입력한 숫자열은 모두 초성검색이 아닌 일반 전화번호 검색 기능으로 동작합니다. 예를들어 전화번호 뒷 4자리 검색 같은 기능 말이죠.

자, 사용자가 2글자 이상 입력을 했고, 모두 초성에 매칭되는 숫자키라면 초성검색 기능를 작동시킵니다.

초성검색을 하는 방법은 여러가지이지만, 지금은 편의상 가장 무식하지만 단순한 방법으로 설명 드립니다.

먼저 입력된 숫자키에 매칭되는 한글 자음의 조합들을 전부 만들어 냅니다.
예를들어 삼성 천지인 자판에서 4번 버튼은 ㄱ 과 ㅋ에 매칭됩니다. 그리고 5번 버튼은 ㄴ과 ㄹ에 매칭되죠.
그러면 4, 5번 버튼이 연속으로 눌렸을 경우 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ 라는 초성의 조합이 나올 수 있습니다.
아, 쌍자음을 까먹었군요. 쌍 'ㄴ'이나 쌍 'ㄹ', 쌍 'ㅋ'은 없지만 'ㄲ'이 있으니 이 조합도 추가를 해서 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ, ㄲㄴ, ㄲㄹ 조합이 만들어 집니다.

그 다음에는 주소록에 저장된 모든 사람의 이름들을 한 번 씩 다 확인을 합니다.

이미래
강래원
김개똥
...

이렇게 이름이 있으면 먼저 처음에 있는 '이미래' 부터 가봅니다
이미래과 이전에 만들어 둔 초성 조합인 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ, ㄲㄴ, ㄲㄹ을 하나씩 비교 해 봅니다. 이름의 첫 글자 '이'에서 초성인 'ㅇ'을 가져옵니다.

    - 미리 만들어 둔 조합의 첫 자음과 'ㅇ'이 매칭 되니?

답은 No이니, 다른 긴가민가를 해봅니다.

    - 그 다음 이름도 있니?

그 다음에 '강래원'이 있으니 가져옵니다. 그리고 그 중 첫 글자의 초성인 'ㄱ'을 가져오죠.

    - 조합 내에 첫 글자로 'ㄱ'이 있니?

네 있습니다. 그러면 비교대상 조합군을 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ, ㄲㄴ, ㄲㄹ 6개에서 ㄱ으로 시작하는 ㄱㄴ, ㄱㄹ 두 개로 줄여줍니다. 그리고 그 다음단계로

    - 이름에 '강'다음에 글자가 있니?

네 있죠. 그러면 그 다음 단계로 다음 글자를 가져와 그 중 초성인 'ㄹ'을 뽑아냅니다.

    - 혹시 조합 내에 두 번째 글자로 'ㄹ'이 있니?

네 조합 내에 있습니다. 축하합니다! 드디어 초성검색에 부합되는 검색결과 중 하나를 찾았습니다. 이제 이 이름은 입력한 값과 매칭되니 화면에 출력하고, 그 다음 이름을 또 가져와 하나씩 긴가민가를 해 주는 것입니다. 전화번호부의 맨 끝에 갈 때 까지요. 그렇게 하여 매칭되는 초성 조합을 가진 이름들을 모두 찾아내서 보여주는 것이지요.

이렇게 SW라는 것은 사실상 "긴가민가 테스트"를 주어진 목록과 상황 상에서 "반복" 하는 방식으로 이루어져 있습니다.

별 것 아닌 것 같지만 의외로 이련 일을 하면서 자주하는 실수로는....
첫 번째 글자 비교를 완료했으니 그 다음 글자로 넘어가야하는데, 실수로 같은 글자를 반복 비교한다거나, 이름의 첫번째 글자 자음과 만들어 둔 조합의 두번째 자음을 비교하여 매칭한다거나 식의 실수가 자주 발생하기도 합니다.
혹은, '강래원' 이름은 세 글자이지만 입력한 숫자는 2글자 뿐이기에 앞 두글자만 비교를 하고 넘어가야 하는데, 구지 세번째 글자를 비교하려고 덤비는 경우도 있지요. '원'의 'ㅇ'과 아무런 값도 없는 것 간의 비교를 하는 것이지요. 이 경우에는 비교 방식에따라, 사용하는 프로그램 언어에 따라 폰이 재부팅 될 수도 있고, 그냥 강래원은 4, 5번키 입력에 맞지 않는 것이라고 치부하고 넘어 갈 수도 있고, 아니면 잘못해서 비교를 했지만 또 잘못해서 비교한 것이 맞다고 하여 2중 오류로 최종 결과는 강래원은 4, 5번 키와 맞는 이름이라고 올바른 답을 찾을 수도 있습니다.

SW가 이세돌 9단을 바둑으로 이기기도 하고, 처음 가는 길이라도 막히지 않는 구간으로 잘 찾아 최적 구간의 길을 찾아주기도 하는 등 참으로 복잡한 일을 하는 것 같지만, 복잡한 것은 최종 완성된 제품일 뿐 세분화 하여 나눠놓고 따지고 들어가면 각각의 논리 구성은 이와같이 긴가민가 테스트를 각각 주어진 조건과 환경에 맞게 지속적으로 반복을 하는 작업입니다.

그렇다보니 복잡한 세상을 잘게 쪼개서 아주아주 단순하게 생각하는 능력이 좋다면 전문적인 고등교육을 받지 않아도 얼마든지 혼자서 할 수도 있는 일이기도 하죠. 공학이라고는 하지만 다른 공학과는 달리 높은 수준의 수학적 지식을 필요로하기 보다는 Yes/No의 논리연산에 대한 능력이 더 필요합니다. 

여기에서 오는 작은 문제가 하나 있는데, 아직 실무를 경험 해 보지 못한 학생들의 경우 1,2학년 때에는 과연 내가 배우는 것으로, 지금까지 배운 것으로 뭘 만들어 볼 수나 있으려나? 맨날 숫자 비교나 하고, 글자 비교나 하고, 그거 반복하고... 아주아주 단순한 것 밖에 만들지 못하는데, 내가 뭘 할 수 있으려나? 졸업하면 일이나 할 수 있으러냐? 코업 나가면 일이나 할 수 있으려나? 걱정을 많이 하기도 합니다.

벌써 20여년 전인데... 저도 예전에 대학생 때 그랬습니다. 학교에서 이것저것 많이 배우기도 했고, 또 혼자서 학교에서 가르치지 않는 다른 기술들도 공부하고 연습 해 보기는, 매냥 하는건 긴가민가의 반복만 하는데 어떻게 엑셀같은 프로그램을 만들고, 어떻게 핸드폰을 만들 수 있는지 도무지 감이 오지 않았죠.

하지만 엑셀이건 핸드폰이건 너무 큰 숲만 봐서 그런 것이고 그것들도 다 잘게 잘라서 보면 이렇게 지금까지 배운 것들 위주로만 구현이 된 것이니 혹 지금 SW 공학 전공을 하시는 학생들이 있다면 너무 걱정하지 말라고 이야기 해주고 싶습니다. 대신, 큰 숲을 작은 나무와 작은 나무에서도 각각의 나뭇잎 한장 한장으로 잘게 쪼개서 볼 수 있는 능력을 키워야 합니다. 자기가 배운 단순한 기술들을 조합해서 무언가 소소하게나마 의미있는 제품으로 만들어 내는 훈련을 해야합니다. 이런건 학교에서 잘 가르쳐주는 것도 아니고 가르쳐준다고 다 아는 것도 아니기에 혼자서 이것저것 많이 해보는 것이 좋지요.

추가로 말씀드리자면 사실 위에 예제는 실제 핸드폰에 구현된 코드 구조와는 사뭇 다릅니다. 앞서 말씀드린 것 처럼 구현할 수 있는 수 많은 선택지 중 가장 단순한 방법을 말씀드린 것입니다. 보통은 이런 식으로 검색을 할 경우 검색 속도의 문제가 있기에 사전에 초성 인덱싱을 미리 하는 방법등 다른 방법 등을 쓰지요. 예를들어 '김개똥'이라는 이름을 저장할 때에 초성 검색시 매칭되는 숫자 키인 '4, 4, 6'이라는 키 조합을 미리 찾아서 '김개똥'이라는 이름과 함께 저장하는 것 같은 방식이 그 중 하나라고 할 수 있습니다.
이렇게 하면 사용자가 버튼을 누를 때 마다 모든 조합을 다 찾아내고 각 조합마다 계속해서 비교하는 등의 반복된 작업을 하지 않고 사용자가 입력한 숫자키의 배열이 '4, 4, 6'과 매칭되는지의 여부만 확인하면 되니 훨씬 더 빨리 검색 결과를 얻을 수도 있죠.

이렇게 인덱싱을 하는 방법을 연구하여 남들보다 빨리, 효율적으로 검색하는 것을 찾아내는 것이 SW 개발자라는 직업을 단순 기술직이 아닌 지식 노동자로 만듭니다. 단순하게 계속해서 Yes No만 반복하다보면 아무리 빠른 컴퓨터라고 해도 입력된 데이터가 많아질 수록 점점 느려질 수 밖에 없는데, 아주아주 작고 보잘것 없는 아이디어 같지만, 전화번호를 저장할 때에 작은 계산만 하나 미리 해서 실제 사용 시에 반응속도를 향상시키는 것이지요.

또 이러한 새로운 방식으로 검색을 하지 않는다 하여도 앞서 했던 긴가민가 테스트들의 순서나 이를 반복하는 순서만 바꾸어도 성능에 큰 영향을 주기도 합니다.
제가 예전에 대학생때 후배들에게 세미나를 하면서 한 적이 있는 말인데, 만원짜리 한장과 천원짜리 한 장이 있을 때, 사람 세계에서는 어떻게하건 11,000원이지만, 컴퓨터 세상에서는 만원짜리가 앞에오고 천원 짜리가 나중에 올 경우 만 천원이지만, 천원이 앞에오고 만원이 나중에오면 천만원이 되기도 합니다.

컴퓨터 공학의 시초는 사실 수학인지라, 정말 고성능에 뛰어난 연산이 필요한 제품을 만들기 위해서는 수학적인 지식과 다양한 수학 공식들의 활용/적용 능력이 필요하기도 합니다. 하지만 저처럼 저랩 개발자들의 경우 그런거 별로 필요 없습니다. 복잡한 실제의 인간 세상을 단순화해서 네/아니요의 구조로 잘게 자를 수 있고, 계속해서 무한 반복되는 긴가민가에서 내가 확인해야 하는게 기인 것인지 아닌 것인지 헷갈리지 않을 능력만 있으면 적어도 저처럼 밥벌어 먹고 살 수는 있습니다. (그런데 종종 긴가민가의 숲에서 길을 잃고 헤메기도 합니다 ㅠㅠ)

혹시나 이쪽 분야에 새로 커리어를 시작을 고민하시는 분들이나, 전공 고민을 하시는 분들께서 만약에 제 글을 읽고 뻘써부터 머리에 쥐가나기 시작한다면 어쩌면 이 분야가 적성에 맞지 않는 것일 수 있습니다. (아니면 제 필력이 형편없어서 읽기 힘들어서 그럴 수도 있고요)

어찌되었건 저의 개똥같은 작은 생각이 고민하시는 분들께 조금이라도 도움이 될 까 싶어 몇 자 적어봅니다.