Workaround Solution กับ Technical Debt

ก่อนอื่นของกล่าวถึงคำว่า Workaround มัน คือ การแก้ปัญหาเฉพาะหน้า เฉพาะกิจครับ เช่น ระบบจำเป็นต้องต่อกับระบบ Network ผ่านสายแลน เนื่องจากต้องการความเสถียร และความเร็ว แต่ที่โต๊ะ User ยังไม่มีการติดตั้งระบบ Networkทางทีมเสนอให้ใช้ Wireless ไปก่อน เป็นต้นครับ ถ้านึกภาพไม่ลองออกไปดูพวก Trust me I am Engineer ก็ได้ครับ ฮ่าๆ ในแง่ของการพัฒนา Software ก็มีเหมือนกัน เจ้า Workaround มัน คือ การแก้ปัญหาเฉพาะหน้า เพื่อลดเวลา หรือความยุ่งยากในการพัฒนาครับ ซึ่งส่งผลกระทบโดยตรงกับ Code และตัวระบบครับ ที่มาของการ Workaround ที่ผมเข้าใจนะ มี 2 แบบ ดังนี้ เกิดจากทีมพัฒนา เมื่องานมันเร่ง โดยมีตัวเลขค่านึง ที่ระบบต้องคำนวณ โดยมีสูตร A และสูตร B ตัว สูตร A มีคนทำไว้แล้ว พองานมันเร่ง และ BA ก็บอกว่า ลูกค้าไม่มีทางที่ต้องใช้สูตร B คิด SA และ Dev เลยตัดสินใจให้งานมันเร็ว เขียน Code ให้ใช้สูตร A แก้ปัญหาไปก่อน เพื่อให้ UAT ผ่าน แต่มัน คือ ระเบิดเวลาดีๆนั่นเองครับ เกิดจาก User บ้าง การใช้ระบบผิดวัตถุประสงค์ อันนี้เจอมากับตัวเลย ระบบงานที่ต้องมีการยุ่งกับเงินสกุลต่าประเทศ สิ่งที่มาคู่กับมันเสมอ คือ อัตราแลกเปลี่ยน (Exchange Rate) แต่เจ้าอัตราแลกเปลี่ยน มันมีมากหลายแห่ง (Price Source) เช่น Reuters, Bloomberg’s และ ธนาคารแห่งประเทศไทย (BOT) เป็นต้น…

[Spring 4.x] Overview กันสักหน่อย

จาก Blog ในตอนที่แล้ว เราได้ใช้ Spring ไปแล้ว หลายคนอาจจะใช้แบบไม่รู้ตัวก็ได้ครับ ที่นี้เรามาดูภาพรวมของ Spring ดีกว่า ว่ามันมีอะไรบ้างครับ Spring ไม่ได้เกิดมาเพื่อทำเว็บอย่างเดียวนะครับ โดยที่เรารู้จักกันเยอะเป็น Spring MVC กลับมาที่ Spring ดีกว่าครับ Spring มันเป็น Framework  ที่เกิดจากความโหดร้ายของ EJB ใน J2EE ครับ อาทิ เช่น โดยคุณ Rod Johnson ได้สร้าง Framework ที่ Lightweight  ซึงนำเสนอพร้อมกับหนังสือ Expert One-on-One J2EE Design and Development ครับ โดยมีแนวคิดคร่าวๆ ดังนี้ แก่นหลักที่คุณ คุณ Rod Johnson  คือ ตัว Spring Core (Blog ตอนก่อนหน้าเราก็ใช่เท่านี้ครับ) ที่พัฒนาออกมาในช่วงแรกครับ โดยมีชุมชนพัฒนา-เติมส่วนเสริม (Extension) ตามที่ระบบเราต้องการได้ครับ ไม่จำเป็นต้องใช้ทั้งหมด นี่แหละ Lightweight Spring Core มันมีสิ่งที่เราต้องรู้จัก ดังนี้

[CR] Sushi Express Terminal 21

