137 deview

91
Popular Convention 개발기 Outsider 2013.10.14 at Deview 2013

Upload: naver-d2

Post on 13-Jan-2015

1.325 views

Category:

Documents


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: 137 deview

Popular Convention 개발기

Outsider2013.10.14 at Deview 2013

Page 2: 137 deview

Outsider코딩을 좋아하는 프로그래머

Page 3: 137 deview

아이디어Proof of Concept

실제 구현

서비스

대회 결과 공지 후

리팩토링

Page 4: 137 deview

PopularConvention?

Page 5: 137 deview

Github의 코드를 기반으로

코딩 관례를 분석

Page 6: 137 deview
Page 7: 137 deview

Github Data Challenge II

Page 9: 137 deview

메인 페이지 18위

Hacker News

Page 10: 137 deview

아이디어

Page 11: 137 deview

Github 데이터 챌린지 공지

https://github.com/blog/1450-the-github-data-challenge-ii

Page 12: 137 deview

http://www.flickr.com/photos/photoloni/6321527653/

만들어 볼만한아이디어가 없을까?

Page 13: 137 deview

Github에는 엄청냔 양의 코드가 있으므로 잠재력이 높다

Page 15: 137 deview

Github에 실제 코드가 있는데

코딩 관례를 설문조사로 할 필요가 있을까?

Page 16: 137 deview

Proof of Concept

Page 19: 137 deview

Github 타임라인으로 분석할 수 있는가?

http://www.flickr.com/photos/morberg/3842815564/

API로 분석할 코드를 얻을 수 있는가?

Page 20: 137 deview

Github 타임라인으로 분석할 수 있는가?

http://www.flickr.com/photos/morberg/3842815564/

API로 분석할 코드를 얻을 수 있는가?

코드를 기반으로 관례를 분석할 수 있는가?

Page 21: 137 deview

초기에는 세부사항을

무시하라

Page 22: 137 deview

Google BigQuery

사용해 본적 없음.

인증 어려움.

불필요한 과정에 시간 소비.

http://www.flickr.com/photos/jezpage/4259659744/

Page 23: 137 deview

구글의 Ilya Grigorik

매 시간마다 타임라인이 JSON 파일로 올라옴

$ wget http://data.githubarchive.org/2013-10-14-10.json.gz

http://www.githubarchive.org/

Page 24: 137 deview

Github Archive에서 JSON 파일 다운로드

Page 25: 137 deview

Github Archive에서 JSON 파일 다운로드

mongoimport로 MongoDB에 임포트

Page 26: 137 deview

Github Archive에서 JSON 파일 다운로드

mongoimport로 MongoDB에 임포트

타임라인의 PushEvent 추출

Page 27: 137 deview

Github Archive에서 JSON 파일 다운로드

mongoimport로 MongoDB에 임포트

타임라인의 PushEvent 추출Push의����������� ������������������  담긴����������� ������������������  Commit����������� ������������������  정보가����������� ������������������  담겨있다

Page 28: 137 deview

Github Archive에서 JSON 파일 다운로드

mongoimport로 MongoDB에 임포트

타임라인의 PushEvent 추출

Github commits API로 커밋 내용 확인

Push의����������� ������������������  담긴����������� ������������������  Commit����������� ������������������  정보가����������� ������������������  담겨있다

Page 29: 137 deview

Github Archive에서 JSON 파일 다운로드

mongoimport로 MongoDB에 임포트

타임라인의 PushEvent 추출

Github commits API로 커밋 내용 확인커밋의����������� ������������������  patch����������� ������������������  내용이����������� ������������������  JSON에����������� ������������������  담겨있다

Push의����������� ������������������  담긴����������� ������������������  Commit����������� ������������������  정보가����������� ������������������  담겨있다

Page 30: 137 deview

Github Archive에서 JSON 파일 다운로드

mongoimport로 MongoDB에 임포트

타임라인의 PushEvent 추출

Github commits API로 커밋 내용 확인

JavaScript 파서로 코딩 관례 분석

커밋의����������� ������������������  patch����������� ������������������  내용이����������� ������������������  JSON에����������� ������������������  담겨있다

Push의����������� ������������������  담긴����������� ������������������  Commit����������� ������������������  정보가����������� ������������������  담겨있다

Page 31: 137 deview

가능하겠는데...

Page 32: 137 deview

여기서 잠시 샛길로...

Page 33: 137 deview

개인 프로젝트는 보통 학습의 목적

http://www.flickr.com/photos/lethaargic/3660097148/

Page 34: 137 deview

보통 끝이 나지 않는다

Page 35: 137 deview
Page 36: 137 deview
Page 37: 137 deview
Page 38: 137 deview

아키텍처 설계도 많은 고민 후

테스트 코드를 철저히

Page 39: 137 deview

http://www.flickr.com/photos/mattijn/4103100036/

이렇게 하는게 과연 좋은가?

Page 40: 137 deview

제약을받아들여라

Page 41: 137 deview

30여일 정도의 프로젝트 기간

기능과 시간에 대한타협이 필요

http://www.flickr.com/photos/tacoekkel/2770755895/

Page 42: 137 deview

실제 구현

Page 43: 137 deview

Server-side

Page 44: 137 deview

d3.js

Client-side

Page 45: 137 deview

Goals

만들어진 데이터를 다른 사람들에게도 의미있는가?

코딩관례 분석으로 의미있는 데이터를 만들 수 있는가?

Page 46: 137 deview

Github Archive에서 JSON 파일 다운로드

Page 47: 137 deview

Github Archive에서 JSON 파일 다운로드

JSON 파일 MongoDB에 임포트

Page 48: 137 deview

Github Archive에서 JSON 파일 다운로드

JSON 파일 MongoDB에 임포트

