2024.12.14

Khám Phá 4 Mối Quan Hệ Trong Tư Duy Hệ Thống (Phần 1)

System thinking

Tư duy hệ thống là một trong những kỹ năng then chốt trong phát triển phần mềm hiện đại, cùng với Tư duy logic, Tư duy thiết kế,… Bài viết này sẽ giúp bạn hiểu hơn về các mối quan hệ trong tư duy hệ thống, từ đó áp dụng system thinking vào công việc lập trình, từ việc phân tích các mối quan hệ giữa các chức năng trong code đến xây dựng và thiết kế hệ thống.

Tư duy hệ thống là một trong những kỹ năng then chốt trong phát triển phần mềm hiện đại, cùng với Tư duy logic, Tư duy thiết kế,… Bài viết này sẽ giúp bạn hiểu hơn về các mối quan hệ trong tư duy hệ thống, từ đó áp dụng system thinking vào công việc lập trình, từ việc phân tích các mối quan hệ giữa các chức năng trong code đến xây dựng và thiết kế hệ thống.

Tư duy hệ thống là gì?

Trước tiên, chúng ta hãy tìm hiểu: Tư duy hệ thống là gì? Một cách đơn giản, đó là cách nhìn nhận vấn đề một cách tổng thể, nghiên cứu sự tương tác giữa các yếu tố cấu thành hệ thống thay vì tách biệt từng phần riêng lẻ. Nguyên lý chính của tư duy hệ thống là mọi thứ đều có mối liên hệ với nhau, và một sự thay đổi nhỏ ở một nơi có thể dẫn đến ảnh hưởng lớn ở nơi khác.

Tư duy hệ thống là gì?
Tư duy hệ thống là gì?

Lấy ví dụ, khi team phát triển nhận yêu cầu từ khách hàng hoặc PO, chúng ta cần phân tích kỹ các requirement để xây dựng kiến trúc tổng thể trước khi đi vào triển khai các module cụ thể (top-down approach). Nếu chỉ tập trung vào từng chức năng riêng lẻ mà không để ý đến mối quan hệ giữa chúng, rất có thể sản phẩm cuối cùng sẽ không đáp ứng yêu cầu hoặc tồn tại nhiều lỗ hổng bảo mật, gây khó khăn cho việc mở rộng sau này.

Các mối quan hệ thường gặp khi tư duy hệ thống

Quan hệ tuyến tính – Linear Relationship

Mối quan hệ tuyến tính là loại mối quan hệ đơn giản nhất giữa các yếu tố trong một hệ thống. Nó mô tả cách mà sự thay đổi của một nguyên nhân sẽ dẫn đến sự thay đổi tương ứng, có thể dự đoán được của kết quả.

Quan hệ tuyến tính - Linear Relationship
Quan hệ tuyến tính – Linear Relationship

Hãy lấy một ví dụ đơn giản.

Giả sử mỗi thuê bao điện thoại cố định hàng tháng đều phải trả một số tiền cước cơ bản là 100 nghìn đồng, cộng thêm 500 đồng trên mỗi phút gọi. Trong trường hợp này, chi phí mà khách hàng phải trả (kết quả) tỷ lệ thuận và tuyến tính với số phút gọi (nguyên nhân).

Nếu bạn gọi 100 phút, số tiền phải trả là:

100.000₫ + 100 x 500₫/phút = 150.000₫

Nếu bạn gọi 200 phút, số tiền sẽ là:

100.000₫ + 200 x 500₫/phút = 200.000₫

Mối quan hệ tuyến tính
Mối quan hệ tuyến tính

Ta thấy rằng khi số phút gọi tăng gấp đôi, thì chi phí cũng tăng gấp đôi. Kết quả thay đổi rất dễ dự đoán nếu biết nguyên nhân.

Tuy nhiên, trong thực tế phát triển phần mềm, mối quan hệ tuyến tính lại khá hiếm gặp. Hãy xem ví dụ sau:

