Chương 3: Xây dựng phần mềm

Nguyễn Việt Anh Tạ Tuấn Anh

Giới thiệu

Xây dựng phần mềm xem chi tham chiếu đến quy trình xây dựng phần mềm chi tiết dựa vào lập trình, kiểm thử, kiểm thử từng phần, kiểm thử tích hợp, tìm và sửa lỗi. Trong lĩnh vực tri thức xây dựng phần mềm (KA) được liên kết tới tất cả các lĩnh vực ri thức khác. Xây dựng phần mềm liên hệ mật thiết với Thiết kế phần mềm và Kiểm thử phần mềm bởi vì quy trình xây dựng phần mềm tham gia vào thiết kế và kiểm thử một phần mềm cụ thể. Quy trình xây dựng phần mềm sử dụng đầu và và yêu cầu đầu vào để kiểm thử. Danh giới giữa thiết kế, xây dựng và kiểm thử sẽ thay đổi phụ thuộc vào quy trình vòng đời của phần mềm được sử dụng trong một dự án.

Thông thường thiết kế chi tiết được thực hiện trước khi xây dựng và tốn nhiều nguồn lực trong quá trình xây dựng phần mềm. Do vậy, lĩnh vực tri thức xây dựng phần mềm có liên hệ mật thiết với lĩnh vực tri thức thiết kế phần mềm.

Thông qua việc xây dựng, các kỹ sư phần mềm thực hiện cả kiểm thử từng phần (unit test) và kiểm thử tích hợp (integration test). Do vậy, lĩnh vực tri thức xây dựng phần mềm liên hệ mật thiết với kiến thức kiểm thử phần mềm. Xây dựng phần mềm sản sinh ra tối đa số các tài liệu phục vụ việc quản trị trong dự án phần mềm như (các tệp mã nguồn, tài liệu dự án: tài liệu kịch bản kiểm thử, tài liệu yêu cầu,....). Do vậy kiến thức xây dựng phần mềm cũng liên hệ mật thiết đến việc quản lý cấu hình phần mềm. Trong khi chất lượng phần mềm thực sự rất quan trọng trong thất cả lĩnh vực tri thức phần mềm, do vậy kiến thức quản lý chất lượng phần mềm có liên hệ mật thiết với kiến thức xây dựng phần mềm. Từ đó xây dựng phần mềm yêu cầu kiến thức về thuật toán và kỹ năng lập trình có mối liên hệ với kiến thức thành lập máy tính và khoa học máy tính. Ngành khoa học máy tính hỗ trợ thiết kế và xây dựng sản phẩm phầm mềm và cũng liên quan đến quản trị dự án giống như quản trị xây dựng phần mềm có thể coi như là những thử thách.

1. Những nguyên tắc cơ bản xây dựng phần mềm.

  • Tối thiểu hóa độ phức tạp.
  • Ứng phó thay đổi.
  • Xây dựng kiểm thử.
  • Sử dụng lại
  • Các tiêu chuẩn xây dựng.

Bốn khái niêm cơ bản đầu ứng dụng trong việc thiết kế và xây dựng phần mềm. Các phần dưới đây định nghĩa các khái niệm và diễn tả chúng ứng dụng trong việc xây dựng phần mềm như thế nào.

1.1. Tối thiểu hóa độ phực tạp

Hầu hết con người bị giới hạn trong khả năng tổ nắm bắt và tổ chức cấu trúc phức tạp và thông tin trong bộ não thông qua thời gian dài. Điều này chỉ ra nguyên nhân chủ yếu ảnh hưởng đến con người chú trọng vào máy tính, coi trọng việc xây dựng phần mềm tối thiểu hóa độ phức tạp của vấn đề. Việc tối thiểu hóa độ phức tạp áp dụng trong mọi khía cạnh xây dựng phần mềm và công việc xây dựng kế hoạch kiểm thử phần mềm. Việc xây dựng phần mềm, giảm thiểu độ phức tạp tập trung vào việc viết mã nguồn đơn giản, dễ đọc hơn là việc viết chương thông minh làm tăng độ phức tạp.

1.2. Ứng phó với sự thay đổi

Hầu hết phần mềm sẽ thay đổi theo thời gian, do vậy phải có chính sách để ứng phó với nhiều hình thức thay đổi của xây dựng phần mềm, hay thay đổi môi trường có thể ảnh hưởng tiêu cực đến phần mềm. Ứng phó thay đổi giúp cho các kỹ sư phần mềm xây dựng phần có thể chỉnh sửa, cập nhật phần mềm hay mở rộng phần mềm không gây ra lỗi.

1.3. Xây dựng kế hoạch kiểm thử

Xây dựng kế hoạch kiểm thử có nghĩa rằng các lỗi dễ dàng được phát hiện bởi kỹ sư phần mềm trong khi viết chương trình, cùng với cán bộ kiểm thử trong hoạt động kiểm thử và người dùng dùng phần mềm. Các kỹ thuật cụ thể hỗ trợ việc xây dựng kế hoạch kiểm thử tiêu chuẩn viết mã nguồn, xét duyệt mã nguồn và kiểm thử từng phần, xây dựng kiểm thử tự động (automaticed test) hạn chế việc phức tạp hóa mã nguồn với các cấu trúc phức tạp gây khó hiểu.

1.4. Sử dụng lại.

Sử dụng lại là muốn nói đến việc sử dụng những thứ đã có sẵn để giải quyết các vấn đề khác nhau. Trong việc xây dựng phần mềm, các phần được sử dụng lại như: các thư viện, các chương trình nhỏ (module), các thành phần (Components), mà nguồn, và các tài sản thương mại khác. Sử dụng lại được làm có hệ thống tuân theo quy trình lặp đi lặp lại đã kiểm định tốt trước đó. Sử dụng lại một cách có hệ thống có khả năng cải thiện được chất lượng, và chi phí của sản phẩm phần mềm.

Sử dụng lại được hình thành dưới hai hình thức “Xây dựng các thư viện nhằm mục đích sử dụng lại” và “Sử dụng lại các thư viện có sẵn”. Những người đi trước xây dựng ra các thư viện phần mềm cho phép sử lại và những nhà phát triển phần mềm sau này sẽ sử dụng lại các thư viện của người đi trước để xây dựng phần mềm. Việc sử dụng lại luôn trong suốt trong quá trình phát triển của dự án điều này có nghĩa là thư viện sử dụng lại được phát triển bởi một dự án khác hay của một tổ chức khác.

Ví dụ: Trong Project 1: Website Trường học điện tử được xây dựng dựa trên các plugin có sẵn của wordpress. Đồng thời chỉnh sửa những plugin đó cho phù hợp với chức năng của hệ thống hiện thời: xuất đề dạng pdf, ...

1.5. Những tiêu chuẩn trong việc xây dựng phần mềm.

Ứng dụng các tiêu chuẩn phát triển bên trong và bên ngoài trong khi xây dựng phần mềm nhằm mục đích tăng tính hiệu quả, giảm thiểu chi phí, và tăng chất lượng của phần mềm ví dụ như việc chọn lựa ngôn ngữ lập trình ảnh hưởng đến vòng đời phát triển của phần mềm. Những vẫn đề ảnh hưởng trực tiếp tới việc xây dựng phần mềm như:

  • Phương thức trao đổi.
  • Ngôn ngữ lập trình.
  • Những quy định, quy ước khi viết mã nguồn.
  • Chọn nền tảng xây dựng.

2. Quản lý việc xây dựng phần mềm

2.1. Các quy trình chu kỳ xây dựng phần mềm

Có nhiều quy trình được xây dựng và áp dụng vào trong việc phát triển phần mềm, trong đó có một số mô hình được chú trọng phát triển hơn các mô hình khác. Một vài quy trình xây dựng phần mềm tuần tự như mô hình thác nước, mô hình bàn giao giai đoạn. Những mô hình này coi việc xây dựng giống như một hoạt động chỉ xảy ra khi các công đoạn trước đó như: lấy yêu cầu, thiết kế, và có kế hoạch chi tiết, phải được hoàn thành. Cách tiếp cận tuần tự theo nhu hướng nhấn mạnh các hoạt động mà việc xây dựng bao gồm lấy yêu cầu và thiết kế phải được thực hiện trước và là các hoạt động riêng rẽ, tách biệt. Trong những mô hình này, phần chú trọng nhất có lẽ là viết chương trình. Các mô hình khác có tính lặp đi lặp lại nhiều hơn, giống như phát triển theo mô hình agile, và mẫu. Cách tiếp cận này theo hướng coi phần xây dựng như là một hoạt động đồng thời với các hoạt động phát triển khác. Cách tiếp cận này theo cách làm đồng thời các công việc thiết kế, viết mã, kiểm thử đồng thời. Kết lại, Việc suy xét gì trong công đoạn xây dựng phụ thuộc vào khả năng vận dụng từng mô hình. Nhìn chung, việc xây dựng phát triển phần mềm chủ yếu tập trung vào việc viết mã, bẫy lỗi nhưng vẫn bao gồm các việc khác như: lên kế hoạch xây dựng phần mềm, thiết kế chi tiết, kiểm thử từng phần, kiểm thử tích hợp, v.v...

2.2. Kế hoạch xây dựng phần mềm

Chọn lựa phương pháp xây dựng là một phần quan trọng trong hoạt động lên kế hoạch xây dựng phần mềm. Việc chọn lựa phương pháp xây dựng ảnh hưởng đến chất lượng, hiệu năng hoạt động, kiến trúc và khả năng mở rộng của hệ thống cũng như đòi hỏi một cách chi tiết các công việc nào được hoàn thiện trước khi công việc xây dựng bắt đầu.

Phương thức tiếp cận để xây dựng có tác động đến toàn bộ đội dự án như: làm giảm sự phực tạp, thích nghi với thay đổi, và xây dựng kế hoạch kiểm thử. Mỗi một đầu công việc đều được đem ra nói đến trong quy trình lấy yêu cầu, thiết kế,... nhưng chúng cũng sẽ bị ảnh hưởng của bởi sự chọn lựa phương thức xây dựng.

Kế hoạch xây dựng cũng định nghĩa thứ tự thành phần nào được tạo, được tích hợp theo chiến lược (ví dụ: tích hợp tăng dần hay tích hợp theo từng giai đoạn.), các quy trình quản lý chất lượng phần mềm, việc phân chia, bàn giao nhiệm vụ cụ thể cho từng kỹ sư lập trình còn tùy thuộc vào sử dụng quy trình nào.

