獲獎感想與Java階段性學習總結
一、Learning By Doing
? 在此之前,其實我并沒有想到能夠成為小黃杉的第一批成員之一,喜悅之余,也感受到了許多的壓力。小黃杉一方面代表了老師對于我這一階段學習成果的肯定,但同時也是對我的督促與要求,使我更加不敢在學習上懈怠,以免成為反面教材,貽笑大方。
? 回憶這一階段的學習歷程與經驗,其實正應了小黃杉上印的字:Learning By Doing。
二、課程學習
? Java首先是一門專業課程,在專業課程的學習中,我認為理論、實踐的學習都缺一不可。
1、語法基礎
? 學習一門編程語言,語法是基礎。書本的意義正在于此,每一章的書本學習與代碼練習正是一個扎下基礎的過程。
? 書本越往后內容愈發艱深,甚至有些同學前五章內容還沒理解就試圖鉆研后面的內容,打算“遇到了前面的基礎部分再回過去學習”,但其實,在我看來,前五章的基本語法反而比后續的更加深奧的內容更加重要,正如老師所說:學好前五章的內容后,后面的內容臨時用到了再去學習也不遲,很快就能掌握。
? 例如一直看書覺得不太能掌握的的第八章的I/O令我很是頭疼,但在四則運算的結對編程中,由于需要實現文件的輸入輸出功能,不得不對每種輸入輸出方法進行更加集中深入的學習、理解,再進行優缺點選擇出最適合需求的輸入、輸出流,最后進行語法的學習從而實現這一功能,效果比當初單純的看書要好上許多。
? 倘若沒有前五章的基礎,是無法一步登天學會更加深奧的語法的,回頭學基礎未免不成體系太過零碎,所以不可忽視這一基礎。而僅僅把學習一門語言定義為語法的學習,從客觀來講,一周兩章的內容學習任務的壓力其實很大,個人來講只能囫圇吞棗,不如“以用促學,學以致用”,從而進步。當然,若是精力能力足夠完成學習任務的同學,也可以將書本所有內容細細學習一番,或許基礎會更加的扎實。
2、實踐鞏固
? 所謂“紙上得來終覺淺,絕知此事要躬行”。書本是基礎但不能拘泥于書本,所有的語言學習都是為了實踐而服務的。
? 不知道有沒有同學跟我有一樣的感覺:單純看書,不去使用,很多新學的東西過了一周,最多兩周就會忘記,這時候實驗的作用就會體現出來。
? 但是每次的實驗其實都不是一個一帆風順的過程,往往要耗費大量的時間、精力去設計、調試,每當千辛萬苦寫完的代碼甚至無法運行的時候,我的內心其實也是崩潰的:連個單步的機會都不給我。但正是一次次不厭其煩的調試,一次次地單步運行,才會使我們發現一些看書忽略的細節,發掘自己思維的漏洞,這是書上的東西才會變成你自己的東西,每次完成一個實驗之后的成就感也會成為你繼續學習的動力,而多次試驗后你會發現實驗過程越來越順暢,最起碼代碼無法運行的情況減少了很多。
? 例如,以前的我喜歡有個大體框架后就開始寫程序的壞習慣,一些情況的判斷與細節喜歡“到時候遇到了/想到了/運行出bug再寫”,而這往往是邏輯錯誤的來源,后來多次碰壁后慢慢改正了這個習慣,更多的去將整個流程詳細思考構建過后,再進行整體的書寫,血與淚的教訓下我的實驗已經高效了許多。
三、元知識
? 那么按照這個說法,我們學完前五章,定時寫寫實驗,那么我們早在開學前幾周就完成了Java課程的學習,我們之后的課程豈不是沒有意義了?
? 答案是否定的。我記得開學第一堂課,老師就提到過元知識這一概念,我們后續的學習在我看來,就是不斷學習元知識的過程。
? 這一過程是超脫Java課堂的過程,是可以用于其他領域的能力,這一能力使我更加受益匪淺。
1、工具的掌握與學習
? 我的電腦是MacOS系統,班里和我用同樣系統的同學對于一項事情大概心有戚戚焉:安裝軟件工具有時候真是太麻煩了。
? 的確,不使用虛擬機的話,MacOS安裝使用一些工具的教程其實并不多,它和Linux很多部分可以共通但也有很多不同,和Windows系統更是截然不同,每次安裝新的工具都會使我們耗費很多的精力,例如上次的XAMPP的安裝,端口、環境、配置等各種因素影響下,耗費了我一個周末的時間研究,才能正常運行使用。
? 但是正是每次這一并不簡單的過程,使我掌握了如何通過網絡,快速尋找解決方法的能力,如何獨自解決開發環境與工具的安裝使用問題,這一能力,并不僅僅局限于Java的開發使用,而是在別的學習過程中也大有用處。
2、思維的學習
? Java和C語言最大的不同在哪里?在于其思維的不同。在開始學習Java的過程中,我經歷了一個很長的思維轉變過程,通俗來講,C語言更多的是解決一個問題,而Java更多的是解決一類問題。
? 說來慚愧,其實直到現在我有時候的程序依然沒能完全滿足O·L·D·I·C·L的原則,但是我一直在努力改變自己思維,也在不斷修正以往寫過的程序努力靠近這一原則,雖然還沒有完全達成目標,但是這一過程本身就是一種進步,思維的進步比語法的學習其實是更為重要的收獲。
? 其實我并不反對上網查詢、借鑒別人的代碼,因為我也常常有邏輯上的疑問需要解答,每一次解決的困惑都是經驗與思維的積累,但是我并不贊成直接的復制粘貼,因為不會的語法可以查詢,可以借鑒,但是別人的思維是無法借鑒的,不掌握它,下一次依然不能獨立解決問題。
3、不要重復制造車輪
? 上述的感想似乎將Java描述成了一個艱苦卓絕的學習過程,但其實你要是能夠尋找到正確的省力方式,這個過程會簡單很多。
? 正如我上文所說,我不反對遇到瓶頸的時候去閱讀別人的代碼以求啟發,而能夠引用別人的庫更是一種輕松而又簡單的做法,眾所周知重復的制造車輪并不是一種聰明的行為。當然,在引用別人庫之前為了加深自己的理解與學習進行的實現編程也是一個必須的過程,正如我們在用sort
方法之前自己理解并且實現過快速排序、冒泡排序等一系列的功能,但是若是次次都“反復制造輪子”,未免就有些費力不討好了。
? 例如之前老師課上講到的密碼學算法的庫,就可以在接下來的密碼學實驗中一展身手。能夠正確的“偷懶”,相信大家也是喜聞樂見的。
四、元知識的應用
這些元知識的應用其實往往是并不顯眼的潛移默化的學習能力的增強,但是由于這段時間連續的比賽,我的感受較為深刻一些。
在比賽的時候,你遇到的往往都是你不曾接觸過的內容,涉及程序的題目,也不會只有C語言、Java相關的程序需要你去解讀,你看到更多的是Python、JavaScript、PHP……
但是你從來不會聽到一個選手說:這個語言我沒有學習過,題目我不做了。取而代之的是你必須抓緊時間,去學習新語言的新語法,盡快讀懂題目的代碼與意義,這時候你的元知識就會派上用場:你能否利用搜索引擎快速尋找到合適的編程、運行環境?你能否結合你學過的東西盡快理解新的語法?……這個時候你會發現,所有的語言都只是一種工具與載體,同樣的題目可以用不同的語言來編寫,但本質其實并沒有改變。即便是相對了解的語言,例如Java,你也需要重新學習并不常見的類,例如上次比賽出現的BigInteger
類也是一次新的學習,隨后的密碼學計算方法實驗的大數運算中,就派上了大用場。
與此同時也不代表對于你掌握的語言,能看懂就足夠了。例如上文提到的Java的面向對象的思維,使我面對類似思維的Python等有所熟悉,就是一種經常運用、思考帶來的好處。但此時能否將陌生語言的題目重寫成你熟悉的語言進行改寫、運行,也是十分需要功底的,倘若你編寫、調試代碼的時間就需要好幾個小時,就會錯過做題的時機。所以對于已經學過的語言,我們依然要精益求精,有所進益。
五、小結
? 每個人的學習形式并不相同,有的人適合系統的理論知識學習再進行實踐體會,有的人適合邊學邊做例如我,只要是適合自己有所收獲的方式都是值得鼓勵的,我的學習方法上也依然存在許多需要改進的不足,更需要在學習中逐步調整方向與方式,不斷改進,也希望能和老師同學進行交流,接受意見,汲取經驗與教訓。
? 但是最重要的是,我們要清晰明確自己的目標,對于元知識、硬知識、軟知識加以學習分析并且靈活運用,努力向目標前進,不是一昧做題、練習,而是有所思考、感悟,學會融匯貫通式的學習,能夠“舉一反三”,相信不只在Java,而在任何領域上都會學有所成。
?