Giả sử bạn đang xây dựng một ứng dụng web bán hàng. Ban đầu, bạn chỉ có 100 khách hàng truy cập mỗi ngày, nên một máy chủ nhỏ là đủ để đáp ứng. Nhưng nếu lượng khách tăng lên 1000, thì việc nâng cấp máy chủ có thể tốn gấp 3 lần chi phí. Ngoài ra, lượng khách hàng tăng đột biến cũng tiềm ẩn nguy cơ quá tải và sập server nếu hệ thống không được chuẩn bị kỹ càng.

Minh hoạ mối quan hệ phi tuyến tính
Peak time AWS

Ở đây, ta thấy số lượng khách hàng (nguyên nhân) và chi phí vận hành (kết quả) không hề tỷ lệ thuận với nhau. Mối quan hệ giữa chúng có tính phi tuyến tính, các giá trị ở đây không tăng đều mà có xu hướng tăng đột biến ở một số điểm, gây khó khăn cho việc dự đoán.

Mặc dù mối quan hệ tuyến tính có vẻ dễ hiểu và dễ tính toán, nhưng trong nhiều hệ thống phức tạp, mối quan hệ này lại thường không hay xảy ra.

Quan hệ phi tuyến tính – Non-Linear Relationship

Tiếp theo chúng ta cùng tìm hiểu về mối quan hệ phi tuyến tính. 

Mối quan hệ phi tuyến tính mô tả tình huống khi sự thay đổi của nguyên nhân không dẫn đến sự thay đổi tỷ lệ thuận hoặc có thể dự đoán trước của kết quả. Nói cách khác, đầu ra của hệ thống không tương ứng trực tiếp với đầu vào theo một quy luật cụ thể nào.

Để hiểu rõ hơn, ta hãy tưởng tượng bạn là một huấn luyện viên đang rèn luyện sức bền cho một vận động viên chạy bộ. Trong giai đoạn đầu, cứ mỗi tuần tập thêm, vận động viên có thể cải thiện thành tích chạy 5 km của mình thêm khoảng 1 phút. Tuy nhiên, sau 10 tuần, mặc dù vẫn tập chăm chỉ, anh ta nhận thấy mình khó lòng cải thiện hơn được nữa, thời gian chạy hầu như không thay đổi. Đến tuần thứ 15, việc luyện tập quá sức bắt đầu gây ra chấn thương, thậm chí khiến thành tích của vận động viên tệ đi.

Quan hệ phi tuyến tính
Quan hệ phi tuyến tính

Ở đây, mối quan hệ giữa thời gian tập luyện (nguyên nhân) và kết quả thi đấu (kết quả) là phi tuyến tính. Đồ thị biểu diễn sự thay đổi này không phải là một đường thẳng mà có thể là một đường cong. Ban đầu, đồ thị đi lên, thể hiện sự cải thiện đều đặn. Sau đó, nó đi ngang trong một khoảng thời gian khi cơ thể vận động viên đạt ngưỡng. Cuối cùng, đồ thị đi xuống khi việc tập luyện gây ra tác dụng ngược.

Trở lại với lĩnh vực phát triển phần mềm, ta có thể thấy sự tương đồng sau:

Giả sử bạn là một lập trình viên đang phát triển một ứng dụng web về quản lý dự án. Trong số các chức năng quan trọng, bạn cần xây dựng một thuật toán để tính toán tiến độ dự án dựa trên số lượng công việc đã hoàn thành. Ban đầu, với một vài nhiệm vụ đơn giản, tỷ lệ công việc hoàn thành tăng tương đối ổn định và dễ dự đoán. Tuy nhiên, khi dự án ngày càng phức tạp hơn với nhiều nhiệm vụ phụ thuộc lẫn nhau, việc hoàn thành một nhiệm vụ không đồng nghĩa tỷ lệ tiến độ sẽ tăng một lượng tương ứng.

Mối quan hệ phi tuyến tính
Mối quan hệ phi tuyến tính

