30 ปีของเว็บผ่านแท็ก `<br>`
(artmann.co)- บทความที่สรุปให้เห็นว่าเว็บพัฒนา วิวัฒนาการ มาอย่างไร โดยไล่ตามความเปลี่ยนแปลงตั้งแต่เว็บแบบสแตติกในยุค 1990, เว็บที่มี JavaScript เป็นศูนย์กลางในยุค 2010 ไปจนถึงเว็บในยุค AI ของทศวรรษ 2020
- เว็บที่เริ่มต้นจากแท็ก
<br>และ FTP ได้ขยายตัวอย่างรวดเร็วผ่าน PHP และ MySQL จนกลายเป็น แพลตฟอร์มที่ใครก็สร้างได้ - จุดเปลี่ยนในยุค 2000 อย่าง Rails, Git และ Heroku ได้ปรับโฉมการพัฒนาเว็บให้เป็น อุตสาหกรรมที่เน้นโครงสร้าง ระบบอัตโนมัติ และการทำงานร่วมกัน พร้อมวางรากฐานสู่ยุคคลาวด์และมือถือ
- การมาของ React, build chain, Docker และ ecosystem ของ Node ในยุค 2010 ทำให้เว็บถูกตรึงสถานะจากเอกสารธรรมดาไปเป็น แพลตฟอร์มแอปพลิเคชันอย่างเต็มตัว
- ในทศวรรษ 2020 ChatGPT และ Copilot ได้เปลี่ยนวิธีการเขียนโค้ด และกลายเป็นจุดเปลี่ยนใหม่ที่ AI เข้ามาเพิ่มพลังให้ผลิตภาพของนักพัฒนา
- การเปลี่ยนแปลงทั้งหมดนี้เกิดขึ้นโดยแลกกับความซับซ้อน และนำไปสู่ กระบวนการทำให้เว็บเป็นของมหาชน ที่เปิดทางให้ผู้คนจำนวนมากขึ้นสร้างสิ่งที่ยิ่งใหญ่ขึ้นได้
The Static Web - ยุคของเว็บแบบสแตติก
"View Source was how you learned"
- เว็บใน ช่วงปลายยุค 90 (late 90s) เป็นดินแดนบุกเบิกที่ไม่มีใครรู้แน่ชัดว่ามันจะกลายเป็นอะไร และความไม่แน่นอนนั้นเองก็เป็นเสน่ห์ของมัน
- เว็บไซต์ส่วนตัวในเวลานั้นเริ่มต้นจาก เซิร์ฟเวอร์ส่วนบุคคลและโฟลเดอร์ของแต่ละคน ไม่ใช่จากบริษัทหรือองค์กร
- แค่มีไดเรกทอรีส่วนตัวบนเซิร์ฟเวอร์ Unix, ไฟล์ HTML และไคลเอนต์ FTP ก็มีพื้นที่บนอินเทอร์เน็ตได้แล้ว
- เขียนข้อความด้วยโปรแกรมแก้ไขข้อความง่าย ๆ อย่าง Notepad แล้วเผยแพร่ได้ทันที
- เว็บในยุคนั้นเป็น พื้นที่สร้างสรรค์ที่ไม่มีผู้ตรวจกรองหรือขั้นตอนอนุมัติ
- โพสต์เนื้อหาได้อย่างอิสระตามความสนใจ เช่น อาหาร ไดโนเสาร์ หรือเพลง
- เป็นโครงสร้างแบบ “สิ่งที่ฉันสนใจในสัปดาห์นี้” แล้วโพสต์ขึ้นไปได้เลย
- วิธีการเรียนรู้ในเวลานั้นคือ ดูของจริงแล้วทำตามโดยตรง อย่างแท้จริง
- ยังไม่มี YouTube tutorial หรือ Stack Overflow
- ถ้าอยากรู้ว่าเว็บอื่นทำอย่างไร ก็คลิกขวา → View Source ซึ่งเป็นเครื่องมือเรียนรู้พื้นฐาน
- ถ้าอยากลงลึกกว่านั้นก็ต้องเรียนจากหนังสือกระดาษจริง
- การวางหนังสือเทคนิคหนา ๆ หลายร้อยหน้าอย่าง Core Java ไว้ข้างตัว แล้วสลับดูโค้ดกับหนังสือไปมาถือเป็นวิธีเรียนที่พบได้ทั่วไป
- แม้จะช้า แต่เป็นประสบการณ์การเรียนรู้ที่ทำให้ความรู้ติดตัวได้นาน
- HTML ในเวลานั้นยังอยู่ในสภาพที่โครงสร้างและสไตล์ปะปนกัน
- แท็ก
<table>,<font>,<center>ถูกใช้ทั้งจัดเลย์เอาต์และจัดสไตล์ในเวลาเดียวกัน - ใช้ GIF โปร่งใสขนาด 1x1 (spacer GIF) เพื่อปรับช่องว่าง
- มันหยาบและไม่มีประสิทธิภาพ แต่ ใช้งานได้จริง
- แท็ก
- CSS มีอยู่แล้ว แต่ยังแทบไม่ใช่กระแสหลัก
- สไตล์ส่วนใหญ่ยังใส่ผ่านแอตทริบิวต์แบบอินไลน์หรือตัวแท็ก HTML เอง
- การจัดเลย์เอาต์แก้กันด้วยตารางซ้อนตาราง
- ฟังก์ชันแบบไดนามิกมีอุปสรรคในการเข้าถึงสูงมาก
- แม้แต่ฟังก์ชันพื้นฐานอย่างสมุดเยี่ยมชมหรือตัวนับผู้เข้าชมก็ยังต้องใช้ CGI script
- ต้องเขียนด้วย Perl หรือ C และแค่จัดการ URL parameter เพียงตัวเดียวก็ต้องใช้โค้ดจำนวนมาก
- ความซับซ้อนนี้จำกัดการแพร่หลายของเว็บแบบไดนามิกอย่างมาก
- ปัญหาเรื่องเลย์เอาต์ร่วมกันแทบไม่มีทางออกที่ดี
- ต้องคัดลอก/วาง header, navigation และ footer ลงในไฟล์ HTML ทุกไฟล์
- ถ้าจะแก้ไขก็ต้องแก้ทุกไฟล์
- มีวิธีแทรกองค์ประกอบร่วมด้วย
<iframe>อยู่บ้าง แต่ผลข้างเคียงเยอะ
- ความเข้ากันได้ของเบราว์เซอร์ก็เป็นปัญหาใหญ่ตั้งแต่ตอนนั้นแล้ว
- Netscape Navigator (1994) และ Internet Explorer (1995) แสดงผลเรนเดอร์ออกมาต่างกัน
- ถึงขั้นจำเป็นต้องมีข้อความเตือนระบุเบราว์เซอร์และความละเอียดหน้าจอที่รองรับโดยเฉพาะ
- ถึงอย่างนั้น เว็บในยุคนั้นก็ยังมีพลังดึงดูดอย่างมาก
- สามารถเผยแพร่สู่คนทั่วโลกได้โดยไม่ต้องมีอุปกรณ์สิ่งพิมพ์หรืออุปกรณ์กระจายเสียง
- เว็บทำให้ การทำให้การแสดงออกเป็นของมหาชน เกิดขึ้นได้จริงเป็นครั้งแรก
- บริการโฮสติ้งฟรีอย่าง GeoCities (1994) และ Angelfire (1996) มอบพื้นที่สร้างสรรค์ให้ผู้คนนับล้าน
- เว็บไซต์แฟนคลับและชุมชนต่าง ๆ เชื่อมต่อกันผ่าน web ring
- ก่อเกิดเป็นระบบนิเวศที่วุ่นวายแต่มีชีวิตชีวา
- ในฝั่งองค์กร แนวคิดเรื่อง “ทีมเว็บ” แทบยังไม่มีอยู่จริง
- ถ้ามีเว็บไซต์ ก็มักเป็นฝีมือของ “คนที่พอรู้เรื่องคอมพิวเตอร์”
- เป็นช่วง ก่อนที่นักพัฒนาเว็บจะตั้งหลักเป็นอาชีพอย่างเต็มตัว
- แม้เครื่องมือจะดิบและเว็บไซต์จะดูหยาบ ๆ
- แต่แนวคิดแกนหลักว่าเป็น พื้นที่ที่ใครก็สร้างและแบ่งปันได้ ได้หยั่งรากลงในช่วงเวลานี้
- ยุคที่ขับเคลื่อนต่อมาได้ด้วยแท็ก
<br>และความหลงใหลนี้เอง คือจุดเริ่มต้นของวิวัฒนาการเว็บทั้งหมดในภายหลัง
LAMP stack และ Web 2.0
"Everything was PHP and MySQL"
- แม้หลังจาก ฟองสบู่ดอตคอมแตกในปี 2000 เว็บก็ยังคงเติบโตต่อไป และช่วงเวลานี้ได้กลายเป็น จุดเปลี่ยนที่ลดกำแพงการเข้าถึงลงอย่างรวดเร็ว สำหรับผู้คนที่อยากสร้างอะไรบางอย่าง
- จุดทะลุทะลวงที่ใหญ่ที่สุดของยุคเว็บแบบสแตติกคือ PHP(1995)
- จากยุคที่ต้องเขียนโค้ด C หรือ Perl หลายร้อยบรรทัดเพื่อใช้ CGI การที่สามารถอ่าน URL parameter ได้ด้วย
$_GET['name']เพียงบรรทัดเดียวถือเป็นความเปลี่ยนแปลงครั้งสำคัญ - ไม่ต้องคอมไพล์ ไม่ต้องจัดการหน่วยความจำ ไม่มีข้อความ error ที่เข้าใจยาก แค่บันทึกแล้วรีเฟรชก็ทำงานได้
- XAMPP(2002) ทำให้สามารถติดตั้ง Apache, MySQL และ PHP ได้พร้อมกันในครั้งเดียว ทำให้การตั้งค่า local development environment ง่ายขึ้นอย่างมาก
- PHP เป็นตัวแรกที่แก้ปัญหา การใช้เลย์เอาต์ซ้ำ ในยุคเว็บแบบสแตติกได้อย่างจริงจัง
- แค่
include 'header.php'หนึ่งบรรทัดก็จัดการ header และ footer ร่วมกันได้ - ประสบการณ์ที่แก้ครั้งเดียวแล้วทั้งเว็บไซต์เปลี่ยนตามสร้างความตื่นเต้นอย่างมาก
- แค่
- แม้จะมีข้อบกพร่องในระดับภาษา จุดแข็งของ PHP คือ การเข้าถึงได้ง่าย
- แม้ HTML กับ logic จะปะปนกัน การตั้งชื่อฟังก์ชันไม่สม่ำเสมอ และ security API จะหยาบมาก
- แต่ก็สามารถเรียนรู้ในสุดสัปดาห์เดียวแล้วสร้างบริการจริงได้
- ด้วย shared hosting($5/เดือน) และการมี cPanel(1996), phpMyAdmin(1998) ให้มาเป็นพื้นฐาน ทำให้กำแพงการเริ่มต้นออนไลน์ต่ำที่สุดในประวัติศาสตร์
- จากยุคที่ต้องเขียนโค้ด C หรือ Perl หลายร้อยบรรทัดเพื่อใช้ CGI การที่สามารถอ่าน URL parameter ได้ด้วย
- ฐานข้อมูลที่แทบจะมาเป็นชุดเดียวกับ PHP คือ MySQL(1995)
- แทบทุก tutorial, hosting และ CMS ล้วนถูกออกแบบโดยตั้งสมมติฐานว่าต้องใช้ MySQL
- ด้านฟังก์ชันถือว่าเพียงพอ แต่การจัดการข้อความหลายภาษานั้นเต็มไปด้วยความเจ็บปวด
- encoding เริ่มต้นคือ latin1 และถ้าจะใช้ UTF-8 ให้ถูกต้อง
- ก็ต้องตั้งค่า database, connection encoding และประกาศ HTML charset ให้ตรงกันทั้งหมด
- ปัญหา “ä แทนที่จะเป็น ä” กลายเป็นบาดแผลทางใจที่เป็นสัญลักษณ์ของยุคนี้
- WordPress(2003) เปลี่ยนธรรมชาติของเว็บไปโดยสิ้นเชิง
- ไม่ต้องรู้โค้ดก็สามารถติดตั้งใน 5 นาทีแล้วเริ่มเผยแพร่ได้ทันที
- แค่เลือกธีมและเขียนบทความก็สามารถดูแลเว็บไซต์ได้
- ทำให้การสร้างเว็บไซต์แบบ แมส เกิดขึ้นจริงในทางปฏิบัติ
- สำหรับผู้ใช้ที่ไม่ใช่สายเทคนิค WordPress คืออิสรภาพ
- ไม่ว่าจะเป็นบล็อกเกอร์ เจ้าของกิจการรายย่อย ศิลปิน หรือร้านอาหาร ต่างก็มีเว็บไซต์ของตัวเองได้
- เกิดอัตลักษณ์ใหม่ในชื่อ “บล็อกเกอร์”
- แพร่หลายถึงระดับที่หน้าแอดมินของ WordPress ถูกมองว่าเป็น “ตัวแก้ไขเว็บไซต์” โดยตรง
- สำหรับนักพัฒนา WordPress กลายเป็นเครื่องมือสารพัดประโยชน์แทบทุกอย่าง
- ทั้งบล็อก พอร์ตโฟลิโอ เว็บไซต์องค์กร คอมมูนิตี้ และอีคอมเมิร์ซ ล้วนทำด้วย WordPress
- รับเอา อีคอมเมิร์ซ เข้ามาด้วย WooCommerce(2011)
- แต่แลกกับความเร็วในการพัฒนาด้วยการสะสม technical debt จากปลั๊กอินจำนวนมากและการคัสตอมธีม
- เหตุการณ์ที่นิยามความเป็นไปได้ของเว็บขึ้นมาใหม่อย่างรากฐานคือการเปิดตัว Gmail(2004)
- ในยุคที่ Hotmail และ Yahoo Mail ยังให้พื้นที่เก็บข้อมูลเพียงไม่กี่ MB
- พื้นที่ฟรี 1GB เป็นตัวเลขที่น่าตกใจมาก
- ข้อความที่ว่า “อย่าลบ ให้ค้นหาแทน” เสนอวิธีใช้งานแบบใหม่
- นวัตกรรมที่แท้จริงของ Gmail ไม่ใช่พื้นที่เก็บข้อมูล แต่คือ ประสบการณ์
- อินเทอร์เฟซที่อ่าน เขียน และสลับอีเมลได้โดยไม่ต้องรีเฟรชหน้า
- ใช้การสื่อสารแบบ asynchronous บนพื้นฐาน AJAX(XMLHttpRequest) อย่างเต็มรูปแบบ
- พิสูจน์ว่าเว็บไม่จำเป็นต้องเป็นเอกสาร แต่สามารถเป็น แอปพลิเคชัน ได้
- Google Maps(2005) ยกระดับความเป็นไปได้นี้ขึ้นไปอีกขั้น
- เลื่อนแผนที่ได้ด้วยการคลิกและลาก
- อินเทอร์แอ็กชันที่เป็นธรรมชาติจากการโหลด tile แบบพื้นหลัง
- ณ จุดนี้คำว่า Web 2.0 เริ่มปักหลักอย่างจริงจัง
- UI แบบไม่ต้องรีเฟรช มุมโค้ง gradient และเงา กลายเป็นภาษาพื้นฐานของเว็บ
- ในด้านสื่อและโซเชียลก็มีการเปลี่ยนแปลงครั้งสำคัญต่อเนื่อง
- ในฝั่งวิดีโอ YouTube(2005) เปลี่ยนกระดานทั้งหมด
- ปิดฉากนรกของปลั๊กอินอย่าง RealPlayer, QuickTime และ Windows Media Player
- แม้จะอยู่บน Flash แต่ก็มอบประสบการณ์แบบ “คลิกแล้วเล่นได้ทันที”
- วิดีโอไม่ใช่ปัญหาทางเทคนิคอีกต่อไป แต่กลายเป็น เครื่องมือในการสื่อสาร
- Twitter(2006) นำเสนอรูปแบบการสื่อสารใหม่ผ่านไมโครบล็อก 140 ตัวอักษร
- Facebook(2006) เปิดให้ผู้ใช้ทั่วไปใช้งาน ทำให้โซเชียลเน็ตเวิร์กกลายเป็นกระแสหลัก
- เว็บเปลี่ยนจากสื่อเพื่อการบริโภคไปสู่ แพลตฟอร์มแบบมีส่วนร่วม
- ก่อให้เกิดโครงสร้างที่ทุกคนสามารถเป็นทั้งผู้เผยแพร่และผู้สร้างสรรค์ได้
- ในฝั่งวิดีโอ YouTube(2005) เปลี่ยนกระดานทั้งหมด
- แม้จะมีการเปลี่ยนแปลงทั้งหมดนี้ JavaScript ก็ยังคงสร้างความเจ็บปวดอยู่ดี
- การดีบักไม่รู้จบจากความต่างกันของการทำงาน DOM, event และ AJAX ระหว่างเบราว์เซอร์ รวมถึงปัญหาความเข้ากันได้กับ IE6
- jQuery(2006) แทบจะยุติความสับสนนี้ได้โดยสิ้นเชิง
$('#el').hide()ทำงานเหมือนกันในทุกเบราว์เซอร์$.ajax()ทำให้การสื่อสารแบบ asynchronous ง่ายขึ้น- สำหรับนักพัฒนาจำนวนมาก jQuery ก็คือ JavaScript เอง
- ในขณะเดียวกันมันก็ทำหน้าที่เป็นชั้นกันกระแทกที่ทำให้ไม่ต้องเข้าใจกลไกการทำงานของเบราว์เซอร์โดยตรง
- ปัญหาในยุคนี้กว่าจะถูกรับรู้ว่าเป็นปัญหาก็ต้องใช้เวลาอีกนาน
- SQL Injection และ XSS แพร่หลายแม้กระทั่งในระดับ tutorial
- โค้ดที่นำ input จากผู้ใช้ไปต่อกับ query ตรง ๆ เป็นเรื่องปกติ
- การจัดการเวอร์ชันมี Subversion(2000) เป็นกระแสหลัก
- การ commit มีน้ำหนักมาก และ branch เป็นสิ่งที่คนหลีกเลี่ยง
- ชื่อโฟลเดอร์อย่าง
final_final_REALเป็นเรื่องปกติในชีวิตประจำวัน
- ยังไม่มีมาตรฐานของ runtime environment
- ฝั่ง local คือ Windows + XAMPP
- ฝั่งเซิร์ฟเวอร์คือ Linux + PHP คนละเวอร์ชัน
- คำว่า “works on my machine” จึงเกิดขึ้นซ้ำแล้วซ้ำเล่า
- แนวคิดเรื่อง package manager ก็ยังไม่มีเช่นกัน
- ฝั่ง JS ต้องดาวน์โหลด ZIP แล้วจัดการเองในโฟลเดอร์
/js - ไลบรารี PHP ใช้วิธีคัดลอกไฟล์เป็นหลัก
- ฝั่ง JS ต้องดาวน์โหลด ZIP แล้วจัดการเองในโฟลเดอร์
- โครงสร้างทีมและกระบวนการพัฒนายังไม่เป็นทางการอย่างมาก
- แทบไม่มีบทบาท PM หรือ EM
- ไม่มี code review
- อัปโหลดผ่าน FTP แล้วขึ้นใช้งานจริงทันที
- ถ้าเกิดปัญหาก็แก้สดบน production server ตรงนั้นเลย
- ถึงอย่างนั้น พลังงานของยุคนี้ก็เข้มข้นอย่างมาก
- ด้วย PHP และ hosting ราคาถูก ทำให้ ใครก็ deploy ได้
- เกิดความรู้สึกแพร่หลายว่า AJAX ทำให้สร้าง “แอปจริง” ได้
- แพลตฟอร์มโซเชียล ทำให้ทุกคนมีผู้ชมของตัวเองได้
- นี่คือช่วงที่ การพัฒนาเว็บเริ่มกลายเป็นวิชาชีพและมีโครงสร้างมากขึ้น
- Ruby on Rails(2004) ส่งสัญญาณถึงยุคถัดไปที่มีโครงสร้างมากกว่าเดิมด้วยแนวคิด “Convention over Configuration”
- นักพัฒนาในยุคนี้สร้างเว็บขึ้นมาท่ามกลาง LAMP stack, ปลั๊กอิน jQuery และ
- ความคาดหวังว่า “เราจะสร้างบริการใหญ่ตัวถัดไป”
สงครามเฟรมเวิร์ก
"Rails changed everything, then everyone copied it"
-
ปลายยุค 2000s (late 2000s) เมื่อเว็บแอปพลิเคชันมีขนาดใหญ่ขึ้น สคริปต์ PHP แบบเดิมและโครงสร้างที่พึ่งงานทำมือก็เริ่มชนเพดานของตัวเอง
-
ทางออกในช่วงเวลานั้นคือ แนวทางการพัฒนาแบบยึดเฟรมเวิร์กเป็นศูนย์กลาง และผู้ที่กำหนดทิศทางของกระแสนี้ก็คือ Ruby on Rails(2004)
- อิทธิพลที่แท้จริงของ RoR เริ่มเด่นชัดอย่างจริงจังราว 2007–2008
- ด้วยปรัชญา “Convention over Configuration” เฟรมเวิร์กจึงเป็นฝ่ายกำหนดโครงสร้างไฟล์ การตั้งชื่อ และวิธีเชื่อมโยงต่าง ๆ แทน
- นักพัฒนาเพียงแค่ทำตามกฎ และสิ่งนี้ไม่ได้ถูกมองว่าเป็นข้อจำกัด แต่เป็นอิสรภาพที่ช่วยเพิ่มความเร็ว
-
หลังจากนั้น Rails ได้นำเสนอแนวคิดที่กลายเป็นไวยากรณ์พื้นฐานของการพัฒนาเว็บแบบรวมชุดในคราวเดียว
- migration สำหรับจัดการการเปลี่ยนแปลงฐานข้อมูลด้วยโค้ด
- ORM ที่ลดการพึ่งพา SQL ลงอย่างมาก
- เวิร์กโฟลว์การพัฒนาที่มีการทดสอบมาให้เป็นพื้นฐาน
- การทำให้โครงสร้าง MVC(Model–View–Controller) กลายเป็นมาตรฐานในทางปฏิบัติ
- เดิม MVC เป็นแนวคิดที่มีรากมาจาก Smalltalk ในยุค 1970s แต่ผ่าน Rails มันจึงถูกทำให้แข็งตัวเป็นรูปแบบพื้นฐานของการพัฒนาเว็บ
- หลัง Rails ประสบความสำเร็จ แทบทุก ecosystem ของภาษาต่างก็หยิบสูตรนี้ไปใช้
- Django(2005) ในฝั่ง Python และ Laravel(2011) ในฝั่ง PHP ทำให้โครงสร้างแบบ Rails ฝังราก
- CakePHP(2005) และ CodeIgniter(2006) ก็เติบโตบนกระแสเดียวกัน
- การเพิ่มขึ้นของ productivity ไม่ใช่เรื่องพูดเกินจริง
- สิ่งที่นักพัฒนาเดี่ยวทำได้ในช่วงสุดสัปดาห์ กลับเคยเป็นงานระดับที่ต้องใช้ทั้งทีมในอดีต
- ในสภาพแวดล้อมของสตาร์ตอัป มันทำหน้าที่เป็นเครื่องมือที่เหมาะอย่างยิ่งสำหรับการทดลองและวนซ้ำอย่างรวดเร็ว
- ในความเป็นจริง มีหลายบริการชื่อดังที่เติบโตขึ้นบน Rails
- Basecamp(2004), Twitter(2006), GitHub(2008), Shopify(2006), Airbnb(2008)
- Rails จึงถูกมองในไม่ช้าว่าเป็น สัญลักษณ์ของความเร็วแบบสตาร์ตอัป
-
แม้เฟรมเวิร์กจะยกระดับ productivity ได้ แต่ การ deploy ยังเป็นคอขวดอยู่ดี
- ในยุค PHP การ deploy ด้วยการอัปโหลดผ่าน FTP เป็นเรื่องปกติ และเป็นโครงสร้างที่แค่พลาดครั้งเดียวก็ทำให้บริการพังได้
- แม้จะเป็นกรณีที่ดีกว่านั้น ก็ยังต้องจัดการงานอย่าง SSH + SVN pull + รีสตาร์ต Apache แบบ manual
- ไม่ว่าจะเป็นการแยก release directory หรือการสลับ symbolic link ทุกขั้นตอนล้วน custom และเปราะบาง
-
สิ่งที่เปลี่ยนปัญหานี้ในระดับรากฐานคือ Heroku(2007) ซึ่งเริ่มแพร่หลายอย่างจริงจังราว 2009–2010
- มอบประสบการณ์ที่ deploy เสร็จได้ด้วยคำสั่งบรรทัดเดียว
git push heroku main - แพลตฟอร์มเป็นผู้จัดการแทนทั้งการตั้งค่าเซิร์ฟเวอร์ การรีสตาร์ตเว็บเซิร์ฟเวอร์ และการสเกล
- หลังจากนั้น Heroku ก็ทำให้แนวคิดที่ต่อมาถูกเรียกว่า PaaS(Platform as a Service) ตั้งหลักได้จริงในทางปฏิบัติ
- นักพัฒนาจึงขยับบทบาทจากการสนใจ infrastructure ไปสู่การโฟกัสที่โค้ดเพียงอย่างเดียว
- พร้อมทั้งทำให้หลักการ Twelve-Factor App(2011) เป็นที่แพร่หลาย และกระจายแนวคิดแบบ cloud-friendly เช่น stateless process, การตั้งค่าด้วย environment variable และการทำ log ให้เป็น stream
- มอบประสบการณ์ที่ deploy เสร็จได้ด้วยคำสั่งบรรทัดเดียว
-
ในช่วงเวลาเดียวกัน ก็เกิด การเปลี่ยนผ่านครั้งใหญ่ของวิธีทำงานร่วมกัน เช่นกัน
- Git(2005) นำโมเดล version control แบบกระจายมาใช้ ทำให้ commit·branch·merge ได้อย่างอิสระบนเครื่อง local และเพราะ ต้นทุนของ branch แทบไม่มี การทดลองและการย้อนกลับจึงกลายเป็นงานประจำวัน
- ส่วน Subversion(2000) เดิมนั้นเป็นโครงสร้างแบบรวมศูนย์ branch มีน้ำหนักมาก และ merge เป็นสิ่งที่น่ากลัว ทำให้หลายทีมพึ่งการพัฒนาแบบยึด trunk เป็นศูนย์กลาง
- Git เป็นนวัตกรรมในระดับเครื่องมือ แต่ GitHub(2008) ที่ผสานการสำรวจ public repository การพัฒนาแบบ fork และการทำงานร่วมกันโดยมี Pull Request เป็นศูนย์กลาง ได้ทำให้มันฝังรากเป็นวัฒนธรรม
- GitHub ทำให้ วัฒนธรรม code review กลายเป็นมาตรฐาน
- ก่อน merge PR จะต้องมีใครสักคนเข้ามาดูโค้ดเสมอ
- กระแสนี้ขยายไปถึงการพัฒนาภายในบริษัทด้วย
- ยุคที่โค้ดถูกส่งเข้า production โดยตรงจึงสิ้นสุดลง
- วิธีมีส่วนร่วมกับโอเพนซอร์สก็เปลี่ยนจากการ ส่ง patch ทาง mailing list ไปเป็น กดปุ่มส่ง PR ทำให้กำแพงการเข้าร่วมลดลงอย่างมาก
-
ในช่วงปลายของยุคนี้ ยังมีความเปลี่ยนแปลงที่สั่นคลอนอัตลักษณ์ของเว็บด้วย
- การเปิดตัว iPhone(2007) และ App Store(2008) ทำให้แอปเนทีฟพุ่งขึ้นอย่างรวดเร็ว
- เว็บบนมือถือในเวลานั้นมีคุณภาพย่ำแย่มาก เป็นประสบการณ์แบบย่อไซต์เดสก์ท็อปลงมาดูอย่างฝืน ๆ พร้อมการเลื่อนแนวนอนและการซูมเข้าออกซ้ำแล้วซ้ำเล่า
- บางแห่งสร้างไซต์มือถือแยกอย่าง m.example.com แต่ข้อจำกัดก็ชัดเจน
- แอปเนทีฟทั้งเร็ว รองรับออฟไลน์ มี push notification และคำขวัญ “There’s an app for that” ก็ทำให้มันดูเหมือนอนาคต
- นักพัฒนาเว็บเริ่มเผชิญ วิกฤตตัวตน : ควรทำเว็บต่อไปไหม? ต้องไปเรียน Objective-C ไหม? เว็บจะหายไปหรือเปล่า?
-
คำตอบต่อความสับสนนี้คือการมาของ Responsive Web Design(2010)
- Ethan Marcotte(2010) เสนอแนวทางใช้ CSS media query เพื่อปรับ layout ตามขนาดหน้าจอ ชี้ทิศทางสู่การรวมมือถือและเดสก์ท็อปไว้ใน codebase เดียว
- ในช่วงแรกการแพร่หลายยังช้า เพราะเครื่องมือยังไม่สุกงอมและมีภาระงานเพิ่ม แต่ทิศทางที่เว็บควรเดินไปนั้นชัดเจนแล้ว
-
Bootstrap(2011) คือจุดเปลี่ยนที่ทำให้ responsive web ถูกใช้งานจริงในภาคสนาม
- มันเริ่มจากเครื่องมือภายในของ Twitter แล้วมอบทั้ง grid system, typography พื้นฐาน และ style ของฟอร์มในคราวเดียว จนแม้นักพัฒนาที่ไม่มีดีไซเนอร์ก็สามารถใช้ UI ได้ทันที
- ผลก็คือเว็บเริ่มดูคล้ายกันมากขึ้นเรื่อย ๆ แต่สำหรับนักพัฒนาจำนวนมาก Bootstrap คือทั้ง component library ตัวแรกและประสบการณ์แรกกับ design system
- กระแสนี้ต่อมายังเชื่อมไปสู่การแพร่หลายของ design system ที่เป็นระบบมากขึ้นอย่าง Material Design(2014)
-
Infrastructure ก็เปลี่ยนอย่างรวดเร็วในช่วงเดียวกัน
- จากแนวทางที่ต้องซื้อหรือเช่า physical server ล่วงหน้า เปลี่ยนไปสู่โครงสร้างที่ยึด virtual server(VPS) เป็นหลัก ทำให้สามารถสร้างทรัพยากรเซิร์ฟเวอร์ได้เมื่อจำเป็น
- AWS(2006) มาก่อนใคร แต่ด้วยความซับซ้อนและความเป็น enterprise-oriented จึงยังเป็นภาระสำหรับนักพัฒนาเดี่ยว
- DigitalOcean(2011) ลดกำแพงการเข้าถึง infrastructure อย่างมากด้วย droplet ราคา $5, UI ที่เข้าใจง่าย และประสบการณ์สร้างเซิร์ฟเวอร์ที่รวดเร็ว ทำให้นักพัฒนาเดี่ยวมีความยืดหยุ่นใกล้เคียงบริษัทใหญ่ได้
-
ปัญหาเรื่องการเก็บไฟล์นั้น Amazon S3(2006) แทบจะแก้ได้อย่างสิ้นเชิง
- มันมอบโมเดลที่เรียบง่าย คือ storage ที่สเกลได้โดยไม่ขึ้นกับจำนวนเซิร์ฟเวอร์ และคืน URL ได้ทันทีหลังอัปโหลด
- ปัญหาเรื่องการอัปโหลดของผู้ใช้ การสำรองข้อมูล และการจัดการไฟล์ในสภาพแวดล้อมหลายเซิร์ฟเวอร์จึงถูกจัดการได้ในคราวเดียว
-
Node.js(2009) ก็สร้างแรงกระแทกอีกแบบให้กับนักพัฒนาเว็บ
- ด้วยการทำให้รัน JavaScript บนเซิร์ฟเวอร์ได้บนพื้นฐานของเอนจิน Chrome V8 มันจึงดูเป็นทางเลือกที่น่าดึงดูดสำหรับนักพัฒนาฝั่งฟรอนต์เอนด์ และเรียกปฏิกิริยาแบบกังขาจากนักพัฒนาฝั่งแบ็กเอนด์
- โมเดล non-blocking I/O แสดงจุดแข็งกับแอปพลิเคชันแบบเรียลไทม์ และบทเรียนส่วนใหญ่ก็มักลงเอยที่ตัวอย่างแอปแชต
- อย่างไรก็ตาม ในช่วงนั้น Node ยังใกล้เคียงกับสิ่งชวนสงสัยมากกว่าจะเป็นกระแสหลักของ production โดยบริการจริงยังคงมี Rails·Django·PHP เป็นศูนย์กลาง และ ecosystem ของ npm ก็ยังอยู่ในระยะเริ่มต้น
- แต่ในเวลาต่อมา อิทธิพลที่แท้จริงของ Node กลับปรากฏก่อนในฐานะรากฐานสำหรับ build tool และสภาพแวดล้อมการพัฒนา มากกว่าตัวเซิร์ฟเวอร์เอง
-
ในโลกฐานข้อมูล กระแส NoSQL ก็เริ่มเด่นขึ้น
- MongoDB(2009) ได้รับความสนใจจากโมเดลข้อมูลแบบ document ความยืดหยุ่นของ schema และโครงสร้างที่เป็นมิตรกับ JSON
- มันมีจุดแข็งด้านการทำ prototyping อย่างรวดเร็ว ความสามารถในการขยาย และความเข้ากันได้กับ JavaScript stack แต่ก็ไม่ได้เหมาะกับทุกบริการ
- หลายกรณีเลือกมันเพราะคิดว่า “สักวันอาจต้อง scale” แต่พอถึงระดับผู้ใช้หลักพันกลับเริ่มสัมผัสข้อจำกัดด้าน transaction ก็มีให้เห็นบ่อย
-
ระบบนิเวศสตาร์ตอัปก็เข้าสู่ช่วงเติบโตอย่างจริงจังในเวลานี้
- จากคำประกาศ “Software is eating the world” ของ Marc Andreessen(2011) และการแพร่หลายของวิธีคิด Lean Startup(2011) วงจร MVP → วัดผล → วนซ้ำ จึงเริ่มฝังราก
-
เมื่อเครื่องมือพัฒนาจนพร้อมมากขึ้น ความสามารถในการแข่งขันของทีมขนาดเล็กก็เริ่มใช้ได้ผลจริง
-
กระบวนการพัฒนาก็เปลี่ยนไปเช่นกัน
- Agile Manifesto (2001) และ Scrum กลายเป็นที่แพร่หลาย ทำให้การสแตนด์อัป สปรินต์ และรีโทรสเปกทีฟถูกนำมาใช้ราวกับเป็นมาตรฐาน
- หลายทีมก็เหลือเพียงรูปแบบภายนอกโดยไม่มีหลักการอยู่เบื้องหลัง
- การรีวิวโค้ดและการทดสอบอัตโนมัติขยับจากสิ่งที่แนะนำไปสู่ความคาดหวังพื้นฐาน และระบบ CI ก็รันทดสอบทุกครั้งที่มีการคอมมิต ทำให้การพัฒนาซอฟต์แวร์มีความเป็นวิชาชีพและความเชี่ยวชาญเฉพาะทางมากขึ้นอย่างรวดเร็ว
-
อย่างไรก็ตาม บทบาทที่ทุกวันนี้ถูกมองว่าเป็นเรื่องปกติในตอนนั้นยังไม่ลงหลักปักฐาน
- ณ ปี 2012 ยังพบได้บ่อยว่าทีมไม่มี engineering manager, product manager, หรือระบบจัดการแบ็กล็อกและตั๋วงานอย่างเป็นระบบ
- ทีมขนาดเล็กและโครงสร้างองค์กรแบบแบนเป็นเรื่องปกติ และกรณีที่ “นักพัฒนาอาวุโส” มีประสบการณ์เพียง 3 ปีก็ไม่ใช่เรื่องแปลก
-
ราวปี 2013 เว็บก็มีหน้าตาเปลี่ยนไปอย่างสิ้นเชิง
- เฟรมเวิร์กที่ทรงพลัง การดีพลอยที่ง่าย ความร่วมมือด้านโค้ดผ่านโซเชียล การรองรับมือถือ อินฟราสตรักเจอร์ราคาถูก และการแพร่หลายเต็มรูปแบบของ JavaScript เกิดขึ้นพร้อมกัน
- เว็บที่ผ่านพ้นวิกฤตมือถือมาได้กลับยิ่งแข็งแกร่งกว่าเดิม และพร้อมก้าวเข้าสู่ขั้นต่อไป นั่นคือ ยุคที่ JavaScript ครองทุกสิ่ง
เรอเนซองส์ของ JavaScript
"Everything is a SPA now"
- ราวปี 2013 เว็บได้พิสูจน์ไปแล้วผ่านกรณีอย่าง Gmail และ Google Maps ว่าสามารถรองรับ “แอปพลิเคชันจริงจัง” ได้ แต่แนวทางแบบ jQuery + server rendering เดิมเริ่มชนข้อจำกัดมากขึ้นเรื่อย ๆ :contentReference[oaicite:0]{index=0}
- ปัญหาหลักคือเรื่อง การจัดการสถานะ (state)
- ในโครงสร้างที่เซิร์ฟเวอร์สร้าง HTML แล้วค่อยเติมปฏิสัมพันธ์ด้วย jQuery การรักษาความสอดคล้องระหว่างข้อมูลและ UI ในหลายตำแหน่งกลายเป็นเรื่องยากขึ้นอย่างรวดเร็ว
- ยิ่งสถานะเดียวกันต้องสะท้อนใน UI หลายส่วน เช่น คอมเมนต์ ตัวนับ หรือป้ายแจ้งเตือน โค้ดก็ยิ่งพันกันจนกลายเป็นสปาเกตตี
- ข้อสรุปร่วมกันเพื่อตอบโจทย์นี้คือ ย้ายการเรนเดอร์ทั้งหมดไปไว้ฝั่งไคลเอนต์
- เซิร์ฟเวอร์ถูกลดบทบาทเหลือเพียง API ที่ส่งคืน JSON
- โครงสร้างแบบ SPA (Single Page Application) ที่ JavaScript ในเบราว์เซอร์จัดการ UI ทั้งหมดเริ่มได้รับความนิยม
- เฟรมเวิร์ก SPA รุ่นแรก ๆ ปรากฏขึ้นในช่วงนี้
- Backbone.js (2010) มอบโครงสร้างขั้นต่ำผ่านแนวคิด model และ view
- Angular (2010) นำ two-way data binding และ dependency injection เข้ามา พร้อมลองใช้แนวทางแบบ enterprise
- Ember.js (2011) เสนอกรอบที่มีกฎเข้มแข็ง โดยตั้งเป้าเป็น “Rails ของ JavaScript” ที่รวม routing, data และ template ไว้ครบ
- แม้เฟรมเวิร์กเหล่านี้จะเป็นก้าวสำคัญ แต่ก็ยังไม่ได้แก้ปัญหา ความซับซ้อนของการซิงก์ DOM กับข้อมูล ได้อย่างสมบูรณ์
- โดยเฉพาะ two-way binding ที่ทำให้ติดตามลำดับการอัปเดตได้ยาก และเพิ่มต้นทุนในการดีบัก
- จุดเปลี่ยนมาถึงเมื่อ React (2013) ปรากฏตัว
- ตอนที่ Facebook เปิดซอร์ส JSX ดูเหมือนย้อนทางแนวคิดเรื่อง separation of concerns จนทำให้หลายคนต่อต้าน
- แต่ React เสนอวิธีคิดใหม่ คือไม่แก้ DOM โดยตรง แต่ ประกาศผลลัพธ์ของ UI ตามสถานะแบบ declarative
- แกนสำคัญของ React คือ โมเดลแบบ declarative และ Virtual DOM
- เมื่อสถานะเปลี่ยน React จะคำนวณและสะท้อนเฉพาะการเปลี่ยนแปลง DOM ที่จำเป็นขั้นต่ำ
- นักพัฒนาจึงโฟกัสกับการจัดการสถานะได้ โดยไม่ต้องกังวลกับการแก้ DOM โดยตรง
- แนวคิดเรื่อง component ก็ถือเป็นปัจจัยชี้ขาดเช่นกัน
- UI ถูกประกอบจากหน่วยเล็ก ๆ อย่าง Button, UserAvatar, CommentList
- แต่ละคอมโพเนนต์คิดแยกจากกันได้และนำกลับมาใช้ซ้ำได้
- React ค่อย ๆ แพร่หลายและ กลายเป็นกระแสหลักราวปี 2015
- Vue.js (2014) ก็ผงาดขึ้นมาเป็นทางเลือกด้วยแนวคิดคล้ายกันแต่ใช้ไวยากรณ์ที่เข้าถึงง่ายกว่า
- สงครามเฟรมเวิร์กจึงเข้าสู่ระยะใหม่
- การแพร่หลายของ SPA หมายถึง ปริมาณ JavaScript ที่เพิ่มขึ้นอย่างระเบิดระเบ้อ
- ปัญหาคือ JavaScript ที่นักพัฒนาอยากเขียน กับ JavaScript ที่เบราว์เซอร์เข้าใจ ยังเป็นคนละเรื่องกัน
- ES6 / ES2015 (2015) นำการปรับปรุงภาษาอย่างใหญ่หลวงเข้ามา เช่น arrow function, class, module และ promise
- callback hell และแพตเทิร์น
var self = thisหายไป ทำให้ JavaScript เริ่มให้ความรู้สึกเหมือนภาษาสมัยใหม่อย่างแท้จริง
- callback hell และแพตเทิร์น
- แต่การรองรับของเบราว์เซอร์ยังตามไม่ทัน และไม่สามารถ deploy โค้ดแบบนั้นตรง ๆ ได้
- Babel (2014) แก้ปัญหานี้ด้วยการเป็น transpiler ที่แปลง JavaScript รุ่นใหม่ให้เป็น ES5
- แต่สิ่งที่ต้องแลกมาคือ ขั้นตอน build กลายเป็นส่วนจำเป็นของการพัฒนา JavaScript
- ยุคที่แก้ไฟล์แล้วรีเฟรชก็จบได้สิ้นสุดลง
- ในกระบวนการนี้ Node.js (2009) เข้ายึดทุกเครื่องนักพัฒนา ไม่ใช่ในฐานะเซิร์ฟเวอร์ แต่เป็น สภาพแวดล้อมสำหรับรันเครื่องมือพัฒนา
- ต่อให้ไม่ได้ใช้ Node เป็นแบ็กเอนด์ ก็ยังต้องติดตั้งเพราะเครื่องมือ build บังคับให้มี
- สายโซ่เครื่องมือ build ก็พัฒนาอย่างรวดเร็วเช่นกัน
- Grunt (2012) เป็น task runner ที่จัดการขั้นตอน build อันซับซ้อนผ่านไฟล์คอนฟิก
- Gulp (2013) พยายามทำให้เรียบง่ายขึ้นด้วย pipeline แบบเขียนเป็นโค้ด แต่ก็ยังซับซ้อนอยู่ดี
- การเปลี่ยนแปลงครั้งชี้ขาดคือ Webpack (2014)
- มันไม่ใช่แค่ task runner แต่เป็น module bundler ที่เข้าใจกราฟของ dependency
- ทั้ง JavaScript, CSS, รูปภาพ และฟอนต์ ล้วนถูกปฏิบัติเป็นโมดูล
- มีการนำแนวคิดอย่าง code splitting และ hot module replacement เข้ามา
- แต่พลังอันสูงส่งก็มาพร้อมกับคอนฟิกที่ขึ้นชื่อลือชาเรื่องความโหด
- คอนฟิก Webpack กลายเป็นมีม และแต่ละทีมมักมี “คนคนเดียวที่เข้าใจมัน”
- ถ้าคนนั้นลาออก คอนฟิกก็จะกลายเป็นโบราณวัตถุที่ไม่มีใครกล้าแตะ
- ในเวลาเดียวกัน ระบบนิเวศ npm ก็เติบโตแบบระเบิด
- จากเดิมที่ต้องดาวน์โหลดไลบรารีด้วยตัวเอง เปลี่ยนมาเป็นโลกที่มี
npm installเป็นศูนย์กลาง - ทั้ง moment, lodash แม้กระทั่งยูทิลิตีจิ๋วอย่าง left-pad ก็ถูกทำเป็นแพ็กเกจ
- เหตุการณ์ left-pad (2016) เผยให้เห็นความเปราะบางของระบบนิเวศนี้
- เมื่อแพ็กเกจที่มีเพียง 11 บรรทัดถูกลบ โปรเจกต์นับพันก็ build ล้มพร้อมกัน
- แม้แต่ React และ Babel ก็เข้าสู่ภาวะติดตั้งไม่ได้
- npm ต้องใช้มาตรการที่ไม่เคยมีมาก่อนด้วยการบังคับกู้คืนแพ็กเกจเพื่อยุติวิกฤต
- แม้ความสะดวกจะยังคงอยู่ แต่ทุกคนก็เริ่มตระหนักถึง ความจริงของ dependency hell
- จากเดิมที่ต้องดาวน์โหลดไลบรารีด้วยตัวเอง เปลี่ยนมาเป็นโลกที่มี
- ปี 2016 ความซับซ้อนพุ่งถึงจุดสูงสุด
- บทความเสียดสี “How it feels to learn JavaScript in 2016” แพร่กระจายอย่างกว้างขวาง
- ความเหนื่อยล้าจากการที่แค่จะทำเว็บเพจธรรมดาก็ต้องใช้เครื่องมือจำนวนมากอย่าง React, Webpack, Babel, Redux เริ่มขยายวง
- ความเร็วในการเปลี่ยนแปลงของระบบนิเวศสูงจนความรู้ที่เพิ่งเรียนมากลายเป็นของล้าสมัยอย่างรวดเร็ว
- ถึงอย่างนั้น ผลลัพธ์ก็ชัดเจน
- สามารถสร้างเว็บแอปแบบ interactive ในระดับที่ก่อนหน้านั้นเป็นไปไม่ได้
- ความซับซ้อนถูกยอมรับในฐานะ ต้นทุนของความทะเยอทะยาน
- อีกด้านหนึ่ง Docker (2013) เริ่มแก้ปัญหาอีกชุดหนึ่งที่ต่างออกไป
- ปัญหา “works on my machine” ถูกแก้ด้วยคอนเทนเนอร์
- สามารถกำหนดสภาพแวดล้อมการรันด้วย Dockerfile และรันแบบเดียวกันได้ทุกที่
- ในช่วงแรก การนำไปใช้ไม่ง่ายนักเพราะปัญหาประสิทธิภาพบน Mac และความสับสนเรื่องเครือข่าย
- Docker Compose, Docker Swarm และต่อมาคือ Kubernetes (2014) ทำให้เกิดสงครามด้าน orchestration
- ราวปี 2017 อย่างน้อยก็ชัดเจนแล้วว่าคอนเทนเนอร์คืออนาคต
- พร้อมกันนั้น เทรนด์ microservices ก็แพร่กระจาย
- มอบข้อดีเรื่องการแยกบริการและการ deploy ได้อย่างอิสระ
- แต่ก็สร้างความซับซ้อนใหม่ขึ้นมา เช่น service discovery, load balancing และ distributed tracing
- หลายทีมเพิ่งมารู้ทีหลังว่าพวกเขาเพียงแค่แลกความซับซ้อนของ monolith ไปเป็นความซับซ้อนของระบบกระจาย
- ในช่วงนี้ ความสมบูรณ์ของเว็บแอปพลิเคชันเพิ่มขึ้นอย่างเห็นได้ชัด
- Slack (2013) เข้ามาแทนอีเมลด้วยเครื่องมือทำงานร่วมกันที่รวดเร็วและค้นหาได้
- Figma (2016) รุกล้ำพื้นที่ของเดสก์ท็อปแอปด้วยเครื่องมือออกแบบร่วมกันบนเบราว์เซอร์
- เมื่อรวมกับ Notion (2016) และรายอื่น ๆ ก็พิสูจน์ว่าเว็บสามารถสร้างซอฟต์แวร์ระดับเดสก์ท็อปได้
- กรณีเหล่านี้กลายเป็นเหตุผลรองรับความซับซ้อนของ React, Webpack และสายโซ่ build
- โครงสร้างองค์กรก็เข้าสู่ระยะที่เป็นผู้ใหญ่มากขึ้นเช่นกัน
- ราวปี 2016 ตำแหน่ง product manager และ engineering manager กลายเป็นบทบาทมาตรฐาน
- โครงสร้างทีมแบบแบนในช่วงแรกค่อย ๆ เปลี่ยนไปสู่การจัดองค์กรที่ขับเคลื่อนด้วยกระบวนการ
- Scrum และพิธีกรรมแบบ agile แพร่หลายไปทั่ว โดยบางทีมใช้เป็นเครื่องมือ และบางทีมก็ใช้เป็นเพียงพิธีกรรม
- ปี 2017 ระบบนิเวศเริ่มเข้าสู่ช่วงเสถียรมากขึ้นทีละน้อย
- React กลายเป็นผู้ชนะโดยพฤตินัย
- ES6 กลายเป็นไวยากรณ์พื้นฐาน
- Webpack และ Docker แม้จะเจ็บปวด แต่ก็ถูกยอมรับในฐานะมาตรฐาน
- ขั้นต่อไปถูกส่งสัญญาณไว้แล้ว
- การผงาดขึ้นมาของ TypeScript
- เมตาเฟรมเวิร์กอย่าง Next.js
- ประสบการณ์การ deploy ที่เรียบง่ายยิ่งขึ้น
- แต่มีเงื่อนไขหนึ่งข้อ
- มีเพียง นักพัฒนาที่ผ่านความวุ่นวายของเรอเนซองส์แห่ง JavaScript นี้มาได้ เท่านั้น ที่จะก้าวต่อไปยังขั้นถัดไปได้
ยุคของ TypeScript
"Types are good, actually"
- หลังยุคฟื้นฟูของ JavaScript ความวุ่นวายจากการมีเครื่องมือมากมายก็เริ่มสงบลง และ TypeScript ก็เข้ามาอยู่ตรงจุดเปลี่ยนที่ระบบนิเวศกำลังก้าวสู่ช่วง ความเป็นผู้ใหญ่
- TypeScript (2012) นำ static type เข้ามาสู่ JavaScript แต่ในช่วงแรกกลับถูกเมินอยู่เป็นเวลานาน เพราะขัดกับปรัชญาของภาษาที่เป็นแบบ dynamic และเพิ่มภาระจากขั้นตอน build
- เมื่อแอปพลิเคชันมีขนาดใหญ่ขึ้น ข้อจำกัดของ dynamic typing ก็ยิ่งชัดเจนขึ้นเรื่อย ๆ
- หลังเปลี่ยน function signature ต้นทุนในการไล่ตามจุดที่เรียกใช้ก็เพิ่มขึ้น
- การอ่านโค้ดยากขึ้นเพราะมองรูปทรงของ object ได้ยาก
- กรณีที่แค่พิมพ์ผิดเล็กน้อยแล้วกลายเป็นปัญหาใน production เกิดซ้ำแล้วซ้ำอีก
- ตั้งแต่ช่วง 2017–2018 การนำ TypeScript ไปใช้ก็ขยายตัวอย่างรวดเร็ว
- ได้ความมั่นคงของการ refactor ผ่านระบบ autocomplete และ static analysis
- interface ทำหน้าที่เป็น เอกสารแบบบังคับ ที่ซิงก์กับโค้ดอยู่เสมอ
- การยอมรับจากเฟรมเวิร์กหลัก ๆ กลายเป็นจุดเปลี่ยนสำคัญ
- Angular ใช้กลยุทธ์ TypeScript-first
- การกำหนด type ของ React สุกงอมขึ้น และการเขียน Vue 3 ใหม่บนพื้นฐาน TypeScript ทำให้มันถูกมองว่าเป็น มาตรฐานโดยพฤตินัย
- ราว ๆ 2020 โปรเจ็กต์ใหม่ที่ใช้ JavaScript ล้วนแทบจะไม่ถูกเลือกอีกต่อไป
- TypeScript ช่วย ยกระดับการเข้าถึงโค้ดเบสอย่างมาก
- สมาชิกใหม่สามารถเข้าใจ domain model ได้เพียงแค่อ่าน type definition
- การพึ่งพาความรู้ที่ไม่ถูกเขียนไว้ลดลง จึงช่วยบรรเทาต้นทุนการขยายทีม
- เมื่อแอปพลิเคชันมีขนาดใหญ่ขึ้น ข้อจำกัดของ dynamic typing ก็ยิ่งชัดเจนขึ้นเรื่อย ๆ
- การจับคู่กับ VS Code (2015) เปลี่ยนประสบการณ์การพัฒนาอย่างเด็ดขาด
- มอบ autocomplete อัจฉริยะ, การแสดง error แบบ inline และการ refactor ที่เชื่อถือได้
- Sublime Text และ Atom ค่อย ๆ ลดอิทธิพลลง
- เกิดชั้น abstraction อีกระดับหนึ่งทับอยู่บน React
- ในฐานะ UI library นั้น React ไม่มีคำตอบพื้นฐานสำหรับ routing, data fetching และ SSR
- Next.js เข้ามาเติมช่องว่างนี้ในฐานะ meta framework ที่มี file-based routing, server-side rendering, API routes และ automatic code splitting มาให้เป็นค่าเริ่มต้น
- มีเฟรมเวิร์กที่เข้ามาตอบโต้หลากหลาย เช่น Nuxt, Remix, SvelteKit และ Gatsby
- ในระบบนิเวศของ React นั้น Next.js กลายเป็นตัวเลือกหลักโดยพฤตินัย
- การแพร่หลายของ meta framework ช่วยบรรเทาความเหนื่อยล้าจาก ความกระจัดกระจายของ tooling ในยุคก่อนหน้าได้มาก
- กระบวนการที่เคยต้องประกอบการตั้งค่า webpack และ Babel ด้วยตัวเอง ถูกดูดซึมเข้าไปอยู่ในค่าเริ่มต้น
- สภาพแวดล้อมการ deploy ก็เรียบง่ายขึ้นอย่างรวดเร็วเช่นกัน
- Vercel และ Netlify ให้การ deploy อัตโนมัติและ preview environment ได้เพียงเชื่อมต่อกับ GitHub
- ดีไซเนอร์, PM และ QA สามารถตรวจสอบการเปลี่ยนแปลงในสภาพแวดล้อมจริงได้ก่อน merge
- อิทธิพลของ Heroku อ่อนตัวลง ขณะที่ PaaS รุ่นใหม่อย่าง Railway และ Render เริ่มโดดเด่นขึ้น
- แนวคิด Serverless แพร่หลายโดยมี AWS Lambda (2014) เป็นศูนย์กลาง
- มีการคิดค่าบริการตามการใช้งานและรองรับการขยายตัวอัตโนมัติ
- แต่ก็ไม่ใช่คำตอบอเนกประสงค์ เพราะมีข้อจำกัดเรื่อง cold start, การจัดการ state และการ debug
- Cloudflare Workers ขยายแนวคิดนี้ต่อด้วยโมเดลการรันบน edge
- ฝั่ง CSS ก็มีการเปลี่ยนผ่านอย่างเงียบ ๆ เช่นกัน
- หลังจาก Sass และ Less ผ่านยุค CSS-in-JS มาแล้ว Tailwind CSS (2017) ก็ได้รับการยอมรับอย่างแพร่หลาย
- แนวทางแบบ utility class
- ช่วยตัดภาระในการตั้งชื่อ class
- ลดปัญหาเรื่อง cascade และ specificity
- และท้ายที่สุดนำไปสู่การคง stylesheet ให้มีขนาดเล็ก
- GraphQL (2015) ได้รับความสนใจในฐานะคำตอบที่ทรงพลังสำหรับแอปพลิเคชันที่ต้องจัดการโครงสร้างข้อมูลซับซ้อน
- ให้ข้อดีทั้งการ query ข้อมูลอย่างแม่นยำ, schema ที่อิง type และระบบนิเวศของเครื่องมือ
- แต่เพราะความซับซ้อนของ server layer และความยากในการทำ caching มันจึงกลายเป็นตัวเลือกที่เกินจำเป็นสำหรับ CRUD แบบง่าย
- บางทีมจึงยังคงใช้ REST หรือเลือกทางเลือกที่เรียบง่ายกว่าอย่าง tRPC
- การแข่งขันด้าน container orchestration ได้ข้อสรุปราว 2018 ว่า Kubernetes เป็นผู้ชนะ
- มันทรงพลัง แต่ก็มาพร้อมต้นทุนการเรียนรู้สูงและความซับซ้อนในการปฏิบัติการ
- สำหรับหลายทีมมันเป็นคำตอบที่เกินความจำเป็น และกลายเป็นฉากหลังของการกลับมาของ PaaS
- COVID (2020) ทำให้ความต้องการด้านการพัฒนาเว็บขยายตัวอย่างรวดเร็ว
- การทำงานทางไกล, e-commerce และเครื่องมือทำงานร่วมกันกลายเป็นสิ่งจำเป็น
- นำไปสู่ความต้องการนักพัฒนาที่พุ่งสูงและการเติบโตอย่างรวดเร็วของบริษัทเครื่องมือสำหรับนักพัฒนา
- ในสภาพแวดล้อมแบบ remote ความสำคัญของการทำงานร่วมกันแบบ asynchronous และการจัดทำเอกสารก็เพิ่มขึ้น
- code review, คำอธิบาย PR และคุณภาพของเอกสารภายใน กลายเป็นองค์ประกอบหลัก
- ในระดับองค์กรก็เกิดความเป็นผู้ใหญ่มากขึ้นเช่นกัน
- การจัดระบบระดับวิศวกรเริ่มลงตัว
- ความชอบธรรมของสาย IC ได้รับการยอมรับ
- บทบาทของ PM, EM และ tech lead แยกชัดเจนขึ้น
- Developer Experience (DX) ถูกมองว่าเป็นเป้าหมายการลงทุนที่แยกออกมาต่างหาก
- ทีม internal platform, CI ที่รวดเร็ว และการปรับปรุง onboarding กลายเป็นปัจจัยหลักของผลิตภาพ
- ราว 2022 การพัฒนาเว็บได้ไปถึงจุดที่แม้จะซับซ้อน แต่ก็อยู่ในสถานะที่ จัดการได้
- TypeScript กลายเป็นค่าเริ่มต้น
- ระบบนิเวศที่มี Next.js เป็นศูนย์กลาง
- ระบบ deployment อัตโนมัติและชุดเครื่องมือที่สุกงอม
- แล้วทุกอย่างก็เปลี่ยนไป: บริษัทชื่อ OpenAI เปิดตัวสิ่งที่เรียกว่า ChatGPT
ช่วงเวลาของ AI
"Wait, I can just ask it to write the code?"
- นับจากการเปิดตัว ChatGPT (2022) ประสบการณ์แบบที่เพียงป้อนคำถามแล้วได้ทั้งคำอธิบาย โค้ด และผลการ debug ก็ถือกำเนิดขึ้น และกฎของการพัฒนาก็เปลี่ยนไป
- มันทำได้ตั้งแต่อธิบายฟิสิกส์ควอนตัมไปจนถึง debug Python และแม้จะไม่สมบูรณ์แบบ แต่ความจริงที่ว่ามัน ใช้งานได้ดีพอ ก็สร้างแรงกระแทกอย่างมาก
- นักพัฒนาเริ่มทดลองกันทันที และการเขียน React component, วิเคราะห์สาเหตุของ error หรือแปลงโค้ดข้ามภาษา ก็กลายเป็นสิ่งที่ ทำได้ภายในไม่กี่วินาทีโดยไม่ต้องค้นเอกสารหรือไล่หาตามฟอรัม
- GitHub Copilot (2022) นำการสร้างโค้ดในรูปแบบ autocomplete เข้าไปไว้ใน editor และทำให้ประสบการณ์แบบ autocomplete ทรงพลังระดับสูง ที่แค่มี comment ก็เสนอ implementation ได้ แพร่หลายออกไป
- meta-skill แบบใหม่ ในการประเมิน รับ ปรับแก้ หรือปฏิเสธข้อเสนอจาก AI อย่างรวดเร็ว กลายมาเป็นความสามารถหลักของนักพัฒนา
- งานอย่าง boilerplate ที่ซ้ำ ๆ การเขียน test และการจัดการ edge case เร็วขึ้นอย่างมาก จนเกิดการพัฒนาแบบ ไม่ทำให้ flow สะดุด
- Cursor (2023) เป็น IDE ที่ผสาน AI เข้าไปไม่ใช่ในฐานะฟีเจอร์ แต่เป็นเงื่อนไขตั้งต้น ทำให้สามารถเลือกโค้ดแล้วขอ refactor, แก้หลายไฟล์จากคำอธิบายภาษาธรรมชาติ และสนทนากับโค้ดเบสได้
- การเปลี่ยนแปลงนี้ทำให้ความหมายของ seniority สั่นคลอน แต่ในความเป็นจริง ความสำคัญของ ความสามารถในการตัดสินใจว่าจะสร้างอะไร และประเมิน requirement, constraint และผลข้างเคียง กลับยิ่งเพิ่มขึ้น
- AI เขียนโค้ดได้ แต่ มันไม่สามารถนิยามปัญหาและเลือกทิศทางที่ถูกต้องได้
- แม้จะมีปฏิกิริยาสุดขั้วตั้งแต่ “จุดจบของการเขียนโปรแกรม” ไปจนถึง “กระแสไร้สาระ” แต่ผลลัพธ์ที่เกิดขึ้นจริงคือ การขยายผลิตภาพของนักพัฒนาที่ใช้ AI
- อุปสรรคในการเริ่มต้นทำโปรเจ็กต์ส่วนตัวและ side project ลดลงอย่างรวดเร็ว จนทำให้พื้นที่ที่เมื่อก่อนอาจไม่กล้าลอง เช่น ML, เกม หรือเฟรมเวิร์กใหม่ ๆ ก็ เข้าถึงได้ผ่านการเรียนรู้แบบสนทนา
- กระแสนี้ทำงานในฐานะขั้นตอนที่เร่งทิศทางเก่าแก่ของเว็บ นั่นคือ การทำให้การสร้างสรรค์เป็นของทุกคน
- จุดศูนย์กลางกำลังย้ายจากการรู้จักเขียนโค้ด ไปสู่ การรู้ว่าตนเองอยากสร้างอะไร
- แม้แต่คนที่ไม่ใช่นักพัฒนาก็เข้ามามีส่วนร่วมในการสร้าง prototype ได้ และ PM, ดีไซเนอร์ รวมถึงผู้เชี่ยวชาญโดเมนก็สร้างเครื่องมือได้ด้วยตัวเอง ทำให้ เส้นแบ่งระหว่างสายเทคนิคกับไม่ใช่เทคนิคพร่าเลือนลง
- จำนวน indie hacker และ solo builder เพิ่มขึ้น และ สภาพแวดล้อมที่คนคนเดียวก็สร้างผลิตภัณฑ์ที่ใช้งานได้จริงได้ ก็กลายเป็นความจริง
- ในเวลาเดียวกัน React Server Components, htmx, มาตรฐาน CSS และ JavaScript ที่ดีขึ้น รวมถึงเครื่องมืออย่าง Bun ก็ยิ่งเสริมกระแส “มาใช้แพลตฟอร์มโดยตรงกันเถอะ”
- หลังบูมการจ้างงานครั้งใหญ่ในช่วง 2022–2023 ตลาดก็ผันผวนจากการปรับโครงสร้างองค์กร แต่ AI ไม่ได้มาแทนที่นักพัฒนา และ ความสามารถในการใช้ AI กลายเป็นความคาดหวังพื้นฐาน
- ณ ปี 2025 การพัฒนาเว็บอยู่ในสถานะที่ ความเร็วจากไอเดียไปสู่การ deploy เร็วที่สุดในประวัติศาสตร์ และ
- ในสภาพแวดล้อมที่รวม cloud, framework และ AI เข้าด้วยกันนั้น ปัจเจกบุคคลกลายเป็นผู้สร้างสรรค์ที่ทรงพลังที่สุดเท่าที่เคยมีมา
- คำมั่นสัญญาของเว็บที่เริ่มต้นจากแท็ก
<br>ว่า “ใคร ๆ ก็สร้างและแชร์ได้” กำลัง ดำเนินต่อไปในรูปแบบที่แข็งแกร่งยิ่งขึ้นในยุค AI - ตอนนี้คือ ช่วงเวลาที่ยอดเยี่ยมมากในการทำเว็บดีเวลอปเมนต์
6 ความคิดเห็น
อ่านได้อย่างเพลิดเพลินราวกับอ่านหนังสือประวัติศาสตร์
ยุคนั้นที่ผมเช่าเซิร์ฟเวอร์โฮสติ้งจาก Cafe24 สักตัว ลง ZeroBoard แล้วก็ตกแต่งเล่น ๆ ให้ดูเหมือนเป็นคอมมูนิตี้ของตัวเอง 555
อ่านได้อย่างเพลิดเพลินเลยครับ ให้ความรู้สึกเหมือนภาพชีวิตที่ฉายย้อนกลับมาแวบหนึ่งก่อนตายเลย ฮ่าๆ
อ่านได้อย่างสนุกครับ
ถ้าไปทางสภาพแวดล้อมการพัฒนา ก็จะต่อเนื่องไปถึงการมาของ VS Code และ LSP แล้วก็รวมไปถึงเครื่องมือก่อนยุค AI ของ Tabnine ได้ด้วยครับ
JavaScript의 간략한 역사
ถ้าอ่านบทความนี้ไปพร้อมกันก็น่าจะดีครับ
ความคิดเห็นจาก Hacker News
คำกล่าวที่ว่าแต่ละหน้าต้องมี header, navigation และ footer แบบเดียวกัน แต่ไม่มีวิธีแชร์นั้นไม่ถูกต้องทั้งหมด
บนเว็บเซิร์ฟเวอร์มีฟีเจอร์ Server Side Includes(SSI) อยู่แล้ว และถ้าไม่อยากใช้ ก็แก้ได้ง่ายๆ ด้วยคำสั่ง
cat header body > fileเอกสารที่เกี่ยวข้อง: บทช่วยสอน NCSA SSI (1997)
รู้สึกว่าถ้าบทความจบด้วยประโยคประมาณว่า "...และท่ามกลางกระบวนการทั้งหมดนั้น แท็ก
<br>อันแสนเรียบง่ายก็ยังคงทำหน้าที่ของมันอยู่" ก็คงจะดีบริษัทเก่าที่เคยทำงานใช้ระบบสร้างโฟลเดอร์ใหม่ทุกครั้งที่ deploy แล้วเปลี่ยน symbolic link ไปยังเวอร์ชันล่าสุด
แม้จะเป็นงานแบบ manual แต่สามารถ สลับแบบ atomic บนแต่ละเซิร์ฟเวอร์ได้ และ rollback ก็ง่าย เลยรู้สึกว่าเป็นวิธีที่ elegant มาก
ก่อนหน้านั้นต้องคัดลอกไฟล์ไปยังเซิร์ฟเวอร์หลายสิบเครื่องด้วยมือ และรันคำสั่งเอง 10~20 ขั้นตอน เมื่อเทียบกันแล้ววิธีนี้ปลอดภัยและเรียบง่ายกว่ามาก
หลังจากนั้นเคยลองใช้เครื่องมือ automation แต่การตั้งค่าซับซ้อนและมองเห็นภาพรวมได้ยาก กลับกลายเป็น กระบวนการ deploy ที่เปราะบางกว่าเดิม
มีประโยคว่า "ถ้าจะใช้ CGI script ก็ต้องเรียน Perl หรือ C" ซึ่งทำให้สงสัยว่าจำเป็นต้องเขียนถึงหลายร้อยบรรทัดจริงหรือ
ที่จริงแล้วแค่ฟังก์ชัน C ง่ายๆ ก็อ่าน URL parameter ได้
ไม่นานมานี้ฉันเพิ่งทำ เว็บไซต์แบบสอบถามด้วย C ล้วนๆ และทำได้ค่อนข้างสบายเพราะมีไลบรารีสร้าง HTML ที่เคยทำไว้ก่อนแล้ว
ฉันรีแฟกเตอร์ CGI library ของระบบปฏิบัติการมาใช้ และลิงก์ SQLite แบบสแตติกเพื่อ deploy เป็น single binary
ทดสอบผ่าน stdin/stdout ได้โดยไม่ต้องมีเว็บเซิร์ฟเวอร์
สรุปแล้วเว็บไซต์ CRUD นั้นทำด้วย C ก็ง่ายพอสมควร และเพราะ HTML เป็นโครงสร้างแบบต้นไม้ จึงคิดว่า string interpolation เป็นแนวทางที่ไม่เหมาะ
<param>จึงอาจไม่ตรงกันแบบเป๊ะๆ และยังไม่จัดการ percent encodingแต่ถึงจะผ่านไป 30 ปีแล้ว ทุกวันนี้ string interpolation ก็ยังดูเหมือนเป็นเครื่องมือที่ใช้กันมากที่สุดอยู่ดี
เป็นบทความที่ ครอบคลุมและเขียนได้ดีมาก
ผู้เขียนมองโลกในแง่ดี แต่สำหรับฉัน การพัฒนาเว็บดูเหมือนหอคอยที่ไม่มั่นคงซึ่งสร้างขึ้นจาก การปะผุชั่วคราวที่สะสมกันมา
มองว่าเมื่อมาตรฐานเว็บถูกครอบงำโดยผู้ผลิตเบราว์เซอร์ไม่กี่ราย ผลลัพธ์ก็คือการทาสีทับไปเรื่อยๆ โดยไม่เคยแก้ปัญหารากฐาน
เครื่องมือ generative AI ในช่วงหลังก็เป็นเพียงทางออกเฉพาะหน้าเพื่อเลี่ยงความซับซ้อนนี้เท่านั้น
สุดท้ายแล้วฉันคิดว่าหอคอยนี้จะพังลงสักวัน
บทความนี้น่าจะกลายเป็น งานเขียนคลาสสิก ได้เลย
มันสรุปประวัติศาสตร์ของเทคโนโลยีเว็บที่นักพัฒนายุคนี้พลาดไปได้อย่างกระชับ
ตอนอ่านส่วน “Virtual private servers changed this…” ก็ทำให้นึกขึ้นได้ว่า
ที่จริงผู้ให้บริการ VPS รายแรกคือ JohnCompanies ราวปี 2001 และใช้ FreeBSD jail เป็นพื้นฐาน
ลูกค้าต้องการ remote backup และชอบใช้ rsync
ดังนั้นอีก 4 ปีต่อมาฉันจึงจดโดเมน
rsync.net(โดยได้รับอนุญาตจากผู้เขียน rsync/samba)ฉันทำเว็บดีเวลอปเมนต์มาตั้งแต่ปี 1998 ถึง 2012 และการอ่านบทความนี้ก็ให้ความรู้สึกเหมือนได้ ย้อนความทรงจำ
มันยังเป็นสรุปที่ช่วยให้เห็นการเปลี่ยนแปลงหลังจากนั้นได้ในภาพเดียว
เนื้อหาในบทความแทบจะตรงกับลำดับการพัฒนาของเทคโนโลยีเว็บที่ฉันจำได้
CGI ก่อนยุค PHP แม้จะยุ่งยาก แต่ก็ใช้งานได้ดีพอสมควรด้วย mod_perl และ FastCGI
การเขียน CGI ด้วยภาษาแบบคอมไพล์นั้นแทบจะเข้าขั้น masochism และในแง่นั้น PHP ก็เบาและสนุกดี
ฉันเลิกทำฟรอนต์เอนด์ไปก่อนที่ jQuery จะเริ่มดัง เสียอีก
เป็นบทความที่น่าทึ่งจริงๆ
ไม่ได้แค่เรียงลำดับเหตุการณ์ทางเทคโนโลยี แต่ถ่ายทอด จิตวิญญาณของแต่ละยุคสมัย(zeitgeist) ออกมาได้อย่างมีชีวิตชีวา
สิ่งที่น่าประทับใจคือมันเขียนบริบทความเป็นมนุษย์ซึ่งปกติมักส่งต่อกันแบบปากต่อปากออกมาเป็นตัวอักษรได้
แทนที่จะวิจารณ์ว่า “ทำไมโลกคลาวด์ถึงซับซ้อนขนาดนี้” มันช่วยให้เข้าใจว่านี่คือ ผลลัพธ์ทางประวัติศาสตร์จากการตัดสินใจที่สมเหตุสมผลในแต่ละช่วงเวลาเมื่อสะสมต่อกัน
ทำให้รู้สึกถึงความย้อนแย้งของประวัติศาสตร์มนุษย์ผ่านประวัติศาสตร์เทคโนโลยีได้