Tổng quan về giáo trình

Giáo trình Cấu trúc dữ liệu và thuật toán do nhóm tác giả thuộc Trường Đại học Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên biên soạn (hoàn thành tháng 5 năm 2019, thông tin tiếp nhận đóng góp học thuật qua địa chỉ thư điện tử dtquy@ictu.vn). Trong chương trình đào tạo kỹ sư các ngành Công nghệ thông tin và Điện tử Viễn thông, môn học giữ vị trí kiến thức cơ sở ngành cốt lõi, cung cấp nền tảng về phương pháp tư duy thuật toán, cách thức tổ chức lưu trữ và quản lý dữ liệu trong bộ nhớ máy tính trước khi xây dựng chương trình.

Mục tiêu học tập của giáo trình nhằm trang bị cho người học:

  • Khả năng phân tích và mô hình hóa bài toán thực tế thành mô hình toán học.
  • Năng lực phân biệt và chuyển dịch từ biểu diễn trừu tượng (Mô hình dữ liệu - Data Model, Kiểu dữ liệu trừu tượng - Abstract Data Type) sang biểu diễn cụ thể (Cấu trúc dữ liệu - Data Structures, Cấu trúc lưu trữ - Storage Structures) trong bộ nhớ máy tính.
  • Kỹ năng cài đặt các phép toán nguyên thủy trên các cấu trúc dữ liệu bằng ngôn ngữ lập trình.
  • Phương pháp phân tích độ phức tạp tính toán của thuật toán về thời gian $T(n)$ và không gian bộ nhớ $L(gt)$.

Cấu trúc giáo trình được thiết kế gồm 5 chương theo trục phát triển logic: đi từ phương pháp luận mở đầu, phân tích thuật toán, qua các mô hình dữ liệu tuyến tính (danh sách, ngăn xếp, hàng đợi), mô hình phân cấp (cây), mô hình mạng phi tuyến (đồ thị), đến mô hình tập hợp và kỹ thuật bảng băm. Giáo trình sử dụng ngôn ngữ lập trình Pascal làm công cụ biểu diễn cấu trúc dữ liệu và cài đặt các phép toán cơ bản, đồng thời cung cấp mã nguồn minh họa bằng ngôn ngữ C để người học có thể chuyển đổi sang các ngôn ngữ khác như Java hay C++.

Nội dung giáo trình được xây dựng trên cơ sở kế thừa có chọn lọc từ các tài liệu học thuật: Cấu trúc dữ liệu thuật toán của Đinh Mạnh Tường, Cấu trúc dữ liệu và giải thuật của Đỗ Xuân Lôi, công thức Algorithms + Data Structures = Programs của Niklaus Wirth, và lý thuyết giải thuật của Donald Knuth (1973).


Nội dung kiến thức cốt lõi

                                  MÔ HÌNH HÓA BÀI TOÁN
             [Biểu diễn trừu tượng]                  [Biểu diễn xử lý]
            Mô hình dữ liệu (Data Model)          Giải thuật phi hình thức
          Kiểu dữ liệu trừu tượng (ADT)              Giải thuật ngôn ngữ giả
             [Biểu diễn cụ thể]                    [Mã hóa chương trình]
           Cấu trúc dữ liệu (Pascal/C)            Mã lệnh thực thi cụ thể

Các chương/chủ đề chính

