Build the RIGHT thing for Agile

Agile 개발을 위해 Things to keep doing

페어링, TDD (테스트기반 개발), 개발자 중심의 의사 결정 – 특히 기술적인 부분 관련 (개발 도구나 환경의 선택 등), 리펙토링 권장하기, 매일 아침 스탠드업, 주간 레트로 (레트로 스펙티브), 주간 IPM (이터레이션 미팅), PM의 피처 수락하기, 팀이 함께 앉기, 주간 사용자 인터뷰 및 테스트, 디자인 리뷰, 페이퍼 wireframe, epic을 작은 단위의 story로 나누기, Story의 난이도 및 스코어리에 대해서는 개발자들이 산정하기, 그리고 마지막으로 탁구(탁구대가 있다는 가정하에ㅋ)

대기업의 경우 사업 분야 자체가 굉장히 다양하고 복잡하기 때문에, 이를 고려하여 D&F (디스커버리 / 프레이밍)을 자주 실시하는 것이 중요합니다. 이를 통해서 팀 안에서 공통된 이해(shared understanding) 를 유지하고 사용자의 마음이 되어 이를 공감(empathy)하고 확산하는 과정이 중요합니다.

위험 요소들 (Risks)

조직을 변화시키고 교육시키는 부분 Organization transformation and enablement 큰 조직을 대상으로 프랙티스를 실시하고 프로세스를 바꾸려면 많은 시간과 노력이 필요합니다. 작은 팀부터 시작하세요. 작은 팀 안에서 프로젝트 및 프로세스등에 대한 자율성을 보장하고, 새로운 멤버들과의 pairing을 통해서 지식을 공유하는 것이 가장 효과적입니다. 이를 통해서 프로세스를 경험한 멤버들이 또다른 멤버들과 다시 pairing 함으로 점점 더 많은 사람들과 함께 지식을 공유할 수 있습니다.

지속가능한 페이스(속도) Sustainable pace

Pivotal labs의 프로세스는 굉장한 집중력을 필요로 합니다. 따라서 해당 프로세스로 업무를 진행하는 경우 해당 팀의 멤버는 담당 프로젝트만 집중할 수 있는 환경을 만드는 것이 중요합니다. 가능하면 다른 업무들로 인한 방해 없이 매일 정해진 시간 동안 일하는 것이 좋습니다. (예: 하루 8시간)

Balanced Team to your team

PM(프로덕트 메니져), 디자이너, 개발자는 지속적으로 팀을 유지해서 계속 일하는 것을 권장합니다. 지금까지 경험한 프로세스를 실제로 수행하기 위해서는 위의 세가지 업무가 긴밀하게 협동하는 것이 절대적으로 필요합니다. 서로의 도움 없이는 어느 누구도 제대로 임무를 수행할 수 없습니다. 더불어, 위의 각 업무를 담당하는 사람이 끝까지 자신의 업무에 집중해서 수행하는 것이 가장 효율적입니다.

새멤버 교육 Teaching process to others at team

가장 좋은 교육방법은 “같이 하는 것” 입니다. 각 업무 별로 (PM, 디자이너, 개발자) 새 멤버들을 영입하여 페어링을 시작하기를 권장합니다. 그렇게 함으로써 본인이 배운 것을 재확인하고, 또 널리 전파하는데 도움이 될 것입니다.

윈도우즈 환경 Windows

Windows를 이용하는 것에 대해서 다양한 방법이 있습니다. 각각의 안을 확인하기 전에 제한된 시간을 정해놓고 시작하세요. 윈도우즈로 해결이 되지 않는다면, 버츄얼머신에 리눅스를 운용하는 것도 방법이 될 수 있습니다. 각각의 방법에 사용한 시간을 기록해서, 윈도우즈로 통한 개발과 버츄얼머신을 이용한 개발의 비용을 비교하면 선택에 많은 도움을 줄 것입니다.