2.3. Đo đạc việc xây dựng

Các hoạt động xây dựng và các đối tượng có thẻ được đo đạc, tính toán bao gồm viêc lập trình, làm mịn mã chương trình, sử dụng lại, hủy bỏ mã chương trình, độ phức tạp của mã chương trình, thống kê theo dõi mã chương trình, sửa lỗi, khả năng gây lỗi cao, nỗ lực và lên kế hoạch. Việc đo đạc này thực sự hữu ích trong việc quản lý xây dựng phần mềm đảm bảo chất lượng, cải thiện quy trình xây dựng phần sao cho hiệu quả,v.v...

3. Xem xét thực tiễn

3.1. Thiết kế xây dựng

Một vài dự án xem xét các hoạt động thiết kế tại giai đoạn xây dựng, trong khi các dự án khác chỉ tập trung tại giai đoạn thiết kế. Không nên chú trọng việc đưa ra tại giai đoạn nào chính xác, công việc thiết kế chi tiết đôi khi diễn ra tại giai đoạn xây dựng và các xu hướng thiết kế bị ảnh hưởng của các ràng buộc trong bài toán thế giới thực được mô hình hóa giải quyết bằng phần mềm.

Giống như các công nhân xây dựng thiết kế kiến trúc vật lý phải điều từng phần nhỏ sao cho trình độ nhận thức giữa kế hoạch của người lập và người công nhân xây dựng ngày càng gần nhau hơn, băng cách người xây dựng kế hoạch giải thích chi tiết cho người công nhân trong quá trình xây dựng.

Chi tiết của công tác thiết kế tại giai đoạn xây dựng được giải thích chi tiết trong bản lĩnh vực tri thức phần mềm nhưng chúng được áp dụng trong phạm vi nhỏ hơn như thuật toán, cấu trúc dữ liệu, và giao diện.

3.2. Các ngôn ngữ xây dựng phần mềm:

Các ngôn ngữ xây dựng phần mềm bao gồm nhiều hình thức giao tiếp để giải quyết vấn đề mà con người có thể giữ vai trò cụ thể. Các ngôn ngữ xây dựng phần mềm và sự ứng dụng của chúng có thể ảnh hưởng đến chất lượng phần mềm, hiệu suất phần mềm, độ tin cậy, dễ sử dụng, v.v... Chúng có thể là những tác nhân gây ra các lỗ hổng về bảo mật. Dạng ngôn ngữ xây dựng phần mềm đơn giản nhất là ngôn ngữ cấu hình trong đó các kỹ sư phần mềm chọn từ một tập hữu hạn những thành phần được định nghĩa trước để tạo ra phần mềm mới hay phần mềm cải biên theo cách cài đặt của người dùng. Các tệp cấu hình dạng văn bản trong hai HĐH Window và Linux là minh chứng của ngôn ngữ cấu hình. Các ngôn ngữ công cụ được xây dựng để xây dựng các ứng dụng dựa vào các công cụ trong bộ công cụ. Chúng phức tạp hơn các ngôn ngữ cấu hình.

Các ngôn ngữ công cụ có lẽ được định nghĩa tường minh giống như các ngôn ngữ lập trình ứng dung, hay các ứng dụng được xây dựng bởi tập các giao diện của bộ công cụ.

Các ngôn ngữ viết kịch bản: là những ngôn ngữ được sử dụng chung cho các ứng dụng lập trình ứng. Trong một vài ngôn ngữ viết kịch bản bao gồm những kịch bản được gọi là tập các tệp hay các macro.

Các ngôn ngữ phần mềm là những loại ngôn ngữ xây dựng phần mềm linh hoạt nhất. Chúng cũng bao hàm thông tin tối thiểu về một ứng dụng cụ thể và các quy trình phát triển phần mềm do vậy chúng yêu cầu phải trải qua đào tạo và có kỹ năng để sử dụng hiệu quả. Việc chọn lựa ngôn ngữ lập trình có thể ảnh hưởng lớn đến khả năng gây lỗ hổng được giới thiệu trong phần viết mã – ví dụ, cách sử dụng dễ dãi của C và C++ là câu hỏi về cách chọn lựa theo chiều nhìn về an ninh bảo mật. Có các loại chung về ngôn ngữ ký hiệu sử dụng trong ngôn ngữ lập trình phổ biến như:

  • Linguistic (ví dụ: C/C++, Java).
  • Formal (ví dụ: Event-B).
  • Visual (ví dụ: MatLab).

Các ký pháp ngôn ngữ (Linguistic notations) được mong đợi cụ trong việc dùng các chuỗi dạng văn bản trình diễn các công cuộc xây dựng phần mềm phức tạp. Việc biến các chuỗi văn bản thành các mẫu có cấu trúc, các chuỗi văn bản đưa ra các gợi ý tường minh làm cho người đọc chương trình, lập trình dễ dàng mường tượng trong cái gì sẽ xảy ra khi công việc xây dựng phần mềm được thực thi.

