P
PipeCraft

Roadmap Progress

ข้อมูลเบื้องต้นเกี่ยวกับวิศวกรรมข้อมูล (Introduction to Data Engineering) Python สำหรับ Data Engineering พื้นฐาน Linux & CLI สำหรับวิศวกรข้อมูล Git สำหรับระบบงานข้อมูลและทีมพัฒนา ระบบเครือข่ายและระบบประมวลผลแบบกระจายศูนย์ (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)
บทที่ 1: รากฐานวิศวกรรมซอฟต์แวร์และระบบ (Foundations of Software & Systems)

พื้นฐาน Linux & CLI สำหรับวิศวกรข้อมูล

1.3 การประมวลผลข้อความและสตรีมในระบบปฏิบัติการ Linux

สถาปัตยกรรม Linux ทำงานบนหลักการจัดส่งข้อมูลในรูปสตรีมผ่านตัวบ่งชี้ไฟล์ (File Descriptors) ซึ่งช่วยให้นักวิศวกรรมข้อมูลประมวลผลล็อกไฟล์ขนาดใหญ่ได้รวดเร็วโดยใช้หน่วยความจำจำกัด

1. ทฤษฎีและกลไกสตรีมอินพุต/เอาท์พุต (File Descriptors & Linux Standard Streams)

ทฤษฎีและกลไกการทำงาน (How it works): ในเคอร์เนลของ Linux โปรเซสต่าง ๆ จะติดต่อกับทรัพยากร (เช่น ไฟล์ หรือเน็ตเวิร์กซ็อกเก็ต) ผ่านจำนวนตัวเลขจำนวนเต็มบวกที่เรียกว่า **File Descriptors (FD)** โดยมีสัญญาสตรีมมาตรฐาน 3 ตัวหลัก: - `0` (stdin): สตรีมรับข้อมูลเข้าแบบมาตรฐาน - `1` (stdout): สตรีมแสดงผลข้อมูลออก - `2` (stderr): สตรีมแสดงผลข้อผิดพลาดของระบบ เมื่อใช้คำสั่งท่อส่งข้อมูล (**Pipe |**) ระบบปฏิบัติการจะจัดสรรบัฟเฟอร์ขนาดเล็กในระดับเคอร์เนล (Kernel Ring Buffer ขนาด 64KB) เพื่อส่งผ่านข้อมูลจาก stdout ของโปรเซสแรกไปยัง stdin ของโปรเซสถัดไปทันที ช่วยให้รันงานคู่ขนานได้โดยไม่ต้องพักข้อมูลลงฮาร์ดดิสก์

# Redirecting standard output (1) and error (2) streams in Linux CLI
# Save stdout to out.log and redirect stderr to the same place (2>&1)
python3 process_data.py > out.log 2>&1
                    

Use Case ในชีวิตจริง (Real-world Scenario): เมื่อวิศวกรข้อมูลต้องการกรองข้อมูลจากไฟล์ล็อกของเว็บเซิร์ฟเวอร์ขนาด 100GB การกรองโดยใช้ท่อระบายข้อมูล CLI จะใช้แรมเพียง 64KB ตลอดเวลา ทำให้เราวิเคราะห์ระบบได้บนเซิร์ฟเวอร์ขนาดเล็กโดยไม่ต้องเสียทรัพยากรเครื่องหลัก

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): หากโปรเซสทางซ้ายเขียนข้อมูลเร็วกว่าโปรเซสทางขวาอ่านมาก บัฟเฟอร์ 64KB จะเต็ม ส่งผลให้โปรเซสทางซ้ายถูกเคอร์เนลสั่งบล็อกชั่วคราว (Block Write) ซึ่งเป็นเรื่องปกติของกลไก **Backpressure** แต่หากเกิดการตายของโปรเซสปลายทางกลางคัน เคอร์เนลจะส่งสัญญาณ `SIGPIPE` ไปฆ่าตัวเขียน แก้ไขโดยทำระบบดักจับ Error/Exit Code ในสคริปต์

2. การค้นหาและนิพจน์ขั้นสูงด้วย grep (Pattern Matching with grep)

