Phát minh vĩ đại nhất trong ngành khoa học máy tính

Bài viết được dịch từ blog Coding Horror

Theo bạn thì phát minh vĩ đại nhất trong ngành khoa học máy tính là gì? Ý tôi là ngoài bản thân máy tính ra.

Trước khi đọc tiếp, bạn hãy tạm dừng một lúc và ngồi suy nghĩ nghiêm túc về câu hỏi đó.

Phát minh vĩ đại nhất trong ngành khoa học máy tínhPhát minh vĩ đại nhất trong ngành khoa học máy tính là gì?


Trước đây tôi đã nói về việc một ngôn ngữ bao nhiêu tuổi thì thực sự được gọi là ngôn ngữ lập trình hiện đại, và tôi xin trích lại trong ngữ cảnh bài viết này.

Ngôn ngữ C thì đại khái là bằng tuổi tôi; FORTRAN có số tuổi nhiều như bố mẹ tôi. Thế còn về những “lính mới” trong danh sách trên thì sao? Ở đây trang web khảo sát về chỉ số TCPI của TIOBE software đã cung cấp cho ta một số dữ liệu về mức độ phổ biến của các ngôn ngữ lập trình kể từ những năm 2001. Bạn hãy để ý chi tiết đến tuổi của những ngôn ngữ lập trình mới nhất và “hot” nhất như sau:

Ngôn ngữ Ruby thì mới bước vào tuổi teen. Còn JavaScript thì vẫn chưa bước vào tuổi dậy thì nữa.

Trong tất cả mọi sự bàn luận của chúng ta về các tính năng ngôn ngữ lập trình mới lạ, đôi khi tôi nghĩ rằng chúng ta quên mất một khối xây dựng cơ bản làm nền tảng phía dưới tất cả chúng: đó chính là thủ tục (routine). Xuất phát từ quan điểm của tác giả nổi tiếng Steve McConnell, người đã thúc giục chúng ta nên sử dụng thủ tục, và sử dụng thường xuyên:

Bên cạnh việc phát minh ra máy tính, thủ tục (routine) được cho là phát minh vĩ đại nhất trong khoa học máy tính. Nó làm cho chương trình dễ đọc và dễ hiểu hơn. Nó làm cho chúng trở nên nhỏ hơn (hãy tưởng tượng code của bạn sẽ cồng kềnh như thế nào nếu bạn phải viết lặp lại phần code cho mỗi lời gọi thủ tục). Và nó khiến chúng nhanh hơn (hãy tưởng tượng vệc cải thiện hiệu suất sẽ khó khăn như thế nào nếu bạn phải đi sửa từng đoạn code tương tự nhau ở hàng chục nơi, thay vì chỉ cần chỉnh sửa ở một thủ tục duy nhất). Nói đúng ra, chính các thủ tục (routine) đã tạo ra lập trình hiện đại.

Nếu bạn chưa đủ lớn tuổi để nhớ về cuộc sống của lập trình viên trước khi có thủ tục, thì tôi nghĩ rằng James Shore đã có một ví dụ tuyệt vời về sự khác biệt rõ rệt trong bài viết xuất sắc của mình có tên là Quality With a Name:

Trước khi lập trình có cấu trúc:

1000 NS% = (80 - LEN(T$)) / 2
1010 S$ = ""
1020 IF NS% = 0 GOTO 1060
1030 S$ = S$ + " "
1040 NS% = NS% - 1
1050 GOTO 1020
1060 PRINT S$ + T$
1070 RETURN

Sau khi lập trình có cấu trúc:

Phát minh vĩ đại nhất trong ngành khoa học máy tínhNhững thủ tục (routine) nhỏ bé này chính là xương sống của tất cả lập trình trong bất kỳ ngôn ngữ hiện đại nào. Tôi chắc chắn rằng bạn thuộc tuýp lập trình viên hiện đại, vì vậy tôi sẽ không làm bạn cảm thấy chán với một lời giải thích dài dòng về việc tại sao thủ tục là một ý tưởng rất tốt. Bài viết gốc vào năm 1998 IEEE McConnell cung cấp nhiều lý do cơ bản về tại sao thủ tục là rất quan trọng. Ngoài ra còn có một phiên bản mở rộng của bài viết này trong Chương 7 của cuốn sách kinh điển Code Complete 2.

Thủ tục là nền tảng của lập trình hiện nay nhưng điều đó cơ bản là vô hình. Vấn đề đối với thủ tục đó là: chúng chỉ mất một phút để học, nhưng cần cả cuộc đời mới có thể tinh thông nó. Bạn phải đánh vật với bản chất của một thủ tục, và phải xem xét các tiêu chí như:

  • Thủ tục nên có độ dài như thế nào? Như thế nào gọi là quá dài? Như thế nào gọi là quá ngắn? Khi nào thì code “quá đơn giản” để viết thành một thủ tục?
  • Những tham số nào cần đưa vào thủ tục? Nên sử dụng những cấu trúc dữ liệu hoặc kiểu dữ liệu nào? Theo thứ tự nào? Chúng sẽ được sử dụng như thế nào? Cái nào sẽ được sửa đổi vào kết quả của thủ tục đó?
  • Đâu là một cái tên tốt cho thủ tục? Cách đặt tên cho thủ tục là rất khó. Thực sự khó khăn.
  • Thủ tục này liên quan đến những thủ tục tương tự khác như thế nào? Liệu chúng có xảy ra cùng một lúc, hoặc cùng một thứ tự? Chúng có chia sẻ dữ liệu dùng chung hay không? Chúng có thực sự luôn đi cùng với nhau? Chúng nên được sắp xếp theo trật tự nào?
  • Làm thế nào để tôi có thể biết liệu code trong thủ tục này sẽ thành công? Liệu nó sẽ trả về thành công hay mã lỗi? Những trường hợp ngoại lệ, các vấn đề, và các điều kiện lỗi sẽ được xử lý như thế nào?
  • Thủ tục này thậm chí có nên tồn tại hay không?

Những lập trình viên giỏi — bất kể họ đang làm việc trên ngôn ngữ lập trình nào — cũng hiểu được tầm quan trọng của việc tinh chỉnh các thủ tục với sự chăm sóc tối đa. Các thủ tục trong code của bạn nên được đối xử như những viên kim cương nhỏ bé và có độ bóng cao, mỗi thủ tục đều được đánh bóng sao cho sắc sảo và nhẵn mịn hơn so với trước.

Tôi xin nói với bạn rằng đây không phải là một cái nhìn đặc biệt sâu sắc. Nó thậm chí cũng không phải là một lời khuyên. Nhưng nếu bạn có niềm tin, giống như tôi, trong việc liên tục thực hành các nguyên tắc cơ bản, bạn sẽ chẳng bao giờ ngừng việc luyện cho mình kỹ năng viết ra những thủ tục hoàn hảo.

Dù gì, sau tất cả, nó là phát minh vĩ đại nhất trong ngành khoa học máy tính của chúng ta.

Các bài viết liên quan:

Về tác giả bài viết:

Jeff_atwood_coding_horrorJeff Atwood là một chuyên gia công nghệ tại Mỹ, hiện đang sinh sống và làm việc tại Berkeley, CA. Anh là một kỹ sư phần mềm chuyên về công nghệ Microsoft .NET, và là một blogger nổi tiếng trong cộng đồng công nghệ với blog Coding Horror, anh là người sáng lập và kiêm Giám đốc điều hành (CEO) của trang web hỏi đáp uy tín Stack Overflow và cũng là đồng sáng lập của Stack ExchangeDiscourse.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s