Các ký pháp chuẩn (Formal notations) ít khi dựa vào tiềm thức, các định nghĩa phải rõ ràng, rành mạch chính xác không được khó hiểu. Các ký pháp xây dựng chuẩn và các phương pháp chuẩn đều được xây dựng dựa trên nên hầu hết trên các mẫu phổ biến của các ngôn ngữ ký pháp lập trình hệ thống (system programming notations), ở đó độ chính xác, thời gian hoạt động của hành vi và khả năng kiểm thử là quan trọng hơn việc làm sao ánh xạ sang ngôn ngữ tự nhiên dễ dàng. Các công đoạn xây dựng chuẩn mực đã định nghĩa nghĩa môt cách chính xác dùng các biểu tượng, ký hiệu để tránh hiểu lầm giống như sử dụng các ngôn ngữ tự nhiên.

Các ký pháp trực quan hiếm khi dựa vào các ký pháp dùng ngôn ngữ văn bản và công tác xây dựng phổ cập mà dùng cách diễn tả trực quan và đưa ra các thực thể, đối tượng trực quan trong việc điễn tả phần mềm. Xây dựng trực quan giải quyết vấn đề phức tạp chỉ bằng cách sử dụng các biểu tượng, ký hiệu và sắp xếp chúng với nhau theo ý đồ. Tuy nhiên, những biểu tượng này có là những công cụ đắc lực trong một vài trường hợp ở đó nhiệm vụ lập trình là đơn giản để xây dựng một phần mềm có giao diện trực quan đơn giản.

3.3. Viết mã chương trình

Viết mã chương trình phần nên xem xét các kỹ thuật sau:

  • Kỹ thuật viết mã nguồn có quy ước đặt tên cũng như giao diện sao cho dễ đọc, dễ hiểu.
  • Quy ước đặt tên các biến, các kiểu liệt kê vô hướng, các biến, hằng các thực thể theo quy định.
  • Viết mã có cấu trúc.*Chú ý đến mức đô an ninh khi viết mã cho chương trình phần mềm.
  • Điều khiển lỗi cho cả trưởng hợp lỗi dữ liệu đầu vào và lỗi do phát sinh ngoại lệ.
  • Sử dụng tài nguyên (sử dụng luồng ‘thread’ và khóa cơ sở dữ liệu)
  • Tổ chức mà nguồn (các câu lệnh, các hàm, các lớp, các gói, hay các cấu trúc khác).
  • Tài liệu viết mã chương trình.
  • Làm đẹp mã chương trình. * 3.4. Kiểm thử tại giai đoạn xây dựng

Giai đoạn xây dựng bao gồm hai phần thường được thực hiện bởi kỹ sư phần mềm khi viết mã là:

  • Kiểm thủ từng phần
  • Kiểm thử tích hợp

Mục đích của việc kiểm thử xây dựng làm giảm thời gian có lỗi khi viết mà và thời gian để phát hiện ra lỗi đó dẫn đến làm giảm chi phí cho việc sửa chúng. Trong một vài trường hợp, các kịch bản kiểm thử (test cases) được viết trong khi viết mã chương trình. Trường hợp khác, kịch bản kiểm thử được tạo ra trước khi viết mã chương trình.

Kiểm thử tại bước xây dựng bao gồm một tấp các kiểu kiểm thử, chúng được diễn tả chi tiết trong tài liệu kiểm thử phần mềm. Ví dụ: kiểm thử tại bước xây dựng không tham gia và quá trình kiểm thử hệ thống, kiểm thử alpha, kiểm thẻ beta, kiểm thử sức chịu đựng của hệ thống phần mềm (stress test), kiểm thử cấu hình, kiểm thử tính khả dụng hay các loại kiểm thử đặc thù khác.

Hai tiêu chuẩn mực được đưa ra trong tiêu đề kiểm thử tại giai đoạn xây dựng: IEEE Standard 829-1998, IEEE standard for Software Test Document, và IEEE Standard 1008-1987, IEEE Standard for Software Unit Testing.

3.5. Xây dựng để sử dụng lại

Việc xây dựng cho việc sử dụng lại mong muốn tạo ra thư viện, thành phần được áp dụng cho các dự án phần mềm khác ở hiện tại, tương lai. Việc xây dựng này dựa vào khả năng phân tích và thiết kế nhằm mục đích tránh sao chép cùng một mã chương trình tại nhiều nơi. Do vậy, nó đòi hỏi phải đóng gói (Encapsulation) thành các cấu trúc thư viện tốt hay các thành phần (component).

Các công việc liên quan đến xây dựng phần mềm cho sử dụng lại trong khi viết mã chương trình và kiểm thử như sau:

  • Việc viết ứng dụng sao cho dễ dàng thay đổi với cơ chế tham số hóa, biên dịch có điều kiện, các mẫu thiết kế, và v.v...
  • Việc bao gói ứng dụng mềm dẻo so cho phần mềm dễ dàng cấu hình và tùy biến.
  • Diễn tả và công bố về các tính chất, phương thức của phần mềm.

3.6. Xây dựng với việc sử dụng lại

Xây dựng với việc sử dụng lại có nghìa là tạo phần mềm mới có sử dụng lại các phần mềm đã có. Phương thức sử dụng phổ biết hầu như là sử dụng lại mã nguồn của các chương trình, thư viện đã có sẵn được cung cấp bởi các thư viện, hệ điều hành, các công cụ đang được sử dụng,....

