KoderKoder.ai
ราคาองค์กรการศึกษาสำหรับนักลงทุน
เข้าสู่ระบบเริ่มต้นใช้งาน

ผลิตภัณฑ์

ราคาองค์กรสำหรับนักลงทุน

ทรัพยากร

ติดต่อเราสนับสนุนการศึกษาบล็อก

กฎหมาย

นโยบายความเป็นส่วนตัวข้อกำหนดการใช้งานความปลอดภัยนโยบายการใช้งานที่ยอมรับได้แจ้งการละเมิด

โซเชียล

LinkedInTwitter
Koder.ai
ภาษา

© 2026 Koder.ai สงวนลิขสิทธิ์

หน้าแรก›บล็อก›อัลกอริทึมแรกของ Ada Lovelace และสิ่งที่มันสอนเราในวันนี้
06 มี.ค. 2568·2 นาที

อัลกอริทึมแรกของ Ada Lovelace และสิ่งที่มันสอนเราในวันนี้

Notes ของ Ada Lovelace เกี่ยวกับ Analytical Engine อธิบายอัลกอริทึมที่ทำซ้ำได้ มาดูว่าแนวคิดยุคแรกของเธอสอดคล้องกับการออกแบบโปรแกรมและการคิดเชิงคอมพิวเตอร์ในปัจจุบันอย่างไร

อัลกอริทึมแรกของ Ada Lovelace และสิ่งที่มันสอนเราในวันนี้

เรื่องนี้เกี่ยวกับอะไรแท้จริง

คุณคงเคยได้ยินสรุปสั้น ๆ ว่า: Ada Lovelace เขียน “อัลกอริทึมแรก” ชุดคำสั่งที่ตั้งใจให้ Charles Babbage’s Analytical Engine ปฏิบัติ หลายคนยังอ้างถึงมันเพราะเป็นตัวอย่างแรก ๆ ที่ชัดเจนของสิ่งที่เราวันนี้เรียกว่า programming—การแยกเป้าหมายออกเป็นขั้นตอนที่แม่นยำซึ่งเครื่องสามารถทำตามได้

บทความนี้ไม่ได้พยายามประกอบฟันเฟืองของ Engine ใหม่หรือพิสูจน์ข้อเท็จจริงทางประวัติศาสตร์ทุกข้อ แต่เน้นที่แนวคิดการเขียนโปรแกรมในงานของ Lovelace: วิธีเปลี่ยนโจทย์คณิตศาสตร์ให้เป็นสิ่งที่เครื่องทำได้ วิธีแทนค่าข้อมูล และวิธีสื่อขั้นตอนเพื่อให้ผู้อื่น (หรือสิ่งอื่น) รันมันได้

ทำไมยังสำคัญ

Notes อันมีชื่อของ Lovelace อ่านแล้วเหมือนสะพานเชื่อมคณิตศาสตร์กับการออกแบบซอฟต์แวร์ แม้ว่าเครื่องจะเป็นภาพสมมติ แต่แนวคิดนั้นคุ้นเคยกับใครก็ตามที่เคยพยายามให้คอมพิวเตอร์ทำอะไรสักอย่างให้เชื่อถือได้

นี่คือสิ่งที่เราจะจับตาไปตลอดบทความ:

  • ขั้นตอนและโครงสร้าง: แยกงานเป็นการดำเนินการลำดับแทนความตั้งใจแบบคลุมเครือ
  • ข้อมูลและสัญกรณ์: ตัดสินใจว่ามีค่าอะไรบ้าง ตั้งชื่ออย่างไร และค่าย้ายผ่านกระบวนการอย่างไร
  • การทำซ้ำ: ระบุรูปแบบและนำกลับมาใช้แทนการเขียนซ้ำ
  • การตรวจสอบผลงาน: ออกแบบขั้นตอนที่สามารถตรวจสอบได้ ไม่ใช่แค่น่าชม
  • เอกสาร: เขียนคำอธิบายให้โปรแกรมเข้าใจได้โดยผู้อ่านคนอื่น

จุดมุ่งหมายง่าย ๆ คือ: มองอัลกอริทึม "แรก" ของ Lovelace ให้น้อยลงเป็นของจัดแสดงในพิพิธภัณฑ์ และมากขึ้นเป็นแม่แบบแรก ๆ ของการคิดเชิงคอมพิวเตอร์ที่ยังสะท้อนวิธีเรายังออกแบบโปรแกรมในวันนี้

Ada Lovelace, Babbage, และ Analytical Engine

Augusta Ada King, Countess of Lovelace—ที่รู้จักกันดีในชื่อ Ada Lovelace—เติบโตท่ามกลางทางแยกระหว่างกวีนิพนธ์และคณิตศาสตร์ แม่ของเธอส่งเสริมการเรียนรู้เชิงเข้มข้น และ Ada ก็กลายเป็นส่วนหนึ่งของวงสังคมเล็ก ๆ ของนักวิทยาศาสตร์และนักคิดเด่น ๆ เธอไม่ได้เป็นอัจฉริยะผู้โดดเดี่ยว แต่เป็นผู้ร่วมงานที่มีพรสวรรค์ซึ่งตั้งคำถามได้ชัดเจนเกี่ยวกับสิ่งที่เครื่องสามารถ มีความหมาย ไม่ใช่แค่ทำได้

Ada กับ Babbage เชื่อมต่อกันอย่างไร

Charles Babbage เป็นที่รู้จักจากแผนการคำนวณกลไกเมื่อ Ada พบเขา Babbage สามารถออกแบบฮาร์ดแวร์ในหัว: ฟันเฟือง แกน และวงล้อตัวเลขเรียงกันเป็นระบบ ส่วน Ada มีพรสวรรค์ด้านการอธิบาย—เอาความคิดทางเทคนิคที่ซับซ้อนแล้วแปลงเป็นแนวคิดที่มีโครงสร้างและสื่อสารได้

ความสัมพันธ์ของพวกเขาทำงานได้เพราะจุดแข็งต่างกัน Babbage ผลักวิสัยทัศน์เชิงวิศวกรรมไปข้างหน้า; Ada ผลักวิสัยทัศน์เชิงแนวคิดไปข้างหน้า โดยเฉพาะความคิดที่ว่าเครื่องสามารถตามลำดับการดำเนินการที่คนออกแบบไว้ล่วงหน้าได้

