Review Nand2Tetris (Part 1) คอร์สที่คน IT ควรจะเรียนสักครั้งในชีวิต

Review Nand2Tetris (Part 1) คอร์สที่คน IT ควรจะเรียนสักครั้งในชีวิต

ตั้งแต่จำความได้แล้วบอกที่บ้านว่าโตขึ้นจะเป็น Programmer เขียนโปรแกรม​ ฯลฯ จะต้องเจอคำพูดประมาณว่า อ่อคอมพิวเตอร์มันก็มีแค่ 0 กับ 1 เท่านั้นแหละ พอโตขึ้นมาอีกหน่อยตอนอยู่มัธยมก็เริ่มรู้จักตรรกศาสตร์​ซึ่งเป็นพื้นฐานของ Boolean Algebra แล้วก็พอรู้ว่า อ่อเดี๋ยวไปเขียนโปรแกรมน่าจะได้ใช้เยอะ (ตอนนั้นยังไม่รู้จัก Demorgan's law) พอเข้ามหาลัยหน่อยได้เรียนวิชา Digital ก็รู้สึกว่าใกล้ละเริ่มเห็น OP AMP เห็น Microcontroller, Microprocessor แล้วก็ข้ามไปวิชา OS เลย ทิ้งช่องว่างระหว่าง Hardware กับ Software ไว้ในใจโยธินมาเป็นระยะเวลาหลายปี

จนกระทั่งปีนี้เรียกว่าจับพลัดจับพลูมารู้จักคอร์ส nand2tetris จากพี่อรรถ จากบทสนทนาตอนเย็นในที่ทำงานที่คุยกันไปเรื่อยในหัวข้อการเขียนโปรแกรม ประกอบกับในช่วงนี้ของชีวิตรู้สึกโหยหาอะไรที่มัน Fundamental, Foundation, Theoretical มากเลยตั้งปณิธานไว้ว่า สงกรานต์นี้เราจะเรียนคอร์สนี้

ต้องเกริ่นก่อนว่าคอร์ส Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) นี่เป็นหนึ่งในคอร์สระดับตำนานของ Coursera เลยครับ ที่มีคนเรียนมากกว่าแสนคน และได้รับคะแนนรีวิวถึง 4.9 คะแนนเต็ม 5 โดยคนสอนเป็น Professor จาก the Hebrew University of Jerusalem สองคนคืออาจารย์ Shimon Schocken และอาจารย์ Noam Nisan ครับ โดยใช้เวลา 6 สัปดาห์ในการสร้าง Hack Computer ขึ้นมา ตั้งแต่ระดับเบสิกที่สุดคือ NAND gate ไปจนถึงมีสถาปัตยกรรมคอมพิวเตอร์จริงๆ

ผมจำได้แม่นเลยว่าชั่วโมงแรกๆ ที่เรียนผมยังไม่อินมากเพราะ Logic Gate เป็นอะไรที่เคยเรียนมาแล้วตอนมหาลัย แต่ความสนุกของคลาสนี้มันอยู่ที่ Assignment ครับที่ถูกออกแบบมาดีมากๆ โดยเราเริ่มจาก NAND gate ซึ่งเป็น Logic gate พื้นฐานที่สุด แล้วค่อยๆ ประกอบร่างมันขึ้นมาเป็น And, Or, Xor, Mux, DMux เริ่มขยาย input จาก 2 เป็น 4, 8 และ 16 จนถึงจุด Mux4Way16 นี่คือมัน Challenge จริงๆ จนต้องนอนหนึ่งคืนก่อนจะคิดออกในเช้าวันต่อมาว่า อ่อมันน่าจะประมาณนี้

สิ่งที่ต้องชมอีกอย่างนอกจาก Assignment คือ Tooling และ Course Material ซึ่งเตรียมมาดีมากโดยเฉพาะ Hardware Simulator ที่ทำให้เราเขียนโปรแกรมจำลอง hardware ขึ้นมาเรื่อยๆ เพราะนี่มัน Computer Science เราแค่ Design Hardware ผ่าน HDL ก็พอส่วนการประกอบวงจรจริงๆ ฯลฯ เป็นปัญหาของ Electrical Engineering ไป

Screen Shot 2564-04-15 at 09.52.29.png

นอกจากนั้นในแต่ละ Assignment จะมี Test program ที่เราสามารถรันผ่าน Hardware simulator ต่างๆ ได้ซึ่งไม่ได้มีแค่ test file เดียวแต่จะไล่ระดับ ทำให้เรารู้ว่าพลาดตรงไหนใน Implementation ของเราด้วย ทำให้การทำโจทย์แต่ละสัปดาห์เป็น Test Driven Development ที่แท้จริง

รูปแบบของการเรียนจะค่อยๆ ต่อยอดความรู้ของเราในแต่ละสัปดาห์ขึ้นมาเป็น Hardware abstraction ที่ซับซ้อนขึ้นเรื่อยๆ โดยในสัปดาห์ที่สองจะเอาพวก Logic Gate พื้นฐานที่เราสร้างกันมาประกอบร่างกันเป็น Adder, จนไปถึง ALU ซึ่งสนุกมาก เพราะการ compose ความรู้มาเป็น logic gate ที่ทำงานร่วมกันได้นี่ได้ใช้เทคนิคอย่าง Divide and conquer มาช่วยแก้ปัญหาเพราะ ALU มี input, output หลาย combination มาก แต่เราก็เริ่มจะเห็นภาพแล้วว่า อ่อ ถ้า input มันเข้ามาประมาณนี้ มันจะออกมาประมาณนี้แหละ เรียกว่าใกล้เคียงระดับการโปรแกรมมากขึ้นไปอีกขั้น

