Skip to main content

4 Chiến lược hiện đại hóa ứng dụng lên Cloud: Lift and Shift, Virtualization, Containerization và Refactoring

Việc đưa các ứng dụng truyền thống lên nền tảng điện toán đám mây không chỉ đơn thuần là sao chép máy chủ từ trung tâm dữ liệu lên Cloud. Trên thực tế, các doanh nghiệp có thể lựa chọn nhiều chiến lược khác nhau tùy theo ngân sách, thời gian, mức độ chấp nhận rủi ro và tình trạng của hệ thống hiện tại.

Trong bài viết này, chúng ta sẽ cùng tìm hiểu bốn chiến lược hiện đại hóa ứng dụng phổ biến nhất gồm Lift and Shift, Virtualize the Application, Containerize the ApplicationRefactor the MonolithBốn chiến lược này không loại trừ lẫn nhau mà thường được áp dụng theo từng giai đoạn của quá trình hiện đại hóa ứng dụng. Một doanh nghiệp có thể bắt đầu bằng Lift and Shift để nhanh chóng đưa hệ thống lên Cloud, sau đó từng bước ảo hóa, container hóa và cuối cùng tái cấu trúc kiến trúc nhằm tận dụng tối đa các lợi ích của Cloud Native.

Migration lên Cloud: Phân biệt Migration, Modernization và Các chiến lược thực hiện

1. Lift and Shift" (Rehost)

Lift and Shift

Bản chất: "Thay nhà, không thay đồ"

Thay vì phải viết lại mã nguồn hay thay đổi cấu trúc phức tạp của ứng dụng (gọi là "hiện đại hóa"), Lift and Shift tập trung vào việc thay đổi nền tảng lưu trữ.

  • Tư duy cốt lõi: Thay vì sửa đổi ứng dụng để nó phù hợp với đám mây, chúng ta "ép" đám mây phải tạo ra một môi trường giả lập giống hệt như môi trường tại chỗ (on-premises) để ứng dụng có thể chạy mà không nhận ra sự khác biệt.
  • Mục tiêu: Di chuyển nhanh nhất có thể với rủi ro thấp nhất.

Tại sao lại chọn Lift and Shift?

Có ba lý do chính khiến các doanh nghiệp ưu tiên cách tiếp cận này:

  • Thiếu kỹ năng: Đội ngũ hiện tại có thể chưa quen với các công nghệ hiện đại như Microservices.
  • Ràng buộc tài chính: Doanh nghiệp không đủ ngân sách để đầu tư cho một cuộc đại tu mã nguồn tốn kém ngay lập tức.
  • Áp lực thời gian: Ví dụ như khi trung tâm dữ liệu cũ sắp đóng cửa, ứng dụng cần một "mái nhà mới" ngay lập tức.

Các bước thực hiện cơ bản

Để di chuyển thành công, bạn cần thực hiện hai bước quan trọng nhất nhằm tạo ra một "bản sao" môi trường cũ ở trên mây:

  • Sao chép môi trường tính toán: Đảm bảo máy chủ trên mây sử dụng cùng hệ điều hành (HĐH) và phiên bản mà ứng dụng đã được thiết kế để chạy.
  • Sao chép môi trường mạng: Tạo ra một mạng riêng ảo (VPC) có các dải địa chỉ IP giống hệt như cũ, thậm chí là sử dụng tính năng Bring Your Own IP (BYOIP) để ứng dụng không phải cấu hình lại kết nối.     

Sự đánh đổi (Trade-offs)

Lift and Shift là một bước khởi đầu tốt nhưng không phải là điểm kết thúc.

  • Ưu điểm: Hoàn thành trong thời gian ngắn, chi phí thấp ban đầu và giảm thiểu rủi ro gián đoạn kinh doanh.
  • Nhược điểm: Ứng dụng không thực sự chạy tốt hơn hay thông minh hơn; nó chỉ đơn giản là đổi từ việc sở hữu phần cứng (CapEx) sang thuê phần cứng (OpEx). Bạn sẽ không nhận được những lợi ích cốt lõi của đám mây như tính linh hoạt cao hay khả năng tự động co giãn tối ưu nếu chỉ dừng lại ở bước này.

