PipeCraft

Roadmap Progress

ข้อมูลเบื้องต้นเกี่ยวกับวิศวกรรมข้อมูล (Introduction to Data Engineering) Python สำหรับ Data Engineering พื้นฐาน Linux & CLI สำหรับวิศวกรข้อมูล Git สำหรับระบบงานข้อมูลและทีมพัฒนา พื้นฐานเครือข่าย เว็บเทคโนโลยี และระบบกระจายศูนย์ (Web Fundamentals, Networking & Distributed Systems) SQL ขั้นสูง (Window Functions & Optimization) ฐานข้อมูลไม่ใช่เชิงสัมพันธ์ (NoSQL Databases & Modern Stores) การออกแบบโครงสร้างข้อมูล (Star/Snowflake & SCD) โครงสร้างพื้นฐานเครือข่ายระบบคลาวด์ (Cloud-based Networking) สถาปัตยกรรม Data Lakehouse (Apache Iceberg & MinIO) Local-first Data Engineering ด้วย DuckDB โครงสร้างพื้นฐานในรูปแบบโค้ด (IaC ด้วย Terraform) การแปลงข้อมูลระดับโปรด้วย dbt-core ข้อตกลงร่วมด้านข้อมูล (Data Contracts) การบริการและการส่งต่อข้อมูลวิเคราะห์ (Data Serving & Reverse ETL) การประมวลผลข้อมูลขนาดใหญ่แบบกระจายด้วย Apache Spark ระบบจัดการเวิร์กโฟลว์ข้อมูล (Airflow, Dagster & Prefect) การประมวลผลข้อมูลแบบเรียลไทม์ด้วย Kafka & Redpanda การจัดการคอนเทนเนอร์และคลัสเตอร์ (Containers & Kubernetes) ระบบ CI/CD และการเฝ้าระวังคุณภาพข้อมูล (CI/CD, Monitoring & Testing) ระบบความปลอดภัยและการควบคุมข้อมูล (Security, Governance & Privacy) ระบบปฏิบัติการและประมวลผลโมเดล (Machine Learning & MLOps) รากฐานของ AWS VPC การจัดการเส้นทางขั้นสูงและ NAT Gateway การเชื่อมต่อหลาย VPC และ Hybrid Cloud VPC Endpoints (PrivateLink) ระบบรักษาความปลอดภัยขอบเขตเครือข่าย สถาปัตยกรรมเครือข่ายสำหรับ EKS IPv6 และการจัดการ IP Address สถาปัตยกรรมเครือข่ายระดับโลก แก่นแท้ของสถาปัตยกรรม Kubernetes สถาปัตยกรรมเครื่องและคอมโพเนนต์ เลเยอร์ที่เชื่อมต่อได้ (Pluggable Layers) การรันบนโปรดักชันระดับองค์กร Apache Flink Stateful Stream Processing Real-Time CDC & Event Sourcing at Scale Low-Latency Stream-Table Joins & Windowing Data Lineage & Metadata Graph Engineering Statistical Anomaly Detection & Data Drift Data Incident Management & Automated DLQ Remediation Cloud Data FinOps & Cost Optimization Mechanics Data Mesh & Multi-Tenant Platform Architecture Vector Databases & AI-Ready Data Infrastructure API Fundamentals, Architectures & Core Components API Versioning, Docs, Real-Time & Microservices Production Reliability, Security & Resiliency World-Class Master Architecture & Traffic Management
บทที่ 1: รากฐานวิศวกรรมซอฟต์แวร์และระบบ (Foundations of Software & Systems)

พื้นฐานเครือข่าย เว็บเทคโนโลยี และระบบกระจายศูนย์ (Web Fundamentals, Networking & Distributed Systems)

1.5 พื้นฐานเครือข่าย เว็บเทคโนโลยี และระบบกระจายศูนย์ (Web Fundamentals, Networking & Distributed Systems)

