Học lập trình online hiệu quả

Trong quá trình giảng dạy, tôi thường xuyên phải đề cập về một số khái niệm hoặc thuật ngữ chuyên nghành. Vì vậy, bài viết dưới dây như một rút trích những hiểu biết cá nhân về một số khái niệm hay thuật ngữ chuyên nghành đó.

1. Stateless và Stateful là gì?

Khi tôi đặt câu hỏi này, nhiều người thường buột miệng trả lời ngay “stateless là phi trạng thái và stateful là có trạng thái”. Khi tôi hỏi lại “trạng thái” là gì thì phần đông không trả lời được hoặc trả lời rất mù mờ. Một số khác lại nói stateless là có thể nhìn thấy dữ liệu trên thanh địa chỉ của trình duyệt và ngược lại stateful là dữ liệu ẩn bên trong trình duyệt.

Với tôi, dường như mọi hiểu biết đều có phần sai lệch? Xin được đề cập chi tiết hơn dưới đây.
Trong lập trình mạng, chúng ta có tương tác client (máy khách) với server (máy chủ). Phần mềm gồm 2 thành phần chính: phần mềm hoặc cài đặt (implementation) và data (dữ liệu), implementation là tập lệnh được viết ra đề xử lý data. Như vậy, một phần mềm được thiết kế theo tương tác client – server thì phần nhiều tập lệnh sẽ nằm phía server. Client có nhiệm vụ gửi dữ liệu lên để xử lý sau đó nhận kết quả trả về.

Stateless là design không lưu dữ liệu của client trên server. Có nghĩa là sau khi client gửi dữ liệu lên server, server thực thi xong, trả kết quả thì “quan hệ” giữa client và server bị “cắt đứt” - server không lưu bất cứ dữ liệu gì của client. Như vậy, khái niệm “trạng thái” ở đây được hiểu là dữ liệu và cụm “phi trạng thái” có thể làm nhiều người hiểu sai bản chất vấn đề.

Stateful là một design ngược với stateless, server cần lưu dữ liệu của client, điều đó đồng nghĩa với việc ràng buộc giữa client và server vẫn được giữ sau mỗi request (yêu cầu) của client. Data được lưu lại phía server có thể làm đầu vào (input parameters) cho lần kế tiếp, hoặc là dữ kiện dùng trong quá trình xử lý hay phục phụ cho bất cứ nhu cầu nào phụ thuộc vào bussiness (nghiệp vụ) cài đặt.

Hai mô hình tương tác cơ bản của thiết kế client-server là cơ sở để hình thành nên các application protocol, framework, technology,... Ví dụ, HTTP là một Application Protocol (giao thức ứng dụng) dạng stateless, nghĩa là tương tác client-server theo HTTP thì phần server sẽ không lưu lại dữ liệu của client.
HTTP ban đầu được dùng cho web, đơn thuần chỉ là Web Site. Phần client gửi request (yêu cầu) truy vấn tới các Web Page (trang web - là các trang HTML), server nhận yêu cầu, đáp trả nội dung của Web Page và sau đó cắt đứt mọi liên hệ với client (không lưu data của client).

Khi sự đơn giản của Web Site hấp dẫn nhà phát triển phần mềm, người ta nảy sinh ý tưởng xây dựng phần mềm dưới dạng web. Nghĩa là HTML dùng vào làm User Interface (giao diện người dùng) cho một application (ứng dụng phần mềm) và phần mềm được thiết kế dưới dạng client-server, khi đó HTTP đóng vai trò protocol cho tương tác chủ - khách. Nhưng phần mềm viết ra để xử lý dữ liệu của người dùng, nghĩa là trong rất nhiều tương tác, server cần phải lưu data hoặc kết quả trả về làm đầu vào cho lần xử lý kế tiếp, đặc biệt những nghiệp vụ được đặt trong transaction. Như vậy, về căn bản HTTP không đáp ứng được sự phức tạp trong yêu cầu phát triển phần mềm.

