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.

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

Pair Programing in Pivotal Labs

# Pair Programing

– Programming 능력의 상향 평준화, 개발인력 변동시 에도 Project 영향도 적음
– Driver 역할의 개발자가 Test Code를 개발하고  이어서 다른 개발자 Implementation Code 개발
– 시스템 Error 감소 및 테스트 문서 최소화 가능

## 장점
– Test 문서대신 Script Code 로 대체가능
– Script 코드 품질향상 도모
– 시스템 변경 시 Test 코드로 이상여부를 Check 함으로써 Manual Test 필요없어 시스템의 유지보수 가능
– User Story에 집중하여 Outside-In 방식으로 개발
– 사용자 관점으로 개발, 테스트함으로써 시스템 수정을 줄임(BDD – Behavior Driven Development)
– 선진 Software 회사들은 대부분 TDD/BDD 방식 적용 (Test코드는 선택이 아닌 필수)

## 역량
– 집중력 향상
– 개인 역량 향상
– 능력의 상향 평균화
– 팀워크 향상
– 개인의 능력 투명(동료평가가 이루어짐)
– 핵심요원의 지식이 자연스럽게 전수

## 생산성
– 개발 집중력 향상
– 컴포넌트 형 개발(TDD Based)
– 소스 Re-factoring이 쉬움
– Test Automation
– 재작업 빈도 감소
– 결함 감소, 품질 향상

## 단점
– 초기 생산성 낮음(테스트 코드등 기본 뼈대 구축)
– 개발자 피로도 증가
– 갈등 회피 불가
– 적응 불가능 개발자 존재 시 원활한 진행 불가

Docker Increase Basesize

 1. Check current base size

docker info

 2. Stop docker

sudo service docker stop

 3. Backup Image and Container &  clear Docker

mv /var/lib/docker/image /<someplace>
mv /var/lib/docker/containers /<someplace>

rm -rf /var/lib/docker

 4. Increase the size

cd /usr/bin/
sudo docker daemon --storage-opt dm.basesize=50G

 4. Restart and check Base Disk

sudo service docker start
docker info

 

docker – create own

가. centOS Docker 설치

docker pull centos

https://hub.docker.com/_/centos/

나. Container 연결

centos Docker 를 기본으로 필요한 것들을 설치하고 이미지로 생성하여 개인 Repository 에 등록하는 순서로 진행하고자 한다.

docker run -t -i centos

 다. 개인 이미지를 만들자

컨테이너에 접속해서 원하는 라이브러리든 환경이든 구성을 한다.
예를 들면 아래와 같은 행위를 말하는 것이다. 지신이 설정하고자 하는 환경을 모두 구성한 후에 exit 명령어로 컨테이너를 종료한다

sudo yum groupinstall -y "Server with GUI"
sudo systemctl set-default graphical.target
sudo systemctl default
exit

라. Docker Commit

이제 아래와 같이 Docker 이미지를 Commit 하여 로컬에 이미지를 만든다

– m : 커밋 메시지
– a : Docker 만든 사람
– 0b261b… : 위에서 실행한 Container ID
– ouseruser/sintara:v1 : 만들고자 하는 Docker 명칭

$ docker commit -m "Added json gem" -a "Kate Smith" \
0b2616b0e5a8 tmddno1/tensormsa:v1

생성한 이미지를 확인해 보자. 정상적으로 만든 이미지가 조회가 되고 다시 컨테이너로 실행이 되면 정상이다.

docker images
docker run -t -i tmddno1/tensormsa:v1 /bin/bash

 

마. Docker Hub 에 계정 및 Repository 만들기

– https://hub.docker.com/ 에서 계정을 생성하고 Repository 를 만든다

지금까지 로컬에서 만든 이미지를 Docker Hub 에 올려서 공유해 보자
만들고 나면 docker pull tmddno1/tensormsa 이런식으로 자신의 경로가 생성된다

바. Docker Hub 에 업로드 하기

아래와 같이 로그인하고, 아까 만든 이미지를 PUSH 해주면 끝이다.

docker login 
docker push tmddno1/tensormsa

 사. Docker Hub 에서 받아서 다시 사용하기

받아서 사용하는 것은 중간에 했던 것과 동일하다.
아래와 같이 생성한 이미지를 PULL 하고 , 터미널에 실행하면 된다

docker pull tmddno1/tensormsa
docker run -t -i tmddno1/tensormsa:v1 /bin/bash

막 계정을 만들어서 최신 Tag 가 없다고 나온다면, 아래와 같이 실행하여 버전과 관계 없이 모든 내용을 다운 받도록 해보자

