Đôi khi bạn nhận brief để lập trình một cái gì đó mà bạn biết. Có thể là một phần của giao diện người dùng mà bạn đã tạo trước đó hoặc một thuật toán mà bạn thuộc lòng và có thể giải quyết trong vài phút. Nhưng thỉnh thoảng, bạn lại phải đối mặt với những vấn đề khó hơn và cần phải viết code để thực hiện các tác vụ mà bạn có thể không hiểu. Đây là những tình huống bạn cần phải suy nghĩ trước khi hành động, nếu không mọi thứ sẽ kết thúc trong một mớ hỗn độn rối ren. Bài viết này nhằm mục đích cung cấp một vài cách tiếp cận sẽ giúp bạn phân tích vấn đề và tìm ra giải pháp chính xác và khả thi về mặt tính toán.

1. Hiểu vấn đề

Nó có vẻ hiển nhiên, nhưng bạn sẽ không thể giải quyết một vấn đề trước khi bạn thực sự hiểu yêu cầu của nó. Bắt đầu bằng cách chia nhỏ vấn đề lớn thành các vấn đề phụ nhỏ hơn. Bạn hãy tự hỏi:

  • Các bước nhỏ hơn mà tôi cần thực hiện để đạt được mục tiêu cuối cùng là gì?

  • Tôi cần thông tin gì để thực hiện các phép tính đó?

  • Tôi có thể đưa ra bất kỳ giả định nào về dữ liệu mà tôi đưa vào hoặc lấy ra từ những tính toán đó không?

Tự hỏi bản thân những câu hỏi như vậy sẽ giúp xác định phần nào của vấn đề mà bạn chưa hiểu và bạn cần bổ sung kiến thức ở đâu. Ví dụ: bạn cần vẽ một đa giác trên màn hình nhưng gặp vấn đề không biết nên đặt nó như thế nào cho chính xác? Bạn có thể cần nghiên cứu cách các công cụ đồ họa dịch, xoay và chia tỷ lệ các hình dạng khác nhau để hiểu rõ và sau đó tiến hành đưa ra giải pháp.

2. Hiểu rõ mục đích của giải pháp

Lý do bạn đang cố gắng giải quyết vấn đề này là gì? Suy nghĩ về điều này sẽ cho phép bạn kết luận làm thế nào bạn có thể đơn giản hóa vấn đề. Có trường hợp nào bạn không cần thiết phải xử lý vì chúng không quan trọng hay không? Kết quả có được chấp nhận nếu đó là một số nguyên, hay bạn cần mức độ chính xác cao hơn? Bạn càng biết nhiều về cách mọi người sử dụng tính toán của bạn, bạn càng có thể loại bỏ được những sự phức tạp không cần thiết.

3. Tìm hiểu thêm về kinh nghiệm của những người khác

Gần như chắc chắn rằng họ đã từng gặp phải vấn đề tương tự trước đây, và nhiều người trong số họ sẽ viết bài hoặc quay video về giải pháp của họ. Những người khác sẽ có bài báo nghiên cứu được xuất bản hoặc bài báo hội nghị về những khám phá về chủ đề này. Điều này có thể giúp ích cho bạn.

Một số người gần đây đã gặp sự cố khi làm việc trên StatKit. Họ cần triển khai một cách tính toán hệ số Kendall’s Tau để thu thập dữ liệu một cách tùy ý. Thuật toán tuy đơn giản nhưng phải mất nhiều thời gian để hoàn thành nếu có nhiều dữ liệu. Họ đã tìm thấy giải pháp của mình trong một ấn phẩm từ năm 1966. Nó có ý nghĩa vì tài nguyên tính toán lúc bấy giờ khan hiếm hơn nhiều, vì vậy các thuật toán buộc phải hiệu quả. Tuy nhiên, đó là một trong những tài liệu họ dự kiến sẽ tham khảo trước khi bắt đầu nghiên cứu.

4. Trực quan hóa vấn đề bằng bút và giấy