Analytical Engine อยู่ตรงไหน

Analytical Engine ของ Babbage ไม่ใช่แค่เครื่องคิดเลขที่ดีกว่า บนกระดาษมันอธิบายเครื่องอเนกประสงค์: เครื่องที่เก็บค่า ดำเนินการ และรันขั้นตอนที่วางแผนไว้ทีละขั้น คิดว่าเป็นแบบร่างแรกสำหรับสิ่งที่วันนี้เราเรียกว่า programmable computer—แม้ว่าจะไม่ได้สร้างเสร็จในชีวิตของพวกเขาก็ตาม

ทำไมทศวรรษ 1840 ถึงสำคัญ

ทศวรรษ 1840 เป็นช่วงเวลาที่คณิตศาสตร์ อุตสาหกรรม และระบบอัตโนมัติกำลังก้าวเข้ามาพบกัน ผู้คนต้องการวิธีการที่เชื่อถือได้—ตาราง สูตร และกระบวนการที่ทำซ้ำได้—เพราะข้อผิดพลาดมีค่าใช้จ่ายสูงและวิทยาศาสตร์กำลังก้าวไกล ในบริบทนั้น ความสนใจของ Ada ใน "วิธีสอนเครื่อง" ไม่ใช่แค่ความอยากรู้ แต่เป็นการตอบสนองตามกาลเวลา: แปลงเหตุผลของมนุษย์ให้เป็นกระบวนการที่ทำซ้ำและตรวจสอบได้

มุมมองง่าย ๆ ของ Analytical Engine

ก่อนที่ Ada Lovelace จะอธิบายอัลกอริทึม ต้องมีเครื่องที่คุ้มค่าที่จะ "ตั้งโปรแกรม" ก่อน Charles Babbage คิดว่า Analytical Engine เป็นเครื่องคิดเลขอเนกประสงค์: ไม่ใช่อุปกรณ์สำหรับสูตรเดียว แต่เป็นเครื่องที่สามารถตั้งค่าให้ทําลําดับการดำเนินการต่าง ๆ ได้

มันถูกออกแบบมาให้ทำอะไร

แนวคิดหลักเรียบง่าย: หากคุณแยกปัญหาเป็นขั้นตอนเลขคณิตเล็ก ๆ (บวก ลบ คูณ หาร) เครื่องควรทำขั้นตอนเหล่านั้นอย่างเชื่อถือได้ ตามลำดับที่ถูกต้อง และกี่ครั้งก็ได้เมื่อจำเป็น

นั่นคือการก้าวจากการคำนวณครั้งเดียวสู่วิธีการที่นำกลับมาใช้ใหม่ได้

ส่วนที่พูดเป็นภาษาธรรมดา: หน่วยความจำ การดำเนินการ ขาเข้า/ขาออก

Babbage อธิบายสองส่วนหลัก:

  • “the store” (หน่วยความจำ): ที่เก็บตัวเลขขณะงานกำลังทำอยู่ คิดว่ามันเหมือนจดผลลัพธ์ชั่วคราวไว้บนสมุดโน้ตเพื่อใช้ซ้ำ
  • “the mill” (การดำเนินการ): ส่วนที่ทำการคำนวณบนตัวเลขจาก store แล้วเก็บผลลัพธ์กลับเข้าไป นี่คือโต๊ะทำงานที่เกิดการคำนวณ

สำหรับ input และ output Engine ถูกออกแบบให้รับคำสั่งและข้อมูลโดยใช้บัตรเจาะรู (ได้แรงบันดาลใจจากกี่ทอผ้า) และผลิตผลลัพธ์ในรูปแบบที่มนุษย์ใช้ได้—พิมพ์หรือบันทึกไว้

อุปมาในยุคปัจจุบัน

ถ้าตัดไปเทียบกับวันนี้:

  • Mill ≈ CPU: ดำเนินการ
  • Store ≈ RAM: เก็บข้อมูลที่กำลังทำงาน
  • Cards ≈ programs and data files: บอกเครื่องว่าทำอะไรและทำกับอะไร

นี่คือเหตุผลที่ Analytical Engine มีความหมาย: มันร่างการแยกหน้าที่ที่เราใช้จนถึงทุกวันนี้—ฮาร์ดแวร์ที่ทำตามขั้นตอน กับ โปรแกรมที่กำหนดขั้นตอนเหล่านั้น

Notes ที่เปลี่ยนวิธีที่เราคิดเกี่ยวกับเครื่อง

เมื่อคนพูดถึง Ada Lovelace และอัลกอริทึมแรก พวกเขามักหมายถึงชุด "Notes" ที่เธอแนบไว้กับการแปลภาษาอังกฤษของบทความของ Luigi Menabrea เกี่ยวกับ Charles Babbage’s Analytical Engine

Menabrea อธิบายแนวคิดของเครื่อง Lovelace ก้าวไปไกลกว่านั้น: เธอมอง Engine เป็นสิ่งที่คุณสามารถ สั่งงาน ได้—ไม่ใช่แค่ชื่นชม การเปลี่ยนแปลงนี้คือเหตุผลที่ Notes มีความสำคัญในประวัติศาสตร์การเขียนโปรแกรม พวกมันอ่านแล้วเหมือนการคิดเชิงคอมพิวเตอร์: แยกเป้าหมายเป็นขั้นตอนที่ชัดเจน เลือกการแทนค่า และคาดการณ์ว่าเครื่องจักรจะทำตามอย่างไร

มากกว่าแค่คอมเมนต์: เป็นคู่มือการให้คำสั่ง

Notes ของ Lovelace อธิบายสิ่งที่เราวันนี้เรียกว่า program design เธออธิบายส่วนต่าง ๆ ของ Engine (เช่น หน่วยเก็บข้อมูลและ "mill" ที่ประมวลผล) ในแง่ของการจัดลำดับและควบคุมการดำเนินการ แนวคิดศูนย์กลางเรียบง่ายแต่ลึกซึ้ง: หาก Analytical Engine สามารถทำการดำเนินการตามลำดับที่กำหนดบนสัญลักษณ์ที่กำหนดได้ วิธีการต้องถูกเขียนลงในรูปแบบที่เครื่องสามารถดำเนินการได้

นี่คือจุดที่งานของเธอเริ่มใกล้เคียงกับการเขียนโปรแกรมสมัยใหม่ มันไม่ใช่แค่ทฤษฎี แต่มันคือวิธีการ

