지지난주부터였던가... TED+SUB이 제대로 동작하지 않았다. 그리고 적지 않은 메일이 왔다. 'TED+SUB이 제대로 동작하지 않습니다'... 메일의 내용은 다들 똑같았지만 문장이 뿜어내는 분위기는 천차만별, '당신의 수고에 감사드립니다. 최근 이런저런 문제가 발생한 것 같은데 확인 좀 해주시겠어요?', '제가 어떻게 하면 좋은지 설명 부탁드립니다.', '빨리 고쳐라'... 한 통의 메일이 유독 거슬렸는데 덕분에 울컥해서 하루 온종일 씁쓸함을 지울 수가 없었다. 난 소심쟁이니까능-



잘 되던 앱에 갑자기 문제가 생겼다?

TED+SUB을 처음 공개했을 때부터 우려했던 문제가 결국 터졌다. 앱 공개 이후 꾸준히 개발 과정을 글로 남기고 있는데, 시간 여유가 있는 분은 첫 번째 글부터 차근히 읽어보면 그 이유를 금방 알 수 있을 것이다. 하지만 우리는 바쁜 현대인! 그래서 다시 문제부터 정리하고 그것을 해결하는 과정을 적어보려 한다. 우선 문제를 설명하기 전에 TED+SUB이 어떻게 TED 정보를 수집하고 해석하는지 이해할 필요가 있다. 


TED+SUB은 어떻게 TED 정보를 수집하고 해석하는가?

어떤 서비스를 이용하는 어플리케이션(이하 앱)은, 그 서비스로부터 정보를 제공 받아 실행 플랫폼에 적합한 사용자 인터페이스를 통해 보다 쉽게 해당 서비스를 이용할 수 있게 하는 것을 목표로 한다.

사용자 입장에서는 사용자 인터페이스(UI, User Interface)가 얼마나 직관적이고 편리하며, 아름다운가가 가장 중요한 이슈이다. 그러나 개발자 입장은 다르다. 개발자에게는 어떤 방법으로 정보를 제공 받고(또는 수집하고), 얼마나 많은 정보를 제공받을 수 있으며, 어떤 단위로 정보를 받는지가 가장 중요한 이슈이다. 이 이슈가 잘 정리된 후에야 사용자 인터페이스를 디자인하고 앱이 동작하게 만들 수 있기 때문이다.

처음부터 앱을 고려한 서비스들은 대체로 정보의 수집 및 조작을 용이하게 하는 수단을 제공한다. 이를 API, Applicable Programming Interface라고 한다. 트위터나 페이스북 등의 서비스들은 그들이 제공하는 웹페이지와는 별도로 수 많은 API를 제공하여 다양한 앱이 탄생할 수 있게 하였다. 하지만 TED는 아직 공식적으로는 어떠한 API도 제공하지 않고 있다. 지난 SXSW 행사에서 '우리도 개발자를 위한 API를 공개하기로 했습니다' 라고 했지만 아직까지는 별다른 소식이 없다.

하지만 TED는 비공식적으로 몇 개의 API를 노출하고 있다. 그 중 하나가 '특정 강연에 대한 특정 언어로 작성된 자막 얻기', 이 비공식 API 하나로 TED+SUB가 시작되었다고 해도 과언이 아니다. 

문제는 TED 앱을 만들기 위해서는 더 많은 API가 필요하다는 것. 강연 목록, 특정 강연에 대한 상세 정보, 발표자 정보, 비디오 링크 등 앱을 구현하기 위해서는 많은 정보가 필요하다. TED는 자막 이외에도 강연 목록 등을 제공하는 비공식 API를 노출하고 있다. 그런데 여기에는 몇 가지 문제가 있다.

