บทนี้มีสาระสองเรื่อง: เรื่องแรกคือหัวข้อที่เห็นได้ชัดคือ error-correcting codes และอีกเรื่องคือกระบวนการค้นพบที่เกิดขึ้นบางครั้ง—คุณคงทราบว่าผมเป็นผู้ค้นพบ Hamming error-correcting codes อย่างเป็นทางการ ดังนั้นผมจึงอยู่ในตำแหน่งที่จะบอกเล่าว่าพวกมันถูกค้นพบอย่างไร แต่ควรระวังรายงานประเภทนี้ไว้ด้วย ในตอนนั้นผมสนใจในกระบวนการค้นพบมาก เชื่อว่าในหลายกรณี วิธีการค้นพบสำคัญกว่าสิ่งที่ค้นพบ ผมรู้พอที่จะไม่คิดถึงกระบวนการขณะทำวิจัย เช่นเดียวกับนักกีฬาที่ไม่คิดถึงสไตล์ขณะเล่น แต่ฝึกจนเป็นอัตโนมัติ ดังนั้นผมจึงมีนิสัยว่าหลังจากค้นพบสิ่งสำคัญหรือไม่สำคัญ ผมจะย้อนกลับไปพยายามติดตามขั้นตอนที่ดูเหมือนจะเกิดขึ้น แต่อย่าเข้าใจผิด; ภายใต้ที่สุดผมสามารถเล่าส่วนที่มีสติและส่วนบนของจิตใต้สำนึกได้บ้าง แต่เราไม่รู้ว่าส่วนไร้สติทำเวทย์มนตร์อย่างไร

ขณะนั้นผมกำลังใช้ Model 5 relay computer ที่ New York เพื่อเตรียมส่งไปยัง Aberdeen Proving Grounds พร้อมกับโปรแกรมซอฟต์แวร์ที่จำเป็น (ส่วนใหญ่เป็น mathematical routines) เมื่อเครื่องตรวจพบข้อผิดพลาดโดย 2-out-of-5 block codes เครื่องจะเมื่อไม่ได้เฝ้าดูทำซ้ำขั้นตอนนั้นได้ถึงสามครั้งก่อนจะทิ้งงานนั้นและรับปัญหาถัดไป หวังว่าอุปกรณ์ที่เสียจะไม่เกี่ยวข้องกับงานใหม่ ในตอนนั้นผมตำแหน่งต่ำสุด จึงได้เวลาเครื่องฟรีเฉพาะช่วงสุดสัปดาห์—ตั้งแต่วันศุกร์ประมาณ 5 โมงเย็นถึงเช้าวันจันทร์ประมาณ 8 โมง ซึ่งเป็นเวลามาก! ผมจึงใส่เทปอินพุตด้วยปัญหาจำนวนมากและสัญญากับเพื่อนที่ Murray Hill, New Jersey ว่าจะส่งคำตอบให้วันอังคาร แต่สุดสัปดาห์หนึ่ง หลังออกจากที่ทำงานในคืนวันศุกร์ เครื่องก็ล้มเหลวอย่างสิ้นเชิงและผมแทบไม่ได้อะไรในวันจันทร์ ผมต้องขอโทษเพื่อนและสัญญาว่าจะส่งคำตอบในอังคารถัดไป แต่น่าเสียดาย เหตุการณ์เดิมเกิดขึ้นอีกครั้ง! ผมโกรธพอสมควรและพูดว่า “ถ้าเครื่องบอกได้ว่ามีข้อผิดพลาด ทำไมมันไม่บอก ที่ไหน แล้วแก้ได้โดยเปลี่ยนบิตเป็นสถานะตรงกันข้าม?” (ภาษาจริงๆ อาจแรงกว่านี้!)

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