ทำไมเว็บเปิดไม่ได้ทั้งที่โค้ดไม่ได้ Error? ทำไมเปลี่ยน Domain แล้วต้องรอ DNS? ทำไม API ตอบกลับเป็น 404, 401 หรือ 500? และทำไมเว็บเดียวกันบางคนเข้าเร็วแต่บางคนโหลดช้า? คำตอบของปัญหาเหล่านี้ไม่ได้อยู่แค่ใน HTML, CSS หรือ JavaScript แต่อยู่ในพื้นฐานของ Networking และระบบ Web Fundamentals เมื่อเราเข้าใจสิ่งที่เกิดขึ้นตั้งแต่ผู้ใช้พิมพ์ URL จนหน้าเว็บปรากฏบนหน้าจอ เราจะสามารถ Debug ปัญหา Deploy ระบบ และออกแบบท่อส่งข้อมูลระดับวิชาชีพได้อย่างมืออาชีพ

1. โครงสร้างพื้นฐานของ Web, IP Address, Domain Name และ DNS

Learning Progression

  • [BASIC] ปูพื้นฐานภาษาเข้าใจง่าย - เข้าใจคอนเซปต์ภาพรวมและการแก้ปัญหาเบื้องต้น
  • [INTERMEDIATE] โค้ด/คอนฟิกไวยากรณ์จริง - การเขียนโค้ดเพื่อใช้งานจริงในระบบ
  • [PROFESSIONAL] Under-the-hood & Performance/FinOps - กลไกเบื้องลึกและการรีดประสิทธิภาพ

Real-World Enterprise Scenario

เคสระบบการเงิน/Big Tech: การรองรับ Transaction จำนวนมหาศาลต่อวินาทีพร้อมประกัน Data Integrity สูงสุด โดยใช้สถาปัตยกรรมที่ยืดหยุ่นและการมอนิเตอร์ระดับสูง

ทฤษฎีและกลไกการทำงาน (How it works): Networking คือการเชื่อมต่ออุปกรณ์หลายเครื่องเข้าด้วยกันเพื่อให้สื่อสารข้อมูลกันได้ โดยมี Protocol เป็นภาษากลาง บนโลกของ Web มีความแตกต่างสำคัญระหว่าง Internet (โครงสร้างพื้นฐานเปรียบเหมือนระบบถนน) และ Web (บริการขนส่งที่วิ่งอยู่บนถนนโดยใช้ URL, DNS, HTTP, Browser และ Server)

อุปกรณ์ทุกเครื่องต้องมีที่อยู่คือ IP Address แบ่งเป็น Private IP (ใช้ภายใน เช่น 192.168.1.10) และ Public IP (ใช้ติดต่อบน Internet) โดยมี 2 รูปแบบหลักคือ IPv4 (32-bit เช่น 142.250.199.78) และ IPv6 (128-bit เช่น 2001:db8::1) เนื่องจากมนุษย์จำตัวเลขได้ยาก จึงมีระบบ Domain Name System (DNS) ทำหน้าที่เป็นสมุดรายชื่อแปลง Domain Name เป็น IP Address โดยมี DNS Records ที่สำคัญ ได้แก่:
- A Record: ชี้ Domain ไปยัง IPv4
- AAAA Record: ชี้ Domain ไปยัง IPv6
- CNAME Record: กำหนดชื่อแทน (Alias) ไปยัง Domain อื่น
- MX Record: ระบุ Mail Server
- TXT Record: บันทึกข้อมูลข้อความ เช่น การยืนยันตัวตน Domain/SPF
- NS Record: ระบุ Name Server ผู้ดูแล Domain

# Python script to resolve domain name DNS records and inspect IP addresses
import socket

def resolve_domain_info(domain):
    print(f"=== Resolving DNS Info for: {domain} ===")
    try:
        # Resolve IPv4 Address (A Record)
        ipv4 = socket.gethostbyname(domain)
        print(f"[A Record] IPv4 Address: {ipv4}")
        
        # Resolve all addresses info (including IPv6 AAAA)
        addr_info = socket.getaddrinfo(domain, None)
        for info in addr_info:
            family = "IPv6" if info[0] == socket.AF_INET6 else "IPv4"
            print(f"[{family}] Socket Addr: {info[4][0]}")
    except socket.gaierror as e:
        print(f"DNS Resolution Failed: {e}")

