長期以來,網上並沒有什麼AP Computer Science A(下簡稱AP CS A)的詳細中文介紹。這導致了有關這門課的傳言始終不斷。
今天,作為一個擁有四年競賽編程經驗以及參加了今年AP Computer science A考試的學生, 我便來當一當「流言終結者」,好好地破除一下有關這門課的謠言以及任何猜想,盡力還原一個真實的AP CS A。
壹
AP CS A基本介紹
College Board對AP CS A的官方介紹大致有如下幾點:
這是一門難度等同於大學CS(計算機科學)專業課第一學期難度的課程
這門課僅僅會涉及最基礎的Java語言以及算法(包括了基本運算,邏輯運算,if判斷語句,循環,類與繼承,最基礎的數據結構,遞歸,面向對象的基礎概念,最基礎的搜索以及排序算法)
AP CS A有一些所謂的「實驗題」(也就是考察學生如何運用所學的算法)
AP CS A考試時間一共三小時,一個半小時的選擇題,一個半小時的解答題(一共四道大題)
考試佔比最重的是iteration(for,while循環),邏輯運算,以及if語句。這三類加起來佔整場考試的40%之多
一道AP CS A的選擇題是這樣的:
這種代碼輸出題佔了不小的比例
一道Free Response(解答題)看起來是這樣的:
College Board會公布解答題(這是今年的FR題目,還有答案)
大部分的選擇題都可以隨便帶入數據直接模擬,少部分的題目需要對類的繼承關係有著比較清晰的了解,只有一兩道題會考察「稍微複雜」一點的遞歸以及不同排序算法之間的效率比較(死記硬背結論都行)。
解答題考察的主要是你對類的創建和整合能力,對if語句的運用,以及對數據結構的基本運用(當然還有最基礎的加減乘除和邏輯運算)。值得注意的是,每道選擇題的考察內容是固定的:
第一題:考察如何靈活運用題目內自定義的method來解決實際問題
第二題:考察學生是否會根據題目要求創建一個subclass(包括constructor,調用superclass內的函數,自己創建subclass內所需的函數)
第三題:考察學生對於字符/字符串的控制能力(比如插入,變換位置等)
第四題:一定是和二維數組有關的題
其實在我看來,只要有一年及以上Java編程的同學便可以直接參加考試。College Board官方自認為自己的課程有大學CS專業第一學期課程的難度。但在我看來,如果真的有那麼難的話那乾脆人人都可以進CMU和UCB CS專業。他們所說的「College hardness」可能是「Community College」(社區學院)難度。
貳
如何準備AP CS A
在開始介紹前,我有一句話想說:
千千萬萬不要相信Barron『s以及網上大部分的Practice Test(選擇題部分)!!!
實際上,College Board從來沒有公布過任何選擇題以及其答案。每年CB只會公布FR(Free Response)。因此,網上所謂的「模擬考試」都是沒有任何根據的。那些「模擬考試」的題目大多來自於每年的Barron's AP CS A練習冊。
Barron's是幾乎每一個AP考生都會購買的書
誠然,我在複習AP Physics 1和AP CS A時Barron's的書都給予我很大的幫助。但是,與Barron's AP Physics 1不同的是,巴朗的AP CS A練習冊上的Practice Test的難度與實際難度的差距實在是有些過大。不是說巴朗的題目太簡單,正相反,巴朗的題目實在是太難了。
我所做過的所以巴朗練習考試題無一例外地都將中心放在class和inheritance上。的確,這兩個方面無疑是AP CS A的難點之一。然而,根據CB官方指南的介紹,這兩部分的佔比其實並不大。而實際考試題目也印證了這一點。Barron's的作者把這兩部分考得很深,這使得讓幾乎所有的考生都錯誤地估計了考試的難度。我和我的同學在考完選擇題部分後都一致感嘆:這題真的是太簡單了(和巴朗相比)
那麼,這就意味著巴朗AP CS A不值得購買與使用嗎?正相反,這本書是極其適合從未接觸過編程的新手進行使用的。它對於每一個概念的講解十分深入淺出。只要你的英語水平過關,看懂這本書是比較容易的。在看巴朗AP CS A時,最重要的事無疑是用不同顏色的筆進行勾畫。巴朗的概念定義是十分緊湊的,很多很重要的細節與信息是很容易被忽略的。而那些被「忽略」掉的點有恰恰是考試的重點。如果定義沒有看懂,沒關係,每一個定義後面都會有一個樣例程序。結合著樣例程序來理解概念會變得更加輕鬆。
那麼,如何準備選擇題呢?答案便是:只要把巴朗上的每一個基本知識點弄明白,選擇題是十分簡單的(也可以參照College Board官方所給出的教學大綱)
技術的進步往往依靠的是互相交流,互相學習。而編程則是最能體現其思想的一門學問。真正有用的,詳細的知識往往都不在任何教科書中,而是在各大論壇上,而是在各種各樣的「網絡教程」中。計算機科學的迭代速度是十分快的,書籍的出版速度往往是跟不上程式語言版本的更新的。那些象牙塔裡的所謂「大師」的程序實現能力甚至還不如很多網際網路公司的一線開發員,因為他們往往能接觸到行業的前沿科技,他們必須時刻掌握每一個版本的細微變化。而同樣的,計算機科學也並不是「越老越吃香」。因此,那些隱藏在各大論壇裡寫回答的「大神」才是你我最好的老師。他們所寫的講解往往是最通俗易懂同時也是最全面的。最後,如果有一些有爭議的問題或概念實在是沒有人能夠回答,我們可以直接查詢Oracle官方對於這些概念的解答。
最後,我想說的是:計算機科學是一門實踐性科學。沒有任何程式設計師能夠只通過手寫程序便可以完全了解一門語言的。在學習每一個新概念時,最好都要在電腦上運行一次,看看自己的理解是否有誤。很多的bug是很難用肉眼直接看出來的(比如死循環,堆棧溢出,邏輯錯誤等等)。只有反覆的調試才能徹底解決問題。
總而言之,AP Computer Science A是一個極其簡單的考試,並沒有很多人眼裡那麼神秘。另外,我聽說今年以後的AP CS A考試會做調整,難度會進一步下降(不知是不是真的)。不管怎樣,這門考試的的確確是一個很好的讓新人接觸編程的一個機會。畢竟,多拿一門AP課,多拿一個AP考試滿分並不是一件壞事。
往期回顧:
對不起,我不願追求「星辰大海」
全新的開始——2018年8月至10月隨筆