Thậm chí, khi các vấn đề phát sinh như lỗi phần mềm, sự thay đổi yêu cầu từ khách hàng hay việc thành viên nghỉ việc giữa chừng, tiến độ của dự án có thể bị chậm lại hoặc thụt lùi, bất chấp số lượng công việc đã thực hiện. Nếu bạn không tính đến các yếu tố này và giả định tiến độ tỷ lệ thuận với khối lượng công việc một cách máy móc, kết quả dự báo của thuật toán sẽ sai lệch nghiêm trọng so với thực tế.

Qua hai ví dụ trên, ta thấy rằng mối quan hệ phi tuyến tính có thể xuất hiện ở nhiều bối cảnh khác nhau, từ việc rèn luyện thể thao cho đến lập trình. Nhận biết được sự tồn tại của chúng là điều rất quan trọng, vì nó giúp ta tránh những sai lầm trong suy luận, ví dụ như:

– Cho rằng đầu vào càng lớn thì đầu ra càng tốt

– Sử dụng thuật toán ngoại suy tuyến tính để dự đoán xu hướng từ dữ liệu quá khứ một cách thiếu thận trọng

– Bỏ qua các điều kiện biên, các tác động gián tiếp và các yếu tố ngẫu nhiên ảnh hưởng đến hệ thống

Lập trình viên nên làm gì để xử lý các mối quan hệ phi tuyến tính?

Vậy, lập trình viên nên làm gì để xử lý các mối quan hệ phi tuyến tính? Câu trả lời nằm ở khả năng tư duy tổng thể, đòi hỏi phải xem xét hệ thống đang phát triển dưới nhiều góc nhìn khác nhau, đặc biệt là từ góc nhìn của người dùng cuối. Bạn cần luôn đặt câu hỏi:

– Liệu giữa các thành phần này có tồn tại những mối quan hệ tiềm ẩn nào không? 

– Việc tối ưu hoá một yếu tố có thể dẫn đến hậu quả gì ở yếu tố khác?

– Hệ thống sẽ hoạt động ra sao trong các tình huống ngoại lệ (Exception)?

Từ đó, bạn mới xác định được ranh giới an toàn của hệ thống, cũng như tính đến phương án dự phòng khi có sự cố xảy ra. 

Ngoài ra, việc thường xuyên kiểm thử phần mềm với những bộ dữ liệu đa dạng, bao gồm cả các trường hợp cực đoan (edge cases) giúp ta sớm phát hiện các điểm bất thường. Khi làm việc với các hệ thống phức tạp, kết quả kiểm thử thực tế sẽ cho ta cái nhìn khách quan hơn là chỉ dựa trên niềm tin chủ quan.

Edge cases
Edge cases

Tóm lại, mối quan hệ phi tuyến tính là một thách thức đối với các lập trình viên khi phát triển ứng dụng, song đồng thời cũng mở ra cơ hội để học hỏi và trưởng thành. Khi bạn chấp nhận thực tế rằng đôi khi sự vật không hoạt động như cách mà bạn hình dung ban đầu, bạn sẽ cẩn trọng hơn trong mỗi quyết định và cải thiện khả năng xử lý tình huống phức tạp của mình. Nuôi dưỡng tư duy này chính là chìa khoá để trở thành một lập trình viên chuyên nghiệp, một người nhìn ra cả khu rừng chứ không phải chỉ từng cái cây.

Ở phần 1 này, chúng ta đã cùng tìm hiểu qua 2 loại mối quan hệ đơn giản trong Tư duy hệ thống: Tuyến tính và Phi tuyến tính. Ở phần 2 của loạt bài Tư duy hệ thống, chúng ta sẽ cùng tìm hiểu về Vòng lặp phản hồi (feedback loop) và Các ràng buộc phát sinh do sự tương tác chằng chịt giữa các thành phần trong và ngoài hệ thống.

Hẹn gặp lại các bạn ở bài viết tiếp theo nhé.

Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments