Docker Part 2 - Basic Docker

Docker ขั้นพื้นฐาน

หลังจากตอนที่แล้วสอนการลง Docker ไปแล้ว ตอนนี้มาเริ่มใช้งานกันดีกว่า ส่วนใครอยากทราบว่า Docker คืออะไร อันนี้สามารถตามอ่านได้จาก Net ทั่วไป เช่น ของคุณ Rachata Tongpagdee จริงๆเขาสอน Basic ทั้งหมดในนั้นแล้วด้วย ฮ๋าๆๆๆๆ สำหรับผมถ้าพูดง่ายๆมันคือการจำลองเครื่อง server ขึ้นมาให้เราใช้งาน โดยเครื่อง server นั้นเราสามารถกำหนด spec ให้มันได้ว่ามี program อะไร run อยู่ ทำงานอะไรได้บ้าง จริงๆมันก็คล้ายๆ VM นะ แต่อันนี้เบากว่าและเหมือนจะใช้งานง่ายกว่าด้วย

เริ่มใช้งานเบื้องต้น

docker ps

docker ps : เป็นคำสั่งแสดง Container (มองว่าเป็นเครื่องจำลองก็ได้ครับ) ที่เรา Run ไว้ในขณะนี้

1
docker ps

ลองพิมพ์คำสั่งที่ command line, shell, terminal หรืออะไรที่ท่านอยากเรียก ซึ่งเมื่อ Run เสร็จจะได้ผลลัพธ์ดังภาพ หรืออาจไม่เหมือนถ้าท่าน Run docker container ไว้แล้ว หรือ ท่านไม่ได้ Start service docker (ลองสั่ง service docker start) อันนี้อยากให้ลองกดดูก่อนเพื่อจะได้รู้ว่า docker service มัน run อยู่รึเปล่า

docker run

docker run : เป็นคำสั่งสร้าง Container (มองว่าเป็นเครื่องจำลอง) ขึ้นมา

ลองใช้คำสั่งด้านล่างแล้วจากนั้นลองใช้คำสั่ง docker ps เพื่อดูว่ามี Container run ขึ้นมาอีก

1
2
3
4
5
6
7
docker run -d --name server_1 httpd

# -d คือ Option ของ docker run เพื่อให้คำสั่ง docker run มันคืน shell เพื่อให้เราสามารถทำอย่างอื่นได้ ถ้าใครสงสัยลองเอา -d ออกครับ มันจะกิน shell ของคุณ คุณจะทำอย่างอื่นไม่ได้ จนกว่าจะกด Ctrl + C ถึงจะออกมาได้ (กิน shell ศัพท์อย่างบ้านนอก)

# --name คือ คือ option ของ docker run เพื่อตั้งชื่อให้กับ Container โดยตัวอย่างจะตั้งชื่อให้ว่า server_1 โดยหากเราไม่กำหนดชื่อให้มัน มันจะสุ่มตั้งชื่อให้ โดยชื่อตรงนี้ห้ามซ้ำ ถ้าซ้ำมันจะ Error ขึ้นมา

# httpd อันนี้เป็นชื่อ Image (ตัวต้นแบบที่เราจะเอามาสร้างเป็น Container)

จากการ Run docker ps เราจะเห็นข้อมูลที่เพิ่มขึ้นมาครับ โดยแต่ละ Column จะอธิบายเกี่ยวกับ Container ที่ Run อยู่ดังต่อไปนี้

  • CONTAINER ID

มันคือเลขที่ใช้อ้างอิงถึง Container ตัวนี้ เลขนี้มันจะ gen มาให้ ซึ่งการันตีว่าไม่ซ้ำ

  • IMAGE

เป็นตัวบอกว่า Container นี้สร้างมาจากต้นแบบอะไร จากตัวอย่างคือสร้างจากต้นแบบที่ชื่อ httpd (apache นั่นเอง)

  • COMMAND

บอกว่าตัว Container นี้ Run อยู่ด้วยคำสั่งอะไร

  • CREATED

บอกว่าตัว Container นี้ถูกสร้างมาแล้วนานเท่าไหร่

  • STATUS

บอกว่าตัว Container นั้นมีสถานะอะไรอยู่ในปัจจุบัน

  • PORTS

บอกว่าตัว Container มี Port อะไรให้เราสามารถเข้าไปใช้งานได้บ้าง

  • NAMES

บอกว่าตัว Container นี้มีชื่อว่าอะไร ใช้ไว้อ้างอิงแบบเดียวกันกับ Container ID แต่อันนี้ใช้อ้างอิงง่ายกว่า เพราะมันอ่านออก

สร้างมันขึ้นมาอีก

จากนั้นลองสร้าง container ขึ้นมาอีกตามคำสั่งต่อไปนี้

  • docker run -d –name server_1 httpd

คำสั่งนี้จะ Error ครับ พร้อมบอกว่าชื่อ server_1 มีคนใช้ไปแล้ว

  • docker run -d –name server_2 httpd

อันนี้สร้างขึ้นมาได้

ลองใช้ docker ps ดูอีกรอบคราวนี้จะเห็น container สร้างขึ้นมาสองตัวแล้ว

Stop , Start, Remove

เมื่อสร้าง Container มันคล้ายๆเครื่องจำลองดังนั้นมันก็ต้อง ปิด เปิด หรือ ทำลายได้เช่นกัน โดยคำสั่งจะมีประมาณนี้

  • docker stop : เป็นคำสั่งในการหยุดทำงาน Container แค่หยุดนะครับไม่ใช่ทำลาย โดยลองสั่งคำสั่งต่อไปนี้
1
2
3
docker stop server_1

# server_1 คือตัวอ้างอิงไปหา Container ตัวนั้น โดยมันอ้างอิงได้จาก ชื่อ หรือ Container ID ดูได้จาก

มันทำการสั่งเสร็จเราใช้ docker ps อีกครั้งจะเห็นว่า container 1 เราหายไป แต่ไม่ต้องตกใจมันหายไปเพราะ docker ps จะแสดงเฉพาะ Container ที่ทำงานอยู่ ถ้าอยากเห็นหมดต้องสั่ง

1
2
3
docker ps -a

# -a เป็น Parameter ในการ Show Container ทั้งหมด ไม่ว่าจะ Start อยู่หรือ Stop อยู่

  • docker start : เป็นคำสั่งที่สั่งให้ Container เริ่มทำงาน คำสั่งจะคล้ายๆกับ docker stop
1
docker start server_1

พอสั่งแล้วกด docker ps -a ดูอีกรอบจะเห็นว่า Container : server_1 เริ่มทำงานแล้ว

  • docker rm : เป็นคำสั่งทำลาย Container
1
docker rm server_1

พอสั่งแล้วมันจะ Error ครับ เพราะ Container : server_1 มันยัง Run อยู่ครับ ให้ลองสั่ง

1
2
3
4
5
6
7
8
docker stop server_1
docker rm server_1

# หรือลองสั่ง

docker rm -f server_1

# -f คือ parameter เพื่อสั่งให้ลบ container โดยไม่สนว่ามันจะ start อยู่หรือไม่

อ่านมาตั้งนานไม่เห็นได้ลองใช้งานเลย สร้างขึ้นมาทำไม

จริงๆตอนเราสร้าง Container ขึ้นมาคือมันใช้งานได้แล้วล่ะครับ สภาพมันจะเป็นตามภาพ

แต่ที่เราใช้ไม่ได้เพราะเราไม่รู้ว่าเครื่องมันอยู่ตรงไหนครับ (IP Adress) คือเรารู้ที่อยู่เครื่อง Machine ที่เราลงอยู่ครับแต่เราไม่รู้ว่า Container อยู่ตรงไหน ซึ่งจริงๆเรารู้ครับแต่จากการที่เราอยู่นอกวงที่ติดต่อได้ อยู่ Net คนละวง ด้วยความยุ่งยากประมาณนี้ Docker เลยช่วยเราโดยการใช้วิธี Bind port ให้ครับ

มายกตัวอย่างกันตอนนี้ผมสร้าง Container ขึ้นมาตัวนึงชื่อ my_http_server โดยใช้คำสั่ง

1
docker run -d --name my_server httpd

จากการ Run เราจะได้สถานการณ์ประมาณนี้

หลายคนคงบอกว่าเฮ้ยรู้ได้ไงว่า Container เปิด Port 80 สามารถดูได้หลายที่ครับ ที่แรกคือ สั่ง docker ps ครับ หรือเปิด Manual ของ Image ที่เราเอามาใช้ครับ เช่นของผมจะไปอ่านว่าเขาเปิด Port ไหนที่ Link นี้ หรือ มันเป็นเรื่องที่โดยทั่วไปในวงการเช่น httpd เขาก็เปิด 80 อยู่แล้ว อันนี้อาจโหดร้ายกับน้องใหม่ แต่เขาคิดว่ามันธรรมดามากๆจนไม่เขียน แต่ทุกวงการมีเรื่องอย่างนี้หมดครับ อย่าไปใส่ใจมันมาก พออยู่ในวงการไปสักพักจะค่อยๆรู้เอง อย่างวงการไอดอลเขามีขาย “เซกิ” ฟังครั้งแรกนี่งงเลยดิ ฮ่าๆๆๆ

คราวนี้จากภาพเราจะเห็นว่าเรารู้แต่ IP เครื่องที่ลง Docker แต่เราอยากติดต่อเครื่อง Container ที่อยู่ภายในเครื่องนั้นตัว Docker ก็แบบให้เราสามารถทำได้ง่ายๆโดยใช้วิธี Bind port โดยใช้คำสั่ง

1
2
3
4
5
6
7
# กรุณาลบ Container my_server ทิ้งก่อนแล้วค่อยสั่ง

docker run -d --name my_server -p 80:80 httpd

# -p คือ parameter ในการ Bind port โดยในตัวอย่างคือ -p 80:80
# โดย 80 หน้า : หมายถึง port 80 ของเครื่องหลัก
# โดย 80 หลัง : หมายถึง port 80 ของเครื่อง Container

โดยสถานการณ์จากการ run คำสั่งด้านบนจะเป็นดังภาพ คือเครื่อง Machine ทำการ ผูก Port 80 เข้าหากัน

เมื่อเรา Run แล้วลองเข้า Browser แล้วใส่ ip ของเครื่องหลักครับ (กรณีของผมเครื่องหลักอยู่ที่ 192.168.56.101) เราจะได้ผลลัพธ์ดังภาพ

เพื่อความเข้าใจที่มากขึ้นลองทำการ Bind port เครื่องหลักที่ไม่ใช่ 80 ดูกัน

1
2
3
# กรุณาลบ Container my_server ทิ้งก่อนแล้วค่อยสั่ง

docker run -d --name my_server -p 8080:80 httpd

แล้วลองเข้า Browswer แล้วกรอก ip ตามด้วย : port จากตัวอย่างของผมจะเป็น 192.168.56.101:8080

สรุป

ในตอนนี้ผมได้แนะนำวิธีการใช้ docker แบบเบื้องต้นมากๆ ตั้งแต่ Create , Start , Stop, Remove แล้วก็ Bind port ให้สามารถใช้งาน container ผ่านทางเครื่องหลักได้ ในตอนต่อๆไปจะค่อยๆสอนใช้ Docker ไปเรื่อยๆ โดยแนะนำตามที่ผมค่อยๆเรียนรู้และนำไปใช้งานกับงาน สำหรับคนผ่านมาอ่านตอนนี้ผมเปิด Page Facebook แล้วนะครับ ใครเล่น Facebook แล้วอยากได้แจ้งเตือนตอน Update blog ไปกดติดตามกันได้ครับ

เพลงประกอบการเขียน Blog

เพลงเพราะๆของพี่แอน ธิติมา คือฟังเพลงพี่เขามาตั้งแต่เด็กๆ เสียงพี่เขานี่ดึงอารมณ์เพลงได้สุดยอดมากจริงๆ เพลงใสๆหวานๆนี่จะฟินโคตรๆ แต่เพลงเศร้านี่ฟังแล้วดำดิ่งกันสุดๆ

Docker Part 1 - เริ่มใช้งาน Docker โดยใช้ VM

เริ่มใช้ Docker บน VM กัน

ตอนแรกว่าจะไม่เขียนเรื่องนี้เพราะมี Tools มากมายไม่ว่าจะเป็น Docker for windows อันนี้ Window ต้องเป็น Lincense Pro หรือ Enterprise ถึงจะใช้ได้ หรือ Docker tools boxs ก็ดีสร้าง vm ขึ้นมาหลายตัวได้ ทำ cluster ก็ได้ ว่าง่ายๆมันคือ docker machine นั่นแหละ ซึ่งเป็น 2 ทางเลือกที่โอเคเลย

แต่จากการลองทำงานที่ทำงานหลายคนลง Docker for windows ไม่ได้เพราะไม่มี License Pro หรือ Enterprise ส่วน Docker toolsbox ก็มีปัญหาเรื่อง Binding volume ซึ่งมันมีวิธีการ Binding volume ตาม Link นี้ ซึ่งทำไปทำมามันดูวุ่นๆเลยเอาวะ ลงแบบโบราณไปเลยดีกว่า ลง VM แล้วใช้งานมันบน VM นั่นแหละ ให้ Docker มันอยู่ใน VM เวลาใช้ Command อะไรก็เหมือน Linux ไปเลย (command ในที่นี้หมายถึง command เวลาใช้งานเครื่อง Server)

Install Program กัน

Install VirtualBox

