Cuộn để lật trang
Computer Science Principles · AP Computer Science Principles
cộng tác, thiết kế và gỡ lỗi
Chương trình không được viết trong một lượt. Chúng được khảo sát, thiết kế, xây dựng thô, kiểm thử và xem lại, vòng này đến vòng khác, cho đến khi làm được điều người dùng cần.
Hình chạy một quy trình phát triển phổ biến: khảo sát và suy ngẫm, designing, prototyping and testing. Quả bóng đỏ là công việc đang làm; ở mỗi trạm nó có thể đưa nhóm quay lại một giai đoạn trước. Mỗi vòng làm chương trình (xanh) hoàn chỉnh hơn: phiên bản 3 sau 3 vòng.
Một quy trình có thể có thứ tự và chủ ý, đi theo các giai đoạn trong kế hoạch, hoặc mang tính thăm dò, thử các ý tưởng và giữ lại cái hiệu quả. Có nhiều quy trình; bốn giai đoạn này chung cho hầu hết.
Chương này là Ý tưởng lớn 1 của AP Computer Science Principles, Phát triển sáng tạo: 10–13% số câu hỏi trắc nghiệm của đề thi. Nó bao gồm làm việc cùng nhau (1.1), chương trình làm gì và với đầu vào và đầu ra nào (1.2), chương trình được thiết kế, xây dựng và lập tài liệu ra sao (1.3), và lỗi được tìm ra và sửa thế nào (1.4). Đó cũng là công việc của bài thực hành Create, trang cuối của chương.
và các góc nhìn giúp cải thiện chúng
Đổi mới sáng tạo trong tính toán bao gồm một chương trình như một phần không thể thiếu của chức năng của nó.
Nó có thể là vật lý, như một chiếc xe tự lái; phần mềm tính toán phi vật lý, như phần mềm chỉnh sửa ảnh; hoặc khái niệm tính toán phi vật lý, như thương mại điện tử.
Các đổi mới được cải thiện nhờ sự cộng tác. Sự cộng tác hiệu quả tạo ra một đổi mới phản ánh sự đa dạng về tài năng và góc nhìn của những người đã thiết kế nó, và các góc nhìn đa dạng giúp tránh thiên kiến: một nhóm mà mọi thành viên đều chung một trải nghiệm sẽ có xu hướng xây dựng cho trải nghiệm đó.
Hình là một nhóm giả định liệt kê các trường hợp mà ứng dụng của họ phải xử lý. Riêng Lập trình viên A nghĩ ra 5 trong số 12. Ba lập trình viên cùng nhau nghĩ ra 10. Phần còn lại đến từ việc tham vấn người dùng: 12 trên 12.
Đó là lý do việc tham vấn và trao đổi với người dùng quan trọng. Thông tin thu thập từ người dùng tiềm năng giúp các nhà phát triển hiểu mục đích của chương trình từ nhiều góc nhìn đa dạng, và xây dựng một chương trình tiếp thu đầy đủ chúng.
lập trình cặp, công cụ trực tuyến, kỹ năng giao tiếp giữa người với người
Các nhóm phát triển đổi mới bằng những mô hình cộng tác thông dụng. Một trong số đó là lập trình cặp.
Hai lập trình viên dùng chung một máy tính. Người cầm lái (đỏ) gõ mã; người dẫn đường (xanh) xem lại từng dòng khi nó được viết, phát hiện lỗi và nghĩ trước. Đến giữa hình họ đổi vai: vai trò đi theo bàn phím, không theo người. Chương trình họ đang viết là chương trình ở trang sau.
Công cụ trực tuyến hỗ trợ cộng tác bằng cách cho lập trình viên chia sẻ ý tưởng và tài liệu và góp ý cho nhau, dù có làm việc trong cùng một phòng hay không.
Các nhóm hiệu quả rèn kỹ năng giao tiếp giữa người với người, bao gồm nhưng không giới hạn ở:
chương trình làm gì, và làm thế nào
Chương trình là một tập hợp các câu lệnh thực hiện một nhiệm vụ cụ thể khi được máy tính chạy. Chương trình thường được gọi là phần mềm.
total ← 0 REPEAT 3 TIMES { n ← INPUT() total ← total + n } DISPLAY(total / 3) Đoạn mã là một tập hợp các câu lệnh là một phần của chương trình: ở đây, vòng lặp ở các dòng 2–6 (xanh trong hình).
Một chương trình có thể được mô tả khái quát, theo điều nó làm: “nó hiển thị trung bình của ba số người dùng gõ vào.” Hoặc chi tiết hơn, theo điều nó làm và cách các câu lệnh làm điều đó: “nó đặt total bằng 0; ba lần, nó đọc một số vào n và cộng vào total; rồi nó hiển thị total / 3.”
Một chương trình cần hoạt động với nhiều loại đầu vào và tình huống. Hình chạy nó hai lần:
| đầu vào | tổng sau vòng lặp | hiển thị |
|---|---|---|
| 4, 8, 9 | 21 | 7 |
| −2, 0, 5 | 3 | 1 |
Hành vi của nó là cách nó vận hành trong lúc thực thi, thường được mô tả theo cách người dùng tương tác với nó: người dùng gõ ba số, và một số xuất hiện.
Mỗi đổi mới đều có một mục đích: giải quyết một vấn đề, hoặc theo đuổi một sở thích qua sự biểu đạt sáng tạo. Những nhà phát triển hiểu mục đích sẽ phát triển chương trình tốt hơn.
dữ liệu vào, dữ liệu ra, ở nhiều dạng
Đầu vào của chương trình là dữ liệu được gửi tới máy tính để chương trình xử lý. Đầu ra của chương trình là mọi dữ liệu được gửi từ chương trình tới một thiết bị.
Cả hai có nhiều dạng: xúc giác (một cú chạm, một rung động), âm thanh (một từ được nói, một âm thanh), hình ảnh (một ảnh từ máy ảnh, màn hình) hoặc văn bản. Hình lần lượt đưa vào chương trình một đầu vào của mỗi dạng, và đưa ra khỏi nó một đầu ra của mỗi dạng.
Đầu vào có thể đến từ một người dùng hoặc từ các chương trình khác; đầu ra văn bản ở góc dưới bên phải đi tới một chương trình khác, mà với nó đó là đầu vào.
Đầu vào thường ảnh hưởng đến đầu ra mà chương trình tạo ra. Và đầu ra thường dựa trên đầu vào của chương trình hoặc trạng thái trước đó của nó: các giá trị nó đã lưu. Chương trình này giữ một số đếm (xanh) các đầu vào nó đã nhận, nên cùng một cú chạm trên màn hình có thể cho đầu ra khác ở lần thứ hai.
Trong chương trình tính trung bình ở trang trước, ba lời gọi INPUT() là các đầu vào của nó, và DISPLAY gửi đầu ra của nó ra màn hình.
các câu lệnh chạy khi được kích hoạt
Sự kiện gắn với một hành động và cung cấp dữ liệu đầu vào cho chương trình.
Sự kiện được sinh ra khi một phím được nhấn, chuột được nhấp, chương trình được khởi động, hoặc bất kỳ hành động đã định nghĩa nào khác xảy ra làm ảnh hưởng đến luồng thực thi.
Trong lập trình hướng sự kiện, các câu lệnh của chương trình được thực thi khi được kích hoạt thay vì theo luồng điều khiển tuần tự. Không có gì chạy hết dòng này đến dòng khác từ trên xuống: mỗi sự kiện chạy thủ tục xử lý nó, và chương trình chờ sự kiện tiếp theo.
PROCEDURE onStart() { count ← 0 DISPLAY(count) } PROCEDURE onClick() { count ← count + 1 DISPLAY(count) } PROCEDURE onKeyPress() { count ← count - 1 DISPLAY(count) } Bảng tham khảo của đề thi không có cú pháp sự kiện, nên ở đây mỗi trình xử lý là một thủ tục và một môi trường giả định gọi nó khi sự kiện của nó xảy ra. Trong hình, chương trình khởi động, nút được nhấp ba lần, một phím được nhấn và nút lại được nhấp một lần nữa. Các giá trị hiển thị là 0, 1, 2, 3, 2, 3.
count thuộc về cả chương trình, nên đầu ra của mỗi lần nhấp phụ thuộc vào các sự kiện trước nó.
lặp và tăng dần
Một quy trình phát triển có thể có thứ tự và chủ ý, hoặc mang tính thăm dò. Có nhiều quy trình; hầu hết dùng các giai đoạn khảo sát và suy ngẫm, thiết kế, làm mẫu và kiểm thử.
Quy trình lặp đòi hỏi tinh chỉnh và sửa đổi dựa trên phản hồi, kiểm thử hoặc suy ngẫm xuyên suốt quy trình. Điều này có thể đòi hỏi quay lại các giai đoạn trước. Ở hàng dưới, toàn bộ chương trình tồn tại từ lượt đầu, còn thô; mỗi vòng phản hồi (đỏ) đưa nó quay lại, và mọi phần đều hoàn chỉnh hơn.
Quy trình tăng dần chia bài toán thành các phần nhỏ hơn và đảm bảo mỗi phần hoạt động trước khi thêm nó vào tổng thể. Ở hàng trên, mỗi lần một phần được xây dựng và kiểm thử, và chỉ gia nhập tổng thể khi phép kiểm thử của nó đạt.
Hai quy trình này không đối lập nhau. Hầu hết các nhóm làm cả hai: họ xây dựng từng phần một, và sửa đổi từng phần, cùng tổng thể, khi phản hồi đến.
yêu cầu, đặc tả, kịch bản phân cảnh, mô-đun
Thiết kế một chương trình bắt đầu bằng khảo sát, để xác định yêu cầu của nó.
Khảo sát xác định các ràng buộc của chương trình, cùng mối quan tâm và sở thích của những người sẽ dùng nó. Có thể thực hiện bằng surveys, kiểm thử với người dùng, interviews and quan sát trực tiếp.
Yêu cầu của chương trình mô tả cách chương trình hoạt động, và có thể gồm mô tả các tương tác người dùng mà nó phải cung cấp. Đặc tả của chương trình định nghĩa các yêu cầu của nó. Với một ứng dụng giả định đặt phòng học ở thư viện: (1) người dùng chọn một ngày; (2) người dùng thấy các phòng còn trống ngày hôm đó; (3) người dùng đặt một phòng và nhận một mã.
Giai đoạn thiết kế phác thảo cách thực hiện đặc tả. Nó có thể gồm:
Hình vẽ hai trong số đó: một kịch bản phân cảnh của giao diện, mỗi bước một màn hình, với cú chạm của người dùng đưa họ từ màn hình này sang màn hình khác; và chương trình được tổ chức thành các mô-đun, mỗi yêu cầu một mô-đun.
và ghi nhận mã từ người khác
Tài liệu chương trình là mô tả bằng văn bản về chức năng của một đoạn mã, sự kiện, thủ tục hoặc chương trình, và về cách nó được phát triển.
Chú thích là một dạng tài liệu được viết vào chương trình để con người đọc; chúng không ảnh hưởng đến cách chương trình chạy. Không phải môi trường lập trình nào cũng hỗ trợ chú thích, và bảng tham khảo của đề thi không có, nên trong hình tài liệu của mỗi thủ tục nằm bên cạnh nó.
PROCEDURE average(numList) { total ← 0 FOR EACH num IN numList { total ← total + num } RETURN(total / LENGTH(numList)) } PROCEDURE isEven(n) { RETURN(n MOD 2 = 0) } average([6, 9, 3, 10]) trả về 7. Tài liệu được viết xuyên suốt quá trình phát triển: thẻ của average lớn dần cùng mã của nó. Nó giúp phát triển và bảo trì các chương trình đúng, dù làm một mình hay trong nhóm, vì người đọc sau (thường chính là người viết, về sau) có thể thấy mỗi phần dùng để làm gì.
Điều quan trọng là phải ghi nhận mọi đoạn mã được phát triển cùng nhau hoặc từ nguồn khác. Phần ghi nhận có thể nằm trong tài liệu chương trình, và nên gồm nguồn gốc hoặc tên tác giả gốc. Trong hình, isEven (xanh) đến từ một nguồn khác, và thẻ của nó cho biết điều đó.
khi nào mỗi loại lộ ra
Ba chương trình, mỗi chương trình định hiển thị mọi điểm trong [90, 75, 82]; mỗi chương trình có một lỗi.
Lỗi cú pháp là lỗi trong chương trình khi các quy tắc của ngôn ngữ lập trình không được tuân theo. Ở chương trình đầu tiên, dòng 5 thiếu dấu ngoặc đóng. Chương trình hoàn toàn không chạy: không dòng nào chạy, và không có gì được hiển thị.
Lỗi thời gian chạy là lỗi xảy ra trong lúc chương trình được thực thi; mỗi ngôn ngữ lập trình tự định nghĩa các lỗi thời gian chạy của nó. Chương trình thứ hai cộng 1 vào i trước khi hiển thị, nên nó hiển thị 75 and 82, rồi yêu cầu scores[4]. Trên tờ tham chiếu, chỉ số nhỏ hơn 1 hoặc lớn hơn độ dài của danh sách là một lỗi, và chương trình kết thúc.
Lỗi logic là lỗi trong thuật toán hoặc chương trình khiến nó hoạt động sai hoặc ngoài dự kiến. Chương trình thứ ba lặp thiếu một lần. Không gì dừng nó lại: nó chạy đến cuối, nhưng chỉ hiển thị 2 trong 3 điểm. Chỉ khi so sánh kết quả với kết quả mong đợi mới thấy được lỗi.
scores ← [90, 75, 82] i ← 1 REPEAT LENGTH(scores) - 1 TIMES { DISPLAY(scores[i]) i ← i + 1 } Sau khi sửa, dòng 3 là REPEAT LENGTH(scores) TIMES.
một số nằm ngoài khoảng cho phép
Lỗi tràn số xảy ra khi máy tính cố xử lý một số nằm ngoài khoảng giá trị đã định nghĩa.
Nhiều ngôn ngữ lập trình lưu số nguyên trong một số bit cố định, điều này giới hạn khoảng giá trị. Lấy một ngôn ngữ giả định lưu số nguyên trong 4 bit: số lớn nhất nó chứa được là 1111, tức 15.
Hình đếm lên từ 12. Mỗi bước lật các bit thay đổi. Tại 15, cộng thêm 1 cần bit thứ năm (16 là 10000), mà bộ nhớ chỉ có 4: tràn số. Điều xảy ra tiếp theo tuỳ ngôn ngữ: một số dừng với một lỗi, số khác giữ các bit vừa chỗ và tiếp tục với một giá trị sai (ở đây là 0).
Các ngôn ngữ thực dùng nhiều bit hơn, nên giới hạn của chúng lớn hơn nhiều, nhưng vẫn là giới hạn. Ngôn ngữ trên bảng tham khảo của đề thi thì khác: ở đó, kích thước của một số nguyên chỉ bị giới hạn bởi bộ nhớ của máy tính.
đầu vào đã định, đầu ra mong đợi
Kiểm thử dùng các đầu vào đã xác định để bảo đảm thuật toán hoặc chương trình cho ra kết quả như mong đợi. Lập trình viên dùng kết quả đó để sửa lại chương trình.
Yêu cầu của một rạp hát giả định: dưới 13 tuổi, hoặc từ 65 tuổi trở lên, vé giá $8; những người còn lại trả $12. Yêu cầu cho người kiểm thử biết nên thử những đầu vào nào và mong đợi kết quả gì cho từng đầu vào.
PROCEDURE price(age) { IF(age < 13 OR age ≥ 64) { RETURN(8) } RETURN(12) } Đầu vào kiểm thử tốt thể hiện các kết quả mong đợi khác nhau và nằm đúng tại hoặc sát bên ngoài các giá trị cực biên (nhỏ nhất và lớn nhất) của dữ liệu đầu vào, nơi lỗi hay tập trung: ở đây là 12 và 13 ở hai phía của một ranh giới, 64 và 65 ở hai phía của ranh giới kia, và độ tuổi nhỏ nhất, 0.
| age (đầu vào) | mong đợi | thực tế | |
|---|---|---|---|
| 0 | $8 | $8 | pass |
| 12 | $8 | $8 | pass |
| 13 | $12 | $12 | pass |
| 40 | $12 | $12 | pass |
| 64 | $12 | $8 | không đạt |
| 65 | $8 | $8 | pass |
Phép thử tại 64 không đạt: mã ghi age ≥ 64 trong khi yêu cầu có nghĩa là age ≥ 65, một lỗi logic. Phép thử ở một độ tuổi thông thường như 40 sẽ không bao giờ phát hiện ra lỗi này.
lần vết, trực quan hoá, gỡ lỗi, hiển thị
Những cách hiệu quả để tìm và sửa lỗi: ca kiểm thử, lần vết bằng tay, trực quan hoá, trình gỡ lỗi và thêm các câu lệnh xuất bổ sung.
findMax phải trả về số lớn nhất trong một danh sách. Khi chạy thử với [-3, -7, -2], nó trả về 0, không phải −2. Để tìm hiểu nguyên nhân, lập trình viên thêm DISPLAY(max) vào trong vòng lặp (màu xanh): một câu lệnh xuất bổ sung.
PROCEDURE findMax(numList) { max ← 0 FOR EACH num IN numList { IF(num > max) { max ← num } DISPLAY(max) } RETURN(max) } Lần vết bằng tay, mỗi phần tử một hàng:
| num | num > max? | max sau đó | DISPLAY hiển thị |
|---|---|---|---|
| −3 | false | 0 | 0 |
| −7 | false | 0 | 0 |
| −2 | false | 0 | 0 |
max không bao giờ thay đổi: không có phần tử nào lớn hơn 0. Trình gỡ lỗi cho thấy điều tương tự bằng cách tạm dừng chương trình và hiển thị các biến của nó (các ô trong hình, một trực quan hoá trạng thái của chương trình). Lỗi nằm ở dòng 3: max bắt đầu bằng 0, lớn hơn mọi phần tử của một danh sách toàn số âm.
Cách sửa là max ← numList[1]: bắt đầu từ một phần tử của danh sách. Chạy lại, câu lệnh xuất bổ sung hiển thị −3, −3, −2, và hàm trả về −2. Sau đó bỏ câu DISPLAY bổ sung đi.
chương trình của riêng bạn, và các câu hỏi về nó
Bài thực hành Create là nơi chương trình của chương này được đem ra dùng: một chương trình do bạn tự chọn, phát triển theo quy trình, tài liệu và kiểm thử của các mục 1.1–1.4.
Bạn nộp ba thứ trong AP Digital Portfolio: mã chương trình, một video chương trình đang chạy và một Tài liệu tham khảo dự án cá nhân (PPR). Bạn được dành ít nhất 9 giờ trên lớp cho bài này. Chương trình của bạn phải có một số thành phần nhất định, như danh sách và thủ tục.
Vào ngày thi là bài trả lời viết: 60 phút, 2 câu hỏi về mã trong PPR của chính bạn, mà bạn có thể xem trong lúc trả lời.
Bài thực hành và bài trả lời viết cùng chiếm 30% điểm AP; bài thi trắc nghiệm (70 câu trong 120 phút) chiếm 70% còn lại.
Vì vậy các câu hỏi của chương này quay lại với chương trình của chính bạn: mục đích và chức năng của nó là gì, đầu vào và đầu ra của nó là gì, bạn đã kiểm thử gì và với những đầu vào nào, và bạn đã tìm ra và sửa lỗi nào.