ความเข้าใจ “OOP กับอุตสาหกรรมซอฟต์แวร์ไทย”

ทำไมบริษัทซอฟต์แวร์ในไทยเลือกใช้ Java และ OOP

ในยุคที่เทคโนโลยีดิจิทัลเข้ามามีบทบาทสำคัญต่อทุกอุตสาหกรรม บริษัทซอฟต์แวร์ชั้นนำในประเทศไทยอย่าง SCG DigitalLINE MANSCB Tech (ธนาคารไทยพาณิชย์)AgodaGrab ThailandCentral Tech (Central Group) และ CP ALL Technology (7-Eleven) ต่างให้ความสำคัญกับการพัฒนาซอฟต์แวร์ที่มีคุณภาพ ปลอดภัย และขยายตัวได้ในระยะยาว

การเลือกใช้ Java ร่วมกับแนวคิด Object-Oriented Programming (OOP) ไม่ใช่เรื่องบังเอิญ แต่เป็นการตัดสินใจเชิงกลยุทธ์ที่มีเหตุผลรองรับหลายประการ


เหตุผลหลักที่บริษัทไทยเลือก Java

1. ความเสถียรและความน่าเชื่อถือ (Stability & Reliability)

Java ถูกพัฒนามากกว่า 30 ปี (เริ่มต้นปี 1995) และได้รับการพิสูจน์แล้วว่าเป็นภาษาที่เสถียร มีประสิทธิภาพ และรองรับการใช้งานระดับองค์กรขนาดใหญ่ (Enterprise-level)

ตัวอย่างในไทย:

  • ธนาคารไทยพาณิชย์ (SCB) ใช้ Java สำหรับระบบ Core Banking ที่ต้องประมวลผลธุรกรรมหลายล้านรายการต่อวัน
  • LINE MAN ใช้ Java Backend สำหรับระบบ Order Management และ Payment Gateway ที่ต้องทำงาน 24/7 โดยไม่มีวันหยุด
  • Agoda ใช้ Java สำหรับ Booking Engine ที่ต้องจัดการการจองห้องพักจากทั่วโลกพร้อมกัน

ข้อดี:

  • รองรับ High Availability (HA) – ระบบไม่หยุดทำงาน
  • มี Backward Compatibility – โค้ดเก่ายังใช้งานได้กับ JVM รุ่นใหม่
  • Production-proven – ถูกใช้งานจริงในระบบสำคัญทั่วโลก เช่น Amazon, Netflix, Twitter (X)

2. แนวคิด OOP รองรับการพัฒนาระบบขนาดใหญ่

Object-Oriented Programming เป็นวิธีคิดและออกแบบซอฟต์แวร์ที่แบ่งระบบออกเป็น Objects (วัตถุ) ที่มีคุณสมบัติและพฤติกรรมเฉพาะตัว ซึ่งช่วยให้:

2.1 จัดการความซับซ้อนได้ดี (Manage Complexity)

เมื่อระบบมีขนาดใหญ่ขึ้น เช่น ระบบ E-Commerce ที่มีส่วนประกอบหลายร้อย classes การแบ่งเป็น objects ช่วยให้เข้าใจและจัดการได้ง่าย

ตัวอย่าง: ระบบ Food Delivery (LINE MAN/Grab Food)

java// แบ่งระบบเป็น Objects ที่มีหน้าที่ชัดเจน
public class Customer {
    private String customerId;
    private String name;
    private String phoneNumber;
    private Address deliveryAddress;
    
    public Order placeOrder(Restaurant restaurant, List<MenuItem> items) {
        // Logic การสั่งอาหาร
    }
}

public class Restaurant {
    private String restaurantId;
    private String name;
    private List<MenuItem> menu;
    private boolean isOpen;
    
    public void acceptOrder(Order order) {
        // Logic รับออเดอร์
    }
    
    public void prepareFood(Order order) {
        // Logic เตรียมอาหาร
    }
}

public class Rider {
    private String riderId;
    private String name;
    private Vehicle vehicle;
    private Location currentLocation;
    
    public void pickupOrder(Order order, Restaurant restaurant) {
        // Logic รับอาหารจากร้าน
    }
    
