Microservices และ Agile manifesto

​ถ้าทีมงานพัฒนาซอฟแวร์ที่มีสถาปัตยกรรมแบบ Microservices แล้วก็หมายความว่า ทีมนั้นได้เดินตามหลักการทั้ง 12 และมีค่านิยมทั้ง 4 แห่งเอจไจล์ ไปโดยอัตโนมัติเป็นที่เรียบร้อยแล้ว… ไม่ต้องแนะนำอะไรเพิ่มเติมอีกต่อไป

  • #:P –

C#.NET Yield Return

สวัสดีครับ

ขอเขียนบล็อคแบบสั้นๆอธิบายเรื่อง yield return ซึ่งเป็นฟีเจอร์หนึ่ง ในภาษา C#

บ่อยครั้ง เราต้องทำงานกับ collection โดยการ loop เข้าไปใน collection หนึ่ง ตัวอย่าง collection ที่เป็นผลจาก function นี้


public static List GenOdd(int max)
{
     var results = new List();
     foreach (var n in Enumerable.Range(1, max))
    {
        if(n % 3 == 0) results.Add(n);
    }
    return results;
}

ตัวอย่าง ตอนใช้งาน ผมต้องการหยุด หรือ เมื่อเงื่อนไขสำเร็จ ตัวอย่างนี้ผมให้หยุด loop ที่ item == 11


static void Main(string[] args)
{

    foreach (var item in FindOddYield(1000000))
    {
        if (item == 11) break;
    }
}

