จุดเริ่มต้นของการเรียนรู้: ทำไมต้องลองทำทุกอย่าง?
การเป็น โปรแกรมเมอร์ ในยุคนี้เปรียบเสมือนการเป็นเชฟในห้องครัวระดับโลก คุณไม่สามารถทำเป็นแค่เมนูเดียวได้ แต่ต้องรู้จักทั้งการเลือกวัตถุดิบ การใช้เตาอบ และการจัดจานให้สวยงาม ในสัปดาห์แรกของซีรีส์ Iskor Devlog นี้ ผมได้ลองสำรวจโลกของซอฟต์แวร์ผ่านหลายมุมมอง ทั้งหน้าบ้าน (Frontend) หลังบ้าน (Backend) ไปจนถึงระบบหลังบ้านที่มองไม่เห็นอย่าง CI/CD
มือใหม่หลายคนมักติดกับดัก "การเลือกเรียนอย่างใดอย่างหนึ่งจนสุดทาง" แต่ในความเป็นจริง การเข้าใจภาพรวมจะช่วยให้คุณทำงานร่วมกับทีมได้ง่ายขึ้นมาก เหมือนกับคนที่เข้าใจว่าทำไมเราต้องวางโครงสร้างบ้านให้แข็งแรงก่อนจะเริ่มตกแต่งผนัง การเรียนรู้แบบเป็ดหรือการเก็บเกี่ยวความรู้เล็กๆ น้อยๆ ในทุกส่วน จะกลายเป็นรากฐานที่มั่นคงเมื่อคุณต้องแก้ปัญหาซับซ้อนในอนาคต
บทความนี้จะพาไปดูประสบการณ์จริงที่ผมได้ทดลองทำในสัปดาห์ที่ผ่านมา โดยเน้นไปที่การลองผิดลองถูกและการนำเครื่องมือจริงมาใช้งาน เพื่อให้คุณเห็นภาพว่าการเป็น Software Developer ที่ดีนั้นไม่ได้วัดกันที่ว่าคุณจำภาษาโปรแกรมได้กี่คำ แต่วัดกันที่ว่าคุณเข้าใจ "กระบวนการ" ในการสร้างแอปพลิเคชันขึ้นมาหนึ่งตัวได้อย่างไร
Frontend: หลีกเลี่ยงกับดักความสวยงามที่ไร้ทิศทาง
สำหรับส่วนของ Frontend หรือส่วนที่ผู้ใช้มองเห็นและโต้ตอบด้วย ผมได้ใช้เวลาศึกษาเรื่อง Vibecoded website ซึ่งหมายถึงเว็บไซต์ที่เน้นแต่ความสวยงามหรือลูกเล่นฉูดฉาดจนลืมเรื่องประสบการณ์ผู้ใช้งาน (UX) ที่ดีไป หลายคนมักหลงทางกับการเลือกสีหรือแอนิเมชันโดยไม่คำนึงถึงโครงสร้างข้อมูลที่ควรจะเป็น
การเขียนเว็บที่ดีไม่ใช่การใส่ลูกเล่นเยอะๆ แต่คือการทำให้ผู้ใช้สามารถใช้งานสิ่งที่เขาต้องการได้เร็วที่สุดและง่ายที่สุด ผมจึงเลือกที่จะหลีกเลี่ยงการทำสิ่งที่ดู "เยอะเกินไป" แล้วหันกลับมาโฟกัสที่ความสะอาดของโค้ดและการจัดวางองค์ประกอบให้ใช้งานได้จริง ซึ่งเป็นทักษะสำคัญที่มือใหม่มักจะมองข้ามไปเพราะมัวแต่ตื่นเต้นกับผลลัพธ์ทางสายตา
หากคุณกำลังฝึกทำโปรเจกต์แรก ผมแนะนำให้เริ่มจากโครงสร้างที่เรียบง่ายก่อนเสมอ ลองดูตัวอย่างการเปรียบเทียบระหว่างแบบที่เน้นแค่ความสวยงาม กับแบบที่เน้นการใช้งาน:
- แบบที่ควรเลี่ยง: ใส่แอนิเมชันทุกหน้า ทำปุ่มกดที่ดูยาก หรือใช้สีที่อ่านข้อความไม่ออก
- แบบที่ควรทำ: ใช้มาตรฐาน Accessibility (การเข้าถึงสำหรับทุกคน) เลือกใช้ฟอนต์ที่อ่านง่าย และวางปุ่มกดให้ชัดเจน
Backend: หัวใจสำคัญของระบบด้วย Spring Boot และ SOLID
เมื่อข้ามมาฝั่ง Backend หรือระบบหลังบ้านที่คอยประมวลผลข้อมูล ผมเลือกใช้ Spring Boot ซึ่งเป็นเฟรมเวิร์กยอดนิยมสำหรับภาษา Java ในการจัดการกับตรรกะธุรกิจที่ซับซ้อน การที่ต้องจัดการกับข้อมูลมหาศาลทำให้ผมเข้าใจว่าทำไมเราถึงต้องมีกฎเกณฑ์ในการเขียนโค้ดที่ชัดเจน
สิ่งที่ผมได้เรียนรู้ควบคู่กันคือ SOLID principles หรือแนวทางปฏิบัติ 5 ข้อที่ช่วยให้ซอฟต์แวร์ของคุณ "ยืดหยุ่น" และ "ดูแลรักษาง่าย" ในระยะยาว ลองนึกภาพว่าถ้าคุณสร้างบ้านโดยไม่มีแบบแปลน วันหนึ่งถ้าคุณอยากทุบผนังห้องนั่งเล่นเพื่อขยายพื้นที่ แต่บ้านทั้งหลังกลับพังลงมา นั่นคือผลลัพธ์ของการเขียนโค้ดที่ไม่คำนึงถึงหลักการเหล่านี้
ตัวอย่างการนำหลักการ Single Responsibility Principle (หน้าที่เดียว) มาใช้ใน Spring Boot เพื่อให้โค้ดแยกส่วนกันชัดเจน:
// คลาสนี้มีหน้าที่จัดการข้อมูลผู้ใช้เพียงอย่างเดียว
@Service
public class UserService {
public void saveUser(User user) {
// จัดการเรื่องการบันทึกข้อมูลลงฐานข้อมูล
}
}
// คลาสนี้มีหน้าที่จัดการเรื่องการส่งอีเมลแยกต่างหาก
@Service
public class EmailService {
public void sendWelcomeEmail(User user) {
// จัดการเรื่องการส่งอีเมล
}
}
การแยกส่วนนี้ช่วยให้เมื่อคุณต้องการแก้ไขระบบอีเมล คุณไม่จำเป็นต้องไปแตะต้องโค้ดส่วนฐานข้อมูล ซึ่งจะลดโอกาสเกิดบั๊ก (ข้อผิดพลาดของโปรแกรม) ได้อย่างมหาศาล
Authentication: ระบบยืนยันตัวตนที่ปลอดภัยด้วย Clerk
การทำระบบ Authentication หรือการตรวจสอบสิทธิ์ว่า "ใครคือคุณ" เป็นเรื่องที่ละเอียดอ่อนมากสำหรับมือใหม่ ผมตัดสินใจใช้ Clerk เพราะมีคอมโพเนนต์ที่สำเร็จรูปและปลอดภัยสูง การพยายามเขียนระบบล็อกอินเองตั้งแต่ศูนย์เป็นเรื่องที่เสี่ยงต่อช่องโหว่ทางความปลอดภัยมากเกินไปสำหรับโปรเจกต์เริ่มต้น
การใช้เครื่องมือสำเร็จรูปช่วยให้เราประหยัดเวลาและมั่นใจได้ว่าระบบของเรามีการเข้ารหัสที่ได้มาตรฐานสากล แทนที่จะต้องมานั่งกังวลเรื่องการเก็บรหัสผ่านในฐานข้อมูลอย่างไรไม่ให้ถูกแฮ็ก การใช้ Clerk ทำให้ผมสามารถสร้างหน้า Sign-in และ Sign-up ได้อย่างรวดเร็วโดยไม่ต้องกังวลกับรายละเอียดเบื้องหลังที่ซับซ้อน
ขั้นตอนการเริ่มต้นใช้งานระบบยืนยันตัวตน:
- ติดตั้งไลบรารีของ Clerk ผ่าน Terminal ด้วยคำสั่ง
npm install @clerk/clerk-react - นำคอมโพเนนต์
<ClerkProvider>ไปครอบส่วนประกอบหลักของแอปฯ - เรียกใช้หน้าล็อกอินด้วยคอมโพเนนต์
<SignIn />ในจุดที่ต้องการให้ผู้ใช้เข้าสู่ระบบ
ผลลัพธ์ที่ได้คือหน้าเว็บที่มีระบบรักษาความปลอดภัยระดับสูง พร้อมรองรับการล็อกอินผ่าน Google หรือ Social Media ต่างๆ ได้ทันทีโดยไม่ต้องเขียนโค้ดเพิ่มเอง
Docker และ CI/CD: พลังของการทำให้ทุกอย่างเป็นอัตโนมัติ
หลายคนอาจสงสัยว่า Docker คืออะไร? ให้อธิบายง่ายๆ มันคือการ "แพ็ก" โปรแกรมของเราพร้อมสภาพแวดล้อมที่จำเป็นทั้งหมดใส่กล่องไว้ เพื่อให้เอาไปวางที่ไหนก็รันได้เหมือนกัน ส่วน CI/CD คือระบบอัตโนมัติที่ช่วยทดสอบและส่งโค้ดขึ้นเซิร์ฟเวอร์โดยที่เราไม่ต้องกดอัปโหลดเองทีละไฟล์
ในสัปดาห์นี้ผมได้หัดใช้ GitHub Actions เพื่อทำ Automated Workflow คือทุกครั้งที่ผมกดบันทึกโค้ดขึ้น GitHub ระบบจะทำการสร้าง Docker Image (ภาพจำลองของแอปฯ ที่พร้อมรัน) และอัปโหลดไปยัง DockerHub โดยอัตโนมัติ ซึ่งนี่คือมาตรฐานที่บริษัทซอฟต์แวร์ทั่วโลกเขาทำกัน
การตั้งค่า GitHub Actions เบื้องต้นในไฟล์ `.github/workflows/main.yml` มีหน้าตาดังนี้:
name: Build and Push Docker Image
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build and push to DockerHub
run: |
docker build -t my-app .
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin
docker push my-app
โค้ดนี้บอกให้ GitHub ทำการ "สร้าง" แอปฯ ของเราทุกครั้งที่มีการเปลี่ยนแปลงโค้ด แล้วส่งไปเก็บไว้บนคลาวด์โดยอัตโนมัติ ทำให้คุณไม่ต้องเสียเวลามานั่งอัปโหลดไฟล์ด้วยมืออีกต่อไป
สรุป: การก้าวไปข้างหน้าอย่างมีทิศทาง
จากการลองทำทุกอย่างในสัปดาห์นี้ ผมพบว่าหัวใจสำคัญของ การเป็นโปรแกรมเมอร์ คือการรู้ว่า "เรากำลังทำอะไรอยู่" ผมได้บทเรียนสำคัญว่าการพยายามทำทุกอย่างพร้อมกันอาจทำให้เราโฟกัสได้ไม่ดีพอ ดังนั้นสำหรับสัปดาห์หน้า ผมจึงวางแผนที่จะโฟกัสไปที่ Authorization (การกำหนดสิทธิ์) และระบบความปลอดภัยของหลังบ้านอย่างจริงจัง
สำหรับมือใหม่ที่กำลังอ่านอยู่ ผมอยากให้คุณเริ่มจาก "การทำให้โปรเจกต์รันได้ก่อน" แล้วค่อยๆ เพิ่มความซับซ้อนเข้าไปทีละนิด อย่ากลัวที่จะลองใช้เครื่องมือใหม่ๆ แต่จงมั่นใจว่าคุณเข้าใจหลักการพื้นฐานของมันจริงๆ เหมือนที่ผมเริ่มจาก Docker จนมาถึง CI/CD ในวันนี้
ตัวอย่างการประยุกต์ใช้: หากคุณกำลังทำโปรเจกต์เว็บขายของ แทนที่จะเสียเวลาเขียนระบบล็อกอินเอง ให้ใช้ Clerk เพื่อประหยัดเวลา แล้วเอาเวลาที่เหลือไปฝึกเขียน Spring Boot เพื่อจัดการระบบจัดการสต็อกสินค้าให้แม่นยำ นี่คือวิธีที่คุณจะเก่งขึ้นอย่างก้าวกระโดดและมีผลงานที่จับต้องได้จริงใน Portfolio ของคุณครับ
ที่มา: Iskor Devlog #1 - Learning a Little Bit of Everything — DEV Community