เขียน runtests script ให้เป็น executable document กันเถอะ

เขียน runtests script ให้เป็น executable document กันเถอะ
Photo by Nathan Dumlao on Unsplash

ตอนนี้แล้วผมกล่าวถึงความสำคัญของเอกสารที่สามารถ execute เพื่อตรวจสอบดูว่ามันยังจริงอยู่ไหมได้ในรูปแบบของ unit tests ซึ่งเอาไว้เก็บบริบทของปัญหาที่เรากำลังแก้ หรือเรียกง่าย ๆ ว่า requirement

ตอนนี้เราจะมาพูดถึงเอกสารที่ใช้ในการ build software เช่น build script หรือแม้แต่วิธีการ run unit tests ก็สามารถเขียนในรูปแบบเอกสารได้เช่นกัน

ลองดูตัวอย่าง runtests.md script ด้านล่าง

#!/bin/bash

#### Jump to the folder in which the `runtests.md` script is in. Return if we fail to jump to the expected folder so we do not run tests in the wrong folder.

cd "$(dirname "$0")" || return

#### Run all the tests

npm run test:unit:ci

บรรทัดแรก #!/bin/bash เป็นตัวบอก operating system ว่านี่เป็น file bash script นะ ให้ run file นี้ด้วยโปรแกรม bash แต่เพราะ file เป็นนาสกุล .md ทำให้โปรแกรม editor มองมันเป็น file markdown ซึ่งทำให้ preview ดูเป็น document ได้ตามตัวอย่างด้านล่าง

Captured by Chokchai Phatharamalai

บรรทัดที่ 3 เริ่มต้นด้วย # 4 ตัว ซึ่งเป็นเพียง comment ธรรมดาสำหรับ bash script แต่สำหรับ markdown เป็นการจัด format ให้เป็น heading ระดับ 4 เพื่ออธิบายบรรทัดถัดไป

dirname "$0" คือการ run คำสั่ง dirname เพื่อหา folder ที่ script นี้วางอยู่ที่ไหน เพราะแต่ละเครื่องอาจจะวางคนละที่กัน

cd "$(dirname "$0")" คือการกระโดดเข้าไปใน folder ที่ script นี้อยู่ เพราะเราไม่รู้ว่าคนที่ run script จะ run มาจาก folder ไหน เราจึงอยากกระโดดมาอยู่ที่เดียวกับ script เพื่อให้สามารถ run script นี้จาก folder ไหนก็ได้ผลที่เหมือนกัน

|| return. ด้านหลัง คือการออกจากโปรแกรมถ้าไม่สามารถกระโดดเข้ามาใน folder ที่เราคาดหวังได้ เพื่อป้องกันไม่ให้ script ทำงานต่อถ้าเกิดความผิดพลาดเพื่อป้องกันความเสียหายที่อาจจะเกิดขึ้นหาก script ทำงานต่อไป

เมื่อเราเขียนเสร็จ เราก็เพิ่ม execution mode ให้กับ file นี้ด้วยคำสั่ง chmod +x ./runtests.md

เสร็จแล้วเราก็สามารถ run script นี้บน command line ด้วยคำสั่ง ./runtests.md ก็จะได้ผลตามด้านล่าง

Captured by Chokchai Phatharamalai

ด้วยเทคนิคนี้เราสามารถเขียน script พร้อมกันกับ document ที่อธิบายมันไปด้วยกัน เพื่อถนอมความรู้ที่จำเป็นสำหรับการ run test และ build software เอาไว้ได้

shellcheck

ผมมักจะทดสอบ script ด้วยคำสั่ง shellcheck คำสั่งนี้จะช่วยตรวจถ้า script ที่เราเขียนมีช่องโหว่ที่คนมักจะพลาดบ่อย ๆ เป็น syntaxic check ที่ช่วยกันความผิดพลาดเบื้องต้นได้

bach

และถ้าเราต้องการเขียน unit test สำหรับ bash script ก็มีเครื่องมือที่ชื่อว่า bach ให้ใช้ ซึ่งช่วยในการทำ semantic check เพื่อตรวจสอบว่า script ทำงานได้ตามที่เราคาดหวังได้

อ้างอิง

Unit tests คือ executable document
เคยไหมที่เจอเหตุการณ์ให้ต้องไปอ่านโค้ดคนอื่น แล้วพออ่านเสร็จก็เห็นว่าโค้ดมันผิด เลยไปแก้มันให้ถูก แจ่พอคิดอีกที ไม่แตะมันดีกว่า แล้วก็ undo จนมันกลับไปเป็นเหมือนเดิม ทำไมนะ? ผมเคยลองถามตัวเองดูว่าอะไรเป็นสาเหตุที่ทำให้
ShellCheck – shell script analysis tool
ShellCheck finds bugs in your shell scripts
GitHub - bach-sh/bach: Bach Testing Framework
Bach Testing Framework. Contribute to bach-sh/bach development by creating an account on GitHub.

Read more

Community of Practice (CoP) คืออะไร?

Community of Practice (CoP) คืออะไร?

กาลครั้งหนึ่ง… ชมรม Community of Practice (CoP) เป็นคอนเซปต์ที่ถูกกล่าวถึงใน Large Scale Scrum เทียบง่าย ๆ ก็เหมือนชมรมตอนเราเรียน ม. ปลาย นั่นแหละ ใครสนใจเรื่องอะไร ก็ไปเข้าชมรมนั้น แล้วก็ไปทำกิจกรรมร่วมกันในเรื่องที่เราสนใจ เพื่อฝึกฝนและแลกเปลี่ยนความรู้ บางทีอาจจะมี

By Chokchai
Vocal archetypes

Vocal archetypes

ผมกำลังเรียนวิธีใช้เสียงในคอร์ส Stage Academy ของ Vinh Giang ในคอร์ส ผมได้เรียนเกี่ยวกับแม่แบบของเสียง 4 รูปแบบดังนี้ Motivator ผู้จูงใจ เป้าหมายของผู้จูงใจคือการจุดประกายแรงบันดาลใจ องค์ประกอบของการใช้เสียงรูปแบบนี้คือ * เพิ่มความเร็วในการพูด * เปล่งเสี

By Chokchai

Pair programming 4 แบบ

เวลาผมสอนเรื่อง pair programming ปรกติผมจะเล่าคร่าว ๆ ว่า pair programming มี 2 แบบที่ผมใช้บ่อย ๆ คือ ping pong ที่ใช้เวลาคู่ pair ชำนาญพอ ๆ กัน กับ driver-navigator ที่ใช้เวลาความชำนาญต่างกัน ช่วงนี้มีโอกาสได้ pair กับสมาชิกในทีมบ่อย

By Chokchai

Introvert กับ Extravert

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

By Chokchai