Viết mã vẫn sẽ chạy nhiều năm kể từ bây giờ
Ngôn ngữ lập trình thay đổi. Thư viện thay đổi. Một số mã từ 5, 10 hoặc thậm chí 20 năm trước vẫn có thể chạy và tạo ra kết quả như mong đợi, trong khi một số mã từ 2 năm có thể không thành công với lỗi cú pháp. Điều này là một phần không thể tránh khỏi, vì các ngôn ngữ phát triển (ít nhất, hầu hết làm). Các nhà phát triển có trách nhiệm duy trì mã của họ. Nhưng đôi khi, sự ổn định là một yêu cầu quan trọng trong mã sản xuất và mã chỉ cần chạy trong 10 năm mà không cần ai đó thông qua mã hàng năm để điều chỉnh nó để thay đổi ngôn ngữ. Hoặc tôi có thể có các tập lệnh nhỏ, ví dụ để phân tích dữ liệu khoa học, tôi cần xem lại sau khi không chạm vào chúng trong nhiều năm. Ví dụ, tại các cơ quan khí tượng có rất nhiều mã Fortran hoạt động ngay cả đối với các bộ phận không cần thiết về tốc độ và tính ổn định của mã là một trong những lý do. TÔI' Đã nghe thấy nỗi sợ về sự không ổn định là một trong những đối tượng họ có chống lại việc chuyển sang Python (tất nhiên ngoài quán tính ngôn ngữ; chỉ có thể mã mới không phụ thuộc vào mã cũ). Tất nhiên, một chiến lược cho mã ổn định là đóng băng toàn bộ hệ điều hành. Nhưng điều đó không phải lúc nào cũng khả thi.
Tôi đang sử dụng Python như ví dụ, nhưng vấn đề không chỉ giới hạn ở Python.
Tài liệu về các vấn đề tương thích Python
Trong trường hợp của Python, có một số tài liệu phác thảo chính sách cho các thay đổi không tương thích ngược.
PEP-5
Theo PEP 5 :
Phải có ít nhất một giai đoạn chuyển tiếp một năm giữa việc phát hành phiên bản chuyển tiếp của Python và phát hành phiên bản không tương thích ngược. Người dùng sẽ có ít nhất một năm để kiểm tra các chương trình của họ và di chuyển chúng từ việc sử dụng cấu trúc không dùng nữa sang cấu trúc thay thế.
Cá nhân, tôi cho rằng một năm là khá ngắn. Điều đó có nghĩa là tôi có thể viết một số mã và 1 năm rưỡi nữa nó sẽ không chạy nữa.
PEP 291
PEP 291 chứa một danh sách không đầy đủ các hướng dẫn về những điều nên tránh để duy trì khả năng tương thích ngược. Tuy nhiên, nó chỉ liên quan đến Python 2.x. Vì Python 2.7 là bản phát hành cuối cùng trong loạt 2.x và Python 2.7 chỉ có lỗi, PEP này hiện chỉ được quan tâm trong lịch sử.
PEP 387
Ngoài ra còn có PEP 387 về các thay đổi không tương thích ngược. PEP 387 là một dự thảo và không phải là chính sách chính thức. Vào tháng 6 năm 2009, điều này đã được thảo luận trong danh sách gửi thư ý tưởng Python . Một phần của cuộc thảo luận tập trung vào cách các nhà phát triển có thể viết mã mạnh mẽ chống lại sự thay đổi ngôn ngữ. Một bài viết liệt kê một số lời khuyên về những điều không nên làm :
Cùng với điều này, có một số quy tắc bạn có thể suy ra có lẽ đúng trong hầu hết thời gian: không gọi công cụ bắt đầu bằng
"_"
, không sửa lỗi bất cứ điều gì, không sử dụng thay thế lớp động trên các đối tượng từ các lớp khác ngoài chính bạn , không phụ thuộc vào độ sâu của hệ thống phân cấp thừa kế (ví dụ: không".__bases__[0].__bases__[0]"
), đảm bảo các thử nghiệm của bạn chạy mà không tạo ra bất kỳ Khấu hao nào, hãy chú ý đến xung đột không gian tên tiềm năng khi thêm thuộc tính vào các lớp kế thừa từ các thư viện khác. Tôi không nghĩ rằng tất cả những điều này được viết ra ở một nơi.
Ngoài ra, có một số điểm về "trường mỏ" (tính năng mới có khả năng thay đổi) và "khu vực đóng băng" (API được bán rất nhiều đảm bảo không thay đổi). Trích dẫn Antoine Pitrou :
Tôi nghĩ rằng "khu vực đóng băng" nên được xác định một cách tích cực (API công khai rõ ràng và hành vi được bảo đảm rõ ràng) chứ không phải tiêu cực (một "trường khai thác" rõ ràng). Nếu không, chúng ta sẽ quên đặt một số thứ quan trọng vào bãi mìn và bị cắn sau đó khi chúng ta cần thay đổi những thứ đó theo cách không tương thích ngược.
Dường như không có bất kỳ kết luận nào từ chủ đề này, nhưng nó khá gần với cốt lõi của những gì tôi đang tìm kiếm. Sợi chỉ gần bốn năm tuổi, nên có lẽ tình hình đã thay đổi hoặc được cải thiện. Loại mã nào có khả năng tồn tại và loại mã nào dễ vỡ hơn?
Hướng dẫn chuyển
Ngoài các tài liệu được nêu ở trên, mỗi phiên bản Python đều có một hướng dẫn chuyển : chuyển sang Python 3.2 , chuyển sang Python 3.3 , v.v.
Tương thích hữu ích
PEP 3151 đã giới thiệu cho tôi khái niệm về khả năng tương thích hữu ích . Nói theo cách riêng của tôi, điều này rút ra ý tưởng rằng chỉ khi mã được viết cẩn thận, các nhà phát triển ngôn ngữ cần phải cẩn thận để duy trì khả năng tương thích. Nó không thực sự xác định khả năng tương thích hữu ích , nhưng tôi nghĩ nó tương tự như những ý tưởng tôi đã trích dẫn từ cuộc thảo luận PEP 387 ở trên.
Từ quan điểm của các lập trình viên
Là một lập trình viên, tôi biết rằng Python sẽ thay đổi trong tương lai và mọi người - đặc biệt là bản thân tôi - sẽ cố gắng chạy mã của tôi có lẽ vài năm nữa trong phiên bản Python là một, hai hoặc có thể là ba phiên bản nhỏ trở lên. Không phải mọi thứ đều tương thích, và trên thực tế, thật dễ dàng để đưa ra mã sẽ thất bại (tôi đã từng gặp phải mã nêu rõ if sys.version[:3] != '2.3': print 'Wrong version, exiting'
). Những gì tôi đang tìm kiếm là một bộ hướng dẫn về những gì nên làm và không nên làm để tăng cường khả năng mã của tôi sẽ vẫn không thay đổi trong tương lai.
Có bất kỳ hướng dẫn như vậy? Làm cách nào để viết mã Python vẫn sẽ chạy trong tương lai?
Câu hỏi của tôi liên quan đến cả cốt lõi Python, vào thư viện tiêu chuẩn của nó, mà còn để thường được sử dụng add-on thư viện, đặc biệt là numpy
, scipy
, matplotlib
.
EDIT : Cho đến nay, hai trong số các câu trả lời liên quan đến python2 so với python3. Đây không phải là ý tôi. Tôi biết về các công cụ để di chuyển từ Python2 sang Python3. Câu hỏi của tôi liên quan đến những thay đổi ngôn ngữ chưa đến . Chúng ta có thể làm tốt hơn một quả cầu pha lê trong việc tìm kiếm các hướng dẫn mã hóa ổn định hơn. Ví dụ:
import module
là bằng chứng trong tương lai nhiều hơnfrom module import *
, bởi vì cái sau có thể phá vỡ mã nếumodule
phát triển một hoặc nhiều hàm / lớp mới.Sử dụng các phương pháp không có giấy tờ có thể ít bằng chứng trong tương lai hơn so với sử dụng các phương pháp được lập thành tài liệu, vì một cái gì đó không có giấy tờ có thể là một dấu hiệu của một cái gì đó chưa ổn định.
Đây là loại lời khuyên mã hóa thực tế mà tôi đang theo đuổi. Vì đó là về hiện tại → tương lai, chúng ta có thể giới hạn bản thân mình với Python3, vì Python2 sẽ không thay đổi nữa.