ทฤษฎีและกลไกการทำงาน (How it works): คำสั่ง `grep` สแกนหาคำและรูปแบบข้อความในสตรีมด้วยอัลกอริทึมค้นหาประสิทธิภาพสูง หากป้อนสวิตช์ `-F` (Fixed Strings) ระบบจะรันผ่านอัลกอริทึม **Boyer-Moore** สแกนหาข้อความตรงตัวโดยไม่ต้องเสียเวลาคอมไพล์และประมวลผลตารางนิพจน์ปกติ (Regex state machines) ส่งผลให้ประมวลผลเร็วกว่าการสแกนหาแบบทั่วไปเกือบ 10 เท่า

# Advanced grep patterns: search case-insensitive, show 3 lines of context around errors
grep -i -F "connection failed" /var/log/syslog -C 3
                    

Use Case ในชีวิตจริง (Real-world Scenario): ในระหว่างเหตุการณ์ระบบคลังข้อมูลเชื่อมโยงคลาวด์ล้มเหลว ทีมวิศวกรใช้คำสั่ง `grep -F "ACCESS_DENIED" -r /var/log/pipecraft/` เพื่อกวาดค้นหาไฟล์สิทธิ์การเชื่อมต่อที่เสียหายในทุกโฟลเดอร์ย่อยได้อย่างรวดเร็วในไม่กี่วินาที

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การรัน Regular Expression ซับซ้อนด้วยคำสั่ง `grep -E` (Extended Regex) บนไฟล์ระดับหลายกิกะไบต์ อาจส่งผลให้ซีพียูรันเต็ม 100% จากสภาวะ backtracking แก้ไขโดยหลีกเลี่ยงการใช้นิพจน์ปกติที่กำกวม หรือหันมาใช้เครื่องมืออย่าง `ripgrep` (`rg`) ซึ่งบิวด์ด้วย Rust และมีความเร็วสูงกว่ามาก

3. การประมวลผลข้อข้อความสตรีมด้วย sed (Stream Editor Mechanics)

ทฤษฎีและกลไกการทำงาน (How it works): `sed` เป็นตัวแก้ไขข้อความแบบสตรีม ทำงานแบบทีละบรรทัดโดยมีบัฟเฟอร์ในแรม 2 ตัวหลัก: 1. **Pattern Space**: บัฟเฟอร์ชั่วคราวเก็บข้อความของบรรทัดปัจจุบันที่อ่านมาจากดิสก์ เพื่อนำมารันตามคำสั่งกรองแปลงที่ป้อน 2. **Hold Space**: บัฟเฟอร์สำรองพิเศษสำหรับฝากข้อความชั่วคราว ใช้เมื่อเราต้องการสลับบรรทัด สลับหัวข้อ หรือนำประวัติบรรทัดก่อนหน้ามาวิเคราะห์ร่วมด้วย

# Replacing connection strings in-place within a config file
sed -i 's/db_port=5432/db_port=6432/g' config.env
                    

Use Case ในชีวิตจริง (Real-world Scenario): ระบบอัปเกรดข้อมูลย้ายพอร์ตฐานข้อมูลจาก Postgres ปกติไปรันผ่าน PgBouncer สคริปต์แก้ไขด่วนจะเรียกใช้ `sed` เพื่อลุยเปลี่ยนค่าตัวแปรในไฟล์คอนฟิกระบบงานทั้งหมดบนเซิร์ฟเวอร์โดยอัตโนมัติ

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): คำสั่ง `sed -i` แก้ไขทับไฟล์จริงทันที หากเขียนนิพจน์ผิดไปนิดเดียวจะส่งผลให้ไฟล์พังถาวร แก้ไขโดยต้องสร้างไฟล์สำรองควบคู่เสมอเมื่อสั่งแก้ไขสด เช่น `sed -i.bak 's/old/new/g' file.txt` ซึ่งจะบันทึกไฟล์เดิมเก็บไว้เป็นความปลอดภัย

4. การวิเคราะห์ข้อมูลและโครงสร้างระเบียนด้วย awk (Column Processing & Logic Parsing)