ผมเจอร้านนี้จากใน Twitter ครับ เห็นโปรช่วงแรกจานละ 20 มวลมหาประชาชนล้นหลามมากครับ ผมเลยไม่ไปครับ รออีกโปรดีกว่าครับ 5 จาน แถม 1 จาน ครับ แต่ราคาจานละ 30 บาทนะครับ วันนี้จริงก็กะจะไปกิน Food Court Pier21 มากกว่าครับ หลังจากเดินมาราธอนในงาน Mobile Expo มาครับ และวันนี้ก็หิวด้วย เพราะ ยังไม่ได้กินอะไรเป็นมื้อจริงๆจังๆเลย มีแต่นมกับผลไม้ครับ พอเห็นร้านโล่งๆนี่ เข้าทางผมเลยครับ กินชิวๆ ไม่ต้องมีแรงกดดันครับ โปรก็อันนี้เลยครับ  5 จาน แถม 1 จาน ครับ แต่ราคาจานละ 30 บาท ผมเข้าใจว่าคนน้อย เพราะ ยังเข้าใจว่า 20 บาท แล้วอารมณ์เสียครับ อันนี้ความเห็นส่วนตัวนะครับ เพื่อนผมก็บ่นครับ หลังจากเข้าร้านมาแล้วมาดูบรรยากาศในร้านดีกว่าครับ ดูที่โต๊ะแล้วมามองที่รางบ้าง แล้วถ้าอยากกินอย่างอื่น เพิ่มหละ น้ำเปล่า น้ำอัดลม สามารถไปหยิบเองได้ครับ หรืออยากสั่งเมนูพิเศษสามารถบอกพนักงานได้ครับ สุดท้ายและการคิดเงินพนักงานนับจานครับ ไม่มีระบบไฮโซแบบในโคนันเลย เสียใจ แต่ที่พลาด คือ พุดดิ้งที่มีคนแนะนำครับ รอมานานก็ยังไม่มา ค่าเสียหายมื้อนี้ ไม่สิวันนี้ 300 บาท ครบ 3 มื้อเลย ส่วนพวก Sushi แนะนำ Salmon ครับ ใช้ได้เลย  

[Spring 4.x] Hello World in Console

หลังจาก Blog ตอนแรกที่เตรียม Tools กันไปแล้ว คราวนี้มาลองสิ่งที่ Developer ทุกคนต้องเจอกัน Hello World ครับ โดยผมมาพาทำในรูปแบบ Console Application ครับ หาาาา Spring มันทำเว็บนี้ มันต้องมีคนอุทานแน่ๆ แต่จริงๆ Spring มันเป็น Platform นึงครับ ส่วนของเว็บของ MVC เป็น SubSet ใน Spring ครับ เริ่มกันเลยดีกว่า มาเจาะลงทีละไฟล์ครับ 📌 สร้าง POJO Interface และ Class กันครับ 📌 สร้าง Bean หรือถ้าใน Spring Version ใหม่ๆจะเป็น Configuration Class เป็น Java ของเดิมเป็น XML ครับ 📌 สร้าง Main เพื่อ run as Java Application 📌 ทดสอบ Run ครับ จบแล้วครับ โดย Code ผมแปะไว้ใน Git ครับ (ได้มีโอกาสใช้สักที 555) หลายคนอาจจะงงว่า แต่ละอันที่ผมใช้ มัน คือ อะไร เดี๋ยวบทความตอนหน้า ผมอธิบายถึงแก่นของ Spring เท่าที่รู้ครับ

[Spring 4.x] กลับมา Spring อีกครั้ง

หลังจากข้ามสายไปฝั่ง M$ นานเลยย (หลังๆคงไม่มีใคนเขียน M$ แบบนี้แล้ว บริษัทไปในทางบวกมากขึ้น ยกเว้น Mobile) พอ Project Treasury ที่คาดว่าจบตาม Timeline ไม่รวมงาน End-Phrase ครับ !!! ผมพยายามคืนเวลาว่างให้ตัวเอง เพราะ เสียเวลาไปพอสมควรกับการ Estimate เวลาที่ผิดพลาด โดยมาลองรื้อฟื้น Spring ที่เคยเขียนมาเมื่อนานมาแล้วครับ เข้าเริ่มดีกว่า มาดู Tools ที่ผมใช้ดีกว่า หลังจากนั้น เราพร้อมลุยเลยครับ  หวังว่าจะมีเวลาเขียน Blog นะ    

