Quantcast
Channel: cc :: somkiat
Viewing all 2000 articles
Browse latest View live

บันทึกเรื่องรูปแบบของทีม

$
0
0

จากที่คุยเรื่องรูปแบบของทีมกันไปนั้น
ก็เห็นว่ามีการจัดการหลาย ๆ รูปแบบและชื่อแตกต่างกันไป ทั้ง

  • Component team
  • Cross-function team
  • DevOps team
  • SRE team

และอื่น ๆ อีกมากมาย
ก็เลยมาสรุปสิ่งที่คุยไว้นิดหน่อยว่า เป็นอย่างไรกันบ้าง

เริ่มจากเรื่องของ Component team และ Cross-function/Feature team

น่าจะอธิบายแบบชัดเจนด้วยรูปนี้

ต่อมาก็จะเริ่มแยกเป็นทีมย่อย ๆ เล็ก ๆ หรือ Dedicated team ออกมา

ยกตัวอย่างเช่นที่เจอบ่อย ๆ มาก คือ DevOps team
จะเป็น component team หรือ feature team ดีนะ ?
แบบนี้ไหมนะ ?
ดูรูปแบบของทีมเพิ่มได้ที่ DevOps Topology

แถมมีการแนะนำเรื่องของ Team Type และ Interaction mode ด้วย


Team Type มีดังนี้

  • Stream-aligned team
  • Enabling team
  • Complicated subsystem team
  • Platform team

Interaction Mode มีดังนี้

  • Collaboration
  • X-as-a-Service
  • Facilitating

แสดงดังรูป

ก่อนจะจัดรูปแบบทีมแบบไหน
ทีมคือ กลุ่มคนที่มีความเชื่อมั่นซึ่งกันและกันนะครับ


สรุปการพูดคุยเรื่อง Swagger/Protobuf usecase and trend

$
0
0

วันนี้ได้พูดคุยใน ClubHouse กันนิดหน่อย
เรื่อง Swagger/Protobuf usecase and trend
เป็นการแลกเปลี่ยนแนวทางในการพัฒนา API
ไม่ว่าจะเป็น RESTFul API, Protobuf หรือพวก gRPC

แนวทางในการพูดคุยประกอบไปด้วย

Design First

เริ่มจากการออกแบบ API specification ก่อน
ไม่ว่าจะเป็น Swagger, API BluePrint และ RAML ก็ตาม
จากนั้นทำการ generate code ส่วนของ API ออกมาให้
ด้วยเครื่องมือที่จัดเตรียมไว้ เช่น Swagger CodeGen เป็นต้น
ซึ่งสนับสนุนภาษาโปรแกรมมากมาย

หรืออาจจะสร้าง DSL (Domain Specific Language) ขึ้นมา
เพื่อสร้างตามความต้องการของบริษัท
ยกตัวอย่างเช่น Omise Bluepine

Code First

เริ่มจากการเขียน code ก่อน
จากนั้นใช้เครื่องมือ generate Specification/Documentation 
ยกตัวอย่างเช่น Swag เป็นต้น

และเพิ่มเติมเข้ามาเรื่องของ Contract testing

เพื่อช่วยให้ทั้ง provider และ consumer มั่นใจว่า
เมื่อมีการเปลี่ยนแปลงหรือปรับปรุงแล้ว
ยังคงไม่ทำให้เกิดปัญหาหาหรือทำให้รู้ปัญหาได้อย่างรวดเร็วยก
ตัวอย่างเช่น

อีกทั้ง API Specification ที่เขียนตาม format ของ Swagger และ API Blueprint

สามารถทำการสร้าง Mock server ในมุมของ provider และ consumer
ได้ด้วยเครื่องมือต่าง ๆ ดังนี้

ไม่ว่าจะเป็นรูปแบบไหน ก็ต้องดูในบริบทต่าง ๆ ด้วย
รวมทั้งว่า เข้ามาช่วยเพิ่ม productivity ด้วยหรือไม่
หรือเข้ามาช่วยแก้ไขปัญหา หรือเพิ่มปัญหา

มาเดากันหน่อยว่า Clubhouse ใช้เทคโนโลยีอะไรกันบ้าง

$
0
0

วันนี้เห็นว่าทาง Clubhouse นั้นเขียน blog เรื่อง Welcoming More Voices
อธิบายของการเติบโตของการใช้งานที่สูงมาก ๆ
ซึ่งทำให้ตรงปรับปรุงระบบให้รองรับได้มากขึ้น


