가족여행차 샌 프란시스코에 갔다가 오랜만에 버클리 교정을 구경하러 갔다.

돌아다니다보니 Sather gate 근처의 분수대 주변에 이런 게 돌아다니고 있었다.

처음엔 학생이 만든 장난감 정도로 생각했다. 폰에 외장(?)렌즈를 달아서 꽂아놨는데 이게 상하좌우로 고개를 돌리기도 한다.

종이에는 이렇게 적혀있다.

Hi, Im Thomas, one of the bots of Kiwi Campus.
I'm doing a food delivery right now
If you have any inconvenience or doubt, contact us at
+1 510 309 2213 or f@kiwicampus.com

대략 음식을 배달하는 로봇이라고 한다.

버클리 학생이 창업하려고 아이디어를 냈나보다 하고 있다가 집으로 돌아와서 검색을 해봤다.

http://kiwicampus.com

아래는 메인 페이지에 나오는 영상이다.

콜롬비아의 스타트업이고 버클리에서 처음 서비스를 시작한 모양이다. 대학 캠퍼스에서 음식을 배달하는 서비스가 사업아이템이다.

생각해보니 은근 참신한 것같다. 배달을 꼭 드론이 할 필요 있나.

대학 캠퍼스는 면적이 넓지만 대중교통이 다니지 않고 식사를 할 수 있는 곳은 몇몇 지정된 건물 뿐이며 좀 맛있는 걸 먹으려면 캠퍼스 바깥으로 나가야한다. 면적이 넓기 때문에 RC카 형태의 봇들도 다닐 수 있고, 밥먹을 수 있는 곳이 멀기 때문에 배달음식 수요가 많다. 이걸 해결하는 것이 이 스타트업의 비지니스다.

그런데 이게 과연 충분히 수익성이 있고 확장가능한지는 잘 모르겠다 ㅎㅎ 우리나라 대학들도 배달 오토바이가 캠퍼스를 휘젓고 다니는 걸 이제 점점 금지하는 추세여서 이런 대안도 괜찮을 것같긴 한데…

현재 작업 중인 프로젝트는 상당 부분 Swift로 작성되어있고, 새로 작성하는 코드는 Swift로만 작성하고 있다. 그러다 Objective C로 구현된 부분을 건드려야할 일이 생겼다.

몇 가지 한정된 상태를 나타내고 관리하기 위해 enum을 선언하고 메서드를 추가하기로 했다.

Objective C에서 아래와 같이 새로운 enum 타입과 이를 인자로 받는 메서드를 선언했다고 가정하자.

typedef NS_ENUM(NSInteger, MyEnumType) {
	MyEnumTypeFirst,
	MyEnumTypeSecond
};

- (void)saveMyEnumType:(MyEnumType) mode {
	...
}

(Apple은 NS_ENUM을 사용하는 것을 권장한다.)

이제 Swift 코드에서 가져다 쓰려는데 원소 이름이 자동완성에 나타나지 않았다. 그런데 자세히 보니 MyEnumType부분이 생략되고 first, second만 나오고 있었다. 브릿지가 이 코드를 Swift로 넘겨줄 때 prefix를 자동으로 제거한 것이다.

때문에 아래와 같이 접근할 수 있다.

// value는 MyEnumType 타입
switch value {
case .first:
	...
case .second:
	...
}

그리고 접근 메서드는 이렇게 노출된다.

save(_ mode: MyEnumType)

그냥 save(value) 식으로 간결하게 사용할 수 있다.

A large portion of code in my current project is written in Swift and I’m using Swift for all my new code. Then today, I happened to modify a class written in Objective C.

What I wanted were an enum for representing some states and a method that handles the states in the class.

Assume that a new enum and a method that takes it as a parameter are defined in an Objective C source file as follows;

typedef NS_ENUM(NSInteger, MyEnumType) {
	MyEnumTypeFirst,
	MyEnumTypeSecond
};

- (void)saveMyEnumType:(MyEnumType) mode {
	...
}

(Apple recommends to use NS_ENUM.)