Download program virtual box เลือกตัว Platform แล้วกด Download ลงมาเลย

สร้างเครื่อง Guest

คือ Virtualbox มันเป็น Program ให้เราสร้าง Virtaul machine ขึ้นมาเป็นเครื่อง Guest (เครื่องที่สร้างเป็น VM จะเรียว่าว่า Guest ) ส่วนเครื่องที่เราใช้งานอยู่ในปัจจุบัน (ตอนนี้คือ Windows ) จะเรียกว่าเครื่อง Host ว่าง่ายๆ เครื่องจริงเป็น Host เครื่องปลอมเป็น Guest ส่วนวิธีสร้างเครื่อง Guest สามารถหาดูได้ตาม Youtube หรือ Blog ทั่วไปได้เลย

อันนี้สอนลงง่ายๆ กดตามไปเลย

ส่วนใครขี้เกียจลงเอง ผมมีสร้างตัว VM แบบพร้อมใช้งานแล้ว คุณสามารถโหลดได้ที่ Link นี้ แล้วแตก zip แล้วกด Double click เข้าใช้งานตัว VM ได้เลย

โดยเครื่อง Guest ที่ผมลงจะเป็น CentOS7 (ตอนนี้มี 8 แล้วนะแต่ลงไม่เป็น ฮ่าๆๆๆๆ)

พอลงเสร็จแล้วให้ลองใช้ตัว Interface ของ VM (ตัวนี้เปรียบเสมือนกับเครื่อง Guest นั้นจริงๆที่ต่อ Keyboard กับ จอให้เราใช้งาน เราสามารถ Login เข้าใช้งานเครื่องนี้ได้โดยเครื่องนี้ไม่ได้ต่อกับ Net วงไหน ) ทำการ Login เข้าไปใช้งานเครื่องดูครับ โดย username password ตามที่คุณตั้งกันเลย ถ้าของผมจะเป็น

  • user: root
  • pass : root

ทำการ Setting Network

คือเครื่อง Guest ก็เหมือนเครื่องจริงๆเครื่องนึงดังนั้นมันสามารถต่อเข้า Network ได้ โดยอันนี้เราจะสร้างให้เครื่องนี้มี 2 Interface ครับ สำหรับคนที่ใช้เครื่องของผมอันนี้ผม Set ให้หมดแล้วครับ แต่ดูวิธี set ไว้ก็ดีครับ เพราะยังไงในอนาคตถ้าต้องการปรับแต่งอย่างอื่นเพิ่มเติมก็สามารถทำได้เอง

  • NAT อันนี้ไว้ต่อ Internet จริงๆ

  • Host Only อันนี้มีไว้ต่อกับเครื่องจริงของเรา มีไว้คุยกันภายใน

โดยมีวิธี Setting คือ คลิกขวาที่ตัวเครื่องแล้วเลือก Setting ตามภาพ

จากภาพเรา Set Host only ไว้ที่ interface หนึ่ง

และ interface 2 เรา set ให้เป็น NAT

Putty เข้าใช้งานเครื่อง Guest

ปกติเครื่อง Server ส่วนใหญ่เขาจะเปิดให้เรา Remote เข้าไปใช้งานโดยโหมดที่เขาให้เราเข้าไปใช้งานส่วนใหญ่จะเป็น Command line บางคนเวลา Remote เข้าไปใช้งานก็จะเรียก shell เข้าไป บางคนอยู่หน้า Command line บางคนเรียก shell บางคนเรียก cmd บางคนเรียก Terminal ซึ่งหลากหลายมาก แต่ผมเรียกปนๆไปนะ ช่างมันเถอะ ฮ่าๆๆๆๆ

ถึงตาพระเอกของ ### นี้ (มุกการจัด Header ในไฟล์ MD ) คือ Putty โดย Download ตัวใช้งานที่เป็น Client

ก็สำหรับใครที่ใช้ VM ของผมนะครับ IP Address ถ้าลงใหม่ๆเลยจะเป็น

  • ip : 192.168.56.101
  • user : root
  • pass : root

ส่วนคนอื่นที่ลงเองหรือก็ต้องไปดูที่ IP ครับ โดยมีวิธีดูโดย Login เข้าไปในเครื่อง (โดยใช้ interface ของ Virtual box ) แล้วใช้คำสั่ง

  • ip addr : จะเห็น IP ของเครื่อง ตามภาพ

จากภาพจะเห็นว่า ip ของเครื่องคือ 192.168.56.101 ครับ โดยตรงนี้หลายคนอาจสงสัยว่ารู้ได้ไงว่าใช้ net วงนี้วะ จริงเราสามารถดูได้ว่าเราจะใช้วงไหนโดยการดูที่

จะเห็นว่า HostOnly Adapter ที่ผม Set ไว้มันมีวงเป็น 192.168.56.x/24 เพราะอย่างนี้ผมเลยรู้ว่าเครื่อง VM เครื่องนี้มี ip เป็น 192.168.56.101 ส่วนของใครมี ip เป็นอะไรก็ไปดูได้ตามที่บอกครับ

โดยถ้า Putty เข้าเครื่องสำเร็จเราจะสามารถใช้งาน command line ผ่านตัว putty ได้เลย โดยถ้าใครถามว่าทำไมใช้ putty ไม่ใช้ interface ของ Virtual box ล่ะ คำตอบคือ putty มัน copy / parse ได้เลยโดยลากแล้วคลิกขวาวางได้เลย ในส่วนของ vm interface มันใช้ยากกว่า ผมเลยแนะนำให้ใช้ putty ครับ

ทำการเชื่อม Volume ระหว่างเครื่อง Host กับ Guest

ปัญหาหนึ่งในการใช้ VM (สำหรับ Developer) คือ เวลาเราแก้ Code อะไรในเครื่องจริง เราอยากให้มันถูกแก้บนเครื่อง VM ด้วย โดยวิธีแก้คือแก้บนเครื่องจริง แล้วใช้ FileZilla ไปวางทับอีกที ซึ่งวุ่นวาย ตัว VirtualBox เขาเลยทำวิธีการ ShareFolder ครับ โดยมีวิธีการทำดังนี้

Install addtion guest

สำหรับคนลงเองต้องลงส่วนเสริมเกี่ยวกับการ Share folder ก่อน สำหรับคนที่ใช้ VM ผมไม่ต้องทำ step install adition guest นี้ครับ โดยสามารถทำตาม Link นี้

ทำการ Set ShareFolder

เมื่อทำการลงเสร็จให้ปิดเครื่อง Guest แล้วมา Setting การ Share folder ระหว่างเครื่อง Guest กับ Host ดังภาพ

โดยในส่วน Folder path : เราเลือกเอาเลยครับว่าจะgเอา Folder ไหนที่เราอยากจะให้เห็นทั้งเครื่อง Host และ เครื่อง Guest ส่วน Folder name และ Mount point ตั้งชื่อตามสะดวกครับ ของผมตั้งไว้ชื่อ share_docker และเลือก option ตามภาพ กด Accept

จากนั้นเปิดเครื่อง Guest แล้วเข้าไปสร้าง Folder ในเครื่อง Guest ใน Path ที่อยาก share ของผมอยาก share ที่ Path : /root/share_docker

1
2
mkdir /root/share_docker
chmod -R 0777 /root/share_docker

จากนั้นใช้คำสั่ง cat /etc/passwd เข้าไปจดเลขตามที่วงแดงไว้ โดยจากภาพเลขที่ต้องจดคือ 997

จากนั้นใช้คำสั่ง cat /etc/group เข้าไปจดเลขตามที่วงแดงไว้ โดยจากภาพเลขที่ต้องจดคือ 995

จากนั้นใช้คำสั่ง

1
mount -t vboxsf share_folder_name -o rw,dmode=777,gid=xxx,uid=xxx /guest/path/to/share

โดยตรงตัวแปร

  • share_folder_name คือชื่อ share_folder ที่เราตั้งที่ VirtualBox
  • gid ให้เอาค่าที่จดจากการอ่านไฟล์ /etc/group มาใส่
  • uid ให้เอาค่าที่จดจากการอ่านไฟล์ /etc/passwd มาใส่
  • /guest/path/to/share คือ path ที่จะ share ในเครื่อง guest

โดยจากตัวอย่างจะได้เป็น

1
mount -t vboxsf share_docker -o rw,dmode=777,gid=995,uid=997 /root/share_docker

จากนั้นทำการลองสร้างไฟล์ใน folder ที่เราทำการ mount ครับ โดยจะเห็นไฟล์ในเครื่องจริงกับ VM นั้นเหมือนกันเลย

สั่งให้ทำการ Mount ทุกครั้งที่ Login เข้าใช้งานเครื่อง

จากขั้นตอนที่แล้วเราสั่งให้ทำการ share folder (mount) ระหว่างเครื่อง host และเครื่อง guest แล้ว แต่ทุกครั้งที่ปิดเครื่อง เวลาเรา Login เข้ามาใหม่ เราต้องทำการสั่งคำสั่งนี้ทุกครั้ง ดังนั้นเพื่อให้สะดวกเราจะฝัง script นี้ให้ทำงานทุกครั้งที่เรา login โดยทำได้โดยใช้เข้าไปแก้ไขไฟล์ ~/.bashrc โดยใช้คำสั่ง

1
echo "mount -t vboxsf share_docker -o rw,dmode=777,gid=995,uid=997 /root/share_docker" >> ~/.bashrc

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

ทำการ Install docker

วิธีการ Install docker นั้นมี manual อยู่ที่ เว็บหลัก ของ docker แล้ว แต่มีอีกวิธีนึงที่ง่ายมากสามารถทำตามโดย copy วางแล้วไม่ค่อยมีปัญหาคือใช้วิธีตาม เว็บนี้

ซึ่งพอทำตามเสร็จให้สั่ง Restart เครื่อง Guest จากนั้นเข้าเครื่อง guest login เข้าไป จากนั้นสั่ง

1
systemctl enable docker

จากนั้นสั่ง restart อีกครั้ง

ทดสอบการใช้งาน Docker

ทดลองใช้คำสั่ง

1
docker run --rm  -p 80:80 nginx

จากนั้นเปิด Browser ที่เครื่อง Host พิมพ์ Ip ของเครื่อง Guest โดยของผมจะเป็น 192.168.56.101 ซึ่งถ้าเปิดได้ดังภาพแสดงว่าคุณลง docker สำเร็จแล้วครับ

สรุป

สำหรับตอนนี้เป็นตอนที่สอน Install ใช้งาน docker กับ Virtualbox ซึ่งเหมาะกับใครที่ชอบเล่นท่ายาก หรืออยาก customize อะไรเอง ก็คงจะได้สมใจกันครับ ในตอนต่อๆไปผมจะคงจะมาสอนใช้ command ของ docker คร่าวๆแล้วก็การประยุกต์นำไปใช้งานครับ สำหรับตอนนี้ขอจบเท่านี้ครับ

เพลงประกอบการเขียน Blog

เพลง Cover ของน้อง Nico ฟังแล้วทำนองกับเสียงร้องของน้องเข้ากันได้ดี ไม่เคยฟังต้นฉบับเลย ฮ่าๆๆๆๆ

ความทรงจำปี 2019

ปี 2019 ที่ผ่านมา

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

ตามไอดอล

ไม่น่าเชื่อว่าคนที่ชอบบอกคนอื่นเสมอว่า “เฮ้ย เอาเงินไปเสียเงินกับไอดอลคิดดีแล้วเหรอวะ” ไม่คิดว่าการไปดูไอดอลกับเพื่อนครั้งนั้นทำให้ตามไอดอลกับเขาด้วย การตามไอดอลนี่ทำให้ได้ไปทำอะไรหลายๆอย่างนะ ไม่ว่าจะไปเซกิ ไป Fan meeting ไปดูคอนเสิร์ตวงไอดอล ไปกินข้าวปั้นฝีมือไอดอล แต่ถ้าถามว่าไปสุดไหมจริงๆก็ไม่สุดนะคือไม่ได้เชียร์ ยิงอะไรสักอย่างอย่างที่เขาทำกัน คือจะทำแล้วมันก็เขินอะนะ จริงๆก็กะตามน้องคนที่ชอบไปเรื่อยๆนะ งานไหนมีเวลาว่าง เงินพอมีก็จะไป แต่ตามได้แค่ครึ่งปีน้องป่วยจนเป็นไอดอลต่อไม่ได้ซึ่งทำให้ต้องกลับญี่ปุ่นก็เลยทำให้ไม่ได้ตามต่อ (จริงๆก็ตามต่อใน Facebook youtube แล้วตลกมากๆตรงเข้าไป comment น้องเขาคนเดียวใน Youtube บรรยากาศนี่อย่างเหงาเลย) ตอนนี้ก็ห่างหายไปละ มีไปตามวงที่ชอบที่เหลืออยู่บ้างแต่ไม่ได้เท่าตอนตามใหม่ๆละ

ไปสิงคโปร์

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

ไปโตเกียว

ไปดูภูเขาไฟฟูจิ

