Fanboi Channel

มิตรสหายนักพัฒนาซอฟต์แวร์ท่านหนึ่ง

Last posted

Total of 192 posts

187 Nameless Fanboi Posted ID:N8yR2iPBQ7

ขอจดอัพเดทความรู้ Technical ที่เก็บได้เด็ดๆช่วงนี้หน่อย

1. การวาง Structure Code แบบ "Functional Core, Imperative Shell"
ไปเรียน Testable Web API กับพี่คริส (Taskworld, Omise) มา สะดุดกับ Concept นี้มากๆ เพราะส่วนตัวชอบความ Resilience ของ OO ในส่วนของ IO ต่างๆ แต่พอมาเป็น Business Logic เราใช้ต่อ บางทีมันรู้สึกขัดความรู้สึก ไม่ว่าจะ Test ยากเอย เขียนเสร็จชื่อ Object ไม่ค่อย Make Sense เอย มีความขี่ช้างจับตักแตนอยู่ พอมาฟังพี่คริส Demythify เรื่องนี้ Concept มันดู Eureka จริงๆ

2. ด้วยเหตุข้อ 1 Typescript มันดูหล๊อหล่อขึ้นมาทันที ด้วยความที่มันลดความบ้านป่าเมืองเถื่อนของ Javascript ในจุดที่เราต้องการได้

3. ขึ้น Project ใหม่ ยุคนี้ หาข้ออ้างไม่ทำ CI/CD ยากละน้า นั่งลองเล่น Cloudbuild ต่อเข้า Github แล้ว Deploy ลง App/Kubenetes Engine กดๆแปปเดียวเสร็จ เข้าใจง่าย Integration Test ก็ทำไว้ใน Cloudbuild ได้หมด และ Infra as a code มันชีวิตง่ายขึ้นจริงระบุ Instance เอาขึ้น เอาลง Scale ไป Size เท่าไร ชีวิต Dev Happy

4. เช่นเดียวกันทำ Web / App ให้ Scalable ก็มาในยุคที่ Cost ถูกลงมาก (ทั้ง Cost Infra / Operation) เครื่องไม้เครื่องมือพวก Queue, Message พวกนี้ Cloud Provider มีให้ใช้ง่ายๆทุกเจ้าแล้ว

5. Concept ของพวก Distribution System อย่าง At least/Exactly Once semantic,Idempotent, Redundancy หรือกระทั่งการทำ Event Storming อันนี้น่าศึกษาไว้ Even กับ Role อย่าง Product Owner / Manager ก็ตาม

188 Nameless Fanboi Posted ID:rN.oRvueE4

ตอบในฐานะ SA นะครับ เรื่อง Set สำคัญกับการออกแบบระบบมาก เพราะปัจจุบันการเขียน Software จะให้ความสำคัญกับ Bussiness Rule มากกว่าการ Modeling ถ้าคุณอยากเขียนซอฟแวร์ในระดับลึกมันไม่ใช่การใช้ Api ชาวบ้านอีกต่อไป มันคือการสร้าง Architect ครับ
.
Set มีบทบาทยังไง การที่จะเขียนโปรแกรมให้ตอบโจทย์ Bussiness เราจะต้องมี Context กับ Operation ให้เหมาะสม ดังนั้นการเขียนโปรแกรมที่ Generic มาก ๆ ที่ชอบทำกันเนี่ย มันไม่ใช่ผลดีกับระบบ เราต้องแบ่ง Context ของระบบให้แก้ปัญหา Bussiness ให้ได้
.
แล้วอะไรจะใช้คำนวณว่าเราออกแบบ Class ได้ตรงความต้องการของระบบไหม คำตอบคือ Set ครับ
.
เช่น
A { x | ILoginService }
หมายความว่า เราสนใจ Elements ของ ILoginService
.
ทีนี้เรา Specific ได้แล้วว่าอะไรคือ Service ที่กำลังพัฒนา ต่อมาที่เราต้องเช็คคือสิ่งที่อยู่ใน Set มีความสำพันธ์กันอย่างไร
.
สมมติ A { LineLogin, FacebookLogin }
สมมติมี Service อยู่สองตัว ทีนี้เราหาความสำพันธ์ของมัน
.
ถ้ามันเป็น Isolation เคสเพราะนี้เป็น A+B ก็คือ
ต่อมาเราก็สนใจที่ตัว Elements ของ set ค่อยๆ ไล่ไปทีละตัว
.
การออกแบบ Class เราต้องนึกถึง 1. Relationship, 2. Multiplication, 3. Communication
.
ทีนี้เราสนใจลึกลงไปอีก step
เช่นผมสนใจ A { x | FacebookLogin }
.
ทีนี้ Set ของเราจะเป็น Aggregation ของ FacebookLogin
.
ดังนี้ FacebookLogin { TokenValidator, SendValidRequestEvents } ( ของจริงเยอะกว่านี้ นี่แค่ยกตัวอย่างมา 2 อัน )
.
ทีนี้ความสัมพันธ์มันเป็น AB คือ Existence Dependency ถ้าตัวไหนพังก็พังทั้ง Service
.
Event ของสองตัวนี้เป็นแบบ Sequence คือต่อกัน
คือ Validate input แล้วค่อยส่งไป Server
ทีนี้เราก็มาวิเคราะห์ว่าจะใช้ Pattern ไหนในที่นี้ใช้ Middleware Pattern เพราะ Flow input เป็นแบบ Sequence
.
เราก็ไล่ออกแบบไปเรื่อยๆ ตามนี้ ซึ่งความยากคือ Entity ของระบบมันมี Invariant ต่างกัน Aggregate ต่างกัน Concurrency ก็ต่างกันอีก
.
ในโลก Software คือความยากมันไม่ใช่แค่คณิตศาสตร์ มันคือ Concept มหาศาล หลากหลาย Principal แต่ที่ผมจะบอกคือเรื่อง Set เนี่ยมันทำให้เรามองเห็น Domain ที่กำลังจัดการอยู่ให้ชัดขึ้น ทีนี้เราจะมอง Dependency ออก มอง Communication ออก ที่เหลือก็ไปว่ากันที่ Pattern กับ Persistence
.
ถ้าคุณแยก Domain ไม่ออก อย่าพูดถึง Design Pattern เลย ปนกันมั่วแน่นอน
ไอ้สูตร Set ที่คุณเรียนกันตอนม. ปลายนี่แหล่ะ เคสที่มันได้ใช้
.
Cohesion กับ Coupling ก็ Set
ถ้าระบุ Set ไม่ได้ Object มันก็คุยมั่วไปหมด หา Boundary ไม่เจอ
.
จริงๆ ยังมีมากกว่านี้อีก ผมยกตัวอย่างแค่ Service เดียวเอง เผื่อพอเป็นไอเดียว่าคณิตศาสตร์มันไม่ใช่แค่ผูกกับการแก้สมการอย่างเดียวมันมีมุมมองอื่น ๆ ด้วย
.
Code ที่แก้สมการในระบบมันคือ Behavior ของ Class กับของ Service ที่เราสนใจแค่นั้นเอง ว่าจะแก้ยังไง ไม่ใช่แค่หน้าที่ของ Dev แต่หมายถึงการสื่อสารระหว่าง Dev กับ Domain Expert ในด้านนั้น ๆ เพื่อร่วมกันแก้ปัญหา
.
สุดท้ายกับคำถามที่ว่า “เป็นโปรแกรมเมอร์ใช้คณิตศาสตร์กี่ %”
1. Empirical Expression
2. Numerical Expression
นี่แหล่ะสองสิ่งที่คุณจะใช้