docker pull -a tmddno1/tensormsa

아. 사용하기

여기서 매우 중요한 것이 있다. Image 와 Container 는 다르다는 것이다.
Container 에서 아무리 수정을 하여도 Commit 하기 전까지 Image 는 절대 변경되지 않는다. 둘은 연관이 있으면서도 독립적인 관계인 것이다.
아래는 Container 관련 주요 명령어이다.

[리스트 보기]

sudo docker ps -a

[시작하기]

sudo docker start <containerID>
sudo docker attach <containerID>

[삭제하기]

sudo docker rm <containerID>

차. Docker 환경에서 Graphic 사용하기

원래 서버에는 XRDP 가 설치 되어있다고 가정하고 Container 생성시 아래와 같이 해주면 그래픽 사용가능

docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" -p 8080:8080 -p 8998:8998 -p 8989:8989 -p 7077:7077 tmddno1/tensormsa:v1

Muliti – Terminal [Link]

PID=$(docker inspect --format {{.State.Pid}} 04fe75de21d4)
sudo nsenter --target $PID --mount --uts --ipc --net --pid

Container to Container Connection

sudo docker run --name db -d mongo
sudo docker run --name web -d -p 80:80 --link db:db nginx

Start Container with Daemon

docker run <option> -d <image> 
docker exec -it <container> bash

 

docker – install

처음 AWS EC2 환경을 구성하고 아무것도 없는 상태에서 테스트를 진행하였습니다.

AWS - EC2
OS : RedHat 64bit

가. 삭제하기

기존에 설치된 Docker 를 사용하거나, 신규 설치인 경우에는 불필요

yum list installed | grep docker
docker-engine.x86_64       1.12.1-1.el7.centos @docker-main-repo
sudo yum -y remove docker-engine.x86_64
rm -rf /var/lib/docker

나.  자동설치

sudo yum update 
curl -fsSL https://get.docker.com/ | sh

[trouble shooting when ssh related error happens]

sudo yum update 
curl -k -fsSL https://get.docker.com/ | sh

다. Docker 실행

sudo service docker start
sudo service docker stop
sudo service docker restart 

 라. Docker 그룹을 만든다

슈퍼 유저가 아닌 유저로도 Docker 가 잘 실행되도록 세팅하는 과정이다
(1) 슈퍼유저로 로그인 (2) 그룹 Docker 생성 (3) 그룹에 사용할 유저 추가 (4) root exit
(5) test : docker run hello-world

su
sudo groupadd docker
sudo usermod -aG docker ec2-user
exit
docker run hello-world

라. 필요 없는 이미지는 삭제

hello-world 이미지가 정상동작하는 것을 확인하고 깔끔하게 모든 Docker 이미지를 지워버리도록 하겠다

sudo docker run hello-world
docker stop $(docker ps -a -q) 
docker rm $(docker ps -a -q)

마. 부팅시 기동되도록 세팅

sudo chkconfig docker on

 

Python – TensorFlow – Django 개발환경 구축 종합

가. OS  환경 구축 및 기본 설정 (링크)
Linux 계정 생성

나. Anaconda 및 Pycharm 설치 (링크)

다. GitHub – Pycharm  연동 (링크)

라. Django – Rest F/W – TensorFlow 연동
설치 및 개발 1부
설치 및 개발 2부
설치 및 개발 3부

마.  Jenkins  CI 환경 구축 및 활용 (링크)

PyCharm – Git 연동

가.   Git Account Create

아래의 주소에 접속하여 계정을 생성

– URL : https://github.com/

나. 프로젝트를 생성스크린샷, 2016-09-03 11-58-04

다. Pycharm 연동

[상단 메뉴 > VCS >> Check Out from .. >> Github]

아래와 같은 창이 나오면, 아까 생성했던 계정을 입력해 주세요

스크린샷, 2016-09-03 12-00-08

[해당 환경에서 앞으로 사용할 비밀번호 생성]

스크린샷, 2016-09-03 12-01-05

[어떤 프로젝트를 가지고 올지 결정] 스크린샷, 2016-09-03 12-02-03

[프로젝트 로드 완료]  스크린샷, 2016-09-03 12-03-24

[자원 커밋하기]

GIT   에 자원은 커밋하는 순서는  add > commit > push  순서이다.
커밋하고자 하는 자원을 선택하고 > 마우스 우클릭 >  git 메뉴에서 (add, commit, push) 를선택하여 수행할 수 있다.

커밋시에 Description  은 필수 사항이다

스크린샷, 2016-09-03 12-11-01 스크린샷, 2016-09-03 12-11-22