Bên cạnh đó, các ứng dụng được phát triển rộng rãi ngày nay thường sử dụng các thư viện mã nguồn mở. Phần mềm sử dụng lại phải đáp ứng yêu cầu về chất lượng trong việc phát triển phần mềm (ví dụ: bản quyền, an ninh, độ ổn định, dễ dàng thích nghi với các thư viện khác, dễ dàng mở rộng, nâng phiên bản...)

Các công việc liên quan đến xây dựng phần mềm có sử dụng lại khi viết mã và kiểm thử chương trình như sau:

  • Chọn lựa các thư viện có thể sử dụng lại, cơ sở dữ liệu, các thủ tục kiểm thử, hay dữ liệu kiểm thử.
  • Đánh giá khả khả năng sử dụng lại của phần mềm thông qua viết mã, và kiểm thử.
  • Tích hợp các tính chất của phần mềm có sử dụng lại vào phần mềm hiện tại.
  • Lập báo cáo thông tin về các phần mềm sử dụng lại bằng việc viết mã, kiểm thử và dữ liệu kiểm thử.

3.7. Chất lượng xây dựng

Bên cạnh các kết quả lỗi từ tài liệu yêu cầu, thiết kế được đưa ra trong giai đoạn xây dựng có thể gây ra các vấn đề về chất lượng nghiêm trọng ví dụ: lỗ hổng về an ninh. Điều này không có nghĩa là chỉ có lỗi về an ninh mà có thể có lỗi ở nhiều phần khác nữa.

Các kỹ thuật để đảm bảo chất lượng việc viết mã chương trình gồm:

  • Kiểm thử từng phần và kiểm thử tích hợp
  • Xây dựng kiểm thử trước
  • Sử dụng lập trình phòng chống (defensive programming) và khẳng định (assertions).
  • Gõ rối (debugging).
  • Điều tra (inspections).
  • Kỹ thuật xem xét lại (review).
  • Phân tích tĩnh (static analysis).

Các kỹ thuật chi tiết được chọn lựa phụ thuộc vào bản chất của phần mềm được xây dựng cũng như kỹ năng của các kỹ sư phần mềm thể hiện ra sao trong hoạt động xây dựng phần mềm. Các nhà lập trình phần mềm nên có kỹ năng tốt và cả những hạn chế chung ví dụ: trưởng dự án thưởng biết được được điểm mạnh điểm yếu của từng thành viên trong đội dự án thông qua việc theo dõi quá trình làm việc. Việc phân tích mã nguồn tự động cho một vài ngôn ngữ lập trình thường có sẵn có thể được sử dụng để phân tích các vấn đề trong các dự án phần mềm.

Các hoạt động đánh giá chất lượng xây dựng phần mềm được phân biệt từ các hoạt động đánh giá chất lượng khác thông qua việc tập trung vào mã nguồn, các tài liệu liên quan đến mã nguồn như: bản thiết kế chi tiết và các tài liệu ít được liên hệ với việc viết mã nguồn như tài liệu yêu cầu, thiết kế ở mức cao, và các bản kế hoạch.

3.8. Tích hợp (Intergration)

Hoạt động chính trong khi xây dựng phần mềm là tích hợp nhiều hàm, nhiều lớp, thàn phần và các hệ thống con thành một hệ thống lớn. Ngoài ra, hệ thống phần mềm cụ thể cần được tích hợp với các phần mềm khác hay các hệ thống phần cứng.

Các suy xét liên quan đến việc xây dựng tích hợp bao gồm lập kế hoạch tích hợp các thành phần nào, các phần cứng nào để hỗ trợ lên bộ khung trong việc xây dựng phát triển và đưa ra các phiên bản phần mềm, các kế hoạch, mức độ kiểm thử và chất lượng của các thành phần trước khi đưa vào sử dụng cũng cột mốc kiểm thử của phiên bản phần mềm.

Các chương trình được kiểm thử theo từng dan giai đoạn hay theo hướng tiếp cân tăng dần. Tích hợp theo từng giai đoạn hay còn được gọi là tích hợp “big bang”, hay tích hợp từng phần đến khi tích hợp tất cả các phần khi các phần đều được hoàn thiện. Tích hợp tăng dần có nhiều điểm ưu việt hơn kiểu tích hợp truyền thống như: dễ dàng xác định được phần lỗi, theo dõi quá trình xây dựng, bàn giao sản phẩm sớm hơn, quan hệ với khách hàng chặt chẽ hơn. Áp dụng phương pháp tích hợp tăng dần, các người lập trình viết và kiểm thử chương trình dưới hình thức các phần nhỏ sau đó kết hợp chúng thành các phần lớn hơn. Kiến trúc kiểm thủ bổ sung, như stubs, drivers, và đối tượng mock thường xuyên sử dụng phương thức tích hợp tăng dần. Bên cạnh việc xây dựng và tích hợp các thành phần tại một thời gian nhất định cũng nhận định được các phản hồi sớm cho người lập trình và khách hàng. Ưu điểm khác của tích hợp tăng dần bao gồm việc dễ dàng phát hiện ra vị trí lỗi, theo dõi tiến trình phát triển của phần mềm, v.v...

4. Những công nghệ xây dựng:

4.1. Thiết kế và sử dụng API.

