<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>tnpl.me</title>
    <link>https://tnpl.me/</link>
    <description></description>
    <pubDate>Fri, 17 Apr 2026 05:17:38 +0000</pubDate>
    <item>
      <title>Mitigating head-of-line blocking in Node.js with cooperative scheduling</title>
      <link>https://tnpl.me/mitigating-head-of-line-blocking-in-node-js-with-cooperative-scheduling</link>
      <description>&lt;![CDATA[Background&#xA;I&#39;ve been telling everyone to avoid Node.js for more than 3 years because I have suffered hard-to-impossible issues when using it in large-scale real-world systems. Issues are included&#xA;&#xA;Head-of-line (HOL) blocking -- it is a performance issue where one bad request or task in a queue blocks all others behind it. This is because the nature of Node.js is that JS code execution is single-threaded. Cluster mode helps a bit but it still blocks if one bad request hits a single process in a cluster.&#xA;Losing error stack trace context in async task -- when an error happens in async context deep down in the library, it&#39;s very hard to trace back to the application layer where it starts.&#xA;!--more--&#xA;&#xA;I recommend using Node.js if you really need to, for example, you have to develop a web application using React, Vue, Next.js, NuxtJS, etc.&#xA;&#xA;However, I&#39;ve found a way to mitigate the Head-of-line blocking issue which solves the biggest pain of mine.&#xA;&#xA;Head of line blocking causes unpredictable performance&#xA;Imagine there&#39;s a single Nodejs process running to serve API requests. The API endpoint queries data from the database, loops it, processes it, and returns the response. One of the users has 100,000 rows returned from the database. JS code takes around 10s to process this single request, blocking other users who have only a few rows. If we observe each API response time, all requests blocked by the bad one will have at least 10s of latency -- equal to the time it takes to process that bad request.&#xA;&#xA;We have many ways to mitigate this issue, for instance, doing jobs in the background, limit amount of rows returned, etc. However, if you really need to process a request that has unpredictable data size, and wants to keep the application flow the same, you could use my technique.&#xA;&#xA;Cooperative scheduling&#xA;&#xA;Create yieldJs function as below.&#xA;&#xA;async function yieldJs() {&#xA;    return new Promise((resolve) =  setImmediate(resolve))&#xA;}&#xA;&#xA;Then in the tight loop, you can put this function in the middle to yield JS execution back to Node.js event loop.&#xA;&#xA;async function handleRequest(req, res) {&#xA;    const rows = ... query database ...&#xA;    for (const r of rows) {&#xA;        ... process the row ...&#xA;        await yieldJs()&#xA;    }&#xA;    ... return response ...&#xA;}&#xA;&#xA;What happens here is when await yieldJs() is executed, Node.js will pause the execution of this function, process something else, and then for the next event loop cycle, it will resume the execution.&#xA;&#xA;I&#39;ve experimented with 2 other functions: setTimeout and process.nextTick.&#xA;&#xA;For setTimeout, this function has a higher overhead because of the timer. This makes JS code to be able to utilize only 15-20% of CPU.&#xA;&#xA;For process.nextTick, this function is a microtask and it keeps executing the callback before everything else which still suffers from head-of-line blocking issues.&#xA;&#xA;Lastly, setImmediate can utilize 80-85% of CPU in a tight loop scenario which I think is acceptable.&#xA;&#xA;Final words&#xA;Even though we have a technique to mitigate head-of-line blocking, however, I still feel that Node.js has many issues preventing us from developing a maintainable and predictable performance of production web applications. Also please avoid thread-per-request language/framework for IO intensive. I recommend using Golang instead or Rust or Zig if you have experience.&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="background">Background</h2>

<p>I&#39;ve been telling everyone to avoid Node.js for more than 3 years because I have suffered hard-to-impossible issues when using it in large-scale real-world systems. Issues are included</p>
<ol><li>Head-of-line (HOL) blocking — it is a performance issue where one bad request or task in a queue blocks all others behind it. This is because the nature of Node.js is that JS code execution is single-threaded. Cluster mode helps a bit but it still blocks if one bad request hits a single process in a cluster.</li>
<li>Losing error stack trace context in async task — when an error happens in async context deep down in the library, it&#39;s very hard to trace back to the application layer where it starts.
</li></ol>

<p>I recommend using Node.js if you really need to, for example, you have to develop a web application using React, Vue, Next.js, NuxtJS, etc.</p>

<p>However, I&#39;ve found a way to mitigate the Head-of-line blocking issue which solves the biggest pain of mine.</p>

<h2 id="head-of-line-blocking-causes-unpredictable-performance">Head of line blocking causes unpredictable performance</h2>

<p>Imagine there&#39;s a single Nodejs process running to serve API requests. The API endpoint queries data from the database, loops it, processes it, and returns the response. One of the users has 100,000 rows returned from the database. JS code takes around 10s to process this single request, blocking other users who have only a few rows. If we observe each API response time, all requests blocked by the bad one will have at least 10s of latency — equal to the time it takes to process that bad request.</p>

<p>We have many ways to mitigate this issue, for instance, doing jobs in the background, limit amount of rows returned, etc. However, if you really need to process a request that has unpredictable data size, and wants to keep the application flow the same, you could use my technique.</p>

<h2 id="cooperative-scheduling">Cooperative scheduling</h2>

<p>Create <code>yieldJs</code> function as below.</p>

<pre><code class="language-JS">async function yieldJs() {
    return new Promise((resolve) =&gt; setImmediate(resolve))
}
</code></pre>

<p>Then in the tight loop, you can put this function in the middle to yield JS execution back to Node.js event loop.</p>

<pre><code class="language-JS">async function handleRequest(req, res) {
    const rows = ... query database ...
    for (const r of rows) {
        ... process the row ...
        await yieldJs()
    }
    ... return response ...
}
</code></pre>

<p>What happens here is when <code>await yieldJs()</code> is executed, Node.js will pause the execution of this function, process something else, and then for the next event loop cycle, it will resume the execution.</p>

<p>I&#39;ve experimented with 2 other functions: <code>setTimeout</code> and <code>process.nextTick</code>.</p>

<p>For <code>setTimeout</code>, this function has a higher overhead because of the timer. This makes JS code to be able to utilize only 15-20% of CPU.</p>

<p>For <code>process.nextTick</code>, this function is a microtask and it keeps executing the callback before everything else which still suffers from head-of-line blocking issues.</p>

<p>Lastly, <code>setImmediate</code> can utilize 80-85% of CPU in a tight loop scenario which I think is acceptable.</p>

<h2 id="final-words">Final words</h2>

<p>Even though we have a technique to mitigate head-of-line blocking, however, I still feel that Node.js has many issues preventing us from developing a maintainable and predictable performance of production web applications. Also please avoid thread-per-request language/framework for IO intensive. I recommend using Golang instead or Rust or Zig if you have experience.</p>
]]></content:encoded>
      <guid>https://tnpl.me/mitigating-head-of-line-blocking-in-node-js-with-cooperative-scheduling</guid>
      <pubDate>Sat, 09 Nov 2024 09:20:10 +0000</pubDate>
    </item>
    <item>
      <title>Software Design during Wartime</title>
      <link>https://tnpl.me/software-design-during-wartime</link>
      <description>&lt;![CDATA[บริษัท A...&#xA;เริ่มต้นจากการเป็น start-up พวกเค้าเขียน code เร็วมาก แทบไม่มี process อะไรเลย เขียนเสร็จสามารถ push code และ deploy production ได้ทันที เค้ามีลูกค้าจำนวนหนึ่ง ลูกค้าสามารถ request feature กับทีมได้โดยตรง ภายใน 3-4 วันลูกค้าก็ได้ใช้งาน feature ที่ต้องการ&#xA;&#xA;เวลาผ่านไป พวกเค้าเริ่มมีลูกค้ามากขึ้นเนื่องจากมี feature ที่หลากหลาย ตอบโจทย์ แต่ระบบเริ่มซับซ้อน มันเริ่มแสดงปัญหามากขึ้น ระบบทำงานช้า มี bug และเมื่อ release ของใหม่หรือ bug fix ก็มักจะ break feature เดิม นอกจากนั้น feature request ก็ใช้เวลาหลายสัปดาห์หรือหลายเดือนกว่าจะทำสำเร็จ นั่นยิ่งทำให้ลูกค้าเก่าเริ่มไม่พอใจ แต่ก็ยังมีลูกค้าใหม่เข้ามาเรื่อยๆ&#xA;!--more--&#xA;&#xA;ทีมทำงานใต้ความกดดันที่สูงมาก พวกเค้านึกเสียใจว่าควรจะออกแบบระบบให้ดีตั้งแต่แรกเพื่อป้องกันไม่ให้เกิดปัญหานี้อีก พวกเค้าหาคนเก่งที่มีประสบการณ์เข้ามาเพิ่ม หา Architect ที่จะช่วยบอกพวกเค้าได้ว่าจะต้องทำอย่างไรถึงจะไม่มีปัญหาซ้ำแบบเดิม พวกเค้าเพิ่ม process มา control ในหลายจุดเพื่อป้องกันไม่ให้เกิดปัญหากับ feature ของลูกค้า การทำงานต้องมี document มีการ review และ approve แต่นั่นยิ่งทำให้ทีมงานต้องใช้เวลามากยิ่งขึ้นกว่าจะ release feature ให้ลูกค้าได้&#xA;&#xA;...สุดท้ายก็สายเกินไป พวกเค้าโดนบริษัทรุ่นใหม่ที่ทำงานเร็วกว่าแซงไปอย่างง่ายดาย ลูกค้าเริ่มย้ายออกไปทีละน้อย แม้ว่าจะมีทีมงานช่วยขาย แต่ก็ถูกเปรียบเทียบและพ่ายแพ้โดยง่าย&#xA;&#xA;บริษัท B...&#xA;พวกเค้าเป็นกลุ่มคนที่มีประสบการณ์ พวกเค้าทำ product แบบเดียวกับบริษัท A แต่พวกเค้าเลือกที่จะเริ่มออกแบบให้ระบบมีความยืดหยุ่นสูงตั้งแต่ต้น พวกเค้าเชื่อมั่นในประสบการณ์ที่มีในอุตสาหกรรมนี้ พวกเค้าใช้เวลาไปเกือบ 1 ปีในการ design และพัฒนาระบบที่พวกเค้าคิดว่าดีที่สุด ยืดหยุ่นที่สุดและสามารถตอบโจทย์ลูกค้าได้ แต่ในระหว่าง 1 ปีนั้น บริษัท A ปล่อย feature ต่างๆ มากมายที่ดูเหมือนไม่ผ่านการออกแบบมาเลย&#xA;&#xA;หลังจากที่เปิดตัวอย่างยิ่งใหญ่ พวกเค้าพบว่าระบบที่ออกมาแบบไม่ตรงกับสิ่งที่ลูกค้าต้องการซะทีเดียว อย่างไรก็ตามพวกเค้าเริ่มมีลูกค้าบ้าง ลูกค้าเริ่ม request feature เข้ามาให้แก้ไข แต่ระบบของเค้าก็ยังมีความยืดหยุ่น ปรับแก้ได้รวดเร็วในเวลาไม่กี่วัน&#xA;&#xA;แต่แล้วเมื่อโลกธุรกิจเริ่มเปลี่ยน มีโรคระบาด มีเทคโนโลยีใหม่เกิดขึ้นก็เริ่มมีลูกค้าขอ feature ที่ทำยากมากๆ และต้องแก้ไขอย่างยากลำบาก พวกเค้าต้องเลือกระหว่างปฏิเสธลูกค้าหรือเลือกที่จะปรับโครงสร้างระบบครั้งใหญ่อีกครั้ง เพราะถ้าหากพวกเค้าไม่แก้ไขโครงสร้างระบบ พวกเค้ามองเห็นแล้วว่าบริษัทน่าจะลงเอยเช่นเดียวกับบริษัท A&#xA;&#xA;...แต่ในระหว่างที่พวกเค้ากำลังวางแผน ประเมินความเสี่ยง ออกแบบและถกเถียงกันมาหลายเดือน ก็มีบริษัทรุ่นใหม่ที่ทำ product ออกมาสู้กับพวกเค้าและตรงกับสถานการณ์ของโลกที่เปลี่ยนไป ลูกค้าก็เริ่มย้ายออกจนสุดท้ายพวกเค้าก็อยู่ไม่ได้&#xA;&#xA;บริษัท C...&#xA;พวกเค้าเป็นกลุ่มคนที่มีประสบการณ์และทำ product คล้ายกับ 2 บริษัทก่อนหน้า พวกเค้ารู้ว่าลูกค้ามีความต้องการที่หลากหลายและเปลี่ยนแปลงตลอดเวลา พวกเค้ารู้ว่าความเร็วเป็นของปีศาจ แต่พวกเค้าก็ฉลาดและระวังไม่ให้ตัวเองมีจุดจบเหมือนบริษัท A&#xA;&#xA;พวกเค้าเลือกที่จะเขียน code ในระดับที่ &#34;พอรับได้&#34; มี process น้อยที่สุด แทบไม่มีเอกสารอะไรเลยถ้าไม่จำเป็นจริงๆ พวกเค้า design ผ่านการคุยกันสั้นๆ แล้วไปลองทำ พวกเค้าสามารถ push code และ deploy production ได้ทันทีเพื่อให้ลูกค้าได้ทดลองใช้และเก็บ feedback มาปรับปรุงเพิ่ม รอบการ release feature ของพวกเค้าคือหลักวัน ไม่ใช่หลักสัปดาห์, เดือน, หรือไตรมาส&#xA;&#xA;พวกเค้าสามารถออก feature สู้กับบริษัท A ได้อย่างทันเวลา ลูกค้าให้ความสนใจกับ product ของพวกเค้าเป็นอย่างมาก พวกเค้าสามารถรักษาความเร็วแบบนี้ได้อย่างดี ถึงแม้เมื่อเวลาผ่านไป ระบบมีความซับซ้อนมากขึ้น มีลูกค้ามากขึ้น พวกเค้าปล่อย feature ช้ากว่าเล็กน้อยเมื่อเทียบกับบริษัทขนาดเล็ก แต่ในภาพรวมก็ยังเร็วกว่าคู่แข่งที่เป็นบริษัทขนาดใหญ่&#xA;&#xA;...สุดท้ายพวกเค้าก็เป็นผู้นำอันดับ 1 ในตลาด ทุกคนต่างสงสัยว่าพวกเค้าทำได้อย่างไร&#xA;&#xA;Wartime mindset&#xA;ผมอ่านหนังสือเล่มหนึ่งที่พูดถึงเรื่องนี้ เค้าเปรียบเทียบการสร้างสะพานสำหรับประชาชน vs สะพานสำหรับสงครามให้เข้าใจว่า การสร้างสะพานสำหรับประชาชนมักจะใช้เวลาหลายปีในการสร้างเนื่องจากเป้าหมายคือสะพานที่มีอายุใช้งานยาวนานที่สุด แต่เมื่อเทียบกับสะพานสำหรับสงคราม ถึงแม้ว่าจะต้องให้รถถังขับผ่านซึ่งมีน้ำหนักบรรทุกมากกว่าสะพานสำหรับประชาชน แต่เป้าหมายการออกแบบของมันไม่ใช่อายุยาวนาน แต่เป็นความเร็วในการสร้างโดยยังต้องรองรับน้ำหนักของรถถังได้ มันอาจจะสามารถสร้างเสร็จได้ในเวลา 5-10 วันและถูกใช้งานแค่ 1-3 ปีแล้วเลิกใช้ไป ไม่ใช่ 50-100 ปี ดังนั้น ทั้งแนวคิด วัสดุ รูปทรง การออกแบบ กระบวนการทำงาน ทั้ง 2 แบบมีความแตกต่างกันโดยสิ้นเชิง&#xA;&#xA;การออกแบบและพัฒนา software ก็จะต้องเลือก technology ที่ทำให้เราสามารถ release software ได้ง่ายและเร็วด้วยเช่นกัน ลองนึกถึงการ update feature บน web application ผ่าน cloud server vs การส่ง CD/DVD ให้ลูกค้าเอาโปรแกรมไป install ในเครื่อง laptop เอง ทั้ง 2 วิธีใช้เวลาในการ release ต่างกันหลายเท่าตัว&#xA;&#xA;อย่างไรก็ตามในขณะสงคราม เวลาเป็นเรื่องสำคัญมาก แต่คุณภาพก็จำเป็นเพราะหากสะพานไม่สามารถทำหน้าที่ของมันได้ เราก็แพ้สงครามได้เช่นเดียวกัน&#xA;&#xA;Post hoc design&#xA;การที่เราจะทำได้อย่างบริษัท C นั้นไม่ใช่การไม่ออกแบบอะไรเลย แต่มันคือการออกแบบภายหลัง (Post hoc design)&#xA;&#xA;เรามักเสียเวลาประชุมว่าจะใช้ technology อะไร จะทำบน architecture อะไร จะใช้ pattern ไหนในการเขียน code และยังรวมถึงการ discuss ว่า UI/UX จะเป็นอย่างไร จะมีกี่ปุ่ม จะใช้สีอะไร จะเลือก wording ไหน สิ่งเหล่านี้เป็นสิ่งจำเป็นแต่ยังไม่สำคัญจนกว่าเราจะปล่อย product/feature ให้ลูกค้าใช้งานและคอย observe ว่ามันตอบโจทย์หรือไม่&#xA;&#xA;เราจะไม่เสียเวลาถกเถียงกันเป็นสัปดาห์หรือเป็นเดือนเพื่อหาว่าอะไรจะตรงใจลูกค้า หรือเพื่อวางแผนเผื่อสำหรับ feature ที่อาจจะทำในอีกครึ่งปีถัดไป แต่เราจะทำงานใกล้ชิดกับลูกค้าทุกวัน ทำตามที่ลูกค้าขอเท่านั้น และให้ลูกค้าเป็นคนบอกว่าพวกเค้าต้องการอะไรหลังจากที่พวกเค้าได้ทดลองใช้งาน feature ในแต่ละ release ของเรา&#xA;&#xA;ดังนั้นในช่วงแรกของ new product หรือ new feature ทุกๆ วันมีความสำคัญ ดังนั้นทีมจะต้องเลือก &#34;ความเร็ว&#34; ในการปล่อย feature ไม่ใช่ &#34;ความยั่งยืน&#34; เพื่อให้เราค้นหา &#34;feature-market fit&#34; ได้เร็วที่สุด อย่างไรก็ตามทีมยังต้องคงความสามารถทั้งหมดของ software ไว้ให้ได้ ระบบห้ามพัง ห้ามทำให้ feature เดิมมีปัญหา&#xA;&#xA;หลังจาก feature เริ่มนิ่ง เริ่มอยู่ตัว เราจำเป็นจะต้อง &#34;แบ่งเวลาทันที&#34; เพื่อกลับมาทำให้มันมี &#34;ความยั่งยืน&#34; แต่ห้าม &#34;ทำเผื่อ&#34; โดยเด็ดขาด ในช่วงเวลานี้มีโอกาสน้อยมากๆ ที่จะมี requirement เปลี่ยนไปโดยสิ้นเชิง มันจึงเหมาะมากที่จะมาตามเก็บเช็ดล้าง เพื่อให้ทีมงานใช้แรง maintain น้อยที่สุด ...ถ้าหากไม่แบ่งเวลามาสุดท้ายก็อาจจะลงเอยแบบเดียวกับบริษัท A&#xA;&#xA;การทำ post hoc design &amp; development ให้ยั่งยืนไม่ใช่การเปลี่ยนภาษา programming เปลี่ยน database หรือเปลี่ยน architecture ใหม่ทั้งหมดใหม่ แต่เป็นเพียงการ clean up ความเละเทะที่เราได้ทำไปในช่วงแรกและ enhance ระบบเพื่อให้เราทำ feature ถัดไปของลูกค้าได้ด้วยความเร็วเท่าเดิม (ถ้าไม่มี feature ถัดไปก็ยังไม่ต้อง enhance)&#xA;&#xA;Reversible vs Irreversible decision&#xA;การเน้นความเร็วไม่ใช่การไม่ออกแบบอะไรเลยในตอนต้น ควรระวังการตัดสินใจที่ย้อนไปแก้ไขไม่ได้หรือแก้ไขยากมากๆ&#xA;&#xA;ยกตัวอย่างเช่น เราทำ mobile application ให้ลูกค้าใช้งานโดยให้ mobile application เชื่อมต่อกับฐานข้อมูลบน server โดยตรง ถึงแม้ว่าเราสามารถใช้ mobile developer 1 คนทำ feature เชื่อมฐานข้อมูลและปล่อย feature ได้เร็วในครั้งแรก แต่การแก้ไข feature ในครั้งถัดมานั้นยากมากๆ ทำให้ feature เดิมพัง เพราะไม่สามารถเพิ่ม/แก้ไข database column ได้ ไม่สามารถทำให้ mobile version เก่ากับใหม่ทำงานร่วมกันได้ ซึ่งไม่ใช่ &#34;ความเร็ว&#34; ในแบบที่ Wartime ต้องการ&#xA;&#xA;อีกตัวอย่างคือการทำ native mobile app vs cross platform ในช่วงแรกเราอาจเลือกทำ cross platform ไปก่อนเพื่อรีบหา feature-market fit แต่เมื่อพบแล้ว เราจะเริ่มรู้ว่าจุดไหนมีปัญหาหรือไม่ตอบโจทย์ พัฒนา feature ยาก maintain ยากก็มา enhance เฉพาะหน้านั้นๆ&#xA;&#xA;หรือการเขียน code ที่มีช่องโหว่ร้ายแรง ทำให้เกิด data leak หรือกระทบกับ financial ของบริษัทอย่างใหญ่หลวงก็เป็นสิ่งที่ต้องระวัง&#xA;&#xA;การถกเถียงในเรื่อง code style หรือ variable naming หรือ monolith vs microservice หรือ SQL vs NoSQL เป็นเรื่องที่ยังไม่สำคัญ เราทำอะไรก็ได้ที่ทำได้เร็วเพื่อ release feature ให้ไว จากนั้นค่อยมา enhance เพิ่มในช่วงที่ feature เริ่มนิ่งได้&#xA;&#xA;บางคนอาจสงสัยว่าการตัดสินใจเรื่องเหล่านี้ถ้าไม่เลือกตั้งแต่แรก มันจะแก้ไขยากและสร้างปัญหาในอนาคตหรือเปล่า แน่นอนว่ามีโอกาสที่จะสร้างปัญหาเมื่อมี feature-market fit เมื่อมีลูกค้าเยอะขึ้นและระบบเริ่มซับซ้อน แต่ทีมที่มี Wartime mindset จะต้องกลับมาปรับปรุงระบบให้ยั่งยืนในทันทีตลอดเวลา พวกเค้ารู้ว่า design ที่ดีคือ design ที่มีลูกค้าใช้งานจริง ทำงานได้ตามที่คาดหวังไว้ พวกเค้าเปลี่ยน technology ก็ต่อเมื่อพบว่ามันเป็นตัวถ่วงในด้านความเร็วในการปล่อย feature&#xA;&#xA;---&#xA;&#xA;Wartime Software Development ไม่ใช่ script kiddy ที่เขียน code เร็วแต่ขาดประสบการณ์ แต่เป็นเทคนิค กระบวนการและประสบการณ์มากมายที่ทำทุกอย่างเพื่อเน้นไปที่​ &#34;ความเร็ว&#34; บนพื้นฐานของ Software ที่ต้องทำงานได้ตามความคาดหวังของลูกค้าตลอดเวลา&#xA;&#xA;พวกเขาทำสิ่งเหล่านี้เท่าที่จำเป็นในทันทีที่ได้ส่งมอบ feature ที่ตอบโจทย์ลูกค้าสำเร็จ&#xA;เขียน automate test เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า&#xA;clean up ทุกอย่างและ refactor code เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า&#xA;เขียน document เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า&#xA;automate business process เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า&#xA;สรุปบทเรียนในทุกด้านทันทีที่ feature ตอบโจทย์ลูกค้า&#xA;พวกเขาใช้เวลาไม่มากในการทำสิ่งเหล่านี้เพื่อความ &#34;ยั่งยืน&#34; แล้วจึงเริ่มทำ feature ถัดไปที่ตอบโจทย์ลูกค้า&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="บร-ษ-ท-a">บริษัท A...</h2>

<p>เริ่มต้นจากการเป็น start-up พวกเค้าเขียน code เร็วมาก แทบไม่มี process อะไรเลย เขียนเสร็จสามารถ push code และ deploy production ได้ทันที เค้ามีลูกค้าจำนวนหนึ่ง ลูกค้าสามารถ request feature กับทีมได้โดยตรง ภายใน 3-4 วันลูกค้าก็ได้ใช้งาน feature ที่ต้องการ</p>

<p>เวลาผ่านไป พวกเค้าเริ่มมีลูกค้ามากขึ้นเนื่องจากมี feature ที่หลากหลาย ตอบโจทย์ แต่ระบบเริ่มซับซ้อน มันเริ่มแสดงปัญหามากขึ้น ระบบทำงานช้า มี bug และเมื่อ release ของใหม่หรือ bug fix ก็มักจะ break feature เดิม นอกจากนั้น feature request ก็ใช้เวลาหลายสัปดาห์หรือหลายเดือนกว่าจะทำสำเร็จ นั่นยิ่งทำให้ลูกค้าเก่าเริ่มไม่พอใจ แต่ก็ยังมีลูกค้าใหม่เข้ามาเรื่อยๆ
</p>

<p>ทีมทำงานใต้ความกดดันที่สูงมาก พวกเค้านึกเสียใจว่าควรจะออกแบบระบบให้ดีตั้งแต่แรกเพื่อป้องกันไม่ให้เกิดปัญหานี้อีก พวกเค้าหาคนเก่งที่มีประสบการณ์เข้ามาเพิ่ม หา Architect ที่จะช่วยบอกพวกเค้าได้ว่าจะต้องทำอย่างไรถึงจะไม่มีปัญหาซ้ำแบบเดิม พวกเค้าเพิ่ม process มา control ในหลายจุดเพื่อป้องกันไม่ให้เกิดปัญหากับ feature ของลูกค้า การทำงานต้องมี document มีการ review และ approve แต่นั่นยิ่งทำให้ทีมงานต้องใช้เวลามากยิ่งขึ้นกว่าจะ release feature ให้ลูกค้าได้</p>

<p>...สุดท้ายก็สายเกินไป พวกเค้าโดนบริษัทรุ่นใหม่ที่ทำงานเร็วกว่าแซงไปอย่างง่ายดาย ลูกค้าเริ่มย้ายออกไปทีละน้อย แม้ว่าจะมีทีมงานช่วยขาย แต่ก็ถูกเปรียบเทียบและพ่ายแพ้โดยง่าย</p>

<h2 id="บร-ษ-ท-b">บริษัท B...</h2>

<p>พวกเค้าเป็นกลุ่มคนที่มีประสบการณ์ พวกเค้าทำ product แบบเดียวกับบริษัท A แต่พวกเค้าเลือกที่จะเริ่มออกแบบให้ระบบมีความยืดหยุ่นสูงตั้งแต่ต้น พวกเค้าเชื่อมั่นในประสบการณ์ที่มีในอุตสาหกรรมนี้ พวกเค้าใช้เวลาไปเกือบ 1 ปีในการ design และพัฒนาระบบที่พวกเค้าคิดว่าดีที่สุด ยืดหยุ่นที่สุดและสามารถตอบโจทย์ลูกค้าได้ แต่ในระหว่าง 1 ปีนั้น บริษัท A ปล่อย feature ต่างๆ มากมายที่ดูเหมือนไม่ผ่านการออกแบบมาเลย</p>

<p>หลังจากที่เปิดตัวอย่างยิ่งใหญ่ พวกเค้าพบว่าระบบที่ออกมาแบบไม่ตรงกับสิ่งที่ลูกค้าต้องการซะทีเดียว อย่างไรก็ตามพวกเค้าเริ่มมีลูกค้าบ้าง ลูกค้าเริ่ม request feature เข้ามาให้แก้ไข แต่ระบบของเค้าก็ยังมีความยืดหยุ่น ปรับแก้ได้รวดเร็วในเวลาไม่กี่วัน</p>

<p>แต่แล้วเมื่อโลกธุรกิจเริ่มเปลี่ยน มีโรคระบาด มีเทคโนโลยีใหม่เกิดขึ้นก็เริ่มมีลูกค้าขอ feature ที่ทำยากมากๆ และต้องแก้ไขอย่างยากลำบาก พวกเค้าต้องเลือกระหว่างปฏิเสธลูกค้าหรือเลือกที่จะปรับโครงสร้างระบบครั้งใหญ่อีกครั้ง เพราะถ้าหากพวกเค้าไม่แก้ไขโครงสร้างระบบ พวกเค้ามองเห็นแล้วว่าบริษัทน่าจะลงเอยเช่นเดียวกับบริษัท A</p>

<p>...แต่ในระหว่างที่พวกเค้ากำลังวางแผน ประเมินความเสี่ยง ออกแบบและถกเถียงกันมาหลายเดือน ก็มีบริษัทรุ่นใหม่ที่ทำ product ออกมาสู้กับพวกเค้าและตรงกับสถานการณ์ของโลกที่เปลี่ยนไป ลูกค้าก็เริ่มย้ายออกจนสุดท้ายพวกเค้าก็อยู่ไม่ได้</p>

<h2 id="บร-ษ-ท-c">บริษัท C...</h2>

<p>พวกเค้าเป็นกลุ่มคนที่มีประสบการณ์และทำ product คล้ายกับ 2 บริษัทก่อนหน้า พวกเค้ารู้ว่าลูกค้ามีความต้องการที่หลากหลายและเปลี่ยนแปลงตลอดเวลา พวกเค้ารู้ว่าความเร็วเป็นของปีศาจ แต่พวกเค้าก็ฉลาดและระวังไม่ให้ตัวเองมีจุดจบเหมือนบริษัท A</p>

<p>พวกเค้าเลือกที่จะเขียน code ในระดับที่ “พอรับได้” มี process น้อยที่สุด แทบไม่มีเอกสารอะไรเลยถ้าไม่จำเป็นจริงๆ พวกเค้า design ผ่านการคุยกันสั้นๆ แล้วไปลองทำ พวกเค้าสามารถ push code และ deploy production ได้ทันทีเพื่อให้ลูกค้าได้ทดลองใช้และเก็บ feedback มาปรับปรุงเพิ่ม รอบการ release feature ของพวกเค้าคือหลักวัน ไม่ใช่หลักสัปดาห์, เดือน, หรือไตรมาส</p>

<p>พวกเค้าสามารถออก feature สู้กับบริษัท A ได้อย่างทันเวลา ลูกค้าให้ความสนใจกับ product ของพวกเค้าเป็นอย่างมาก พวกเค้าสามารถรักษาความเร็วแบบนี้ได้อย่างดี ถึงแม้เมื่อเวลาผ่านไป ระบบมีความซับซ้อนมากขึ้น มีลูกค้ามากขึ้น พวกเค้าปล่อย feature ช้ากว่าเล็กน้อยเมื่อเทียบกับบริษัทขนาดเล็ก แต่ในภาพรวมก็ยังเร็วกว่าคู่แข่งที่เป็นบริษัทขนาดใหญ่</p>

<p>...สุดท้ายพวกเค้าก็เป็นผู้นำอันดับ 1 ในตลาด ทุกคนต่างสงสัยว่าพวกเค้าทำได้อย่างไร</p>

<h2 id="wartime-mindset">Wartime mindset</h2>

<p>ผมอ่านหนังสือเล่มหนึ่งที่พูดถึงเรื่องนี้ เค้าเปรียบเทียบการสร้างสะพานสำหรับประชาชน vs สะพานสำหรับสงครามให้เข้าใจว่า การสร้างสะพานสำหรับประชาชนมักจะใช้เวลาหลายปีในการสร้างเนื่องจากเป้าหมายคือสะพานที่มีอายุใช้งานยาวนานที่สุด แต่เมื่อเทียบกับสะพานสำหรับสงคราม ถึงแม้ว่าจะต้องให้รถถังขับผ่านซึ่งมีน้ำหนักบรรทุกมากกว่าสะพานสำหรับประชาชน แต่เป้าหมายการออกแบบของมันไม่ใช่อายุยาวนาน แต่เป็นความเร็วในการสร้างโดยยังต้องรองรับน้ำหนักของรถถังได้ มันอาจจะสามารถสร้างเสร็จได้ในเวลา 5-10 วันและถูกใช้งานแค่ 1-3 ปีแล้วเลิกใช้ไป ไม่ใช่ 50-100 ปี ดังนั้น ทั้งแนวคิด วัสดุ รูปทรง การออกแบบ กระบวนการทำงาน ทั้ง 2 แบบมีความแตกต่างกันโดยสิ้นเชิง</p>

<p>การออกแบบและพัฒนา software ก็จะต้องเลือก technology ที่ทำให้เราสามารถ release software ได้ง่ายและเร็วด้วยเช่นกัน ลองนึกถึงการ update feature บน web application ผ่าน cloud server vs การส่ง CD/DVD ให้ลูกค้าเอาโปรแกรมไป install ในเครื่อง laptop เอง ทั้ง 2 วิธีใช้เวลาในการ release ต่างกันหลายเท่าตัว</p>

<p>อย่างไรก็ตามในขณะสงคราม เวลาเป็นเรื่องสำคัญมาก แต่คุณภาพก็จำเป็นเพราะหากสะพานไม่สามารถทำหน้าที่ของมันได้ เราก็แพ้สงครามได้เช่นเดียวกัน</p>

<h2 id="post-hoc-design">Post hoc design</h2>

<p>การที่เราจะทำได้อย่างบริษัท C นั้นไม่ใช่การไม่ออกแบบอะไรเลย แต่มันคือการออกแบบภายหลัง (Post hoc design)</p>

<p>เรามักเสียเวลาประชุมว่าจะใช้ technology อะไร จะทำบน architecture อะไร จะใช้ pattern ไหนในการเขียน code และยังรวมถึงการ discuss ว่า UI/UX จะเป็นอย่างไร จะมีกี่ปุ่ม จะใช้สีอะไร จะเลือก wording ไหน สิ่งเหล่านี้เป็นสิ่งจำเป็นแต่ยังไม่สำคัญจนกว่าเราจะปล่อย product/feature ให้ลูกค้าใช้งานและคอย observe ว่ามันตอบโจทย์หรือไม่</p>

<p>เราจะไม่เสียเวลาถกเถียงกันเป็นสัปดาห์หรือเป็นเดือนเพื่อหาว่าอะไรจะตรงใจลูกค้า หรือเพื่อวางแผนเผื่อสำหรับ feature ที่อาจจะทำในอีกครึ่งปีถัดไป แต่เราจะทำงานใกล้ชิดกับลูกค้าทุกวัน ทำตามที่ลูกค้าขอเท่านั้น และให้ลูกค้าเป็นคนบอกว่าพวกเค้าต้องการอะไรหลังจากที่พวกเค้าได้ทดลองใช้งาน feature ในแต่ละ release ของเรา</p>

<p>ดังนั้นในช่วงแรกของ new product หรือ new feature ทุกๆ วันมีความสำคัญ ดังนั้นทีมจะต้องเลือก “ความเร็ว” ในการปล่อย feature ไม่ใช่ “ความยั่งยืน” เพื่อให้เราค้นหา “feature-market fit” ได้เร็วที่สุด อย่างไรก็ตามทีมยังต้องคงความสามารถทั้งหมดของ software ไว้ให้ได้ ระบบห้ามพัง ห้ามทำให้ feature เดิมมีปัญหา</p>

<p>หลังจาก feature เริ่มนิ่ง เริ่มอยู่ตัว เราจำเป็นจะต้อง “แบ่งเวลาทันที” เพื่อกลับมาทำให้มันมี “ความยั่งยืน” แต่ห้าม “ทำเผื่อ” โดยเด็ดขาด ในช่วงเวลานี้มีโอกาสน้อยมากๆ ที่จะมี requirement เปลี่ยนไปโดยสิ้นเชิง มันจึงเหมาะมากที่จะมาตามเก็บเช็ดล้าง เพื่อให้ทีมงานใช้แรง maintain น้อยที่สุด ...ถ้าหากไม่แบ่งเวลามาสุดท้ายก็อาจจะลงเอยแบบเดียวกับบริษัท A</p>

<p>การทำ post hoc design &amp; development ให้ยั่งยืนไม่ใช่การเปลี่ยนภาษา programming เปลี่ยน database หรือเปลี่ยน architecture ใหม่ทั้งหมดใหม่ แต่เป็นเพียงการ clean up ความเละเทะที่เราได้ทำไปในช่วงแรกและ enhance ระบบเพื่อให้เราทำ feature ถัดไปของลูกค้าได้ด้วยความเร็วเท่าเดิม (ถ้าไม่มี feature ถัดไปก็ยังไม่ต้อง enhance)</p>

<h3 id="reversible-vs-irreversible-decision">Reversible vs Irreversible decision</h3>

<p>การเน้นความเร็วไม่ใช่การไม่ออกแบบอะไรเลยในตอนต้น ควรระวังการตัดสินใจที่ย้อนไปแก้ไขไม่ได้หรือแก้ไขยากมากๆ</p>

<p>ยกตัวอย่างเช่น เราทำ mobile application ให้ลูกค้าใช้งานโดยให้ mobile application เชื่อมต่อกับฐานข้อมูลบน server โดยตรง ถึงแม้ว่าเราสามารถใช้ mobile developer 1 คนทำ feature เชื่อมฐานข้อมูลและปล่อย feature ได้เร็วในครั้งแรก แต่การแก้ไข feature ในครั้งถัดมานั้นยากมากๆ ทำให้ feature เดิมพัง เพราะไม่สามารถเพิ่ม/แก้ไข database column ได้ ไม่สามารถทำให้ mobile version เก่ากับใหม่ทำงานร่วมกันได้ ซึ่งไม่ใช่ “ความเร็ว” ในแบบที่ Wartime ต้องการ</p>

<p>อีกตัวอย่างคือการทำ native mobile app vs cross platform ในช่วงแรกเราอาจเลือกทำ cross platform ไปก่อนเพื่อรีบหา feature-market fit แต่เมื่อพบแล้ว เราจะเริ่มรู้ว่าจุดไหนมีปัญหาหรือไม่ตอบโจทย์ พัฒนา feature ยาก maintain ยากก็มา enhance เฉพาะหน้านั้นๆ</p>

<p>หรือการเขียน code ที่มีช่องโหว่ร้ายแรง ทำให้เกิด data leak หรือกระทบกับ financial ของบริษัทอย่างใหญ่หลวงก็เป็นสิ่งที่ต้องระวัง</p>

<p>การถกเถียงในเรื่อง code style หรือ variable naming หรือ monolith vs microservice หรือ SQL vs NoSQL เป็นเรื่องที่ยังไม่สำคัญ เราทำอะไรก็ได้ที่ทำได้เร็วเพื่อ release feature ให้ไว จากนั้นค่อยมา enhance เพิ่มในช่วงที่ feature เริ่มนิ่งได้</p>

<p>บางคนอาจสงสัยว่าการตัดสินใจเรื่องเหล่านี้ถ้าไม่เลือกตั้งแต่แรก มันจะแก้ไขยากและสร้างปัญหาในอนาคตหรือเปล่า แน่นอนว่ามีโอกาสที่จะสร้างปัญหาเมื่อมี feature-market fit เมื่อมีลูกค้าเยอะขึ้นและระบบเริ่มซับซ้อน แต่ทีมที่มี Wartime mindset จะต้องกลับมาปรับปรุงระบบให้ยั่งยืนในทันทีตลอดเวลา พวกเค้ารู้ว่า design ที่ดีคือ design ที่มีลูกค้าใช้งานจริง ทำงานได้ตามที่คาดหวังไว้ พวกเค้าเปลี่ยน technology ก็ต่อเมื่อพบว่ามันเป็นตัวถ่วงในด้านความเร็วในการปล่อย feature</p>

<hr>

<p>Wartime Software Development ไม่ใช่ script kiddy ที่เขียน code เร็วแต่ขาดประสบการณ์ แต่เป็นเทคนิค กระบวนการและประสบการณ์มากมายที่ทำทุกอย่างเพื่อเน้นไปที่​ “ความเร็ว” บนพื้นฐานของ Software ที่ต้องทำงานได้ตามความคาดหวังของลูกค้าตลอดเวลา</p>

<p>พวกเขาทำสิ่งเหล่านี้เท่าที่จำเป็นในทันทีที่ได้ส่งมอบ feature ที่ตอบโจทย์ลูกค้าสำเร็จ
– เขียน automate test เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า
– clean up ทุกอย่างและ refactor code เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า
– เขียน document เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า
– automate business process เท่าที่จำเป็นทันทีที่ feature ตอบโจทย์ลูกค้า
– สรุปบทเรียนในทุกด้านทันทีที่ feature ตอบโจทย์ลูกค้า
พวกเขาใช้เวลาไม่มากในการทำสิ่งเหล่านี้เพื่อความ “ยั่งยืน” แล้วจึงเริ่มทำ feature ถัดไปที่ตอบโจทย์ลูกค้า</p>
]]></content:encoded>
      <guid>https://tnpl.me/software-design-during-wartime</guid>
      <pubDate>Sun, 29 Sep 2024 03:08:49 +0000</pubDate>
    </item>
    <item>
      <title>Pear &amp; Sharp - งานแต่งของเรา</title>
      <link>https://tnpl.me/psiloveyou</link>
      <description>&lt;![CDATA[  คำเตือน: blog นี้ยาวมาก พยายามจะเล่ารายละเอียดให้ได้มากที่สุด เผื่อเป็นประโยชน์ให้คนกำลังวางแผนจัดงาน&#xA;  ผมจะเน้นในมุมมองของผู้ชาย ที่จะต้องขอผู้หญิงแต่งงานเป็นหลักนะครับ ผมจะเล่าเป็นเรื่องราว ไม่ได้เล่าเป็นโครงสร้างแบบเข้าใจง่าย&#xA;&#xA;อยากจะแต่งงาน เริ่มยังไง&#xA;&#xA;หลายคนไม่รู้ว่าจะต้องเริ่มยังไง ต้องขอผู้หญิงแต่งงานก่อนหรือเปล่า ผู้ใหญ่จะโอเคมั้ย ต้องทำอะไรก่อน ในตอนแรกก็งงเหมือนกันครับ แต่ก็ได้คุยกับหลายๆ คนที่แต่งงานไปก่อนหน้า ถามเค้าว่าเค้าทำอะไรบ้าง&#xA;!--more--&#xA;แต่ว่าเริ่มต้นแรกสุด คือผมถามตัวเองก่อนว่า คนนี้คือคนที่เราอยากจะอยู่ไปตลอดใช่ไหม ในตอนนั้นเราคบกันมาสัก 2 ปีนิดๆ ผมโอเคมากๆ เลย เพราะแพรรับฟังผม แพรเปิดใจให้คน geek นิดๆ อย่างผมได้มีมุมของตัวเอง ผมเคยสอนแพรเขียนโปรแกรม แพรก็พยายามเรียนแบบน้ำตาซึมๆ ไป สุดท้ายผมก็เลิกสอนเค้าเพราะไม่มีประโยชน์ที่จะไปบังคับในสิ่งที่เค้าไม่ถนัด แต่นั่นแหละ แพรพยายามจะเข้าใจเรา เรียนรู้เรา ไม่พยายามจะยัดเยียดตัวเค้าเข้ามามากเกินไป เราก็มีความตึงๆ ใส่กันบ้างบางครั้ง แต่เราก็คุยกันด้วยดี แก้ปัญหาได้ทุกครั้ง ไม่เคยมีทิ้งปมเอาไว้รอระเบิดภายหลัง แพรเป็น supporter ที่ดีมากๆ สุดท้ายผมก็คิดว่า แต่งกับคนนี้แหละ เราน่าจะไปกันรอดจนแก่เฒ่าด้วยกัน&#xA;&#xA;จากนั้นผมก็ไปเม้ากับแก๊ง engineering manager ที่ทำงานด้วยกัน ถามเค้าง่ายๆ ว่า&#xA;&#xA;  เราขอผู้หญิงแต่งงานเลยได้ไหม หรือต้องทำอะไรก่อน&#xA;&#xA;มี Arm แชร์ให้ฟังว่า ของเค้าคือต้องให้ผู้ใหญ่ไปเจอกันก่อน ไปพูดคุยกัน เพราะถ้าเราขอกันเองเรียบร้อย แล้วค่อยไปบอกผู้ใหญ่ ถ้าผู้ใหญ่เค้าไม่ OK กันและกัน มันจะเป็นเรื่องเอา&#xA;&#xA;และก็มีคนอื่นๆ พูดทำนองเดียวกัน บางคนก็บอกว่าขอกันเองเลยก็ได้ ถ้ามั่นใจว่าจะไม่แป๊ก ทั้งคู่เราและผู้ใหญ่&#xA;&#xA;  แล้วมันจะแปลกมั้ย ที่ผู้ใหญ่ไปคุยกัน คุยกันไว้ว่าลูกๆ เราจะแต่งงาน อย่างนี้ผู้หญิงเค้าก็รู้หมดน่ะสิ เดี๋ยวจะไม่ surprise นะ&#xA;&#xA;ผมก็ถามทุกคนไปและก็เช็คเพิ่มเติมกับคนอื่นๆ ที่ผมรู้จัก ซึ่งทุกคนบอกว่า &#34;จริงๆ ผู้หญิงเค้าก็ต้องรู้อยู่แล้วรึป่าวว่าเดี๋ยวเราจะแต่งงานกัน เพียงแต่เค้าไม่รู้ว่าวันไหน&#34; ดังนั้นเวลาที่ผู้ใหญ่ไปคุย ก็อย่าเพิ่งกำหนดวัน ปล่อยให้เค้าลุ้นไปก่อน&#xA;&#xA;  สุดท้ายผมก็ตัดสินใจว่าเดี๋ยวจะให้ผู้ใหญ่ไปเจอกันก่อน&#xA;&#xA;แต่ก่อนที่ผู้ใหญ่จะไปเจอกัน มันก็มีเรื่องให้ต้องคิด ต้องเตรียมตัวเยอะพอสมควรเลยนะ&#xA;&#xA;ก่อนผู้ใหญ่เจอกันครั้งแรก&#xA;&#xA;เรื่องราวก่อนที่ผู้ใหญ่จะเจอกัน มันจะไม่ได้เป็นเส้นเรื่องแบบเส้นตรงๆ เพราะในความเป็นจริงมันโคตรจะพันกันยุ่งเหยิงมากๆ&#xA;&#xA;เริ่มจากว่า เราพยายาม sense ให้ได้ก่อนว่าแพรเค้าอยากจะแต่งกับเราใช่ไหม ผมก็คอยถามไปเรื่อยๆ วันละนิด วันละหน่อย เช่น&#xA;&#xA;แพรดูชอบเด็กเนอะ อยากได้ลูกชายหรือลูกสาว&#xA;แพรอยากจะไปอยู่ที่ไหน?&#xA;ถ้าวันนึงชีวิตพี่เป็นขาลง เกิดลำบากขึ้นมา แพรโอเคหรือเปล่า&#xA;คบกันมาแล้วเป็นไง มีตรงไหนที่ชอบและไม่ชอบบ้าง&#xA;&#xA;คำถามพวกนี้มันก็ช่วยเพิ่มความมั่นใจทั้งคู่แหละ แพรเองก็น่าจะรู้สึกว่าเราจริงจังกับเค้านะ ไม่ใช่คบเล่นๆ&#xA;&#xA;พอเรามั่นใจประมาณนึงแล้วว่าแพรไม่น่าจะปฏิเสธ ก็เริ่มคุยเรื่องผู้ใหญ่กับแพรบ้าง หลักๆ คือ ผู้ใหญ่บ้านแพรชอบเราไหม, ผู้ใหญ่บ้านเราชอบแพรหรือเปล่า และก็เรื่องที่ยากที่สุดคือเรื่องสินสอดและเรือนหอ&#xA;&#xA;สำหรับผู้ใหญ่ทางบ้านแพร เนื่องจากผมไปที่บ้านแพรอยู่บ่อยๆ คอยช่วยงานผู้ใหญ่ ก็ดูจะไม่ค่อยเป็นปัญหาเท่าไร แต่สำหรับแพรเองที่แทบจะไม่เคยได้เจอแม่ของฝั่งผู้ชายเลยก็ค่อนข้างจะยาก เพราะว่าแม่ของผมอยู่ต่างประเทศตลอด ผมเองก็แทบไม่ได้เจอเลย และยิ่งช่วง covid ก็คือไม่ได้กลับไทยเลยเกือบ 2 ปีเต็มๆ ซึ่งผมกับแพรก็คบกันมาตลอดช่วง covid นี่แหละ แพรและแม่ก็เลยแทบจะไม่เคยได้คุยอะไรกันเลยสักนิด&#xA;&#xA;ผมเองก็ไม่รู้นะว่าแม่ผมโอคเกับแพรหรือเปล่า แต่ผมโอเค ดังนั้นผมมีหน้าที่ทำให้แม่โอเคด้วย 555&#xA;&#xA;มีช่วงเดือน May 2022 ได้บินไปเจอแม่และไปเที่ยว ก็เลยได้คุยกับแม่จริงจังเรื่องแต่งงาน คือบทสนทนากับแม่มันจะข้ามขั้นไปเลย เพราะ relationship ในบ้านแต่ละบ้านก็คงไม่เหมือนกัน ผมสามารถคุยตรงๆ กับแม่ได้ แม่ก็รับฟังและแม่ก็ให้ความเห็นในเรื่องต่างๆ เราก็ฟังและต่อรองกันไป หลักๆ ก็คือคุยกับแม่ว่าจะแต่งงานนะ แม่กังวลอะไรไหม เราพอรู้อะไรบ้างเราก็บอกความคิดของเราให้แม่ฟังไป เช่น แต่งงานแล้วไปอยู่บ้านไหน แพรจะย้ายเข้ามาหรือว่าชาร์ปจะต้องย้ายไปอยู่กับแพร (เราตกลงกันว่าจะอยู่ทั้ง 2 บ้านสลับกันไป ไม่ซื้อบ้านหรือปลูกเรือนหอใหม่ แต่จะอยู่บ้านผมเยอะกว่านิดหน่อยเพราะเป็นส่วนตัวกว่า) เรื่องจิปาถะอื่นๆ รวมถึงเรื่องสินสอดด้วย&#xA;&#xA;  เรื่องสินสอดผมจะไม่ขอพูดตัวเลขนะครับ แต่จะใช้ตัวแปรแทน เช่น A, B แบบนี้&#xA;&#xA;ประเด็นเรื่องสินสอดก็ค่อนข้างซับซ้อน ก่อนหน้าที่ผมจะคุยกับแม่ตอนที่บินไปต่างประเทศ ผมก็ลองถามแพรไปก่อนว่าเคยถามพ่อแม่แพรหรือเปล่าว่าจะเรียกสินสอดเท่าไร แต่กว่าที่ผมจะได้ตัวเลขมาก็ถามหลายรอบเหมือนกัน เพราะทางพ่อแม่แพรบอกว่า &#34;แล้วแต่เราสะดวก&#34; ซึ่งมันไม่ช่วยอะไรเลย เราก็ไม่รู้ว่าจะให้เท่าไร โชคดีที่พี่ชายแพรแต่งงานก่อนหน้านี้ ก็เลยเอาเลขนั้นมาเป็นเลขอ้างอิงก่อน รวมถึงแพรก็ลองถามพ่อแม่แบบติดตลกไปด้วย พ่อแม่ก็บอกเลขมาใกล้เคียงกับของพี่ชายแพร&#xA;&#xA;แต่ว่าเลขที่ได้มาอันนี้ คือทางผู้ใหญ่เค้ายังไม่เคยไปตกลงกันเลยนะครับ ผมและแพรแค่พยายามไปสืบว่าผู้ใหญ่แต่ละท่านมองตัวเลขไว้ที่เท่าไร ผมไม่ปล่อยให้ผู้ใหญ่ไปเจอกันแล้วไปคุยเรื่องตัวเลขกันหน้างานแน่ๆ ห่วงว่าจะเหมือน pantip ที่มาเล่ากันว่าผู้ใหญ่ทะเลาะกันจนลูกๆ เครียดมาก ไม่ได้แต่งงาน&#xA;&#xA;พอผมได้ตัวเลขสินสอดเป็นเงิน A บาท ทองคำ B บาท ผมก็คุยให้แม่ผมฟังในวันที่บินไปหา จริงๆ เงินและทองจำนวนนั้น ผมก็มีเตรียมไว้เรียบร้อยแล้ว แต่เงินผมอาจจะยังไม่พอสำหรับจัดงานแต่งซึ่งต้องใช้เวลาเก็บเงินเพิ่มอีก แม่ก็ค่อนข้างเป็นห่วงเพราะครอบครัวเราฐานะลำบากมาโดยตลอด ไม่อยากให้ต้องใช้เงินเยอะขนาดนี้ เลยจะขอลดจำนวนลงหน่อย (ทุกคนอย่าลืมว่าในช่วงที่คุยกันเรื่องสินสอด ฝ่ายแพรไม่รู้เรื่องนี้ เพราะฝ่ายแพรได้แต่ให้ข้อมูลผมมาอย่างเดียว)&#xA;&#xA;พอกลับจากไปเที่ยว ผมก็คิดหนักมากถึงจำนวนที่แม่ขอต่อรองลงมา แล้วก็ต้องค่อยๆ ไปไล่คุยกับแพร พอแพรเข้าใจ ก็เลยบอกแพรว่า จะขอไปคุยกับพ่อแม่แพรเรื่องแต่งงานและเรื่องสินสอดหน่อย แล้วแพรก็นัดพ่อแม่ให้&#xA;&#xA;ผมไม่รู้ว่าบ้านอื่นจะทำแบบนี้ได้ไหม แต่สำหรับผมกับผู้ใหญ่ทางบ้านแพร ผมรู้สึกว่าเค้ารับฟัง ไม่ได้มองเราว่าเป็นเด็ก ไม่ได้มองว่าเรื่องนี้ต้องให้ผู้ใหญ่มาคุยกันเท่านั้น คือผมสามารถไปคุยกับท่านได้ตรงๆ และประกอบกับแม่ผมก็ไม่อยู่ไทย การที่ผมไปคุยกับผู้ใหญ่ทางบ้านแพรได้เองมันทำให้ผมเตรียมเรื่องต่างๆ ได้สะดวกขึ้นมาก&#xA;&#xA;พอวันที่ไปคุยจริงๆ กับพ่อแม่แพร เราก็เริ่มเปิดไปก่อนว่า ผมจริงจังกับแพร อยากจะแต่งงานกับแพร พ่อแม่ติดอะไรไหม จากนั้นก็มาคุยเรื่องจิปาถะ เช่น อยู่ที่ไหน วางแผนชีวิตยังไง ฯลฯ ซึ่งทั้งหมดก็คือผมและแพรก็ได้คุยกันมาก่อนหมดแล้ว ท่านก็ถามเรื่องงานแต่งว่ามีรายละเอียดยังไงบ้าง ผมก็แจ้งไปว่ารายละเอียดยังไม่มี เดี๋ยวจะมาคุยแยกอีกรอบ สุดท้ายก็จบเรื่องสินสอด ผมก็เล่าไปว่า แพรเคยบอกมาว่าพ่อและแม่จะเรียกสินสอดเท่านี้ใช่ไหม แต่ผมอาจจะไม่สามารถให้ได้เท่าที่พ่อและแม่ขอมา อาจจะขอลดลงหน่อย พ่อแม่แพรก็เข้าใจ ก็จบลงด้วยดี&#xA;&#xA;แต่จบตรงนี้ก็ยังไม่ถือว่าตกลงสินสอดกันนะครับ อันนี้แค่ลองสอบถามเพื่อดูปฏิกริยาก่อนว่าจะมีปัญหาไหม เพราะตัวเลขจริงๆ ต้องให้ผู้ใหญ่มาแจ้งกันอีกทีนึง&#xA;&#xA;ผู้ใหญ่มาเจอกันวันแรก&#xA;&#xA;แม่บินกลับมาไทยอยู่ช่วงนึงไม่นานมาก ก็เลยจองคิวแม่เอาไว้ว่าจะให้ไปคุยกับผู้ใหญ่ฝ่ายแพรเรื่องแต่งงาน ก็ตกลงวันเวลากับทั้ง 2 ฝ่ายไว้เรียบร้อย แต่ก่อนจะถึงวันนั้น ฝ่ายผู้ชายก็ต้องทำการบ้านไว้ก่อน&#xA;&#xA;ผมนั่งคุยกับแม่ เราจดหัวข้อต่างๆ ที่แม่จะต้องไปคุยให้เรียบร้อย เราเตรียมบทกันว่าจะคุยกันยังไง เช่น วันนั้นเราจะไปที่บ้านแพร ทางบ้านแพรจะเตรียมอาหารไว้ต้อนรับเรา เราก็จะคุยกันเรื่องแต่งงาน ฯลฯ&#xA;&#xA;ในหัวข้อที่คุย ผมเตรียมกับแม่ไว้ประมาณนี้&#xA;&#xA;แต่งเข้าบ้านไหน: แพรกับผมตกลงว่าจะเข้าบ้านผม แต่ผมก็จะต้องไปอยู่บ้านแพรบ้างบางครั้ง เพราะทั้ง 2 บ้านก็มีผู้ใหญ่ที่คอยดูแล&#xA;พิธีการในงานแต่ง: เราจะจัดแบบไทย ในพิธีจะมีอะไรบ้าง เราเอาแค่พิธีสงฆ์ ขันหมากไทย หมั้น รับไหว้ งานฉลอง แล้วก็ตกลงกันว่าจะไม่เอาอะไร เช่น ไม่เอารดน้ำสังฆ์&#xA;เรื่องจิปาถะในงานแต่ง: แขกประมาณกี่คน ตอนแรกอยากจะจัดเล็กๆ แบบไม่เกิน 100 คนเพราะไม่อยากใช้เงินเยอะ แต่พอผู้ใหญ่คุยกันก็จบลงที่ต้องจัดงานใหญ่ขึ้น รวมไปถึงเรื่องอาหารขอเป็นโต๊ะจีน และก็เรื่องอื่นๆ ที่ทางผู้ใหญ่อยากจะขอ lock ไว้ ส่วนอะไรที่ยังไม่มั่นใจผมขอเอามาทำการบ้านแล้วจะไปอัพเดทให้ทีหลัง&#xA;เรื่องเงินๆ ทองๆ: สินสอดตกลงกันที่เท่าไร เรื่องซองในงานแต่งใครดูแล ค่าใช้จ่ายงานแต่งทั้งหมดจะออกยังไง (ผมกับแพรตกลงกันว่าจะหารครึ่งเท่ากัน) สินสอดพ่อแม่แพรบอกว่ามอบคืนให้เราไปใช้ตั้งตัว&#xA;แต่งวันไหน: ผมบอกแม่ว่ายังไม่ให้บอกวัน เดี๋ยวผมจะไปหาแล้วบอกเองทีหลัง ตรงนี้เราเก็บเรื่องวันเอาไว้ surprise ขอแต่งงานแพร&#xA;&#xA;พอดีวันที่ไปคุย ผมไม่สบายพอดี เป็นไข้สูง (ไข้ 39.4) ก็เลยรีบคุยรีบกลับ แล้ววันถัดมาผมก็ไป admit โรงพยาบาลยาวๆ แต่วันนั้นก็ถือว่าผ่านมาได้อย่างราบรื่น พ่อแม่แพรบอกว่าวันนั้นก็เลยไม่ได้เลี้ยงอาหารแม่ผมเลยเพราะผมไม่สบาย&#xA;&#xA;หาฤกษ์งานแต่ง&#xA;&#xA;การหาฤกษ์เป็นเรื่องใหญ่มากเหมือนกัน ผมเป็นคนที่ไม่ถือฤกษ์ ไม่ดูฮวงจุ้ยใดๆ ดังนั้นผมไม่เคยสนใจอยู่แล้ว แต่ว่าผู้ใหญ่ก็อยากจะให้ดูมาหน่อยเป็นมงคล แพรเองก็อยากให้ดู&#xA;&#xA;ในตอนแรกสุดคุยกันว่าผมจะไปดูฤกษ์กับพระอาจารย์ที่จันทบุรี เพราะเป็นที่ๆ แม่ผมนับถือ แต่ความยากมันคือ ปกติแล้วเวลาดูฤกษ์ คู่บ่าวสาวก็จะต้องไปพร้อมกัน พอพระอาจารย์ท่านบอกวันมา ก็จะกลายเป็นแพรรู้วันทันที ก็จะอด surprise อีกส่วนคือการไปจันทบุรีมันก็ต้องใช้เวลา ลางาน ขับรถไกล และต้องติดต่อพระอาจารย์ นัดวันเวลา ค่อนข้างจะยุ่งยาก ผมเลยคุยกับแม่ว่าคงจะไม่ได้ไปหาพระอาจารย์&#xA;&#xA;ถัดมาผมพยายามดูฤกษ์ตามที่ตัวเองสะดวกก่อน หลักเกณฑ์ที่ผมดูคือ&#xA;&#xA;มีเวลามากพอในการเตรียมงานแต่งทั้งหมด ผมคิดว่าอยากจะได้เวลาเผื่ออย่างน้อย 6 เดือน&#xA;ไม่เอาหน้าร้อน เพราะเคยคุยกับแพรว่าเผื่ออยากจะจัดงานแบบ outdoor&#xA;มีเวลาให้ผมได้เก็บเงินเพิ่มอีกหน่อย สำรองเอาไว้&#xA;ขอวันหยุด วันเสาร์ อาทิตย์ หรือดีหน่อยถ้าตรงกับหยุดยาว&#xA;&#xA;จากนั้นก็ไปพยายามหาฤกษ์มงคลทาง internet ผมชอบเว็บนึงมากๆ อยากแนะนำ&#xA;&#xA;79hora&#xA;79hora.com - ฤกษ์แต่งงาน&#xA;&#xA;เราก็ไปดูวันที่มันเป็นสีชมพูๆ หรือมีคะแนนสูงๆ ไว้ก่อน ว่าจะเป็นช่วงประมาณไหน ในเว็บนี้ผมได้วันที่ชอบอยู่ประมาณเดือนสิงหาคม หรือ กันยายน ซึ่งห่างจากวันที่ผู้ใหญ่ไปคุยกันประมาณ 11-12 เดือน ผมมองว่ามันนานเกินไป&#xA;&#xA;อีกเว็บนึงที่ไปดูก็คือ อาจารย์ณภัทร ศรีจักรนารท (Astro Neemo) อันนี้เราต้องเสียเงินดู โดยเราส่งวันเดือนปี เวลาเกิดของคู่บ่าวสาวไปให้ แล้วเค้าก็จะส่งวันเวลากลับมาให้เรา สุดท้ายก็ได้วันที่ 7 พ.ค. กลับมา พร้อมรายละเอียดยาว 3 หน้ากระดาษ A4 มีตั้งแต่รายละเอียดการทำพิธีการต่างๆ เวลาสวมแหวน เวลารดน้ำสังฆ์ เวลาส่งตัว ซึ่งกว่าจะถึงวันที่ 7 พ.ค. ก็จะได้ระยะเวลาประมาณเกือบ 8 เดือน ซึ่งก็ใกล้เคียงกับที่เราอยากได้พอดี&#xA;&#xA;พอได้วันแล้ว เราก็เก็บไว้เป็นความลับ ผมบอกให้แม่รู้ไว้แล้ว แต่ผมไม่บอกแพรและผู้ใหญ่ของแพร&#xA;&#xA;Surprise ขอแต่งงาน&#xA;&#xA;จากวันที่ผู้ใหญ่ไปคุยกัน แพรก็พยายามถามตลอดว่าจะแต่งเมื่อไร ไปหาฤกษ์มาหรือยัง ผมก็บอกว่ายัง ทำตัวเป็นไม่รู้ ไม่ได้ดู ระหว่างนี้ก็ดูรายละเอียดการจัดงานไปพลางๆ เช่น จะจัดงานประมาณไหน จะจัด style ยังไง แบบห้อง ballroom หรือแบบริมทะเล จัดในกรุงเทพหรือต่างจังหวัด แพรอยากได้ rooftop ผมอยากได้ outdoor เราอยากได้ long table มีให้เลือกหลากหลายมากจนไม่รู้จะเลือกอะไร พยายาม survey สถานที่ต่างๆ ถามราคา แต่ก็ติดปัญหาว่าเราบอกวันที่จะจัดไม่ได้ ทางสถานที่ก็ได้แต่แนะนำรายละเอียดคร่าวๆ ถ้าเราไม่มีวันไปแจ้งเค้า ทางสถานที่ก็เช็คไม่ได้ว่าวันนั้นว่างไหม เพราะบางสถานที่ถูกจองเต็มล่วงหน้า 8-12 เดือน โดยเฉพาะวันที่ฤกษ์ดีมากๆ แต่วันที่เราได้มาไม่ได้เป็นวันมหาฤกษ์แบบนั้นก็โชคดีไป&#xA;&#xA;ช่วงนี้เราก็แอบไปเตรียมแหวนสำหรับขอแต่งงาน หาทางวัด size แหวนแพร ไปสั่งทำแหวน เรื่องแหวนก็เป็นเรื่องที่ปวดหัวเหมือนกัน&#xA;&#xA;ผู้หญิงจะได้แหวนจากผู้ชายทั้งหมดกี่วง? วงที่เราเอาไปขอแต่งงานจะเป็นวงเดียวกับในงานแต่งหรือเปล่า? ผมหาข้อมูลมาเยอะมาก สรุปให้ง่ายๆ ตามนี้&#xA;&#xA;แหวนที่ขอแต่งงาน ให้แล้วให้เลย ถ้าขอแต่งงานไปแต่เกิดเหตุไม่คาดฝัน งานแต่งล่ม ผู้ชายห้ามไปทวงของคืนเด็ดขาด ยกเว้นตกลงกันไว้ดิบดีว่าจะขอคืน&#xA;แหวนที่ขอแต่งงาน ไม่จำเป็นต้องมูลค่าสูง ด้วยเหตุผลตามข้อ 1&#xA;แหวนขอแต่งงาน อยากจะเลือก style ไหนก็เลือกไปตามความชอบ จะเอาแบบ infinity ring หรือแบบเพชรชู ก็แล้วแต่ตามงบประมาณที่มี&#xA;แหวนที่ใช้ในพิธีสวมแหวน ควรจะเป็นแบบเพชรชู และควรจะดูอลังการหน่อย และผู้หญิงควรจะไปเลือกด้วยตัวเอง&#xA;&#xA;ดังนั้นนผู้หญิงจะได้แหวนที่ถูกขอแต่งงาน 1 วง ถ้าจะเอาแหวนนั้นไปใช้ในพิธีด้วยก็ได้ หรือจะซื้อใหม่เพิ่มอีก 1 วงสำหรับใช้ในพิธีก็ได้ และผู้ชายก็จะมีแหวนของตัวเองอีก 1 วง&#xA;&#xA;สำหรับในเคสของผมคือมีทั้งหมด 3 วง โดยแหวนขอแต่งงาน ผมเลือกแบบ infinity ring มีเพชรเล็กๆ ล้อมรอบทั้งวง ก็จะใส่ง่ายในชีวิตประจำวัน ใส่ติดมือได้ ไม่จำเป็นต้องซื้อแหวนเกลี้ยง และแพรเองก็ชอบใส่เพชรกับ white gold อยู่แล้ว&#xA;&#xA;พอได้แหวนสำหรับขอแต่งงาน ก็เหลือแค่ไป surprise ผมก็หาสถานการณ์ที่เหมาะสมอยู่นานมาก ไม่รู้เหมือนกันว่าจะขอตอนไหน โชคดีมีวันที่ไปเที่ยวน่านพอดี ก็เลยเล็งว่าจะไปขอตอนนั้น บรรยากาศน่าจะดี วิวน่าจะสวยและก็สงบหน่อย&#xA;&#xA;Surprise&#xA;&#xA;เอาจริงๆ เวลาจะขอแต่งงานมันตื่นเต้นมากๆ นะ ใจเต้นรัวๆ บางทีเราก็เขินผู้คนเหมือนกัน แต่อยากจะบอกผู้ชายทุกคนที่จะขอแต่งงานว่า อย่าไปเขิน ทุกคนที่เห็นเหตการณ์เค้าส่งกำลังใจ เค้ายินดีให้กับเรา เราไม่ได้ทำเรื่องน่าอายใดๆ เพราะฉะนั้นอย่ากลัวที่จะขอแต่งงานต่อหน้าผู้คน ผมคิดว่ามันน่ารักมากๆ&#xA;&#xA;จังหวะที่จะขอแต่งงาน สิ่งที่ต้องทำคือ ตั้งสติให้ดี อย่าลืมใจความสำคัญที่จะพูดกับเจ้าสาวของเรา The show must go on. พลาดอะไรไปก็ช่างมัน ไม่มีใครรู้หรอกว่าเราพูดครบหรือไม่ครบ&#xA;&#xA;หลังจากที่ขอแต่งงานเสร็จ เราก็บอกวันแต่งให้แพรและพ่อแม่แพรรู้ พอกลับจากไปเที่ยว ก็เริ่มลุยเตรียมงานแต่งเต็มกำลัง&#xA;&#xA;งานแต่งด่านแรก: งบประมาณและสถานที่&#xA;&#xA;เรื่องสถานที่ จำนวนแขก เป็นสิ่งสำคัญที่สุดที่จะกระทบกับงบประมาณ สิ่งแรกที่เราควรทำคือ ตั้งวงเงินสูงสุดที่เราจะจ่ายสำหรับจัดงานแต่งเสียก่อน สำหรับผมกับแพรสิ่งที่เราทำคือ เราดูว่าเราพอรับค่าใช้จ่ายได้ที่เท่าไร ตอนแรกเรามองว่าอยากจะจัดให้อยู่ในราคาประมาณ 500,000 - 600,00 บาท จากนั้นเราก็ไปเริ่ม survey ราคา&#xA;&#xA;  อยากบอกทุกคนว่า ค่าใช้จ่ายจริง มักจะเป็น 2 เท่าของงบที่เราตั้งไว้ตอนแรก ดังนั้นเตรียมเงินเผื่อๆ กันไว้ด้วยครับ&#xA;&#xA;Venue&#xA;&#xA;เราเริ่มติดต่อสถานที่ นัดวันเข้าไปดูสถานที่จริง เก็บข้อมูลราคา ค่าอาหารต่อหัวของแขก รวมถึง package ของแถมต่างๆ เอาไว้ เราหาสถานที่มากกว่า 20 ที่ ติดต่อไปจริงๆ ประมาณ 10 กว่าที่ ได้ข้อมูลมาเปรียบเทียบกัน&#xA;&#xA;หลักๆ ค่าใช้จ่ายมันแบ่งสัดส่วนกันประมาณนี้&#xA;ค่าอาหารของแขก ~50-60% ของงบประมาณ&#xA;ค่าสถานที่ ค่าตกแต่ง ~30% ของงบประมาณ&#xA;จิปาถะ เช่น ค่าชุดแต่งงาน ค่ารองเท้า ช่างแต่งหน้า รันคิว ขันหมาก พิธีกร ฯลฯ ~10-20% ของงบประมาณ&#xA;&#xA;ดังนั้นถ้าต้องการคุมงบประมาณให้อยู่หมัด สิ่งที่ต้องใส่ใจมากๆ คือ อาหารและสถานที่&#xA;&#xA;ปกติแล้วสถานที่แต่งละแห่งจะ bundle อาหารเข้าไปด้วย บางแห่งสถานที่สวยมาก ค่าสถานที่ไม่แพงแต่ค่าอาหารต่อหัวแพงลิบลับ ราคาอาหารต่อหัวที่ survey ในกรุงเทพและปริมลฑลมีตั้งแต่ หัวละ 800 บาท ไปจนถึง 2,500 บาท แต่โดยทั่วไปของในกรุงเทพ ค่าอาหารต่อหัวจะอยู่ที่ประมาณ 1,400 บาท&#xA;&#xA;จำนวนแขกในงานของผมรวมทั้งผู้ใหญ่และเพื่อนๆ ผมกับแพร อยู่ที่ ~350 คน คิดเป็นเงินค่าอาหารทั้งหมด 490,000 บาทเป็นอย่างน้อย ซึ่งยังไม่รวมค่าอื่นๆ อีกมากมาย ดังนั้นงบประมาณ 500,000 - 600,000 ที่วางไว้นั้นไม่สามารถทำได้จริง&#xA;&#xA;สุดท้ายเราก็เลือกที่จะปรับงบประมาณเพิ่ม เพราะเราต้องจัดงานในกทม เพื่อให้แขกเดินทางมาสะดวก เราตั้งงบประมาณใหม่ไว้ที่ประมาณ 800,000 - 900,000 บาท&#xA;&#xA;ถัดมา สิ่งที่ต้องดูในการเลือกสถานที่ก็คือจำนวนแขก บางสถานที่รับได้แค่ 180 คน บางแห่งรับได้แค่ 250 คน มีแค่ไม่กี่สถานที่ ที่สามารถจุได้ 350 คนในครั้งเดียว และสถานที่ที่จุคนได้มากๆ ก็จะไม่สวยถูกใจแพร หรือไม่ก็คืออยู่ไกลมาก เช่น นนทบุรี เดินทางลำบาก ไม่ติดรถไฟฟ้า เป็นต้น&#xA;&#xA;โดยเฉลี่ยแล้ว ถ้าจะให้เลือกสถานที่ได้ง่ายหน่อย มีตัวเลือกมากๆ จำนวนแขกควรจะอยู่ที่ประมาณ 150-180 คน แต่ถ้าเกินกว่านี้ ตัวเลือกที่เหลือมักจะเป็นห้อง ballroom ของโรงแรม&#xA;&#xA;บางสถานที่ก็มี decoration ให้เลยในตัว บางสถานที่ไม่มี decoration ให้ก็ต้องไปจ้าง organizer เข้ามา ซึ่งส่วนใหญ่สถานที่จะมี organizer ที่เป็น partner อยู่แล้ว เราสามารถสอบถามกับทางสถานที่ได้เลย แต่การตกแต่งโดย organizer ก็จะมีค่าตกแต่งเพิ่มเติม ขึ้นอยู่กับความอลังการที่เราอยากได้ เริ่มต้นที่ผมรู้ก็จะประมาณ 50,000 บาท ซึ่งก็มักจะได้ backdrop ทางเข้างานและตกแต่งสถานที่ประปรายเพียงนิดหน่อยเท่านั้น ถ้า option จัดเต็มหน่อยก็จะประมาณ 100,000 - 150,000 บาท&#xA;&#xA;บางสถานที่ก็จะมีขันหมากและของแถมต่างๆ เพิ่มให้ด้วย ผมแนะนำว่าเรื่องขันหมากและของแถมพวกนี้ไม่จำเป็นต้องสนใจมาก เพราะเดี๋ยวเราจะต้องจ้างทีมงานรันคิวเข้ามา แล้วทีมงานมักจะมีสิ่งเหล่านี้พ่วงเป็น package มาให้เลย ดังนั้นเลือกสถานที่โดยเน้นปัจจัยด้าน อาหาร จำนวนแขก การตกแต่ง การเดินทาง เป็นหลักก็เพียงพอ&#xA;&#xA;สุดท้ายเราก็ไปจบที่โรงแรม Pullman Bangkok Hotel G ที่เลือกที่นี่เพราะว่าได้ห้อง ballroom ชั้นบนสุดของโรงแรม และได้ภาพ pre-wedding เป็นชั้นดาดฟ้าของโรงแรมตามที่แพรอยากได้ ส่วนเรื่องราคาก็อยู่ในเกณฑ์รับได้&#xA;&#xA;ปัญหาเดียวของโรงแรมนี้คือห้อง ballroom รับคนได้แค่ ~230 คน ดังนั้นเราต้องแบ่งคนออกเป็น 2 กลุ่ม แล้วจัดงาน 2 รอบ ซึ่งก็เพิ่มค่าใช้จ่ายไปอีกพอสมควร แต่อีกเหตุผลคือ ผมอยากจัดงานเด็กแยกจากงานผู้ใหญ่ เพื่อจะได้คุม mood &amp; tone ของงานเด็กได้เต็มที่ แถมมี after party แบบสุดเหวี่ยงด้วย&#xA;&#xA;rooftop&#xA;&#xA;งานแต่งด่านที่ 2: ทีมงานต่างๆ&#xA;&#xA;นอกจากสถานที่ อาหารแล้ว ก็มีจะมีเรื่องทีมงานที่เราจะต้องจัดการเยอะมากๆ&#xA;&#xA;ร้านชุดบ่าวสาว&#xA;ทีมงาน pre-wedding&#xA;ทีมงานช่างแต่งหน้า ทำผมบ่าวสาว&#xA;ทีมงาน organizer ที่จัดการเรื่องการตกแต่งสถานที่&#xA;ทีมงานของฝ่ายสถานที่ เราต้องคอยประสานเจ้าของสถานที่ตลอด รวมถึงเรื่องอาหารด้วย&#xA;ทีมงาน รันคิว ที่คอยดูแลเรื่องคิวพิธีการต่างๆ&#xA;ทีมงานช่างภาพ คอยเก็บภาพบรรยากาศ&#xA;ทีมงานนักดนตรี เครื่องเสียง สำหรับปาร์ตี้&#xA;เพื่อนบ่าวสาว&#xA;พ่อแม่ของบ่าวสาว และญาติคนสำคัญต่างๆ&#xA;แขก VIP เช่น ผู้อาวุโสฝ่ายเจ้าบ่าว เจ้าสาว และประธานในพิธี&#xA;พิธีกรในงานฉลอง และนายพิธีในงานพิธีการไทย&#xA;พระสงฆ์&#xA;เจ้าหน้าที่จดทะเบียนในงานแต่ง&#xA;supplier ต่างๆ ที่เราอาจจะติดต่อ เช่น สั่งเครื่องดื่ม alcohol, ทำการ์ด, ของชำร่วย, ของรับไหว้, ฯลฯ&#xA;&#xA;ถ้าไม่อยากปวดหัวในสิ่งเหล่านี้ แนะนำให้จ่ายเงินจ้าง organize หรือ wedding planner ดูแลให้ทั้งหมดแทนนะครับ (ใช้เงินแก้ปัญหา) แต่ผมไม่จ้างครับ จะทำเองทั้งหมด 555&#xA;&#xA;ทุกคนก็ค่อยๆ ไล่ติดต่อไปตามลำดับนะครับ แล้วผมจะค่อยๆ อธิบายในแต่ละเรื่องไป&#xA;&#xA;เรื่องที่ 1: ชุดบ่าวสาว&#xA;ปกติแล้วรูปแบบของชุดมีตั้งแต่ ชุดเช่า (เป็นชุดที่ร้านเคยตัดไว้แล้ว เราแค่เช่าใส่ แก้ size ได้แค่นิดหน่อย) ชุดเช่าตัด (ตัดให้ใหม่ แต่จบงานแล้วไม่ได้ชุดกลับไป ร้านจะเอาไปให้คนอื่นเช่าต่อ) ชุดตัดซื้อ (ตัดใหม่ ได้ชุดกลับไปด้วย) ผมแนะนำให้คุมงบประมาณดีๆ เพราะชุดเจ้าสาวนั้นมีตั้งแต่ราคาถูกเฉียดๆ หมื่น ไปจนถึงหลายแสน แต่สำหรับชุดเจ้าบ่าวที่ปกติจะเป็นสูทก็จะไม่แพงมากอยู่แล้ว&#xA;&#xA;ปกติแล้วร้านจะขายเป็น package ชุดเจ้าสาว 1 ชุด ได้ชุดเจ้าบ่าวมาด้วยคู่กัน ราคาโดยเฉลี่ยอยู่ที่ ~20,000 บาท ต่อ 1 set (แบบที่ร้านได้กำไรแล้วด้วย) ดังนั้นถ้าเราได้ราคาแพงกว่านี้ ก็ควรจะดูว่ามันคุ้มค่าจริงไหม&#xA;&#xA;เรื่องเทคนิคหมกเม็ดของร้านชุดเจ้าสาวคงไม่พูดถึงนะครับ ขอให้ทุกคนไปตามหาเอาใน internet&#xA;&#xA;สิ่งที่แนะนำให้ทุกคนทำคือ พยายามไปลองชุดบ่อยๆ หา style ชุดที่ตัวเองชอบ ถ้าเป็นการเช่าชุด ปกติแล้วชุดจะถูกวนไปใช้งานอยู่เรื่อยๆ มีคิวต่อยาวๆ ทำให้เรามีโอกาสได้ลองชุดที่เราอยากลองน้อยลง เพราะร้านเค้าจะต้อง lock เอาไว้ให้คนที่จะใช้งานจริง ถ้าเจอชุดที่สวยถูกใจแล้ว ให้ lock ชุดไว้เลย ไม่ต้องเสียดายว่าจะมีชุด collection ออกใหม่มา&#xA;&#xA;เรื่องที่ 2: ช่างแต่งหน้า ทำผม&#xA;แนะนำให้รีบหา ดูผลงาน ติดต่อเอาไว้แต่เนิ่นๆ เพราะช่างแต่งหน้าเด็ดๆ มักจะคิวเต็มเร็วมาก โดยเฉพาะวันที่ฤกษ์ดี ผมจองล่วงหน้าประมาณ 4-5 เดือน โดยเฉลี่ยค่าแต่งหน้าเจ้าสาวและเจ้าบ่าวจะอยู่ที่ประมาณ 12,000 - 15,000 บาท เป็นราคาเริ่มต้น ซึ่งจะแต่งแค่รอบเดียว เช่น เช้า หรือ เย็น แต่ถ้าเรามี 2 งานแบบ เช้า-เที่ยง ก็จะคิดเป็น 1.5 รอบ ก็จะเพิ่มเงินเล็กน้อย เช่น จาก 15,000 บาท เป็น 20,000 บาท&#xA;&#xA;เรื่องที่ 3: organizer ตกแต่งสถานที่&#xA;ควรจะคุยกับ organizer เรื่องการตกแต่งสถานที่แบบละเอียดประมาณ 2-3 เดือน ก่อนถึงวันจริง ถ้า organizer เป็น partner กับทางสถานที่อยู่แล้วก็จะไม่ค่อยมีปัญหา เพราะทางสถานที่จะห่วงเรื่องคุณภาพและทีมงาน organizer ว่าอาจจะทำให้สถานที่เค้าเสียหาย ทำงานไม่ได้มาตรฐาน ซึ่งเราอาจจะโดนค่าปรับจากเจ้าของสถานที่ได้ ต้องคอยเช็คกับทางสถานที่อยู่เรื่อยๆ ว่าจะมีปัญหาอะไรไหมในรูปแบบการตกแต่งที่เราอยากได้&#xA;&#xA;เราต้องคุยเรื่อง theme สีของงาน, mood &amp; tone เพื่อที่ organizer จะได้ตกแต่งได้ถูกต้อง รวมถึงเอา theme งานไปทำการ์ด และสิ่งต่างๆ เพื่อให้สวยงามไปในทางเดียวกัน&#xA;&#xA;เรื่องที่ 4: พิธีการ รันคิว พิธีกร&#xA;บ่าวสาวควรติดต่อทีมงานรันคิว พิธีกรเอาไว้เนิ่นๆ ขอ template ต่างๆ เอาไว้ เช่น เราจะจัดงานแบบไหน มีลำดับพิธีการยังไง ปกติทีมรันคิวจะมีลำดับงานแบบมาตรฐานเอาไว้อยู่แล้ว เราสามารถใช้ตรงนี้เป็นต้นแบบได้เลย&#xA;&#xA;ถัดมาคือบ่าวสาวต้องคุยกันเองให้มาก ว่าจะให้ลำดับพิธีในงานเป็นยังไง มีเกมเล่นในงานไหม เป็นเกมอะไร จะมี surprise อะไรกันหรือเปล่า ทั้งหมดเพื่อที่จะได้ดูเรื่องเวลาว่าแน่นเกินไปไหม เป็นไปได้หรือเปล่า&#xA;&#xA;ปกติแล้วกว่าจะสรุปลงตัวและนิ่งก็จะอยู่ราวๆ 2-4 สัปดาห์ก่อนวันจริง&#xA;&#xA;เรื่องที่ 5: เพื่อนบ่าวสาว&#xA;เพื่อนบ่าวสาวของเราดีมากๆ เพื่อนเจ้าสาว แพรขอให้เพื่อนสนิทมาทำหน้าที่ตรงนี้ ส่วนเพื่อนเจ้าบ่าว ผมขอให้เพื่อนที่ทำงานใน office มาช่วยทำหน้าที่ โดยสาเหตุหลักๆ ของผมคือ ผมทำงานกับเพื่อนใน office มานาน และเรารู้ฝีมือกันดีว่าทุกคนทำงานได้ดี เราคุยงานกันเร็ว จัดการงานกันได้ราบรื่น&#xA;&#xA;ปกติเพื่อนบ่าวสาวจะมีหน้าที่คือ&#xA;&#xA;ช่วยในพิธีแห่ขันหมาก กั้นประตูเงินประตูทอง&#xA;ช่วยรับแขกที่โต๊ะต้อนรับ&#xA;ช่วยโปรยดอกไม้ตอนเปิดตัวบ่าวสาว&#xA;ช่วยในพิธีต่างๆ นิดหน่อย หรือแล้วแต่บ่าวสาวจะขอให้ช่วย&#xA;&#xA;เพื่อนบ่าวสาวของเรา เรากะใช้งานเต็มที่มากๆ 555 ตั้งแต่ช่วยตัดสินใจเรื่องต่างๆ ช่วยบริหารแขกในงาน อำนวยความสะดวกให้แขก ประสานกับทีมงานต่างๆ แทนเรา เช็คความเรียบร้อยของสถานที่แทนเรา ดูแลของ ดูแลทรัพย์สิน และอีกเยอะมากๆ&#xA;&#xA;briefs&#xA;&#xA;เราพาเพื่อนบ่าวสาวมาเจอหน้าพร้อมกันก่อนวันงาน ทานข้าวกัน ทำความรู้จักกัน และผมก็เตรียม file brief งานเพื่อนบ่าวสาวอย่างละเอียด ว่าแต่ละคนรับผิดชอบหน้าที่อะไร ใครต้องประจำตรงไหน หากมีปัญหาเกิดขึ้นต้องแก้ปัญหาอย่างไร พร้อม contact ของ key person ต่างๆ ทั้งหมดเพื่อให้งานราบรื่น ไม่ต้องวิ่งวุ่นขวักไขว่หาตัวกันไม่เจอ แล้วเพื่อนบ่าวสาวเราก็ทำออกมาได้ดีมากๆ ต้องปรบมือให้ทุกคนครับ&#xA;&#xA;ตัวไฟล์ brief งาน กดดูที่นี่&#xA;&#xA;เรื่องที่ 6: wedding presentation &amp; website&#xA;&#xA;อันนี้คือสุดมากๆ เราสำรวจราคาค่าจ้างแล้วนะครับ ปกติทำ video presentation ก็จะอยู่ที่ประมาณ 15,000 - 50,000 บาท แล้วแต่ว่าจะจ้าง studio professional ระดับไหน&#xA;&#xA;แต่ว่าผมตัดสินใจทำเองทุกอย่าง เพราะเรารู้สึกว่า การไปจ้างมักจะมีข้อจำกัด เช่น เราจะขอสั่งแก้งานได้กี่ครั้ง จะได้ storyline และ cutting ตามที่อยากได้ไหม จำนวนเวลาที่ออกกองก็มีจำกัด ฯลฯ ทำเองสบายใจกว่า&#xA;&#xA;ผมก็ลงทุนซื้ออุปกรณ์ไว้แล้ว เช่น GoPro แต่พอลองใช้จริงๆ ปรากฎมันไม่ค่อย work ผมมีกล้อง mirrorless อยู่ตัวนึง และก็มี lens อยู่นิดหน่อย เลยไปซื้อ Ronin DJI RS3 mini มาเพิ่ม แล้วก็ไปลากน้องสาวมาช่วยถ่ายให้ คือทุกคนก็ใหม่หมด ใช้งานไม่เป็น การแสดง การเขียนบทก็ไม่เคยเรียน ก็นั่นแหละ นั่งเรียนด้วยตัวเองตั้งแต่ 0 เรื่องตัดต่อก็ไปเรียนวิธีการใช้ DaVinci Resolve 18 ใหม่ทั้งหมด&#xA;&#xA;เราก็ไปถ่ายทำที่หัวหิน หาสถานที่ที่เหมาะสมอยู่สักพัก เขียนบทประมาณ 1 เดือน ถ่ายทำ 3 วัน ตัดต่ออีก 2-3 เดือน แก้ไขเล็กน้อย ทั้งหมดก็เรียบร้อย ตัว file final กับ shotlist ที่เขียนก็อาจจะไม่ได้ตรงกันทั้งหมดเพราะความสามารถคนถ่ายและนักแสดงมีจำกัด เรื่องไฟ แสดง อุปกรณ์ หลายๆ อย่างก็ต้องปรับกันไปตามหน้างาน&#xA;&#xA;website ลงทะเบียนผมก็ทำเอง ออกแบบเองทั้งหมด บ้าพลังขนาดไหน 555&#xA;&#xA;link screenshot website วันที่ 4 พ.ค.&#xA;link screenshot website วันที่ 7 พ.ค.&#xA;link file shotlist ของ presentation&#xA;link video presentation&#xA;&#xA;เรื่องที่ 7: วงดนตรี after party&#xA;&#xA;การเอาวงดนตรีเข้ามาก็มีรายละเอียดปลีกย่อย สำหรับผมผู้ที่ไม่รู้เรื่องวงดนตรีใดๆ ทั้งสิ้นก็จะค่อนข้างยากหน่อย&#xA;&#xA;ปกติแล้วสิ่งที่จะต้องดูคือ นักร้องนักดนตรี, เครื่องดนตรี, เครื่องเสียง, ระบบแสงสี ทั้งหมดนี้เราจะจ้างแยกกันเป็นส่วนๆ ก็ได้ บางทีมงานก็จะมี bundle กันมา&#xA;&#xA;ตอนแรกมีวงที่ผมชอบมากๆ วงนึง ก็คือวงโนบาร์หน้าช่อ ทางวงมีนักดนตรี สามารถให้ทางวงจัดการเรื่องเครื่องเสียงได้ ผมไม่ได้ถามเรื่องระบบแสงสี&#xA;&#xA;อีกวงก็คือพอดีไปงานแต่งเพื่อนที่ office แล้ววงนี้ก็เล่นสนุกดี นั่นก็คือวง Catzilla เราเลยหา contact ทักไปคุยกับทางวง แล้วทางวงเค้ามีบริการแบบ full option คือตั้งแต่ระบบแสงสีไปจนถึงนักดนตรีครบหมดในทีเดียว ราคาที่ได้มาก็ถือว่ารับได้ เราเลยเลือกวงนี้&#xA;&#xA;catzilla&#xA;&#xA;จบงานออกมาก็คือไม่ผิดหวังเลย จัดเต็มทุกอย่าง พี่บุ๋นก็ให้คำแนะนำผมดีมากๆ ในรายละเอียดต่างๆ&#xA;&#xA;ส่วนเรื่องอื่นๆ ที่เหลือก็จิปาถะแล้วครับ เช่น เจ้าหน้าที่จดทะเบียนในงาน ต้องไปติดต่อ ต้องนิมนต์พระสงฆ์ไหม ไปรับไปส่งท่านยังไง อุปกรณ์ต่างๆ ที่ต้องเตรียม อันไหนสถานที่เตรียมให้ อันไหนทีมงานเตรียมให้ อันไหนที่บ่าวสาวต้องเตรียมเอง&#xA;&#xA;งานแต่งด่านที่ 3: เรียนเชิญแขก&#xA;&#xA;เนื่องจากเรามีจำนวนที่นั่งจำกัด เราก็จะเชิญแขกมากเกินไม่ได้ เราแบ่งงานผู้ใหญ่ไว้ที่ 200 คน และงานเด็ก 150 คน&#xA;&#xA;ฝ่ายผู้ใหญ่ เราให้พ่อแม่จัดการ เพราะเป็นแขกของท่าน ให้ท่าน list รายชื่อแขกที่จะเชิญ จัดคนลงโต๊ะให้ได้ (เป็นโต๊ะจีน) จัดว่าใครจะนั่งกับใคร จากนั้นก็เอารายชื่อไปพิมพ์ซอง แขกบางท่านก็โทรไปเชิญและส่งการ์ด online&#xA;&#xA;ของฝั่งเด็ก เราก็ list รายชื่อแขกออกมา พิมพ์ชื่อบนซอง ส่งการ์ดเชิญไปให้&#xA;&#xA;การ์ดแต่งงานเราต้องสั่งทำ 2 ชุด มีรายละเอียดไม่เหมือนกัน ราคาการ์ดถูกสุดก็ประมาณ 12 บาทต่อใบ ถ้าปั้มฟลอยแบบเราก็จะบวกราคาเพิ่ม บางอันดีๆ หรูๆ หน่อยอาจจะถึง 50 บาทต่อใบก็ได้ ของผมจบงานแล้วการ์ดเหลือเยอะพอสมควรเพราะพิมพ์มาเท่ากับจำนวนแขก แต่ไม่ได้แจกแขกทุกคน บางคนก็ส่ง online บางคนก็ให้ใบเดียวแต่เชิญทั้งครอบครัว&#xA;&#xA;card&#xA;&#xA;เราเริ่มแจกการ์ดเชิญประมาณ 1-2 เดือนก่อนวันงาน ถ้าแจกล่วงหน้านานกว่านั้นก็อาจจะลืม ถ้าแจกกระชั้นชิดไปแขกก็อาจจะไม่สะดวก&#xA;&#xA;ปัญหาคือการ confirm แขก เป็นเรื่องที่ยากมากๆ บางท่านก็แจ้งว่าเดี๋ยวจะ confirm อีกที บางท่านก็สามารถบอกได้เลยว่ามาได้หรือมาไม่ได้ รวมถึงยิ่งวันใกล้ๆ งาน ก็จะมีแขกบางท่านโทรมายกเลิกเพิ่มเติม&#xA;&#xA;ผมเองก็ไม่รู้เหมือนกันว่าควรจะทำวิธีไหนดีที่สุด แต่วิธีที่ผมใช้คือ&#xA;&#xA;list รายชื่อแขกออกมาให้เกินกว่าจำนวนที่นั่งประมาณ 20-30% (จริงๆ เราอยากเชิญทุกคนในนี้ แต่เนื่องด้วยสถานที่มันทำไม่ได้จริงๆ)&#xA;เชิญไปให้เกินกว่าจำนวนที่นั่ง 10%&#xA;ถ้ามีแขกยืนยันว่าไปไม่ได้เลยทันที ก็ไล่เชิญเพิ่มไปเรื่อยๆ พยายาม keep จำนวนให้เกิน 10% ไว้เสมอ&#xA;2 สัปดาห์สุดท้ายก่อนถึงวันแต่ง เราจะไม่เชิญใครเพิ่มแล้ว&#xA;&#xA;โดยปกติสถานที่จะสามารถเพิ่มโต๊ะได้ประมาณ 10% ดังนั้น best case คือคนมาเกิน 10% ก็จะได้นั่งตรงนี้ที่สำรองไว้ แต่ถ้าเป็น normal case คือหน้างานคนจะมาน้อยกว่าที่เชิญ 10% อยู่แล้ว แขกที่มาจริงก็จะไม่ดูโล่งจนเกินไป&#xA;&#xA;สำหรับงานเด็กที่เป็น international buffet จะไม่ค่อยมีปัญหาหากเชิญเกิน 10%&#xA;แต่สำหรับผู้ใหญ่ที่เป็นโต๊ะจีน จะมีปัญหาในการจัดโต๊ะมากๆ เพราะเราไม่สามารถจับคนที่ไม่รู้จักกัน ให้มานั่งด้วยกันได้ ดังนั้นในงานผู้ใหญ่ เราจะไม่เชิญคนเกินเด็ดขาด&#xA;&#xA;งานแต่งด่านที่ 4: รับมือกับปัญหา&#xA;&#xA;จัดงานแต่งมีปัญหาให้ลุ้นตลอดครับ ยิ่งใกล้วันแต่งเท่าไร ก็จะมีปัญหาจุกจิกโผล่มาเต็มไปหมด ดังนั้น พยายามเคลียตารางช่วงใกล้ๆ วันแต่งให้โล่งๆ ไว้ อย่าพยายามยัดสิ่งที่ต้องทำมาใกล้วันแต่งจนเกินไป&#xA;&#xA;ผมเองก็มีปัญหาที่เจออยู่บ้างเช่นกัน&#xA;&#xA;พิธีการเช้า-เที่ยงแน่นและรีบจนเกินไป&#xA;&#xA;สืบเนื่องมาจากเรื่องฤกษ์ที่ดูมา พิธีสงฆ์ 6.30 ขันหมากเริ่ม 8.39 เวลาสวมแหวนตามฤกษ์คือ 9.39 แล้วรับไหว้ที่เวลา 11.09 แต่จำนวนแขกรับไหว้คือประมาณ 30 คู่ ซึ่งน่าจะจบที่ 12.10 แล้วบ่าวสาวต้องไปเปลี่ยนชุด เปลี่ยนผมอีก 1 ชั่วโมง ทำให้พิธีการในงานฉลองเที่ยงต้องไปเริ่ม 13.00 และต้องจบภายใน 14.00 เพราะใช้ห้องได้ถึงแค่เวลานี้ ทางผู้ใหญ่ก็มีบอกว่าอยากจะให้มีเวลามาถ่ายรูป ต้อนรับแขกก่อนเข้าพิธีฉลองด้วย เพราะถ้าพิธีจบเวลา 14.00 เราต้องคืนสถานที่เลย ทุกคนก็จะต้องรีบออกจากห้อง รีบกลับทันที&#xA;&#xA;แพรและผมต้องคุยกัน และก็ต้องไปคุยกับพ่อแม่ รวมถึงแจ้งกับแขกทุกท่านที่เรียนเชิญไว้แล้วด้วยว่าจะมีการเปลี่ยนเวลาให้เร็วขึ้น เราตกลงกันว่า พิธีสงฆ์ 6.30 ตามเดิมไม่เปลี่ยน แต่ขยับทุกอย่างลงมาประมาณ 1 ชั่วโมง ขันหมากเริ่มที่ 8.00 ปล่อยทุกอย่าง flow ไปได้เลยไม่ยึดตามฤกษ์ที่ดูมา อย่างที่บอกไปคือผมไม่เคยถือเรื่องฤกษ์อยู่แล้ว ดังนั้นผมเองไม่มีปัญหา&#xA;&#xA;ถัดมาคือต้องไปไล่คุยกับทีมงานรันคิว สถานที่ และ organizer เรื่องเวลาใหม่ทั้งหมด เพื่อที่ทุกคนจะได้ปรับตารางให้ตรงกัน จะได้ไม่ผิดพลาด&#xA;&#xA;ยังโชคดีที่เรื่องนี้โผล่มาประมาณ 2 สัปดาห์ก่อนวันงาน ก็เลยไม่วุ่นวายมากนัก แล้ววันจริง พอเรารันไปตามตารางเวลาใหม่นี้ เราก็รู้สึกว่างานมันราบรื่นมากๆ ทุกคน happy เราก็ happy&#xA;&#xA;ทีมงานมีการเปลี่ยนแปลงคน&#xA;&#xA;เริ่มตั้งแต่ Sales ของโรงแรมมีการเปลี่ยนใหม่ เราก็ห่วงว่า sales คนใหม่จะตกหล่นรายละเอียดอะไรหรือเปล่า รวมถึงเราตกลงกับ sales คนเก่าไว้ว่าจะขอให้เค้าช่วยงานบางอย่างด้วย พอเค้าไม่อยู่ เราก็ต้องหาทีมงานมาทำตรงจุดนั้นแทน&#xA;&#xA;Sales ร้านชุดเจ้าสาวลาออก ทำให้คนดูแลเรื่องชุดเปลี่ยใหม่ แล้วร้านชุดก็ดูจะตกๆ หล่นๆ อยู่แล้ว เลยยิ่งเป็นห่วง แต่คนที่มาดูแลช่วงต่อก็โอเค เรา recheck รายละเอียดต่างๆ ดูแล้วครบถ้วน ไม่มีอะไรตกหล่น ก็สบายใจ&#xA;&#xA;ทีมรันคิว ยังไม่ได้ lock คนที่จะมาดูแลพิธีการให้ เรื่องนี้ไม่ได้มีปัญหามาก เราแค่ห่วงว่าทางทีมรันคิวจะส่งรายละเอียดงานกันครบถ้วนไหม จะ brief งานกันถูกไหม แต่พอหน้างานจริงก็ราบรื่นมากๆ และทีมงานก็ professional มากๆ ด้วย&#xA;&#xA;เรื่องคนที่มีหน้าที่ตามจุดต่างๆ ก็มีการเปลี่ยนแปลงอยู่บ้าง แต่ก็แก้ปัญหาเฉพาะหน้า ผ่านมาได้หมด&#xA;&#xA;วันที่ 4 พ.ค. กับ 7 พ.ค. มี surprise ให้ลุ้นตลอด&#xA;&#xA;วันที่ 7 พ.ค. เกือบจะเป็นวันเลือกตั้งทั้งประเทศ ก็ห่วงว่าแขกจะมางานน้อยลง จะ cancel เพราะติดไปเลือกตั้ง ฯลฯ&#xA;&#xA;วันที่ 4 พ.ค. เป็นวันหยุด แต่วันที่ 5 ไม่หยุด แล้วรัฐบาลประกาศให้ 5 เป็นวันหยุดพิเศษเพิ่มขึ้นมา เลยกลายเป็นหยุดยาว 4-7 พ.ค. ก็ห่วงว่าแขกจะใช้หยุดยาวนี้ในการไปเที่ยว แล้วไม่สามารถมางานแต่งเราได้&#xA;&#xA;อีกเรื่องคือวันหยุดยาวแล้วห้องโรงแรมจะเต็มไหม ถ้าแขกจะมานอนพัก ตอนแรกดูราคาหน้าเว็บไว้ค่อนข้างสูงทีเดียว คืนละ ~5,000 บาท แต่พอใกล้ๆ วัน ห้องไม่ได้แน่นขนาดนั้น ราคาหน้าเว็บก็ drop ลงมาเท่ากับราคาพิเศษที่เราได้คุยกับโรงแรมไว้&#xA;&#xA;วันที่ 4 พ.ค. เราจะจัดงานปาร์ตี้ ก็ห่วงว่าจะให้เสริฟเครื่องดิ่มได้หรือเปล่า เราเช็คแล้วว่าทำได้ก็รอดไป&#xA;&#xA;วันที่ 7 พ.ค. เป็นวันเลือกตั้งล่วงหน้า มี beer สดเหลือจากวันที่ 4 พอสมควร แต่เอามาเสริฟไม่ได้เพราะผิดกฎหมาย ก็เสียดายกันไป&#xA;&#xA;เรื่องจิปาถะต่างๆ ที่ค่อยๆ โผล่มาทีละนิด&#xA;&#xA;ผมทำ todo list ไว้ว่าในแต่ละวันต้องทำอะไรให้เสร็จบ้าง ต้อง final เรื่องอะไร บางอย่างก็ตัดสินใจไม่ทำ ยกเลิก บางอย่างก็ทำเสร็จก่อน บางอย่างก็ delay และก็มีบางอย่างเพิ่มเข้ามา&#xA;&#xA;อย่าง script brief งานเพื่อนบ่าวสาว ก็เป็นสิ่งที่ต้องทำเพิ่ม และไม่ได้มีจดไว้ตั้งแต่ตอนแรก&#xA;&#xA;ของที่เราจะต้องขนไปโรงแรม เราก็ต้องเตรียม checklist ให้ครบ ไม่งั้นเดี๋ยววันงานจริงตกหล่นแล้วจะมีปัญหา&#xA;&#xA;checklist&#xA;&#xA;บ่าวสาวไม่สบายก่อนแต่งงาน&#xA;&#xA;เรื่องนี้เป็นสิ่งที่กังวลที่สุดเลย เริ่มจากแพรไปขัดผิวแล้วมีผื่นแพ้แดงคันขึ้นทั้งตัว ต้องวิ่งวุ่นพาไปหาหมอ&#xA;&#xA;ผมเองก็ท้องเสียไป 2 วันติด หลังจากจบ party วันที่ 4 พ.ค. แต่โชคดีหายทันวันที่ 7 พ.ค.&#xA;&#xA;ส่วนแพรจบ party มาก็คือเท้าเจ็บ เลือดอาบนิ้ว ต้องคอยทำแผล ห่วงจะใส่รองเท้าคัชชูไม่ได้ ทางโรงแรมก็ดูแลดีมาก ผมกับแพรเดินไปทานอาหารเช้าที่ห้องอาหารโรงแรม ใส่ slipper ไป น้องที่หน้า front แจ้งว่าไม่อนุญาติให้ใส่ ห่วงว่าจะอันตรายเพราะพื้นลื่น เราเลยแจ้งว่าพอดีเท้าเป็นแผลต้องขอใส่อันนี้ น้องที่ front ก็แอบไปแจ้งทาง sales (คุณแนน) ว่าเจ้าสาวเท้าเจ็บ คุณแนนก็รีบโทรมาหาทันทีด้วยความเป็นห่วง และทีมงานโรงแรมทุกคนก็ช่วยดูแลแพรเป็นอย่างดี&#xA;&#xA;และก็โชคดีที่ไม่มีใครไม่สบายเพิ่มอีก&#xA;&#xA;จบงานแล้วเป็นไงบ้าง&#xA;&#xA;สรุปค่าใช้จ่ายโดนไปทั้งหมดประมาณ 1,020,000 บาท ยังไม่รวมสินสอดที่ฝ่ายชายต้องเตรียม หักลบกลบหนี้กับซองช่วยงานก็ยังขาดทุนอยู่พอสมควร แต่ก็เป็นงานแต่งที่เราทั้งคู่ happy มากๆ เราได้งานเด็กในแบบที่เราอยากได้ คนที่มางานเด็กก็ชมว่าสนุก เมากันเละเทะไปหลายคน มีแค่เรื่องอาหารที่ดูเหมือนจะน้อยไปนิดและเราเพิ่งจะรู้ทีหลัง (ไม่รู้ว่าทำไมโรงแรมทำอาหารมาไม่พอ เพราะแขกก็มาไม่ถึง 150 คน)&#xA;&#xA;Flying duck&#xA;&#xA;ส่วนงานผู้ใหญ่ก็เป็นพิธีการตามธรรมเนียมที่ผู้ใหญ่อยากได้ปกติ พิธีการราบรื่น อาหารโอเค งานไม่เร่งรีบ ทุกคนมีเวลาได้พูดคุยกัน พ่อแม่แพรก็ชมมาว่าจัดงานออกมาดี เราทั้งคู่ก็ดีใจ&#xA;&#xA;งานนี้เป็นงานที่ผมและแพรตัดสินใจรายละเอียดต่างๆ เอง เลือกสิ่งต่างๆ เอง เราแค่รับฟัง feedback จากผู้ใหญ่แล้วเราดูว่าเราจะปรับหรือไม่ เราไม่ตามใจผู้ใหญ่ทั้งหมด เพราะว่านี่คืองานแต่งของเราทั้ง 2 คน และเงินที่ใช้จัดงานก็เป็นเงินของเราทั้งคู่ล้วนๆ ก็มีบางครั้งที่ต้องต่อรองกับผู้ใหญ่กันไปบ้าง แต่ก็ผ่านมาได้ตลอด&#xA;&#xA;wedding folder&#xA;&#xA;อยากจะบอกว่า การจัดงานแต่งเป็น project scale ใหญ่มากๆ project นึง ถ้าใครไม่เคยทำ project management scale ใหญ่ ไม่เคยคุย vendor เอง ไม่เคยบริหารทีมงาน ไม่เคย compare ราคา หรือเตรียมเอกสาร brief งานคนต่างๆ ผมแนะนำให้จ้าง organize ทั้งหมดดีกว่า ไม่อย่างนั้นงานอาจจะไม่ราบรื่นนัก และก็จะรู้สึกเหนื่อย ทรมานมากๆ ผมเองทำ spreadsheet เพื่อดูแลงานทุกส่วนเยอะมากๆ มีเอกสารที่ต้องดูแล ต้องส่ง แก้ไขจำนวนไม่น้อย นัดวัน + follow up action จาก supplier ตลอดเพื่อไม่ให้พลาด deadline และต้องคอย update กับผู้ใหญ่ตลอดเวลาว่างานไปถึงจุดไหนแล้ว เราทั้ง 2 คนต้องช่วยกันประสานกับทีมงานและ stakeholders ร่วม 20 กว่าคนโดยที่ไม่มีประสบการณ์มาก่อน ถือว่าเป็นงานยากพอสมควร&#xA;&#xA;หลังจบงานแพรก็ย้ายมาอยู่ด้วยกัน ผมเองไม่ได้มีอะไรที่เปลี่ยนแปลงมากนัก มีแค่ต้องตื่นเช้าขึ้นมากๆ เพราะแพรต้องเข้าไปทำงานแต่เช้า ส่วนแพรก็คงจะปรับตัวเยอะหน่อย เพราะเหมือนย้ายบ้านใหม่ ก็ค่อยๆ ปรับตัวกันไป&#xA;&#xA;ยังไม่มีแพลนไป honeymoon ไว้วางแผนอีกที และก็ยังไม่ได้มีแพลนจะมีน้องตอนนี้ ขอไปเที่ยว กู้คืนชีวิต lockdown ช่วง covid 2-3 ปีนี้ก่อน]]&gt;</description>
      <content:encoded><![CDATA[<blockquote><p>คำเตือน: blog นี้ยาวมาก พยายามจะเล่ารายละเอียดให้ได้มากที่สุด เผื่อเป็นประโยชน์ให้คนกำลังวางแผนจัดงาน
ผมจะเน้นในมุมมองของผู้ชาย ที่จะต้องขอผู้หญิงแต่งงานเป็นหลักนะครับ ผมจะเล่าเป็นเรื่องราว ไม่ได้เล่าเป็นโครงสร้างแบบเข้าใจง่าย</p></blockquote>

<h2 id="อยากจะแต-งงาน-เร-มย-งไง">อยากจะแต่งงาน เริ่มยังไง</h2>

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

แต่ว่าเริ่มต้นแรกสุด คือผมถามตัวเองก่อนว่า <strong>คนนี้คือคนที่เราอยากจะอยู่ไปตลอดใช่ไหม</strong> ในตอนนั้นเราคบกันมาสัก 2 ปีนิดๆ ผมโอเคมากๆ เลย เพราะแพรรับฟังผม แพรเปิดใจให้คน geek นิดๆ อย่างผมได้มีมุมของตัวเอง ผมเคยสอนแพรเขียนโปรแกรม แพรก็พยายามเรียนแบบน้ำตาซึมๆ ไป สุดท้ายผมก็เลิกสอนเค้าเพราะไม่มีประโยชน์ที่จะไปบังคับในสิ่งที่เค้าไม่ถนัด แต่นั่นแหละ แพรพยายามจะเข้าใจเรา เรียนรู้เรา ไม่พยายามจะยัดเยียดตัวเค้าเข้ามามากเกินไป เราก็มีความตึงๆ ใส่กันบ้างบางครั้ง แต่เราก็คุยกันด้วยดี แก้ปัญหาได้ทุกครั้ง ไม่เคยมีทิ้งปมเอาไว้รอระเบิดภายหลัง แพรเป็น supporter ที่ดีมากๆ สุดท้ายผมก็คิดว่า แต่งกับคนนี้แหละ เราน่าจะไปกันรอดจนแก่เฒ่าด้วยกัน</p>

<p>จากนั้นผมก็ไปเม้ากับแก๊ง engineering manager ที่ทำงานด้วยกัน ถามเค้าง่ายๆ ว่า</p>

<blockquote><p>เราขอผู้หญิงแต่งงานเลยได้ไหม หรือต้องทำอะไรก่อน</p></blockquote>

<p>มี Arm แชร์ให้ฟังว่า ของเค้าคือต้องให้ผู้ใหญ่ไปเจอกันก่อน ไปพูดคุยกัน เพราะถ้าเราขอกันเองเรียบร้อย แล้วค่อยไปบอกผู้ใหญ่ ถ้าผู้ใหญ่เค้าไม่ OK กันและกัน มันจะเป็นเรื่องเอา</p>

<p>และก็มีคนอื่นๆ พูดทำนองเดียวกัน บางคนก็บอกว่าขอกันเองเลยก็ได้ ถ้ามั่นใจว่าจะไม่แป๊ก ทั้งคู่เราและผู้ใหญ่</p>

<blockquote><p>แล้วมันจะแปลกมั้ย ที่ผู้ใหญ่ไปคุยกัน คุยกันไว้ว่าลูกๆ เราจะแต่งงาน อย่างนี้ผู้หญิงเค้าก็รู้หมดน่ะสิ เดี๋ยวจะไม่ surprise นะ</p></blockquote>

<p>ผมก็ถามทุกคนไปและก็เช็คเพิ่มเติมกับคนอื่นๆ ที่ผมรู้จัก ซึ่งทุกคนบอกว่า <em>“จริงๆ ผู้หญิงเค้าก็ต้องรู้อยู่แล้วรึป่าวว่าเดี๋ยวเราจะแต่งงานกัน เพียงแต่เค้าไม่รู้ว่าวันไหน”</em> ดังนั้นเวลาที่ผู้ใหญ่ไปคุย ก็อย่าเพิ่งกำหนดวัน ปล่อยให้เค้าลุ้นไปก่อน</p>

<blockquote><p>สุดท้ายผมก็ตัดสินใจว่าเดี๋ยวจะให้ผู้ใหญ่ไปเจอกันก่อน</p></blockquote>

<p>แต่ก่อนที่ผู้ใหญ่จะไปเจอกัน มันก็มีเรื่องให้ต้องคิด ต้องเตรียมตัวเยอะพอสมควรเลยนะ</p>

<h2 id="ก-อนผ-ใหญ-เจอก-นคร-งแรก">ก่อนผู้ใหญ่เจอกันครั้งแรก</h2>

<p>เรื่องราวก่อนที่ผู้ใหญ่จะเจอกัน มันจะไม่ได้เป็นเส้นเรื่องแบบเส้นตรงๆ เพราะในความเป็นจริงมันโคตรจะพันกันยุ่งเหยิงมากๆ</p>

<p>เริ่มจากว่า เราพยายาม sense ให้ได้ก่อนว่าแพรเค้าอยากจะแต่งกับเราใช่ไหม ผมก็คอยถามไปเรื่อยๆ วันละนิด วันละหน่อย เช่น</p>
<ol><li>แพรดูชอบเด็กเนอะ อยากได้ลูกชายหรือลูกสาว</li>
<li>แพรอยากจะไปอยู่ที่ไหน?</li>
<li>ถ้าวันนึงชีวิตพี่เป็นขาลง เกิดลำบากขึ้นมา แพรโอเคหรือเปล่า</li>
<li>คบกันมาแล้วเป็นไง มีตรงไหนที่ชอบและไม่ชอบบ้าง</li></ol>

<p>คำถามพวกนี้มันก็ช่วยเพิ่มความมั่นใจทั้งคู่แหละ แพรเองก็น่าจะรู้สึกว่าเราจริงจังกับเค้านะ ไม่ใช่คบเล่นๆ</p>

<p>พอเรามั่นใจประมาณนึงแล้วว่าแพรไม่น่าจะปฏิเสธ ก็เริ่มคุยเรื่องผู้ใหญ่กับแพรบ้าง หลักๆ คือ ผู้ใหญ่บ้านแพรชอบเราไหม, ผู้ใหญ่บ้านเราชอบแพรหรือเปล่า และก็เรื่องที่ยากที่สุดคือเรื่องสินสอดและเรือนหอ</p>

<p>สำหรับผู้ใหญ่ทางบ้านแพร เนื่องจากผมไปที่บ้านแพรอยู่บ่อยๆ คอยช่วยงานผู้ใหญ่ ก็ดูจะไม่ค่อยเป็นปัญหาเท่าไร แต่สำหรับแพรเองที่แทบจะไม่เคยได้เจอแม่ของฝั่งผู้ชายเลยก็ค่อนข้างจะยาก เพราะว่าแม่ของผมอยู่ต่างประเทศตลอด ผมเองก็แทบไม่ได้เจอเลย และยิ่งช่วง covid ก็คือไม่ได้กลับไทยเลยเกือบ 2 ปีเต็มๆ ซึ่งผมกับแพรก็คบกันมาตลอดช่วง covid นี่แหละ แพรและแม่ก็เลยแทบจะไม่เคยได้คุยอะไรกันเลยสักนิด</p>

<p>ผมเองก็ไม่รู้นะว่าแม่ผมโอคเกับแพรหรือเปล่า แต่ผมโอเค ดังนั้นผมมีหน้าที่ทำให้แม่โอเคด้วย 555</p>

<p>มีช่วงเดือน May 2022 ได้บินไปเจอแม่และไปเที่ยว ก็เลยได้คุยกับแม่จริงจังเรื่องแต่งงาน คือบทสนทนากับแม่มันจะข้ามขั้นไปเลย เพราะ relationship ในบ้านแต่ละบ้านก็คงไม่เหมือนกัน ผมสามารถคุยตรงๆ กับแม่ได้ แม่ก็รับฟังและแม่ก็ให้ความเห็นในเรื่องต่างๆ เราก็ฟังและต่อรองกันไป หลักๆ ก็คือคุยกับแม่ว่าจะแต่งงานนะ แม่กังวลอะไรไหม เราพอรู้อะไรบ้างเราก็บอกความคิดของเราให้แม่ฟังไป เช่น แต่งงานแล้วไปอยู่บ้านไหน แพรจะย้ายเข้ามาหรือว่าชาร์ปจะต้องย้ายไปอยู่กับแพร (เราตกลงกันว่าจะอยู่ทั้ง 2 บ้านสลับกันไป ไม่ซื้อบ้านหรือปลูกเรือนหอใหม่ แต่จะอยู่บ้านผมเยอะกว่านิดหน่อยเพราะเป็นส่วนตัวกว่า) เรื่องจิปาถะอื่นๆ รวมถึงเรื่องสินสอดด้วย</p>

<blockquote><p>เรื่องสินสอดผมจะไม่ขอพูดตัวเลขนะครับ แต่จะใช้ตัวแปรแทน เช่น A, B แบบนี้</p></blockquote>

<p>ประเด็นเรื่องสินสอดก็ค่อนข้างซับซ้อน ก่อนหน้าที่ผมจะคุยกับแม่ตอนที่บินไปต่างประเทศ ผมก็ลองถามแพรไปก่อนว่าเคยถามพ่อแม่แพรหรือเปล่าว่าจะเรียกสินสอดเท่าไร แต่กว่าที่ผมจะได้ตัวเลขมาก็ถามหลายรอบเหมือนกัน เพราะทางพ่อแม่แพรบอกว่า <em>“แล้วแต่เราสะดวก”</em> ซึ่งมันไม่ช่วยอะไรเลย เราก็ไม่รู้ว่าจะให้เท่าไร โชคดีที่พี่ชายแพรแต่งงานก่อนหน้านี้ ก็เลยเอาเลขนั้นมาเป็นเลขอ้างอิงก่อน รวมถึงแพรก็ลองถามพ่อแม่แบบติดตลกไปด้วย พ่อแม่ก็บอกเลขมาใกล้เคียงกับของพี่ชายแพร</p>

<p>แต่ว่าเลขที่ได้มาอันนี้ คือทางผู้ใหญ่เค้ายังไม่เคยไปตกลงกันเลยนะครับ ผมและแพรแค่พยายามไปสืบว่าผู้ใหญ่แต่ละท่านมองตัวเลขไว้ที่เท่าไร ผมไม่ปล่อยให้ผู้ใหญ่ไปเจอกันแล้วไปคุยเรื่องตัวเลขกันหน้างานแน่ๆ ห่วงว่าจะเหมือน pantip ที่มาเล่ากันว่าผู้ใหญ่ทะเลาะกันจนลูกๆ เครียดมาก ไม่ได้แต่งงาน</p>

<p>พอผมได้ตัวเลขสินสอดเป็นเงิน A บาท ทองคำ B บาท ผมก็คุยให้แม่ผมฟังในวันที่บินไปหา จริงๆ เงินและทองจำนวนนั้น ผมก็มีเตรียมไว้เรียบร้อยแล้ว แต่เงินผมอาจจะยังไม่พอสำหรับจัดงานแต่งซึ่งต้องใช้เวลาเก็บเงินเพิ่มอีก แม่ก็ค่อนข้างเป็นห่วงเพราะครอบครัวเราฐานะลำบากมาโดยตลอด ไม่อยากให้ต้องใช้เงินเยอะขนาดนี้ เลยจะขอลดจำนวนลงหน่อย (ทุกคนอย่าลืมว่าในช่วงที่คุยกันเรื่องสินสอด ฝ่ายแพรไม่รู้เรื่องนี้ เพราะฝ่ายแพรได้แต่ให้ข้อมูลผมมาอย่างเดียว)</p>

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

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

<p>พอวันที่ไปคุยจริงๆ กับพ่อแม่แพร เราก็เริ่มเปิดไปก่อนว่า ผมจริงจังกับแพร อยากจะแต่งงานกับแพร พ่อแม่ติดอะไรไหม จากนั้นก็มาคุยเรื่องจิปาถะ เช่น อยู่ที่ไหน วางแผนชีวิตยังไง ฯลฯ ซึ่งทั้งหมดก็คือผมและแพรก็ได้คุยกันมาก่อนหมดแล้ว ท่านก็ถามเรื่องงานแต่งว่ามีรายละเอียดยังไงบ้าง ผมก็แจ้งไปว่ารายละเอียดยังไม่มี เดี๋ยวจะมาคุยแยกอีกรอบ สุดท้ายก็จบเรื่องสินสอด ผมก็เล่าไปว่า แพรเคยบอกมาว่าพ่อและแม่จะเรียกสินสอดเท่านี้ใช่ไหม แต่ผมอาจจะไม่สามารถให้ได้เท่าที่พ่อและแม่ขอมา อาจจะขอลดลงหน่อย พ่อแม่แพรก็เข้าใจ ก็จบลงด้วยดี</p>

<p>แต่จบตรงนี้ก็ยังไม่ถือว่าตกลงสินสอดกันนะครับ อันนี้แค่ลองสอบถามเพื่อดูปฏิกริยาก่อนว่าจะมีปัญหาไหม เพราะตัวเลขจริงๆ ต้องให้ผู้ใหญ่มาแจ้งกันอีกทีนึง</p>

<h2 id="ผ-ใหญ-มาเจอก-นว-นแรก">ผู้ใหญ่มาเจอกันวันแรก</h2>

<p>แม่บินกลับมาไทยอยู่ช่วงนึงไม่นานมาก ก็เลยจองคิวแม่เอาไว้ว่าจะให้ไปคุยกับผู้ใหญ่ฝ่ายแพรเรื่องแต่งงาน ก็ตกลงวันเวลากับทั้ง 2 ฝ่ายไว้เรียบร้อย แต่ก่อนจะถึงวันนั้น ฝ่ายผู้ชายก็ต้องทำการบ้านไว้ก่อน</p>

<p>ผมนั่งคุยกับแม่ เราจดหัวข้อต่างๆ ที่แม่จะต้องไปคุยให้เรียบร้อย เราเตรียมบทกันว่าจะคุยกันยังไง เช่น วันนั้นเราจะไปที่บ้านแพร ทางบ้านแพรจะเตรียมอาหารไว้ต้อนรับเรา เราก็จะคุยกันเรื่องแต่งงาน ฯลฯ</p>

<p>ในหัวข้อที่คุย ผมเตรียมกับแม่ไว้ประมาณนี้</p>
<ul><li>แต่งเข้าบ้านไหน: แพรกับผมตกลงว่าจะเข้าบ้านผม แต่ผมก็จะต้องไปอยู่บ้านแพรบ้างบางครั้ง เพราะทั้ง 2 บ้านก็มีผู้ใหญ่ที่คอยดูแล</li>
<li>พิธีการในงานแต่ง: เราจะจัดแบบไทย ในพิธีจะมีอะไรบ้าง เราเอาแค่พิธีสงฆ์ ขันหมากไทย หมั้น รับไหว้ งานฉลอง แล้วก็ตกลงกันว่าจะไม่เอาอะไร เช่น ไม่เอารดน้ำสังฆ์</li>
<li>เรื่องจิปาถะในงานแต่ง: แขกประมาณกี่คน ตอนแรกอยากจะจัดเล็กๆ แบบไม่เกิน 100 คนเพราะไม่อยากใช้เงินเยอะ แต่พอผู้ใหญ่คุยกันก็จบลงที่ต้องจัดงานใหญ่ขึ้น รวมไปถึงเรื่องอาหารขอเป็นโต๊ะจีน และก็เรื่องอื่นๆ ที่ทางผู้ใหญ่อยากจะขอ lock ไว้ ส่วนอะไรที่ยังไม่มั่นใจผมขอเอามาทำการบ้านแล้วจะไปอัพเดทให้ทีหลัง</li>
<li>เรื่องเงินๆ ทองๆ: สินสอดตกลงกันที่เท่าไร เรื่องซองในงานแต่งใครดูแล ค่าใช้จ่ายงานแต่งทั้งหมดจะออกยังไง (ผมกับแพรตกลงกันว่าจะหารครึ่งเท่ากัน) สินสอดพ่อแม่แพรบอกว่ามอบคืนให้เราไปใช้ตั้งตัว</li>
<li>แต่งวันไหน: ผมบอกแม่ว่ายังไม่ให้บอกวัน เดี๋ยวผมจะไปหาแล้วบอกเองทีหลัง ตรงนี้เราเก็บเรื่องวันเอาไว้ surprise ขอแต่งงานแพร</li></ul>

<p>พอดีวันที่ไปคุย ผมไม่สบายพอดี เป็นไข้สูง (ไข้ 39.4) ก็เลยรีบคุยรีบกลับ แล้ววันถัดมาผมก็ไป admit โรงพยาบาลยาวๆ แต่วันนั้นก็ถือว่าผ่านมาได้อย่างราบรื่น พ่อแม่แพรบอกว่าวันนั้นก็เลยไม่ได้เลี้ยงอาหารแม่ผมเลยเพราะผมไม่สบาย</p>

<h2 id="หาฤกษ-งานแต-ง">หาฤกษ์งานแต่ง</h2>

<p>การหาฤกษ์เป็นเรื่องใหญ่มากเหมือนกัน ผมเป็นคนที่ไม่ถือฤกษ์ ไม่ดูฮวงจุ้ยใดๆ ดังนั้นผมไม่เคยสนใจอยู่แล้ว แต่ว่าผู้ใหญ่ก็อยากจะให้ดูมาหน่อยเป็นมงคล แพรเองก็อยากให้ดู</p>

<p>ในตอนแรกสุดคุยกันว่าผมจะไปดูฤกษ์กับพระอาจารย์ที่จันทบุรี เพราะเป็นที่ๆ แม่ผมนับถือ แต่ความยากมันคือ ปกติแล้วเวลาดูฤกษ์ คู่บ่าวสาวก็จะต้องไปพร้อมกัน พอพระอาจารย์ท่านบอกวันมา ก็จะกลายเป็นแพรรู้วันทันที ก็จะอด surprise อีกส่วนคือการไปจันทบุรีมันก็ต้องใช้เวลา ลางาน ขับรถไกล และต้องติดต่อพระอาจารย์ นัดวันเวลา ค่อนข้างจะยุ่งยาก ผมเลยคุยกับแม่ว่าคงจะไม่ได้ไปหาพระอาจารย์</p>

<p>ถัดมาผมพยายามดูฤกษ์ตามที่ตัวเองสะดวกก่อน หลักเกณฑ์ที่ผมดูคือ</p>
<ol><li>มีเวลามากพอในการเตรียมงานแต่งทั้งหมด ผมคิดว่าอยากจะได้เวลาเผื่ออย่างน้อย 6 เดือน</li>
<li>ไม่เอาหน้าร้อน เพราะเคยคุยกับแพรว่าเผื่ออยากจะจัดงานแบบ outdoor</li>
<li>มีเวลาให้ผมได้เก็บเงินเพิ่มอีกหน่อย สำรองเอาไว้</li>
<li>ขอวันหยุด วันเสาร์ อาทิตย์ หรือดีหน่อยถ้าตรงกับหยุดยาว</li></ol>

<p>จากนั้นก็ไปพยายามหาฤกษ์มงคลทาง internet ผมชอบเว็บนึงมากๆ อยากแนะนำ</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/dt.png" alt="79hora">
<a href="https://79hora.com/%E0%B8%A4%E0%B8%81%E0%B8%A9%E0%B9%8C%E0%B9%81%E0%B8%95%E0%B9%88%E0%B8%87%E0%B8%87%E0%B8%B2%E0%B8%99-%E0%B8%88%E0%B8%94%E0%B8%97%E0%B8%B0%E0%B9%80%E0%B8%9A%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B8%AA%E0%B8%A1%E0%B8%A3%E0%B8%AA%E0%B8%9B%E0%B8%B5-2566.html" rel="nofollow">79hora.com – ฤกษ์แต่งงาน</a></p>

<p>เราก็ไปดูวันที่มันเป็นสีชมพูๆ หรือมีคะแนนสูงๆ ไว้ก่อน ว่าจะเป็นช่วงประมาณไหน ในเว็บนี้ผมได้วันที่ชอบอยู่ประมาณเดือนสิงหาคม หรือ กันยายน ซึ่งห่างจากวันที่ผู้ใหญ่ไปคุยกันประมาณ 11-12 เดือน ผมมองว่ามันนานเกินไป</p>

<p>อีกเว็บนึงที่ไปดูก็คือ <a href="https://www.astroneemo.net/index.php/6" rel="nofollow">อาจารย์ณภัทร ศรีจักรนารท (Astro Neemo)</a> อันนี้เราต้องเสียเงินดู โดยเราส่งวันเดือนปี เวลาเกิดของคู่บ่าวสาวไปให้ แล้วเค้าก็จะส่งวันเวลากลับมาให้เรา สุดท้ายก็ได้วันที่ 7 พ.ค. กลับมา พร้อมรายละเอียดยาว 3 หน้ากระดาษ A4 มีตั้งแต่รายละเอียดการทำพิธีการต่างๆ เวลาสวมแหวน เวลารดน้ำสังฆ์ เวลาส่งตัว ซึ่งกว่าจะถึงวันที่ 7 พ.ค. ก็จะได้ระยะเวลาประมาณเกือบ 8 เดือน ซึ่งก็ใกล้เคียงกับที่เราอยากได้พอดี</p>

<p>พอได้วันแล้ว เราก็เก็บไว้เป็นความลับ ผมบอกให้แม่รู้ไว้แล้ว แต่ผมไม่บอกแพรและผู้ใหญ่ของแพร</p>

<h2 id="surprise-ขอแต-งงาน">Surprise ขอแต่งงาน</h2>

<p>จากวันที่ผู้ใหญ่ไปคุยกัน แพรก็พยายามถามตลอดว่าจะแต่งเมื่อไร ไปหาฤกษ์มาหรือยัง ผมก็บอกว่ายัง ทำตัวเป็นไม่รู้ ไม่ได้ดู ระหว่างนี้ก็ดูรายละเอียดการจัดงานไปพลางๆ เช่น จะจัดงานประมาณไหน จะจัด style ยังไง แบบห้อง ballroom หรือแบบริมทะเล จัดในกรุงเทพหรือต่างจังหวัด แพรอยากได้ rooftop ผมอยากได้ outdoor เราอยากได้ long table มีให้เลือกหลากหลายมากจนไม่รู้จะเลือกอะไร พยายาม survey สถานที่ต่างๆ ถามราคา แต่ก็ติดปัญหาว่าเราบอกวันที่จะจัดไม่ได้ ทางสถานที่ก็ได้แต่แนะนำรายละเอียดคร่าวๆ ถ้าเราไม่มีวันไปแจ้งเค้า ทางสถานที่ก็เช็คไม่ได้ว่าวันนั้นว่างไหม เพราะบางสถานที่ถูกจองเต็มล่วงหน้า 8-12 เดือน โดยเฉพาะวันที่ฤกษ์ดีมากๆ แต่วันที่เราได้มาไม่ได้เป็นวันมหาฤกษ์แบบนั้นก็โชคดีไป</p>

<p>ช่วงนี้เราก็แอบไปเตรียมแหวนสำหรับขอแต่งงาน หาทางวัด size แหวนแพร ไปสั่งทำแหวน เรื่องแหวนก็เป็นเรื่องที่ปวดหัวเหมือนกัน</p>

<p>ผู้หญิงจะได้แหวนจากผู้ชายทั้งหมดกี่วง? วงที่เราเอาไปขอแต่งงานจะเป็นวงเดียวกับในงานแต่งหรือเปล่า? ผมหาข้อมูลมาเยอะมาก สรุปให้ง่ายๆ ตามนี้</p>
<ol><li>แหวนที่ขอแต่งงาน ให้แล้วให้เลย ถ้าขอแต่งงานไปแต่เกิดเหตุไม่คาดฝัน งานแต่งล่ม ผู้ชายห้ามไปทวงของคืนเด็ดขาด ยกเว้นตกลงกันไว้ดิบดีว่าจะขอคืน</li>
<li>แหวนที่ขอแต่งงาน ไม่จำเป็นต้องมูลค่าสูง ด้วยเหตุผลตามข้อ 1</li>
<li>แหวนขอแต่งงาน อยากจะเลือก style ไหนก็เลือกไปตามความชอบ จะเอาแบบ infinity ring หรือแบบเพชรชู ก็แล้วแต่ตามงบประมาณที่มี</li>
<li>แหวนที่ใช้ในพิธีสวมแหวน ควรจะเป็นแบบเพชรชู และควรจะดูอลังการหน่อย และผู้หญิงควรจะไปเลือกด้วยตัวเอง</li></ol>

<p>ดังนั้นนผู้หญิงจะได้แหวนที่ถูกขอแต่งงาน 1 วง ถ้าจะเอาแหวนนั้นไปใช้ในพิธีด้วยก็ได้ หรือจะซื้อใหม่เพิ่มอีก 1 วงสำหรับใช้ในพิธีก็ได้ และผู้ชายก็จะมีแหวนของตัวเองอีก 1 วง</p>

<p>สำหรับในเคสของผมคือมีทั้งหมด 3 วง โดยแหวนขอแต่งงาน ผมเลือกแบบ infinity ring มีเพชรเล็กๆ ล้อมรอบทั้งวง ก็จะใส่ง่ายในชีวิตประจำวัน ใส่ติดมือได้ ไม่จำเป็นต้องซื้อแหวนเกลี้ยง และแพรเองก็ชอบใส่เพชรกับ white gold อยู่แล้ว</p>

<p>พอได้แหวนสำหรับขอแต่งงาน ก็เหลือแค่ไป surprise ผมก็หาสถานการณ์ที่เหมาะสมอยู่นานมาก ไม่รู้เหมือนกันว่าจะขอตอนไหน โชคดีมีวันที่ไปเที่ยวน่านพอดี ก็เลยเล็งว่าจะไปขอตอนนั้น บรรยากาศน่าจะดี วิวน่าจะสวยและก็สงบหน่อย</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/surprise.jpg" alt="Surprise"></p>

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

<p>จังหวะที่จะขอแต่งงาน สิ่งที่ต้องทำคือ ตั้งสติให้ดี อย่าลืมใจความสำคัญที่จะพูดกับเจ้าสาวของเรา The show must go on. พลาดอะไรไปก็ช่างมัน ไม่มีใครรู้หรอกว่าเราพูดครบหรือไม่ครบ</p>

<p>หลังจากที่ขอแต่งงานเสร็จ เราก็บอกวันแต่งให้แพรและพ่อแม่แพรรู้ พอกลับจากไปเที่ยว ก็เริ่มลุยเตรียมงานแต่งเต็มกำลัง</p>

<h2 id="งานแต-งด-านแรก-งบประมาณและสถานท">งานแต่งด่านแรก: งบประมาณและสถานที่</h2>

<p>เรื่องสถานที่ จำนวนแขก เป็นสิ่งสำคัญที่สุดที่จะกระทบกับงบประมาณ สิ่งแรกที่เราควรทำคือ ตั้งวงเงินสูงสุดที่เราจะจ่ายสำหรับจัดงานแต่งเสียก่อน สำหรับผมกับแพรสิ่งที่เราทำคือ เราดูว่าเราพอรับค่าใช้จ่ายได้ที่เท่าไร ตอนแรกเรามองว่าอยากจะจัดให้อยู่ในราคาประมาณ 500,000 – 600,00 บาท จากนั้นเราก็ไปเริ่ม survey ราคา</p>

<blockquote><p>อยากบอกทุกคนว่า ค่าใช้จ่ายจริง มักจะเป็น 2 เท่าของงบที่เราตั้งไว้ตอนแรก ดังนั้นเตรียมเงินเผื่อๆ กันไว้ด้วยครับ</p></blockquote>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/venue.png" alt="Venue"></p>

<p>เราเริ่มติดต่อสถานที่ นัดวันเข้าไปดูสถานที่จริง เก็บข้อมูลราคา ค่าอาหารต่อหัวของแขก รวมถึง package ของแถมต่างๆ เอาไว้ เราหาสถานที่มากกว่า 20 ที่ ติดต่อไปจริงๆ ประมาณ 10 กว่าที่ ได้ข้อมูลมาเปรียบเทียบกัน</p>

<p>หลักๆ ค่าใช้จ่ายมันแบ่งสัดส่วนกันประมาณนี้
1. ค่าอาหารของแขก ~50-60% ของงบประมาณ
2. ค่าสถานที่ ค่าตกแต่ง ~30% ของงบประมาณ
3. จิปาถะ เช่น ค่าชุดแต่งงาน ค่ารองเท้า ช่างแต่งหน้า รันคิว ขันหมาก พิธีกร ฯลฯ ~10-20% ของงบประมาณ</p>

<p>ดังนั้นถ้าต้องการคุมงบประมาณให้อยู่หมัด สิ่งที่ต้องใส่ใจมากๆ คือ อาหารและสถานที่</p>

<p>ปกติแล้วสถานที่แต่งละแห่งจะ bundle อาหารเข้าไปด้วย บางแห่งสถานที่สวยมาก ค่าสถานที่ไม่แพงแต่ค่าอาหารต่อหัวแพงลิบลับ ราคาอาหารต่อหัวที่ survey ในกรุงเทพและปริมลฑลมีตั้งแต่ หัวละ 800 บาท ไปจนถึง 2,500 บาท แต่โดยทั่วไปของในกรุงเทพ ค่าอาหารต่อหัวจะอยู่ที่ประมาณ 1,400 บาท</p>

<p>จำนวนแขกในงานของผมรวมทั้งผู้ใหญ่และเพื่อนๆ ผมกับแพร อยู่ที่ ~350 คน คิดเป็นเงินค่าอาหารทั้งหมด 490,000 บาทเป็นอย่างน้อย ซึ่งยังไม่รวมค่าอื่นๆ อีกมากมาย ดังนั้นงบประมาณ 500,000 – 600,000 ที่วางไว้นั้นไม่สามารถทำได้จริง</p>

<p>สุดท้ายเราก็เลือกที่จะปรับงบประมาณเพิ่ม เพราะเราต้องจัดงานในกทม เพื่อให้แขกเดินทางมาสะดวก เราตั้งงบประมาณใหม่ไว้ที่ประมาณ 800,000 – 900,000 บาท</p>

<p>ถัดมา สิ่งที่ต้องดูในการเลือกสถานที่ก็คือจำนวนแขก บางสถานที่รับได้แค่ 180 คน บางแห่งรับได้แค่ 250 คน มีแค่ไม่กี่สถานที่ ที่สามารถจุได้ 350 คนในครั้งเดียว และสถานที่ที่จุคนได้มากๆ ก็จะไม่สวยถูกใจแพร หรือไม่ก็คืออยู่ไกลมาก เช่น นนทบุรี เดินทางลำบาก ไม่ติดรถไฟฟ้า เป็นต้น</p>

<p>โดยเฉลี่ยแล้ว ถ้าจะให้เลือกสถานที่ได้ง่ายหน่อย มีตัวเลือกมากๆ จำนวนแขกควรจะอยู่ที่ประมาณ 150-180 คน แต่ถ้าเกินกว่านี้ ตัวเลือกที่เหลือมักจะเป็นห้อง ballroom ของโรงแรม</p>

<p>บางสถานที่ก็มี decoration ให้เลยในตัว บางสถานที่ไม่มี decoration ให้ก็ต้องไปจ้าง organizer เข้ามา ซึ่งส่วนใหญ่สถานที่จะมี organizer ที่เป็น partner อยู่แล้ว เราสามารถสอบถามกับทางสถานที่ได้เลย แต่การตกแต่งโดย organizer ก็จะมีค่าตกแต่งเพิ่มเติม ขึ้นอยู่กับความอลังการที่เราอยากได้ เริ่มต้นที่ผมรู้ก็จะประมาณ 50,000 บาท ซึ่งก็มักจะได้ backdrop ทางเข้างานและตกแต่งสถานที่ประปรายเพียงนิดหน่อยเท่านั้น ถ้า option จัดเต็มหน่อยก็จะประมาณ 100,000 – 150,000 บาท</p>

<p>บางสถานที่ก็จะมีขันหมากและของแถมต่างๆ เพิ่มให้ด้วย ผมแนะนำว่าเรื่องขันหมากและของแถมพวกนี้ไม่จำเป็นต้องสนใจมาก เพราะเดี๋ยวเราจะต้องจ้างทีมงานรันคิวเข้ามา แล้วทีมงานมักจะมีสิ่งเหล่านี้พ่วงเป็น package มาให้เลย ดังนั้นเลือกสถานที่โดยเน้นปัจจัยด้าน อาหาร จำนวนแขก การตกแต่ง การเดินทาง เป็นหลักก็เพียงพอ</p>

<p>สุดท้ายเราก็ไปจบที่โรงแรม Pullman Bangkok Hotel G ที่เลือกที่นี่เพราะว่าได้ห้อง ballroom ชั้นบนสุดของโรงแรม และได้ภาพ pre-wedding เป็นชั้นดาดฟ้าของโรงแรมตามที่แพรอยากได้ ส่วนเรื่องราคาก็อยู่ในเกณฑ์รับได้</p>

<p>ปัญหาเดียวของโรงแรมนี้คือห้อง ballroom รับคนได้แค่ ~230 คน ดังนั้นเราต้องแบ่งคนออกเป็น 2 กลุ่ม แล้วจัดงาน 2 รอบ ซึ่งก็เพิ่มค่าใช้จ่ายไปอีกพอสมควร แต่อีกเหตุผลคือ ผมอยากจัดงานเด็กแยกจากงานผู้ใหญ่ เพื่อจะได้คุม mood &amp; tone ของงานเด็กได้เต็มที่ แถมมี after party แบบสุดเหวี่ยงด้วย</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/rooftop.jpg" alt="rooftop"></p>

<h2 id="งานแต-งด-านท-2-ท-มงานต-างๆ">งานแต่งด่านที่ 2: ทีมงานต่างๆ</h2>

<p>นอกจากสถานที่ อาหารแล้ว ก็มีจะมีเรื่องทีมงานที่เราจะต้องจัดการเยอะมากๆ</p>
<ol><li>ร้านชุดบ่าวสาว</li>
<li>ทีมงาน pre-wedding</li>
<li>ทีมงานช่างแต่งหน้า ทำผมบ่าวสาว</li>
<li>ทีมงาน organizer ที่จัดการเรื่องการตกแต่งสถานที่</li>
<li>ทีมงานของฝ่ายสถานที่ เราต้องคอยประสานเจ้าของสถานที่ตลอด รวมถึงเรื่องอาหารด้วย</li>
<li>ทีมงาน รันคิว ที่คอยดูแลเรื่องคิวพิธีการต่างๆ</li>
<li>ทีมงานช่างภาพ คอยเก็บภาพบรรยากาศ</li>
<li>ทีมงานนักดนตรี เครื่องเสียง สำหรับปาร์ตี้</li>
<li>เพื่อนบ่าวสาว</li>
<li>พ่อแม่ของบ่าวสาว และญาติคนสำคัญต่างๆ</li>
<li>แขก VIP เช่น ผู้อาวุโสฝ่ายเจ้าบ่าว เจ้าสาว และประธานในพิธี</li>
<li>พิธีกรในงานฉลอง และนายพิธีในงานพิธีการไทย</li>
<li>พระสงฆ์</li>
<li>เจ้าหน้าที่จดทะเบียนในงานแต่ง</li>
<li>supplier ต่างๆ ที่เราอาจจะติดต่อ เช่น สั่งเครื่องดื่ม alcohol, ทำการ์ด, ของชำร่วย, ของรับไหว้, ฯลฯ</li></ol>

<p>ถ้าไม่อยากปวดหัวในสิ่งเหล่านี้ แนะนำให้จ่ายเงินจ้าง organize หรือ wedding planner ดูแลให้ทั้งหมดแทนนะครับ (ใช้เงินแก้ปัญหา) แต่ผมไม่จ้างครับ จะทำเองทั้งหมด 555</p>

<p>ทุกคนก็ค่อยๆ ไล่ติดต่อไปตามลำดับนะครับ แล้วผมจะค่อยๆ อธิบายในแต่ละเรื่องไป</p>

<h3 id="เร-องท-1-ช-ดบ-าวสาว">เรื่องที่ 1: ชุดบ่าวสาว</h3>

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

<p>ปกติแล้วร้านจะขายเป็น package ชุดเจ้าสาว 1 ชุด ได้ชุดเจ้าบ่าวมาด้วยคู่กัน ราคาโดยเฉลี่ยอยู่ที่ ~20,000 บาท ต่อ 1 set (แบบที่ร้านได้กำไรแล้วด้วย) ดังนั้นถ้าเราได้ราคาแพงกว่านี้ ก็ควรจะดูว่ามันคุ้มค่าจริงไหม</p>

<p>เรื่องเทคนิคหมกเม็ดของร้านชุดเจ้าสาวคงไม่พูดถึงนะครับ ขอให้ทุกคนไปตามหาเอาใน internet</p>

<p>สิ่งที่แนะนำให้ทุกคนทำคือ พยายามไปลองชุดบ่อยๆ หา style ชุดที่ตัวเองชอบ ถ้าเป็นการเช่าชุด ปกติแล้วชุดจะถูกวนไปใช้งานอยู่เรื่อยๆ มีคิวต่อยาวๆ ทำให้เรามีโอกาสได้ลองชุดที่เราอยากลองน้อยลง เพราะร้านเค้าจะต้อง lock เอาไว้ให้คนที่จะใช้งานจริง ถ้าเจอชุดที่สวยถูกใจแล้ว ให้ lock ชุดไว้เลย ไม่ต้องเสียดายว่าจะมีชุด collection ออกใหม่มา</p>

<h3 id="เร-องท-2-ช-างแต-งหน-า-ทำผม">เรื่องที่ 2: ช่างแต่งหน้า ทำผม</h3>

<p>แนะนำให้รีบหา ดูผลงาน ติดต่อเอาไว้แต่เนิ่นๆ เพราะช่างแต่งหน้าเด็ดๆ มักจะคิวเต็มเร็วมาก โดยเฉพาะวันที่ฤกษ์ดี ผมจองล่วงหน้าประมาณ 4-5 เดือน โดยเฉลี่ยค่าแต่งหน้าเจ้าสาวและเจ้าบ่าวจะอยู่ที่ประมาณ 12,000 – 15,000 บาท เป็นราคาเริ่มต้น ซึ่งจะแต่งแค่รอบเดียว เช่น เช้า หรือ เย็น แต่ถ้าเรามี 2 งานแบบ เช้า-เที่ยง ก็จะคิดเป็น 1.5 รอบ ก็จะเพิ่มเงินเล็กน้อย เช่น จาก 15,000 บาท เป็น 20,000 บาท</p>

<h3 id="เร-องท-3-organizer-ตกแต-งสถานท">เรื่องที่ 3: organizer ตกแต่งสถานที่</h3>

<p>ควรจะคุยกับ organizer เรื่องการตกแต่งสถานที่แบบละเอียดประมาณ 2-3 เดือน ก่อนถึงวันจริง ถ้า organizer เป็น partner กับทางสถานที่อยู่แล้วก็จะไม่ค่อยมีปัญหา เพราะทางสถานที่จะห่วงเรื่องคุณภาพและทีมงาน organizer ว่าอาจจะทำให้สถานที่เค้าเสียหาย ทำงานไม่ได้มาตรฐาน ซึ่งเราอาจจะโดนค่าปรับจากเจ้าของสถานที่ได้ ต้องคอยเช็คกับทางสถานที่อยู่เรื่อยๆ ว่าจะมีปัญหาอะไรไหมในรูปแบบการตกแต่งที่เราอยากได้</p>

<p>เราต้องคุยเรื่อง theme สีของงาน, mood &amp; tone เพื่อที่ organizer จะได้ตกแต่งได้ถูกต้อง รวมถึงเอา theme งานไปทำการ์ด และสิ่งต่างๆ เพื่อให้สวยงามไปในทางเดียวกัน</p>

<h3 id="เร-องท-4-พ-ธ-การ-ร-นค-ว-พ-ธ-กร">เรื่องที่ 4: พิธีการ รันคิว พิธีกร</h3>

<p>บ่าวสาวควรติดต่อทีมงานรันคิว พิธีกรเอาไว้เนิ่นๆ ขอ template ต่างๆ เอาไว้ เช่น เราจะจัดงานแบบไหน มีลำดับพิธีการยังไง ปกติทีมรันคิวจะมีลำดับงานแบบมาตรฐานเอาไว้อยู่แล้ว เราสามารถใช้ตรงนี้เป็นต้นแบบได้เลย</p>

<p>ถัดมาคือบ่าวสาวต้องคุยกันเองให้มาก ว่าจะให้ลำดับพิธีในงานเป็นยังไง มีเกมเล่นในงานไหม เป็นเกมอะไร จะมี surprise อะไรกันหรือเปล่า ทั้งหมดเพื่อที่จะได้ดูเรื่องเวลาว่าแน่นเกินไปไหม เป็นไปได้หรือเปล่า</p>

<p>ปกติแล้วกว่าจะสรุปลงตัวและนิ่งก็จะอยู่ราวๆ 2-4 สัปดาห์ก่อนวันจริง</p>

<h3 id="เร-องท-5-เพ-อนบ-าวสาว">เรื่องที่ 5: เพื่อนบ่าวสาว</h3>

<p>เพื่อนบ่าวสาวของเราดีมากๆ เพื่อนเจ้าสาว แพรขอให้เพื่อนสนิทมาทำหน้าที่ตรงนี้ ส่วนเพื่อนเจ้าบ่าว ผมขอให้เพื่อนที่ทำงานใน office มาช่วยทำหน้าที่ โดยสาเหตุหลักๆ ของผมคือ ผมทำงานกับเพื่อนใน office มานาน และเรารู้ฝีมือกันดีว่าทุกคนทำงานได้ดี เราคุยงานกันเร็ว จัดการงานกันได้ราบรื่น</p>

<p>ปกติเพื่อนบ่าวสาวจะมีหน้าที่คือ</p>
<ol><li>ช่วยในพิธีแห่ขันหมาก กั้นประตูเงินประตูทอง</li>
<li>ช่วยรับแขกที่โต๊ะต้อนรับ</li>
<li>ช่วยโปรยดอกไม้ตอนเปิดตัวบ่าวสาว</li>
<li>ช่วยในพิธีต่างๆ นิดหน่อย หรือแล้วแต่บ่าวสาวจะขอให้ช่วย</li></ol>

<p>เพื่อนบ่าวสาวของเรา เรากะใช้งานเต็มที่มากๆ 555 ตั้งแต่ช่วยตัดสินใจเรื่องต่างๆ ช่วยบริหารแขกในงาน อำนวยความสะดวกให้แขก ประสานกับทีมงานต่างๆ แทนเรา เช็คความเรียบร้อยของสถานที่แทนเรา ดูแลของ ดูแลทรัพย์สิน และอีกเยอะมากๆ</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/briefs.jpg" alt="briefs"></p>

<p>เราพาเพื่อนบ่าวสาวมาเจอหน้าพร้อมกันก่อนวันงาน ทานข้าวกัน ทำความรู้จักกัน และผมก็เตรียม file brief งานเพื่อนบ่าวสาวอย่างละเอียด ว่าแต่ละคนรับผิดชอบหน้าที่อะไร ใครต้องประจำตรงไหน หากมีปัญหาเกิดขึ้นต้องแก้ปัญหาอย่างไร พร้อม contact ของ key person ต่างๆ ทั้งหมดเพื่อให้งานราบรื่น ไม่ต้องวิ่งวุ่นขวักไขว่หาตัวกันไม่เจอ แล้วเพื่อนบ่าวสาวเราก็ทำออกมาได้ดีมากๆ ต้องปรบมือให้ทุกคนครับ</p>

<p><a href="https://docs.google.com/document/d/1CYC2R5ZSXBfhz8aOmrIkMeCRxt0j-bBH8Xo8N4PxNAs/edit?usp=sharing" rel="nofollow">ตัวไฟล์ brief งาน กดดูที่นี่</a></p>

<h3 id="เร-องท-6-wedding-presentation-website">เรื่องที่ 6: wedding presentation &amp; website</h3>

<p>อันนี้คือสุดมากๆ เราสำรวจราคาค่าจ้างแล้วนะครับ ปกติทำ video presentation ก็จะอยู่ที่ประมาณ 15,000 – 50,000 บาท แล้วแต่ว่าจะจ้าง studio professional ระดับไหน</p>

<p>แต่ว่าผมตัดสินใจทำเองทุกอย่าง เพราะเรารู้สึกว่า การไปจ้างมักจะมีข้อจำกัด เช่น เราจะขอสั่งแก้งานได้กี่ครั้ง จะได้ storyline และ cutting ตามที่อยากได้ไหม จำนวนเวลาที่ออกกองก็มีจำกัด ฯลฯ ทำเองสบายใจกว่า</p>

<p>ผมก็ลงทุนซื้ออุปกรณ์ไว้แล้ว เช่น GoPro แต่พอลองใช้จริงๆ ปรากฎมันไม่ค่อย work ผมมีกล้อง mirrorless อยู่ตัวนึง และก็มี lens อยู่นิดหน่อย เลยไปซื้อ Ronin DJI RS3 mini มาเพิ่ม แล้วก็ไปลากน้องสาวมาช่วยถ่ายให้ คือทุกคนก็ใหม่หมด ใช้งานไม่เป็น การแสดง การเขียนบทก็ไม่เคยเรียน ก็นั่นแหละ นั่งเรียนด้วยตัวเองตั้งแต่ 0 เรื่องตัดต่อก็ไปเรียนวิธีการใช้ DaVinci Resolve 18 ใหม่ทั้งหมด</p>

<p>เราก็ไปถ่ายทำที่หัวหิน หาสถานที่ที่เหมาะสมอยู่สักพัก เขียนบทประมาณ 1 เดือน ถ่ายทำ 3 วัน ตัดต่ออีก 2-3 เดือน แก้ไขเล็กน้อย ทั้งหมดก็เรียบร้อย ตัว file final กับ shotlist ที่เขียนก็อาจจะไม่ได้ตรงกันทั้งหมดเพราะความสามารถคนถ่ายและนักแสดงมีจำกัด เรื่องไฟ แสดง อุปกรณ์ หลายๆ อย่างก็ต้องปรับกันไปตามหน้างาน</p>

<p>website ลงทะเบียนผมก็ทำเอง ออกแบบเองทั้งหมด บ้าพลังขนาดไหน 555</p>
<ul><li><a href="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/ps-web-04.png" rel="nofollow">link screenshot website วันที่ 4 พ.ค.</a></li>
<li><a href="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/ps-web-07.png" rel="nofollow">link screenshot website วันที่ 7 พ.ค.</a></li>
<li><a href="https://docs.google.com/spreadsheets/d/1DOAhO9uxTXIIi3PaG53iViyXm0iw17ul1TQy_N4BoK8/edit?usp=sharing" rel="nofollow">link file shotlist ของ presentation</a></li>
<li><a href="https://www.youtube.com/watch?v=Df_azkx4j70" rel="nofollow">link video presentation</a></li></ul>

<h3 id="เร-องท-7-วงดนตร-after-party">เรื่องที่ 7: วงดนตรี after party</h3>

<p>การเอาวงดนตรีเข้ามาก็มีรายละเอียดปลีกย่อย สำหรับผมผู้ที่ไม่รู้เรื่องวงดนตรีใดๆ ทั้งสิ้นก็จะค่อนข้างยากหน่อย</p>

<p>ปกติแล้วสิ่งที่จะต้องดูคือ นักร้องนักดนตรี, เครื่องดนตรี, เครื่องเสียง, ระบบแสงสี ทั้งหมดนี้เราจะจ้างแยกกันเป็นส่วนๆ ก็ได้ บางทีมงานก็จะมี bundle กันมา</p>

<p>ตอนแรกมีวงที่ผมชอบมากๆ วงนึง ก็คือวงโนบาร์หน้าช่อ ทางวงมีนักดนตรี สามารถให้ทางวงจัดการเรื่องเครื่องเสียงได้ ผมไม่ได้ถามเรื่องระบบแสงสี</p>

<p>อีกวงก็คือพอดีไปงานแต่งเพื่อนที่ office แล้ววงนี้ก็เล่นสนุกดี นั่นก็คือวง Catzilla เราเลยหา contact ทักไปคุยกับทางวง แล้วทางวงเค้ามีบริการแบบ full option คือตั้งแต่ระบบแสงสีไปจนถึงนักดนตรีครบหมดในทีเดียว ราคาที่ได้มาก็ถือว่ารับได้ เราเลยเลือกวงนี้</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/catzilla.jpg" alt="catzilla"></p>

<p>จบงานออกมาก็คือไม่ผิดหวังเลย จัดเต็มทุกอย่าง พี่บุ๋นก็ให้คำแนะนำผมดีมากๆ ในรายละเอียดต่างๆ</p>

<p>ส่วนเรื่องอื่นๆ ที่เหลือก็จิปาถะแล้วครับ เช่น เจ้าหน้าที่จดทะเบียนในงาน ต้องไปติดต่อ ต้องนิมนต์พระสงฆ์ไหม ไปรับไปส่งท่านยังไง อุปกรณ์ต่างๆ ที่ต้องเตรียม อันไหนสถานที่เตรียมให้ อันไหนทีมงานเตรียมให้ อันไหนที่บ่าวสาวต้องเตรียมเอง</p>

<h2 id="งานแต-งด-านท-3-เร-ยนเช-ญแขก">งานแต่งด่านที่ 3: เรียนเชิญแขก</h2>

<p>เนื่องจากเรามีจำนวนที่นั่งจำกัด เราก็จะเชิญแขกมากเกินไม่ได้ เราแบ่งงานผู้ใหญ่ไว้ที่ 200 คน และงานเด็ก 150 คน</p>

<p>ฝ่ายผู้ใหญ่ เราให้พ่อแม่จัดการ เพราะเป็นแขกของท่าน ให้ท่าน list รายชื่อแขกที่จะเชิญ จัดคนลงโต๊ะให้ได้ (เป็นโต๊ะจีน) จัดว่าใครจะนั่งกับใคร จากนั้นก็เอารายชื่อไปพิมพ์ซอง แขกบางท่านก็โทรไปเชิญและส่งการ์ด online</p>

<p>ของฝั่งเด็ก เราก็ list รายชื่อแขกออกมา พิมพ์ชื่อบนซอง ส่งการ์ดเชิญไปให้</p>

<p>การ์ดแต่งงานเราต้องสั่งทำ 2 ชุด มีรายละเอียดไม่เหมือนกัน ราคาการ์ดถูกสุดก็ประมาณ 12 บาทต่อใบ ถ้าปั้มฟลอยแบบเราก็จะบวกราคาเพิ่ม บางอันดีๆ หรูๆ หน่อยอาจจะถึง 50 บาทต่อใบก็ได้ ของผมจบงานแล้วการ์ดเหลือเยอะพอสมควรเพราะพิมพ์มาเท่ากับจำนวนแขก แต่ไม่ได้แจกแขกทุกคน บางคนก็ส่ง online บางคนก็ให้ใบเดียวแต่เชิญทั้งครอบครัว</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/card.jpg" alt="card"></p>

<p>เราเริ่มแจกการ์ดเชิญประมาณ 1-2 เดือนก่อนวันงาน ถ้าแจกล่วงหน้านานกว่านั้นก็อาจจะลืม ถ้าแจกกระชั้นชิดไปแขกก็อาจจะไม่สะดวก</p>

<p>ปัญหาคือการ confirm แขก เป็นเรื่องที่ยากมากๆ บางท่านก็แจ้งว่าเดี๋ยวจะ confirm อีกที บางท่านก็สามารถบอกได้เลยว่ามาได้หรือมาไม่ได้ รวมถึงยิ่งวันใกล้ๆ งาน ก็จะมีแขกบางท่านโทรมายกเลิกเพิ่มเติม</p>

<p>ผมเองก็ไม่รู้เหมือนกันว่าควรจะทำวิธีไหนดีที่สุด แต่วิธีที่ผมใช้คือ</p>
<ol><li>list รายชื่อแขกออกมาให้เกินกว่าจำนวนที่นั่งประมาณ 20-30% (จริงๆ เราอยากเชิญทุกคนในนี้ แต่เนื่องด้วยสถานที่มันทำไม่ได้จริงๆ)</li>
<li>เชิญไปให้เกินกว่าจำนวนที่นั่ง 10%</li>
<li>ถ้ามีแขกยืนยันว่าไปไม่ได้เลยทันที ก็ไล่เชิญเพิ่มไปเรื่อยๆ พยายาม keep จำนวนให้เกิน 10% ไว้เสมอ</li>
<li>2 สัปดาห์สุดท้ายก่อนถึงวันแต่ง เราจะไม่เชิญใครเพิ่มแล้ว</li></ol>

<p>โดยปกติสถานที่จะสามารถเพิ่มโต๊ะได้ประมาณ 10% ดังนั้น best case คือคนมาเกิน 10% ก็จะได้นั่งตรงนี้ที่สำรองไว้ แต่ถ้าเป็น normal case คือหน้างานคนจะมาน้อยกว่าที่เชิญ 10% อยู่แล้ว แขกที่มาจริงก็จะไม่ดูโล่งจนเกินไป</p>

<p>สำหรับงานเด็กที่เป็น international buffet จะไม่ค่อยมีปัญหาหากเชิญเกิน 10%
แต่สำหรับผู้ใหญ่ที่เป็นโต๊ะจีน จะมีปัญหาในการจัดโต๊ะมากๆ เพราะเราไม่สามารถจับคนที่ไม่รู้จักกัน ให้มานั่งด้วยกันได้ ดังนั้นในงานผู้ใหญ่ เราจะไม่เชิญคนเกินเด็ดขาด</p>

<h2 id="งานแต-งด-านท-4-ร-บม-อก-บป-ญหา">งานแต่งด่านที่ 4: รับมือกับปัญหา</h2>

<p>จัดงานแต่งมีปัญหาให้ลุ้นตลอดครับ ยิ่งใกล้วันแต่งเท่าไร ก็จะมีปัญหาจุกจิกโผล่มาเต็มไปหมด ดังนั้น พยายามเคลียตารางช่วงใกล้ๆ วันแต่งให้โล่งๆ ไว้ อย่าพยายามยัดสิ่งที่ต้องทำมาใกล้วันแต่งจนเกินไป</p>

<p>ผมเองก็มีปัญหาที่เจออยู่บ้างเช่นกัน</p>

<h3 id="พ-ธ-การเช-า-เท-ยงแน-นและร-บจนเก-นไป">พิธีการเช้า-เที่ยงแน่นและรีบจนเกินไป</h3>

<p>สืบเนื่องมาจากเรื่องฤกษ์ที่ดูมา พิธีสงฆ์ 6.30 ขันหมากเริ่ม 8.39 เวลาสวมแหวนตามฤกษ์คือ 9.39 แล้วรับไหว้ที่เวลา 11.09 แต่จำนวนแขกรับไหว้คือประมาณ 30 คู่ ซึ่งน่าจะจบที่ 12.10 แล้วบ่าวสาวต้องไปเปลี่ยนชุด เปลี่ยนผมอีก 1 ชั่วโมง ทำให้พิธีการในงานฉลองเที่ยงต้องไปเริ่ม 13.00 และต้องจบภายใน 14.00 เพราะใช้ห้องได้ถึงแค่เวลานี้ ทางผู้ใหญ่ก็มีบอกว่าอยากจะให้มีเวลามาถ่ายรูป ต้อนรับแขกก่อนเข้าพิธีฉลองด้วย เพราะถ้าพิธีจบเวลา 14.00 เราต้องคืนสถานที่เลย ทุกคนก็จะต้องรีบออกจากห้อง รีบกลับทันที</p>

<p>แพรและผมต้องคุยกัน และก็ต้องไปคุยกับพ่อแม่ รวมถึงแจ้งกับแขกทุกท่านที่เรียนเชิญไว้แล้วด้วยว่าจะมีการเปลี่ยนเวลาให้เร็วขึ้น เราตกลงกันว่า พิธีสงฆ์ 6.30 ตามเดิมไม่เปลี่ยน แต่ขยับทุกอย่างลงมาประมาณ 1 ชั่วโมง ขันหมากเริ่มที่ 8.00 ปล่อยทุกอย่าง flow ไปได้เลยไม่ยึดตามฤกษ์ที่ดูมา อย่างที่บอกไปคือผมไม่เคยถือเรื่องฤกษ์อยู่แล้ว ดังนั้นผมเองไม่มีปัญหา</p>

<p>ถัดมาคือต้องไปไล่คุยกับทีมงานรันคิว สถานที่ และ organizer เรื่องเวลาใหม่ทั้งหมด เพื่อที่ทุกคนจะได้ปรับตารางให้ตรงกัน จะได้ไม่ผิดพลาด</p>

<p>ยังโชคดีที่เรื่องนี้โผล่มาประมาณ 2 สัปดาห์ก่อนวันงาน ก็เลยไม่วุ่นวายมากนัก แล้ววันจริง พอเรารันไปตามตารางเวลาใหม่นี้ เราก็รู้สึกว่างานมันราบรื่นมากๆ ทุกคน happy เราก็ happy</p>

<h3 id="ท-มงานม-การเปล-ยนแปลงคน">ทีมงานมีการเปลี่ยนแปลงคน</h3>

<p>เริ่มตั้งแต่ Sales ของโรงแรมมีการเปลี่ยนใหม่ เราก็ห่วงว่า sales คนใหม่จะตกหล่นรายละเอียดอะไรหรือเปล่า รวมถึงเราตกลงกับ sales คนเก่าไว้ว่าจะขอให้เค้าช่วยงานบางอย่างด้วย พอเค้าไม่อยู่ เราก็ต้องหาทีมงานมาทำตรงจุดนั้นแทน</p>

<p>Sales ร้านชุดเจ้าสาวลาออก ทำให้คนดูแลเรื่องชุดเปลี่ยใหม่ แล้วร้านชุดก็ดูจะตกๆ หล่นๆ อยู่แล้ว เลยยิ่งเป็นห่วง แต่คนที่มาดูแลช่วงต่อก็โอเค เรา recheck รายละเอียดต่างๆ ดูแล้วครบถ้วน ไม่มีอะไรตกหล่น ก็สบายใจ</p>

<p>ทีมรันคิว ยังไม่ได้ lock คนที่จะมาดูแลพิธีการให้ เรื่องนี้ไม่ได้มีปัญหามาก เราแค่ห่วงว่าทางทีมรันคิวจะส่งรายละเอียดงานกันครบถ้วนไหม จะ brief งานกันถูกไหม แต่พอหน้างานจริงก็ราบรื่นมากๆ และทีมงานก็ professional มากๆ ด้วย</p>

<p>เรื่องคนที่มีหน้าที่ตามจุดต่างๆ ก็มีการเปลี่ยนแปลงอยู่บ้าง แต่ก็แก้ปัญหาเฉพาะหน้า ผ่านมาได้หมด</p>

<h3 id="ว-นท-4-พ-ค-ก-บ-7-พ-ค-ม-surprise-ให-ล-นตลอด">วันที่ 4 พ.ค. กับ 7 พ.ค. มี surprise ให้ลุ้นตลอด</h3>

<p>วันที่ 7 พ.ค. เกือบจะเป็นวันเลือกตั้งทั้งประเทศ ก็ห่วงว่าแขกจะมางานน้อยลง จะ cancel เพราะติดไปเลือกตั้ง ฯลฯ</p>

<p>วันที่ 4 พ.ค. เป็นวันหยุด แต่วันที่ 5 ไม่หยุด แล้วรัฐบาลประกาศให้ 5 เป็นวันหยุดพิเศษเพิ่มขึ้นมา เลยกลายเป็นหยุดยาว 4-7 พ.ค. ก็ห่วงว่าแขกจะใช้หยุดยาวนี้ในการไปเที่ยว แล้วไม่สามารถมางานแต่งเราได้</p>

<p>อีกเรื่องคือวันหยุดยาวแล้วห้องโรงแรมจะเต็มไหม ถ้าแขกจะมานอนพัก ตอนแรกดูราคาหน้าเว็บไว้ค่อนข้างสูงทีเดียว คืนละ ~5,000 บาท แต่พอใกล้ๆ วัน ห้องไม่ได้แน่นขนาดนั้น ราคาหน้าเว็บก็ drop ลงมาเท่ากับราคาพิเศษที่เราได้คุยกับโรงแรมไว้</p>

<p>วันที่ 4 พ.ค. เราจะจัดงานปาร์ตี้ ก็ห่วงว่าจะให้เสริฟเครื่องดิ่มได้หรือเปล่า เราเช็คแล้วว่าทำได้ก็รอดไป</p>

<p>วันที่ 7 พ.ค. เป็นวันเลือกตั้งล่วงหน้า มี beer สดเหลือจากวันที่ 4 พอสมควร แต่เอามาเสริฟไม่ได้เพราะผิดกฎหมาย ก็เสียดายกันไป</p>

<h3 id="เร-องจ-ปาถะต-างๆ-ท-ค-อยๆ-โผล-มาท-ละน-ด">เรื่องจิปาถะต่างๆ ที่ค่อยๆ โผล่มาทีละนิด</h3>

<p>ผมทำ todo list ไว้ว่าในแต่ละวันต้องทำอะไรให้เสร็จบ้าง ต้อง final เรื่องอะไร บางอย่างก็ตัดสินใจไม่ทำ ยกเลิก บางอย่างก็ทำเสร็จก่อน บางอย่างก็ delay และก็มีบางอย่างเพิ่มเข้ามา</p>

<p>อย่าง script brief งานเพื่อนบ่าวสาว ก็เป็นสิ่งที่ต้องทำเพิ่ม และไม่ได้มีจดไว้ตั้งแต่ตอนแรก</p>

<p>ของที่เราจะต้องขนไปโรงแรม เราก็ต้องเตรียม checklist ให้ครบ ไม่งั้นเดี๋ยววันงานจริงตกหล่นแล้วจะมีปัญหา</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/checklist.png" alt="checklist"></p>

<h3 id="บ-าวสาวไม-สบายก-อนแต-งงาน">บ่าวสาวไม่สบายก่อนแต่งงาน</h3>

<p>เรื่องนี้เป็นสิ่งที่กังวลที่สุดเลย เริ่มจากแพรไปขัดผิวแล้วมีผื่นแพ้แดงคันขึ้นทั้งตัว ต้องวิ่งวุ่นพาไปหาหมอ</p>

<p>ผมเองก็ท้องเสียไป 2 วันติด หลังจากจบ party วันที่ 4 พ.ค. แต่โชคดีหายทันวันที่ 7 พ.ค.</p>

<p>ส่วนแพรจบ party มาก็คือเท้าเจ็บ เลือดอาบนิ้ว ต้องคอยทำแผล ห่วงจะใส่รองเท้าคัชชูไม่ได้ ทางโรงแรมก็ดูแลดีมาก ผมกับแพรเดินไปทานอาหารเช้าที่ห้องอาหารโรงแรม ใส่ slipper ไป น้องที่หน้า front แจ้งว่าไม่อนุญาติให้ใส่ ห่วงว่าจะอันตรายเพราะพื้นลื่น เราเลยแจ้งว่าพอดีเท้าเป็นแผลต้องขอใส่อันนี้ น้องที่ front ก็แอบไปแจ้งทาง sales (คุณแนน) ว่าเจ้าสาวเท้าเจ็บ คุณแนนก็รีบโทรมาหาทันทีด้วยความเป็นห่วง และทีมงานโรงแรมทุกคนก็ช่วยดูแลแพรเป็นอย่างดี</p>

<p>และก็โชคดีที่ไม่มีใครไม่สบายเพิ่มอีก</p>

<h2 id="จบงานแล-วเป-นไงบ-าง">จบงานแล้วเป็นไงบ้าง</h2>

<p>สรุปค่าใช้จ่ายโดนไปทั้งหมดประมาณ 1,020,000 บาท ยังไม่รวมสินสอดที่ฝ่ายชายต้องเตรียม หักลบกลบหนี้กับซองช่วยงานก็ยังขาดทุนอยู่พอสมควร แต่ก็เป็นงานแต่งที่เราทั้งคู่ happy มากๆ เราได้งานเด็กในแบบที่เราอยากได้ คนที่มางานเด็กก็ชมว่าสนุก เมากันเละเทะไปหลายคน มีแค่เรื่องอาหารที่ดูเหมือนจะน้อยไปนิดและเราเพิ่งจะรู้ทีหลัง (ไม่รู้ว่าทำไมโรงแรมทำอาหารมาไม่พอ เพราะแขกก็มาไม่ถึง 150 คน)</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/flying-duck.jpg" alt="Flying duck"></p>

<p>ส่วนงานผู้ใหญ่ก็เป็นพิธีการตามธรรมเนียมที่ผู้ใหญ่อยากได้ปกติ พิธีการราบรื่น อาหารโอเค งานไม่เร่งรีบ ทุกคนมีเวลาได้พูดคุยกัน พ่อแม่แพรก็ชมมาว่าจัดงานออกมาดี เราทั้งคู่ก็ดีใจ</p>

<p>งานนี้เป็นงานที่ผมและแพรตัดสินใจรายละเอียดต่างๆ เอง เลือกสิ่งต่างๆ เอง เราแค่รับฟัง feedback จากผู้ใหญ่แล้วเราดูว่าเราจะปรับหรือไม่ เราไม่ตามใจผู้ใหญ่ทั้งหมด เพราะว่านี่คืองานแต่งของเราทั้ง 2 คน และเงินที่ใช้จัดงานก็เป็นเงินของเราทั้งคู่ล้วนๆ ก็มีบางครั้งที่ต้องต่อรองกับผู้ใหญ่กันไปบ้าง แต่ก็ผ่านมาได้ตลอด</p>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/wedding/wedding-folder.png" alt="wedding folder"></p>

<p>อยากจะบอกว่า การจัดงานแต่งเป็น project scale ใหญ่มากๆ project นึง ถ้าใครไม่เคยทำ project management scale ใหญ่ ไม่เคยคุย vendor เอง ไม่เคยบริหารทีมงาน ไม่เคย compare ราคา หรือเตรียมเอกสาร brief งานคนต่างๆ ผมแนะนำให้จ้าง organize ทั้งหมดดีกว่า ไม่อย่างนั้นงานอาจจะไม่ราบรื่นนัก และก็จะรู้สึกเหนื่อย ทรมานมากๆ ผมเองทำ spreadsheet เพื่อดูแลงานทุกส่วนเยอะมากๆ มีเอกสารที่ต้องดูแล ต้องส่ง แก้ไขจำนวนไม่น้อย นัดวัน + follow up action จาก supplier ตลอดเพื่อไม่ให้พลาด deadline และต้องคอย update กับผู้ใหญ่ตลอดเวลาว่างานไปถึงจุดไหนแล้ว เราทั้ง 2 คนต้องช่วยกันประสานกับทีมงานและ stakeholders ร่วม 20 กว่าคนโดยที่ไม่มีประสบการณ์มาก่อน ถือว่าเป็นงานยากพอสมควร</p>

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

<p>ยังไม่มีแพลนไป honeymoon ไว้วางแผนอีกที และก็ยังไม่ได้มีแพลนจะมีน้องตอนนี้ ขอไปเที่ยว กู้คืนชีวิต lockdown ช่วง covid 2-3 ปีนี้ก่อน</p>
]]></content:encoded>
      <guid>https://tnpl.me/psiloveyou</guid>
      <pubDate>Sat, 20 May 2023 10:28:26 +0000</pubDate>
    </item>
    <item>
      <title>Migration patterns</title>
      <link>https://tnpl.me/migration-patterns</link>
      <description>&lt;![CDATA[So you want to migrate legacy systems that no one knows in detail and no one wants to touch it. That system might be very brittle, cause a lot of trouble, can&#39;t scale to handle the business growth, and your team doesn&#39;t want to deal with that anymore.&#xA;&#xA;One day, the team was in the room to discuss fancy ideas of how we can change the system, and how we can utilize amazing modern technologies. Someone shared their own experiences about the best way to achieve the migration without causing too much pain, burden, and issues to the team.&#xA;&#xA;The system was just 3-tiers monolith architecture -- Mobile app, API server, and DB. The team decided to move forward with microservices with a fancy horizontal scalable database, a cache server, and a centralized message queue for event-driven applications.&#xA;&#xA;Woah, that&#39;s too many changes! Should you do that? Is that possible? Or how could we possibly make that? Let&#39;s find out.&#xA;&#xA;!--more--&#xA;More contexts about the migration&#xA;The API for the mobile app was developed a long time ago. it was evolved and did not fit well with the company&#39;s needs.&#xA;The new set of services will be developed with completely new technology and new API schemas. You can&#39;t reuse old codebases.&#xA;Some features were deprecated or removed from the user perspective but the code still exists. No one actually knew what was used or not. Digging through the code to gain understanding would take a lot of effort.&#xA;&#xA;Things don&#39;t work well with the migration&#xA;&#xA;Before we do any migrations, please make sure you migrated away from the following:&#xA;&#xA;DB-controlled ID (Auto incremental ID, UUID generated by DB, etc)&#xA;Distributed DB transaction (Transaction that spans multiple DB instances)&#xA;Database Foreign key&#xA;&#xA;Migration goals&#xA;&#xA;The migration might take months to years, depending on how complex it is. It&#39;s not an easy boring task. It&#39;s full of traps, sweat, and tears. Unfortunately, the system has to be migrated otherwise it will drag you down until the whole company dies. I will write some other approaches (both good and bad) at the end of this blog post, so you can learn and don&#39;t have to repeat the same mistakes.&#xA;&#xA;We want the migration process to be:&#xA;&#xA;Low risk - least issues, downtime&#xA;Repeatable - easy to follow, able to get the same result&#xA;Effective - not much waste, minimum effort, get value fast&#xA;&#xA;We should treat the migration process to be much like the refactoring process. To achieve the 3 goals above, we must put some constraints at first, and after we completed the migration, all constrains can be removed and it should unlock the full potential of making any changes to the new system architecture.&#xA;&#xA;There are 2 key constraints to consider here: the feature set and the API specs.&#xA;Basically, the set feature and API specs of the new system must not exceed the existing system. Otherwise, this would be considered as feature development, not system migration. Let&#39;s take a look for examples.&#xA;&#xA;[NOT OK] Your order processing system has 5 states and the new system has 8 states.&#xA;[OK] Your order processing system has 5 states and the new system has 3 states.&#xA;[NOT OK] The old user API schema doesn&#39;t have &#34;Age&#34; field but the new schema has it&#xA;[OK] The old user API schema has &#34;full name&#34; field and the new schema has &#34;first name&#34; and &#34;last name&#34; fields that can be extracted from existing &#34;full name&#34; data.&#xA;[OK] The old product API has an image URL field as a string but the new schema has an image URL as an array of strings.&#xA;&#xA;You see it. Keep the feature set and API specs not exceeding the scope of the existing system. And once the system is migrated away, hopefully, the new codebase and architecture would enable your team to make changes easily.&#xA;&#xA;Migration steps&#xA;&#xA;migration-stages&#xA;&#xA;There are 6 stages.&#xA;&#xA;Initial stage&#xA;Translation stage&#xA;Dual-write stage&#xA;Read-compare stage&#xA;Cut-off stage&#xA;Clean-up stage&#xA;&#xA;For the Initial stage, there won&#39;t be much detail, so we&#39;ll go into detail about the rest of the stages.&#xA;&#xA;Translation stage&#xA;&#xA;The goal of this is to test new the API schema with the client. You create a new service with the technology you want. You implement a new API spec and translate it into the existing API. Then, migrate the mobile app to use the new API, test it, and release it.&#xA;&#xA;In this stage, no database or persistent was developed. You just translate ugly-existing API to the new and clean API you want. Please keep in mind that this could be possible because you don&#39;t add any features.&#xA;&#xA;The value you get from this stage is that&#xA;&#xA;You test your new API design to see if that fits well with the client&#xA;You may adjust some UI in mobile to match the new experiences you want. You can test the new UI design with your customer and get feedback. If anything goes wrong, you can easily change it without a lot of wasted effort.&#xA;&#xA;Dual-write stage&#xA;&#xA;After everything is going well, then you can start implementing more on the writing side (insert, update, delete). Start by setup a database you want, then write some code to insert, update, and delete the data on the database when the API is invoked.&#xA;&#xA;You shouldn&#39;t implement every table and deploy all of it at once. You should split the work into multiple chunks, each chunk should focus on some set of tables. Keep deploying it into production continuously. This allows you to test whether the DB is well-suited to your need. Also, use feature flags for enabling and disabling the write into the new DB at the runtime (see the code sample in the section below).&#xA;&#xA;Inserting records should be fine in all cases. Some old records that hadn&#39;t been inserted by the new system might be missing during the update or deletion. You can ignore those errors for a while and focus on the correctness of the newly created data.&#xA;&#xA;Do not fetch the data from the new DB for returning to the client yet because it might not be complete or correct. Let it runs on production for a couple of days, monitor for any issues, fix it, and then you&#39;re good for the next step.&#xA;&#xA;If anything goes wrong with your design or your data in the new system, then you can simply reset the DB and redesign it again. It&#39;s low-risk because the data hasn&#39;t been used by the client.&#xA;&#xA;  A common mistake is to start working on the reading side first instead of the writing side. This will hold you back because have to share the DB, keep it to be compatible with the existing system, do massive DB migration which uses a lot of time, and find out that it&#39;s very hard to shut the DB down during the clean-up stage.&#xA;    Another common mistake is coupling the new system with the existing one. For example, after you insert a record into the new DB, then you use the result to update the existing system via its API. This is not the result you want because you need to remove the existing system without changing the implementation of the new one. Make sure those 2 systems don&#39;t know each other.&#xA;&#xA;Read-compare stage&#xA;The prerequisite in this stage is you need to back-fill the data on the new system. From the previous stage, not all the data are available on the new system. Now, you must find somehow to migrate it. Examples of methods could be by writing DB export &amp; import or writing a script to invoke an endpoint on the new system to set up those data.&#xA;&#xA;Then, you should compare the result of all responses back to the client. Log all the records that don&#39;t match. Fixes the mismatched data and fixes the bug that causes it. Wait until the system is stable and almost has no issues.&#xA;&#xA;All of the comparisons must be controlled under the same feature flag.&#xA;&#xA;You could write a feature flag and flow controls like pseudo-code below:&#xA;func someApiHandler(request, response):&#xA;    stage = featureFlag.get(&#34;migration.someApi&#34;, default=&#34;translation&#34;)&#xA;    if stage in [&#34;cut-off&#34;]:&#xA;        result = callNewApi(request)&#xA;    if stage in [&#34;translation&#34;, &#34;dual-write&#34;, &#34;read-compare&#34;]:&#xA;        result = callOldApi(request)&#xA;&#xA;    if stage in [&#34;dual-write&#34;, &#34;read-compare&#34;]:&#xA;        newResult = callNewApi(request)&#xA;    if stage in [&#34;read-compare&#34;]:&#xA;       compareResponseAndLogIfNotMatched(result, newResult)&#xA;&#xA;    return result&#xA;&#xA;Cut-off stage&#xA;At this point, all bugs should be fixed. All response data should be matched. Performance, availability, and reliability should meet your expectation. You can simply switch the feature flag to stage &#34;cut-off&#34;. Be careful because, at this point, you can&#39;t turn it back. If anything is broken, you have to do a hotfix.&#xA;&#xA;You should take a look at the existing system to see if there&#39;s any traffic going there. Does it have any load? Where is the source of the traffic?&#xA;&#xA;Clean-up stage&#xA;You&#39;re free to destroy the existing system and remove the migration code on the new system. Now, you are in a better world with a shining bright future. You can add many features you want and hopefully, the new code and the new architecture could enable you to achieve and unlock your business goals faster.&#xA;&#xA;  As you may see, the migration code is quite generic which you can develop as a generic migration proxy that can route an API call to different versions of backends. This also helps you eliminate code clean-up effort in the last stage. I don&#39;t know if there is any open source but hope someone will develop it.&#xA;&#xA;Other approaches that may work or may not&#xA;&#xA;I&#39;ve seen system migration attempts using these patterns. Some of it work in some context. I sorted it by the most possible approach to the lease possible approach. I still recommended the pattern above and please don&#39;t use the below if you don&#39;t know what you are doing.&#xA;&#xA;1. DB synchronization with some down-time during the cut-off&#xA;You can use some tools like AWS DMS to synchronize DB changes. When the date has come, you simply shut down all the services and up with the new DB.&#xA;&#xA;This could work for simple migration such as splitting the database. This pattern also only has a couple of steps to do which require a small amount of effort.&#xA;&#xA;2. Modularize the codebase by refactoring, then splitting the deployment&#xA;If you can&#39;t make the code to be very modular with very low coupling, it might be impossible to split it into services. The idea is simply to only allow those modules to communicate with each other using only basic data types such as DTO and primitives. Do not allow them to share the same ORM model or use shared memory.&#xA;&#xA;After the code has been refactored, you can make a copy of its deployment and split the traffic. You may need an API gateway for routing and aggregation responses from different services.&#xA;&#xA;The downside of this approach is that it requires you to refactor all the code (both used and unused) which takes a huge amount of effort to understand all corner cases of the existing system.&#xA;&#xA;3. DB synchronization with reading endpoints first&#xA;It&#39;s similar to #1 except the new API service will be implemented with reading endpoints first. This may sound OK to you but it turns out to cause problems later.&#xA;&#xA;Tools like DMS will make a conflict write when you want to start implementing writing endpoints&#xA;DMS might cause issues from time to time such as synchronization lag, lost write, etc.&#xA;Dependency between systems is cyclic which makes it very hard to fully migrate the system.&#xA;&#xA;4. Rewrite from the ground up and migrate later&#xA;This approach starts by developing the new system with your desired architecture, data modeling, APIs, etc. Then, try to find a way to migrate both DB data and API calls later.&#xA;&#xA;It creates an illusion of making progress because you can say that the new system is developing and features are implementing. We&#39;re approaching the target. But, actually, you don&#39;t deliver any value to users at all.&#xA;&#xA;It is also very hard to create a plan to migrate the data from a messy database to the new one while the new database also requires more newly data input from users.&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>So you want to migrate legacy systems that no one knows in detail and no one wants to touch it. That system might be very brittle, cause a lot of trouble, can&#39;t scale to handle the business growth, and your team doesn&#39;t want to deal with that anymore.</p>

<p>One day, the team was in the room to discuss fancy ideas of how we can change the system, and how we can utilize amazing modern technologies. Someone shared their own experiences about the best way to achieve the migration without causing too much pain, burden, and issues to the team.</p>

<p>The system was just 3-tiers monolith architecture — Mobile app, API server, and DB. The team decided to move forward with microservices with a fancy horizontal scalable database, a cache server, and a centralized message queue for event-driven applications.</p>

<p>Woah, that&#39;s too many changes! Should you do that? Is that possible? Or how could we possibly make that? Let&#39;s find out.</p>



<h1 id="more-contexts-about-the-migration">More contexts about the migration</h1>
<ol><li>The API for the mobile app was developed a long time ago. it was evolved and did not fit well with the company&#39;s needs.</li>
<li>The new set of services will be developed with completely new technology and new API schemas. You can&#39;t reuse old codebases.</li>
<li>Some features were deprecated or removed from the user perspective but the code still exists. No one actually knew what was used or not. Digging through the code to gain understanding would take a lot of effort.</li></ol>

<h2 id="things-don-t-work-well-with-the-migration">Things don&#39;t work well with the migration</h2>

<p>Before we do any migrations, please make sure you migrated away from the following:</p>
<ul><li>DB-controlled ID (Auto incremental ID, UUID generated by DB, etc)</li>
<li>Distributed DB transaction (Transaction that spans multiple DB instances)</li>
<li>Database Foreign key</li></ul>

<h1 id="migration-goals">Migration goals</h1>

<p>The migration might take months to years, depending on how complex it is. It&#39;s not an easy boring task. It&#39;s full of traps, sweat, and tears. Unfortunately, the system has to be migrated otherwise it will drag you down until the whole company dies. I will write some other approaches (both good and bad) at the end of this blog post, so you can learn and don&#39;t have to repeat the same mistakes.</p>

<p>We want the migration process to be:</p>
<ol><li>Low risk – least issues, downtime</li>
<li>Repeatable – easy to follow, able to get the same result</li>
<li>Effective – not much waste, minimum effort, get value fast</li></ol>

<p>We should treat the migration process to be much like the refactoring process. To achieve the 3 goals above, we must put some constraints at first, and after we completed the migration, all constrains can be removed and it should unlock the full potential of making any changes to the new system architecture.</p>

<p>There are 2 key constraints to consider here: the feature set and the API specs.
Basically, the set feature and API specs of the new system must not exceed the existing system. Otherwise, this would be considered as feature development, not system migration. Let&#39;s take a look for examples.</p>
<ul><li>[NOT OK] Your order processing system has 5 states and the new system has 8 states.</li>
<li>[OK] Your order processing system has 5 states and the new system has 3 states.</li>
<li>[NOT OK] The old user API schema doesn&#39;t have “Age” field but the new schema has it</li>
<li>[OK] The old user API schema has “full name” field and the new schema has “first name” and “last name” fields that can be extracted from existing “full name” data.</li>
<li>[OK] The old product API has an image URL field as a string but the new schema has an image URL as an array of strings.</li></ul>

<p>You see it. Keep the feature set and API specs not exceeding the scope of the existing system. And once the system is migrated away, hopefully, the new codebase and architecture would enable your team to make changes easily.</p>

<h1 id="migration-steps">Migration steps</h1>

<p><img src="https://s3.ap-southeast-1.amazonaws.com/blob.tnpl.me/images/migration.png" alt="migration-stages"></p>

<p>There are 6 stages.</p>
<ol><li>Initial stage</li>
<li>Translation stage</li>
<li>Dual-write stage</li>
<li>Read-compare stage</li>
<li>Cut-off stage</li>
<li>Clean-up stage</li></ol>

<p>For the Initial stage, there won&#39;t be much detail, so we&#39;ll go into detail about the rest of the stages.</p>

<h2 id="translation-stage">Translation stage</h2>

<p>The goal of this is to test new the API schema with the client. You create a new service with the technology you want. You implement a new API spec and translate it into the existing API. Then, migrate the mobile app to use the new API, test it, and release it.</p>

<p>In this stage, no database or persistent was developed. You just translate ugly-existing API to the new and clean API you want. Please keep in mind that this could be possible because you don&#39;t add any features.</p>

<p>The value you get from this stage is that</p>
<ol><li>You test your new API design to see if that fits well with the client</li>
<li>You may adjust some UI in mobile to match the new experiences you want. You can test the new UI design with your customer and get feedback. If anything goes wrong, you can easily change it without a lot of wasted effort.</li></ol>

<h2 id="dual-write-stage">Dual-write stage</h2>

<p>After everything is going well, then you can start implementing more on the writing side (insert, update, delete). Start by setup a database you want, then write some code to insert, update, and delete the data on the database when the API is invoked.</p>

<p>You shouldn&#39;t implement every table and deploy all of it at once. You should split the work into multiple chunks, each chunk should focus on some set of tables. Keep deploying it into production continuously. This allows you to test whether the DB is well-suited to your need. Also, use feature flags for enabling and disabling the write into the new DB at the runtime (see the code sample in the section below).</p>

<p>Inserting records should be fine in all cases. Some old records that hadn&#39;t been inserted by the new system might be missing during the update or deletion. You can ignore those errors for a while and focus on the correctness of the newly created data.</p>

<p>Do not fetch the data from the new DB for returning to the client yet because it might not be complete or correct. Let it runs on production for a couple of days, monitor for any issues, fix it, and then you&#39;re good for the next step.</p>

<p>If anything goes wrong with your design or your data in the new system, then you can simply reset the DB and redesign it again. It&#39;s low-risk because the data hasn&#39;t been used by the client.</p>

<blockquote><p>A common mistake is to start working on the reading side first instead of the writing side. This will hold you back because have to share the DB, keep it to be compatible with the existing system, do massive DB migration which uses a lot of time, and find out that it&#39;s very hard to shut the DB down during the clean-up stage.</p>

<p>Another common mistake is coupling the new system with the existing one. For example, after you insert a record into the new DB, then you use the result to update the existing system via its API. This is not the result you want because you need to remove the existing system without changing the implementation of the new one. Make sure those 2 systems don&#39;t know each other.</p></blockquote>

<h2 id="read-compare-stage">Read-compare stage</h2>

<p>The prerequisite in this stage is you need to back-fill the data on the new system. From the previous stage, not all the data are available on the new system. Now, you must find somehow to migrate it. Examples of methods could be by writing DB export &amp; import or writing a script to invoke an endpoint on the new system to set up those data.</p>

<p>Then, you should compare the result of all responses back to the client. Log all the records that don&#39;t match. Fixes the mismatched data and fixes the bug that causes it. Wait until the system is stable and almost has no issues.</p>

<p>All of the comparisons must be controlled under the same feature flag.</p>

<p>You could write a feature flag and flow controls like pseudo-code below:</p>

<pre><code class="language-python">func someApiHandler(request, response):
    stage = featureFlag.get(&#34;migration.someApi&#34;, default=&#34;translation&#34;)
    if stage in [&#34;cut-off&#34;]:
        result = callNewApi(request)
    if stage in [&#34;translation&#34;, &#34;dual-write&#34;, &#34;read-compare&#34;]:
        result = callOldApi(request)

    if stage in [&#34;dual-write&#34;, &#34;read-compare&#34;]:
        newResult = callNewApi(request)
    if stage in [&#34;read-compare&#34;]:
       compareResponseAndLogIfNotMatched(result, newResult)

    return result
</code></pre>

<h2 id="cut-off-stage">Cut-off stage</h2>

<p>At this point, all bugs should be fixed. All response data should be matched. Performance, availability, and reliability should meet your expectation. You can simply switch the feature flag to stage “cut-off”. Be careful because, at this point, you can&#39;t turn it back. If anything is broken, you have to do a hotfix.</p>

<p>You should take a look at the existing system to see if there&#39;s any traffic going there. Does it have any load? Where is the source of the traffic?</p>

<h2 id="clean-up-stage">Clean-up stage</h2>

<p>You&#39;re free to destroy the existing system and remove the migration code on the new system. Now, you are in a better world with a shining bright future. You can add many features you want and hopefully, the new code and the new architecture could enable you to achieve and unlock your business goals faster.</p>

<blockquote><p>As you may see, the migration code is quite generic which you can develop as a generic migration proxy that can route an API call to different versions of backends. This also helps you eliminate code clean-up effort in the last stage. I don&#39;t know if there is any open source but hope someone will develop it.</p></blockquote>

<h1 id="other-approaches-that-may-work-or-may-not">Other approaches that may work or may not</h1>

<p>I&#39;ve seen system migration attempts using these patterns. Some of it work in some context. I sorted it by the most possible approach to the lease possible approach. I still recommended the pattern above and please don&#39;t use the below if you don&#39;t know what you are doing.</p>

<h2 id="1-db-synchronization-with-some-down-time-during-the-cut-off">1. DB synchronization with some down-time during the cut-off</h2>

<p>You can use some tools like AWS DMS to synchronize DB changes. When the date has come, you simply shut down all the services and up with the new DB.</p>

<p>This could work for simple migration such as splitting the database. This pattern also only has a couple of steps to do which require a small amount of effort.</p>

<h2 id="2-modularize-the-codebase-by-refactoring-then-splitting-the-deployment">2. Modularize the codebase by refactoring, then splitting the deployment</h2>

<p>If you can&#39;t make the code to be very modular with very low coupling, it might be impossible to split it into services. The idea is simply to only allow those modules to communicate with each other using only basic data types such as DTO and primitives. Do not allow them to share the same ORM model or use shared memory.</p>

<p>After the code has been refactored, you can make a copy of its deployment and split the traffic. You may need an API gateway for routing and aggregation responses from different services.</p>

<p>The downside of this approach is that it requires you to refactor all the code (both used and unused) which takes a huge amount of effort to understand all corner cases of the existing system.</p>

<h2 id="3-db-synchronization-with-reading-endpoints-first">3. DB synchronization with reading endpoints first</h2>

<p>It&#39;s similar to #1 except the new API service will be implemented with reading endpoints first. This may sound OK to you but it turns out to cause problems later.</p>
<ul><li>Tools like DMS will make a conflict write when you want to start implementing writing endpoints</li>
<li>DMS might cause issues from time to time such as synchronization lag, lost write, etc.</li>
<li>Dependency between systems is cyclic which makes it very hard to fully migrate the system.</li></ul>

<h2 id="4-rewrite-from-the-ground-up-and-migrate-later">4. Rewrite from the ground up and migrate later</h2>

<p>This approach starts by developing the new system with your desired architecture, data modeling, APIs, etc. Then, try to find a way to migrate both DB data and API calls later.</p>

<p>It creates an illusion of making progress because you can say that the new system is developing and features are implementing. We&#39;re approaching the target. But, actually, you don&#39;t deliver any value to users at all.</p>

<p>It is also very hard to create a plan to migrate the data from a messy database to the new one while the new database also requires more newly data input from users.</p>
]]></content:encoded>
      <guid>https://tnpl.me/migration-patterns</guid>
      <pubDate>Mon, 01 May 2023 02:23:28 +0000</pubDate>
    </item>
    <item>
      <title>Career progression guideline - effectively acquire skills</title>
      <link>https://tnpl.me/career-progression-guideline-accelerating-the-progress</link>
      <description>&lt;![CDATA[This part in #careers, I will write about the way to effectively acquire skills which help accelerate your career progress. I wrote about my own progression framework, which consist of 2 major key points -- skills and scopes that play a vital part of prohibiting or allowing anyone to grow.&#xA;&#xA;TL;DR: Acquiring skills by doing the real job. Always keep looking for more challenging tasks, projects, and expand scopes. Asking someone more expert to be your mentor and learn from them.&#xA;&#xA;What&#39;s wrong with the way of learning&#xA;&#xA;I have done some experiment about knowledge sharing. I shares knowledge, interesting topic, trends to the team regularly (e.g. weekly or bi-weekly). Here&#39;s what I did and observed.&#xA;&#xA;!--more--&#xA;&#xA;The knowledge that has been shared is not being use soon.&#xA;The team understand the idea at the sharing moment.&#xA;The team still told me that they understand even if the piece of knowledge is a bit of abstract. For example I shared about a strategy to write test that heavily inspired from functional programming.&#xA;3-4 weeks later, there&#39;s a task that suits to use the idea shared previously. The team just forget it so I have to share again.&#xA;I collect feedback which told me to give more concrete example. I did it but the result is the same, they cannot actually use it.&#xA;I know more about the subject that was shared because I need to prepare it but I believed the team won&#39;t because they just listen to it.&#xA;What I shared mostly based on my own experience. I use it to do the real job, see the result, sometimes if it doesn&#39;t work then I just throw it out.&#xA;&#xA;From the observation, knowledge sharing by just listening from expert won&#39;t work. The listeners are able to learn the concept but they are not acquiring skills into the level of being able to really use it.&#xA;&#xA;In order to finish a piece of work, the person has to have an ability to demonstrate the skill, adapt, and solve an any unexpected problem. You can&#39;t swim by reading from books.&#xA;&#xA;Your career cannot be advanced if you are only able to talk about skills. You have to done something and it is required the skill.&#xA;&#xA;What to do instead?&#xA;&#xA;Instead of learning like a school where a teacher gives a lecture, we can learn a new subject just-in-time or on-the-job. This is the best time for a person to concentrate on the subject and put thoughts and creativities in order to finish the job.&#xA;&#xA;Everyday, you and your manager have to maximize the learning by assigning a task which have to balancing between practicing a person&#39;s skills to become an expert vs expanding knowledge in a new area.&#xA;&#xA;For example, if you want to become a solution architect, you and your manage can work together with backlogs and let you explore different solutions, do proof of concept with a clear goal of the task. You can also get mentor by another solution architect in your company or work with manager on what he/she is expecting to see. Another example is if you are a web developer and want to learn more about mobile development, you can start working on mobile bug fix and take more challenges as you progress. You can also pairing with a mobile engineer in your team or asking for learning materials support from your company.&#xA;&#xA;I would like to give a tips on learning from materials here: reading is faster than watching a video and don&#39;t learn it all, just learn enough for you to do the work. You should also allocate more free time to learn deeper in the subject.&#xA;&#xA;After you have learned a new subject, you should also give a presentation to the team. The goal here is not only about let the others learn from you but it&#39;s about communicating what you did and improve your understanding on the subject by thinking in a different perspective.&#xA;&#xA;You can&#39;t do it alone&#xA;&#xA;With this way of learning, you have to incorporate with you manager about your goals. The company also has to have tasks that align with your goals as well -- if you want to become a mobile engineer but the company is only doing a website, you&#39;d better looking for a new job.&#xA;&#xA;Starting by have a clear picture of skills you want to acquire/learn, then you can optimize your learning. If you don&#39;t have a skills list, you should talk with experts who can paint a clear picture so you can choose you own journey.&#xA;&#xA;Hope this help.]]&gt;</description>
      <content:encoded><![CDATA[<p>This part in <a href="https://tnpl.me/tag:careers" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">careers</span></a>, I will write about the way to effectively acquire skills which help accelerate your career progress. I wrote about my own progression framework, which consist of 2 major key points — skills and scopes that play a vital part of prohibiting or allowing anyone to grow.</p>

<p><strong>TL;DR: Acquiring skills by doing the real job. Always keep looking for more challenging tasks, projects, and expand scopes. Asking someone more expert to be your mentor and learn from them.</strong></p>

<h1 id="what-s-wrong-with-the-way-of-learning">What&#39;s wrong with the way of learning</h1>

<p>I have done some experiment about knowledge sharing. I shares knowledge, interesting topic, trends to the team regularly (e.g. weekly or bi-weekly). Here&#39;s what I did and observed.</p>


<ul><li>The knowledge that has been shared is not being use soon.</li>
<li>The team understand the idea at the sharing moment.</li>
<li>The team still told me that they understand even if the piece of knowledge is a bit of abstract. For example I shared about a strategy to write test that heavily inspired from functional programming.</li>
<li>3-4 weeks later, there&#39;s a task that suits to use the idea shared previously. The team just forget it so I have to share again.</li>
<li>I collect feedback which told me to give more concrete example. I did it but the result is the same, they cannot actually use it.</li>
<li>I know more about the subject that was shared because I need to prepare it but I believed the team won&#39;t because they just listen to it.</li>
<li>What I shared mostly based on my own experience. I use it to do the real job, see the result, sometimes if it doesn&#39;t work then I just throw it out.</li></ul>

<p>From the observation, knowledge sharing by just listening from expert won&#39;t work. The listeners are able to learn the concept but they are not acquiring skills into the level of being able to really use it.</p>

<p>In order to finish a piece of work, the person has to have an ability to demonstrate the skill, adapt, and solve an any unexpected problem. You can&#39;t swim by reading from books.</p>

<p>Your career cannot be advanced if you are only able to talk about skills. You have to done something and it is required the skill.</p>

<h1 id="what-to-do-instead">What to do instead?</h1>

<p>Instead of learning like a school where a teacher gives a lecture, we can learn a new subject just-in-time or on-the-job. This is the best time for a person to concentrate on the subject and put thoughts and creativities in order to finish the job.</p>

<p>Everyday, you and your manager have to maximize the learning by assigning a task which have to balancing between practicing a person&#39;s skills to become an expert vs expanding knowledge in a new area.</p>

<p>For example, if you want to become a solution architect, you and your manage can work together with backlogs and let you explore different solutions, do proof of concept with a clear goal of the task. You can also get mentor by another solution architect in your company or work with manager on what he/she is expecting to see. Another example is if you are a web developer and want to learn more about mobile development, you can start working on mobile bug fix and take more challenges as you progress. You can also pairing with a mobile engineer in your team or asking for learning materials support from your company.</p>

<p>I would like to give a tips on learning from materials here: reading is faster than watching a video and don&#39;t learn it all, just learn enough for you to do the work. You should also allocate more free time to learn deeper in the subject.</p>

<p>After you have learned a new subject, you should also give a presentation to the team. The goal here is not only about let the others learn from you but it&#39;s about communicating what you did and improve your understanding on the subject by thinking in a different perspective.</p>

<h1 id="you-can-t-do-it-alone">You can&#39;t do it alone</h1>

<p>With this way of learning, you have to incorporate with you manager about your goals. The company also has to have tasks that align with your goals as well — if you want to become a mobile engineer but the company is only doing a website, you&#39;d better looking for a new job.</p>

<p>Starting by have a clear picture of skills you want to acquire/learn, then you can optimize your learning. If you don&#39;t have a skills list, you should talk with experts who can paint a clear picture so you can choose you own journey.</p>

<p>Hope this help.</p>
]]></content:encoded>
      <guid>https://tnpl.me/career-progression-guideline-accelerating-the-progress</guid>
      <pubDate>Sun, 27 Nov 2022 02:35:14 +0000</pubDate>
    </item>
    <item>
      <title>Lacking of skills and weaknesses that block your career</title>
      <link>https://tnpl.me/lacking-of-skills-and-weaknesses-that-block-your-career</link>
      <description>&lt;![CDATA[Tools&#xA;&#xA;I&#39;ve talk with many people -- engineers in my company, candidates in interview sessions, meetups, etc. They are often excited about new technologies, frameworks, tools and eager to learn, try, and talk about it. They may listed those tools as what they have experiences in CV. This is good but I think that over the half of those people are &#34;tools&#39; user&#34; -- who know how to use tools but don&#39;t understand it deeply.&#xA;Complexity&#xA;&#xA;Cynefin&#xA;&#xA;There&#39;s types of task&#39;s complexity that engineer will have to solve. CRUD or defined business workflow maybe classified as &#34;Clear&#34; so any engineer can simply write a program in a very straight forward way and this type of task is suitable for junior level.&#xA;&#xA;!--more--&#xA;Next is &#34;Complicated&#34;, an engineer may received a customer problem and asked to solve it. It also could be a technical challenge. The solution is not identified yet. The problem itself is solvable and feasible in theory. For example, scaling the system to handle more load, or in business context which a coupon quota is overused somehow. This type of task is suitable for senior level.&#xA;&#xA;I won&#39;t go into more types here but I hope you can see what will happen when task is more complex.&#xA;&#xA;Dots &amp; connect the dots&#xA;&#xA;In order to solve more complex problem, engineer has to use more knowledge and has ability to mix &amp; match many things and come up with a solution.&#xA;&#xA;Dots represent knowledge. Connect the dots is a process of utilizing knowledge and creating a solution that could solve a problem.&#xA;&#xA;In order to increase ability to solve problems, it&#39;s simply to increase more dots as much as possible and practicing to connect those dots together so one can generate many new possible solutions.&#xA;&#xA;For tools&#39; users, their dots are limited -- even if they know a lot of tools but those knowledge are quite shallow. It&#39;s hard to use across different domain because tools are tend to be specific for some use cases. Underneath those tools, there&#39;s layers of knowledge, techniques, and principles to be acquired -- which are more fundamental and more reusable across different domains.&#xA;&#xA;Critical thinking&#xA;&#xA;When you&#39;re asked &#34;What&#39;s happened when you open a website?&#34; and your answer was &#34;The browser send a request to server,  received a response back, and render it.&#34;, you&#39;re not think critical enough. You also may be asked &#34;Why Kafka is so fast?&#34; and the answer was &#34;Because everyone said so.&#34;, it&#39;s not a critical thinking.&#xA;&#xA;In order to think critically, you have to tear it apart, think finer in every piece, go deeper more into detail, asking why again and again, until you arrived at the atomic piece of knowledge that cannot be split anymore -- the first principle. This is how anyone should learn about anything. In this way, you will acquire much more dots than before.&#xA;&#xA;When solving a complex problem, divide &amp; conquer is a common technique used which break down a problem into smaller problems that easier to solve. It&#39;s kind of the same way of critical thinking. If you want to apply critical thinking into problem solving, you should look closer into a problem, identify any detail out of it, tear it apart into many pieces, dig down inside what&#39;s seem to be magic or abstract, and try to arrive at the first principle.&#xA;&#xA;Wrap up&#xA;&#xA;Skills are required for growing up to be senior or higher. The higher level you are, the more complex problem for you to solve. The ability to solve more complex problem are coming from ability to think more critically, how many dots (knowledge) do you have, and how you can connect those dots to create solutions that solve the problem.&#xA;&#xA;Again, those abilities need to be practice and take time to acquire. Don&#39;t be rush. Asking yourself if today do I acquire any more dots? do I generate new ideas? do I think critical enough? do I arrive at the first principle? How can I go deeper to hit first principle?&#xA;&#xA;Talk with someone more expert will speed up the learning -- because they can think more finer than you.&#xA;&#xA;Hope this help.&#xA;&#xA;careers]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="tools">Tools</h3>

<p>I&#39;ve talk with many people — engineers in my company, candidates in interview sessions, meetups, etc. They are often excited about new technologies, frameworks, tools and eager to learn, try, and talk about it. They may listed those tools as what they have experiences in CV. This is good but I think that over the half of those people are <em>“tools&#39; user”</em> — who know how to use tools but don&#39;t understand it deeply.</p>

<h3 id="complexity">Complexity</h3>

<p><img src="https://upload.wikimedia.org/wikipedia/commons/a/ab/Cynefin_framework_2022.jpg" alt="Cynefin" title="Cynefin framework"></p>

<p>There&#39;s types of task&#39;s complexity that engineer will have to solve. CRUD or defined business workflow maybe classified as <em>“Clear”</em> so any engineer can simply write a program in a very straight forward way and this type of task is suitable for junior level.</p>



<p>Next is <em>“Complicated”</em>, an engineer may received a customer problem and asked to solve it. It also could be a technical challenge. The solution is not identified yet. The problem itself is solvable and feasible in theory. For example, scaling the system to handle more load, or in business context which a coupon quota is overused somehow. This type of task is suitable for senior level.</p>

<p>I won&#39;t go into more types here but I hope you can see what will happen when task is more complex.</p>

<h3 id="dots-connect-the-dots">Dots &amp; connect the dots</h3>

<p>In order to solve more complex problem, engineer has to use more knowledge and has ability to mix &amp; match many things and come up with a solution.</p>

<p>Dots represent knowledge. Connect the dots is a process of utilizing knowledge and creating a solution that could solve a problem.</p>

<p>In order to increase ability to solve problems, it&#39;s simply to increase more dots as much as possible and practicing to connect those dots together so one can generate many new possible solutions.</p>

<p>For tools&#39; users, their dots are limited — even if they know a lot of tools but those knowledge are quite shallow. It&#39;s hard to use across different domain because tools are tend to be specific for some use cases. Underneath those tools, there&#39;s layers of knowledge, techniques, and principles to be acquired — which are more fundamental and more reusable across different domains.</p>

<h3 id="critical-thinking">Critical thinking</h3>

<p>When you&#39;re asked <em>“What&#39;s happened when you open a website?”</em> and your answer was <em>“The browser send a request to server,  received a response back, and render it.”</em>, you&#39;re not think critical enough. You also may be asked <em>“Why Kafka is so fast?”</em> and the answer was <em>“Because everyone said so.”</em>, it&#39;s not a critical thinking.</p>

<p>In order to think critically, you have to tear it apart, think finer in every piece, go deeper more into detail, asking why again and again, until you arrived at the atomic piece of knowledge that cannot be split anymore — the first principle. This is how anyone should learn about anything. In this way, you will acquire much more dots than before.</p>

<p>When solving a complex problem, divide &amp; conquer is a common technique used which break down a problem into smaller problems that easier to solve. It&#39;s kind of the same way of critical thinking. If you want to apply critical thinking into problem solving, you should look closer into a problem, identify any detail out of it, tear it apart into many pieces, dig down inside what&#39;s seem to be magic or abstract, and try to arrive at the first principle.</p>

<h3 id="wrap-up">Wrap up</h3>

<p>Skills are required for growing up to be senior or higher. The higher level you are, the more complex problem for you to solve. The ability to solve more complex problem are coming from ability to think more critically, how many dots (knowledge) do you have, and how you can connect those dots to create solutions that solve the problem.</p>

<p>Again, those abilities need to be practice and take time to acquire. Don&#39;t be rush. Asking yourself if today do I acquire any more dots? do I generate new ideas? do I think critical enough? do I arrive at the first principle? How can I go deeper to hit first principle?</p>

<p>Talk with someone more expert will speed up the learning — because they can think more finer than you.</p>

<p>Hope this help.</p>

<p><a href="https://tnpl.me/tag:careers" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">careers</span></a></p>
]]></content:encoded>
      <guid>https://tnpl.me/lacking-of-skills-and-weaknesses-that-block-your-career</guid>
      <pubDate>Thu, 20 Oct 2022 14:40:30 +0000</pubDate>
    </item>
    <item>
      <title>Career progression guideline - introduction</title>
      <link>https://tnpl.me/career-progression-guideline-introduction</link>
      <description>&lt;![CDATA[This is going to be a very long post series in #careers. It started from a discussion among my engineering manager team as well as my observation to individual engineers. There&#39;s a challenge for anyone who don&#39;t know exactly how to advance their career. Even a company provides a guideline, some of them still struggle to actually make progresses.&#xA;&#xA;I&#39;m going to be a stereotype here. I&#39;m pretty sure it won&#39;t cover all the cases, it’s just for simplicity and I hope that it should cover at least 70% of the cases.&#xA;&#xA;I divided the problem into 2 sub-problems: Lack of skills and Lack of scope.&#xA;&#xA;Each of these problems could be fixed independently. I&#39;ll write more about what I believed a learning process should be. The important thing that you should know is fixing these problems is not a sequential, but it is a cycle to fix a little bit of each sub-problem many times.&#xA;&#xA;!--more--&#xA;Lack of skills&#xA;&#xA;This problem is well-known among software engineers. Everyone wants to be smart, full of wisdoms, or even a 10x engineer. There&#39;s many way to increase your skill: read books, blogs, watch video, learn on the job, side projects, leetcode, mentored by expert, etc. These materials consumed are usually focusing on technical knowledge: programming language, scaling, performance, design, tools, etc.&#xA;&#xA;The missing piece here is the other side of technical knowledge which I called soft skills (It isn&#39;t the same commonly known soft skills). The sample of soft skills are: project management, effective communication, effective writing, mentoring, inter-personal skill, problem solving, critical thinking, outcome-focusing, etc.&#xA;&#xA;Without the soft part, all you have is an engineer who&#39;s waiting for someone telling you &#34;Hey, this is your ticket with full of requirements and if you can check all the boxes in the ticket then everything will work as planned&#34;. It&#39;s like a ticket bashing -- who can clear tickets so fast, alone, and doesn&#39;t account for anything.&#xA;&#xA;I tend to find engineers focusing more on the hard-skill and pay a little attention to soft-skill. I believed because hard-skill is in your power to control but soft-skill need someone else to practice with.&#xA;&#xA;Even if you know that you need to improve soft-skill, it still lack the way to improve it, for example, project management -- you cannot practice it alone but you have to actually do it. This issue creates inequality, if you are chosen to do it then you have more opportunity than the other. The same project won&#39;t come back again for the others to practice, only a newer project that is harder. This is a vicious cycle that make the gap wider.&#xA;&#xA;Lack of scope&#xA;&#xA;What I mean by scope is below:&#xA;&#xA;How much you have to be responsible for?&#xA;What&#39;s the size of your tasks/projects that you’re accountable with?&#xA;How many engineers you have to work with and influence?&#xA;How many people in organization you have to work with and influence?&#xA;What&#39;s the coverage in level of people you have to work with, starting from senior management to the frontline?&#xA;&#xA;All of scopes here is relatively compared among employees in the company, so it can&#39;t compare across company.&#xA;&#xA;Let&#39;s be specific.&#xA;&#xA;You are an engineer who responsible to complete a simple bug fix assigned by the other engineer and the ticket has full of detail, solution, everything is clear and concrete. In this case, your scope is less than the one who create a ticket for you.&#xA;&#xA;You are an engineer to support ~10 of micro-services. These services are in maintenance mode. You have to keep watching its health, answer inquiries from other engineers. Compare with someone else who responsible to develop a new system which is very critical to the business. It&#39;s life or death. Your scope might be less than the other.&#xA;&#xA;You are an engineer who responsible an end to end of a product life cycle. So you talked to all stakeholders, create a plan, review code, monitor its health, and be an on-call. Comparing with someone work in a team, there&#39;s product owner (PO) who try to give a concrete requirement and when that engineer have a question, the PO will find answer for him. You might have larger scope comparing to the other.&#xA;&#xA;So, you can think of scope as a circle of responsibility, criticality, people connection, and influential. How large are your circle? How can I increase it? It has to be increased in all angle, otherwise it&#39;s not a circle anymore.&#xA;&#xA;Fixing these problems is a cycle&#xA;&#xA;You cannot learn all soft and hard skills before you increase your circle. And you can&#39;t increase your circle if you don&#39;t have enough skills, otherwise you will lose trust.&#xA;&#xA;The thing is you should increase your circle bit by bit and learn it along the way. Have I done good enough? What else can I improve?&#xA;&#xA;It takes time and you can&#39;t rush it.&#xA;&#xA;The only problem left unsolved here is can we create equality to all employee in a company so that everyone will have the same opportunity to grow? I believed, maybe, it&#39;s the hardest or impossible to solve.&#xA;&#xA;careers]]&gt;</description>
      <content:encoded><![CDATA[<p>This is going to be a very long post series in <a href="https://tnpl.me/tag:careers" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">careers</span></a>. It started from a discussion among my engineering manager team as well as my observation to individual engineers. There&#39;s a challenge for anyone who don&#39;t know exactly how to advance their career. Even a company provides a guideline, some of them still struggle to actually make progresses.</p>

<p>I&#39;m going to be a stereotype here. I&#39;m pretty sure it won&#39;t cover all the cases, it’s just for simplicity and I hope that it should cover at least 70% of the cases.</p>

<p>I divided the problem into 2 sub-problems: <strong>Lack of skills</strong> and <strong>Lack of scope</strong>.</p>

<p>Each of these problems could be fixed independently. I&#39;ll write more about what I believed a learning process should be. The important thing that you should know is fixing these problems is not a sequential, but it is a cycle to fix a little bit of each sub-problem many times.</p>



<h3 id="lack-of-skills">Lack of skills</h3>

<p>This problem is well-known among software engineers. Everyone wants to be smart, full of wisdoms, or even a 10x engineer. There&#39;s many way to increase your skill: read books, blogs, watch video, learn on the job, side projects, leetcode, mentored by expert, etc. These materials consumed are usually focusing on technical knowledge: programming language, scaling, performance, design, tools, etc.</p>

<p>The missing piece here is the other side of technical knowledge which I called <strong>soft skills</strong> (It isn&#39;t the same commonly known soft skills). The sample of soft skills are: project management, effective communication, effective writing, mentoring, inter-personal skill, problem solving, critical thinking, outcome-focusing, etc.</p>

<p>Without the soft part, all you have is an engineer who&#39;s waiting for someone telling you “Hey, this is your ticket with full of requirements and if you can check all the boxes in the ticket then everything will work as planned”. It&#39;s like a ticket bashing — who can clear tickets so fast, alone, and doesn&#39;t account for anything.</p>

<p>I tend to find engineers focusing more on the hard-skill and pay a little attention to soft-skill. I believed because hard-skill is in your power to control but soft-skill need someone else to practice with.</p>

<p>Even if you know that you need to improve soft-skill, it still lack the way to improve it, for example, project management — you cannot practice it alone but you have to actually do it. This issue creates inequality, if you are chosen to do it then you have more opportunity than the other. The same project won&#39;t come back again for the others to practice, only a newer project that is harder. <strong>This is a vicious cycle that make the gap wider.</strong></p>

<h3 id="lack-of-scope">Lack of scope</h3>

<p>What I mean by scope is below:</p>
<ul><li>How much you have to be responsible for?</li>
<li>What&#39;s the size of your tasks/projects that you’re accountable with?</li>
<li>How many engineers you have to work with and influence?</li>
<li>How many people in organization you have to work with and influence?</li>
<li>What&#39;s the coverage in level of people you have to work with, starting from senior management to the frontline?</li></ul>

<p>All of scopes here is relatively compared among employees in the company, so it can&#39;t compare across company.</p>

<p>Let&#39;s be specific.</p>

<p>You are an engineer who responsible to complete a simple bug fix assigned by the other engineer and the ticket has full of detail, solution, everything is clear and concrete. In this case, your scope is less than the one who create a ticket for you.</p>

<p>You are an engineer to support ~10 of micro-services. These services are in maintenance mode. You have to keep watching its health, answer inquiries from other engineers. Compare with someone else who responsible to develop a new system which is very critical to the business. It&#39;s life or death. Your scope might be less than the other.</p>

<p>You are an engineer who responsible an end to end of a product life cycle. So you talked to all stakeholders, create a plan, review code, monitor its health, and be an on-call. Comparing with someone work in a team, there&#39;s product owner (PO) who try to give a concrete requirement and when that engineer have a question, the PO will find answer for him. You might have larger scope comparing to the other.</p>

<p>So, you can think of scope as a circle of responsibility, criticality, people connection, and influential. How large are your circle? How can I increase it? It has to be increased in all angle, otherwise it&#39;s not a circle anymore.</p>

<h3 id="fixing-these-problems-is-a-cycle">Fixing these problems is a cycle</h3>

<p>You cannot learn all soft and hard skills before you increase your circle. And you can&#39;t increase your circle if you don&#39;t have enough skills, otherwise you will lose trust.</p>

<p>The thing is you should increase your circle bit by bit and learn it along the way. Have I done good enough? What else can I improve?</p>

<p>It takes time and you can&#39;t rush it.</p>

<p>The only problem left unsolved here is can we create equality to all employee in a company so that everyone will have the same opportunity to grow? I believed, maybe, it&#39;s the hardest or impossible to solve.</p>

<p><a href="https://tnpl.me/tag:careers" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">careers</span></a></p>
]]></content:encoded>
      <guid>https://tnpl.me/career-progression-guideline-introduction</guid>
      <pubDate>Tue, 18 Oct 2022 01:59:34 +0000</pubDate>
    </item>
    <item>
      <title>Kernel bug cause AMD Ryzen keyboard lag so I have to compile kernel myself</title>
      <link>https://tnpl.me/mainline-kernel-and-compiling-kernel</link>
      <description>&lt;![CDATA[I&#39;ve just bought a new laptop, Lenovo ThinkBook 13s Gen 4, which I think it&#39;s lightweight, with good performance (AMD Ryzen 7 6700u), last-long battery, and it&#39;s not too expensive.&#xA;&#xA;There&#39;s a problem with keyboard, which at first, I think the laptop might have a defect from manufacturer but it only happen when I&#39;m using on Linux. I was trying to plug external USB keyboard after I installed Linux and It&#39;s fine.&#xA;&#xA;I search through internet and found this thread. Turns out it was a bug in linux kernel with new AMD Ryzen platform. Somebody who use Arch linux can apply patch by themselves but for me I use fedora so I have to find a way.&#xA;&#xA;!--more--&#xA;&#xA;A patch has been submitted to mainline here and here. Right now, I think I just need to install kernel from the mainline.&#xA;&#xA;I add Fedora Kernel Vanilla Repository and follow the instructions. I put these commands:&#xA;curl -s https://repos.fedorapeople.org/repos/thl/kernel-vanilla.repo | sudo tee /etc/yum.repos.d/kernel-vanilla.repo&#xA;sudo dnf --enablerepo=kernel-vanilla-mainline update&#xA;It installed kernel 5.19.0-65 but in this version, there was no new patch yet.&#xA;&#xA;I look around to see if there&#39;s a repo or a way to install from latest git of kernel but I can&#39;t find any. So I decided to compile the kernel by myself from this guide.&#xA;sudo su&#xA;mkdir -p /usr/src/kernel/linux-next&#xA;cd /usr/src/kernel/linux-next&#xA;git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git .&#xA;make oldconfig&#xA;make bzImage&#xA;make modules&#xA;make modulesinstall&#xA;make install&#xA;reboot&#xA;&#xA;The custom kernel build takes almost 2 hours and the problem was solved. I&#39;m happy with Fedora 36 and this laptop.]]&gt;</description>
      <content:encoded><![CDATA[<p>I&#39;ve just bought a new laptop, Lenovo ThinkBook 13s Gen 4, which I think it&#39;s lightweight, with good performance (AMD Ryzen 7 6700u), last-long battery, and it&#39;s not too expensive.</p>

<p>There&#39;s a problem with keyboard, which at first, I think the laptop might have a defect from manufacturer but it only happen when I&#39;m using on Linux. I was trying to plug external USB keyboard after I installed Linux and It&#39;s fine.</p>

<p>I search through internet and found <a href="https://bbs.archlinux.org/viewtopic.php?id=277260" rel="nofollow">this thread</a>. Turns out it was a bug in linux kernel with new AMD Ryzen platform. Somebody who use Arch linux can apply patch by themselves but for me I use fedora so I have to find a way.</p>



<p>A patch has been submitted to mainline <a href="https://lore.kernel.org/all/20220712020058.90374-1-gch981213@gmail.com/" rel="nofollow">here</a> and <a href="https://github.com/torvalds/linux/commit/9946e39fe8d0a5da9eb947d8e40a7ef204ba016e" rel="nofollow">here</a>. Right now, I think I just need to install kernel from the mainline.</p>

<p>I add <a href="https://fedoraproject.org/wiki/Kernel_Vanilla_Repositories" rel="nofollow">Fedora Kernel Vanilla Repository</a> and follow the instructions. I put these commands:</p>

<pre><code>curl -s https://repos.fedorapeople.org/repos/thl/kernel-vanilla.repo | sudo tee /etc/yum.repos.d/kernel-vanilla.repo
sudo dnf --enablerepo=kernel-vanilla-mainline update
</code></pre>

<p>It installed kernel 5.19.0-65 but in this version, there was no new patch yet.</p>

<p>I look around to see if there&#39;s a repo or a way to install from latest git of kernel but I can&#39;t find any. So I decided to compile the kernel by myself from <a href="https://fedoraproject.org/wiki/Building_a_custom_kernel#Building_the_kernel" rel="nofollow">this guide</a>.</p>

<pre><code>sudo su
mkdir -p /usr/src/kernel/linux-next
cd /usr/src/kernel/linux-next
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git .
make oldconfig
make bzImage
make modules
make modules_install
make install
reboot
</code></pre>

<p>The custom kernel build takes almost 2 hours and the problem was solved. I&#39;m happy with Fedora 36 and this laptop.</p>
]]></content:encoded>
      <guid>https://tnpl.me/mainline-kernel-and-compiling-kernel</guid>
      <pubDate>Tue, 09 Aug 2022 01:20:01 +0000</pubDate>
    </item>
    <item>
      <title>Config vs Setting vs Feature flag</title>
      <link>https://tnpl.me/config-vs-setting-vs-feature-flag</link>
      <description>&lt;![CDATA[Config&#xA;&#xA;Config needs restart to be updated, static, stored in file, override by env variable, small number of config&#xA;&#xA;Example: DB config, server listen port, remote host location&#xA;&#xA;Feature flag&#xA;&#xA;Feature flag and settings can be changed at runtime without restart or down time. Both are similar but I want to draw a bold line separate them.&#xA;&#xA;Feature flag is temporary, has to be clean up or removed someday in the future. It is about roll out, release, use context to decide who, when, where, which version to enable which can be apply to users partially, or globally. It is usually controlled by engineers, or technical operation team.&#xA;&#xA;Setting&#xA;&#xA;Setting is permanently. It has been designed to be in the code without creating technical debt.&#xA;&#xA;It likes a feature which has a real user use case for example to adjust behavior of the system. &#xA;&#xA;It should be safe to be uses, changes, enables, disables in numerous times. It should be test throughout.&#xA;&#xA;Any feature flags that has been rolled out and stable, can be transitioned to setting such as kill switch.&#xA;&#xA;Example: Site title, User role &amp; Permission, Look &amp; feel, Content to be shown&#xA;&#xA;Below is a comparison table:&#xA;&#xA;|                        &#x9;| Config                 &#x9;| Feature flag      &#x9;| Setting                        &#x9;|&#xA;|------------------------&#x9;|------------------------&#x9;|-------------------&#x9;|--------------------------------&#x9;|&#xA;| When to changes        &#x9;| Before start           &#x9;| Runtime           &#x9;| Runtime                        &#x9;|&#xA;| Lifetime               &#x9;| Temporary/Permanently  &#x9;| Temporary         &#x9;| Risky, moderate tested         &#x9;|&#xA;| Safety                 &#x9;| Very safe, well tested &#x9;| Permanently       &#x9;| Safe, well tested              &#x9;|&#xA;| User                   &#x9;| Engineer/Operator      &#x9;| Engineer/Operator &#x9;| Normal user                    &#x9;|&#xA;| Affects                &#x9;| Global/All users       &#x9;| Partial/Global    &#x9;| Global/Depends on each feature &#x9;|&#xA;| Tech Debt              &#x9;| Low                    &#x9;| High              &#x9;| Medium                         &#x9;|&#xA;| Amount of configurable &#x9;| Low                    &#x9;| High              &#x9;| Medium                         &#x9;|&#xA;| Rate of changes        &#x9;| Rarely                 &#x9;| Occationally      &#x9;| On demand                      &#x9;|&#xA;&#xA;codestyle]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="config">Config</h2>

<p>Config needs restart to be updated, static, stored in file, override by env variable, small number of config</p>

<p>Example: DB config, server listen port, remote host location</p>

<h2 id="feature-flag">Feature flag</h2>

<p>Feature flag and settings can be changed at runtime without restart or down time. Both are similar but I want to draw a bold line separate them.</p>

<p>Feature flag is temporary, has to be clean up or removed someday in the future. It is about roll out, release, use context to decide who, when, where, which version to enable which can be apply to users partially, or globally. It is usually controlled by engineers, or technical operation team.</p>

<h2 id="setting">Setting</h2>

<p>Setting is permanently. It has been designed to be in the code without creating technical debt.</p>

<p>It likes a feature which has a real user use case for example to adjust behavior of the system.</p>

<p>It should be safe to be uses, changes, enables, disables in numerous times. It should be test throughout.</p>

<p>Any feature flags that has been rolled out and stable, can be transitioned to setting such as kill switch.</p>

<p>Example: Site title, User role &amp; Permission, Look &amp; feel, Content to be shown</p>

<p>Below is a comparison table:</p>

<table>
<thead>
<tr>
<th></th>
<th>Config</th>
<th>Feature flag</th>
<th>Setting</th>
</tr>
</thead>

<tbody>
<tr>
<td>When to changes</td>
<td>Before start</td>
<td>Runtime</td>
<td>Runtime</td>
</tr>

<tr>
<td>Lifetime</td>
<td>Temporary/Permanently</td>
<td>Temporary</td>
<td>Risky, moderate tested</td>
</tr>

<tr>
<td>Safety</td>
<td>Very safe, well tested</td>
<td>Permanently</td>
<td>Safe, well tested</td>
</tr>

<tr>
<td>User</td>
<td>Engineer/Operator</td>
<td>Engineer/Operator</td>
<td>Normal user</td>
</tr>

<tr>
<td>Affects</td>
<td>Global/All users</td>
<td>Partial/Global</td>
<td>Global/Depends on each feature</td>
</tr>

<tr>
<td>Tech Debt</td>
<td>Low</td>
<td>High</td>
<td>Medium</td>
</tr>

<tr>
<td>Amount of configurable</td>
<td>Low</td>
<td>High</td>
<td>Medium</td>
</tr>

<tr>
<td>Rate of changes</td>
<td>Rarely</td>
<td>Occationally</td>
<td>On demand</td>
</tr>
</tbody>
</table>

<p><a href="https://tnpl.me/tag:codestyle" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">codestyle</span></a></p>
]]></content:encoded>
      <guid>https://tnpl.me/config-vs-setting-vs-feature-flag</guid>
      <pubDate>Sat, 04 Dec 2021 04:32:42 +0000</pubDate>
    </item>
    <item>
      <title>Where to logs</title>
      <link>https://tnpl.me/where-to-logs</link>
      <description>&lt;![CDATA[Related to Opinionated guide on how to write a log&#xA;&#xA;I would like to write in more detail about where to put log, the benefits, disadvantages, and how to mitigate that.&#xA;&#xA;I want to put a context that we&#39;re developing web services, whether public access or internal use. No matter what protocol is used, HTTP with JSON, gRPC, Thrift, etc. I think my guide may adapt to all of these kinds of technology.&#xA;&#xA;So, where to put logs?&#xA;&#xA;!--more--&#xA;&#xA;1. Incoming requests - aka. access log&#xA;&#xA;Usually, there are two types of requests: read and write. You can write a middleware, interceptor, AOP, or whatever is suitable for your situation and log all necessary data such as HTTP request data, response status, process time, caller information, controller and handler name, etc.&#xA;&#xA;This is very useful for many of situations:&#xA;&#xA;To monitor anomaly of 4xx or 5xx HTTP status&#xA;Investigates on which endpoint is slow for which user&#xA;Who perform what action and when&#xA;&#xA;Someone might take it to a very extreme by constantly logging the entire request and response body. Well, it depends on context and company, but I suggest logging those only if there is a serious error such as HTTP 500 so that it won’t violate user privacy, reduce security risk, and save the cost.&#xA;&#xA;2. At the end of handlers that are not read-only&#xA;&#xA;You should put a log to record an event (what happened) at the end of every handler that is not read-only, such as POST, PUT, PATCH, DELETE, or depending on the RPC technology you are using.&#xA;&#xA;I don’t suggest putting it on read-only handlers because most of the systems are very read-heavy, and you already have an access log from above, so it doesn’t add much value to do that on all handlers.&#xA;&#xA;What should be logged on those non-read-only handlers?&#xA;&#xA;Who performs the action&#xA;Name of the event, this should be unique across all of your systems&#xA;Request or data of the action&#xA;Result or data of what have been changed&#xA;Any metrics, numerical values&#xA;&#xA;In order to log so much of those information, structured log such as JSON is a must.&#xA;&#xA;The benefit of doing this is building real-time business metrics to show to all stakeholders. It is pretty exciting to put data, visualize, and see the impact of what you did in real-time.&#xA;&#xA;3. When handlers got an error or exception&#xA;&#xA;Access log with response status is not enough for investigation when there is an error or exception on a request. Handling errors and putting a log in each handler is very helpful to know what&#39;s wrong with that request.&#xA;&#xA;You should log an error message, stack trace, why the error happens, on which block of code. Don&#39;t write a generic error log or catch a generic exception because you won&#39;t get enough detail to understand the problem.&#xA;&#xA;4. When the system calls to external dependencies&#xA;&#xA;In a microservice architecture, it is common that your system has to invoke an API call to other services. You may remember that there are 2 types of requests: read and write. If you send a request to get the data back without any side effects, it is a read, or you may call a query request.&#xA;&#xA;As your system is a client who calls to another service, I suggest you write a log for all requests being sent out from your service. Again, the information to be logged is quite the same as the access log.&#xA;&#xA;There are disadvantages to logging every call, especially for the query request type. The most significant drawback is overhead. Around 80% of requests are query requests; logging all of them will cost you the storage, compute power, and increased response time. In this case, metrics are a better solution as you can count the number of requests, duration histogram.&#xA;&#xA;By the way, if a query request has got an error, I still suggest logging it for investigation. You may also apply a log sampling or rate limit to mitigate the log flood problem in case of 100% of requests are errors.&#xA;&#xA;5. After the system did something important&#xA;&#xA;Even though you had event logging at the end of handlers, there is a missing gap here such as a cron job, watchdog, housekeeping. Those are still not logged and in many cases, it is useful to know what the system does so you can correlate the event in case of something bad happened.&#xA;&#xA;I had an experience on a system where cron jobs are running in the same process as the web server. The application was deployed to many physical servers. Once it is time to run a cron, every server triggers a job simultaneously, which causes a sudden spike in system resources and database.&#xA;&#xA;I&#39;m lucky enough that once I take a look at the centralized log system around that time, it is so obvious that the cron job is a problem.&#xA;&#xA;Here&#39;s a list of what should be log&#xA;&#xA;When a background job or cron job was started and finished&#xA;Events related to database connection such as connection lost, failover&#xA;Garbage collection event&#xA;It&#39;s setting up something with other systems, e.g., declaring queue, registering to service discovery, configuration updates.&#xA;&#xA;6. When you want to record what happened&#xA;&#xA;You can log anywhere in the code, so don&#39;t limit yourself to logging only inside handlers. I usually log about security information, such as someone trying to login using the wrong password, requesting an OTP, delete a record without permission.&#xA;&#xA;You can also log for audit purposes: database record with before &amp; after, login success, email verified, etc.&#xA;&#xA;This might sound a bit duplicate with No 2. but it is not. As a single request can perform many tasks, the log at the end of the handler will record an overall event. But this kind of log is more granular, so it records what happened within a single request.&#xA;&#xA;Closing&#xA;&#xA;I found that logging is more helpful than metrics when you need very detailed information, but it comes with writing, transit, processing, and storing costs. For a system under heavy load, you should reduce the number of logs by using metrics or sampling the logs. But for non-read-only requests, you should always write logs as you might get the benefit when investigating the problems and real-time business metrics for monitoring.&#xA;&#xA;These guidelines on where to logs are what I think you should always do. By the way, feel free to put any log in any log level on the locations that it might be helpful for you.&#xA;&#xA;codestyle]]&gt;</description>
      <content:encoded><![CDATA[<p>Related to <a href="https://tnpl.me/opinionated-guide-on-how-to-write-a-log" rel="nofollow"><strong>Opinionated guide on how to write a log</strong></a></p>

<p>I would like to write in more detail about where to put log, the benefits, disadvantages, and how to mitigate that.</p>

<p>I want to put a context that we&#39;re developing web services, whether public access or internal use. No matter what protocol is used, HTTP with JSON, gRPC, Thrift, etc. I think my guide may adapt to all of these kinds of technology.</p>

<p>So, where to put logs?</p>



<h3 id="1-incoming-requests-aka-access-log">1. Incoming requests – aka. access log</h3>

<p>Usually, there are two types of requests: read and write. You can write a middleware, interceptor, AOP, or whatever is suitable for your situation and log all necessary data such as HTTP request data, response status, process time, caller information, controller and handler name, etc.</p>

<p>This is very useful for many of situations:</p>
<ul><li>To monitor anomaly of 4xx or 5xx HTTP status</li>
<li>Investigates on which endpoint is slow for which user</li>
<li>Who perform what action and when</li></ul>

<p>Someone might take it to a very extreme by constantly logging the entire request and response body. Well, it depends on context and company, but I suggest logging those only if there is a serious error such as HTTP 500 so that it won’t violate user privacy, reduce security risk, and save the cost.</p>

<h3 id="2-at-the-end-of-handlers-that-are-not-read-only">2. At the end of handlers that are not read-only</h3>

<p>You should put a log to record an event (what happened) at the end of every handler that is not read-only, such as POST, PUT, PATCH, DELETE, or depending on the RPC technology you are using.</p>

<p>I don’t suggest putting it on read-only handlers because most of the systems are very read-heavy, and you already have an access log from above, so it doesn’t add much value to do that on all handlers.</p>

<p>What should be logged on those non-read-only handlers?</p>
<ul><li>Who performs the action</li>
<li>Name of the event, this should be unique across all of your systems</li>
<li>Request or data of the action</li>
<li>Result or data of what have been changed</li>
<li>Any metrics, numerical values</li></ul>

<p>In order to log so much of those information, structured log such as JSON is a must.</p>

<p>The benefit of doing this is building real-time business metrics to show to all stakeholders. It is pretty exciting to put data, visualize, and see the impact of what you did in real-time.</p>

<h3 id="3-when-handlers-got-an-error-or-exception">3. When handlers got an error or exception</h3>

<p>Access log with response status is not enough for investigation when there is an error or exception on a request. Handling errors and putting a log in each handler is very helpful to know what&#39;s wrong with that request.</p>

<p>You should log an error message, stack trace, why the error happens, on which block of code. Don&#39;t write a generic error log or catch a generic exception because you won&#39;t get enough detail to understand the problem.</p>

<h3 id="4-when-the-system-calls-to-external-dependencies">4. When the system calls to external dependencies</h3>

<p>In a microservice architecture, it is common that your system has to invoke an API call to other services. You may remember that there are 2 types of requests: read and write. If you send a request to get the data back without any side effects, it is a read, or you may call a query request.</p>

<p>As your system is a client who calls to another service, I suggest you write a log for all requests being sent out from your service. Again, the information to be logged is quite the same as the access log.</p>

<p>There are disadvantages to logging every call, especially for the query request type. The most significant drawback is overhead. Around 80% of requests are query requests; logging all of them will cost you the storage, compute power, and increased response time. In this case, metrics are a better solution as you can count the number of requests, duration histogram.</p>

<p>By the way, if a query request has got an error, I still suggest logging it for investigation. You may also apply a log sampling or rate limit to mitigate the log flood problem in case of 100% of requests are errors.</p>

<h3 id="5-after-the-system-did-something-important">5. After the system did something important</h3>

<p>Even though you had event logging at the end of handlers, there is a missing gap here such as a cron job, watchdog, housekeeping. Those are still not logged and in many cases, it is useful to know what the system does so you can correlate the event in case of something bad happened.</p>

<p>I had an experience on a system where cron jobs are running in the same process as the web server. The application was deployed to many physical servers. Once it is time to run a cron, every server triggers a job simultaneously, which causes a sudden spike in system resources and database.</p>

<p>I&#39;m lucky enough that once I take a look at the centralized log system around that time, it is so obvious that the cron job is a problem.</p>

<p>Here&#39;s a list of what should be log</p>
<ul><li>When a background job or cron job was started and finished</li>
<li>Events related to database connection such as connection lost, failover</li>
<li>Garbage collection event</li>
<li>It&#39;s setting up something with other systems, e.g., declaring queue, registering to service discovery, configuration updates.</li></ul>

<h3 id="6-when-you-want-to-record-what-happened">6. When you want to record what happened</h3>

<p>You can log anywhere in the code, so don&#39;t limit yourself to logging only inside handlers. I usually log about security information, such as someone trying to login using the wrong password, requesting an OTP, delete a record without permission.</p>

<p>You can also log for audit purposes: database record with before &amp; after, login success, email verified, etc.</p>

<p>This might sound a bit duplicate with No 2. but it is not. As a single request can perform many tasks, the log at the end of the handler will record an overall event. But this kind of log is more granular, so it records what happened within a single request.</p>

<h2 id="closing">Closing</h2>

<p>I found that logging is more helpful than metrics when you need very detailed information, but it comes with writing, transit, processing, and storing costs. For a system under heavy load, you should reduce the number of logs by using metrics or sampling the logs. But for non-read-only requests, you should always write logs as you might get the benefit when investigating the problems and real-time business metrics for monitoring.</p>

<p>These guidelines on where to logs are what I think you should always do. By the way, feel free to put any log in any log level on the locations that it might be helpful for you.</p>

<p><a href="https://tnpl.me/tag:codestyle" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">codestyle</span></a></p>
]]></content:encoded>
      <guid>https://tnpl.me/where-to-logs</guid>
      <pubDate>Sat, 20 Nov 2021 04:27:58 +0000</pubDate>
    </item>
  </channel>
</rss>