우선 강연 목록에 대한 API는 한 번에 전체 목록을 제공하는데 이는 모바일 환경에 적합하지 않다. 일단 데이터량이 너무 많아서 네트워크 부하가 크다. 모바일 인터넷은 패킷 하나하나가 돈이다. (우리에겐 정액제가 있잖아요? 그렇지 않다. 그리고 우리나라만 생각하고 앱을 만드는 건 90%의 시장을 버리겠다는 것과 다를바 없다) 그리고 한 번에 많은 데이터량을 처리해야 하기 때문에 앱의 반응성이 떨어진다. 또한 TED는 트위터나 페이스북처럼 매 시간 빠르게 변화하는 곳이 아니기 때문에 매번 전체 목록을 받아온다는 건 굉장히 비효율적이다.

그리고 또 하나 큰 문제는 API를 통해 얻은 강연 목록의 정렬 순서가 고정되어 있다는 것이다. TED 공식 웹에서는 강연 목록을 다양한 방법으로 정렬할 수 있다. 이벤트 별로 목록을 생성하거나 주제 별로 목록을 생성하거나, 시간 별로 강연을 제한할 수 있다. 나는 웹에서의 사용자 경험을 앱에서도 그대로 유지하고 싶었다. 하지만 TED의 비공식 API로는 불가능하다. (그런 이유로 나는 TED의 공식 앱을 별로 좋아하지 않는다)

웹과 동일한 사용자 경험을 제공하기 위해 나는 TED의 비공식 API를 사용하는 대신, 웹페이지 그 자체를 활용하기로 마음먹었다. 일반적으로 API를 통해 정보를 수신하면 오직 필요한 정보만 알차게 구성되어있는 반면에 웹페이지에는 디자인 요소 등이 얽혀서 정보라는 관점에서는 꽤나 어수선하다. (웹브라우저로 TED 웹에 들어가서 우클릭하고 '소스 보기'를 선택하면 금방 이해가 될 것이다)

웹페이지는 HTML이라는 언어로 표현되는데 HTML은 문법 규칙이 다소 헐렁하다. 게다가 디자인과 제어 코드(자바 스크립트) 등이 섞여서 필요한 정보만 콕 찝어서 꺼내기가 어렵다. 사람 눈으로는 금방 알아볼 수야 있겠지만, 그걸 프로그램으로 하기란 쉽지 않다.

강연 요약 정보는 저 곳에 숨어 있다.


이에 대해 내가 선택한 방법은 '문자열 비교'. 정보를 둘러싼 특정 문자열을 찾아서 그 문자열 사이에 적힌 내용만 뽑아낸다. 얼추 그럴싸하지만 여기엔 위험이 따른다. 웹페이지는 유행에 민감하기 때문에 언제라도 디자인이 바뀔 수 있는데, 디자인이 바뀌면 이에 따라 웹페이지의 구성 자체가 바뀔 수 있기 때문이다. 그렇게되면 이전까지 유효했던 '특정 문자열'이 더 이상 유효하지 않게 될 가능성이 있다. 하지만 나는 이 가능성을 매우 작게 평가하고 있었다. 왜냐하면 TED 웹은 그 성격상 유행에 민감하지 않고, 오래 전부터 계속해서 일관된 디자인을 유지해오고 있었기 때문이다. 하지만 최근, 그 가능성이 현실이 되었다.


무엇이 문제인가?

최근 TED는 특정 강연을 보여주는 웹페이지의 디자인을 변경했다. 발표자 정보 및 강연 요약 정보를 표시하는 부분이 아주 약간 변경되었으며, 자막을 별도로 표시하여 표시된 자막의 특정 위치를 선택하였을 때 그 위치부터 영상이 재생되도록 사용자 경험을 개선했다. (이는 TED+SUB의 아이패드 버전에서 제공하던 기능인데, 혹시 TED가 이걸 보고 웹에 추가한거라면 나는 무척 기쁠 것이다) 바로 이 과정에서 정보를 둘러싼 문자열에 변화가 생겼고, 이로 인해 TED+SUB의 정보 해석기가 제대로 동작하지 않게 되었다.


일단 급한 불부터 끄자! - v1.6

