2.0

Xem bằng tiếng Anh

2.0 Giới thiệu Phần 2: Lập trình phần mềm

Phần 2 nói về nghề thủ công hằng ngày của việc viết phần mềm mà nhiều người có thể đọc, thay đổi và tin cậy trong một vòng đời dài. Phần 1 đã đặt nền móng về cách các đội tổ chức và ra quyết định. Phần này chuyển sang chính mã nguồn: các quy ước bạn tuân theo, cách bạn định hình thiết kế và giao diện, cách bạn kiểm thử và rà soát công việc của mình, cách bạn quản lý lịch sử mã nguồn, và cách bạn ghi mọi thứ ra giấy. Đây là những thực hành phân biệt một cơ sở mã đẩy nhanh việc phân phối với một cơ sở mã chống lại mọi thay đổi.

Trong một đội lớn, nghề thủ công không phải là chuyện sở thích cá nhân. Đó là cách bạn điều phối. Khi hàng trăm hoặc hàng nghìn kỹ sư, nhà thầu và người kế nhiệm cùng chạm vào các hệ thống chung, các quy ước chung và hợp đồng rõ ràng là thứ cho phép mọi người làm việc song song mà không va chạm liên tục. Hãy nhớ rằng mã được đọc nhiều hơn rất nhiều lần so với được viết, và phần lớn việc đọc đó diễn ra nhiều năm sau, bởi những người bạn sẽ không bao giờ gặp.

Trong bối cảnh doanh nghiệp và chính phủ, rủi ro còn tăng cao hơn. Các hệ thống thường xuyên tồn tại lâu hơn tác giả của chúng một thập kỷ hoặc hơn. Quy định và kiểm toán đòi hỏi bằng chứng có tài liệu về sự kiểm soát. Kiến thức phải được chuyển giao qua sự thay đổi nhân sự và ranh giới hợp đồng. Vì vậy các chương ở đây coi chất lượng không phải là chủ nghĩa anh hùng mà là một thuộc tính được thiết kế bằng kỹ thuật, phần lớn được tự động hóa, của cách cả đội làm việc.

