Tổng quan nghiên cứu

Trong lĩnh vực kỹ thuật phần mềm, chất lượng mã nguồn đóng vai trò then chốt trong việc đảm bảo khả năng bảo trì, mở rộng và hiệu suất của ứng dụng. Theo ước tính, các ứng dụng phần mềm hiện đại ngày càng phức tạp với quy mô mã nguồn tăng lên đáng kể, dẫn đến sự xuất hiện phổ biến của các hiện tượng mã xấu (code smells) – những cấu trúc mã vi phạm nguyên tắc thiết kế cơ bản, làm giảm chất lượng phần mềm. Mã xấu không phải lỗi kỹ thuật trực tiếp nhưng gây khó khăn trong phát triển và bảo trì, làm tăng chi phí và rủi ro lỗi trong tương lai. Mục tiêu nghiên cứu của luận văn là phát triển một phương pháp phát hiện mã xấu trong mã nguồn Java bằng cách ứng dụng kỹ thuật học sâu dựa trên biểu diễn đồ thị của mã nguồn, nhằm nâng cao độ chính xác và hiệu quả so với các phương pháp hiện có.

Phạm vi nghiên cứu tập trung vào bốn dạng mã xấu phổ biến gồm Complex Method (phương thức phức tạp), Complex Conditional (điều kiện phức tạp), Feature Envy (lớp quan tâm đến phần không thuộc lớp đó) và Multifaceted Abstraction (lớp thực hiện nhiều trách nhiệm khác nhau). Nghiên cứu sử dụng bộ dữ liệu mã nguồn Java được xây dựng công phu, kết hợp giữa công cụ tự động và đánh giá thủ công, trong khoảng thời gian gần đây, tại các dự án mã nguồn mở. Ý nghĩa của nghiên cứu được thể hiện qua việc cải thiện các chỉ số đánh giá như độ chính xác, F1-score và MCC trong phát hiện mã xấu, góp phần giảm thiểu nợ kỹ thuật và nâng cao chất lượng phần mềm trong thực tế phát triển.

Cơ sở lý thuyết và phương pháp nghiên cứu

Khung lý thuyết áp dụng

Luận văn dựa trên ba nền tảng lý thuyết chính:

  1. Đồ thị thuộc tính mã nguồn (Code Property Graph - CPG): Kết hợp ba biểu diễn mã nguồn gồm cây cú pháp trừu tượng (AST), đồ thị luồng điều khiển (CFG) và đồ thị phụ thuộc chương trình (PDG) thành một đồ thị đa cạnh có hướng, mang đầy đủ thông tin về cấu trúc, luồng thực thi và phụ thuộc dữ liệu trong mã nguồn. CPG giúp biểu diễn mã nguồn một cách toàn diện, hỗ trợ phân tích sâu sắc các đặc trưng phức tạp của mã.

  2. Mạng nơ-ron đồ thị (Graph Neural Network - GNN): Mạng nơ-ron chuyên xử lý dữ liệu dạng đồ thị, tổng hợp và biến đổi đặc trưng của các nút dựa trên thông tin từ các nút láng giềng. Các biến thể được sử dụng gồm Relational Graph Convolutional Network (RGCN), Fast Graph Convolutional Network (FastGCN) và Relational Graph Attention Network (RGAT), mỗi loại có ưu điểm riêng trong việc xử lý các mối quan hệ đa dạng và tăng tốc độ học.

  3. Các dạng mã xấu chuyên ngành: Nghiên cứu tập trung vào bốn dạng mã xấu đặc trưng trong kỹ thuật phần mềm: Complex Method, Complex Conditional, Feature Envy và Multifaceted Abstraction, được định nghĩa rõ ràng dựa trên các chỉ số như độ phức tạp chu trình, cấu trúc điều kiện và mức độ kết dính của lớp.

Phương pháp nghiên cứu

Nguồn dữ liệu chính là bộ dữ liệu mã nguồn Java được xây dựng từ các dự án mã nguồn mở, đã được gán nhãn mã xấu thông qua kết hợp công cụ tự động Designite và đánh giá thủ công của chuyên gia. Bộ dữ liệu này bao gồm khoảng vài nghìn mẫu mã nguồn với tỷ lệ cân bằng giữa các lớp mã xấu và mã sạch.

