스토리 홈

인터뷰

피드

뉴스

조회수 450

협업툴 도입 전 고민 및 해결책은 무엇일까요?

안녕하세요 협업툴 플로우입니다.재택 및 원격근무의 확대, 디지털 디바이스의 보급으로 협업툴은 이미 주요 기업과 혁신 기업에서는 도입을 넘어 정착을 통해 뿌리를 내리고 있습니다. 이러한 디지털 워크 시대에서 시공간을 초월하고 실시간 의사결정을 진행할 수 있는 협업툴이라는 도구를 가진 조직은 유리한 고지를 선점하고 그러지 못한 조직은 디지털 전쟁에서 우위를 점하지 못해 결국 기업의 경쟁력은 약화될 수 밖에 없습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략협업툴 도입, 고민은 혁신만 늦출 뿐협업툴은 기업의 혁신이 선택의 기로가 아닌 생존의 문제라고 볼 때 디지털 혁신을 위한 필수입니다. 그러므로, 기업 담당자들은 협업툴 도입 전 고민이 있다면 직시하여 그에 대한 솔루션 적용을 통한 적극적인 추진이 필요하고 그 결과로 조직을 디지털 비즈니스 환경에 한발 더 빠르게 다가갈 수 있도록 해야 할 것입니다.‘구슬이 서말이라도 꿰어야 보배다’라는 말처럼 아무리 좋은 협업툴이라 하더라도 실제 우리 기업에 잘 정착이 되지 않는다면 무용지물이 됩니다. 이에 도입 직접 단계에 왔다면 반드시 짚고 넘어가야 할 5가지의 고민을 살펴보고 그에 대한 해결책을 알아보도록 합니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략협업툴 도입 전, 기업 담당자 고민 Best 5플로우 자체 빅데이터 시스템에서는 6년간 2,000여개의 기업에 적용한 실제 사례를 바탕으로 ‘어떻게 협업툴을 기업에 잘 정착시킬 수 있을까’에 대한 분석들이 계속적으로 이루어져왔고 공통적으로 겪게 되는 고민과 문제점은 아래와 비중으로 도출되었습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략✅ 5위 – 예산적합성협업툴 사용인원이 많을수록 그 비용은 증대되고 임대형 솔루션의 경우 매달 청구되는 비용이 영구적으로 사용한다고 가정한다면 도입과 운영에 대한 예산을 고민하지 않을 수 없습니다.✅ 4위 – 상호 운용성기존의 그룹웨어나 ERP, 메신저, 전자결재와 같은 익숙한 기능들에 충돌하지 않으면서 협업툴이 기존의 업무 시스템에 정착할 수 있는지를 고민해 볼 수 있습니다.✅ 3위 – 보안 안정성기업에 대한 모든 공식적인 자료와 비공식적인 메시지들이 공유가 되고 저장이 되는 소프트웨어입니다 보니 보안정책과 수준이 우리 기업에 맞는가를 고민해 보아야 합니다.✅ 2위 – 신중한 선택선택에 대한 부담감이 있지만, 한번 도입을 하고 난 다음에는 다른 협업툴로 변경이 어렵기 때문에 신중한 결정이 필요한 단계입니다.✅ 1위 – 직원 활용성조직원들이 마음을 움직여 잘 활용해야하고 업무환경에 정착이 되도록 하는 일이기 때문에 굉장히 난이도가 높습니다.고민 Best 5에 대한 해결책협업툴 도입 전, 기업 담당자가 가장 많이 하는 고민 Best 5를 알아 보았습니다. 그리고 플로우의 2,000여개의 실제 협업툴 도입 사례에서 도출할 수 있었던 일관된 빅테이터 중 하나는 바로 협업툴 도입을 최종적으로 결정 전에 그 문제를 해결할 수 있는 솔루션을 가지고 도입을 했던 경우와 그렇지 않은 경우 사이의 큰 결괏값을 가져왔다는 것입니다. 이에 그에 대한 해결책을 함께 제시합니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략✅ 5위 예산적합성 솔루션회사의 규모와 운영방식에 따른 방식을 선택하라. 최적의 예산으로 이 시스템이 잘 운영될 수 있도록 해야 하는데 그에 따른 선택이 바로 임대형과 구축형에 대한 결정입니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략임대형은 초기 투자비용이 낮고 언제든지 중지할 수 있으며 지속적인 업그레이드가 자동으로 된다는 장점이 있지만, 커스터마이징이 제한적이고 금융업과 같은 일부 업종은 법적인 규제로 인해 임대형 사용이 안된다는 단점이 있습니다. 반대로 구축형의 경우는 자유로운 커스터마이징이 가능하고 보안정책 수준도 원하는 만큼 높일 수 있습니다는 장점이 있지만, 그런 만큼 높은 초기비용, 높은 업그레이드 비용이 들고 유지보수 또한 플랫폼별(안드로이드, IOS, 웹 등)로 진행해야 된다는 단점이 있습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략이렇게 두가지 방식 모두 장단점을 가지고 있기 때문에 기업의 사용환경을 먼저 분석해 보고 거기에 적합한 방식으로 매칭하는 것이 가장 효과적이 방법입니다.✅ 4위 상호운용성 솔루션기존 시스템과의 유기적 연동이 가능한지를 점검해야 합니다. 플로우의 도입사례 중 현대모비스의 경우 기존의 인사정보 시스템을 연동시켜 입퇴사를 자동으로 괸리되도록 하였으며 SAP 인사평가시스템 솔루션연동, 플로우 게시물을 이메일로 보내기 기능 연동 등을 통하여 상호운용성을 대폭 증대시켰습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략또한 DB금융투자의 경우 고객관리시스템과 연동하여 스마트폰으로 영업 활동을 공유할 수 있게 하였으며 상품 게시판과 그룹웨어를 연결시켜 모바일에서 금융상품을 영업사원에게 바로 전달하는 기능이나 MDM 보안 솔루션과 연동하여 내부 보안 정책을 고도화시켰던 사례들이 있습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략이처럼 가능한 범위 내에서의 연동 기능을 추가하게 된다면 업무의 효율성이 증대되고 사용빈도가 높아지기 때문에 성공적인 도입이 될 수 있는 기반을 마련할 수 있습니다.✅ 3위 보안안정성 솔루션협업툴 회사의 보안 대책 및 기술 난이도를 점검하라. 보안 안정성을 점검할 수 있는 부분이 바로 협업툴 회사의 보안 대책 및 기술 난이도에 대한 평가입니다. 플로우의 경우 다음 9가지의 대표적인 보안 대책을 가지고 있습니다.① 파일 다운 이력 모니터링 시스템② 특정 파일 보안 등급 설정 시스템③ 입퇴사 계정 관리 시스템④ 화면 캡쳐 모니터링 및 방지 설정 시스템⑥ Ddos 등 해킹 관제 모니터링 시스템⑦ 도용 방지를 위한 2차 본인 인증 시스템⑧ 중복 로그인 제한 시스템⑨ 데이터 암호화 시스템ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략위와 같이 협업툴 회사가 얼마나 최적의 보안 안정성을 가지려고 노력하고 있으며 변화하는 기업환경에 맞춰 새롭게 발생하는 보안이슈에도 적극적으로 대응하는 전문 기술 인력 및 보안 노하우를 축적하고 있는지에 대해 평가해볼 필요가 있습니다.✅ 2위 신중한선택 솔루션시범 운영(파일럿) 후 점진적 확대를 추진하라. 협업툴은 특성상 전사 도입이 완료되면 바꾸기가 어려운 소프트웨어이기 때문에 조직원들의 불편을 최소화하고 업무 능률을 가장 극대화 시킬 회사의 제품을 선택하는 것이 필요한데 기업의 업무 환경은 워낙 다양하기 때문에 아무리 면밀한 검토를 한다 하더라도 실제 도입 환경에 대한 오차가 발생할 수 있습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략더하여 파일럿 테스트 동안 반드시 IT부서와 비IT부서를 함께 테스트에 참여시켜 상반된 업무 환경에 최적화 될 수 있는지를 평가하고 최소 본부 또는 팀 단위의 조직에 적용시켜 하나의 최소 조직에서 어떻게 운영이 되는지를 지켜봐야 합니다. 그리고 기존 채널을 통한 소통은 최소화시켜서 도입하고자 하는 협업툴이 얼만큼의 소통 가치가 있는지를 보고 사용상의 불편과 개선사항들이 파일럿 기간동안 반영될 수 있도록 조치해야 합니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략✅ 1위 직원활용성 솔루션앞서 언급한 4가지의 고민과 해결책과 달리 직원활용성은 기업의 조직문화와 업무마인드에 대한 혁신이 조직원들에게 어느정도 있는가에 대한 정성적인 부분에 해당하기 때문에 그만큼 예측과 통제가 어렵다고 볼 수 있지만, 디지털 전환의 최대 성패는 ‘조직문화 혁신’에 달렸다고 할 정도로 중요한 부분입니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략앞서 디지털 전환을 시도했던 글로벌 기업들의 사례에서도 그 어려움을 엿볼 수 있는데 JP모건의 경우 “단순히 디지털 기술로 전환하려 한 것이 필패의 요인이었고 디지털 전환시에는 조직 및 인사, 기업 문화 등 내부조직의 역량을 함께 키워야 한다”고 자사의 실패 요인을 분석했으며 GE의 경우도 “디지털화를 빠르게 시행했지만 CEO나 임원에 의한 일방적 결정이었기 때문에 조직간 비전공유가 되지 못했고 결국 실패로 돌아갔다”라고 평가하였습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략이처럼 성공적인 디지털 전환과 협업툴 정착을 위해서는 ‘조직 문화’의 변화가 바탕이 되어야 하며 신속하고 효과적으로 여기에 맞는 조직문화를 만들 수 있는가가 협업툴 도입의 성공 포인트가 될 수 있습니다.맥킨지의 Harry Robinson 는 중앙일보의 한 인터뷰에서 “디지털 혁신 도전 기업 90%가 실패한다”라고 말했다. 그의 말처럼 협업툴 정착이라는 디지털 전환은 결코 쉽지 않은 과정이 될 수 있습니다.ⓒ Madras check. Source: flow seminar, 2021 디지털 협업시대, 협업툴 혁신 1등 전략앞선 플로우의 2,000개 기업의 사례를 반면교사 삼아 협업툴 안착을 위한 기반을 선제적으로 마련하고 보다 기업 담당자들이 실익 있는 디지털 환경을 구축하는데 도움이 되길 바랍니다.협업툴 플로우 바로가기
조회수 1341

[마케터]내가 뭐라고 강의를 해?

#페이스북 #마케팅 #강의 #뒷북후기 #퇴사학교 #콘텐츠 #콘텐츠마케팅 #콘텐츠마케터 #마케터"내가 뭐라고 강의를 해?"강의를 처음 맡았을 때는 그렇게 생각했다. 그래서 더더욱 내가 잘 알아서 누군가를 가르치는 것이 아니라, 그냥 편하게 내가 1-2년 남짓이나마, 경험하고 배운 것들을 나눠줘야겠다 생각하려했다.대학생, 실무 마케터, 창업자 등등에게 몇 차례 강의를 하다보니 배우는 게 참 많다.1.내가 너무나도 당연했던 것들이 그 누군가에게는 완전히 신세계일 수 있구나.때론 꽉 막혀있던 부분을 뻥 뚫어주는 인사이트가 될 수도 있고, 나도 몰랐던 나를 발견하게 하는 새로운 경험이 될 수도, 작지만 새로운 자극이 될 수도 있겠구나.2.그리고 내가 당연하다고 생각한 것들은 어쩌면 정말 당연한 것이 아니구나. 내가 '알고 있다고' 생각한 것들이 나의 언어와 그림, 체계로 표현되지 않으면 이건 진짜 알고 있는 것이 아니구나. 그동안 '배웠다'라고 생각한 것들은 진정 내 것이 아니었구나. 그리고 내가 당연하다고 생각하고 있었지만, 정작 나는 실무에서 정말 실행해본 적이 있는가.3."나는 아직 부족한데... 준비가 다 되면 해야지..."라고 생각하면 뭐든지 평생 할 수 없겠구나. 세상엔 다 준비되고 완벽한 건 없으니까. 내가 지금껏 쌓아온 경험들은 어쨌든 세상에서 오직 '나'만이 경험해 본 시간들이다. 그러니 나의 경험, 시간들은 이미 그 자체만으로 남들에겐 새로운 자극이 될 수 있고, 가치있을 수 있다는 것.예를 들면 콘텐츠 100만 도달. 어떤 콘텐츠 마케터에겐 당연할 수 있지만 누군가에겐 100만 도달이라는 건 생각조차 못해봤을 수 있는 것이다.4.강의라는 것은 여러모로 참 나에게 감사한 기회가 되는 것 같다 :) 스타강사를 꿈꾸지도 않고 전업 강사도 생각은 없지만..어떤 브랜드/서비스/ 사람 성장하게끔 만드는 것을 즐거워하는 나에게는 강의를 준비하는 시간이나 하는 시간이나 끝난 뒤 회고하는 시간이나, 모든 순간들이 참 의미있는 시간인 것 같다 :)-P.s) 그런 의미에서 디지털 마케팅 잘하는 분(..)께 마니 좀 배우고 싶다....ㅠ.ㅠ
조회수 3140

Attention is all you need paper 뽀개기