BonChon @ Central Pinklao

หลังกจากนั่งแกะ Code ระบบงานเก่ามาเช้า ถึงบ่าย มาราธอนเลย (แต่จริงๆก็ไม่นะ มีวิ่งไล่จับตะขายอยู่ชั่วโมงนึง) หลังจากที่ทำงานตามเป้าหมายแล้ว ท้องว่างมาตั้งแต่เช้า หลังจากกินขนมปังไปชิ้นเดียว ผมเลยตัดสินใจไปกินไก่ BonChon สาขาเซ็นทรัล ปิ่นเกล้า  

[Steak] Hungry Nerd

หลังจากทำงานเหนื่อย ขึ้นงาน Product วันเงินเดือนออก ส่วนใหญ่ ผมและน้องๆที่ทำงานมันจากมาหาะไรหม่ำๆกันครับ ตัวเลือกแรกของผม คือ ปิ้งย่าง, Steak ครับ ในโครงการ CoCo Walk ที่ BTS ราชเทวี มีร้าน Steak ที่ราคาย่อมเยาว์ บริการดี พนักงานน่ารัก (คนใส่แว่น หน้าตาออกแขกๆ น่ารักครับ) สำหรับร้าน Steak เมนูโดดเด่นคงไม่พ้น สเต็ก เพราะ 80% ของเมนูคือ สเต็ก อีก 20% ที่เหลือเป็นของทานเล่น Appetizers , Soups , Salads , Burgers แล้วก็ไอศครีมครับ ลองดูภาพได้จาก Gallery ได้เลยครับ โดยเมนูที่ผมแนะนำ Steak จานใหญ่ 499 ครับ เหมาะสำหรับ 2-3 คนครับ ทานคู่กับซุปเห็ดนี่ โอเคเลยครับ กินเสร็จวิ่งแหลกก ฮ่าๆ ตำแหน่งร้านดูได้จากแผนที่ครับ

เข้าโรงหนัง ในรอบ 5 ปี

หลังจากทำงานเสร็จ ลองแกะ Code เสร็จ ระบบงานที่ต้อง Port ออกมาได้ตามเป้าหมายวันนี้ เวลาก็ประมานบ่าย 2 ผมคิดว่า เราควรจะเปลี่ยนอะไรใหม่ๆ หรือลองกล้าที่จะทำอะไรคนเดียว เช่น การดูหนังในโรงภาพยนตร์คนเดียวครับ โดยเรื่องที่ผมเลือกไว้ คือ Captain America Civil War แบบ Sound Track ลองฝึกฟังภาษาอังกฤษอีกรูปแบบหนึ่ง หลังจากลองดู Agent of Shield และซีรีย์อีกหลายๆเรื่องมา โดยหลังมาถึงที่เมเจอร์ ซีนีเพล็กซ์ สาขาเซ็นทรัล ปิ่นเกล้า สิ่งที่สะดุด คือ มีเวลาที่การแข่งหุ่นยนต์เล็กๆ ทำให้ย้อนอดีคไปตอน ม ปลายครับ ที่เคยไปแข่งขันระดับประเทศ และระดับโลก โดยใช้ชุดห่นยนต์ของ LEGO(RCX และ NXT เป็นยุคแรกเลยมั้ง) และ I-NEX กลับมาที่เรื่องหนังดีกว่า ตอนแรกผมก็ไปแบบงงๆ จากการต่อคิวมาทำให้เห็นการเปลี่ยนแปลง ดังนี้ มาที่ตัวหนังดีกว่า สำหรับ Captain America Civil War ผมมองว่าเป็นหนังที่มีที่มา มีมิติมาก ตัวร้ายก็ไม่ได้มีสาเหตุที่แบบสุดโต่ง เกิดมาเลวเลยย พระเอกก็ไม่ได้แบบดีเวอร์ มีมุมร้ายๆ และมุมดี สำหรับการดูหนังคร้้งนี้ผมชอบคำพูดของผู้พัน เฮลมุต ซีโม่ I have experience… and patience. A man can do anything if he has those. An empire toppled by its enemies can rise again, but one which crumbles from within? That’s dead… forever. ผู้พัน ซีโม่…

