스토리 홈

인터뷰

피드

뉴스

조회수 990

SNS의 댓글유형을 유심히 관찰해보았어요.

사실 제 글에는 그런 종류의 댓글이 별로 없긴 한데, SNS를 가끔 보다보면 묘하게 다양한 종류의 댓글들을 발견할 수 있었어요. 페북뿐 아니라 브런치의 댓글도 꽤나 다양한 양상을 보이더라구요. 브런치는 한결 공감과 응원의 스탠스가 더 지배적이긴 하지만요. 그래서 오늘은 재미로 보는 댓글정리를 해볼까 해요. 콘텐츠를 만드시는 분들이라면 댓글 등의 반응에 굉장히 예민할 수 없더라구요.댓글은 크게 5가지 유형의 공격형 캐릭과, 5가지 유형의 방어형 캐릭이 있습니다. 공격형은 주로 직접적인 표현과 의견 개진으로 상대방에게 어떠한 반응을 불러일으키는 스타일입니다. 직접적으로 먼저 댓글을 쓰는 경우가 많죠. 자신의 의견과 틀리거나 너무 공감하거나 또는 그냥 원래 아무말이나 하는 타입이랄까요.공격형캐릭은 이렇게 나뉩니다.1. 아무말 공격형요새 힘들다는 글에 "그런데 여기 서울숲 아닌가요?" 댓글을 다는 식이죠. 의식의 흐름이 어떻게 흘러가는 지 모르겠지만 두뇌의 활발한 자유를 부여한 타입입니다.2. 변태주로 메시지공격으로 정확성을 높여요. 친해져도 될까요? 내지는 갑자기 손을 흔든다거나, 연락처를 갑자기 물어보기도 하죠. 결혼했냐? 를 물어보기도 해요. 제발 그러지 말아요.3. 꼬투리테이커 & 불편러그런데 그건 잘못된 거 아닌가요?, 그게 잘못인가요?, 그거 먹는다고 죽나?, 그렇게 예민하면 어떻게 삽니까 등.. 물론 불편해서 의견개진을 할 순 있는데, 편의점 알바가 '봉투 드릴까요?' 라고 말할 때 '아니 그럼 맨 손으로 들고가욧?!' 이라고 대꾸하는 느낌입니다.(좋은 말로 해도 될 걸) 주로 의문문 형태를 추구합니다.4. 모든 게 슬픈 타입저도 그런 적이ㅠㅠ, 담에 봬요ㅠㅠㅠㅠ, 힘내세요ㅠㅠㅠ, 건강이 중요합니다ㅠㅠㅠㅠㅠ 등...항상 울어벌임5. 찬미와 찬양을 즐겨하는 타입아침에 피어난 샛별의 이슬처럼 아름다우십니다. 오늘도 맑은 하늘같은 청량한 하루가 되세요. 언제나 그 미모가 변치 않으십니다. 우리들의 인연에 감사드립니다. 등.. 이 분들의 형용사 수식능력은 정말 화려함의 극치에요. 약간 신라시대의 건축양식을 보는 듯한 느낌이에요. 직접적인 공격이라고 하긴 어렵지만, 받는 사람에게 부담을 줄 수 있죠. 특히 저런 댓글엔 모란이나 이슬, 인연 글귀/사진이 많이 달려요.약간 이런 느낌방어형 캐릭방어형 캐릭은 주로 위 공격형 댓글의 대댓글 형식으로 많이 진행되며, 공격에 대한 방어 또는 카운터어택의 형식을 많이 띠고 있습니다. 방어도 힐링형과 진동형으로 나뉘어요.힐링형은 ㅋㅋㅋ와 ㅠㅠ 등 소극적 감정표현을 통해 상대와 공감/소통하려고 하는 타입이고 진동형은 상대방의 공격에 대해 리액션/역공/튕겨내기/맞장구 등 다양한 커뮤니케이션을 통해 상대의 공격패턴을 역이용하는 경우입니다. 방어형 캐릭도 5가지가 있습니다.1. 모든 것을 거.부.한.다. 대표적인 진동형캐릭이라고 할 수 있어요.예)브로콜리 싫다는 글을 썼어요댓글: 저도 싫어해요ㅠㅠ(슬픔러 등장)방어: 저는 가끔먹긴해요(반박)댓글: 그래도 건강에 좋은건데 드세요(시어머니 등장)방어: 싫은걸 억지로 먹긴..(반박)댓글: 나중엔 드시게 될거예요(예언자 등장)방어: 그렇진 않을 것 같아요^^;;(반박)댓글: 으 브로콜리 너무 싫어!!(공감러 등장)방어: 저는 막 그정도는 아니구요(반박)어쩌라는 거야..2. 무응답대댓글도, 좋아요도 엄지도 하지 않아요. 그냥 바라볼 뿐. 마블유니버스의 왓쳐같은 타입이죠. 힐링형에 속하는 듯 하지만 실상은 진동형에 가까워요. 사실 공격형 댓글은 대부분 그 리액션이 존재할 때 빛을 발하는데, 아무 대댓글이 없으면 공격자 입장에선 보이지 않는 초조함에 시달리곤 해요. 내가 뭘 잘못쓴건가? 기분이 나쁘셨나? 오해한걸까? 등등..3. ㅋㅋㅋ/ㅠㅠ타입사실 이 ㅋㅋㅋ는 무표정으로 치고 있어요. 별 할 말 없거나 그닥 그렇게 아무 얘기나 할 사이는 아닌 경우, 피상적인 사이버친구 등등이랄까요.. 현웃이 터지면 ㅋ를 정확히 치기 어려워요. 대부분 ㄲ,ㄱ이 섞이기 마련이죠. ㅋㅋㅋ가 10개 이상이거나 '아 씨밬' / '미친' 등이 붙기도 하구요.. ㅠㅠ도 마찬가지. 힐링형에 속하는 방어타입이에요.4. 말없이 표정으로 승부하는 타입댓글없이 좋아요, 슬퍼요, 화나요, 멋져요만 눌러 감정을 표현해요. 힐링형이죠. 브런치에선 라이킷만 누르고 가는 타입이에요. 대부분은 웃겨요나 멋져요를 사용하거나 엄지를 주는 경우가 많아요.5. 우리 언제봐요 타입대부분의 댓글에 우리 언제봐요 시전해요. 진동형에 속하며 오프라인에서 직접 인연이 닿은 경우나 또는 그냥 한 번 보고싶은 경우, 궁금한 경우, 상대방이 흑심이 있을 경우, 그냥 변태인 경우 등등이 있어요. 50%의 확률로 진짜 친한 사이던가, 아니면 상대입장에서 왜 자꾸 보자그럴까...아젠다도 없으면서.. 라는 생각을 불러일으켜요. 기타댓글 타입1. 격려형고생한다, 멋지다, 여윽시!, 항상 멋지십니다!2. 드립퍼짤과 개드립이 난무함. 진지파괴자. 저같은 타입이에요.3. 속마음 말하는 유형좋아요!(너무했나?) 이런 식으로 괄호를 즐겨써요. 덕후체와 비슷한 것 같아요. 4. 변태Quiero sex un beso! 등등 외국어 댓글이나 하앍.. 등등을 적더라구요. 여름철 휴가사진에 주로 달려요.5. 모놀로그하아..가고싶다 / 일만 아니면.ㅠㅠ / 아쉽네요.. / 예전엔 그런거 했었는데... / 연차쓰고싶다... 등등 혼잣말을 즐겨쓰십니다.6. 뜬금포브로콜리 싫어요란 글에 "근데 예전에 고등어도 싫다고 하지 않으셨어요?"  대댓글 : 네?를 유발시키죠.7. 안분지족흐르는 강물처럼 다 지나는 일 아니겠습니까, 마음을 편하게 가지시고 힘내세요. 등등.. 현자의 모습을 보여주시는 분들도 있어요.8. 크리스챤주님의 인도하심으로 곧 좋은 일이 있을거예요! 그분의 뜻을 기다리쟈구요!9. 점점점과 아재체맞아여... 완죤 좋더라구여!, 으떻하지..하아 힘들다.... 등등 보통 점점점은 반드시 3개 정도를 쓰십니다.10. 모란꽃과 인연짤친구수락에 감사드립니다, 좋은 인연 만들어나가요!(+모란꽃)11. 겸손한데 뭔가.. 제가 알기론 그거 아니예요!!! 물론 제가 틀릴수도 있지만요... 유형이에요. 뭔가 기분이 나쁜데..안나쁘기도 하고 겸손한 것 같은데 아닌 것 같기도 해서...반응하기 참 애매한 타입이죠.12. 단호한 타입네? / 아닌데요? / 절 아시나요? 등 주로 3,6번의 공격의 방어타입으로 사용13. 지나가는 행인형하아... / 대표님 왜이러세요.. 등등 그냥 스치는 바람같은 말들을 남기고 가시는데 가끔 댓글 뒤에 (지나가던 행인) 등을 붙이기도 해요. 14. 감사합니다.모든 댓글에 '엄지/멋져요'를 눌러주고 감사합니다^^/~/.../! 등을 붙여요..사실 딱히 뭐라 할 말이 없어서 그냥 쓰는 경우도 종종 있어요.-보너스 : 메시지타입페북 메시지는 크게 좋지 않은 메시지와 실질적 메시지로 나뉘어요. 실질적 메시지는 주로 내가 요청한 어떤 이슈에 대한 응답이나 신청 등의 유형이 주를 이루거나, 사업관련된 미팅제안인데 개인적으로 얘기해야 할 경우, 또는 친분이 있는 상태이지만 연락처까지 주고받진 않은 경우 카카오톡으로 넘어가기 위한 중간 브릿지 정도로 활용된다. 바이프로스트 같은 역할이에요.. 하지만 페북으로 의뢰를 툭 던지면 기분이 나빠요. 약간 SNS에도 예의와 무게감이란 게 알게 모르게 있는데, 페북은 가장 하찮은 무게감을 지니고 있는 느낌이에요.간혹 친구수락에 감사드립니다, 어디서 보고 친구신청했습니다 수락감사드립니다. 등등의 인사메시지가 오기도 해요. 이것은 꽤나 정중하고 감사한 일이라고 할 수 있죠. 물론 답변은 대부분 '네^^감사합니다..' 등으로 갈음하곤 해요.근데 나머지는 대부분 변태사람들이 주를 이루는데, 뭐랄까 일단 손흔들기. 뭐임? 또는 아름다우십니다, 한번 만나봬도 될까요? 나 다짜고짜 '연락처 좀 알려주실 수 있으세요?' / 저 어디에 누군데 도와드릴 수 있을 것 같습니다(니가 뭘) / 가까운 데 계시는군요. 차라도 한 잔 하시죠 등등의 친한 척 지리는 한따까리 음모성 메시지가 참으로 많았어요..특히 여자대표님이나 좀 이름알려진 스타트업/대기업출신 등의 여성페친님들에겐 이게 극도로 심한 듯 해요.. 프사를 간만에 잘나온 인생셀카로 바꿔놓으면 메시지는 하루에 30건이 넘어가기도 한다더라구요. 그래서 견디다 못한 분들은 해남고구마 10kg에 34,000원 판매 프사로 바꿔놓기도 하고 그래요. 세상엔 수많은 다양한 인류가 살고 있고, 참으로 이 생명의 다양성에 다시 한 번 무릎을 탁 치게 됩니다. 좋은 댓글문화를 만들어 나갑시다.(급교훈)
조회수 1072

스타트업으로의 출근길에 서기까지