API là một tập hợp các chữ ký đã được biên dịch và có sẵn trong các thư viện hoặc framework phục vụ việc xây dựng và phát triển phần mềm. Bên cạnh các chữ kỹ, một API bao gồm các câu lệnh tác động đến hành vi của phần mềm.

Thiết API sao cho dễ đọc, dễ nhớ, dễ học, dễ mở rộng, và khả năng tương thích với phiên bản cũ cao. Các API thường xuyên tồn tại lâu hơn việc lập trình sinh ra nó và có sẵn trong các thư viện hoặc framework. Các API tiếp tục phát triển và

ổn định hỗ trợ việc phát triển và duy trì các ứng dựng phần mềm. Sử dụng API tham gia vào trong quá trình học ,phát triển phần mềm, kiểm thử, tích hợp do vậy thiết kế sao cho có thể mở rộng cho framework (khung làm việc).

4.2. Các vấn đề thời gian chạy hướng đối tượng

Các ngôn ngữ hướng đối tượng hỗ một dãy cơ chế thời gian chạy (runtime mechanisms) bao gồm đa hình (polymorphism) và phản xạ (reflection). Những cơ chế thời gian chạy này làm tăng tính mềm dẻo và sự thích nghi của các chương trình hướng đối tượng.

Đa hình (Polymorphism) là những ngôn ngữ lập trình có khả năng hỗ trợ nhiều thao tác hoạt động chung chung mà không biết cho đến khi chạy chương trình những đối tượng nào được sinh ra và được gộp vào trong phần mềm.

Phản xạ (Reflection): một chương trình có khả năng quan sát, thay đổi cấu trúc và hành vi của bản thân trong lúc chạy. Ngoài ra nó cho quan sát các lớp, các trường, các interfaces, các phương thức mà không biết tên của chúng lúc biên dịch. Thêm vào đó, tại thời gian chạy, nó sinh ra thêm các đối tượng mới cùng với các hàm phương thức mới có sử dụng các lớp tham số và tên phương thức

4.3. Tham số hóa và Generic

Các kiểu tham số hóa cũng được coi như là generics (Aida, Eiffel) và các mẫu (C++) cho phép định nghĩa các kiểu hay các lớp không cần khai báo chính xác các biến hay các thuộc tính của nó. Các kiểu không xác dịnh thường được sử dụng như các tham số trong thời điểm sử dụng

4.4. Assertion, Design by contract và Defensive programming

Assertion là một chương trình chạy độc lập được nhúng trong chương trình chính và nó như là một chương trình con hoặc là một macro. Assertion được sử dụng cho các chương trình đòi hỏi có độ tin cậy, chính xác cao. Nó giúp cho người lập trình loại bỏ được các lỗi phát sinh trong khi lập trình và được biên dịch cùng với chương trình chính.

Design by contract là một cách tiếp cận phát triển chương trình dựa trên việc lập ra các tiền điều kiện và hậu điều kiện cho mỗi chương. Khi các tiền điều kiện và hậu điều kiện được sử dụng, mỗi hàm nhỏ hay lớp xây dựng một hợp đồng với phần còn lại của chương trình. Ngoài ra, hợp đồng cung cấp các tiêu chuẩn chính xác về hàm và hỗ trợ việc việc được hành vi của hàm đó. Design by contract được tư duy trong việc cải tiến chất lượng xây dựng phần mềm.

Defensive programming nghĩa là nguyên lý cơ bản trong lập trình bảo vệ một chương trình hay một hàm khỏi bị hỏng do dữ liệu đầu vào sai. Các cách chung để điều khiển tham số đầu vào sai bao gồm kiểm tra giá trị của tất cả tham số đầu vào và quyết định điều khiển đầu vào sai như thế nào. Các Assertions thường xuyên được sử dụng trong lập trình phòng chống phục vụ việc kiểm tra giá trị đầu vào.

4.5. Cơ chế điều khiển lỗi, điều khiển ngoại lệ và tự khắc phục lỗi.

Error handling là một kỹ thuật cơ bản trong lập trình trong việc kiểm soát lỗi của chương trình phần mềm đảm bảo cho chương trình hoạt động ổn định, thông báo lỗi chính xác. Exception handling là cơ chế phát hiện và xử lý lỗi hay những sự kiện ngoại lệ.

Fault tolerant là kỹ thuật phát hiện lỗi và xử lý lỗi làm tăng độ tin cậy của chương trình phần mềm

4.6. Các mô hình chạy

Các mô hình chạy trừu tường chi tiết các ngôn ngữ lập trình cụ thể và các quyết dịnh về cách tổ chức phần mềm. Sự khác biết từ các mô hình phần mềm truyền thống, đặc tính xây dựng trong ngôn ngữ mô hình chạy như xUML (executable UML) có thể được triển khai trong nhiều môi trường phần mềm không có sự thay đổi.

Trình biên dịch mô hình chạy có thể biên một mô hình chạy thành việc sử dụng một tập các quyết định về việc chọn môi trường phần cứng và phần mềm đích. Do đó, việc xây dựng các mô hình chạy có thể được xem như việc xây dựng một phần mềm chạy.

