เพิ่งไปอบรม SCJP @ CSIT-NU (สนับสนุนโดย SIPA สาขาเชียงใหม่)

ในช่วง 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 วันที่ได้อบรมนะ เดี่ยวจะมาเล่าต่อว่ามีอะไรอีกบ้าง ;)

Akkkkkkk Final Exam !!!

ช่วงนี้ต้องเร่งปั่นงานเก่าให้เสร็จแถมรายงานที่ค้างอาจารย์ท่านไว้อีก 1 งาน ต้องปั่นให้เสร็จก่อนสอบ (ส่งรายงานก่อนวันพุธนี้ เพราะวันพุธสอบ Programming Lanugage แล้ว) ส่วนวันจันทร์ (ที่ 25 กันยายน 49) สอบ Computer Graphics เป็นวิชาที่เราเรียนแล้วรู้ว่าเอาไปทำอะไรยังไง แต่ไอเดียมันไม่เกิดเท่าไหร่ คือ concept น่ะได้ แต่เวลาสอบให้เขียนโค้ดเพียว ๆ ซึ่งผมเป็นพวกไม่ค่อยชอบจำเรื่องพวกนี้มาสอบ เพราะดูแล้วมันไม่มีประโยชน์อ่ะ อยากได้แนวที่เป็นไอเดียมากกว่าที่มานั่งจำ ๆ มาสอบ ส่วน วิชา Compilers นี่ไม่ค่อยหนักใจเท่าไหร่ เพราะว่าตั้งใจกับวิชานี้มาตัั้งแต่ต้น เลยทวนๆ เล็กน้อย แถมอาจารย์ให้โอเพ้นได้ แต่กลัวว่าโอเพ้นมันจะไม่ดีน่ะดิ เพราะว่าสิ่งที่สอบมันจะเป็นอะไรที่ประยุกต์มาก ๆ ซึ่งไอ้เราน่ะไม่เท่าไหร่ เพื่อนๆ เรามันจะไม่รอดเอา –-‘ ส่วน Programming language ก็กำลังนั่งอ่านและทำความเข้าใจอยู่ โดยรวมเป็นวิชาที่ดี เพราะทำให้เราเข้าใจรากเง้าของ concept การเขียนของแต่ละภาษาโปรแกรมมิ่งซึ่งเอามาใช้ในการเขียนตอนทำงานได้ เพิ่งรู้ว่า loop while ใน java มันเป็น chekc comparison และตรวจสอบออกมาเป็น boolean type ไม่ใช่ numeric type แบบ c/c++ หรือ php ซึ่งอย่าง c++ และ php เนี่ยเจ้า boolean type มันมีค่าเท่ากับ numeric type ที่ 0 และ 1 แต่ java มันแยกออกมาเลย ทำให้ 0 มันไม่เท่ากับ false และ 1 ไม่เท่ากับ true –-‘

class test2 {
    public static void main(String[] args) {
        int x = 1, y = 6;
        while (y--) {
            x++;
        }
        System.out.println("x=" + x + " y=" + y);
    }
}

ลองเอา code ด้านล่างไปลอง run ดูดิ มันไม่ทำงาน แต่ลองแปลงไปลง php กับ c++ นี่ผ่านอ่ะ –-‘ ถ้าคิดว่าเขียน style c/c++ มาจะเล่นกับ java คงต้องอ่านข้อยกเว้น หรือข้อกำหนดที่เค้าเน้นไว้เยอะ ๆ ไม่งั้น bug ตรึมแน่ ๆ นี่เจอในข้อสอบ SCJP มาหยอกๆ เช่นกัน –-‘ ชอบออกข้อยกเว้นมาให้เรามึนหัวเล่นๆ ซะงั้นอ่ะ T_T