반응형
오픈소스 분석을 위하여...
Open Source란?
- Wiki에 의하면 오픈소스 소프트웨어는 소스 코드를 공개해 누구나 제한없이 사용할 수 있는 오픈소스 라이선스를 만족하는 소프트웨어를 뜻합니다.
- 라이선스는 Apache License, GNU, MIT, BSD, GNU 등 다양한 라이선스가 존재합니다.
- 오픈소스 라이선스에 대한 자세한 내용은 [SW License] 오픈소스 소프트웨어 라이센스 정리을 참고해주세요.
- 아마 프로그래밍을 하면, 오픈소스를 자주 접하게 되며, 언어별로 오픈소스가 다양합니다.
- 데이터 분석을 한다면 자주 사용할 Pandas, Numpy, 머신러닝 오픈소스인 scikit learn, 딥러닝 오픈소스 중 유명한 Tensorflow, PyTorch, MXNet 등이 있습니다.
오픈소스를 분석하면 좋은 점
- 1) 라이브러리의 내부를 알 수 있음
- 2) 코드 퀄리티 향상
- 프로그래밍 방식에 대해 알 수 있습니다.
- Low Level에선 코드를 어떻게 추상화하는지 파악 가능합니다.
- 3) 오픈소스 기여를 위한 사전 단계
- 오픈소스에서 어떻게 협업하는지 간접적으로 알 수 있고, Pull Request나 Issue 등록하며 Github에 익숙해질 수 있습니다.
- 4) 다양한 지식 추가 습득가능
- 오픈소스에서 추상화해둔 코드를 보며, 그 안에 필요한 키워드를 찾을 수 있습니다.
- 5) 오픈소스의 버그를 찾을 수 있음
- 오픈소스 코드를 디버깅하며 '이 부분이 이상한데?' 등을 거슬러 올라가면 버그를 찾을 수 있습니다.
- 6) 메타인지를 가질 수 있음
- 메타인지는 생각에 대한 생각으로 나타낼 수 있는데, 코드의 코드로 '이걸 왜 이렇게 구현했지?' '다른 방식으로 구현하면 어떨까?' 등을 고민해볼 수 있습니다.
기본 지식
- 프로그래밍 언어 지식
- 프로그래밍 언어의 모든 것을 알아야 하는 것은 아니지만, 기본은 필요합니다.
- 자료구조와 디자인 패턴 지식이 있으면 코드를 이해하기 쉽습니다.
- 대부분의 좋은 소스에서는 효율적인 소스 관리를 위해 정형화되어 있는 패턴을 사용한다.
- IDE
- 오픈소스를 분석할 때, Github Repo에서 이동할 수 있지만 빠르게 탐색하기 위해 잘 활용하면 좋습니다.
- 오픈소스에 대한 이해
- e.g. Pandas는 데이터를 조작하기 위해 사용하는 오픈소스다! 라는 최소한의 오픈소스의 핵심을 이해하고 있어야 합니다.
- 오픈소스에서 필요로 하는 지식
- e.g. Apache Spark를 분석하려고 하는데, 병렬 처리 관련 이론을 모르면 어려울 수 있습니다.
오픈소스 분석의 시작.
오픈소스 선택하기
- 1) 만약 처음이라면 우리가 많이 아는 유명한 오픈소스를 선택하는 방법도 있지만, 상대적으로 덜 유명한 오픈소스를 선택하는 방법도 있음
- 덜 유명한 오픈소스는 우선 아키텍쳐가 상대적으로 간단할 수 있습니다.
- Tensorflow나 Pandas 같은 오픈소스는 꽤 오래 되었기 때문에, 초심자 입장에선 진입 장벽이 있을 수 있습니다.
- 혹은 초반 버전 선택하는 방법도 있습니다.
- 2) 혹은 본인이 많이 사용하고 있는 라이브러리(관심이 있는 라이브러리)
- 회사 업무로 Airflow를 많이 사용하고 있고, 그 안을 더 깊게 이해하고 싶은 경우에 분석하면 좋습니다.
- 3) 얼마나 활발하게 개발되고 있는지
- 최근에 올라온 Commit이 언제인지, Issue에 올라온 내용이 답변이 달리는지 등을 통해 알 수 있습니다.
- 활발한 프로젝트일수록 오픈소스 분석하다 어려운 내용을 물어보면 빠른 답변을 기대할 수 있습니다.
- 보조적으로 라이브러리의 Version이 몇인지 확인해서 활발하게 개발되는지를 볼 수 있습니다.
- 4) 기업이 주도해서 만드는지 or 개인이나 작은 팀이 만드는지
- 3)과도 연관되는 내용인데 기업에서 주도할 경우 해당 오픈소스를 관리할 팀이 따로 존재하곤 하여 좋은 답변을 받을 수 있습니다.
- 제일 중요한 것은 본인이 사용하고, 지속적으로 관심을 가질 수 있는지가 중요합니다.
공식 문서를 토대로 오픈소스 파악하기
- 오픈소스를 분석하기 전, 혹시 이 오픈소스가 처음이라면 공식 문서를 통해 라이브러리의 사용 방법을 익혀두면 어떤 코드를 먼저 살펴볼지 방향을 잡을 때 도움이 됩니다.
- Getting Started, User Guide, API Reference 등이 있는데 Getting Started에 많은 정보들이 포함되어 있습니다.
- 예를 들어, 오픈소스 Overview엔 어떤 목적으로 만들어졌고, 어떤 특징이 있는지 나옵니다.
여기에 나오는 예시 코드를 주로 먼저 파악하면 좋습니다.
- 예를 들어, 오픈소스 Overview엔 어떤 목적으로 만들어졌고, 어떤 특징이 있는지 나옵니다.
- Version History엔 현재 오픈소스가 몇 버전이고, 어떤 기능이 언제 추가되었는지 확인할 수 있습니다.
- 이 시기에 공식 Document, 창시자가 블로그에 올린 글, 각종 컨퍼런스에서 발표한 유튜브 영상 들을 보고 창시자의 “철학”을 파악할 수 있습니다.
Clone 또는 Fork
- Github, Gitlab, BitBucket 등에 오픈소스가 저장되어 있습니다.
- 인터넷 창에서 확인할 수 있지만, 조금 더 쉽게 이동하고 필요할 경우 커스텀 로그를 남기기 위해 개인 컴퓨터로 파일을 Clone합니다
- 오픈소스 분석이 아닌 기여를 하고 싶은 경우엔 Fork를 한 후, Pull Request를 날리면 됩니다.
큰 숲 바라보기 - 아키텍쳐 분석
- 개인의 Local로 소스를 Clone한 후, 본격적인 분석을 시작함
- 대부분 오픈소스의 이름의 폴더가 있음
- 그 안에 핵심 코드들이 저장됨
- 패키지를 만들어본 경험이 있다면 이게 당연하지만, 모르는 분들을 위해 캡쳐
- 처음엔 오픈소스의 아키텍쳐, 숲을 먼저 확인한 후 디테일한 부분으로 이동함
- 간단하게 할 수 있는 것은 폴더별로 어떤 파일이 있는지 확인하고, 공식 문서 등에서 확인했던 메소드가 어디에 저장되어 있는지 파악함
- 큰 아키텍쳐를 draw.io나 키노트 등에서 그려봄
디테일 분석 - 함수, 클래스 등
- 큰 숲을 파악한 후, 디테일한 부분을 분석함
- 클래스엔 어떤 정보를 담고 있고, 어디서 활용되며, 함수는 어떤 방식으로 동작하는지 등을 파악함
- 모든 함수를 다 파악하겠다! 라고 생각하지 않고 조금씩 시도함
- Class는 최상위에 어떤 클래스가 있고, 그걸 어디서 상속받는지 등을 확인함
- 이 때, IDE에서 breakpoint를 걸어두고 함수를 실행해봄
- 직접 눈으로 어던 값이 들어가있는지 확인해보는게 이해에 큰 도움이 됨(모두 실행하긴 힘들지만..)
- 어떤 Input, Output이 오는지 감을 잡고 싶으면 Test 코드를 확인해봄
- 보통 Test Code엔 어떤 Input이 들어와서 Output이 뭐가 나오는지 정의되어 있어 코드를 이해할 때 도움을 줌
- 네이밍을 어떻게 했는지도 파악하며, 특정 메소드는 Protected method고, Private method 인지 등을 파악함
- 잘 되어있는 오픈소스라면 주석을 잘 남겼을테니, 주석을 주의깊게 보는 것도 유용함
- 나라면 이렇게 짜볼 수 있지 않을까?도 생각해보고 메모해둠
- 추후 분석한 내용을 까먹지 않기 위해 노션 등에 기록해둠
TIP!! : Do & Don't
Do: 현명하게 소스 분석하는 방법
- 포기하지 말기 (★★★★★)
- 오픈소스 분석은 익숙하지 않다면, 매우 힘들고 고된 작업일 수 있음
- 시간을 가지고 조급해하지 마세요. 이 과정에서 조금씩 성장하고 있습니다!
- 혼자 어렵다면 여러 사람들과 함께 분석하는 방법도 있음
- 힘들어도 한 싸이클을 꼭 돌아보기!!
- 소스의 목적을 이해하고 구조를 분석하기
- 소스의 목적을 이해: 창시자의 문서, 유튜브 영상 보기 + Test Code 참고하기
- 창시자의 철학, 창시자가 생각한 베이스라인을 이해할 수 있음.
- 구조 분석(tree): 문서, 이미지로 정리하기
- ppt, flowchart(draw.io), 구성도, 마인드맵 등 이미지화하거나 문서로 정리해둬야 추후에 분석한 내용을 다시 볼 수 있음
- 소스의 목적을 이해: 창시자의 문서, 유튜브 영상 보기 + Test Code 참고하기
- LOG level을 DEBUG로 설정하라.
- INFO, WARN 보다 더 많은 정보를 제공.
- 관심있는 부분부터 집중적으로 조금씩 파악하기
- 어렵다면 초기 버전을 다운 받아 분석하라.
- 수정, 실행, 확인 사이클을 짧게 만들어라(Refactoring-rewrite chunk).
- 디버거의 breakpoint 사용하기
- 코드에서 새로운 것들 학습하기!
- 네이밍 공부
- 코드 스타일
- 타입 힌팅 등
- 코드를 무조건 많이 보는 것을 추천
- 주석을 흘리지 말 것
- 인쇄해서 보는 분들도 있다고 들음
- 코드를 보며 코드를 보는 안목을 기를 수 있음
Don't: 아무짝에도 쓸모없는 짓.
- 소스 타이핑
- 이해될 때까지 설명해라.
- 소스 한 줄 한 줄...
- 손으로 써보기...
마치며
- 오픈소스를 사용하는데 있어 두려움을 없애는 가장 좋은 방법은 코드를 보는 것.
- 코드를 보면 그 코드를 통해 더 많은 것을 배우고 그 코드를 흉내냄으로써 기술적으로 한 단계 더 발전할 수 있을 것.
- 처음에는 환경 구성을 위한 삽질의 연속이겠지만, 익숙해지면 문제 발생시 구글 검색을 하기 보다 소스 코드를 먼저 보고 있는 자신을 발견할 수 있음.
- 조금 더 특정 분야를 깊게 파보는 경험을 할 수 있음(Deep Dive).
- 제일 중요한 것은 포기하지 말고 꾸준히 하는 것! 한 사이클이라도 꼭 돌아보면 좋을 것 같아요(작은 단위의 분석부터 시작!)
참고
- Python 오픈소스(Open Source) 분석 방법: https://zzsza.github.io/development/2020/07/19/opensource-analysis/
- [Tistory] 오픈소스 분석법에 대한 사이트 정리: https://bibidi0.tistory.com/14
- 분석을 위해 참고하면 좋은 자료들
반응형
'Study: Software(SW) > SW: Opensource' 카테고리의 다른 글
[OpenSource 사용하기] googleMock(gMock): C++ Mocking Library for googletest (0) | 2022.07.16 |
---|---|
[OpenSource 사용하기] nlohmann/json: c++ json library (feat. Modern C++) (0) | 2022.07.05 |
[OpenSource 사용하기/뜯어보기] OpenSource 사용하기/뜯어보기 개요 및 목록 (0) | 2022.06.29 |
[Opensource] 오픈소스 배포시 소스코드 제공의무와 범위 (0) | 2022.06.29 |
[SW License] 오픈소스 소프트웨어 라이센스 정리: GPL, MIT, Apache, MPL... (0) | 2022.06.16 |