ตารางทีละขั้นตอนที่ทำให้เป็นรูปธรรม

ที่สำคัญที่สุด Notes รวมตัวอย่างที่ทำเป็นตารางขั้นตอน วางไว้อย่างเป็นบรรทัดต่อบรรทัดว่าควรให้เครื่องทำอะไร—ค่าตัวเลขอยู่ที่ตำแหน่งไหน การดำเนินการถัดไปคืออะไร และผลลัพธ์ถูกเก็บไว้ที่ไหน

รูปแบบตารางนั้นเป็นบรรพบุรุษของ pseudocode, flowcharts และตารางตารางคำสั่งในปัจจุบัน: แผนที่ชัดเจน ตรวจสอบได้ ที่คุณสามารถติดตามโดยไม่ต้องเดา ไม่ว่าคุณจะสร้าง Analytical Engine หรือไม่ กฎนิสัยนี้—การแปลงไอเดียให้เป็นลำดับที่รันได้—คือหัวใจของการเขียนซอฟต์แวร์

อัลกอริทึม Bernoulli numbers อธิบายแบบง่าย

อัลกอริทึม ในภาษาทั่วไปคือวิธีการที่ทำซ้ำได้: ชุดขั้นตอนชัดเจนที่จะพาคุณจากจุดเริ่มต้นถึงคำตอบได้อย่างมั่นคง เหมือนสูตรที่ไม่ขึ้นกับสัญชาตญาณ—ถ้าทำตามขั้นตอน คุณจะได้ผลเหมือนกันทุกครั้ง

ตัวอย่างอัลกอริทึมที่โด่งดังของ Ada ตั้งใจคำนวณ Bernoulli numbers—ลำดับค่าที่ปรากฏในหลายส่วนของคณิตศาสตร์ (เช่น สูตรผลรวม 1 + 2 + … + n และบางส่วนของแคลคูลัส) คุณไม่จำเป็นต้องรู้ทฤษฎีเบื้องหลังเพื่อเห็นว่าทำไมมันเป็นกรณีทดสอบที่ดีสำหรับเครื่องคำนวณแรก ๆ

ทำไม Bernoulli numbers เป็นตัวอย่างที่ดี

มันท้าทายในทางที่เหมาะสม:

  • ค่าตัวใหม่แต่ละค่าขึ้นกับค่าก่อนหน้า ไม่สามารถคำนวณครั้งเดียวแล้วจบได้
  • การคำนวณต้องมีหลายการดำเนินการ (บวก ลบ คูณ หาร) ไม่ใช่เทคนิคเดียว
  • มีลำดับผลลัพธ์ที่ถูกต้องจึงตรวจสอบผลได้

กล่าวคือ มันซับซ้อนพอจะพิสูจน์ว่าเครื่องตามขั้นตอนได้ แต่ยังเป็นระเบียบพอที่จะเขียนเป็นขั้นตอน

รูปร่างของวิธีการ: inputs → ค่าใช้งาน → ผลลัพธ์

แก่นของอัลกอริทึมมีโครงสร้างที่คุ้นเคยที่เราใช้ในโปรแกรมสมัยใหม่:

  • Inputs: ค่าคงที่และ Bernoulli numbers ก่อนหน้าที่ต้องใช้ในขั้นตอนถัดไป
  • Intermediate values: ผลลัพธ์ชั่วคราวที่ต้องเก็บไว้ระหว่างทาง—ผลรวมบางส่วน ผลคูณ เศษส่วนที่ต้องรอใช้ซ้ำ
  • Final result: Bernoulli number ถัดไปในลำดับ

ในมุมนี้ Lovelace ไม่ได้แค่แสดงการคำนวณตัวเลข—เธอแสดงวิธีจัดระเบียบการคำนวณหลายขั้นตอนให้เครื่องปฏิบัติได้โดยไม่ต้องเดา

การแยกย่อยและการควบคุมลำดับ: งานออกแบบที่ซ่อนอยู่

จาก Pseudocode เป็นผลิตภัณฑ์
วางโครงร่างของคุณแล้วให้ Koder.ai แปลงเป็นโค้ดและโครงสร้างจริง
สร้างโค้ด

เมื่อคนพูดถึงอัลกอริทึม Bernoulli ของ Lovelace มักสนใจผลลัพธ์ (“โปรแกรมแรก”) มากกว่างานออกแบบที่ทำให้ขั้นตอนน่าเชื่อถือ ความสำเร็จจริง ๆ ไม่ใช่แค่การจัดรายการการดำเนินการ แต่คือการปั้นให้เครื่องทำตามได้โดยไม่ต้องประดิษฐ์

การแยกย่อย: แปลงเป้าหมายใหญ่เป็นหน้าที่เล็ก

แทนที่จะมองว่า “คำนวณ Bernoulli numbers” เป็นงานเดียว Notes แยกเป็นงานย่อยที่ทำซ้ำและตรวจสอบได้: คำนวณค่ากลาง รวมตามสูตร บันทึกผลลัพธ์ แล้วไปกรณีถัดไป

การแยกย่อยนี้สำคัญเพราะแต่ละส่วนย่อยตรวจสอบได้แยกกัน หากผลออกมาผิด คุณไม่ต้องดีบักทั้งอัลกอริทึม แต่ตรวจสอบชิ้นส่วนเดียว

สถานะและหน่วยความจำ: อะไรต้องถูกจำ

คอมพิวเตอร์กลไกไม่สามารถ “คิดในใจ” ได้ ทุกค่าที่จะต้องใช้ต่อไปต้องถูกเก็บไว้ที่ไหนสักแห่ง Notes ระบุเรื่องนี้อย่างระมัดระวัง บางตัวเลขเป็นค่าชั่วคราว บางตัวเป็นผลลัพธ์สุดท้ายที่ต้องถูกเก็บเพื่อใช้ในขั้นต่อไป

นี่เป็นรูปแบบแรกของการคิดเกี่ยวกับ program state:

  • ค่าตัวไหนต้องคงอยู่ไปยังขั้นถัดไป?\n- ค่าไหนสามารถเขียนทับได้อย่างปลอดภัย?\n- ค่าไหนควรไม่ถูกแตะต้องเพราะขึ้นกับขั้นตอนถัดไป?

การควบคุมลำดับ: การจัดลำดับเพื่อลดความผิดพลาด