ไม่ว่าจะเป็น Android app
ไม่ว่าจะเป็นเรื่อง accessibility และ localization
ไม่ว่าจะเป็นเรื่องระบบ ranking และการค้นหา
ไม่ว่าจะเป็นเรื่องการเพิ่ม server เพื่อรองรับการใช้งาน
ซึ่งหลาย ๆ คนน่าจะเจอ error message แบบนี้

แน่นอนว่า ยังเปิดรับ Engineering เพิ่มอีกด้วย
ตำแหน่งที่น่าสนใจคือ Backend Engineer
โดยในคำอธิบายของตำแหน่งมีรายชื่อของ technology ต่าง ๆ ขึ้นมา
ซึ่งคิดว่า น่าจะเป็นสิ่งที่ Clubhouse ใช้มั้ง ? ดังนี้

  • Deploy ระบบบน AWS
  • Python
  • PostgreSQL
  • Redis

ในเชิงการพัฒนานั้นจะเน้นเรื่อง

  • Clean code และ Efficient code
  • เขียน Unit test
  • Scaling system
  • เพิ่มเติมในเรื่องของ data pipeline และระบบ recommendation

ใครรู้อะไรเพิ่มเติม เอามาแบ่งปันกันได้ครับ

สร้าง Docker image ของระบบพัฒนาจากภาษา Go ด้วย Buildpacks

$
0
0

มาดูการสร้าง Docker image ด้วย Buildpacks กันหน่อย
โดยที่เราไม่จำเป็นต้องสร้างผ่าน Dockerfile
ซึ่งเป็นการลดขั้นตอนของการสร้าง Docker image ลงไป
ที่สำคัญเมื่อนำมาร่วมกับระบบที่พัฒนาด้วยภาษา Go ยิ่งสะดวกไปอีก
มาดูกันว่า ใช้งานอย่างไรบ้าง

ขั้นตอนที่ 1 ทำการติดตั้ง Buildpacks ก่อน

โดยตัวอย่างจะติดตั้งและใช้งานผ่าน Mac OS
พร้อมกับติดตั้ง Docker Desktop for Mac ด้วย

[gist id="77d2c6820e9d03758a0172d6a4764f63" file="1.txt"]

ขั้นตอนที่ 2 ตัวอย่าง code ของระบบพัฒนาด้วยภาษา Go

ซึ่งจะสร้างระบบด้วย Go module

[gist id="77d2c6820e9d03758a0172d6a4764f63" file="server.go"]

ขั้นตอนที่ 3 ทำการสร้าง Docker image ด้วย Buildpacks

โดยที่ Buildpacks จะทำการ download dependency ต่าง ๆ ให้แบบอัตโนมัติ
ตามไฟล์ go.mod นั่นเอง
รวมทั้งจะสร้าง binary file ให้เองอีกด้วย
สุดท้ายจะได้ Docker image ออกมา
สร้างง่าย ๆ ด้วยคำสั่ง

[gist id="77d2c6820e9d03758a0172d6a4764f63" file="2.txt"]

เพียงเท่านี้ก็สามารถได้ Docker image
เพื่อนำไป run/deploy ต่อไปได้แล้ว
มันง่ายมากจริง ๆ

Go module by default สำหรับ Go 1.16 แล้ว

$
0
0

ตอนนี้ Go 1.16 ตัวเต็มถูกปล่อยออกมาแล้ว
ซึ่งมีความสามารถต่าง ๆ ที่เพิ่มเข้ามาและแก้ไขพอควร
หนึ่งสิ่งที่น่าสนใจคือ Go module by default
นั่นหมายความว่า คำสั่งต่าง ๆ จะใช้งานไม่ได้เลย
ถ้าไม่ได้ initial ด้วย Go module
ถือว่าเป็นการเปลี่ยนแปลง ที่หลาย ๆ คนต้องปรับตัวนิดหน่อย

ตัวอย่าง command ที่ได้รับผล

[gist id="6b9790312e4f063c6705c5cb2769bef7" file="1.txt"]

แต่ go run ยังได้นะครับ

และยังไม่อนุญาติให้ import path ได้อีกแล้ว
ยกตัวอย่างเช่น import "./xxx" เป็นต้น

