같은 출판사에서 나온 <Geek>은 애플 컴퓨터의 역사라면 <안드로이드 뜻밖의 역사>는 안드로이드 창세기이다.

재미있게 일으면서 안드로이드의 성공에 대해, 빅테크의 전쟁에서 잘 알려지지 않은 모습을 많이 알게 되었다.

 

 

 

p7 안드로이드의 멋진 점 한 가지는요. 거의 모두가 이런 일을 전에 해봤다는 거예요. 나는 이미 실수해 봤고, 그 실수로부터 배운 게 있는 일을 하고 있어요. 모두가 그렇죠

 

p20. 우리 대부분은 안드로이드를 만들기 전에 수많은 실패를 겪었어요. 상황이나 시기나 다른 무언가가 성공하는데 들어맞지 않았죠... 그렇지만 우리는 계속 시도했고, 각각의 실패로부터 배웠고, 거기에서 얻은 지식을 안드로이드를 개발하는데 적용했습니다.

 

p.51  구글은 똑똑한 엔지니어는 어떤 종류의 프로그래밍 작업이든 할 수 있다는 믿음을 가지고 있었다.  

 

p.81 (SD카드를 키웠다 뺏다 하는 테스트) ... 로봇을 이용해 폐쇄 루프를 만들었고, 그 덕분에 시스템이 확실히 동작할 때까지 모든 버그를 추적할 수 있었다.

 

p.86 내가 커피를 흘릴 확률은 내가 움직이는 속도에 비례한다. 실행속도에도 그만한 절충이 따른다.

 

p.94.  전원이 어디에 쓰이고 있는지 알 수 있도록 계측 instrumentation 기능을 추가한 것이다.... 문제가 어디에 있는지 알게 되자 그 문제를 해결할 수 있었다.

 

p.105  루빈은 어려운 결정을 해서 조직이 재빨리 실행에 옮길 수 있도록 하려는 경향이 있었다. (앤디루빈이 안드로이드의 기본 언어를 자바로 결정하는 과정)

 

p.106. 누군가 그걸 좋아했기 때문이 아니라 플랫폼이 성공하려면 타당했기 때문이고, 팀이 거기에 적응한 것이다.

 

p.138 우리는 정말 좋은 솔루션에 투자하는데 우선순위를 두지 않았습니다. 그냥 바로 시작해서 결과를 내놓고 그걸 반복할 수 있다고 증명하자였어요.

 

p.146 가상 GPU를 만든 접근 방식은 안드로이드가 초기에 취한 제품대 플랫폼 접근 방식의 예이다. 플랫폼 접근 방식은 첫 출시 이후로도 확장할 수 있는 소프트웨어 레이어를 만드는  것.... 1.0을 만들면서 신속하고 실용적인 결정을 내렸다. 

 

p.176 팀은 일을 어떻게 해야 하는지에 관해 회의를 하거나 위원회를 열거나 논쟁을 벌이는데 시간을 많이 쓰지 않았다. 그래서 누군가가 해법을 단숨에 만들어 내면 일이 거기서부터 진행되었다. "한다고 하고 그냥 하는 사람은 많지 않아요. 사람들 간에 많은 토론이 벌어지지만 그 일을 하는 사람이 착수하게 되는 거죠." "안드로이드에서 가장 존경받는 건 그냥 뭔가를 이뤄 내는 누군가죠"

 

p.178. 안드로이드는 성능을 얻거나 출시일을 맞추기 위해 절충을 하는 것으로 유명했지만, 팀은 특정 제품 기능을 위해 어설픈 해킹을 하기보다는 범용적인 플랫폼 기능을 만드는데 우선순위를 두었다.

 

p.226 디자이너로서 업무는 제품이 무엇을 상징하는지 소통하는 것

 

p.335 누군가 문제를 발견하면 해법을 강구해 냈다. 그것도 아주 빨리.

 

p.337  다른 회사들은 사람들이 한 일을 보고 채용하고 그 일을 더하라고 한다. 구글은 어떤 사람인지 보고 채용하고 그들에게  필요한 일은 뭐든 하라고 한다. 그 사람이 과거에 한 일은 그들이 무엇을 할 수 있는지 보여주는 훌륭한 예이지만, 구글이 보기에는 그들이 할 수 있는 일로 그들을 제한할 필요는 없었다.

 