Toàn bộ nội dung học thuật của giáo trình được phân bố qua 5 chương chuyên đề:

  • Chương 1: Mở đầu
    Trình bày tiến trình từ bài toán thực tế đến chương trình máy tính qua hai giai đoạn: Thiết kế (xác định bài toán, xây dựng mô hình toán) và Mã hóa (cài đặt bằng ngôn ngữ lập trình). Định nghĩa và phân loại 4 mô hình dữ liệu cơ bản dựa trên quan hệ giữa các phần tử: mô hình tuyến tính (quan hệ $1:1$), mô hình phân cấp (quan hệ $1:n$), mô hình đồ thị (quan hệ $n:m$), và mô hình tập hợp (quan hệ thành viên). Phân biệt kiểu dữ liệu cơ bản (vô hướng rời rạc như integer, char, boolean và không rời rạc như real) với kiểu dữ liệu có cấu trúc (array, record). Xác lập 3 tiêu chuẩn lựa chọn cấu trúc dữ liệu: phản ánh đúng thực tế, phù hợp với các thao tác xử lý, và tiết kiệm tài nguyên hệ thống (CPU và bộ nhớ). Giới thiệu phương pháp đánh giá thuật toán theo độ phức tạp thời gian tiệm cận $O(g(n))$ thông qua các quy tắc: loại bỏ hằng số, lấy max, quy tắc cộng và quy tắc nhân; đánh giá không gian giải thuật $L(gt)$. Phân tích kỹ thuật đệ quy, phân định rõ phần neo (anchor) và phần đệ quy thông qua các ví dụ dãy số Fibonacci và thuật toán tìm kiếm từ điển.

  • Chương 2: Mô hình dữ liệu danh sách
    Khái niệm danh sách tuyến tính $L = (a_1, a_2, \dots, a_n)$ và 9 phép toán nguyên thủy: INSERT_LIST, LOCATE, RETRIEVE, DELETE_LIST, LINK, PREVIOUS, FIRST, EMPTY_LIST, MAKENULL_LIST. Hai phương pháp biểu diễn danh sách: cấu trúc danh sách đặc/kế tiếp (sử dụng mảng) và cấu trúc danh sách liên kết động (con trỏ), bao gồm danh sách liên kết đơn (Single Linked List), danh sách liên kết vòng (Circularly Linked List), và danh sách liên kết kép (Doubly Linked List). Trình bày hai kiểu dữ liệu trừu tượng dẫn xuất từ mô hình danh sách: Ngăn xếp (Stack) hoạt động theo nguyên tắc vào sau - ra trước (LIFO/FILO) với các phép toán init_S, isempty_S, isfull_S, push, pop; Hàng đợi (Queue) hoạt động theo nguyên tắc vào trước - ra trước (FIFO) với các phép toán init_Q, isempty_Q, isfull_Q, EnQueue, DeQueue, cùng giải pháp giải quyết hiện tượng tràn hàng bằng kỹ thuật tịnh tiến hoặc mảng xoay vòng (modulo $N$).

  • Chương 3: Mô hình dữ liệu cây
    Định nghĩa cây tổng quát bằng quy nạp đệ quy, các khái niệm gốc (root), nút cha, nút con, nút lá (bậc bằng 0), đỉnh trong, anh em, rừng, mức, chiều cao, đường đi, và cây được sắp (con trưởng, em liền kề). Trình bày 3 phép toán cơ bản: PARENT(k), ELDEST_CHILD(k), NEXT_SIBLING(k) và 3 phương pháp duyệt cây: Tiền thứ tự (Preorder), Trung thứ tự (Inorder), Hậu thứ tự (Postorder). Phân tích 5 dạng biểu diễn cây trên máy tính:

    1. Tree1: Mảng các nút, mỗi nút chứa danh sách liên kết các con.
    2. Tree2: Con trỏ và mảng con trỏ $k$-phân trỏ tới các gốc cây con.
    3. Tree3: Mảng các nút lưu chỉ số con trưởng và em liền kề.
    4. Tree4: Con trỏ lưu liên kết con trưởng và em liền kề (dùng chuyển đổi cây đa phân thành cây nhị phân tương đương).
    5. Tree5: Mảng lưu nút cha của mỗi đỉnh.
      Định nghĩa cây nhị phân (Binary Tree) và cây tìm kiếm nhị phân (Binary Search Tree - BST).
  • Chương 4: Mô hình dữ liệu đồ thị
    Trình bày cấu trúc toán học của đồ thị (Graph) đại diện cho quan hệ $n:m$. Hai phương pháp biểu diễn đồ thị chính trong máy tính: Ma trận kề (Adjacency Matrix) và Danh sách các đỉnh kề (Adjacency List). Các thuật toán duyệt đồ thị tiêu chuẩn: Duyệt theo chiều sâu (Depth-First Search - DFS) và Duyệt theo chiều rộng (Breadth-First Search - BFS). Minh họa vai trò của mô hình qua các bài toán kỹ thuật ứng dụng.

  • Chương 5: Mô hình dữ liệu tập hợp
    Định nghĩa tập hợp và các phép toán cơ bản (hợp, giao, hiệu, kiểm tra phần tử thuộc tập hợp). Các cấu trúc dữ liệu cài đặt tập hợp: Vectơ bit, mảng, danh sách liên kết và danh sách được sắp. Khái niệm kiểu dữ liệu trừu tượng Từ điển (Dictionary) với các thao tác thêm, xóa, tìm kiếm. Cài đặt từ điển bằng cấu trúc Bảng băm (Hash Table), phân biệt phương pháp bảng băm mở (Open Hashing / Chaining) và bảng băm đóng (Closed Hashing / Open Addressing), cùng các phương pháp xây dựng hàm băm.