ทำความรู้จักกับ Dapr (Distributed application runtime)

$
0
0

เห็นใน feed มีสิ่งที่น่าสนใจคือ Dapr (Distributed application runtime)
คำถามแรกคือ มันคืออะไร
ถูกสร้างมาเพื่ออะไร
จึงทำการอ่านและสรุปไว้นิดหน่อย

Distributed application runtime คืออะไร

ระบบส่วนใหญ่จะทำงานแบบกระจายหรือ Distributed อยู่แล้ว
นั่นคือระบบต่าง ๆ กระจายทำงานของตนเองไป
แต่ว่าส่วนงานต่าง ๆ ต้องทำงานร่วมกัน
จึงจำเป็นต้องการตัวจัดการต่าง ๆ ดังนี้

  • State management ไม่ว่าจะอยู่ใน Data store ทั้ง RDBMS และ NoSQL เพื่อจัดการกับ state ต่าง ๆ ของระบบงาน
  • การติดต่อสื่อสารระหว่าง system/service/component ซึ่งมีทั้งแบบ service-to-service และ event-driven (Pub/Sub)
  • ในการติดต่อสื่อสารแบบ service-to-service จำเป็นต้องมีการจัดการเรื่อง retry, rate limit และ circuite breaking อีกด้วย เพื่อให้การทำงานของระบบน่าเชื่อถือมากขึ้น
  • เรื่องของ Observability ทั้ง Distributed tracing, Health check, Logging และ Metrics
  • จัดการ resource ต่าง ๆ เช่น Secret เป็นต้น

นี่คือ สิ่งพื้นฐานสำหรับระบบที่ทำงานแบบกระจาย

โดยท่ีทาง Microsoft ได้สร้าง open source project ชื่อว่า Dapr ออกมา

เพื่อช่วยจัดการระบบงานตามความต้องการพื้นฐานที่อธิบายมา
เป็น implementation ของ Distributed application runtime นั่นเอง
ทำให้สามารถจัดการระบบงานในรูปแบบต่าง ๆ ใน runtime เดียวกันได้

ในแต่ละส่วนการทำงานของ Dapr จะเป็นอิสระต่อกัน

โดยที่ Dapr นั้นจะทำงานเหนือ infrastructure ซึ่งเป็นอะไรก็ได้
ทั้ง On-premise และ Cloud sytem
แสดงดังรูป

อีกเรื่องคือ Dapr นั้นจะเน้นขึ้นไปใกล้ชิดกับ application มากกว่า Kubernetes

ซึ่งสามารถนำ Dapr ไป run บน Kubernetes ได้
ด้วยการสร้าง sidecar container เข้ามาจัดการ Pods ต่าง ๆ
หรือจะ deploy แบบ standalone ก็ได้
ต่างจากกับพวก Service mesh เช่น Istio และ Linkerd
จะเน้นไปที่ network infrastructure layer มากกว่า
สำหรับการติดต่อสื่อสารระหว่าง service ผ่าน sidecar
แต่ก็ไม่ได้เพิ่ม feature ใด ๆ เข้ามาเลย

ไปเจอรูปนี้มา น่าสนใจดี

เกี่ยวกับ Dapr และ Service mesh

https://blog.nillsf.com/index.php/2020/04/26/introduction-to-dapr/

มาดูสิ่งที่น่าสนใจใน Spring Boot 2.5.0 (M2)

$
0
0

มาดูว่าใน Spring Boot 2.5 M2 มีอะไรที่น่าสนใจบ้าง ?

อะไรก็ตามที่แจ้ง deprecated ใน Spring Boot 2.3

จะถูกลบออกไปทั้งหมด
ดังนั้น ถ้าใครใช้งานสิ่งที่ depecated อยู่ เตรียมตัวพังได้เลย

เรื่องของการ initial SQL script ตอน start

ซึ่งมักจะใช้งาน schema.sql และ data.sql นั้น
แต่ถ้าใช้ร่วมกับ JPA จะพบว่าลำดับการทำงานจะเป็นดังนี้

  1. ทำการ run schema.sql และ data.sql
  2. ทำการ initial ของ JPA

แต่ถ้าต้องให้สลับลำดับการทำงานสามารถกำหนดผ่าน
spring.datasource.initialization-order=after-jpa

