소프트웨어 복잡도와 그속에서 살아남기

지난 7~8년간 Mozilla, WebKit기반의 브라우저를 공부하고 개발하면서 느끼는 것은 소프트웨어가 빠르게 복잡해지고 있다는 것이다. 처음 브라우저 엔진은 이해하기 단순했다. 다른 부분은 몰라도 Layout하고 painting하는 부분은 별 다른 복잡도를 요구하지 않았다. http로 데이터를 원격으로 불러오는 것만 다르지 일반 에디터 보다 약간 더 복잡한 구조를 갖고 있었다. 단일 process에 화면에 그리는 것도 윈도 시스템이 할당해주는 특정 메모리 공간에 그냥 그리면 화면에 출력되는 단순한 구조였다. 그러던 것이 iPhone이 나오면서, 정확히 말하면 Mobile화면에서 Full Browsing을 지원하면서 복잡한 기술이 추가되기 시작했다. Touch에 대한 더 빠른 반응성과 Painting한 결과를 재사용하도록  방식 등이 Full browsing을 위해 개발되었다. 특히, Chrome 브라우저에서 처음 시작한 Multi-Process 모델과 WebGL, CSS 3D transforms과 같은 3D 그래픽이 기본으로 적용되면서 브라우저의 복잡도는 크게 증가했다.

현재는 C/C++로 다양한 Design Pattern를 적용하여 이러한 복잡한 구현을 잘 해 내고 있고, 좀 더 간결한 코드를 위해 C++11도 도입하였다. 또한, 좀 더 나은 reference counting을 위해 smart pointer를 사용하고 개선하고 있다. 하지만,  C++로 모든 기능을 구현하는데는 많은 시간과 비용이 든다. 그래서 좀 덜 중요한 기능을 JavaScript로 구현하자는 움직임이 있고, 일부는 실제 Chromium에서 JavaScript로 구현되었다. High-level 언어로 갈수록 복잡도를 추상화하기 쉽다. OOP가 그런 예이다. Script로 언어는 Native Language보다 좀 더 유연하고 자유스럽기 때문에 적은 코드로 많은 일을 할 수 있고, 안전한 코드를 작성할 수 있다. 컴퓨팅이 충분히 빠르로 메모리도 충분하다면 관리 비용을 줄이기위해 과감히 JavaScript로 일부 웹엔진 코드를 구현하려는 것이다. 아예 언어를 새로 개발하고 바닥부터 브라우저를 다시 만드는 경우도 있다.

하지만, 똑독한 개발자와 경험 많은 개발자들이 웬지 더 복잡한(?) 기술과 코드를 만들어 내고 있는 것이 모순된 현실이다.

재미있는 것은 큰 오픈소스 프로젝트의 경우 전체를 다 이해하고 있는 개발자가 극히 드물다는 것. 자신들 책임지고 있는 부분만 잘 이해하는 경우 많고, 심지어 오랜 시간 많은 개발자가 수정을 거듭하고 프로젝트를 떠난 경우, 그 누구도 이해하고 있지 못하는 코드도 많다는 것이다. 그래서 뭔가 처음 프로젝트에 뛰어들기도 어렵지만, 자세히 보면 구멍이 많은 것도 이런 이유 때문이다.

이런 현실속에 개발자는 어떻게 살아야할까?

  • 복잡한 것을 단순하게 만들어 이해하는 능력을 키워야 한다.
  • 전체를 이해하는 습관과 그 속에서 내가 구현하는 것이 부분이 어떤 관계를 갖는지 확인해야 한다.
  • 사용하는 언어의 세부적인 기능, 새로운 기능을 잘 알고 있어야한다. C++ 11이나 STL을 잘 이해하는 것이 그 예이다.
  • 각종 Design Pattern에 익숙해져야한다. Chromium 코드를 보면 온갖 Pattern의 집합체임을 알 수 있다.
  • 문서화에 익숙해져야 한다. 머릿속으로 이해한 코드를 한 번 그림과 단순한 글을 정리하는 것이 중요하다. 예) 블로그 digital artisan spirit
  • 코드를 만든 개발자가 작성한 각종 기술 문서를 외우다시피 읽어야 한다. 소스코드에도 많은 설명이 있다!

많은 사람들이 비슷한 고민을 하고 나름 해결 방안을 갖고 있다. => How do you dive into large code bases?
Happy Hacking!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s