Giới thiệu
Hello mọi người, tuần này mình mới đọc một paper về Mối quan hệ giữa kiến trúc và source code trong thực tế, nghiên cứu này tập trung vào khảo sát và phỏng vấn những role khác nhau trong software development để có cái nhìn của họ về mối quan hệ giữa Kiến trúc phần mềm (Software Architecture) và source code. Cá nhân mình thấy bài nghiên cứu này rất hay mặc dù có nhiều thứ hơi mới với mình, bài viết những developer như mình thấy rõ mối quan hệ gắn kết giữa 2 concepts này mà trước đây mình cảm thấy chưa rõ ràng.
Tóm lược cho bài nghiên cứu
Bài viết này mình chỉ đơn giản là tóm tắt lại và đưa ra những quan điểm của bài nghiên cứu dựa trên những gì mình đã đọc và hiểu. Nếu bạn có thời gian thì hãy xem chi tiết bài nghiên cứu và cùng thảo luận với mình nhé.
Tổng quan
Kiến trúc phần mềm được xem là một lĩnh vực nghiên cứu và ứng dụng quan trọng trong Software. Kiến trúc phần mềm không chỉ thể hiện được cấu trúc cấp cao của toàn bộ hệ thống mà còn là sự mô tả thiết kế dựa trên những yêu cầu functional và non-functional sử dụng các kiến thức liên quan như architecture styles, views, patterns,...
Trong khi đó, source code đóng vai trò là "sự sống", là nơi ta viết code để hiện thực phần mềm, hiện thực hệ thống của phần mềm. Source code có thể được xem là cấu trúc cấp thấp vì đây là nơi ta lưu trữ code và thường không thể hiện được toàn bộ yếu tố hệ thống một cách trực quan. Source code thường không có những patterns cụ thể mà thường là dựa vào kinh nghiệm và recommendation của chính những ngôn ngữ, frameworks mà ta sử dụng.
Do có sự khác nhau về cấp độ ( level of abstarction) nên có thể sẽ dẫn tới sự không mạch lạc và rõ ràng giữa hai thành phần trong quá trình development. Vì thế bài nghiên cứu này đã thực hiện cuộc khảo sát và phỏng vấn những người thuộc role architecturers, developers và chỉ ra những điểm trong mối quan hệ này để giúp những develops hiểu và xây dựng được mối liên kết giữa Kiến trúc phần mềm và Source code.
Các mối quan hệ giữa Kiến trúc phần mềm và Source code
Transformability - Sự chuyển đổi
Transformability ở đây ta có thể hiểu là Kiến trúc hệ thống có thể được chuyển hóa thành Source code, dựa trên các điểm sau:
- Kiến trúc định hướng cho việc code: Kiến trúc hệ thống sẽ giúp xác định được cấu trúc code hay patterns mà sẽ phải sử dụng.
- Kiến trúc là abstraction của code: Kiến trúc với Source code được xem như là 2 mặt Abstract/ Concrete trong OOP vậy. Source code chính là sự rút ra hiện thực từ cấp độ trừu tượng của kiến trúc hệ thống
- Code có thể tự sinh ra từ kiến trúc: Tại thời điểm hiện tại, tuy rằng các mô hình AI đã có thể viết code tự động và sinh ra code dựa trên những mô tả về kiến trúc hệ thống cũng như những UML diagrams mô tả hệ thống nhưng chưa hoàn hảo và trong tương lai gần thì sẽ phát triển hơn nữa.
Traceability - Khả năng bắt kịp
Trong quá trình develop thì ta phải để ý việc liệu kiến trúc hệ thống có bắt kịp theo source code và ngược lại. Có hai điểm ràng buộc ở đây:
- Code và kiến trúc phụ thuộc nhau: về phía coding, ta cần biết về các domain model và những logic liên quan. Nếu như kiến trúc là microservice thì ta cũng phải hiểu về các service tương tác với nhau để có source code ổn định. Ngược lại, ở một số ngôn ngữ cũng như frameworks, họ có những quy ước hay quy tắc mà bắt buộc chúng ta phải tuân theo nên kiến trúc hệ thống sẽ phải thích hợp với điều đó.
- Sự tương đồng giữa code và kiến trúc: Một số thành phần trong kiến trúc hệ thống sẽ tương đương với một số thành phần trong code và ngược lại.
Consistency - Tính nhất quán
Mối quan hệ giữa Kiến trúc với source code luôn phải nhất quán với hệ thống. Code luôn phải bám sát với kiến trúc và phải đồng bộ với nhau. Khi có thay đổi về yêu cầu thì kiến trúc và code phải cùng thay đổi để đấp ứng. Điểm này là sự bổ sung cho ý trên "Code và kiến trúc phụ thuộc nhau" với mục tiêu chung là giữ cho thiết kế và hiện thực luôn đồng bộ và nhất quán trong suốt dự án
Interplay - Tác động lẫn nhau
Khảo sát chỉ ra rằng là chất lượng của kiến trúc sẽ ảnh hưởng tới chất lượng của code theo hướng tích cực. Điều này sẽ khác với điểm nêu trên "Kiến trúc định hướng cho việc code" - ám chỉ là quyết định thiết kế kiến trúc sẽ xác định cấu trúc code, còn đây chỉ đề cập là nếu kiến trúc không rõ ràng và thiếu sót sẽ dẫn tới sai sót trong code và ngược lại.
Kiến trúc phần mềm sẽ định nghĩa những layers, component, các middleware,.... mà sẽ ảnh hưởng tới cách viết code, dùng patterns.
Recovery - Khôi phục kiến trúc từ code
Trong quá trình development, thì từ ý "Sự tương đồng giữa code và kiến trúc" đã cho thấy rằng là một số components mà ta đã hiện thực ở code cũng chính là những thành phần trong kiến trúc. Kết hợp với tổ chức source code, ta có thể xác định được và khôi phục kiến trúc hệ thống từ code - bài nghiên cứu này ta sẽ không đề cập tới những thành phần như cloud services cùng với cloud architecture thường không ảnh hưởng đấng kể với source code.
Hướng tiếp cận
Trong một hệ thống, hầu hết là trước khi ta bắt tay vào code thì cần phải có Kiến trúc đầu tiên và ta sẽ thực hiện theo kiến trúc đó
Để xác định, phân tích và tận dụng môi quan hệ giữa Kiến trúc và Source code thì hầu hết mọi người sẽ tiếp cận theo hướng top-down development - Áp dụng các mô hình Domain-Driven Design, Service-oriented Development cùng với quy trình phát triển Agile để có thể thích ứng nhanh với thay đổi.
Ngoài ra cũng không thể thiếu những công cụ quan trọng trong việc document và modeling hệ thống với các UML diagram như Draw.io
Hiện tại tuy đã áp dụng một số kỹ thuật đánh giá và công cụ phân tích kiến trúc hệ thống ( như là Structure101 ) thì họ vẫn đang gặp khó khăn trong việc liên kết lại Kiến trúc và Source code do vẫn chưa thể hợp nhất hoàn toàn chi tiết kiến trúc vào hiện thực code của hệ thống.
Lợi ích và khó khăn
Việc hiểu và tận dụng được mối quan hệ giữa Kiến trúc phần mềm và Source Code sẽ giúp cả thiện hệ thống về khả năng bảo trì, độ tin cậy và tốc độ.
Tuy nhiên trong quá trình development, sẽ có những bất lợi:
- Chi phí và công sức cần để liên kết Kiến trúc và Source code - cụ thể ở đây bao gồm xây dựng những document, diagram và tổ chức source code
- Thiếu những công cụ để giúp quan sát và xây dựng mối liên kết này
Về mặt ngắn hạn, việc bỏ qua mối quan hệ giữa kiến trúc phần mềm và source code sẽ giúp tăng tốc quá trình phát triển nhưng về lâu dài sẽ tổn chi phí và công sức để bảo trì hệ thống. Tuy vậy, bài nghiên cứu cũng nói rằng là hiện tại chưa có cách tiếp cận nào cụ thể và hiệu quả để thực hiện và cân bằng được lợi ích và chi phí
Tổng kết
Bài nghiên cứu cho mình thấy nhiều khía cạnh thú vị trong mối quan hệ giữa Kiến trúc phần mềm và source code. Đặc biệt là các mối quan hệ về Transformation - sự chuyển đổi, Traceability - Khả năng bắt kịp, Consistency - Tính nhất quán, Interplay - Tác động lẫn nhau và Recovery - Khôi phục kiến trúc từ code. Kiến thức về kiến trúc phần mềm là cần thiết để hiểu rõ về mối quan hệ này. Tuy vậy, rào cản về chi phí và công sức đã gây trở ngại trong việc xác đinh, phân tích và sử dụng mối quan hệ này.
Ngoài ra từ khảo sát cũng cho thấy rằng là cũng có chung sự quan tâm và cần thiết về mối quan hệ này nhưng hiện tại để liên kết hai thành phần này chủ yếu vẫn chỉ là dựa trên kinh nghiệm trong công việc và hiện chưa có cách tiếp cận nào cụ thể và hiệu quả cũng như công cụ hỗ trợ trong việc tiếp cận và xây dựng mối quan hệ giữa kiến trúc phần mềm và source code
Bài viết của mình có thể có nhiều thiếu sót thì bạn đọc có thể góp ý cho mình để viết tốt hơn nhé.
Thanks for reading, have a nice day
Vĩ