อื่น ๆ ก็จะมีเรื่องของ

  • Layered WAR จากเดิมที่ทำ Layered JAR ไปแล้ว
  • สนับสนุน Custom buildpacks สำหรับ docker
  • สนับสนุน Jetty 10 ซึ่งสนับสนุน JDK 11 ขึ้นไปเท่านั้น แต่ค่า default ยังใช้งาน Jetty 9 อยู่
  • ใช้งาน Gradle 7

สามารถลองใช้งานผ่านการสร้าง project ที่ Spring Initializr ได้เลย

ใช้งาน GIN index ของ PostgreSQL database สำหรับค้นหาข้อมูล

$
0
0

ใน PostgreSQL database นั้นเตรียม index ประเภทต่าง ๆ ไว้ให้ใช้งาน
สำหรับการเพิ่ม performace ของการ query ข้อมูล
แต่ก็ต้องแลกมากับ การเพิ่มหรือแก้ไขข้อมูลที่ช้าลง
รวมทั้งใช้พื้นที่ disk ในการจัดเก็บที่สูงขึ้น
เลือกใช้งานตาม use case ต่าง ๆ ดังนี้

  • B-Tree (default index)
  • Hash
  • GiST (Generalized Search Tree)
  • SP-GiST (Space-Partitioned GiST)
  • GIN (Generalized Inverted Index)
  • BRIN (Block Range INdexes)

หนึ่งตัวที่น่าสนใจคือ GIN (Generalized Inverted Index)

เนื่องจากชื่อ index มันคุ้น ๆ คือ Inverted Index
ซึ่งใช้งานใน Apache Lucene ที่ Elasticsearch ใช้งานนั่นเอง
มีเป้าหมายเพื่อค้นหาข้อมูลจากคำที่ต้องการ

การทำงานจะไม่มีอะไรมาก

นั่นคือ การแบ่งคำ และ จัดเก็บแต่ละคำว่าอยู่ตรงไหนใน table
ตัวอย่างของ Inverted Index แสดงดังรูป

การใช้งานเป็นดังนี้

[gist id="006b63d87aa156c11cb47885e1661152" file="1.txt"]

นี่คือหนึ่งในแนวทางการเลือกใช้งาน Index ให้เหมาะสมกับงาน


ทำการ build Go สำหรับลองใช้งาน Generic

$
0
0

นั่งฟัง Live เรื่อง Generic ใน Go 2 จาก DEVdose นั้น
มีสิ่งหนึ่งที่คนสนใจต้องทำคือ

ขั้นตอนการติดตั้งจาก source code

[gist id="ab1ac4b3112485772b189848c2200dfe" file="1.txt"]

ลองทดลองศึกษาและใช้งานกันดูครับ
เพราะว่า proposal ตัวนี้ได้รับการ approve ไปแล้วด้วย

รูปสวย ๆ สรุปการเปลี่ยนแปลงใน Go 1.16

$
0
0

ไปเจอรูปการสรุปความสามารถใหม่ ๆ ที่เพิ่มเข้ามา
ใน Go 1.16 แบบสวย ๆ ที่ reddit แล้วเข้าใจได้ง่าย

Elasticsearch 7.11 :: ว่าด้วยเรื่อง Schema on read

$
0
0

ปกติ Elasticsaearch ข้อมูลต่าง ๆ ที่จัดเก็บในแต่ละ index
จะสามารถค้นหาได้ก็ต่อเมื่อ ทำการบันทึกลงใน disk แล้วเท่านั้น
หรือเรียกว่า Schema on write
โดย schema หรือโครงสร้างข้อมูลจะต้องถูกวางแผนก่อนเสมอ
ว่าจะมีโครงสร้างอย่างไร
ว่าแต่ละ field จะมีชนิดอะไร

แน่นอนว่าต้องใช้เวลาที่สูงขึ้นในการออกแบบและวางแผน
เพื่อทำให้ Elasticsearch มี performance ที่ดี
การทำงานที่รวดเร็ว และ ถูกต้อง

ดังนั้นทาง Elasticsearch 7.11 จึงได้คิดแนวทางที่จะลดเวลาในการออกแบบและวางแผน

สำหรับการสร้าง schema ลงไปได้ไหม
สำหรับการทดลองหรือการปรับเปลี่ยน schema ที่มีบ่อยครั้ง
จึงได้สร้างสิ่งที่เรียกว่า Schema on read ขึ้นมา
ด้วยสิ่งที่เรียกว่า Runtime fields แต่ยังเป็น beta version อยู่นะ
พร้อมเปลี่ยนแปลงได้เสมอ
ดังนั้นลองไปใช้งานกันดู

โดยที่เราสามารถกำหนดได้ในระดับ field/property ได้เลยว่า
จะให้ทำงานแบบใดระหว่าง write หรือ read
น่าสนใจมาก ๆ

Reference Websites

https://luminousmen.com/post/schema-on-read-vs-schema-on-write

[Photo] Speaking of COBOL programming language

ข้อมูลการใช้งานที่น่าสนใจจาก Docker ปี 2020

$
0
0

ทาง Docker ได้ทำ Docker Index ขึ้นมา
เพื่อทำการสรุปและวิเคราะห์การใช้งาน Docker ทั่วโลก
นั่นคือการใช้งาน Docker Image จาก Docker Hub นั่นเอง

ยกตัวอย่างเช่น

  • มีผู้ใช้งานเพิ่มขึ้นจากปีก่อนหน้า 45%
  • มีผู้ใช้งานที่ลงทะเบียนทั้งหมด 7.3 ล้าน
  • มีการติดตั้ง Docker desktop มากกว่า 3 ล้านครั้ง เพิ่มขึ้นมา 38% จากปีก่อนหน้า
  • มีจำนวน repository ใน Docker Hub มากกว่า 8 ล้าน เพิ่มขึ้นมา 40% จากปีก่อนหน้า
  • มีการ pull image มากกว่า 300 พันล้านครั้ง ใน Q4 ของปี 2020 มีจำนวนมากกว่า 30 พันล้านครั้ง โดยมีอัตราเติมโตมากกว่า 145% จากปีก่อนหน้า

Top 10 Docker Image ที่ถูกใช้งานมากที่สุด

ประกอบไปด้วย

  • busybox
  • httpd
  • alpine
  • nginx
  • ubuntu
  • redis
  • postgres
  • node
  • memcached
  • mongo

ทำไมชื่อ endpoint ของ health check ใน Kubernetes ลงท้ายด้วยตัว Z ?

$
0
0

จากกลุ่ม Kubernetes User Group Thailand
มีคำถามที่น่าสนใจคือทำไมพวกชื่อ endpoint ของพวก health check ใน Kubernetes
สำหรับใช้ในการทำ Liveness และ Readiness
มักจะลงท้ายด้วยตัว Z ด้วยยกตัวอย่างเช่น

  • /healthz
  • /livez
  • /readyz

ใน comment มี reference ที่น่าสนใจคือ

ซึ่งอธิบายว่า มันมาจากแนวทางการทำงานภายใน Google Engineer
ที่จะเรียกพวกนี้ว่า z-pages
โดยจะมีตัวอักษร z ต่อท้ายเสมอ
เพื่อแก้ปัญหาการไปชนกับ endpoint ของ application ต่าง ๆ นั่นเอง
จากนั้น product อื่น ๆ ที่ถูกสร้างด้วย Google Engineer
มักจะใช้ endpoint ที่ลงท้ายด้วยตัว z มาเสมอ
แถมมี VDO ให้ดูด้วย

เป็นความรู็เล็ก ๆ น้อย ๆ ที่น่าสนใจดีนะ

ว่าด้วยเรื่อง API Security ของ ClubHouse ที่โดนโจมตี

$
0
0

วันนี้ดู Tweet เรื่อง การวิเคราะห์ต้นเหตุปัญหาของ API ของ ClubHouse ที่โดนโจมตี
ยกตัวอย่างเช่น
ผู้ใช้งานหนึ่งคนสามารถทำการเปิดและเข้าห้อง stream ได้มากกว่า 1 ห้อง
โดยใช้งานผ่าน web browser ได้เลย
ซึ่งแน่นอนว่า มันขัดแย้งกับ terms of service อย่างแรง

โดยใน Tweet ข้างต้นจากคุณ Daniel Sinclair ได้สรุปไว้ดังนี้

เริ่มจากระบบ ClubHouse ที่ทำงานบน web browser

https://opench.aix.uy/

ทำการอธิบายโครงสร้างการทำงานของ ClubHouse

ทำการ stream การพูดคุยผ่านระบบของ Agora
ส่วนการ publish และ subscribe ต่าง ๆ ใช้งานผ่าน PubNub
แสดงดังรูป