189 Nameless Fanboi Posted ID:H.2gEPSKN8

ปริญญาโทด้านคอมพิวเตอร์มันจำเป็นมากป่าววะ หรือไปหางานทำดี

190 Nameless Fanboi Posted ID:kKPvrhZOLi

>>189 ถ้าจะมาเป็น dev ทำงานจริงจำเป็นกว่า

191 Nameless Fanboi Posted ID:2IjyEbqevB

ปรึกษาหน่อยค่ะ

192 Nameless Fanboi Posted ID:On/WDCA26e

หนึ่งในเรื่องสำคัญที่หลายต่อหลายคนมองข้าม ก็คือ "พิมพ์ดีด"

ต้องฝึกให้คล่องนะ อย่างน้อยๆ นี่ 30 คำต่อนาทีขึ้นไปควรจะได้ ไม่งั้นจะ inefficient มากในการทำงาน

และแน่นอนว่าการพิมพ์ที่ดี ควรพิมพ์ได้โดยไม่ต้องมองแป้นพิมพ์เลยแม้แต่นิดเดียว

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

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

โปรแกรมฝึกพิมพ์ดีดดีๆ นี่ช่วยได้เยอะมากเลย

โปรแกรมที่ผมชอบมาก ก็คือ GNU Typist (gtypist) .... ที่มีลำดับในการสอนที่ดีมาก และมีปรัชญาในการสอนที่ดีเลย ก็คือแทนที่จะเน้นไปที่พิมพ์เร็ว .... เขาจะเน้นที่จังหวะการพิมพ์ (rhythm) และความถูกต้อง .... ถ้าพิมพ์ข้อความแล้วผิดเกิน 3% นี่จะไปต่อไม่ได้ (และผิดแล้วผิดเลย แก้ไม่ได้)

พิมพ์เร็วนี่ไม่ยากหรอก ถ้าพิมพ์เป็นจังหวะที่ดีและคงที่ได้ .... พิมพ์รักษาจังหวะไว้ จากนั้นมันจะค่อยๆ เร็วขึ้นเอง

อ่อ แล้วการคิด WPM (Words-per-Minute) ของมัน จะเอาจำนวนที่เราพิมพ์ผิดมาคิดด้วย ว่าจริงๆ แล้วเราพิมพ์ได้กี่คำต่อนาทีกันแน่

จะเห็นว่าในรูปแรก ผมพิมพ์ถูกหมด WPM ก็เป็นไปตาม Raw speed (95 WPM) แต่รูปที่สองนี่มีผิดอยู่หน่อย (2%) ทำให้แม้ว่าจะพิมพ์ที่ Raw speed 83 WPM ก็ถูก adjusted เหลือ 75

ที่สำคัญที่สุด คือมันทำบทเรียนหรือแบบฝึกหัดเองง่ายมาก ..... อย่างรูปสุดท้าย นี่ผมเอาโค้ด Haskell ที่ผมเขียนไว้สอนใน Workshop หนึ่งมาเป็นแบบฝึกหัดเลย

เอาไว้ให้พวกเด็กฝึกงานหรือพนักงานใหม่ฝึกพิมพ์ดีดไปกับสไตล์การเขียนโค้ดที่ใช้ในทีมได้เลย