เป็นการไปญี่ปุ่นครั้งที่สองในชีวิตซึ่งครั้งนี้ไปเที่ยวที่โตเกียว โดยบรรยากาศเป็นเมืองไม่เหมือนรอบที่แล้วที่เป็นธรรมชาติ ถือว่าเป็นความประทับใจที่ได้ไปเห็นเมืองของประเทศที่หลายคนบอกว่าเป็นประเทศที่เจริญแล้ว สิ่งที่ทึ่งมากๆคือระบบรถไฟใต้ดินของเขาที่ตรงเวลาโคตรๆ คือบอกเลยว่าใช้ Google map แล้วเลือกว่าจะเดินทางไปไหนโดยใช้รถไฟใต้ดินนี่ไม่มีหลง คือแม่งเป๊ะมาก อีกเรื่องที่อยู่ในความทรงจำคงเป็นภูเขาไฟฟูจิ คือเราเห็นภูเขานี้ผ่านเกมส์ ผ่านการ์ตูน หนัง แต่เราไม่เคยเห็นของครั้งนี้พอได้มาเห็นของจริงก็ “อือ เหมือนในหนังเลยว่ะ” ก็ตลกดีที่เราไม่ว้าวแต่ก็ถ่ายรูปเก็บมาเยอะเหมือนกันเพราะคิดว่าคงไม่มีโอกาสได้ไปอีกแล้ว

หอคอยโตเกียว

อันนี้คล้ายๆภูเขาไฟฟูจิ เห็นตั้งแต่เด็ก พอมาเจอของจริงก็ “เหมือนในการ์ตูนเลยว่ะ”

งานแต่ง

อีกอันที่โคตรดวงดีไปเจอคือตอนไปเที่ยวแบบไม่มีจุดหมายในโตเกียวโดยไม่รู้ว่าจะไปที่ไหน พอไม่รู้เลย Search google เขาแนะนำให้เที่ยวสถานที่ในเมืองซึ่งเป็นวัดญี่ปุ่น (อารมณ์เหมือนฝรั่งมาไทยแล้วเที่ยววัด) ก็เลยเดินเที่ยววัดแถวนั้น ซึ่งวัดบางวัดนี่อย่างเงียบเหงาคือเข้าใจอารมณ์หนังผีญี่ปุ่นที่แม่งอยู่ในวัดมาก คือเข้าไปแล้วไม่รู้สึกว่าปลอดภัยขึ้นเลย แล้วระหว่างเที่ยววัดนึงเห็นมิโกะกำลังเดินเข้าเดินออกจากศาลาหลักก็เลยหยุดดู เฮ้ย เขากำลังแต่งงานกันอยู่ว่ะ เลยอยู่ดูเป็นสักขีพยานการแต่งงานแบบญี่ปุ่น (เข้าใจว่าแบบดั้งเดิมของเขา) ในพิธีนี่มีคนที่แต่งตัวเป็นสมมุติเทพมาทำพิธีให้ด้วย ดูแล้วอย่างว้าว ว้าวแบบจะมีกี่ครั้งวะที่มาเที่ยวญี่ปุ่นแล้วจะเจอคนแต่งงานกันแล้วได้ยืนดูใกล้ขนาดนี้ (ไม่ใกล้มากแต่ใช้กล้องซูมดูเอา)

กินข้าวที่ลานจอดรถ

อันนี้คืออีกหนึ่งความทรงจำคือไปซื้อของที่ร้านในวัดโคมแดงมากินแต่ไม่มีที่นั่งเว้ย คือแม่งไม่มีที่นั่งเลย จะยืนกินก็ยืนไม่ได้เพราะอาหารที่ซื้อมาหนักมากยืนกินมือเดียวไม่ได้ ก็เลยเดินหาที่นั่งจนมาเจอลานจอดรถเราก็เลย “กินแม่งตรงเนี้ยแหละ” ก็เลยนั่งกินอาหารที่ลานจอดรถ ที่พีคกว่านั่งกินที่ลานจอดรถคืออาหารแม่งเลี่ยนมาก เลี่ยนเหี้ยๆ เลี่ยนแบบ ไอสัดกินไปได้ยังไง กินไป 75% ก็ไม่ไหวละ ถ้ากินอีกอ้วกแน่นอนก็เลยทิ้งไป

บริษัทเริ่มเปลี่ยน

หลังจากเป็น Developer ปากหมามาได้นานพอสมควร ผ่านเรื่องน่าเบื่อหน่ายมามาก จนผู้ใหญ่มองว่าถ้าให้ทำตรงนี้ต่อน่าจะเละเป็นแน่แท้ (ฮ่าๆๆๆ) ทางผู้ใหญ่เลยให้ลองเปลี่ยนไปทำอย่างอื่นดู ประจวบเหมาะกับพี่ที่มีความรู้เกี่ยวกับระบบงานพวก CI และ GCP เข้ามาในบริษัท ก็เลยโดนมอบหมายให้ศึกษาและทำให้บริษัทเริ่มไปใช้เทคโนโลยีที่คนปัจจุบันกำลังใช้กัน คือพูดอย่างงี้หลายคนคงบอกว่าเชยจัง เขาใช้มากันจะ 4 -5 ปีแล้วซึ่งสมัยก่อนผมก็คิดอย่างงั้นแหละครับ แต่ถ้าคุณมาเจองานจริง มันมีข้อจำกัดหลายๆอย่างที่คนที่เขาดูแลระบบมาก่อนเขาเคยเจอ แล้วถ้าคุณจะใช้วิธีใหม่คุณก็ต้องหาวิธีแก้ปัญหาเก่าด้วยวิธีใหม่ของคุณให้ได้ก่อน ผมเห็นด้วยกับสิ่งที่หัวหน้าผมพูดว่า “ถ้าคุณไม่เข้าใจว่าปัญหาคืออะไรแล้วจะเครื่องมือใหม่หรือวิธีการใหม่ที่เข้ามามันช่วยแก้ปัญหานี้ยังไง การเปลี่ยนเครื่องมือหรือวิธีการก็ไม่ได้ช่วยอะไร” ก็ถือเป็นการทำงานที่หัวหมุนน่าดู ต้องหาในสิ่งที่ไม่รู้ ไม่รู้แบบเคว้งเลย ติดก็ต้อง Search หาเอาใน Google เจอแล้วก็ต้องเข้าใจว่ามันทำงานยังไง ไม่ใช่ Copy วาง จบปีอะไรก็ดูเป็นรูปเป็นร่างมากขึ้น อะไรที่เคยหวังจะเห็นตอนมาทำงานใหม่ๆก็ได้เห็น ปีหน้าคงมีอะไรที่ต้องศึกษาเพิ่มเติมอีกเยอะไม่ว่า Cloud platform ต่างๆ Framework ใหม่ๆ วิธีการ Design Application ในโลกจริง

ดูละครเวที + ดูละครเวที

จากปีที่แล้วที่เฮิร์ตแล้วไม่รู้จะทำอะไรเลยไปดูละครเวที พอมาปีนี้เลยกลายเป็นเห็นประกาศแสดงอะไรก็ไปดูทุกที (แต่ต้องเป็นแบบไม่เสียเงินนะถึงจะไป) ซึ่งการดูละครเวทีนี่ก็ทำให้เราเห็นว่านักแสดงมีผลกับละครหรือหนังยังไงนะ คือไปดูมาเรื่องนึง บทแม่งเหี้ยมากดูไปไม่รู้เรื่องเลยว่าจะสืออะไร แต่ตัวละครเล่นได้สมบทบามมากจนเราสนใจตัวละครมากกว่าเนื้อเรื่องเสียอีก หรือบางเรื่องนักแสดงแค่สองคนแต่ดูแล้วรู้สึกคุ้มกว่าหนังที่เสียเงินไปดู 100 - 200 อีก สำหรับใครที่อยู่แถวกรุงเทพแล้วอยากดูละครเวทีดีๆที่ไม่เสียเงิน (บางเรื่องอาจเสียบ้าง แต่เสียแล้วอลังการ) ก็แนะนำที่ https://www.dramaartschula.com/

อ่านหนังสือปรัชญา

ปีนี้ถือเป็นปีแห่งการอ่านหนังสือปรัชญาคือซื้อหนังสือพวกปรัชญามาอ่านเยอะมากโดยส่วนใหญ่เป็นหนังสือปรัชญากบฏหรือพวกแนวทางที่ไม่ใช่กระแสหลัก ซึ่งอ่านแล้วทำให้เห็นมุมมองใหม่ แล้วก็เอามาใช้ในชีวิตประจำวันหลายเรื่อง ไม่ว่าจะเรื่องการแบ่งแยกธุระ เช่น ธุระของเราคือการทำงาน ส่วนว่าเขาจะถูกใจกับงานที่เราทำหรือการตอบสนองของเขาใหม่เป็นธุระของเขา ถ้าไม่ดีธุระของเขาคือการแจ้งให้เราทราบ ส่วนธุระของเราคือนำมาตรวจสอบและดูว่ามันควรเปลี่ยนหรือไม่ ถ้าเราแยกธุระเป็นเราก็ไม่ต้องสนใจธุระที่ไม่ใช่ของตัวเองชีวิตก็ลดเรื่องกังวลใจไปได้เยอะ หรือแนวคิดของแอดเลอร์เรื่องอดีตไม่ได้เป็นตัวตัดสินพฤติกรรมหรือการกระจำปัจจุบัน ตัวเราต่างหากที่ตัดสินใจว่าจะมีพฤติกรรมแบบไหน อันนี้ถือเป็นแนวคิดที่ช่วยในการใช้ชชีวิตได้ดี แต่ก็ยังเอามาใช้ไม่หมด แต่ก็จะพยายามเอามาใช้ให้ได้มากขึ้น

ปีแห่งความล้มเหลว

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

  • ทำ Blog ความรู้เรื่องการเขียนโปรแกรม (ที่อัพเดททุกสัปดาห์)
  • วิ่งออกกำลังกายทุกสัปดาห์
  • อ่านหนังสือสัปดาห์ละเล่ม
  • เขียน Tools ช่วยในการทำงาน
  • ฝึกเล่นกีต้าร์
  • ฝึกใช้งาน GCP แบบที่เอาไปทำงานได้
  • ฝึก Tradeoff ในการเลือกใช้เทคโนโลยีว่าควรจะใช้ตัวไหน
  • และอีกมากมาย

อีกมากมายคือมากมายจริงๆ เยอะแบบมาคิดดูแล้วแย่มาก คือถ้าคิดว่ามีชีวิตเหลืออีก 10 ปี (เคยคิดว่าอายุไม่น่าเกิน 40 เพราะน่าจะตายด้วยโรค) แล้วเรื่องอยากทำยังเหลือเยอะเป็นภูเขาเลย

สรุป

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

หลายๆเพลงที่ฟังในปีนี้

ฮาวทูทิ้ง = How to ting

ฮาวทูทิ้ง

ฮาวทูทิ้ง ครั้งแรกที่ได้ยินนึกว่าชื่อหนังสือที่สอนให้คนทิ้งของ (บริจาคของ) ออกจากบ้าน แต่พอฟังไปฟังมาอ้าวนี่มันโฆษณาหนังนี่หว่า ซึ่งตัวอย่างมีเนื้อเรื่องถึงนางเอกที่พยายามจะจัดบ้านหรือทำบ้านไรสักอย่างแล้วต้องทิ้งของแล้ว แต่พอเจอของที่ต้องทิ้งแล้วทำให้นึกถึงเรื่องเก่าซึ่งทำให้เราสงสัยว่าตกลงนางเอกจะทิ้งหรือไม่ทิ้ง แล้วก็มีการแชร์ใน Facebook เรื่องการ Move on และก็เป็นกระแสกัน

คะแนนรีวิวอย่างสูง

พอหนังเข้าโรงก็มีคนมาให้คะแนนรีวิวอย่างสูงเลยครับ บาง Page นี่ 8.5 - 10 (ไอ 10 นี่น่าจะ Page อวย ซึ่งแม่งให้ 10 ทุกเรื่องเลยมั้ง) เพื่อนที่ไปดูมาก็บอกว่าเฮ้ยแม่งโคตรสุดว่ะ ต้องไปดู ตัวผมเองก็เก็บความสงสัยว่ามันจะขนาดไหนวะ สักพักก็มีเพื่อนบอกว่า หนังของผู้กำกับคนนี้เลยนะเว้ย ซึ่งผมก็พอรู้จักชื่อแล้วก็เห็นเพื่อนแชร์ใน Facebook เยอะอยู่เหมือนกัน ซึ่งหนังหลายเรื่องของเขาก็ดังจริง

เขาว่าดีงั้นก็ดูแม่งเลยละกัน

ไม่นานรุ่นน้องผมก็ชวนผมมาว่า “พี่ดูฮาวทูทิ้งไหมพี่” พอมันชวนมาก็เลย เออไปดูแม่งเลยละกันเขาบอกว่าดีอย่างงั้นอย่างงี้ มันจะเป็นไงวะ ก็เลยตกลงกับน้องว่าจะไปดู (ต้องขอบคุณมันด้วยที่ทำให้สามารถซื้อตั๋วได้ในราคาถูก) ก่อนดูก็ไปอ่านดูว่าเนื้อเรื่องน่าจะเกี่ยวกับอะไร อ่านไปอ่านมาเห็นมีแต่คนพูดเรื่อง Move on อะไรสักอย่าง สักพักพูด Move on เป็นวงกลม อะไรก็ไม่รู้ก็เลย เออช่างแม่งไปดูในโรง ไม่ต้องปูพื้นห่าไรก่อนไปดู เอาแบบนั่งรอดู Big cinema ช่อง 7 สมัยเด็กๆเลย เปิดเจอปุ๊ปนั่งดูยาวๆ

ดูแล้วเป็นไงบ้าง แบบไม่สปอย (วิจารณาญาณส่วนบุคคล)

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

ดูแล้วเป็นไงบ้าง แบบสปอย (วิจารณาญาณส่วนบุคคล)

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