+-----------------------------------------------------------------------------------+
|                        BẢNG TỔNG HỢP CÁC MÔ HÌNH DỮ LIỆU                          |
+-------------------+----------------+----------------------------------------------+
| Mô hình dữ liệu   | Quan hệ phần tử| Cấu trúc dữ liệu cài đặt tương ứng           |
+-------------------+----------------+----------------------------------------------+
| Danh sách (List)  | Tuyến tính 1:1 | Mảng kế tiếp, Danh sách liên kết đơn/đôi/vòng|
| Ngăn xếp (Stack)  | LIFO / FILO    | Mảng tĩnh (Top), Con trỏ liên kết động       |
| Hàng đợi (Queue)  | FIFO           | Mảng xoay vòng (Modulo N), Con trỏ liên kết  |
| Cây (Tree)        | Phân cấp 1:n   | Tree1, Tree2, Tree3, Tree4, Tree5, Cây BST   |
| Đồ thị (Graph)    | Phức hợp n:m   | Ma trận kề, Danh sách đỉnh kề                |
| Tập hợp (Set)     | Thành viên     | Vectơ bit, Mảng, Danh sách liên kết, Bảng băm|
+-------------------+----------------+----------------------------------------------+

Kiến thức nền tảng được xây dựng

  1. Lý thuyết mô hình hóa và trừu tượng hóa:
    Tách rời bản chất toán học của dữ liệu khỏi phương thức lưu trữ vật lý; định nghĩa kiểu dữ liệu thông qua bộ đôi $T = \langle V, O \rangle$ trong đó $V$ là tập các giá trị hợp lệ và $O$ là tập các thao tác xử lý hợp lệ.

  2. Lý thuyết phân tích thuật toán:
    Nền tảng toán học về đánh giá độ phức tạp tính toán tiệm cận dựa trên số lượng câu lệnh tích cực trong cấu trúc chương trình; phân tích trường hợp tốt nhất, trung bình và trường hợp xấu nhất (Worst-case Analysis).

  3. Mối quan hệ bản chất giữa cấu trúc dữ liệu và giải thuật:
    Khẳng định tính tương thích hai chiều: cấu trúc dữ liệu quyết định giải thuật xử lý tác động lên nó, và giải thuật định hướng việc lựa chọn cấu trúc lưu trữ phù hợp để tối ưu hóa hiệu năng thời gian và bộ nhớ.

Kỹ năng phát triển

  • Kỹ năng kỹ thuật (Technical skills): Cài đặt hoàn chỉnh các cấu trúc dữ liệu động bằng con trỏ (Node*, cấp phát bộ nhớ động qua calloc, giải phóng bộ nhớ); thao tác chính xác với các liên kết trỏ trong danh sách đơn, kép, vòng và cây; mã hóa thuật toán trên Pascal và chuyển đổi sang C/C++.
  • Kỹ năng phân tích (Analytical skills): Khả năng khảo sát bài toán thực tế, bóc tách quan hệ dữ liệu ($1:1$, $1:n$, $n:m$) để chọn mô hình toán học tương ứng; tính toán độ phức tạp thời gian $O(1)$, $O(n)$, $O(n^2)$, $O(\log n)$ trên mã nguồn.
  • Kỹ năng thực hành giải quyết vấn đề (Practical competencies): Khử đệ quy bằng cách tự xây dựng cơ chế quản lý môi trường biến cục bộ và địa chỉ trở về thông qua cấu trúc Ngăn xếp; giải quyết bài toán xung đột lịch trình và tài nguyên bằng mô hình đồ thị.

Phương pháp giảng dạy và học tập