ลำดับการดำเนินการเป็นคุณสมบัติด้านความปลอดภัย การคำนวณบางอย่างต้องทำก่อนเพื่อหลีกเลี่ยงการใช้ค่าที่ยังไม่ได้เตรียม หรือการเขียนทับค่าที่ยังจำเป็น

ในคำพูดสมัยใหม่ Lovelace กำลังออกแบบ control flow ให้โปรแกรมมีเส้นทางชัดเจน: ทำ A ก่อน จากนั้น B แล้ว C—เพราะทำ B ก่อนจะให้คำตอบผิดโดยไม่รู้ตัว

ลูป การทำซ้ำ และแนวคิดการวนซ้ำ

หนึ่งในแนวคิดที่ “ทันสมัย” ที่ซ่อนอยู่ในตารางขั้นตอนของ Lovelace คือการทำซ้ำ: คำสั่งชุดเดียวกันทำซ้ำหลายครั้ง ไม่ใช่เพราะติดอยู่ แต่เพราะการทำซ้ำเป็นวิธีที่เร็วและชัดเจนที่สุด

การทำซ้ำที่ไม่ซับซ้อน

การทำซ้ำในโปรแกรมหมายถึง: ทำสูตรเล็ก ๆ ตรวจสอบว่าเสร็จหรือยัง ถ้ายังให้ทำสูตรเดิมอีกครั้ง จุดสำคัญคือมีสิ่งที่เปลี่ยนในแต่ละครั้ง—มักเป็นเคาน์เตอร์ ตำแหน่งในตาราง หรือค่าที่สะสม—ทำให้โปรแกรมเดินไปข้างหน้าจนถึงเส้นชัย

ในสัญกรณ์ของ Lovelace คุณเห็นการกลับไปยังขั้นก่อนหน้าอย่างเป็นระบบ แทนที่จะเขียนซ้ำคำสั่งเหมือนกันหลาย ๆ ครั้ง เธอกำหนดรูปแบบแล้วบอกว่าจะวนกลับเมื่อใด นั่นคือเมล็ดพันธุ์ของสิ่งที่เราเรียกว่า iteration ในวันนี้

ตารางขั้นตอนของเธอกับลูปสมัยใหม่

ถ้าคุณเขียนโค้ด คุณจะเห็นรูปแบบนี้เป็น for loops (“ทำซ้ำ N ครั้ง”) หรือ while loops (“ทำจนกว่าเงื่อนไขจะเป็นจริง”) ตารางของเธอยังมีส่วนประกอบของลูปที่คุ้นเคย:

  • เคาน์เตอร์ (ตอนนี้เป็นรอบที่เท่าไร)\n- ค่าที่เปลี่ยนแปลง (ผลบางส่วนในกำลังดำเนินการ)\n- เงื่อนไขหยุด (เมื่อเคาน์เตอร์ถึงจุดสิ้นสุด)

ตัวอย่างง่าย: การหาผลรวมของตัวเลข

สมมติคุณต้องการผลรวมจาก 1 ถึง 5

  • เริ่มด้วย total = 0\n- เริ่มด้วย i = 1\n- บวก i เข้า total\n- เพิ่ม i ทีละ 1\n- ถ้า i ยังไม่เกิน 5 ให้ทำขั้นตอนบวกและเพิ่มซ้ำ

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

ตัวแปรและสัญกรณ์: ทำให้ไอเดียรันได้จริง

ทำให้การเปลี่ยนแปลงย้อนกลับได้
ใช้ snapshots และ rollback เมื่อลองไอเดียแล้วเกิดปัญหา
ใช้ Snapshots

กระบวนการอาจดูสมเหตุสมผลในหัว แต่ยังทำให้เครื่องหรือคนอื่นปฏิบัติตามไม่ได้หากไม่มีวิธีอ้างถึงปริมาณที่เปลี่ยนแปลงได้ นั่นคือที่มาของตัวแปรและสัญกรณ์

ตัวแปรเหมือนกล่องมีป้าย

คิดว่าตัวแปรเป็นกล่องที่มีป้าย ชื่อป้ายคงที่ แต่ข้างในเปลี่ยนได้ขณะทำงาน

ถ้าคุณกำลังคำนวณลำดับ อาจมี:

  • กล่องสำหรับ ผลลัพธ์ปัจจุบัน\n- กล่องสำหรับ ค่าป้อนถัดไป\n- กล่องสำหรับ ค่ากลางชั่วคราว ที่จะโยนทิ้งหลังทำขั้นตอน

ถ้าไม่มีกล่องพวกนี้ คุณต้องอธิบายเป็นประโยคยาว ๆ (“เอาตัวเลขที่คำนวณเมื่อสองขั้นก่อน…”) ซึ่งจะยุ่งเหยิงเร็วมาก

สัญกรณ์ไม่ใช่ของประดับ

ใน Notes สัญลักษณ์และป้ายชื่อไม่ใช่เพื่อให้ดูเป็นทางการ แต่วางไว้เพื่อให้กระบวนการรันได้ สัญกรณ์ชัดเจนตอบคำถามปฏิบัติ:\n\n- ค่าตัวไหนกำลังถูกอัปเดตตอนนี้?\n- ค่าตัวไหนต้องเก็บไว้ใช้ต่อ?\n- ค่าชั่วคราวไหนเขียนทับได้?

เมื่อกระบวนการยาว คำชี้แจงเล็ก ๆ เหล่านี้ป้องกันความผิดพลาดที่พบได้บ่อยที่สุด: สับสนค่าที่มีลักษณะคล้ายกัน

เสียงสะท้อนสมัยใหม่: ชื่อและประเภท

การตั้งชื่อตัวแปรที่ดียังเป็นวิธีถูกที่สุดเพื่อลดบั๊ก ลองเปรียบ x1, x2, x3 กับ current_sum, term_index, next_term: ชุดที่สองบอกว่าแต่ละกล่องใช้ทำอะไร

ประเภท (types) เพิ่มความปลอดภัยอีกชั้น การตัดสินใจว่าสิ่งใดเป็น integer, decimal, list หรือ record เหมือนการเลือกชนิดของภาชนะ—ข้อผิดพลาดบางอย่างจะเป็นไปไม่ได้หรือจับได้ง่ายขึ้นตั้งแต่ต้น