    public void deliverOrder(Order order, Customer customer) {
        // Logic ส่งอาหาร
    }
}

public class Order {
    private String orderId;
    private Customer customer;
    private Restaurant restaurant;
    private List<OrderItem> items;
    private OrderStatus status;
    private double totalAmount;
    
    public void updateStatus(OrderStatus newStatus) {
        this.status = newStatus;
        notifyCustomer();
    }
}

ประโยชน์:

  • แต่ละ class มีหน้าที่ชัดเจน (Single Responsibility)
  • ง่ายต่อการทำงานร่วมกันของทีม 50-100 คน
  • แก้ไขส่วนใดส่วนหนึ่งไม่กระทบส่วนอื่น

2.2 นำโค้ดกลับมาใช้ได้ (Code Reusability)

หลักการ Inheritance (การสืบทอด) ช่วยให้ไม่ต้องเขียนโค้ดซ้ำ

ตัวอย่าง: ระบบ Payment Gateway (SCB, Kbank, PromptPay)

java// Abstract class สำหรับ Payment
public abstract class PaymentMethod {
    protected String accountId;
    protected String accountName;
    
    // Template method - ขั้นตอนการชำระเงินเหมือนกัน
    public final PaymentResult processPayment(double amount) {
        if (!validate()) {
            return PaymentResult.failed("Validation failed");
        }
        
        boolean charged = charge(amount);
        
        if (charged) {
            recordTransaction(amount);
            sendReceipt();
            return PaymentResult.success();
        }
        
        return PaymentResult.failed("Charge failed");
    }
    
    // Abstract methods - แต่ละ payment แตกต่างกัน
    protected abstract boolean validate();
    protected abstract boolean charge(double amount);
    
    // Common methods - ใช้ร่วมกันได้
    protected void recordTransaction(double amount) {
        System.out.println("Recording transaction: " + amount);
    }
    
    protected void sendReceipt() {
        System.out.println("Sending receipt to customer");
    }
}

// SCB PromptPay
public class SCBPromptPay extends PaymentMethod {
    private String phoneNumber;
    
    @Override
    protected boolean validate() {
        return phoneNumber != null && phoneNumber.matches("0\\d{9}");
    }
    
    @Override
    protected boolean charge(double amount) {
        System.out.println("Charging " + amount + " via SCB PromptPay: " + phoneNumber);
        // เชื่อมต่อ SCB API
        return true;
    }
}

// Kbank Credit Card
public class KbankCreditCard extends PaymentMethod {
    private String cardNumber;
    private String cvv;
    private String expiryDate;
    
    @Override
    protected boolean validate() {
        return cardNumber != null && cardNumber.length() == 16
            && cvv != null && cvv.length() == 3;
    }
    
    @Override
    protected boolean charge(double amount) {
        System.out.println("Charging " + amount + " via Kbank Card: " + 
                          cardNumber.substring(12));
        // เชื่อมต่อ Kbank Payment Gateway
        return true;
    }
}

// TrueMoney Wallet
public class TrueMoneyWallet extends PaymentMethod {
    private String walletId;
    private double balance;
    
    @Override
    protected boolean validate() {
        return walletId != null && balance > 0;
    }
    
    @Override
    protected boolean charge(double amount) {
        if (balance < amount) {
            return false;
        }
        balance -= amount;
        System.out.println("Charged " + amount + " from TrueMoney Wallet");
        return true;
    }
}

การใช้งาน:

javapublic class CheckoutService {
    public void checkout(Order order, PaymentMethod payment) {
        double amount = order.getTotalAmount();
        
        // ไม่ต้องสนใจว่า payment เป็น class ไหน
        PaymentResult result = payment.processPayment(amount);
        
        if (result.isSuccess()) {
            order.markAsPaid();
            order.startPreparing();
        } else {
            order.markAsFailed();
        }
    }
}

// การเรียกใช้
PaymentMethod payment1 = new SCBPromptPay();
PaymentMethod payment2 = new KbankCreditCard();
PaymentMethod payment3 = new TrueMoneyWallet();

