<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Spec-Driven Development &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<atom:link href="https://myifew.com/tag/spec-driven-development-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://myifew.com</link>
	<description></description>
	<lastBuildDate>Sat, 11 Jul 2026 18:44:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.3</generator>

<image>
	<url>https://myifew.com/wp-content/uploads/2018/07/cropped-logo6-ts-32x32.png</url>
	<title>Spec-Driven Development &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<link>https://myifew.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AI Spec Writing Checklist: เขียนสเปกให้ AI เดาถูกขึ้น</title>
		<link>https://myifew.com/7820/ai-spec-writing-checklist/</link>
					<comments>https://myifew.com/7820/ai-spec-writing-checklist/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Sat, 11 Jul 2026 18:44:35 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Coding]]></category>
		<category><![CDATA[Requirements]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Spec-Driven Development]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=7820</guid>

					<description><![CDATA[บันทึกจากบทความ How to write specs for AI ว่าทำไม spec ที่ดีช่วยให้ AI coding agent เดาผิดน้อยลง พร้อม checklist ก่อนส่งงานให้ AI ลงมือเขียนโค้ด]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">หลังๆ มานี้ผมใช้ skill พวก grill-me ในการ discovery ความต้องการตนเอง หรือเขียน reqruiement ตั้งต้นแล้วให้ grill-me มาถามเติมต่อ แต่ถึงกระนั้น ในตอนที่ผมเขียน requriement ตั้งต้นเอง ผมก็จะพยามเขียนให้ละเอียดที่สุดเท่าที่ตนเองจะทำได้ โดยเฉพาะ Features และ Business Condition ต่างๆ เพื่อให้ AI ไม่ต้องเดาใจความสำคัญของระบบที่ผมต้องการให้มันทำ และไม่ต้องหงุดหงิดความหลอน (hallucinate) ของมันด้วย</p>



<p class="wp-block-paragraph">ผมไปอ่านบทความของ <strong>Jaroslaw Wasowski</strong> เรื่อง <strong>How to write specs for AI</strong> แล้วรู้สึกว่าตรงกับสิ่งที่ผมทำอยู่ แต่ก็มีบางข้อน่าสนใจที่ผมต้องปรับเพิ่ม โดยเขาพูดตรงๆ ว่า หลายครั้งปัญหาไม่ได้อยู่ที่ model อย่างเดียว แต่อยู่ที่ spec ที่เราเขียนให้มันต่างหาก</p>



<p class="wp-block-paragraph">เพราะ AI ไม่ได้อ่านใจเราออก ดังนั้นถ้าเราเขียน requirement แบบคลุมเครือ มันก็ไม่ได้หยุดแล้วถามเหมือน senior developer ที่นั่งข้างๆ แต่มันจะเดาต่อจาก pattern ที่มันเคยเห็นมาใน training data แล้วบางทีเดาได้เนียนมาก เนียนจนสรุปออกมา หรือ code ดูเหมือนจะถูกต้อง แต่การใช้งานผิด (เป็นเหตุผลว่าผมต้องมี skill ให้มันตั้งคำถามผมไปเรื่อยๆ นอกจากช่วยคิดแล้ว ผมใช้เพื่อคอยเช็กความเข้าใจของมัน)</p>



<span id="more-7820"></span>



<p class="wp-block-paragraph"><em>หมายเหตุ: บทความนี้อ้างอิงจาก<em>ประสบการณ์</em>ฟิวส์กับเอเจ้นชมพู เพื่อเรียบเรียงและแปลจากต้นฉบับของ Jaroslaw Wasowski เรื่อง <a href="https://levelup.gitconnected.com/how-to-write-specs-for-ai-7-rules-and-a-checklist-for-better-code-a5af2b2c6205" target="_blank" rel="noopener">How to write specs for AI: 7 rules and a checklist for better code</a></em></p>



<h2 class="wp-block-heading">ปัญหาไม่ใช่แค่ AI เขียนโค้ดผิด แต่คือมันไม่รู้ว่าอะไรห้ามเดา</h2>



<p class="wp-block-paragraph">ตั้งแต่ปีก่อนที่ vibe code มาใหม่ๆ จนถึงปัจจุบัน เรามักใส่ความต้องการของเราว่าอยากได้อะไร แต่ไม่ได้ใส่ว่ามันห้ามทำอะไร </p>



<p class="wp-block-paragraph">ซึ่งประโยคที่ผมชอบที่สุดในบทความนี้คือ AI ไม่มีสถานะว่า “อันนี้ไม่แน่ใจ ขอถามเพิ่มก่อน” เวลา requirement ขาดอะไรไป มันจะไม่หยุด และมันจะเติมเอง</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">สิ่งที่ไม่อยู่ spec เราในตอนแรก แต่จู่ๆ มันก็โผล่มา เพราะ AI จะเอา pattern จาก training data มาเติมแทนเจตนาของเรา (ซึ่งอาจจะผิด)</p>
</blockquote>



<p class="wp-block-paragraph">นี่แหละครับที่น่ากลัว เพราะ code ที่ออกมาอาจ compile ผ่าน, test ผ่าน หน้าตาดูดี แต่จริงๆ มันกำลังทำระบบที่มีการใช้งานหรือ behavior คนละแบบกับที่เราต้องการ</p>



<p class="wp-block-paragraph">เหมือนเราจ้างช่างมาทำบ้าน แล้วบอกแค่ว่า “ทำครัวให้ดีๆ หน่อย” ถ้าช่างทำครัวสวยมาก แต่ไม่มีปลั๊ก ไม่มีที่วางเตา หรือเปิดประตูตู้แล้วชนผนัง ปัญหาไม่ได้อยู่ที่ช่างไม่ขยันอย่างเดียว แต่อยู่ที่แบบบ้านของเราก็ไม่ได้บอกอะไรเขาเลย (อยากได้ครัวฝรั่งเตาไฟฟ้า แต่เอไอตั้งเตาอั่งโล่มาให้เพราะสเปกบอกว่ามีเตา 555)</p>



<h2 class="wp-block-heading">Spec ที่ดีต้องปิด 5 เรื่อง ที่ AI ชอบเดาเอง</h2>



<p class="wp-block-paragraph">บทความนี้สรุป 5 เรื่องหลักๆ ซึ่งผมว่าตรงนี้เอาไปใช้กับ Jira ticket, GitHub/GitLab issue, Markdown spec หรือ prompt ตรงๆ ได้เลย</p>



<h3 class="wp-block-heading">1. Outcome ต้องชัดว่าอยากได้พฤติกรรมอะไร</h3>



<p class="wp-block-paragraph">เริ่มจากบอกผลลัพธ์ที่ต้องการ ไม่ใช่บอกให้มันไปเขียน code แบบกว้างๆ เช่น แทนที่จะบอกว่า “ทำ endpoint export users เป็น CSV” ให้บอกว่า &#8220;endpoint นี้ต้องคืน active users เป็นไฟล์ CSV ที่ download ได้&#8221; และต้องมีเงื่อนไขความสำเร็จอะไรบ้าง (ภาษาเทคนิคจะเรียกว่า Acceptance Criteria)</p>



<p class="wp-block-paragraph">จุดนี้ช่วยแยก what ออกจาก how ได้ดีมาก เพราะ AI จะได้ไม่รีบเลือก implementation pattern ที่มันคุ้น แต่เริ่มจาก behavior ที่เราต้องการก่อน</p>



<h3 class="wp-block-heading">2. Scope กับ non-goals ต้องเขียนคู่กัน</h3>



<p class="wp-block-paragraph">อันนี้ผมว่าเป็นจุดที่หลายคนพลาด รวมถึงผมเองก็เคยและก็ยังพลาดบ่อย เราชอบเขียนว่า change นี้ต้องทำอะไร แต่ไม่ค่อยเขียนว่า change นี้ไม่ต้องทำอะไร</p>



<p class="wp-block-paragraph">เช่น ถ้าให้ AI ทำ export users ก็ควรบอกไปเลยว่า export เฉพาะ active users เท่านั้น ไม่ export deleted accounts ไม่ export billing data และไม่แก้ database schema</p>



<p class="wp-block-paragraph">เพราะถ้าไม่บอก มันอาจ “ใจดี” เพิ่ม feature ให้เอง ซึ่งฟังดูดี แต่ทำให้ diff บวม และบางทีไปแตะของที่ไม่ควรแตะ</p>



<p class="wp-block-paragraph">จากประสบการณ์ผมเองที่สังเกต โมเดลฉลาดๆ อย่าง Claude Opus 4.8+ / ChatGPT 5.5+ มักจะบอกเลยว่า ผมจะทำสิ่งนี้ แต่ไม่ทำสิ่งนี้เพราะจะกระทบอะไรก็ว่าไป ซึ่งมันไม่เป็นกับบางโมเดลอื่นๆ ตรงนี้เราโดนพวก Frontier Model สปอยจนมองข้ามไป ฮ่าๆ</p>



<h3 class="wp-block-heading">3. Constraints คือรั้วกัน AI หลุดโลก</h3>



<p class="wp-block-paragraph">AI ไม่ได้รู้จัดโค้ดทั้ง repo ของเราจริงๆ ถ้าเราไม่ได้ให้ context มันแต่แรก, มันไม่รู้ว่าใช้ framework เวอร์ชันไหน มี convention อะไร library ไหนห้ามใช้ response format ต้องเป็นแบบไหน หรือ performance limit คือเท่าไร (แต่ก็ได้ยินบ่อยจากคนรอบข้าง (ระดับมหาราชา/มหาราชินี) คือให้ AI อ่านโค้ดทั้ง repo ก่อนเลย)</p>



<p class="wp-block-paragraph">ดังนั้น constraints ควรมีของพวกนี้:</p>



<ul class="wp-block-list">
<li>stack และ version ที่ใช้</li>



<li>repo convention ที่ต้องตาม</li>



<li>library ที่ใช้ได้หรือห้ามใช้</li>



<li>output format เช่น UTF-8, JSON shape, CSV delimiter</li>



<li>security หรือ performance limit</li>



<li>integration boundary เช่นห้ามแก้ schema หรือห้ามกระทบ API เดิม</li>
</ul>



<p class="wp-block-paragraph">คือถ้าไม่มีสิ่งเหล่านี้ เราจะตรวจสอบได้ยากมากว่า AI ทำอะไรไป เพราะไฟล์อาจจะเยอะมาก รวมถึงถ้าต้องแก้ บางเรื่องอาจต้องรื้อทั้งโครงสร้างเลย เสียเวลา เสียโทเค็นไปเปล่าๆ</p>



<h3 class="wp-block-heading">4. Acceptance criteria ต้องพิสูจน์ได้ ไม่ใช่แค่ฟังดูดี</h3>



<p class="wp-block-paragraph">คำว่า “ใช้งานได้ดี” หรือ “make it work nicely” เป็นประโยคที่น่ากลัวมากสำหรับ AI เพราะมันไม่มีทางรู้ว่า nicely ของเราคืออะไร ดังนั้นเราต้องบอกมันว่า เงื่อนไขการรับงาน (Acceptance criteria) ของเราคืออะไร</p>



<p class="wp-block-paragraph">ซึ่ง Acceptance criteria ที่ดีควรเป็นแบบตรวจสอบได้ เช่น:</p>



<ul class="wp-block-list">
<li>ถ้ามี active users 3 คน ต้องได้ CSV 3 data rows และ header 1 แถว</li>



<li>ถ้าไม่มี users ต้องได้ header อย่างเดียวและ status 200</li>



<li>ถ้า user ไม่มี admin role ต้องได้ 403 และไม่ส่ง CSV body</li>



<li>ถ้ามีข้อมูล 50,000 records ต้องใช้ streaming และ response ไม่เกินเวลาที่กำหนด</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">ถ้าไม่มีเกณฑ์ตรวจสอบได้ (ไม่ว่าจะมนุษย์ไม่เขียน หรือเอไอไม่ทำให้) ยังถือว่าเป็น Draft Requirement ไม่ใช่ Requirement จริง</p>
</blockquote>



<p class="wp-block-paragraph">เพราะการที่ Spec มี acceptance criteria มันจะเปลี่ยนจากคำอธิบายสวยๆ ให้กลายเป็น Goal ที่ AI ทำให้สำเร็จ และระบบเราจะใช้งานได้ตามที่ต้องการ</p>



<h3 class="wp-block-heading">5. Edge case กับ failure path ต้องมีตั้งแต่ก่อนเขียน code</h3>



<p class="wp-block-paragraph">Happy path เป็นแค่ส่วนหนึ่งของ production เท่านั้น แต่ spec จำนวนมากเขียนเหมือนโลกมีแต่ happy path ฮาาา</p>



<p class="wp-block-paragraph">อย่างน้อย spec ที่ส่งให้ AI ควรมี:</p>



<ul class="wp-block-list">
<li>error path 1 กรณี</li>



<li>edge case 1 กรณี</li>



<li>empty state หรือ permission case 1 กรณี</li>
</ul>



<p class="wp-block-paragraph">เพราะถ้าเราไม่เขียน มันจะเดาวิธี handle error จาก pattern ที่มันเห็นบ่อย ซึ่งอาจไม่ตรงกับระบบเราเลย</p>



<h2 class="wp-block-heading">Checklist ก่อนโยนงานให้ AI coding agent</h2>



<p class="wp-block-paragraph">ผมลองเอาแนวคิดในบทความมาจัดเป็น checklist table แบบที่น่าจะใช้จริงกับงานประจำวันได้ประมาณนี้ครับ</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>คำถาม</th><th>ผ่านหรือยัง</th></tr></thead><tbody><tr><td>Outcome ชัดไหมว่าระบบต้องทำพฤติกรรมอะไร</td><td>ถ้ายังตอบเป็นคำกว้างๆ เช่น ดีขึ้น เร็วขึ้น ใช้งานง่าย ให้เขียนใหม่</td></tr><tr><td>มี scope และ non-goals ไหม</td><td>ต้องบอกทั้งทำอะไร และไม่ทำอะไร</td></tr><tr><td>มี constraints ของ repo, stack, format, security, performance ไหม</td><td>ถ้าไม่มี AI จะเดาจากโลกทั่วไป ไม่ใช่จากระบบเรา</td></tr><tr><td>Acceptance criteria พิสูจน์ได้ไหม</td><td>ควรตรวจด้วย test, log, screenshot หรือ metric ได้</td></tr><tr><td>มี error path หรือ edge case ไหม</td><td>อย่างน้อยต้องมี 1 เคสที่ไม่ใช่ happy path</td></tr><tr><td>มีตัวอย่าง input/output ไหม</td><td>ตัวอย่างดีๆ หนึ่งชุด ลด ambiguity ได้เยอะมาก</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">checklist นี้ไม่ได้บอกให้เขียน spec ยาวเสมอไป แต่มันบอกให้ AI เขียน spec แบบเดาน้อยลง</p>



<h2 class="wp-block-heading">Spec ไม่ได้ต้องยาว แต่ต้องมี signal พอ</h2>



<p class="wp-block-paragraph">บทความต้นฉบับใช้คำว่า signal redundancy matched to complexity ซึ่งผมแปลแบบบ้านๆ ว่า รายละเอียดต้องพอดีกับความเสี่ยงของงาน</p>



<p class="wp-block-paragraph">ถ้าแค่แก้ margin หรือเปลี่ยน text เล็กๆ จะเขียน spec ยาว 3 หน้า ก็อาจเกินไป แต่ถ้างานแตะ authorization, payment, data integrity, migration, report export หรือ performance ตรงนี้ผมว่าไม่ควรประหยัด spec</p>



<p class="wp-block-paragraph">เพราะงานพวกนี้ถ้าพลาด ไม่ใช่แค่ UI เพี้ยน แต่มันอาจกระทบข้อมูล สิทธิ์ผู้ใช้ หรือ logic สำคัญของระบบ</p>



<h2 class="wp-block-heading">Workflow ที่ผมคิดว่าเอาไปใช้ได้ทันที</h2>



<p class="wp-block-paragraph">ถ้าจะเอาเรื่องนี้ไปใช้กับทีม software จริงๆ ผมคิดว่าไม่ต้องเริ่มจาก process ใหญ่โต แต่เริ่มจากงานหนึ่งชิ้นก่อนก็พอ</p>



<ol class="wp-block-list">
<li>เลือก feature หรือ change ที่มีขอบเขตงานและโค้ดชัดเจน (boundary)</li>



<li>เขียน spec ให้มี 5 เรื่องหลัก: outcome, scope, constraints, acceptance criteria, edge cases</li>



<li>review spec ก่อนให้ AI ลงมือ</li>



<li>ให้ AI implement พร้อม test</li>



<li>ถ้า test fail หรือ reviewer ต้องถามเพิ่ม ให้กลับไปแก้ spec ก่อน ไม่ใช่แค่สั่ง AI แก้ code ไปเรื่อยๆ</li>
</ol>



<p class="wp-block-paragraph">จุดนี้ผมว่ามันต่อกับแนวคิด Spec-Driven Development มาก คือ spec ไม่ใช่เอกสารประกอบงาน แต่เป็น contract ของงาน ถ้า code กับ spec ขัดกัน ต้องถามก่อนว่า spec ยังถูกไหม ไม่ใช่ปล่อยให้ code ที่ AI generate มาเป็นความจริงใหม่ของระบบ</p>



<p class="wp-block-paragraph">ข้อสุดท้ายสำคัญมาก และทำให้ Spec มีการอัพเดทตลอดเวลา (หรือที่เรียกว่า Living documentation)</p>



<h2 class="wp-block-heading">เรื่องที่ต้องระวัง อย่าเอา checklist ไปทำให้ทีมเหนื่อยกว่าเดิม</h2>



<p class="wp-block-paragraph">ถึงผมจะชอบ checklist นี้มาก แต่ก็ไม่คิดว่าต้องใช้เต็มรูปแบบกับทุกงานนะครับ</p>



<p class="wp-block-paragraph">ถ้าเป็น bug fix เล็กๆ ที่ test เดียวพิสูจน์ได้ หรือ prototype ที่ตั้งใจ throw away อยู่แล้ว การเขียน spec ยาวอาจไม่คุ้ม</p>



<p class="wp-block-paragraph">อีกอย่างคือ spec ที่ดีไม่ได้แก้ทุกปัญหา AI ยังพลาดได้จาก model limitation, context retrieval ไม่ครบ, repo ใหญ่เกินไป หรือระบบเดิมซับซ้อนจน spec อธิบายไม่หมด</p>



<p class="wp-block-paragraph">ดังนั้นอย่าใช้ checklist นี้เป็นพิธีกรรมใหม่ของทีม แต่ใช้เป็นเครื่องมือถามตัวเองว่า “งานนี้มีอะไรที่ AI ไม่ควรเดาเองบ้าง”</p>



<h2 class="wp-block-heading">สรุปแบบฟิวส์ๆ</h2>



<p class="wp-block-paragraph">สิ่งที่ผมได้จากบทความนี้คือ AI ไม่ได้ทำให้ requirement หายไป แต่มันทำให้ requirement ที่คลุมเครือส่งผลแรงขึ้นกว่าเดิม</p>



<p class="wp-block-paragraph">เมื่อก่อนถ้า requirement คลุมเครือ senior developer อาจถามกลับ หรืออย่างน้อยก็รู้จาก context ของระบบว่าอะไรควรทำไม่ควรทำ แต่ AI coding agent ไม่ทำแบบนั้น ถ้าเราไม่บอก มันจะเดา</p>



<p class="wp-block-paragraph">และบางครั้งมันเดาแบบมั่นใจมากด้วยว่าจะถูก!</p>



<p class="wp-block-paragraph">ยิ่ง AI เขียน code เร็วเท่าไร เราก็ยิ่งต้องเขียนให้ชัดขึ้นเท่านั้นครับ</p>



<h2 class="wp-block-heading">แหล่งอ้างอิง</h2>



<ul class="wp-block-list">
<li><a href="https://levelup.gitconnected.com/how-to-write-specs-for-ai-7-rules-and-a-checklist-for-better-code-a5af2b2c6205" target="_blank" rel="noopener">How to write specs for AI: 7 rules and a checklist for better code</a> โดย Jaroslaw Wasowski, Level Up Coding</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/7820/ai-spec-writing-checklist/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ZeeSpec กับการโค้ดงานแบบ  Greenfield และ Brownfield</title>
		<link>https://myifew.com/7769/zeespec-spec/</link>
					<comments>https://myifew.com/7769/zeespec-spec/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Mon, 06 Jul 2026 16:06:52 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AI Coding]]></category>
		<category><![CDATA[Brownfield]]></category>
		<category><![CDATA[Greenfield]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Spec-Driven Development]]></category>
		<category><![CDATA[ZeeSpec]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=7769</guid>

					<description><![CDATA[ZeeSpec คือแนวคิดการเขียน spec แบบ constraint system เพื่อกัน AI เดา requirement เอง โดยวิธีใช้จะแตกต่างกันมากระหว่าง greenfield และ brownfield project]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">โพสต์ก่อน ผมเขียนถึง <a href="https://myifew.com/7753/writing-effective-prompts-by-google/" data-type="post" data-id="7753">คู่มือการเขียน Prompt ที่ดี ให้ได้ผลตรงใจ จากคำแนะนำของ Google</a> ซึ่งเบสิกเลยคือการระบุ Role/Task/Context/Output Format</p>



<p class="wp-block-paragraph">สำหรับโพสต์นี้ เอาใจสาย Spec Driven Development หน่อย คือผมไปเจออีกวิธีที่น่าสนใจดี ที่ใช้ในการทำ Spec ค่อนข้างละเอียดเลย แต่พอนึกดีๆ แล้ว หลายครั้งผมก็เขียนแบบนี้โดยไม่รู้ตัว</p>



<p class="wp-block-paragraph">เพราะความไม่ต้องการให้ AI เดาเอง และไม่อยากอารมณ์เสียเมื่อรอมันรันนานแต่ผลลัพธ์ที่ได้ไม่ตรงใจ ผมจึงมักจะระบุว่าใคร ทำอะไร อย่างไร ที่ไหน เมื่อไร อะไรควรทำ ไม่ควรทำ</p>



<p class="wp-block-paragraph">ซึ่งเครื่องมือในโพสต์นี้เป็นประมาณนั้นเลยครับ เผื่อใครจะเอาไปเป็นไอเดียเสริมสไตล์การเขียน Prompt/Spec ให้กับผู้อ่านได้</p>



<span id="more-7769"></span>



<p class="wp-block-paragraph"><em>หมายเหตุ: บทความนี้ฟิวส์กับเอเจ้นชมพู ได้เรียบเรียงและแปลจากต้นฉบับของ Vishal Mysore เรื่อง <a href="https://medium.com/@visrow/zeespec-spec-driven-development-for-greenfield-vs-brownfield-projects-c593b5d88186" target="_blank" rel="noopener">ZeeSpec- Spec Driven Development for Greenfield vs Brownfield Projects</a></em></p>



<h2 class="wp-block-heading">AI มันไม่กลัว requirement ที่ไม่ชัด แต่มันจะเดาแทนเราเลย</h2>



<p class="wp-block-paragraph">บทความต้นฉบับพูดถึงเครื่องมือชื่อ <strong>ZeeSpec</strong> ซึ่งเป็นแนวคิดการทำ spec แบบบังคับให้เราตอบคำถามให้ครบก่อนเริ่มให้ AI สร้างระบบ</p>



<p class="wp-block-paragraph">คำสำคัญของ ZeeSpec คือ มันไม่ได้เป็น documentation เฉยๆ แต่มันเป็น <strong>constraint system</strong> หรือระบบกรอบข้อจำกัดที่บอก AI ว่าอะไรทำได้ อะไรทำไม่ได้ อะไรห้ามเดา</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">ถ้าเราไม่ตอบ AI จะตอบแทนเรา และคำตอบนั้นอาจดูดีมากจนเราไม่ทันระวัง</p>
</blockquote>



<p class="wp-block-paragraph">ฟังดูเหมือนเรื่องเล็กนะครับ แต่คนทำ software น่าจะเคยเจออาการนี้กันบ่อยมาก เช่น บอกให้เพิ่ม feature นิดเดียว แต่ AI ดัน refactor service เดิมให้ด้วย หรือบอกให้เพิ่ม field ในตาราง แต่มัน generate migration ที่กระทบข้อมูลเดิมแบบชวนเสียวหลัง</p>



<p class="wp-block-paragraph">พออ่านบทความนี้แล้วผมนึกถึงการสร้างบ้านเลย ถ้าเราไม่บอกว่าเสาไหนห้ามแตะ ผนังไหนรับน้ำหนัก ท่อประปาเดินตรงไหน ช่างที่ขยันมากอาจทำบ้านใหม่ให้สวยกว่าเดิม แต่พังโครงเดิมไปด้วย</p>



<h2 class="wp-block-heading">ZeeSpec ใช้ 5W1H มาบีบให้เราคิดครบ</h2>



<p class="wp-block-paragraph">ZeeSpec วางอยู่บนแนวคิด <strong>Zachman Framework</strong> ซึ่งเป็นกรอบคิดด้าน enterprise architecture และโมเดล <strong>5W1H</strong> ที่ประกอบด้วย What, Where, When, Who, Why, How</p>



<p class="wp-block-paragraph">ในบทความบอกว่า ZeeSpec มีคำถาม 60 ข้อ แบ่งเป็น 6 มิติ มิติละ 10 ข้อ เป้าหมายไม่ได้อยู่ที่การเขียนเอกสารให้ยาว แต่อยู่ที่การบังคับให้ decision สำคัญถูกพูดออกมาก่อน AI จะลงมือเขียนโค้ด</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>มิติ</th><th>คำถามหลัก</th><th>ตัวอย่างสิ่งที่ต้องระบุ</th></tr></thead><tbody><tr><td><strong>WHAT</strong></td><td>ระบบคืออะไร</td><td>entity, state, boundary, สิ่งที่ห้ามมี</td></tr><tr><td><strong>WHERE</strong></td><td>ข้อมูลและการทำงานอยู่ที่ไหน</td><td>storage, infrastructure, integration, data flow</td></tr><tr><td><strong>WHEN</strong></td><td>อะไรเกิดขึ้นตอนไหน</td><td>trigger, expiry, schedule, blocking condition</td></tr><tr><td><strong>WHO</strong></td><td>ใครทำอะไรได้</td><td>role, permission, ownership, approval</td></tr><tr><td><strong>WHY</strong></td><td>ทำไม rule นี้มีอยู่</td><td>business intent, validation, policy</td></tr><tr><td><strong>HOW</strong></td><td>ระบบทำงานและพังอย่างไร</td><td>error handling, recovery, consistency, rollback</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ผมชอบตรงที่มันไม่ได้ถามแค่ว่า “อยากได้ feature อะไร” แต่มันถามด้วยว่า “อะไรห้ามเกิดขึ้น” ซึ่งปกติเราไม่ค่อยเขียนลง requirement กัน ทั้งที่ในโลกจริง สิ่งที่ห้ามเกิดขึ้นนี่สำคัญมาก</p>



<h2 class="wp-block-heading">Greenfield คือพื้นที่ว่างที่อันตรายกว่าที่คิด</h2>



<p class="wp-block-paragraph"><strong>Greenfield project</strong> คือโปรเจกต์ที่เริ่มใหม่แทบทั้งหมด ไม่มี schema เดิม ไม่มี API เดิม ไม่มี legacy ให้ต้องเกรงใจ</p>



<p class="wp-block-paragraph">ข้อดีคือเราออกแบบใหม่ได้เต็มที่ แต่ข้อเสียคือไม่มีอะไรคอยขัด AI เลย ถ้าเรา spec ไม่ครบ มันจะเติมโลกทั้งใบให้เราเอง</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Greenfield ไม่ได้เสี่ยงเพราะไม่มีของเดิม แต่มันเสี่ยงเพราะไม่มีแรงต้านเวลา AI เดา</p>
</blockquote>



<p class="wp-block-paragraph">ในบทความเสนอว่า สำหรับ greenfield ต้องตอบให้ครบทุกมิติ โดยเฉพาะคำถามที่คนมักข้าม เช่น</p>



<ul class="wp-block-list">
<li>ระบบนี้ทำอะไร และไม่ทำอะไร</li>



<li>entity ไหนมีจริง entity ไหนห้ามมี</li>



<li>ข้อมูลอะไรห้ามเก็บเด็ดขาด เช่น PII, payment data, secret</li>



<li>ใครเห็นข้อมูลอะไรได้บ้าง</li>



<li>เมื่อเกิด error ระบบควร fail แบบไหน</li>



<li>ถ้าเจอข้อมูลไม่ครบ ระบบควรหยุดหรือเดา</li>
</ul>



<p class="wp-block-paragraph">ถ้าเขียนแบบนี้ก่อนให้ AI ทำงาน โอกาสที่มันจะสร้าง table ประหลาดๆ หรือ flow ที่ดูสมเหตุสมผลแต่ผิด business rule จะน้อยลงมาก</p>



<h2 class="wp-block-heading">Brownfield ต้องล็อกของเดิมก่อนค่อยสั่งของใหม่</h2>



<p class="wp-block-paragraph"><strong>Brownfield project</strong> คือระบบที่มีอยู่แล้ว อาจมี database จริง มี user ใช้งานจริง มี API consumer ภายนอก มี technical debt ที่ทุกคนรู้ว่าไม่สวย แต่แตะมั่วไม่ได้</p>



<p class="wp-block-paragraph">ตรงนี้บทความให้แนวคิดที่ผมว่าโดนมาก คือ brownfield ไม่ควร spec ทั้งระบบใหม่ แต่ควร spec เฉพาะ <strong>delta</strong> หรือส่วนที่เปลี่ยน</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Greenfield คือเติมทุกมิติ ส่วน brownfield คือ lock สิ่งที่มีอยู่ แล้วระบุเฉพาะสิ่งที่จะเปลี่ยน</p>
</blockquote>



<p class="wp-block-paragraph">นี่เป็นจุดที่หลายทีมพลาด รวมถึงผมเองก็เคยพลาดครับ เวลาใช้ AI กับระบบเดิม เรามักคิดว่าให้ context เยอะๆ แล้วมันจะเข้าใจ แต่ถ้าเราไม่บอกว่า “ห้ามแตะอะไร” มันอาจช่วยเกินหน้าที่</p>



<p class="wp-block-paragraph">ตัวอย่างง่ายๆ เช่น เราขอเพิ่ม endpoint ใหม่สำหรับ export report แต่ถ้าไม่ได้ lock authentication pattern เดิมไว้ AI อาจ generate middleware แบบใหม่ หรือแก้ permission model ให้ดูสะอาดขึ้น ซึ่งดูดีใน diff แต่พังกับระบบจริง</p>



<h2 class="wp-block-heading">ก่อน spec ระบบเก่า ต้องป้อน context ของระบบเก่าก่อน</h2>



<p class="wp-block-paragraph">สำหรับ brownfield บทความแนะนำให้เริ่มด้วย Step 0 คือป้อน context ของระบบเดิมก่อนตอบ ZeeSpec</p>



<ul class="wp-block-list">
<li>schema ปัจจุบัน แม้จะเป็น version ย่อก็ยังดีกว่าไม่มี</li>



<li>API pattern ที่ใช้อยู่ เช่น naming, response shape, error format</li>



<li>tech stack และ infrastructure ที่เปลี่ยนไม่ได้</li>



<li>constraint ที่เป็น non-negotiable เช่น ต้องใช้ PostgreSQL 14 หรือห้าม breaking change กับ client เดิม</li>
</ul>



<p class="wp-block-paragraph">ผมว่าข้อนี้ practical มาก เพราะ AI ที่ไม่เห็น schema จะออกแบบรอบ schema ไม่ได้ มันจะออกแบบ schema ใหม่ให้เราแทน ซึ่งใน brownfield นี่คือความเจ็บปวดล้วนๆ</p>



<h2 class="wp-block-heading">วิธีคิดต่างกันระหว่าง greenfield กับ brownfield</h2>



<p class="wp-block-paragraph">ถ้าเอามาแปลงเป็นภาษาคนทำงานจริง ผมจะสรุปแบบนี้ครับ</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>เรื่อง</th><th>Greenfield</th><th>Brownfield</th></tr></thead><tbody><tr><td>จุดเริ่มต้น</td><td>เริ่มจากศูนย์</td><td>เริ่มจากระบบที่มีข้อจำกัดอยู่แล้ว</td></tr><tr><td>ความเสี่ยงหลัก</td><td>AI invent สิ่งที่เราไม่ได้สั่ง</td><td>AI overwrite หรือ refactor สิ่งที่ยังทำงานอยู่</td></tr><tr><td>กลยุทธ์</td><td>ตอบให้ครบทุกมิติ</td><td>ล็อกของเดิม แล้วระบุเฉพาะ delta</td></tr><tr><td>สิ่งที่ควรเน้น</td><td>domain model, boundary, rule, failure behavior</td><td>compatibility, migration, rollback, non-breaking change</td></tr><tr><td>ประโยคเตือนใจ</td><td>อย่าให้ AI เดาโลกใหม่เอง</td><td>อย่าให้ AI ทำความสะอาดบ้านจนโยนของสำคัญทิ้ง</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Conflict ใน spec ไม่ใช่ edge case แต่มันคือ bug ตั้งแต่ยังไม่เขียนโค้ด</h2>



<p class="wp-block-paragraph">อีกประเด็นที่ผมชอบคือ เวลาคำตอบใน spec ขัดกัน ZeeSpec ไม่ควรปล่อยผ่าน</p>



<p class="wp-block-paragraph">เช่น ในมิติ WHO เราบอกว่าเฉพาะ Admin เท่านั้นที่ลบ user ได้ แต่ในมิติ WHEN เราบอกว่า unverified account จะถูกลบอัตโนมัติหลัง 30 วัน แบบนี้มันมี conflict อยู่แล้ว</p>



<p class="wp-block-paragraph">ถ้าเราไม่ resolve ตอน spec AI อาจ resolve ให้เองแบบเงียบๆ และเราอาจไม่รู้ด้วยว่ามันเลือกทางไหน</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Spec ที่ขัดกัน คือ bug ที่ยังไม่ได้ compile</p>
</blockquote>



<p class="wp-block-paragraph">ผมชอบประโยคนี้มาก เพราะมันทำให้เราเปลี่ยนมุมมองจาก “เดี๋ยวค่อยดูตอน implementation” เป็น “ต้องเคลียร์ก่อนให้ AI ลงมือ”</p>



<h2 class="wp-block-heading">เอาไปใช้กับงานจริงได้ยังไง</h2>



<p class="wp-block-paragraph">ถ้าจะเอาแนวคิดนี้ไปใช้กับทีม software development ผมคิดว่าไม่จำเป็นต้องเริ่มด้วย 60 ข้อแบบเต็มทันที เพราะเดี๋ยวทีมจะรู้สึกว่าเอกสารกลับมาฆ่าเราอีกแล้ว 555</p>



<p class="wp-block-paragraph">เริ่มแบบเบากว่านั้นก็ได้ เช่น ก่อนให้ AI ทำ feature ใดๆ ให้ตอบ 6 ช่องนี้ให้ได้ก่อน</p>



<ul class="wp-block-list">
<li><strong>WHAT</strong> จะเพิ่มหรือเปลี่ยนอะไร และอะไรไม่อยู่ใน scope</li>



<li><strong>WHERE</strong> ต้องแตะ file, service, database, integration ไหนบ้าง และอะไรห้ามแตะ</li>



<li><strong>WHEN</strong> flow ใหม่เกิดตอนไหน กระทบ trigger เดิมไหม</li>



<li><strong>WHO</strong> role ไหนใช้ได้ role ไหนห้ามใช้</li>



<li><strong>WHY</strong> business rule สำคัญคืออะไร ทำไมต้องเป็นแบบนี้</li>



<li><strong>HOW</strong> migration, rollback, error, test ต้องเป็นอย่างไร</li>
</ul>



<p class="wp-block-paragraph">สำหรับ greenfield ให้ช่องพวกนี้เป็นการออกแบบระบบ สำหรับ brownfield ให้ช่องพวกนี้เป็นรั้วกัน AI ไม่ให้ไปช่วยแก้สิ่งที่ไม่ควรแก้</p>



<h2 class="wp-block-heading">Prompt แบบย่อสำหรับ greenfield</h2>



<p class="wp-block-paragraph">อันนี้ผมเรียบเรียงเป็น template สั้นๆ เอาไว้ใช้ได้เลย</p>



<pre class="wp-block-code"><code>System: &#91;ชื่อระบบ]
Assumption: เริ่มใหม่ ไม่มี infrastructure เดิม

WHAT: entity, relationship, boundary, สิ่งที่ห้ามมี, ข้อมูลที่ห้ามเก็บ
WHERE: infrastructure, data flow, integration, system boundary
WHEN: trigger ของ create/update/delete, expiry, blocking condition
WHO: role, permission, visibility, approval
WHY: business rule, intent, validation, เหตุผลของข้อจำกัด
HOW: error handling, recovery, consistency, idempotency, test

Generate a system spec with no unstated assumptions. If information is missing, ask before generating code.</code></pre>



<h2 class="wp-block-heading">Prompt แบบย่อสำหรับ brownfield</h2>



<p class="wp-block-paragraph">ส่วน brownfield ผมจะเน้นคำว่า unchanged และ delta ให้ชัด เพราะนี่คือหัวใจของระบบเดิม</p>



<pre class="wp-block-code"><code>Existing system context: &#91;paste schema / API pattern / tech stack / non-negotiable constraints]

New feature: &#91;ชื่อ feature] 

WHAT: delta only, new entity, changed field, สิ่งที่ exclude ชัดเจน 
WHERE: existing infrastructure unchanged, list what must not change 
WHEN: new trigger, conflict with existing trigger, blocking rule เดิมที่ยังต้องใช้ WHO: permission ใหม่อิง role เดิม, role ที่ห้าม access 
WHY: เหตุผลของ feature และเหตุผลที่ constraint เดิมยัง valid 
HOW: migration path, backward compatibility, rollback, tests Generate only the delta. 

Do not refactor existing components unless explicitly requested.</code></pre>



<h2 class="wp-block-heading">สิ่งที่ผมได้จากบทความนี้</h2>



<p class="wp-block-paragraph">ผมว่าประเด็นของ ZeeSpec ไม่ใช่แค่ “เขียน spec ให้ละเอียดขึ้น” แต่คือ “เปลี่ยนหน้าที่ของ spec”</p>



<p class="wp-block-paragraph">เมื่อก่อน spec มักเป็นเอกสารอธิบายให้คนอ่าน แต่ในยุค AI coding spec กลายเป็นรั้วกั้นพฤติกรรมของเครื่องมือ ถ้ารั้วหลวม AI ก็เดินออกนอกเขต ถ้ารั้วไม่บอกตำแหน่งท่อ มันก็อาจขุดโดนท่อ</p>



<p class="wp-block-paragraph">ฟังดูเหมือนกลับไปยุคเขียนเอกสารเยอะๆ แต่ผมว่าไม่ใช่ครับ จุดต่างคือ spec แบบนี้ไม่ได้เขียนเพื่อความสวยงามหรือ compliance อย่างเดียว แต่มันเขียนเพื่อควบคุมสิ่งที่จะถูก generate ออกมาจริง จะได้ไม่ต้องเสียเวลา เสียโทเค็น แล้วได้ผลลัพธ์ผิดๆ แบบที่ทำให้อารมณ์เสีย</p>



<p class="wp-block-paragraph">และยิ่ง AI เขียนโค้ดได้เร็วขึ้นเท่าไร spec ยิ่งสำคัญขึ้นเท่านั้น</p>



<p class="wp-block-paragraph">เพราะความเร็วไม่ได้ช่วยอะไร ถ้าเอไอลากเราวิ่งหลงทาง ผ่าม!</p>



<h2 class="wp-block-heading">แหล่งที่มา</h2>



<ul class="wp-block-list">
<li><a href="https://medium.com/@visrow/zeespec-spec-driven-development-for-greenfield-vs-brownfield-projects-c593b5d88186" target="_blank" rel="noopener">ZeeSpec- Spec Driven Development for Greenfield vs Brownfield Projects</a> โดย Vishal Mysore</li>



<li><a href="https://dev.to/vishalmysore/spec-driven-development-with-zeespec-greenfield-vs-brownfield-4103" target="_blank" rel="noopener">Spec Driven Development with ZeeSpec : greenfield vs brownfield</a> บน DEV Community</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/7769/zeespec-spec/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