ตัวแปรและสัญกรณ์เปลี่ยน "ไอเดียฉลาด ๆ" ให้กลายเป็นขั้นตอนที่ใครก็ทำซ้ำได้อย่างถูกต้อง (รวมถึงเครื่องด้วย)

Abstraction และ Reuse: จากตารางขั้นตอนสู่ฟังก์ชัน

Abstraction หมายถึงการมุ่งไปที่สิ่งสำคัญและซ่อนรายละเอียดที่ไม่จำเป็น มันต่างจากการบอกว่า "จัดเรียงรายการนี้" กับการอธิบายทุกการสลับและเปรียบเทียบด้วยมือ Notes ของ Lovelace แสดงสัญชาตญาณนี้ตั้งแต่แรก: เธอตั้งใจสื่อวิธีการโดยไม่บังคับให้ผู้อ่านลงไปติดอยู่กับกลไกทางกายภาพของเครื่อง

แยกวิธีการออกจากกลไก

คุณสมบัติเด่นของ Notes คือการทำให้แกนหลักแยกออกจากการกระทำทางกล The Analytical Engine มี "วิธีทำ" ของมัน (ฟันเฟือง store mill) แต่ Notes เน้นที่ "สิ่งที่ต้องทำ": ลำดับการดำเนินการที่จำเป็นเพื่อให้ได้ผลลัพธ์

การแยกนี้คือเมล็ดพันธุ์ของการออกแบบซอฟต์แวร์:

  • อัลกอริทึมอธิบาย ความตั้งใจ (compute Bernoulli numbers)\n- เครื่องหรือการนำไปใช้จัดการ รายละเอียดการปฏิบัติ (ค่าคงที่อยู่ที่ไหน การดำเนินการทำอย่างไร)

เมื่อคุณสามารถอธิบายวิธีการโดยไม่ต้องอธิบายเครื่องซ้ำ คุณก็ถือว่าการคำนวณเป็นสิ่งที่พกพาได้—นำไปใช้อีกบนฮาร์ดแวร์ต่างกันหรือโดยคนต่างกันได้

จากตารางไปสู่ส่วนที่นำกลับมาใช้ได้

ตารางทีละขั้นใน Notes คล้ายกับ "procedure" ต้น ๆ: ชุดขั้นตอนที่เรียกใช้ซ้ำได้ โค้ดสมัยใหม่ทำให้เป็นรูปธรรมด้วยฟังก์ชัน โมดูล และคอมโพเนนต์นำกลับมาใช้ได้

ฟังก์ชันที่ดีทำหน้าที่เหมือนการนำเสนอของ Lovelace:

  • ตั้งชื่อการดำเนินการเพื่อไม่ต้องอธิบายซ้ำ\n- รับ inputs และให้ outputs\n- ซ่อนขั้นตอนภายในเว้นแต่จำเป็นต้องตรวจสอบ

นี่คือเหตุผลที่ abstraction ไม่ใช่การคลุมเครือ แต่มันคือการทำให้ ใช้งานได้ การนำกลับมาใช้จึงเกิดขึ้นตามธรรมชาติ: เมื่อวิธีการถูกรูปแบบชัดเจน คุณเรียกใช้มันในบริบทใหม่ ๆ รวมกับวิธีอื่น ๆ และสร้างระบบใหญ่ขึ้นโดยไม่จมในรายละเอียด

เอกสารเป็นฟีเจอร์ ไม่ใช่สิ่งที่ทำทีหลัง

Ada Lovelace ไม่ได้แค่บอกว่า Analytical Engine ทำอะไรได้—เธอแสดงวิธีทำให้ขั้นตอนไม่คลุมเครือสำหรับคนอื่น (หรือเครื่อง) นั่นคือพลังเงียบของ Notes: เธอปฏิบัติต่อการอธิบายเป็นส่วนหนึ่งของงาน ไม่ใช่ของประดับ

ตารางทีละขั้นเป็น “pseudocode ที่ไม่ให้คลุมเครือ”

เหตุผลหนึ่งที่การนำเสนอของเธอยังทันสมัยคือการใช้ตารางขั้นตอน โครงสร้างตารางบังคับให้ตัดสินใจที่ข้อความพร่ามัวอาจปิดซ่อนไว้:

  • อะไรเกิดก่อน รองลงมา และต่อมา\n- ค่ากลางมีอะไรบ้างในแต่ละขั้น\n- เมื่อไรค่าถูกอัปเดตเทียบกับแค่เรียกใช้\n- จุดเริ่มและสิ้นสุดของการทำซ้ำ

นั่นลดความคลุมเครือในแบบเดียวกับ pseudocode ของวันนี้ คุณอาจอ่านย่อหน้าและคิดว่าคุณเข้าใจ—จนกว่าจะลองรันจริง ตารางขั้นตอนทำให้เส้นทางการดำเนินการมองเห็นได้ ซึ่งเป็นสิ่งที่เอกสารโปรแกรมที่ดีมุ่งหวังจะทำ

Notes เมื่อก่อน, README ตอนนี้

Notes ของ Lovelace รวมสิ่งที่เรายังคงพยายามรวมกัน:

  1. โปรแกรมมีไว้ทำอะไร (intent)\n\n2) มันทำงานอย่างไร (procedure)\n\n3) จะตีความสัญกรณ์อย่างไร (interface—ชื่อ สัญลักษณ์ ข้อสมมติ)

นั่นสอดคล้องกับคอมเมนต์, docstrings, และ README สมัยใหม่ README อธิบายเป้าหมายและบริบท คอมเมนต์ในบรรทัดอธิบายขั้นตอนที่ซับซ้อน Docstrings ระบุ inputs/outputs และ edge cases เมื่อขาดสิ่งใดสิ่งหนึ่ง ผู้ใช้มักต้องเดา และการเดาคือที่ที่บั๊กเกิด

ข้อสรุปเชิงปฏิบัติ: จงเอกสารขั้นตอนให้ผู้อื่นทำได้

เมื่อคุณเอกสารกระบวนการ (โค้ดหรืออื่น ๆ) เขียนราวกับว่าคนอื่นจะทำซ้ำโดยไม่มีคุณ:\n\n- ระบุ inputs และ outputs ให้ชัดเจน ("ให้ X ผล Y")\n- ลงข้อสมมติ (หน่วย, ลำดับ, กฎการปัดเศษ)\n- เขียนขั้นตอนเป็นลำดับหมายเลข หรือเป็นตารางสถานะสั้น ๆ\n- ตั้งชื่อตัวแปรกลาง และใช้ชื่อนั้นสม่ำเสมอ\n- รวมตัวอย่างงานสั้น ๆ ให้คนตรวจสอบด้วยมือได้

