การเข้ารหัสเป็นการเขียนชนิดหนึ่ง

May 10 2023
สิ่งที่นักพัฒนาซอฟต์แวร์สามารถเรียนรู้ได้จากผู้เขียนร้อยแก้ว
มีสถานที่ที่แม่น้ำสเนคในไวโอมิงคดโค้งไปทางเหนือ ขยายออก และไหลช้าลง กวางมูสดูดอกบัว นกกระทุงจับปลา นากเล่น

มีสถานที่ที่แม่น้ำสเนคในไวโอมิงคดโค้งไปทางเหนือ ขยายออก และไหลช้าลง กวางมูสดูดอกบัว นกกระทุงจับปลา นากเล่น จากนั้นแม่น้ำจะขดตัวกลับและเดินทางต่อไปทางทิศตะวันตกสู่ภูเขา

คุณจะเห็นเส้นทางวนลูปเดิม ถ้าคุณดูอาชีพของฉันจนถึงตอนนี้ ฉันเป็นนักพัฒนาซอฟต์แวร์ที่ผันตัวมาเป็นครูสอนมนุษยศาสตร์ที่ผันตัวกลับมาเป็นนักพัฒนาซอฟต์แวร์ ระหว่างวิศวกรรมศาสตร์กับมนุษยศาสตร์มีระยะทางที่ทราบกันดี แต่ฉันเดินทางมามากพอแล้ว ฉันจึงรู้ว่ามันสั้นกว่าที่ใครๆ คิด ระหว่างทาง ฉันสังเกตเห็นว่าคำแนะนำบางอย่างที่ผู้เขียนร้อยแก้วแจกจ่ายอาจมีประโยชน์ต่อผู้เขียนซอฟต์แวร์ด้วยเช่นกัน เกือบจะเหมือนกับว่าการเขียนโค้ดเป็นรูปแบบหนึ่งของการเขียน¹

ครั้งหนึ่ง ฉันต้องสร้างฟังก์ชันเล็กๆ น้อยๆ ที่เพิ่มรายการในอาร์เรย์ แต่จะลบรายการนั้นออกหากมีอยู่แล้ว แบบนี้:

toggle([], 1) // should return [1]
toggle([1], 1) // should return []

import _ from "lodash";
const toggle = (arr, item) => _.xor(arr, [item]);

แต่ไม่นานฉันก็จำคำแนะนำบางคำได้: “อ่านบทประพันธ์ของคุณให้ถี่ถ้วน และเมื่อใดก็ตามที่คุณพบกับข้อความที่คุณคิดว่าดีเป็นพิเศษ ให้ขีดฆ่าทิ้ง” นั่นเป็นเคล็ดลับจากซามูเอล จอห์นสัน นักเขียนเรียงความแห่งศตวรรษที่ 183 ฉันรู้ว่าความเฉลียวฉลาดเล็กน้อยเป็นเงื่อนงำที่ฉันควรทำให้ฟังก์ชันของฉันง่ายขึ้น ฉันเปลี่ยนเป็น:

const toggle = (arr, item) =>
   arr.includes(item) ?
   arr.filter((x) => item !== x) :
   [...arr, item];

ในความเห็นของฉัน: ไม่เลย⁴ แม้ว่าจะซับซ้อนกว่าในบางประการ แต่ฟังก์ชันใหม่ก็ยังน่าจะชัดเจนกว่าสำหรับ coder ทั่วไป ดังนั้นจึงง่ายต่อการบำรุงรักษา บรรทัดของรหัสอาจเรียบง่ายทางวากยสัมพันธ์แต่ไม่ชัดเจน หรือชัดเจนแต่วากยสัมพันธ์ซับซ้อน เช่นเดียวกับร้อยแก้ว นึกถึงประโยคที่ว่า “คุณนำหนังสือเล่มนั้นไปเพื่ออะไร ซึ่งฉันไม่ต้องการอ่านจนจบ” ⁵ มีไวยากรณ์ที่ซับซ้อน แต่เข้าใจได้มากกว่าประโยคง่ายๆ ที่ใช้วากยสัมพันธ์ว่า “ myrmecobius ย่อตัวลง” แม้ว่าจะไม่พูดน้อยอีกต่อไป แต่ฟังก์ชันใหม่ของฉันก็อ่านง่ายขึ้น