Các mô hình chạy là một nền tảng hỗ trợ kiến trúc Model-Driven Architecture (MDA) của tổ chức Obect Management Group (OMG). Dựa vào mô hình chạy là môt hình thức chọn lựa mô hình độc lập hệ điều hành (Platform Independent Model). Mô hình PIM cũng là một giải pháp để giải quyết vấn đề không phụ tuộc vào bất kỳ công nghệ cài đặt nào. Do vậy mộ mô hình cụ thể (Platform Specific Model) bao gồm thông tin cài đặt chi tiết có được bằng việc lắp ráp lại với nhau.

4.7. Kỹ thuật xây dựng State-Based và Table-Driven

Ngôn ngữ lập trình State-Based hay Automata-Based là một công nghệ lập trình sử dụng việc tính toán chuyển đổi trạng thái hữu hạn để diễn tả hành vi của phần mềm. Biểu đồ chuyển đổi trạng thái được diễn ra trong suốt quá trình thực hiện của phần mềm.

Phương thức Table-Driven là một lược đồ lưu trữ, tìm kiếm thông tin chứ không sử dụng các câu lệnh logic như if và case. Lập trình table-driven đơn giản hơn rất nhiều lập trình logic phức tạp và rất dễ sửa đổi. Khi lập trình thì hình thức này người lập trình thường chú ý đến 2 vấn đề lưu trữ thông tin gì vào bảng hay các bảng và cách truy cập thông tin trong bảng như thế nào hiệu quả nhất?

4.8. Cấu hình thời gian chạy và quốc tế hóa

Để tăng them sự mềm dẻo, mỗi chương trình thường được xây dựng hỗ trợ cơ chế bất đồng bộ. Kỹ thuật này gắn các giá trị vào các biến trong phần cấu hình của chương trình trong khi đang chạy. Tham số cấu hình thường xuyên được cập nhật và đọc cấu file cấu hình trong chế độ just-in-time.

Quốc tế hóa: là kỹ thuật xây dựng phần mềm có thể sử dụng và hoạt động được nhiều vùng miền có nền văn hóa khác nhau.

4.9. Xử lý đầu vào theo kỹ thuật grammar-based

Việc xử lý đầu vào theo kỹ thuật grammar-based thực chất phân tích dữ liệu đầu vào theo cú pháp nhất định.

4.10. Những cơ chế đồng thời (Concurence primitives) Cơ chế đồng thời là sự trừu tượng hóa trong lập trình được cung cấp bởi ngôn ngữ lập trình hay hệ điều hành hỗ trợ việc đồng thời hay đồng bộ. Các cơ chế đồng thời nổi tiếng bao gồm semaphores, monitors và mutexes.

Semaphore là một biến kiểu protected và kiểu dữ liệu trừu tượng tạo ra sự trừu tượng đơn giản nhưng hữu ích trong việc điều khiển sự truy cập tới nguồn tài nguyên chung của nhiều chương trình, tiến trình đồng thời trong môi trường lập trình.

Monitor là một kiểu dữ liệu trừu tượng thể hiện một tập các thao tác được người dùng định nghĩa được chạy với hình thức loại trừ lẫn nhau. Một monitor có định nghĩa các biến, hàm chia sẻ nhưng chỉ cho một tiến trình truy cập tại một thời điểm.

Mutex là một cơ chế đồng bộ giản đơn cho phép một tiến trình truy cập vào tài nguyên dùng chung tại một thời điểm.

4.11. Tầng trung gian (Middleware).

Middleware được xem như một cầu nối giúp các ứng dụng phần mềm có thểm làm việc được với nhau.

Middleware là một cơ chế được áp dụng rộng rãi trong hệ thống phần mềm lớn. Nó cung cấp một dịch vụ nằm ở tầng trên của hệ điều hành và nằm dười tầng ứng dụng.

Middleware cung cấp các thành phần phần mềm đảm vào việc truyền nhận dữ liệu, thực thi các câu lệnh nếu có yêu cầu từ ứng dụng một cách ổn định, trong suốt với người dùng qua mạng.

4.12. Phương thức xây dựng phần mềm cho hệ thống phân tán

Một hệ thống phân tán bao gồm các máy tính vật lý nằm rải rác khắp nơi được kết nối đến nhau thông qua việc kết nối mạng. Cơ chế này cho phép các người dùng có thể truy cập đến tài nguyên dùng chung.

Việc xây dựng hệ thống phân tán sẽ khác biệt với việc xây dựng hệ thống phần mềm truyền thống như việc giải quyết: song song (parallel), trao đổi và nói chuyện với nhau (communication), và khả năng xử lý và tự khắc phục lỗi (fault tolerant).

Các kiến trúc của việc xây dựng hệ thống phần mềm phân tán thường: kiến trúc 3-tier, kiến trúc n-tier, kiến trúc client-server,v.v...

4.13. Xây dựng hệ thống heterogeneous

Một hệ thống heterogeneous bao gồm những chương trình tính toán nhỏ chuyên biệt. Các chương trình tính toán chuyên biệt này được điều khiển hoạt động độc lập và có giao tiếp với nhau ví dụ như: Digital Signal Processors (DSP), micro controllers và peripheral processors. Các phần tính toán được điều khiển độc lập và giao tiếp với một thành phần khác. Các hệ thống nhúng là những hệ thống heterogeneous. Thiết kế hệ thống heterogeneous yêu cầu kết hợp nhiều ngôn ngữ cụ thể để thiết kế nhiều phần của hệ thống. Những vấn đề chính bao gồm việc kiểm tra phần mềm đa ngôn ngữ, mô phỏng, và giao tiếp. Trong khi phát triển phần mềm, mã nguồn, phần cứng được thực hiện trước đồng thời thông qua trải qua từng bước.Phần cứng thường xuyên được mô phỏng trong một dãy trong hệ thống (FPGAs) hay ASICs. Phần mềm được chuyển thành ngôn ngữ lập trình bậc thấp.