학교가 날 죽이려 한다고 주장하던, 머리에 피도 안 마른 때가 있었다. 정말이지 진지했다. 선생님들은 질문을 좋아하지 않았고, 나는 이해가 안 되는 내용을 머릿속에 넣고 싶지 않았다. 무작정 외우는 것은 큰 잘못을 하는 기분이었고 시험도 별로 진지하게 느껴지지 않았다. 범인(凡人)인 주제에 공부를 한다는 이유로 호기심을 잃고 싶지 않았다. 가진 것이라곤 호기심과 시간밖에 없는 어린 나에게 학교는 모든 것을 빼앗으려고 하는 것처럼 느껴졌다. 학교를 그만 다녀야겠다. 개가 웃을 이야기지만 당시에는 사뭇 비장했다.[ 학교가 창의성을 죽일까? 재생되지 않습니다. 출처: TED ]믿기지 않지만 매우 조용한 학생이었다. 말 수도 적고 내성적이었다. 친구들과는 좋지도 나쁘지도 않은 관계를 유지하고 혼자만의 세계에 살았다. 더욱 믿기지 않지만 게임을 열심히 해 본 적도 있었다. 성적은 중간 정도였다. 학교를 그만 다녀야겠다, 라는 말에 친구들은 중 2병이라고 대수롭지 않게 생각했던 것 같다. 공교롭게도 중학교 2학년이었다. 친구도 별로 없어 보이던 내가 자폐가 아닐까 오랫동안 걱정하신 어머니는 자퇴를 하겠다는 말에  많이 놀라셨다. 무슨 일을 하든 대인관계가 중요한 것인데, 고립되어 살면 안 된다고 말씀하셨다. 내가 딱히 문제가 있는 것도 아닌데 대인관계라니? 한참 자퇴를 주장하다가 속는 셈 치고 대안학교에 가보자, 로 타협을 보았다. 주변에서는 무슨 뚱딴지같은 소리냐고 모두가 어이없어했다.[시리게 그리운 그곳, 무주. 사진제공: 처음 보내주신 메일 제목이 '담탱이'였던 영원한 나의 선생님, 용성쌤.]평생 서울에 살다가 무주 푸른꿈 고등학교의 네 번째 입학생이 되었다. 눈이 펑펑 내리는 덕유산 자락이었다. 입학하던 때에도 눈이 소복이 내렸다. 울창한 나무들에는 화려한 눈꽃이 피었다. 눈안개에 하얗게 잠드는 대자연이 시리도록 아름다웠다. 길에는 가로등조차 없어 밤에는 은하수가 쏟아졌다. 청명한 날은 별똥별이 밤하늘을 긁었다. 여름엔 반딧불이가 날았다. 중국집과 피시방이 있는 읍내는 빨리 걸어도 한 시간이 넘게 걸렸다. 버스는 하루 네 대가 정해진 시각을 어김없이 다녔다. 히치하이킹이 주요 교통수단이었다. 무턱대고 지나가는 차를 세우던 시절, 정말 겁도 없었다.개교 사 년 차다 보니 그야말로 실험적인 교육의 실험적인 단계였다. 돌이켜보면 스타트업에 가까운 모습이었다. 최소한의 인프라로 간신히 체계를 잡고 방향에 대한 고민을 할 때였다. 선생님들은 특이한 학생들을 따듯이 안아주셨다. 학생회는 어느 정도 자율적인 재정과 사업권을 가지고 있었고 상당한 범위의 의사결정을 할 수 있었다. 기숙사에서는 이상하기로 우열을 가리기 힘든 친구들과 생활을 했다. 몇 시에 일어나고 자야 하는지부터 시작해서 사소한 모든 일에 부딪쳤다. 누구는 고양이를 닮아 씻는 걸 싫어했고 누구는 그걸 또 샤워실에 끌고 가 기어이 씻겨내었다. 첫 한 달은 전쟁에 가까운 생활이었다. 나도 나지만 너도 참 너다. 산골에 있는 대안학교까지 진격해 온 친구들이니 오죽하겠냐마는. 모두가 모든 사고방식, 행동양식에 의문을 제기했다. 나도 그 정도로 호기심이 많진 않았는데. 많은 것들에 대해 고민과 회의를 하게 되었다. 정신없이 싸우고 대화를 했다. 일 년 동안 엄청나게 이상한 친구들끼리 함께, 그리고 즐겁게 살 수 있는 방법에 대해서 터득해 나갔다. 대인관계가 제일 어려운 거구나.[대안학교 입학 후 사랑하는 어머니가 보내주신 편지. 나도 이런 편지를 쓸 수 있을까.]문득 정신을 차려보니 참석해야 하는 회의가 매 달 스무 개가 넘었고 준비해야 하는 건 훨씬 더 많았다. 그래, 이쯤이면 학교는 충분히 다닌 것 같다. 어머니 말씀과 학교 덕에 감사하게도 나름 사회화가 되어 그래도 사람 같아졌는데, 이제는 정말 그만두어야겠다. 혼자만의 시간이 필요하다. 일기에 '타협하는 것이 철이 드는 것이라면, 영원히 철이 들지 말아라.'는 제목의 중 2병 가득한 출사표를 썼다. 모두의 반대에도 단칼에 집으로 돌아왔다. 대안학교마저 그만둔 공식 부적응 학생이 되었다.[길원숭이 손을 소심히 잡고 기뻐하는 동네 바보 형입니다. 부적응이지만 해치지 않아요. 사진제공: Adit Sombunsa. Lopburi, Thailand.]십 년이 훌쩍 지났다. 혼자서 하고 싶은 것들을 재미있는 만큼 하다 보니 금융의 논리에 매료되어 경제학 전공으로 그럭저럭 집근처 대학교를 다녔고 기업재무학회(CFRC) 덕에 외국계 금융회사에 들어갔다. 처음엔 VBA를 깨치면서 상당히 재밌었지만 주식파생부(Equity Derivatives)는 줄어들고 있었고 새로운 일은 없었다. 6개월 만에 흥미를 전부 잃었다. 공부가 더 재밌겠다. 고등학교를 그만둬보니 회사는 훨씬 쉬웠다. 미쳤다는 소리를 바람처럼 가볍게 듣고 학교로 돌아왔다.심오한 학문의 입구 앞에 서보았다. 감히 정진했다고 표현할 수는 없을 것 같다. 나름 열심이었다. 석사과정을 시작하고는 국내외 학술대회에 참석하느라 서울에 없던 날을 제외하고 연구실에 가지 않은 날이 단 하루뿐이었다. 대부분의 날에 열 시간은 집중력을 유지했다. 그럼에도 시간보다는 집중력을 우선했고, 시험보다는 호기심을 키우는 데 몰두했다. 연구실은 석사생 스물다섯 명이 쓰는 독서실 같은 분위기여서 매일 갈 필요는 없었는데, 대단한 친구들이 많았다. A는 짧지 않은 기간 동안 매일 4시간씩 자면서 대전에서 통학을 했다. B는 집과 상대(商大) 외의 삶이 아예 없었다. C는 서울에 살면서도 통학하는 왕복 두 시간이 아깝다고 일주일에 삼사일은 연구실에서 잤다. 우리는 거의 가족이었다. 신정도 구정도 추석도 크리스마스도 함께 밥을 먹고 각자 연구를 했다. 나도 나지만 너도 참 너다. 도대체 연애는 어떻게 하고 있는 거냐. 즐겁게 공부하던 친구들은 모두 좋은 조건으로 국내외 박사과정에 진학하거나 공공기관으로 갔다.나는 뜬금없이 에잇퍼센트라고, 정말 작은 핀테크 스타트업에 들어와 버렸다. 재밌어 보였고 내가 찍어온 상이해보이는 점들을 연결할 수 있을 것 같았다. 학업과 병행하기로 하고 들어와 보니 회사도 엄청나게 달리고 있었다. 내 속도도 꽤 빠른 편이라고 생각했는데 사람도 아닌 회사의 속도가 나보다도 더 빠른 느낌이었다. 어라, 이 회사는 뭐지, 제정신인가? 처음 겪는 경험이었다.연구하면서 이뤄온 것이 변변치 않아 문과 석사치곤 노력이 가상하다, 정도지만 공부를 한 게 아깝지 않냐는 이야기도 들었다. 다행일지 불행일지 서른 즈음에도 철이 안 들었나 보다. 그래도 회사일과 학업을 병행하며 쉽지 않던 봄학기가 끝났다. 지도교수님과 동료들의 도움으로 무사히 석사 졸업을 마쳤다. 이제 정말 에잇퍼센트에만 자리하게 되었다. 커리어 같은 건 잘 모르겠다. 미련해서 앞뒤를 재는 편은 아니다. 아니, 미쳤다는 소리를 즐기면서 살았던 것도 같다. 모두의 반대를 무릅쓰고 자퇴를 했을 땐 여러모로 쉽지 않았는데 지금은 폭풍에도 의지할 수 있는 엄청난 동료들이 함께하고 있다.[신나는 월요일! 맨 몸으로 싸우자 세상아. 출처: Unsplash.]가을의 향기가 난다. 얼굴에 닿는 바람은 기분이 좋을 뿐이다. 조금 더 속도를 높여도 좋을 것 같은 월요일 출근길. 서른 즈음에, 아직 나간 넋을 잡을 생각이 없다.#8퍼센트 #에잇퍼센트 #첫출근 #출근 #팀워크 #동료 #팀원
조회수 1903

Tips for building fast portrait segmentation network with TensorFlow Lite