นั่นไม่ใช่งานเพิ่มแต่เป็นวิธีที่ทำให้วิธีการนำกลับมาใช้ได้

ตำนาน ข้อถกเถียง และสิ่งที่เราพูดได้อย่างมั่นใจ

ส่งออกซอร์สโค้ดได้ทุกเมื่อ
สร้างเร็ว แล้วควบคุมได้เต็มที่ด้วยการส่งออกซอร์สโค้ด
ส่งออกโค้ด

Ada Lovelace มักถูกแนะนำด้วยป้าย "โปรแกรมเมอร์คนแรก" ซึ่งเป็นคำย่อที่มีประโยชน์ แต่ก็อาจทำให้ความจริงที่น่าสนใจกว่าถูกลดความสำคัญ ข้อถกเถียงไม่ใช่เรื่องศักดิ์ศรีเพียงอย่างเดียว แต่มันเกี่ยวกับความหมายของคำว่า โปรแกรม, คอมพิวเตอร์, และ การเป็นผู้เขียนงาน

"โปรแกรมเมอร์คนแรก" หมายความว่าอย่างไร (และทำไมมีคนเถียง)

ถ้า "โปรแกรมเมอร์" หมายถึงคนที่เขียนคำสั่งสำหรับเครื่องอเนกประสงค์ Ada มีสิทธิ์อ้างได้ เดิมใน Notes เธออธิบายวิธีทีละขั้นตอนสำหรับสร้าง Bernoulli numbers—หลัก ๆ เป็นแผนว่าถ้า Engine อยู่ มันจะคำนวณค่าไม่ใช่เรื่องเล็ก

แต่ประวัติศาสตร์ถกเถียงเพราะ:\n\n- Analytical Engine ไม่ได้เสร็จสมบูรณ์ในยุคนั้น ดังนั้นโปรแกรมไม่สามารถรันยืนยันได้\n- บางส่วนของวิธีอาจสะท้อนการร่วมมือกับ Charles Babbage ที่คิดเรื่องกระบวนการของเครื่องมานานแล้ว\n- มีระบบอัตโนมัติเก่าก่อนหน้านั้น (เช่น Jacquard loom) แม้ไม่ใช่ความหมายเดียวกับ "เครื่องที่ตั้งโปรแกรมได้" ในเชิงทั่วไป

ความคิดกับเครื่องที่ใช้งานได้จริง

แยกการคิดค้นไอเดียการคำนวณออกจากการสร้างเครื่องที่ใช้งานได้ Babbage ให้คุณค่าทางสถาปัตยกรรม: เครื่องที่มี memory ("store"), processor ("mill"), และการควบคุมผ่านบัตรเจาะรู Lovelace ให้คุณค่าเชิงการตีความและการสื่อ: เธอชี้ว่าเครื่องสามารถ แทน สิ่งต่าง ๆ ได้อย่างไรและกระบวนการจะถูก เขียนลง อย่างไรเพื่อให้เครื่องทำตามได้

โปรแกรมไม่ได้เลิกเป็นโปรแกรมเพราะฮาร์ดแวร์ยังไม่มี ในคำสมัยใหม่ มันเหมือนการเขียนซอฟต์แวร์สำหรับแพลตฟอร์มที่ยังเป็นทฤษฎี—หรือระบุอัลกอริทึมก่อนชิปรองรับ

ให้เครดิตโดยไม่ต้องเปลี่ยนประวัติศาสตร์เป็นการแข่งขัน

วิธีที่เคารพต่อยุคนั้นคือมองเป็นความร่วมมือระหว่างบทบาทต่าง ๆ:\n\n- Babbage: การออกแบบเครื่อง, ความทะเยอทะยานทางคณิตศาสตร์ และการพัฒนาแบบยาวนาน\n- Lovelace: การแปล ขยาย อธิบาย และความสามารถพิเศษในการเชื่อมขั้นตอนนามธรรมกับเครื่องอเนกประสงค์\n- Menabrea (และคนอื่น ๆ): คำอธิบายก่อนหน้าที่ Lovelace แปลและแปลงให้ละเอียดขึ้นมาก

สิ่งที่เราพูดด้วยความมั่นใจได้คือ: Notes ของ Lovelace ช่วยกำหนดความหมายของการเขียนโปรแกรม—ไม่ใช่แค่การคำนวณ แต่การแสดงอย่างระมัดระวังของกระบวนการที่เครื่องสามารถปฏิบัติตามได้

ข้อสรุปเชิงปฏิบัติสำหรับการออกแบบโปรแกรมวันนี้

Notes ของ Lovelace สำคัญเพราะมันแสดง วิธีคิด เมื่อเปลี่ยนไอเดียเป็นแผนที่เครื่องรันได้ แม้คุณจะไม่เคยจับบัตรเจาะรูหรือฟันเฟือง กลุ่มบทเรียนหลักยังสอดคล้องกับการออกแบบโปรแกรมสมัยใหม่: ให้โครงงานมีโครงสร้างชัดเจน ตั้งชื่อให้ดี ใช้การทำซ้ำอย่างตั้งใจ และสร้างชิ้นที่นำกลับมาใช้ได้

บทเรียนที่คงทน (ยังทันสมัยอยู่)

โครงสร้างชนะความฉลาดเฉพาะตัว. โปรแกรมง่ายต่อการสร้างและดูแลเมื่อแบ่งเป็นขั้นตอนที่มีจุดประสงค์ชัดเจน แนวทางของ Lovelace สนับสนุนการออกแบบรูปทรงของวิธีการก่อนลงรายละเอียด

ความชัดเจนเป็นฟีเจอร์. ตารางและคำอธิบายของเธอไม่ใช่ของประดับ แต่เป็นส่วนหนึ่งของโปรแกรม เมื่อ "คุณในอนาคต" (หรือเพื่อนร่วมงาน) ตามเหตุผลได้เร็ว โปรแกรมจะเชื่อถือได้มากขึ้น

การทำซ้ำคือเครื่องมือไม่ใช่ลูกเล่น. ลูปช่วยขยายวิธีการ จุดสำคัญคือต้องกำหนดว่ามีอะไรซ้ำ อะไรเปลี่ยน และเมื่อใดจะหยุด