4.14. Phân tích và cải tiến sự hoạt động

Việc phát triển một phần mềm hiệu quả phụ thuộc vào quyết định chọn lựa thiết kế kiến trúc chi tiết, xây dựng cấu trúc dữ liệu, chọn lựa thuật toán ảnh hưởng đến tốc độ xử lý của chương trình.

Phân tích sự hoạt động là công việc điều tra hành vi sử dụng trong một khoảng thời gian nhất định nhằm thu thập thông tin, đánh giá tìm ra các điểm nóng của chương trình phần mềm cần hải được cải tiến.

Cải tiến và làm đẹp mã nguồn là một cách để làm tăng tốc độ xử lý của chương trình cũng như làm cho mã nguồn dễ đọc, dễ bảo trì.

4.15. Những nền tảng chuẩn mực (Platform Standards)

Những nền tảng chuẩn giúp cho người lập trình xây dựng các phần mềm được linh hoạt có thể chạy được trong các môi trường tương thích mà không có sự thay đổi.

Các nền tảng chuẩn giúp cho người lập trình phát triển phần mềm trên thế giới hiện này như: J2EE cho Java, .NetFramework cho Visual Studio hoặc các framework cho web như: Boostraps, Angular,... Struts cho Java, MVC của Microsoft.

4.16. Viết chương trình kiểm thử trước

Trước khi bắt tay lập trình, người lập trình xây dựng chương trình kiểm thử trước theo kịch bản.

Việc viết chương trình kiểm thử trước giúp cho người lập trình phát hiện được lỗi sớm và sửa lỗi dễ hơn theo lối tư duy lập trình cũ. Ngoài ra nó bắt người lập trình phải tìm hiểu về yêu cầu nghiệp vụ, thiết kế, kiến trúc của chương trình trước khi việc mã nguồn giúp cho việc phát hiện ra vấn đề.

5. Các công cụ xây dựng phần mềm

5.1. môi trường phát triển phần mềm

Môi trường phát triển phần mềm: cung cấp cho người lập trình đầy đủ các tính năng cần thiết trong việc phát triển phần mềm từ việc tạo mới project, màn hình lập trình, màn hình debug, màn hình unit test,v.v...

Ngoài ra nó còn cung cấp các thêm các chức năng biên dịch, chạy thử, cùng với các công cụ kết nối đến chương trình quản lý mã nguồn (Github, TFS,...).

Việc chọn lựa môi trường phát triển phần mềm ảnh hưởng đến mục địch xây dựng phần mềm và chất lượng của phần mềm.

5.2. Công cụ xây dựng giao diện

Công cụ xây dựng giao diện (GUI Builders) giúp cho người phát triển phần mềm trong việc xây dựng màn hình giao diện giữa người dùng và hệ thống nhanh hơn theo đúng tiêu chuẩn WYSWYG.

Các công cụ xây dựng giao diện cung cấp người dùng có cái nhìn trực quan trong việc xây dựng giao diện ví dụ: trong VS 2015, người lập trình chỉ việc kéo thả các icon trong bảng tool để hình thành lên giao diện tương tác người dùng và hệ thống.

5.3. Các công cụ kiểm thử từng phần (Unit Testing Tools)

Kiểm thử từng phần kiểm tra chức năng hoạt động của từng module phần mềm một cách độc lập từ các phần tử phần mềm khác một cách riêng rẽ. Kiểm tra từng phần thường được làm tự động. Các người phát triển có thể các công cụ kiểm thử từng phần và các framework, người lập trình có thể viết mã theo chuẩn để kiểm thử xác thực sự đúng đắn từng phần bằng việc cung cấp tập các dữ liệu đầu vào. Việc kiểm thử riêng lẻ giống như một đối tượng, và người thực hiện kiểm thử chạy tất các các trường hợp nếu có trường hợp nào bị lỗi sẽ đánh dấu và thông báo cho người kiểm thử biết.

5.4. Các công cụ Performance analysis, Profiling and Slicing

Việc phân tích hoạt động của phần mềm dựa được sử dụng để quyết định có cải tiến mã nguồn hay không. Để phân tích hoạt động của phần mềm thường sử dụng công cụ Profiling.

Công cụ profiling sẽ theo dõi mã nguồn khi chạy và ghi lai bao nhiêu mỗi một câu lệnh chạy bao nhiêu lần và cần bao nhiêu thời gian để chạy câu lệnh đó. Nó giúp cho người lập trình nhìn sâu vào trong chương trình khi nó chạy và biết được chương trình hoạt động như thế nào và biết được chỗ nào cần phải cải tiến để tăng sự hoạt động của chương trình.

Công cụ slicing sẽ tính toán các câu lệnh theo một thuật toán chuyên biệt để đánh giá sự tối ưu của từng dòng lệnh cũng như phát hiện ra lỗi logic của chương trình cần phải cải tiến.