String .Equals() vs ==

two pigeon perched on white track light + equal

พอดีเมื่อวันพฤหัสก่อน เห็นน้องที่ทำงานใช้ Operator == ในการตรวจสอบว่า String เป็นอันเดียวกันไหม แต่ผมเห็นแล้วรู้สึกแปลกๆ มันควรใช้ Method Equals() มากกว่าครับ ใน Blog ตอนนี้ผมแสดงความแตกต่างของ .Equals() กับ == โดยผมยกตัวอย่างเฉพาะในภาษา Java และ C# ที่ผมใช้งานหลักอยู่ครับ – JAVA – C# ความแตกต่างของ String .Equals() vs == จาก Code ทั้ง 2 แบบ เราจะเห็นความแตกต่างกันของ String นะครับ (ตามตัวอย่างของ C# และ Java นะครับ) – Method Equals Method Equals: มันตรวจสอบทั้ง Reference และ Value ครับ เจ้า Method Equals() เป็น polymorphic หลายคนอาจจะงงครับ ถ้าเป็นคำว่า Polymorphism อาจจะร้องอ๋อ – Operator Equals (==) Operator Equals (==): ตรวจสอบ Reference อย่างเดียวครับ ตำแหน่งของหน่วยความจำใน Memory ถ้าเป็นพวกภาษา C ก็ Pointer นั้นแหละครับ สรุป ในการตรวจสอบว่า String เหมือนกัน ไม่ว่าเป็น Java หรือ C# ที่ผมยกตัวอย่างมา ต้องใช้ Method Equals() ถึงเหมาะสมกว่านะครับ เดี๋ยวเจอ Defect ที่คิดว่าเป็นความบกพร่องของตัวภาษา แต่จริงๆแล้ว เรายังไม่เข้าใจมันมากกว่า

Human Error แหก แหวก ผ่าทะลุกฏเกณฑ์

วันนี้ได้ไป Stand by เพื่อเอา Program ขึ้น Production โดยก่อนที่จะมาถึงด่านนี้ได้ ก็ต้องผ่าน ทั้งหมดนี้ดูดีครับ แต่ใช้งานจริงหละ วันจริง เมื่อถึงวันจริง ระหว่างที่ผมนั่งช่วย User Map หัว GL เพื่อส่งออกไปยังระบบ SAP ในวันรุ่งขึ้น แต่น้องที่ Stand by อยู่ โทรมาแจ้งว่า แย่แล้วววว รัน Script ผิด Version ฝ่าย IT ของ Site ลูกค้า หยิบแผ่น 8.4.0.6 มารัน แทนที่จะเป็น 8.4.1.6 ซวยครับ แพลนที่จะกลับบ้านเร็วๆ หมดกัลลล (รอบก่อน IT ของ Site ลูกค้า ใส่ Password ผิดจนระบบ Lock) ผมรีบกลับมาดูความเสียหายครับ โดยพวกว่ามี 4 ส่วนที่โดนครับ สำหรับการแก้ปัญหานั้น ผมใช่วิธี ซ่อม Data ครับ เนื่องจาก สิ่งที่อยากเตือน สำหรับการจัดการ Script ขึ้นระบบ Production ท้ายสุดแล้ว Policy ดี | ระบบ ดี แต่ Human Error มันแหกได้ทุกข้อจำกัดครับ ตั้งสติก่อน Start ครับ ^___^