กลับมาที่เรื่อง ผมรู้อยู่แล้วจากการพูดคุยก่อนหน้านี้ว่าสามารถสร้างเครื่องสามชุด ใส่วงจรเปรียบเทียบ แล้วใช้ majority vote—ดังนั้นเครื่องที่แก้ไขข้อผิดพลาดได้ย่อมเป็นไปได้ แต่ค่าใช้จ่ายจะสูงแค่ไหน! แน่นอนต้องมีวิธีที่ดีกว่า ผมยังรู้ดี (ตามบทก่อน) เกี่ยวกับ parity checks; ผมได้ศึกษาพื้นฐานของมันอย่างละเอียด

อีกเรื่องหนึ่ง Pasteur ว่าไว้ว่า 'โชคเข้าข้างคนที่เตรียมพร้อม' คุณเห็นไหมว่าผมเตรียมตัวมาจากงานก่อนหน้านั้น ผมคุ้นเคยกับ 2-out-of-5 codes เข้าใจมันในเชิงพื้นฐาน และได้คิดออกและเข้าใจผลเชิงทั่วไปของ parity check

สรุป: Figure 12.1—First error-correcting codes

หลังคิดอยู่สักพักผมตระหนักว่าถ้าจัดบิตของสัญลักษณ์ข้อความใดๆ ให้เป็นรูปสี่เหลี่ยมผืนผ้า และใส่ parity checks ในแต่ละแถวและแต่ละคอลัมน์ สอง parity checks ที่ล้มเหลวจะให้พิกัดของข้อผิดพลาดเดี่ยว และนี่รวมถึง parity bit ที่เพิ่มไว้ที่มุม (ซึ่งสามารถกำหนดได้สอดคล้องกันถ้าใช้ even parities), Figure 12.1 ความซ้ำซ้อน (the redundancy) ซึ่งเป็นอัตราส่วนของสิ่งที่ใช้ต่อปริมาณขั้นต่ำที่จำเป็น คือ

ชัดเจนสำหรับคนที่เคยเรียน calculus ว่ายิ่งสี่เหลี่ยมผืนผ้าใกล้เคียงสี่เหลี่ยมจัตุรัสเท่าใด ความซ้ำซ้อนก็จะต่ำลงสำหรับปริมาณข้อความเท่าเดิม และแน่นอน m’ และ n’ ที่ใหญ่กว่าจะดีกว่าที่เล็กกว่า แต่ความเสี่ยงของ double error อาจสูงเกินไป—ต้องตัดสินเชิงวิศวกรรม สังเกตว่าถ้าเกิดสองข้อผิดพลาด (1) ถ้าไม่อยู่ในคอลัมน์เดียวกันและไม่อยู่ในแถวเดียวกัน ก็จะมีเพียงสองแถวและสองคอลัมน์ที่ล้มเหลว และคุณจะไม่รู้ว่าคู่แนวทแยงใดเป็นสาเหตุ; (2) ถ้าสองข้อผิดพลาดอยู่ในแถวเดียวกัน (หรือคอลัมน์) คุณจะมีเพียงคอลัมน์ (หรือแถว) แต่จะไม่มีแถว (คอลัมน์) ที่บอกตำแหน่ง

สรุป: We now move to some weeks later. To get to New York City I would go a bit early to the Murray Hill, New Jersey, location where I worked and get a ride on the company mail delivery car. Well, riding through north Jersey in the early morning is not a great sight, so I was, as I had the habit of doing, reviewing successes so I would have the style in hand automatically; in particular I was reviewing in my mind the rectangular codes. Suddenly, and I can give no reason for it, I realized if I took a triangle and put the parity checks along the diagonal, with each parity check checking both the row and column it was in, then I would have a more favorable redundancy, Figure 12.2.

Figure 12.2—Next error-correcting codes (รหัสแก้ไขข้อผิดพลาดถัดไป)