가장 먼저 TED+SUB에서 발표자 및 강연 요약 정보를 해석하지 못하는 문제가 발생했다. 그래도 이 때까지는 영상 재생에 문제가 없었기 때문에 스스로 '매우 큰 문제는 아님' 이라는 딱지를 붙이고 조금은 설렁설렁 대처했다. 이 참에 쌓아 둔 요구사항이나 반영할까- 하면서 말이다.

앱 리뷰와 이메일, 페이스북 앱 페이지 등을 보면서 가장 많이 요구되고 있던 문제 중 하나는 너무 많은 경고창이 나온다는 것이었다. 아이폰의 기본 경고창은 modal 방식이라고 해서, 경고창이 떠 있는 동안 다른 부분의 UI가 반응하지 않는다. TED+SUB은 꽤 많은 경고창을 사용하고 있다. 다운로드의 시작과 끝, 대처하지 못한 오류, 음소거 모드일 때 각각 경고창을 출력한다.

completed가 맞나??

이 중에서 다운로드와 관련된 경고창은 modal 방식일 필요가 없겠다는 결론을 내렸다. 강연을 보고 있는데 갑자기 경고창이 번쩍 뜨면서 '아까 다운로드 시킨거 다 됐어요, 확인 버튼을 눌러줄 때까지 보던 거 좀 세워 놓겠습니다' 라는데 이건 좀 깡패같은 느낌이랄까? 결코 그럴 필요가 없는, 다소 과하게 사용자 입력을 요구하고 있다는 생각에 이 부분을 non-modal 방식으로 변경하기로 결정했다.


Non-modal 방식의 경고창 출력을 위해 써드파티 라이브러리를 검색했다. 스스로 직접 구현할 수도 있겠지만, 그러면 구현과 검증에 너무 오랜 시간을 소비할 것 같았고, 또 잘 만들어져 있는 툴에 비해 퀄리티도 떨어질 것 같다는 생각이 들었기 때문이다. 그래서 찾은 것이 ATMHud 라는 라이브러리로 BSD 라이센스를 따르기 때문에 사용하기에 적합했다. 다운로드의 시작과 마침을 알리는 메시지는 모두 ATMHud를 이용하도록 코드를 수정했다.

몇 번의 테스트를 하는 동안 검색 기능과 관련해서 버그를 두 개 발견했다. 하나는 DB 동기화 알고리듬. TED+SUB은 검색 기능을 제공하기 위해 앱 내에 자체 DB를 생성한다. TED 웹에서 제공하는 검색 기능은 강연 외에도 다양한 페이지를 포함하고 있기 때문에 TED의 검색 기능을 앱에서 그대로 활용하기에 적합하지 않다. 또한 TED의 검색 기능은 영어 이외의 검색을 지원하지 않고 있다. 그래서 TED+SUB은 강연 목록을 토대로 자체 DB를 생성하고 유지한다. 이 기능을 구현하면서 나는 'TED의 강연 목록은 항상 새로운 강연이 추가되는 형식이다' 라고 가정했다. 그런데 이게 아니더라고! 목록 중간에 치고 들어오는 강연이 있었던 것이다. DB를 동기화하는 알고리듬은 최근의 강연 목록에 대해 이미 DB에 저장된 강연이 발견될 때까지만 훑어 내려간다. 그렇다보니 중간에 치고 들어온 강연을 발견하지 못했다; 그래서 DB  동기화 알고리듬을 수정했고, 제대로 동작하리라 믿고 있다. (적어도 이론적으로는 문제가 없어보인다. 테스트하는 동안 TED에 새로운 강연이 추가되지 않아 실제 테스트가 불가능했다)

두 번째 문제는 검색 결과가 출력되는 순서가 역전되었다는 것. 최근의 강연이 제일 위에 나와야 하는데 이게 뒤집혀 있었다. 꼼꼼히 테스트하지 않았기 때문에 이전까지 미처 발견하지 못했던 것이다. 게으른 개발자를 탓해도 좋다. 하지만 너무 나무라지 않기를...

