✨Kiến trúc phần mềm

Kiến trúc phần mềm

Kiến trúc phần mềm của một chương trình máy tính hay một hệ thống tính toán là cấu trúc của các thành phần trong hệ thống đó. Kiến trúc phần mềm bao gồm các phần tử phần mềm, các thuộc tính và mối quan hệ giữa chúng. Ngoài ra, thuật ngữ "kiến trúc phần mềm" cũng đề cập đến các tài liệu kiến trúc phần mềm của một hệ thống, thuận tiện cho việc trao đổi thông tin giữa các thành viên trong một dự án. Kiến trúc phần mềm giúp việc quyết định ở mức cao trong thiết kế phần mềm dễ dàng hơn và cho phép tái sử dụng các thành phần và mẫu thiết kế của các dự án.

Tổng quan

Lĩnh vực khoa học máy tính trải qua sự kết hợp các vấn đề cùng với sự phức tạp của cấu trúc. Lúc đầu, sự phức tạp được giải quyết bởi người phát triển bằng cách lựa chọn các cấu trúc dữ liệu đúng đắn, phát triển các thuật toán và áp dụng các thuật toán để chia nhỏ các vấn đề. Thuật ngữ kiến trúc phần mềm liên quan đến sự mới mẻ của ngành công nghiệp này, nhưng nguyên tắc cơ bản của nó đã được áp dụng bởi các chuyên gia tiên phong trong ngành công nghệ phần mềm từ những năm 1980. Các cố gắng ban đầu để nắm bắt và giải thích kiến trúc phần mềm của một hệ thống thường không chính xác và chưa được tổ chức rõ ràng. Nó được mô tả bởi các lược đồ "box and line" gồm một tập hợp các hộp và các đường kẻ. Trong những năm 1990, đã có một số nỗ lực tập trung để xác định và hệ thống hoá các khía cạnh cơ bản của môn học. Nhiều khái niệm của mẫu thiết kế (Design Pattern), kiểu dáng (styles), các ngôn ngữ đặc tả và luận lý hình thức (formal logic) đã được phát triển trong thời gian này.

Khái niệm "Kiến trúc phần mềm" tập trung vào việc giảm tải các phức tạp bằng cách trừu tượng hóa vấn đề và phân chia rõ trách nhiệm công việc. Tuy vậy, đến ngày nay vẫn chưa có một khái niệm thật chính xác và rõ ràng cho thuật ngữ "Kiến trúc phần mềm".

Như vậy mặc dù khái niệm "Kiến trúc phần mềm" đã xuất hiện trong các giảng đường đại học và được đưa vào sử dụng trong ngành công nghệ phần mềm, nhưng việc nó vẫn chưa có các quy tắc, luật lệ chung và chưa rõ ràng nên thiết kế kiến trúc phần mềm vẫn là một sự pha tạp giữa "khoa học" và "nghệ thuật". Vẻ "nghệ thuật" của kiến trúc phần mềm được lý giải là do có sự xuất hiện của các yêu cầu phi chức năng của hệ thống mà phần mềm phải đáp ứng được các yêu cầu này, chẳng hạn như các yêu cầu về các thuộc tính chất lượng . Ngoài ra, phần mềm còn phải thỏa mãn các yêu cầu khác như: khả năng chịu lỗi, tính tương thích với các phiên bản cũ của các phần mềm khác (backward compatibility ), khả năng mở rộng, tính tin cậy, khả năng bảo trì, tính hiện hữu, tính bảo mật, tính dễ dùng, và một số các yêu cầu khác nữa .

Để chuyển các quan điểm, yêu cầu của người sử dụng sang kiến trúc phần mềm, cần phải tiến hành một số bước tìm hiểu, tham khảo các yêu cầu riêng và các sở thích riêng của từng loại người dùng phần mềm. Ngoài ra còn phải tìm hiểu, tham khảo các ý kiến của đội phát triển phần mềm, đội bảo trì phần mềm, đội kiểm thử, đội triển khai phần mềm. Vì lẽ đó, kiến trúc phần mềm phải là nơi thỏa mãn được các quan điểm, các yêu cầu của những nguồn khác nhau. Và điều đó cũng đặt ra yêu cầu cho việc phải đảm bảo ngay từ giai đoạn xây dựng kiến trúc phần mềm, đã phải thỏa mãn các quan điểm, yêu cầu của những nguồn khác nhau; trước khi giai đoạn phát triển phần mềm được thực hiện.