จาก incident หรือ ปัญหา หรือ การโจมตี หรือ บุกรุก ดังกล่าวนั้น

พบว่าปัญหามาจากเรื่องของระบบ API และ Token
แต่ตัวที่เป็นปัญหาหลักเลยคือ Token ที่ได้จากระบบของ Agora
ซึ่งให้สำหรับการ stream เสียงของการพูดคุยในแต่ละห้องนั้น
พบว่า 1 คนจะมี Token ของ Agora 1 token
ใช้ token นั้นไม่มีวันหมดอายุ
และ ไม่เปลี่ยน token เมื่อผู้ใช้ออกจากห้องด้วย

ทำให้ผู้โจมตีสามารถ ใช้งาน token นั้น ๆ
ไปสร้าง bot เพื่อเข้าร่วมห้องต่าง ๆ ได้หลาย ๆ ห้องพร้อมกัน

ทำให้เห็นว่า การออกแบบระบบต้องนี้
มันแยกการทำงานไปเลย ซึ่งกลายมาเป็นช่องโหว่ของระบบ

ส่งผลให้เกิด drama ขึ้นมาจาก project ClubHouse บน web จากข้างต้นนั่นเอง

โดย code ของ project ดังกว่าพัฒนาด้วยภาษา Python
จึงเขียน code ในการเข้าร่วมหลาย ๆ ห้องไว้ดังนี้

ดังนั้น จากการวิเคราะห์นี้

ทำให้เห็นว่า เราควรให้ความสำคัญต่อ Token lifecycle ของระบบงานอย่างมาก
รวมทั้งการเชื่อมต่อหรือ integrate เข้ากับระบบอื่น ๆ
ว่าทั้งผู้ใช้งาน และผู้ให้บริการ (service provider)
ควรจัดการให้ดีมากกว่านี้ เพื่อลดความผิดพลาดและปัญหาที่ตามมา

อีกทั้งยิ่งระบบงานเป็นที่นิยมมากเท่าไร
บรรดาผู้โจมตีก็ยิ่งสนใจมากเท่านั้น
ดังนั้นผู้ดูแลและพัฒนาระบบ ควรระวังเรื่องเหล่านี้ให้มากขึ้น


ใช้งานง่ายมาก ๆ สำหรับ Cloudflare Pages

$
0
0

วันนี้ลองใช้งาน Cloudflare Pages พบว่ามันใช้งานง่ายมาก ๆ
โดยที่มันคือ JAMstack platform สำหรับฝั่ง frontend นั่นเอง
ช่วยทำให้การพัฒนาและ deploy ระบบงานง่ายขึ้น
ไม่ว่าจะเป็น HTML, React, Vue, Next.js, Hugo, Jekyll และ Gatsby
สามารถใช้งานได้หมดเลย
ที่สำคัญเชื่อมต่อกับ GitHub อีกด้วย
ทำให้การทำงานไหลลื่นมาก ๆ

การใช้งานก็ง่ายมาก ๆ คือ

  • นำ code ไปไว้ใน repository ที่ GitHub
  • ทำการสร้าง project ใน Cloudflare page
  • เชื่อมต่อไปยัง GitHub

จากนั้นทำการเลือกได้ว่า project ของเราเป็นอะไร
และกำหนดคำสั่งในการ build และ path ของ output

เมื่อทุกอย่างเรียบร้อยก็ deployได้เลย
ที่สำคัญ เมื่อ code มีการเปลี่ยนแปลง ก็จะทำการ build และ deploy ให้อัตโนมัติ

เพียงเท่านี้ก็สามารถใช้งานได้แล้ว !!
ได้ sub-domain ของ pages.dev มาใช้งานอีกนะ

แนวทางการปรับปรุงการพัฒนา Software ให้เร็วขึ้น

$
0
0

สิ่งที่น่าสนใจในการพัฒนาและส่งมอบให้เร็วพร้อมกับคุณภาพที่สูงนั้น
เป็นคำถามที่น่าสนใจมาก ๆ
แน่นอนว่า เราอาจจะพบเจอปัญหาต่าง ๆ มากมาย
ไม่ว่าจะเป็นปัญหาคอขวดในการทำงาน
ไม่ว่าจะเป็นข้อจำกัดต่าง ๆ ของขั้นตอนการทำงาน
เราควรต้องทำอย่างไรดี ?