PrefaceDeep learning has led to a series of breakthroughs in many areas. However, successful deep learning models often require significant amounts of computational resources, memory and power. Deploying efficient deep learning models on mobile devices became the main technological challenge for many mobile tech companies.Hyperconnect developed a mobile app named Azar which has a large fan base all over the world. Recently, Machine Learning Team has been focusing on developing mobile deep learning technologies which can boost user experience in Azar app. Below, you can see a demo video of our image segmentation technology (HyperCut) running on Samsung Galaxy J7. Our benchmark target is a real-time (>= 30 fps) inference on Galaxy J7 (Exynos 7580 CPU, 1.5 GHz) using only a single core.Figure 1. Our network runs fast on mobile devices, achieving 6 ms of single inference on Pixel 1 and 28 ms on Samsung Galaxy J7. Full length video. There are several approaches to achieve fast inference speed on mobile device. 8-bit quantization is one of the popular approaches that meet our speed-accuracy requirement. We use TensorFlow Lite as our main framework for mobile inference. TensorFlow Lite supports SIMD optimized operations for 8-bit quantized weights and activations. However, TensorFlow Lite is still in pre-alpha (developer preview) stage and lacks many features. In order to achive our goal, we had to do the following:Understand details of TensorFlow and Tensorflow Lite implementation.Design our own neural network that can fully utilize optimized kernels of TensorFlow Lite. (Refer to 1, 2 and 3)Modify TOCO: TensorFlow Lite Optimizing Converter to correctly convert unsupported layers. (Refer to 4)Accelerate several quantized-layers with SIMD optimized code. (Refer to 5 and 6)We are willing to share our trials and errors in this post and we hope that readers will enjoy mobile deep learning world :)1) Why is depthwise separable layer fast in Tensorflow Lite ?Implementing low-level programs requires a bit different ideas and approaches than usual. We should be aware that especially on mobile devices using cache memory is important for fast inference.Figure 2. Memory access requires much more energy (640 pJ) than addition or multiplication.Accessing cache memory (8 pJ) is much cheaper than using the main memory (table courtesy of Ardavan Pedram) In order to get insight into how intrinsics instructions are implemented in Tensorflow Lite, we had to analyze some implementations including depthwise separable convolution with 3x3 kernelsBelow we describe some of the main optimization techniques that are used for building lightweight and faster programs.Loop UnrollingCan you spot the difference between the following two code fragments?for (int i = 0; i < 32; i++) { x[i] = 1; if (i%4 == 3) x[i] = 3; } for (int i = 0; i < 8; i++) { x[4*i ] = 1; x[4*i+1] = 1; x[4*i+2] = 1; x[4*i+3] = 3; } The former way is what we usually write, and the latter is loop-unrolled version of former one. Even though unrolling loops are discouraged from the perspective of software design and development due to severe redundancy, with low-level architecture this kind of unrolling has non-negligible benefits. In the example described above, the unrolled version avoids examining 24 conditional statements in for loop, along with neglecting 32 conditional statements of if.Furthermore, with careful implementation, these advantages can be magnified with the aid of SIMD architecture. Nowadays some compilers have options which automatically unroll some repetitive statements, yet they are unable to deal with complex loops.Separate implementation for each caseConvolution layer can take several parameters. For example, in depthwise separable layer, we can have many combinations with different parameters (depth_multiplier x stride x rate x kernel_size). Rather than writing single program available to deal with every case, in low-level architectures, writing number of case-specific implementations is preferred. The main rationale is that we need to fully utilize the special properties for each case. For convolution operation, naive implementation with several for loops can deal with arbitrary kernel size and strides, however this kind of implementation might be slow. Instead, one can concentrate on small set of actually used cases (e.g. 1x1 convolution with stride 1, 3x3 convolution with stride 2 and others) and fully consider the structure of every subproblem.For example, in TensorFlow Lite there is a kernel-optimized implementation of depthwise convolution, targeted at 3x3 kernel size:template <int kFixedOutputY, int kFixedOutputX, int kFixedStrideWidth, int kFixedStrideHeight> struct ConvKernel3x3FilterDepth8 {}; Tensorflow Lite further specifies following 16 cases with different strides, width and height of outputs for its internal implementation:template <> struct ConvKernel3x3FilterDepth8<8, 8, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 2, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 1, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 2, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 1, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 4, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 1, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 4, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 1, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 4, 2, 2> { ... } Smart Memory Access PatternSince low-level programs are executed many times in repetitive fashion, minimizing duplicated memory access for both input and output is necessary. If we use SIMD architecture, we can load nearby elements together at once (Data Parallelism) and in order to reduce duplicated read memory access, we can traverse the input array by means of a snake-path.Figure 3. Memory access pattern for 8x8 output and unit stride, implemented in Tensorflow Lite's depthwise 3x3 convolution. The next example which is targeted to be used in much smaller 4x1 output block also demonstrates how to reuse preloaded variables efficiently. Note that the stored location does not change for variables which are loaded in previous stage (in the following figure, bold variables are reused):Figure 4. Memory access pattern for 4x1 output and stride 2, implemented in Tensorflow Lite's depthwise 3x3 convolution. 2) Be aware of using atrous depthwise convolutionAtrous (dilated) convolution is known to be useful to achieve better result for image segmentation[1]. We also decided to use atrous depthwise convolution in our network. One day, we tried to set stride for atrous depthwise convolution to make it accelerate computation, however we failed, because the layer usage in TensorFlow (≤ 1.8) is constrained.In Tensorflow documentation of tf.nn.depthwise_conv2d (slim.depthwise_conv2d also wraps this function), you can find this explanation of rate parameter.rate: 1-D of size 2. The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. If it is greater than 1, then all values of strides must be 1.Even though TensorFlow doesn’t support strided atrous function, it doesn’t raise any error if you set rate > 1 and stride > 1. <!-- The output of layer doesn't seem to be wrong. -->>>> import tensorflow as tf >>> tf.enable_eager_execution() >>> input_tensor = tf.constant(list(range(64)), shape=[1, 8, 8, 1], dtype=tf.float32) >>> filter_tensor = tf.constant(list(range(1, 10)), shape=[3, 3, 1, 1], dtype=tf.float32) >>> print(tf.nn.depthwise_conv2d(input_tensor, filter_tensor, strides=[1, 2, 2, 1], padding="VALID", rate=[2, 2])) tf.Tensor( [[[[ 302.] [ 330.] [ 548.] [ 587.]] [[ 526.] [ 554.] [ 860.] [ 899.]] [[1284.] [1317.] [1920.] [1965.]] [[1548.] [1581.] [2280.] [2325.]]]], shape=(1, 4, 4, 1), dtype=float32) >>> 0 * 5 + 2 * 6 + 16 * 8 + 9 * 18 # The value in (0, 0) is correct 302 >>> 0 * 4 + 2 * 5 + 4 * 6 + 16 * 7 + 18 * 8 + 20 * 9 # But, the value in (0, 1) is wrong! 470 Let’s find the reason why this difference happened. If we just put tf.space_to_batch and tf.batch_to_space before and after convolution layer, then we can use convolution operation for atrous convolution (profit!). On the other hand, it isn’t straightforward how to handle stride and dilation together. In TensorFlow, we need to be aware of this problem in depthwise convolution.3) Architecture design principles for efficient segmentation networkUsually segmentation takes more time than classification since it has to upsample high spatial resolution map. Therefore, it is important to reduce inference time as much as possible to make the application run in real-time.It is important to focus on spatial resolution when designing real-time application. One of the easiest ways is to reduce the size of input images without losing accuracy. Assuming that the network is fully convolutional, you can accelerate the model about four times faster if the size of input is halved. In literature[2], it is known that small size of input images doesn’t hurt accuracy a lot.Another simple strategy to adopt is early downsampling when stacking convolution layers. Even with the same number of convolution layers, you can reduce the time with strided convolution or pooling within early layers.There is also a tip for selecting the size of input image when you use Tensorflow Lite quantized model. The optimized implementations of convolution run best when the width and height of image is multiple of 8. Tensorflow Lite first loads multiples of 8, then multiples of 4, 2 and 1 respectively. Therefore, it is the best to keep the size of every input of layer as a multiple of 8.Substituting multiple operations into single operation can improve speed a bit. For example, convolution followed by max pooling can be usually replaced by strided convolution. Transpose convolution can also be replaced by resizing followed by convolution. In general, these operations are substitutable because they perform the same role in the network. There are no big empirical differences among these operations. <!-- substitutable -->Tips described above help to accelerate inference speed but they can also hurt accuracy. Therefore, we adopted some state-of-the-art blocks rather than using naive convolution blocks.Figure 5.  Atrous spatial pyramid pooling (figure courtesy of Liang-Chieh Chen) Atrous spatial pyramid pooling[1] is a block which mimics the pyramid pooling operation with atrous convolution. DeepLab uses this block in the last layer.We also substitute most of the convolution layers with efficient depthwise separable convolution layers. They are basic building blocks for MobileNetV1[3] and MobileNetV2[4] which are well optimized in Tensorflow Lite.4) Folding batchnorm into atrous depthwise convolutionWhen quantizing convolution operation followed by batchnorm, batchnorm layer must be folded into the convolution layers to reduce computation cost. After folding, the batchnorm is reduced to folded weights and folded biases and the batchnorm-folded convolution will be computed in one convolution layer in TensorFlow Lite[5]. Batchnorm gets automatically folded using tf.contrib.quantize if the batchnorm layer comes right after the convolution layer. However, folding batchnorm into atrous depthwise convolution is not easy.In TensorFlow’s slim.separable_convolution2d, atrous depthwise convolution is implemented by adding SpaceToBatchND and BatchToSpaceND operations to normal depthwise convolution as mentioned previously. If you add a batchnorm to this operation by including argument normalizer_fn=slim.batch_norm, batchnorm does not get attached directly to the convolution layer. Instead, the graph will look like the diagram below: SpaceToBatchND → DepthwiseConv2dNative → BatchToSpaceND → BatchNorm The first thing we tried was to modify TensorFlow quantization to fold batchnorm bypassing BatchToSpaceND without changing the order of operations. With this approach, the folded bias term remained after BatchToSpaceND, away from the convolution layer. Then, it became separate BroadcastAdd operation in TensorFlow Lite model rather than fused into convolution. Surprisingly, it turned out that BroadcastAdd was much slower than the corresponding convolution operation in our experiment:Timing log from the experiment on Galaxy S8 ... [DepthwiseConv] elapsed time: 34us [BroadcastAdd] elapsed time: 107us ... To remove BroadcastAdd layer, we decided to change the network itself instead of fixing TensorFlow quantization. Within slim.separable_convolution2d layer, we swapped positions of BatchNorm and BatchToSpaceND. SpaceToBatchND → DepthwiseConv2dNative → BatchNorm → BatchToSpaceND Even though batchnorm relocation could lead to different outputs values compared to the original, we did not notice any degradation in segmentation quality.5) SIMD-optimized implementation for quantized resize bilinear layerAt the time of accelerating TensorFlow Lite framework, conv2d_transpose layer was not supported. However, we could use ResizeBilinear layer for upsampling as well. The only problem of this layer is that there is no quantized implementation, therefore we implemented our own SIMD quantized version of 2x2 upsampling ResizeBilinear layer.Figure 6. 2x2 bilinear upsampling without corner alignnment. To upsample image, original image pixels (red circles) are interlayed with new interpolated image pixels (grey circles). In order to simplify implementation we do not compute pixel values for the bottommost and rightmost pixels, denoted as green circles.for (int b = 0; b < batches; b++) { for (int y0 = 0, y = 0; y <= output_height - 2; y += 2, y0++) { for (int x0 = 0, x = 0; x <= output_width - 2; x += 2, x0++) { int32 x1 = std::min(x0 + 1, input_width - 1); int32 y1 = std::min(y0 + 1, input_height - 1); ResizeBilinearKernel2x2(x0, x1, y0, y1, x, y, depth, b, input_data, input_dims, output_data, output_dims); } } } Every new pixel value is computed for each batch separately. Our core function ResizeBilinearKernel2x2 computes 4 pixel values across multiple channels at once.Figure 7. Example of 2x2 bilinear upsampling of top left corner of image. (a) Original pixel values are simply reused and (b) – (d) used to interpolate new pixel values. Red circles represent original pixel values. Blue circles are new interpolated pixel values computed from pixel values denoted as circles with black circumference. NEON (Advanced SIMD) intrinsics enable us to process multiple data at once with a single instruction, in other words processing multiple data at once. Since we deal with uint8 input values we can store our data in one of the following formats uint8x16_t, uint8x8_t and uint8_t, that can hold 16, 8 and 1 uint8 values respectively. This representation allows to interpolate pixel values across multiple channels at once. Network architecture is highly rewarded when channels of feature maps are multiples of 16 or 8:// Handle 16 input channels at once int step = 16; for (int ic16 = ic; ic16 <= depth - step; ic16 += step) { ... ic += step; } // Handle 8 input channels at a once step = 8; for (int ic8 = ic; ic8 <= depth - step; ic8 += step) { ... ic += step; } // Handle one input channel at once for (int ic1 = ic; ic1 < depth; ic1++) { ... } SIMD implementation of quantized bilinear upsampling is straightforward. Top left pixel value is reused (Fig. 7a). Bottom left (Fig. 7b) and top right (Fig. 7c) pixel values are mean of two adjacent original pixel values. Finally, botom right pixel (Fig. 7d) is mean of 4 diagonally adjacent original pixel values.The only issue that we have to take care of is 8-bit integer overflow. Without a solid knowledge of NEON intrinsics we could go down the rabbit hole of taking care of overflowing by ourself. Fortunately, the range of NEON intrinsics is broad and we can utilize those intrinsics that fit our needs. The snippet of code below (using vrhaddq_u8) shows an interpolation (Fig. 7d) of 16 pixel values at once for bottom right pixel value:// Bottom right output_ptr += output_x_offset; uint8x16_t left_interpolation = vrhaddq_u8(x0y0, x0y1); uint8x16_t right_interpolation = vrhaddq_u8(x1y0, x1y1); uint8x16_t bottom_right_interpolation = vrhaddq_u8(left_interpolation, right_interpolation); vst1q_u8(output_ptr, bottom_right_interpolation); 6) Pitfalls in softmax layer and demo codeThe first impression of inference in TensorFlow Lite was very slow. It took 85 ms in Galaxy J7 at that time. We tested the first prototype of TensorFlow Lite demo app by just changing the output size from 1,001 to 51,200 (= 160x160x2)After profiling, we found out that there were two unbelievable bottlenecks in implementation. Out of 85 ms of inference time, tensors[idx].copyTo(outputs.get(idx)); line in Tensor.java took up to 11 ms (13 %) and softmax layer 23 ms (27 %). If we would be able to accelerate those operations, we could reduce almost 40 % of the total inference time!First, we looked at the demo code and identified tensors[idx].copyTo(outputs.get(idx)); as a source of problem. It seemed that the slowdown was caused by copyTo operation, but to our surprise it came from int[] dstShape = NativeInterpreterWrapper.shapeOf(dst); because it checks every element (in our case, 51,200) of array to fill the shape. After fixing the output size, we gained 13 % speedup in inference time.<T> T copyTo(T dst) { ... // This is just example, of course, hardcoding output shape here is a bad practice // In our actual app, we build our own JNI interface with just using c++ code // int[] dstShape = NativeInterpreterWrapper.shapeOf(dst); int[] dstShape = {1, width*height*channel}; ... } The softmax layer was our next problem. TensorFlow Lite’s optimized softmax implementation assumes that depth (= channel) is bigger than outer_size (= height x width). In classification task, the usual output looks like [1, 1(height), 1(width), 1001(depth)], but in our segmentation task, depth is 2 and outer_size is multiple of height and width (outer_size » depth). Implementation of softmax layer in Tensorflow Lite is optimized for classification task and therefore loops over depth instead of outer_size. This leads to unacceptably slow inference time of softmax layer when used in segmentation network.We can solve this problem in many different ways. First, we can just use sigmoid layer instead of softmax in 2-class portrait segmentation. TensorFlow Lite has very well optimized sigmoid layer.Secondly, we could write SIMD optimized code and loop over depth instead of outer_size. You can see similar implementation at Tencent’s ncnn softmax layer, however, this approach has still its shortcomings. Unlike ncnn, TensorFlow Lite uses NHWC as a default tensor format:Figure 8. NHWC vs NCHW In other words, for NHWC, near elements of tensor hold channel-wise information and not spatial-wise. It is not simple to write optimized code for any channel size, unless you include transpose operation before and after softmax layer. In our case, we tried to implement softmax layer assumming 2-channel output.Thirdly, we can implement softmax layer using pre-calculated lookup table. Because we use 8-bit quantization and 2-class output (foreground and background) there are only 65,536 (= 256x256) different combinations of quantized input values that can be stored in lookup table:for (int fg = 0; fg < 256; fg++) { for (int bg = 0; bg < 256; bg++) { // Dequantize float fg_real = input->params.scale * (fg - input->params.zero_point); float bg_real = input->params.scale * (bg - input->params.zero_point); // Pre-calculating Softmax Values ... // Quantize precalculated_softmax[x][y] = static_cast<uint8_t>(clamped); } } ConclusionIn this post, we described the main challenges we had to solve in order to run portrait segmentation network on mobile devices. Our main focus was to keep high segmentation accuracy while being able to support even old devices, such as Samsung Galaxy J7. We wish our tips and tricks can give a better understanding of how to overcome common challenges when designing neural networks and inference engines for mobile devices.At the top of this post you can see portrait segmentation effect that is now available in Azar app. If you have any questions or want to discuss anything related to segmentation task, contact us at [email protected]. Enjoy Azar and mobile deep learning world!References[1] L. Chen, G. Papandreou, F. Schroff, H. Adam. Rethinking Atrous Convolution for Semantic Image Segmentation. June 17, 2017, https://arxiv.org/abs/1706.05587[2] C. Szegedy, V. Vanhoucke, S. Ioffe, J. Shlens, Z. Wojna. Rethinking the Inception Architecture for Computer Vision. December 11, 2015, https://arxiv.org/abs/1512.00567[3] A. Howard, M. Zhu, B. Chen, D. Kalenichenko, W. Wang, T. Weyand, M. Andreetto, H. Adam. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, April 17, 2017, https://arxiv.org/abs/1704.04861[4] M. Sandler, A. Howard, M. Zhu, A. Zhmoginov, L. Chen. MobileNetV2: Inverted Residuals and Linear Bottlenecks. January 18, 2018, https://arxiv.org/abs/1801.04381[5] B. Jacob, S. Kligys, B. Chen, M. Zhu, M. Tang, A. Howard, H. Adam, D. Kalenichenko. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference. December 15, 2017, https://arxiv.org/abs/1712.05877
조회수 1046

우리 제품의 USP를 정의하는 방법

