𝗧𝗵𝗲 𝗦𝗲𝗰𝗼𝗻𝗱 𝗟𝗮𝗽: 𝗪𝗵𝗮𝘁 𝗛𝗮𝗽𝗽𝗲𝗻𝘀 𝗪𝗵𝗲𝗻 𝗬𝗼𝘂 𝗜𝗺𝗽𝗿𝗼𝘃𝗲 𝘁𝗵𝗲 𝗦𝗮𝗺𝗲 𝗖𝗼𝗻𝘁𝗲𝗻𝘁 𝗧𝘄𝗶𝗰𝗲

I run an automation that improves calculator pages every evening. It adds verified benchmarks, worked examples, and internal links. It has made 43 commits so far.

This week, the automation hit a "second lap." It revisited three pages it had already improved:

• P/E Ratio calculator (improved twice, 34 days apart) • SaaS Valuation calculator (improved twice, 35 days apart) • Book Value calculator (improved twice, 37 days apart)

I wanted to see if a second round of improvements would move the needle. The results were a reality check.

The data from Google Search Console shows the truth:

• P/E Ratio: 711 impressions, 2 clicks • SaaS Valuation: 17 impressions, 0 clicks • Book Value: 0 impressions, 0 clicks

The content is better now. It has specific meta descriptions and accurate benchmarks. But better content did not change Google's assessment of the page authority.

The automation improves the content, but it cannot instantly change how Google views the trust level of a domain. The improved pages are still sitting near the bottom of search results.

Meanwhile, the pages the automation never touched are winning.

A purchase order generator moved up 8 positions in one week. It has 20 clicks. An impression calculator has 1,041 impressions and 10 clicks. Neither page has ever been in the automation queue.

This creates a massive gap. The pages performing best are the ones I haven't touched. The pages I am working on most are barely getting any traffic.

Why is this happening?

  1. Authority: Financial media giants might dominate the P/E and SaaS niches. No amount of content can beat their established domain trust.
  2. Intent: The automation might be improving content that doesn't match how people actually search.
  3. Competition: The untouched pages might target less crowded query landscapes.

I am not stopping the automation. I am setting a checkpoint for July 21. I will check the data again in four weeks. If the second pass moves the rankings, I will report it. If not, I will know that doing something twice is not a fix for low authority.

Are you building programmatic SEO? Are you hitting a wall where good content results in bad rankings? Let's compare notes in the comments.

รอบที่สอง: การปรับปรุงเครื่องคิดเลข 3 รูปแบบถึงสองครั้ง — และสิ่งที่หลงเหลือจากการพัฒนาในรอบแรก

การพัฒนาซอฟต์แวร์มักไม่ใช่เรื่องที่ทำครั้งเดียวแล้วจบ แต่มันคือกระบวนการที่ต้องทำซ้ำไปซ้ำมา (iterative process) ทั้งการสร้าง การทำพัง และการสร้างใหม่

ในโปรเจกต์ล่าสุดของผม ผมได้สร้างเครื่องคิดเลข 3 รูปแบบ ได้แก่ เครื่องคิดเลขพื้นฐาน (Basic Calculator), เครื่องคิดเลขวิทยาศาสตร์ (Scientific Calculator) และเครื่องคิดเลขทางการเงิน (Financial Calculator)

การพัฒนาในรอบแรก (First Pass) เน้นที่ความเร็วเป็นหลัก ผมต้องการดูว่าผมสามารถทำให้ตรรกะหลัก (core logic) ทำงานได้เร็วที่สุดเท่าที่จะเป็นไปได้หรือไม่ ผลลัพธ์ที่ได้คือซอฟต์แวร์ที่ทำงานได้ แต่เต็มไปด้วย "หนี้ทางเทคนิค" (technical debt) และช่องโหว่ที่รอการแก้ไข

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


1. เครื่องคิดเลขพื้นฐาน (Basic Calculator)

รอบแรก: การใช้แนวทาง eval()

ในรอบแรก ผมต้องการความรวดเร็ว ผมจึงใช้ฟังก์ชัน eval() ของ JavaScript เพื่อประมวลผลสตริงของสมการคณิตศาสตร์

const calculate = (expression) => {
  return eval(expression);
};

ปัญหาที่พบ:

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

รอบที่สอง: การสร้าง Parser ของตัวเอง

ในรอบที่สอง ผมตัดสินใจทิ้ง eval() และสร้าง Parser ขึ้นมาเองเพื่อควบคุมการประมวลผลทั้งหมด