이번 포스팅에서는 포자랩스에서 핵심적으로 쓰고 있는 모델인 transformer의 논문을 요약하면서 추가적인 기법들도 설명드리겠습니다.Why?Long-term dependency problemsequence data를 처리하기 위해 이전까지 많이 쓰이던 model은 recurrent model이었습니다. recurrent model은 t번째에 대한 output을 만들기 위해, t번째 input과 t-1번째 hidden state를 이용했습니다. 이렇게 한다면 자연스럽게 문장의 순차적인 특성이 유지됩니다. 문장을 쓸 때 뒤의 단어부터 쓰지 않고 처음부터 차례차례 쓰는 것과 마찬가지인것입니다.하지만 recurrent model의 경우 많은 개선점이 있었음에도 long-term dependency에 취약하다는 단점이 있었습니다. 예를 들어, “저는 언어학을 좋아하고, 인공지능중에서도 딥러닝을 배우고 있고 자연어 처리에 관심이 많습니다.”라는 문장을 만드는 게 model의 task라고 해봅시다. 이때 ‘자연어’라는 단어를 만드는데 ‘언어학’이라는 단어는 중요한 단서입니다.그러나, 두 단어 사이의 거리가 가깝지 않으므로 model은 앞의 ‘언어학’이라는 단어를 이용해 자연어’라는 단어를 만들지 못하고, 언어학 보다 가까운 단어인 ‘딥러닝’을 보고 ‘이미지’를 만들 수도 있는 거죠. 이처럼, 어떤 정보와 다른 정보 사이의 거리가 멀 때 해당 정보를 이용하지 못하는 것이 long-term dependency problem입니다.recurrent model은 순차적인 특성이 유지되는 뛰어난 장점이 있었음에도, long-term dependency problem이라는 단점을 가지고 있었습니다.이와 달리 transformer는 recurrence를 사용하지 않고 대신 attention mechanism만을 사용해 input과 output의 dependency를 포착해냈습니다.Parallelizationrecurrent model은 학습 시, t번째 hidden state를 얻기 위해서 t-1번째 hidden state가 필요했습니다. 즉, 순서대로 계산될 필요가 있었습니다. 그래서 병렬 처리를 할 수 없었고 계산 속도가 느렸습니다.하지만 transformer에서는 학습 시 encoder에서는 각각의 position에 대해, 즉 각각의 단어에 대해 attention을 해주기만 하고, decoder에서는 masking 기법을 이용해 병렬 처리가 가능하게 됩니다. (masking이 어떤 것인지는 이후에 설명해 드리겠습니다)Model ArchitectureEncoder and Decoder structureencoder는 input sequence (x1,...,xn)<math>(x1,...,xn)</math>에 대해 다른 representation인 z=(z1,...,zn)<math>z=(z1,...,zn)</math>으로 바꿔줍니다.decoder는 z를 받아, output sequence (y1,...,yn)<math>(y1,...,yn)</math>를 하나씩 만들어냅니다.각각의 step에서 다음 symbol을 만들 때 이전에 만들어진 output(symbol)을 이용합니다. 예를 들어, “저는 사람입니다.”라는 문장에서 ‘사람입니다’를 만들 때, ‘저는’이라는 symbol을 이용하는 거죠. 이런 특성을 auto-regressive 하다고 합니다.Encoder and Decoder stacksEncoderN개의 동일한 layer로 구성돼 있습니다. input $x$가 첫 번째 layer에 들어가게 되고, layer(x)<math>layer(x)</math>가 다시 layer에 들어가는 식입니다.그리고 각각의 layer는 두 개의 sub-layer, multi-head self-attention mechanism과 position-wise fully connected feed-forward network를 가지고 있습니다.이때 두 개의 sub-layer에 residual connection을 이용합니다. residual connection은 input을 output으로 그대로 전달하는 것을 말합니다. 이때 sub-layer의 output dimension을 embedding dimension과 맞춰줍니다. x+Sublayer(x)<math>x+Sublayer(x)</math>를 하기 위해서, 즉 residual connection을 하기 위해서는 두 값의 차원을 맞춰줄 필요가 있습니다. 그 후에 layer normalization을 적용합니다.Decoder역시 N개의 동일한 layer로 이루어져 있습니다.encoder와 달리 encoder의 결과에 multi-head attention을 수행할 sub-layer를 추가합니다.마찬가지로 sub-layer에 residual connection을 사용한 뒤, layer normalization을 해줍니다.decoder에서는 encoder와 달리 순차적으로 결과를 만들어내야 하기 때문에, self-attention을 변형합니다. 바로 masking을 해주는 것이죠. masking을 통해, position i<math>i</math> 보다 이후에 있는 position에 attention을 주지 못하게 합니다. 즉, position i<math>i</math>에 대한 예측은 미리 알고 있는 output들에만 의존을 하는 것입니다.위의 예시를 보면, a를 예측할 때는 a이후에 있는 b,c에는 attention이 주어지지 않는 것입니다. 그리고 b를 예측할 때는 b이전에 있는 a만 attention이 주어질 수 있고 이후에 있는 c는 attention이 주어지지 않는 것이죠.Embeddings and Softmaxembedding 값을 고정시키지 않고, 학습을 하면서 embedding값이 변경되는 learned embedding을 사용했습니다. 이때 input과 output은 같은 embedding layer를 사용합니다.또한 decoder output을 다음 token의 확률로 바꾸기 위해 learned linear transformation과 softmax function을 사용했습니다. learned linear transformation을 사용했다는 것은 decoder output에 weight matrix W<math>W</math>를 곱해주는데, 이때 W<math>W</math>가 학습된다는 것입니다.Attentionattention은 단어의 의미처럼 특정 정보에 좀 더 주의를 기울이는 것입니다.예를 들어 model이 수행해야 하는 task가 번역이라고 해봅시다. source는 영어이고 target은 한국어입니다. “Hi, my name is poza.”라는 문장과 대응되는 “안녕, 내 이름은 포자야.”라는 문장이 있습니다. model이 이름은이라는 token을 decode할 때, source에서 가장 중요한 것은 name입니다.그렇다면, source의 모든 token이 비슷한 중요도를 갖기 보다는 name이 더 큰 중요도를 가지면 되겠죠. 이때, 더 큰 중요도를 갖게 만드는 방법이 바로 attention입니다.Scaled Dot-Product Attention해당 논문의 attention을 Scaled Dot-Product Attention이라고 부릅니다. 수식을 살펴보면 이렇게 부르는 이유를 알 수 있습니다.Attention(Q,K,V)=softmax(QKT√dk)V<math>Attention(Q,K,V)=softmax(QKTdk)V</math>먼저 input은 dk<math>dk</math> dimension의 query와 key들, dv<math>dv</math> dimension의 value들로 이루어져 있습니다.이때 모든 query와 key에 대한 dot-product를 계산하고 각각을 √dk<math>dk</math>로 나누어줍니다. dot-product를 하고 √dk<math>dk</math>로 scaling을 해주기 때문에 Scaled Dot-Product Attention인 것입니다. 그리고 여기에 softmax를 적용해 value들에 대한 weights를 얻어냅니다.key와 value는 attention이 이루어지는 위치에 상관없이 같은 값을 갖게 됩니다. 이때 query와 key에 대한 dot-product를 계산하면 각각의 query와 key 사이의 유사도를 구할 수 있게 됩니다. 흔히 들어본 cosine similarity는 dot-product에서 vector의 magnitude로 나눈 것입니다. √dk<math>dk</math>로 scaling을 해주는 이유는 dot-products의 값이 커질수록 softmax 함수에서 기울기의 변화가 거의 없는 부분으로 가기 때문입니다.softmax를 거친 값을 value에 곱해준다면, query와 유사한 value일수록, 즉 중요한 value일수록 더 높은 값을 가지게 됩니다. 중요한 정보에 더 관심을 둔다는 attention의 원리에 알맞은 것입니다.Multi-Head Attention위의 그림을 수식으로 나타내면 다음과 같습니다.MultiHead(Q,K,V)=Concat(head1,...,headh)WO<math>MultiHead(Q,K,V)=Concat(head1,...,headh)WO</math>where headi=Attention(QWQi,KWKi,VWVi)dmodel<math>dmodel</math> dimension의 key, value, query들로 하나의 attention을 수행하는 대신 key, value, query들에 각각 다른 학습된 linear projection을 h번 수행하는 게 더 좋다고 합니다. 즉, 동일한 Q,K,V<math>Q,K,V</math>에 각각 다른 weight matrix W<math>W</math>를 곱해주는 것이죠. 이때 parameter matrix는 WQi∈Rdmodelxdk,WKi∈Rdmodelxdk,WVi∈Rdmodelxdv,WOi∈Rhdvxdmodel<math>WiQ∈Rdmodelxdk,WiK∈Rdmodelxdk,WiV∈Rdmodelxdv,WiO∈Rhdvxdmodel</math>입니다.순서대로 query, key, value, output에 대한 parameter matrix입니다. projection이라고 하는 이유는 각각의 값들이 parameter matrix와 곱해졌을 때 dk,dv,dmodel<math>dk,dv,dmodel</math>차원으로 project되기 때문입니다. 논문에서는 dk=dv=dmodel/h<math>dk=dv=dmodel/h</math>를 사용했는데 꼭 dk<math>dk</math>와 dv<math>dv</math>가 같을 필요는 없습니다.이렇게 project된 key, value, query들은 병렬적으로 attention function을 거쳐 dv<math>dv</math>dimension output 값으로 나오게 됩니다.그 다음 여러 개의 head<math>head</math>를 concatenate하고 다시 projection을 수행합니다. 그래서 최종적인 dmodel<math>dmodel</math> dimension output 값이 나오게 되는거죠.각각의 과정에서 dimension을 표현하면 아래와 같습니다.*dQ,dK,dV<math>dQ,dK,dV</math>는 각각 query, key, value 개수Self-Attentionencoder self-attention layerkey, value, query들은 모두 encoder의 이전 layer의 output에서 옵니다. 따라서 이전 layer의 모든 position에 attention을 줄 수 있습니다. 만약 첫번째 layer라면 positional encoding이 더해진 input embedding이 됩니다.decoder self-attention layerencoder와 비슷하게 decoder에서도 self-attention을 줄 수 있습니다. 하지만 i<math>i</math>번째 output을 다시 i+1<math>i+1</math>번째 input으로 사용하는 auto-regressive한 특성을 유지하기 위해 , masking out된 scaled dot-product attention을 적용했습니다.masking out이 됐다는 것은 i<math>i</math>번째 position에 대한 attention을 얻을 때, i<math>i</math>번째 이후에 있는 모든 position은 Attention(Q,K,V)=softmax(QKT√dk)V<math>Attention(Q,K,V)=softmax(QKTdk)V</math>에서 softmax의 input 값을 −∞<math>−∞</math>로 설정한 것입니다. 이렇게 한다면, i<math>i</math>번째 이후에 있는 position에 attention을 주는 경우가 없겠죠.Encoder-Decoder Attention Layerquery들은 이전 decoder layer에서 오고 key와 value들은 encoder의 output에서 오게 됩니다. 그래서 decoder의 모든 position에서 input sequence 즉, encoder output의 모든 position에 attention을 줄 수 있게 됩니다.query가 decoder layer의 output인 이유는 query라는 것이 조건에 해당하기 때문입니다. 좀 더 풀어서 설명하면, ‘지금 decoder에서 이런 값이 나왔는데 무엇이 output이 돼야 할까?’가 query인 것이죠.이때 query는 이미 이전 layer에서 masking out됐으므로, i번째 position까지만 attention을 얻게 됩니다.이 같은 과정은 sequence-to-sequence의 전형적인 encoder-decoder mechanisms를 따라한 것입니다.*모든 position에서 attention을 줄 수 있다는 게 이해가 안되면 링크를 참고하시기 바랍니다.Position-wise Feed-Forward Networksencoder와 decoder의 각각의 layer는 아래와 같은 fully connected feed-forward network를 포함하고 있습니다.position 마다, 즉 개별 단어마다 적용되기 때문에 position-wise입니다. network는 두 번의 linear transformation과 activation function ReLU로 이루어져 있습니다.FFN(x)=max(0,xW1+b1)W2+b2x<math>x</math>에 linear transformation을 적용한 뒤, ReLU(max(0,z))<math>ReLU(max(0,z))</math>를 거쳐 다시 한번 linear transformation을 적용합니다.이때 각각의 position마다 같은 parameter W,b<math>W,b</math>를 사용하지만, layer가 달라지면 다른 parameter를 사용합니다.kernel size가 1이고 channel이 layer인 convolution을 두 번 수행한 것으로도 위 과정을 이해할 수 있습니다.Positional Encodingtransfomer는 recurrence도 아니고 convolution도 아니기 때문에, 단어의sequence를 이용하기 위해서는 단어의 position에 대한 정보를 추가해줄 필요가 있었습니다.그래서 encoder와 decoder의 input embedding에 positional encoding을 더해줬습니다.positional encoding은 dmodel<math>dmodel</math>(embedding 차원)과 같은 차원을 갖기 때문에 positional encoding vector와 embedding vector는 더해질 수 있습니다.논문에서는 다른 *frequency를 가지는 sine과 cosine 함수를 이용했습니다.*주어진 구간내에서 완료되는 cycle의 개수PE(pos,2i)=sin(pos/100002i/dmodel)<math>PE(pos,2i)=sin(pos/100002i/dmodel)</math>PE(pos,2i+1)=cos(pos/100002i/dmodel)<math>PE(pos,2i+1)=cos(pos/100002i/dmodel)</math>pos<math>pos</math>는 position ,i<math>i</math>는 dimension 이고 주기가 100002i/dmodel⋅2π<math>100002i/dmodel⋅2π</math>인 삼각 함수입니다. 즉, pos<math>pos</math>는 sequence에서 단어의 위치이고 해당 단어는 i<math>i</math>에 0부터 dmodel2<math>dmodel2</math>까지를 대입해 dmodel<math>dmodel</math>차원의 positional encoding vector를 얻게 됩니다. k=2i+1<math>k=2i+1</math>일 때는 cosine 함수를, k=2i<math>k=2i</math>일 때는 sine 함수를 이용합니다. 이렇게 positional encoding vector를 pos<math>pos</math>마다 구한다면 비록 같은 column이라고 할지라도 pos<math>pos</math>가 다르다면 다른 값을 가지게 됩니다. 즉, pos<math>pos</math>마다 다른 pos<math>pos</math>와 구분되는 positional encoding 값을 얻게 되는 것입니다.PEpos=[cos(pos/1),sin(pos/100002/dmodel),cos(pos/10000)2/dmodel,...,sin(pos/10000)]<math>PEpos=[cos(pos/1),sin(pos/100002/dmodel),cos(pos/10000)2/dmodel,...,sin(pos/10000)]</math>이때 PEpos+k<math>PEpos+k</math>는 PEpos<math>PEpos</math>의 linear function으로 나타낼 수 있습니다. 표기를 간단히 하기 위해 c=100002idmodel<math>c=100002idmodel</math>라고 해봅시다. sin(a+b)=sin(a)cos(b)+cos(a)sin(b)<math>sin(a+b)=sin(a)cos(b)+cos(a)sin(b)</math>이고 cos(a+b)=cos(a)cos(b)−sin(a)sin(b)<math>cos(a+b)=cos(a)cos(b)−sin(a)sin(b)</math> 이므로 다음이 성립합니다.PE(pos,2i)=sin(posc)<math>PE(pos,2i)=sin(posc)</math>PE(pos,2i+1)=cos(posc)<math>PE(pos,2i+1)=cos(posc)</math>PE(pos+k,2i)=sin(pos+kc)=sin(posc)cos(kc)+cos(posc)sin(kc)=PE(pos,2i)cos(kc)+cos(posc)sin(kc)<math>PE(pos+k,2i)=sin(pos+kc)=sin(posc)cos(kc)+cos(posc)sin(kc)=PE(pos,2i)cos(kc)+cos(posc)sin(kc)</math>PE(pos+k,2i+1)=cos(pos+kc)=cos(posc)cos(kc)−sin(posc)sin(kc)=PE(pos,2i+1)cos(kc)−sin(posc)sin(kc)<math>PE(pos+k,2i+1)=cos(pos+kc)=cos(posc)cos(kc)−sin(posc)sin(kc)=PE(pos,2i+1)cos(kc)−sin(posc)sin(kc)</math>이런 성질 때문에 model이 relative position에 의해 attention하는 것을 더 쉽게 배울 수 있습니다.논문에서는 학습된 positional embedding 대신 sinusoidal version을 선택했습니다. 만약 학습된 positional embedding을 사용할 경우 training보다 더 긴 sequence가 inference시에 입력으로 들어온다면 문제가 되지만 sinusoidal의 경우 constant하기 때문에 문제가 되지 않습니다. 그냥 좀 더 많은 값을 계산하기만 하면 되는거죠.Trainingtraining에 사용된 기법들을 알아보겠습니다.Optimizer많이 쓰이는 Adam optimizer를 사용했습니다.특이한 점은 learning rate를 training동안 고정시키지 않고 다음 식에 따라 변화시켰다는 것입니다.lrate=d−0.5model⋅min(step_num−0.5,step_num⋅warmup_steps−1.5)warmup_step<math>warmup_step</math>까지는 linear하게 learning rate를 증가시키다가, warmup_step<math>warmup_step</math> 이후에는 step_num<math>step_num</math>의 inverse square root에 비례하도록 감소시킵니다.이렇게 하는 이유는 처음에는 학습이 잘 되지 않은 상태이므로 learning rate를 빠르게 증가시켜 변화를 크게 주다가, 학습이 꽤 됐을 시점에 learning rate를 천천히 감소시켜 변화를 작게 주기 위해서입니다.RegularizationResidual ConnectionIdentity Mappings in Deep Residual Networks라는 논문에서 제시된 방법이고, 아래의 수식이 residual connection을 나타낸 것입니다.yl=h(xl)+F(xl,Wl)<math>yl=h(xl)+F(xl,Wl)</math>xl+1=f(yl)<math>xl+1=f(yl)</math>이때 h(xl)=xl<math>h(xl)=xl</math>입니다. 논문 제목에서 나온 것처럼 identity mapping을 해주는 것이죠.특정한 위치에서의 xL<math>xL</math>을 다음과 같이 xl<math>xl</math>과 residual 함수의 합으로 표시할 수 있습니다.x2=x1+F(x1,W1)<math>x2=x1+F(x1,W1)</math>x3=x2+F(x2,W2)=x1+F(x1,W1)+F(x2,W2)<math>x3=x2+F(x2,W2)=x1+F(x1,W1)+F(x2,W2)</math>xL=xl+L−1∑i=1F(xi,Wi)<math>xL=xl+∑i=1L−1F(xi,Wi)</math>그리고 미분을 한다면 다음과 같이 됩니다.σϵσxl=σϵσxLσxLσxl=σϵσxL(1+σσxlL−1∑i=1F(xi,Wi))<math>σϵσxl=σϵσxLσxLσxl=σϵσxL(1+σσxl∑i=1L−1F(xi,Wi))</math>이때, σϵσxL<math>σϵσxL</math>은 상위 layer의 gradient 값이 변하지 않고 그대로 하위 layer에 전달되는 것을 보여줍니다. 즉, layer를 거칠수록 gradient가 사라지는 vanishing gradient 문제를 완화해주는 것입니다.또한 forward path나 backward path를 간단하게 표현할 수 있게 됩니다.Layer NormalizationLayer Normalization이라는 논문에서 제시된 방법입니다.μl=1HH∑i=1ali<math>μl=1H∑i=1Hail</math>σl= ⎷1HH∑i=1(ali−μl)2<math>σl=1H∑i=1H(ail−μl)2</math>같은 layer에 있는 모든 hidden unit은 동일한 μ<math>μ</math>와 σ<math>σ</math>를 공유합니다.그리고 현재 input xt<math>xt</math>, 이전의 hidden state ht−1<math>ht−1</math>, at=Whhht−1+Wxhxt<math>at=Whhht−1+Wxhxt</math>, parameter g,b<math>g,b</math>가 있을 때 다음과 같이 normalization을 해줍니다.ht=f[gσt⊙(at−μt)+b]<math>ht=f[gσt⊙(at−μt)+b]</math>이렇게 한다면, gradient가 exploding하거나 vanishing하는 문제를 완화시키고 gradient 값이 안정적인 값을 가짐로 더 빨리 학습을 시킬 수 있습니다.(논문에서 recurrent를 기준으로 설명했으므로 이에 따랐습니다.)DropoutDropout: a simple way to prevent neural networks from overfitting라는 논문에서 제시된 방법입니다.dropout이라는 용어는 neural network에서 unit들을 dropout하는 것을 가리킵니다. 즉, 해당 unit을 network에서 일시적으로 제거하는 것입니다. 그래서 다른 unit과의 모든 connection이 사라지게 됩니다. 어떤 unit을 dropout할지는 random하게 정합니다.dropout은 training data에 overfitting되는 문제를 어느정도 막아줍니다. dropout된 unit들은 training되지 않는 것이니 training data에 값이 조정되지 않기 때문입니다.Label SmoothingRethinking the inception architecture for computer vision라는 논문에서 제시된 방법입니다.training동안 실제 정답인 label의 logit은 다른 logit보다 훨씬 큰 값을 갖게 됩니다. 이렇게 해서 model이 주어진 input x<math>x</math>에 대한 label y<math>y</math>를 맞추는 것이죠.하지만 이렇게 된다면 문제가 발생합니다. overfitting될 수도 있고 가장 큰 logit을 가지는 것과 나머지 사이의 차이를 점점 크게 만들어버립니다. 결국 model이 다른 data에 적응하는 능력을 감소시킵니다.model이 덜 confident하게 만들기 위해, label distribution q(k∣x)=δk,y<math>q(k∣x)=δk,y</math>를 (k가 y일 경우 1, 나머지는 0) 다음과 같이 대체할 수 있습니다.q′(k|x)=(1−ϵ)δk,y+ϵu(k)<math>q′(k|x)=(1−ϵ)δk,y+ϵu(k)</math>각각 label에 대한 분포 u(k)<math>u(k)</math>, smooting parameter ϵ<math>ϵ</math>입니다. 위와 같다면, k=y인 경우에도 model은 p(y∣x)=1<math>p(y∣x)=1</math>이 아니라 p(y∣x)=(1−ϵ)<math>p(y∣x)=(1−ϵ)</math>이 되겠죠. 100%의 확신이 아닌 그보다 덜한 확신을 하게 되는 것입니다.Conclusiontransformer는 recurrence를 이용하지 않고도 빠르고 정확하게 sequential data를 처리할 수 있는 model로 제시되었습니다.여러가지 기법이 사용됐지만, 가장 핵심적인 것은 encoder와 decoder에서 attention을 통해 query와 가장 밀접한 연관성을 가지는 value를 강조할 수 있고 병렬화가 가능해진 것입니다.Referencehttp://www.whydsp.org/280http://mlexplained.com/2017/12/29/attention-is-all-you-need-explained/http://openresearch.ai/t/identity-mappings-in-deep-residual-networks/47https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220793640991&proxyReferer=https://www.google.co.kr/https://www.researchgate.net/figure/Sample-of-a-feed-forward-neural-network_fig1_234055177https://arxiv.org/abs/1603.05027https://arxiv.org/abs/1607.06450http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdfhttps://arxiv.org/pdf/1512.00567.pdf
조회수 1746

