ทำไม developer ไทยเก่งๆ ถึงไม่ค่อยเป็นที่รู้จัก

คำถามจากบล็อกพี่สมเกียรติ ทั้งในเฟสและในบล็อกก็มีคำตอบจากหลายคน รวมถึงคุณหนูเนยก็เขียบล็อกตอบ จากที่ผมอ่านความคิดเห็นของหลายๆ ท่านสรุปได้ว่าเป็นการบอกวิธีจะทำให้เก่งขึ้นซึ่งมันไม่ได้ตอบคำถามที่ว่าคนเก่งแต่ทำไมไม่เป็นที่รู้จัก ถ้าเทพจริงลองไปอ่านในเว็บ blognone ตอนสัมภาษณ์คนไทยในซิลิคอนวัลเลย์ดูก็ได้ครับ มีบอกไว้เหมือนกันพวกเขาเหล่านั้นไปถึงจุดนั้นได้อย่างไร หรืออย่างตอนสัมภาษณ์คุณประเสริฐ ประเสริฐวิทยาการ เกมดีไซเนอร์คนไทยในทีม Final Fantasy XV ซึ่งคนนี้ผมก็ชอบเพราะเขาดูแลเกมส์ที่ผมชอบ ดังนั้นถ้าจะตอบคำถามนี้ ต้องมาดูกันว่าบุคคลเหล่านี้ทำไมถึงไม่ค่อยเป็นที่รู้จักมากกว่า

Continue reading

Microsoft เปิด source code ของ JDBC แล้ว

Microsoft ได้เปิด source code ของ JDBC สำหรับ SQL Server แล้วบน Github ซึ่ง Jar สามารถดาวโหลดได้จาก maven ได้อย่างเป็นทางการโดยไม่ต้องมาเพิ่ม lib ใน maven เหมือนเมื่อก่อนแล้ว และยังสามารถดาวโหลดจากหน้าเว็บของ Microsoft ตามปกติได้เช่นกัน

อ้างอิง: https://github.com/Microsoft/mssql-jdbc

Over-engineering

ก่อนจะเข้าเรื่อง over-engineering ในเชิงของการเขียนโปรแกรม ขออธิบายคำนี้ก่อน ถ้าเปรียบเทียบคำนี้กับสำนวนไทยน่าจะเป็น “ขี่ช้างจับตั๊กแตน” คือเป็นการทำงานที่มากเกินความจำเป็นเพื่อให้ได้ผลลัพธ์นั้นๆ ลองนึกภาพว่าไปซื้อรถสปอร์ตอย่างเช่นแลมโบกินีเพื่อมาขนข้าวไปโรงสี ซึ่งก็สามารถขนได้เหมือนกันเพียงแค่บรรทุกได้น้อยและค่าบำรุงดูแลรักษาแพงใหนจะค่าน้ำมันอีก ด้วยความคิดนี้หากผมพบเจอคนที่ไม่ได้ใช้รถบรรทุกมาขนของผมจะมองว่าเป็นการกระทำที่ over-engineering เนื่องจากผมมองว่าสิ่งที่ได้ไม่คุ้มกับสิ่งที่เสียไป

ปัญหาคือจะรู้ได้อย่างไรว่าเรากำลังขี่ช้างจับตั๊กแตน? แล้วจะรู้ได้อย่างไรว่าแค่ใหนพอดี? ซึ่งถ้าเรามองไปยังอีกฝั่งเขาอาจจะบอกว่า “ก็มีรถคันนี้อยู่แล้ว และเป็นการขนของชั่วคราว ถ้าเขาต้องไปซื้อรถใหม่มันก็สิ้นเปลืองกว่า อย่างเช่นย้ายหอพัก เราก็ไม่ได้ย้ายกันทุกเดือน” ดังนั้นด้วยสภาพแวดล้อมที่เขาอยู่เขาเลยคิดว่าสิ่งนั้นคือสิ่งที่เหมาะสมที่สุดแล้ว เรื่องนี้ไม่มีอะไรถูกผิดครับ จะมีก็เพียงแต่เราเอาความคิดของเราไปใช้วัดคนอื่นแค่นั้นเอง

Continue reading

Dependency injection ฉบับบ้านๆ

