เหตุใดการออกแบบ Go จึงไม่ดีสำหรับโปรแกรมเมอร์อัจฉริยะ
ในช่วงหลายเดือนที่ผ่านมา ฉันใช้ Go เพื่อนำไปใช้งาน Proof of Concept (ประมาณ: รหัสเพื่อทดสอบการทำงานของไอเดีย) ในเวลาว่าง ส่วนหนึ่งเพื่อศึกษาภาษาการเขียนโปรแกรมนั่นเอง ตัวโปรแกรมเองนั้นเรียบง่ายมากและไม่ใช่จุดประสงค์ของบทความนี้ แต่ประสบการณ์การใช้งาน Go นั้นสมควรที่จะพูดอะไรสักสองสามคำเกี่ยวกับมัน ไปสัญญาว่าจะเป็น (ประมาณ: บทความที่เขียนในปี 2015) ภาษายอดนิยมสำหรับโค้ดที่ปรับขนาดได้อย่างจริงจัง ภาษานี้สร้างขึ้นโดย Google ซึ่งมีการใช้งานอย่างแข็งขัน สรุปแล้ว ฉันคิดว่าการออกแบบภาษา Go นั้นไม่ดีสำหรับโปรแกรมเมอร์ที่ชาญฉลาด
ออกแบบมาสำหรับโปรแกรมเมอร์ที่อ่อนแอใช่ไหม?
Go นั้นง่ายต่อการเรียนรู้ ง่ายมากจนฉันต้องใช้เวลาแนะนำตัวในเย็นวันหนึ่ง หลังจากนั้นฉันก็สามารถเขียนโค้ดได้อย่างมีประสิทธิผลแล้ว หนังสือที่ผมเคยเรียนโกะมีชื่อว่า ความรู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรมใน Go (การแปล) มีจำหน่ายทางออนไลน์ หนังสือก็เหมือนกับซอร์สโค้ด Go ตรงที่อ่านง่าย มีตัวอย่างโค้ดที่ดี และมีประมาณ 150 หน้าที่สามารถอ่านได้ในคราวเดียว ความเรียบง่ายนี้ทำให้รู้สึกสดชื่นในช่วงแรก โดยเฉพาะอย่างยิ่งในโลกการเขียนโปรแกรมที่เต็มไปด้วยเทคโนโลยีที่ซับซ้อนมากเกินไป แต่ท้ายที่สุดแล้ว ไม่ช้าก็เร็ว ความคิดก็เกิดขึ้น: “เป็นเช่นนั้นจริงหรือ?”
Google อ้างว่าความเรียบง่ายของ Go คือจุดขาย และภาษาได้รับการออกแบบมาเพื่อประสิทธิภาพสูงสุดในทีมขนาดใหญ่ แต่ฉันสงสัย มีคุณสมบัติที่ขาดหายไปหรือมีรายละเอียดมากเกินไป และทั้งหมดเป็นเพราะขาดความไว้วางใจในตัวนักพัฒนาโดยมีข้อสันนิษฐานว่าพวกเขาไม่สามารถทำอะไรถูกต้องได้ ความปรารถนาในความเรียบง่ายนี้เป็นการตัดสินใจอย่างมีสติของนักออกแบบภาษา และเพื่อที่จะเข้าใจอย่างถ่องแท้ว่าทำไมจึงจำเป็น เราต้องเข้าใจแรงจูงใจของนักพัฒนาและสิ่งที่พวกเขาพยายามทำให้สำเร็จใน Go
เขาน่าจะคุ้นเคยประมาณพูดคล้ายกับซี โปรแกรมเมอร์ที่ทำงานที่ Google เริ่มต้นอาชีพตั้งแต่เนิ่นๆ และส่วนใหญ่คุ้นเคยกับภาษาขั้นตอน โดยเฉพาะตระกูล C ข้อกำหนดสำหรับประสิทธิภาพการทำงานที่รวดเร็วในภาษาการเขียนโปรแกรมใหม่หมายความว่าภาษาไม่ควรรุนแรงเกินไป
อะไร โดยพื้นฐานแล้ว Rob Pike กำลังบอกว่านักพัฒนาซอฟต์แวร์ของ Google ไม่ค่อยดีนัก นั่นคือเหตุผลที่พวกเขาสร้างภาษาสำหรับคนโง่ (ประมาณ: ใบ้ลง) เพื่อให้พวกเขาสามารถทำอะไรบางอย่างได้ เพื่อนร่วมงานของคุณดูหยิ่งแบบไหน? ฉันเชื่อมาโดยตลอดว่านักพัฒนาซอฟต์แวร์ของ Google ได้รับการคัดเลือกจากผู้ที่ฉลาดที่สุดและดีที่สุดในโลก แน่นอนว่าพวกเขาสามารถรับมือกับสิ่งที่ยากกว่านี้ได้ใช่ไหม?
แล้วตอนนี้ใครน่าอ่านกว่ากัน? ฉันจะลงคะแนนให้ D. รหัสของเขาอ่านง่ายขึ้นมากเนื่องจากเขาอธิบายการกระทำได้ชัดเจนยิ่งขึ้น D ใช้แนวคิดที่ซับซ้อนมากขึ้น (ประมาณ: การเรียกใช้ฟังก์ชันทางเลือก и รูปแบบ) มากกว่าในตัวอย่าง Go แต่ไม่มีอะไรซับซ้อนจริงๆ เกี่ยวกับการทำความเข้าใจมัน
นรกแห่งการคัดลอก
คำแนะนำยอดนิยมสำหรับการปรับปรุง Go คือเรื่องทั่วไป อย่างน้อยก็จะช่วยหลีกเลี่ยงการคัดลอกโค้ดโดยไม่จำเป็นเพื่อรองรับข้อมูลทุกประเภท ตัวอย่างเช่น ฟังก์ชันสำหรับการรวมรายการจำนวนเต็มสามารถนำไปใช้ในลักษณะอื่นไม่ได้นอกจากการคัดลอกและวางฟังก์ชันพื้นฐานสำหรับจำนวนเต็มแต่ละประเภท ไม่มีทางอื่น:
package main
import "fmt"
func int64Sum(list []int64) (uint64) {
var result int64 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func int32Sum(list []int32) (uint64) {
var result int32 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func int16Sum(list []int16) (uint64) {
var result int16 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func int8Sum(list []int8) (uint64) {
var result int8 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func main() {
list8 := []int8 {1, 2, 3, 4, 5}
list16 := []int16{1, 2, 3, 4, 5}
list32 := []int32{1, 2, 3, 4, 5}
list64 := []int64{1, 2, 3, 4, 5}
fmt.Println(int8Sum(list8))
fmt.Println(int16Sum(list16))
fmt.Println(int32Sum(list32))
fmt.Println(int64Sum(list64))
}