안녕하세요. 오피노입니다. 저희는 데이터 분석을 기반으로 한 성과 최적화를 대행하는 퍼포먼스 마케팅 에이전시입니다. 저희가 진행하는 모든 마케팅 의사결정의 근거는 [데이터]입니다. 데이터는 거짓말을 하지 않고 확실하고 냉정하게 숫자로 성과를 표현해주기 때문이지요. 그래서 그 어떤 근거들 보다 정확합니다. 하지만 최근 제가 데이터를 기반으로 대행을 하다가 잃어버린 것들이 있습니다. 문제는 바로, "숫자에만 치중" 한다는 것이지요. 숫자에만 치중하게 되면, 어느 날 "우리 브랜드가 어떤 방향으로 가고 있나?", "KPI가 매출이라고 해서, 매출액을 올리는 데에만 급급하지 않은가" 고민하게 됩니다. 데이터를 기반으로 매체를 다루다가 , 어떤 한계에 봉착하는 느낌을 받았습니다. 더 이상 일정 부분에서 ROAS가 오르지 않는 한계점 같은 것이지요.네, 숫자에만 치중하게 되면 무언가 잘못되어가고 있다는 느낌을 지우지 못합니다. 어느새 이 제품의 브랜드는 사라지고, 이 브랜드가 고객들에게 다가가는 메시지는 할인 프로모션, 특가와 같은 '매출을 끌어올리기 위한 수단으로써의 메시지'만 있게 되는 것 같았습니다. 숫자는 반드시 마케팅 의사결정에 필요하지만, 과학의 시대인 21세기에도 [종교]라는 개념이 있는 걸 보면, 데이터와 숫자가 비즈니스의 전부가 아니란 생각도 자연스레 떠올릴 수 있습니다. 제품이 나아가야 할 방향, 즉 , USP(Unique Selling Point)의 부재에서 저는 비어있는 공간을 느꼈던 것이지요.그렇다면 마케팅원론에서 그렇게 질리도록 배운 USP는 도대체 무엇이고, 이 USP는 어떻게 정의해야 할까요? 잠깐 이 질문에 대답을 해봅시다 : "비슷한 제품들이 즐비하는 시장에서 당신의 제품을 어떻게 차별화되는가?어려운 질문이지요. 여러분과 저는 아마도, 여러 가지 생각들이 들 수 있을 것입니다. 예를 들면, [사용하기 쉽다거나, 내구성이 좋다거나, 다른 경쟁사 제품보다 훨씬 더 품질이 좋다거나]와 같은 것들을 떠올릴 수가 있습니다.하지만 지금 직관적으로 떠오르는 이 여러 가지 특장점들은 그저, 제품의 기술적인 특징에 지나지 않습니다. 대신에, 우리들만이 판매할 수 있는 고유한 특장점(Unique Selling Point : USP) 이 있을까요? USP는 간결하게 말해, 1) 우리의 제품이나 서비스가 고객들에게 감정적으로 제공할 수 있는 것(가치), 2) 사용자들의 불편함을 처리해주는 방법론(솔루션) 3) 시장에서의 다른 제품들과 더 나은 이유(차이점) 이 모든 3가지 조건을 충족시키는 한 가지의 특징입니다. 예를 들면, 경쟁사보다 조금 더 우위에 있는 우리 제품이 잠재고객들이 겪는 문제점을  해결하는데 중요한 영향을 미치는지 까지 파악할 필요가 있다는 것이지요. 모든 기술적으로 뛰어나거나 품질적으로 뛰어나거나 하는 등의 조건들을 배제하고, 위에서 말씀드린 이 3가지를 모두 만족시키는 하나의 USP를 만들어낸다면, 우리는 좀 더 체계적인 마케팅 전략과 세일링 프로세스를 구축할 수 있습니다.그래서, 어떻게 USP를 정의할까?제품의 특성을 정의하는 것을 정확히 찾아내는 것은 때로는, 아들 딸 중에서도 어떤 자녀를 더 좋아하는지를 선택하는 것과 비슷합니다. 아마도 우리는 우리 제품의 모든 면을 사랑하고, 그 제품이 가지고 있는 잠재성과 개개의 기능들도 좋아할 것입니다. 하지만, 고객들은 다릅니다. 제품을 보는 고객은 제품의 전체 모습을 좋아하는 것이 아니라 그 제품에서 자신의 문제를 해결해줄 수 있는 단 한 가지 면만 보고 구매 의사결정을 내립니다. 경쟁사가 많은 복잡한 시장에서 고객들은 한 제품의 모든 면을 볼 수 있도록 주의를 기울이지 않기 때문이지요. 고객들이 순간적으로 제품을 스쳐 지나가 볼 때, 그들의 문제를 해결할 수 있을만한 방안 또는 그들이 얻을 수 있는 가치를 얻지 못하면, 그들은 그대로 떠나버리기 마련입니다.우리 모두는 우리 브랜드에 대해서 색안경을 벗어야 할 필요가 있습니다. 여러분 제품의 강점과 약점을 철저하게 분석하고, 우리 제품의 강점이 우리 제품의 약점을 커버할 수 있을 만한지도 되물어보셔야 합니다. 마케팅 원론에서 그렇게나 배우던 SWOT 분석이 중요한 이유도 다 여기에 있지요. 우리 제품을 분석했다면, 경쟁사 제품 역시 분석이 필요합니다. 고객의 입장에서 느낄 수 있는 경쟁사 제품의 USP는 무엇이고 이들은 어떻게 마케팅을 하고 있는지 반드시 알아야만 하는 것입니다. 그런 다음, 추가적으로 우리 제품을 구매하는 사람들을 이해하기 위해, 우리 자신에게 질문을 던집니다.- 우리 고객들은 언제 우리 제품을 사용할까?- 우리 고객들은 우리 제품을 통해 어떤 경험을 할까? - 우리 고객들은 왜 다른 경쟁상품 대신 우리 것을 선택하였을까?- 그들의 구매 결정에 시발점이 되었던 메시지는 무엇이었을까? 저희 오피노가 Google Analytics나 Google Optimize와 같은 화려한 도구들로 도출해내는 데이터는 위에 열거한 4가지 질문에 대답을 얻기 위해서였습니다. 그렇습니다. 데이터는 대답을 얻기 위한 수단일 뿐, 그 데이터는 USP라는 거대한 요리 속에서 하나의 조미료에 불과합니다. USP는 이 데이터들에 [인간]이라는 거대한 재료를 첨가하고 나서야 비로소 완성될 수 있습니다.Revlon의 창업자는 이런 유명한 말을 남겼었죠. "공장에서, 우리는 립스틱을 만들고 있습니다. 하지만 광고에서, 우리는 희망을 팔고 있습니다."  제품 그 자체 기능에 집중을 하는 것이 아니라, 제품이 최종 구매자에게 제공해주는 가치에 집중을 하는 것이지요. 네 그렇습니다. 사실 우리는 우리 고객들이 제품을 구매하면서 느끼는 휴머니즘적인 가치, 그들의 감성에 대한 공감을 기반으로 마케팅 전략을 구축해야 합니다. 저는 고객들이 느끼는 이 추상적인 감성을 데이터화 시키는 것을 잘할 수 있던 것이지, 데이터 그 자체를 맹목적으로 쫓는 게 정답이 아니었단 걸 깨달았습니다.우리 제품의 기능적 우위 + 휴머니즘적 공감을 함께 결합하여 최종 USP를 만드는 것이지요.  기억해주세요. 데이터는 본질을 가져와주는 도구일 뿐, 그 자체가 목적이 되면 안 됩니다. 이상 센치해진 저만의 반성문이었습니다 :) 영감이 될 수 있는 글이 되었으면 좋겠습니다.퍼포먼스 마케팅 에이전시, 오피노 바로가기
조회수 1273

스타트업이 가는 길

학창시절부터 여행을 좋아하고,지금도 새로운 곳, 멋진 풍경을 경험하고 싶은 열망이 가득하다.이러한 성향이 스타트업의 길에 들어서는데 큰 영향을 주었겠지?타고난 방향치라서 길잃는데는 선수급이다.휴학을 하고 막무가내로 떠났던 호주!그곳에서 여행 이야기를 풀면 많이들 놀란다.소위  "OO 100배 즐기기"란 책을 접한 친구라면내 호주여행에 대해 고개를 갸우뚱할 것이다.들어보지 못한 여행지와 먹거리, 경험에 대해 호기심을 가진다.글렌애플의 보이즌베리 와인,뉴캐슬의 바다수영장과 벽화들,필립아일랜드 가는 길에 있는성산일출봉같이 생긴 관광지(다들 필립아일랜드는 펭귄만 떠올리지),기억을 더듬을수록 미소가 지어진다."어떻게 알고 거길 간거예요?""글쎄요. 길을 잃어서?"그렇다.여행초기에 난 호주 8대도시를자동차를 타고 돌면서 해안선 따라 일주를 하려했다.가장 보편적이고,가장 단순하고 쉬우며, 넓은 도로인A1 도로를 쭉 타고 달리는 간단한 코스였다.근데...가는 길중간에 좋은 낚시포인트도 있고,야영지에,작아서 운치있는 타운에 들리기도 하고,마을사람들이 가보라는 식당도가고...그러다보니 원래 목적과 행선지와 다르게A2도로타고 내륙도 갔다가,지도에 좁쌀만큼 표시된 지역도 갔다가,축제에 휩쓸려 1주일을 그냥 머물기도하고...결국 처음 어림짐작했던 시간과 예산을 초과했는데여전히 뉴사우스웨일즈와 빅토리아,퀸슬랜드,사우쓰 오스트레일리아 주까지만 돌아 볼 수 있었다.목표한 여정의 딱 반이랄까?물론 새로운 경험과 사람들, 음식, 문화 등을마주하며 매일매일이 즐거웠다.그럼 이쯤에서 다시 복기해보자.어쨌든 실패한 여행이다,계획은 너무 허술했고,예산은 초과 되었으며,시간은 다 소진했다.아무리 즐겁고, 재미있었다지만더 가고 싶어도 그쯤에서 포기하고,베이스캠프로 돌아가야했다.이야깃거리는 남았지만,내가 보고 싶었고, 가고 싶었던 곳들은흙 한번 밟아 보지 못하였다.여행의 목적이 무엇이고, 스타일이 다르기에무조건 실패라고 단정지을 수는 없다.누군가에겐 이런 식의 방식이 더 가치있을 수도 있고,누군가에겐 너무나 비효율적이고, 의미없을 수도 있으니까.여행의 가치는 관점에 따라다르기에절대적으로 좋다,나쁘다를 말할 수는 없지만여행의 과정에 대해서는 명확한 실수들을 지적할 수 있다.내가 실패라고 생각하는 이유는초기 계획에서 세운 목표를 달성하지 못 하였기 때문이다.계획 따로,실행 따로였으니까.그리고 중간에 수정하고, 보완할 타이밍도 많았지만  그러지 못한 사실이 실패로 인정할 근거이다.1) 기간과 예산, 경로, 핵심방문지 등에 대한충분한 고려가 없었기에 편차가 누적되어 리스크가 발생하고,그로 인해 중도에 여행을 보류할 수 밖에 없었던 점.-> 사전/ 시장조사 미흡, 초기사업계획서 미흡2) 길을 잃을 가능성이 높다는걸 알면서도 대비 안한 점.-> 단점 보완 미흡, 리스크를 예상하고도 무대처.3) 길을 잘못 들고 일정에 이상이 생겼음에도'여행은 원래 그런 맛'이라는 안일한 사고로 자기세뇌.-> 징후에 대한 관리능력 부재, 자기만의 세계로 현실도피그 외에도 문제점은 참  많은 여행이었고,이때 느끼고, 반성한 포인트들이 그 이후 여행에 많은 도움을 주었다.지금의 우리회사의 방향에 영향을 끼치고 있다.그래서 후회하냐고  묻는다면,"전혀 후회하지 않습니다. 오히려 고마운 경험입니다."배우고, 깨달은 점이 많았다.그래서 지금의 삶에 큰 도움과 기준이 형성되었으니,비록 여행의 과정상 실패였지만, 돌이켜보면들어간 인풋 대비 얻은 아웃풋이 더 큰 남는 장사였다.이것은 피보팅(수정)이라고 볼 수 있다.비록 초기 생각했던 계획과는 많이 달라졌지만,그 과정에서 다른 가치를 발견한다.다른 인사이트를 얻게 된다.실패한 여행을 통해형성된 내 여행의 가치관은"즐거움과 배움, 만남"이다보니과정의 실패 반, 가치의 성공 반이랄까?창업초기에는이러한 실수나 실패를 통해 얻는 것이 많아야 한다.스타트업에게성공이든 실패든...그 후에 얻는게 없으면 독이다.우리는 알게 모르게 매일 실패에 익숙하다.내일은 더 실패를 줄이기 위한 몸부림이오늘의 실패에서 찾은 대안에서  만들어진다.그냥 지나쳐버리면 내일은 또 같은 실패를 만날 것이다.성장이란걸 달성해야할 지표로 오해하는데...그 지표들은 성장을 확인하기 위한 근거,정량적인 수치라는 도구이자 방법론일뿐이다.성장의 본질은 "이전과 지금 그리고 앞으로의 다른 점"이다자! 바로 앞에서는 여행을 스타트업과 비교하였다.여행이 외로울 수도 있고,멋진 풍경을 기대하고,때론 안 좋은 날씨도 만나고,목마름과 배고픔도 있고,시간, 비용이 한정 된 점도 유사하다.그리고 다수의 창업자와 여행자들이 좋아하는 말!"재미있잖아요"그런데 현실적으로여행과 스타트업 사이에는 큰 괴리감이 있다.즐거움/재미라는 요인은스타트업이나 여행에서 가질 수 있는 공통분모이다.그러나 여행과 달리 스타트업이가지는 또 하나의 조건이 있다.바로 "절실함"그렇기에 나는창업자와 탐험가의 비유에 더 공감을 한다.내가 콜럼버스라고 상상하자.난 미지의 땅과 황금, 진귀한 향신료를 믿는다.그리고 그곳을 찾을 생각에 가슴이 뛰고, 잠을 못 이룬다.누가 나보다 먼저 그 땅을 밟을까봐 걱정도 되고,그런 소식이 들려올까봐노심초사 매일 바다 건너 소식을 체크한다.단순한 여행이 아니라여왕에게 받은 투자금과 배와 사람들이 있고,꼭 그 이상의 가치를 증명해야 한다.해도를 보고, 길을 확인하길 수백번,지구가 둥글다는 소수의 의견을 기준으로계획을 짰지만, 아닐때의 플랜B도 있어야한다.목적이 확실하다.반드시 이행되어야 할 명확한 미션이 주어져 있다.단지 재미있었다,놀라운 경험이었다로 끝날 일이 아니다.예상치 못 한 리스크도 걱정한다.선상 반란이 일어날 수도 있다.해적을 만날 수도 있고경쟁자인 스페인 군함을 만날 수도 있다.여행이라기보다는부담이 큰 탐험이다.목숨이 걸린 비지니스다.솔직히 나도 큰 파도가 몰려오고,태풍이 몰아치는 것에 겁이 날 수 밖에 없다.중간중간 거쳐가는 육지에서보급품을 얻지 못 할 수도 있다.동료들이 굶어서선상 반란을 일으킬 수도 있고,막상 도착예정이었던 스케쥴보다더 늦어지면서 식량과 물을 살 자금이일찍 동날 수도 있다.도착한 곳에 향신료가 없으면 어쩌지?분명히 있다고 들었는데....황금이 많다고 믿었는데....배 안에서 자기의심이 들기 시작한다.우리가 걷고 있는 길이이렇지 아니한가!마냥 웃으면서 사업을 할 수는 없다.즐거움만으로 버틸 수 없다.절실함이 있어야 한다.그것이 선장의 진심을 보일 수 있다.보다 더 위험에 예민해 질 수 있다.보다 더 나은 대안을 얻을 수 있다.보다 더 빠른 경로를 찾으려 애쓰게 된다.한 동안...글을 쓸 생각조차 못 했다.그리고 사실 지금도 너무 많은 업무에이렇게 글을 남기는게 사치로 느껴진다.너무 팽팽하게 당겨진 고무줄은끊어진다고, 그러다가 번아웃된다고....그래서 잠시나마 생각을 비우고글을 남겨본다.이래야 미래의 내가 이 글을 보고과거의 나에게 "우쭈쭈~ 그때 그랬쪄?"하고대견 해 하겠지?#클린그린 #스타트업 #스타트업창업 #창업가 #창업자 #고민 #성장
조회수 976

동방 실용 지국으로 변신하자