ฉลองครบรอบแปดปีที่เขียนบล็อกที่นี่ ขอยกกรณีศึกษา “ไม่อยาก Load test การส่งอีเมล์” เพื่อให้เห็นภาพเนื่องจากเป็นสิ่งใกล้ตัว ตัวอย่างเช่นหากผู้ใช้งานมีการลงทะเบียนในเว็บเรา ให้ทำการส่งอีเมล์ยืนยันการสมัครกลับไปหาลูกค้า นั่นหมายความว่าระบบลงทะเบียนมีความสัมพันธ์กับระบบส่งอีเมล์อย่างเลี่ยงไม่ได้ ดังนั้นหากเราต้องการทำ load test ระบบลงทะเบียนแล้วเราไม่ต้องการให้ส่งอีเมล์ไปหาลูกค้าจริงๆ จะทำอย่างไร? ถ้าเราปิดระบบส่งอีเมล์แล้วหากมีบางเหตุการณ์ที่ต้องการให้ส่งอย่างเช่นเชื่อมต่อฐานข้อมูลไม่ได้จะทำอย่างไร?

Continue reading

Enterprise Web Application คืออะไร?

คำถามนี้ได้ยินบ่อย เลยเอามาเขียนเป็น blog ไว้น่าจะดี

ตามปกติที่เราพัฒนาเว็บ เราจะสร้างเว็บหนึ่งตัวและต่อกับ database หนึ่งตัว (จะรวมหรือแยกคนละเครื่องก็ไม่เป็นไร) ไม่ได้ไปยุ่งเกี่ยวกับระบบอื่นของชาวบ้าน เช่นระบบ login เราก็เก็บ account ไว้ใน database  ของเราเอง คนอื่นไม่ได้มาขอใช้ด้วย อันนี้เรียกว่า Web Application ทั่วไป

ทันทีที่เราต้องไปติดต่อกับชาวบ้าน เช่นระบบ login ที่เราต้องไป query กับระบบ Active Directory ของส่วนกลางหรือมีการส่งรายการไปให้คนอื่นประมวลผลอย่างเช่น Mainframe หรือจัดเก็บข้อมูลโดย Data warehouse อันนี้จะเรียกว่า Enterprise Application

สรุปว่า  Enterprise Application คือ ระบบที่มีการติดต่อกับระบบชาวบ้าน ผมยังหาไม่เจอว่าต้องติดต่อกับระบบแนวใหนแล้วต้องติดต่ออย่างน้อยกี่ระบบถึงจะเรียกว่า Enterprise ได้

หัวข้อที่ยังไม่ได้รับความสนใจจนมาถึงปี 2016 (ตอนที่ 1)

ปีใหม่ทุกครั้งเราจะเห็นบทความเกี่ยวกับเทคโนโลยีที่กำลังมาแรงหรือหัวข้อที่น่าสนในปีนั้นๆ ในความเห็นส่วนตัวผมกลับมองว่าเรื่องเร่งด่วนไม่ไช่การตามเทคโนโลยีให้ทัน แต่กลับเป็นทักษะพื้นฐานที่เราควรมีติดตัวซะมากกว่า ยิ่งถ้าเป็นคนที่ต้องดูแลระบบ Enterprise ที่เป็น Legacy  และมีความซับซ้อนแล้วหล่ะก็ไม่แทบไม่มีหวังว่าจะได้ใช้เทคโนโลยีใหม่ (แต่ก็ใช่ว่าจะไม่มีหวัง หากรู้พื้นฐานที่จำเป็นแล้วทำระบบให้มันดีขึ้นและง่ายต่อการ Migrate โดยฝีมือคุณต้องเจ๋งพอตัวและต้องได้รับการอนุมัติจากเบื้องบนด้วย)
Continue reading

หยุดตรวจสอบวันที่ด้วยคำสั่ง SimpleDateFormat.parse

ไม่รู้ทำไมเวลาที่ผมย้ายโปรเจค มักจะพบว่าโค้ดในการตรวจสอบวันที่ส่วนมาก (เรียกว่าทุกครั้งก็ได้) จะใช้วิธี parse แล้วดู exception หาไม่เกิดปัญหาให้ส่งค่ากลับเป็น true นอกนั้นให้ส่งค่าเป็น false หน้าตาดังนี้

public static boolean isValidDate(String source) {
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	try {
		sdf.parse(source);
		return true;
	} catch (ParseException e) {
		return false;
	}
}

แต่สิ่งที่เกิดขึ้นเมื่อทำการตรวจสอบค่า 2008-02-2x กลับได้ผลลัพธ์ที่คาดไม่ถึง

Continue reading