ความรู้สึกว่าตัวเองฉลาดหายวับไปทันที! ครั้งนี้ผมมีโค้ดที่ดีที่สุดหรือ? คิดไปสักพัก (จำไว้ว่าไม่มีสิ่งรบกวนจากทิวทัศน์ในนอร์ทเจอร์ซีย์) ผมเห็นว่าก้อนข้อมูลในรูปลูกบาศก์ ที่มี parity checks ข้ามทั้งระนาบและ parity check bit บนแกนทั้งสาม จะให้พิกัดทั้งสามของข้อผิดพลาด โดยต้องแลกด้วย parity checks จำนวน 3n – 2 สำหรับข้อความที่เข้ารหัสทั้ง n_3 ดีกว่าแน่นอน! แต่ดีที่สุดไหม? ไม่! ในฐานะนักคณิตศาสตร์ผมก็ตระหนักว่า ลูกบาศก์สี่มิติ (ไม่จำเป็นต้องจัดวางจริงๆ แค่เชื่อมสายตามนั้น) จะดีกว่า ดังนั้นมิติที่สูงกว่าจะดีกว่า สักครู่ (ประมาณห้าไมล์) ผมก็เห็นชัดว่าก้อน 2 × 2 × 2 × … × 2 ที่มี _n + 1 parity checks น่าจะเป็นแบบที่ดีที่สุด — ดูเหมือนจะเป็นเช่นนั้น!

สรุป: But having burnt my fingers once, I was not about to settle for what looked good—I had made that mistake before! Could I prove it was best? How to make a proof? One obvious approach was to try a counting argument. I had n + 1 parity checks, whose result was a string of n + 1 bits, a binary number of length n + 1 bits, and this could represent any of 2n + 1 things. But I needed only 2n + 1 things, the 2n points in the cube plus the one result the message was correct. I was off by almost a factor of two. Alas! I arrived at the door of the company and had to sign in and go to a conference, so I had to let the idea rest.

เมื่อผมกลับมาทบทวนไอเดียอีกครั้งหลังจากหลายวันที่ถูกรบกวน (ถึงกระนั้นผมก็ต้องทำหน้าที่ร่วมกับทีมของบริษัท) ผมตัดสินใจว่าวิธีที่ดีคือการใช้ syndrome ของข้อผิดพลาดเป็นตัวเลขฐานสองที่ระบุตำแหน่งของข้อผิดพลาด โดยแน่นอนว่าทุกบิตเป็น 0 หมายถึงคำตอบถูกต้อง (การทดสอบง่ายกว่าการทดสอบว่าทั้งหมดเป็น 1 บนคอมพิวเตอร์ส่วนใหญ่) สังเกตว่าความคุ้นเคยกับระบบฐานสอง ซึ่งยังไม่แพร่หลายในตอนนั้น (1947–1948) มักมีบทบาทสำคัญในการคิดของผม การรู้มากกว่าที่จำเป็นในเวลานั้นคุ้มค่า

จะออกแบบกรณีพิเศษนี้ของ error-correcting code อย่างไร? ง่ายมาก! เขียนตำแหน่งในรูปของโค้ดฐานสองออกมา:

สรุป: | | | | --- | --- | | 1 | 1 | | 2 | 10 | | 3 | 11 | | 4 | 100 | | 5 | 101 | | 6 | 110 | | 7 | 111 | | 8 | 1000 | | 9 | 1001 | | … | … |

ตอนนี้ชัดเจนว่า parity check ทางด้านขวาของ syndrome ต้องรวมทุกตำแหน่งที่มี 1 ในคอลัมน์ขวาสุด; หลักที่สองจากขวาต้องรวมตัวเลขที่มี 1 ในคอลัมน์ที่สอง เป็นต้น ดังนั้นคุณจะได้:

สรุป: | | | | | | | | | | | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | Parity check #1 | 1, | 3, | 5, | 7, | 9, | 11, | 13, | 15, | … | | Parity check #2 | 2, | 3, | 6, | 7, | 10, | 11, | 14, | 15, | … | | Parity check #3 | 4, | 5, | 6, | 7, | 12, | 13, | 14, | 15, | … | | Parity check #4 | 8, | 9, | 10, | 11, | 12, | 13, | 14, | 15, | … |