ดูได้เรื่อยๆ จุกได้เรื่อยๆ ถ้าคุณไม่เคยยอมรับ

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

ทุกคนทำเพื่อตัวเองทั้งนั้น

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

ถ้าคุณไม่สนใจ ไม่นึกถึง คุณก็ไม่รู้สึก

ประเด็นนี้ผมชอบมากคือมันปูให้เราเห็นตั้งแต่การที่นางเอกแม่งทิ้งของเว้ย แต่เมื่อไหร่ที่เราไปรู้สึกแม่งก็จะรู้สึกขึ้นมาซะงั้น แต่ในทางตรงกันข้ามถ้าเป็นคนที่ไม่มีเยื่อใยจะทิ้ง จะเผา ก็ช่างแม่ง ดูได้จากฉากตอนจบที่นางเอกฝากพี่ชายทิ้งของ อีกฉากคือแม่ของนางเอกมาโวยวายตะโกนเรื่องเปียโน คือแม่งจะเป็นเรื่องเสียความรู้สึกเหี้ยๆแน่นอนถ้าไปคุย ไปสนใจ ไปนึกถึง แต่นางเอกใส่หูฟังเว้ย พอไม่ได้ยิน ไม่สนใจ ไม่เอามาคิด เราก็ไม่รู้สึกเหี้ยอะไรเลยจริงๆ เหี้ยง่ายไหมล่ะ วิธีจัดการความรู้สึกง่ายๆ ซึ่งคำตอบนี้เราก็รู้อยู่ในใจกันทุกคนแต่ไม่ทำ หรือเลือกที่จะไม่ทำ

เราเลือกสิ่งที่อยากเห็น เราตีค่าทุกอย่างตามความต้องการล้วนๆ

ประเด็นเล่นในหลายๆฉาก ไม่ว่าจะฉากรูปถ่ายที่พูดมาตรงๆว่ารูปนี้สมัยก่อนแม่งแทบไม่มีค่า แต่พอจะแต่งงานแม่งกลับมีค่าขึ้นมาซะงั้น สิ่งเดียวกันแท้ๆ พอให้ค่าแม่งมีค่า พอไม่ให้ค่าแม่งไร้ค่า การ์ดปีใหม่ถ้าเป็นนางเอกก่อนเจอจุดพลิกผันแม่งคงเป็นแค่กระดาษ แต่พอเริ่มให้ค่ามันไอเชี่ยถึงกับต้องโทรไปหาแฟนเก่า ซึ่งแม่งเป็นเรื่องตลกๆมาก และเราก็รู้อยู่แก่ใจแต่ทำเป็นลืมๆไป

ความรู้สึกส่วนตัว

สำหรับผมการดูหนังเรื่องนี้เหมือนได้อ่านหนังสือปรัชญาเล่มนึง ใช่ครับ มันเหมือนอ่านหนังสือปรัชญาที่สอนในแนวทางที่คนไม่ค่อยชอบฟัง หรืออ่านพระธรรมของพระพุทธเจ้าจริงๆไม่ได้อ่านเรื่องปาฏิหารย์ต่างเรื่องเกิดมาเดิน 7 ก้าว มีพลังปาฏิหารย์หยุดช้าง เหาะเหินเดินอากาศ หนังสือพวกนี้จะบอกสิ่งที่คุณรู้อยู่แล้วแต่คุณไม่อยากยอมรับ เช่น กล้าที่จะถูกเกลียด พูดว่า “คนเราไม่เปลี่ยนแปลงตัวเองเพราะตัวเองเลือกที่จะเป็นแบบนั้น” นิชเช่พูดถึงเรื่อง “การดูแคลนกาย” “พระเจ้าตายไปแล้ว” พระพุทธเจ้าพูดเรื่อง “ขันธ์ 5” ซึ่งพออ่านแล้วมันจุกมันเหมือนถูกไม้ฟาดหน้า คุณจะประทับใจกับการอ่านมันเพราะมันกล้าที่จะบอกคุณตรงๆในเรื่องที่คุณไม่อยากยอมรับ แต่เพราะผมอ่านหนังสือพวกนี้มาหลายเล่ม พอมาเจอหนังเรื่องนี้มันเหมือนเรารู้อยู่แล้วมันเลยไม่ประทับใจ ไม่จุกเท่าที่ควร แล้วพอดูแล้วจังหวะการเล่าเรื่องและตอนจบมันคล้ายกับเรื่อง Up in the air ที่ตอนจบเขาทิ้งเราไว้กับพระเอกที่เสียจุดยืนในการใช้ชีวิตของตัวเองไปแล้ว มันเลยเหมือนเคยดูมาแล้วอีก (เคยมีคนบอกว่ายิ่งดูหนังมากเท่าไหร่ ยิ่งสนุกน้อยลงท่าทางจะจริง)

สรุป

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

หนังสือปรัชญาที่เล่าให้ฟัง

กล้าที่จะถูกเกลียด 1
กล้าที่จะถูกเกลียด 2
ซาราธุสตราตรัสไว้ดังนี้

Scale cube

Scale cube

หลังจากไม่ได้เขียน Blog ไปนานเพราะขี้เกียจกับอยากนอนอืดเสาร์อาทิตย์ พอมาถึงจุดที่เละเทะเกินเยียวยาเลยต้องหาอะไรทำแล้วไม่งั้นจะกู่ไม่กลับ เลยคิดว่ากลับมาเขียน Blog ดีกว่า เพราะยิ่งเขียนยิ่งต้องหาอะไรมาเขียนต่ออีกเรื่อยๆ จะได้อ่านหนังสือ ประจวบเหมาะกับบริษัทอยากจะโล๊ะ Project เก่าแล้วทำเป็น Micro service ซึ่งตอนนี้เราก็ยังไม่รู้ว่าควรจะทำดีไหม แต่เห็นแล้วมันน่าจับแยกมากเพราะมันเริ่ม complex มาก บ่นมากแล้วมาพูดถึงเนื้อหาตอนนี้กันดีกว่า วันนี้จะมีพูดเรื่อง Scale cube กันดีกว่า

scale cube ก็คือรูปที่เห็นด้านบนนั่นแหละครับ รูปนี้มาจากหนังสือ The Art of Scalability ซึ่งในรูปคือวิธีในการ scale ตัว Application ไปในทิศทางใด โดยเขาแบ่งออกเป็น 3 (ก็มันเป็นลูกบาศก์มันก็ต้อง 3 แกนอยู่ละ) ทิศทางคือ คือ x, y, z (Dragon Cannon)

แกน X

Scale โดยการ Duplicate ตัว Application แล้วให้ตัว Load balance กระจายงานเข้าไปให้แต่ละ Node

แกน Z

Scale โดยการ Duplicate ตัว Application เหมือนกับแกน X แต่ก่อนจะกระจายงานจะมีตัวตัดสินใจโดยตัดสินใจโดยใช้เงื่อนไขเกี่ยวกับ Data เช่น แบ่งตาม user ที่ส่ง Request เข้ามา เช่น a - h เข้าเครื่องที่ 1 ดังภาพตามหนังสือ ซึ่งแกน X กับ แกน Z ต่างกันคือ แกน Z สนใจเงื่อนไขเกี่ยวกับ Data เป็นเงื่อนไขในการกระจายงาน ต่างจากแกน X จะ กระจายตามแบบเท่าเทียม หรือ เช็คว่าตัวไหนมีชีวิตอยู่บ้าง

แกน Y

Scale โดยการแตก Application ของเราให้เป็นส่วนย่อยๆ โดยอาจจะแบ่ง Application เป็นหลายๆ Application ความรับผิดชอบ ดูได้จากภาพตัวอย่าง ที่ทำการแยก Application จากเดิมภาพที่ แกน X , แกน Z จะเป็น Application ใหญ่ๆ Application เดียว แต่อันนี้เราจะแยก Application ของเราเป็น Application ย่อยๆ 3 Service ดังภาพ คือ Order service, Customer service, Review service

ฉันยังคงสงสัย (รู้สึกอยู่ไม่หาย ก็คิดว่าเธอคงรักกัน)

จากการอ่านและคิดตามก็เห็นภาพตามคร่าวๆว่าการ scale แต่ละแกนมัน scale ยังไง ในตอนที่ทำงานวิธี scale ที่ง่ายที่สุดคือแกน X ครับ คือแค่ clone เครื่อง วางหลัง load balance ก็ใช้งานได้เลย ในส่วนของแกน Z นั้นแทบจะเหมือนแกน X เลย แต่ต่างกันตรงที่มีตั้งเงื่อนไขว่าจะ routing request ตามอะไร ซึ่ง อันนี้ผมยังไม่เคยได้ทำในงานจริงที่เคยลอง เพราะต้องมาเขียนตัวจัดการ Route ของ data ซึ่งเพิ่มงาน ส่วนแกนสุดท้ายคือแกน Y อันนี้คือแบบใหม่ที่เคยได้ยินเลยคือการแยก Application ออกเป็น Application ย่อยๆไปเลยซึ่งมันคือการจะทำ Microservice เนี่ยแหละ

ซึ่งเมื่ออ่านแล้วเราก็เข้าใจว่าการ scale เนี่ยมันไม่ต้องทำไปในทางใดทางหนึ่ง เราสามารถทำผสมกันได้ในทุกแกนเลยทำให้เขายกตัวอย่างเป็น cube เพราะเวลาเราบอกพิกัดใน cube นั้นเราต้องบอกพิกัด 3 แกน เช่นกัน application ของเราก็สามารถ scale ได้หลายทางเช่น แบ่งเป็น 3 service คือ scale ไปในแกน Y แล้ว service ที่ 1 Duplicate เป็น 3 ตัว แบบเท่ากันโดยไม่สนใจ data อันนี้คือ scale ไปในแกน X ส่วน service ที่ 2 scale เป็น 3 เครื่อง แล้ว routing ด้วย id ของข้อมูลโดยใช้การ mod ด้วย 3

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

ref :
https://microservices.io/articles/scalecube.html
https://manning-content.s3.amazonaws.com/download/2/031dbdc-2223-4304-bad9-bb2a83d88899/sample_ch01_Richardson_Microservices-Patterns_October10.pdf

แล้วเจอกันใหม่นะ

เบลๆ

เป็น Message ใน Facebook ที่เพื่อนในกลุ่มส่งมาให้ระหว่างที่นั่งฟังเรื่อง Consumer-Driven Contracts อยู่ พร้อมกับลิ้งค์เขียนเกี่ยวกับนิโกะ ตอนแรกก็นึกว่าเพื่อนส่งเกี่ยวกับเรื่องนิโกะว่าจะแสดงที่ไหนมา เพราะปกติเพื่อนผมคนนี้เป็นคนในวงการที่คอยบอกว่ามีงานอะไร หรืองานไหนที่น่าสนใจแล้วมีนิโกะไปบ้าง แต่พออ่านดีๆมันเป็น นิโกะประกาศจบการศึกษาจากวงเนื่องจากปัญหาด้านสุขภาพ ก็….. ในตอนนั้นเรื่อง Consumer-Driven Contracts ก็หายไปจากหัว

พองานจบก็รีบหยิบมือถือมาอ่านแบบจริงจังก็พบว่าน้องมีปัญหาเรื่องกระดูกสันหลังถ้ายังทำกิจกรรมเกี่ยวกับพวกเต้นอยู่จะเป็นอันตรายต่อสุขภาพได้เลยต้องประกาศจบการศึกษา (ศัพท์แบบคนนอกวงการอย่างผมเข้าใจคือ “ออกจากวง”) ถึงตอนนั้นก็รู้สึกเศร้านะแบบ ตอนเดือนตุลายังวางแผนไว้อยู่เลยว่าจะเคลียงานไปดูการแสดงน้อง มาตอนนี้กลายเป็นว่าจะไม่ได้เจอน้องแล้ว

มันเหมือนคนจะไม่ได้เจอกันอีก

อันนี้พูดตามตรงเลยว่ามันเเป็นความรู้สึกเศร้าแบบใหม่ที่พึ่งเคยพบเจอ เศร้าแบบเราจะไม่ได้เจอกันแล้วนะ ถ้าเป็นตอนเด็กที่จากกันกับเพื่อนสมัยประถมอย่างน้อยเรายังมีสมุดโทรศัพท์ไว้ให้โทรไปหา ไปคุย แต่กับน้องนี่คือคงแทบจะไม่มีโอกาสได้เจออีกแล้ว เพราะตามที่คิดได้คือน้องคงกลับญี่ปุ่นเพื่อไปทำตามความฝันเรื่องการเป็นนักพากย์และศิลปินเดี่ยว

เซกิ

งานสุดท้ายที่น้องจะแสดงในฐานะวงไอดอล Siam dream คืองาน Maruya เมื่อวันที่ 8 กันยา ที่ผ่านมา ซึ่งมันไม่ได้อยู่ในปฏิทินที่จัดไว้ เลยต้องหาวิธีทำยังไงก็ได้ให้ไปงานนี้ได้ ซึ่งก็โชคดีที่เคลียธุระต่างๆได้พอดีเลยได้มีโอกาสไปเซกิกับน้อง ก่อนได้เซกิกับน้องก็นึกถึงครั้งแรกที่ได้เซกิกับน้อง วันนั้นยังถามน้องอยู่เลยว่า พูดภาษาไทยได้ไหม น้องก็พยายามคุยด้วย แม้เราจะคุยกันไม่ค่อยรู้เรื่องก็ตามแต่ตอนนั้นรู้สึกดีมากๆ และทุกครั้งที่คุยกับน้องก็รู้สึกดีแบบนั้นทุกครั้ง พอมาคิดว่านี่อาจจะเป็นเซกิครั้งสุดท้ายก็เศร้าแปลกๆเหมือนกัน

