天天看點

寫給一心刷ACM題目的學生

【來信】

  老師你好,我大2013級大二的學生。大一時自學了資料結構,大二的時候參加了acm。 現在寒假在家裡刷題。可是我還想學習些東西,比如深入c 的學習,或者java。但是感覺除了刷題之外,就很迷茫,不知道以後出去工作是c 好還是java好。其實我更喜歡c ,但是如何去深入學習c 呢,我對c 的深入學習也是很迷茫的,因為對于c/c 除了用來刷題,我都不知道他們能夠幹什麼?

  

【回複】

  你沒有說你的專業,我猜想應該是計算機類的專業。下面就基于這個前提,談談我的想法。

  很高興你能找到一個提高程式設計能力、打紮實專業基礎的方式。參加acm競賽對于專業學習的好處,我不說了,這個事情可以繼續深入。

  你找我,我該說你的問題所在。

  我先提幾個問題,你想一想?

  1. 為什麼在學習過程中我們要做題目?做題目的目的是什麼?題目是怎麼來的?

  2. 我們學習的最終目标是什麼?

  關于這個問題,正确回答絕對不是做題目。簡單講,我們是要去解決問題,更直覺地,是要去做項目。

  于是,我們要面臨的第3個問題有了:

  3.如何在學習中,由做題目過渡到做項目?

  這幾個問題解決了,你應該就明白了。我下面将會談我的看法,不過,也還需要你自己再我的回答上補充,結合上你自己的學習體驗。

  關于題目。題目是針對某些知識點,編制出來的供初學者實踐,以達到掌握知識的目的。由于學習者所處的階段性,題目不宜“大”,且一般針對性強。題目再大,就隐約會有點“項目的影子了,尤其對于綜合性的題目。但再綜合的題目,也可能會将項目中需要考慮的一些效率、成本、組織等問題忽視掉,以便于起步階段的人能順利學習下去。是以,做題目是為了掌握知識點(包括具體知識、運用知識的方法學層面的知識,以及一些必要的技能)。題目是人為編出來的,但仔細品味,題目中含着的,就是項目中用着的知識。你現在參加的acm,所刷的題目實際已經突破了課程架構的限制,正在練就解決核心問題的能力。但我發現,你沒有去發現這些。例如,你掌握了動态規劃的方法,應該要看到其普适的價值:生産管理、資源配置設定……,多少問題都在用它去模組化、求解。

  而到做項目,需要考慮的因素将會很多。例如做一個web項目(設規模比較大、目标是要讓很多很多人用的那種),需要有項目經理、架構師、程式員、美工等一套的人馬。對于一名it學生而言,至少在目前,我們的目标就是要通過做技術崗位的工作進入行業(無論大學畢業就進入還是上研生之後),是以要學習做項目的技術。這些東西在你高年級的時候,會學習相關的課程,但也應該做課外自己有所體驗。一個人不可能精通做項目中的所有環節,在實際工作中也還會進步的空間,你目前主要精力投入學習利用算法和程式設計解決問題,是一個着眼長遠的選擇。

  從你信中,我稍有不安的是,你應該進入“算法”的階段了,但似乎還是将語言看得太重。無論c還是java,都不足以支援你度過整個職業生涯。在現階段,c就用來刷題好了。可以用c做點通信錄、學生成績管理之類的純在dos視窗中運作的應用做些體驗。而如果想深研c的指針之類的硬骨頭,你實際上是在計算機組成、作業系統的層面上開展學習,隻是用的是c這樣的一個載體。從計算機系統的角度,看你正在學習的内容,你會發現自己一路玩着c,學的就是計算機。這樣學下去,你将不會迷茫。

  就說這些,希望你能充實地走出你的每一步。