resolve_domain_info("google.com")
                    

Use Case ในชีวิตจริง (Real-world Scenario): เมื่อบริษัททำการย้ายคลังข้อมูลหรือ API Gateway ไปยัง Cloud Provider ใหม่ วิศวกรข้อมูลต้องทำการอัปเดต A Record หรือ CNAME ใน DNS Server เพื่อชี้ไปยัง IP / Endpoint ใหม่ของระบบคลาวด์

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): เมื่อเปลี่ยน DNS Record แล้ว เว็บไซต์หรือ API ปลายทางอาจยังไม่เปลี่ยนทันทีเนื่องจากข้อมูลเดิมยังค้างอยู่ใน Cache ของ DNS Resolvers และ Browser ตามค่า TTL (Time To Live) แก้ไขโดยการลดค่า TTL ลงล่วงหน้า (เช่น เหลือ 300 วินาที) ก่อนทำการย้าย Server จริง เพื่อให้การอัปเดตกระจายตัวอย่างรวดเร็ว

2. Transport Layer: TCP/IP vs UDP และการจัดการ Port & Firewall

ทฤษฎีและกลไกการทำงาน (How it works): การสื่อสารข้ามเครือข่ายอาศัยชุดโปรโตคอล TCP/IP โดย IP ทำหน้าที่ระบุที่อยู่ปลายทาง และ TCP ทำหน้าที่รับประกันว่าข้อมูลถูกส่งไปครบถ้วน ถูกลำดับ และเชื่อถือได้ ผ่านกระบวนการ TCP 3-Way Handshake (SYN -> SYN-ACK -> ACK) เหมาะกับงานที่ห้ามเสียข้อมูล เช่น HTTP, API, Database (PostgreSQL, MySQL), SSH และ Email

ในทางตรงกันข้าม UDP (User Datagram Protocol) ตัดขั้นตอนการยืนยันและการสร้าง Connection ออกเพื่อแลกกับความรวดเร็วสูงสุด เหมาะกับงานที่ไวต่อเวลา เช่น Video Streaming, Voice Calls, Telemetry Log Ingestion

Port เปรียบเสมือนหมายเลขห้องภายในอาคาร (IP Address คือที่อยู่อาคาร) เพื่อให้ Server เครื่องเดียวเปิดให้บริการหลายระบบพร้อมกันได้ เช่น Port 80 (HTTP), 443 (HTTPS), 22 (SSH), 3306 (MySQL), 5432 (PostgreSQL), 6379 (Redis)

# Simple TCP vs UDP Socket Listener in Python

import socket
import threading

def start_tcp_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    print("[TCP Server] Listening on 127.0.0.1:8080 (Reliable)...")
    while True:
        conn, addr = server.accept()
        data = conn.recv(1024)
        conn.sendall(b"HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello via TCP")
        conn.close()

# TCP ensures zero packet loss via ACK confirmation
threading.Thread(target=start_tcp_server, daemon=True).start()
                    

Use Case ในชีวิตจริง (Real-world Scenario): ท่อส่งข้อมูล ETL/ELT ที่เชื่อมต่อกับ Database (เช่น PostgreSQL Port 5432) จะใช้ TCP เพื่อการันตีว่าแถวข้อมูลทุกเรคคอร์ดเดินทางไปถึงครบถ้วน ส่วนระบบสตรีมมิ่งเซนเซอร์ IoT จะใช้ UDP ส่งค่าอุณหภูมิความถี่สูงเพื่อความรวดเร็ว

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การเผลอเปิด Port ฐานข้อมูล (เช่น 5432 หรือ 3306) ออกสู่ Public Internet โดยไม่ตั้งค่า Firewall/Security Group ทำให้โดนแฮกเกอร์โจมตี brute-force ได้ แก้ไขโดยการตั้งค่า Firewall ให้ปิด Port สำคัญทั้งหมด และอนุญาต (Whitelist) เฉพาะ IP ของ Private Subnet หรือผ่าน VPN เท่านั้น

3. โครงสร้าง URL, HTTP Messages, HTTP Methods และ Status Codes Debugging