And then I tried to access them from a Swift class but their names didn’t show up on auto-complete suggestion. However, when I looked close, I could find the enum elements without a prefix MyENumType in the suggestion; first and second which were originally defined as MyEnumTypeFirst, MyEnumTypeSecond respectively in Objective C code. Swift bridge automatically got rid of prefix MyEnumType from the Objective C’s enum and provided a convinient way to use them.

So the enums can be used like this in a switch statement;

// value is MyEnumType
switch value {
case .first:
	...
case .second:
	...
}

And the method turned into like this;

// declared as saveMyEnumType in Objective C
save(_ mode: MyEnumType)

We can call the method like save(value) instead of saveMyEnumType(value). Simple and concise.

오늘 새벽에 합격을 알리는 메일이 왔다.

응시 후기는 여기.

아래 뱃지를 클릭하면 자세한 정보를 볼 수 있다.

exit interview는 화상통화로 진행된다. (물론 영어로 ㅎㅎ) 안드로이드 관련 상식을 몇 개 물어보긴 했지만 주된 목적은 시험을 실제 본인이 치렀는지를 확인하는 정도인 것 같다.

호기심에 질러보긴 했는데 막상 지나고나니 별 거 없고 허무하다;

이 자격을 취득한 사람이라면 확실히 안드로이드 앱 개발을 위한 기본기는 갖추었다고 볼 수 있겠다는 생각에는 변함이 없다. 그러나 순전히 그 정도 수준을 인정받기위해 149달러를 지불하는 것이 그다지 합리적인 판단은 아닌 것 같다. 그 돈으로 책을 사는 게 나을 것 같다 ㅎㅎ. 프로그래밍이 처음인 학생이라면 이런 자격증 공부보다는 CS 기초를 닦는 데에 시간을 쓰는 것이 바람직하고, 프로그래밍 경험이 어느 정도 있는 사람이라면 이 정도 수준은 인터넷에 있는 자료들을 통해 어렵지 않게 습득할 수 있어야한다.

개인정보를 요구하는 것도 좀 걸린다. 개인 신분증, 내 경우는 여권 스캔본을 업로드하고 신원을 확인했는데, 이 과정에서 민감한 개인정보가 오가게 된다는 부담이 있다. 평가가 온라인으로 이루어지는만큼 정확히 신원을 확인할 필요가 있는 것은 어쩔 수 없겠지만 썩 내키지는 않는다.

구글이 자격을 인증하는 방식은 어떤 방식일까, 뭔가 다른 게 있을까 하는 호기심에 응시해보았지만 기존 자격증의 한계를 넘진 못한 것 같다. 딱히 이력서에 추가하고 싶은 마음은 없다 ㅎㅎ

Update 2017-03-25: 합격 통보 받았다. 합격 후기

Update 2017-03-21: 조금 전에 리뷰가 통과되었다는 메일을 받았다. 이제 exit interview만 남았다.

3월 14일에 구글 개발자 블로그에 Associate Android Developer 인증 프로그램에 관한 포스트가 올라왔다. 작년에 소개 영상을 보기는 했는데 그동안 완전히 잊고 있다가 이 포스트를 보고 생각이 났다.

사실 이쪽 업계 종사자들은 대체로 자격증을 포함한 각종 능력평가를 회의적인 시각으로 바라보는 것이 일반적이다. 오히려 잡다한 자격증을 많이 가지고 있으면 실력을 의심받기도 한다.

하지만 나는 저 인증마크의 유혹을 뿌리칠 수 없었다! 저 인증마크는 내 것이 될 수 있을 것인가…응시료와 시험 난이도를 알아보자.

응시료

응시료는 $149로 꽤 비싸다. 그래도 한 번 납부하면 세 번까지 응시할 수 있다고 하니 이 부분은 그다지 큰 위험이 아닌 것 같다. 참고로 첫 실패 시에는 즉시 재응시가 가능하지만 두 번째 실패 시는 2개월간 재응시할 수 없다. 세 번째마저 실패하면 6개월간 재응시할 수 없고, 네 번째 응시할 때는 응시료를 다시 납부해야한다.

그렇다면 난이도는

시험은 응시료를 납부한 시점부터 48시간이 주어지고, 프로젝트 코드를 내려받아 주어진 문제를 해결하고 업로드하는 식으로 진행되는데, 이 글에 의하면 초급 개발자(entry level developer) 정도를 타겟으로 하는 시험이고, 중급자(seasoned developer)라면 반나절, 초보자라 하더라도 48시간이 결코 부족하지는 않을 것이라고 한다.

응시 진행!

한 번 납부하면 세 번까지 응시할 수 있고 난이도도 그리 높지 않다고 하니 응시를 미룰 이유가 없어졌다. 응시료를 납부하고 문제를 다운받았다. 최근에는 2개월 남짓 Xcode에서 swift로 iOS 개발에 몰두했더니 안드로이드 스튜디오에서 작업하는게 잠깐 낯설었다;

실제로 응시해보니

객관식이나 단답식 문항같은 것은 일체 없다. 외국 회사에서 개발자를 테스트해보는 과정 중에는 코딩 테스트로 넘어가기 전에 단답식 문제를 묻는 단계가 한두개 정도 들어가있는 경우가 있는데 그런 거 없이 바로 프로젝트를 수행하게 된다.

프로젝트는 단순해보이지만 안드로이드 구성요소를 전반적으로 한 번씩은 다 건드려보도록 되어있다. 액티비티, 서비스 등은 말할 것도 없고 UI 가이드라인, 알림, 위젯, 테스트도 빠뜨리지 않는다. 그리고 문제를 잘 풀기 위해서는 기존 소스코드를 충분히 분석하는 것도 필요하다. 직접적인 이유는 자동 채점 시스템이 클래스명이나 패키지명이 바뀐 것을 인식할 수 없기 때문이지만 실제 업무 프로젝트를 진행할 때에도 기존 코드에 대한 충분한 이해가 필요한 것은 마찬가지다. 즉, 없는 걸 만들어서 쓰기 보다는 제공되는 것들을 얼마나 잘 파악하고 활용하는지를 테스트하는 것 같다. (그 이상을 요구한다면 Advanced겠지…)

시간이 크게 부족하거나 하진 않았다. 어떻게든 주어진 조건대로 동작하기만 하면 된다고 했지만, 나는 기존 코드 구조를 최대한 유지하면서 최소한의 코딩으로 문제를 풀고 싶었고, 그런 부분들을 생각하느라 반 나절은 넘기고 총 하루 정도 걸렸던 것 같다.

신원 확인 절차

답안을 제출하고나면 바로 이어서 ID verification을 위해서 신분증(여권 또는 주민등록증)과 얼굴 사진을 업로드할 것을 요구한다. 이런 건 아예 응시하기 전부터 미리 준비해두는 게 편하다. 문제를 풀다보면 문제 제출하는 것만 신경쓰게 되는데, 48시간동안 그러다보면 신분증 스캔파일은 까맣게 잊어버리게 된다. 내가 그랬다. 다행히 나도 모르게(?) 보관해둔 파일이 있어서 무사히 확인 절차를 진행할 수 있었다. 카메라가 달린 노트북이라면 캠으로 찍는 것도 허용되는 것 같았다.

신원 확인이 완료되면 리뷰가 완료되기를 기다리면 된다. 안내문구에는 45일까지 걸릴 수도 있다고 한다. 앞에 소개한 블로그 포스트 글쓴이는 운좋게도 이틀만에 리뷰 완료 통보를 받았다고 하는데 과연…

결과를 기다리며…

아직 답안 리뷰도 완료되지 않은 상태지만 문제의 요구조건은 다 만족했으니 아마도 통과되지 않을까 예상하고 있다. 이후의 진행 상황에 대해서는 계속 포스팅할 예정이다.

응시를 고민하는 분들께

안드로이드 프레임워크 구성요소들을 한 번쯤은 다뤄본 경험이 있고, 비동기 처리에 어느 정도 감을 잡고 있는 상태라면 지금 바로 응시해도 무난히 통과할 수 있으리라 생각한다. 그러나 응시를 권하지는 않는다