นิโกะ : สวัสดีค่ะ

โปรแกรมเมอร์ : สวัสดี

นิโกะ : วันนี้ Last stage แล้วนะ

โปรแกรมเมอร์ : อื้อแล้วนิโกะจะกลับมาไทยอีกไหม

นิโกะ : นิโกะฟังภาษาไทยไม่ค่อยเข้าใจค่ะ ขอโทษด้วยนะคะ

โปรแกรมเมอร์ : ไม่เป็นไร ไม่เป็นไร

นิโกะ : ชื่ออะไรนะคะ

โปรแกรมเมอร์ : อ้อ พี่ชื่อเบล

นิโกะ : ขอโทษนะคะ นิโกะจำชื่อไม่ได้ แต่นิโกะจำหน้าได้นะ

โปรแกรมเมอร์ : ไม่เป็นไร ไว้พี่จะตามดูนิโกะผ่าน Youtube NicoNicoChannel นะ

นิโกะยิ้มพร้อมบอกประมาณว่าจะลงเพลงอะไรสักอย่างให้ฟัง

นิโกะ : แล้วเจอกันใหม่นะคะ

โปรแกรมเมอร์ : อื้อ แล้วเจอกันอีกนะ

บนเวที

หลังจากเซกิเสร็จก็ไปยืนรอดูการแสดง Last stage ของนิโกะในนามของ Siam Dream ซึ่งก็สนุกดี แถมได้ฟังนิโกะร้องเพลงเดี่ยวด้วย (จริงๆเคยฟังผ่าน Youtube แล้ว) ช่วงสุดท้ายมีการกล่าวอำลา ซึ่งนิโกะพูดประมาณว่า (ฟังจากแมรี่ที่แปลให้ฟัง) นิโกะเสียใจที่ต้องจบการศึกษา นิโกะไม่เคยเจอที่ของตัวเองเลย จนได้มาอยู่วง Siam dream นิโกะได้เจอที่ของตัวเอง แต่สุดท้ายก็ต้องมาจากไปแบบนี้ แต่นิโกะก็ดีใจที่ได้มาจบการเป็นไอดอลของตัวเองที่วง Siam dream ฟังมาถึงตรงนี้ก็รู้สึกเศร้าเลยนะเพราะเราเห็นว่าน้องพยายามมากจริงๆ สุดท้ายน้องก็ลงจากเวทีจบ State สุดท้ายของน้องอย่างสวยงาม

วันนี้นิโกะจะกลับญี่ปุ่นแล้วนะคะ

เป็นข้อความที่นิโกะโพสต์ใน Facebook แล้วก็เห็นว่าแฟนคลับจะไปส่งนิโกะที่สนามบินด้วยเราก็เลยติดสินใจไปส่งนิโกะด้วยซะเลย ตอนนั้นก็ตลกตัวเองเหมือนกันนะว่าเฮ้ย เรามาถึงจุดนี้เลยเหรอวะ จุดที่ไปส่งไอดอลที่สนามบิน แต่ถ้าความคิดตอนนั้นมันบอกว่าอยากไปแล้วเราจะปฏิเสธความคิดของตัวเองทำไม จะได้ไม่ต้องมานั่งเสียใจกับสิ่งที่อยากทำแต่ไม่ได้ทำทำไมก็เลยตัดสินใจไปส่งน้องที่สนามบิน

โปรแกรมเมอร์ : แล้วเจอกันนะ

นิโกะ : แล้วเจอกันนะ เจอกัน

จากนั้นน้องก็ค่อยๆเดินไกลออกไปไกลออกไปจนภาพสุดท้ายที่เห็นคือน้องที่เราชอบโบกมืออำลาเราอยู่ไกลๆ

ความทรงจำ

ช่วงระยะเวลา 8 - 9 เดือนที่ผ่านตั้งแต่ได้รู้จักน้อง ชีวิตได้พบเจออะไรใหม่ๆ สถานการณ์ใหม่ๆที่ไม่เคยคิดว่าจะได้เจอ ไม่ว่าจะไปดูงานคอนเสิร์ต เซกิ ได้สัมผัสความรู้สึกใหม่ที่ไม่ใช่ความรู้สึกของการจีบสาว แต่เป็นความรู้สึกทีไ่ด้เห็นสิ่งสวยงาม สดใส เปล่งประกาย จากผู้หญิงคนหนึ่ง หลังจากนี้ก็ไม่รู้ว่าจะได้เจอน้องอีกไหม แต่ความทรงจำดีๆที่ได้จากน้องจะยังอยู่ในความทรงจำมีสีของโปรแกรมเมอร์แน่นอน

เพลงประกอบการเขียน Blog

เพลงที่นิโกะพูดถึงตอนเซกิคือเพลงที่น้อง cover แล้วเอามาลง Youtube เนื้อเพลงน่าจะเกี่ยวกับไอดอล ตอนสุดท้ายน้องมีพูดอะไรสักอย่างแต่ฟังไม่ออก แต่คงจะบอกว่าขอบคุณมากๆที่ติดตามกันมา

SonarQube Part 3

Connect CI กับ Sonarqube ด้วย WEB API

ผมเขียนเกี่ยวกับ Sonarqube ไว้หลายตอน คุณสามารถกด Link ด้านล่างเพื่ออ่านที่เกี่ยวกับ Sonarqube ตอนต่างๆได้เลย

หลังจากหายไปนานกับ Sonarqube (หายไปปีกว่า) และการเขียน Blog (หายไปเป็นเดือน) รอบนี้เลยกลับมาอัพเดท Blog กันหน่อย เลยหยิบเอาเรื่อง Sonarqube ที่พึ่งทำไปได้หยกๆมาเขียนเลยละกัน คือเรื่องมันเริ่มที่บริษัทเริ่มจะมาทำ CI กันแบบจริงจัง ผมเลยได้มีโอกาสทำการ Set up ส่วนที่เป็น CI ขึ้นมา หลายคนอาจงงว่า Set up ทำไม เขามีบริการอยู่มากมายอยู่แล้ว อันนี้มันเป็นเรื่องของ Policy ล้วนๆเลยครับ การตอบคำถามหน่วยงาน Audit(ซึ่งมันรู้จริงรึเปล่าผมก็ไม่รู้ จะเอามาตรฐานความปลอดภัยของ Service ที่ทำ CI / CD แบบออนไลน์มาเปิดให้ดูม ันจะอ่านแล้วทำความเข้าใจไหม อันนี้ผมก็ไม่รู้ ไปๆมาๆไม่ให้ผ่านที่ทำมาชิบหายหมดอีก) วิธีง่ายๆที่สุดที่จะตอบแม่งคือ ทำเอง On premise นี่แหละ จะเห็นก็เห็นจากคนในด้วยกันเองเนี่ยแหละ ไม่ต้องกลัวคนนอกจะเปิด Backdoor เข้าไปเอา Source code ซึ่งจากการ Install เองหลายๆเรื่องอาจจะเอาเรื่องนั้น เรื่องโน้น เรื่องนี้มาเขียนต่อให้ฟัง

ตามหาวิธีเชื่อมต่อกับ Sonarqube

หลังจากตอนก่อนๆสอนการ Install sonarqube และ สอนการ Scancode ไปแล้ว ซึ่งผมคิดว่ามันน่าจะจบเรื่อง sonarqube ไปละ เพราะเห็นคุณภาพ Code ของตัวเองละ เจออะไรก็เข้าไปแก้ตามที่ Sonarqube บอก แต่พอมาทำ CI ซึ่งทุกอย่างต้องเป็น Auto หมด ตั้งแต่ build, test, add to artifact ซึ่งส่วนหนึ่งที่ทางทีมอยากให้มีคือการตรวจสอบคุณภาพของ Code ว่าผ่านข้อตกลงไหม ถ้าผ่านถึงจะให้ไปสู่กระบวนการต่อไป คราวนี้ก็งานเข้าเลยสิ สมัยก่อนสั่งแต่ Manual อันนี้จะให้เอาเข้า Pipe line แล้วเป็น Auto ด้วย ไอตอน scan อะรู้ว่าทำไง แต่เอาผลกลับมาเนี่ยสิ แต่โชคดีที่ Sonarqube เขาเล็งเห็นจุดนี้ไว้แล้วเลยสร้างตัว Web API ให้เราเข้าไปใช้งาน โดยรายละเอียด API สามารถดูได้ที่

https://codeen-app.euclid-ec.org/sonar/web_api/api/authentication

โดย API ที่ผมใช้คือ

1
api/qualitygates/project_status

โดยเราสามารถยิงไปเอาว่า Project ของเรานั้นผ่าน QualityGate(คือคุณภาพของ Code ที่เรากำหนดกันว่าเท่าไหร่ถึงจะผ่าน) โดยจะตอบกลับมาเป็น Json ประมาณนี้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"projectStatus": {
"status": "ERROR",
"conditions": [
{
"status": "ERROR",
"metricKey": "new_coverage",
"comparator": "LT",
"periodIndex": 1,
"errorThreshold": "85",
"actualValue": "82.50562381034781"
}
]
}
}

ส่วนการ Authentication เข้าใช้งาน sonarqube นั้นเขาออกแบบให้ใช้ Token หรือไม่ก็สามารถใช้ Username , password ได้เลยตามแต่จะถูกใจ โดยวิธีการใช้งานดูได้ตามลิ้งค์ด้านล่างเลย

https://docs.sonarqube.org/latest/extend/web-api/

ประกอบร่าง

เมื่อชิ้นส่วนทั้งหมดครบเราก็สามารถทำการเชื่อมกับ Sonarqube เพื่อทำการ Scan code และเอาผลลัพธ์การ Scan จาก Sonarqube server ว่าประมวลผลต่อว่าจะให้ pipe line ของเราทำงานต่อหรือไม่ โดย Code นั้นสั้นๆง่ายๆเพียงเท่านี้

  • mvn sonar:sonar -Dsonar.projectKey=$PROJECT_KEY -Dsonar.host.url=https://your_sonarqube_endpoint.com -Dsonar.login=$TOKEN -Dsonar.sourceEncoding=UTF-8 -Dsonar.java.binaries=.

บรรทัดนี้เป็นการทำการสั่งให้ scan code และส่งผลลัพธ์ไป sonar server โดยใช้ MAVEN plugin โดย $PROJECT_KEY และ $TOKEN อันนี้เป็นค่าที่เราได้ตอนสร้าง Project โดยสามารถกลับไปอ่านตอนที่ 2 หรือลองสร้าง Project ใน Sonarqube server ดูก็ได้ครับ

  • sleep 10s

อันนี้ไม่มีอะไรมากครับ แค่ทำการรอเป็นเวลา 10 วินาที ซึ่งผมทำ Delay ไว้ให้ Sonarqube ได้รับข้อมูลแล้วเอาไป Check กับ QualityGate ที่ตั้งไว้แล้วสรุปว่า ผ่านหรือไม่ผ่าน ใครจะลดหรือเพิ่มเวลาก็ได้นะครับ อันนี้แล้วแต่เลย

