ในช่วง 4-5 วันที่ผ่านมาไม่ได้ทำอะไรเลย งานการไม่ได้ทำ เพราะเอาเวลาไปอบรม Sun Certified Java Programmer (SCJP) ซึ่งในวันจันทร์ที่ผ่านมา (วันที่ 16 ตุลาคม 49) เป็นวันทดสอบ Pre-Test เพื่อลองเชิงว่ามีคุณสมบัติพอที่จะสอบหรือไม่ โดยมีคำถาม 15 ข้อ ทำให้ได้ไม่ต่ำกว่า 8 ข้อก็ผ่านแล้ว โดยตัวข้อสอบที่ให้ทำเป็นการไล่ตัว code ของโปรแกรมที่เขียนด้วยภาษา Java ทั้งหมดเลย โดยให้ตอบว่าผลการทำงานจะออกมาเป็นอะไร ซึ่งตัวข้อสอบไม่ได้ให้หาผลอย่างเดียว แต่ยังมีข้อให้เลือกว่ามันจะมี Compilation Fails หรือ Runtime Error หรือไม่ด้วย ซึ่งทั้งสองแบบก็มีอยู่หลายข้อเหมือนกัน
โดยในวันนั้นใช้เวลาสอบไม่เกิน 30 นาที ซึ่งถือว่าเวลาน้อยสำหรับคนที่นั่งไล่โปรแกรม เพราะแต่ละข้อนั้นกว่าจะไล่ตัวโปรแกรมเสร็จก็ปาไป 2-3 นาทีต่อข้อแล้ว แถมบางข้อยาวเสียด้วย ซึ่งการสอบเราต้องทำตัวเป็น compiler เพื่อจับผิดตัว code โปรแกรมต่าง ๆ ซึ่งสอบเสร็จก็ทำถูกไปได้ 13 ข้อ ส่วนอีก 2 ข้อเนี่ยมั่วไป แบบว่าตอนนั้นเวลามันไม่ทันแล้วต้องส่งแล้วด้วย แต่ดันมั่วไม่ถูกอีก เซง ๆ (ตอนตรวจเสร็จแล้วขอดูได้ว่าเราผิดข้อไหนด้วย)
ซึ่งเราก็ผ่านการทำสอบ Pre-Test เราเลยมีสิทธิ์ในการเข้าอบรมโดยเค้าจะมีเอกสารและมีวิทยากรมาอบรมให้ โดยวิทยากรที่มาอบรมก็เป็นคนที่สอบ SCJP มาก่อนเป็นรุ่นแรก ๆ และทำงานสายนี้มาก่อนอยู่แล้ว ซึ่งสอนได้ดี และละเอียด รวมถึงเป็นกันเองมาก เลยหล่ะ โดยอบรมให้เราเป็นเวลา 5 วัน ตั้งแต่เวลา 9.00 – 16.00 (ไม่รวมพักเที่ยง) ซึ่งถือว่าทรหดมาก แต่โดยรวมก็มันดี ได้แนวคิดในการเขียนของ Java มาเยอะ และทำให้เรารู้ว่าภาษา Java นี่มันมีความหยุ่มหยิ่มในการเขียนมาก แถมใช้ความเคยชินจาก C/C++ มาเขียนบางครั้งก็ไม่ได้ด้วย
โดยในการอธิบายกลไกการจัดการ Object ใน Java แล้วก็อึ้ง ๆ อยู่ในหลาย ๆ เรื่องคือเรื่องของ String Pool หรือพวกระบบการสร้าง Object ของมันที่สลับซับซ้อนมาก แถมในตัวข้อสอบที่จะต้องไปสอบมันมีถามด้วยดิว่าเราเขียนโปรแกรมมาแบบนั้นแบบนี้ มันสร้าง Object มากี่ตัว หรือสร้าง Refference variable มากี่ตัว อะไรแบบนี้ ซึ่งมันดูเหมือนไม่มีประโยชน์ในการเขียนโปรแกรม แต่ถ้าลองใช้ลึก ๆ แล้วน่าจะทำให้เราจัดการหน่วยความจำได้ดีมากขึ้น ซึ่งการอบรมนั้นมีหัวข้อหลัก ๆ ดังนี้
- Java Platform Architecture
- Declarations, Initialization and Scoping
- Flow Control (if or switch statement, loops and iterators, assertions, exceptions and exception handling , etc)
- API Contents (Primitive wrapper classes, String VS StringBuffer, etc )
- Concurrency (Thread and Runnable)
- OO Concepts (encapsulation, access modifiers, inheritance superclass, overridden, overloaded ,is-a" and/or "has-a" relationships, polymorphism, etc)
- Collections / Generics (hashCode and equals, Data Structure, etc )
- Garbage collection
- Fundamentals (primitive data types, arithmetic operators, access modifiers, package declarations, and import statements, etc )
จริง ๆ มันมีมากกว่านี้ครับ แต่เอาย่อ ๆ ประมาณนี้แล้วกัน โดยรวมทำให้เรารู้เลยว่าการทำงานของ Garbage collector ใน Java นี่มันเป็นไปตามใจของ JVM จริง ๆ คิดจากที่ได้อบรมมา เรื่องการเอา Object ที่ไม่ได้ถูกใช้งานแล้วออกจากหน่วยความจำนี่บังคับไม่ได้เลย คือแล้วแต่อารมณ์ของ JVM มาก ๆ คือ Object ไม่ได้ถูกอ้างถึงอีก มันก็ยังคงลอยหน้าลอยตาอยู่ในหน่วยความจำ Garbage collector มันก็มองว่า Object นั้นเข้าข่ายที่จะถูกลบไปได้ แต่มันจะลบหรือไม่ก็อีกเรื่อง แถม Garbage collector เนี่ยมันจะทำงานเมื่อไหร่ก็ไม่รู้ -_-‘ เราไปปลุกมันก็ไม่ได้ ได้แต่ร้องขอไป ถ้ามันอยากทำงานเดี่ยวมันก็ทำงานเอง ถ้ามันไม่ทำ ก็คือไม่ทำ (ใครจะทำไม) เป็นซะอย่างงี้อีก ไม่รู้ว่า 1.6 มันจะเป็นแบบนี้หรือเปล่านะ โดยรวมนี่ก็อึ้ง ๆ มึนๆ กับเรื่องนี้มาก เดี่ยวว่าจะหาอ่านเรื่อง Garbage collection ทบทวนน่าจะ ok ไม่รู้ว่าภาษาอื่น ๆ มันเป็นแบบนี้หรือเปล่า -_-‘
ส่วนต่อมาก็เรื่องของ Data type ที่ในภาษา Java นี่ stric มาก จนน่ารำคาญอย่างแรง คืออย่างเราเอา ข้อมูลที่เป็นชนิด short กับ short มาบวกกันมันออกมาเป็น integer ซะอย่างงั้นอ่ะ นี่ยังไม่รวม byte อีกนะ เออ ก็แปลงดี ต้อง casting กันให้วุ่นวายไปหมด แถมในการสอบก็มีให้เห็นกันแบบนี้อีก แถมมีการเอาชนิดข้อมูล char มาใช้เป็นตัวเลขได้ด้วย โดยไม่ต้อง casting อีก โอ้วววว สับสนใช้ได้เลย เรื่องของพวก Data type นี่เป็นอะไรที่สับสนงงงวงมาก แถมการประกาศ String s = "xyz"; กับ String s = new String("xyz"); นี่ได้ Object ไม่เท่ากัน ด้วย แบบแรกจะได้ String pool 1 ตัว โดยมี s เป็น reference 1 ตัว ซึ่งมันชี้ไปที่ String Pool แต่ในแบบที่สอง มี Object 1 ตัว และ String pool 1 ตัว โดยมี s เป็น reference อีก 1 ตัว โดยที่มันจะไปชี้ Object แล้ว Object จะชี้ไปที่ String pool อีกที (เราต้องมองว่า String pool คือ 1 ตัวคือ 1 Object ด้วยนะ) ซึ่งนี่แหละทำให้ งง กันไปพักนึง โดย String pool ใน Java นี่เป็นเหมือน Database สำหรับเก็บ String ที่สร้างขึ้นมา โดยที่ String ที่สร้างขึ้นนี้จะไม่มีทางถูกแก้ไขอีกถ้าสร้างมาแล้ว แถมถ้าไอ้ตัวที่สร้างมาแล้วมีตัวที่เหมือนกันจะสร้างซ้ำ มันก็จะไม่ให้สร้างซ้ำมันจะเอา reference ที่จะสร้างซ้ำนั้นน่ะมาชี้มาที่ String pool index ที่ซ้ำกันอยู่ทำให้ข้อมูลของ String 1 pool มี reference variable 2 ตัวชี้มาที่เดียวกัน เพื่อลดการใช้งานหน่วยความจำ แต่ถ้าใครอยากได้ String แบบที่เปลี่ยนแปลงค่าได้ก็ต้องใช้ StringBuffer แทน
เฮ้อ ….. นี่แค่เรื่องเล็ก ๆ ในช่วง 4-5 วันที่ได้อบรมนะ เดี่ยวจะมาเล่าต่อว่ามีอะไรอีกบ้าง ;)