Ví dụ thực tế

  • Capital One: Đã sử dụng Lift and Shift như một trong nhiều chiến lược để di chuyển danh mục ứng dụng khổng lồ của mình lên mây.
  • Corteva: Sử dụng Microsoft Azure để "nhấc" toàn bộ hệ thống quản lý thông tin phòng thí nghiệm (LIMS) của họ lên mây mà không cần sửa đổi mã nguồn phức tạp.
  • Hãng hàng không: Sau khi đã hiện đại hóa các phần quan trọng, họ dùng Lift and Shift để đưa những phần "rác" còn lại của hệ thống cũ lên mây để quản lý tập trung và đóng cửa hoàn toàn máy chủ dưới đất.

Lift and Shift là lựa chọn phù hợp khi doanh nghiệp cần di chuyển ứng dụng lên Cloud trong thời gian ngắn với mức thay đổi tối thiểu. Tuy nhiên, cách tiếp cận này chủ yếu chỉ thay đổi nơi vận hành ứng dụng mà chưa giải quyết được những hạn chế vốn có của hệ thống. Để tăng tính linh hoạt trong việc quản lý hạ tầng và tận dụng tốt hơn các dịch vụ điện toán đám mây, nhiều tổ chức tiếp tục chuyển sang bước tiếp theo là Virtualize the Application, tức là ảo hóa ứng dụng thông qua máy ảo (Virtual Machine).

2. "Virtualize the Application" (Ảo hóa ứng dụng)

Ảo hóa ứng dụng là một bước tiến quan trọng trong việc hiện đại hóa cách đóng gói ứng dụng để đưa lên đám mây mà không cần phải sửa đổi mã nguồn bên trong.

Virtualize the Application

Bản chất: "Đóng gói cả ngôi nhà"

Trong môi trường CNTT truyền thống, ứng dụng thường được cài đặt trực tiếp lên hệ điều hành của một máy chủ vật lý (bare metal). Điều này khiến ứng dụng bị "dính chặt" vào phần cứng đó.

  • Tư duy cốt lõi: Thay vì cài đặt trực tiếp, chúng ta đóng gói ứng dụng cùng với hệ điều hành và các thư viện cần thiết vào một "máy ảo" (Virtual Machine - VM).
  • Cơ chế: Máy ảo này chạy trên một lớp phần mềm trung gian (Middleware) gọi là Hypervisor. Hypervisor đóng vai trò như một "mặt bằng" chuẩn hóa, cho phép các máy ảo chạy trên bất kỳ máy chủ vật lý nào có cài đặt nó.

Tại sao nên ảo hóa ứng dụng?

Có những lợi ích vượt trội so với việc chạy trên máy chủ vật lý truyền thống:

  • Tính di động (Mobility): Một khi đã được ảo hóa, ứng dụng không còn bị trói buộc vào một cỗ máy cụ thể. Bạn có thể dễ dàng di chuyển "gói" máy ảo này từ máy chủ này sang máy chủ khác trong đám mây để cân bằng tải hoặc tránh các sự cố phần cứng.
  • Tự động phục hồi: Nếu máy chủ vật lý bên dưới bị hỏng, đám mây có thể tự động khởi động lại gói máy ảo của bạn trên một máy chủ khác còn hoạt động, giúp ứng dụng luôn sẵn sàng.
  • Quản lý dễ dàng hơn: Việc cập nhật hệ điều hành hay vá lỗi ứng dụng trở nên an toàn hơn. Bạn có thể tạo một bản sao máy ảo mới, kiểm thử kỹ càng trong môi trường riêng biệt trước khi thay thế bản cũ trong sản xuất.

Sự đánh đổi và hạn chế

Dù là một bước tiến lớn, ảo hóa vẫn có những "điểm yếu" mà bạn cần lưu ý:

  • Sự lệ thuộc vào định dạng (Stickiness): Mỗi nhà cung cấp đám mây hoặc phần mềm ảo hóa thường có định dạng máy ảo riêng. Ví dụ: Amazon dùng định dạng AMI, còn VMware dùng VMDK. Việc chuyển đổi giữa các định dạng này đòi hỏi thêm công sức và công cụ hỗ trợ.
  • Nặng nề hơn Container: So với công nghệ Container, máy ảo vẫn khá "nặng" vì mỗi máy ảo phải chứa một hệ điều hành đầy đủ bên trong, gây tốn tài nguyên bộ nhớ và CPU hơn.

