16 คะแนน โดย GN⁺ 2024-05-21 | 5 ความคิดเห็น | แชร์ทาง WhatsApp
  • UNIX, Git, Emacs, Boost.Graph, Bazel
  • ในฐานะโปรแกรมเมอร์ เราต้องโต้ตอบกับเครื่องมือซอฟต์แวร์ทุกวัน แต่เครื่องมือส่วนใหญ่ก็มีไว้เพียงเพื่อให้ทำงานที่ต้องทำให้เสร็จเท่านั้น
  • บางครั้งก็พบซอฟต์แวร์ที่ก้าวข้ามความมีประโยชน์แบบเรียบง่าย กระตุ้นจินตนาการ เปิดความเป็นไปได้ใหม่ ๆ และมีอิทธิพลต่อวิธีที่เราออกแบบระบบ
  • เรียกซอฟต์แวร์แบบนี้ว่า ‘Enlightenmentware’
  • สำหรับโปรแกรมเมอร์ แหล่งที่มาของการตื่นรู้ที่พบบ่อยที่สุดคือภาษาการเขียนโปรแกรมที่ใช้งานอยู่ รวมถึงภาษาที่เรียนเป็นงานอดิเรกด้วย
  • ผู้เขียนได้รับความตื่นรู้มากมายจากการทำงานกับภาษาการเขียนโปรแกรมอย่าง MASM, C, Prolog และ Idris
  • เนื่องจากอิทธิพลของการเรียนภาษาที่มีต่อการขยายกรอบความคิดเป็นสิ่งที่รู้กันมานานแล้ว บทความนี้จึงจะไม่เน้นที่ภาษา แต่จะโฟกัสเฉพาะซอฟต์แวร์ที่ให้ความตื่นรู้เท่านั้น

UNIX

unix เป็นมิตรกับผู้ใช้—มันแค่เลือกคบเพื่อนเท่านั้น

ไม่ระบุชื่อ, "Art of unix Programming" โดย Eric S. Raymond

  • ในปี 2008 ระหว่างเรียนมหาวิทยาลัย ผู้เขียนเริ่มมองหางานแรกด้านโปรแกรมมิง
  • ประกาศรับสมัครงานส่วนใหญ่ต้องการความรู้เกี่ยวกับ UNIX และ socket
  • เนื่องจากในหลักสูตรมหาวิทยาลัยไม่มีวิชาเกี่ยวกับ unix หรือระบบปฏิบัติการ ผู้เขียนจึงตัดสินใจศึกษาด้วยตนเอง
  • ผู้เขียนเข้าสู่โลกของ unix ผ่านหนังสือ "The unix Operating System" ของ Andrey Robachevsky และคณะ
  • การติดตั้ง Mandriva Linux ทำให้ได้เริ่มสำรวจสภาพแวดล้อมแบบ unix
  • หลังจากนั้น unix ก็อยู่ร่วมในทุกช่วงของชีวิต
  • ซอฟต์แวร์ส่วนใหญ่ทำงานอยู่บนสภาพแวดล้อมแบบ unix และผู้เขียนก็ยังคงอ้างอิงหนังสือ "Advanced Programming in the unix Environment" อยู่เสมอ

Git

การยิงเท้าตัวเองด้วย git นั้นทำได้ง่าย แต่การย้อนกลับไปยังเท้าก่อนหน้าแล้วเย็บรวมกับขาปัจจุบัน (merge) ก็ทำได้ง่ายเช่นกัน

Jack William Bell

  • ต้นปี 2009 ผู้เขียนได้รู้จักระบบควบคุมเวอร์ชันเป็นครั้งแรกผ่าน Rational ClearCase
  • ClearCase สร้างความสับสนอย่างมาก และทำได้เพียงรองรับข้อกำหนดขั้นต่ำ
  • หลังจากนั้นได้เริ่มใช้ Subversion และเรียนรู้ผ่านหนังสือ "Version Control with Subversion"
  • Subversion เข้าใจง่ายและใช้งานง่าย แต่ไม่สะดวกสำหรับโปรเจกต์ส่วนตัว
  • จากนั้นจึงได้ค้นพบ Git
  • Git มีเส้นโค้งการเรียนรู้ที่ชันและทำให้งงได้มาก แต่เป็นความงงคนละแบบกับ ClearCase
  • Git ลดแรงเสียดทานของการใช้ระบบควบคุมเวอร์ชันลง จนทำให้เราสามารถเก็บทุกสิ่งที่มีคุณค่าไว้ภายใต้การควบคุมเวอร์ชันได้
  • การออกแบบของ Git น่าดึงดูดเพราะเป็นการผสมผสานอย่างงดงามระหว่างระบบกระจาย กราฟไม่วนซ้ำ และพื้นที่เก็บข้อมูลแบบอ้างอิงตามเนื้อหา
  • การเรียนรู้โครงสร้างภายในของ Git สนุกมาก จนทำให้ผู้เขียนเริ่มสนใจระบบควบคุมเวอร์ชันอื่น ๆ ด้วย
  • ข้อเสียหลักของ Git คือแนวทางแบบ snapshot-oriented ทำให้การทำความเข้าใจการ merge ยากขึ้น