2016년 7월 11일 자 이코노미스트 칼럼에 기고가 되었던 글을 브런치에 다시 올립니다."중앙시사매거진(이코노미스트): 동방 실용지국으로 변신하자"초등학교 시절 가장 싫었던 기억은 아침 조회 시간이었다. 아침 시간에 운동장에 나가 서있는 것도 너무 싫었지만, 더욱 싫었던 경험은 조회가 끝나기 전까지 줄을 똑바로 맞추어서 부동자세로 있는 것이었다. 그때는 줄을 똑바로 서지 않으면 혼을 내는 선생님들이 있었기 때문에 줄 맞추어 교장 선생님께서 말씀하시는 동안 가만히 서 있었지만, 지금 돌이켜 생각해보면 부동자세로 줄을 서서 교장선생님의 말씀을 듣는 것이 아이들에게 어떠한 교육적 의미를 줄 수 있을까에 대한 의문이 든다. 우리나라는 예부터 동방 예의지국으로 불려 왔다. 그래서 그런지 수많은 격식과 형식을 따진다. 조선시대에서는 예를 너무나도 중시한 나머지 장례절차에 대한 논쟁으로 인해 수많은 사람들이 죽는 사화를 몇 차례 겪게 되는 어이없는 일도 벌어졌다. 백성들이 먹고사는 문제보다도 왕과 양반들의 권위를 나타내는 예의와 형식이 더 중요한 나라였고, 그러한 악습의 잔재는 여전히 우리 사회에 남아 있다. 높은 사람들이 참석하는 행사에서는 내용보다는 앉는 순서와 식순에 대해서 더 많은 고민을 하고, 불필요한 인원들이 자리를 채우기 위해서 행사를 참석한다. 또한 높은 지위 사람들이 움직이면 관련이 있던 없던 수많은 수행원들이 같이 움직인다. 종종 해외 유명인사들 이수 행원 없이 한국을 방문하는 것을 보고 우리는 소탈하다고 찬양하지만, 정작 우리는 그렇게 변화할 의지가 없다. 우리에게는 예의가 중요하고 격식과 형식이 무엇보다도 중요하기 때문이다.   무례하거나 예의가 없는 것은 분명히 문제가 있는 행동이지만, 지나친 격식과 의전은 많은 사람들의 시간과 노력을 낭비해서 사회 전반의 효율성을 저하시키는 것은 분명하다. 지나친 의전과 격식을 차리는 것이 효율성을 저하시키는 문제도 가지고 있지만, 더 큰 문제는 특권의식을 당연시하는 문화이다. 조선시대 양반은 나라를 다스리는 계급이면서 수많은 특권을 누렸다. 병역과 세금에서 면제되었고, 치외법권적인 특권을 누렸다. 우리 사회는 이제 봉건시대가 아닌 민주사회가 되었지만, 여전히 조선시대로부터 내려오는 봉건주의적인 문화가 남아있다. 높은 자리에 올라가는 것은 더 많은 책임과 일을 하기 위해서 올라가는 것이지만, 거기에 비례해서 가지고 있는 특권도 같이 생기게 된다고 종종 착각한다. 그리고 우리 사회는 그것을 당연시 여긴다. 대접받는 것에 익숙해지고 특권에 익숙해지면 사람들은 더 많은 특권을 원하게 된다. 그러한 특권 의식들은 부정과 비리를 정당화시키고 사회 전체의 효율성을 저하시킨다. 우리나라 사람들은 세계 어느 나라 사람들보다 열심히 많이 일한다. 하지만 우리나라의 생산성은 서구 선진국의 절반에 불과하다. 여러 가지 원인이 있을 수 있지만, 난 그 원인 중 하나를 우리가 부가가치를 만들어내지 못하는 일에 시간을 지나치게 많이 쓰고 있다는 생각을 한다. 우리는 많은 자원과 사람들의 시간을 지나친 격식을 지키기 위해서, 때로는 남들 눈에 보기 좋은 모습을 만들어내기 위해서 쓰고 있는 것이 아닐까라는 생각을 해본다. 그렇기 때문에 우리는 열심히 일하지만, 우리 사회의 생산성은 여전히 서구 선진국의 절반에 불과한 게 아닐까 라는 생각을 해본다. 그렇기 때문에 난 대한민국이 동방예의지국을 벗어나서 동방 실용 지국으로 변화하길 기대해본다. 
조회수 2049

영업, 이런 일도 겪어봤다(1)

 오늘은 가볍게, B2C 영업 중에 어떤 일들을 겪었는지, 개인적으로 재미있고 기억에 남았던 일들을 중심으로 소개하려고 한다. 오늘을 시작으로 가끔 생각날 때 마다 글을 쓰려고 하니, 라디오 사연 방송을 듣는 느낌으로 심심풀이 삼아 읽으면 될 것 같다.  ...물론 일본에서 겪었던 일이므로, 한국에서도 이런 일을 겪을 것이라는 건 아니다. 영업은 아주 신나고 익사이팅한 직군이다. 다만 하다보면 이런 일도 저런 일도 있는 법이니, 오해는 않으시길 바란다. 일본의 경우, 증권사에 입사해 지점에 배치받은 후 처음으로 신입사원으로서 시작하는 일은, 보통 '롤러 영업' 내지는 '신규 영업'이다. 지점의 관할 구역을  신입사원들에게 쪼개서 나누어 준 후, 정말 아무 생각 없이 1번지부터 n번지까지, 시간이 허락하는 한 무작정 벨을 누르고 나오는 사람과 대화를 해서 나의 '신규 고객'으로 만들면 되는 아주 심플한 일이다. 개인적으로는 '벨튀'와 무엇이 다른가 싶지만. 이런 밑도 끝도 없는 일을 시키는 이유는 여러 가지가 있지만, 기본적으로는 신규 고객의 지속적인 확보와 신입사원의 고객 응대 경험 축적을 위해서라고 보면 된다. 노무라 증권의 경우 50이 넘은 과장한테도 고객 확보를 위해 신규 영업을 시킨다고 하는데...증권업계 1위가 되려면 이 정도로 사람을 쥐어짜내야 하는구나. 아무튼, 시간이 시간이니만큼 어르신이나 전업주부, 자영업자를 만나게 되는 경우가 대부분이고, 한낮의 평온함을 즐기고 싶은 시간대에 예고도 기척도 없이 현관벨을 누르고 나타나는 시커먼 양복 차림의 남자...기본적으로 환영받을 수 없는 포지션이다. 이렇게 환영받지 못하는 일을 계속 하다 보면, 정말 별의 별 일을 다 겪게 된다. 지나가다가 왠지 기분좋아보이는 사람에게 말을 걸었더니 덜컥 고객이 되어준다던가, 정말 아무 기대도 안 했던, 다 쓰러져가는 허름한 집에 사는 사람이 1000억대 자산가였다던가, 현실은 때로 픽션보다 드라마틱하다는 말을 실감하게 된다. 오늘은 그 드라마틱한 일들 중에서도 특히 손에 꼽는 몇 가지를 뽑아서 소개할 생각이다.1. 최악의 타이밍 지점 배치를 받은 지 한 달이 안 되어, 도쿄도 에도가와구의 한 주택가를 방문했을 때의 일이다. 언제나처럼 골목 끝에서 끝까지 벨을 눌러가며 '저희는 그런 거 안 사요'라는 말을 듣던 차에, 작은 정원이 딸린 소박한 단독주택의 문이 활짝 열려있는 것을 발견했다. 잘 꾸며진 정원, 공들여 다듬은 듯한 정원수, 예쁘게 피어있는 정원화...이런 집은 가드닝이나 가지치기 같은 것을 화제로 삼으면 이야기가 잘 풀리는 경우가 많다. 그렇지, 돌격이다. 문 앞에서 큰 소리로 '실례합니다!'를 외치자마자 상당히 기분이 좋지 않아 보이는 초로의 여성이 얼굴을 보였다. 어...분위기가 좀 이상한데."안녕하십니까! 미즈호 증권 우에노 지점의 신입사원 '한'이라고 합니다! 이 근방을 담당하게 되어 인사 드리러 왔습니다!""네에, 안녕하세요. 그런데 지금은...""뭐? 증궈어언?!" 갑자기 집 안에서 커다란 목소리와 함께 러닝셔츠에 사각팬티 차림의 남성이 뛰쳐나왔다."우린 주식따위 사지 않으니 돌아가!""아, 그런 것이 아니라 그저 앞으로 잘 부탁드린다는 인사를 드리고자...""인사고 뭐고, 이런 시간에 방문하다니 몰상식하구만! 썩 꺼져!" 이런 시간...? 확실히 오후 2시가 영업사원이 방문하기에 좋은 시간은 아니었다. 왜냐하면, 그런 시간은 없기 때문이다. 그렇다고 그대로 꼬리를 말고 도망칠 순 없었다. 이쪽도 돈 받고 일하는 입장 아닌가."지금 시간대가 불편하시다면 편하신 시간에 다시 인사드리겠습니다. 실례가 안 된다면 언제가 괜찮으실지 여쭈어도 될런지요?""뭐? 이 자식이 어디서 장난질이야!!" 태어나서 처음 멱살을 잡혀봤다. 내심 '여기서 한 대만 맞으면 합의금 대신에 실적을 올릴 수 있지 않을까'라는 생각을 했던 것 같다. 뒤이어 '이래서 증권맨들이 욕을 먹는건가'하는 생각도 들었지만. 그 때, 옆에서 불쾌한 표정을 짓고 있던 여성이 말을 시작했다."봐봐, 당신의 이런 다혈질에 과격한 모습이 잘못된 거라고 아까부터 얘기했잖아요!""그러니까 42년을 같이 살아놓고 이제와서 이혼이라는 게 대체 무슨 소리냐고!" ...그랬다. 둘은 부부싸움 중이었다.  그것도 아주 심각하고, 무거우며, 부부생활의 종지부를 찍느냐 마느냐 하는 주제로. 핏대를 올리며 2라운드를 시작한 노년의 부부를 남겨두고 나는 최대한 조용히, 기척 없이, 들키지 않도록 사라져야만 했다. 이후 다신 그 집 근처에도 얼씬거리지 않았지만, 모쪼록 잘 화해하셨길 빈다.2. 무엇을 도와드릴까요? 무더운 여름날, 역시 에도가와구의 '신 코이와'라는 역을 중심으로 신규 영업을 돌 때의 일이다. 신규 영업을 할 때는 기본적으로 그 때 그 때 회사에서 판매하는 신규 채권 상품이나 펀드 상품의 홍보물을 잔뜩 들고 돌아다니는데, 벨을 눌러서 반응이 없으면 우편함에 넣어놓기도 한다. 어떻게든 조금이라도 고객을 늘릴 가능성을 높이려는 방법이지만, 가끔 지점에 돌아갈 시간이 가까워졌는데 이 자료가 생각보다 많이 남게 되는 경우가 간혹 생긴다. 나의 경우, 그럴 때는 주변의 맨션이나 아파트에 들어가 닥치는 대로 우편함에 한 장씩 넣는 식으로 소비를 다 한 후 회사에 복귀하는 편이었다. 그리고 그 날은 이 '찌라시'가 화근이었다. 에도가와구 외곽의 허름한 아파트(일본의 '아파트'는 싸구려 집단주택을 의미한다) 우편함에 홍보물을 쑤셔넣고 돌아서는 찰나, 반대편 골목에서 왁자지껄한 소리가 나는 것을 발견했다. 사람 두 명이 나란히 설 수 있을까 말까한 좁은 골목이었는데, 즐거운 연회를 하는 듯한 소리가 나는 것이다. 거기다 골목 입구에는 차양을 쳐서 안쪽이 안 보이도록 해놓고, 고기 굽는 냄새도 좀 나는 것 같고. 야 이거, 동네 사람들이 작은 파티라도 하고 있나보구나. 이렇게 분위기가 달아오른 상황에 슬쩍 끼어들어 고기 한 점, 잘하면 못 이기는 척 술 한 잔도 얻어먹고, '신입사원인데 사정이 여의치 않아 고생이 많습니다'하면서 동정표를 좀 사면 되겠구나, 하는 생각이 번개같이 떠올랐다. 일부러 옷차림을 좀 흐트러뜨리고, 젤을 발라 넘겨놓은 머리도 살짜기 헝클어 놓고, 최대한 불쌍한 표정으로 '찌라시' 한 장을 손에 쥐고 골목 앞을 어슬렁거리며 동태를 파악하기 시작했다. 그 때였다."무슨 일이쇼? 뭐 도와드릴까요?" 골목 차양이 걷히더니 웃통을 벗어제친 남자 한 명이 걸어나왔다. ...온 몸에 문신을 새긴. 분명히 오른손에 들고있던 게 고기 굽는 집게였던 것 같은데, 왜 그게 회 뜨는 칼처럼 보였는지는 아직도 의문이다. 0.1초도 안 되는 찰나에 많은 생각이 지나갔다. 일단 오른손에 든 홍보물을 살살 구겨 뒷주머니에 쑤셔넣었다. 변명은 궁색했다. 아니 궁색할 수 밖에 없었다. 그런 상황을 접해보면 느끼겠지만, 마동석같은 인상에 체격은 한 둘레쯤 더 큰 데다가 오른팔에 잉어가 파닥거리고 왼팔에 용이 꿈틀거리는 사람을 갑자기 맞닥뜨렸는데 제대로 된 말이 나오는 게 더 이상한 것이다. 하지만 여기서 세상에 하직인사를 할 순 없었다."아, 그, 영어...ㅂ이 아니라, 그, 뭔가 즐거운 듯한 분위기가 느껴져서...하하하하하하""아, 저희 식구들끼리 고기 좀 구워먹고 있었습니다 핫핫핫. 근방에서 못 보던 분 같은데, 영업 도는 분이신가? 미즈호?" -자켓 라펠에 회사 휘장을 단 것이 이토록 후회되는 순간이 있었던가."아, 예, 네. 미즈호....증권입니다.""오오, 미즈호는 우리같은 극도를 걷는 놈(야쿠자가 스스로를 칭하는 명칭)들한테도 돈을 빌려주고, 아주 좋은 회사지. 고기 한 점 먹고 갈랍니까?" -이놈의 회사는 왜 야쿠자한테 돈을 빌려줘서 뉴스 첫 머리에 나고 XX이야!"아하하하하....사실 제가 회사에 곧 들어가야 하는지라, 이거 죄송합니다. 다음에 꼭 인사드리겠습니다.""그래요? 아 여기 버스 잘 안 다니니까 저쪽으로 나가시면 됩니다. 다음에 또 오쇼." ...인정한다. 솔직히 비굴했다. 하지만 가치있는 비굴함이었다. 일단 살고는 봐야하지 않겠는가. 무슨 게임 속 주인공도 아니고 거기서 당당하게 버팅겨서 내가 얻을 것이 무엇인가. 내 선택은 옳았다고 생각한다. 내가 가오가 없지 돈이 없나. 아 둘 다 없구나. 일본은 야쿠자, 마피아 등과 관련된 인물을 '반사회적 집단'으로 규정하고, 일체의 금융거래를 할 수 없도록 법으로 지정하고 있다. 계좌를 개설할 때 이런 사람인지 아닌지 체크하는 시스템이 있는데, 여기서 얼럿이 뜨면 'Yellow' 지정으로 분류되어 개설이 중단된다. 몇 년 전, 우리 계열사였던 미즈호 은행에서 이런 야쿠자들에게 조직적으로 돈을 빌려준 게 적발되어 아주 큰 사회문제가 되었던 일이 있었다. 그게 날 살린 건지, 죽일 뻔 했는지, 아직도 잘 모르겠다.3. 10년만 일찍 만났더라면... 입사 2년차, 슬슬 선배의 선배, 그 선배의 선배들이 쌓은 고객들을 조금씩 물려받는 시기가 왔다. 뭐 그래봤자 대부분 트러블로 거래가 끊겨있거나, 주소불명으로 되어있거나, 뭐 하여간 쉬운 일이 하나도 없는 그런 고객들이지만, '벨튀'를 안 한다는 것만으로도 충분히 가치있는 일이다. 이 분들은 여러 이유가 있어 거래를 끊은 고객들이라 보통은 쉽게 만나주지도 않는다. 수십 번을 통화해서 사정사정해야 한 번 만나줄까 말까. 그렇다고 거래를 다시 터주는 것도 아니다. 할 테면 해보라는 증권사의 육성 방식, 이제와서 말하지만 이거 참 사람 힘들게 뽑아놓고 다 버려놓는 일이다. 여튼, 내가 물려받은 고객은 72세의 여성이었다. 아무 기대 없이 전화를 걸었는데, 의외로 대응도 상냥하게 해주시고, 내 소개도 관심있게 들으시고...당장 만나서 인사를 드리겠다고 했다. 물론 흔쾌히 승낙을 하셨다. 이야 이거 한 건 했구나. 케이세이 전철역 근처에 사신다고 했다. 마침 지점이 우에노이니 그리 멀지 않고, 금방 갈 수 있겠다고 생각했다. 그런데, 갑자기 이런 말씀을 하신다."시집도 안 간 여자 집에 젊은 남자가 들락거리는 거...남사스러우니 전철역에 있는 카페에서 만나기로 해요.""네? 아...예. 알겠습니다. 근처에서 전화드리겠습니다." 뭐 확실히 배우자가 계신 건 아니었고, 고객님이 그렇게 생각하신다는데 '아닙니다, 댁에서 말씀드리겠습니다'라고 말할 이유도 없는 일이다. 고객이 편안하게 느끼도록 해주는 것도 영업직의 업무 중 하나 아니겠는가. 그렇게 전철역으로 향했다. 실제로 만나뵌 고객님은 아주 온화한 인상에, 성격도 매우 좋은 분이었다. 인사드리는 김에 가져간 펀드상품에 대한 설명도 관심있게 잘 들어주시고, 최근 고민 얘기도 하시며 상당히 밀도있는 대화를 하셨다. 솔직히 왜 이런 좋은 고객을 내게 물려주었는지 하는 의문마저 들었다. 그 분이 내 손을 지그시 쥐고 그윽한 눈빛으로 날 바라보기 전까지는. 분위기가 묘하게 흘러가기 시작했다. 그러고보니 왜 집앞 카페에 나오는데 저렇게 악세사리며 화장이며 옷차림까지 엄청나게 신경쓰고 오셨는지 잠깐 생각했던 게 떠올랐다. 그래도, 집 앞 슈퍼에 갈 때도 풀 메이크업하고 머리까지 세팅하고 가는 사람들, 있지 않는가. 그런 분이겠거니, 수줍음이 많으시겠거니 했다. 여자 집에 젊은 남자 운운하신 것도 사생활을 밝히고 싶지 않다거나, 집 정리가 잘 안 되어 있다거나, 뭐 그런 거겠거니 생각했었다. "한 군은 정말 친절하고 좋은 사람인 것 같아요. 이런 컨설턴트가 내 담당자가 되어줘서 나 너무 기뻐." "아...저...손이....그, 아니, 네...기뻐해 주신다니 저도 기쁘네요..." "정말? 사실 이 나이가 되도록 시집도 안 가고 혼자 살다보니 같이 이야기할 사람도 없고, 많이 외로워요. 이 근방에 자주 와? 전화해주면 내가 집이 요 근처니까 바로 나올게. 종종 들러서 얘기도 하고, 같이 맛있는 것도 먹어요. 응?" "......그....아.....네...노력하겠습니다..." 노력은 대체 뭘 노력하겠다는 건지. 갑자기 집에서 '우리 아들 일본 생활 잘 하고 있을까'하며 걱정하던 엄마가 너무너무 보고 싶어졌다."이 상품, 안정형 펀드라고 했나? 일단 200만엔 정도 사고싶어. 나 이 나이 먹도록 혼자 살아서 돈은 정말 쓸 데도 없고, 우리 한 군 실적이나 올려줘야지. '수익'이 괜찮으면 3천만엔 정도 더 살까봐요.""아, 예. 좋은 상품입..그..저기 제 허벅지에...손이..." 왜 '수익'이란 단어에 묘한 눈빛으로 힘을 주면서 내 허벅지께에 손을 올리시는 건가. 입술은 또 왜 핥으시는 건가. 청운의 꿈을 품고 일본으로 건너가기 전날, 묵묵히 담배를 피우시다가 '일본 놈들한테 지지 마라.'라고 툭 던지며 나름 애정을 표현하셨던 아버지 얼굴은 또 왜 떠오르는지. 아버지, 아들이 지금 뭔진 모르겠는데 인생의 엄청난 위기를 맞고 있습니다. 제발 도와주세요..."나...나이 먹은 게 너무 후회돼. 한 군이랑 10년만 일찍 만났더라면 좋았을텐데." 그 때가 2015년이었으니 10년만 일찍 만났으면 그 분은 62세, 나는 19세. 미성년자다."아.........감사합니다..저기 저는 죄송하지만 다른 고객님과 약속이 있어서...""어머, 바쁜 사람 붙잡고 내가 너무 오래 얘기했나봐요. 미안해요. 그런데 이 펀드, 정말 좋은 상품이라면 한 500만엔 정도 살까봐.""아...그 제가 목론견서라고 하는 아주 중요한 자료, 그, 상세 설명을 하려면 꼭 고객님께 전달해야 하는 아주 중요한 자료를 건네드려야 해서요. 이 이상 설명을 드리기 위해서는 그 자료가 꼭, 절대로 필요합니다. 다음에 그 자료를 드리고 다시 찾아뵙겠습니다." 내 인생 최고의 거짓말이었다. 목론견서는 고객에게 꼭 전달해야 하는 자료가 맞지만, 150페이지가 넘는 책으로 되어있어서 그냥 전달만 하면 되는 서류이다. 그리고 사실 펀드는 목론견서가 없다. 하지만 그 날의 나에게는 실제로 존재해야만 하는, 아니 존재하는 서류였다. 사람이 식은땀을 이렇게 흘릴 수가 있구나, 나는 그 때 처음 알았다. 물론 그 뒤로 그 고객과의 일을 설명하고 여자 동기로 담당자를 교체했지만, 아직도 못마땅한 얼굴로 날 바라보며 야멸차게 이 말을 내뱉던 그 때의 상사가 기억난다."실적을 내려면 적당히 기분 맞춰주면서 고객하고 어울릴 줄도 알아야지. 근성이 없어, 자네는." 과장님, 그거 어울리다간 뉴스에 날 것 같았습니다. 전 증권사 영업맨이지 가부키쵸 호스트가 아닙니다. 지금까지 늘어놓은 3개의 경험담은, 아주 놀랍게도, 한 치의 과장이나 거짓이 섞이지 않은 있는 그대로의 사실이다. 대화의 디테일한 부분에서 조금씩 기억나지 않는 부분들도 있지만, 내 인생에서 너무나도 선명한 경험이었기에 거의 모든 부분을 세밀하게 기억하고 있다. 인간의 기억력이란 참으로 오묘한 것이다. 이렇듯, 영업 일을 하다보면 정말 별 일을 다 겪게 된다. 나중에 시간이 되면, 생각나는 대로 2편을 적어보려고 한다. 이것 또한 하나의 '커리어'라고 할 수 있으니까... 3번의 고객님을 떠올리니 갑자기 독한 소주를 마셔야 할 것 같은 기분이 든다.#더팀스 #THETEAMS #영업 #경험공유 #고생담 #실패담