GDG DevFest Seoul 2018, 크래커나인 부스 참가 후기

2018년 11월 10일 토요일, 세종대학교 광개토관 컨벤션홀에서 GDG DevFest Seoul 2018이 열렸습니다. 세종대학교 광개토관 컨벤션홀 세션장과 세션 소개지GDG 행사 중 가장 큰 개발자의 축제에 크래커나인이 빠질 수 없겠지요?GDG DevFest는 GDG 커뮤니티에 의해 매년 개최되는 개발자 행사 중 하나로, 올해는 'Digital Wellbeing' 이라는 키워드 아래 진행되었습니다.이번 행사는 구글 기술과 관련된 세션, 해커톤, 코드랩 등의 형태로 구성이 되어 짜임새 있고 더 유익했습니다.⬆️ 위의 시간표 출처: 티켓구입처(https://festa.io/events/88)여기서 코드 랩은 무엇인지 궁금 하시지요?* Codelab은 미리 작성된 가이드를 따라 빠르게 해당 기술의 튜토리얼을 해볼 수 있는 프로그램이였어요. Codelab 튜터가 상주하고자유롭게 출입해 시작할 수 있다는 큰 매력으로 많은 개발자님들이 참여해주셨습니다.이미지 출처: https://devfest-seoul18.gdg.kr/timetableTrack E에 후반에 진행하는 마인드폴니스는 이번 'Digital Wellbeing' 키워드에 가장 걸맞았어요.* Mindfulness는 경직된 자세로 오랜 시간 작업을 하기 쉬운 개발자들을 위해 명상을 하는 시간을 가지는 프로그램입니다.저희 크래커나인 팀원들도 마인드폴니스에 참여하여 힐링하였다고 하네요 :)이미지 출처: https://devfest-seoul18.gdg.kr/timetable그 밖의 세션들은 Android, Firebase, Google Cloud Platform, Machine Learning, Web Technologies, Chrome 등의 Google 개발자  기술  콘텐츠 뿐만  아니라  더  나아가  트렌드에  부합하는  많은  주제를  폭  넓게  다루는  다양한  시간이었습니다.이미지 출처: https://devfest-seoul18.gdg.kr/timetable단 5분만에 디자인을 코드로 만들어주는 크래커나인은 행사의 꽃, 부스 참가하였습니다.구글 코리아, 레이니스트, 카카오페이, 알지피코리아 등과 나란히 부스 참가하여 많은 개발자님들을 만날 수 있었습니다.이미지 출처: https://devfest-seoul18.gdg.kr크래커나인은 10월 1일 부터 GDG DevFest Seoul 2018을 준비하기 시작했습니다.더 많은 개발자님들에게 편리하고 효율적인 크래커나인을 소개하여 작업 속도와 능률을 올리고자 했습니다.대략 40일간 준비하면서 진짜 디자이너와 개발자가 원하는 바가 무엇인지도 생각해보는 뜻깊은 시간들 이었습니다.먼저, 개발자님들의 애정한다는 스티커를 팀 명함과 함께 제작하였습니다.또한 많은 분들에게 크래커나인 무료 베타 서비스와 더불어 선물을 선사해드리고 싶어 경품 이벤트도 진행했답니다 :)  국내에서 다수가 사용하는 GUI 가이드 프로그램 제플린의 아성에 도전하는 크래커나인!실제 크래커나인을 사용하면 GUI 정보는 물론, 안드로이드 코드까지 생성해주어 매우 효율적입니다. 실제 블로터에 메인 게재될 만큼 혁신적이고 획기적인 크래커나인을 많은 분들께 소개하려니 너무 설레였습니다 :)“디자인만 하면 코드 자동 생성”…‘크래커나인’ 베타 출시코드를 '클릭'으로 해결해준다.www.bloter.net이 날, 제플린 vs 크래커나인 속도 테스트 영상을 공개하여 큰 이슈를 받았는데요~ 많은 개발자님들의 환호와 관심에 더욱 더 좋은 기능과 서비스로 보답해야 겠다는 마음이 커졌습니다.   제플린과 크래커나인 속도 테스트 영상 궁금하시지요?Cracker9 VS Zeplin (19sec)똑같은 앱 화면 디자인을 크래커나인과 제플린을 사용하여 GUI정보를 받아 안드로이드 스튜디오를 이용하여 화면을 구성하기 까지의 작업 속도를 비교한 영상입니다. 안드로이드 코드까지 생성해주는 크래커나인은 5분대에 화면 완성! GUI가이드문서를 만들지 않아도 빠르고 간편하게 GUI가이...youtu.be코드 생성 프로그램은 기존에도 존재한 적 있지만, GUI 정보와 안드로이드 레이아웃 코드까지 클릭만으로 뽑아주는 크래커나인은 그야말로 +_+ 최고!실제 사용해보고 시연할 수 있는 곳을 만들어 많은 개발자님들의 검증도 받았답니다.  믿음이 가는 코드에 만족하셨나요?스피드하게 짜는 손코딩 장인 "시니어 개발자"도~알아가는 단계지만 꼼꼼하게 체크하며 한땀한땀 작성해가는 "주니어 개발자"에게도~시연, 체험했던 크래커나인!개발자님들에게 편의성 뿐만 아니라 신뢰성 마저 안겨주었던 좋은 기회였습니다. :)그 밖에도 카카오인형 경품으로 많은 인원을 모은 카카오페이는 "요즘개발자, 카카오페이" 라는 카피와 QR 코드로 부스를 장식했습니다. 명함 이벤트를 진행한 요기요 배달통 부스는 경품 당첨때만 인산인해를 이루었답니다. 갑자기 많은 개발자님들이 당첨 여부 확인하러 오셨다가 저희 부스에 와주셔서 또 다른 기회로 크래커나인을 소개할 수 있었답니다 :) 세션에 참가하여 각자의 생각과 견해를 적어주신 개발자님들께도 감사의 인사를 드립니다.세션의 상세내용은 아래의 포스트에서 좀 더 자세히 보실 수 있습니다.※ 디테일한 강연내용과 후기를 남겨주신: http://eclipse-owl.tistory.com/18?category=1022165※ 자신의 견해와 행사의 세션 정리를 잘 해주신: https://brunch.co.kr/@oemilk/196#에이치나인 #디자이너 #개발자 #협업툴 #크래커나인 #솔루션기업 #이벤트참여 #이벤트후기
조회수 774

공간 디자인의 중요성

2009년 가을, 독일 함부르크에 위치한 하겐베크 동물원(Tierpark Hagenbeck)에 방문하고나서 공간을 이해하는 관점이 완전히 달라졌다.100년이 넘은 역사를 자랑하는 하겐베크 동물원은 철장이 없는 방사식 동물원으로 유명하다. 같은 대륙의 동물들이 같은 장소에서 생활하게 하되 각 서식지 사이에 해자(성 주변에 둘러 판 도랑)를 만들어 서로 해치지 못하게 하는 방식을 세계 최초로 도입한 것이다. 사람의 시선에서는 해자가 보이지 않기 때문에 마치 광활한 평지에 여러 동물들이 자연에서 함께 어울려 사는 것처럼 보인다. 또한 습성에 따라 함께 지내는 것이 긍정적인 효과를 불러오는 동물들은 함께 서식하고, 많은 동물들이 인도에 자유롭게 활보하는 것으로도 유명하다.세계 최초의 방사식 동물원. 출처 : 하겐베크 동물원 페이스북 페이지 하겐베크 동물원은 우리 안에 갇힌 동물들을 "관찰"하는 공간이 아니었다. 동물들의 자연 서식지에 인간이 "방문"하는 공간으로 느껴졌다. 사람 중심의 공간이 아니라 그곳에 서식하는 동물 중심의 공간이었다. 이 경험이 신선한 충격이었던 가장 큰 이유는 아이들과 함께 동물원을 방문한 가족들의 모습 때문이었다. 동물원의 중요한 역할은 교육에 있다고 보는데, 이러한 방사식 공간 구성은 동물들의 자연 서식을 조금이나마 더 현실적으로 보여주고 생명 존중의 가치관을 훨씬 더 효과적으로 전달할 수 있다고 생각했다. 이때부터 공간을 연구하고 디자인하는 것에 큰 관심을 갖게 되었다. 호기심이 많다보니 궁금증이 생기면 끝없이 구글 검색을 하는 편인데, 공간의 효율성이 치명적인 역할을 하는 병원의 공간 연구, 창의성을 극대화하는 사무 공간 연구에 대해서 많은 논문을 뒤져보았다. 사실 당시 대학원 유학 준비를 시작할 때였는데 디자인씽킹(Design Thinking)의 근원지인 스탠포드 디자인 프로그램이 유일한 목표였던 나에게 새로운 호기심을 불러일으켰고, 마침내는 코넬 대학의 공간 디자인 연구 박사 과정에 동시 지원하기도 했다. (스탠포드에 진학하지 않았다면 지금 어떤 일을 하고 있을지 궁금하기도 하다.)공간에 대한 전문가는 아니지만 사무 공간 역시 공간을 사용하는 사람들에 대한 많은 배려가 필요하다고 생각한다. 단순히 넓은 공간에 좋은 책상과 의자를 배치하고, 회의실을 여러개 만들어두고, 비싼 인테리어 마감을 하는 것이 다가 아니다. 다양한 사람들과 하루동안 가장 많은 시간을 쓰는 사무 공간이야말로 과학적인 배려가 필수적이다. 디즈니, 3M, 페이스북과 같이 창의적이고 혁신적인 기업들이 공간 연구에 많은 리소스를 투자하여 홀로 집중할 수 있는 공간, 협업을 유도하는 공간 등의 다양한 조화를 만들어내는 이유가 여기에 있다.미흡하지만 개방과 폐쇄의 조화를 이루기 위해 직접 디자인한 렌딧의 사무 공간. 렌딧 민트가 포인트인 Lendit Wall 열린 커뮤니케이션을 위한 개방 공간 Creative Hall1:1 회의 공간. 답답함을 줄이기 위해 천장 개방전체적으로 개방된 공간에 각자의 자리가 있기 때문에 가끔씩 필요한 1인 집중 공간 Burning Man좀 더 편안한 분위기의 공용 휴식 공간
조회수 1077

레고를 만들다 든 startup 관련 생각들...

스타워즈 개봉 기념으로 X-wing fighter를 하나 구매하여, 하나하나 만들면서 들었던 생각들을 사진과 함께 정리해 보았다. 그렇다! 8~14세가 적정 연령이지만 38세 아저씨가 본인이 갖기 위해 사고 직접 조립했다. 영화를 보신 분이라면, X-wing fighter가 등장하는 장면에서 이 비행기가 얼마나 멋지게 나오는지 알 것이다. 그 장면에서 난 정말  감동받았다 ㅜㅜ암튼 그런 레고를 하나 만들면서 들었던 몇몇 생각들을 짧게 정리!1. 레고의 설명서에는 말이 필요 없다.일단 레고의 제품 설명서에는 말이 한마디도 없다. 그냥 보면 알게 된다는 것이고, 사진과 숫자로 잘 표현하기 때문에 그냥 잘 따라가다 보면 어느새 완성이 되어버리는 것이다. 파펨(paffem)의 경우, 고객들에게 제품을 배송할 때, 소개 카드 한 장이 동봉되는데 거기에는 텍스트들이 난무한다. ㅜㅜ말로 설명을 해야 고객에게 우리 서비스가 무엇인지 설명할 수 있기 때문인데, 이것을 어떻게 쉽게 고객들에게 전달해볼까? 에 대한 고민을 진행 중이고, 동영상으로 이 것을 해결하는 작업을 진행하고 있다. 또한 파펨을 언제 이용하면 좋은지에 대한 설명을... 글이 아닌 영상으로 풀기!2. 레고는 단순 조립이 아니다.사실 레고를 만들다 보면 그냥 멍하니.. 설명서에서 하라는 순서대로 따라 하는 경우가 많다. 그런데 그 와중에도 레고 디자이너의 의도들이 느껴지는 경우가 있는데, 그럴  때마다 이 디자이너가 얼마나 고민을 많이 했고, 그 의도를 숨겨놓았는지를 찾아가면서 감동하게 된다. 다 만들어지고 나면 보이지 않는 것들에 까지도 하나하나 블록을  달리해가면서 그게 왜 거기에 있어야 하는지에 대한 설계를 하고 있고, 또한 그 대상의 원리 같은 것에 대해서도 설명을 하고 싶은 의도를 곧곧에 숨겨 놓았다.예를 들면 왜 굳이 1번(아래 사진 중)에서 한 개로 만들어도 되는 부품을, 두개를 따로 만들어서 조립하게 했을까? 이런 질문들이 튀어나올  수밖에 없다.3. 내부 조율은 어떻게 할까?아래 부품을 보면서 들었던 생각이, 저런 부품은 레고의 다른 "모델"들에서는 사용되지 않을 것인데, 굳이 저렇게 까지 만들었어야 하는  것일까?라는 생각이 들었다. 디자인 부서에는 당연히 저렇게 만들어야 한다고 주장했을 터이고, 제조 쪽 부서에서는 호환되지 않는 제품의 경우는 원가, 공정의 번거로움 등등의 이유로 거부를 했을 것이라는 상상을 해보았다. (이런 부서간의 다툼?은 사실 회사들에서는 일상이다)내가 어릴 때만 해도 레고가 이렇게 다양한 제품(모델)을 만들지는 않았고, 대부분 호환되는 블록들로만 만들어서,  맘대로  이것저것 만드는 재미가 있었던 것 같은데, 요즘의 레고는 굉장히 디테일을 살리고 실사들을 하나의 미니어처 화 시키는 작업에 공을 들이고 있다. 아마도 계속해서 본인들의 본질은 변하지 않되 정체성에 대한 고민을 하고 있는 듯. 또한 이런 상품들이 많아지면서 덕후들은 계속 양산되고 있다.4. 오퍼레이션 관리의 신, 레고아래 사진은 남은 블록들이다. 대부분 아주 작은 부품들을 몇 개씩 더 넣어주는데, 이것은 물론 일부러 더 넣어주는 것이겠지만..여기서 하나의 호기심이 생긴 것이.. 레고에서는 저런 부품들의 종류와 개수를 어떻게 정확하게 맞춰  넣을까?라는 것이다.사실 파펨(paffem) 박스를 포장할 때도 많은 요소들이 들어가는데, 일단 향수, 이미지 카드, 설명카드, 바틀 부착용 스티커, 첫 구매고객의 경우는 선택하지 않은 향의 샘플까지.. 암튼 이것들도 뭔가 빠져서 갈 때가 많고, 실수를 하는 경우가 많은데.. 레고의 경우는 그 많은 그리고 그 다양한 블록들을 어떻게 하나하나 실수하지 않고 넣을까? 물론 기계가 하겠지?5. 빅픽쳐를 설명해주는 레고의 위엄조립의 매 챕터에서는 그 챕터의 완성작으로 Big picture를 보여준다. 4번의 봉다리를 뜯어서 만들면 오른쪽의 모양과 같이 만들어진다는 것을 미리 보여주고 있다. 내가 항상 중요하게 생각하는 "예측가능성"에 대한 너무나도 좋은 예시인 듯하다. 그리고 저 숫자 4와 같이 블록들을 모듈화 시켜두었기 때문에, 단계별로 만드는 것도 가능하고 또한 부품들 찾느라 너무 많은 고생을 시키지 않는다는 장점 또한 살리고 있다. 이런 것들이 보이지 않는 고객 배려!!레고를 조립하며 들었던 이런저런 생각들을 짧게 정리해 보았는데, 레고는 그저 어린이들이 가지고 노는 장난감이 아니다. 물론 요즘은 아저씨 덕후들이 더 난리라는 것도 잘 알고 계실 듯한데.. 아무튼  철학들, 고민들, 노력들과  creative들이 어우러져서 이렇게 멋진 제품이 나오고 또 발전하여 위대한 제품들이 나온다.  정말 멋지다 레고!!#파펨 #스타트업 #창업가 #창업자 #마인드셋 #인사이트
조회수 2054

왜 우리는 VC만 만나면 좌절할까?

어제, 비트패킹컴퍼니의 음악 스트리밍 서비스 '비트'가 서비스를 종료했다. 내가 비캔버스 초기 서버 개발을 할 때 비트도 동시에 베타 서비스를 하고 있었는데, 그 뛰어난 UI/UX에 감탄했던 기억이 난다. 하지만 음악을 사랑하고 하루 종일 음악을 들으며 일하는 나로서는, 비트의 라디오 방식 스트리밍이 맞지 않았고 결국 Spotify로 다시 옮겨오긴 했지만, 그 짧은 시간에 비즈니스를 정말 잘했다고 생각한다. 돌이켜보면 비트가 120억 펀딩을 받고, 동시대에 창업한 대표님들이 100억 이상 펀딩을 받을 때 나는 뭐했나 하는 생각이 들기도 한다.내 주변에도 새롭게 창업을 시작하는 사람들이 많은데, 나와는 다른 문제로 큰 스트레스에 빠져있는 경우가 많았다. 가장 큰 문제는 자신의 뜻이나 비전과 무관한 사업을 하는 사람들이 많았다. 요새 뜬다는 분야, 혹은 초기에 돈을 좀 만져볼 수 있는 분야에서 창업을 하려는 경우가 많았다. 처음에 우리가 기업용 협업툴 만든다고 할 때 투자자, 멘토들은 우리는 망할 것이 뻔하다고 했다. 그런데도 비캔버스 사업을 강행한 이유는 다른 걸로 굳이 창업하고 싶은 생각이 없었기 때문이다. 내가 좋아하는 일을 하고 싶어서 창업을 한 것도 아니고 그저 비캔버스라는 새로운 업무, 생각 체계를 만들고 싶어 창업한 나로서는 사업적으로 어렵고 우리가 경험이 없다고 해서 그것을 요새 뜬다는, 혹은 확률이 조금 더 높은 분야로 사업분야를 바꾸고 싶은 생각이 1도 없었다.요즘 창업하는 예비창업팀, 특히 학생창업팀의 멘토는 주로 VC인 경우가 많은데, 너무 VC업계 사람들의 말에 그들의 사업과 인생의 방향이 좌지우지되는 경우가 많은 것 같다. 전문가들의 조언을 따르고 사업을 시작하면 성공 확률을 조금 높일 수는 있겠지만 결론적으로 자기가 강하게 가진 뜻을 바탕으로 사업하는 것보다는 빨리 지칠 확률이 크다고 본다. 막상 사업을 시작하면 국세청 홈택스 들어가는 것부터 스트레스받고 내가 하고 싶은 일이 아닌데, 그런 걸 다 참고 서류 작업을 해야한다. 돈이 떨어져 가면 펀딩을 받으러 가서 인생을 수년간 퍼부은 사업에 대해 3분 듣고 온갖 인신공격 다해대는 사람들 앞에서 의연한 모습을 취해야 하는 등 큰 스트레스를 받게 돼있다. 그것을 견디기 위해선 거의 소시오패스적으로 강하게 추구하는 열망이 없으면 불가능하다고 본다.우리나라는 벤처기업 수에 비해서 VC수가 월등히 작고, 그 VC들 또한 클럽딜로 들어가는 경우가 많아 빈익빈 부익부 현상이 심하다. 빅뱅 엔젤스와 같이 다양한 분야에 투자하는 엔젤클럽들이 많긴 하지만, 초기 기업이 마이크로 VC에 1억 이상 투자받기란 하늘의 별따기 인 셈이다. 그렇기 때문에 창업가들은 VC 심사역들을 추종하고 그들이 말하는 것을 곧이 곧대로 듣고 좌절하고 절망하고 분노하기 쉽다.2014년부터 창업을 하면서 많은 벤처캐피털리스트를 만나왔다. 개중에는 정말 인사이트 넘치면서도 우리의 올바른 방향을 짚어주거나, 내가 생각지도 못한 부분을 질문하여 부족함을 느끼게 만드는 사람도 있지만 어떤 사람들은 우리의 사업분야에 대해 인지도가 떨어짐에도 불구하고, 모든 업계의 사업체에게 던질 수 있는 General 한 질문으로 일관하며 '나라면 안쓸 것 같은데, 누가 쓰겠어요?'라고 하는 경우도 많았다.솔직하게, 내가 처음 창업할 때와 달리, 오히려 지금 창업하시는 분들은 린스타트업이나 이런 것들에 대해 더 면밀하게 연구한 사람들이 많기 때문에, '고객이 누구냐', '시장은 크냐'이런 질문에 대해 답변 못할 사람이 없고 그것을 제외하고 사업을 시작하는 경우도 거의 없다. 사업분야에 따라 다른 유의미한 질문을 던져야 한다고 본다. 사업이라는 것이 Logical 하게 논리적 구조를 만든다고 해서 이뤄지는 것이 아니기 때문이다. 사업분야에 따라 중요한 지표가 있고, 고객의 반응이 있고, 그 모수가 있는 것이라고 본다.96년 맥킨지의 스타트업 기업의 사업계획서 작성 가이드(린스타트업 이론과 유사함)창업자가 피칭을 2분 안에 짧게 해야 된다던가, 사업계획서를 ppt 8장 이내로 짧게 만들어야 한다던가 하는 우리가 당연시하는 부분이 있는데, 나는 솔직히 '왜?'라고 묻고 싶다.이는, 미국에서 날아온 각종 스타트업 관련 이론에 의해 만들어진 패러다임이라 보는데 처음에 미국의 컨설팅업체인 맥킨지와 경영계 교수들이 만들어낸 스타트업 이론이 조금 더 구체적으로 구조화된 것이 지금 유행하는 린스타트업이다. 맥킨지의 소형 기업의 전략적 사업계획 수립방식에 대한 연구 보고서와 스티브 블랭크의 저서를 모두 보며 이것은 지금 한국에는 크게 적합하지 않을지도 모르겠다는 생각이 들었다.가장 큰 이유는 미국의 VC는 투자 섹터가 매우 구체적인 경우가 많기 때문에 해당 분야에 대해 전문성을 갖춘 심사역들이 딜 소싱을 하기 때문이라고 생각한다. 작년에, 독일에서 드롭박스, 슬랙 등을 투자한 세계적인 벤처캐피털인 Index ventures의 심사역을 만났는데, 간단하게 3분 정도 사업설명을 하며 서비스를 보여줬더니 우리가 측정하고 있는 KPI나 그 숫자가 우리의 스테이지에 얼마나 의미 있는지 등을 정확하게 집어냈다. 그러더니, 자신의 트렐로에 있는 회사 리스트들을 보여주며 받아 적으라며 그들이 우리에게 위협이 되거나 시너지를 낼 수 있는 기업이니 주시하라고 조언해줬다.그의 트렐로 리스트에는 최소 200여 개 이상의 기업이 있었다. 그 심사역은 수많은 기업들로부터 피칭을 들으며 해당 시장에 대한 이해도와 지표에 대한 타당성 검증 노하우를 습득하게 된 것이다. 이런 사람들한테는 30장의 사업계획서도 필요 없고, 시장 동향이나 미래 동향에 대해 굳이 장황하게 설명할 필요도 없다. 그래서 미국에서는 엘리베이터 피칭이 매우 유효하고, 짧은 사업계획서 전략이 유용한 것이다. 한 장 짜리 사업계획서나 요약본이 유용하기 위해선 그것을 읽는 사람의 이해도가 매우 높아야 한다.그러나, 우리나라는 벤처기업의 수가 미국처럼 많지도 않을뿐더러 쏠리는 분야가 정해져 있다. 가령, 데이팅 앱의 한 달 접속자 수가 2000이라고 가정하자. 그리고 그들이 10억의 펀딩을 받았다. 만약 내가 기업용 HR 소프트웨어를 개발하고 있는데 한 달 접속자 수가 500명인데 10억의 펀딩을 받으러 VC를 찾아갔고 치자. 이 MAU에 담긴 의미를 잘 이해하지 못하는 사람들도 많이 없을 뿐더러 액티브 유저의 기준이 뭔지도 물어보는 사람이 거의 없다. 해당 VC는 똑같은 MAU라는 지표 속에서도 그것이 사업분야에 따라 얼마나 차등이 있고 어느 정도의 지표가 이 스테이지에 맞는 스테이지인지 이해할 수 있어야 그 지표를 받아들일 수 있다. 그게 아니라면, 일단은 창업자가 지표에 대해 설명하는 논리를 듣고 그것을 추정할 수 있어야 한다고 본다.그런데, 그런 VC가 그렇게 많지 않다. 그것이 바로 문제다. 창업자들이 피치 덱을 만들 때도, Problem-Solution에 가장 크게 신경을 쓰는데, 쏠리는 분야에서 제안하는 Product fit에 대한 내용은 거의 동일하거나 비슷하기 때문에 대부분 이해도가 높지만, 생소한 아이템의 경우 그 Problem 자체가 낯설기 때문에 내가 직접 느끼는 Problem이 아니면 매력도를 매우 낮게 본다.벤처 창업가는 이렇게 남들이 알아주지 않는 분야에도 미래를 보고 고객을 만나 직접 연구하고 피부로 느끼고 수없이 싸워가며 뭔가를 발견하고 배운다. 그것에 대해 정말 요약본으로 보고라도 해보고 싶은데, 그것 마저도 말을 잘라버리는 사람들이 많은데, 그것은 자신의 그릇을 스스로 좁히는 것이라 생각한다. 내 생각에 벤처정신은 벤처 창업가뿐 아니라, 벤처 캐피털도 함께 가져야 한다고 생각한다. 이 생태계가 벤처 창업가 한 사람으로 돌아가지 않기 때문이다.지난달부터 VC와 미팅을 가질 기회가 몇 번 있었는데, 나는 모던 클라우드 애플리케이션의 동향과 앞으로 발생할 needs, 지금의 problem이 어떻게 확장될 수밖에 없는지, 기업이 하이브리드 클라우드 환경을 도입하게 될 가능성과 그때를 대비하기 위해 우리가 무엇을 해오고 지금까지 2년 동안 발견해왔는지 등을 공유하려 했다. 결과는 대부분 창업자들이 겪는 그런 느낌으로 끝이 났다. 우선 내가 수년 동안 연구해오고 고객들과 부딪치며 싸워온 결과물에 대해 들으려고 하지 않았고, 어린아이 혼내는 것처럼 질문만 쏟다가 아무도 안 쓸 것 같다고 말하고 미팅이 끝났다.그럴 때 난 항상 물어본다. "이런 B2B 클라우드 솔루션이나 협업 툴에 깊게 검토하거나 투자해본 적 있으신가요?"대부분 없다. 그렇다면, 우리를 통해 이 분야에 대해서도 학습할 수 있는 좋은 기회를 가진 건데, 그것을 거부한다니 조금 의아하게 느껴진다.물론, 내가 만나본 대부분의 심사역 분들은 겸손하고 예의 바르고 진지하게 들어줬다. K큐브 벤처스의 심사역님 같은 경우 정말 여러 번 우리 사무실까지 찾아와서 이야기를 들어줬는데, 작년에 우리 회사 내부적으로 문제가 생기고 있는 스테이지였고 내 정신도 조금 무너져있던 상태였기 때문에 제대로 준비가 안되어 있었던 것 같아 아직도 죄송스럽게 생각한다. 스파크랩의 이한주 대표님 같은 경우도 B2B 사업가답게 우리 사업분야에 대해 매우 날카롭고 예리한 감각을 갖고 있었다. 오히려 내가 모르는 부분을 말해줘서 그때는 아는척하고 고개를 끄덕이다가 집에 와서 따로 공부했던 기억이 난다.우리나라에 독특한 분야의 창업이 잘 이뤄지지 않는 이유가 난 여기에 있다고 본다. 우리나라에서 세계적인 사업체가 안 나오는 이유도 여기에 있다고 본다. 몇 달 전까지만 해도, 왜 사람들이 이미 있는 사업체의 서비스랑 똑같거나 비슷한 아이템을 계속 만드는지 의아하게 느꼈다. 그런데, 이제는 이유를 알 것 같기도 하다. 스타트업의 생명이라고 여겨지는 Runway를 늘이기 위해서는 어느 정도의 자금이 필요한데, 그렇기 위해서는 처음부터 자생할 수 있거나, Product fit-Market fit이 어느 정도 검증된 분야의 사업을 시작하는 편이 더 낫기 때문이다. 그런데, 그런 비즈니스는 기존 기업들이 더 잘할 수 있는 분야라고 생각한다.해외와 달리 우리나라는 M&A가 별로 없기 때문에 스타트업이 대기업이 뛰어들법한 아이템을 아무리 잘해봐야 인수가 잘 안되기 때문에, 차라리 대기업이 관심도 없어할 만한 분야의 미래가치를 보고 뛰어들어 그것에 인생을 베팅하여 지속적으로 학습하고 부딪쳐가며 타이밍이 왔을 때 승리하는 것이 더 최적화된 전략이라고 생각한다. 그런데, 우리나라는 네이버, 다음이 뛰어들어도 전혀 안 이상할 것 같은 분야의 서비스를 만든 다음에 그들이 들어오면 다 같이 욕하려고 한다. 난 그게 올바른 건지 잘 모르겠다.요즘 스타트업들의 피칭을 영상으로도 보고, 데모데이에 가서도 흘끗 보고 느낀 것은 2014년에 비해 '지금 시장 동향이 이렇게 이렇게 전개되고 있다. 우리는 이 부분에서 이런 것을 보았고, 미래에는 이런 수요가 발생하여 우리가 그 모멘텀을 가질 수 있다'라는 미래지향형 사업이 거의 없어졌다는 것이다. 대부분은 '지금 사람들이 이런 문제를 겪어서 우리가 이렇게 해결해줬다' 방식이다. 듣기에도 이 부분이 더 매력적으로 들리긴 한다.사업계획서도 사업분야별로 개성이 없고 템플릿에 맞게 만들어져서 다 똑같다. 취준생들 이력서 똑같다고 뭐라 할 처지가 아니다.스타트업 업계의 사람들이 창의성이 없어지거나 모험심이 없어진 게 아니라, 초기 기업가들이 배우고 학습하는 채널이 VC가 되면서 벤처정신이 이제는 금융권의 확률 중심 사고로 돌아가고 있기 때문이라고 본다.그래서 요즘 새로 시작하는 분들 만나서 서비스를 들어보면 '아니! 헉 이런 생각을?'하는 게 거의 없다. 'XX의 유튜브', 'XX의 우버', 'XX의 에어비앤비' 어떻게든 이런 식으로 사업을 포장하려 한다. 사람들이 이해하기 쉽게 그렇게 한다는데, 고객이 VC가 아닌 이상, 일반인 들 찾아가서 '우리 서비스는 우버랑 비슷한데, 휴대폰이나 태블릿 PC를 쉐어링 할 수 있는 디지털 장비의 우버야'라고 하면 "우버가 뭐야?"라고 말한다.투자자 하나 설득하지 못하면 고객은 어떻게 설득하냐는 사람들도 있는데, 내 경험상 투자자 설득하는 거랑 고객 설득하는 건 전혀 달랐다. 우리는 35000명의 고객을 논리와 당위성으로 끌어들이지 않았다. 우리 충성고객 중 한 명은 이런 말을 했다."비캔버스 고객센터에 뭐 기능 제안 같은 거 하면 1주일 안에 바로 만들어주는 게 인상적이어서 이 서비스에 빠져들었다"고객이 보는 시각은 이런 것이다. 별것 아니어 보이는 당연해 보이는 다양한 요소들에 의해 고객은 감동하고 서비스에 빠져든다.물론 투자 굉장히 중요하다. 우리도 운 좋게 작년에 투자를 받긴 했지만, 올해 목숨이 간당간당하다.어차피 투자를 못 받으면 자생해야 하고 자생도 안되면 회사 문 닫는 게 기본 시나리오 아닌가?맞다. 그래서 창업가들은 이런 분야에 대해 말하는 것을 굉장히 두려워한다. 투자자들에게 밉보여야 좋을 게 없기 때문에 아무도 입 밖으로 꺼내지는 못하는 진실을 내가 꺼내본다.우리 회사의 IR을 위해서도 이런 글은 안 쓰는 편이 낫다. 그런데 굳이 쓰는 이유는 아무도 이런 글을 안 쓰기 때문이다. 투자자들은 멘토링 하고, 사업 수립 전략에 대해 글을 쓰고 강의를 하고, 창업자들은 골방에서 개발하는 것이 '본질'이라 한다. 투자를 받으러 사업적으로 미팅을 가면 선생님에게 혼나는 학생처럼 혼줄이 난다. 그중 특출한 학생들은 인기가 몰려 선생님들이 모두 우러러보고 배우려 한다. 게다가 나처럼 어린 나이에 창업을 한 창업가들은 더 한 취급을 받는다. 전에 오픈 IR을 한 적이 있는데 한 투자자가 이렇게 적었다."아직은 어린 나이라 패기가 넘치니 인생의 쓴 맛을 더 봐야 함"장렬하게 싸우다가 전사하더라도 비겁하게는 살면 안 된다고 생각한다. 창업가들의 사업이 힘들어 보이거나 이해하기 힘들다면 예의 있게 우리의 투자/제휴 제안을 거절해주는 것이 바람직하다고 본다. 대부분 사람들은 그렇게 부드럽게 거절해도 집에 가서 수없이 고민하고 개선하기 위해 애쓴다. 창업가들이 인생 바쳐가며 수년간 연구하고 고객과 부딪치며 고민하고 발견해온 것들을 송두리째 무시하고 인격적으로 불편하게 만드는 것은 예의도 사업도 벤처정신도 아닌 것 같다.간혹 그런 사람들을 만나면 작년에는 싸웠는데, 그러다가 인간관계를 하도 그르치다 보니 올해에는 그냥 웃거나 우울한 표정을 짓고 불쌍한 척하며 관계 유지를 하려고 했다. 그런데, 이것도 아닌 것 같다. 너무 어렵다. 그냥 서로 불편하게 안 만들고 정중하게 대하는 것이 최선인 것 같다.벤처 생태계의 발전을 위해 많은 사람들이 이 글에 대해 생각을 한 번 해줬으면 한다.
조회수 860

[인터뷰] 사람에게 집중하는 미미박스의 핵심가치를 실현하는 디자이너 LIMA를 만나다

안녕하세요. 컬처팀의 아바입니다. 미미박스는 네 가지 핵심가치를 가지고 있는데요!바로 Focus on people, Lead self-motivated action, Never stop changing, Deliver trust입니다.사람에게 집중하고,자기주도적으로 행동하고변화를 주도하고,존중을 실천하자는 가치를 실현시키자는 것이죠!동료들의 피드백을 바탕으로 이러한 핵심가치를 가장 잘 실행하고 있는 MVP(MEMEBOX VALUE-CREATING PLAYER)가 선발되었는데요! 오늘부터 MVP 미미박서들의 스토리를 여러분께 공유해드리고자 합니다.그럼 첫 번째 미미박서인 LIMA의 이야기를 들어볼까요Q. 처음에 미미박스에서 일하게 된 특별한 계기가 있었는지 궁금해요. A. 저는 2013년에 지인 소개로 미미박스에 조인하게 됐어요. 그때는 굉장히 조그만 사무실에서 일했었는데 겉이 화려하지 않은 게 오히려 저에게는 매력적이었어요. 그 조그만 공간에서 디자인하는 사람도, 영업하는 사람도 다 같이 으쌰 으쌰 박스 싸면서 함께 성장하려고 했던 게 여전히 기억에 남아요.리마가 남겨놓은 그 시절의 미미박스! Q. 지금과는 다른 분위기의 즐거움에서 일했다고 저도 많이 전해 들었어요. 그렇다면 리마는 미미박스에서 어떤 업무를 주로 하고 있나요?A. 저는 미미박스 플랫폼에 올라가는 딜, 배너, 기획전, 상품 페이지 등 디자인 작업 전반을 진행하고 있어요. 미미박스가 워낙 성장 가도에 있고 판매 상품 수도 증가하다 보니까 업무가 녹록지만은 않네요. (하하)  리마는 여러분들이 보는 위와 같은 상품 페이지를 디자인합니다.Q. 이번 FOCUS ON PEOPLE 부문 시상에서 미미박스 MVP가 되셨는데, 리마가 생각하는 FOCUS ON PEOPLE은 무엇일까요?A. FOCUS ON PEOPLE은 ‘고객의 입장에서 생각하는 것’ 인 것 같아요. 저는 디자인할 때 항상 ‘나는 소비자다’ 라는 마인드 세팅을 하고 내가 살 상품의 상품 페이지를 내가 만들고 있다고 생각해요. 그러면 내가 더 궁금해할 정보는 없는지, 사진은 너무 작지 않은지 등을 자연스럽게 고민할 수 있어요.  Q. 디자이너의 예술적 감각과 소비자의 눈높이 사이에서 균형을 맞추는 건 쉽지 않은 일일 것 같은데요!A. 그렇죠~ 아무래도 디자이너이다 보니 디자인적 감각과 고객의 마음 사이에서 밸런스를 맞추는 게 어려운 것 같아요. 디자인적으로는 더 아티스틱하고 싶은데 소비자 관점에서 정보를 많이 포함하려면 복잡해질 수 있거든요. 그 사이에서 균형을 맞추는 것이 정말 중요하죠.  Q. 고객에게 더 집중하셨던 기억나는 사례가 있을까요?A. 제가 토너 딜 디자인을 요청받았던 적이 있어요. 그런데 저는 기초화장품 살 때 용량이 되게 중요한 포인트거든요. 그래서 검색 채널에서 다양한 토너들의 용량과 가격을 알아보고 이게 충분히 매력적인 부분일 때 그런 부분을 추가해서 디자인했어요. MD의 요청이 없더라도 딜 콘텐츠를 Develop 시키는 것도 제가 디자이너로서 고객에게 집중할 수 있는 방법인 것 같아요.Q. 리마가 FOCUS ON PEOPLE의 MVP로 선정되신 이유를 너무 잘 알겠네요. 우리 미미박서 분들이 FOCUS ON PEOPLE 할 수 있는 TIP 이 있을까요?A. ‘우리 고객에게 실망을 주지 않겠다’라는 생각을 항상 하시면 좋을 것 같아요. 직접적으로 고객과 연결되어 있지 않더라도 내가 하는 디자인, 내가 하는 모든 업무가 결국 고객만족으로 이어지거든요. 이런 생각을 의식적으로라도 계속하면 그만큼의 결과가 뒤따르는 것 같아요.리마는 예비엄마! 순산을 위해 회사에서도 동료들도 배려해주고 있어요!Q. 미미박스에서 앞으로 이루고 싶은 목표가 있나요?A. 순산이요! (하하하하하하) 고객의 입장에서 생각하는 방식을 팀원이나 협업 부서원들과 함께 계속 공유하고 이야기하고 싶어요. 우리 모두가 함께 FOCUS ON PEOPLE 한다면 업무 효율이 높아질 것 같아요. 그럼 미미박스도 더욱 성장하고 저도 순산 목표를 달성할 수 있을 거라고 생각해요. 
조회수 834

에이스프로젝트 우황청심책

안녕하세요. 에이스프로젝트의 채용담당자 K입니다. (꾸벅)오늘은 에이스프로젝트 면접에서 꼭 만나게 되는 ‘우황청심책’에 대해 이야기해보려고 해요.이것이 말로만 듣던 에이스프로젝트 '우황청심책'!서류 합격! 즐거움도 잠시 면접 준비로 정신없던 날들이 지나고 드디어 면접일이 다가왔어요.오는데 고생한 지원자를 위한 물은 센스!면접을 보러 오는 지원자는 친절한 채용 담당자의 안내로 면접실에 들어선 후 우황청심책을 건네받습니다.지원자는 우황청심책을 읽으며 면접 전에 릴랙스하는 시간을 갖게 돼요.면접은 누구에게나 떨리고 긴장되는 시간이죠, 긴장한 탓에 본인의 모습을 제대로 보여주지 못하고 돌아가는 지원자도 정말 많습니다. 지원자에게도, 회사에게도 면접은 중요한 기회인 만큼지원자가 긴장을 풀고 최대한 본인의 역량을 잘 이야기할 수 있는 시간을 만들고 싶었어요.'면접 시작 전에 뭔가 읽으면서 긴장을 풀면 좋지 않을까?'라는 생각에서우황청심책이 탄생하게 되었죠!(이름에서도 느껴지죠? 제발 긴장을 풀었으면 좋겠다ㅠㅠ)우황청심책은 에이스프로젝트에 대해 알 수 있는 이야기들로 채워져있는 '스크랩북'이라고 생각하시면 돼요.첫 장을 열면, 지원자의 긴장을 풀어주기 위한 채용담당자의 따뜻한 편지가 지원자를 기다리고 있어요. 지원자가 가장 궁금해하는 채용 프로세스에 대한 내용도 깔끔하게 정리해두었죠.채용 담당자의 마음을 듬뿍 담아서 편지를 썼어요 (힘내세요!)지원 분야가 모두 다르니, 우황청심책도 '개발/그래픽/기획/프론트 편'으로 나눠져 있어요!본인이 지원한 직무를 맡고 있는 에이스人의 이야기도 확인해 볼 수 있답니다. '어서 와 에이스프로젝트는 처음이지?'예를 들면, 우황청심책 ‘개발 편’에는 서버 개발, 클라이언트 개발, R&D 개발에 대한 직무 인터뷰 내용이 있어요.직무 인터뷰뿐만 아니라, 면접 전에 우리 회사의 조직문화나 성훈님(대표님)의 생각에 대해 알 수 있는 회사소개와 성훈님의 인터뷰도 수록해두었죠.면접은 지원자에게도 이 회사에 대해 알아볼 수 있는 시간이니까요!에이스프로젝트의 조직문화를 간접적으로 느낄 수 있어요!성훈님(대표님) 생각 미리 보기 +_+사실 지원자의 긴장감을 우황청심책이 모두 없애줄 순 없겠지만,  심리적으로 회사와 가까워진 상태로 면접을 볼 수 있다는 점은 긍정적이지 않을까요?우황청심책이 여러분의 기량을 100% 발휘하는데 조금이나마 도움이 되었으면 좋겠어요!
조회수 1832

입사 후 4개월, 나는 그동안 무엇을 했을까

8월 18일에 입사하여 글을 쓰는 오늘까지 4개월이란 시간이 흘렀다. 트레바리는 4개월을 한 시즌으로 묶어 운영하는 멤버십 서비스이기 때문에 트레바리에서 4개월을 일했다는 건 한 시즌에 필요한 모든 시기를 거쳤다는 의미이다. 4개월을 함께 해야지만 비로소 트레바리를 한 번 했다고 말할 수 있게 된다. 나는 이제서야 트레바리에서 한 번 일했다.트레바리에서의 한 번을 보내며 나는 그동안 무엇을 했는지 정리해보려고 한다. 할 말이 많다 보니 이번 글에서는 기능적으로 무엇을 했는지만 이야기할 예정이다. 어떻게 일했는지, 잘했던 점은 무엇이었는지, 아쉬웠던 점은 얼마나 많았는지에 대한 건 아쉽지만 다음 글에 담기로 했다. 4개월 동안 내가 진행한 일 중 큰 단위의 작업 위주로 살펴보고자 한다.4개월 동안 내가 한 일은 크게 두 가지다. 첫 번째는 기존의 웹 서비스를 개선하는 일. 두 번째는 노가다로 했던 일들에 IT를 끼얹는 일. 두 가지 일에 대한 요구 사항들은 모두 추상적인 문장으로 주어졌고, 나의 역할은 그 추상적인 요구들을 정리하여 실질적인 기능으로 정의하고 구현하는 것이었다. 그동안 어떤 요구 사항들이 있었고 그에 대해 어떤 결과물을 내었는지 정리해보았다.1. 독후감을 활성화되게 만들어주세요.입사 후 최우선으로 개선이 요구됐던 부분은 독후감이었다. 독후감은 트레바리 서비스가 독특하다는 평가를 듣는 이유 중 하나이다. 아무리 돈을 내고 온 멤버일지라도 우리가 내어준 400자의 독후감이라는 숙제를 해오지 않으면 독서 모임에 참가하지 못한다. 우리 크루들은 독후감을 통해 자신의 생각을 한번 정리하고 참가한 독서 모임이 아무런 준비 없이 맞닥뜨리는 독서 모임보다 더 풍성해짐을 안다. 그렇기에 멤버들이 트레바리 홈페이지에서 더 열심히 독후감을 쓰고, 더 많이 다른 사람들의 독후감을 읽고, 더 다양하게 대화할 수 있도록 만들어야 했다.디자인 개선[이전 디자인]일을 시작하자마자 가장 먼저 갈아치우기 시작한 건 디자인이었다. 페이지에 보이는 정보들의 가독성이 나빴다. 독후감 정보와 관련 없는 이미지 배경을 가지고 있었고, 모바일에서는 본문을 포함하여 모든 요소들의 배열이 일정하지 않았다. 가장 문제였던 점은 좋아요 기능이 있음에도 불구하고 유저들이 좋아요 버튼이 있는지를 몰라 활성화가 되지 않는 것이었다.(대표님 얼굴과 우왕이라는 글자가 떡하니 자리 잡은 곳이 좋아요 버튼이다.) 답댓글 없이 한 줄로만 나열된 댓글도 불편했다.[변경한 디자인]전반적으로 컨텐츠가 더 잘 보일 수 있도록 변경했다. 불필요한 배경 이미지를 빼고 책 정보를 추가했다. 좋아요 버튼도 보다 쉽게 인지할 수 있도록 보편적인 모양의 하트로 바꾸었다. 한 줄로만 나왔던 댓글에는 대화하는 듯한 느낌의 UI로 변경하고 답댓글 기능을 추가했다. 특히 모바일에서 더 편하게 쓸 수 있도록 각 요소들을 일정하게 배열했고, 이미지로는 보이지 않겠지만 독후감을 읽고 목록으로 다시 갈 때마다 다른 모임 정보가 뜨는 이상한 시나리오도 개선했다.넛지 만들기더 나은 디자인만으로는 부족했다. 멤버들이 실제로 더 많이 좋아요를 누르고 댓글을 달고 싶게 만들어주는 넛지가 필요했다. 좋아요 수에 따라 재밌는 워딩이 나오고, 댓글 입력 창의 워딩이 항상 다르고 등의 디테일한 요소들을 살렸다. 페이스북 공유하기 기능도 추가했으며 우리 모임에 놀러 오는 멤버들을 보여주는 UI도 추가하는 등의 작업을 진행했다. 하지만 결정적인 한 방이 필요했고 그 한 방은 이달의 독후감 기능이었다.이달의 독후감 선정 기능홈페이지 밖의 운영에서 돌아가던 이달의 독후감이라는 시스템이 있었다. 매 모임마다 가장 좋았던 독후감을 선정하는 것이었는데 잘 알지 못하는 멤버들이 많아 좋아요 수 자체가 적었고, 선정된 독후감을 찾아보기 어려워 활성화가 되지 못했었다. 그래서 이달의 독후감 시스템을 홈페이지에 어워드 형태로 옮겨오면 동기부여와 동시에 별도의 안내 없이도 이달의 독후감 시스템을 학습시킬 수 있겠다고 생각했다.그래서 결과는?결과는 데이터로 나타났다. 디자인과 기능 개선 후 독후감 한 개 당 평균 좋아요/댓글 수가 대략 150% 증가했다. 크루들이 매번 이달의 독후감을 선정하고 하이라이트 구문을 뽑는 오퍼레이션도 줄일 수 있었다. 변경 후 독후감 쓰는 것이 더 즐거워졌다는 멤버 피드백도 종종 들을 수 있었다.2. 멤버십 신청 페이지를 개선해주세요.멤버십 신청 페이지는 트레바리 멤버가 아닌 유저들이 가장 많이 보게 되는 페이지다. 트레바리가 어떤 곳인지 어필하고 결제까지 진행하게 하는 가장 중요한 역할을 하고 있다. 흔히들 말하는 판매 페이지로 트레바리에서 가장 중요한 서비스인 독서 모임을 파는 곳이다. 그 중요성에 비해 디자인과 기능이 모두 엄청나게 부실했고 개선해야 했다.디자인 개선[이전 디자인]대체 트레바리가 어떤 곳인지 알 수 있는 부분이 하나도 없었다. 독서 모임에 대한 설명마저 줄글이 전부였다. 내가 트레바리 독서 모임에 가면 어떤 분위기를 즐길 수 있고 만나는 사람들은 어떨지 상상하기 어려웠다. 모바일에서는 특히 불편했고 필수적인 정보들만 보이는 곳에 불과했다.[변경한 디자인]각 독서 모임에 대한 소개가 풍성하지만 편하도록 변경했다. 이전과 다르게 사진을 많이 활용하여 트레바리 독서 모임이 어떤 분위기인지 보여주고 싶었다. 설명 글도 더 잘 읽힐 수 있도록 배치를 중점적으로 신경 썼고 포인트 컬러를 틈틈이 사용했다. 같은 모임이지만 다양한 시간과 장소가 있는 독서 모임인 경우에는 한 페이지에서 한 번에 볼 수 있도록 구성했다. 모바일 접속자가 압도적으로 많은 만큼 모바일 UI에 많은 시간을 들였다.결제 기능 추가멤버십 신청 페이지에서 가장 큰 문제는 결제였다. 실시간 결제가 아닌 계좌 이체로만 가능하게 되어있다 보니 엄청나게 불편했다. 유저들도 수동으로 이체를 해야 했고, 담당하는 대표님도 24시간 잠도 못자며 휴대폰을 붙잡고 있다가 계좌 이체 알림이 올때마다 등록 처리를 해주어야 했다.(매 시즌 대표님 혼자 몇천 명의 계좌 이체를 확인하고 등록해주셨다. 그래서 멤버십 신청 기간 때에는 제대로 자보신 적이 없다고...)그런데 트레바리는 작은 회사에다 무형의 서비스를 팔고 있다 보니 PG사를 통한 결제를 붙이는 게 어려웠다. PG를 제외한 편하게 결제할 방법을 찾다가 토스 결제를 찾아보게 되었다. 찾자마자 바로 미팅을 진행했고 토스 측에서도 트레바리의 가치를 잘 봐주셔서 미팅부터 결제 연동까지 빠르게 진행하여 구현했다.사랑해요 토스그래서 결과는?막상 개선하여 배포하니 예상보다 저조한 유저 반응이 나타났다. 물론 지난 시즌보다는 훨씬 더 많은 유저분들이 등록하시기는 하였으나 기대했던 목표치에는 못 미쳤다. 디자인이 좋아지고 이용하기 편해지면 당연히 등록 효율이 몇 배로 높아질 거라고 생각했으나 생각처럼 되지 않았다. 신청 기간 내내 저조한 이유에 대한 가설을 세우고, 변경하고, 데이터 보기를 반복했다. 그 과정에서 몇몇 유저분들과 인터뷰를 진행했고 막판에 등록에 영향을 미치는 것은 의외로 홈페이지 사용성이 아닌 다른 곳에 있음을 발견했다. 아쉽게도 늦게 원인을 찾아 더 많은 것을 해보기 전에 신청 기간이 끝나버렸지만, 다음 시즌에는 이번 시즌보다 뾰족하고 탁월하게 개선할 수 있겠다고 생각했다. 영훈님과 함께 공부도 시작해보기로 했다.결제 부분에서는 자세한 데이터를 공개할 수는 없지만 많은 유저들이 토스를 통해 결제를 진행했다. 원래도 트레바리는 N빵 할 일이 많아 토스 송금을 이용하는 유저들이 많았지만 이번 결제 연동을 덕분에 새로 쓰게 된 분도 많아진 것 같았다. 핀테크에 대한 막연한 불안감 때문에 쓰지 않았다는 유저들도 있었지만 막상 써보니 엄청나게 편해서 놀랐다는 피드백도 많이 받았다. 아마도 트레바리에서는 앞으로 계속 토스 송금/결제를 활발하게 사용할 것 같다.3. 트레바리가 어떤 곳인지 보여줍시다.위에서 말한 등록에 영향을 미치는 것은 서비스에 대한 설득이었다. 그동안 트레바리는 지인의 소개로 오는 유저들이 많았고, 기사를 보고 오는 유저들이 많았고, 소문을 듣고 오는 유저들이 많았다. 그래서 따로 트레바리가 어떤 곳인지 잘 설명할 필요성이 적었던 것 같다. 이제는 유저들이 점점 많아지면서 트레바리가 어떤 곳인지 적극적으로 보여줄 필요가 있었고 방치되어 있던 랜딩페이지를 끄집어냈다.[이전 랜딩페이지]이곳만 봐서는 트레바리가 어떤 곳인지 알 수 없었다. 트레바리가 얼마나 매력적인지 어필이 되지 않았고 어떤 활동을 할 수 있는지도 알기 어려웠다.[변경한 랜딩페이지]트레바리가 지향하는 가치들을 더 많이 설명했다. 중간중간 트레바리 사용설명서 영상을 볼 수 있는 곳을 추가했고 실제 멤버들의 후기도 담았다. 트레바리는 독서 모임을 제공하는 서비스이므로 대표적인 독서 모임이 무엇이 있는지도 보여주고 싶었다. 각종 미디어에서 이야기하는 트레바리와 멤버들만을 위한 혜택도 정리해두었다.그래서 결과는?급하게 만드느라 트레바리의 매력을 아직 반의반도 못담았다고 생각한다. 랜딩페이지만 봐도 트레바리가 어떤 곳이고 트레바리를 통해 당신이 얼마나 더 멋있어질 수 있는지를 보여주고 싶다. 랜딩페이지는 꾸준히 만지고 다듬어야 할 과제로 남겨두었다.4. 손에 잡히는 무언가를 주기(일명 손잡무)한 시즌을 끝낸 멤버들에게 각자가 한 시즌 동안 무엇을 해왔는지 쥐여주고 싶었다. 그래서 시즌 말 약 1700명의 멤버들 모두에게 개개인이 이뤄온 활동 데이터를 이미지로 재밌게 엮어 나눠주었다. 기발한 워딩과 이미지는 이 방면에 재능이 있는 세희님과 지현님이 함께해주셨다.[1705 시즌 손잡무][1709 시즌 손잡무]1700명 모두에게 개인화된 이미지를 노가다로 만들어주는 것은 불가능했다. 자동화를 하기 위해서 SQL 쿼리를 통해 필요한 로우 데이터를 추출하고, 스케치라는 디자인 툴을 활용해 이미지 생성을 자동화했다. 덕분에 모든 멤버들의 이미지를 한땀한땀 만드는 노가다를 피하면서도 개인화된 컨텐츠를 제작할 수 있었다. 이 방법은 이다윗님의 코드로 100명 이상의 네임택 한 번에 디자인하기 글을 보고 영감을 받아 가능했다.그래서 결과는?성공적이었다. 인스타그램에 #트레바리를 검색하면 손잡무를 나눠준 시점에 많은 멤버분들이 공유해주신걸 볼 수 있다.(개근상 받으신 분들이 제일 많이 공유해주셨다.) 이미지를 공유해주시면서 4개월 동안 얼마나 즐거웠고 많이 배웠는지에 대한 후기도 소상히 적혀있는 경우도 많아 더욱 뿌듯한 결과물이었다.5. 그 외 각종 버그/개선 요구 사항 해결도 해주세요.각종 UI 및 사용성 개선여러 페이지들의 UI를 개선하고 기능을 개선하여 배포하였다. 자잘한 기능 추가부터 페이지 통째로 갈아엎기까지 손을 댈 수 있는 리소스만큼 건들여보고 개선했다. 이 과정에서는 우선순위를 정하는 일이 중요했는데 우선순위에 대한 이야기는 후에 다시 해볼 예정이다.각종 버그/요구 사항 해결 + 그에 따른 CS내가 만든 것도 많았지만(…) 그거말고도 도대체 개발자가 없을땐 홈페이지가 어떻게 굴러갔지 싶을 정도로 버그가 많았다. 버그도 많고 요구되는 개선 사항도 많았다. 줄어들고는 있지만 아직까지도 버그 및 요구 사항에 응대하는 시간이 하루에 한 시간씩은 꼬박꼬박 들고 있다. 더 많이 줄여나가는 것을 목표로 하고 있다.자동화독서 모임을 이끄는 크루들이 노가다를 하느라 고생하는 시간이 많다. 위에서 이야기 했던 계좌 이체 확인이 가장 큰 사례이다. 그 외에도 개설되는 클럽 데이터 입력을 어드민에서 며칠동안 노가다로 진행해야하는 등의 낭비가 많았다. 이런 부분에서 IT를 끼얹어 공수를 덜 들이고 빠르게 끝낼 수 있도록 엑셀 import 등의 기능을 구현했다.트레바리의 한 번을 끝마치며 나는 그동안 무엇을 했는지 정리해보았다. 쓰다보니 만족스러운 것보다 아쉬운 것들이 눈에 더 많이 들어온다. 무엇이 아쉬웠나 하면 할말이 너무나도 많아 다른 글에 써보기로 하고 이번 글은 기능적인 이야기로만 마무리했다.돌이켜 생각해보면 트레바리에서 쓰이는 기술 스택인 루비도 레일스도, 서버 인프라도 하나 모르는 나를 믿고 이 모든걸 배우고 익힐때까지 기다려준 크루들이 새삼 대단하다고 느낀다. 그 과정에서 실수로 인한 버그도 엄청 많았고 그 버그 때문에 불필요하게 운영 코스트가 늘어났을 때도 있었지만 나무란 적 한 번 없이 격려와 함께 기다려주고 믿어주었다. 그래서 더 열심히 달릴 수 있었던 것 같다.아쉬움과 감사함 때문에라도 다음 4개월에는 일을 더 '잘'하는 사람이 되어야겠다고 다짐했다. 앞으로도 계속 성공하고 실패하고, 배우고 성장한 일들을 꾸준히 기록해나가며 일을 더 잘하는 사람이 되고 싶다. 다음 4개월은 지난 4개월보다 보다 더 실질적이고 큰 변화들을 만들 수 있는 사람이 되어야 겠다. 걱정반 기대반이지만 설레는 마음으로 새로운 시즌을 맞이하며 글을 끝맺으려 한다.어떻게 하면 더 잘할지 고뇌하는 모습의 크루들#트레바리 #기업문화 #조직문화 #CTO #스타트업CTO #CTO의일상 #인사이트
조회수 2378

JANDI 검색엔진 도입기

이번 포스트에서는 JANDI가 검색엔진을 도입하게 된 배경과 어떤 작업을 했는지 공유하려고 합니다검색엔진 도입 배경JANDI는 사용자가 입력한 메시지를 검색하고 사용자가 올린 파일의 파일명/파일 타입을 검색하는 메시지/파일 검색 기능을 제공하고 있습니다. 데이터 저장소로 MongoDB를 사용하고 있는데 검색되는 필드에 인덱스를 걸고 정규 표현식을 이용하여 DB Like 검색(“DB는 검색을 좋아한다”아니에요;;)을 하고 있습니다.초기에는 데이터가 아담했는데, 서비스가 커감에 따라 사용자 증가하면서 생성되는 데이터도 많아졌습니다. 올 초에 데이터가 많아지면서 검색이 DB에 부하를 주고, JANDI 서비스에도 영향을 주게 되었습니다. 그래서 JANDI 서비스용 MongoDB와 검색 전용 MongoDB를 분리했는데 이는 임시방편이었고 언젠가는 꼭 검색엔진을 도입하자며 마무리를 지었습니다.시간은 흘러 흘러 4월이 되었습니다. 당시 메시지 증가량을 봤을 때 올해 안에 검색엔진을 사용하지 않으면 서비스에 문제가 될 거라고 판단이 되어 도입을 진행하게 되었습니다.검색엔진 도입의 목표는 다음과 같았습니다.현재 DB Like 검색과 비슷한 검색 품질이어도 좋다. (일정때문에)검색엔진 도입을 통해 검색이 JANDI 서비스에 영향을 주지 않도록 한다.색인을 위해서 주기적으로 JANDI의 MongoDB 데이터를 가져 와야 했지만, 이 작업이 JANDI 서비스에 큰 부하를 주지 않을 거라고 생각했습니다.검색엔진 후보로는 Solr, ElasticSearch, CloudSearch, ElasticSearch Service 가 있었는데 Solr를 선택했습니다.왜냐하면제가 경험한 검색엔진이 Solr 였습니다. 더군다나 2010년 초에 접했던 Solr 비해 많이 발전한 것 같아 개발자로서의 열정과 도전 욕구가 샘솟았습니다. SolrCloud pdf, WhyNoWarAWS에서 제공하는 검색 서비스는 많은 부분을 관리해준다는 면에서 솔깃했지만, Custom Analyzer는 적용할 수 없어서 선택하지 않았습니다.ElasticSearch에 크게 흔들렸지만 경험이없다 보니 공부하면서 프로젝트를 진행한다는 부담감이 커서 다음을 기약했습니다.작업 내용1. MongoImporter, Sharding. MongoImporter 수정현재 JANDI는 MongoDB를 데이터 저장소로 사용하고 있습니다. MongoDB의 데이터를 색인하기 위해 데이터를 검색엔진으로 가져와야 하는데 Solr에서는 DataImportHandler 기능을 제공하고 있습니다. 기본 DataImportHandler로 RDB 데이터는 가져올 수 있지만 이 외 MongoDB나 Cassandra 같은 NoSQL의 데이터를 가져오기 위해서는 따로 구현이 필요합니다. 구글신에게 물어봐서 SolrMongoImporter 프로젝트를 찾았는데 문제가 있었습니다. mongo-java-driver 버전이 낮아서(2.11.1) 현재 JANDI에서 서비스 되고 있는 MongoDB(3.0.x)의 데이터를 가져올 수 없었습니다.url: Reference compatibility MongoDB Java2.11.1에서 3.2.2로 버전을 올리고 변경된 api를 적용하는 작업, 빌드 툴을 ant에서 maven으로 변경하는 작업을 하였습니다. 마음의 여유가 된다면 P/R을 할 계획입니다.여담으로 DataImportHandler 작업과 함께 검색 schema 정하는 작업을 했는데 sub-document 형식이 필요하게 되었습니다. Solr 5.3부터 nested object를 지원한다는 article을 보았는데, nested object 지원 얘기를 보니 Solr도 text search 뿐 아니라 log analysis 기능에 관심을 가지는건 아닐까 조심스레 생각해봤습니다. (역시나… 이미 banana, silk 같은 프로젝트가 있습니다. Large Scale Log Analytics with Solr 에 관련된 이야기를 합니다.). Sharding. 그리고 Document Routing대량의 데이터를 처리하기 위해 한 개 이상의 node로 구성된 데이터 베이스에 문서를 나누어 저장하는 것을 sharding이라고 합니다. SolrCloud는 shard 생성/삭제/분리할 수 있는 API가 있고, 문서를 어떻게 나눌지 정할 수 있습니다. 어떻게 나눌지는 shard 생성 시 router.name queryString에 개발한 router 이름을 적어주면 됩니다. 그렇지않으면 Solr에서 murmur Hash 기반으로 문서를 나누는 compositeId router를 사용합니다. JANDI의 검색 기능은 Team 단위로 이루어지기 때문에 TeamId를 기준으로 문서를 나누기로 하고, compositeId Router를 사용했습니다. 실제 서비스의 문서 데이터를 색인 돌려서 각 node에 저장되는 문서 개수나 메모리/디스크 사용량을 확인했는데 다행히도 큰 차이가 나지 않았습니다.하나의 문서는 TeamId와 MessageId를 조합한 “TeamId + ! + MessageId” 값을 특정 field에 저장하고 해당 필드를 uniqueKey 지정했습니다. 간단한 수정으로 문서 분배가 되는점이 좋았고, 더 좋았던건 검색시 _route_ 를 이용해서 실제 문서가 존재하는 node에서만 검색을 한다는 점이 었습니다. 4년 전 제가 마지막으로 Solr를 사용했을 때는 사용자가 직접 shards queryString에 검색할 node를 넣어주어야 했습니다..../select?q=\*:\*&shards=localhost:8983/solr/core1,localhost:8984/solr/core1SolrCloud RoutingSolrCloud Routing2Multilevel CompositeId2. analyzer, queryParser. analyzerSolr에 기본으로 있는 text_cjk analyzer를 사용하였습니다. <!-- normalize width before bigram, as e.g. half-width dakuten combine --> <!-- for any non-CJK --> text_cjk는 영어/숫자는 공백/특수기호 단위로 분리해주고 cjk는 bigram으로 분리해주는 analyzer 입니다. analyzer는 이슈 없이 완성될 거라 생각했지만 오산이었습니다. 텍스트가 들어오면 token을 만들어주는 StandardTokenizerFactory 에서 cjk와 영어/숫자가 붙어있을 때는 분리하지 못해 원하는 결과가 나오지 않았습니다. 또한 특수기호중에 ‘.’(dot), ‘_‘(underscore)가 있을 때에도 분리하지 못했습니다.nametextInputTopic검색개선_AB1021_AB제시CD.pdfStandardTokenizerFactoryTopic검색개선_AB1021_AB제시CD.pdfCJKWidthFilterFactoryTopic검색개선_AB1021_AB제시CD.pdfLowerCaseFilterFactorytopic검색개선_ab1021_ab제시cd.pdfCJKBigramFilterFactorytopic검색개선_ab1021_ab제시cd.pdf원하는 결과topic 검색개선 ab 1021 ab 제시 cd pdf그래서 색인/검색 전에 붙어있는 cjk와 영어/숫자사이에 공백을 넣어주고 ‘.’와 ‘_‘를 공백으로 치환해주는 작업을 하였습니다. 색인은 Transform에서 처리하고 검색은 다음에 알아볼 QParserPlugin에서 처리했습니다.nametextInputTopic검색개선_AB1021_AB제시CD.pdfTransform 단계Topic 검색개선 AB 1021 AB 제시 CD pdfStandardTokenizerFactoryTopic 검색개선 AB 1021 AB 제시 CD pdfCJKWidthFilterFactoryTopic 검색개선 AB 1021 AB 제시 CD pdfLowerCaseFilterFactorytopic 검색개선 ab 1021 ab 제시 cd pdfCJKBigramFilterFactorytopic 검색개선 ab 1021 ab 제시 cd pdf※ 추가 : 검색 결과를 보여줄때 어떤 키워드가 매칭되었는지 Highlight 해야했는데, 색인하기 전에 원본을 수정을 해서 Solr에서 제공하는 Highlight를 사용하지 못하게 됐습니다. 눈 앞의 문제만 바라보고 해결하기 급급했던 저를 다시금 반성하게 되었습니다.. queryParser앞에서도 언급하였지만, 색인뿐만 아니라 검색할 때도 검색어가 입력되면 검색하기 전에 붙어있는 cjk와 영어/숫자를 분리하고 ‘.’, ‘_‘를 공백으로 치환해주는 작업이 필요합니다. Solr에서 기본으로 사용하는 LuceneQueryParserPlugin 을 수정하였습니다.@Override public Query parse() throws SyntaxError { // 수정한 코드 String qstr = splitType(getString()); if (qstr == null || qstr.length() == 0) return null; String defaultField = getParam(CommonParams.DF); if (defaultField == null) { defaultField = getReq().getSchema().getDefaultSearchFieldName(); } lparser = new SolrQueryParser(this, defaultField); lparser.setDefaultOperator (QueryParsing.getQueryParserDefaultOperator(getReq().getSchema(), getParam(QueryParsing.OP))); return lparser.parse(qstr); } QParserPlugin3. DataImportHandler manageMongoImporter에서도 얘기했지만 Solr에서는 DB 데이터를 가져오는 DataImportHandler 기능을 제공 하고 있습니다. DataImportHandler Commands를 보면 총 5개의 명령을 제공하고 있는데, 그중 색인을 실행하는 명령은 full-import와 delta-import입니다. full-import 명령은 DB의 모든 데이터를 색인 하는 것을 말합니다. 색인 시작할 때의 시간을 conf/dataimport.properties에 저장하고 이때 저장한 시간은 delta-import 할때 사용됩니다. 전체 색인한다고 말합니다. delta-import 명령은 특정 시간 이후로 생성/삭제된 데이터를 색인 하는 것을 말합니다. 특정 시간이란 full-import 시작한 시간, delta-import가 최근 종료한 시간을 말합니다. full-import와는 다르게 delta-import가 종료된 시간을 conf/dataimport.properties에 저장합니다. 증분 색인 혹은 동적 색인이라고 하는데 여기서는 증분 색인이라고 얘기하겠습니다. 두 명령을 이용하여 JANDI의 메시지/파일을 색인 하기 위한 삽질 경험을 적었습니다.. 첫 번째 삽질full-import는 현재 active인 데이터를 가져올 수 있도록 query attribute에 mongo query를 작성하고, delta-import 는 특정 시간 이후에 생성된 데이터를 가져올 수 있도록 deltaQuery attribute에 mongo query를 작성합니다. 또한 deltaQuery로 가져온 id의 문서를 가져올 수 있도록 deltaImportQuery attribute에 mongo query를 작성하고, 특정 시간 이후에 삭제된 데이터를 가져올 수 있도록 deletedPkQuery 에도 mongo query를 작성합니다.<!-- data-config.xml --> <?xml version="1.0" encoding="UTF-8" ?> 정상적으로 동작은 했지만, 색인 속도가 실제 서비스에 적용하기 힘들 정도였습니다. 실행되는 mongo query를 확인했는데 다음과 같이 동작하였습니다.특정 시간 이후에 생성된 데이터를 색인하기 위해 약 (새로 생성된 문서개수 + 1) 번의 mongo query가 실행되었습니다. (batch size와 문서 갯수에 따라 늘어날 수도 있습니다.) 메신저 서비스 특성상 각각의 문서 크기는 작지만 증가량이 빠르므로 위 방식으로는 운영 할 수 없었습니다. 그래서 delta-import using full-import 를 참고해서 두 번째 삽질을 시작 하였습니다.. 두 번째 삽질full-imoprt 명령을 실행할 때 clean=false queryString을 추가하고 data-config.xml query attribute를 수정하는 방법으로 증분 색인 하도록 수정했습니다. 특정 시간 이후 생성된 문서를 가져오는 attribute인 deltaQuery와 deltaImportQuery 는 필요가 없어 지웠습니다.<!-- data-config.xml --> <?xml version="1.0" encoding="UTF-8" ?> <!-- if query="" then it imports everything --> 전체 색인은 /dataimport?command=full-import&clean=true 로 실행하고, 증분 색인은 /dataimport?command=full-import&clean=false(생성된 문서)와 …/dataimport?command=delta-import&commit=true(삭제된 문서)로 실행하도록 했습니다.정상적인 것 같았지만, 문제가 있었습니다.full-import, delta-import 명령을 실행하면 conf/dataimport.properties 파일에 전체 색인이 실행한 시작 시각 혹은 증분 색인이 최근 종료한 시간이 “last_index_time” key로 저장됩니다. 첫 번째 삽질에서 증분 색인시 delta-import 명령 한 번으로 생성된 문서와 삭제된 문서를 처리했지만, full-import와 delta-import 두개의 명령으로 증분 색인이 동작하면서 생성된 문서를 처리할 때도 last_index_time이 갱신되고 삭제된 문서를 처리할 때도 last_index_time이 갱신되었습니다.예를 들면증분색인 동작이 1분마다 삭제된 문서를 처리하고, 5분마다 생성된 문서를 처리 한다고 가정해보겠습니다. 3시 13분 14초에 delta-import가 완료되어 last_index_time에 저장되고, 다음 delta-import가 실행되기 전 3시 13분 50초에 full-import가 완료되어 last_index_time이 갱신되었다면, 3시 13분 14초부터 3시 13분 50초 사이에 삭제된 문서는 처리를 못 하는 경우가 발생합니다.Solr에서 dataimport.properties에 기록하는 부분을 수정하는 방법과 전체/증분 색인을 동작시키는 Solr 외부에서 특정 색인 시간을 관리하는 방법이 있었는데 Solr를 수정하는 건 생각보다 큰 작업이라 판단되어 외부에서 관리하는 방법으로 세 번째 삽질을 시작하였습니다.. 세 번째 삽질전체/증분 색인을 주기적으로 동작 시키는 곳에서 full-import&clean=false(생성된 문서) 처리할 때 필요한 마지막으로 색인 된 문서 id와 delta-import(삭제된 문서) 처리할 때 필요한 마지막으로 색인 된 시간을 관리하도록 개발하였습니다. 증분 색인 시 full-import&clean=false를 실행하기 전에 현재 색인 된 마지막 id 조회 후 해당 id보다 큰 데이터를 처리하도록 하였고, delta-import를 마지막으로 마친 시간을 따로 저장하다가 delta-import 실행 시 해당 시간을 전달하는 방법으로 수정하였습니다.<!-- data-config.xml --> <?xml version="1.0" encoding="UTF-8" ?> 마치며튜닝의 끝은 순정이라는 말이 있는데 IT 기술은 예외인 것 같습니다. 현재는 Solr의 기본 기능만으로 구성했지만, 고객에게 더 나은 서비스를 제공할 수 있는 시작점으로 생각하고, JANDI 서비스에 맞게 끊임없이 발전해나가겠습니다.감사합니다.참고Getting Started with SolrApache Solr 5.5.0 Reference Guide PDFApache Solr 6.1 - Analyzers, Tokenizers and FiltersRebalance API for SolrCloud issueYonik Blog#토스랩 #잔디 #JANDI #개발자 #개발팀 #개발후기 #인사이트
조회수 1280

사랑과 매출

#1. 2012년 두바이, 삼성전자 사원공항을 나오자 바람이 뜨겁다. 사막의 열기가 나를 덥친다. 가슴이 답답해졌다. 나는 노트북을 움켜쥐고 급히 택시를 탔다. 입사 2년차 첫 출장이었다. 대한항공을 타고 8시간을 날던 중 문득 두려움이 엄습했다. '책상머리에 앉은 백면서생일뿐인 내가 무얼 할 수 있을까.'보고서 외엔 할 줄 아는 게 없는 인생. 난 새로운 길을 찾을 수 있을까."웰컴 투 두바이"금발의 리셉션 여성이 환하게 맞아준다. 에드워드 호퍼의 그림같은 복도를 지나 객실로 들어온다. 캐리어를 내려 놓으니 이제야 쓸쓸해진다.      다음 날 첫 출근길. 오피스는 도보로 10분이었다. TF 멤버는 총 4명이었다. Global Strategy Team 출신의 인도인 엘리트 팀장, 본사 한국인 부장, 두바이 현지 매니저, 그리고 막내인 나.  TF는 초반부터 난항을 겪었다. Kick-off는 연신 미뤄졌다. 프로젝트 추진안은 일주일 넘게 계속 바뀌었다. 팀장과 부장의 의견차가 좁혀지지 않았다. 현지 매니저는 회의실 전화와 인터넷을 설치해준 이후 잘 보이지 않았다. 현지 파견 유럽인 컨설턴트는 이건 말이 안돼라며 난색을 표했다. 나는 어리숙하고 무능력한 사원일 뿐이었다.어느 날 현지 영업왕으로 불리는 부장과 인터뷰를 했다. 짙은 눈썹, 부릅뜬 눈, 불독같이 생긴 그는 아랫배만큼은 인자함을 드러내고 있었다. 그의 사무실 벽에는 '2013년 매출목표 $XXX 달성'이라는 커다란 현수막이 달려 있었다. 부장은 자신이 얼마나 잘 나가는지, 영업을 얼마나 잘 하는지, 매출이 얼마나 높은지를 연신 자랑했다. 20년 넘도록 매일 매출을 위해 살아온 그였다. 그의 눈빛에서 짙은 자부심과 열정이 느껴졌다. 주말엔 공원에 갔다. 나는 잔디밭에 누워 생각했다.'언젠가 내가 하루종일 내뱉는 단어들이 매출, 실적, 보고 이런 게 아니라 사랑, 희망, 기적 이런 것들이었으면 좋겠다.'#2. 2018년 서울, 퇴사학교 대표월요일 아침부터 비가 쏟아진다. 이런 날은 정말 출근하기 귀찮다. 출근을 안 해도 아무도 뭐라고 하지 않지만 내 안의 또 다른 내가 말한다. "그래도 오늘은 주간회의잖아. 팀원들과의 약속을 지키라구."창업 후 2년이 지났다. 첫 1년은 미치도록 일만 했다. 일 말고는 아무것도 보이지 않았다. 작은 회사, 아니 아직은 회사라고 부를 수도 없는 어떤 조직. 이 조직을 정말 멋지게 만들고 싶었다. 회사와 개인의 비전이 일치되고 각자가 행복한 일을 찾는 그런 조직. 내가 만든 회사도 그러길 바랬고, 내가 만나는 사람들이 다니는 회사도 그러길 바랬다. 좀 더 오버해서, 대한민국 회사와 개인들이 모두 그런 방향으로 갈 수 있기를 바랬다. 거기에 내가 조금은 기여할 수 있기를, 지난 2년간 의욕적으로 바래 왔었던 것 같다. "고단하네요."오늘 워라밸 워크숍에서 내가 한 말이다. 워라밸. 나에게 그런 건 없었다. 워크와 라이프가 하나니까. 두 개가 다르지 않으니 밸런스 같은 건 의미가 없었다. 그냥 워크가 곧 라이프고 라이프가 곧 워크인 삶. 장점도 있고 단점도 있다. 좋을 때도 있고 힘들 때도 많다. 인생은 복합적이다. 늘. 항상 한 쪽만 비추는, 또는 한 쪽만 보려는 관점은 내겐 늘 버겁다. 이제 나는 6년 전과는 많이 달라졌다. 미팅을 하고 출장을 다니고 강의를 하고 제안을 한다. 관리를 하고 운영을 하고 챙기고 혼내고 가르치고 거절당한다. 매일 산을 넘고 강을 열댓번 건너고 비를 맞고 바람에 흔들거린다. 이젠 책상머리 서생은 아니지만, 여전히 삶에선 백면서생이다. 나는 이제 그 두바이의 부장이 부럽다. 하루종일 내 입에서 '매출, 실적, 보고'와 같은 단어를 말하지만, 아직 그 부장같은 눈빛을 지을 순 없다.나는 지금 사랑보다 매출을 원한다. 그래도 언젠가는 다시 꿈 꾸고 싶다. 매출보다 사랑을 내뱉는 날을 다시 꿈꾸고 싶다. 에드워드 호퍼, 밤을 지새우는 사람들, 1942#퇴사학교 #인사이트 #경험공유

기업문화 엿볼 때, 더팀스

로그인

/