Emacs

โปรแกรมแก้ไขข้อความใด ๆ ก็สามารถบันทึกไฟล์ได้ แต่มีเพียง Emacs เท่านั้นที่สามารถช่วยวิญญาณได้

Per Abrahamsen

  • ผู้เขียนแก้ไขโปรแกรมแรกในหน้าต่างสีน้ำเงินที่คุ้นเคยของ Turbo Pascal 7.0
  • ในมหาวิทยาลัยได้เรียนการเขียนโปรแกรมด้วย Pascal และหลังจากนั้นก็ใช้ C++ กับ Java
  • ในงานแรกด้านโปรแกรมมิง ผู้เขียนใช้ NEdit แต่ก็เริ่มสนใจ Vim และ Emacs
  • Vim ท้าทายแต่ก็สนุก คล้ายกับการเล่นเครื่องดนตรี
  • Emacs เป็นเครื่องจักร Lisp ที่มอบความสามารถด้านการแก้ไขข้อความและการจัดการหน้าต่าง
  • โครงสร้างภายในของ Emacs สะอาด เป็นระเบียบ และมีเอกสารกำกับอย่างดี
  • การขยายความสามารถด้วย Emacs Lisp นั้นง่ายกว่าตัวแก้ไขอื่นมาก

Boost.Graph

ผมมีอคติอย่างมากต่อกระแสนิยมเรื่องโค้ดที่นำกลับมาใช้ซ้ำได้ ผมคิดว่า "โค้ดที่แก้ไขซ้ำได้" ดีกว่ากล่องดำหรือ toolkit มาก

Donald Knuth, สัมภาษณ์กับ Andrew Binstock

  • ในคืนส่งท้ายปีเก่า 2013 ผู้เขียนได้อ่าน Boost Graph Library
  • ไลบรารีอัลกอริทึมส่วนใหญ่อาศัยตัวแทนข้อมูลแบบเฉพาะ ทำให้ผสานเข้ากับโปรเจกต์เดิมได้ยาก
  • ไลบรารี Boost.Graph แก้ปัญหานี้ด้วยการใช้ generic programming
  • แม้ผู้เขียนจะไม่เคยใช้ไลบรารีนี้จริง ๆ แต่การออกแบบของมันช่วยให้เข้าใจการออกแบบ STL และ generic programming ลึกซึ้งยิ่งขึ้น

Bazel

ถ้า make ไม่ทำงานตามที่คุณคาดไว้ มีโอกาสสูงว่า makefile จะเป็นฝ่ายผิด

Adam de Boor, "PMake—A Tutorial"

  • ในปี 2009 ผู้เขียนเขียน Makefile แรกสำหรับโปรเจกต์วิจัย
  • ความซับซ้อนของ make ทำให้ผู้เขียนโหยหาเครื่องมือที่ดีกว่า
  • ผู้เขียนลองระบบ build หลายแบบ แต่ก็ยังไม่พอใจทั้งหมด
  • ในปี 2016 ผู้เขียนเข้าทำงานที่ Google และได้ใช้ blaze
  • Bazel คือชิ้นส่วนสุดท้ายของปริศนาระบบ build
  • Bazel รวดเร็ว แม่นยำ ใช้งานง่าย และไม่ผูกติดกับภาษาใดภาษาหนึ่ง

บทสรุป

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

ความเห็นของ GN⁺

  • ความสำคัญของ UNIX: UNIX เป็นระบบปฏิบัติการพื้นฐานในสภาพแวดล้อมการเขียนโปรแกรมจำนวนมาก และจำเป็นต่อการเข้าใจพื้นฐานของ system programming
  • เส้นโค้งการเรียนรู้ของ Git: Git อาจยากในช่วงแรก แต่เป็นเครื่องมือสำคัญด้านการควบคุมเวอร์ชัน โดยเฉพาะในสภาพแวดล้อมแบบกระจายและการทำงานร่วมกัน
  • ความยืดหยุ่นของ Emacs: Emacs ให้ความสามารถมากกว่าการเป็น text editor และเหมาะอย่างยิ่งสำหรับผู้ที่สนใจ Lisp programming
  • generic programming ของ Boost.Graph: Boost.Graph เป็นตัวอย่างอันทรงพลังของ generic programming ที่ช่วยให้เรียนรู้วิธีนำอัลกอริทึมซับซ้อนไปใช้อย่างมีประสิทธิภาพ
  • ประสิทธิภาพของ Bazel: Bazel เป็นเครื่องมือที่ช่วยเพิ่มประสิทธิภาพของระบบ build ในโปรเจกต์ขนาดใหญ่ได้อย่างมาก และมีประโยชน์อย่างยิ่งในองค์กรขนาดใหญ่อย่าง Google