Trực quan hóa vấn đề của bạn với một cây bút analog cũ và một tờ giấy có thể là điều tốt nhất bạn có thể làm để giải quyết vấn đề. Trí óc con người xuất sắc trong việc đưa ra các giải pháp sáng tạo, nhưng lại kém nhất trong việc ghi nhớ những khối thông tin lớn. Bằng cách vẽ ra vấn đề của bạn trên một tờ giấy, bạn có thể tập trung vào việc sáng tạo hơn là ghi nhớ những dữ liệu bạn hiện đang làm.

Bạn có thể vẽ thuật toán của mình dưới dạng cấu trúc cây? Thật tuyệt khi có thể kiểm tra lại logic của bạn trong từng bước phải không? Và sẽ thật tuyệt nếu bạn có thể viết ra các kết quả trung gian bên cạnh dữ liệu đầu vào của mình, như vậy bạn sẽ không phải ghi nhớ tất cả khi quá trình của bạn phải cần đến mười bước sau phải không? Việc vẽ các thuật toán của bạn như thế này sẽ cung cấp cho bạn thông tin chi tiết về nơi chúng có thể bị hỏng trong trường hợp bạn sơ suất, không cẩn thận.

5. Tạo một bản thảo

Dành nhiều giờ đồng giải quyết các thuật toán có quá nhiều bộ phận chuyển động sẽ khiến cho việc xác định vị trí bị hỏng trở nên vô cùng khó. Trong những trường hợp như vậy, bạn nên bắt đầu viết các chương trình nhỏ, tạo mẫu từng phần nhỏ và kiểm tra cho đến khi tôi biết chắc rằng chúng sẽ hoạt động. Bằng cách đó, bạn có thể đảm bảo việc nghiên cứu được tiếp tục mà không cần lo lắng liệu sẽ có vấn đề khác gây ra hỏng hóc hay không. Cuối cùng, bạn ghép nối mọi thứ với nhau và kiểm tra mọi thứ một lần nữa

Một ví dụ cụ thể là thuật toán StatKit dựa trên đệ quy, vì một lý do nào đó, hàm luôn trả về kết quả hoàn toàn vô nghĩa mặc dù phép toán đã được kiểm tra lại nhiều lần. Bằng cách tạo nguyên mẫu phần đệ quy, bạn có thể xác định được vị trí mà thuật toán bắt đầu sao chép các mảng thay vì làm việc trên các tham chiếu. Đó là một tính năng trong ngôn ngữ Swift có tên là Copy-On-Write sẽ đánh lừa bạn. Tuy chỉ mất vài dòng để sửa lỗi nhưng sẽ vô cùng khó tìm ra nếu bạn không tập trung quan sát chi tiết tại từng thời điểm.

6. Hãy để các lần test cho bạn biết khi nào bạn đúng

Việc có một người đánh giá trung thực khi phát triển một thuật toán phức tạp thường rất hữu ích. Ai đó sẽ cho bạn biết liệu bạn có đang làm sai hay không và mọi thứ đang diễn ra như thế nào. Đó là lý do vì sao cần thực hiện các thử nghiệm.

Khi phát triển một phần chức năng gặp phải vấn đề, bạn nên bắt đầu bằng cách xác định một phương thức trả về một số giá trị mặc định không hợp lý. Sau đó, hãy viết các bài test cho các phiên bản nhỏ của bài toán. Ví dụ: bạn có thể gửi một mảng input chỉ có ba hoặc bốn số trong đó.

Ý tưởng của việc này là bạn có thể tính toán kết quả mong đợi bằng tay một cách nhanh chóng. Đảm bảo rằng tất cả các thử nghiệm đều thất bại bằng cách chạy chúng trên giá trị mặc định vô nghĩa mà bạn đã chỉ định. Bây giờ, bạn đã sẵn sàng để phát triển thuật toán của mình và bạn sẽ có người bạn tốt nhất (và tồi tệ nhất) để cho bạn biết liệu bạn đã làm đúng hay chưa!

 VietnamWorks inTECH

Theo Jimmy M Andersson