여기까지 코드를 수정하고 버전 1.6으로 패키징한 뒤 애플에 제출했다. 애플의 승인 절차가 보통 1주일이 걸리기 때문에 이 때부터는 그저 기다리는 수 밖에 없다.


비디오 링크는 대체 어디로 간걸까? - v1.6.1

업데이트 버전의 승인을 기다리는 동안 초조함을 달래고자 수시로 앱을 실행시켜 보면서 또 다른 문제가 없나하고 보고 있는데 갑자기 강연이 재생되지 않고 앱이 그냥 죽어버리기 시작했다. 아뿔싸, 또 다시 TED 웹페이지에 변화가 생긴 것이다. 이번에는 비디오 링크를 둘러싼 영역이 변경되었다.

왜 이렇게 잦은 디자인 변경이 이루어지고 있는 것일까? TED는 유행에 민감한 곳도 아닌데... 하지만 TED를 탓할 순 없다. 어디까지나 TED+SUB은 비공식 앱이니까. TED 입장에서는 공식 앱만 잘 동작하면 그만이다. 그런데 얼마 안가서 또 다른 문제가 발생했다. TED+SUB이 아예 강연 페이지를 받아오지 못하는 것이 아닌가?

이 문제는 웹페이지 요청 시 자신의 신분을 밝히는 User-Agent 문자열을 변경해서 해결했다. 특별히 이 문자열을 지정하지 않으면 앱의 이름과 버전 등을 이용해서 자동으로 문자열을 생성하는 것으로 알고 있다. (웹 요청을 위해 사용하고 있는 ASIHTTPRquest 라이브러리 문서를 보니 그런 문구가 있더라) 그래서 User-Agent 문자열을 현재 내 컴퓨터에 설치된 사파리 브라우저의 그것으로 대체했다. 그랬더니 잘 되더라. 혹시나 TED 측에서 TED+SUB을 일부러 막은게 아닐까? 하고 조금은 불안해 했지만 아직까지 별다른 연락이 없는 걸 보면 그냥 다른 문제였겠거니 한다.

어쨌든 User-Agent 문자열을 변경하고, 비디오 링크를 추출하는 코드를 수정했다. 그리고 애플의 승인을 기다리고 있던 버전 1.6을 내리고 수정한 버전 1.6.1을 다시 올렸다. 이제부터 다시 1주일을 기다려야 한다; 업로드된 시점으로부터 1주일이다.

이 때부터 1주일은 참으로 암담한 기간이었다. 비디오 링크를 추출하지 못하기 때문에 강연을 재생할 수 없고, 얼마안가 User-Agent가 막히면서 아예 강연 페이지를 읽을 수 없게되자 앱이 처참하게 죽어버렸기 때문이다. 앱이 승인나려면 1주일은 기다려야 하는데... 굉장히 조급한 마음에 발만 동동. 하루에 열 통 이상의 메일이 날라오기 시작했고, 앱스토어나 페이스북 앱 페이지에는 부정적인 평가가 올라오기 시작했다. 사용자 이탈을 눈을 뜨고 지켜봐야 하는 심정은 그리 달갑지 않다. 꽤나 씁쓸하다. 우리 애가 뭔 잘못이 있다고... 부모의 심정과도 같은 감정이 몽글몽글 가슴 속에서 피어 오르고 있었다. 대부분의 TED+SUB 이용자가 비영어권 사람들이다. 그런 그들이 고생고생해서 영어로 작성한 메일들, 그냥 무시할 순 없었다. 하지만 그런 그들보다 더 처참한 영어를 구사하는 내게 답장은 매우 큰 장벽이었다. 하루동안 쌓인 메일에 답장을 보내는 일은 처음엔 굉장히 힘들었지만 나중엔 속도가 좀 붙더라. 가끔 한국인이 보낸 메일을 발견하면 어찌나 반갑던지!! 

빨리 승인이 나기를 바랬다. 매일매일 사용자는 다른 앱으로 떠나가고 있고, 부정적인 평가는 차곡차곡 쌓여가고 있었으니까. 앱스토어 리뷰에는 답글을 달 수 없어서 정말 답답했다. '으헝으헝- 업데이트 버전 지금 숭인 대기 중 입니다!!' 라고 모든 리뷰에 답글을 달고 싶었다.

하지만 1주일이 거의 다 되어갈 무렵, TED는 또 한 번 디자인을 변경했다,


완벽할 순 없지만, 그래도 좀 더 견고하게! - v1.6.2

버전 1.6.1의 승인을 기다리는 과정에서 또 다시 TED 웹에 변화가 생겼다. 이번 변화는 정말 사소한 변화인데 TED+SUB이 그 변화에 적응하지 못했다. 일단 문제는 선택한 강연에 대한 제목을 추출하지 못한다는 것, 원인을 분석해보니 웹페이지 내 강연 제목을 둘러싼 문자열에 공백이 하나 추가되어 있었다.

일단 제목만 출력되지 않을 뿐 앱의 나머지 동작에는 문제가 없었기에 버전 1.6.1의 승인을 기다리기로 결정했다. 여기서 또 한 차례 앱을 내리고 다시 올리게되면 업데이트가 너무 늦는다. 그리고 그 동안의 손실이 너무 클 것이라 판단했다. 업데이트가 승인나면 바로 다음 업데이트를 제출할 수 있도록 지금 작업하자!

이렇게 작은 변화에도 문제가 될 정도로 TED+SUB의 정보 해석기는 취약했다. 이건 좀 심각한 문제라는 생각이 들었다. 그래서 이 참에 정보 해석기 부분의 코드를 다듬자고 마음먹고 코드를 열어본 순간! 으헝헝- 

TED+SUB을 업데이트하는 과정에서 상당히 많은 부분이 다듬어져갔다. 초기의 거칠었던 코드들은 어느덧 유연하고 아름다운 패턴을 그리기 시작했다. 그런데 유일하게 한 부분만이 태초의 거친 모습을 고이 간직하고 있었는데 그게 바로 정보 해석기였던 것이다.

거의 이틀 내내 하루 종일 손가락을 움직였다. 조금씩 수정하고 다시 실행해보고, 제대로 동작하면 다시 또 수정하고 실행해보고를 계속 반복하는 동안 코드는 조금씩 다듬어져갔고, 어느 순간 코드가 '지금이야- 나를 버려!' 라고 외치기 시작했다. 코드를 계속해서 다듬어가다보면 정말 상이하게 다른 여러 군데의 코드들이 일순간 비슷한 모습을 띄기 시작한다. (이건 내 버릇 때문일지도 모른다. 일부러 스스로 그렇게 훈련해왔다) 그리고 그 순간 패턴이 아련하게 보이기 시작한다. 이 때부터는 아련한 패턴이 더욱 두드러지도록 코드를 다듬어야 한다. 여기서 해야 할 일은 명확하다. 패턴이 뚜렷하게 보이도록 코드를 수정한 다음, 그 패턴을 쏙 뽑아낸다. 그리고 원래의 코드들이 뽑아낸 패턴에 의해 동작하도록 수정한다. 이렇게 하면 흔히 말하는 '코드의 중복'을 피할 수 있다. 코드의 중복을 피하면 유지보수가 쉬운, 그리고 매우 아름다운 코드가 된다. (이게 뭔 헛소리야- 싶겠지만, 코드는 정말 아름다운 것과 그렇지 않은 것이 눈에 띄게 구분된다) 코드의 중복을 피하면 코드량이 줄어든다. 나는 새로운 코드를 작성하는 것보다 이미 작성된 코드를 줄이는게 훨씬 더 재밌다. 그렇다! 이번 작업은 무척 즐거운 과정이었다.