Giáo trình triển khai phương pháp sư phạm tiếp cận theo 3 bước tuần tự:

  1. Trình bày khái niệm mô hình dữ liệu (MHDL) hoặc kiểu dữ liệu trừu tượng (KDLTT) dưới dạng mô hình toán học thuần túy cùng các phép toán nguyên thủy.
  2. Giới thiệu các cấu trúc dữ liệu (CTDL) tương ứng để biểu diễn mô hình trong bộ nhớ máy tính.
  3. Cài đặt chi tiết các hàm và thủ tục thực thi các phép toán cơ bản bằng ngôn ngữ lập trình, tạo mẫu chuẩn để người học tự mở rộng cài đặt các phép toán nâng cao.

Bài tập và case studies trong giáo trình

Giáo trình tích hợp các bài toán mô phỏng thực tế nhằm minh họa trực tiếp cho lý thuyết:

  • Case study 1 - Bài toán tô màu bản đồ: Mô hình hóa các quốc gia thành các đỉnh của đồ thị, các quốc gia có chung biên giới được nối với nhau bằng một cạnh. Bài toán tìm phương án tô màu các đỉnh sao cho hai đỉnh kề nhau không trùng màu với số lượng màu sử dụng là ít nhất.
  • Case study 2 - Bài toán điều khiển đèn giao thông tại ngã năm: Xét ngã năm giao thông gồm 13 lối đi ($AB, AC, AD, BA, BC, BD, DA, DB, DC, EA, EB, EC, ED$). Xây dựng đồ thị với mỗi đỉnh là một lối đi, hai đỉnh được nối cạnh nếu hai hướng đi cắt nhau (không thể lưu thông đồng thời). Bài toán quy về việc phân chia các đỉnh đồ thị thành các nhóm cùng màu (ứng với các pha đèn hiệu điều khiển) sao cho số nhóm là ít nhất để giảm thiểu ùn tắc.
  • Case study 3 - Quản lý in ấn mạng: Sử dụng cấu trúc hàng đợi (Queue) để tiếp nhận và điều phối tuần tự các yêu cầu in từ nhiều máy tính trong mạng theo nguyên tắc FIFO.
  • Case study 4 - Cơ chế khử đệ quy: Sử dụng ngăn xếp (Stack) mô phỏng hoạt động lưu trữ địa chỉ trở về và các biến cục bộ của môi trường thực thi qua từng mức gọi đệ quy.

Bài tập thực hành và hướng dẫn tự học

Hệ thống bài tập thực hành cuối các chương yêu cầu người học tự xây dựng chương trình hoàn chỉnh:

  • Bài tập quản lý lớp học: Xây dựng cấu trúc dữ liệu quản lý $n$ danh sách lớp sinh viên với các trường dữ liệu: Mã sinh viên, Họ tên, Giới tính, Năm sinh, Lớp, Số báo danh, Điểm tổng kết; cài đặt đầy đủ các chức năng: nhập dữ liệu, hiển thị, sắp xếp theo họ tên, chèn, xóa, tìm kiếm, nối hai danh sách, tách danh sách và hủy danh sách.
  • Bài tập chuyển đổi hệ cơ số: Viết chương trình ứng dụng ngăn xếp để chuyển đổi một số nguyên từ hệ thập phân (hệ 10) sang hệ nhị phân (hệ 2), bát phân (hệ 8), và thập lục phân (hệ 16).
  • Câu hỏi thảo luận tự học: Phân tích ưu thế của mảng xoay vòng so với kỹ thuật tịnh tiến trong cài đặt hàng đợi; so sánh định lượng chi phí thời gian và bộ nhớ giữa cài đặt danh sách bằng mảng và bằng con trỏ; tự cài đặt cấu trúc hàng đợi dạng con trỏ (Pointer_Queue) và các phép toán trên cây nhị phân tìm kiếm.

Phương pháp đánh giá kết quả học tập tập trung vào hai tiêu chí: tính đúng đắn về mặt logic toán học của mô hình được chọn và hiệu quả thực thi của mã nguồn (đo lường bằng thời gian thực thi và dung lượng bộ nhớ sử dụng).