ถ้าเขารู้จัก JavaScript ราชาแห่งร้อยแก้วพูดน้อยเองอาจจะขมวดคิ้วกับรูปแบบที่กระชับกว่าของtoggle. “เฮมิงเวย์”—ราชาผู้มีปัญหา—“ไม่ได้ผลักดันคุณให้สนใจพจนานุกรม” เอฟ. สก็อตต์ ฟิตซ์เจอรัลด์เคยกล่าวไว้อย่างชื่นชม⁶ หากมีการใช้ หน้าที่xorของผมคงจะขับเคลื่อนผู้อ่านส่วนใหญ่ไปที่เอกสารประกอบ หากไม่มีฟังก์ชันนี้ ฟังก์ชันจะยิ่งล้นหลาม ชัดเจน และด้วยเหตุผลดังกล่าว ก็ยิ่งอธิบายตนเองได้มากขึ้น⁷

คำว่าพูดน้อยมาจากชาวสปาร์ตันในสมัยโบราณ ซึ่งอาศัยอยู่ในภูมิภาคที่เรียกว่าลาโคเนียและไม่ยอมเสียคำพูด ครั้งหนึ่งศัตรูเขียนถึงพวกเขาว่า “หากฉันบุกลาโคเนีย ฉันจะขับไล่เธอออกจากแผ่นดิน” พวกเขาตอบกลับมาว่า: “ถ้า”⁸

กฎข้อหนึ่งเกี่ยวกับงานเขียนที่ฉันชื่นชมไม่ได้มาจากนักเขียนนวนิยายหรือนักข่าว แต่มาจากนักออกแบบพิพิธภัณฑ์ การเขียนที่ดี อ้างอิงจาก Edwin Schlossberg “สร้าง [s] บริบทที่คนอื่นสามารถคิดได้” ⁹ มันช่วยให้พวกเขานึกภาพ ครุ่นคิด และตอบสนอง มันทำให้พวกเขามีที่ว่างให้ทำ—เหมือนนิทรรศการในพิพิธภัณฑ์ ในทำนองเดียวกัน โค้ดที่ดีจะทำให้มีที่ว่างสำหรับผู้อ่านเหมือนเดิม ช่วยให้พวกเขามีเหตุผล

โดยปกติแล้ว มันสมเหตุสมผลแล้วที่ผู้เขียนโค้ดจะทำตามรูปแบบที่ผู้อ่านทั่วไปเข้าใจดีอยู่แล้ว แม้ว่านักพัฒนา JavaScript ส่วนใหญ่จะคุ้นเคยกับternary (เครื่องหมายคำถามและเครื่องหมายทวิภาค) ที่ใช้ข้างต้น แต่หลายๆ คนก็ยังสบายดีอยู่ที่บ้านด้วยบล็อก if-else เช่นอันนี้:

const toggle = (arr, item) => {
   if (arr.includes(item)) {
      return arr.filter((x) => item !== x);
   } else {
      return [...arr, item];
   }
}

ผู้เขียนต้องมีความเห็นอกเห็นใจต่อผู้อ่าน และคุณก็ต้องมีความเห็นอกเห็นใจผู้ที่จะดูแล ดีบัก หรือดัดแปลงโค้ดของคุณด้วยเช่นกัน เนื่องจากคุณเป็นผู้เขียน เป็นเรื่องปกติที่จะมีปัญหาในการทำความเข้าใจกับผู้อ่านของคุณ ลองใช้สองเทคนิคที่ยืมมาจากนักเขียนที่ดีที่สุด

ประการแรก เฮเลน ซอร์ดแนะนำให้คุณ "นึกภาพคนบางคนที่มองข้ามไหล่ของคุณขณะที่คุณเขียน" ท้ายที่สุดแล้ว “นักเขียนที่มีส่วนร่วมมากที่สุดมักจะเป็นคนที่ให้ความสนใจกับคนจริงๆ มากที่สุด ไม่ว่าจะเป็นผู้เชี่ยวชาญและผู้ไม่เชี่ยวชาญ เพื่อนร่วมงานและคนแปลกหน้า ซึ่งคำพูดของพวกเขาเองจะสะท้อนอยู่ในหู”¹¹ คำแนะนำที่ชาญฉลาดสำหรับผู้เขียนโค้ดก็เช่นกัน

