วิธีเรียนรู้

เดี๋ยวนี้พบว่าเวลาจะเรียนของเล่นใหม่ๆ ในโปรแกรมมิ่งจะเล่น hands-on หมดแล้ว ก็คือ

### 1. เปรียบเทียบตัวเลือก

สมัยผมเรียน python ตอนนั้นก็จะมี web framework ที่ดังๆ อยู่คือ Ruby on Rails และในฝั่ง Python จะมี TurboGears Django Pylons WebPy ซึ่งเอาไปเอามาตอนนั้นผมสรุปข้อมูลว่า Ruby คือ Poor man’s Python (ซึ่งพอมาเล่น Ruby จริงๆ พบว่าไม่จริงเลย) ไม่มีอะไรน่าตื่นเต้นแบบ indentation-based block ก็เลยตัดสินใจว่าเรียน Python

อีกโอกาสนึงที่ค่อนข้างจะใหม่หน่อยคือ client-side MVC ผมก็นั่งดู backbone emberjs angular ฯลฯ ซึ่ง angular เนี่ยผมตัดออกตัวแรกเลยเพราะว่ามันใช้ syntax ที่ชวนให้ผมนึกถึง XSL ซึ่งผมเกลียด ต่อมาก็ emberjs ผมว่ามันเจ๋งสัสๆ เลย แต่ว่ามันดู magical เกินไป น่าจะเริ่มจากอะไรง่ายๆ ก่อน ก็ลงที่ backbone.js..

รอบหลังสุดนี่คือผมฟินกับ backbone แล้ว เลยจะลอง ember บ้าง ก็แอบกลับไปลอง angular อีกทีแบบไม่อคติแล้ว แต่ก็ยังไม่รู้สึกว่าโดนใจ มันใช้ศัพท์ยากเยอะเกินไป

### 2. A project

ปกติในเอกสารพวกนี้จะมีวิธี Hello world ของมันอยู่ล่ะครับ ซึ่งผมไม่เคยจะ Hello world ใน Backbone หรอก แต่มันจะมาจากว่ามี project ที่ต้องการใช้ backbone และ backbone เท่านั้น นั่นคือบอร์ด menome

บางที project เปิดตัวนี่งานเบาก็มี บางทีก็ทิ้งช่วงแล้วค่อยทำก็มี แต่ก็ไม่ค่อยดี อย่าง Ruby อาจจะเห็นว่าผมก็พยายามหาเรื่องมาทำ project แล้วเขียน series Learning Ruby ในบล็อคผม แต่ถึงจุดนึงผมหมดไอเดีย ปัจจุบัน Ruby ผมกำลังไหลกลับไป 0 แล้ว

งานอย่างนึงที่น่าสนใจเป็น project คืองานลูกค้าครับ เพราะมันจะมี requirement ที่ปกติเราไม่ทำและมีคนตรวจที่บีบให้เราต้องทำ งานลูกค้าหลายๆ ตัวผมผมใช้ library ที่ปกติไม่เคยใช้เลย​ (แต่อาจจะผ่านตา เคยได้ยินชื่อ เคยใช้ทางอ้อมเพราะเป็น dependency ฯลฯ) ทั้ง Laravel, Django โปรเจกท์เปิดตัวผมเป็นงานลูกค้าทั้งนั้น

### 3. Code! Code!

ข้าม screencast ข้าม getting started ครับ สิ่งที่ต้องทำคือ อ่าน getting started ว่ามันจัดโครงสร้าง project ยังไง มีคำสั่งอะไรมั้ย (แบบ artisan/composer/django-admin/rake) แล้วไม่เสียเวลา Hello World อยากทำอะไร เปิดหัวข้อตามนั้น

### 4. Dive into

ผมพบว่าเวลาเรียน library หลายตัวทำงาน มันจะมีบางจุดที่เอกสารคู่มือก็ไม่ได้มีไว้ (เอกสารห่วย) Google ไปก็ไม่ช่วยเท่าไร

มันจะมีกุญแจดอกท้ายๆ ครับคือ API Docs ซึ่งถ้ามันไม่ช่วย มันมักจะมีลิงก์ไปหาซอร์สโค้ดของเมธอดหรือคลาสนั้นๆ แล้วก็ไปนั่งศึกษาดู บางทีอาจจะต้อง extend มาเขียนเอง

ตรงนี้ผมเจอจริงจังหนแรกใน Backbone.js ครับ ต้องเข้าไปไล่ซอร์สมันเลย ซึ่ง Backbone.js ก็ดีตรงที่ว่ามี annotated source หรือโค้ดที่มีคอมเมนต์กำกับให้ละเอียดยิบให้ และโค้ดมันเองค่อนข้างสั้นสามารถศึกษาเข้าใจทั้งหมดได้ไม่ยาก งานเร็วๆ นี้ผมก็มีอันนึงที่ใช้ Laravel ซึ่งตัว FormBuilder มันจัดการกับ relationship ไม่ค่อยดีเท่าไรและลูกค้าผมอยากได้ข้อมูลเป็นพ.ศ. ผมก็เลยต้อง extend FormBuilder เองซึ่งก็ช่วยให้ผมเข้าใจระบบฟอร์มของ Laravel พอสมควรเลย

อย่างนึงที่จะได้จากการอ่านโค้ดชาวบ้านคือสไตล์และแนวคิดของเค้าครับ โค้ดคนอื่นอันแรกที่ผมอ่านคือ SMF ซึ่งผมก็ยังเห็นว่าปัจจุบัน SMF ไม่ใช่อะไรซับซ้อน ผมเริ่มจากการศึกษาการทำงานของ mod มันก่อน เพราะมันเป็นส่วนเล็กๆ ที่ไปเกาะ ดูว่ามันเกาะกับอะไร อย่างไร อันถัดมาหลังจาก SMF ที่ควรพูดถึงคือ Drupal ซึ่งควรอ่านมากๆ เพราะว่าฟังก์ชั่น Drupal แต่ละอันเล็กสั้นเข้าใจง่ายครับ [ระบบ Permission ของ Drupal](https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_access/7) ยังมีอิทธิพลต่อแนวคิด[ระบบ permission ของผม](https://github.com/whs/Sora/blob/master/code/publisher/lib.inc.php#L52)ในปัจจุบัน

————

ทั้งหมดนี้คิดว่าคือขั้นตอนเรียนรู้ของผม อาจจะเอาไปใช้ก็ได้ครับแต่คิดว่าอาจจะต้องมีประสบการณ์พอสมควรมาแล้วที่จะเดาได้ว่าเมธอดน่าจะชื่ออะไร (ซึ่งทำให้เวลาเขียน Objective-C ผมเลยไปไหนไม่ถูกเพราะเดาไม่เคยถูก)