ส่วนนี้คือการใช้คำสั่ง curl (บางคนเรียก เคิล บางคนเรียก ซี-ยู-อา-แอล) ยิงไปดึงข้อมูลจาก Web ที่ต้องการ โดยในที่นี้ผมยิงไปเอาที่ไปที่ api/qualitygates ของ sonarqube เพื่อเอาผลลัพธ์กลับมา โดยเมื่อได้ผลลัพธ์ผมจะเขียนลงไฟล์ชื่อ sonarqube_result.txt

  • grep “{"projectStatus":{"status":"OK"“ sonarqube_result.txt

ส่วนอันนี้เป็นวิธี Hack กระโหลกๆที่ผมคิดได้คือใช้ grep ทำการ grep หาคำว่า {“projectStatus”:{“status”:”OK” ในไฟล์ sonarqube_result.txt โดยกรณีที่ Sonarqube ตรวจสอบว่า Project นี้ผ่าน QualityGate จะ Return เป็นคำที่ผม grep มาเสมอ และด้วยการที่ grep นั้นถ้า grep แล้วเจอคำจะ return exit code เป็น 0 ถ้าหาไม่เจอจะ return exit code เป็นอย่างอะไรที่ไม่ใช่ 0 เนื่องด้วยความสามารถนี้ทำให้ เมื่อเอา code ชุดนี้ไปใส่ใน pipe line ของพวก CI Tool ถ้า quality ของ code ผ่าน quality gate ของ sonarqube มันจะทำงานในส่วนของคำสั่งถัดไป แต่ถ้าไม่ผ่านตรง grep มันจะ return exit code ที่ไม่ใช่ 0 ออกมาซึ่งตัว CI Tool จะมองว่ามันทำไม่สำเร็จจะทำการหยุด pipe line

จบแล้ว

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

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

Video ประกอบการเขียน Blog

โอเฟ่น จอมดาบเวทย์มนต์ การ์ตูนอีกหนึ่งเรื่องในดวงใจของผม เป็นการ์ตูนที่สร้างภาพจำเกี่ยวกับจอมเวทย์ของผมให้แตกต่างจากพ่อมดแม่มดคนอื่นๆ ในขณะที่คนอื่นพูดถึงพ่อมดแม่มดจะนึกถึงพวกแฮรี่พอร์ตเตอร์ใช้คฑาร่ายเวทย์มนต์ แต่ของผมนึกถึงโอเฟ่นวิ่งหาศัตรูพร้อมร่ายเวทย์อัดกันแบบประจันหน้า

ล่าสุด Orphen ประกาศครบรอบ 25 ปี ไม่รู้ว่าเขาทำ Remake หรือภาคต่อรึเปล่าซึ่งถ้าทำก็ขอให้ได้อารมณ์แบบการ์ตูนยุคนั้นนะ

ประสบการณ์ตอนทำงาน ตอน การให้และขอ Requirement Path 2

ความคาดหวัง

อีกหนึ่งเรื่องที่ Dev อยากให้คนที่รับ Requirement หรือคนที่จะให้ Requirement คุยกันก่อนคือเรื่องความคาดหวัง ความคาดหวังมันคืออะไรผมก็ให้นิยามมันแบบตรงๆไม่ได้แต่พออธิบายเป็นภาษาบ้านๆได้ก็คือ ตกลงกันว่ามันจะทำงานได้ในระดับไหน ดีแค่ไหน ตัวอย่างความคาดหวังง่ายๆที่เห็นบ่อยๆคือ ถ้าคุณซื้อของแพงกว่าราคาตลาดทั่วไป เช่น ซื้อ IPhone คุณก็จะเริ่มมีความคาดหวังว่ามันจะต้องดีกว่าของที่ราคาตลาดอย่าง SAMSUNG, Nokia , อาม่า อันนี้ไม่ได้บอกของใครดีกว่าใครแต่มันเป็นค่านิยมที่ถูกตลาดปลูกฝังว่ายี่ห้อนี้ดีกว่าอีกยี่ห้อนึงซึ่งในความเป็นจริงอาจไม่ใช่เลย (ลองหาอ่านเรื่องการเปรียบเทียบถ่านไฟฉาย ไปๆมาๆไฟฉายยี่ห้อที่เราคิดว่ากากกลับมีประสิทธิภาพดีกว่าถ่านไฟฉายมียี่ห้อ https://pantip.com/topic/31504294 )

เมื่อคุณมีความคาดหวังที่สูงเมื่อทำไม่ได้ตามที่หวังมันก็จะยิ่งโดนด่าแรงตาม ก็ซื้อของแพงแต่มันห่วยใครจะไม่โกรธ แต่ถ้าลองเปลี่ยนสถานการณ์เป็น IPhone มาคุยกับคุณว่าคุณภาพประมาณนี้นะ อาจจะมีปัญหาแบบนี้นะ ถ้ามีปัญหาติดต่อทางนี้นะ จะรับประกันภายในเท่านี้นะ ถ้าเขาให้ค่าความหวังกับคุณแบบนี้คุณก็จะคาดหวังอีกแบบ คุณจะไม่คิดว่ามัน Perfect คุณจะคิดว่าโอเคมันอาจมีปัญหา ถ้ามีเราติดต่อกับเขาได้ทางช่องทางนี้

หรือเคสพวกทำประกัน พวกคนขายประกันทำเรื่องที่ผมเกลียดที่สุดคือตอนขายให้ความคาดหวังไว้สวยหรู แต่พอเกิดปัญหาขึ้นจริงมันไม่เป้นแบบนั้น มันแย่ มันไม่เป็นอย่างที่คุย ถ้าพูดกันตามตรงนะถ้าคุณมาขายแบบจริงใจคุณจะไม่บอกข้อดียืดยาวแต่คุณจะบอกข้อ Exception ต่างๆเช่น จะไม่รับประกันในกรณีไหนแบบสรุปให้คนซื้อทราบ ถ้าคนขายขายแบบนี้ความคาดหวังของคนซื้อจะเป็นอีกแบบ เขาจะซื้อเพราะมันตรงตามความต้องการ และใช้งานได้ เขาจะไม่โวยวายด้วยซ้ำเมื่อเกิดเคส Exception เพราะเขารู้แล้วว่าเคสนี้ไม่ครอบคลุม ผมว่าการขายแบบนี้มันแฟร์มากสำหรับทั้งคนซื้อและคนขาย แต่อย่างว่าโลกธุรกิจก็คือธุรกิจมีแต่จะขายกับขายให้ได้ ขายได้แล้วเป็นไงต่อก็เรื่องของแม่ง (ถ้าอยากให้โลกสวยเราควรทำให้โลกสวยไม่ใช่บอกว่ามันไม่สวย)

หรืออีกเคสสำหรับใครดู EndGame แล้วคาดหวังกับ Captain Marvel ผมบอกเลยว่าเฮ้อออออ จริงๆมันเกิดจากที่เราคาดหวังมันมากไปว่าจะต้องแบบนั้นแบบนี้พอออกมาน้อยกว่าคาดก็จะอารมณ์นี้

สำหรับเรื่องการพัฒนาโปรแกรมก็เช่นกัน คุณต้องตั้งค่าความคาดหวังกันก่อน ระบบนี้จะ Realtime แค่ไหน ถ้าทำไม่ได้มีช่องทางอื่นเสนอให้เป็นแบบนี้ มันอาจเกิดปัญหานะแต่ทางเราจะรีบแก้ให้ คุณต้องค่าความคาดหวังกับลูกค้าหรือถ้าคุณเป็นคนจ้างคุณก็ต้องบอกค่าความหวังของคุณกับคนที่คุณจ้าง เพราะเขาจะได้บอกว่า “ได้หรือไม่ได้” ถ้าไม่ได้เขามีข้อเสนอหรือวิธีอื่นแล้วตกลงความคาดหวังกันว่าจะเป็นประมาณนี้ เมื่อความคาดหวังเราตรงกันก็มีโอกาสน้อยที่มันจะมาแบบ “ไอ้หน้าหมาทำไมไม่เป็นอย่างที่ตกลงวะ”

ส่วนสิ่งที่ทีม Dev คาดหวังเวลาคนไปรับ Requirment ไปคุยกับลูกค้า ทาง Dev ก็อยากจะให้คุณตั้งค่าความคาดหวังกับลูกค้าประมาณว่า

  • อาจจะได้ภายในวันนี้นะครับแต่อาจจะมีปรับเปลี่ยนนบางเรื่องที่ทางเราเห็นว่าอาจจะกระทบต่อระบบ ซึ่งถ้ามีอาจจะเลื่อนนะครับ
  • ถ้าจะเอาให้ทันภายในวันนั้น อาจจะต้องลด Scope เหลือเท่านี้
  • ถ้าเอาแบบนี้ไม่น่าจะได้ครับ แต่ถ้าเป็นแบบนี้ได้ไหมครับ ให้ผลลัพธ์เหมือนกัน

Requirment ของ Report

สำหรับงานที่ผมเจอบ่อยๆและหงุดหงิดบ่อยๆคือ Report คือ Requirment ที่เคยได้มาคือ ทำ Report นี้ให้ที คำถามของทาง Dev ก็คือ Report เ-ี้ย อะไร บอกให้ทำแต่ไม่รู้ว่า Report ที่ออกมาหน้าตาเป็นยังไง Format ที่ออกเป็นแบบไหน แล้วจะออกด้วยเงื่อนไขอะไร โอเคเราจะมาลองสรุปคร่าวๆว่า Dev อยากได้อะไรเวลาจะทำ Report จริงๆผมอยากจะบอกว่าพวกเราทีม Dev ควรจะพึงระลึกเสมอว่าเมื่อโดนสั่งทำ Report ควรถามห่าอะไรพวกนี้เสมอ

หน้าตา

หน้าตาของ Report ที่อยากให้ออกมาเป็นแบบไหน Excel , csv , PDF แล้วจะดีหน่อยคือไปเอาตัวอย่างที่เขาเคยมีในระบบเก่าหรือมีอยู่แล้วมาเป็นตัวอย่างประกอบด้วย ทางทีม Dev ดูแล้วจะได้รู้ว่ามันทำได้ ทำไม่ได้ คุ้มค่าไหมที่จะทำ

Field

Field ที่จะเอาไปใส่ใน Report คืออะไร ไปเอามาจากไหน ถ้าคนที่ทำงานเป็นหรือทำงานมานานก็จะ capture ว่าเอามาจากฟิลล์นี้ในหน้าจอ หรือระบุรายละเอียดต่างๆนาๆให้

ชื่อไฟล์

อันนี้ก็เป็นประเด็นเหมือนกัน คือตอนมาสั่งบอกเอาแต่ Report แต่ไม่บอกว่าออกมาจะมีชื่อไฟล์อะไร อันนี้ก็เป็นปัญหาเหมือนกัน เคยมีงานนึงผมให้ออกเป็น Format : ReportName_20191231_110231.xlsx แต่พอขึ้น PROD ไปแล้วกลับไม่พอใจ อ้าวไอสาดไม่บอกมานี่

เงื่อนไขการออก Report

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

Report มันต้อง Realtime แค่ไหน

นี่เป็นอีกคำถาม Classic เกี่ยวกับ Report ที่คนที่ไปคุยกับลูกค้า หรือ ลูกค้าที่ให้ความต้องการรู้ คือ Report ของคุณอะ Realtime แค่ไหน Realtime คือกดตอนนี้ต้องได้ตอนนี้เลย ข้อมูลต้องเป็น ณ ป้จจุบัน หรือจริงๆคุณอยากได้ Report สรุปผลรายเดือน ทั้ง 2 อย่างต่างกันมากเลยนะ ถ้าคุณอยากได้ Realtime มันต้องใช้เทคนิคและทรัพยากรมหาศาลในการทำ (ซึ่งยากมากแต่คนไปรับบอกสบายมาก แล้วไปตั้งค่าความคาดหวังกับลูกค้าไปแล้ว) แต่ถ้าเป็น Report สรุปรายเดือนมันจะเป็นคนละแบบ ระบบสามารถค่อยๆทำผลสรุปเรื่อยๆรายวันแล้วมารวมเป็น Report ตอนปลายเดือน ข้อมูลที่ได้จะเป็นแบบ T + 1, T +2 คือถ้าจะเอาข้อมูลวันนี้มันจะได้วันพรุ่งนี้ หรือ มะรินนี้ อันนี้สามารถทำได้โดยไม่ต้องมีเทคนิคอะไรมาก ไม่ต้องใช้ทรัพยากรเยอะเท่าแบบ Realtime แบบแรก

กดแล้วได้เลย หรือ กดแล้วค่อยมาดูทีหลังได้

อันนี้เป็นอีก Requirement และความคาดหวังที่ควรตกลงให้ กดแล้วได้เลยคือ กดแล้วลูกค้าต้องนั่งแช่รอสัก x วินาทีแล้วได้ Report กลับมา การทำแบบนี้บอกเลยว่ากินทรัพยากรมาก เพราะคุณต้องทำการสร้าง Report ให้ทัน x วินาทีที่กำหนด ส่วน กดแล้วค่อยมาเอาจะประมาณว่า กดสั่งสร้างแล้วระบบรู้ว่าอยากให้สร้าง Report เดี๋ยวระบบเอาไปทำให้นะ รอไปเดี๋ยวได้ Report แน่ แบบนี้จะดีกว่าแบบแรกเพราะคุณสามารถเอางานไปรอไว้ก่อนรอ Server ทำงานไม่หนัก หรือ ช่วงเวลาที่มีไว้สำหรับการออก Report หรือ ส่งไปให้ระบบทีทำการออก Report โดยเฉพาะ ทำการออก Report ซึ่งอาจจะนานกว่าเวลาที่ผู้ใช้มากดแล้วต้องนั่งรอ ลองคิดว่านั่งรอ 5 นาทีกว่า Report จะออกมา กับ การตั้งค่าความคาดหวังว่า ระบบรับเรื่องการออก Report แล้วกำลังนำไปออก Report คุณว่ามันดีกว่าการที่เขามานั่งรอหน้าจอทำงานอื่นไม่ได้ 20 นาทีไหม

ข้อพึงระวังกับ Report

พวกนี้เป็นเรื่องที่พึงระวังกับ Report เป็นเรื่องที่คนสั่งคนทำหรือทุกคนที่เกี่ยวข้องควรจะทราบเกี่ยวกับ Report

Report ที่กดข้อมูลอาจไม่เท่ากันถ้ากดคนละเวลา

อันนี้เป็นอีกเรื่องที่ชอบมาโวยวายกันคือกด Report ตอนนี้ได้ผลแบบนึง กด Report อีกเวลาได้ผลอีกแบบ คุณควรเข้าใจนิดนึงว่าข้อมูลที่เอามาจาก Database ถ้าคุณอยากได้ Realtime แล้วมันมีการเปลี่ยนสถานะของข้อมูลจาก A ไป B ซึ่งถ้าเงื่อนไขในการออก Repot มันมีสถานะพวกนี้อยู่ในเงื่อนไข ผลลัพธ์ที่ออกมาก็ย่อมเปลี่ยน

ระบบมันไม่ได้มีไว้ออก Report

ระบบ Application ส่วนใหญ่เขาออกแบบมาเพื่อรับงานที่เป็นงานหลักของ Application เช่น เว็บนำเข้าส่งออกเขาก็มีระบบไว้รองรับการแจ้งนำเข้าส่งออก หรือ Shopee เขาก็ออกแบบระบบมารองรับการสั่งซื้อสินค้า หรือ Agoda เขาก็ออกแบบระบบมาให้คนจองโรงแรม เปรียบเทียบราคาโรงแรม เขาไม่ได้ทำระบบมาเพื่อออก Report ดังนั้นบริษัทใหญ่ๆพวกนี้เขาก็จะมีกระบวนการนำข้อมูลไปออก Report ที่ระบบอื่น หรือถ้าอินเทรนหน่อยเขาจะเอาข้อมูลไปเทรน AI แต่คงไม่มีระบบไหนเขาเทรน AI บนระบบหลักครับ ดังนั้นพึงระลึกเสมอว่าระบบมันไม่ได้มีไว้ออก Report ถ้าเป็นระบบเล็กๆ Report กระจอกงอกง่อยนิดๆหน่อยๆมันออกได้ครับ แต่ถ้ามันเริ่มเป็น Report ที่ complex มากๆแบบ ผลรวมของสาขานี้นั่นโน่นนี่รายเดือนรายปี หรือ สรุปการทำงานของแต่ละคนในช่วงเวลาต่างๆโดยเงื่อนไขหลากหลาย หรือ เมื่อใดที่ Dev บอกว่าเห้ยมันเกินระบบรับไหว ก็พึงระลึกเถอะครับว่าเขาพูดจริง คือเวลามีปัญหาใครจะเป็นคนปวดหัวมากกว่ากันระหว่างคนที่ไปบอกลูกค้าว่าระบบมีปัญหา กับคนที่ต้องมาแก้ปัญหาหน้างานโดยมีเวลาจำกัด แบกรับความเครียด และงานต้องออกมาถูกต้อง ไม่มีใครอยากอยู่ในสถานะนั้นดังนั้นเมื่อเขาพูดแปลว่ามันจะเกิดปัญหาแล้ว

เพลงประกอบการเขียน Blog

จงให้ความสำคัญกับทุกการพบเจอเพราะมันอาจเป็นครั้งสุดท้ายแล้วที่เราจะได้พบกัน

ประสบการณ์ตอนทำงาน ตอน การให้และขอ Requirement Path 1

ทำไมต้องให้และขอ

สำหรับบทความนี้จะเขียนในมุมมองของ Dev ถึง Requirement ว่ามันควรบอกอะไรเราบ้างและบทความนี้ก็อยากจะให้ความรู้เกี่ยวกับผู้ที่จะจ้างงาน Dev หรือบริษัทเกี่ยวกับ IT ว่าเวลาที่จะให้ Requirement เนี่ยควรจะให้ไปแบบไหนเพื่อให้มันชัดและเข้าใจจะได้ไม่ต้องเสียเวลาบอกไปแล้วกลับมาบอกใหม่ หรือทำไปแล้วมาดูแล้วไม่ใช่ต้องแก้กันไปแก้กันมาจนหัวเสียทั้งสองฝ่าย บางกรณีฟ้องร้องกันยิ่งใหญ่

โปรดใช้วิจารณญาณในการอ่าน

ออกตัวก่อนเลยว่าผมเป็นแค่โปรแกรมเมอร์ธรรมดาทำงานในบริษัทธรรมดาเล็กๆไม่ใหญ่มากเหมือนพวก REUTERS, IBM, Agoda, Microsoft, ThoughtWorks หรือบริษัทข้ามชาติใหญ่ๆมากมายในโลก ดังนั้นสิ่งที่ผมเขียนเป็นประสบการณ์กระโหลกกะลาในการทำงานในช่วง 4 ปีที่ผ่านมาว่าเจอ Requirement แบบไหนมาบ้างดีกว่า

งาน Service หรือ งาน Project

อย่างแรกเราต้องแยกกันก่อนว่างาน Service กับ งาน Project นั้นแตกต่างกัน ต้องเข้าใจมันก่อน เพราะมันมีผลกับการจัดการ Requirement ไม่ว่าจะเอามาทำไหม หรือวิธีการได้มาซึ่ง Requirement

งาน Service

คืองานที่สร้างขึ้นมาเพื่อให้คนอื่นเข้ามาใช้ ลูกค้าอาจจะใช้หรือไม่ใช้ก็ได้ งานพวกนี้ทำขึ้นมาเพื่อให้คนจำนวนมากใช้ ส่วนใหญ่ Requirement จะมาจากบริษัทที่สร้าง Service หรือว่าง่ายๆคิดเองแหละว่าอะไรดี หรือไม่ดี ทำออกไปแล้วดู Feedback ของลูกค้าแล้วมาเป็น Requirement ใหม่เพื่อมาปรับแก้ไขตามความสมควรของเจ้าของ Service ว่าง่ายๆว่าเจ้าของ Service มีสิทธิ์ตัดสินใจว่าจะเอาแบบไหน ลูกค้าทำได้มากสุดคือส่ง Feedback มาบอก ถ้าคุณเป็นลูกค้ารายใหญ่ก็อาจจะมีปากมีเสียงเยอะหน่อย แต่ก็อย่าหวังว่ามันจะไปตามที่คุณต้องการ 100 เปอร์เซ็นต์เพราะ Service ต้องออกแบบรองรับคนที่มาใช้ที่มากมายหลากหลายดังนั้นมันต้องรักษาความกลางๆยืดหยุ่นไว้ ไม่สามารถ Customize ให้คนใดคนหนึ่งได้ เจ้าของ Service จะต้องคิดคำนวณว่าควรทำอะไร เปลี่ยนอะไร เพื่อให้ Service ของตัวเองมีคนใช้เยอะที่สุด ตัวอย่าง Service ที่มีให้เห็นในปัจจุบัน Google drive, Gmail, Youtube, Facebook, IG

งาน Project

คืองานที่มีคนจ้างให้ทำเขามี Requirement บ้างแล้วว่าอยากได้อะไรทำอะไรได้บ้าง แต่เป็น Requriment แบบลมๆกล่าวคือมันไม่เฉพาะเจาะจงอะไรเลย เช่น มีระบบ Tracking พอฟังแบบคนทั่วไปก็จะแบบลมๆตรงไหน แต่ถ้าเป็นคนที่เขียนโปรแกรมนี่จะบอกว่า Tracking นี่ยังไง Tracking ผ่านหน้าเว็บ ผ่านมือถือ หรือ โทรมาถาม หรือ ส่งจดหมาย ข้อมูลต้อง Realtime ระดับไหน จะ Tracking ด้วยอะไร เลข Tracking หรือชื่อคนทำงาน หรืออะไร งาน Project พวกนี้จะเป็นการต้องคุยเพื่อทำให้ Requriement ลมๆพวกนี้ดูชัดเจนขึ้น ดูเป็นของจริงมากขึ้น เอาไปสร้างจริงได้ งานพวกนี้จะ customize ขนาดไหนก็แล้วแต่กำลังทรัพย์และกำลังคนของฝั่งจ้างและฝั่งถูกจ้าง แต่ขอให้คิดเสมอว่า Requirement หรือ Change ต่างๆมี Cost เสมอ ไม่ว่าจะเป็นเงินหรือเวลา ตัวอย่างเช่น Project ภาครัฐต่างๆที่มี TOR มาเล่มใหญ่ๆแต่ไม่บอกอะไรที่เจาะจงเป็นภาพ (UI คร่าวๆยังไม่มีเลย) ตัวอย่าง งานสร้างระบบ TCAS ของภาครัฐที่เป็นประเด็นมาล่าสุด

แตกต่างแล้วยังไง

ถ้าเรากำลังทำ Service ขอให้คิดเสมอว่า Requriement ต่างๆมีผลกระทบกับคนที่มาใช้เกือบทุกคน ดังนั้นการจะทำอะไรต้องคิดให้ถี่ถ้วน การทำอย่างนึงอาจเพิ่มยอดขายให้คนกลุ่มหนึ่ง แต่มันอาจทำลายผู้ใช้งานกลุ่มอื่นๆ

ถ้าเรากำลังทำ Project เราควรเข้าไป Clear Requriement ต่างๆที่ลมๆให้เป็นของที่จับต้องได้ พยายามให้ Clear ที่สุดเพราะการที่ Requriement ไม่ชัดเจนส่งผลในการพัฒนาและต้องแก้ไปแก้มาดังที่กล่าวไปข้างบน

Requirement ที่ดีคืออะไร

Requirement ที่ดีมันพูดยากนะว่าคืออะไรมันเหมือนเรื่องความดีคืออะไรแต่ละที่มันไม่เหมือนกัน แต่ละที่ แต่ละโซนเวลา แต่ละจักรวาลไม่เหมือนกัน เอาเป็นว่า Requirement ที่ Dev อยากได้มีอะไรบ้าง โดยส่วนใหญ่จะยกเป็นตัวอย่างที่เคยเจอ

วาด Flow status

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

คือจริงๆหลักการมันไม่มากมายอะไรให้ลองวาด status ของงานหนึ่งงานที่เราทำ อย่างตัวอย่างของผมมันคืองานรับส่งเอกสารจากระบบหนึ่งเข้ามาตรวจสอบและกรอกข้อมูลเพิ่มเติมก่อนส่งไปให้ระบบอื่นครับบ งานหนึ่งงานของผมก็เริ่มจากมันมีสถานะ New คือมันเข้ามาในระบบ จากนั้นจะมีคนมารับงานไปทำแล้วเปลี่ยนสถานะเป็น Received และเปลี่ยนสถานะไปต่างๆนาๆตามเหตุการณ์และการกระทำของผู้เกี่ยวข้องในระบบ ที่อยากให้วาดมันขึ้นมาเพราะ ทั้งฝั่งคนให้ Requriement และคนรับงานจะได้เริ่มเห็นว่าระบบที่เรากำลังจะทำเนี่ยมันกำลังทำอะไร การเปลี่ยนสถานะต่างๆมันเกิดขึ้นจากอะไรได้บ้าง ถ้าตามหลักเคยเรียนใน Software engineering เขาจะให้วาด Usecase diagram

แต่ส่วนใหญ่งานที่ผมเคยเจอ use case เกือบ 80 เปอร์เซ็นต์มันไปอยู่กับการกระทำการตัวงานที่ทำให้มันเปลี่ยนสถานะไปมาแล้ว (เนื่องจากเป็นงานในระบบเล็กๆที่อยากแปลงกระดาษให้เป็น Digital)

จากการวาด Flow status ไปแล้วนั้นจะทำให้เราเห็นการกระทำต่างๆที่กระทำต่องานหนึ่งงาน Status ของงานว่ามี Status อะไรบ้าง จุดไหนเป็นจุดสิ้นสุด วาดไปวาดมาบางทีไปเจอ Status หลุมดำซึ่งก็คือ Status ที่เข้าไปแล้วออกมาไม่ได้ทั้งที่งานนั้นยังไม่เสร็จสิ้นกระบวนการ หรือบางทีเราจะเห็นกระบวนการที่ในทางกระดาษจำเป็น แต่ทาง Digital ไม่จำเป็น หรือ บางทีเราอาจได้ขั้นตอนการทำงานแบบใหม่ที่ตอบโจทย์มากกว่าที่เป็นก็ได้ อีกทั้งสิ่งนี้มันยังทำให้เกิดคำถามระหว่างคนขอและคนให้ เช่น บาง Status มันไปแล้วกลับไม่ได้เลยแบบนี้มันคือความจริงเหรอ แล้วถ้ามันต้องกลับจะต้องทำยังไง เชื่อเถอะครับ มันมี Exception พวกนี้อยู่เสมอ ดังนั้นเราควรถามแต่เนิ่นๆว่าถ้ามันเกิดขึ้นจะต้องทำยังไง หรือ ขั้นตอนนี้มันจะมีคนมาดูจริงๆเหรอ เช่น ระบบหนึ่งเป็นระบบนำเข้าส่งออกข้อมูลเป็นล้านชิ้นแต่ต้องมี step approve ซึ่งก็คือต้องใช้คนระดับผู้ตัดสินใจได้มาตัดสินใจงานนับล้านชิ้นผมว่ามันโคตรไม่ Make sence เลยว่าไหม มาทำระบบ IT เพื่อลดงานแต่ใช้คน Approve เอกสารเป็นล้านอันตลกไหมล่ะ

นี่คือหนึ่งใน Requirment ที่ Dev อยากได้เพราะมันทำให้ Dev เห็นว่าระบบงานมี Status อะไรในระบบบ้าง ใครเข้ามายุ่งกับระบบบ้าง ซึ่งเวลา Dev มีคำถามเขาก็สามารถถามตรงจุดที่ Status ต่างๆหรือการกระทำใดๆเป็นจุดๆได้เลย เขาไม่ต้องมานั่งมโนว่ามันจะมีใครมายุ่งบ้าง Flow มันเป็นยังไง เพราะคุณเอาสิ่งที่เขาต้องมโนกลับมาจากปากลูกค้าแล้ว (ผมขอให้คนที่เอา Requirement ลองถามและ Confirm กับลูกค้าจริงๆ ไม่ได้เอาเองมโนนะครับ) แค่นี้ก็ช่วยลดเวลาในการศึกษา Business ของลูกค้าไปได้เยอะเลยทีเดียว

ตัดจบก่อนละกัน

สำหรับตอนนี้เหมือนจะพูดยาวเกินไปแล้วเดี๋ยวจะพาเบื่อกันซะเปล่าๆ สำหรับตอนหน้าอาจเป็นเรื่อง Report หน้า Search หรืออื่นๆ ตามแต่ที่อยากเขียน

วิดีโอประกอบการเขียน Blog

ดูแล้วอิจฉาน้อง NICO ที่ไปเที่ยวกรุงโซลจริงๆ

OTA FEST

ซื้อบัตร

สำหรับงาน OTA FEST นี่บอกตามตรงเลยว่าไม่รู้ว่ามันคืออะไร คือพึ่งมารู้จักจากการแชร์ของเพื่อนซึ่งมีวงที่เราอยากดูมาด้วย ก็เลยไปอ่านรายละเอียดพบว่าค่าเข้า 700 บาทก็ร้องขึ้นมาทันที เนื่องจากเป็นโปรแกรมเมอร์ชั้นล่างเงินเดือนไม่สูงเท่าไหร่ แต่ก็กดไปเพราะอยากไปดูวงที่อยากดู (เข่าทรุดเลยนะตอนกดจ่าย ฮ่าๆๆๆ) หลังจากนั้นก็เข้าเครื่องวาร์ปทำงานจนลืมวันลืมคืน มาโผล่อีกก็ตอนมี Message แจ้งเตือนว่างานจะจัดละนะ

ไม่รู้เรื่องอะไรเลย

พอไปเปิด Page ของผู้จัดงานนี่ช็อกจริง อ้าวมีให้ไปลงชื่อสุ่มเล่น Ice sketch แล้วนี่คือไม่รู้อะไรเลย คือจากอ่านประกาศครั้งแรกบอกมีกิจกรรมเราก็นึกว่าจะไปบอกในงานเลย อันนี้กลายเป็นต้องติดตามตลอดว่ามีการเคลื่อนไหวอะไร (ซึ่งอาจจะเป็นปกติของงาน) แต่ด้วยความไม่รู้เลยอดลุ้นง่ายๆ ซึ่งตามความคิดเห็นส่วนตัวผมว่าควรจะบอกกติกาของกิจกรรมไปเลยว่าต้องทำอะไรวันไหนยังไง คนซื้อจะได้ใช้ประกอบการตัดสินใจในบางเรื่อง (เช่นจัดตารางเวลางาน)

ลิฟต์

พอมาถึงงานนี่อย่างช็อกคือคนเยอะมากต้องมายืนรอกันหน้าลิฟต์ซึ่งเราก็ให้คนอื่นขึ้นไปก่อนประมาณว่าไม่อยากเบียด พอถึงคิวของเราพอลิฟต์เปิดนี่คือช็อกมาก อ้าวนี่มันน้องวงที่เราตามนี่หว่า จังหวะนั้นนี่ช็อกมากแล้วมันเร็วมากก็เลยสตั้นไปหลายวิจนน้องเดินผ่านไปหมด ฮ่าๆๆๆ พอขึ้นไปถึงงานก็ยิ่งช็อกไปอีกคือคนเยอะมากๆๆๆๆๆๆๆ แบบไม่มีที่ยืน นี่ขนาดกะเวลามาแบบมาปุ๊ปเข้างานเลยนะ แล้วยิ่งพีคกว่านั้นคืองานเลื่อนไปเปิดช้ากว่าเดิม 1 ชั่วโมง ตอนนั้นนี่แบบ เฮ้ย นี่ถ้าสมมุติติดงานหรือมีนัดต่อการที่ตารางงานคลาดเคลื่อนขนาดนี้คือการอดดูแน่นอน แต่ทางผู้จัดก็ออกมาขอโทษนะแต่ผมว่าจัดงานให้คนมาดูเสียเงินทั้งที แล้วงานนี้ก็ไม่ใช่พวกงานรัฐ (พวกงานรัฐนี่ชอบเลทมากครับ ไม่รู้คนใหญ่คนโตมันเป็นห่าอะไร ชอบไม่ตรงต่อเวลา) ที่ชอบเลทก็ควรจะตรงเวลาสิ

เข้างาน

บรรยากาศในงานนี่คนละแบบกับที่เคยเจอ คือตอนแรกคิดว่าจะมาดูคอนเสิร์ตแล้วพอถึงเวลาก็ออกมาถ่ายรูปกับน้อง แต่อันนี้กลายเป็นว่างานคอนเสิร์ตกับถ่ายรูปน้องอยู่ในห้องเดียวกัน คือมุมนึงมันก็ดีที่ระหว่างยืนรอต่อแถวก็สามารถดูวงอื่นๆแสดงไปด้วย แต่ตอนคุยกับน้องเนี่ยมันเสียงดังแล้วจะคุยไม่รู้เรื่องซึ่งก็จริงอย่างที่กลัวตอนคุยกับน้องนี่คุยไม่รู้เรื่องเลย กะจะถามว่าไปเที่ยวสนุกไหม MV ใหม่สวยดีนะ แต่กลายเป็นมองหน้ากันเพราะคุยไม่รู้เรื่อง ที่พีคกว่านั้นคือ “พื้น” คือเนื่องจากเขาเอาลานน้ำแข็งเป็นที่จัดงานเขาเลยเอาแผ่นอะไรสักอย่างมาวางกันความเย็น แต่พอเริ่มนานเรื่อยๆมันเริ่มแฉะแล้วก็เปียก ซึ่งแม่งน่ากลัวตรงที่จัดงานมันใช้ไฟฟ้าแล้วถ้าไฟฟ้าเกิดรั่วนี่ไม่ตายกันเลยเหรอ (จริงๆเราคิดมากไปแค่นั้นแหละ)

การแสดง

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

ยุบวง

ก่อนมาถึงงานมีคนแชร์เรื่องการยุบวงไอดอลวงนึงซึ่งเห็นแล้วก็ตกใจเหมือนกันเพราะมันประกาศดึกมากแบบเฮ้ยประกาศแบบนี้ตลกไปรึเปล่า คือนึกอยากประกาศก็ประกาศถ้าเป็นสมัยก่อนอะไรก็ต้องประกาศเวลาราชการจันทร์ถึงศุกร์ แต่อย่างว่ายุคสมัยมันเปลี่ยนไปแล้วอะไรก็เกิดได้ 24 ชั่วโมง แล้วเราดันได้มาเห็นการแสดงรอบเกือบท้ายที่สุดของวง ซึ่งบรรยากาศมันพาให้เศร้าจริงๆนะ แบบจะได้เต้นเพลงแบบนี้พร้อมกับวงไม่กี่ครั้งแล้ว พรุ่งนี้จะไม่มีวงแล้ว ตอนเด็กๆก็เคยเห็นเหตุการณ์ประมาณนี้ตอนวงสมัยเด็กๆยุบวงถ้าจำไม่ผิดน่าจะวง Teen 8 Grade A ที่เขายุบวงแล้วพี่สาวนั่งดูแล้วก็เศร้าๆซึ่งตอนเด็กไม่ค่อยเข้าใจ พอโตมาเลยพอเข้าใจนิดหน่อยว่าวงนั้นจะไม่ได้เล่นในรูปแบบวงนั้นอีกแล้ว (ซึ่งยากนะที่จะรวมคนกลับมาได้) แต่อันนั้นคือดีนะคือยุบวงแบบรู้ตัว แต่อันนี้เหมือนน้องๆวงนี้เหมือนไม่ได้ตั้งตัวเหมือนวันนี้ยังฝันอยู่ว่าจะไปร้องเพลงในนามศิลปิน พอตื่นมาอ้าววงยุบ มันเหมือนฝันสลายไปในพริบตา พอมาคิดดูดีๆแล้วในชีวิตเราที่ผ่านมาเราก็เคยเห็นอะไรแบบนี้มาแล้วบ้างแต่แค่ไม่รู้สึกอะไรกับมันมาก ไม่ว่าจะเป็นเพื่อนสอบไม่ติดที่ที่อยากได้ ไปเพื่อนออดิชั่นวงดนตรีแล้วไม่ติด เพื่อนไปประกวดวาดรูปแล้วไม่ได้รางวัล หรือ ถ้าพีคขึ้นมาหน่อย เพื่อนโดนรีไทร์ตอนจะขึ้นปี 4 รุ่นน้องไม่ผ่านโปรตอนเข้ามาทำงาน หรือแบบรุ่นใหญ่ก็คงทำธุรกิจร้านอาหารแล้วไปไม่รอด คือเราเห็นเขาตอนเปิดร้านเขามีความหวังว่ากิจการจะไปได้ดี เรามองเห็นความฝันของพวกเขาแต่ผ่านไปไม่กี่เดือนร้านก็ปิด เราไม่รู้สึกอะไรเพราะไม่เห็นเจ้าของร้านตอนร้านเขาเจ๊ง เราไม่เห็นเพื่อนเราตอนนั่งร้องไห้ เราไม่เห็นเพื่อนเรานั่งท้อตอนออดิชั่นไม่ติด แต่วันนี้เรามาเห็นคนกลุ่มนึงที่น่าจะยังช็อกแต่ยังต้องมาแสดงมันคงเศร้าแน่ๆ แต่ผมก็เชื่อนะ อนาคตยังอีกยาวไกลสำหรับน้องๆ เหตุการณ์วันนี้ก็แค่เหตุการณ์นึงวันนี้จะผ่านไปเหลือแต่อดีตที่สวยงามของน้องๆ ให้ได้เล่าให้ใครต่อใครฟังเกี่ยวกับชีวิตช่วงนึงที่น่าจดจำ

การ Random ที่ไม่ตรงกับเรา + ถ่ายรูปกับน้อง

ในงานมีจัดกิจกรรมเป่ายิ้งฉุบกับวงที่ตัวเองชอบ แต่เหมือนการ Random ที่ไม่ตรงกับเราเลยอดขึ้นไปร่วมกิจกรรมกับเขา แล้วพอมาเห็นผู้ชนะถ่ายรูปกับน้องที่ชอบด้วยแล้ว โอ้ยยยยย ทำไมเขาโชคดีขนาดนั้นวะ (ถ่ายแบบจ้องตาด้วยนะ เกินไปอะ) หลังจากดูกิจกรรมเสร็จก็สู่ช่วงที่สำคัญที่สุดของวันนี้ครับซึ่งนั่นก็คือการถ่ายรูปกับน้อง บอกเลยที่มาเนี่ยวัตถุประสงค์หลักคือสิ่งนี้เลย รอบนี้เนื่องจากเสียงเพลงดังมากบวกกับน้องกับเราคุยกันคนละภาษายิ่งทำให้คุยกันไม่รู้เรื่องไปใหญ่ จับใจความได้แค่ว่า “เมืองไทยร้อนมาก” ซึ่งก็อยากจะบอกน้องเหมือนกันว่า “ญี่ปุ่นหนาวมาก” แต่ไม่รู้จะสื่อสารยังไง ฮ่าๆๆๆ สุดท้ายก็ได้รูปกลับมาเก็บไว้อีกรูป

สาวแว่นในงาน

วันนี้ในงานได้มีโอกาสเจอกับน้องสาวแว่นคนนึงซึ่งน่ารักมากเห็นแล้วแบบน่ารักจัง เลยชี้ให้เพื่อนดู เพื่อนบอกเฮ้ยเราต้องไปขอถ่ายรูปกันแล้วแหละ แต่จนแล้วจนรอดก็ไม่กล้าไปขอถ่ายรูปด้วย จนเห็นน้องมีคนขอถ่ายรูปด้วยเราเลยไปขอถ่ายรูปด้วย ซึ่งน้องก็ให้ถ่ายรูปด้วยนะ บอกเลยว่าความรู้สึกตอนนั้นนี่คือดีใจมาก(ก. ตามอีกหลายสิบตัว) จากนั้นเพื่อนผมก็ชวนน้องเขาคุยนิดหน่อยซึ่งก็ได้รู้ว่าน้องเขาเรียนจบ ม.6 แล้วกำลังจะเข้ามหาวิทยาลัย สุดท้ายเพื่อนก็ขอ ig น้องเขามาด้วย (เพื่อนคนนี้เป็นงานมากครับ) บอกเลยว่าหลังจากที่ไม่เคยใช้ ig ต่อจากนี้คงได้ใช้ ig แน่นอน ฮ่าๆๆๆ

ดักแก่

ช่วงท้ายงานวง MoonLight ในวงมีซินซิน (เพื่อนผมว่าเป็นอดีตวง BNK48) ขึ้นมาร้องเพลงซึ่งเอาเพลงสมัยผมเป็นเด็กมาร้อง ไม่ว่าจะเพลง

หรือเพลง

ซึ่งสองเพลงที่ว่ามาเนี่ยถือเป็นเพลงที่ร้องได้ในงานนี้เลยนะ เพราะเพลงส่วนใหญ่เคยฟังครั้งแรกหรือครั้งที่สอง หรือไม่ก็เป็นเพลงญี่ปุ่น มาเจอเพลงไทยที่ร้องตามได้เลยร้องตามพร้อมโบกมือ แต่ที่พีคคือดูเหมือนคนในงานเหมือนจะไม่รู้ไม่ค่อยรู้จักสองเพลงนี้ ก็เลยมานึกได้ว่าอ้าวนี่เราแก่ขนาดนี้แล้วเหรอ ใช่สินี่มันเพลงเมื่อ 13 - 16 ปีที่แล้วนี่หว่า น้องๆในงานถ้าไม่อายุ 20 อัพนี่บอกเลยว่าไม่น่าทัน เลยเผลอปล่อยแก่กับเพื่อนสองคน (แต่ดีที่ยืนอยู่ข้างหลัง ฮ่าๆๆๆ)

เพลงประกอบการเขียน Blog

เหมือนเคยได้ยินผ่านๆหูที่ไหนสักที่ หรือจังหวะมันดึงๆคล้ายเพลงไรสักเพลงที่เคยฟัง อ้าวนี่เพลงของน้องๆวงนี้นี่นา