เทคนิคที่สอง: พักโค้ดของคุณไว้หนึ่งหรือสองวัน ถ้าทำได้ ให้กลับมาที่โค้ดนั้น “เขียนเรื่องสั้นให้เสร็จ พิมพ์ออกมา แล้วเก็บใส่ลิ้นชักแล้วเขียนเรื่องอื่นๆ” นีล ไกแมนเคยบอกนักเขียนผู้มีแรงบันดาลใจ “เมื่อคุณพร้อม ให้หยิบมันขึ้นมาอ่าน ทำราวกับว่าคุณไม่เคยอ่านมันมาก่อน หากมีบางสิ่งที่คุณไม่พอใจในฐานะนักอ่าน ให้เข้ามาแก้ไขในฐานะนักเขียน นั่นคือการแก้ไข”¹² นักเขียนโบราณ Quintilian ยังแนะนำให้เรา “ทิ้งสิ่งที่เราเขียนไว้ช่วงหนึ่ง”—

เพื่อที่ว่าเมื่อเรากลับมาหลังจากช่วงเวลาหนึ่ง มันจะมีบรรยากาศของความแปลกใหม่และเป็นฝีมือของผู้อื่น ด้วยวิธีนี้เราอาจป้องกันตัวเองจากการเขียนของเราด้วยความรักทั้งหมดที่เราทุ่มเทให้กับเด็กแรกเกิด ¹³

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

การแสดงออกทางศิลปะและสติปัญญารูปแบบหนึ่งหล่อเลี้ยงและเลี้ยงดูผู้อื่น อะไรก็ตามที่เราเรียกว่าความคิดสร้างสรรค์และจินตนาการ—ความลึกลับอันยิ่งใหญ่สองประการนี้—สำหรับผู้สร้างบางคนที่ประสบกับประสบการณ์ “ระดับโลก” ในชีวิตของพวกเขา โดยไม่ได้แปลเป็นภาษาท้องถิ่นในรูปแบบการแสดงออกรูปแบบเดียว แต่เป็นการเผยแพร่หรือเผยแพร่จากแนวหนึ่งไปสู่อีกแนวหนึ่ง แนวศิลปะหนึ่งหรือ ระเบียบวินัยทางปัญญากับอีกมนุษยศาสตร์ (รวมถึงวิทยาศาสตร์) ทั้งหมดมีความเกี่ยวข้องเชื่อมโยงกัน ¹⁴

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

การเปรียบเทียบการเขียนโค้ดมีข้อ จำกัด เพื่อให้แน่ใจว่า ตัวอย่างเช่น ความขัดแย้งเป็นสิ่งที่ผิดกฎหมายในซอร์สโค้ด และในงานศิลปะ โดยเฉพาะบทกวี ที่พวกเขาได้รับความยุติธรรม มีบทกวีของ Fernando Pessoa ที่ฉันชอบอ่านออกเสียงแม้ว่าฉันจะไม่รู้ภาษาโปรตุเกสก็ตาม มันเริ่มต้น:

O Poeta é um fingidor
Finge tão completamente
Que chega a fingir que é dor
A dor que deveras sende.

กวีคือผู้ที่เสแสร้ง
เขาปลอมแปลงของจริงอย่างสิ้นเชิง
เขาแกล้งทำแม้กระทั่งความเจ็บปวด
และความทุกข์ทรมานอันน่าสะพรึงกลัวที่เขา
รู้สึกด้วย ซ้ำ¹⁵

Pessoa เชื้อเชิญให้เราละทิ้งแนวคิดดั้งเดิมที่เป็นความจริงและเท็จชั่วขณะ เขากล่าวถึงความขัดแย้งโดยไม่ขอโทษ: กวีปกปิดตัวเองไว้เบื้องหลังบทกวีของพวกเขา และในการทำเช่นนั้น พวกเขาจะมองเห็นได้ผ่านพวกเขา Pessoa ทิ้งตรรกะบูลีนไว้เบื้องหลัง เขาคิดค้นตรรกะของเขาเอง “กวีคือคนที่เสแสร้ง” หมายความว่าอย่างไร ถ้าไม่ใช่ “ฉันแต่งขึ้นทุกสิ่งที่ฉันพูด—ล้วนเป็นเท็จ รวมทั้งคำพูดเหล่านี้ด้วย” นี่เป็นข้อความหักล้างตนเอง เป็นความเท็จเชิงตรรกะ แต่ถ้าคุณมองผ่านคำต่างๆ ถึงรากของนิรุกติศาสตร์ "Oกวีตา é um fingidor" หมายถึง "ผู้สร้างคือผู้สร้าง" ความจริงเชิงตรรกะ เช่นเดียวกับความเจ็บปวดจำลองที่เขากล่าวถึง การยืนยันของกวีนั้นเป็นเท็จบนพื้นผิว แต่เป็นความจริงอยู่ข้างใต้ รหัสและบทกวีเสนอกลยุทธ์เสริมสำหรับการรับมือกับโลกที่มักไร้เหตุผล: หนึ่งให้ที่หลบภัยจากความขัดแย้ง

