pdouvch.com

Flutter · Backend APIs · Web

Puttipong Doungvichai

Software Engineer · กรุงเทพฯ ประเทศไทย

ทำตั้งแต่หน้าบ้านถึงหลังบ้าน — แอปบนมือผู้ใช้ API เบื้องหลัง และเว็บที่ทีมใช้งานจริง

ซอฟต์แวร์ที่สร้าง
0
เปิดใช้งานจริง
0
เทคโนโลยีที่ใช้ประจำ
0
~/pdouvch — zsh

❯

FlutterDartRiverpodKotlinJetpack ComposeFirebaseNode.jsHonoExpress.NETC#RESTJWTTypeScriptReactNext.jsTailwind CSSVercelCloudflarePostgreSQLSQL ServerMySQLSQLiteCloudflare D1RedisGitGitHub ActionsDockerPlaywrightVitestNginx

เกี่ยวกับผม

ผมเป็น Software Engineer อยู่กรุงเทพฯ งานประจำอยู่ฝ่าย IT ของบริษัทลีสซิ่ง ระบบที่ดูแลต้องรองรับผู้ใช้จริง เรื่องเงินจริง และร่องรอยการตรวจสอบจริง ข้อจำกัดนี้เป็นตัวกำหนดวิธีเขียนโค้ดของผม — อ่านง่ายมาก่อน ระวังตัวในจุดที่ต้องระวัง และเลือกวิธีที่น่าเบื่อที่สุดในจุดที่พลาดไม่ได้

นอกเวลางานผมสร้างสิ่งที่อยากใช้เอง ตอนนี้คือ Kunjae ตัวจัดการรหัสผ่านแบบ zero-knowledge, TuneTrend แอปดูวิดีโอยอดนิยมบน YouTube แยกตามประเทศ และ Inventory Sync ระบบซิงค์สต๊อกข้ามมาร์เก็ตเพลสที่กำลังพัฒนาอยู่

ที่อยู่
กรุงเทพฯ ประเทศไทย
ตำแหน่ง
Software Engineer
โฟกัส
Flutter · Backend APIs · Web
ภาษา
ไทย (เจ้าของภาษา) · อังกฤษ (ใช้งานได้)
เขตเวลา
UTC+7 (ICT)
เปิดรับ
โปรเจกต์เสริมและงานร่วมพัฒนา

ซอฟต์แวร์ที่ผมพัฒนา

Kunjae

(กุญแจ)ใช้งานได้แล้ว

ตัวจัดการรหัสผ่านแบบ zero-knowledge สำหรับเว็บ Android และส่วนขยายเบราว์เซอร์ ข้อมูลถูกเข้ารหัสในอุปกรณ์ก่อนส่งออกไป เซิร์ฟเวอร์เก็บได้แค่ ciphertext และไม่มีทางถอดรหัสได้

  • สองโหมด — คลังในเครื่องที่ไม่ต้องมีบัญชี หรือบัญชีที่ซิงค์ข้ามอุปกรณ์ด้วย Master Password คู่กับ Secret Key 128 บิต
  • รหัส TOTP คำนวณในเครื่อง ใช้ได้โดยไม่ต้องต่อเน็ต พร้อมเติมรหัสผ่านและ 2FA อัตโนมัติบน Android และส่วนขยาย
  • ปลดล็อกด้วยลายนิ้วมือผ่าน Android Keystore ส่งออก/นำเข้าไฟล์สำรองที่เข้ารหัส และล็อกอัตโนมัติเมื่อไม่ได้ใช้
TypeScriptReactKotlinJetpack ComposeCloudflare WorkersWebCrypto

TuneTrend

ใช้งานได้แล้ว