Mối quan hệ với các chiến lược khác

  • Kết hợp với Lift and Shift: Trong thực tế, các doanh nghiệp thường kết hợp hai chiến lược này: vừa "nhấc" ứng dụng lên mây (Lift and Shift), vừa chuyển đổi từ máy chủ vật lý sang máy ảo (Virtualize) để tận dụng các dịch vụ hạ tầng (IaaS) của đám mây.
  • Bước đệm: Đây thường là bước khởi đầu tốt. Sau khi ứng dụng đã chạy ổn định trong máy ảo, doanh nghiệp có thể tiến thêm một bước nữa là Containerize (Container hóa) hoặc Refactor (Tái cấu trúc) để đạt hiệu quả cao hơn.

Ảo hóa đã giúp ứng dụng trở nên linh hoạt hơn rất nhiều so với việc chạy trực tiếp trên máy chủ vật lý. Tuy nhiên, mỗi máy ảo vẫn phải mang theo một hệ điều hành riêng, khiến việc triển khai tiêu tốn tài nguyên và khởi động tương đối chậm. Để giải quyết những hạn chế này, ngành công nghiệp phần mềm đã phát triển một mô hình nhẹ hơn và hiệu quả hơn: Containerize the Application. Đây cũng là nền tảng quan trọng cho kiến trúc Cloud Native và Microservices hiện đại.

3. "Containerize the Application" (Container hóa ứng dụng)

Container hóa ứng dụng là bước tiến hóa tiếp theo và tinh gọn hơn của việc ảo hóa, giúp ứng dụng đạt được mật độ triển khai cao và tính di động tối đa trên đám mây.

Containerize the Application

Bản chất: "Gói ứng dụng vào thùng hàng tiêu chuẩn"

Thay vì đóng gói cả hệ điều hành đầy đủ như máy ảo, container hóa chỉ đóng gói ứng dụng cùng với các thư viện và cấu hình cần thiết nhất để nó có thể chạy được.

  • Cơ chế chia sẻ: Điểm khác biệt cốt lõi là các container cùng chạy trên một máy chủ sẽ chia sẻ chung nhân hệ điều hành (OS kernel). Điều này giống như việc nhiều căn hộ trong một tòa nhà chung cư cùng dùng chung nền móng và hệ thống điện nước, thay vì mỗi căn hộ phải tự xây một nền móng riêng.
  • Tính bất biến (Immutability): Một container khi đã được đóng gói (thành image) thì sẽ không thay đổi. Nếu container gặp lỗi, bạn không vào đó để "vá", mà chỉ đơn giản là tắt nó đi và khởi chạy một bản sao mới tinh từ image gốc.

Tại sao Container lại vượt trội hơn Máy ảo (VM)?

Có 4 ưu điểm giúp container trở thành "ngôi sao" của kiến trúc Cloud Native:

  • Mật độ cao và Tiết kiệm: Vì không chứa hệ điều hành riêng, container nhẹ hơn máy ảo rất nhiều, cho phép bạn chạy được nhiều ứng dụng hơn trên cùng một dung lượng bộ nhớ và CPU.
  • Khởi động thần tốc: Container khởi động nhanh hơn máy ảo đáng kể vì nhân hệ điều hành đã chạy sẵn, ứng dụng chỉ việc "nhảy vào" và chạy ngay.
  • Chống "trôi dạt cấu hình" (Drift): Vì container không thể sửa đổi khi đang chạy, bạn sẽ thoát khỏi nỗi lo ứng dụng chạy tốt ở máy lập trình viên nhưng lại lỗi trên máy chủ sản xuất do sai khác về cài đặt.
  • Tính di động tuyệt vời: Nhờ các tiêu chuẩn chung (như OCI), một container có thể di chuyển giữa các nhà cung cấp đám mây khác nhau (AWS, Azure, IBM) dễ dàng hơn nhiều so với máy ảo.

Những thách thức thực tế

Dù rất mạnh mẽ, nhưng container hóa đòi hỏi tổ chức phải thay đổi:

  • Kỹ năng mới: Đội ngũ cần học cách sử dụng các công cụ điều phối như Kubernetes để quản lý hàng ngàn container cùng lúc.
  • Tự động hóa: Bạn không nên làm thủ công. Container hóa chỉ thực sự hiệu quả khi kết hợp với CI/CD để đóng gói và triển khai liên tục.

