ทำไม Clojure จึงยังไม่มี web framework หลัก

ทำไมต้องต่อต้าน one big framework ล่ะเนี่ย เวลาที่เปิด lib อื่นๆ แล้วมันมี interface ที่คุ้นเคยไม่ชอบกันเรอะ!?!!

เป็นคำถามของออฟ ขณะที่เรากำลังคุยกันเรื่อง Rails และโค้ดภาษา JavaScript ที่เราเจอๆ กันมาทาง twitter

ต่อไปนี้คือคำตอบของผมครับ

เพราะคนสร้างภาษาเค้าเสนอแนวคิดว่าเราควรทำความเข้าใจคำว่า simple กับ easy กันใหม่ และ one big framework ที่มีอยู่ในปัจจุบันมันตกอยู่ในกลุ่ม easy แต่ complect อะ https://www.infoq.com/presentations/Simple-Made-Easy

เค้าบอกว่า easy เกิดจากความคุ้นเคยซึ่งมัน relative กับพื้นฐานของแต่ละคนว่าเคยรู้อะไรมา แต่ simple คือสิ่งที่ทุกคนจะทำความเข้าใจได้ง่ายเหมือนๆ กัน (simple ในความหมายของเค้าคือแต่ละชิ้นเล็กๆแยกออกจากกันเด็ดขาดได้ นำกลับมารวมได้)

เค้าแนะนำให้เริ่มจากพยายามทำให้ software มัน simple ก่อนแล้วค่อย easy มาตามหลัง แต่ตอนนี้ใน clojure community ยังไม่มีใครทำได้อะ framework ที่ทั้ง simple และ easy ก็เลยไม่มี framework ที่ชนะ ทุกคนอาศัยความ simple ของ library ประกอบของกันขึ้นมาเองหมด

จากนั้นเราก็คุยกันต่ออีกนิดหน่อยว่า

ออฟ​: แต่เวลาที่เราสร้างอะไรซักอย่าง เราต้องการ abstraction ที่สูงพอนะ ไม่งั้นสร้างบ้านนี่ต้องไปเรียนรู้ตั้งแต่อะตอมเหล็กแล้วมาทำเหล็กเส้นอีก เราน่าจะต้องรู้ว่า “เอา components มาทำงานร่วมกันได้ยังไง” แต่ถ้าพูดถึง performance tuning อันนี้เห็นด้วยว่า simple ดีกว่าจริงๆ

ผม: อื้ม ถ้าใน Clojure abstraction ที่ทุกคนคุยกัน คือ data อะ ทุกไลบราลี (ยุคหลังๆ) จะมี api เป็น data หมด มันจะรับ input เป็น data (built-in datatype เช่น map,vector,list,set) แล้วก็ return output ออกมาเป็น data เหมือนกัน คราวนี้เราก็เอาไปประกอบกันได้ค่อนข้างง่ายอะ data manipulation

ออฟ: JS มันก็ simple นะ แต่มันไม่มีทางคาดเดาได้เลยว่า lib ตัวนี้มันจะมี inteface คล้ายกับที่เราเคยใช้รึเปล่า บางอันเน้นFP บางอันมาเป็นModule ต้องมานั่งลุ้นกันเป็นตัวๆ ไป

ผม: ใช่เลย Clojure มี data เป็น interface เหมือนๆ กันหมดอะ (clojure anti class/type ด้วย) เลยทำความเข้าใจได้ง่าย ฝั่ง JS ที่ถึงบางไลบราลีมี interface เป็น data แต่ถ้ามัน mutable มันก็จะเกิด abstraction leak อีก แต่ Clojure มันมี immutable data structure by default เลยไม่เกิดปัญหานั้น

จบบทสนทนาเพียงเท่านี้

ใครที่สงสัยว่า data เป็น api ได้อย่างไร ต่อไปนี้คือตัวอย่างบางส่วนครับ

Routing library:

["/api"
 ["/math" {:get {:parameters {:query {:x int?, :y int?}}
                 :responses {200 {:body {:total pos-int?}}}
                 :handler (fn [{{{:keys [x y]} :query} :parameters}]
                            {:status 200
                             :body {:total (+ x y)}})}}]]

HTML rendering:

[:div
 [:h3 "I am a component!"]
  [:p.someclass
   "I have " [:strong "bold"]
   [:span {:style {:color "red"}} " and red"]
   " text."]]

Datomic (database) query:

[:find ?year .
 :in $ ?name
 :where [?artist :artist/name ?name]
        [?artist :artist/startYear ?year]]
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s