Các chương trong phần này

  • 2.1 Tiêu chuẩn và phong cách viết mã: Các quy ước chung, được thực thi tự động về đặt tên, định dạng và thành ngữ, cho phép nhiều tác giả viết như thể một tác giả cẩn thận đã viết nó, để người rà soát dành sự chú ý cho thiết kế thay vì phong cách.

  • 2.2 Nguyên tắc thiết kế phần mềm: Các quy tắc kinh nghiệm như SOLID (năm nguyên tắc thiết kế hướng đối tượng), DRY (đừng lặp lại chính mình), độ liên kết và độ kết dính, và Thiết kế hướng miền (mô hình hóa phần mềm bằng ngôn ngữ của miền nghiệp vụ), được coi là những công cụ có phạm vi áp dụng và các chế độ thất bại đã biết thay vì những điều luật phải tuân theo.

  • 2.3 API và thiết kế giao diện: Thiết kế các hợp đồng qua đó các hệ thống và đội gặp nhau, để các đội độc lập có thể thay đổi bên trong của mình mà không làm hỏng người dùng hoặc buộc phải triển khai đồng loạt.

  • 2.4 Chiến lược kiểm thử: Các lựa chọn có chủ đích về cái gì cần kiểm thử, ở mức nào và với độ tin cậy ra sao, xây dựng một lưới an toàn nhanh và đáng tin cậy cho phép một tổ chức lớn triển khai thường xuyên và an toàn.

  • 2.5 Đánh giá mã và cộng tác: Kiểm tra các thay đổi trước khi chúng được hợp nhất để bắt lỗi, lan truyền kiến thức, thực thi tiêu chuẩn và thỏa mãn các biện pháp kiểm soát tuân thủ, đồng thời giữ cho việc đánh giá nhanh và mang tính xây dựng thay vì hình thức.

  • 2.6 Quản lý phiên bản và mã nguồn: Hệ thống ghi nhận mọi thay đổi, cùng kỷ luật về nhánh, kho mã và commit giữ cho nhánh chính luôn sẵn sàng phát hành, lịch sử dễ đọc và dấu vết kiểm toán nguyên vẹn.

  • 2.7 Tài liệu: Kiến thức bằng văn bản, từ hướng dẫn bắt đầu đến sổ tay vận hành (các quy trình vận hành từng bước) và nhật ký quyết định, bảo vệ chống rủi ro phụ thuộc vào cá nhân then chốt, đẩy nhanh việc hội nhập và chuyển giao sự hiểu biết qua nhiều năm và ranh giới hợp đồng.

  • 2.8 Yêu cầu phần mềm: Khơi gợi, đặc tả, xác nhận và quản lý những gì phần mềm phải làm và làm tốt đến đâu, với khả năng truy vết mà công việc chịu quy định và của chính phủ đòi hỏi.

  • 2.9 Xây dựng phần mềm: Nghề thủ công xây dựng phần mềm hoạt động được: giảm thiểu độ phức tạp, xây dựng để kiểm chứng và thay đổi, lập trình phòng thủ và tái sử dụng có kỷ luật.

  • 2.10 Quản lý cấu hình phần mềm: Xác định, kiểm soát và kiểm toán mọi hạng mục cấu hình (bất kỳ hiện vật nào mà các phiên bản của nó phải được theo dõi và kiểm soát) và mọi thay đổi, để các bản phát hành có thể tái tạo và dấu vết kiểm toán nguyên vẹn.

  • 2.11 Chất lượng phần mềm: Chất lượng như một thuộc tính được quản lý rộng hơn kiểm thử: các mô hình chất lượng, đảm bảo so với kiểm soát, đo lường, quản lý lỗi và chi phí của chất lượng.

  • 2.12 Mô hình và phương pháp phần mềm: Khi nào và làm thế nào để mô hình hóa, bao quát các mô hình cấu trúc và hành vi, phương pháp hình thức (đặc tả và kiểm chứng dựa trên toán học), tạo bản mẫu và phương pháp agile, và khi nào mô hình hóa là lãng phí.

  • 2.13 Nền tảng tin học, toán học và kỹ thuật: Những nguyên lý cơ bản bền vững bên dưới thực hành: thuật toán và cấu trúc dữ liệu, logic và xác suất, và phương pháp kỹ thuật thực nghiệm.

  • 2.14 Cấu trúc dự án và kho mã: Các quy ước nhất quán để tổ chức một giải pháp và kho mã của nó, bao gồm các thư mục chuẩn, một điểm vào README và cấu hình dùng chung, để bất kỳ kỹ sư nào cũng có thể điều hướng bất kỳ cơ sở mã nào.

  • 2.15 Gỡ lỗi và xử lý sự cố: Tìm và sửa lỗi như một thực hành có kỷ luật, dạy được, gồm tái hiện, cô lập bằng tìm kiếm nhị phân, hình thành và kiểm tra giả thuyết, và ghi lại mỗi bản sửa thành một bài kiểm thử hồi quy, thay vì đoán mò và thay đổi bừa.

  • 2.16 Kỹ thuật hiệu năng: Làm cho phần mềm đủ nhanh một cách có chủ đích bằng cách đặt ngân sách hiệu năng, đo lường và lập hồ sơ hiệu năng trước khi tối ưu hóa, hiểu chi phí thuật toán và độ trễ đuôi, và chống lại sự suy giảm, tất cả ở cấp độ mã và thành phần.

  • 2.17 Đồng thời và song song: Viết mã đồng thời đúng đắn bằng cách mặc định tính bất biến và truyền thông điệp, hiểu về điều kiện chạy đua, bế tắc và khả năng nhìn thấy bộ nhớ, chọn đồng bộ hóa phù hợp và các mô hình cấp cao hơn, và kiểm thử hành vi không xác định một cách có chủ đích.

  • 2.18 Quản lý phụ thuộc và chuỗi cung ứng: Quản lý mã của bên thứ ba vốn chiếm phần lớn một hệ thống hiện đại thông qua kỷ luật phiên bản và tệp khóa, nhịp cập nhật đều đặn, dấu chân phụ thuộc tối thiểu và đã được kiểm định, cùng nguồn gốc xuất xứ và bảng kê vật liệu phần mềm cho một chuỗi cung ứng đáng tin cậy.

  • 2.19 Tái cấu trúc và nợ kỹ thuật: Cải thiện thiết kế nội bộ của mã đang hoạt động đằng sau một bộ kiểm thử đáng tin cậy, nhận diện mùi mã và áp dụng các phép tái cấu trúc nhỏ có tên, dùng cây đa bóp nghẹt cho các thay đổi lớn hơn, và quản lý nợ kỹ thuật như một danh mục hiển thị, được tài trợ thay vì một lỗi đạo đức.

  • 2.20 Xử lý lỗi và mẫu thiết kế chịu lỗi: Quyết định một cách có chủ đích mã thất bại và phục hồi như thế nào, thông qua hợp đồng lỗi rõ ràng, lựa chọn thất bại nhanh so với thất bại an toàn, thử lại với độ lùi và tính lũy đẳng, bộ ngắt mạch và suy giảm êm ái, và không bao giờ âm thầm nuốt một lỗi.

  • 2.21 Hệ thống kiểu và phân tích tĩnh: Bắt cả những lớp lỗi trước khi mã chạy, thông qua kiểu tĩnh và kiểu dần dần làm cho các trạng thái bất hợp lệ không thể biểu diễn, và các linter, trình kiểm tra kiểu và bộ phân tích được nối vào trình soạn thảo và đường ống.