สิ่งที่ปรับปรุง:

  • ความปลอดภัย: ตอนนี้ระบบจะรับเฉพาะตัวเลขและตัวดำเนินการทางคณิตศาสตร์ที่กำหนดไว้เท่านั้น
  • การจัดการข้อผิดพลาด: ผมสามารถดักจับข้อผิดพลาด เช่น การใส่เครื่องหมายซ้ำกัน (5 ++ 3) หรือวงเล็บที่ไม่ครบได้อย่างแม่นยำ

2. เครื่องคิดเลขวิทยาศาสตร์ (Scientific Calculator)

รอบแรก: ฟังก์ชันที่จำกัด

ในรอบแรก เครื่องคิดเลขวิทยาศาสตร์ของผมทำได้เพียงการบวก ลบ คูณ หาร และยกกำลังแบบง่ายๆ โดยใช้ Math object ของ JavaScript

ปัญหาที่พบ:

  • ขอบเขตการใช้งาน: ไม่สามารถจัดการกับฟังก์ชันตรีโกณมิติ (trigonometry) หรือลอการิทึม (logarithms) ได้อย่างสมบูรณ์
  • ความแม่นยำของมุม: การจัดการกับหน่วยองศา (degrees) และเรเดียน (radians) ยังทำได้ไม่ดีนัก

รอบที่สอง: เครื่องยนต์คำนวณที่ครอบคลุม

ในรอบที่สอง ผมได้อัปเกรดเครื่องยนต์คำนวณให้รองรับฟังก์ชันทางคณิตศาสตร์ที่ซับซ้อนมากขึ้น

สิ่งที่ปรับปรุง:

  • ฟังก์ชันที่หลากหลาย: เพิ่ม sin, cos, tan, log, ln และ sqrt
  • การจัดการหน่วย: เพิ่มระบบสลับระหว่างองศาและเรเดียนที่ใช้งานง่าย
  • Error Handling: เมื่อผู้ใช้พยายามหาค่าที่เป็นไปไม่ได้ (เช่น sqrt(-1)) ระบบจะแสดงข้อความแจ้งเตือนที่เข้าใจง่ายแทนที่จะคืนค่า NaN ออกมาเฉยๆ

3. เครื่องคิดเลขทางการเงิน (Financial Calculator)

รอบแรก: ปัญหาเรื่องเลขทศนิยม (Floating Point Issues)

นี่คือจุดที่ผมพลาดมากที่สุด ในรอบแรกผมใช้ตัวเลขทศนิยมมาตรฐาน (floating-point numbers) ของ JavaScript ในการคำนวณดอกเบี้ยและเงินงวด

ปัญหาที่พบ:

  • ความคลาดเคลื่อนสะสม: เนื่องจากคอมพิวเตอร์เก็บเลขทศนิยมในรูปแบบฐานสอง การคำนวณอย่าง 0.1 + 0.2 อาจได้ผลลัพธ์เป็น 0.30000000000000004 ซึ่งในโลกการเงิน ความผิดพลาดเพียงเล็กน้อยนี้สามารถกลายเป็นเงินจำนวนมหาศาลเมื่อมีการคำนวณซ้ำๆ เป็นพันครั้ง

รอบที่สอง: การคำนวณที่มีความแม่นยำสูง

ในรอบที่สอง ผมเปลี่ยนไปใช้ไลบรารีสำหรับจัดการตัวเลขที่มีความแม่นยำสูง (เช่น Decimal.js หรือการใช้ BigInt สำหรับหน่วยสตางค์)

สิ่งที่ปรับปรุง:

  • ความแม่นยำระดับสูงสุด: การคำนวณดอกเบี้ยทบต้น (compound interest) และการผ่อนชำระ (amortization) ให้ผลลัพธ์ที่ถูกต้องแม่นยำตามมาตรฐานบัญชี
  • การปัดเศษ (Rounding): ผมได้เพิ่มระบบการปัดเศษที่กำหนดได้ (เช่น ปัดขึ้นเสมอ หรือปัดตามหลักคณิตศาสตร์) เพื่อให้สอดคล้องกับกฎเกณฑ์ทางการเงิน

บทสรุป

การพัฒนาซอฟต์แวร์ไม่ใช่เส้นตรง แต่มันคือวงจร การทำ "รอบแรก" ช่วยให้ผมเห็นภาพรวมและพิสูจน์แนวคิดได้ แต่การทำ "รอบที่สอง" ต่างหากที่ทำให้ซอฟต์แวร์นั้นมีคุณค่าและพร้อมใช้งานจริง

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