สิ่งที่ควรจะทำคือ การปรับปรุงสิ่งพื้นฐานต่าง ๆ เหล่านี้
แบบค่อยเป็นค่อยไปอย่างต่อเนื่อง

เรื่องที่ 1 Repository ในการจัดเก็บ source code

เหมือนจะไม่มีผลมากนัก
ระหว่างการแยกในส่วนงานต่าง ๆ เป็น repository ออกจากกัน
หรือควรรวมกันก่อนนะ
ลองคิดดูสิว่า ปัจจุบันทำอย่างไรและมีปัญหาอะไรบ้าง

เรื่องที่ 2 การเขียน code ที่ดี รวมทั้งการ revire ที่เป็นประจำ

ปัญหาที่นักพัฒนาเจอทุกคนคือ code ที่เข้าใจได้ยาก
หรือบางครั้งเขียนวกวนไปมา เอาจนงง
แม้กระทั่ง debug แล้วยังไม่เข้าใจ

ดังนั้นแทนที่จะใช้เวลาในการทำความเข้าใจนาน ๆ
มาฝึกเขียน code ที่เข้าใจได้ง่ายในบริบทของทีมนะครับ
รวมทั้งมีการ review code บ่อย ๆ
น่าจะทำให้วันนี้ดีขึ้นเรื่อย ๆ ไหมนะ

เรื่องที่ 3 Local Development ที่ดีและรวดเร็ว

ปัญหาที่เจอบ่อย ๆ มาก คือ เรื่องของ environment
ทั้งการพัฒนา
ทั้งการทดสอบ
ทำงานช้า ขั้นตอนเยอะ ส่งผลให้ได้ feedback ช้ามาก ๆ
ดังนั้นควรแก้ไขให้ทุกคนในทีม
สามารถมี local development environment ที่ได้ feedback เร็ว ๆ
รวมทั้งเป็น environment ที่คล้ายหรือเหมือนจริงมากที่สุด
และสามารถทำซ้ำ ๆ ได้อีกด้วย

เรื่องที่ 4 ระบบ CI/CD ที่ดี และมีประสิทธิภาพ

เรื่องของ CI/CD นั้นเป็นแนวปฏิบัติที่ดี
และควรนำมาใช้งานในการพัฒนาและส่งมอบระบบงานเสมอ
แต่มักจะพบว่า CI/CD นั้นมักจะทำงานช้า มี error เพียบ
รวมทั้งผ่านบ้าง ไม่ผ่านบ้าง โดยที่ต้นเหตุไม่ซ้ำกันเลย
ทั้งการ build
ทั้งการ test
ทั้งการ deploy
ทำให้ระบบไม่น่าเชื่อถือเลย
อาจจะส่งผลให้เลิกใช้งานไปในที่สุด
ดังนั้นเราควรต้องปรับปรุงให้ CI/CD ทำงานรวดเร็วและเสถียรขึ้น

แน่นอนว่า นี่เป็นเพียงพื้นฐานที่ควรจะต้องมีและดีด้วย

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

ลงมือทำและปรับปรุงอย่างต่อเนื่องนั่นคือ หัวใจหลักครับ

ลองใช้งาน Dart FFI (Foreign Function Interface) กันหน่อย

$
0
0

ในภาษา Dart 2.12 ที่เพิ่งถูกปล่อยออกมานั้น
มีความสามารถที่น่าสนใจคือ Dart FFI (Foreign Function Interface)
ที่เป็น stable version และพร้อมกับ production แล้ว
ทำให้สามารถเรียกใช้งานภาษา C/C++ จากภาษา Dart ได้
เพื่อช่วยให้ performance ของการทำงานในบาง use case ดีขึ้นอย่างมาก
ยกตัวอย่างเช่น การใช้งาน TensorFlow Lite C API เป็นต้น
รวมทั้งการใช้งาน Win32 API อีกด้วย

ใช้งานได้ทั้ง Dart mobile, command line และ server-side
ที่ทำงานบน Dart Native Platform นั่นเอง
ดังนั้นเรื่อง cross platform จึงสะดวกขึ้นอย่างมาก

สนับสนุนทั้ง Static และ Dynamic Library

สิ่งที่ชอบมาก ๆ คือ เอกสารจากทาง Dart

