JavaScript Web Workers #2

ผมเขียนเรื่อง Web Workers ตอนแรกไปแล้ว วันนี้จะมีเขียนต่อในกรณีที่เราอยากจะ include JavaScript Library อื่นๆ เราจะทำยังไง

ก่อนอื่นต้องย้ำว่าตัว Worker นั้นไม่สามารถจะเข้าถึงพวก DOM Element ใดๆ ได้เลย Library ตัวไหนมีเรียกพวก DOM พวกนี้ include เข้ามาจะเจ๊งเลย ดังนั้น Lib อย่าง jQuery ก็เรียกไม่ได้แน่นอน

คำสั่งที่เราใช้ include JavaScript คือ importScripts() ที่เราจะ include ครับ เช่น

importScripts('underscore-min.js');

ที่นี้มาดูตัวอย่าง JavaScript Worker ที่เรียกใช้ underscore.js เพื่อใช้ยัด JSON จาก Worker ต่อท้าย JSON ที่ master ส่งให้ worker

//master_worker.html
<script language="javascript">
	window.onload=function(){
		var wk=new Worker("./slave_worker.js");
		wk.addEventListener("message",function(oEvent){
			document.getElementById('display').textContent = JSON.stringify(oEvent.data);
		},false);

		wk.postMessage({
			master:'This is master Say Hello'
		});
	};
</script>
</head>
<body>
	<div id="display"></div>
</body>

Code master_worker.html ข้างบนเรียก Worker จาก file slave_worker.js แล้วเราก็ส่ง JSON {master:’This is master Say Hello’} ไปให้ทาง function postMessage

//slave_worker.js
importScripts('underscore-min.js');

self.addEventListener('message',function(e){
	var data=e.data;
	self.postMessage(_.extend(data,{worker:'This is worker Say Hello'}));
},false);

Code slave_worker.js ก็รับ JSON {master:’This is master Say Hello’} มาทาง addEventListener ‘message’ แล้วก็ยัด JSON {worker:’This is worker Say Hello’} เข้าไปด้วย function extend ของ underscore.js ก่อนที่จะส่ง JSON ที่เพิ่ม key:value ไปแล้วให้ master_worker.html ทาง postMessage

แล้ว {master:’This is master Say Hello’,worker:’This is worker Say Hello’} จะถูกส่งมาถึง addEventListener ‘message’ ของ master_worker.html แล้วแสดงค่าใน div

ถ้าลองเปลียนเป็น include jQuery ใน slave_worker.js ดูจะเจ๊งทันที

กู เป็น API Support

แนะนำให้อ่านกู เป็น Support ก่อนนะ

ผมเคยเขียน blog เรื่องชีวิตทำงานนานแล้ว (link ข้างบนนั่นแหละ) ว่าผมไม่ได้หากินกับการเขียน code เพราะเป็น support แต่สุดท้ายยังไงๆ ผมก็หนีไม่พ้น code อยู่ดี เพราะสิ่งที่ผม support คือ api -*-

การ support api นั้นความรู้ที่จะต้องมีต่างจากการ support product อื่นๆ อย่างพวกสาย end user support หรือ server support ก็คือ

  • แน่นอนว่าต้องเขียนโปรแกรมเป็น โดยเฉพาะภาษาของ api ที่เรา support เราต้องเขียนโปรแกรมเรียกใช้ api ที่เรา support ได้
  • ต้องอ่าน code ของ dev-ลูกค้า ที่มาเรียกใช้ api เราได้
  • ต้องอ่าน code example ของ api เราที่ส่งออกไปให้ dev-ลูกค้า อ่านได้
  • ต้อง debug code ไม่ว่าจะของลูกค้าหรือ example เราได้
  • ในกรณีที่เข้าถึง code api ที่เรา support ได้ ควรจะอ่าน code พอเข้าใจ/ไล่ flow/debug/build diagnostic binary ได้ เพราะว่า No matter what the documentation says, the source code is the ultimate truth

จะเห็นว่า skill ด้านบนมันก็ไม่ต่างจาก dev เท่าไหร่ หลักๆ คือต้องเขียนโปรแกรมเรียกใช้ api เราได้ (ผมใช้คำว่าเขียนได้ คือไม่จำเป็นต้องลึกมาก แต่ยิ่งรู้ลึกๆ ยิ่งดี) ,อ่าน source code ออก , อ่าน source code ชาวบ้านออก (ประสบการณ์การเป็น outsource และการเป็น dev ใน support phase ช่วยผมได้เยอะมาก) debug เป็น ซึ่งการฝึกฝนการเป็น support api ก็คล้ายๆ กับการหัดเป็น dev คือหัดเขียนโปรแกรม, หัดอ่าน code, หัดอ่าน document , ลองมันเข้าไป สงสัยอะไร ติดอะไรก็ไปถาม dev

อ่านดูเหมือนจะไม่มีอะไร แต่ปัญหาหลักๆ ก็คือคนมาเป็น support เพราะไม่อยากเขียนโปรแกรมแล้ว …. คือไม่อยากเขียนโปรแกรมแล้วแต่ยังอยากอยู่สาย IT อยู่ คือกะจะขึ้นสายบริหารก็กะว่ามาเป็น support จะได้ management มากขึ้น -*- เราจึงมี support ที่เน้นการ managment ปัญหาให้พ้นๆ ตัว ไม่ก็โยนงานไปที่ dev เลย ดีหน่อยก็ reproduce ได้แล้วก็ส่งให้ dev ต่อโดยที่ไม่ลองหาทางแก้ไขปัญหาเองเลย

ดังนั้นจึงไม่ต้องพูดถึงการ support api เพราะส่วนใหญ่ไม่ยุ่งกับ code แล้ว skill ด้านบนเกือบทุกอย่างนี่ตัดทิ้งไปได้เลย ให้หัด support api ก็ไม่อยากจะอ่าน code, ไม่ลองเล่น example, ไม่คิดจะขวนขวายอะไร รอให้คนที่เป็นอยู่แล้วทำ powerpoint มาสอนให้เขียนโปรแกรมเป็น ให้อ่านโปรแกรมออก

เจริญล่ะมึงเอ๊ย

ป.ล. ทุกวันนี้ผมก็ยังไม่เข้าใจ require.js ที่ api ผมเริ่มเปลี่ยนมาใช้ แต่ที่ผมไม่เข้าใจคือผ่านการอ่านและลองเล่นมาแล้ว ให้ตายไงก็ไม่เข้าใจมัน (คิดว่าตัวเองยังไม่เข้าใจ JavaScript ดีพอ)