Sapir-Whorf แบบผกผันกับภาษาการเขียนโปรแกรม
(lukeplant.me.uk)- Inverse Sapir-Whorf มุ่งสนใจไม่ใช่ว่าภาษาทำให้คิดอะไรได้ยาก แต่คือมันทำให้ ไม่พูด อะไรได้ยาก และบังคับให้เปิดเผยข้อมูลแบบใด
- กาลปัจจุบันในภาษาอังกฤษ, สรรพนามแบ่งเพศ, คำนามแบ่งเพศในภาษาฝรั่งเศส, และอดีตกาล mış ของภาษาตุรกี ผลักให้ผู้พูดต้องบอกข้อมูลอย่างความชั่วคราว เพศ แหล่งที่มาของข้อมูล หรือความน่าเชื่อถือ
- ในภาษาการเขียนโปรแกรมเองก็มักบังคับให้โค้ดต้องรวมประเด็นที่นักพัฒนาอาจไม่ได้สนใจ เช่น ลำดับการคำนวณ, ความเป็น async, การจัดสรรและคืนหน่วยความจำ, สโคป, และชนิดข้อมูล
asyncใน Python หรือ Javascript, การจัดการหน่วยความจำใน C, lifetime ใน Rust, และการระบุชนิดข้อมูลในภาษาที่มี static type ต่างบังคับให้ต้องระบุทางเลือก ขณะที่ Haskell สามารถปล่อยบางทางเลือกให้ภาษาเป็นผู้ตัดสินได้ผ่าน non-strict semantics และการวิเคราะห์ strictness- ภาษาการเขียนโปรแกรมที่เข้าถึงง่ายกว่าอาจมี กำแพง Inverse Sapir-Whorf ที่ต่ำกว่า คือบังคับให้น้อยลงในการพูดถึงเรื่องที่ผู้ใช้ยังไม่เข้าใจหรือยังไม่มีความเห็น
ความหมายของ Inverse Sapir-Whorf
- สมมติฐาน Sapir-Whorf หากสรุปอย่างง่ายคือแนวคิดที่ว่าภาษาที่เราใช้ส่งผลต่อความคิด
- รูปแบบที่แรงของ Sapir-Whorf โดยเฉพาะ ภาษากำหนดความคิด ที่มองว่าภาษาควบคุมความคิด หรือจำเป็นต้องมีภาษาบางภาษาเพื่อจะคิดบางอย่าง ทุกวันนี้ไม่ได้รับการยอมรับอย่างจริงจังอย่างกว้างขวางในภาษาศาสตร์
- การที่ภาษาหนึ่งไม่มี tense ทางไวยากรณ์ ไม่ได้ทำให้สรุปได้ว่าผู้พูดภาษานั้นคิดเรื่องเวลาได้จำกัดกว่า เพราะยังมีวิธีอื่นในการแสดงเวลาเสมอ
- มีหลักฐานพอสมควรว่าภาษาพูดอาจส่งผลต่อการรับรู้ ทักษะ หรือท่าทีในบางด้าน แต่โดยทั่วไปพิสูจน์ผลกระทบโดยตรงขนาดใหญ่ได้ยาก
- Inverse Sapir-Whorf ไม่ได้มองว่าภาษาทำให้พูดหรือคิดอะไรได้ยาก แต่สนใจว่าภาษาทำให้ ไม่พูด อะไรได้ยากแค่ไหน
- ในมุมนี้ ประเด็นสำคัญคือภาษาผลักให้ต้องพูดข้อมูลบางอย่าง หรือทำให้หลีกเลี่ยงความคิดบางอย่างได้ยากเพียงใด
การบังคับที่ปรากฏในภาษาธรรมชาติ
-
ความชั่วคราวและความถาวรในกาลปัจจุบันของภาษาอังกฤษ
- “I’m living in London” และ “I live in London” ต่างก็หมายถึงอาศัยอยู่ในลอนดอน แต่ประโยคแรกเปิดเผยข้อมูลว่าสภาวะนั้นเป็น ชั่วคราว
- ผู้ที่ไม่ใช่เจ้าของภาษาอาจไม่สังเกตความต่างนี้ และแม้แต่เจ้าของภาษาเองก็อาจรับรู้เพียงในระดับไม่รู้ตัว
- ความหมายแบบ “ชั่วคราว” นี้อาจเกี่ยวข้องกับความชอบที่มีต่อลอนดอนมากกว่าระยะเวลาที่อาศัยอยู่จริง
- ในภาษาอังกฤษต้องเลือก tense และเพราะมักเลือกอย่างไม่รู้ตัว ภาษาจึงทำให้ต้องเปิดเผยข้อมูลอย่างระยะเวลาการอยู่อาศัยหรือความรู้สึก
-
สรรพนามและคำนามแบ่งเพศในภาษาอังกฤษ·ตุรกี·ฝรั่งเศส
- ในการพูดทั่วไปของภาษาอังกฤษ เมื่อกล่าวถึงบุคคลใดบุคคลหนึ่งก็มักต้องใช้ “he” หรือ “she”
- แม้จะมี “singular they” อยู่ แต่เมื่อพูดถึงบุคคลเฉพาะที่รู้หรือคาดเดาเพศได้ การใช้แบบนั้นมักไม่เป็นธรรมชาติมาก
- ภาษาตุรกีใช้เพียง “o” ตัวเดียวสำหรับ he/she/it และการไม่มีสรรพนามแบ่งเพศแบบนี้ก็ไม่ได้ขัดขวางการคิดหรือพูดเรื่องเพศของคน
- จุดนี้จึงสนับสนุน Sapir-Whorf แบบทั่วไปได้ยาก แต่ Inverse Sapir-Whorf เห็นได้ชัดตรงที่สรรพนามภาษาอังกฤษผลักให้ต้องบอกเพศไม่ว่าจะอยากหรือไม่ก็ตาม
- แม้ตอนพยายามเล่าถึงคนรู้จักแบบไม่เปิดเผยตัวตน หากเผลอใช้ “him” หรือ “her” ก็อาจเผยเพศและทำให้ระบุตัวได้ง่ายขึ้น
- ในภาษาฝรั่งเศส คำนามมีเพศ และเมื่อแปล “my friend” ต้องเลือกระหว่าง “mon ami” กับ “mon amie” หรือ “mon copain” กับ “ma copine” ทำให้ต้องเปิดเผยข้อมูล
- สรรพนามแสดงความเป็นเจ้าของก็มีการแบ่งเพศทั้งในอังกฤษและฝรั่งเศส แต่ his/her ของอังกฤษชี้เพศของเจ้าของ ขณะที่ son/sa ของฝรั่งเศสชี้เพศของสิ่งที่ถูกครอบครอง จึงเปิดเผยข้อมูลคนละแบบ
-
อดีตกาล “mış” ของภาษาตุรกี
- หากสรุปอย่างง่าย ภาษาตุรกีมีอดีตกาลหลักสองแบบ: แบบทั่วไปที่คล้าย simple past ของอังกฤษ และรูปแบบ “mış”
- รูป “mış” มีหน้าที่หลายอย่าง และเมื่อใช้เล่าเหตุการณ์ในอดีต มักสื่อว่าข้อมูลนั้น ได้ยินต่อมา หรือมีความน่าเชื่อถือต่ำกว่า
- เมื่อตอบคำถามว่า “Fred ไปทำงานวันจันทร์หรือไม่?” หากเห็นด้วยตนเองจะใช้รูปอดีตทั่วไป “geldi” แต่ถ้าได้ยินมา จะใช้ “gelmiş”
- ในภาษาอังกฤษสามารถเล่าโดยใช้เพียง simple past โดยไม่ระบุแหล่งที่มาหรือความน่าเชื่อถือของข้อมูล แต่ในภาษาตุรกีบางสถานการณ์บังคับให้รวมระดับความมั่นใจหรือการเห็นกับตาไว้ด้วย
- เพราะมีรูป “mış” อยู่แล้ว รูปอดีตทั่วไปจึงไม่ใช่ตัวเลือกที่เป็นกลาง และเมื่อไม่มีตัวเลือกใดเหมาะกว่าอีกตัว การใช้ก็จะฟังไม่เป็นธรรมชาติ
- เนื่องจากปัจจัยต่อท้าย “mış” ในภาษาตุรกีมักอยู่ท้ายคำสุดท้ายของประโยค จึงอาจเกิดนิสัยที่เมื่อพูดประโยคอังกฤษจบแล้วค่อยนึกออกว่ายังไม่ได้ใส่เครื่องหมายว่า “นี่เป็นข้อมูลที่ได้ยินมา ไม่ได้เห็นเอง” แล้วจึงอยากเติม “mış” ต่อท้าย
- ภาษาอังกฤษเองก็แสดงความหมายแบบเดียวกันได้ง่ายด้วยคำอย่าง “apparently” แต่ภาษาอังกฤษ ไม่ได้บังคับ ให้ระบุ ขณะที่ภาษาตุรกีบังคับมากพอสมควร
-
การบังคับของภาษาที่เจ้าของภาษามักมองไม่เห็น
- ความแตกต่างเหล่านี้มักสังเกตได้ยาก จนกว่าจะไปเรียนภาษาอื่นหรือพยายามสอนภาษาของตนให้ชาวต่างชาติ
- ในช่วงเวลาส่วนใหญ่ที่ต้องเลือกระหว่าง simple present กับ present continuous เราไม่ได้คิดอย่างมีสติว่าการเลือกนั้นสื่ออะไร
- เมื่อภาษาบังคับบางรูปแบบ มันไม่ได้ปรากฏเป็นการ “ใส่” บางอย่างเสมอไป แต่บางครั้งความหมายก็ถูกตรึงไว้ผ่าน การละไว้ ได้เช่นกัน
- “I love cake” หมายถึงเค้กโดยทั่วไป ส่วน “I love the cake” หมายถึงเค้กชิ้นหรือก้อนที่เฉพาะเจาะจง
- ในประโยคแรก การไม่มี “the” ทำให้ชัดว่าเป็นการพูดถึงเค้กโดยรวม และถ้าจะหมายถึงเค้กเฉพาะ ก็จำเป็นต้องใส่เครื่องหมายอย่าง “the” หรือ “this”
- ภาษาอื่นบางภาษาอาจไม่มีรูปที่สอดคล้องโดยตรงกับความแตกต่างนี้
Inverse Sapir-Whorf ในภาษาการเขียนโปรแกรม
- สำหรับภาษาการเขียนโปรแกรม Sapir-Whorf แบบทั่วไปอาจใช้ได้มากกว่า
- ในภาษาอย่าง Python หรือ Haskell การพูดเรื่องการจัดสรรหน่วยความจำทำได้ยาก แต่ไม่ถึงกับเป็นไปไม่ได้
- ข้อจำกัดของภาษาการเขียนโปรแกรมมักถูกอธิบายผ่านสิ่งที่แสดงออกได้ยากในภาษานั้น
- บทความ Sapir-Whorf does not apply to Programming Languages ของ Hillel Wayne พูดถึงประเด็นนี้อย่างละเอียดกว่า
- แต่ในมุมของ Inverse Sapir-Whorf ประเด็นสำคัญคือภาษาการเขียนโปรแกรมบังคับให้ต้องพูดถึงเรื่องที่จริง ๆ แล้วเราไม่ได้สนใจด้วยหรือไม่
- การจะเห็นแรงบังคับนี้ได้ง่าย มักต้องมี มุมมองแบบผู้เรียนภาษาต่างประเทศ ที่เกิดจากการเรียนหลายภาษา
ตัวอย่างสำคัญในภาษาการเขียนโปรแกรม
-
ลำดับการคำนวณ
- ภาษาส่วนใหญ่บังคับให้แสดง ลำดับ ที่การคำนวณจะถูกดำเนินการ
x = some_func(y + 1, z + 2)ใน Python บอกว่าต้องคำนวณy + 1ก่อน จากนั้นคำนวณz + 2แล้วจึงส่งทั้งสองค่าเป็นอาร์กิวเมนต์ให้some_func- แม้อาจไม่ได้ใส่ใจลำดับนี้ แต่ใน Python ไม่มีวิธีเขียนการคำนวณข้างต้นโดยไม่กำหนดลำดับไปพร้อมกัน
- ภาษาส่วนใหญ่ก็คล้ายกัน แต่บางภาษาลำดับการประเมินผลอาจซับซ้อนมาก
- นิพจน์ที่เทียบเท่ากันใน Haskell อย่าง
some_func (y + 1) (z + 2)ไม่ได้กำหนดลำดับการประเมินผลเลย เพราะ non-strict semantics - คุณสมบัตินี้ทำให้เทคนิคอย่าง Tying the knot ซึ่งอ้างถึงค่าที่ยังไม่ได้ประกาศนิยาม เป็นไปได้
-
สีของฟังก์ชัน async
- สีของฟังก์ชัน async เป็นตัวอย่างที่ดี
- ในภาษาอย่าง Javascript หรือ Python ที่มีคีย์เวิร์ด
asyncแบบชัดเจน เราจำเป็นต้องบอกว่าโค้ดนั้น synchronous หรือ asynchronous - ในฟังก์ชัน synchronous เราแสดงออกผ่านการละคีย์เวิร์ด
asyncไว้ แต่ก็ยังเท่ากับต้องเลือกหนึ่งในสองทางอยู่ดี - ไม่มีวิธีเขียนโค้ดที่ยังคงวางตัวเป็นกลางกับประเด็นนี้ได้
-
การจัดสรรและคืนหน่วยความจำ
- ภาษาส่วนใหญ่ที่ไม่มี garbage collection) จะบังคับให้ต้องพูดถึงการจัดสรรและคืนหน่วยความจำ
- ในภาษาอย่าง C มักต้องจัดการเรื่องนี้อย่างค่อนข้างชัดเจน หรือไม่ก็ใช้การจัดสรรบนสแตกแบบแฝง แต่ไม่ว่าแบบไหนก็ต้องเลือก
- ในภาษาอื่น ปัญหานี้อาจถูกซ่อนไว้มากขึ้น แต่ไม่ได้หายไป
- ใน Rust ปัญหานี้เปลี่ยนรูปไปเป็นการพูดถึง lifetime หรือการนับอ้างอิงแบบ explicit
- ตัวเลือกแบบ “ฉันไม่สนว่าเมมโมรีนี้ถูกจัดสรรและคืนเมื่อไร ช่วยจัดการให้เอง” ไม่มีให้จริง ๆ
- การไม่พูดถึงการจัดสรรหน่วยความจำก็มีต้นทุนเช่นกัน
- ภาษาลักษณะนั้นแทบจะแน่นอนว่าต้องวางค่าจำนวนมากไว้บนฮีป และต้องพึ่ง runtime garbage collector
- ข้อแลกเปลี่ยนคือภาษาจะมีอิสระในการตัดสินใจมากขึ้น และ Haskell ก็มักใช้ การวิเคราะห์ strictness ในการเลือกเช่นนี้
-
สโคป
- ภาษาสมัยใหม่ที่รู้จักกันทั้งหมดทำให้ต้องคิดเรื่อง สโคป
- หลายกรณีสโคปถูกแสดงผ่านตำแหน่งการวางตัวแปรทางกายภาพ และหากต้องการพฤติกรรมอื่นก็ต้องใช้ไวยากรณ์เพิ่มเติมอย่าง global หรือ nonlocal ของ Python
- หากไม่อยากคิดเรื่องสโคปเลย ก็มีแนวโน้มว่าต้องถอยลงไปใช้ assembly และยอมรับ address space แบบ global เดียว
-
ชนิดข้อมูล
- ภาษาที่มี static type มักบังคับให้ต้องคิดและพูดถึง ชนิดข้อมูล ของตัวแปรทุกตัว
- type inference ช่วยลดภาระนี้ได้ คล้ายผู้ฟังที่ฉลาดขึ้นและเข้าใจสิ่งต่าง ๆ จากบริบทได้มากขึ้น แต่บทสนทนานั้นก็ยังคงอยู่
- แม้ภาษาที่เป็น dynamic type ล้วน ๆ ก็ยังให้พูดเรื่องชนิดข้อมูลได้ผ่านสิ่งอย่างการตรวจ
isinstanceของ Python แต่จะไม่เป็นธรรมชาติกว่าและต่างออกไปในเชิงเทคนิค - เสน่ห์อย่างหนึ่งของ ภาษาแบบ gradual typing คือมันช่วยหลีกเลี่ยงปัญหา Inverse Sapir-Whorf ได้จริง โดยให้อิสระว่าจะพูดหรือไม่พูดเรื่องชนิดข้อมูลตามความต้องการ
- อย่างไรก็ตาม ยังไม่แน่ชัดว่ามันทำงานได้ดีเพียงใดในทางปฏิบัติ เพราะธรรมเนียมของ codebase เดิมและ linter ที่ใช้มักกดดันไปทางใดทางหนึ่งอยู่เสมอ
ภาษาที่เข้าถึงง่ายและกำแพงที่ต่ำกว่า
- คุณลักษณะหลายอย่างของภาษาการเขียนโปรแกรมที่ “เข้าถึงง่าย” หรือ “อ่านง่าย” สามารถวิเคราะห์ผ่านมุมมอง Inverse Sapir-Whorf ได้
- ภาษาเหล่านี้อาจมี กำแพง Inverse Sapir-Whorf ที่ต่ำกว่า คือไม่บังคับให้ต้องพูดถึงสิ่งที่ยังไม่มีมุมมองหรือยังไม่เข้าใจ
- หัวข้อที่ภาษาการเขียนโปรแกรมบังคับให้พูดถึง สามารถส่งผลต่อการรับรู้และการเลือกใช้ภาษานั้นได้
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
การออกแบบภาษา ไม่ว่าจะเป็นภาษาโปรแกรมหรือภาษาธรรมชาติ อาจมองได้ว่าเป็นการกำหนดว่า ผู้ใช้ควรให้ความสนใจกับอะไร ผ่านการเลือกว่าจะใส่องค์ประกอบใดไว้ในภาษา
C บอกโดยนัยว่า “จงใส่ใจกับการจัดการหน่วยความจำ” ส่วน Haskell บอกว่า “จงใส่ใจกับชนิดข้อมูลที่ตัวแปรและนิพจน์สามารถบรรจุได้”
ถ้าภาษาพาเราไปในทิศทางที่เราอยากโฟกัสจริง ๆ มันก็จะให้ความรู้สึกเหมือนเป็นเครื่องมือที่เหมาะกับงานนั้น แต่ถ้าไม่ ก็เหมือนพยายามฟังคนที่พูดเบา ๆ ในงานค็อกเทลปาร์ตี้ ขณะที่อีกคนตะโกนอยู่คนละฝั่งของห้อง
ความสนใจคือทรัพยากรที่มีค่าที่สุด จึงควรตระหนักว่าเครื่องมือชี้นำและหล่อหลอมมันอย่างไร
ในภาษาอังกฤษ การระบุหรือไม่ระบุ “the” ไม่ได้เป็นกลางต่อความเฉพาะเจาะจงของสิ่งที่พูดถึง และในภาษาตุรกี การใช้หรือไม่ใช้ miş ก็ไม่ได้เป็นกลางต่อการที่ข้อมูลนั้นได้มาจากการรับรู้โดยตรงหรือได้ยินต่อ ๆ กันมา
นี่อาจมองได้ว่าเป็นด้านกลับของสมมติฐาน Sapir-Whorf แบบมาตรฐานที่ว่า “ภาษาจำกัดสิ่งที่พูดได้” หรือก็คือ ความเป็นกลางของการแสดงออก
ถ้าอย่างนั้นก็อธิบายได้ว่าภาษาเป็นกลางหรือไม่เป็นกลางต่อหัวข้อใดหัวข้อหนึ่งอย่างไร และในฐานะผู้ออกแบบภาษา เราก็ปรับได้ว่าจะทำให้ความสนใจของผู้ใช้กระจายตัวหรือถูกรวมศูนย์มากขึ้น เช่น garbage collection ทำให้การแสดงออกเกี่ยวกับ heap allocation เป็นกลางมากขึ้น ส่วน effect tracking ทำให้การแสดงออกเกี่ยวกับผลข้างเคียงและอินพุต/เอาต์พุตไม่เป็นกลาง
ไม่แน่ใจว่าผมจับประเด็นหลักของบทความได้ครบไหม แต่ทำให้นึกถึงสิ่งที่ผมคิดวนอยู่กับ Rust มานาน
Rust อยู่ในตำแหน่งแปลก ๆ ตรงที่มันเปิดให้จัดการกับ reference ได้ แต่ก็มีกฎเข้มงวดเพื่อรับประกัน memory safety
ถ้าเป็น C++ พอคิดว่าสิ่งนี้ควรเป็น reference ก็แค่ทำให้มันเป็น reference แล้วหวังว่าจะไม่มีปัญหา ส่วนถ้าเป็น Python คุณไม่มีอำนาจควบคุมแบบนั้น ก็เลยคัดลอกข้อมูลอย่างไม่ลังเล
แต่ใน Rust คุณอาจตกลงไปใน หลุมพรางของการ optimize แบบ “การคัดลอกไม่มีประสิทธิภาพ งั้นใช้ reference ดีกว่า” แล้วพอ borrow checker โวยขึ้นมา คุณก็ต้องรีแฟกเตอร์โค้ดอยู่เป็นชั่วโมงทั้งที่มั่นใจว่า reference นี้ปลอดภัย
โปรแกรมเมอร์ Rust ที่เก่ง ๆ มักจะบอกว่า “ก็ใช้ .clone, RC, Box อะไรพวกนั้นไปสิ” ซึ่งผมก็เห็นด้วย แต่ความจริงที่ว่า reference มันวางอยู่ตรงหน้าและดูเหมือนน่าจะใช้ได้อย่างปลอดภัยก็ยังคงอยู่
เลยยังเหลือความรู้สึกประหลาดว่าผมตัดสินใจทำมันให้แย่ลงเพื่อเอาใจ borrow checker และก็เข้าใจได้ว่าทำไมถึงมีคนยอมแพ้แล้วสรุปว่า “borrow checker นี่เกินไปสำหรับฉัน”
เป็นหัวข้อที่ดี และก็ดีใจที่มีพูดถึงไวยากรณ์ภาษาตุรกีนิดหน่อย
อีกตัวอย่างที่พบบ่อยคือ บางภาษาสามารถละรายละเอียดอย่าง ความเป็นพหูพจน์ ได้ ซึ่งภาษาเวียดนามก็เป็นแบบนั้น
พอเห็นคำว่า “exaggerated” มีลิงก์ ก็คิดว่า “หรือจะเป็นบทความเกี่ยวกับ Arrival?” แล้วก็ใช่จริง ๆ ซึ่งก็สนุกดี
เป็นหนังที่หลายคนชอบ แต่ส่วนตัวผมรู้สึกแขวนความไม่เชื่อได้ยาก เพราะมันอ้างว่าเป็นวิทยาศาสตร์ แต่ “วิทยาศาสตร์” นั้นกลับให้ความรู้สึกเหมือนภาษาศาสตร์แบบเวทมนตร์มากกว่า
ภาษาโปรแกรมสำหรับแอปพลิเคชันส่วนใหญ่ยึดค่าหนึ่งค่าเป็นฐานแบบอะตอม คุณสร้าง list หรือ map ทับขึ้นไปได้ แต่สุดท้ายสิ่งเหล่านี้ก็ยังเป็นวัตถุเดี่ยวชนิดหนึ่ง และบ่อยครั้งก็เข้ากันได้อย่างละเอียดอ่อนไม่ค่อยดี
ใน Rust คุณเลยต้องคัดลอกข้อมูลระหว่างโครงสร้างเหล่านี้บ่อย ส่วนใน SQL คุณกังวลเรื่องนั้นน้อยลง แต่ต้องไปกังวลเรื่อง index และ query plan แทน โดยเฉพาะเวลาฐานข้อมูลวางแผนที่ดูโง่ชัด ๆ จนทำให้สิ่งที่เราอยากถามซับซ้อนขึ้น และยังไม่ต้องพูดถึง SQL NULL
ผลลัพธ์คือซอฟต์แวร์ส่วนใหญ่ของเราถูกกำหนดรายละเอียดมากเกินไปอย่างไม่น่าเชื่อจนถึงระดับค่ารายตัว และแม้ประสิทธิภาพพีซีจะดีขึ้น 1000 เท่า แต่เวลาแฝง UI ที่ดีที่สุดกลับแย่ลงเป็น 10 เท่าจากเมื่อก่อน
ลัทธิความเคร่งครัดเรื่อง object-oriented programming ก็มีส่วนรับผิดชอบบางส่วน เคยลองใช้ async เหมือนกัน แต่ก็เสื่อมถอยกลับไปเป็นการมองเห็นแต่ต้นไม้ไม่เห็นป่าได้ง่ายเกินไป ด้วยการ await งานอิสระทีละอย่าง
https://www.uiua.org/ คงต้องจินตนาการเอาว่ามีความสุข
เป็นประเด็นที่ดี ทุกภาษาสมัยใหม่บังคับหรืออย่างน้อยก็ชี้นำอย่างแรงให้โปรแกรมเมอร์จัดการรายละเอียด ราวกับเดินลุยเข้าไปในดงวัชพืช
ภาษาสคริปต์มีตัวดำเนินการสำหรับสิ่งที่มีรายละเอียดน้อยลงเล็กน้อย เช่น โปรแกรมหรือหน้าเว็บ แต่ก็ยังลบรายละเอียดทิ้งไม่ได้
คุณยังคงต้องคิดและจัดการกับรายละเอียดเล็กจิ๋วมาก ๆ อย่างตัวเลข สตริง และรหัสข้อผิดพลาด
เราถูกฝึกและทำงานกับการจัดการรายละเอียดมาหลายปี จนคุ้นชินกับมันมาก และเลยกลายเป็นว่า การคิดโดยไม่มองโลกผ่านมุมมองของรายละเอียดนั้นทำได้ยากมาก
สิ่งแรกที่ผมนึกถึงคือ อินเทอร์เฟซ ของอ็อบเจ็กต์หรือโมดูล
ในภาษาโปรแกรม สิ่งนี้มีความเป็นรูปธรรมสูงมาก แต่ในการสนทนาด้วยภาษาธรรมชาติมันพร่าเลือนกว่ามาก
อีกตัวอย่างหนึ่งคือความต่างระหว่าง generics ใน C++ กับ generics ใน Python ใน C++ คุณต้องจัดการมันอย่างตั้งใจมาก แต่ใน Python ถ้าคุณเมิน type hint ไป มันก็ถูกจัดการแบบค่อนข้างโดยนัย
ประโยคที่ว่า “inverse Sapir-Whorf จำกัดสิ่งที่ภาษาพูดไม่ได้ หรือทำให้บางอย่างไม่ง่ายที่จะไม่พูดถึง หรือกระทั่งทำให้ไม่ง่ายที่จะไม่คิดถึงบางอย่าง” ทำให้นึกถึงพีระมิด ไวยากรณ์ > สำนวนการใช้ > standard library > third-party library > ecosystem
ส่วนที่ว่า “ไม่ง่ายที่จะไม่คิดถึง” ดูเหมือนจะโฟกัสไปที่ปัญหาที่แสดงออกได้ยากหรือมีข้อจำกัดสำคัญ
ความคุ้นเคยทำงานจากทั้งด้านบนและด้านล่างเข้ามาด้านใน และผู้คนก็เผยภูมิหลังของตัวเองผ่านวิธีที่เขียนโค้ดในแต่ละชั้น
แม้ผมจะอ่าน เขียน และพูดภาษาอังกฤษมามากกว่า 15 ปีแล้ว ก็ยังไม่เคยรู้ว่า “I live in London” กับ “I'm living in London” ต่างกัน
ผมเองก็ไม่รู้เหมือนกันว่าผมอยู่ลอนดอนเป็นการถาวร หรือแค่กำลังอยู่ลอนดอนตอนนี้ 😅
ตรงนี้ถ้าเปลี่ยนรูป gerund เป็นคำคุณศัพท์ธรรมดาแล้วลองพูดว่า “I am cold” คุณก็คงเข้าใจว่าหมายถึงตอนนี้หนาว ไม่ใช่ว่าเย็นชาอย่างถาวรแบบซูเปอร์วายร้ายอะไรทำนองนั้น
ในทำนองเดียวกัน “I am living in London” สื่อว่าตอนนี้อาศัยอยู่ในลอนดอน แต่ในอนาคตอาจเปลี่ยนได้
และยังมีนัยด้วยว่าไม่ได้อาศัยอยู่ในลอนดอนมาตลอด คล้ายกับที่ “I am cold” มีความหมายแฝงอยู่บ้างว่าอย่างน้อยเคยสัมผัสอุณหภูมิที่อุ่นพอมาก่อน จึงรับรู้ได้ว่าสภาวะตอนนี้ไม่ใช่ “ปกติ” แต่เป็น “หนาว”