ทฤษฎีและกลไกการทำงาน (How it works): `awk` คือภาษาสคริปต์เฉพาะทางที่ออกแบบมาเพื่อการประมวลผลข้อความเชิงระเบียน ทำงานโดยอัตโนมัติในการแยกข้อมูลออกเป็นคอลัมน์โดยระบุผ่าน Field Separator (FS, ค่าปริยายคือช่องว่าง) อาร์กิวเมนต์คอลัมน์จะแทนด้วยเครื่องหมาย `$` ตามด้วยคีย์หลัก เช่น `$1` คอลัมน์แรก, `$NF` คอลัมน์สุดท้ายของแถว รันตามบล็อก `BEGIN {} { loop } END {}`

# Grouping web log by status code (column 9) and summing request counts
cat access.log | awk '{status[$9]++} END {for (s in status) print s, status[s]}'
                    

Use Case ในชีวิตจริง (Real-world Scenario): การทำความสะอาดด่วนคัดกรองไฟล์ CSV สรุปข้อมูลยอดขายรายเขต หากข้อมูลมีค่าว่างในคอลัมน์ยอดขาย ให้กรองทิ้งและบวกค่าเฉลี่ยของเขตเก็บลงในรายงานสรุปโดยตรงบน CLI

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): หากสัญลักษณ์แยกฟิลด์ภายในไฟล์ (FS) แตกต่างกันไป (เช่น บางบรรทัดใช้ comma บางบรรทัดใช้ semicolon) หรือมี comma อยู่ในข้อความ ดัชนีคอลัมน์ของ awk จะเพี้ยนทันที แก้ไขโดยสั่งระบุตัวแยกฟิลด์ให้รัดกุมด้วย `awk -F','` หรือเลือกใช้เอนจิ้นที่มีตัว Validate อย่าง DuckDB แทนในกรณีที่ไฟล์มีความซับซ้อนสูง

5. การสั่งการแบบขนานด้วย xargs (Parallel Command Execution)

ทฤษฎีและกลไกการทำงาน (How it works): คำสั่ง `xargs` ทำหน้าที่แปลงข้อมูลที่ส่งผ่าน stdin มาจัดทำรายการอาร์กิวเมนต์เพื่อป้อนส่งต่อให้คำสั่งถัดไป ความสามารถระดับวิศวกรรมข้อมูลของมันคือ สวิตช์สัญญาสั่งการ `-P` (Parallel) ช่วยให้เราก้าวข้ามโพรเซสทำงานขนาน รันคำสั่งจำกัดชุดได้พร้อม ๆ กันบนซีพียูหลายแกน

# Compress 100 log files concurrently, running 8 parallel workers at a time
find /var/log/pipecraft/ -name "*.log" | xargs -P 8 -n 1 gzip
                    

Use Case ในชีวิตจริง (Real-world Scenario): งานล้างโฟลเดอร์ Data Lakehouse เก็บ log เก่าที่ต้องบีบอัดไฟล์ Parquet นับพันพาร์ทิชัน การเรียกใช้งาน xargs ควบคู่ความขนาน 8 งานช่วยลดเวลาทำ Compaction ไฟล์ลงได้เกิน 70% บนเซิร์ฟเวอร์

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การป้อนคำสั่งแบบขนานโดยไม่จำกัดความจุ CPU อาจสร้างภาระ I/O จนดิสก์และระบบเครือข่ายล็อกค้างชั่วคราว แก้ไขโดยคำนวณจำนวนโพรเซสให้ตรงกับ Core ของระบบหลัก เช่น ตั้งค่า `-P` เท่ากับจำนวนคอร์ประมวลผลจริง และจำกัดจำนวนข้อมูลต่อรอบผ่านพารามิเตอร์ `-n`

🛠️ Weekend Sandbox Challenge: Advanced Text Transformation using Bash Pipes

โจทย์ปฏิบัติการ: จงเขียนชุดคำสั่ง Bash หนึ่งบรรทัด (One-Liner) เชื่อมต่อด้วยท่อส่งข้อมูล (Pipes) เพื่อทำการดึงวิเคราะห์ไฟล์สถิติ โดยคัดกรองเฉพาะบรรทัดที่เป็นเออเร่อ (`ERROR`) และใช้ `awk` ในการนับยอดความยาวคำเพื่อรายงานยอดสรุป