Container hóa mang lại khả năng triển khai nhanh, tiết kiệm tài nguyên và dễ dàng mở rộng. Tuy nhiên, cần lưu ý rằng container chỉ thay đổi cách đóng gói và vận hành ứng dụng, chứ không tự động cải thiện kiến trúc bên trong. Nếu ứng dụng vẫn là một hệ thống nguyên khối (Monolith) với mức độ phụ thuộc cao giữa các thành phần, nhiều lợi ích của Cloud vẫn chưa được khai thác hết. Chính vì vậy, bước tiếp theo mà nhiều doanh nghiệp hướng tới là Refactor the Monolith, tức tái cấu trúc kiến trúc ứng dụng để tăng khả năng mở rộng, bảo trì và phát triển lâu dài.

4. "Refactor the Monolith" (Tái cấu trúc hệ thống nguyên khối)

Đây là một chiến lược hiện đại hóa kiến trúc ứng dụng sâu sắc nhất, không phải là việc thay đổi tính năng bên ngoài mà là việc "dọn dẹp" và "sắp xếp" lại bên trong để ứng dụng hoạt động hiệu quả hơn trên đám mây.

Tại sao cần tái cấu trúc?

Một tình trạng phổ biến của các ứng dụng cũ là: chúng thường là một "Quả cầu bùn lớn" (Big Ball of Mud).

  • Vấn đề: Trong khối bùn này, mọi thứ dính chặt vào nhau. Một thay đổi nhỏ ở phần này có thể làm hỏng phần kia, khiến việc cập nhật vô cùng chậm chạp và rủi ro.
  • Sự kém hiệu quả: Khi chạy trên mây, nếu bạn chỉ muốn tăng sức mạnh cho tính năng "Tìm kiếm", bạn buộc phải nhân bản toàn bộ khối bùn khổng lồ, gây lãng phí tài nguyên bộ nhớ và chi phí.

Thay đổi cấu trúc, giữ nguyên kết quả

Tái cấu trúc là quá trình cải thiện thiết kế của mã nguồn hiện có để "dễ hiểu hơn và rẻ hơn khi sửa đổi"không làm thay đổi hành vi quan sát được của ứng dụng. Ví dụ dễ hiểu: Giống như việc bạn sắp xếp lại các món đồ trong một ngăn kéo lộn xộn. Bạn không vứt món đồ nào đi hay mua đồ mới, bạn chỉ tổ chức lại để tìm đồ nhanh hơn.

Lộ trình tiến hóa: Từ Blob đến Modules

Có hai mục tiêu chính cho việc tái cấu trúc:

  • Mục tiêu 1 - Modular Monolith: Biến khối bùn thành các "mô-đun" độc lập nhưng vẫn chạy chung một tiến trình. Điều này giúp các nhóm lập trình có thể làm việc riêng biệt trên từng phần mà không dẫm chân lên nhau.
  • Mục tiêu 2 - Distributed Architecture (Kiến trúc phân tán): Chia nhỏ ứng dụng thành các dịch vụ chạy trên nhiều máy tính khác nhau. Đây là bước chuẩn bị quan trọng để tiến tới kiến trúc Microservices.

Nguyên tắc "Lưới an toàn"

Một điểm cốt yếu cần nhấn mạnh là bạn không thể tái cấu trúc nếu không có Kiểm thử tự động (Automated Testing). Vì mục tiêu là không làm thay đổi hành vi của ứng dụng, bạn cần một bộ kiểm thử để đảm bảo rằng sau khi bạn "dọn dẹp" mã nguồn, ứng dụng vẫn chạy đúng như cũ. Nếu không có kiểm thử, việc tái cấu trúc sẽ trở thành một thảm họa.

Ví dụ thực tế: Câu chuyện của Hãng hàng không

Hãng hàng không bắt đầu với một hệ thống chạy tại trung tâm dữ liệu riêng (on-premises).

  • Kiến trúc: Một ứng dụng Java nguyên khối khổng lồ theo kiểu Web Form Application (mỗi lần bấm là tải lại trang).
  • Lưu trữ: Dữ liệu khách hàng và đặt chỗ nằm trong cơ sở dữ liệu Oracle.
  • Hậu phương: Các tác vụ cốt lõi như xuất vé thực sự vẫn được xử lý bởi một hệ thống Mainframe cổ điển ở phía sau.
  • Vấn đề: Hệ thống này quá phức tạp và dính chùm đến mức không ai dám sửa đổi vì sợ làm hỏng toàn bộ.