조회수 1149

2) 우리는 애자일 하게 일하고 있을까?

글목록1) 우리는 왜 애자일 하지 못할까2) 우리는 애자일 하게 일하고 있을까? (현재 글)3) 나는 애자일 하게 일하고 있을까? "우리는 왜 애자일 하지 못할까"에 이어, 말씀드렸던, 기존에 제가 느꼈던 제가 했던, 또는 들었던 프로덕트를 만들며 과정에 대해 간단히 설명해 드리고, 해당 방식이 일하는 과정에서 놓칠 수 있을 것 같은 내용들, 그리고 근본적인 가치적인 부분에 대해 설명드리도록 하겠습니다. 몇 가지 사항을 말씀드리자면,1. 그 어떤 방법도 틀린 건 절대 아니며, 어느 팀에 건 어디에든 맞는 방법들은 존재할 수 있어요. 저는 제가 일하면서 또는 많은 분들과 일하며 느낀 내용들을 공유하는 것이니, 언제든 질문 주시면 감사하겠습니다!2. 다소 개발적인 부분들이 많이 포함되어 있을 수 있습니다. 모르겠는 단어들이나 과정들은 알려주시면 조금 더 정확히, 그리고 간단히 설명드릴 수 있도록 하겠습니다!회사들이 일하는 방식에서 나올 수 있는 최악의 케이스업무를 진행하면서 회사들이 일할 때 겪을 수도 있는 사례입니다.(다시 한번! 모든 회사가 이렇다는 것은 아니며, 그렇다고 방법이 잘못되었다는 건 아닙니다!)A라는 기능을 만들어야 해요 PM 측 또는 비즈니스나 마케팅 단에서 의사결정이 완료된 기능, 또는 개발 순서가 정해져 내려옵니다. 대부분의 의사결정은 비즈니스 적인 부분에서 정성적인 또는 정량적인 분석보다는 예상(Assumption)과 막연한 기대를 기반으로 다음 행동을 결정하게 됩니다. 기한은 "가능한 빠르게"로 산정되고, 언제 시작할지에 대해서도 "최대한 빨리"로 형용되게 됩니다.A에 대한 기획서 적어놨으니 구글 닥스(또는 위키)에서 확인하시고 회의하시죠. PM 측에서도 해당 기능에 대한 기술을 "와이어프레임" 또는 "플로우 차트"를 기반으로 기획서를 문서화하고, 해당 문서를 기반으로 개발/ 디자인 팀에 전달합니다. PM 측에서도1. 진짜 유저가 해당 기능을 쓸 것인지2. 지금 프로덕트가 해당 기능이 왜 필요한지3. 어떤 부분까지가 유저에게 가치를 줄 것인지4. 해당 기능을 언제까지 개발할 수 있을지(물리적 예상)에 대한 정확한 부분은 알 수 없지만, 다른 회사들은 어떻게 해 왔는지에 대한 조사(Benchmark)등을 통해서 개발자, 디자이너의 피드백 없이, 자신이 작성한 기획서를 기반으로 기능 개발을 위해 상의합니다.해당 기능들 기반으로 지라(Jira) 티켓 만들어 놨으니 작업 진행해 주세요. 회의 진행을 통해 어떤 기능들이 있을 것이고, 해당 기능들에 대해 어느 정도 개발자/ 디자이너들과 이해가 가능한 부분까지의 선을 나누고, 어느 정도 지라, 또는 트렐로 또는 다른 프로젝트 관리 툴을 통해 - "~기능 프런트 작업" 또는 "~기능 백앤드 작업" 그리고 "~디자인"작업- "... 페이지 프런트 작업" 또는 "... 페이지 백앤드 작업" 그리고 "... 페이지 디자인"등유저가 얻는 가치를 기반으로 한 작업이 아닌, 개발단에서 어떤 걸 개발해야 한다 라는 목적 기반의 티켓 작성으로 디자이너 또는 개발자들이 얼마나 작업을 했는지에 대해 확인합니다. 디자인은 어느 정도 준비된 거 같은데, 개발은 어느 정도 돼가요? 하루하루 진행되는 과정을 사람대 사람으로 공유하기보단, 프로젝트 관리 툴에 의존해 작업 진행을 확인하고 있고, 개발의 범위가 너무 큰 티켓들을 작업하기 때문에, "어느 부분이 어떻게 작업되고 있는지"를 알기 위해선 물어볼 수밖에 없고 이에 대해 알기 위해선 "얼마큼 작업을 했나요?"라는 질문을 하게 되고, 해당 질문들 들은 작업자들은 잘못한 게 없음에도 불구하고, 작업에 대한 압박과 스트레스를 받고, 최악의 경우, 서로 자신의 일을 최선을 다해하고 있음에도 불구하고, 서로에게 나쁜 감정을 가지게 됩니다.디자인 가이드랑 기획서가 다른데 어떤 걸로 해야 해요? 피엠은 또 다른 기능들을 준비해야 하거나, 다른 개발자들 또는 디자이너들과의 소통을 하며 고군분투하는 상황에 뛰어다니며 일을 하고 있기 때문에, 디자이너가 작업을 하며 놓칠 수 있는, 또는 더 좋은 아이디어라고 생각해 수정한 부분들에 대해 소통을 할 수 있는 기회가 줄어들게 되고  이렇게 생긴 기획서와 디자인 가이드는 개발단과 디자이너 그리고 중간에 끼인 피엠과의 서포팅이 아닌 줄다리기를 하게 되는 상황에 처하게 됩니다.이거 누르면 여기로 가는 게 맞아요? 이건 좀 아닌 거 같은데 기획서에 대해 회의를 했지만, 해당 회의 때 정확하게 나오지 않은 부분들이 있거나, 간결하게 넘어간 부분이 있을 때, 개발이 들어가는 상황에서 같이 일하는 팀원들끼리 기능에 대한 정확한 방향이 이해가 되지 않거나, 옳다고 판단되지 않는 것들이 있을 때, 갈등이 생기게 되고(물론 아무 말도 안 하고 있는 게 더 안 좋은 결과를 초래하지만) 서로 간의 이해가 더더욱 힘들어지게 됩니다.기획 쪽에서 정책이 안정해져서 안 만들었어요 버그 아니에요. 이렇게 힘겹게 줄다리기를 하다 보면, 종종 더 이상의 커뮤니케이션 보단 "빨리 만들어서 일단 올리면 테스트해서 찾아내면 그때 결정하겠지 뭐"라는 낭비, 또는 부채가 생기게 되고, 서로 간의 이해보다는 기능상의 오류에 대해 책임소재를 찾게 되고, 개발에 집중할 수 있는 집중도를 잃을뿐더러 시간 역시 지체되게 됩니다.TC 확인해 봤는데, 이건 이렇게 가는 게 맞아요. 이렇게 개발을 진행하게 되면, "유저"보다는 "기능"에 "품질"보다는 "기간"에 맞추는 프로덕트를 개발할 수밖에 없는 상황이 되고, 그렇게 되다 보면 "가치"보다는 "지금 적혀있는 문서"에 갇혀 진짜 우리가 필요한 것보다는 "어쩔 수 없지만 해야 하는 것"으로 우리가 하는 일에 대한 가치가 줄어드는 것을 서로가 느낄 수 있습니다.테스팅 안 끝났어요 배포 못해요. 해당 내용들이 지속적으로 진행되다 보면 정해지는 것보다는, 회의가 늘어나게 되고, 회의가 늘어나다 보면 작업이 늦어지게 되고, 작업이 늦어지게 되면 배포가 늦어지게 되는 불안정한 사이클이 돌아가게 됩니다.... 롤백하시죠...그리고 정말 최악의 경우엔, 열심히 만든 우리가 만든 기능이 세상밖에 구경하지 못하게 되는 최악의 사항을 겪게 될 수 있죠 그리고 이렇게 될 경우엔....이번에는 회고 없이 바로 다음 스프린트(또는 이터레이션) 진행하시죠이렇게 늦어진 배포(아니면 없어진 배포) 때문에 생긴 시간 만회를 위해 회고를 진행하기보다는 다음 기능 또는 재배포를 위한 준비를 시작하게 되고, 프로덕트팀 서로 간의 신뢰도가 깎이게 되고 신체적 또는 심리적 피로감을 늘린 체 다음 스프린트 또는 연장된 스프린트의 다른 개발 또는 디자인 또는 기획을 진행하게 됩니다.왜 이럴까?.. 기본적으로 모든 회사는 이윤을 추구하고, 혼자서 일하는 것보단, 동료와의 협업이 더 높은 생산성을 얻을 수 있기 때문에, 동료 간의 시너지를 얻을 수 있도록 방법론을 찾고 도입하는 것은 어떻게 보면 회사에서 추구할 수 있는 최선의 방법입니다. 그러나, 위의 케이스에서는 애자 일한 오히려 팀의 문화가 깨져버리게 되는 최악의 케이스를 보게 되죠. 제가 찾은 가장 원초적인 문제는 유저가 가질 가치에 대한 공유가 없는데서 시작합니다.(유저가 가질 가치라는 내용은 우리는 왜 애자일 하지 못할까에서 확인이 가능하십니다..ㅎ 깨알 같은 재 홍보.) 우리가 만드는 프로덕트는 결국 유저가 사용하는 프로덕트이기 때문에, 어떤 유저가 어떻게 사용함으로써 어떤 가치를 얻게 될 것이다.그 어떤 가치를 얻기 위해서 어떤 어떤 과정을 거칠 수 있다.어떤 것들을 수행하지 못할 경우, 원하는 가치를 얻을 수 있도록 어떻게 유도한다.라는 가치를 통한 기능의 생산보다는, 직관과 예상에 의한 의사결정, 유저에 대한 이해보다는 기능 개발에 집중된 프로세스, 그리고 빠른 개발을 위해 놓치는 부분들에 대한 낮은 고려 등으로 가치와 속도, 그리고 팀원 간의 불협화음을 키우는 작업을 하게 되는 것이죠.분량 조절에 실패했네요...  다음 글에선 1. 어떤 가치를 기반으로 저는 일하고 있고,2. 이런 방식으로 일하면서도 제가 겪고 있는 수많은 허들들에 대해서 설명드릴 수 있도록 하겠습니다!읽어주셔서 감사해요!#코인원 #블록체인 #기술기업 #암호화폐 #스타트업인사이트
조회수 4659