Tuy nhiên, người ta có nhiều mánh khóe để khắc phục yếu điểm đó. Dù là một stateless design nhưng nếu kết hợp với HTML chúng ta vẫn có thể biến một Web Site làm được những gì tương tự như stateful. Có 4 cách lưu data của client khi xây dựng Web Application.

1. Sử dụng URL Rewriter: HTML là ngôn ngữ định dạng tài liệu, nó không phải là ngôn ngữ lập trình nên không thể sử dụng các biến để lưu dữ liệu. Tuy nhiên, dữ liệu có thể được viết vào các link (liên kết) và như thế khi người dùng click vào link thì dữ liệu sẽ được gửi lên server. Phần lớn dữ liệu được viết vào phần query dưới các cặp parameters gồm key=value (cặp khóa/giá trị), một vài cài đặt có thể đưa dữ liệu vào phần path hay trong các biến của javascript,…

2. Hidden Form: Thay vì lưu dữ liệu vào đường link, ta sẽ lưu dữ liệu vào các thành phần của form và type (kiểu) của các element này là hidden - ẩn. Như vậy, mọi action (hành xử) của người dùng sẽ gọi đến hành động post (gửi) form đó lên server và như thế dữ liệu cần lưu ở lần trước đó sẽ được gửi lại. HTTP method được dùng ở đây là Post chứ không phải Get trong URL Rewriter. Get là một dạng truy vấn cho phép đọc (read) trong khi Post là một truy vấn cho phép ghi (write). Khi đó dữ liệu của client gửi lên server sẽ nằm trong phần body của một HTTP Message chứ không phải trong phần Header như việc dùng link (liên kết) ở trên.

3. Sử dụng Cookie: Trình duyệt cho phép mỗi Web Application lưu khoảng 4kb dữ liệu dưới dạng key/value. Như vậy, nếu ta lưu data của lần truy vấn trước đó vào cookie thì giá trị này sẽ được gửi lên server trong mỗi request. Cookie là 1 phần trong header của HTTP Message.

4. Sử dụng HTTP Session: Ngược với cookie, các Web Server có thể cho phép mỗi client lưu một dung lượng nhỏ data trên đó. Dữ liệu được lưu dưới dạng key/value và sẽ bị expire nếu bị timeout (sau khoảng thời gian tính từ lúc client gửi truy vấn cuối cùng đến server nếu vượt quá giới hạn thì sẽ bị hủy).

Web Application là một ví dụ minh họa cho stateless design với vài kỹ thuật nhỏ khắc phục yếu điểm của nó trong xây dựng phần mềm. Ở tầng bussiness, ta cũng có thể thiết kế tương tác dạng client-server. Hệ thống phần mềm khi đó có architecture (kiến trúc) là distributed (phân tán). EJB là một ví dụ với việc session bean được thiết kế hỗ trợ cả stateless và stateful.

2. Marshalling/Unmarshalling khác với mapping như thế nào?

A thành B hay A sang B?

Ngày nay, lập trình hướng đối tượng chiếm đến hơn 50% trong khi cơ sở dữ liệu quan hệ RDBMs lại là mô hình được sử dụng nhiều nhất. Làm thế nào để chúng có thể làm việc được với nhau? Trong môi trường lập trình hướng đối tượng, mọi thứ phải thuần (pure) đối tượng, dữ liệu cũng không ngoại lệ. Tuy nhiên, dưới storage (lưu trữ), dữ liệu được tổ chức thành các bản nghi nằm trong các bảng quan hệ ràng buộc với nhau bằng cặp khóa chính phụ. Sẽ thật ngớ ngẩn khi lập trình hướng đối tượng lại tái tạo đúng mô hình này (quan hệ) khi dữ liệu được load (đưa lên) bộ nhớ máy tính. Do đó, chúng ta thường có một bước biến dữ liệu trong các row (bản ghi) của bảng thành các đối tượng (object) và kỹ thuật ORM (Object Relational Mapping) ra đời. Ở đây, chúng ta gặp thuật ngữ mapping.