Quy trình nghiên cứu gồm các bước:

  • Chuyển đổi mã nguồn sang đồ thị thuộc tính (CPG): Sử dụng công cụ Joern để phân tích mã nguồn Java, tạo ra các tệp JSON biểu diễn các nút và cạnh của CPG, kết hợp thông tin từ AST, CFG và PDG.

  • Tiền xử lý và nhúng đặc trưng: Mỗi nút trong CPG được nhúng thành vector đặc trưng bằng phương pháp Word2Vec, giúp mô hình học sâu có thể xử lý dữ liệu số.

  • Xây dựng và huấn luyện mô hình GNN: Thử nghiệm ba kiến trúc mạng nơ-ron đồ thị RGCN, FastGCN và RGAT với cấu hình gồm 2 lớp mạng, kích thước đặc trưng ẩn 32, tốc độ học 0.0001, dropout 0.2, huấn luyện tối đa 50 epoch. Mô hình được huấn luyện để phân loại nhị phân đoạn mã có chứa mã xấu hay không.

  • Đánh giá mô hình: Sử dụng các chỉ số Precision, Recall, F1-score và Matthews Correlation Coefficient (MCC) để đánh giá hiệu quả phát hiện mã xấu trên từng dạng.

Timeline nghiên cứu kéo dài trong khoảng 12 tháng, bao gồm thu thập dữ liệu, xây dựng mô hình, huấn luyện và đánh giá.

Kết quả nghiên cứu và thảo luận

Những phát hiện chính

  1. Hiệu quả vượt trội của GRACOS so với DeepSmells: GRACOS đạt F1-score trung bình trên 0.75 cho dạng Complex Method, cao hơn khoảng 5% so với DeepSmells. Với Complex Conditional, GRACOS cải thiện F1-score từ khoảng 0.6 lên gần 0.7, thể hiện khả năng nhận diện điều kiện phức tạp tốt hơn.

  2. Khả năng nhận diện Feature Envy và Multifaceted Abstraction: GRACOS đạt F1-score lần lượt khoảng 0.55 và 0.5, vượt trội so với các phương pháp trước đó chỉ đạt dưới 0.35. Điều này chứng tỏ mô hình học sâu dựa trên đồ thị có khả năng nắm bắt các đặc trưng thiết kế phức tạp.

  3. So sánh giữa các kiến trúc GNN: RGAT cho kết quả tốt nhất với độ chính xác và F1-score cao hơn RGCN và FastGCN khoảng 3-4%, nhờ cơ chế chú ý giúp tập trung vào các mối quan hệ quan trọng trong đồ thị. FastGCN thể hiện ưu thế về tốc độ huấn luyện, giảm thời gian khoảng 30% so với RGCN.

  4. Tác động của việc sử dụng CPG: Việc biểu diễn mã nguồn dưới dạng CPG giúp mô hình học sâu nhận diện các đặc trưng liên kết và phụ thuộc phức tạp, cải thiện đáng kể độ chính xác so với các phương pháp chỉ sử dụng dữ liệu dạng văn bản hoặc chỉ số thống kê.

Thảo luận kết quả

Nguyên nhân chính của sự cải thiện là do GRACOS tận dụng biểu diễn đồ thị thuộc tính mã nguồn, cung cấp thông tin phong phú về cấu trúc và luồng điều khiển, giúp mô hình học sâu nhận diện các mẫu phức tạp của mã xấu. Cơ chế chú ý trong RGAT giúp mô hình tập trung vào các mối quan hệ quan trọng, giảm nhiễu từ các phần không liên quan.

So với các nghiên cứu trước, GRACOS khắc phục được hạn chế của DeepSmells trong việc nhận diện các dạng mã xấu thiết kế như Feature Envy và Multifaceted Abstraction. Kết quả này phù hợp với các nghiên cứu về ứng dụng GNN trong phân tích mã nguồn, đồng thời mở rộng khả năng ứng dụng học sâu trong kỹ thuật phần mềm.

Dữ liệu có thể được trình bày qua biểu đồ so sánh F1-score giữa các phương pháp trên từng dạng mã xấu, bảng thống kê chi tiết các chỉ số Precision, Recall, F1 và MCC cho từng mô hình, giúp minh họa rõ ràng hiệu quả của GRACOS.

Đề xuất và khuyến nghị

  1. Triển khai công cụ phát hiện mã xấu dựa trên GRACOS: Đề xuất phát triển một plugin tích hợp vào môi trường phát triển tích hợp (IDE) phổ biến như IntelliJ hoặc Eclipse, giúp lập trình viên phát hiện và cảnh báo mã xấu ngay trong quá trình viết mã. Mục tiêu giảm tỷ lệ mã xấu phát sinh ít nhất 20% trong vòng 6 tháng đầu áp dụng.

  2. Đào tạo và nâng cao nhận thức về mã xấu: Tổ chức các khóa đào tạo chuyên sâu cho lập trình viên và nhóm phát triển về nhận diện và xử lý mã xấu, sử dụng công cụ tự động để hỗ trợ. Mục tiêu nâng cao tỷ lệ phát hiện mã xấu thủ công lên trên 70% trong 1 năm.

  3. Mở rộng nghiên cứu sang các ngôn ngữ lập trình khác: Áp dụng phương pháp GRACOS cho các ngôn ngữ phổ biến khác như C#, Python để đánh giá tính tổng quát và hiệu quả. Dự kiến hoàn thành nghiên cứu mở rộng trong 12-18 tháng.

  4. Phát triển hệ thống tái cấu trúc tự động: Kết hợp công cụ phát hiện mã xấu với các giải pháp tái cấu trúc tự động, giúp tự động sửa chữa hoặc đề xuất cải tiến mã nguồn, giảm thiểu nợ kỹ thuật. Mục tiêu thử nghiệm hệ thống trong các dự án thực tế trong vòng 2 năm.