Lịch sử

Nguồn gốc của kiến trúc phần mềm như một ý tưởng được giới thiệu đầu tiên trong nghiên cứu của Edsger Dijkstra năm 1968 và David Parnas đầu những năm 1970. Các nhà khoa học nhấn mạnh rằng cấu trúc của một hệ thống phần mềm rất quan trọng và đạt được cấu trúc đúng đắn là một yếu tố quyết định. Các nghiên cứu về lĩnh vực này ngày càng nhiều và trở nên phổ biến từ đầu những năm 1990 cùng với các nghiên cứu tập trung vào các mẫu thiết kế (pattern), ngôn ngữ đặc tả kiến trúc (Architecture Description Languages), tài liệu kiến trúc và các phương pháp chính thức. Các viện nghiên cứu đóng vai trò quan trọng trong nghiên cứu môn học kiến trúc phần mềm. Mary Shaw và David Garlan của viện nghiên cứu Carnegie Mellon đã viết cuốn sách "Software Architecture: Perspectives on an Emerging Discipline" vào năm 1996, mang đến các khái niệm tiến bộ trong kiến trúc phần mềm như thành phần (component), kết nối (connector), kiểu (style) và nhiều thứ nữa. Trường đại học tổng hợp California, viện nghiên cứu phần mềm Irvine cũng có nhiều nỗ lực trong nghiên cứu kiến trúc phần mềm, chủ yếu hướng vào các kiểu kiến trúc, ngôn ngữ đặc tả kiến trúc và các kiến trúc động. Một trong những chuẩn đầu tiên trong kiến trúc phần mềm là chuẩn ANSI/IEEE 1471-2000 được ISO chấp nhận như ISO/IEC DIS 25961.

Lý giải sự quan trọng của kiến trúc phần mềm

Có ba lý do chính để giải thích tầm quan trọng của kiến trúc phần mềm:

Hỗ trợ việc giao tiếp

Hỗ trợ việc giao tiếp với các thành viên trong dự án. Kiến trúc phần mềm tái hiện một vẻ bề ngoài trừu tượng của hệ thống. Với sự trừu tượng hóa hệ thống với các khái niệm dễ hiểu, những thành viên trong dự án sẽ chỉ cần vận dụng các kiến thức cơ bản của mình về hệ thống trong việc tìm hiểu, dàn xếp, phối hợp làm việc, và bàn bạc trao đổi với nhau.

Giúp ra quyết định sớm hơn

Việc ra quyết định được thực hiện sớm hơn. Kiến trúc phần mềm biểu thị các quyết định thiết kế dành cho hệ thống. Như vậy các đội tham gia phát triển, triển khai, kiểm thử và bảo trì phần mềm cũng như các nhóm người dùng và các cấp quản lý sẽ có cái nhìn tổng quan hơn cũng như sớm hơn về hệ thống ngay từ khi nó còn sơ khai. Mỗi đội đó sẽ có các đóng góp ý kiến của mình, các đề xuất cũng như các phản bác của mình khi mọi chuyện chưa quá muộn. Nếu không có quyết định sớm, thì khi phần mềm đã được xây dựng hoàn chỉnh hoặc khá hoàn chỉnh mà đột ngột xuất hiện các yêu cầu thay đổi từ phía nhóm này hoặc nhóm khác, ngoài việc gây trì trệ cho tiến độ công việc mà còn có thể gây ra tâm lý căng thẳng, mâu thuẫn giữa các đội tham gia trong dự án.

Tính khả chuyển cho hệ thống

Kiến trúc phần mềm không phụ thuộc vào một ngôn ngữ cụ thể nào cả mà chỉ tuân theo một số chuẩn của các ngôn ngữ đặc tả nó. Ngoài ra, kiến trúc phần mềm khi được xây dựng cho một hệ thống, nó tạo thành một mô hình có sự gắn kết tương đối với hệ thống. Kiến trúc phần mềm còn chỉ ra cách thức mà phần mềm làm việc với hệ thống. Do vậy, khi ta muốn chuyển phần mềm sang làm việc ở các hệ thống khác có những điểm tương đồng nhất định với hệ thống cũ thì phần mềm này cũng sẽ có các thuộc tính chất lượng và các yêu cầu chức năng được đảm bảo là không quá khác so với khi tồn tại ở hệ thống cũ.