CheckoutService checkout = new CheckoutService();
checkout.checkout(order, payment1); // ใช้ PromptPay
checkout.checkout(order, payment2); // ใช้ Credit Card
checkout.checkout(order, payment3); // ใช้ Wallet

ประโยชน์:

  • โค้ดร่วม (validation, recording, receipt) เขียนครั้งเดียวใช้ได้หลายที่
  • เพิ่ม payment method ใหม่ได้โดยไม่แก้โค้ดเก่า
  • ทดสอบแยกกันได้ง่าย

2.3 ปรับเปลี่ยนได้ง่าย (Maintainability)

เมื่อธุรกิจเปลี่ยนแปลง ระบบต้องปรับตาม OOP ช่วยให้แก้ไขได้ง่ายโดยไม่กระทบส่วนอื่น

ตัวอย่าง: ระบบโปรโมชั่น (Shopee/Lazada/Central Online)

java// Strategy Pattern - เปลี่ยน promotion ได้ตาม campaign
public interface DiscountStrategy {
    double calculateDiscount(double originalPrice, Customer customer);
    String getPromotionName();
}

// Flash Sale - ลด 50%
public class FlashSaleDiscount implements DiscountStrategy {
    private double discountPercentage = 50.0;
    
    @Override
    public double calculateDiscount(double originalPrice, Customer customer) {
        return originalPrice * (discountPercentage / 100);
    }
    
    @Override
    public String getPromotionName() {
        return "Flash Sale 50%";
    }
}

// Member Exclusive - ลดตามระดับสมาชิก
public class MemberDiscount implements DiscountStrategy {
    @Override
    public double calculateDiscount(double originalPrice, Customer customer) {
        switch (customer.getMemberTier()) {
            case PLATINUM:
                return originalPrice * 0.20; // ลด 20%
            case GOLD:
                return originalPrice * 0.15; // ลด 15%
            case SILVER:
                return originalPrice * 0.10; // ลด 10%
            default:
                return 0;
        }
    }
    
    @Override
    public String getPromotionName() {
        return "Member Exclusive Discount";
    }
}

// Coupon Code - ลดตามโค้ด
public class CouponDiscount implements DiscountStrategy {
    private String couponCode;
    private double discountAmount;
    
    public CouponDiscount(String couponCode, double discountAmount) {
        this.couponCode = couponCode;
        this.discountAmount = discountAmount;
    }
    
    @Override
    public double calculateDiscount(double originalPrice, Customer customer) {
        if (validateCoupon(couponCode, customer)) {
            return discountAmount;
        }
        return 0;
    }
    
    private boolean validateCoupon(String code, Customer customer) {
        // ตรวจสอบโค้ดกับฐานข้อมูล
        return true;
    }
    
    @Override
    public String getPromotionName() {
        return "Coupon: " + couponCode;
    }
}

// Bundle Deal - ซื้อครบลดเพิ่ม
public class BundleDiscount implements DiscountStrategy {
    private int requiredQuantity;
    private double bonusDiscount;
    
    @Override
    public double calculateDiscount(double originalPrice, Customer customer) {
        // ถ้าซื้อครบ requiredQuantity ลดเพิ่ม
        return bonusDiscount;
    }
    
    @Override
    public String getPromotionName() {
        return "Buy " + requiredQuantity + " Get Extra Discount";
    }
}

การใช้งาน:

javapublic class PricingService {
    private DiscountStrategy discountStrategy;
    
    public void setDiscountStrategy(DiscountStrategy strategy) {
        this.discountStrategy = strategy;
    }
    
    public double calculateFinalPrice(Product product, Customer customer) {
        double originalPrice = product.getPrice();
        double discount = 0;
        
        if (discountStrategy != null) {
            discount = discountStrategy.calculateDiscount(originalPrice, customer);
        }
        
        double finalPrice = originalPrice - discount;
        
        System.out.println("Product: " + product.getName());
        System.out.println("Original Price: " + originalPrice);
        System.out.println("Promotion: " + 
                          (discountStrategy != null ? discountStrategy.getPromotionName() : "None"));
        System.out.println("Discount: " + discount);
        System.out.println("Final Price: " + finalPrice);
        
        return finalPrice;
    }
}

