2014년 11월 24일 월요일

JavaScript Timer가 어떻게 동작하는가?

얼마전 JavaScript timer가 궁금해서 찾던 중 아래 글을 발견하고
JavaScript timer의 동작에 대해서 알게 되었음.

How JavaScript Timers Work, John Resig
http://ejohn.org/blog/how-javascript-timers-work/

작성된지는 꽤 오래전 글이라 다른 블로그에서 잘 다루고 있음.
http://holdonj.tistory.com/9


내용을 대충 정리하면 아래 두 함수는 JavaScript 코딩 중에 일정 주기로 코드를 실행되게 할 때 사용하는 함수들이다.

- setTimeout(fn, delay) : delay 이후 실행되는 single timer
- setInterval(fn, delay) : delay 마다 실행되도록 하는 주기적인 timer

함수의 효과는 동일하게 느껴 지지만 실제 사용할 때는 아래 사항들을 알고 사용해야 한다.

- JavaScript timer의 delay는 보장되지 않는다.
- JavaScript 코드는 실행가능한 조건에서 실행되며 이는 웹브라우저가 single thread상에서 비동기적 event들(mouse click, timer 등)을 처리하기 때문이다.

이를 아래 그림을 통해 자세히 설명 하고 있다.





위 그림 내에서
왼쪽의 숫자들은 시간(ms단위)를 의미하고, 오른쪽은 비동기적 event들을 나타내고,
중간의 블럭들은 실행되는 JavaScript 코드들이다.
 * JavaScript 코드들은 single thread 상에서 처리되므로 하나의 한 block만 처리된다.

시간 순서대로 보면 

- 20ms 내에서는 순차적으로 timer, mouse click, interval event들이 발생된다. 
 . mouse click 발생 시 event cb(callback)를 Queue에 등록한다.
 . 10ms 이후 등록된 timer cb을 실행되려 하지만 아직 JavaScript 코드가 실행중이므로 Queue에 등록한다. (Queue : mouse click event cb, timer cb)

- 20ms 전, JavaScript 코드가 완료되면 Queue의 첫번째 mouse click event cb을 처리한다.
 . 20ms 시점에 mouse click event cb처리 도중 interval cb이 실행되려 하지만 실행할 수 없어 Queue에 등록한다. (Queue : timer cb, interval cb)

- 30ms 전, mouse click event cb이 완료되고 Queue의 첫번째 timer cb이 실행된다. 
 . 30ms 시점에 interval cb을 실행하려 하지만 역시나 실행할 수 없는 상태라 Queue에 등록해야 하지만 브라우저에서 drop 시킨다. 
   > 긴 코드의 실행 시 발생되는 interval cb이 모두 Queue 등록되어 처리가 된다면 코드 완료 후 연속적인 interval 등록 코드들이 호출 되므로 브라우저에서 interval cb의 기등록 여부를 판단하여 drop 하는 것으로 보임.
 . 35ms 이후 timer cb이 완료 되고 Queue에 있던 interval cb이 실행된다.

- 40ms, interval cb이 실행되려 하지만 역시나 실행할 수 없는 상태라 Queue에 등록 (Queue : interval cb)
 . 40ms 이후 intervale cb이 완료되고 Queue에 남아 있던 interval cb이 실행된다. (Queue : nothing)


정리해보면
- JavaScript engine은 single thread 기반이라 비동기 event들을 queuing하여 실행한다. 
- setTimeout, setInterval은 비동기 코드를 실행하는 방법이 근본적?으로 다르다.
- timer cb의 실행이 block될 경우 다음 가능한 시점까지 delay된다.
- interval cb의 실행 시간이 delay보다 크다면 delay 없이 반복적으로 계속 실행 될 수 있다.


추가로 예제 코드를 보면

  1.   setTimeout(function(){
  2.     /* Some long block of code... */
  3.     setTimeout(arguments.callee, 10);
  4.   }, 10);
  5.   setInterval(function(){
  6.     /* Some long block of code... */
  7.   }, 10);

함수 정의 상으로는 두 코드 모드 10ms 간격으로 실행되는 것이 맞지만
setTimeout은 long code block이 실행된 뒤 10ms 이후에 실행 시도 하는 것이고
setInterval은 long code block을 이전 코드 실행완료 여부에 상관없이 10ms 간격으로 실행 시도 하는 것으로 차이가 있다는 것을 판단할 수 있을 것이다.


- 추가로 10ms 이하로 시간에 특정 코드를 호출하는 방법에 대한 포스팅

setTimeout with a shorter delay, David Baron
http://dbaron.org/log/20100309-faster-timeouts

2014년 11월 23일 일요일

답을 내는 조직, 방법이 없는 것이 아니라 생각이 없는 것이다