Điểm nổi bật và cập nhật

  • Tính chuẩn xác trong phân định ranh giới trừu tượng và cụ thể:
    Giáo trình làm rõ sự khác biệt giữa hai giai đoạn phát triển phần mềm: giai đoạn thiết kế sử dụng biểu diễn trừu tượng (không phụ thuộc vào ngôn ngữ lập trình) và giai đoạn cài đặt sử dụng biểu diễn cụ thể (phụ thuộc vào cấu trúc lưu trữ và cú pháp ngôn ngữ). Quy trình chuyển dịch dữ liệu được chuẩn hóa theo sơ đồ:
    $$\text{Mô hình dữ liệu} \longrightarrow \text{Kiểu dữ liệu trừu tượng} \longrightarrow \text{Cấu trúc dữ liệu} \longrightarrow \text{Cấu trúc lưu trữ}$$

  • Hệ thống hóa toàn diện 5 phương pháp biểu diễn cây:
    Thay vì chỉ giới thiệu cây nhị phân đơn giản, giáo trình phân tích cặn kẽ 5 kỹ thuật biểu diễn cây tổng quát trên bộ nhớ máy tính (Tree1 đến Tree5), chỉ rõ giải thuật tìm cha, tìm con trưởng, tìm em liền kề trên từng dạng cấu trúc, và phương pháp chuyển đổi cây đa phân tổng quát về cây nhị phân tương đương thông qua cấu trúc Tree4.

  • Minh họa phân tích độ phức tạp tính toán chi tiết:
    Giáo trình cung cấp thuật toán sắp xếp nổi bọt (Bubble sort) và thuật toán tìm kiếm tuần tự (Sequential search) kèm theo bảng đếm số lần thực hiện của từng dòng lệnh cụ thể, từ đó dẫn xuất công thức tổng quát $T(n) = \sum_{i=1}^{n-1}(n-i) = \frac{n(n-1)}{2} = O(n^2)$ và giải thích cặn kẽ cách xác định độ phức tạp trong trường hợp xấu nhất.

  • Cầu nối giữa lý thuyết cấu trúc và lập trình hệ thống:
    Nội dung giáo trình gắn liền cấu trúc dữ liệu với kiến trúc máy tính và trình biên dịch, thể hiện qua việc phân tích cách tổ chức lưu trữ nhị phân, cấu trúc khung ngăn xếp khi gọi hàm con, và cơ chế cấp phát/giải phóng bộ nhớ động.


Đối tượng sử dụng giáo trình

                    ĐỐI TƯỢNG SỬ DỤNG GIÁO TRÌNH
[Sinh viên đại học]     [Giảng viên chuyên ngành]   [Người tự học / Lập trình viên]
- Ngành CNTT, ĐTVT       - Đề cương bài giảng        - Nắm vững bản chất CTDL
- Năm 1, Năm 2           - Thiết kế bài thực hành    - Ôn luyện thuật toán nền tảng
  • Sinh viên đại học:
    Sinh viên năm thứ nhất hoặc năm thứ hai chuyên ngành Công nghệ thông tin, Kỹ thuật phần mềm, Hệ thống thông tin, và Kỹ thuật Điện tử Viễn thông tại các trường đại học kỹ thuật.
  • Kiến thức tiên quyết (Prerequisites):
    Người học cần nắm vững kiến thức lập trình cơ sở (sử dụng ngôn ngữ Pascal hoặc C), hiểu rõ khái niệm kiểu dữ liệu cơ bản, mảng, bản ghi (record/struct), biến con trỏ, các cấu trúc điều khiển rẽ nhánh, vòng lặp, và các thuật toán cơ bản gồm:
    • Thuật toán sắp xếp: Sắp xếp nổi bọt (Bubble sort), sắp xếp chọn (Selection sort), sắp xếp chèn (Insertion sort), sắp xếp trộn (Merge sort).
    • Thuật toán tìm kiếm: Tìm kiếm tuần tự (Sequential search), tìm kiếm nhị phân (Binary search).
  • Giảng viên:
    Sử dụng tài liệu làm khung giáo trình giảng dạy học phần Cấu trúc dữ liệu và giải thuật; làm tài liệu tham khảo để biên soạn ngân hàng câu hỏi thảo luận, thiết kế bài tập lớn và đề thi học phần.
  • Người tự học và tham khảo:
    Dành cho lập trình viên cần củng cố bản chất toán học của các cấu trúc dữ liệu và rèn luyện kỹ năng phân tích độ phức tạp thuật toán để tối ưu hóa chương trình.

Câu hỏi thường gặp

1. Giáo trình này phù hợp với đối tượng người học nào?