// การใช้งานจริง - เปลี่ยน strategy ได้ทันที
public class ECommerceDemo {
    public static void main(String[] args) {
        Product laptop = new Product("MacBook Pro", 45900);
        Customer customer = new Customer("John", MemberTier.GOLD);
        
        PricingService pricing = new PricingService();
        
        // Campaign 1: Flash Sale
        pricing.setDiscountStrategy(new FlashSaleDiscount());
        pricing.calculateFinalPrice(laptop, customer);
        
        // Campaign 2: Member Discount
        pricing.setDiscountStrategy(new MemberDiscount());
        pricing.calculateFinalPrice(laptop, customer);
        
        // Campaign 3: Coupon
        pricing.setDiscountStrategy(new CouponDiscount("SAVE500", 500));
        pricing.calculateFinalPrice(laptop, customer);
    }
}

ประโยชน์:

  • Marketing เปลี่ยน campaign ได้เลย ไม่ต้องรอ developer แก้โค้ด
  • เพิ่มโปรโมชั่นแบบใหม่ได้โดยไม่แตะโค้ดเก่า
  • Test แต่ละ promotion แยกกันได้

3. มาตรฐานอุตสาหกรรม (Industry Standard)

Java เป็นมาตรฐานที่ยอมรับในวงการซอฟต์แวร์ทั่วโลก โดยเฉพาะ Enterprise Applications

3.1 Framework และ Ecosystem ที่สมบูรณ์

Spring Framework เป็น framework อันดับ 1 ของโลกสำหรับพัฒนา Backend

java// ตัวอย่าง Spring Boot - REST API สำหรับ Order Service
@RestController
@RequestMapping("/api/orders")
public class OrderController {
    
    @Autowired
    private OrderService orderService;
    
    @PostMapping
    public ResponseEntity<Order> createOrder(@RequestBody OrderRequest request) {
        Order order = orderService.createOrder(request);
        return ResponseEntity.ok(order);
    }
    
    @GetMapping("/{orderId}")
    public ResponseEntity<Order> getOrder(@PathVariable String orderId) {
        Order order = orderService.getOrderById(orderId);
        return ResponseEntity.ok(order);
    }
    
    @PutMapping("/{orderId}/status")
    public ResponseEntity<Order> updateStatus(
            @PathVariable String orderId,
            @RequestParam OrderStatus status) {
        Order order = orderService.updateStatus(orderId, status);
        return ResponseEntity.ok(order);
    }
}

@Service
public class OrderService {
    
    @Autowired
    private OrderRepository orderRepository;
    
    @Autowired
    private PaymentService paymentService;
    
    @Autowired
    private NotificationService notificationService;
    
    @Transactional
    public Order createOrder(OrderRequest request) {
        // Business logic
        Order order = new Order();
        order.setCustomerId(request.getCustomerId());
        order.setItems(request.getItems());
        order.setTotalAmount(calculateTotal(request.getItems()));
        order.setStatus(OrderStatus.PENDING);
        
        // Save to database
        order = orderRepository.save(order);
        
        // Process payment
        PaymentResult payment = paymentService.processPayment(order);
        
        if (payment.isSuccess()) {
            order.setStatus(OrderStatus.PAID);
            notificationService.sendOrderConfirmation(order);
        }
        
        return orderRepository.save(order);
    }
}

บริษัทไทยที่ใช้ Spring Boot:

  • LINE MAN – Backend API ทั้งหมด
  • SCB Tech – Mobile Banking API
  • Central Tech – E-Commerce Platform
  • Agoda – Booking Service
  • Grab Thailand – Ride Matching Service

3.2 Tools และ Infrastructure

Java มี ecosystem ครบครัน:

Build Tools:

  • Maven, Gradle – จัดการ dependencies และ build project

Testing:

  • JUnit, Mockito – Unit testing
  • Selenium – Integration testing

Monitoring:

  • Prometheus, Grafana – Performance monitoring
  • ELK Stack (Elasticsearch, Logstash, Kibana) – Log analysis

CI/CD:

  • Jenkins, GitLab CI, GitHub Actions – Automated deployment

Cloud Platforms:

  • AWS (Amazon Web Services)
  • Google Cloud Platform (GCP)
  • Microsoft Azure

ทุกอย่างนี้ support Java อย่างเต็มที่


4. ตลาดงานในประเทศไทย

4.1 ความต้องการ Java Developer สูง

ข้อมูลจาก JobsDB, LinkedIn Thailand (2024-2025):

ตำแหน่งเงินเดือนเริ่มต้น (จบใหม่)เงินเดือน 3-5 ปี
Junior Java Developer18,000 – 25,000 บาท35,000 – 50,000 บาท
Java Backend Developer25,000 – 35,000 บาท50,000 – 80,000 บาท
Senior Java Engineer45,000 – 60,000 บาท80,000 – 150,000 บาท
Java Architect80,000 – 120,000 บาท150,000 – 250,000 บาท

บริษัทที่เปิดรับ Java Developer ในไทย:

  • SCB Tech (ธนาคารไทยพาณิชย์)
  • LINE Company Thailand
  • Agoda
  • Grab Thailand
  • Central Tech
  • CP ALL Technology
  • True Digital
  • AIS (Advanced Info Service)
  • Kasikornbank (K PLUS)
  • ThoughtWorks Thailand
  • Salesforce Thailand
  • IBM Thailand
  • Accenture Thailand

4.2 Career Path ที่ชัดเจน

textJunior Java Developer (0-2 ปี)
    ↓
Mid-level Java Developer (2-5 ปี)
    ↓
Senior Java Developer (5-8 ปี)
    ↓
    ├→ Technical Path:
    │   ├→ Tech Lead
    │   ├→ Software Architect
    │   └→ Principal Engineer
    │
    └→ Management Path:
        ├→ Engineering Manager
        ├→ Director of Engineering
        └→ CTO (Chief Technology Officer)

5. Java ใน Startup Ecosystem ไทย

Startup ในไทยที่ใช้ Java:

Fintech:

  • Omise (Payment Gateway) – Java Backend
  • Rabbit LINE Pay – Java + Spring Boot
  • 2C2P (Payment Processor) – Java Core

E-Commerce:

  • Shopee Thailand – Java Microservices
  • Lazada Thailand – Java Backend

Logistics:

  • Flash Express – Java Order Management
  • Kerry Express – Java Tracking System

HealthTech:

  • Doctor Raksa – Java API
  • MorDee (โมดี) – Java Backend

6. เปรียบเทียบ Procedural (C) กับ OOP (Java)

ตัวอย่างระบบธนาคาร

แบบ Procedural (C):

c// C Language - Procedural approach
#include <stdio.h>
#include <string.h>

// Global variables (ข้อมูลกระจัดกระจาย)
char account1_number[20];
char account1_name[100];
double account1_balance;

char account2_number[20];
char account2_name[100];
double account2_balance;

// Functions (แยกจากข้อมูล)
void deposit_account1(double amount) {
    account1_balance += amount;
    printf("Account %s deposited: %.2f\n", account1_number, amount);
}

void withdraw_account1(double amount) {
    if (account1_balance >= amount) {
        account1_balance -= amount;
        printf("Account %s withdrawn: %.2f\n", account1_number, amount);
    } else {
        printf("Insufficient balance!\n");
    }
}

void deposit_account2(double amount) {
    account2_balance += amount;
    printf("Account %s deposited: %.2f\n", account2_number, amount);
}

void withdraw_account2(double amount) {
    if (account2_balance >= amount) {
        account2_balance -= amount;
        printf("Account %s withdrawn: %.2f\n", account2_number, amount);
    } else {
        printf("Insufficient balance!\n");
    }
}

int main() {
    // ต้อง manually จัดการทุกอย่าง
    strcpy(account1_number, "001-123456");
    strcpy(account1_name, "John Doe");
    account1_balance = 1000.0;
    
    strcpy(account2_number, "001-234567");
    strcpy(account2_name, "Jane Smith");
    account2_balance = 2000.0;
    
    deposit_account1(500);
    withdraw_account1(300);
    
    deposit_account2(1000);
    withdraw_account2(500);
    
    return 0;
}