เชิงอรรถ

[1]: Brian Kernighan และ PJ Plauger , Donald Knuth , Richard Gabriel , James Devlin , Jeff AtwoodและRebecca Sutton Koeserเป็นต้น Steve McConnellวิจารณ์การเปรียบเทียบ

[2]: นี่คือตัวอย่างการทำงานของlodashห้องสมุดxorที่ใช้งานจริง ใน Boggle คุณมองหาคำในตารางตัวอักษร หากคุณพบคำที่ไม่มีใครพบ คุณจะได้คะแนนจากคำนั้น สมมติว่าคุณกำลังสร้างเวอร์ชันของเกมใน JavaScript คุณมีข้อมูลนี้:

const wordsFoundByPlayerOne = ["apple", "peel"];
const wordsFoundByPlayerTwo = ["apple", "leap"];
const wordsFoundByPlayerThree = ["apple", "able"];

_.xor(
   wordsFoundByPlayerOne,
   wordsFoundByPlayerTwo,
   wordsFoundByPlayerThree
); // Output: ["peel", "leap", "able"]

[4]: เรายังสามารถสร้างทางเลือกที่อ่านง่ายด้วยความช่วยเหลือของSet:

const toggle = (arr, item) => {
  const set = new Set(arr);
  if (set.has(item)) set.delete(item);
  else set.add(item);
  return Array.from(set);
}

[6]: อ้างโดยโค้ช Gary Gilson ในบทความปี 2019

[7]: ในทางตรงกันข้าม Jeff Atwood บล็อกเกอร์ได้ส่งเสริม " Spartan Programming "

[8]: ตาร์ค, เกี่ยวกับช่างพูด .

[9]: อ้างโดยนักฟิสิกส์ Konstantin Likharev ในหนังสือปี 2021

[10]: ในการพูดคุยของเขาในปี 2012 เรื่อง "Simplicity Matters" Rich Hickey ให้เหตุผลว่าโปรแกรมเมอร์ไม่ควรกลัวความยุ่งยากส่วนหนึ่งเป็นเพราะมันทำให้งานของเราน่าสนใจ แต่งานของเราจะน่าสนใจที่สุดหากอยู่ในโซน Goldilocks ระหว่างความน่าเบื่อและการ เดินทางโดยรถแท็กซี่ เช่นเดียวกับบทเรียนในโรงเรียน

[11]: Helen Sword, การเขียนเชิงวิชาการอย่างมีสไตล์ (2012), p. 44. เพื่อเพิ่มความชัดเจน นักเขียนหลายคนอ่านงานของพวกเขาดัง ๆ ฟังตัวเอง นักปรัชญา Jonathan Bennett เขียนว่า “Gilbert Ryle เคยบอกฉันว่า 'สิ่งที่ฟังไม่เข้าหูก็อ่านไม่เข้าตา' และนั่นทำให้ชีวิตฉันเปลี่ยนไป มากกว่าสิ่งอื่นใด ข้อมูลเชิงลึกนั้นแสดงให้ฉันเห็นว่าจะเริ่มปีนออกจากหลุมขยะไปสู่งานร้อยแก้วธรรมดาได้อย่างไร” Kernighan และ Plauger เสนอข้อมูลเชิงลึกที่คล้ายกันเกี่ยวกับการเขียนโปรแกรม: "วิธีที่มีประโยชน์ในการตัดสินใจว่าโค้ดบางส่วนชัดเจนหรือไม่คือ 'การทดสอบทางโทรศัพท์' ถ้ามีคนสามารถเข้าใจรหัสของคุณเมื่ออ่านออกเสียงทางโทรศัพท์ ก็ชัดเจนเพียงพอ ถ้าไม่ใช่ ก็จำเป็นต้องเขียนใหม่” ( Elements of Programming Style , p. 21)

[12]: นีล ไกแมน, “ Advice to Authors ”.

[13] : Quintilian สถาบัน Oratory

[14]: ชาร์ลส์ จอห์นสัน, The Way of the Writer (2016), p. 23.

[15]: Pessoa, “Autopsychography”. แปลโดย Ryan Wilson, Proteus Bound: Selected Translations 2008–2020 (2021)

ขอขอบคุณShashank KhandelwalและAsheesh Laroiaสำหรับคำแนะนำที่เป็นประโยชน์มากมาย