p.368 히로시는 어떻게 돌아가는지 이해하기 위해 나와 함께 세부 업무에 기꺼이 뛰어들었어요.... 성실하게 일하면서 정확한 질문을 하기에 충분한 기술적 지식도 갖추려면 어떻게 해야 할까요? 그게 그가 여기에서 일하는 이유죠.

 

p.373 다양한 하부 팀 사이의 차이점을 다루는 것. 개성을 잘 엮는 일. 엄청나게 재능 있는 사람들로 구성된 작은 팀이 큰 팀을 이길 거라는 점.... 그러나 재능과 에너지가 있으면 대인 관계와 아키텍처에서 충돌이 날 수 있습니다. 그 부분을 내가 잘 중재했죠.

 

p.377 나는 m1, m2 등 몇 가지 초기 이정표를 만들었는데, '각 이정표마다 무엇을 끝낼 수 있을까요?'라는 질문을 던졌습니다.

 

p.381  아무개는 모 팀 소속이에요라고 하지 않았어요. 도움이 필요하면 뭐든 요청했고 할 수 있는 사람은 누구나 뛰어들었죠

 

p.391  플랫폼이 되는데 집중했죠. 제대로 된 앱이 없고 순수한 플랫폼만 만든다면  악순환을 끊지 못하죠. 사람들이 필요로 하는 걸 만들지 않을 거고요. (Be는 틀에 박혀서  논쟁만 했다는 맥락.)

 

p.401 혁신에 열려있고 시도하는데 개방적인 문화를 나는 좋아했어요... 그러한 접근방식에는  장단점이 있어요. 확실히 전에 이런 일을 해본 사람들은 무엇을 해야 하는지 압니다.

 

p.411 내가 그렇게 똑똑한 엔지니어라고 생각하지 않아요. 하지만 기를 쓰고 일하죠. 그저 열심히 건강에 해로울 정도로 오래 일해서 경험 부족을 보충했어요.

 

p.434 애플은 소비자 브랜드다. 구글이나 MS처럼 기술, 엔지니어, 엔지니어링 자체를 중시하는 회사가 아니라 기술을 가지고 만들어진 소비자 제품을 중시하는 회사다. 매끈하고 세련되고 일관된 모습을 세상에 선보이는 것이 소비자 브랜딩 접근 방식의 일부이다.

 

p.456 현실에서 사용하는 앱을 작성하는 일은 사용자에게 더 많은 기능을 제공할 뿐 아니라 플랫폼 개발자가 앱 개발자 점에서 플랫폼을 이해해서 향후 버전에는 더 나은 API와 기능을 넣는데 도움이 된다. 고쳐야 할 버그를 찾는데도 도움이 된다.

 

p.487 우리는 기술적인 것에 의해 움직여 왔는데, 기술적인 기초는 있으니 이제는 진짜 시장이 이어받게 해야 했어요. (넥서스 원과 드로이드 마케팅을 바라보는 개발자 관점)

 

p.493 기술과 기기는 사업과 판매가 향하는 방향을 따라갑니다. 실은 마케팅과 판매 전략이 주도해서 도약할 수 있고, 기기가 더 좋아지는 것.

 

p.502 팀 크기가 작다는 것은 프로젝트를 끝내기 위해 모두가 엄청나게 열심히 일해야 함을 의미했지만, 더 효율적이 되어야 한다는 뜻이기도 했다.

 

p.503  한 사람이 위에서 이런 결정을 내리면 팀과 제품은 목표를 향해 전진하게 됩니다. 그게 결정이고 설사 옳지 않은 결정이라 해도 결정이 내려졌으면 앞으로 나아가야죠. 움직이지 않는다면 조종할 수 없어요.

 

