개발소스 코드 분석은 어떻게 하는가?
ㅎㅇ 코린이들~ 반가워!
이 코둘기가 오늘도 코린이들을 위한 글을 뚝딱했지. ^^
오늘은 소스 코드 분석에 대해 알아볼 거야.
소스 코드 분석은 왜 필요할까? 당연히~ 더 좋은 소스를 짜기 위해 씹고 뜯고 맛보고 즐기는 거지?
제대로 된 코드를 만들기 위해서는 제대로 된 코드를 많이 읽어보면 되지!
그럼 어떤 걸 읽을까?
1. 기존에 사용하는 라이브러리나 플러그인의 코드를 읽어
2. 인상 깊었던 소프트웨어 코드를 읽어
3. 존경하는 사람이 만든 코드를 읽어
4. 실제 다룰 수 있는 코드를 읽어(되도록 초기 버전)
어떻게 읽을까?
1. 큰 그림을 보자~
2. 개별 단위 함수부터 보는 대신 튜토리얼, 문서, 코드 이외의 다른 참고 자료부터 살펴보자.
3. 프로젝트 구조 파악이 우선이다.
4. 코드 계층 구조를 파악하고 어떤 코드가 어떤 코드를 import 하는지, namespace는 어떻게 명명되어 있는지를
살펴봐.
5. 내가 이 프로그램을 만든다면 어떻게 만들까 고민해 보자.
6. 찾아낸 사실에 기반한 문서로 만들자.(ppt, flowchart, 구성도, 마인드맵)
7. 찾아낸 사실을 문서로 만들고 프로그램 흐름에 맞춰 가정과 결론을 나중에 찾아볼 수 있게 주석으로 달아놓자.
8. 분석을 하면서 그림/ 문서로 정리를 하자.
9. 중간중간 정리해 나가면 머릿속에 생각이 정리될 때가 많다.
10. 테스트를 사용하자
테스트는 출발점으로 적절하다. 코드 읽기에 앞서 테스트를 돌려서 환경이 제대로 구성되어 있는지 확인할 필요가 있다. 테스트에 앞서 빌드부터 성공해야 한다.
실행하고, 변경하고, 다시 실행하자(Refactoring-rewrite chunk)
나라면 어떻게 짰을까?
뭘 배웠나?
이 코드를 어떻게 하면 개선할 수 있을까?
원 작성자의 스타일로 코드를 작성해보자
=> 위 네 가지 단계에 대해 직접 적어보자.
모든 것을 분해했다면 다시 조립하면서 이해도를 높이자. 기능을 추가해서 테스트 통과 여부를 살펴보자.
다양한 코드 상태를 확인할 수 있게 로그 수준을 높여보자.
다른 사람의 코드를 읽고 이해하는 최선의 방법
아는 부분의 코드를 찾고 어떻게 작동하는지 처음부터 끝까지 추적하고,
특정 코드가 어떤 역할을 하는지 알고, 그 코드에서 어떤 코드가 그 역할을 하는지 찾아내 봐.
그리고 파일에서 어떻게 나타나는지 알아내고,
한 번 더 뒤로 가서 어디서 나왔는지 알아내!
이런 행동들을 "chain of actions"라고 해.
이 접근법을 사용하게 되면 코드 전반을 거쳐 여러 영역을 통과할 것이고,
코드의 중심이 어떻게 조직되었는지(변수 선언, 다양한 함수들의 위치)
이 사람 스타일의 코딩
어떻게 생각하고 문제 해결을 위해 코드를 작성했는지,
이런 과정을 거쳐 전체적인 코드에 점점 더 알아가게 되지.
칠흑 같았던 어두운 방에서 조명에 의해 점점 방의 모습이 드러나게 된다.
Using “chains of actions” to gradually understand a never-before-seen piece of code
꾸준히 반복해봐.
코드 전체가 하나 이상의 복잡한 문제를 다루도록 설계되어 있기 때문에 항상 위와 같은 과정을 거쳐야 해.
각 부분의 코드들이 어떻게 연결되어 있는지 알아갈수록, 전체적인 코드에 대해 이해하게 되지.
좋은 퀄리티의 노출이 중요한 이유는 무엇일까!?
예시로 병아리 감별사의 성장기를 들어볼게.
(새로 온) 병아리 감별사가 충분히 피드백에 노출되었을 때, 뇌는 무의식적으로 패턴과 기본 구조를 알아낸다.
더 많은 노출되면, 뇌는 그 지각력을 미세하게 조정하고, 결국 무엇이 진짜인지 알아낸다. 뇌는 설명할 수 없더라도 더 미세하게 구별하고 소음과 신호를 구별한다.
지각적 지식은 우리가 생각하는 전문적인 직관을 포함한다.
비록 알고 있는 것을 정확히 말할 수는 없지만 어떤 체스를 즉시 움직여야 할지 혹은 이 그림이 위조품이라는 것, 혹은 이 집이 폭발할 것이라는 것 혹은 코드에 문제가 있다는 것 등 이런 능력들이 있다.
프로그래밍을 오래 할수록, 코드 샘플을 많이 볼수록, 다른 사람의 코드를 이해하기 쉬워지고 빨라져.
또한 레퍼런스 활용에도 강점을 갖고 과거의 코드를 한눈에 이해하게 돼.
소프트웨어 장인
레거시 코드로 일하는 것은 거대한 직소 퍼즐을 푸는 것과 비슷해!
모든 퍼즐 조각들 한꺼번에 펼쳐놓고 맞추려 들면 도통 진도가 나가지 않지, 그럼 어떻게 해야 할까?
각 조각을 그룹으로 나누고 모서리나 경계선부터 시작해야 맞지.
조각들을 색상이나 패턴을 기준으로 분리해서 모아두어도 도움이 되고,
몇 가지 작은 그룹들이 만들어지면 큰 형태가 머릿속에 그려져.
시작할 때는 한 무더기의 무작위적인 조각 모음이었지만, 약간은 정리된 작은 그룹의 조각 모음으로 만들 수 있어.
먼저 각각의 작은 그룹들에 대해서 조금씩 조각을 맞춰봐.
즉 점진적으로 기존 코드에 대한 테스트 코드를 작성하면서 코드에 대한 이해도를 높이고 리팩토링을 해나가고,
몇몇 조각들을 맞추는 데 성공하면 전체 그림의 일부분을 볼 수 있어.
이 단계에서는 뭔가 실질적으로 손에 잡히는 것을 얻을 수 있기 때문에 조금 더 자신감이 생기도 해.
이어 붙인 조각들이 많아질수록 남은 조각들을 이어 붙이기가 더 쉬워지고, 전체 지그소 퍼즐의 완성 형태가 보이기 시작한다.
레거시 코드를 다루는 것은 직소 퍼즐을 맞추는 것과 너무나도 비슷해.
개선하는 코드 조각이 하나씩 늘어날 때마다 코드 전체를 개선하고 싶은 욕구가 일어나고,
이러한 성취감은 코린이들에게 큰 보상이 되지.
처음에는 그냥 보는 것만으로도 벅차던 코드가, 이제는 특별한 노력이 없어도 소설책을 읽듯이 스토리까지 이해된다면 얼마나 좋겠어?
주니어를 벗어나 시니어로 변태 중인 우리 코린이들 다함께 힘내자 ^^