Abstraction เปิดทางให้ reuse. ถ้าขั้นตอนหนึ่งทำงานได้ครั้งหนึ่ง มันควรเรียกใช้ได้อีกด้วยอินพุตต่างกัน นั่นคือเมล็ดพันธุ์ของฟังก์ชัน โมดูล และไลบรารี

สิ่งที่เห็นได้ในเครื่องมือสมัยใหม่

ถ้าคุณเคยใช้เวิร์กโฟลว์แบบ “สร้างโดยการอธิบาย”: เขียนข้อกำหนด วนแผน แล้วออกโค้ด คุณได้ทำซ้ำจิตวิญญาณของ Notes ของ Lovelace: ทำให้ขั้นตอนชัดเจน เก็บ state ให้ชัด และอธิบายข้อสมมติให้การรันทำซ้ำได้

นั่นคือเหตุผลที่แพลตฟอร์ม vibe-coding อย่าง Koder.ai เข้ากับเรื่องนี้เป็นอย่างดี Koder.ai ให้คุณสร้างเว็บ แบ็กเอนด์ และแอปมือถือผ่านอินเทอร์เฟซแชท แต่หลักการเดียวกันใช้ได้: ผลลัพธ์ดีกว่าเมื่อคุณระบุ inputs/outputs ตั้งชื่อให้สอดคล้อง และขอรูปแบบเป็นขั้นตอน (โหมดการวางแผนช่วยล็อก "Notes" ของคุณก่อนจะสร้างหรือเปลี่ยนโค้ด)

เช็คลิสต์ง่าย ๆ สำหรับโปรแกรมที่คุณออกแบบ

ใช้รอบตรวจสอบนี้ก่อนเริ่มโค้ด หรือเมื่อดีบักสิ่งที่รู้สึกว่ารกรุงรัง:\n\n1. เป้าหมาย: พูดให้ออกว่ารโปรแกรมให้ผลอะไรในหนึ่งประโยคหรือไม่?\n2. Inputs/outputs: เข้าอะไรออกอะไร รูปแบบเป็นอย่างไร?\n3. แยกย่อย: มี 3–7 ขั้นตอนหลักอะไรบ้าง? (ถ้ามากให้รวมกลุ่ม)\n4. ตั้งชื่อ: ค่าหลักคืออะไร ตั้งชื่อให้สม่ำเสมอ\n5. หาการทำซ้ำ: ขั้นตอนไหนทำซ้ำ อะไรเปลี่ยนในแต่ละครั้ง?\n6. เงื่อนไขหยุด: อะไรที่จบแต่ละลูปหรือกระบวนการ? หลีกเลี่ยงงานไม่สิ้นสุดอย่างไร?\n7. บล็อกที่ใช้ซ้ำได้: ขั้นตอนไหนควรกลายเป็นฟังก์ชันนำกลับมาใช้ได้?\n8. อธิบาย: ผู้อ่านจะเข้าใจแผนจากคอมเมนต์หรือเอกสารโดยไม่ต้องรันโค้ดไหม?

อ่านต่อเพื่อฝึกฝนสไตล์ 'จดบันทึกก่อน'

ถ้าต้องการเสริมทักษะการออกแบบแบบ "จด Notes ก่อน" เหล่านี้จะช่วยได้:\n\n- /blog/how-to-write-better-requirements\n- /blog/pseudocode-examples

รวมกันแล้ว นิสัยเหล่านี้เปลี่ยนการเขียนโปรแกรมจาก "ทำให้มันทำงาน" เป็น "ทำให้มันเข้าใจได้"—การเปลี่ยนแปลงที่ Notes ของ Lovelace ชี้นำไว้ตั้งแต่ต้น

คำถามที่พบบ่อย

อัลกอริทึม 'ครั้งแรก' ของ Ada Lovelace ในคำเรียบง่ายคืออะไร?

Ada Lovelace’s “first algorithm” คือขั้นตอนทีละข้อ (ปรากฏใน Notes ของเธอ) ที่ตั้งใจให้ Charles Babbage’s Analytical Engine ดำเนินการ เป็นที่รู้จักเพราะมันถือว่าการคำนวณเป็น ลำดับของการดำเนินการที่วางแผนไว้บนค่าที่เก็บไว้ ซึ่งคล้ายกับการเขียนโปรแกรมสมัยใหม่ แม้ว่าเครื่องจะไม่ถูกสร้างขึ้นให้เสร็จในยุคนั้นก็ตาม

บทความนี้พยายามอธิบายอะไร (และไม่อธิบายอะไร)?

บทความนี้เน้นที่ แนวคิดด้านการเขียนโปรแกรม ในงานของ Lovelace—วิธีการแสดงขั้นตอนให้สามารถทำงานได้จริง ตรวจสอบได้ และเข้าใจได้—มากกว่าการพยายามสร้างเครื่อง Analytical Engine ใหม่หรือแก้ไขข้อถกเถียงทางประวัติศาสตร์ทุกประการ

Analytical Engine คืออะไร และทำไมมันถึงสำคัญต่อการเขียนโปรแกรม?

Analytical Engine เป็นเครื่องที่ถูกออกแบบให้เป็นเครื่องคำนวณแบบอเนกประสงค์ โดยมีความสามารถที่จะ:

  • เก็บตัวเลขไว้ (“the store” เหมือนหน่วยความจำ)
  • ดำเนินการคำนวณ (“the mill” เหมือน CPU)
  • รับคำสั่งและข้อมูลผ่านบัตรเจาะรู

สถาปัตยกรรมนี้สำคัญเพราะมันแยก ฮาร์ดแวร์ที่ลงมือปฏิบัติ ออกจาก โปรแกรมที่ระบุขั้นตอน—ความแยกเดียวกันนี้คือพื้นฐานของคอมพิวเตอร์สมัยใหม่

ทำไม Lovelace ถึงใช้ Bernoulli numbers เป็นตัวอย่าง?

Bernoulli numbers เป็นลำดับที่ปรากฏในสูตรทางคณิตศาสตร์หลายแห่ง เหมาะเป็นตัวอย่างเพราะแต่ละค่าขึ้นกับค่าก่อนหน้า ต้องการ การคำนวณหลายขั้นตอน, การเก็บผลลัพธ์ชั่วคราว, และ ขั้นตอนที่ทำซ้ำได้—สิ่งที่อยากทดสอบกับเครื่องที่ตั้งโปรแกรมได้