Giáo trình được thiết kế chuẩn mực cho sinh viên đại học ngành Công nghệ thông tin và Điện tử Viễn thông, đồng thời phù hợp với những người học cần nắm vững mối quan hệ giữa mô hình toán học trừu tượng và việc cài đặt cấu trúc lưu trữ trong bộ nhớ máy tính.

2. Cần chuẩn bị kiến thức nền tảng nào trước khi học giáo trình này?

Người học cần có kiến thức về kỹ thuật lập trình cơ bản (sử dụng ngôn ngữ Pascal hoặc C/C++), nắm vững các kiểu dữ liệu vô hướng, cấu trúc mảng, bản ghi, biến con trỏ, cơ chế truyền tham số trong hàm/thủ tục và các thuật toán sắp xếp, tìm kiếm sơ cấp.

3. Điểm khác biệt cốt lõi của giáo trình so với các tài liệu khác là gì?

Giáo trình phân định rõ ràng giữa tầng khái niệm toán học trừu tượng (Mô hình dữ liệu, Kiểu dữ liệu trừu tượng) và tầng cài đặt vật lý cụ thể (Cấu trúc dữ liệu, Cấu trúc lưu trữ); trình bày chi tiết 5 dạng biểu diễn cấu trúc cây tổng quát trên máy tính và gắn liền lý thuyết đồ thị với các bài toán mô hình hóa thực tế (bản đồ, giao thông ngã năm).

4. Phương pháp tự học giáo trình như thế nào để đạt hiệu quả cao?

Người học nên nắm chắc các định nghĩa toán học và 9 phép toán nguyên thủy của từng mô hình dữ liệu; phân tích chi tiết các đoạn mã nguồn mẫu cài đặt bằng mảng và con trỏ; sau đó tự giải quyết toàn bộ các bài tập lập trình (quản lý danh sách sinh viên, chuyển đổi cơ số bằng ngăn xếp) và trả lời các câu hỏi thảo luận cuối mỗi chương.

5. Giáo trình có cung cấp tài liệu bổ trợ hoặc kênh giải đáp nào không?

Mỗi chương trong giáo trình đều tích hợp hệ thống câu hỏi thảo luận và bài tập thực hành. Người học có thể tham khảo thêm các tài liệu kinh điển được trích dẫn (Đinh Mạnh Tường, Đỗ Xuân Lôi, Niklaus Wirth, Donald Knuth) và gửi ý kiến đóng góp học thuật trực tiếp qua email: dtquy@ictu.vn.


Kết luận

Giáo trình Cấu trúc dữ liệu và thuật toán của Trường Đại học Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên cung cấp một hệ thống tri thức hoàn chỉnh và chuẩn mực về tổ chức dữ liệu và thiết kế giải thuật. Giá trị cốt lõi của tài liệu nằm ở phương pháp tiếp cận hai tầng: mô hình hóa trừu tượng bài toán kỹ thuật sang cấu trúc toán học và chuyển dịch sang cấu trúc lưu trữ vật lý tối ưu trong bộ nhớ máy tính.

Lộ trình học tập khuyến nghị dành cho người học:

  1. Giai đoạn 1: Nắm vững phương pháp phân tích độ phức tạp thuật toán $O(g(n))$, kỹ thuật đệ quy và các tiêu chuẩn lựa chọn cấu trúc dữ liệu tại Chương 1.
  2. Giai đoạn 2: Cài đặt thành thạo các cấu trúc dữ liệu tuyến tính mảng, con trỏ đơn/đôi/vòng, ngăn xếp và hàng đợi tại Chương 2.
  3. Giai đoạn 3: Nghiên cứu 5 dạng biểu diễn cấu trúc cây, cây nhị phân tìm kiếm tại Chương 3 và các phép duyệt đồ thị (DFS, BFS) tại Chương 4.
  4. Giai đoạn 4: Ứng dụng kỹ thuật bảng băm, từ điển tại Chương 5 và hoàn thành các bài tập lớn quản lý dữ liệu thực tế.

Nguồn tài liệu bổ trợ tham khảo: Các công trình học thuật của Đinh Mạnh Tường, Đỗ Xuân Lôi và Niklaus Wirth để mở rộng năng lực lập trình và tối ưu hóa hệ thống phần mềm.