สรุป: Thus if any error occurs in some position, those parity checks, and only those, will fail and give 1s in the syndrome, and this will produce exactly the binary representation of the position of the error. It is that simple!

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

สรุป: which is clearly a necessary condition, and the equality is sufficient. We pick as the positions for the checking bits (so the setting of the parity check will be easy) the check positions 1, 2, and 4. The message positions are therefore 3, 5, 6, and 7. Let the message be

เรา (1) เขียนข้อความบนบรรทัดบนสุด, (2) เข้ารหัสในบรรทัดถัดไป, (3) แทรกข้อผิดพลาดที่ตำแหน่ง 6 ในบรรทัดถัดไป, และ (4) ในสามบรรทัดถัดไปคำนวณ parity checks ทั้งสาม

1 2 3 4 5 6 7 ตำแหน่ง
1 0 0 1 ข้อความ
0 0 1 1 0 0 1 ข้อความที่เข้ารหัส
0 0 1 1 0 1 1 ข้อความที่มีข้อผิดพลาด

สรุป: You apply the parity checks to the received message.

จำนวนไบนารี 110 เท่ากับจำนวนฐานสิบ 6 ดังนั้นเปลี่ยนบิตที่ตำแหน่ง 6 แล้วลบตำแหน่ง check 1, 2, และ 4 ออก คุณจะได้ข้อความต้นฉบับ 1001

สรุป: If it seems magical, then think of the all-0 message, for which all the checks will be 0. Then think of a single digit changing and you will see that as the position of the error is moved around, the syndrome binary number will change correspondingly and will always exactly match the position of the error. Next, note the sum of any two correct messages is still a correct message (the parity checks are additive modulo 2, hence the proper messages form an additive group modulo 2). A correct message will give all 0s, and hence the sum of a correct message plus an error in one position will give the position of the error regardless of the message being sent. The parity checks concentrate on the error and ignore the message.

ตอนนี้เห็นได้ชัดว่าการสับเปลี่ยนคอลัมน์ใดๆ สองคอลัมน์ขึ้นไป ที่ทั้งสองฝั่งช่องสื่อสารตกลงกัน จะไม่ส่งผลสำคัญ; โค้ดจะ equivalent ในทำนองเดียวกัน การสลับ 0 และ 1 ในคอลัมน์ใดคอลัมน์หนึ่ง (complement ตำแหน่งนั้น) จะไม่ทำให้โค้ดต่างกันในเชิงสำคัญ โค้ด Hamming เป็นเพียงการจัดวางที่น่ารัก และในการใช้งานจริงคุณอาจอยากให้ check bits มารวมกันท้ายข้อความแทนที่จะแทรกอยู่กลาง

แล้ว double error ล่ะ? ถ้าเราต้องการจับ (แต่ไม่แก้) double error เราเพียงเพิ่ม parity check ใหม่หนึ่งตัวครอบทั้งข้อความที่ส่ง มาดูว่าจะเกิดอะไรขึ้นที่ฝั่งรับ

syndrome เดิม parity check ใหม่ ความหมาย
000 0 คำตอบถูกต้อง
000 1 parity check ใหม่ผิด
xxx 1 parity checks เดิมทำงาน
xxx 0 ต้องเป็น double error

สรุป: A single error correcting plus double error detecting code is often a good balance. Of course, the redundancy in the short message of four bits, with now four bits of check, is bad, but the number of parity bits rises roughly like the log of the message length. Too long a message and you risk a double uncorrectable error (which in a single error correcting code you will “correct” into a third error), too short a message and the cost in redundancy is too high. Again, an engineering judgment depending on the particular situation.

