Tôi đã đọc bài viết trên Wikipedia về Douglas McIlroy và tìm thấy một trích dẫn đề cập đến
"Người hùng thực sự của lập trình là người viết mã tiêu cực."
Điều đó nghĩa là gì?
Tôi đã đọc bài viết trên Wikipedia về Douglas McIlroy và tìm thấy một trích dẫn đề cập đến
"Người hùng thực sự của lập trình là người viết mã tiêu cực."
Điều đó nghĩa là gì?
Câu trả lời:
Nó có nghĩa là giảm các dòng mã, bằng cách loại bỏ các dư thừa hoặc sử dụng các cấu trúc ngắn gọn hơn.
Xem ví dụ giai thoại nổi tiếng này từ nhóm nhà phát triển Apple Lisa ban đầu:
Khi nhóm Lisa đang cố gắng hoàn thiện phần mềm của họ vào năm 1982, các nhà quản lý dự án bắt đầu yêu cầu các lập trình viên gửi các biểu mẫu hàng tuần báo cáo về số lượng dòng mã họ đã viết. Bill Atkinson nghĩ rằng đó là ngớ ngẩn. Trong tuần mà anh ấy đã viết lại các thói quen tính toán vùng của QuickDraw để nhanh hơn sáu lần và ngắn hơn 2000 dòng, anh ấy đã đặt "-2000" vào biểu mẫu. Sau một vài tuần nữa, các nhà quản lý đã ngừng yêu cầu anh ta điền vào mẫu đơn, và anh ta vui vẻ tuân thủ.
Có một câu trích dẫn của Bill Gates dọc theo các dòng đo năng suất của lập trình viên theo các dòng mã giống như đo lường tiến độ chế tạo máy bay theo trọng lượng.
Tôi muốn nói thêm rằng số liệu LỘC đã khuyến khích sử dụng các ngôn ngữ quá dài và cố tình phát minh lại bánh xe để đáp ứng hạn ngạch.
Khi tôi học cấp ba - và vâng, chúng tôi đã có máy tính từ những năm 70, mặc dù chúng tôi phải làm cho chúng ra khỏi da động vật bằng dao đá - một trong những giáo viên toán đã tổ chức một cuộc thi lập trình. Các quy tắc là chương trình chiến thắng sẽ là chương trình tạo ra đầu ra chính xác và có sản phẩm nhỏ nhất về dòng thời gian chạy mã. Nghĩa là, nếu chương trình của bạn mất, hãy nói 100 dòng mã và chạy trong 5 giây, điểm của bạn là 500. Nếu người khác viết 90 dòng mã và chạy trong 6 giây, điểm của anh ta là 540. Điểm thấp sẽ thắng, như golf.
Nó đánh tôi như một hệ thống tính điểm tuyệt vời, bổ ích cho cả sự đồng nhất và hiệu suất.
Nhưng mục nhập về mặt kỹ thuật đáp ứng các tiêu chí chiến thắng đã bị loại. Vấn đề là in một danh sách tất cả các số nguyên tố nhỏ hơn 100. Mục không đủ tiêu chuẩn đã diễn ra như thế này (hầu hết các sinh viên đã sử dụng BASIC trước đó):
100 print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,"
110 print "67, 71, 73, 79, 83, 87, 89, 91, 97"
Học sinh đã viết bài viết đó chỉ ra rằng nó không chỉ ngắn và rất hiệu quả, mà thuật toán nên rõ ràng đối với bất kỳ ai có kiến thức lập trình tối thiểu, làm cho chương trình có khả năng duy trì cao.
Đó là miệng lưỡi. Nếu bạn phải trả $ N cho mỗi dòng mã hóa trung bình, thì mã hóa "dòng âm" chắc chắn là người chiến thắng.
Điều này có nghĩa, như lời khuyên thực tế, rằng mã nhỏ hoàn thành công việc, tốt hơn nhiều so với mã lớn làm điều tương tự, tất cả những thứ khác đều bằng nhau.
Viết cùng một chương trình với ít mã hơn là mục tiêu cho tất cả mọi người.
Nếu một chương trình lấy 200 LỘC để mã hóa và tôi viết nó vào năm 150, tôi đã viết -50 LỘC. Vì vậy, tôi đã viết mã tiêu cực.
Câu trả lời của Thilo có lẽ chính xác nhất trong lịch sử, nhưng phép ẩn dụ "mã âm" cũng có thể bao gồm hiệu suất và sử dụng bộ nhớ - những nỗ lực bổ ích để trì hoãn việc thực hiện hoặc phân bổ một cái gì đó cho đến khi thực sự cần thiết.
Tâm lý "chần chừ trả tiền" này đã tạo ra những tiên đề truyền miệng như "Không làm gì luôn nhanh hơn làm gì đó", "Mã nhanh nhất là mã không bao giờ thực thi" và "Nếu bạn có thể tắt nó đủ lâu," bạn có thể không bao giờ phải làm điều đó "(đề cập đến việc trì hoãn các hoạt động đắt tiền cho đến khi thực sự cần thiết)
Một kỹ thuật để hiện thực hóa mã tiêu cực là thách thức các giả định và định nghĩa ban đầu về vấn đề. Nếu bạn có thể xác định lại vấn đề / miền đầu vào sao cho "vấn đề dính # 3" là không thể phân loại được, thì bạn không phải mất thời gian hoặc mã xử lý vấn đề dính # 3. Bạn đã loại bỏ mã bằng cách tối ưu hóa thiết kế.