작업 목록 컬렉션에 추가

Page 49: 137 deview

Github Archive에서 JSON 파일 다운로드

JSON 파일 MongoDB에 임포트

작업 목록 컬렉션에 추가

배치로 작업목록에 있는 타임라인을 처리

Page 50: 137 deview

Github Archive에서 JSON 파일 다운로드

JSON 파일 MongoDB에 임포트

작업 목록 컬렉션에 추가

배치로 작업목록에 있는 타임라인을 처리

Commits API로 지원하는 언어이면 파싱

Page 51: 137 deview

Github Archive에서 JSON 파일 다운로드

JSON 파일 MongoDB에 임포트

작업 목록 컬렉션에 추가

배치로 작업목록에 있는 타임라인을 처리

Commits API로 지원하는 언어이면 파싱

커밋별로 관례의 점수를 매긴 후 디비에 저장

Page 52: 137 deview

Github Archive에서 JSON 파일 다운로드

JSON 파일 MongoDB에 임포트

작업 목록 컬렉션에 추가

배치로 작업목록에 있는 타임라인을 처리

Commits API로 지원하는 언어이면 파싱

커밋별로 관례의 점수를 매긴 후 디비에 저장

한시간의 데이터를 언어별로 합산

Page 53: 137 deview

핵심만 간단히 구현

코딩관례 분석은커밋에서 추가된라인을 기준으로

JSON 다운로드/타임라인처리등은수동으로 시작파일 전체 소스 분석을 하

면 커밋마다 관리해야 한다전체 소스의 파싱은 작업이 너무 크다

삭제된 라인은 의미없음

Page 54: 137 deview

파서 구현 언어별로 별도로 구성 정규식으로 단순 비교 해당 패턴에 맞으면 +1 파서만 테스트 코드 작성 전체 완성후 다른 언어를 추가

Java Scala Python

Page 56: 137 deview

API 갯수 제한 문제

Github는 인증한 경우 시간당 5,000 API 요청

한시간에 PushEvent가 2~3,000개

하나의 PushEvent에 다수의 commit이 존재

파일 종류라도 알아내려면 commits API 필요

Star, fork 기준으로 정렬해서 API 갯수 만큼만 처리

Page 57: 137 deview

실 데이터로 인한 오류

오류의 원인을 찾기 어려움

API 제한 갯수를 초과하면 갱신을 기다려야 함

파싱에서 오류 발견되면 데이터를 리셋해야 함

서비스 로직이 너무 복잡해짐

Page 58: 137 deview

d3.js를처음 사용함

http://www.flickr.com/photos/honestlyspeakin/8658496702/

Page 59: 137 deview

내가 생각한 D3.js

Page 60: 137 deview

내가 만든 D3.js

Page 61: 137 deview

써보고 싶은 욕심

약간 가벼워 보이는 Flight 선택

불필요하게 원페이지 사이트로 작성함

결국 오픈후 제거함

Page 62: 137 deview

데이터의선형적인 증가

http://www.flickr.com/photos/78428166@N00/3829063385/

Page 63: 137 deview

매 시간마다 하나의 도큐먼트가 생성

정확한 커밋 수 파악을 위해 Sha를 모두 보관

MongoDB 문서 한계인 4MB 초과로 오류 발생

Map-Reduce를 도입

데이터가 쌓일수록 처리시간이 오래 걸려서 캐싱 추가

Page 64: 137 deview

서비스

Page 65: 137 deview

심사를 받기 위해 데이터가 필요하므로

일주일정도 데이터를 쌓음

Page 66: 137 deview

제출후에는 모든 배치를 멈춤

Page 67: 137 deview

약간 기대?

Page 68: 137 deview

대회 결과 공지 후

Page 69: 137 deview

5월 20일 경 발표 예정실제 발표는 6월 27일

Page 70: 137 deview

Node.js CPU 100%MongoDB CPU 100%

http://www.flickr.com/photos/neoporcupine/1866929252/

Page 71: 137 deview

성능 테스트를 제대로 하지 않음

Page 72: 137 deview

더이상 데이터를 쌓지 않으므로 사실상 정적 페이지나 마찬가지

Page 73: 137 deview

nginx

Node.jsWAS

Page 74: 137 deview

nginx

Node.jsWAS

Varnish

Page 75: 137 deview

미리준비하자

http://www.flickr.com/photos/51025521@N04/6576977663/

Page 76: 137 deview
Page 77: 137 deview

코드 수정은 직접 해야 한다http://www.flickr.com/photos/scallau/4767358384/

Page 78: 137 deview

리팩토링

Page 79: 137 deview

잘 해놓고 기회를 날려버린 건 아닌가?

Page 80: 137 deview
Page 81: 137 deview

모델링을 다시해서데이터 양을 줄임

Page 82: 137 deview

Ruby, C# 추가

Page 83: 137 deview

공지 추가

Page 84: 137 deview

http://www.flickr.com/photos/ralphandjenny/460698734/

고객 대응은 중요하다

Page 85: 137 deview
Page 86: 137 deview

haackedd의 블로그 포스팅 후

Page 87: 137 deview

0

7500

15000

22500

30000

1w 2w 3w 4w 5w 6w 7w 8w 9w 10w 11w 12w 13w 14w 15w 16w

Github의����������� ������������������  발표

해외����������� ������������������  블로그에서����������� ������������������  소개됨

방문자

Page 88: 137 deview

81174189

575

262

151

54

900

451

325

135

325발표 2주 후 현재

Page 89: 137 deview

모래 사장에 나무 막대기만 갖고도 많은 일을 해낼 수 있습니다.

아이디어만 있다면 말이죠..

- Alan Kay

Page 91: 137 deview

Question

?@[email protected]