จากเรขาคณิตเชิงวิเคราะห์ คุณเรียนรู้คุณค่าของการใช้มุมมองเชิงพีชคณิตและเชิงเรขาคณิต ตัวแทนของสตริงของบิตที่เหมาะสมคือการใช้ลูกบาศก์ n มิติ โดยแต่ละสตริงเป็นจุดยอดของลูกบาศก์ เมื่อมองภาพนี้และสังเกตว่า ข้อผิดพลาดหนึ่งตำแหน่งจะเคลื่อนข้อความไปตามขอบหนึ่ง ข้อผิดพลาดสองตำแหน่งตามสองขอบ ฯลฯ ผมค่อยๆ ตระหนักว่าต้องทำงานในปริภูมิของ L_1 ระยะระหว่างสัญลักษณ์คือจำนวนตำแหน่งที่พวกมันต่างกัน ดังนั้นเราจึงมี _metric ในปริภูมิ และมันสอดคล้องกับเงื่อนไขมาตรฐานสี่ข้อสำหรับระยะทาง (ดูบทที่ 10 ซึ่งระบุว่าเป็นระยะมาตรฐาน _L_1):

  1. D(x, y) ≥ 0 (ความไม่เป็นลบ),
  2. D(x, y) = 0 ถ้าและเฉพาะเมื่อ x = y (เอกลักษณ์),
  3. D(x, y) = D(y, x) (สมมาตร),
  4. D(x, y) + D(y, z) ≥ D(x, z) (อสมการสามเหลี่ยม).

ดังนั้นผมต้องเอาใจใส่อย่างจริงจังในสิ่งที่เรียนรู้ในฐานะนามธรรมของฟังก์ชันระยะทางแบบพีทาโกรัส

เมื่อมีระยะแล้ว เรากำหนดทรงกลมเป็นจุดทั้งหมด (จุดยอด เพราะนั่นแหละที่มีในปริภูมิของจุดยอด) ที่มีระยะคงที่จากจุดศูนย์กลาง ตัวอย่าง ในลูกบาศก์สามมิติที่วาดได้ง่าย Figure 12.3 จุด (0,0,1), (0,1,0) และ (1,0,0) อยู่ห่างหนึ่งหน่วยจาก (0,0,0) ขณะที่จุด (1,1,0), (1,0,1) และ (0,1,1) อยู่ห่างสองหน่วย และสุดท้ายจุด (1,1,1) อยู่ห่างสามหน่วยจากจุดกำเนิด

Figure 12.3—Cube (ลูกบาศก์)

ตอนนี้ขยายไปยัง n มิติ และวาดทรงกลมรัศมีหนึ่งหน่วยรอบแต่ละจุดและ suppose ว่าทรงกลมเหล่านี้ไม่ทับกัน ชัดเจนว่าถ้าศูนย์กลางของทรงกลมเหล่านี้คือ code points และมีเพียงจุดเหล่านั้น เมื่อรับข้อความ ข้อผิดพลาดเดี่ยวจะทำให้ได้จุดที่ไม่ใช่ code point และคุณจะรู้ว่าข้อผิดพลาดมาจากจุดใด; มันจะอยู่ในทรงกลมรอบจุดที่ผมส่งให้ หรือเทียบเท่าในทรงกลมรัศมี 1 รอบจุดที่คุณได้รับ ดังนั้นเราจึงมี error-correcting code ระยะขั้นต่ำระหว่าง code points คือ 3 หากเราใช้ทรงกลมไม่ทับกันรัศมี 2 ก็สามารถแก้ double error ได้ เพราะจุดที่รับจะใกล้กับ code point ดั้งเดิมมากกว่าจุดอื่นๆ; การแก้ double error ต้องมี minimum distance เท่ากับ 5 ตารางต่อไปแสดงความเท่าเทียมระหว่าง minimum distance กับความสามารถในการแก้ข้อผิดพลาด