Mô tả kiến trúc phần mềm

Ngôn ngữ đặc tả kiến trúc

Ngôn ngữ đặc tả kiến trúc ADL (Architecture Description Languages) được sử dụng để mô tả một kiến trúc phần mềm. Có nhiều ngôn ngữ ADL khác nhau được phát triển bởi các tổ chức như Wrigh (được phát triển bởi Carnegie Mellon), ACME (Carnegie Mellon), xADL (UCI), Darwin (Imperial College London), DAOP-ADL (Trường đại học Málaga - Tây Ban Nha). Các thành phần cơ bản của một ngôn ngữ ADL là thành phần, kết nối và cấu hình hệ thống.

Các khung nhìn

Một số khung nhìn phổ biến là: Khung nhìn theo các chức năng/view logic (Functional/logic view) Khung nhìn theo mã nguồn (Code view) Khung nhìn theo tư tưởng phát triển/ cấu trúc (Development/structural view) Khung nhìn về xử lý đồng thời /tiến trình / thread (Concurrency/process/thread view) Khung nhìn vật lý /view triển khai / (Physical/deployment view) Khung nhìn theo hành động người sử dụng (User action/feedback view)

👁️ 0 | 🔗 | 💖 | ✨ | 🌍 | ⌚
**Kiến trúc phần mềm** của một chương trình máy tính hay một hệ thống tính toán là cấu trúc của các thành phần trong hệ thống đó. _Kiến trúc phần mềm_ bao gồm các phần
**Phần mềm dạng dịch vụ** (**SaaS** ) là mô hình cấp phép và phân phối phần mềm trong đó phần mềm được cấp phép trên cơ sở đăng ký và được lưu trữ tập trung.
**Model-Driven Architecture** (MDA) hay còn gọi là kiến trúc định hướng mô hình, là một phương thức trong việc thiết kế và phát triển phần mềm, được Object Management Group (OMG) giới thiệu lần đầu
**Mir** là một máy chủ hiển thị máy tính và gần đây, bộ tổng hợp Wayland cho hệ điều hành Linux, được phát triển bởi Canonical Ltd. Nó đã được lên kế hoạch thay thế
Phần mềm là các lệnh được lập trình mà được lưu trữ trong bộ nhớ được lưu trữ của các máy tính kỹ thuật số để bộ xử lý thực hiện. Phần mềm là một
**Kiến trúc sư** (chữ Hán: 建筑师; bính âm: _Jiànzhúshī_; phiên âm: _kiến trúc sư_; tạm dịch: _người thầy có chuyên môn kỹ thuật và thẩm mỹ về kiến tạo cấu trúc_) là người thông qua
**Kiểm thử phần mềm** (tiếng Anh: **Software testing**) là một cuộc kiểm tra được tiến hành để cung cấp cho các bên liên quan thông tin về chất lượng của sản phẩm hoặc dịch vụ
**Zoom** là phần mềm gọi video phát triển bởi Zoom Video Communications. Phiên bản miễn phí cung cấp gọi video với tối đa 100 thiết bị cùng lúc, và giới hạn thời gian là 40
**Wine** là một lớp tương thích tự do nguồn mở dùng để chạy các phần mềm viết cho Windows trên các hệ điều hành tương tự Unix (Linux, FreeBSD,...). Wine cũng cung cấp một thư
**Đà Lạt** là phường may mắn sở hữu nhiều di sản kiến trúc giá trị, ví dụ như bảo tàng lưu trữ kiến trúc thuộc địa thế kỷ XX,... Từ một đô thị nghỉ dưỡng
nhỏ| Một sơ đồ cho thấy cách người dùng tương tác với [[phần mềm ứng dụng trên một máy tính để bàn thông thường. Lớp phần mềm ứng dụng giao tiếp với hệ điều hành,
**Phần mềm xử lý bảng tính** hay **Bảng tính** (tiếng Anh**: Spreadsheet**) là một phần mềm ứng dụng dùng để tổ chức, phân tích và lưu trữ dữ liệu thông qua các bảng tính (gọi
Một **tập lệnh**, hoặc **kiến trúc tập lệnh** (tiếng Anh: instruction set architecture, viết tắt _ISA_), là một phần của kiến trúc máy tính liên quan đến lập trình, bao gồm các bản địa các
**Phần mềm tự do nguồn mở** (Tiếng Anh: _Free and open-source software_ (Viết tắt là F/OSS, FOSS) hoặc _Free/Libre/open-source software_ (Viết tắt là FLOSS)) là loại phần mềm được bao gồm Phần mềm tự do
**Kiến trúc tham số** (Parametric architecture/ Parametricism) là dạng kiến trúc, ở đó các đối tượng thiết kế (công trình hoặc đô thị) không phải là đối tượng tĩnh, các mối quan hệ bên trong
thumb|alt=Màn hình máy tính của hệ điều hành, màn hình hiển thị các ứng dụng phần mềm tự do khác nhau.|Ví dụ về một hệ điều hành phần mềm tự do hiện đại chạy một
**Quy trình phát triển phần mềm** _(software development methodology)_ là một cấu trúc bao gồm tập hợp các thao tác và các kết quả tương quan sử dụng trong việc phát triển để sản xuất
**RPM Package Manager** (**RPM**) (ban đầu là **Red Hat Package Manager**; bây giờ là một từ viết tắt đệ quy) là một trình quản lý gói. Tên gọi RPM đề cập đến: định dạng file.rpm,
Trong công nghệ phần mềm, một **mẫu thiết kế** (tiếng Anh: design pattern) là một giải pháp tổng thể cho các vấn đề chung trong thiết kế phần mềm. Một mẫu thiết kế không phải
liên_kết=https://en.wikipedia.org/wiki/File:ClamTk_5.27.png|nhỏ|300x300px|[[ClamTk, một phần mềm diệt vi-rút mã nguồn mở dựa trên công cụ diệt virus ClamAV, ban đầu được Tomasz Kojm phát triển vào năm 2001.]] nhỏ|255x255px|Ảnh chụp giao diện phần mềm diệt virus có
nhỏ|[[Nhà thờ chính tòa Đức Bà Reims, một thí dụ đặc sắc của kiến trúc Gothic Pháp]] nhỏ|hochkant=1.3|Mặt phía Tây của [[Nhà thờ chính tòa Wells, khoảng 1260]] **Kiến trúc Gothic** (hay **Gothique**, _Gô-tích_) ra
Một ví dụ về mặt tiền của [[Nhà thờ Vilnius với phong cách Tân cổ điển.]] **Kiến trúc tân cổ điển** là một phong cách kiến ​​trúc do trào lưu tân cổ điển tạo ra,
**Công ty phần mềm** là một công ty có các sản phẩm chính là các phần mềm, công nghệ phần mềm, phân phối và phát triển sản phẩm phần mềm. Công ty phần mềm là
**Phát triển phần mềm linh hoạt** hoặc **lập trình linh hoạt** (tiếng Anh: **_Agile software development_** hay **_Agile programming_**) là một phương thức thực hiện các dự án công nghệ phần mềm, phương thức này
**Nhà phát triển phần mềm** là một cá nhân hay một tổ chức có liên quan đến các vấn đề trong quá trình phát triển phần mềm ở mức cao hơn việc chỉ thiết kế
**Quản lý dự án phần mềm** việc lên kế hoạch có tính khoa học và nghệ thuật trong quá trình quản lý các dự án phần mềm. Nó chính là quy trình quản lý dự
**Phần mềm thiết kế mạch in** là phần mềm dùng cho thiết kế ra **bảng mạch in** dựa trên sơ đồ mạch điện cho trước. Nó gồm có thực hiện bố trí vị trí các
**Origin** là một nền tảng phân phối kỹ thuật số được phát triển bởi Electronic Arts để mua và chơi các trò chơi điện tử. Phần mềm này có sẵn cho máy tính và
**Mono** là một dự án tự do nguồn mở nhằm tạo ra một để tạo software framework tương thích .NET Framework tương thích tiêu chuẩn Ecma, bao gồm một trình biên dịch C# và Common
**Phần mềm hệ thống** là phần mềm máy tính thiết kế cho việc vận hành và điều khiển phần cứng máy tính và cung cấp một kiến trúc cho việc chạy _phần mềm ứng dụng_.
**Phần mềm gián điệp**, còn được dùng nguyên dạng Anh ngữ là **spyware**, là loại phần mềm chuyên thu thập các thông tin từ các máy chủ (thông thường vì mục đích thương mại) qua
**Công nghệ phần mềm** () là sự áp dụng một cách tiếp cận có hệ thống, có kỷ luật, và định lượng được cho việc phát triển, sử dụng và bảo trì phần mềm. Ngành
nhỏ|Ảnh chụp màn hình trò chơi giáo dục Chinese Tap trên Android để dạy học tiếng Trung. **Phần mềm giáo dục** là phần mềm máy tính có nhiệm vụ chính là hỗ trợ dạy học
**Blender** là một phần mềm đồ họa 3D miễn phí và nguồn mở, được sử dụng để làm phim hoạt hình, kỹ xảo, ảnh nghệ thuật, mẫu in 3D, phần mềm tương tác 3D và
**Phần mềm quảng cáo** hay **nhu liệu quảng cáo** thường đính kèm với những mẩu quảng cáo nhỏ, chúng thường được phân phát dưới hình thức phần mềm miễn phí hay phiên bản dùng thử.
nhỏ|Một trang trong nhật ký của máy tính cơ điện Harvard Mark II, có hình một con bướm đêm đã chết đã được lấy ra khỏi thiết bị **Lỗi phần mềm** là một lỗi hay
**Phát triển phần mềm** là việc chuyển nhu cầu của người dùng hoặc mục tiêu tiếp thị thành một sản phẩm phần mềm. Phát triển phần mềm đôi khi được hiểu là sự bao gồm
**Xây dựng phần mềm** (tiếng Anh:_Software construction_) là một quy tắc kỹ thuật phần mềm. Nó là quá trình tạo ra chi tiết của phần mềm thông qua sự kết hợp của viết mã, xác
Trong đồ họa máy tính, [https://toplistvietnam.net/toplist-phan-mem-thiet-ke-do-hoa-pho-bien-2023/ phần mềm đồ họa] đề cập đến một chương trình hoặc bộ sưu tập các chương trình cho phép một người thao tác hình ảnh hoặc mô hình trực
**Điện toán phân tán** (tiếng Anh: _Distributed computing_) là một ngành khoa học máy tính nghiên cứu các hệ thống phân tán. _Hệ thống phân tán_ (distributed system) là hệ thống phần mềm mà các
Môi trường phát triển tích hợp Eclipse phiên bản 3.1.2 trên nền Windows XP. **Eclipse** là một môi trường phát triển tích hợp dùng cho lập trình máy tính., Nó chứa một không gian làm
**Thiết kế phần mềm** là một quá trình giải quyết vấn đề và lập kế hoạch cho một giải pháp phần mềm.Sau khi các mục đích và đặc điểm kĩ thuật của phần mềm được
**Orange** là hệ điều hành nhân bản của Linux (dòng Minimal X của OpenSUSE). Hệ điều hành này dựa trên kiến trúc x86 (32-bit) của Intel và chạy được dưới bộ vi x86 của Intel
**Flutter** là một SDK phát triển ứng dụng di động nguồn mở được tạo ra bởi Google. Nó được sử dụng để phát triển ứng ứng dụng cho Android và iOS, cũng là phương thức
**Planner** là một phần mềm quản lý dự án mã nguồn mở, được Imemdio thiết kế. Planner hỗ trợ sơ đồ Gantt, quản lý tài nguyên dự án. Nó có thể tích hợp với rất
**ARM** (được viết cách điệu là **arm**, trước đây là từ viết tắt của **Advanced RISC Machine**, ban đầu là **Acorn RISC Machine**) là một họ kiến trúc dạng RISC cho các vi xử lý
The X Window System logo Trong vi tính, **Hệ thống X Window** (thường được gọi tắt là **X11** hoặc **X**) là một hệ thống cửa sổ xuyên dụng mạng dùng để hiển thị đồ họa
**Phần mềm máy chủ ứng dụng** (tiếng Anh: _Application Server_) là một phần mềm (software engine) trong cung cấp ứng dụng phần mềm cho các máy trạm hoặc thiết bị, thông thường là qua mạng
thumb|Các vòng lặp lên kế hoạch và phản hồi trong lập trình cực hạn **Lập trình cực hạn** (tiếng Anh: **Extreme programming**, viết tắt là **XP**) là một quy trình phát triển phần mềm nhằm
nhỏ|Hackday với [[Jolla, Mer và Nemo Mobile tháng 8/2012]] **Sailfish OS** (cũng được viết là **SailfishOS** Hệ điều hành được phát hành cùng với máy tính bảng và smartphone Jolla (dừng bán năm 2016 nhưng