디자이너는 MAC으로 바꾸길 권장합니다. Sketch혹은 zeplin등의 어플은 디자인 작업에 걸리는 시간을 단축시켜 주며, 개발자 및 PM과의 협업 도 훨씬 유용하게 도와줍니다. Sketch같은 경우는 MAC에서만 동작하고 Zeplin의 경우도 MAC 어플에서 100퍼센트의 성능을 발휘할 수 있습니다.

CI plan

당장 씨아이(CI) 툴 한가지를 정하고 사용 시작하세요. Team City, TravisCI, CircleCI, Concourse 등 여러가지 옵션에 대해서 이미 논의했지만, 구체적인 계획은 정하지 않았습니다. 자체 호스팅 (예: Team City)을 하려면 서버 구성(configuring)을 해야하는 번거러움이 있지만 추가비용이 들지 않고, 외부호스팅을 (예:Travis CI) 하면, 서버구성의 번거로움은 없지만 비용이 듭니다.

샘플데이터 문제  currently using sample data

최대한 빠른 시일내에 앱과 실제데이터를 연결하세요. 샘플데이터를 기반으로 개발할 경우, 시간이 지날수록 나중에 실제 데이터소스 및 API를 연결했을 때 오작동이 발생할 리스크가 커질 수 밖에 없습니다. 앱과 그 API(실제데이타와 연동되는 API)를 연결하는 작업을 최우선으로 진행하십시오. 만약 해당 프로젝트의 진행 상의 이슈로 관련 API가 아직 준비되지 않았다면, 현재 가능한 다른 방법으로 실제 데이터를 연결하는 작업을 우선시 해야 합니다.

유저에 대한 “공감” 과 관심을 유지 Maintain empathy and concern for your user

프로젝트를 진행하면서 무의식적으로 언제나 “가설”을  만들어냅니다. 사용자를 대신해서 프로젝트 내부적으로 설정된 가설은 가능한 빨리 검증되여야 합니다. 그래야 사용자에게 필요한 제품을 만들 수 있기 때문입니다. 실제 문제를 해결할 수 있는 버전의 앱을 사용자들에게 가능한 빨리 릴리즈하십시오.

기술(테크놀로지) 선택 Technology choices.

언제나 최신이면서 안정된 버전의 개발 언어와 개발 도구를 사용하길 권장합니다. 모든 기능들에 대해서 보안 및 여러가지 이슈들 그리고 다양한 커뮤니티의 지원을 받기 위해서는 최신의 버전을 사용하는 것이 유리합니다. 또한 각 프로젝트마다 어떤 개발 언어 및 도구들을 사용할 지에 대해서는 프로젝트에 대해서 가장 많은 정보를 가지고 있는 개발자 들에게 선택 권한을 주세요.

DL Trend ‘17.7.9

Deep Learning 관련하여 요즘 관심있게 보는 기술들.. 시간이 없어서 정리는 못하지만, 이렇게 기록해 놨다가 천천히 하나씩 블로그에 작성할 예정 ..

1 . Android Tensorflow 
Java 버전 Tensorflow를 완벽하지는 않지만 링크와 같이 지원하고 있는데 [링크] 
역시 Android 에서 Tensorflow 도 지원한다  [링크]
Python 과 비교하여 완벽한 기능을 제공하지는 못할 것으로 예상되지만, Java 개발자들이 워낙 많기 때문에 가장 대중적인 신경망들 위주로 충부한 의미가 있을 것 같다.
찾아보니 아주 간단하게 Tensorflow 에서 훈련한 모델을 Android 에 심어서 개발하는 튜토리얼도 존재한다. [링크]

2. Quantize Neural Network 
훈련할때와는 다르게 예측할때에는 어짜피 내부적으로 잡음 (여기서는 소숫점 이하)는 버려버리는 특성이 있으니, 모델을 만들때 애초에 정수화해서 저장함으로써 용량을 줄이고 모바일에서의 속도와 관련된 이슈들을 해결해 보자이런 이야기 인듯 함 [링크]

3. Segmentation & Object Detection 
보통 CNN 을 보면 Input Matrix 의 사이즈가 정해져 있기 때문에 RCNN 같은 Object Detection을 해보면 결과물이 해당 물체와 그 주변을 포함한 사각형 이미지가 되기 마련인데 이러한 문제를 보완하여 해당 사물만 Pixel 단위로 정확히 추출하기 위해 나온 방법이 Segmentation 이라고 함.   [링크]
이러한 목적을 달성하기 위해 나온 신경만 구조가 있는데 U-Net 이라고 한다. [링크]