Min. distance (ระยะขั้นต่ำ) Meaning (ความหมาย)
1 unique decoding (การถอดรหัสเฉพาะ)
2 single error detecting (การตรวจจับข้อผิดพลาดเดี่ยว)
3 single error correcting (การแก้ไขข้อผิดพลาดเดี่ยว)
4 1 error correct and 2 error detect (แก้ไข 1 ข้อผิดพลาด และตรวจจับ 2 ข้อผิดพลาด)
5 double error correcting (การแก้ไขข้อผิดพลาดสองตำแหน่ง)
2k+1 k error correction (การแก้ไข k ข้อผิดพลาด)
2k+2 k error correction and k + 1 error detection (การแก้ไข k ข้อผิดพลาด และการตรวจจับ k + 1 ข้อผิดพลาด)

ดังนั้นการหาข้อความโค้ด (error-correcting code) ก็คือการหาชุดของ code points ในปริภูมิ n มิติที่มีระยะขั้นต่ำตามที่ต้องการระหว่างข้อความที่เป็นอมรับได้ เพราะเงื่อนไขข้างต้นทั้งจำเป็นและเพียงพอ นอกจากนี้ชัดเจนว่าสามารถแลกการแก้ไขข้อผิดพลาดบางอย่างเป็นการตรวจจับเพิ่มเติมได้ ยอมสละการแก้ไขหนึ่งข้อแลกกับการได้การตรวจจับเพิ่มขึ้นสองข้อ

ผมเคยแสดงวิธีออกแบบโค้ดให้เป็นไปตามเงื่อนไขในกรณีที่ minimum distance เป็น 1, 2, 3 หรือ 4 โค้ดสำหรับระยะขั้นต่ำสูงกว่านั้นหายากกว่าและเราจะไม่ลงลึกในด้านนั้น การให้ขอบบนว่ารหัสที่มีระยะสูงจะมีขนาดใหญ่ได้แค่ไหนเป็นเรื่องง่าย จำนวนจุดในทรงกลมรัศมี k คือ

โดยที่ C(n,k) เป็นสัมประสิทธิ์ทวินาม (binomial coefficient).

สรุป: Hence if we divide the size of the volume of the whole space, 2n, by the volume of a sphere, then the quotient is an upper bound on the number of non-overlapping spheres, code points, in the corresponding space. To get an extra error detection we simply, as before, add an overall parity check, thus increasing the minimum distance from 2k + 1 to 2k + 2 (since any two points at the minimum distance will have the overall parity check set differently, thus increasing the minimum distance by 1).

สรุปจุดที่เรามาถึง เราเห็นว่าโดยการออกแบบโค้ดที่เหมาะสมเราสามารถสร้างระบบจากชิ้นส่วนที่ไม่น่าเชื่อถือให้เป็นเครื่องที่เชื่อถือได้มากขึ้น และเห็นว่าต้องจ่ายเท่าไรในด้านอุปกรณ์ แม้ว่าเรายังไม่ได้พิจารณาต้นทุนด้านความเร็วในการคำนวณเมื่อต้องฝังการแก้ไขข้อผิดพลาดไว้ในคอมพิวเตอร์ แต่ผมเคยเน้นถึงประโยชน์อีกอย่างคือการบำรุงรักษาในภาคสนาม และผมอยากพูดถึงเรื่องนี้ซ้ำๆ ยิ่งอุปกรณ์ซับซ้อนขึ้น — ซึ่งแน่นอนเราอยู่ในทิศทางนั้น — การบำรุงรักษาในภาคสนามยิ่งสำคัญ และ error-correcting codes ไม่เพียงช่วยให้ในภาคสนามอุปกรณ์น่าจะให้คำตอบที่ถูกต้อง แต่ยังช่วยให้ช่างระดับพื้นสามารถบำรุงรักษาได้สำเร็จ

การใช้ error-detecting และ error-correcting codes เพิ่มขึ้นอย่างต่อเนื่อง ในการส่งข้อความจากยานอวกาศที่เราไปส่งยังดาวเคราะห์นอกวงโคจร เรามักมีพลังงานเพียง 20 วัตต์หรือน้อยกว่า (อาจเหลือเพียง 5 วัตต์) และต้องใช้โค้ดที่แก้ไขร้อยๆ ข้อผิดพลาดในบล็อกข้อความเดียว — การแก้ไขทำที่นี่บนโลก เมื่คุณไม่สามารถเอาชนะสัญญาณรบกวนได้ เช่นในกรณีข้างต้น หรือในกรณี 'deliberate jamming' โค้ดเหล่านี้เป็นคำตอบเดียวที่รู้จัก