Lãnh đạo hãng hàng không yêu cầu một tính năng mới cực kỳ quan trọng: "Tự động đặt lại vé khi chuyến bay bị hủy hoặc hoãn".

  • Trong hệ thống cũ, việc thêm tính năng này bị trì hoãn nhiều tháng trời vì mã nguồn quá rối rắm.
  • Chiến thuật: Thay vì cố gắng cơi nới trên "nền đất lún" của monolith, đội ngũ kỹ thuật quyết định Bắt đầu nhỏ (Start Small) bằng cách xây dựng tính năng này hoàn toàn mới trên đám mây.

Họ xây dựng tính năng đặt lại vé này như một "ốc đảo" hiện đại:

  • Giao diện: Sử dụng Single-Page Application (SPA) để tạo trải nghiệm mượt mà cho hành khách.
  • Logic: Chạy bằng các Microservice trên đám mây, kết nối với một Cloud Database mới.
  • Kết nối: Sử dụng các Dispatcher để làm cầu nối giữa giao diện mới và các dịch vụ bên dưới.

Sau khi tính năng đặt lại vé thành công rực rỡ và đội ngũ đã làm quen với quy trình mới (Pave the Road), họ bắt đầu chiến dịch tái cấu trúc thực sự:

  • Họ trích xuất dần từng mảng mã nguồn từ monolith cũ (ví dụ: mảng "Tìm kiếm vé", "Đặt chỗ") và chuyển chúng thành các Microservice trên mây.
  • Giao diện web cũng được chia nhỏ thành các Micro Frontend để các nhóm có thể làm việc độc lập.

Refactor the Monolith

Sau hơn một năm bền bỉ, khối monolith khổng lồ ngày nào giờ chỉ còn lại những tính năng phụ, ít khi dùng đến và không ảnh hưởng nhiều đến doanh thu.

  • Thay vì tốn công tái cấu trúc những phần "rác" này, họ thực hiện một bước đi thông minh gọi là "Lift and Shift at the End".
  • Họ đóng gói những gì còn sót lại vào một Container, đưa nó lên mây để quản lý tập trung và tắt hoàn toàn máy chủ dưới mặt đất.
  • Toàn bộ hệ thống giờ đây đã chạy trên mây với cơ sở dữ liệu hiện đại, hoàn tất hành trình di cư và hiện đại hóa.

Bài học rút ra: Tái cấu trúc không phải là đập đi xây lại trong một đêm. Đó là một chiến thuật khôn ngoan: tận dụng các yêu cầu kinh doanh mới để xây dựng nền tảng trên mây, sau đó dần dần "rút ruột" hệ thống cũ cho đến khi nó không còn lý do để tồn tại.

5. Kết luận

Không có một chiến lược hiện đại hóa ứng dụng nào phù hợp với mọi doanh nghiệp. Nếu mục tiêu là di chuyển nhanh với chi phí thấp, Lift and Shift thường là lựa chọn hợp lý. Khi cần tăng tính linh hoạt trong quản lý hạ tầng, Virtualize the Application sẽ mang lại nhiều lợi ích hơn. Nếu muốn xây dựng nền tảng cho kiến trúc Cloud Native, Containerize the Application là bước tiến quan trọng. Trong khi đó, Refactor the Monolith là chiến lược toàn diện nhất, giúp ứng dụng tận dụng tối đa khả năng mở rộng, tự động hóa và triển khai liên tục của Cloud, dù đòi hỏi nhiều thời gian và nguồn lực hơn.

Thay vì xem các chiến lược này là những lựa chọn loại trừ lẫn nhau, nhiều doanh nghiệp thực tế kết hợp chúng theo từng giai đoạn. Một hệ thống có thể bắt đầu bằng Lift and Shift để nhanh chóng lên Cloud, sau đó dần được Virtualize, Containerize và cuối cùng Refactor thành kiến trúc Microservices. Điều quan trọng không phải là chọn chiến lược hiện đại nhất, mà là lựa chọn con đường phù hợp với nhu cầu và nguồn lực của tổ chức.