자바스크립트 기초 문법 정리 Part 2 - 객체

지난 Part 1 포스팅에 이어 자바스크립트 기초 문법에 대해 정리해보았습니다. 이번 포스팅에서는 여러 객체와 그 객체에서 제공하는 각 메서드에 대해 정리하였습니다. 다루는 객체의 여러 메서드에 대해 정리하였기 때문에 전 포스팅처럼 간략하지는 않지만 이번 포스팅을 저장해 두고 자바스크립트로 개발하면서 필요할 때마다 참고하여 보기에는 좋을 것 같습니다. 다만, 메서드 사용 예의 코드는 넣지 않았으니 예제 부분이 필요하다면 필히 공식 문서를 참고해주세요. 익히는 것 자체도 공식 문서를 통하여 보는 것이 가장 좋지만 혹여 영어에 취약하신 분이라면 이 포스팅을 참고하는 것도 괜찮을 것 같습니다. :)내장 객체브라우저의 자바스크립트 엔진에 내장된 객체. String/Date/Array/Nath/RegExp Object 등이 있음.날짜 객체 DateDate 객체 생성new Date()new Date(milliseconds)new Date(dateString)new Date(year, month, day, hours, minutes, seconds, milliseconds)Date Get 메서드getDate() - 일 정보를 가져옴.getDay() - 요일 정보를 가져옴. 0(일요일)-6(토요일)getFullYear - 연도 정보를 가져옴. (yyyy)getHours() - 시간 정보를 가져옴.getMilliseconds() - 밀리초 정보를 가져옴. 0-999 (1/1000 초의 단위)getMinutes() - 분 정보를 가져옴.getMonth() - 월 정보를 가져옴. 현재 월에서 -1한 값으로 옴.getSeconds() - 초 정보를 가져옴.getTime() - 1970년 1월 1일부터 경과된 시간을 밀리초로 가져옴.Date Set 메서드setDate() - 일 정보를 설정.setFullYear() - 연도 정보를 설정. 원한다면 월과 일 정보도 설정할 수 있다.setHours() - 시간 정보를 설정.setMillseconds() - 밀리초 정보를 설정.setMinutes() - 분 정보를 설정.setSeconds() - 초 정보를 설정.setTime() - 1970년 1월 1일부터 경과된 시간을 밀리초로 설정.기타 Date 메서드now() - 1970년 1월 1일부터 지금까지의 밀리초를 반환.parse() - 날짜 형태의 문자열을 변환하여 1970년 1월 1일부터 입력한 날짜까지의 밀리초를 반환.toString() - Date 객체를 문자열로 변환.toJSON() - Date 객체를 JSON 데이터로 변환.valueOf() - Date 객체를 밀리초로 반환.숫자 객체 NumberNumber 생성var num = 1;      var num2 = new Number(1);Number 객체의 속성MAX_VALUE - 표현 가능한 가장 큰 수.MIN_VALUE - 표현 가능한 가장 작은 수.POSITIVE_INFINITY - 무한대 수 표기.NEGATIVE_INFINITY - 음의 무한대 수 표기.NaN - 숫자가 아닌 경우 표기.Number 객체 메서드toExponential(n) - 자수 표기법으로 소수점 n자리만큼 문자형 데이터로 반환.toFixed(n) - 소수점 n자리만큼 반올림하여 문자형 데이터로 반환.toPrecision(n) - 유효 숫자 n의 개수만큼 반올림하여 문자형 데이터로 반환.toString() - 숫자형 데이터를 문자형 데이터로 반환.valueOf() - 객체의 원래 값을 반환.parseInt(값) - 데이터를 정수로 변환하여 반환.parseFloat(값) - 데이터를 실수로 변환하여 반환.수학 객체 MathMath 메서드 및 상수Math.abs(숫자) - 숫자의 절댓값을 반환.Math.max(숫자1, 숫자2, 숫자3) - 숫자 중 최댓값을 반환.Math.min(숫자1, 숫자2, 숫자3) - 숫자 중 최솟값을 반환.Math.pow(숫자, 제곱값) - 숫자의 거듭제곱한 값을 반환.Math.random() - 0~1 사이의 난수를 반환.Math.round(숫자) - 소수점 첫째 자리에서 반올림하여 정수를 반환.Math.ceil(숫자) - 소수점 첫째 자리에서 무조건 올림에서 정수를 반환.Math.floor(숫자) - 소수점 첫째 자리에서 무조건 내림해서 정수를 반환.Math.sqrt(숫자) - 숫자의 제곱근 값을 반환.Math.PI - 원주율 상수를 반환.배열 객체 ArrayArray 생성var array = new Array();array[0] = 1;array[1] = 2;var array2 = new Array(1, "temp", true);var array3 = [1, true, "문자열도 가능"];Array 객체의 메서드 및 속성join(연결문자) - 배열 객체에 데이터를 연결 문자 기준으로 1개의 문자형 데이터로 반환.reverse() - 배열 객체에 데이터의 순서를 거꾸로 바꾼 후 반환.sort() - 배열 객체에 데이터를 오름차순으로 정렬.slice(index1, index2) - 배열 객체에 데이터 중 원하는 인덱스 구간만큼 잘라서 배열 객체로 가져옴.splice() - 배열 객체에 지정 데이터를 삭제하고 그 구간에 새 데이터를 삽입할 수 있음.concat() - 2개의 배열 객체를 하나로 결합.pop() - 배열에 저장된 데이터 중 마지막 인덱스에 저장된 데이터 삭제.push(new data) - 배열 객체에 마지막 인덱스에 새 데이터를 삽입.shift() - 배열 객체에 저장된 데이터 중 첫 번째 인덱스에 저장된 데이터를 삭제.unshift(new data) - 배열 객체의 가장 앞의 인덱스에 새 데이터를 삽입.length - 배열에 저장된 총 데이터의 개수를 반환.문자 객체 StringString 생성var str = "hello";      var str2 = new String("hi");String 객체 메서드 및 속성charAt(index) - 문자열에서 인덱스 번호에 해당하는 문자 반환.indexOf("찾을 문자") - 문자열에서 왼쪽부터 찾을 문자와 일치하는 문자를 찾아 최초로 일치하는 문자의 인덱스 번호를 반환. 찾는 문자가 없으면 -1 반환.lastIndexOf("찾을 문자") - indexOf와 동일하나 문자열의 오른쪽부터 찾음.match("찾을 문자") - indexOf와 동일하나 찾는 문자가 없으면 null을 반환.replace("바꿀 문자", "새 문자") - 문자열에서 왼쪽부터 바꿀 문자와 일치하는 문자를 찾아 최초로 찾은 문자를 새 문자로 치환.search("찾을 문자") - 문자열 왼쪽부터 찾을 문자와 일치하는 문자를 찾아 최초로 일치하는 인덱스 번호를 반환.slice(a, b) - a개의 문자를 자르고 b번째 이후에 문자를 자른 후 남은 문자를 반환.substring(a, b) - a 인덱스부터 b 인덱스 이전 구간의 문자를 반환.substr(a, 문자 개수) - 문자열에 a 인덱스부터 지정한 문자 개수만큼 문자열을 반환.split("문자") - 지정한 문자를 기준으로 문자 데이터를 나누어 배열에 저장하여 반환.toLowerCase() - 문자열에서 영문 대문자를 모두 소문자로 바꿈.toUpperCase() - 문자열에서 영문 소문자를 모두 대문자로 바꿈.length - 문자열에서 문자의 개수를 반환.concat("새로운 문자") - 문자열에 새로운 문자열을 결합.charCodeAt("찾을 문자") - 찾을 문자의 아스키 코드 값을 반환.fromCharCode(아스키 코드 값) - 아스키 코드 값에 해당하는 문자를 반환.trim() - 문자의 앞 또는 뒤에 공백 문자열을 삭제.브라우저 객체 모델(BOM)브라우저에 내장된 객체. window 객체브라우저 객체의 최상위 객체.window 객체 메서드open("url 경로", "창 이름", "옵션 설정") - 새 창을 열 때 사용.- open() 메서드 옵션 설정: width/height/left/top/location/status/scrollbars/tollbarsalert("메세지") - 경고 창을 띄움.prompt("질의 내용", "기본 답변") - 질의응답 창을 띄움.confirm("질의 내용") - 확인/취소 창을 띄움.- 확인 클릭시 true 반환, 취소 클릭시 false 반환.moveTo(x 위치값, y 위치값) - 창의 위치를 이동시킬 때 사용.resizeTo(너빗값, 높잇값) - 창의 크기를 변경시킬 때 사용.setInterval("스크립트 실행문", 시간 간격) - 일정 간격으로 반복하여 실행문을 실행시킬 때 사용.clearIntervar(참조 변수) - 참조 변수에 참조되어 있는 setInterval() 삭제.setTimeout("스크립트 실행문", 시간 간격) - 일정 간격으로 한 번만 실행문을 실행시킬 때 사용.clearTimeout(참조 변수) - 참조 변수에 참조되어 있던 setTimeout() 삭제.screen 객체사용자의 모니터 정보를 제공하는 객체.screen 객체 속성width/height/availWidth/availHeight/colorDepth(사용자 모니터가 표현 가능한 컬러 bit)location 객체사용자 브라우저의 주소 창에 url에 대한 정보와 새로 고침 기능을 제공하는 객체.location 객체 속성 및 메서드href - 주소 영역에 참조 주소를 설정하거나 URL 반환.hash - URL의 해시값을 반환.hostname - URL의 호스트 이름을 설정하거나 반환.host - URL의 호스트 이름과 포트 번호를 반환.port - URL의 포트 번호를 반환.protocol - URL의 프로토콜을 반환.search - URL의 쿼리를 반환.reload() - 새로 고침.history 객체사용자가 방문한 사이트 중 이전에 방문한 사이트와 다음 방문한 사이트로 다시 돌아갈 수 있는 속성과 메서드를 제공하는 객체.history 메서드 및 속성back() - 이전 방문한 페이지로 이동.forward() - 다음 방문한 페이지로 이동.go(이동 숫자) - 이동 숫자만큼의 페이지로 이동. 음의 값이면 이전 페이지로 이동.length - 방문 기록에 저장된 목록의 개수 반환.navigator 객체현재 방문자가 사용하는 브라우저 정보와 운영체제의 정보를 제공하는 객체.navigator 속성appCodeName - 방문자의 브라우저 코드명을 반환.appName - 방문자의 브라우저 이름 반환.appVersion - 방문자의 브라우저 버전 정보를 반환.language - 방문자의 브라우저 사용 언어를 반환.product - 방문자의 브라우저 사용 엔진 이름을 반환.platform - 방문자의 브라우저를 실행하는 운영체제를 반환.userAgent - 방문자의 브라우저와 운영체제의 종합 정보를 제공.문자 객체 모델(DOM)HTML 문서의 구조.선택자직접 선택자직접 문서에서 요소를 선택함. (id/class/폼 명/요소 명 등)document.getElementById("아이디 명") - 아이디를 이용해 요소를 선택.document.getElmentsByTagName("요소 명") - 요소의 이름을 이용해 요소를 선택.document.formName.inputName - 폼 요소에 name 속성을 이용해 요소를 선택.인접 관계 선택자직접 선택자를 사용해 선택해 온 문서 객체를 기준으로 가까이에 있는 요소를 선택함. (parentNode/childeNodes 등)parentNode - 선택한 요소의 부모 요소를 선택.childNodes - 선택한 요소의 모든 자식 요소를 선택. 선택한 모든 요소가 저장됨.firstChild - 선택한 요소의 첫 번째 자식 요소만 선택.previousSibling - 선택한 요소의 이전에 오는 형제 요소만 선택.nextSibling - 선택한 요소의 다음에 오는 형제 요소만 선택.문서 객체 이벤트 핸들러 적용하기onclick - 선택한 요소를 클릭했을 때 이벤트 발생.onmousevoer - 선택한 요소에 마우스를 올렸을 때 이벤트 발생.onmouseout - 선택한 요소에 마우스가 벗어났을 때 이벤트 발생.submit - 선택한 폼에 전송이 일어났을 떄 이벤트 발생.버튼document.getElementById("btn").onclick = function() {    alert("welcome");}일단은 참고하는 책을 기준으로하여 정리해보았는데 후에 시간이 될 때마다 공식 문서를 참고하여 번역한다는 생각으로 보다 세부적인 사항을 정리해도 좋을 것 같다는 생각이 드네요. 우선적으로는 빠르게 함수와 이벤트에 대해 배우고 객체에 대한 더 자세한 사항을 정리하도록 하겠습니다. 다음 포스팅은 자바스크립트의 함수와 이벤트에 대해 다룰 예정입니다!참고문헌:Do it! 자바스크립트+제이쿼리 입문 - 정인용JavaScript 튜토리얼 문서 (http://www.w3schools.com/js/default.asp)티스토리 블로그와 동시에 포스팅을 진행하고 있습니다.http://madeitwantit.tistory.com#트레바리 #개발자 #안드로이드 #앱개발 #Node.js #백엔드 #인사이트 #경험공유
조회수 76113

잘 쓴 자기소개서의 다섯 가지 특징

채용 서비스를 하고 있는 스타트업의 마케터이다 보니 하루에도 수십 개의 합격 자기소개서를 보게 됩니다. 물론 이 자기소개서들이 100% 합격 자소서가 맞는지, 그리고 그 이후에 어떻게 되었는지에 대해 알 순 없습니다만, 어찌 됐든 '합격 자소서'라고 올라온 글들을 수 없이 많이 보고 있습니다.그렇게 수많은 합격 자소서를 보면서 느꼈던 '잘 쓴 자기소개서의 특징'을 다섯 가지 정리해보도록 하겠습니다. 앞서 이야기해둘 것은 저는 어느 대기업의 인사 담당자도 아니고, 인사팀의 입장에서 자기소개서를 본 것도 아니라는 점입니다. 제 3자의 입장에서, 그리고 글 쓰는 것과 읽는 것을 좋아하는 사람의 입장으로서 느꼈던 것들입니다.첫째, 글빨보다는 '컨텐츠' 많은 합격 자기소개서를 보면서 가장 놀랍고 크게 와 닿았던 것은 자기소개서를 쓸 때 생각보다 글을 화려하게 잘 쓸 필요가 없다는 것이었습니다. 초등학교 때로 돌아가, 집에서 미술 숙제를 해야 하는데 엄마가 조금이라도 도와주면 티가 팍 나는 것처럼, 너-무 잘 쓴 자기소개서는 오히려 더 튀는 느낌이 들었습니다. (이 '너-무 잘 쓴 자기소개서'라는 것은 평균 이상의 글쓰기 실력이라기보다는, 실무나 회사 생활을 좀 해본 사람들의 향기가 좀 나는 자기소개서를 말합니다.) 오히려 덤덤하게 자신이 가진 컨텐츠를 풀어내는 것이 조금 서툴어 보이더라도 읽는 사람을 편안하게 만들어 주었습니다. 억지로 미사여구를 붙인다거나 한자성어나 전문용어를 가져다 쓰는 것보다는 지원 회사/직무에 맞는 관련된 경험을 잘 인용하여 쓰는 것이 합격에는 중요한 요소로 보입니다. 전공 수업에서의 팀플을 쓰건, 아르바이트했던 경험을 쓰건 대단한 실무 경험을 쓰지 않아도 괜찮았습니다. 입사에 대한 열의를 보여줄 수 있는 컨텐츠인지, 그 직무를 지원하고 싶어서 그동안 해왔던 노력들인지가 중요합니다. 하지만 생각보다 많은 지원자들이 자신이 가진 컨텐츠, 본질, 핵심보다는 보여지는 겉모습, 표현에 신경 쓰는 것 같습니다. 자기소개서라는 것은 나를 어필하고 함께 일하고 싶은 인재임을 표현하는 수단인 건데, 그렇다면 진짜 중요한 것이 무엇인지 생각해 볼 필요가 있겠습니다. 둘째, 컨텐츠에는 '진정성' 앞의 이야기와 이어질 수 있겠지만, 특정 기업과 직무에 지원하는 '자기소개서'를 씀에 있어서 가장 중요한 것은 '경험'입니다. 여러 자기소개서 문항들이 구체적인 사례를 디테일하게 물어보는 이유는 '진정성'에 있습니다. "얼마나 우리 회사에 오고 싶었니? 얼마나 지원 직무를 준비해왔니?" 가, 그 경험에 담기기 마련입니다. 즉, 꾸준하고 일관되게 그 회사, 직무를 지원하기 위해 준비해왔던 경험들에는 '진정성'이 느껴집니다.인상 깊은 합격 자기소개서 사례를 들어 이야기하자면 이렇습니다. 교육 관련 전공을 한 사람이 인사팀에 지원을 한 케이스였습니다. 그 사람이 우연히 조직/인사와 관련된 경영학과 수업을 듣게 되었는데 그때 학생을 가르치는 것만큼이나 성인들의 잠재력을 키워주는 일도 재밌다는 것을 느꼈고, 그래서 MBTI 강사 과정을 수료, 이후에 MBTI를 활용한 기업 인사 프로그램에도 참여하게 되었다고 합니다. 그때 모 기업의 인사 담당자를 만나게 되었고, 그와 이야기를 나누면서 모 기업의 철학, 인사팀이 하는 어떠어떠한 일이 자신이 꿈꿔왔던 커리어와 잘 맞는다고 생각이 들어 지원하게 되었다, 는 골자였습니다. 어떻게 보면 "경영학 전공자도 아니고 교육 전공한 사람이 왜 인사팀을 지원했어요?"라고 생각이 들 수 있는 조건이지만, 어떤 계기로 '인사 직무'에 관심을 가지게 되었는지, 인사 직무를 하기 위해서 어떤 노력을 해왔는지가 잘 담겨있는 내용이었습니다. 자신의 경험들을 잘 이어서 직무와 연결시켜보면 이렇게 진정성이 느껴지는 자기소개서를 작성할 수도 있는 것입니다.  셋째, 진정성에는 '철학' 그런데 이 '진정성'에서 또 중요한 것이 단순히 '경험 나열'만 해서는 안 된다는 것입니다. 그 회사/직무에 지원하기 위해서 어떤 준비를 해왔는지 경험들을 이야기했지만, 그 과정에서 어떤 교훈을 얻었는지 '느끼는 바'가 없으면 껍데기만 있을 뿐입니다. 위의 인사팀 지원자 사례로 계속 이야기하자면, 학생들 가르치는 것뿐만 아니라 성인, 조직을 교육하는 것의 '어떤 점'이 재미있었는지,에 대해서 이야기했기 때문에 신뢰감 있게 들렸습니다. 예컨대 "어느 정도 인격과 자아가 형성되어 정말 다양한 성향을 가진 성인들이 모여있는 회사라는 조직에서 MBTI로 구성원들의 성향을 파악하고 소통을 도와주는 것이 재미가 있었고, 이 과정에서 서로를 이해하고 더 높은 목표를 이루기 위해서 나아가는 모습을 볼 때 보람찼다"와 같은 포인트입니다. 요약하자면 회사/직무에 지원하기 위해서 어떤 경험들을 쌓아왔는지 그 경험들을 하면서 무엇을 느꼈고, 어떤 점에서 그 회사/직무에 지원을 해야겠다는 확신을 가지게 되었는지 철학이 담기면 80% 이상은 쓴 것이라 볼 수 있습니다. 그리고 이러한 철학은 다른 지원자들과 나의 자기소개서를 차별화시켜주는 포인트가 되기도 합니다. 지원자 입장에서 이렇게까지 생각하는 것이 조금 귀찮을 수도 있지만, 그래도 자기소개서 작성 전에 꼭 생각해보면 좋습니다.  넷째, 하고 싶은 말을 하기보다는 묻는 말에 '충실히' 대답하기많은 합격 자기소개서를 읽다 보니 공통점이 있었습니다. 바로 질문의 의도에 맞게 핵심 위주로 대답했다는 것입니다. 특히 요새는 지원자들에게 혼란을 덜 주기 위하여 자기소개서 문항도 예전보다 더 자세해지고 있습니다. 자기소개서를 쓰려고 하는데 문항이 길다면 어려워하지 말고 오히려 감사하게 생각해도 좋습니다. 제시된 질문을 '잘' 파악하여 대답만 잘 해도 상당 분량이 채워질 수 있기 때문입니다. 예를 들면 자기소개서 문항이 자세하기로 정평이 난 SK 그룹의 경우, 이러한 문항이 있습니다. 자신에게 요구된 것보다 더 높은 목표를 스스로 세워 시도했던 경험 중 가장 기억에 남는 것은 무엇입니까? 목표 달성 과정에서 아쉬웠던 점이나 그때 느꼈던 자신의 한계는 무엇이고, 이를 극복하기 위해 했던 행동과 생각, 결과에 대해 최대한 구체적으로 작성해 주십시오.'도전이나 한계 극복 경험'을 물어보는 문항은 다른 회사에서도 많이 제시됩니다. 하지만 이렇게 자세하게 물어봤을 경우에는 질문을 쪼개서 질문 안의 내용들에 충실하게 답변하도록 내용을 구성하면 됩니다. 위 문항의 경우, (1) 도전 경험이 무엇인지 (2) 그 과정이 어땠는지 (3) 특별히 아쉬웠던 점은 무엇인지 (3) 그때 느낀 나의 한계와 (4) 극복하기 위해서 어떤 행동을 했는지 (5) 왜 그런 생각을 했는지 (6) 그에 따른 결과는 어땠는지를 쓰면 됩니다. 합격 자기소개서들은 이렇게 물어보는 질문들에 대한 대답을 충실히 하는 경향이 있습니다. 여기에 자신이 추가하고 싶거나 강조하고 싶은 부분을 더했으면 더했지 이것들을 대충 언급하지 않았습니다. 일단 긴 문항이 나온다면 그것을 쪼갠 뒤, 핵심 내용만 채워도 글자 수를 채우기가 훨씬 쉬워질 것입니다. 마지막, 화룡점정은 역시 '글빨' 그렇다면 정말 '글빨'이 안 중요한가? 사실 그렇지 않습니다. 하지만 글빨도 앞서 말했던 것처럼 내용이 좋다면 어느 정도 커버가 되는 요소입니다. 즉, 최소한의 '글빨'만 갖춘다면 합/불을 뒤집을 만큼의 중대한 사항은 아니라는 것입니다. 그럼에도 불구하고 마지막으로 '글빨'에 대해서 이야기하는 이유는, 자기소개서처럼 목적이 있는 글을 쓰는 것이라면 최소한의 글쓰기 능력이 필요하기 때문입니다. 맞춤법이나 문장의 주/술어, 번역투, 반복되는 표현, 시제나 어미의 일치 등 몇 가지 기준을 두고 퇴고하면 피할 수 있는 실수들을 안 할 수 있습니다. 이를 위해서 "나를 잘 모르는, 혹은 자기소개서라는 것을 잘 모르는 사람들에게 내 글을 읽어달라고 했을 때 '이게 무슨 말이야?'라는 말이 나오지 않는다!"라는 기준을 세워보는 것은 어떨까요? 저의 글도 과연 명확하고 진정성이 담겼는가, 다시 한 번 읽어보게 되면서... 이 글을 읽는 분들께 조금이라도 도움이 되길 바래봅니다! 2월의 시작 힘차게 하시길 바랍니다! 우리 존재 화이팅! #앵커리어 #자기소개서 #꿀팁 #인사이트 #조언 #경험공유

기업문화 엿볼 때, 더팀스

로그인

/