# Create a simulated log file
cat << 'EOF' > test.log
2026-07-15 INFO system_up
2026-07-15 ERROR timeout_db
2026-07-15 ERROR access_denied
EOF

# Find all ERROR lines, extract the third column, and count occurrences
grep "ERROR" test.log | awk '{print $3}' | sort | uniq -c
                    

💼 Senior Technical Interview Q&A

Q1: จงอธิบายการทำงานของระบบ Input/Output Redirection และการส่งท่อข้อมูล (Pipes) ในเคอร์เนลของ Linux?

A1: Linux มองทุกอย่างเป็นไฟล์รวมถึง Input/Output โดยใช้ File Descriptors: stdin (0), stdout (1), stderr (2) การทำ redirection (`>` หรือ `2>`) เป็นการสลับปลายทางชี้ตำแหน่ง File Descriptor ส่วนการเชื่อมท่อข้อมูล (Pipe `|`) เคอร์เนลจะจำลองหน่วยความจำส่วนกลางชั่วคราวเพื่อต่อเชื่อม stdout ของคำสั่งแรกไปเข้า stdin ของคำสั่งถัดไปโดยตรงโดยไม่มีการเขียนพักข้อมูลลงดิสก์

Q2: ความแตกต่างระหว่างการรันปิดจ๊อบข้อมูลด้วยคำสั่ง SIGTERM (15) และ SIGKILL (9) คืออะไร และส่งผลต่อความคงอยู่ของข้อมูลในท่อส่งอย่างไร?

A2: `SIGTERM` ส่งคำขอเพื่อยกเลิกอย่างสุภาพ (Graceful Shutdown) อนุญาตให้แอปพลิเคชันล้างหน่วยความจำ ปิดการเชื่อมต่อฐานข้อมูล และล้างไฟล์ชั่วคราวก่อนปิดตัว ในขณะที่ `SIGKILL` คือคำสั่งปิดทันทีระดับเคอร์เนลโดยไม่ยินยอมให้แอปพลิเคชันเคลียร์แรม มีความเสี่ยงสูงที่จะทำให้ข้อมูลค้างครึ่งๆ กลางๆ จนไฟล์เสียหาย (Data Corruption)

🐧 Interactive Linux Terminal Simulator

Interactive CLI

เป้าหมาย: ใช้คำสั่ง grep ค้นหาแถวที่มีคำว่า ERROR ในไฟล์ล็อก data/logs/server.log หรือใช้ ls ค้นหารูปแบบไฟล์

bash - user@pipecraft:~ Active
Welcome to PipeCraft Terminal v1.0.0. Type 'help' for commands.
user@pipecraft:~$ Try running 'ls' or 'cat data/logs/server.log'
user@pipecraft:~$

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

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

  • ใช้หน่วยความจำน้อยมากและมีความเร็วสูงสุดในการประมวลผลสคริปต์ขนาดเล็ก
  • เหมาะสำหรับเขียนเป็นสคริปต์ควบคุมการทำงานรอบรับสิทธิ์ในเครื่องเซิร์ฟเวอร์

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

  • พิมพ์คำสั่งผิดพลาดเพียงจุดเดียวอาจทำให้ลบฐานข้อมูลจริงทั้งหมดได้ทันที
  • ไวยากรณ์ซับซ้อนและอ่านทำความเข้าใจยากขึ้นเมื่อเขียนสคริปต์ที่มีเงื่อนไขยุ่งยาก

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

Bilingual Guide

แล็บ: พัฒนา Shell Script ตรวจเช็คล็อกไฟล์ผิดปกติ

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

ใช้คำสั่ง grep -r 'ERROR' /path/to/logs/ เพื่อค้นหาคำว่า ERROR ภายในทุกไฟล์ในโฟลเดอร์ย่อยทั้งหมดได้อย่างรวดเร็วโดยไม่ต้องไล่ดูทีละไฟล์