5 ความคิดเห็น

 
zihado 2024-05-23

บน Windows คงหนีไม่พ้น everything ล่ะมั้ง 555

 
bus710 2024-05-23

Magit ดีขนาดไหนกันถึงได้มีชื่ออยู่ในกลุ่มซอฟต์แวร์ระดับมาสเตอร์พีซแบบนี้? ผมไม่ได้ใช้ Emacs เลยไม่รู้จริง ๆ
ใน Nvim เขาว่า Neogit ได้รับอิทธิพลมาจาก Magit งั้นคงต้องลองใช้อันนั้นดูสักหน่อย...

 
bbulbum 2024-05-23

ขอแนะนำ lazygit ด้วยครับ 555

 
bus710 2024-05-23

ขอบคุณครับ
สุดสัปดาห์นี้ผมคงต้องติดตั้ง superfile กับ lazygit แล้วลองเล่นดูสักหน่อย

 
GN⁺ 2024-05-21
ความเห็นบน Hacker News

สรุปรวมคอมเมนต์จาก Hacker News

  • Compiler Explorer:

    • Compiler Explorer เปลี่ยนแปลงการถกเถียงเกี่ยวกับคอมไพเลอร์และการปรับแต่งประสิทธิภาพไปอย่างมาก
    • ส่งผลเชิงบวกต่อคุณภาพของการสนทนาในฟอรัม
    • สามารถตรวจสอบข้ออ้างแรง ๆ ได้อย่างรวดเร็วผ่านลิงก์
    • เครื่องมืออย่าง llvm-mca และ uiCA ก็มีประโยชน์เช่นกัน
  • ความคิดเห็นเกี่ยวกับการใช้ Windows:

    • นำเสนอมุมมองที่สมดุลต่อ Windows
    • Windows สาย NT เป็นระบบปฏิบัติการที่ยอดเยี่ยม
    • ติดตั้ง Windows ไว้สำหรับเล่นเกม
  • Docker:

    • Docker ช่วยประหยัดเวลาได้มากตลอดช่วงอาชีพงานที่ปรึกษา
    • ทำให้สามารถรันโปรเจ็กต์เก่า ๆ ได้อย่างรวดเร็ว
    • ไม่จำเป็นต้องติดตั้งเซิร์ฟเวอร์ฐานข้อมูลหลายตัวอีกต่อไป
    • ทำให้สภาพแวดล้อม Python สามารถทำซ้ำได้และรันแบบขนานได้
  • Spring Framework:

    • Spring Framework กลายเป็นอุปสรรคต่อการทำความเข้าใจแนวคิดเรื่องการฉีดพึ่งพา
    • ทำให้นักพัฒนา Java จำนวนมากคิดว่าจำเป็นต้องมีเฟรมเวิร์กที่ซับซ้อน
    • ตัว Spring เองมีประโยชน์ แต่ก็อาจทำให้ซอฟต์แวร์ซับซ้อนขึ้นและพกพาได้น้อยลง
  • Nix:

    • สามารถทำงานที่ซับซ้อนได้มากมายด้วย Nix และ Nixpkgs
    • ทำสิ่งอย่างการ build แบบ static ของไบนารี Rust ได้ง่าย
    • มีตัวเลือกการ build ที่หลากหลายและความสามารถด้านแคช
    • Nix มีประโยชน์มาก แต่ควรเข้าหา NixOS อย่างระมัดระวัง
  • Emacs:

    • Emacs เปลี่ยนงานแก้บั๊กให้กลายเป็นการฝึกทักษะทางเทคนิค
    • ทำให้งานที่น่าเบื่อกลายเป็นเรื่องสนุก
  • แนวคิด 'Round':

    • แนวคิด 'Round' มอบพื้นที่ของอินเทอร์เฟซให้มากที่สุดด้วยปริมาตรแกนหลักที่น้อยที่สุด
    • แกนหลักของ Emacs และ Git เล็กและเรียบง่าย แต่ทรงพลัง
  • Magit:

    • Magit เป็นตัวอย่างเชิงตำราของความเรียบง่าย ประสิทธิผล และการค้นพบได้ง่าย
    • ช่วยเปิดเผยความสามารถของ Git ได้ดีขึ้น
    • ไม่ได้นำศัพท์เฉพาะและเวิร์กโฟลว์ของตัวเองเข้ามา
  • การเปรียบเทียบ SVN กับ Git:

    • ประสบการณ์การใช้ SVN เป็นไปในทางลบอย่างมาก
    • Git มีความเป็นธรรมชาติและเข้าใจง่ายกว่ามาก
    • เวิร์กโฟลว์ดีขึ้นเมื่อใช้ Git
  • ประสบการณ์การใช้ Linux, Emacs, Bazel, Magit:

    • ทำงานโดยใช้ Emacs และ Bazel บน Linux
    • ค้นหาบล็อก บันทึกงานใน Emacs และเขียน commit message โดยใช้ Magit
    • push ไปยัง Git repository