Câu chuyện cổ điển từ Usenet, về một chương trình Mozart thực sự.
Lập trình viên thực tế viết trong Fortran.
Có thể họ làm gì bây giờ, trong suy đồi thời kỳ này của bia Lite, máy tính cầm tay và phần mềm "thân thiện", nhưng trở lại trong Cựu Ngày Tốt, khi thuật ngữ "phần mềm" nghe có vẻ hài hước và Real Máy tính được làm bằng trống và ống chân không, các lập trình viên thực sự đã viết trong mã máy. Không phải Fortran. Không phải RATFOR. Không, ngay cả, ngôn ngữ lắp ráp. Mã máy. Số liệu thô, chưa được trang trí, số thập lục phân không thể sửa được. Trực tiếp.
Kẻo một thế hệ hoàn toàn mới của lập trình viên lớn lên trong sự thiếu hiểu biết của quá khứ huy hoàng này, tôi cảm thấy bổn phận để mô tả, như tốt nhất mà tôi có thể thông qua sự chênh lệch thế hệ, làm thế nào một Programmer Bất viết mã. Tôi sẽ gọi anh ấy là Mel, bởi vì đó là tên anh ấy.
Lần đầu tiên tôi gặp Mel khi tôi đi làm cho Royal McBee Computer Corp., công ty con hiện tại không còn tồn tại của công ty máy đánh chữ . Công ty sản xuất LGP-30, nhỏ, giá rẻ (theo tiêu chuẩn trong ngày) máy tính bộ nhớ trống và chỉ có bắt đầu sản xuất RPC-4000, được cải thiện nhiều, lớn hơn, tốt hơn, nhanh hơn - máy tính bộ nhớ trống. Lõi chi phí quá nhiều, và không phải ở đây để ở lại, anyway.(Đó là lý do tại sao bạn chưa nghe của công ty, hoặc máy tính.)
tôi đã được thuê để viết một biên dịch Fortran cho kỳ diệu mới này và Mel là hướng dẫn của tôi để điều kỳ diệu của nó. Mel không phê duyệt các trình biên dịch.
"Nếu chương trình không thể viết lại mã số riêng của mình", anh hỏi, "điều gì là tốt?"
Mel đã viết, theo hệ thập lục phân, là chương trình máy tính phổ biến nhất là công ty sở hữu . Nó chạy trên LGP-30 và chơi blackjack với khách hàng tiềm năng tại các chương trình máy tính. Hiệu ứng của nó luôn ấn tượng. Gian hàng LGP-30 được đóng gói ở mọi chương trình và nhân viên bán hàng của IBM đứng xung quanh nói chuyện với nhau. Có hay không máy tính bán thực sự này là một câu hỏi chúng tôi chưa bao giờ thảo luận.
Công việc của Mel là viết lại chương trình blackjack cho RPC-4000. (Port? Điều đó có nghĩa là gì?) Máy tính mới có địa chỉ , trong đó mỗi máy hướng dẫn, ngoài mã hoạt động và địa chỉ của toán hạng cần thiết, có địa chỉ thứ hai chỉ ra ở đâu, trên trống quay , lệnh tiếp theo là . Theo cách nói hiện đại, mỗi hướng dẫn duy nhất được theo sau bởi GO TO! Đặt rằng trong ống Pascal và hút thuốc.
Mel yêu RPC-4000 vì ông thể tối ưu hóa code của mình: đó là, xác định vị trí hướng dẫn trên trống để mà chỉ là một kết thúc công việc của mình, các tiếp theo sẽ chỉ đến vào "đọc đầu "và có sẵn cho thực hiện ngay lập tức. Có một chương trình để thực hiện công việc đó, một "trình tối ưu hóa ", nhưng Mel từ chối sử dụng nó.
"Bạn không bao giờ biết nơi nó sẽ đặt mọi thứ", ông giải thích, "vì vậy bạn muốn phải sử dụng các hằng số riêng biệt".
Đã lâu rồi tôi mới hiểu được nhận xét đó. Vì Mel biết giá trị số của mọi hoạt động mã và được gán cho chính trống của mình địa chỉ, mọi hướng dẫn ông viết cũng có thể được coi là hằng số không đổi. Anh ta có thể nhận một hướng dẫn "thêm" trước đó "thêm", giả sử và nhân bởi nó, nếu nó có giá trị số đúng. Mã của anh ta không dễ dàng đối với một người khác để sửa đổi .
Tôi đã so sánh các chương trình được tối ưu hóa của Mel với cùng một mã được thực hiện bởi chương trình lắp ráp tối ưu hóa, và Mel luôn chạy nhanh hơn. Đó là vì phương pháp "từ trên xuống" của thiết kế chương trình chưa được phát minh , và Mel sẽ không sử dụng nó .Ông đã viết các phần bên trong nhất của vòng lặp chương trình của mình đầu tiên, vì vậy họ sẽ nhận được lựa chọn đầu tiên của các địa chỉ tối ưu địa chỉ trên trống. Bộ kết hợp tối ưu hóa không thông minh đủ để thực hiện theo cách đó.
Không bao giờ viết các vòng lặp thời gian trễ, , ngay cả khi balky Flexowriter yêu cầu sự chậm trễ giữa các ký tự đầu ra để hoạt động bình thường. Ông hướng dẫn chỉ nằm trên trống vì vậy mỗi người liên tiếp chỉ là qua đầu đọc khi cần; trống phải thực hiện một cuộc cách mạng hoàn chỉnh khác để tìm hướng dẫn tiếp theo. Anh ta đã đặt ra một thuật ngữ không thể nào quên cho quy trình này là . Mặc dù "tối ưu" là cụm từ tuyệt đối , như "duy nhất", nó trở thành phổ biến thực hành bằng lời nói để làm cho nó tương đối: "không hoàn toàn tối ưu" hoặc "ít tối ưu" hoặc "không tối ưu". Mel gọi là các vị trí trễ tối đa tối đa "tối đa điểm tối thiểu".
Sau khi hoàn thành chương trình blackjack và đã nhận nó để chạy, ("Ngay cả những initializer được tối ưu hóa", ông nói tự hào), ông nhận được một yêu cầu thay đổi từ bộ phận bán hàng. Chương trình đã sử dụng số ngẫu nhiên (tối ưu) ngẫu nhiên thanh lịch để phát ngẫu nhiên "thẻ" và giao dịch từ "tầng" và một số người bán hàng cảm thấy quá công bằng, vì đôi khi khách hàng bị mất. Họ muốn Mel sửa đổi chương trình, ở cài đặt công tắc cảm ứng trên bảng điều khiển, họ có thể thay đổi tỷ lệ cược và để khách hàng giành chiến thắng.
Mel balked. Ông cảm thấy điều này là một cách rõ ràng không trung thực, và nó là đặt trên tính toàn vẹn cá nhân của ông là một lập trình viên, mà nó đã làm, vì vậy ông từ chối làm điều đó. Trưởng phòng bán hàng số đã nói chuyện với Mel, cũng như ông chủ Big và, theo sự thúc giục của ông chủ, một số ít các biên tập viên . Mel cuối cùng đã cho trong và đã viết mã, nhưng ông đã kiểm tra ngược lại, và, khi cảm giác chuyển đổi được bật, chương trình sẽ ăn gian, chiến thắng mọi lúc. Mel đã rất vui mừng vì điều này, tuyên bố rằng tiềm thức của mình là không thể kiểm soát được đạo đức và kiên quyết từ chối sửa chữa nó.
Sau Mel đã rời công ty cho xanh pa $ ture $, Big Boss hỏi tôi nhìn vào mã và xem nếu tôi có thể tìm được kiểm tra và đảo ngược nó. Hơi miễn cưỡng, tôi đã đồng ý với giao diện . Theo dõi mã của Mel là một cuộc phiêu lưu thực sự .
Tôi thường cảm thấy rằng lập trình là một hình thức nghệ thuật, có giá trị thực chỉ có thể được đánh giá cao bởi một câu hỏi khác trong cùng một nghệ thuật phức tạp; có những viên đá quý xinh xắn và những chiếc coupe rực rỡ ẩn từ quan điểm và sự ngưỡng mộ của con người, đôi khi mãi mãi, bởi chính bản chất của quy trình . Bạn có thể tìm hiểu rất nhiều về cá nhân chỉ bằng cách đọc qua mã của mình, ngay cả trong hệ thập lục phân. Mel là, tôi nghĩ, một thiên tài vô danh.
Có lẽ cú sốc lớn nhất của tôi là khi tôi tìm thấy vòng lặp vô tội không có kiểm tra trong đó. Không kiểm tra. Không có. Cảm giác thường gặp cho biết nó phải là một vòng khép kín, nơi chương trình sẽ tròn, mãi mãi, không ngừng. Tuy nhiên, kiểm soát chương trình được truyền qua phải, và an toàn ở phía bên kia. Tôi mất hai tuần để tìm ra.
Máy tính RPC-4000 có thực sự là cơ sở hiện đại được gọi là chỉ mục đăng ký. Nó cho phép các lập trình viên để viết một vòng lặp chương trình sử dụng một hướng dẫn lập chỉ mục bên trong; mỗi lần thông qua, số trong chỉ mục đăng ký đã được thêm vào địa chỉ của hướng dẫn đó, vì vậy nó sẽ tham chiếu đến mốc tiếp theo trong một chuỗi. Anh ta chỉ có để tăng thanh ghi chỉ số mỗi lần. Mel không bao giờ sử dụng nó.
Thay vào đó, anh ta sẽ kéo chỉ dẫn vào sổ đăng ký máy, thêm một đến địa chỉ của nó và lưu trữ lại. Sau đó, ông sẽ thực hiện lệnh sửa đổi ngay từ sổ đăng ký. Vòng lặp đã được viết để thời gian thực hiện bổ sung này được thực hiện vào tài khoản - chỉ cần hướng dẫn này hoàn thành, bước tiếp theo là ngay dưới đầu đọc của trống, sẵn sàng để sử dụng. Nhưng vòng lặp không có kiểm tra trong đó.
Các đầu mối quan trọng đến khi tôi nhận thấy các bit đăng ký chỉ mục, các bit mà lay giữa địa chỉ và mã số hoạt động trong từ hướng dẫn, là quay on-- chưa Mel bao giờ sử dụng thanh ghi index, để nó không bằng tất cả thời gian. Khi ánh sáng chiếu vào nó gần như làm tôi bị mù.
Ông đã đặt các dữ liệu ông đã làm việc về gần phía trên cùng của bộ nhớ - địa điểm lớn nhất các hướng dẫn có thể giải quyết - vì vậy, sau khi cột mốc cuối cùng đã được xử lý, incrementing địa chỉ hướng dẫn sẽ làm cho nó tràn. Việc thực hiện sẽ thêm một đến mã hoạt động, thay đổi mã này thành mã tiếp theo trong tập lệnh: a hướng dẫn nhảy. Chắc chắn rằng, hướng dẫn chương trình tiếp theo là ở địa chỉ vị trí 0 và chương trình đã vui vẻ trên đường đi.
tôi đã không giữ liên lạc với Mel, vì vậy tôi không biết nếu ông đã từng đưa vào lũ của sự thay đổi đó đã rửa qua kỹ thuật lập trình từ những ngày dài biến mất. Tôi thích nghĩ rằng anh ta thì không. Trong mọi trường hợp, tôi đã rất ấn tượng với số đủ để tôi bỏ qua bài kiểm tra vi phạm , nói với Big Boss I không thể tìm thấy nó. Anh ta dường như không bị ngạc nhiên.
Khi tôi rời công ty, chương trình blackjack sẽ vẫn ăn gian nếu bạn bật công tắc cảm nhận đúng và Tôi nghĩ đó là cách thực hiện. Tôi không cảm thấy thoải mái khi hack mã của một Lập trình viên thực sự.
Tương tự không tốt. Dijkstra không bao giờ ủng hộ việc tìm ra tất cả trong đầu _. Ông ủng hộ xây dựng các chương trình bằng cách sử dụng các phương thức chính thức (đáng tin cậy, vì logic đã được hiểu rõ và sẽ luôn giống nhau) thay vì phương thức "đầu tiên, kiểm tra sau" mà chúng ta thường thấy trong ngành. Chỉ sau khi một chương trình đã được chính thức chứng minh để đáp ứng một yêu cầu, thì nó nên được lập trình. Bằng cách đó, những sai lầm và "lặp đi lặp lại" được giới hạn trong bài báo, không bao giờ thực sự được thực hiện. – pyon
@Eduardo: Cảm ơn và đã cập nhật. – hlfcoding