답을 내는 조직 : 방법이 없는 것이 아니라 생각이 없는 것이다
김성호 저 | 쌤앤파커스 (읽고 보니 쌤앤파커스
http://news.khan.co.kr/kh_news/khan_art_view.html?artid=201409172149355&code=940202 )

http://www.yes24.com/24/goods/7960047?scode=029



도서관에 있길래 빌려 봤음.
서점 순위에 스테디셀러로 올라와 있기도 했었고.. 일본전산 이야기의 저자 이기도 해서 이다.
사실 일본전산 이야기는 보진 못했다. 몇몇 사람들이 특이한 회사라고 말하며 이야기를 했었지만 그냥 좀 색다른 회사의 이야기로만 들렸었다.

암튼, 제목에서 보다시피 좀 과격한 문구("너가 생각이 없는거야" 라고 들리는)가 눈길을 끈다.
나이가 조금씩 들며 조직에서 뭔가 정체되어 가고 발전이 더뎌지는 잉여 취급이라 더욱 저 문구가 대여를 하게 만든 이유가 아닌가 생각 되기도 한다.


책에서는 내내 뛰어남 보다는 근성을 가지고 끝장을 보라는 얘기를 자주 한다. 조직 내에서도 4가지 분류의 특성을 가진 사람들이 존재 하는데 그 중에서 해결사형의 타입이 성공을 하게 된다는 이야기다.

"내가 분명히 지시했는데도 대충 해놓고 다 했다고 손 놓는 부하 직원이 있다. 일을 할수록 오히려 방해만 된다."
"시키지 않으면 꼼짝도 안 하는 삼류직원 때문에 골치 아프다."

예로 책에서 후지 필름 이야기가 나온다.
난 후지필름이 워낙 잘 나가는 것 처럼 보여 문제가 없었던 것 같았는데 책에서는 주력인 필름 산업이 급격히 축소되어 이를 해결하고자 구조조정, 비용 절감을 바탕으로 하여 끊임없는 노력을 통해 화장품과 의약품 쪽으로 신규산업을 확장해서 위기를 벗어났다는 이야기를 해준다. 그리고 책에서는 성공에 안주해 늦게 대응했던 코닥에 비해 악착같이 달려 들어서 발전하려는 몸부림이 후지필름에 있었다는 것을 강조하며 근성의 필요성을 말해 주었다.


책에서는 조직 구성원의 4가지 유형을 '평론가형', '무기력형', '막무가내형', '해결사형'을 언급하고 있다. 이 유형들을 보며 좀 반성한 것이 배우겠다는 의지가 없고 소통할 기회를 만들지 않고 무슨일에든지 겁부터 내고 자기 생각이 아니라 '안 된다'는 남들 이야기에 의존하는 것이 무기력형인데.. 꼭 나를 말하는 것 같았다.

또한 책 중반부에서 "진정한 답을 나올 때 까지 고민하고 남들과 싸워라"라고 하는데 실제 얼굴 붉히며 싸우라는 것이 아니라 남들과 논쟁을 해서 제대로 된 해법을 찾으라는 것을 강조하고 있다. 실제 나의 경우 책에서 말하는 bad case 직원인 '좋은 게 좋은 거지'라고 생각하며 싸움을 피하는 경향이 있는데 '제대로 논쟁을 즐길 줄 아는 직원'이 되고자 노력해야 겠다는 생각을 곰곰히 하게 되었다.


교육의 중요성을 말하며 두산그룹의 "사람이 성장하고 사업이 성장한다.", 조선시대 거상 임상옥의 "장사는 이문을 남기는 것이 아니라 사람을 남기는 것" 언급 하는데 진정으로 맞는 말인것 같다. 회사나 조직 입장에서 인력들의 성장을 위한 방법, 시간을 제공하는 것이 필수 인것 같다.


책 후반부에서 답을 찾는 5단계를 말하고 있다.
1. 일을 제대로 이해하기
2. 문제가 보이도록 자신을 두기
3. 답을 생각하는 시간 갖기
4. 답을 찾아 시행착오 건너기
5. 논쟁으로 답을 완성하기

각 단계에 동의 하며 그중 내가 생각하기에 가장 못하는 것은 5번인데 책에서는 나같이 "동료들끼리 목소리 높이느니 내가 조금 양보하겠다"며 논쟁에서 물러서는 사람을 '문제적 직원'으로 말하고 있다. 논쟁을 통해서 최고의 대안을 찾을 기회를 아예 차단해 버린다는 이유를 들고 있다.


조직에서 좀 정체된 상태에서 매사에 한걸음 물러나 방관자적인 시점에서 일을 하고 최선의 답을 찾기보다 쉽고 간단히 처리할수 있는 방법을 찾아하는 나에게는 도전을 주고 다시금 성장할 수 있도록 해주는 책같아서 개인적으로는 두고 보고 싶은 책이다.