Các chương này liên hệ với nhau như thế nào

Mạch xuyên suốt của Phần 2 là khả năng thay đổi ở quy mô lớn. Mọi thực hành ở đây tồn tại để cho phép nhiều người sửa đổi một hệ thống chung, tồn tại lâu dài với sự tự tin. Tiêu chuẩn viết mã (2.1) và nguyên tắc thiết kế (2.2) định hình mã để bạn có thể hiểu và sửa đổi nó. Thiết kế giao diện (2.3) vẽ các ranh giới cho phép các đội thay đổi bên trong của mình một cách độc lập. Kiểm thử (2.4) cung cấp lưới an toàn khiến thay đổi trở nên an toàn. Đánh giá mã (2.5) là nơi công việc cá nhân gặp quyền sở hữu tập thể, và là nơi các tiêu chuẩn thực sự được thực thi. Quản lý phiên bản (2.6) là nền tảng mà đánh giá, tích hợp và kiểm toán đều dựa vào. Và tài liệu (2.7) bảo tồn ý định đằng sau tất cả những điều đó cho những người đến sau.

Các chương này cũng nuôi dưỡng phần còn lại của cuốn sách hướng dẫn. Các giao diện và nguyên tắc thiết kế ở đây trở thành các khối xây dựng của các hệ thống trong Phần 3, đặc biệt là nền tảng kiến trúc (chương 3.1). Chiến lược kiểm thử (2.4) và quản lý phiên bản (2.6) là nguyên liệu thô cho các đường ống phân phối tự động trong chương 8.1. Các thực hành tài liệu (2.7) kết nối trực tiếp với sổ tay vận hành và khả năng quan sát của hoạt động vận hành, chẳng hạn chương 9.2. Và toàn bộ phần này xây dựng trên các giá trị và nền tảng ra quyết định được đặt ra trong Phần 1, biến các nguyên tắc chung thành nghề thủ công hằng ngày cụ thể.