มีตัวอย่างของการใช้งานให้อีกด้วย
แถมทำงานกับ Docker อีกด้วย
( Docker Image ของ Dart ยังไม่เป็น official image นะ)
แต่ในตัวอย่างยังไม่เปลี่ยน version ก็เลยเปลี่ยนนิดหน่อย

ลองศึกษาและใช้งานดูครับ

Dart :: มาพัฒนาส่วนของ backend กันหน่อย ๆ

$
0
0

ไหน ๆ ฝั่ง Frontend ก็พัฒนาด้วย Flutter ด้วย Dart แล้ว
ดังนั้นเพื่อความเป็น full stack ด้วยภาษา Dart
ก็พัฒนาฝั่ง Backend ด้วยภาษา Dart กันต่อเลย
จะได้จบทั้งกระบวนการด้วยภาษา Dart เพียงตัวเดียว
มาเริ่มกันเลย

ปกติ Backend อาจจะใช้ระบบต่าง ๆ ที่มีให้แล้ว

ไม่ว่าจะเป็น BaSS(Backend as a Service) เช่น

  • Firebase
  • Parse
  • Backendless
  • AWS Amplify

แต่เราก็สามารถพัฒนา Backend เองได้ด้วยภาษา Dart

โดยที่เตรียม package httpserver มาไว้ให้
หรือไปดูเพิ่มเติมใน Web library and package ได้เลยตัวอย่าง

ตัวอย่างการใช้งานแบบง่าย ๆ

[gist id="d720d7096074ef950d4e37faa5c40b96" file="server.dart"]

ลองทำการยิง load test ก็ใช้ได้เลยนะ

[gist id="d720d7096074ef950d4e37faa5c40b96" file="1.txt"]

แต่ถ้าต้องการให้พัฒนาได้ง่ายขึ้น สามารถใช้งานพวก framework หรือ library อื่น ๆ ได้

สามารถดูเพิ่มเติมได้ที่ Dart Awesome
ยกตัวอย่างเช่น

  • Angel
  • Jaguar
  • Aqueduct
  • Start

ดูไม่ค่อย active มากเท่าไรนัก
แต่ก็เป็นอีกแนวทางในการพัฒนาระบบงานทั้ง stack ด้วยภาษา Dart ได้เลย

ว่าด้วยเรื่องของ Serial ใน PostgreSQL

$
0
0

พอดีนั่งอ่านหนังสือไปเรื่อย ๆ
ก็เจอคำถามใน facebook เรื่องของการ กำหนด Primary key ใน PostgreSQL
ซึ่งมีทั้งการใช้ Serial, Primary key และ Constraint
จึงลองไปดูการทำงานของ Serial หน่อยว่าเป็นอย่างไร ?

ปกติแล้วนั้น serial ใน PostgreSQL มันคือ

auto increment ใน MySQL/SQLite นั่นเอง
มักจะใช้งานแบบนี้

[gist id="f6e8b94312ecb8bd7ec39ed1ef72107e" file="1.txt"]

การทำงานภายในจะเป็นดังนี้

[gist id="f6e8b94312ecb8bd7ec39ed1ef72107e" file="2.txt"]

Data type ที่ PostgreSQL มีให้เลือกคือ

  • SMALLSERIAL ค่าระหว่าง 1-32,767
  • SERIAL ค่าระหว่าง 1-2,147,483,647
  • BIGSERIAL ค่าระหว่าง 1-9,223,372,036,854,775,807

โดยที่การทำงานของ Serial เป็นดังนี้
ค่าของ sequence number จะเริ่มที่ 1 และเพิ่มครั้งละ 1
Constraint ที่มาพร้อมคือ NOT NULL
ส่วน Primary หรือ Unique key ไม่จำเป็นต้องใส่
มันขึ้นอยู่ที่ความต้องการของเราเอง

ถ้าเป็น Primary Key ง่าย ๆ ก็ใช้งานแบบนี้

[gist id="f6e8b94312ecb8bd7ec39ed1ef72107e" file="3.txt"]

แต่ถ้าเป็น composite key ก็ใช้งาน constraint จะเหมาะสมกว่า

[gist id="f6e8b94312ecb8bd7ec39ed1ef72107e" file="4.txt"]

ลองใช้งานกันดูครับ

Reference Websites

PostgreSQL Documentation :: Numeric Type

Viewing all 2000 articles
Browse latest View live