您很可能已經聽說過Cay S. Horstmann 這個名字。他是 Java 世界中相當知名的人物,也是許多關於我們喜愛的語言的書籍的作者。其中有經典課程《Core Java》(俄文出版於兩卷本
《Java.Professional’s Library》一書)和精髓概括系列課程《Java for Impressive》(俄文出版
《Java SE》) 8.入門課程》和
《Java SE 8.基礎課程》)。他擁有“Java Champion”的光榮稱號。在
此連結中,您可以找到他的舊學校網站,其中包含有趣的資訊。
我們提請您注意InformIT資源的一篇文章的翻譯,其中 Kay 為初級和繼續程式設計師提出了一些關於如何在其職業中變得更好的技巧。有一天,InformIT 的編輯總監 Jennifer Bortel 請我寫一篇關於如何成為更好的 Java 程式設計師的文章。她建議我,身為《Core Java for the Impressive》一書的作者,或許對此有所了解。「沒有什麼比這更容易的了,買一本書就可以了,」我一開始想。但這個答案不起作用,因為我必須把它裝進 1500 個字,而到目前為止只有 62 個*(
當然,在翻譯文章時,我們並沒有試圖保持字數 -大約翻譯)。我最近收到了一位開發人員朋友的電子郵件,他在面試中被問到為什麼以下程式碼不是線程安全的:
class ThreadSafeClass extends Thread
{
private static int count = 0;
public synchronized static void increment()
{
count++;
}
public synchronized void decrement()
{
count--;
}
}
我的朋友認為這個例子中的程式碼是線程安全的,我同意他的觀點,並指出第二個方法中缺少一個關鍵字,一旦插入,
static
存取就由類別物件的內建鎖定控制。我還說過這不是一個好的面試問題,因為如果您需要線程計數器,最好使用
AtomicInteger
. 但半夜我醒了,想知道:如果這個字因為
static
某些原因被遺漏了怎麼辦?也許某些狡猾的面試官故意以這樣的方式建構這個例子來誤導應徵者?於是我回信給提出這個問題的開發人員,說我之前可能錯了:在一個叫做面試問題的平行宇宙中,這個問題的答案是:“第二個方法包含一個對象鎖。” 在回答完這個問題後,那傢伙問我是否經營 YouTube 頻道,在那裡我教如何處理這些類型的面試問題。唉,我不做這個。我教授電腦科學並寫書,但我的主要目標不是成為更好的“面試問題解決者”,而是讓我的學生成為更好的程式設計師。曾幾何時,
Peter Norvig(
美國人工智慧領域科學家、Google研究總監——約譯)在他的部落格上寫了一篇精彩的文章。他認為那些承諾在 24 小時或 21 天之內教你 Java 的書簡直是荒謬的。很難不同意他的觀點:成為任何領域的專家都需要 10 年,或者也許 10,000 小時。眾所周知,專家處理資訊的方式與新手不同。在一個經典的實驗中,經驗豐富的國際象棋棋手和新手國際象棋棋手都會看到一個棋盤,棋盤上的棋子有一定的排列方式,持續幾秒鐘,然後將其隱藏並要求按原樣排列棋子。初學者並不能很好地應對這項任務,但專家則沒有任何問題。但前提是有一個重要條件:
棋子的排列必須符合真實的棋局。如果棋子是隨機放置的,那麼專家在重建棋盤方面並不比新手更好。
這就是為什麼我完全按照我的方式回答了信中的問題。我的背景是實際編程,而不是面試,所以我本能地添加了缺失的關鍵字並得出了“錯誤”的結論。我想在我解釋了發生的事情以及為什麼我永遠不會在沒有我的添加的情況下編寫像示例這樣的程式碼之後,我仍然會被雇用。或許,如果這樣的答案不能讓他們滿意,我自己也不會願意跟他們合作。 |
現在,我不認為學習認證考試或面試會讓你成為更好的程式設計師。我也確信,購買大量有關程式設計的書籍,然後從頭到尾地閱讀它們也是行不通的(儘管我,作為這些書的作者,不願意承認這一點!)。
事實上,成為更好的程式設計師的一個真正好的方法是創建盡可能多的軟體。我有時會在大學教授電腦科學入門課程。這是迄今為止我教過的最難的課程。甚至比研究生課程還難。當我剛開始擔任年輕教授時,我勤奮地給學生講課,盡職地講授程式設計問題,例如循環
for
和
while
循環之間的區別
do
。然後我給學生分配了四個為期三週的計畫。從一開始,所有大學就以這種方式教授這門課。在我第一次嘗試之後,第二學期課程的老師抱怨說,我以前的大多數學生在第一學期的程式設計之後甚至都沒有真正理解簡單的循環。而這樣的結果,從古至今也一直在發生。還記得文章
「FizzBuzz 或為什麼程式設計師不能程式設計」嗎?當你學習外語時,大多數任務都是練習和實踐,而不是理論。將知識「推」入潛意識極為重要。當你不再需要積極思考每個循環或(對於法語)每個不規則動詞時,轉折點就出現了。如果這一刻已經到來,那麼您就已經準備好進入下一個階段了。這個想法並沒有什麼革命性的。
一切的關鍵是即時回饋。一些心理學家認為,透過電腦為基礎的學習和即時回饋,我們可以做更多的事情。 例如,在另一個經典實驗中,有抱負的實習飛行員接受了一次訓練,要求他們一遍又一遍地查看儀表板並描述飛機的運動。同時,他們會收到即時回饋,表示他們做得是否正確。經過兩個小時的訓練,他們的表現超越了經驗豐富的飛行員。當然,這並不意味著他們可以立即被送上真正的航班,但他們不再對儀表板上五花八門的儀表板感到緊張。
所以,如果你剛開始學習Java,做大量的練習練習是最好的主意。有大量網站和線上課程可以自動檢查程式碼的正確性。選擇一個能夠提供真正挑戰而不是官樣文章的內容。畢竟,您希望您的潛意識擅長您在實踐中實際編寫的程式碼。這就是為什麼我不太熱衷於使用人為情況的編程範例,例如具有喵叫和吠叫方法的動物類。一段時間後,您將掌握程式設計的基礎知識。要進入下一個級別,您可以編寫幾個項目。幾年前,InformIT 入口網站向經驗豐富的程式設計師提出了一個問題:“程式設計師學習新語言的最佳方式是什麼?” 如果我們總結他們的答案,我們可以得出以下結論:“在您當前的專案中使用這種語言。”
所以,想想你一直想實現什麼——然後繼續吧。 二十年前,當 Java 還很年輕的時候,我的朋友、有時是合著者的加里·
康奈爾(Gary Cornell)打電話給我說,「凱,我們要寫一本關於Java 的書。 」我的回答是,我和他都對這個 Java 一無所知,他反駁:「那又怎樣?我們已經達成了圖書交易。” 沒事做。
我們必須抓緊時間,因為有人宣布《24 小時內教你自己成為 Java 傻瓜》一書即將發行……我想它的名字是這樣的(
Kay 取笑“For Dummies”系列書籍) - “for dummies” “Dummy ”一詞可以翻譯為“dummy” - 譯者註)。為了學習新語言,我從專案開始 - 編寫一個為退休計劃創建用戶介面的程序,然後編寫一個連接到天氣站點並顯示天氣預報的程序。之後 - 一個模擬汽車在高速公路上移動的程式。當時,這些節目簡直太棒了!
java.awt
java.net
和線程 (
threads
)。我必須學習如何真正實現這項工作,而不僅僅是文件中所說的內容。那時,這些是完全不同的事。這就是
Core Java [1] 受歡迎的原因:它不適合傻瓜。
那時候學習Java困難得多。我們沒有像
Stack Overflow這樣的網站(
我們也沒有 JavaRush - 編者註)。至此,我繼續提出以下建議來提升您的程式設計「技能」。因此,當您從事自己的專案時,您必然會陷入困境。
在這種情況下,請前往專門的論壇並嘗試尋找答案。相信我,這是個好主意。首先,你會問一些之前已經被問過很多次的問題。但很快你就會獲得知識,你的問題也會變得更獨特。這是一種奇妙的學習方式!當然,這不僅僅是複製貼上一段程式碼然後問:“我現在應該用它做什麼?” 你需要追根究底,解釋一下在陷入困境之前你已經做了哪些嘗試來解決問題。順便說一句,在大多數情況下,當我以書面形式提出問題時,我會自己找到答案,而我所要做的就是在發送問題之前對自己說:“這裡有什麼問題,這是理所當然的” 。但即使這沒有發生……相信我,深思熟慮的問題往往會吸引深思熟慮的答案。只要記得透過回答別人深思熟慮的問題來回報社會的支持。提出問題和回答深思熟慮的問題都可以讓你成為更好的程式設計師。「那麼,書呢?- 你問。“由於
Google和
Stack Overflow,它們真的已經完全且不可逆轉地過時了嗎?” 每當我駕馭新科技時,我相信我是一個勇敢的人,可以獨自克服所有困難。但一小時毫無意義的折磨讓位給一小時的理智——我買了一本書。如今,技術書籍非常便宜。如果我付 40 美元購買電子書,但只得到一個問題的快速解答,我就已經賺回了錢。我不想讓我的同行失望,但我從來沒有從頭到尾讀過一本技術書。我從我認為寫有我的問題及其解決方案的地方開始,然後閱讀直到我明白如何解決它。為此,我目前正在嘗試寫一些可以這樣閱讀的書。這種方法催生了「對於不耐煩的人」系列。此時我應該停下來了——我超出了 1500 字的編輯限制。
讓我補充一點,要成為更好的程式設計師,首先要認識知識有很多層次。
- 首先,將基本語言結構「拉」入你的潛意識,即透過解決大量練習將其知識自動化。
- 盡快開始從事您感興趣的實際專案。
- 然後加入一個您可以提問和回答問題的社群。
- 一旦你做到了這一點,你將能夠在面試中用知識和經驗說話。你是否解決了這個人為的謎題並不重要。
GO TO FULL VERSION