วิดีโอยอดนิยมบน YouTube แยกตามประเทศ ทั้งเพลงและหมวดอื่น ๆ อัปเดตอัตโนมัติทุก 3 ชั่วโมง ใช้ได้ทั้งบนเว็บและแอป Android

  • ชาร์ตราย 5 ประเทศ (ไทย เกาหลีใต้ ญี่ปุ่น สหรัฐฯ สหราชอาณาจักร) แยกแท็บ Trending · New Releases
  • Background worker ดึงข้อมูลจาก YouTube Data API ตามรอบ แล้ว cache ไว้ให้เว็บและแอปอ่านจาก API เดียวกัน
  • รองรับสองภาษาตั้งแต่คอมมิตแรก และปล่อยแอป Android ขึ้น Google Play แล้ว
FlutterDartTypeScriptNext.jsNode.jsPostgreSQL

Inventory Sync

กำลังพัฒนา

ระบบซิงค์สต๊อกแบบ real-time สำหรับร้านที่ขายหลายช่องทางพร้อมกัน (Shopee, Lazada, TikTok) รับ webhook จากทุกช่องทางมาตัดจากยอดกลางก้อนเดียว เพื่อไม่ให้ขายเกินของที่มีจริง

  • กันปัญหาสามข้อที่ระดับฐานข้อมูล ไม่ใช่ระดับโค้ด — unique index กัน webhook ซ้ำ, UPDATE แบบสัมพัทธ์กันเขียนทับ, CHECK constraint กันสต๊อกติดลบ
  • รันบน Cloudflare Workers + D1 จึงอยู่ที่ edge ใกล้ผู้ใช้ ไม่มีเซิร์ฟเวอร์ให้ดูแล และคิดค่าใช้จ่ายตาม request จริง
  • โครงสร้างแยกชั้น domain / usecases / adapters / routes พร้อม unit และ integration test บน SQLite จริง
TypeScriptHonoCloudflare WorkersD1DrizzleZodVitest

เทคโนโลยีที่ใช้

โมบายล์

FlutterDartRiverpodKotlinJetpack ComposeFirebase

หลังบ้าน

Node.jsHonoExpress.NETC#RESTJWT

เว็บ

TypeScriptReactNext.jsTailwind CSSVercelCloudflare

ข้อมูล

PostgreSQLSQL ServerMySQLSQLiteCloudflare D1Redis

เครื่องมือ

GitGitHub ActionsDockerPlaywrightVitestNginx

วิธีทำงานของผม

01

อ่านง่ายมาก่อนฉลาด

โค้ดถูกอ่านบ่อยกว่าถูกเขียนมาก ถ้าคนรีวิวต้องให้อธิบายยาวหนึ่งย่อหน้า แปลว่าโค้ดผิด ไม่ใช่คนรีวิว

02

น่าเบื่อในจุดที่พลาดไม่ได้

เรื่องเงิน การยืนยันตัวตน และการย้ายข้อมูล ใช้วิธีที่เซอร์ไพรส์น้อยที่สุดเสมอ เก็บความสร้างสรรค์ไว้ใช้กับ UI

03

ปล่อยทีละชิ้นเล็ก ๆ

branch อายุสั้น PR โฟกัส คอมมิตอธิบายตัวเองได้ การ merge ก้อนใหญ่ทีเดียวคือที่ซ่อนของบั๊ก

04

รองรับหลายภาษาตั้งแต่วันแรก

การมาทำ i18n ทีหลังแพงกว่าสามเท่า ทุกข้อความผ่านชั้น localization ตั้งแต่คอมมิตแรก

สนับสนุนผม

ชอบสิ่งที่ผมทำ? เลี้ยงกาแฟผมสักแก้ว

Kunjae, TuneTrend และทุกโปรเจกต์ในนี้ทำนอกเวลางาน เปิดให้ใช้ฟรี กาแฟหนึ่งแก้วช่วยจ่ายค่าเซิร์ฟเวอร์ และทำให้ผมมีแรงสร้างของใหม่ต่อ

เลี้ยงกาแฟผมbuymeacoffee.com/theputtipong

ติดต่อ

เปิดรับโปรเจกต์เสริมและงานร่วมพัฒนา ทั้ง Flutter และงาน full-stack ทักมาคุยได้เลย

support.pdouvch@gmail.com
ติดต่อผม →
เลี้ยงกาแฟ
esc