ปลายฤดูร้อนปี 1961 ผมขับรถข้ามประเทศจากช่วง sabbatical ที่ Stanford, California ไป Bell Telephone Laboratories ใน New Jersey และผมได้แวะที่ Morris, Illinois ซึ่งบริษัทโทรศัพท์กำลังติดตั้ง electronic central office แห่งแรกที่ไม่ใช่การทดลอง ผมรู้ว่าพวกเขาใช้ Hamming codes อย่างกว้างขวาง และแน่นอนว่าผมได้รับการต้อนรับ พวกเขาบอกว่าการติดตั้งภาคสนามครั้งนี้เป็นไปอย่างราบรื่นที่สุดเท่าที่เคยมีมา ผมคิดกับตัวเองว่า “แน่นอน นั่นคือสิ่งที่ผมเทศนามาตลอดสิบปี” เมื่อระหว่างการติดตั้งครั้งแรก เมื่อยูนิตใดถูกตั้งและทำงานได้ถูกต้อง (ซึ่งคุณพอจะรู้เพราะคุณสมบัติ self-checking และ correcting) แล้วคุณหันไปทำส่วนถัดไป หากยูนิตที่ละเลยเกิดปัญหา มันจะบอกคุณ! ความง่ายของการติดตั้งเริ่มต้นและการบำรุงรักษาต่อมาถูกพิสูจน์ต่อหน้าต่อตาพวกเขา ผมขอย้ำว่า error correction ไม่เพียงให้คำตอบที่ถูกต้องระหว่างการทำงาน แต่ด้วยการออกแบบที่เหมาะสมยังช่วยอย่างมากในการติดตั้งภาคสนามและการบำรุงรักษา; ยิ่งอุปกรณ์ซับซ้อนมากขึ้น ทั้งสองเรื่องนี้ยิ่งจำเป็น

ตอนนี้ผมจะหันไปยังส่วนอื่นของบท ผมได้เล่าอย่างละเอียดว่าผมเผชิญอะไรในแต่ละขั้นตอนของการค้นพบ error-correcting codes และผมทำอะไรบ้าง ผมทำเพราะสองเหตุผล ประการแรก ผมอยากซื่อสัตย์กับคุณและแสดงให้เห็นว่ามันง่ายเพียงใด หากคุณปฏิบัติตามกฎของ Pasteur ที่ว่า 'โชคเข้าข้างคนที่เตรียมพร้อม' การเตรียมตัวทำให้คุณมีโอกาสสำเร็จ ใช่ มีองค์ประกอบของโชคในการค้นพบ แต่ก็มีคนอื่นอีกมากในสถานการณ์คล้ายกันที่ไม่ได้ทำ ทำไมถึงเป็นผม? แน่นอนโชค แต่ผมก็เตรียมตัวโดยพยายามเข้าใจสิ่งที่เกิดขึ้น—มากกว่าคนรอบข้างที่เพียงตอบสนองต่อสิ่งที่เกิดขึ้นโดยไม่คิดลึกถึงเบื้องหลัง

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

สรุป: Of course, as you go through life you do not know what you are preparing yourself for—only you want to do significant things and not spend the whole of your life being a “janitor of science,” or whatever your profession is. Of course luck plays a prominent role. But so far as I can see, life presents you with many, many opportunities for doing great things (define them as you will) and the prepared person usually hits one or more successes, and the unprepared person will miss almost every time.

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

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

ผมได้บอกและแสดงให้เห็นวิธีเป็นคนยิ่งใหญ่แล้ว; ตอนนี้คุณไม่มีข้อแก้ตัวที่จะไม่ทำ