ซึ่ง code อาจจะไม่เห็นว่า ผม loop[ ไปเท่าไร ผมก็เลยลองเพิ่มตัวแปร Spy เพื่อนับครั้งใน function FindOdd เพื่อจะได้รู้ว่ามัน loop ไปกี่ครั้ง code จะเปลี่ยนไปเล็กน้อย แบบนี้


int SpyCallCount = 0;
public List GenOdd(int max)
{
    var results = new List();
    foreach (var n in Enumerable.Range(1, max))
    {
        ++SpyCallCount;
        if(n % 3 == 0) results.Add(n);
    }
    return results;
}

ทีนี้ลอง ใช้งานดูครับ แต่ให้แสดง SpyCallCount ออกมาด้วย

static void Main(string[] args)
{
    foreach (var item in FindOddYield(1000000))
    {
        if (item == 11) break;

        Console.WriteLine(SpyCallCount); // print 1000000
    }
}

จะเห็นว่า SpyCallCount เท่ากับ 100000 ซึ่งเราต้องการหยุดที่ item เท่ากับ 11 เท่านั้น แต่ function ของเราไม่หยุดทำงาน

เรามาทำให้ function แบบนี้ดีขึ้นดีกว่า โดยการใช้ฟีเจอร์ yield return กลับไป แก้ไข function GenOdd แบบนี้

int SpyCallCount = 0;
public IEnumerable GenOdd(int max)
{
    foreach (var n in Enumerable.Range(1, max))
    {
        ++SpyCallCount;
        if(n % 3 == 0) yield return n;
    }
}

ทีนี้กลับไปลองใช้ใหม่ คุณจะเห็นผลลัพธ์ SpyCallCount เท่ากับ 11 แสดงให้เห็นว่า loop ลดลงเยอะเลยใช่มั้ยครับ นั่นคือลดการใช้ CPU time ลงไปตามงานที่เราต้องการ ไม่วนเล่นสูญเปล่าไปเฉยๆ

ก็ขอแชร์ไว้แค่นี้ ไปลองประยุกต์ใช้ yield return กันดู แนะนำมีประโยชน์ครับ

ขอบคุณครับ

#:P

#iterator-patterns, #yield-return

อธิบาย จิต-รูป แบบนักคอมพิวเตอร์

สวัสดีครับ

วันนี้ก็มาเพิ่มเติมการ อธิบาย นาม-รูป หรือ จิต-รูป ในแบบนัก Computer บล็อค ที่แล้ว อธิบายในแบบนักคณิตศาสตร์ ซึ่งแบบนักคณิตศาสตร์นั้น จะเป็นเชิงสัญลักษ์ ชนิดข้อมูลตัวเลข ที่สามารถวัดค่าได้

แต่ในแบบนักคอมพิวเตอร์ เขาจะมองแบบการทำงานร่วมกันขององค์ประกอบต่างๆที่รวมตัวกันจนเกิดผลลัพธ์ออกมานั่นโดยข้อมูลนั้น สามารถคำนวน วัดค่าได้ ก็จะกลับมอธิบายได้ในแบบคณิตศาสตร์นั่นเองครับ

สรุปก็คือ นักคณิตศาสตร์ จะมองโลก แบบตัวเลขที่คำนวนค่าได้จาก สิ่งต่างๆ แล้วส่งผลต่อกัน ผ่านสมการ ที่ประกอบด้วยตัวดำเนินการ, ค่าคงที่ และตัวแปลที่เป็นตัวเลข สามารถคำนวนได้

แต่นักคอมพิวเตอร์ จะมองโลกแบบมีโครงสร้างลำดับขั้นตอนการทำงาน (process หรือ task) ร่วมกันของสิ่งต่างๆ แล้วแสดงออกมาเป็นผลลัพธ์ (Output) พอส่วนต่างๆรับมาจะเป็น (Input) แล้วมีการทำงาน ออกมาเป็นผลลัพธ์อีกแบบนี้ ต่อเนื่องไป

กำหนดให้ a คือ ส่วนการทำงานของ จิต, b คือ ส่วนการทำงาน ของ รูป และ เส้นเชื่อมแสดงถึง การรับส่งข้อมูล ระหว่างองค์ประกอบต่างๆ ดังรูป

อธิบายเพิ่มเติม เมื่อเปรียบเทียบกับ รูป-จิต ของเราแล้ว จะได้ว่า

  • จิต คือ คำสั่ง ประกอบด้วย เวทนา, สัญญา, สังขาร และ วิญญาณ
  • รูป คือ ร่างกาย ประกอบด้วย สมอง, กระดูก, เลือด, เนื้อ และ อวัยวะทุกส่วนที่ประกอบกันขึ้นเป็นสิ่งมีชีวิต

ถ้าเทียบกับ Computer จิต ก็คือ Code และ รูป ก็คือ Hardware และ Operation System (OS)
ส่วนที่สำคัญที่ประกอบเป็นรูป หรือ Computer ที่สมบูรณ์ ทำงานได้ ก็คือ OS
ซึ่ง OS จะทำหน้าที่เปลี่ยนคำสั่งที่เป็น Code ไปเป็นสิ่งที่เรียกว่างาน (task) แล้วแจกจ่ายไปยังส่วนต่างๆให้ประมวลผลงานได้นั่นก็คือ Hardware หรือ รูปกายส่วนต่างๆ ที่เรามีอยู่นั่นเอง

ตัว OS เป็น รูป มันจะอยู่หลังจาก จิต สร้าง Code แล้วมันจะเปลี่ยนเป็น task แล้วส่งต่อไปยัง รูปกาย ให้ประมวลผลออกมาเป็นการ แสดงออก, คิดปลุงแต่ง หรือ ทำงาน แสดงพฤติกรรม ต่างๆ ทั้งรู้ตัว และไม่รู้ตัว
ทำให้ ร่างกาย เราอยู่ได้ อย่างเช่น หายใจ มันเกิดเสมอ ทั้งๆที่ในเวลานอน หรือทำการงานอื่นๆ จิตเราไม่รู้สึกตัว ไม่ได้สร้าง Code เอง ให้หายใจ แต่มันเกิดได้เองอัตโนมัติ
นั่นแสดงว่า ตัว OS มันฝังอยู่ในรูปของเรา ตั้งแต่เกิดแล้ว และมันสร้าง Code เพื่อสั่งงานตัวมันได้เอง ให้อยู่รอดได้โดยอัตโนมัติ

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

แล้ว จิต สร้าง Code ได้อย่างไร จิต นั้นเกิดจากการทำงานกันของ เวทนา, สัญญา, สังขาร และ วิญญาณ ร่วมกัน หลังจากนั้น รูป จะแปลง Code เป็นงาน (task) แล้วส่งงานผ่านเส้นประสาททำให้ อวัยวะในร่างกาย ส่วนต่างๆทำงานตามที่ จิต ต้องการ

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

พอกายเราเติบโตขึ้นมีสัญญาเพิ่มขึ้น และมีความรู้ธรรมของพระพุทธเจ้า พอเราฝึกปฏิบัติธรรม ตามแนวทางของพระพุทธเจ้า มากขึ้น เราก็จะพัฒนาธรรมของเรา และสามารถแยกจิต กับ รูปออกมาได้ อย่างชัดเจนขึ้น ชัดเจนขึ้น เข้าใจมากยิ่งๆขึ้น ตามลำดับไป

a และ b ก็จะทำมุม 90′ และแยกอิสระกันออกไปเป็น นิพพาน

หวังว่าบล็อคนี้จะเป็นประโยชน์ ก็ขอให้สนุกกับการปฏิบัติ พัฒนาธรรมมะในตัวเราครับ

#:P

 

อธิบาย จิต-รูป แบบนักคณิตศาสตร์

สวัสดีครับ

วันนี้ก็มาแชร์ ความรู้ความเข้าใจหน่อย และ บันทึกไว้ เริ่มเลยละกัน

ผม กำหนดให้ a = รูป (ร่างกาย), b = จิต (เวทนา, สัญญา, สังขาร และ วิญญาณ)

สภาวะแรก ซึ่งทำให้เราเกิดมาบนโลกใดๆ ที่สิ่งมีชีวิตอาศัยอยู่ได้ นั่นคือ a และ b จะยึดติดกัน ดังภาพนี้

 

ถ้า c คือ ความยาวระหว่าง ปลาย a กับ b ดูจากรูปก็จะเท่ากับ 0

พอเรา ค่อยๆเติบโต รู้จักพระพุทธเจ้า และมีความรู้ทางธรรม ฝึกปฏิบัติเนื่องๆ เราก็จะค่อยๆแยก รูป และ จิต ออกจากกันได้ แสดงดังรูปนี้

ระยะ c จะเท่ากับ (ผมขอแสดงเป็นภาษา python) math.sqrt( a ** 2 + b ** 2 – 2 * a * b * math.cos(t))

มุม t แสดงถึง องศาระหว่า a และ b ก็คือ รูป กับ จิต จะเห็นว่า จิต (b)นั้น โน้มเอียง มาเข้ากับ รูป (a) เสมอ และในสภาวะที่รูป (a) เรา แตกดับไป หรือเราเสียกายไปแล้ว ก็คือ ตาย องศาที่ ไม่อิสระนี้ จะโน้มมายัง กายใหม่ แล้วเกิดมาเป็นสิ่งมีชีวิตอีก มีกายอีก ไม่โลกนี้ ก็โลกอื่น แล้วแต่จิตจะพาไป ความรู้สึกที่เรียกว่าจิต (b) นี้ก็ยังมารู้สึกอีก บน กายใหม่…

ในขณะที่เรามี a และ b ครบ คือเราเกิดมาแล้ว ถ้าเราปฏิบัติอย่างถูกต้อง ต่อเนื่อง ตามแนวทางของพระพุทธเจ้า องศา นี้จะพัฒนามากขึ้น มากขึ้น จนตั้งฉาก ทำมุม 90 องศา กับ รูป บนโลกที่เราเกิดมาตอนอ่านอยู่นี้ ซึ่ง แสดง ได้ดังภาพ

ดังนั้น c จะเท่ากับ math.sqrt( a ** 2 + b ** 2 ) หรือ t เท่ากับ 90′

เราจะเห็นว่า จิต (b) ได้ แยกออกเป็นอิสระ จาก รูป (a) จึงเรียกว่ามันเป็นอิสระ (independent) กัน ระหว่างจิต กับ กายหยาบของเรา และมันจะวิ่งไปไม่ ลงต่ำมา ประสานกับ รูป แล้วลงมาเกิดอีก นั่นก็คือสิ่งที่ พระพุทธเจ้า ทรงค้นพบ และเรียก สภาวะนี้ว่า นิพพาน นั่นเอง

เวปแนะนำปฏิบัติธรรม: พระอาจารย์สุชาติ อภิชาโต

หวังว่าจะเป็นประโยชน์ ก็ขอให้สนุกกับการปฏิบัติ เพื่อพัฒนาธรรมของคุณครับ

#:P

#%e0%b8%99%e0%b8%b4%e0%b8%9e%e0%b8%9e%e0%b8%b2%e0%b8%99, #%e0%b8%9e%e0%b8%b8%e0%b8%97%e0%b8%98%e0%b8%98%e0%b8%a3%e0%b8%a3%e0%b8%a1

Business Model-Driven Development (BM-DD)

จากความรู้ และประสบการณ์ของผมเอง ก็ได้วางกรอบหน้าที่ความรับผิดชอบที่จำเป็นสำหรับการพัฒนาโปรดักส์ ออกเป็น 3 ส่วนหลักเรียกว่า Business Model-Driven Development (BM-DD)

การพัฒนาโปรดักส์ด้วยกระบวนการ BM-DD จะประกอบไปด้วยความรู้ ความเข้าใจ และขั้นตอนวิธีการทำงาน จำแนกอยู่ใน 3 พื้นที่หลัก ได้แก่  Business Model, Design และ Architecture

Business Model คือ โมเดลที่ประกอบไปด้วยสิ่งจำเป็นที่เพียงพอสำหรับทำให้เกิดธุรกิจให้ชีวิตอยู่ได้ คือ มีรายได้ มากกว่ารายจ่าย ให้พอเลี้ยงโมเดลให้อยู่ได้ยาวนาน หรือมีความยั่งยืน และไม่ผิดกฏหมาย นั่นคือการประกอบธุรกิจ จึงเรียกว่า โมเดลธุรกิจ

Design คือ สิ่งที่มีคุณลักษณะที่ให้คุณค่า หรือประโยชน์ ที่ออกมาจากโมเดลธุรกิจ สิ่งนั้นก็คือ สินค้า และ บริการ

Architecture คือ วิธีการทำงาน, กระบวนการ, หลักการ, แนวคิด, การบริหารจัดการ, กลยุทธ์, เทคนิคเครื่องมือ, ทรัพยากรณ์ ต่างๆ ที่ทำงานร่วมกัน ประกอบกันขึ้น ทำให้ Design และ Business Model นั้น เกิดขึ้นจริงได้

Business Model แบ่งได้สองประเภท คือ เกิดขึ้นใหม่ (Startup) และ เกิดขึ้นแล้ว (Corporation)

Design แบ่งได้เป็น สินค้าที่จับต้องได้, สินค้าที่จับต้องไม่ได้ และ ผสมกันคือเป็นทั้งสองแบบ

Architecture แบ่งเป็น Front-end และ Back-end

Business Model ไม่ว่าจะแบบใด สามารถแยกกกอเป็นกรอบหน้าที่ ได้เป็น 9 องค์ประกอบ (จาก Business Model Canvas) ได้แก่ 1-Customer, 2-Value Proposition, 3-Marketing Channel, 4-Delivery Channel, 5-Revenue Stream, 6-Activities, 7-Resources, 8-Partner และ 9-Cost Structure

Design จะเป็นหลักการออกแบบโปรดักส์ โดยจะเรียกประโยชน์ที่ได้จากโปรดักส์ว่า ฟีเจอร์ ซึ่งฟีเจอร์นั้น จะต้องตอบโจทย์ หรือ สามารถแก้ปัญหาจากองค์ประกอบ 2-Value Proposition เป็นหลัก แต่องค์ประกอบอื่นๆใน  Business Model ก็ออกแบบให้ช่วยเหลือ สนับสนุนได้เช่นกัน เพื่อความอยู่รอดของ BM

Architecture ประกอบด้วย Front-end ก็คือ Interface ที่ Customer กับตัว Design มาทำงานร่วมกัน แล้วเกิดคุณค่าตามต้องการใน Value Proposition ส่วนนี้ก็จะเรียก User Experience ตัว Interface มีทั้งเป็นวัตถุ หรือ ซอฟแวร์เสมือน ก็แล้วแต่ Design แต่หลักสำคัญคือ Customer ต้องได้คุณค่าครบตามต้องการใน Value Proposition ที่กล่าวไว้ ส่วน Back-end คือส่วนที่จะทำให้ Front-end เกิดขึ้นจริง ประกอบด้วย Host, Data Center, Network, Software, Source Code, Server Tools เช่น Continues Integration/Delivery และอื่นๆ ที่ประกอบกันทำให้ Front-end เกิดขึ้น

BM-DD นี้ก็เป็นกรอบ (Framework) สำหรับพัฒนาโปรดักส์ เหมือน Scrum คือไม่กำหนดเทคนิค หรือเครื่องมือเฉพาะ ตายตัวเข้าไป เพียงแก่แบ่งกรอบของงาน หรือหน้าที่ไว้เป็น 3 ส่วนก็คือ BM, Design และ Architecture

ซึ่งในส่วนของ Development  จะอยู่ในกรอบของ Architecture สามารถนำเอา Scrum เข้ามาใช้ได้เลย

คือจาก BM และ Design จะทำให้เราสามารถสร้าง product backlog ได้ จากนั้น ก็ดำเนินการ Sprint นั่นก็คือการทำงานในส่วนของ Architecture ในกรอบการทำงานแบบ BM-DD นั่นเองครับ

มุมมอง BM-DD แบบจุลภาค (MicroBM-DD) 

มุมมอง BM-DD แบบมหภาค (MacroBM-DD) 

ข้อมูลอ้างอิง

Business Model:

Design:

Architecture:

 

คิดแบบไฮบริด

ถ้าสิ่งใดๆสามารถกำหนดได้สมบูรณ์ เราสามารถระบุเลยว่ามีความน่าจะเป็นที่จะเกิดขึ้น 100% เรียกว่า วิธีคิดแบบนักคณิตศาสตร์

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

แต่ ถ้าสิ่งใดที่เราไม่ระบุความน่าจะเป็นเลย เพราะไม่รู้ ขี้เกียจ จะรู้ไปทำไมฟะ เปล่าประโยชน์ เสียเวลา ช้า แบบนี้เรียกว่า วิธีคิดแบบศิลปิน หรือ แบบฮิปส์ๆ

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

#:P

การออกแบบโมเดลเก็บข้อมูลธุรกรรมการค้าเหมือนนักบัญชี

สวัสดีครับผม

ก็พอมีเวลาว่างมาเขียนแชร์กันอีก จริงๆอยากเขียนความรู้นี้มานานแล้ว แต่ไปสนใจเรื่องอื่นก่อน เพราะผมคิดว่า ความรู้เรื่องหลักการบันทึกบัญชีนี้ สำคัญมากต่อการออกแบบ Data(Domain) Models หรือ โครงสร้างข้อมูลสำหรับเก็บธุรกรรมที่เกิดจากกิจกรรมต่างๆที่เกิดขึ้นในโมเดลธุรกิจทุกชนิดเลยทีเดียว

การบัญชี คือ การจัดการส่วนของกระบวนการจดบันทึกรายการค้า (Entry)

การบัญชีมีสิ่งที่ต้องจัดการ ได้แก่ วิธีการบันทึกรายการค้า, การจัดหมวดหมู่รายการค้า, การสรุปรายงานรายการค้า และการวิเคราะห์รายการค้า

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

ผมจะขออธิบายสมการบัญชีก่อน เพราะ สำคัญต่อการออกแบบ Data Model เพื่อเก็บบันทึกรายการค้าแบบระบบคู่ ต่อไป

สมการบัญชี หรือที่เรียกว่า สมการงบดุล (The balance sheet equation) เป็น สมการหลักสำหรับบันทึกรายการค้าที่เรียกว่า ระบบบันทึกรายการค้าแบบคู่ คือ แต่ละธุรกรรมการค้า จะถูกบันทึก สองด้านคือ debit และ credit โดยที่ debit เท่ากับ credit เสมอ สมการบัญชี เขียนแบบนี้ครับ

สินทรัพย์ (Assets) = หนี้สิน (Liabilities) + ส่วนของเจ้าของ (Owner’s/Stockholder’s Equity, Capital)

Owner’s Equity = Contributed Capital + Retained Earnings

Retained Earnings = Net Income – Dividends

และ

 Net Income = Income − Expenses

Capital ในทางเศรษฐศาสตร์ คือ สินค้าที่แท้จริง ไม่ใช่ เงิน หรือ หุ้น หรือ สินทรัพย์ทางการเงินต่างๆ เช่น สินค้า (Goods) และ สิทธิการได้รับบริการ (Eligibility Services) ที่มีประโยชน์ส่งเสริมการผลิต หรือบริการในโมเดลธุรกิจ คือถ้าเป็นเงิน ก็ต้องเปลี่ยนให้เป็น สินค้า หรือบริการก่อน ก็จะเป็น Capital

Contributed Capital คือ ทรัพย์สินที่สนับสนุนธุรกรรมทางการค้า

Retained Earnings คือ ส่วนรายได้ที่สำรองไว้

Dividends คือ ส่วนที่กันไว้ปันผล

Net Income คือ รายได้ ลบ รายจ่าย ที่เกิดขึ้น จากการค้า

ในหลักการบันทึกบัญชี เขาจะบันทึกโดยเปลี่ยนเป็นหน่วยเงินตรา สกุลเดียวกันทั้งหมดก่อนบันทึกเสมอ

ตัวอย่าง การบันทึกรายการค้าแบบง่าย

หมายเลขธุรกรรม สินทรัพย์ หนี้สิน ส่วนของเจ้าของ รายการค้า
1 +1000 +1000 เจ้าของกิจการ ซื้อหุ้นด้วยเงินสด 1000 บาท
2 +200 +200 ซื้อสินทรัพย์ ด้วยการกู้ยืมเงิน 200 บาท
3 -500 -500 ขายสินทรัพย์ 500 บาท ได้เงินสด แล้วจ่ายหนี้
4 +1000 +600 +400 ซื้อสินทรัพย์ ด้วยทุนส่วนตัว 400 และ กู้ยืม 600
5 +300 +300 รับเงินจากธุรกิจ 300
6 -200 -200 จ่ายค่าเช่าทุก 200
7 +400 -400 มีการจ่าย แต่บันทึกรายการจ่ายไว้ก่อน
8 -500 -500 จ่ายหนี้ด้วยทุกตัวเอง

ต่อไปนี้ เป็นการใช้ การบันทึกโดยใช้ระบบธุรกรรมคู่ ที่มีประจุเป็น debit และ credit จะไม่ใช้สัญลักษณ์ +, –

#1 เจ้าของกิจการ ซื้อหุ้นด้วยเงินสด 1000 บาท

หุ้น เป็นสินทรัพย์ ชนิดหนึ่ง

เงินสด ก็เป็น สินทรัพย์ ชนิดหนึ่ง เหมือนกัน

เนื่องจาก ธุรกรรมการค้านี้ ไม่มี บัญชี เงินสด จึงบันทึกใน บัญชีทุนส่วนของเจ้าของไว้ ดังนั้น จะบันทึกบัญชี แบบนี้

Debit บัญชีหุ้น 1000 บาท

Credit บัญชีส่วนของเจ้าของ 1000 บาท

จะเห็นว่า การบันทึกรายการค้าครั้งนี้ ถูกต้อง เพราะ บัญชีหุ้น = บัญชีส่วนของเจ้าของ หรือ Debit เท่ากับ Credit

รายการค้า Debit Credit
#1 เจ้าของกิจการ ซื้อหุ้นด้วยเงินสด 1000 บาท
บัญชีหุ้น 1000
บัญชีส่วนของเจ้าของ 1000

ถ้ากรณี ส่วนของเจ้าของ มีบัญชีเงินสด อยู่แล้ว เกิดจาก รายการเปิดบัญชี (Opening Entry) เราจะต้องบันทึกรายการค้า ตามจริงแบบนี้

รายการค้า Debit Credit
#1 เจ้าของกิจการ ซื้อหุ้นด้วยเงินสด 1000 บาท
บัญชีเงินสด 1000
บัญชีส่วนของเจ้าของ 1000
บัญชีหุ้น 1000
บัญชีเงินสด 1000

นำรายการมาบันทึก แยกประเภทบัญชี ได้แบบนี้

Code 101: บัญชีเงินสด

Debit Credit
เจ้าของนำเงินสดมาลงทุน 1000
ซื้อหุ้น 1000

Code 111: บัญชีหุ้น

Debit Credit
ซื้อหุ้น 1000

Code 301: บัญชีส่วนของเจ้าของ

Debit Credit
นำเงินสดมาลงทุน 1000

เมื่อนำ บัญชีแยกประเภทมาหาดุล โดยเอา ด้าน Debit ลบ Credit แล้วถ้ามีค่าเป็น + ให้เป็นดุลด้าน Debit และ ถ้าเป็น – ให้ไว้ดุลด้าน Credit เราจะได้

บัญชีเงินสด เท่ากับ 0

บัญชีหุ้น เท่ากับ +1000  และ

บัญชีส่วนของเจ้าของ เท่ากับ -1000

ซึ่งจะเห็นว่า Debit เท่ากับ Credit การบันทึกบัญชีนี้ จึงถูกต้อง

เมื่อนำแนวคิดการบันทึกแบบนักบัญชีมาออกแบบ Data Model สำหรับ ใช้เก็บข้อมูลลงฐานข้อมูล ก็จะได้ออกมาแบบนี้ครับ (ดูภาพ Accounting Data Model)

Entry (#ID, Amount, Currency, EntryType, BookedDate, Description)

Account (#ID, Code, AccountType, EffectiveFrom, EffectiveTo)

AccountingTransaction(#EntryID, #AccountID, TransactionCode)

 

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

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
IV-1 1 101 Assets 1 1000 Debit เจ้าของนำเงินสดมาลงทุน
IV-1 1 101 Assets 2 1000 Credit ซื้อหุ้น
IV-1 2 102 Assets 3 1000 Debit ซื้อหุ้น
IV-1 3 301 Equity 4 1000 Credit นำเงินสดมาลงทุน

โดย เราสามารถกำหนดกฏตรวจสอบ การบันทึกรายการค้า ด้วยเงื่อนไงนี้

[ Sum of Debit (Amount) = Sum of Credit (Amount) ]

ตัวอย่าง 2: ธุรกิจซื้อสินค้ามาเพื่อขาย จำนวน 10 ชิ้น รวมเป็นเงินทั้งหมด 10000 บาท โดยกู้เงินมาซื้อ

ตัวอย่างนี้ กระทบ บัญชีหนี้ (201) และ บัญชีสินค้าคงเหลือ (121)

Code 121: บัญชีสินค้าคงเหลือ

Debit Credit
ซื้อสินค้า 10 ชิ้น 10000

Code 201: บัญชีเจ้าหนี้

Debit Credit
กู้ยืมซื้อสินค้า 10000

เมื่อเก็บลง Data Model จะได้แบบนี้

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
IV-2 4 121 Assets 5 10000 Debit ซื้อสินค้า 10 ชิ้น
IV-2 5 201 Liabilities 6 10000 Credit กู้ยืมซื้อสินค้า


ตัวอย่างที่ 3:
จากตัวอย่างที่ 2 มีการขายสินค้า จำนวน 2 ชิ้น

ได้ เป็นเงินสด โดยที่ตั้งขายไว้ ชิ้นละ 1500 บาท บัญชีที่กระทบ มีดังนี้ บัญชีรายรับ (311), บัญชีเงินสด (101), บัญชีต้นทุนสินค้า (321), บัญชีสินค้าคงเหลือ (121)

Code 101: บัญชีเงินสด

Debit Credit
ขายสินค้า 2 ชิ้น 3000

Code 311: บัญชีรายรับ

Debit Credit
ขายสินค้า 2 ชิ้น 3000

Code 321: บัญชีต้นทุนสินค้า/บริการ

Debit Credit
ขายสินค้า 2 ชิ้น 2000

Code 121: บัญชีสินค้าคงเหลือ

Debit Credit
ขายสินค้า 2 ชิ้น 2000

ข้อมูลเก็บลง Data Model จะมีลักษณะแบบนี้

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
REV-1 1 101 Assets 7 3000 Debit เงินสดรับ
REV-1 6 311 Equity 8 3000 Credit ขายสินค้าได้ 2 ชิ้น
REV-1 7 321 Equity 9 2000 Debit ต้นทุนสินค้า 2 ชิ้น
REV-1 4 121 Assets 10 2000 Credit ต้นทุนสินค้า 2 ชิ้น

ตัวอย่างที่ 4: ลูกค้าซื้อสินค้า 3 ชิ้น ราคา 4500 บาท มีค่าขนส่งอีก 100 บาท ผ่านออนไลย์ ชำระผ่านบัตรเครดิต

บัญชีที่กระทบ บัญชีรายรับ (311), บัญชีลูกหนี้ (111), บัญชีต้นทุนสินค้า (321), บัญชีสินค้าคงเหลือ (121), บัญชีเจ้าหนี้ (201)

Code 111: บัญชีลูกหนี้

Debit Credit
ขายสินค้า 3 ชิ้น บวก ค่าขนส่ง 4600

Code 311: บัญชีรายรับ

Debit Credit
ขายสินค้า 3 ชิ้น 4500
ค่าขนส่ง 100

Code 321: บัญชีต้นทุนสินค้า

Debit Credit
ขายสินค้า 3 ชิ้น 3000
ค่าขนส่ง 100

Code 121: บัญชีสินค้าคงเหลือ

Debit Credit
ขายสินค้า 3 ชิ้น 3000

Code 201: บัญชีเจ้าหนี้

Debit Credit
ค่าขนส่ง 100

ข้อมูลเก็บลง Data Model จะมีลักษณะแบบนี้

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
REV-2 1 111 Assets 11 4600 Debit ขายสินค้า 3 ชิ้น บวก ค่าขนส่ง
REV-2 6 311 Equity 12 4500 Credit ขายสินค้า 3 ชิ้น
REV-2 6 311 Equity 13 100 Credit ค่าขนส่ง
REV-2 7 321 Equity 14 3000 Debit ขายสินค้า 3 ชิ้น
REV-2 7 321 Equity 15 100 Debit ค่าขนส่ง
REV-2 4 121 Assets 16 3000 Credit ขายสินค้า 3 ชิ้น
REV-2 5 201 Equity 17 100 Credit ค่าขนส่ง

มีธุรกรรมขายสินค้ามา พอสมควรแล้ว ลองสร้างรายงานจาก Data Model ของเราดูครับ ข้างล่างนี้เป็นตัวอย่าง สรุปรายงานขาย

มูลค่าขายรวม: 7600 บาท

ต้นทุนขายรวม: 5100 บาท

กำไรสุัทธิ: 2500 บาท

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

ตัวอย่าง 5: ลูกค้านำเงินสดมาฝาก 100000 บาท

บัญชีที่กระทบ  บัญชีเงินสด (101),  บัญชีเจ้าหนี้ (201)

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
DEP-1 1 101 Assets 18 100000 Debit ฝากเงิน
DEP-1 5 201 Liabilities 19 100000 Credit ฝากเงิน

ตัวอย่าง 6: ธนาคารปล่อยกู้ให้ลูกค้าจำนวน 100000 บาท โอนเงินเข้าบัญชีลูกค้า

บัญชีที่กระทบ  บัญชีลูกหนี้ (111), บัญชีเจ้าหนี้ (201)

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
LON-1 8 111 Assets 20 100000 Debit กู้เงิน
LON-1 5 201 Liabilities 21 100000 Credit โอนเงินเข้าบัญชี

ตัวอย่าง 7: ธนาคารจ่ายดอกเบี้ยเงินฝากประจำเดือน 1 จำนวน 1000 บาท ตัดผ่านระบบ

บัญชีที่กระทบ บัญชีต้นทุนสินค้า/บริการ (321), บัญชีเจ้าหนี้ (201)

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
INT-1 7 321 Equity 22 1000 Debit ดอกเบี้ยเงินฝาก
INT-1 5 201 Liabilities 23 1000 Credit ดอกเบี้ยเงินฝาก

ตัวอย่าง 8: ธนาคารรับชำระเงินจากลูกค้าเงินกู้งวดที่ 1 คิดเป็นเงินต้น 8000 บาท และดอกเบี้ย 2000 บาท ด้วยเงินสด

บัญชีที่กระทบ บัญชีเงินสด (101), บัญชีลูกหนี้ (111), บัญชีรายรับ (311), บัญชีต้นทุนสินค้า/บริการ (321)

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
RELON-1 1 101 Assets 24 10000 Debit ชำระเงินกู้งวด 1
RELON-1 6 311 Equity 25 8000 Credit เงินต้น
RELON-1 6 311 Equity 26 2000 Credit ดอกเบี้ย
RELON-1 7 321 Equity 27 8000 Debit หักยอดลูกหนี้
RELON-1 8 111 Assets 28 8000 Credit หักยอดลูกหนี้

อธิบาย: รายการค้าที่ 24 รับชำระมาเป็นเงินสด 10000 จึง Debit บัญชีเงินสด โดย แยกรับเป็น เงินต้น 8000 และ ดอกเบี้ย 2000 ดังนั้นจึงต้อง Credit ที่ บัญชีรายรับ ของรายการค้าที่ 25, 26 ส่วนรายการค้าที่ 27 และ 28 เป็นปรับลดยอดลูกหนี้ อีก 8000 สำหรับลูกค้าคนนี้

แถมให้อีกโมเดลก็แล้วกัน ตัวอย่างต่อไปนี้เป็น ธุรกรรมการค้าของโมเดลธุรกิจประกันภัย

ตัวอย่าง 9: ลูกค้ามาซื้อกรมธรรม์ประกันภัย จ่ายเบี้ยมูลค่า 1000 บาท ด้วยเงินสด คุ้มครองทุกเรื่องเป็นระยะเวลา 1 เดือน ด้วยทุนเอาประกันจำกัดไว้ที่ 100000 บาท

บัญชีที่กระทบ บัญชีเงินสด (101), บัญชีรายรับ (311), บัญชีสินค้า/บริการ คงเหลือ (121), บัญชีเจ้าหนี้ (201)

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
SPOLI-1 1 101 Assets 29 1000 Debit ขายกรมธรรม์ประกันภัย
SPOLI -1 6 311 Equity 30 1000 Credit ขายกรมธรรม์ประกันภัย
SPOLI -1 4 121 Assets 31 100000 Debit กรมธรรม์ประกันภัย
SPOLI -1 5 201 Liabilities 32 100000 Credit ทุนเอาประกัน

อธิบาย: รายการค้าที่ 29 รับเงินสดเข้ามา จึง Debit บัญชีเงินสด ไป 1000 เนื่องจากเป็นรายการขาย เป็นรายรับ จึงต้อง Credit บัญชีรายรับด้วย อีก 1000 สำหรับรายการค้าที่ 31, 32 เป็นการสร้างสิทธ์ ซึ่งเป็นสัญญากรมธรรม์ประกันภัย ว่าจะคุ้มครอง (Coverage) ด้วยเหตุใดๆแล้วแต่ตกลง ด้วยทุนเอาประกัน หรือ สามารถเรียกร้องค่าเสียหายได้สูงสุด ไม่เกิน 100000 ในระยะเวลา 1 เดือน สำหรับตัวข้อมูลระยะเวาลนี้ จะเก็บไว้ใน Data Model สำหรับ กรมธรรม์ประกันภัย (Policy) จะไม่แสดงให้ดู

ตัวอย่าง 10: ลูกค้าเรียกร้องค่าสินไหมทดแทน (Claim) ด้วยค่าเสียหาย 500 บาท จ่ายเงินสด

บัญชีที่กระทบ บัญชีต้นทุนสินค้า/บริการ (321), บัญชีเงินสด (101), บัญชีสินค้า/บริการ คงเหลือ (121), บัญชีเจ้าหนี้ (201)

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
CLM-1 7 321 Equity 33 500 Debit เรียกร้องค่าสินไหมทดแทน
CLM-1 1 101 Assets 34 500 Credit เรียกร้องค่าสินไหมทดแทน
CLM-1 5 201 Liabilities 35 500 Debit คุ้มครอง
CLM-1 4 121 Assets 36 500 Credit คุ้มครอง

ตัวอย่าง 11: กรมธรรม์ประกันภัยหมดเวลาคุ้มครอง ใช้ทุนไป 500 เหลือทุนเอาประกันที่หมดเวลา 99500

บัญชีที่กระทบ บัญชีสินค้า/บริการ คงเหลือ (121), บัญชีเจ้าหนี้ (201)

TransactionCode Account ID Code AccountType EntryID Amount EntryType Description
EPOLI-1 7 321 Equity 37 99500 Debit สิ้นสุดความคุ้มครอง
EPOLI-1 1 101 Assets 38 99500 Credit สิ้นสุดความคุ้มครอง

Code แสดงไว้ที่นี่ครับ SourceCode

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

อ่านเพิ่มเติม

“Think like Accountant, Do like Programmer”

ขอบคุณครับ

#:P

#accounting, #data-model, #ddd, #domain-model