반응형

 

 트위터에서 위 그림을 보게 된 것이 이 글을 쓰는데 출발점이 되었다.그림에서는 너무 재미있게 표현했지만, 디버깅도 나름의 전략이 필요하다.

 

 버그라는 것은 언제 발생하는가? 대다수의 버그는 개발자가 코드를 작성할 때 가지고 있던 문제에 대한 인지모델이 실제 현실과 다를 경우 발생한다. 개발자의 머리속에 모습을 갖춘 모델은 개발자의 편향이 반영되어 있으므로,  기대한 동작과 현실동작이 다를 경우 이러한 편향성을 극복하기 위해 잠시 걷거나(일종의 context switching), 설명서를 읽거나, 문제가 될만한 지점에  중단점을 설정한 다음 주변 코드를 살펴보면서 자신이 가진 모델/이론의 한계나 문제점을 극복하는 계기를 마련해야 한다. 비슷한 경험을 가진 다른 사람과 이야기를 나눠보는 것(구글링 첫번째 페이지)이나 누군가에게(자신 포함) 문제를 설명하면서 모델을 객관적인 시선으로 재검토해보는 것(오리인형/테디베어에게 말걸기)등의 방법이 있다. - 나는 코드 리뷰도 같은 맥락으로 바라본다. 코드 커밋 이전에 제 3의 시선으로 코드를 살펴 보는 것이 코드 리뷰의 진짜 가치아닐까? 다른 사람이 코드를 검사한다는 행위 자체는 중요한 포인트가 아니라고 생각한다.

 

하지만 위 그림에서도 나와있지만 대부분 너무 쉽게 Print문을 찍거나, 그냥 반복실행해 보면서 정상동작하기를 기대하는 경우도 많다. 물론 Print문을 찍는다고 문제가 될 것은 아니다. 정작 중요한 것은 그렇게 메시지 출력을 찍어가면서 머리속에 자신이 작성한 코드의 동작 모델을 재 검토하고 수정/보완할 수 있는지가 중요하다고 생각한다. 반복 실행도 마찬가지.. 전략없이 문제를 바라보면 해답을 찾을 수 없다.

 

아인슈타인이  이런 말을 남겼다.

" 어제와 똑같이 살면서 다른 미래를 기대하는 것은 정신병 초기증세이다.
insanity : doing the same things over and over again and expecting different results."

 

그러면 디버깅하는 접근법은 어떤 것들이 있을까?코넬대 전산과 수업중 한 강의 내용을 소개한다.

 

  • 코드를 점진적으로 개발하면서 자주 테스트하기다. 그러다 보면 마지막 변경 코드부분이 원인일 가능성이 높다. 중요한 것은 버그/오류의 영향력을 지역화(국소화;localization)시키는 것임.
  • 로그 많이 남기기. 많이 남기기만 해서는 덜 유용. 시각화 도구를 작성하면 원인 파악이 용이
  • Assertion 도구 사용.
  • 디버거 사용.: 중단점 설정. 함수 코드 이해, 실행중 선택 지점에서 메모리 내용 검사하면 런타임에 정보를 얻을 수 있음.
  • 역추적: 문제가 발생한 지점에서 부터 호출한 코드로  역으로 추적해 가는 기법
  • 이진 검색: 오류원인이 증상이 발생한 코드 부분과 거리가 멀면 역추적이 힘듦. 분할 정복 방식으로 코드를 탐색하여 버그 찾기.
  • 문제 단순화: 버그와 관련이 없는 코드를 점진적으로 제거하면서 문제가 될만한 부분 찾아가기
  • 가설 수립을 통한 검증.
  • 버그 클러스터링: 버그 보고를 카테고리로 나누어 분석하기.
  • 오류 감지 도구: Coverity등의 도구를 사용하기
  • 버그가 발생한 위치는 예상과 다를 수 있다. 열린 마음 유지
  • 뒤집어 생각해 보기: 버그가 없는 곳은 어디인지를 스스로 물어보다보면 원인이 되는 코드를 찾을 수 있음.
  • 버그가 없다고 생각한 이유를 자신/타인에게 설명하기 -> 문제를 명확히 하려다보면 버그가 발견될 수 있음
  • 입력 데이터 검사하기
  • 올바른 소스코드인가 살펴보기
  • 휴식 취하기

 

소프트웨어를 개발하면서 버그는 피할 수 없다. 하지만 같은 버그를 오랫동안 만나고 싶지는 않다. 전략적으로 접근하여 버그를 자주 만나지 말고, 만나더라도 오래 보지 말자.

 

반응형

+ Recent posts