Web Service đã trở thành một interface thông dụng trong phần mềm và SOAP là một application protocol phổ biến. Khi làm việc với Web Service, chúng ta phải biến dữ liệu của một SOAP message sang object và ngược lại. Quá trình này được gọi là Marshalling/Unmarshalling.

Cả mapping và Marshalling/Unmarshalling đều hai tiến trình đồng bộ các thành phần của dữ liệu của một loại đối tượng tới một loại đối tượng khác. Vậy chúng có gì khác nhau?

Rất đơn giản, mapping là tiến trình ánh xạ dữ liệu, nghĩa là mang dữ liệu của A sang của B, sau khi xử lý xong, cả A và B cùng tồn tại song song nhưng Marshalling/Unmarshalling lại là tiến trình biến đổi về chất, nghĩa là A sẽ thành B và khi kết thúc chỉ tồn tại B chứ không tồn tại A.

3. Transaction là gì?

“Transaction (giao tác) là 1 tập các hành động cùng thực hiện 1 chức năng, và chúng chỉ có thể cùng nhau thành công, hoặc cùng nhau thất bại.”
“Transaction là một nghiệp vụ xử lý.”

Rất khó để tìm kiếm một định nghĩa chính xác bằng tiếng Việt. Vậy xin mạn phép được đưa ra định nghĩa về transaction.

Transaction là một tiến trình xử lý có xác định điểm đầu và điểm cuối, được chia nhỏ thành các operation (phép thực thi) độc lập, tiến trình được thực thi một cách tuần tự các operation đó. Nếu việc thực thi một operation nào đó bị fail (hỏng) đồng nghĩa với việc dữ liệu phải rollback (trở lại) trạng thái ban đầu.

Trong transaction, các operation thường được chia nhỏ đến mức không thể nhỏ hơn. Có rất nhiều các implementation có thể được đặt trong transaction không phụ thuộc vào bussiness hay context cụ thể nào. Một khi đã hiểu chính xác bản chất của transaction, bạn sẽ ứng dụng nó một cách đúng đắn và hiệu quả hơn.

4. Software Interface

Interface là thành phần giao tiếp của phần mềm với bên ngoài. Interface nhận đầu vào (input parameters) và trả lại kết quả đầu ra (return value hoặc response). Hiện tại chúng ta có khoảng 6 loại interfaces thông dụng bao gồm:

API – Application Programming Interface: Rất gần gũi với lập trình viên, đơn vị giao tiếp là các hàm (method hoặc function), thủ tục, biến, cấu trúc dữ liệu. API là một phần của SDK (Software Development Kit) giúp nhà phát triển giao tiếp với các thành phần của ứng dụng, framework, thư viện, giao tiếp phần cứng,…
Command-Line Interface: Là cách thức giúp người dùng tương tác với phần mềm thông qua các dòng lệnh thường là text.

Web User Interface: Gọi tắt là web interface, tương tác người dùng trong môi trường web dành cho các Web Application.

Desktop Interface: Giao diện người dùng được phát triển dựa trên các thành phần đồ họa người dùng do chính hệ điều hành hoặc nền tảng phần mềm (Software Platform) cung cấp chẳng hạn các ứng dụng chạy trên Windows.

Mobile Interface: Tương tự như Desktop Interface, các Mobile Interface được phát triển trên nền tảng dành cho các thiết bị di động, ví dụ iOS hoặc Android.

Web Service: Hiểu một cách chính xác thì Web Service chính là một interface, cụ thể là một Application Programming Interface được mang lên Net dựa vào các chuẩn, công nghệ của Web triển khai trong môi trường mạng với tương tác client-server.

5. Pooling

Pooling là thuật ngữ trong lĩnh vực quản lý tài nguyên (resource management). Khái niệm pooling thường hàm chỉ đến việc sử dụng một lượng tối thiểu tài nguyên nhưng lại phát huy tối đa hiệu suất sử dụng. Trong lĩnh vực phần mềm, pooling thường được đề cập ở 4 lĩnh vực nhỏ hơn bao gồm:

  • Memory Pooling
  • Thread Pooling
  • Object Pooling
  • Connection Pooling