ปัญหา:

  • ข้อมูลและ function แยกกัน → ยากต่อการจัดการ
  • ถ้ามี account 100 บัญชี ต้องมี variable 300 ตัว!
  • ไม่สามารถ reuse code ได้ง่าย
  • Error prone – ลืม update ตัวแปร

แบบ OOP (Java):

java// Java - Object-Oriented approach
public class BankAccount {
    // ข้อมูลและ behavior รวมอยู่ที่เดียว
    private String accountNumber;
    private String accountName;
    private double balance;
    
    // Constructor
    public BankAccount(String accountNumber, String accountName, double initialBalance) {
        this.accountNumber = accountNumber;
        this.accountName = accountName;
        this.balance = initialBalance;
    }
    
    // Methods
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Account " + accountNumber + " deposited: " + amount);
        }
    }
    
    public void withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
            System.out.println("Account " + accountNumber + " withdrawn: " + amount);
        } else {
            System.out.println("Insufficient balance!");
        }
    }
    
    public double getBalance() {
        return balance;
    }
    
    public void displayInfo() {
        System.out.println("Account: " + accountNumber);
        System.out.println("Name: " + accountName);
        System.out.println("Balance: " + balance);
    }
}

public class BankDemo {
    public static void main(String[] args) {
        // สร้าง objects - ง่ายและชัดเจน
        BankAccount account1 = new BankAccount("001-123456", "John Doe", 1000.0);
        BankAccount account2 = new BankAccount("001-234567", "Jane Smith", 2000.0);
        
        // ใช้งาน methods
        account1.deposit(500);
        account1.withdraw(300);
        account1.displayInfo();
        
        account2.deposit(1000);
        account2.withdraw(500);
        account2.displayInfo();
        
        // ถ้ามี 100 accounts - ใช้ Array หรือ List
        List<BankAccount> accounts = new ArrayList<>();
        accounts.add(account1);
        accounts.add(account2);
        // เพิ่มได้เรื่อยๆ
    }
}

ข้อดี OOP:

  • ข้อมูลและ behavior รวมกัน (Encapsulation)
  • สร้าง account กี่บัญชีก็ได้ด้วย class เดียว
  • Code สะอาด อ่านง่าย maintain ง่าย
  • ขยายได้ง่าย (เช่น เพิ่ม SavingsAccount, CheckingAccount)

7. สรุป: ทำไม Java + OOP สำคัญสำหรับวิศวกรซอฟต์แวร์ไทย

เหตุผลประโยชน์
เสถียรและน่าเชื่อถือใช้งานในระบบสำคัญได้ (Banking, E-Commerce)
OOP จัดการความซับซ้อนพัฒนาระบบขนาดใหญ่ได้ (Scalability)
Reusabilityลดเวลาพัฒนา ลด bugs
Maintainabilityแก้ไขและขยายระบบง่าย
มาตรฐานอุตสาหกรรมSpring, Microservices, Cloud-ready
ตลาดงานสูงบริษัทชั้นนำในไทยต้องการ Java Dev
Ecosystem สมบูรณ์Tools, Framework, Community support
Career Growthเงินเดือนและโอกาสก้าวหน้าดี

เตรียมตัวเป็น Java Developer มืออาชีพ

เมื่อจบวิชานี้ นักศึกษาจะสามารถ:

✅ เข้าใจหลักการ OOP และประยุกต์ใช้ได้จริง
✅ พัฒนา Backend API ด้วย Java
✅ ออกแบบระบบด้วย UML และ Design Patterns
✅ ทำงานร่วมกับทีมด้วย Git/GitHub
✅ เตรียมพร้อมเรียนต่อ Spring Boot, Microservices
✅ สมัครงาน Junior Java Developer ได้ทันที

การเรียน OOP ด้วย Java ไม่ใช่แค่เรียนภาษาโปรแกรมอีกภาษา แต่คือการเรียนรู้วิธีคิดและออกแบบซอฟต์แวร์ระดับมืออาชีพ ที่ใช้งานได้จริงในอุตสาหกรรมไทยและทั่วโลก