4. VAE (variational autoencoder)
코드 관점에서 보면 흔히 알고 있는 Stacked Auto Encoder 가 일반적인 Vector를 그냥 Input 에 넣는다고 하면, Variational Autoencoder 는 확률 분포를 Vector 로 표현해서 잡음처럼 추가하여 넣어준다. 이렇게 하면 Prediction 때 Input 의 확률 분포를 Random 하게 조작함으로써, 무언가를 Generation 하는 효과를 얻을 수 있다. [링크][링크]

5. YOLO (You Look Only Once) 
Object Detection 을 하는 방법에는 RCNN, Fast RCNN 등 여러가지가 있지만, 실시간성이 중요한 CCTV 나 자율자동차 등에서는 이미지 한장을 여러번 탐색하는 과정을 거치는 기존 알고리즘들의 속도가 만족스럽지 않다. 그래서 한장의 사진을 구획으로 나눠 단 한번만 각 구획단위 평가를 한후 , 구획간의 조합을 통해 Object Detection 을 하여 속도를 비약적으로 향상시킨 YOLO 같은 것이 유용하다. [링크] [링크]

6. AutoML
최근 Google 에서는 주어진 데이터에 알맞는 Neural Network 의 구조를 자동으로 탐색하는 알고리즘에 대해서 이야기하는데, 필요한 Computing Power 를 줄이기 위한 다양한 알고리즘들을 이야기 하고는 있지만 궁극적으로는 무지막지한 TPU(GPU 상위버전)을 통해 엄청난 반복을 통한 것으로 아직은 DL Engineer 의 자리를 위협할 수 있는 물건은 못된다. [링크] 
반면에 신경망을 최적화하기 위해 중요한 Hyper Parameter Tunning 작업 같은 경우 많은 연구가 이루어져 왔는데, Hyper Parameter Random Search [링크]
Genetic Algorithm 을 활용한 근사 최적 Hyper Parameter Set 의 탐색 [링크]
당연하게도 복수의 GPU 서버를 활용한 전체적인 작업 시간의 단축 등으로 자동화가 가능한 추세라고 볼 수 있다.  이미 Cloud 서비스로 제공하고 있는 Google 의 Cloud AI 에서도 보여지고 있는 기능이다. [링크]

7. GAN  (Generative Adversarial Model)
요즘 너무 Hot 에서 아마 모르는 사람이 없을 것 같은 슈퍼스타급 알고리즘
개인적으로 생성모델인데, 생성 모델을 만들기 위해서 너무 많은 데이터가 필요하다.
Classification 모델을 만들기 위해 부족한 데이터에 사용하기에도 애매하고, 실무에 사용하기에는 애매한 녀석이지만 우선 아이디어가 매우 Hot 하다. 생성하는 모델과 (Generator) 와 생성된 데이터를 검수하는 녀석(Adversarial)이 서로 경쟁하며 성능을 개선해 간다는 것이 주요 아이디어. [링크]

8. Deep Q Learning
통상적으로 Reinforcement Learning 이라고 하면 Q-Table 을 활용한 알고리즘을 생각하는데 최근(이제는 좀 오래전..)에 Google 에서 Q-Table 대신에 Deep Learning 을 활용하는 방법을 내놓았으며, 이것이 Deep Q Learning 이라 불리는 듯하다.  기본적인 Environment, Action, Reward, State 등으로 구성되는 사상은 유사지만, Deep Learning 을 Reinforcement 에 적용하려면 해결해야 하는 두 가지 문제 (1. Corellation / 2.Non Stationary Target 문제) 를 해결해야 하는데 각각 Buffer 와 Sampling 그리고 별도의 Network를 만들고 주기적으로 Copy하는 방법으로 해결한다. 자세한 내용은  역시 성킴 교수님의 모두의 연구소 자료가 좋겠다. [링크]