อะไรคือความสำคัญของตารางทีละขั้นตอนในงานของ Lovelace?

ตารางขั้นตอนบังคับให้ต้องระบุอย่างชัดเจน:

  • อะไรเกิดก่อน, อะไรเกิดหลัง
  • ค่ากลางแต่ละค่าเก็บที่ไหน
  • เมื่อใดที่ค่าถูกอัปเดตเทียบกับแค่เรียกใช้ซ้ำ
  • จุดเริ่มและสิ้นสุดของการทำซ้ำ

นั่นทำให้มันคล้ายกับ pseudocode สมัยใหม่และช่วยให้ผู้อื่น ‘รัน’ ขั้นตอนโดยไม่ต้องเดา

อัลกอริทึมของ Lovelace เกี่ยวข้องกับลูปและการทำซ้ำอย่างไร?

การทำซ้ำที่ Lovelace แสดงออกมาเป็นรูปแบบดั้งเดิมของ iteration: กำหนดชุดคำสั่งเล็ก ๆ, เปลี่ยนค่าในแต่ละครั้ง (เช่น เคาน์เตอร์หรือผลรวมบางส่วน), แล้วหยุดเมื่อเงื่อนไขเป็นจริง ในโค้ดสมัยใหม่จะเทียบได้กับ for/while โดยมี:

  • เคาน์เตอร์
  • สถานะที่เปลี่ยนไป
  • เงื่อนไขการหยุด
ทำไมตัวแปรและสัญกรณ์ถึงสำคัญในแนวทางของเธอ?

เพราะเครื่องไม่สามารถ ‘จดจำ’ บริบทแบบมนุษย์ได้ การมีป้ายชื่อสำหรับค่าต่าง ๆ (เหมือนตัวแปร) จะช่วยติดตาม:

  • ค่าที่กำลังถูกอัปเดต
  • ค่าที่ต้องคงไว้ใช้ในขั้นต่อไป
  • ค่าชั่วคราวที่สามารถเขียนทับได้

สิ่งนี้ลดความผิดพลาดที่มักเกิดจากการสับสนระหว่างค่าที่ดูคล้ายกัน

โพสต์หมายถึงอะไรเมื่อพูดถึง 'abstraction และ reuse' ใน Notes ของ Lovelace?

Abstraction แยก วิธีการ (algorithm) ออกจาก กลไก (การทำงานของเครื่อง) นั่นคือรากฐานของคอมโพเนนต์ที่นำกลับมาใช้ซ้ำได้:

  • ตั้งชื่อการดำเนินการครั้งหนึ่งครั้งเพื่อไม่ต้องอธิบายซ้ำ
  • รับค่าเข้าและให้ผลลัพธ์
  • ซ่อนรายละเอียดภายในจนกว่าจะต้องตรวจสอบ

ในโค้ดสมัยใหม่ นี่คือเหตุผลที่ฟังก์ชันและโมดูลช่วยให้ระบบขยายตัวได้

Ad a Lovelace เป็น 'โปรแกรมเมอร์คนแรก' จริงหรือเป็นตำนาน?

ป้าย ‘first programmer’ ถูกถกเถียงกันเพราะ:

  • Analytical Engine ไม่ได้ถูกสร้างให้เสร็จ ดังนั้นโปรแกรมจึงไม่สามารถรันยืนยันได้ในยุคนั้น
  • Lovelace อาจร่วมงานกับ Charles Babbage ในบางส่วน ทำให้ขอบเขตการเขียนไม่ชัดเจน
  • มีกระบวนการอัตโนมัติแบบก่อนหน้า (เช่น Jacquard loom) แม้จะไม่ใช่ในความหมายทั่วไปเหมือนเครื่องที่ตั้งโปรแกรมได้

ข้อสรุปที่ปลอดภัยคือ Notes ของเธอชัดเจนในการนิยามว่า การ ‘เขียนโปรแกรม’ คือการเขียนขั้นตอนที่ไม่มีความคลุมเครือให้เครื่องทำตามได้

ฉันจะใช้เช็คลิสต์จากบทความนี้ตอนออกแบบโปรแกรมได้อย่างไร?

ใช้การตรวจสอบแบบรวดเร็วก่อนเริ่มโค้ด:

  1. ระบุเป้าหมายเป็นประโยคเดียว
  2. กำหนด inputs/outputs และรูปแบบ
  3. แยกย่อยเป็น 3–7 ขั้นตอนหลัก
  4. ตั้งชื่อค่าต่าง ๆ ให้สอดคล้อง
  5. หาการทำซ้ำและสิ่งที่เปลี่ยนในแต่ละรอบ
  6. กำหนดเงื่อนไขการหยุด
  7. ดึงส่วนที่ใช้ซ้ำได้ออกเป็นบล็อก
  8. อธิบายให้ผู้อื่นเข้าใจได้โดยไม่ต้องรันโค้ด

สำหรับคู่มือที่เกี่ยวข้อง ดู /blog/how-to-write-better-requirements และ /blog/pseudocode-examples

สารบัญ
เรื่องนี้เกี่ยวกับอะไรแท้จริงAda Lovelace, Babbage, และ Analytical Engineมุมมองง่าย ๆ ของ Analytical EngineNotes ที่เปลี่ยนวิธีที่เราคิดเกี่ยวกับเครื่องอัลกอริทึม Bernoulli numbers อธิบายแบบง่ายการแยกย่อยและการควบคุมลำดับ: งานออกแบบที่ซ่อนอยู่ลูป การทำซ้ำ และแนวคิดการวนซ้ำตัวแปรและสัญกรณ์: ทำให้ไอเดียรันได้จริงAbstraction และ Reuse: จากตารางขั้นตอนสู่ฟังก์ชันเอกสารเป็นฟีเจอร์ ไม่ใช่สิ่งที่ทำทีหลังตำนาน ข้อถกเถียง และสิ่งที่เราพูดได้อย่างมั่นใจข้อสรุปเชิงปฏิบัติสำหรับการออกแบบโปรแกรมวันนี้คำถามที่พบบ่อย
แชร์
Koder.ai
Build your own app with Koder today!

The best way to understand the power of Koder is to see it for yourself.

Start FreeBook a Demo