Comments

Popular posts from this blog

Cloud Native là gì? Tư duy thiết kế hệ thống hiện đại cho thời đại đám mây

Cloud Native đang trở thành nền tảng của hầu hết các hệ thống hiện đại từ Netflix, Amazon đến Google. Nhưng Cloud Native thực sự là gì? Liệu việc đưa ứng dụng lên AWS hay Google Cloud đã đủ để gọi là Cloud Native chưa? Trong bài viết này, chúng ta sẽ tìm hiểu nguồn gốc của khái niệm Cloud Native, bài học từ sự cố AWS năm 2015, và những đặc tính quan trọng giúp các hệ thống hiện đại đạt được khả năng mở rộng, chống chịu và triển khai liên tục. 1. Bài học từ sự cố AWS: Lỗi là “Luật”, không phải “Ngoại lệ” Vào năm 2015, Amazon Web Services (AWS) gặp sự cố sập mạng chấn động. Trong khi các “ông lớn” như Airbnb hay Nest đều bị tê liệt, thì Netflix chỉ bị ảnh hưởng rất nhỏ và phục hồi gần như ngay lập tức. AWS phân vùng các dịch vụ mà nó cung cấp thành các vùng (region) và vùng khả dụng (Availability Zone - AZ). Các vùng ánh xạ đến các khu vực địa lý (như Virginia, California, Oregon) và AZ cung cấp thêm dự phòng và cô lập trong một vùng duy nhất. Hình bên dưới hoàn toàn là giả định (nhưng v...

Kiến trúc cho xử lý dữ liệu luồng (Streaming Architecture) - Phần 3: Continuous Intelligence và AI thời gian thực

Khi hệ thống đã có khả năng thu thập dữ liệu liên tục và phân tích sự kiện theo thời gian thực, câu hỏi tiếp theo là: liệu máy tính có thể tự đưa ra quyết định thay con người hay không? Kiếntrúc cho xử lý dữ liệu luồng (Streaming Architecture) - Phần 1: Giá trị củaStreaming và Kiến trúc Streaming Ingest Kiếntrúc cho xử lý dữ liệu luồng (Streaming Architecture) - Phần 2: Real-timeDashboards và Stream Analytics Đó chính là mục tiêu của Continuous Intelligence – giai đoạn cao nhất trong kiến trúc xử lý dữ liệu luồng. Thay vì chỉ hiển thị cảnh báo trên dashboard, hệ thống có thể liên tục huấn luyện mô hình AI, thực hiện suy luận (Inference) ngay khi dữ liệu phát sinh và tự động kích hoạt các hành động phù hợp. Trong bài viết cuối cùng của series Kiến trúc cho xử lý dữ liệu luồng , chúng ta sẽ cùng khám phá cách xây dựng một hệ thống dữ liệu thông minh có khả năng học hỏi, thích nghi và phản ứng gần như theo thời gian thực. 5. Continuous Intelligence (Trí tuệ liên tục) Đây là cấp...

Reinforcement Learning (Học tăng cường) là gì? Hiểu bản chất qua giải thích về cách AI tự học

Nếu học có giám sát giúp AI học từ những đáp án đã biết trước, còn học không giám sát giúp AI tự khám phá cấu trúc của dữ liệu, thì học tăng cường (Reinforcement Learning - RL) lại đi theo một hướng hoàn toàn khác: AI học bằng chính trải nghiệm của mình. Deep Reinforcement Learning là gì? Vì sao AI cần kết hợp Học sâu với Học tăng cường Reinforcement Learning (Học tăng cường) hoạt động như thế nào? Dynamic Programming, Monte Carlo và các ứng dụng thực tế Thay vì được hướng dẫn từng bước, tác nhân (agent) liên tục tương tác với môi trường, thử nhiều hành động khác nhau và nhận phần thưởng hoặc hình phạt. Sau hàng nghìn, thậm chí hàng triệu lần thử nghiệm, AI dần học được chiến lược tối ưu để đạt mục tiêu. Trong bài viết này, chúng ta sẽ cùng tìm hiểu bản chất của học tăng cường, các thành phần quan trọng như Agent, Environment, Reward, Action và Observation, đồng thời minh họa bằng ví dụ trực quan để thấy AI thực sự "học" như thế nào. 1. Học có giám sát (Supervised learni...