ทฤษฎีและกลไกการทำงาน (How it works): โครงสร้างของ URL เช่น https://api.example.com:443/products?page=2#reviews ประกอบด้วย Protocol (https), Subdomain (api), Domain (example.com), Port (443), Path (/products), Query String (?page=2) และ Fragment (#reviews)

HTTP (Hypertext Transfer Protocol) ทำงานแบบ Client-Server โดย Client ส่ง Request และ Server ตอบ Response กลับมา HTTP Methods ใช้บอกเจตนาในการกระทำ:
- GET: อ่าน/ดึงข้อมูล (Idempotent)
- POST: สร้างข้อมูลใหม่
- PUT: แทนที่ข้อมูลเดิมทั้งรายการ (Idempotent)
- PATCH: แก้ไขข้อมูลบางส่วน
- DELETE: ลบข้อมูล (Idempotent)

HTTP Status Codes บ่งบอกผลลัพธ์การประมวลผล:
- 1xx: Informational (กำลังดำเนินการ)
- 2xx: Success (200 OK, 201 Created)
- 3xx: Redirection (301 Moved Permanently, 302 Found)
- 4xx: Client Error (400 Bad Request, 401 Unauthorized [ยังไม่ได้ยืนยันตัวตน], 403 Forbidden [ไม่มีสิทธิ์], 404 Not Found, 429 Too Many Requests)
- 5xx: Server Error (500 Internal Server Error, 502 Bad Gateway [Proxy ติดต่อ App ไม่ได้], 503 Service Unavailable)

# Inspecting HTTP Request & Response Status Codes in Python
import urllib.request
import urllib.error

url = "https://httpbin.org/status/404"

try:
    response = urllib.request.urlopen(url)
    print(f"Status Code: {response.getcode()} - {response.reason}")
except urllib.error.HTTPError as e:
    print(f"HTTP Error Intercepted: Code {e.code} ({e.reason})")
    if e.code == 404:
        print("Debugging Tip: Check if the API Endpoint Path or Resource ID exists.")
    elif e.code == 502:
        print("Debugging Tip: Check if backend application service/container is running behind Reverse Proxy.")
                    

Use Case ในชีวิตจริง (Real-world Scenario): การทำระบบ Data Pipeline ดึงข้อมูลจาก External REST API ต้องตรวจสอบ HTTP Status Code อย่างถี่ถ้วน หากได้ 429 ให้ทำ Exponential Backoff Retry หากได้ 401 ให้ทำ Re-authentication Refresh Token และหากได้ 502/503 ให้แจ้งเตือนวิศวกร On-call

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): Anti-pattern ที่พบบ่อยคือการออกแบบ API ให้คืนค่า HTTP Status Code 200 OK เสมอ แล้วใส่ {"error": "Unauthorized"} ไว้ใน JSON Body ทำให้ระบบเฝ้าระวัง (Monitoring) ไม่สามารถดักจับ Error ได้ถูกต้อง แก้ไขโดยใช้ HTTP Status Code มาตรฐาน (401, 403, 500) ให้ตรงตามความหมายเสมอ

4. HTTPS, TLS Encryption และความปลอดภัยของ Web Application

ทฤษฎีและกลไกการทำงาน (How it works): HTTP ปกติส่งข้อมูลแบบ Plaintext ทำให้เสี่ยงต่อการดักอ่าน HTTPS คือ HTTP ที่ทำงานอยู่บนโปรโตคอลความปลอดภัย TLS (Transport Layer Security) โดยทำหน้าที่: 1. เข้ารหัสข้อมูล (Encryption): ป้องกันการดักอ่านระหว่างทาง (Eavesdropping)
2. ตรวจสอบตัวตน (Authentication): ยืนยันว่า Server เป็นตัวจริงผ่าน Digital Certificate จาก Certificate Authority (CA)
3. รักษาความสมบูรณ์ข้อมูล (Integrity): ป้องกันข้อมูลถูกแก้ไขระหว่างทาง

อย่างไรก็ตาม HTTPS ป้องกันเฉพาะการรับส่งข้อมูลผ่าน Network แต่ไม่ได้ป้องกันช่องโหว่ระดับ Application Developer จึงต้องระวังช่องโหว่สำคัญ เช่น:
- SQL Injection: โดนฉีดคำสั่ง SQL ปลอมแปลงผ่าน Input
- XSS (Cross-Site Scripting): โดนฝัง สคริปต์ Malicious JS บนหน้าเว็บ
- CORS (Cross-Origin Resource Sharing): กลไกของ Browser ที่บล็อกไม่ให้สคริปต์จาก Origin หนึ่งยิงขอข้อมูลจากอีก Origin หนึ่ง เว้นแต่ Server ปลายทางจะอนุญาตผ่าน Header Access-Control-Allow-Origin

# Setting CORS Headers in Axum (Rust Backend)
use tower_http::cors::{CorsLayer, Any};
use axum::http::Method;

pub fn create_cors_layer() -> CorsLayer {
    CorsLayer::new()
        // Allow specific origin or methods safely
        .allow_methods([Method::GET, Method::POST, Method::OPTIONS])
        .allow_headers(Any)
        .allow_origin(Any) // On production, replace Any with specific domain e.g. https://pipecraft.dev
}
                    

Use Case ในชีวิตจริง (Real-world Scenario): เว็บแอปพลิเคชันที่มีระบบ Login, ชำระเงิน หรือรับส่งข้อมูลส่วนบุคคล (PDPA/GDPR) บังคับใช้ HTTPS 100% พร้อมเปิดใช้งาน HSTS (HTTP Strict Transport Security) เพื่อบังคับให้ Browser เชื่อมต่อด้วย HTTPS เท่านั้น

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การตั้งค่า Access-Control-Allow-Origin: * ร่วมกับ allow_credentials(true) บน Production API เปิดช่องโหว่ให้เว็บอันตรายแอบยิง API แทนผู้ใช้ได้ แก้ไขโดยระบุชื่อ Domain ที่อนุญาตเฉพาะเจาะจงเท่านั้น

5. การจัดการสถานะและการยืนยันตัวตน: Cookie, Session และ Token (JWT)

ทฤษฎีและกลไกการทำงาน (How it works): เนื่องจาก HTTP เป็น Stateless Protocol (แต่ละ Request ไม่จำ Request ก่อนหน้า) ระบบ Login จึงต้องใช้นวัตกรรมจัดการสถานะ:
- Cookie: ข้อมูลขนาดเล็กที่ Server ส่งให้ Browser เก็บไว้ และ Browser จะแนบไปกับ Request ถัดไปโดยอัตโนมัติ
- Session: เก็บข้อมูลสถานะผู้ใช้ไว้บน Server (เช่น ใน RAM/Redis) แล้วส่งเพียง Session ID เก็บใน Cookie ของ Browser
- Token (เช่น JWT - JSON Web Token): ข้อมูลยืนยันตัวตนที่ถูกเซ็นสัญญาดิจิทัล (Digitally Signed) Client จะส่งแนบไปใน Header เช่น Authorization: Bearer <token> โดย Server ไม่ต้องเก็บสถานะไว้ใน Database (Stateless Auth)

# Example of Secure Cookie vs Authorization Header structure

# 1. Secure Cookie Flags (Response Header)
Set-Cookie: session_id=xyz123; Path=/; Secure; HttpOnly; SameSite=Strict; Max-Age=3600

# Explanation:
# - HttpOnly: Prevents JavaScript (XSS) from reading the cookie
# - Secure: Transmitted ONLY over HTTPS
# - SameSite=Strict: Prevents Cross-Site Request Forgery (CSRF)

# 2. JWT Bearer Token (Request Header)
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
                    

Use Case ในชีวิตจริง (Real-world Scenario): ระบบ Microservices และ Data API นิยมใช้ JWT Bearer Token ในการยืนยันตัวตนข้ามบริการ เพราะ API Gateway สามารถส่ง Token ให้บริการย่อยถอดรหัสตรวจสอบสิทธิ์ได้ทันทีโดยไม่ต้องคิวรีฐานข้อมูลกลางซ้ำๆ

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การเก็บ Sensitive Token ไว้ใน localStorage หรือ sessionStorage เสี่ยงต่อการโดนแฮกเกอร์ขโมยผ่านช่องโหว่ XSS แก้ไขโดยเก็บ Refresh Token ไว้ใน Cookie ที่ตั้งค่า HttpOnly, Secure และ SameSite=Strict เสมอ

6. ระบบจัดเก็บและประมวลผลแบบกระจายศูนย์ (CAP Theorem, Consensus & Quorum)

ทฤษฎีและกลไกการทำงาน (How it works): เมื่อระบบขยายใหญ่ขึ้น ข้อมูลจะถูกจัดเก็บบนระบบกระจายศูนย์ (Distributed Systems) ซึ่งต้องรับมือกับทฤษฎี CAP Theorem ที่ระบุว่าสามารถรับประกันได้เพียง 2 ใน 3 ข้อเมื่อเกิดเน็ตเวิร์กตัดขาด (Partition - P): - Consistency (C): ทุกโหนดเห็นข้อมูลตรงกันเสมอ
- Availability (A): ทุกโหนดพร้อมตอบกลับการอ่าน/เขียนเสมอ
- Partition Tolerance (P): ระบบทำงานได้แม้สายเน็ตเวิร์กระหว่างโหนดขาดหาย

เพื่อป้องกันปัญหา Split-Brain (โหนดแยกฝั่งแล้วต่างคนต่างสถาปนาผู้นำ) ระบบกระจายศูนย์จะใช้โปรโตคอลมติเห็นชอบ (Consensus Protocols เช่น Raft, Paxos) ร่วมกับการคำนวณเสียงข้างมาก Quorum ($Q = \lfloor N/2 \rfloor + 1$) ฝั่งที่มีจำนวนโหนดน้อยกว่า Quorum จะปฏิเสธการเขียนข้อมูลเพื่อป้องกันข้อมูลขัดแย้ง

# Calculating Quorum & Consistency in Leaderless Replication (e.g. Cassandra/DynamoDB)
# Formula: W (Write Quorum) + R (Read Quorum) > N (Replication Factor)

def check_strict_consistency(w, r, n):
    if w + r > n:
        return True, f"Strict Consistency Guaranteed (W={w} + R={r} > N={n})"
    return False, "Eventual Consistency (Risk of reading stale data)"

# RF=3, Write Quorum=2, Read Quorum=2 -> Guaranteed Fresh Read
print(check_strict_consistency(w=2, r=2, n=3))
                    

Use Case ในชีวิตจริง (Real-world Scenario): Apache Kafka โหมด KRaft และ Elasticsearch ใช้โปรโตคอล Raft ในการเลือกตั้ง Leader และซิงก์ Metadata ระหว่างโหนด เพื่อการันตีความถูกต้องของท่อสตรีมมิ่งข้อมูล

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การกำหนดจำนวนโหนดรวมในคลัสเตอร์เป็นเลขคู่ (เช่น 4 โหนด) จะมีค่า Quorum เท่ากับ 3 ซึ่งหากเน็ตเวิร์กขาดครึ่ง (2-2) จะไม่มีฝั่งใดทำงานได้เลย แก้ไขโดยกำหนดจำนวนโหนดหลักเป็น เลขคี่เสมอ (เช่น 3, 5, 7) เพื่อให้เกิดฝั่งข้างมากเสมอ

Weekend Sandbox Challenge: Full-Stack Network & API Diagnostics Tool

โจทย์ปฏิบัติการ: จงเขียนสคริปต์ Python สำหรับทำเครื่องมือตรวจสอบและดีบักระบบเครือข่ายและ API (Network Inspector) โดยทำการตรวจหา IP จาก DNS, ทดสอบสร้าง TCP Connection ไปยัง Port ที่กำหนด และส่ง HTTP GET Request เพื่อเช็ค Status Code และ Response Headers

# network_api_diagnostics.py
import socket
import urllib.request
import time

def run_diagnostics(hostname, path="/", port=443):
    print(f"=== Starting Network & API Diagnostics for {hostname} ===")
    
    # Step 1: DNS Lookup
    try:
        ip = socket.gethostbyname(hostname)
        print(f"1. DNS Lookup: SUCCESS -> {hostname} resolved to {ip}")
    except socket.gaierror as e:
        print(f"1. DNS Lookup: FAILED -> {e}")
        return

    # Step 2: TCP Connection Handshake
    start_time = time.time()
    try:
        sock = socket.create_connection((ip, port), timeout=5)
        tcp_latency = (time.time() - start_time) * 1000
        print(f"2. TCP Handshake (Port {port}): SUCCESS -> Connected in {tcp_latency:.2f} ms")
        sock.close()
    except Exception as e:
        print(f"2. TCP Handshake: FAILED -> Connection Refused/Timeout on Port {port}: {e}")
        return

    # Step 3: HTTP/HTTPS Request & Status Code Inspection
    protocol = "https" if port == 443 else "http"
    url = f"{protocol}://{hostname}{path}"
    try:
        req = urllib.request.Request(url, headers={'User-Agent': 'PipeCraft-Diagnostics/1.0'})
        with urllib.request.urlopen(req, timeout=5) as response:
            print(f"3. HTTP Response: SUCCESS -> Status {response.getcode()} ({response.reason})")
            print(f"   Content-Type: {response.headers.get('Content-Type')}")
    except urllib.error.HTTPError as e:
        print(f"3. HTTP Response: CLIENT/SERVER ERROR -> Status {e.code} ({e.reason})")
    except Exception as e:
        print(f"3. HTTP Request FAILED: {e}")

if __name__ == "__main__":
    run_diagnostics("httpbin.org", path="/get", port=443)
                    

Senior Technical Interview Q&A

Q1: อธิบายสิ่งที่เกิดขึ้นตามลำดับขั้นตอนเบื้องหลัง เมื่อผู้ใช้พิมพ์ URL `https://example.com/products` แล้วกด Enter บน Browser?

A1: 1. Browser ทำการวิเคราะห์ URL (Protocol, Domain, Path) -> 2. ค้นหา IP Address ผ่าน DNS Lookup (ตรวจ Cache ก่อน หากไม่เจอจะสอบถาม Recursive DNS Resolvers) -> 3. เริ่มสร้าง TCP 3-Way Handshake ไปยัง IP และ Port 443 -> 4. ทำ TLS Negotiation เพื่อแลกเปลี่ยน Certificate ยืนยันตัวตนและสร้าง Session Keys ในการเข้ารหัส -> 5. Browser ส่ง HTTP Request `GET /products` -> 6. Web Server/Reverse Proxy ประมวลผลและส่ง HTTP Response `200 OK` กลับมา -> 7. Browser Engine อ่าน HTML, CSS, JS และเรนเดอร์เป็นหน้าเว็บออกมาให้ผู้ใช้เห็น

Q2: เมื่อระบบส่งผลลัพธ์เป็น 502 Bad Gateway Error มีสาเหตุเกิดจากอะไร และวิศวกรระบบควรทำการ Debug ที่จุดใด?

A2: 502 Bad Gateway หมายความว่าตัวกลางอย่าง Reverse Proxy / Load Balancer (เช่น Nginx, AWS ALB) ไม่สามารถรับคำตอบหรือติดต่อกับ Application Service ปลายทาง (เช่น Node.js, Python FastAPI, Gunicorn) ได้ วิธี Debug คือ: 1. ตรวจสอบว่า Container/Process ของ Application ปลายทางยังรันอยู่หรือไม่ -> 2. ตรวจสอบว่า Application ฟังอยู่บน Port/Socket ตรงกับที่ Reverse Proxy ตั้งค่าไว้หรือไม่ -> 3. ตรวจสอบ Resource Usage (RAM/CPU) ว่า Application crash จาก OOM หรือไม่

Q3: ในการออกแบบสถาปัตยกรรมยืนยันตัวตน (Authentication) เหตุใดจึงควรเก็บ Refresh Token ไว้ใน HttpOnly Secure Cookie แทนการเก็บใน LocalStorage?