아주 많은 코드가 떨어져나갔다. 정보 해석기는 TED+SUB의 핵심 요소이다. 어째서 핵심 요소라 불리우는 녀석이 아직까지도 태초의 모습을 간직하고 있는거냐고 묻는다면, 글쎄... 그 만큼 중요한 부분이기 때문에 함부로 건드려서는 안된다랄까? 잘 돌아가는 코드는 사실 건드리지 않는게 상책이다. 문제는 지금 안 돌아가고 있다는 것이고, 그렇기 때문에 손을 댄 것이다. (최적화는 언제나 최후의, 최후에 해야 될 일이다. 그리고 그 때가 되더라도 최적화는 안하는게 낫다. 하지만 이번 작업은 최적화와는 다소 거리가 있다)

수정을 모두 마친 뒤, 코드는 정말 전신성형을 마친 연예인마냥 예뻐졌다. 이제 버전 1.6.1의 승인만을 기다릴 차례. 정말 딱 1주일이 지나서야 승인이 났고, 이번에 작업한 1.6.2를 바로 업로드했다. 이제 또 1주일을 기다려야 한다. 그래도 이번 기다림은 바로 전보다는 훨씬 마음이 가볍다.


여담

늘 이야기하지만 TED+SUB은 공식 앱이 아니다. TED+SUB과 관련해서 처음 적은 글에서도 언급했듯이 그저 '나도 아이패드용 앱 하나 만들어보고 싶다' 로 시작되었고, 많은 분들이 아껴주고 응원해주신 덕분에 여기까지 오게 되었다. 

이번에 앱이 먹통이 되면서 적지 않은 메일을 받았는데 그 중 극히 일부에서 '왜 안되냐, 빨리 고쳐라' 식의 짜증 섞인 말투의 메일을 받았을 땐 솔직히 정말 화가 많이 났다. 일부 사용자들은 무료 앱을 너무나 당연히 여긴 나머지, 개발자를 종 부리듯 하는 것 같다. 아무리 허접한 앱이라도 오랜 시간 생각하고, 고민하고, 노력한 결과이다. 그런 그들에게 안된다고 질책을 하기 보다는 응원의 메시지를 보내 주었으면 한다. 한 줄의 응원의 메시지가 더 좋은 앱을 만들게 하고, 더 좋은 개발 문화를 정착시키고, 이로 인해 더 스마트한 세상이 만들어지리라 생각한다.

유료 앱에 대한 편견도 좀 버렸으면 좋겠다. 앱이 비싸서, 공짜로 내려받아 설치하려고 아이폰/아이패드를 탈옥했다는 사람들이 내 주변에도 있다. 대체 얼마짜리 앱을 봤길래 비싸냐고 물었더니 1, 2달러 정도 하는 앱이라더라. 커피숍에서 아메리카노 한 잔 사는데 5천원은 선뜻 건내면서 어째서 1, 2달러 정도 하는, 담배 한 값보다 싼 앱을 보고 비싸다고 하는지 나는 도통 이해를 못하겠다. 그런 마음이 널리 퍼지면 퍼질수록 개발자들은 힘이 빠진다. 그들이 수 개월 밤낮으로 고생한 노력을 고작 2천원에 사는거다. 그렇게 생각하면 모마일 기기용 앱들은 정말 기가 막히게 싼 편이다. 풍토가 이렇다보니 개발자들도 선뜻 100달러, 200달러를 함부로 부르지 못한다. 그저 1, 2달러로 올려놓고 많이 팔리길 바랄 뿐이다.
 
탈옥 자체를 두고 뭐라고 할 생각은 없지만, 탈옥을 했더라도 앱은 제대로 구매해서 사용해 주었으면 한다. 보다 많은 개발자들이 힘을 얻고 더 좋은, 더 많은 앱을 개발할 수 있도록 응원해주었으면 한다. 그런 문화가 널리 조성되어야 한다. 



신고

CATEGORIES