Phụ lục C: Phát triển chương trình

Trở về Mục lục cuốn sách

C.1  Các chiến lược

Trong cuốn sách tôi đã trình bày những chiến lược khác nhau để phát triển chương trình, bởi vậy giờ đây tôi muốn tập hợp chúng lại. Nến tảng của tất cả chiến lược này cùng là phát triển tăng dần, vốn như sau:

  1. Lấy điểm khởi đầu là chương trình chạy được, chỉ thực hiện một động tác dễ thấy, chẳng hạn in dữ liệu nào đó.
  2. Mỗi lúc chỉ bổ sung thêm một ít dòng lệnh, và cứ thay đổi một lần lại phải kiểm tra chương trình.
  3. Lặp lại công đoạn đến khi chương trình thực hiện được việc dự kiến.

Sau mỗi thay đổi, chương trình phải cho kết quả nhìn thấy được để kiểm tra đoạn mã lệnh mới bổ sung. Cách tiếp cận lập trình như thế này có thể tiết kiệm cho ta nhiều thời gian.

Bởi mỗi lúc bạn chỉ thêm có một vài dòng lệnh, nên rất dễ tìm ra các lỗi cú pháp. Và vì mỗi phiên bản chương trình lại tạo nên kết quả nhìn thấy được, nên bạn liên tục kiểm tra mô hình nhận thức của mình về cách chương trình hoạt động. Nếu mô hình nhận thức bị sai, bạn sẽ đối mặt với mâu thuẫn (và có cơ hội sửa chữa mô hình đó) trước khi viết ra nhiều dòng lệnh sai.

Thử thách của việc phát triển tăng dần là không dễ hình dung ra con đường dẫn từ khởi điểm đến chỗ chương trình hoàn thiện và đún đắn. Để giúp cho điều này, có một vài chiến lược ta có thể chọn lựa:

Đóng gói và khái quát hoá:
Nếu bạn chưa biết cách chia bài toán thành các phương thức, thì hãy viết mã lệnh trong main, rồi tìm những bó lệnh rõ rệt để gói chúng vào một phương thức, rồi khái quát hoá một cách phù hợp.
Lập nguyên mẫu nhanh:
Nếu bạn đã biết cần viết phương thức gì, song chưa biết cách viết nó thế nào, thì hãy bắt tay viết một bản nháp để xử lý trường hợp đơn giản nhất, sau đó thử nó với những trường hợp khác, vừa viết vừa mở rộng và sửa lỗi.
Hướng từ dưới lên:
Bắt đầu bằng việc viết những phương thức đơn giản, rồi ghép chúng lại thành lời giải.
Hướng từ trên xuống:
Dùng giả mã để thiết kế cấu trúc của bài toán rồi nhận diện những phương thức mà bạn cần. Sau đó viết các phương thức rồi thay thế giả mã với mã thật.

Trong quá trình phát triển, bạn có thể cần phải dựng “dàn giáo”. Chẳng hạn, mỗi lớp cần phải có một phương thức toString để cho phép bạn in ra trạng thái của một đối tượng dưới dạng người đọc được. Phương thức này rất có ích cho việc gỡ lỗi, song thường không thuộc về chương trình hoàn thiện.

C.2  Các hình thức thất bại

Nếu bạn đang phải mất quá nhiều thời gian vào việc gỡ lỗi, có thể là do bạn đang dùng một chiến lược phát triển không hiệu quả. Sau đây là những hình thức thất bại mà tôi thường gặp nhất (và cũng đôi khi mắc phải):

Phát triển không tăng dần:
Nếu như bạn đang viết nhiều dòng lệnh cùng lúc mà không biên dịch và chạy thử, thì bạn đang tự chuốc lấy phiền phức. Có lần tôi hỏi một sinh viên xem bài tập làm đến đâu rồi, cậu ta trả lời, “Tuyệt! Em đã viết hết chương trình rồi. Giờ chỉ việc gỡ lỗi thôi.”
Bám chặt lấy mã lệnh sai:
Nếu bạn viết ra nhiều dòng lệnh một lúc mà không biên dịch và kiểm tra chương trình, thì có thể bạn còn không gỡ lỗi được nữa. Đôi khi chiến thuật duy nhất là (than ôi!) xoá đi mã lệnh sai rồi làm lại từ đầu (bằng chiến thuật tăng dần). Nhưng người mới lập trình thường có tình cảm gắn bó với mã lệnh họ viết ra, dù cho mã lệnh này không hoạt động được. Cách duy nhất để thoát khỏi cái bẫy này là phải tàn nhẫn.
Lập trình bước ngẫu nhiên:
Đôi khi tôi hướng dẫn sinh viên mà dường như họ lập trình kiểu ngẫu nhiên. Họ sửa một chỗ trong chương trình, chạy, nhận lấy thông báo lỗi, rồi lại sửa, lại chạy, v.v. Vấn đề là không hề có mối liên hệ rõ ràng nào giữa kết quả chương trình và chỗ sửa đổi đó. Nếu bạn nhận được thông báo lỗi, thì hãy dành thời gian để đọc nó. Tổng quát hơn, hãy dành thời gian suy nghĩ. 
Phó mặc cho trình biên dịch:
Các thông báo lỗi đều có ích, song không phải lúc nào chúng cũng đúng. Chẳng hạn, nếu thông báo ghi là, “Semi-colon expected on line 13,” (thiếu một dấu chấm phẩy ở dòng 13), thì điều này nghĩa là có lỗi cú pháp ở gần dòng 13. Song cách giải quyết không phải lúc nào cũng là điền dấu chấm phẩy vào dòng 13. Đừng phó mặc chương trình của mình cho trình biên dịch. 

Chương tiếp theo sẽ trình bày thêm các gợi ý về cách gỡ lỗi hiệu quả.

1 Phản hồi

Filed under Think Java

One response to “Phụ lục C: Phát triển chương trình

  1. Pingback: Think Java: Cách suy nghĩ như nhà khoa học máy tính | Blog của Chiến

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