Popular Convention 개발기
Outsider
2013.10.14 at Deview 2013
Outsider

코딩을 좋아하는 프로그래머
아이디어
Proof of Concept
실제 구현
서비스
대회 결과 공지 후
리팩토링
?

Popular
Convention
Github의 코드를 기반으로

코딩 관례

를 분석
Github Data
Challenge II
https://github.com/blog/1544-data-challenge-ii-results
Hacker News
메인 페이지 18위
아이디어
Github 데이터
챌린지 공지
https://github.com/blog/1450-the-github-data-challenge-ii
만들어 볼만한
아이디어가 없을까?

http://www.flickr.com/photos/photoloni/6321527653/
Github에는 엄청냔 양의
코드가 있으므로 잠재력이 높다
http://dailyjs.com/2012/12/24/javascript-survey-results/
Github에 실제 코드가 있는데

코딩 관례를

설문조사로 할 필요가 있을까?
Proof of Concept
http://www.flickr.com/photos/morberg/
3842815564/
Github 타임라인으로 분석할 수 있는가?

http://www.flickr.com/photos/morberg/
3842815564/
Github 타임라인으로 분석할 수 있는가?
API로 분석할 코드를 얻을 수 있는가?

http://www.flickr.com/photos/morberg/
3842815564/
Github 타임라인으로 분석할 수 있는가?
API로 분석할 코드를 얻을 수 있는가?
코드를 기반으로 관례를 분석할 수 있는가?

http://www.flickr.com/photos/morberg/
3842815564/
초기에는
세부사항을
무시하라
Google BigQuery

사용해 본적 없음.
인증 어려움.
불필요한 과정에 시간 소비.

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

구글의 Ilya Grigorik
매 시간마다 타임라인이 JSON 파일로 올라옴

$ wget http://data.githubarchive.org/2013-10-14-10.json.gz
Github Archive에서 JSON 파일 다운로드
Github Archive에서 JSON 파일 다운로드
mongoimport로 MongoDB에 임포트
Github Archive에서 JSON 파일 다운로드
mongoimport로 MongoDB에 임포트
타임라인의 PushEvent 추출
Github Archive에서 JSON 파일 다운로드
mongoimport로 MongoDB에 임포트
타임라인의 PushEvent 추출
Push의
 담긴
 Commit
 정보가
 담겨있다
Github Archive에서 JSON 파일 다운로드
mongoimport로 MongoDB에 임포트
타임라인의 PushEvent 추출
Push의
 담긴
 Commit
 정보가
 담겨있다

Github commits API로 커밋 내용 확인
Github Archive에서 JSON 파일 다운로드
mongoimport로 MongoDB에 임포트
타임라인의 PushEvent 추출
Push의
 담긴
 Commit
 정보가
 담겨있다

Github commits API로 커밋 내용 확인
커밋의
 patch
 내용이
 JSON에
 담겨있다
Github Archive에서 JSON 파일 다운로드
mongoimport로 MongoDB에 임포트
타임라인의 PushEvent 추출
Push의
 담긴
 Commit
 정보가
 담겨있다

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

JavaScript 파서로 코딩 관례 분석
가능하겠는데...
여기서 잠시 샛길로...
개인 프로젝트는 보통
학습의 목적

http://www.flickr.com/photos/lethaargic/3660097148/
보통 끝이 나지 않는다
테스트 코드를
철저히

아키텍처 설계도
많은 고민 후
이렇게 하는게 과연 좋은가?

http://www.flickr.com/photos/mattijn/4103100036/
제약을
받아들여라
30여일 정도의 프로젝트 기간
기능과 시간에 대한
타협이 필요

http://www.flickr.com/photos/tacoekkel/
2770755895/
실제 구현
Server-side
Client-side

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

만들어진 데이터를
다른 사람들에게도
의미있는가?
Github Archive에서 JSON 파일 다운로드
Github Archive에서 JSON 파일 다운로드
JSON 파일 MongoDB에 임포트
Github Archive에서 JSON 파일 다운로드
JSON 파일 MongoDB에 임포트
작업 목록 컬렉션에 추가
Github Archive에서 JSON 파일 다운로드
JSON 파일 MongoDB에 임포트
작업 목록 컬렉션에 추가
배치로 작업목록에 있는 타임라인을 처리
Github Archive에서 JSON 파일 다운로드
JSON 파일 MongoDB에 임포트
작업 목록 컬렉션에 추가
배치로 작업목록에 있는 타임라인을 처리
Commits API로 지원하는 언어이면 파싱
Github Archive에서 JSON 파일 다운로드
JSON 파일 MongoDB에 임포트
작업 목록 컬렉션에 추가
배치로 작업목록에 있는 타임라인을 처리
Commits API로 지원하는 언어이면 파싱
커밋별로 관례의 점수를 매긴 후 디비에 저장
Github Archive에서 JSON 파일 다운로드
JSON 파일 MongoDB에 임포트
작업 목록 컬렉션에 추가
배치로 작업목록에 있는 타임라인을 처리
Commits API로 지원하는 언어이면 파싱
커밋별로 관례의 점수를 매긴 후 디비에 저장
한시간의 데이터를 언어별로 합산
핵심만 간단히 구현
코딩관례 분석은
커밋에서 추가된
라인을 기준으로
파일 전체 소스 분석을 하
면 커밋마다 관리해야 한다
전체 소스의 파싱은 작업이
너무 크다
삭제된 라인은 의미없음

JSON
다운로드/타임라인
처리등은
수동으로 시작
파서 구현
언어별로 별도로 구성
정규식으로 단순 비교
해당 패턴에 맞으면 +1
파서만 테스트 코드 작성
전체 완성후 다른 언어를 추가
Java
Scala
Python
해결해야 할 어려움

http://www.flickr.com/photos/newtown_grafitti/
5243248959/
API 갯수 제한 문제
Github는 인증한 경우 시간당 5,000 API 요청
한시간에 PushEvent가 2~3,000개
하나의 PushEvent에 다수의 commit이 존재
파일 종류라도 알아내려면 commits API 필요
Star, fork 기준으로 정렬해서 API 갯수 만큼만 처리
실 데이터로 인한 오류
오류의 원인을 찾기 어려움
API 제한 갯수를 초과하면 갱신을 기다려야 함
파싱에서 오류 발견되면 데이터를 리셋해야 함
서비스 로직이 너무 복잡해짐
d3.js를
처음 사용함
http://www.flickr.com/photos/honestlyspeakin/8658496702/
내가 생각한 D3.js
내가 만든 D3.js
써보고 싶은 욕심
약간 가벼워 보이는 Flight 선택
불필요하게 원페이지 사이트로 작성함
결국 오픈후 제거함
데이터의
선형적인 증가

http://www.flickr.com/photos/78428166@N00/3829063385/
매 시간마다 하나의 도큐먼트가 생성
정확한 커밋 수 파악을 위해 Sha를 모두 보관
MongoDB 문서 한계인 4MB 초과로 오류 발생
Map-Reduce를 도입
데이터가 쌓일수록 처리시간이 오래 걸려서 캐싱
추가
서비스
심사를 받기 위해
데이터가 필요하므로
일주일정도 데이터를 쌓음
제출후에는 모든 배치를 멈춤
약간 기대?

Popular Convention 개발기