A3: การเก็บ Token ไว้ใน `localStorage` เปิดโอกาสให้สคริปต์ JavaScript บนหน้าเว็บอ่านค่าได้ ซึ่งหากเกิดช่องโหว่ Cross-Site Scripting (XSS) แฮกเกอร์จะสามารถขโมย Token ออกไปได้ทันที ในขณะที่ Cookie ที่ตั้งค่า `HttpOnly` จะถูกบล็อกไม่ให้ JavaScript เข้าถึงได้เลย และธง `Secure` บังคับให้ส่งผ่าน HTTPS เท่านั้น ร่วมกับ `SameSite=Strict` ช่วยป้องกัน CSRF ทำให้ปลอดภัยกว่าอย่างมาก

Interactive VPC Network Subnet Router

Interactive VPC

เป้าหมาย: กำหนดตารางเส้นทาง (Route Table) และกลุ่มสิทธิ์ความปลอดภัย (Security Group) เพื่อเชื่อมต่อ App Server ไปยังฐานข้อมูลดิบใน Private Subnet อย่างปลอดภัยสูงสุด

Public Subnet (10.0.1.0/24)
App
IP: 10.0.1.5
Private Subnet (10.0.2.0/24)
DB
IP: 10.0.2.15
Route Table Rules (Target destination: 10.0.2.0/24)
Route via:
DB Subnet Inbound Security Group Rule (Port: 5432)
Source Allow:

ข้อดี / จุดเด่น & ข้อเสีย / ข้อควรระวัง

ข้อดี / จุดเด่น

  • ช่วยให้ออกแบบสถาปัตยกรรมข้อมูลขนาดใหญ่ที่สเกลความเร็วคู่ขนานได้ปลอดภัยสูง
  • ช่วยดีบักปัญหาท่อส่งน้ำล่มได้ฉับไวเมื่อเน็ตเวิร์กขัดข้อง

ข้อเสีย / ข้อควรระวัง

  • มีความซับซ้อนในการตั้งค่าและต้องเข้าใจโปรโตคอลระบบคอมพิวเตอร์เชิงลึก
  • ปัญหาระบบเครือข่ายตกหล่น (Network Jitter) บางประเภทตรวจสอบและหาสาเหตุได้ยาก

ปฏิบัติการจริง (Lab Practice)

Bilingual Guide

แล็บ: วิเคราะห์การเชื่อมต่อเครื่องเซิร์ฟเวอร์วิเคราะห์ข้อมูล

วิธีรันแล็บปฏิบัติการบนเครื่องจริง (Local Terminal Execution Blueprint)

เนื่องจากปฏิบัติการ Data Engineering / DevOps ระดับสูงต้องรันบน Environment จริง ขั้นตอนด้านล่างนี้คือคำสั่งสำหรับนำไปรันบน Terminal / Docker ในเครื่องของคุณ:

1. สร้างโฟลเดอร์ปฏิบัติการและเตรียมไฟล์ Environment
mkdir -p pipecraft-lab && cd pipecraft-lab
python3 -m venv venv && source venv/bin/activate
pip install --upgrade pip pandas polars pytest requests
2. จำลองการสร้างและรันระบบประมวลผล (Run Pipeline Command)
# Run execution pipeline test
python3 -c "
import polars as pl
print(' [PipeCraft Lab] Running local pipeline engine...')
df = pl.DataFrame({'id': [1, 2, 3], 'status': ['SUCCESS', 'SUCCESS', 'AUDITED']})
print(df)
" 
3. ตรวจสอบการผ่านเกณฑ์และการทำงาน (Data Quality Assertions)
# Verify clean execution exit status
echo " PipeCraft Local Lab Execution Completed Successfully!"

💡 คำแนะนำ & ทริกเด็ด

ใช้คำสั่ง telnet [ip] [port] หรือ nc -zv [ip] [port] เพื่อเช็คว่าพอร์ตฐานข้อมูลปลายทางเปิดให้เชื่อมต่อจริงหรือไม่ก่อนเริ่มเขียนโค้ด ETL เสมอ ป้องกันเสียเวลากับปัญหา Firewall