ในสัปดาห์ที่ 3 เราไปทำความรู้จักกับหน่วยความจำซึ่งนอกจากรู้ว่า RAM, ROM ต่างกันยังไง ผมไม่เคยรู้อะไรข้างในชิปดำๆ มาก่อนเลย ผมจำได้แม่นเลยว่าผมประทับใจความสวยงามของ Memory มาก ซึ่งเริ่มจากพื้นฐานง่ายๆ อย่าง Flip-Flop รวมร่างเป็น Register แล้วกลายเป็น Ram ที่ค่อยๆ ยก Abstraction รูปแบบเดิมๆ ขึ้นมาด้วยขนาดที่ใหญ่ขึ้นเรื่อยๆ จนมาถึง Program Counter

via GIPHY

ส่วนสัปดาห์ที่ 4 ค่อนข้างจะกระโดดข้ามการไต่ระดับเรามาไกลหน่อย เพื่อให้เราเห็นภาพของ Machine Language Programming ซึ่งส่วนตัวผมไม่เคยเขียน Assembly มาก่อนแล้วต้องมาจัดการ Memory Register แต่ละ address เอง แล้วมี operation ให้ใช้จำกัดจำเขี่ยมาก แต่ก็สามารถเขียนโปรแกรมมี Loop มีการ control pixel ในหน้าจอของ Hardware simulator ได้มันภูมิใจมากนะ

สัปดาห์ที่ 5 เป็นสัปดาห์ที่ใจฟูมากสำหรับผม เพราะว่านับตั้งแต่เริ่มประกอบ NAND gate มาในสัปดาห์แรกจนผ่านมาหนึ่งเดือน นี่เป็นสัปดาห์ที่เราจะประกอบทุกอย่างเข้าด้วยกันจริงๆ ซึ่งสำหรับผมตอนประกอบ Computer.hdl ท้ายสุดผมไม่ดีใจเท่าตอนประกอบ CPU.hdl ได้ ซึ่งเราได้เห็นจริงๆ ว่าสถาปัตยกรรมที่เราสร้างมันขึ้นมามันทำงานได้จริงๆ

Screen Shot 2564-05-16 at 22.00.58.png

ในสัปดาห์สุดท้ายของคอร์สพาเราไปรู้จักกับ Assembler ซึ่งเชื่อม Gap ระหว่างสัปดาห์ที่ 4 ที่เป็น Machine Language กับ Computer Architecture ในสัปดาห์ที่ 5 เข้าด้วยกัน โดยโจทย์ของสัปดาห์นี้คือให้สร้าง Assembler โดยใช้ภาษาอะไรก็ได้ที่เราถนัด มา compile Assembly program ให้กลายเป็น machine code 01 ที่ CPU เอาไปทำงานได้ ซึ่งผมสนุกมากและภูมิใจมากในวินาทีที่เรารันโปรแกรมเทสสุดท้ายผ่านจริงๆ

Screen Shot 2564-05-23 at 01.03.11.png

ต้องบอกว่าหลังเรียนคอร์สนี้จบ Gap ที่ผมไม่เคยเข้าใจว่า Computer ในระดับ Hardware มันทำงานยังไงได้รับการคำตอบจากคอร์สนี้จริงๆ ครับ และผมยินดีจะแนะนำต่อให้กับทุกคนที่ทำงานในสาย IT เลยว่าควรหาโอกาสมาเรียนคอร์สนี้ซักครั้ง เพราะมันดีมากจริงๆ

สุดท้ายครับ ผมอยากบอกว่านี่เพิ่งครึ่งทางของคอร์สนี้เท่านั้น เพราะคอร์สนี้จริงๆ มี 2 Part ครับ ซึ่งจริงๆ เราจะรู้ตั้งแต่วันแรกที่เรียนละ แต่ว่าพอดำไปเดือนนึง ผมลืมตรงนี้ไปเลย โดยคอร์ส Part 2 ที่ผมรู้คร่าวๆ คือจะเน้นไปทาง Software architecture ละตั้งแต่ VM, compiler ไปจนถึง OS เลย ซึ่งผมไม่พลาดที่จะเรียนต่อแน่ๆ เพราะมาได้ครึ่งทางละ และคงได้มีโอกาสมารีวิวอีกรอบครับถ้าจบแล้ว

ส่วนใครที่อ่านมาถึงตรงนี้แล้วคิดว่าผมยัง Convince ไม่พอผมแนะนำให้ดู TED Talk นี้ครับ เพราะอาจารย์ Shimon Schocken นี่เค้ามี Passion จริงๆ จนกว่าจะมาเป็นคอร์สนี้ได้คือสุดมาก ฟังแล้วจะมีไฟอยากเรียนรู้อะไรๆ เพิ่มขึ้นไปอีกเลยครับ 🔥🔥🔥🔥🔥

ปล. เป็นหนึ่งใน Cert ที่เรียนจบแล้วชอบมาก จบจริงๆ นะไม่ได้โม้

Screen Shot 2564-05-23 at 00.44.01.png