Trong chương này, sẽ nghiên cứu về phương pháp lập trình, tài liệu và những thách thức trong việc triển khai phần mềm.
Lập trình có cấu trúc
Trong quá trình mã hóa, các dòng mã tiếp tục nhân lên, do đó, kích thước của phần mềm tăng lên. Dần dần, việc nhớ dòng chảy của chương trình trở nên gần như không thể. Nếu một người quên cách xây dựng phần mềm và các chương trình, tệp, quy trình cơ bản của nó thì việc chia sẻ, gỡ lỗi và sửa đổi chương trình sẽ trở nên rất khó khăn. Giải pháp cho điều này là lập trình có cấu trúc. Nó khuyến khích nhà phát triển sử dụng các chương trình con và vòng lặp thay vì sử dụng các bước nhảy đơn giản trong mã, do đó mang lại sự rõ ràng trong mã và nâng cao hiệu quả. Lập trình có cấu trúc cũng giúp lập trình viên giảm thời gian viết mã và tổ chức mã hợp lý.
Lập trình có cấu trúc nêu rõ chương trình sẽ được mã hóa như thế nào. Lập trình có cấu trúc sử dụng ba khái niệm chính:
- Phân tích từ trên xuống – Một phần mềm luôn được tạo ra để thực hiện một số công việc hợp lý. Công việc hợp lý này được gọi là vấn đề theo cách nói của phần mềm. Vì vậy, điều rất quan trọng là chúng ta hiểu cách giải quyết vấn đề. Theo phân tích từ trên xuống, vấn đề được chia thành các phần nhỏ trong đó mỗi phần có ý nghĩa nhất định. Mỗi vấn đề được giải quyết riêng lẻ và các bước được nêu rõ ràng về cách giải quyết vấn đề.
- Lập trình mô-đun – Trong khi lập trình, mã được chia thành các nhóm hướng dẫn nhỏ hơn. Các nhóm này được gọi là mô-đun, chương trình con hoặc chương trình con. Lập trình mô-đun dựa trên sự hiểu biết về phân tích từ trên xuống. Nó không khuyến khích các bước nhảy bằng cách sử dụng các câu lệnh ‘goto’ trong chương trình, điều này thường làm cho chương trình không thể theo dõi được. Lệnh nhảy bị cấm và định dạng mô-đun được khuyến khích trong lập trình có cấu trúc.
- Mã hóa có cấu trúc – Tham chiếu với phân tích từ trên xuống, mã hóa có cấu trúc chia nhỏ các mô-đun thành các đơn vị mã nhỏ hơn nữa theo thứ tự thực thi của chúng. Lập trình có cấu trúc sử dụng cấu trúc điều khiển, điều khiển dòng chảy của chương trình, trong khi mã hóa có cấu trúc sử dụng cấu trúc điều khiển để tổ chức các hướng dẫn của nó theo các mẫu có thể xác định.
Lập trình chức năng
Lập trình hàm là phong cách của ngôn ngữ lập trình, sử dụng các khái niệm về hàm toán học. Một hàm trong toán học phải luôn tạo ra cùng một kết quả khi nhận cùng một đối số. Trong ngôn ngữ thủ tục, luồng chương trình chạy thông qua các thủ tục, tức là quyền điều khiển chương trình được chuyển cho thủ tục được gọi. Trong khi luồng điều khiển đang chuyển từ thủ tục này sang thủ tục khác, chương trình sẽ thay đổi trạng thái của nó.
Trong lập trình thủ tục, một thủ tục có thể tạo ra các kết quả khác nhau khi nó được gọi với cùng một đối số, vì bản thân chương trình có thể ở trạng thái khác khi gọi nó. Đây là một thuộc tính cũng như nhược điểm của lập trình thủ tục, trong đó trình tự hoặc thời gian thực hiện thủ tục trở nên quan trọng.
Lập trình hàm cung cấp phương tiện tính toán dưới dạng các hàm toán học, tạo ra kết quả bất kể trạng thái chương trình. Điều này làm cho nó có thể dự đoán hành vi của chương trình.
Lập trình hàm sử dụng các khái niệm sau:
- Hàm hạng nhất và hàm bậc cao – Các hàm này có khả năng chấp nhận một hàm khác làm đối số hoặc chúng trả về các hàm khác làm kết quả.
- Các chức năng thuần túy – Các chức năng này không bao gồm các bản cập nhật phá hoại, nghĩa là chúng không ảnh hưởng đến bất kỳ I/O hoặc bộ nhớ nào và nếu chúng không được sử dụng, chúng có thể dễ dàng bị xóa mà không cản trở phần còn lại của chương trình.
- Đệ quy – Đệ quy là một kỹ thuật lập trình trong đó một hàm gọi chính nó và lặp lại mã chương trình trong đó trừ khi một số điều kiện được xác định trước phù hợp. Đệ quy là cách tạo vòng lặp trong lập trình hàm.
- Đánh giá nghiêm ngặt – Đó là một phương pháp đánh giá biểu thức được truyền cho một hàm dưới dạng đối số. Lập trình hàm có hai loại phương pháp đánh giá, nghiêm ngặt (háo hức) hoặc không nghiêm ngặt (lười biếng). Đánh giá nghiêm ngặt luôn đánh giá biểu thức trước khi gọi hàm. Đánh giá không nghiêm ngặt không đánh giá biểu thức trừ khi cần thiết.
- λ-phép tính – Hầu hết các ngôn ngữ lập trình hàm sử dụng λ-phép tính làm hệ thống kiểu của chúng. Biểu thức λ được thực thi bằng cách đánh giá chúng khi chúng xuất hiện.
Common Lisp, Scala, Haskell, Erlang và F# là một số ví dụ về ngôn ngữ lập trình chức năng.
Phong cách lập trình
Phong cách lập trình là tập hợp các quy tắc mã hóa được tất cả các lập trình viên tuân theo để viết mã. Khi nhiều lập trình viên làm việc trên cùng một dự án phần mềm, họ thường phải làm việc với mã chương trình được viết bởi một số nhà phát triển khác. Điều này trở nên tẻ nhạt hoặc đôi khi là không thể, nếu tất cả các nhà phát triển không tuân theo một số phong cách lập trình tiêu chuẩn để viết mã chương trình.
Một phong cách lập trình phù hợp bao gồm sử dụng các tên hàm và biến có liên quan đến nhiệm vụ dự định, sử dụng thụt lề đúng chỗ, mã nhận xét để thuận tiện cho người đọc và trình bày mã tổng thể. Điều này làm cho mã chương trình có thể đọc được và dễ hiểu đối với tất cả mọi người, từ đó giúp cho việc gỡ lỗi và giải quyết lỗi dễ dàng hơn. Ngoài ra, phong cách viết mã phù hợp giúp dễ dàng lập tài liệu và cập nhật.
Nguyên tắc mã hóa
Thực hành phong cách mã hóa khác nhau tùy theo tổ chức, hệ điều hành và ngôn ngữ mã hóa.
Các yếu tố mã hóa sau đây có thể được xác định theo hướng dẫn mã hóa của một tổ chức:
- Quy ước đặt tên – Phần này xác định cách đặt tên hàm, biến, hằng và biến toàn cục.
- Thụt lề – Đây là khoảng trống còn lại ở đầu dòng, thường là 2-8 khoảng trắng hoặc một tab.
- Khoảng trắng – Nó thường được bỏ qua ở cuối dòng.
- Toán tử – Định nghĩa quy tắc viết các toán tử toán học, phép gán và logic. Ví dụ: toán tử gán ‘=’ phải có khoảng trắng trước và sau nó, như trong “x = 2”.
- Cấu trúc điều khiển – Các quy tắc viết if-then-else, case-switch, while-until và for chỉ duy nhất và theo kiểu lồng nhau.
- Độ dài và ngắt dòng – Xác định số lượng ký tự nên có trong một dòng, chủ yếu là một dòng dài 80 ký tự. Wrapping xác định cách một dòng sẽ được ngắt dòng nếu quá dài.
- Hàm – Điều này xác định cách các hàm nên được khai báo và gọi, có và không có tham số.
- Biến – Điều này đề cập đến cách khai báo và định nghĩa các biến thuộc các kiểu dữ liệu khác nhau.
- Nhận xét – Đây là một trong những thành phần mã hóa quan trọng, vì các nhận xét có trong mã mô tả những gì mã thực sự làm và tất cả các mô tả liên quan khác. Phần này cũng giúp tạo tài liệu trợ giúp cho các nhà phát triển khác.
Tài liệu phần mềm
Tài liệu phần mềm là một phần quan trọng của quy trình phần mềm. Một tài liệu được viết tốt cung cấp một công cụ tuyệt vời và phương tiện lưu trữ thông tin cần thiết để biết về quy trình phần mềm. Tài liệu phần mềm cũng cung cấp thông tin về cách sử dụng sản phẩm.
Một tài liệu được duy trì tốt nên bao gồm các tài liệu sau:
- Tài liệu yêu cầu – Tài liệu này hoạt động như một công cụ chính cho nhà thiết kế phần mềm, nhà phát triển và nhóm kiểm thử để thực hiện các nhiệm vụ tương ứng của họ. Tài liệu này chứa tất cả các mô tả chức năng, phi chức năng và hành vi của phần mềm dự kiến.
Nguồn của tài liệu này có thể là dữ liệu được lưu trữ trước đây về phần mềm, phần mềm đã chạy ở phía khách hàng, cuộc phỏng vấn của khách hàng, bảng câu hỏi và nghiên cứu. Nói chung, nó được lưu trữ dưới dạng bảng tính hoặc tài liệu xử lý văn bản với nhóm quản lý phần mềm cao cấp.
Tài liệu này hoạt động như nền tảng cho phần mềm được phát triển và chủ yếu được sử dụng trong các giai đoạn xác minh và xác nhận. Hầu hết các trường hợp thử nghiệm được xây dựng trực tiếp từ tài liệu yêu cầu.
- Tài liệu thiết kế phần mềm – Những tài liệu này chứa tất cả thông tin cần thiết để xây dựng phần mềm. Nó bao gồm: (a) Kiến trúc phần mềm cấp cao, (b) Chi tiết thiết kế phần mềm, (c) Sơ đồ luồng dữ liệu, (d) Thiết kế cơ sở dữ liệu
Các tài liệu này hoạt động như kho lưu trữ cho các nhà phát triển để triển khai phần mềm. Mặc dù các tài liệu này không đưa ra bất kỳ chi tiết nào về cách viết mã chương trình, nhưng chúng cung cấp tất cả thông tin cần thiết để viết mã và triển khai.
- Tài liệu kỹ thuật – Những tài liệu này được duy trì bởi các nhà phát triển và lập trình viên thực tế. Các tài liệu này, nói chung, đại diện cho thông tin về mã. Trong khi viết mã, các lập trình viên cũng đề cập đến mục tiêu của mã, ai đã viết mã, nó sẽ được yêu cầu ở đâu, nó làm gì và làm như thế nào, những tài nguyên nào khác mà mã sử dụng, v.v.
Tài liệu kỹ thuật làm tăng sự hiểu biết giữa các lập trình viên khác nhau làm việc trên cùng một mã. Nó tăng cường khả năng sử dụng lại của mã. Nó làm cho việc gỡ lỗi dễ dàng và có thể theo dõi.
Có sẵn nhiều công cụ tự động khác nhau và một số đi kèm với ngôn ngữ lập trình. Ví dụ java có công cụ JavaDoc để tạo tài liệu kỹ thuật về mã.
- Tài liệu người dùng – Tài liệu này khác với tất cả những gì đã giải thích ở trên. Tất cả các tài liệu trước đây được duy trì để cung cấp thông tin về phần mềm và quá trình phát triển của nó. Nhưng tài liệu hướng dẫn sử dụng giải thích cách thức hoạt động của sản phẩm phần mềm và cách sử dụng nó để đạt được kết quả mong muốn.
Các tài liệu này có thể bao gồm, quy trình cài đặt phần mềm, hướng dẫn cách thực hiện, hướng dẫn người dùng, phương pháp gỡ cài đặt và tài liệu tham khảo đặc biệt để biết thêm thông tin như cập nhật giấy phép, v.v.
Thách thức triển khai phần mềm
Có một số thách thức mà nhóm phát triển phải đối mặt trong khi triển khai phần mềm. Một số trong số họ được đề cập dưới đây:
- Tái sử dụng mã – Giao diện lập trình của các ngôn ngữ ngày nay rất phức tạp và được trang bị các chức năng thư viện khổng lồ. Tuy nhiên, để giảm chi phí của sản phẩm cuối cùng, ban quản lý tổ chức muốn sử dụng lại mã đã được tạo trước đó cho một số phần mềm khác. Có những vấn đề lớn mà các lập trình viên phải đối mặt để kiểm tra tính tương thích và quyết định sử dụng lại bao nhiêu mã.
- Quản lý phiên bản – Mỗi khi một phần mềm mới được cấp cho khách hàng, các nhà phát triển phải duy trì tài liệu liên quan đến phiên bản và cấu hình. Tài liệu này cần phải có độ chính xác cao và có sẵn đúng hạn.
- Target-Host – Chương trình phần mềm đang được phát triển trong tổ chức, cần được thiết kế cho các máy chủ ở cuối khách hàng. Nhưng đôi khi, không thể thiết kế một phần mềm hoạt động trên các máy mục tiêu.