Đối tượng nên tham khảo luận văn

  1. Lập trình viên và nhóm phát triển phần mềm: Giúp nâng cao kỹ năng nhận diện và xử lý mã xấu, cải thiện chất lượng mã nguồn và hiệu quả làm việc nhóm.

  2. Nhà quản lý dự án phần mềm: Cung cấp công cụ và phương pháp đánh giá chất lượng mã nguồn, hỗ trợ quản lý rủi ro kỹ thuật và tối ưu hóa chi phí bảo trì.

  3. Nhà nghiên cứu và sinh viên ngành Công nghệ thông tin: Là tài liệu tham khảo quý giá về ứng dụng học sâu và mạng nơ-ron đồ thị trong phân tích mã nguồn, mở ra hướng nghiên cứu mới.

  4. Các công ty phát triển công cụ hỗ trợ lập trình: Cơ sở để phát triển các sản phẩm phát hiện và xử lý mã xấu tự động, nâng cao giá trị sản phẩm và trải nghiệm người dùng.

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

  1. Mã xấu là gì và tại sao cần phát hiện?
    Mã xấu là các cấu trúc mã vi phạm nguyên tắc thiết kế, không gây lỗi ngay nhưng làm giảm khả năng bảo trì và mở rộng. Phát hiện mã xấu giúp giảm chi phí bảo trì và tăng chất lượng phần mềm.

  2. Phương pháp học sâu dựa trên đồ thị có ưu điểm gì?
    Phương pháp này khai thác cấu trúc phức tạp của mã nguồn qua biểu diễn đồ thị, giúp mô hình học sâu nhận diện các đặc trưng liên kết và phụ thuộc mà các phương pháp truyền thống khó nắm bắt.

  3. GRACOS khác gì so với các phương pháp trước?
    GRACOS sử dụng đồ thị thuộc tính mã nguồn kết hợp với mạng nơ-ron đồ thị hiện đại như RGAT, cải thiện đáng kể độ chính xác trong phát hiện nhiều dạng mã xấu, đặc biệt là các dạng thiết kế phức tạp.

  4. Bộ dữ liệu nghiên cứu có tính khách quan không?
    Bộ dữ liệu được xây dựng kết hợp công cụ tự động và đánh giá thủ công bởi chuyên gia, đảm bảo tính khách quan và thực tiễn cao, phù hợp cho huấn luyện và đánh giá mô hình.

  5. Có thể áp dụng phương pháp này cho ngôn ngữ khác không?
    Phương pháp có thể mở rộng cho các ngôn ngữ lập trình khác có cấu trúc tương tự, tuy nhiên cần điều chỉnh công cụ chuyển đổi mã nguồn sang đồ thị phù hợp với từng ngôn ngữ.

Kết luận

  • Luận văn đã phát triển thành công phương pháp GRACOS sử dụng học sâu dựa trên đồ thị để phát hiện mã xấu trong mã nguồn Java, cải thiện hiệu quả so với các phương pháp hiện đại.
  • Phương pháp tận dụng biểu diễn đồ thị thuộc tính mã nguồn (CPG) và mạng nơ-ron đồ thị (RGCN, RGAT, FastGCN) để nắm bắt các đặc trưng phức tạp của mã xấu.
  • Kết quả thực nghiệm cho thấy GRACOS vượt trội trong nhận diện bốn dạng mã xấu: Complex Method, Complex Conditional, Feature Envy và Multifaceted Abstraction.
  • Nghiên cứu mở ra hướng phát triển công cụ hỗ trợ lập trình viên phát hiện và xử lý mã xấu tự động, góp phần nâng cao chất lượng phần mềm.
  • Các bước tiếp theo bao gồm mở rộng bộ dữ liệu, áp dụng cho các ngôn ngữ khác và phát triển hệ thống tái cấu trúc tự động, đồng thời triển khai ứng dụng thực tế.

Hành động ngay: Các nhà phát triển phần mềm và nhà nghiên cứu được khuyến khích áp dụng và tiếp tục phát triển phương pháp này để nâng cao chất lượng sản phẩm và thúc đẩy nghiên cứu trong lĩnh vực kỹ thuật phần mềm hiện đại.