華東理工某ACMer總結

做算法和作技術哪個難? 都很難, 沒有可比性. 但是算法做得好的可以轉行做技術, 技術做得好的想轉行做算法卻很困難.

我是08年下半年將近期末的時候加入華理ACM隊的. 我高中的時候沒有編程經驗, 數學也不好, 高考數學剛及格. 因爲第二工業大學的網絡工程專業的分數是最低的, 所以就比較巧合地步入了計算機行業. 大一有一門C++課程, 當時我在第一次上機的時候就深深的被C++迷住了. C++是一門極其優美的語言, 相比於高中計算機課上一筆帶過的VB, 我最喜歡C++的花括號. 因爲學校比較差, 周圍的學生沒幾個專心讀書的, 所以對於一個稍微想要學點東西的學生來說, 這樣的學校裏的硬件資源就顯得異常豐富了, 圖書館裏很多計算機經典書都是新的, 而且自修室人也很少, 整個大一除了談談戀愛解解悶以及陪室友打打魔獸以外, 我大多數時間都在圖書館或者自修室, 雖然在那裏的時候不總是做些學習方面的事情...我也會經常無聊的在網上亂逛或者到處下載資料做收藏家. 但正是這個時候我接觸到了C++的聖經[The C++ Programming Language], 當時我看了一段時間的電子版, 因爲不方便作筆記, 很不爽, 於是在08年1月的時候買了中譯本. 之後的大一下學期我又陸陸續續看了部分[Effective C++], [More Effective C++], 還有一些數據結構方面的東西. 然後學期中期的時候我集中精力做了一段時間的數學建模競賽. 大一結束的時候我通過插班生考試從第二工業大學轉來華理, 很不巧, 插班生考試數學又是剛及格. 在暑假期間我去上了CCNA和CCNP的部分課程, 因爲感覺這種純操作工一樣的"背誦"活很不適合我, 於是半途而廢了, 暑假在家的時候做了很多windows下的網絡編程, 自己寫發包程序, 寫SYN攻擊很有意思. 

大二剛來到華理的時候自我感覺很牛B, 因爲我自學過的東西幾乎都沒有人能來跟我做做討論. 於是我自以爲很了不起, 也沒怎麼在意學校的課程, 除了上課, 平時我幾乎都在圖書館或者自修室. 這期間我接觸了設計模式, 以及.NET開發. 大約在開學不久, 08年的Regional還沒有開始的時候, 我聽說了ACM這種東西. 當時對這個東西我是完全沒概念的, 在某個晚上我去奉賢311找了羅老師, 當時詠天也在, 是ACM隊準備召新的時候, 羅老師跟每個同學談了話, 我是最後一個, 跟他嘩啦啦地說了很多以前我看過的書, 做過的東西. 被羅老師讚賞了一番之後我更加自以爲是了, 並以非正式的身份進了ACM隊. 

但是直到學期結束, 我也沒做什麼題. 學期將盡的時候我跟室友展開了一箇舊書交 易網站的建設, 然後我就一股腦地完全投入進去了, 用了將近五個月的時間, 其中佔用了我整個寒假, 我用ASP.NET+Spring.NET框架寫了一個自以爲有很高技術含量的簡單的舊書信息發佈平臺, 全站單頁面, 無刷新, 所有操作都用AJAX技術完成, 並且我自己設計了一個貌似很牛B的內存數據庫. 結果在09年的上海市計算機應用能力大賽中, 我的作品只獲了一個優勝獎. 貌似還有很多同學沉迷於這些, 以爲這就是編程. 備受打擊的我在迷茫了一陣子之後想起來ACM, 於是在大概3月底的時候開始在PKU切題.

以上都是之前的一些學習經歷, 關於ACM的部分從這裏開始. 

ACM是個很有意思的東西. 起初, 我有點看不起這個東西, 相信很多過早接觸技術開發方面的同學都有這樣類似的想法, 於是就有了諸如"做算法和做技術哪個難"的問題. 今天再讓我來回答這個問題的話, 我只能說, 都很難, 並且沒有可比性. 但是我要補充一點, 大學生可以做技術, 不上大學同樣可以做技術. 再要我說得明白一點的話就是, 一年前我用了將近一個星期的時間, 看着MSDN和CSDN寫了一個windows下的掃雷程序, 並且在之前我用了若干個星期積累了SDK編程的一些知識, 而今天雖然我已經忘記了幾乎所有SDK編程的細節, 不知道怎麼去畫一個自定義的按鈕, 但是給我一臺能上網的電腦和一天的時間, 我能把當時的那個掃雷程序寫出來, 並且讓它的代碼量精簡掉一半以上.

另外一個事實就是, 絕大多數的ACMer以及幾乎所有成功的ACMer的數學都非常好, 不論他們是原來就很好還是後來變得很好.

以下說一些實質性的東西.

編碼能力
在ACM的世界裏, 編碼能力和數學功底是絕對的王道, 硬要分個先後的話, 編碼能力就是王道中的王道. ben在學校的時候幾乎不看算法類書籍, 最多也就是看看網上零散的知識點, 但是他的成績是大家有目共睹的, 其中最重要的一點就是他的編碼能力至少在華理, 那是令人髮指的強. 寫一個容斥原理你要多久? 或者給你入射光和球的相關參數, 要你編碼求出反射光的運動參數, 你又要寫多久? 更有甚者, 在今年暑期的個人賽第一場最後一題, 給你一個掃雷過程中的狀態, 要你計算出所有能夠確定的雷, 這題ben用了不到半個小時就AC了.

今年的上海賽區同樣對編碼能力要求很高, 其中我們沒有過的I題, 當時ben打印出來的代碼有4張紙, 也正是因爲這麼長的代碼, 我跟sky連去糾錯的信心都沒有, 結果ben自己也沒有能夠在賽場上把錯誤找出來.

編碼能力的培養的捷徑就是做題, 尤其是搜索, 模擬, 計算幾何等類型的題目尤其鍛鍊編碼能力. 我能夠很快適應ACM, 很大程度上也是得益於大一期間積累的編碼能力和C++語言基礎. 

在鍛鍊編碼能力時, 特別要注意做題要限制時間, 這點跟自己做一些小項目, 小程序完全不同, 不能拖拖拉拉一做就是幾天. 最好的方法是在寫代碼的同時把自己做這題的開始和結束時間都標註上去, 這點在後面關於解題報告的部分我還會說到. 如果覺得有時自己會記不住記錄開始時間, 那就養成一個習慣, 每看到一題就先隨便submit幾個字母, 讓它CE一次, 這樣以後再回過頭來看歷史記錄就可以知道自己做這題用了多少時間了. 限制做題時間又一個很明顯的作用就是可以自我認識, 即瞭解自己對於某一方面的知識掌握程度, 如果平時遇到某一類型的一般題目(沒有特別噁心的trick, 沒有特別噁心的輸入), 自己需要花超過2個小時去AC, 那麼就幾乎可以肯定你在賽場上是不太可能把這題做出來的, 換句話說, 如果你在賽場上遇到這種類型的題目就可以暫時先放一放了.

編碼能力的一個很關鍵的地方就是編碼風格問題, 一些普遍適應的原則諸如"不要把複雜的語句寫在[]裏", "不要在if裏寫複雜的語句", "把if裏複雜的邏輯拆分開", "全局變量要特殊命名"等等, 這裏不可能一一列舉, 唯一的辦法就是每次自己在這裏吃到苦頭的時候把它記錄下來. 具體的可以參考ben的方法, 例如把PKU的每次提交情況都粘貼進一個文本文件裏, 然後在每次提交記錄後面都加上一些註釋, 比如"++i寫成i++", 或者"dis數組忘記初始化"之類的東西, 這樣即使不能保證此類錯誤以後不會再犯, 也至少可以降低你犯此類錯誤的概率. 關於降低犯錯的概率還有一個生理學上的解釋, 即記憶的編碼並不是純粹的把東西原封不動地放進腦子裏, 而是會被我們的神經系統先分解, 儲存在大腦各處, 並且其中夾雜了大量記憶的場景, 即記憶發生時的環境. 當我們再次處於類似的環境時就有更大的概率把相關的事情回憶起來, 所謂的聯想記憶也是這麼一回事. 所以當我們犯錯誤時就應該儘可能地增加可以勾起我們回憶的材料, 比如寫下一些箴言形式的語句加深記憶. 

解題報告
上面說到錯誤記錄可以降低我們犯錯的概率, 同樣的, 解題報告也是基於這一原理, 並且它往往比錯誤記錄更加有效.

我們常常可以看見一些大牛blog上的學術類文章寫得非常風趣, 有時裏面會參雜一些很搞笑的例子, 於是他們的文章較之純理論的文章更容易被我們記住. 這仍然是基於上述的生理學原理, 我們用來會議的材料越豐富, 或者這些材料越投我們所好, 我們就越容易聯想起來與這些材料相關的東西. 這個原理應該用到些解題報告上來, 那就是儘量把自己關於這題的, 一些有意思的想法記錄下來. 另外, 記錄自己在解決這題時的思維過程也是非常有益的. 如果你還不知道思維過程的重要性, 那麼請去看看波利亞的[How To Solve It](中文譯名"怎樣解題"), 這是每一個理工科學生的必讀讀物之一, 甚至你可能會在看完此書的若干年以後纔會突然體會到其中的一些條款的極端正確性, 所以, 越早看這本書越好.

關於思維過程, 並不是十分容易被記錄下來, 並且, 在你能夠明明白白把你對於某題的思維過程敘述出來之前, 你對於這題的解決始終都是不完整的, 即下次遇到此類題目的變種, 十有八九還是無從下手(某些大牛可能因爲語文水平不足而無法很好用語言表達, 這是特例...).

寫解題報告的另一個好處當然是有助於自己複習. 尤其是在比賽之前看看解題報告是非常有益的, 一般情況下, 就拿我來說, 在兩個月內做過的題目, 只要掃一眼解題報告, 一般我能馬上把它原樣地用代碼實現出來.

如果不是很確定自己能堅持寫解題報告, 或者擔心自己的解法的正確性(很多時候AC了的代碼不一定是正確的), 那麼就去寫blog吧, 把解題報告貼到blog上吧, 也許會有人用很尖銳的言語指出你的錯誤, 但, 那不正是你想要的嗎? 另外貼到blog上也方便了自己日後的搜索.

關於圖論
論資格, 我絕對在ACM隊是派不上號的, 切題數也十分寒酸, 於是當你處於這種情況的時候就應該考慮主攻某一方面, 畢竟ACM是一項團隊比賽, 一把瑞士軍刀總也沒有幾把專業的刀具功能強大. 我在隊裏主要負責的是圖論, 所以我在這裏着重說一下圖論方面的東西.

ACM題目類型主要分爲DP, 圖論, 搜索, 數據結構, 模擬, 計算幾何, 字符串, 組合數學, 數論等, 其中前兩個是重頭戲, 我做過的每場比賽裏, 前兩種題目都是必然會出現的, DP很大程度上需要依靠YY, 即它與IQ的關係很大, 這幾乎是一個毋庸置疑的事實...並且DP的某些思想貫穿大部分ACM題目, 很容易於其它類型題目融合起來, 想要掌握它非一朝一夕之事. 而圖論相對來說並沒有DP那麼可怕, 比較容易入門, 並且很多圖論類題目可以套模板, 但是相對的, 圖論題目也可以出得令人髮指的難, 並且其數學模型往往隱藏在搜索, 計算幾何, 字符串等類型的題目後面, 即表面上看起來不是圖論, 但實際上這題考的卻是圖論原理.

圖論的變形繁多, ACM題目中尤以Dijkstra最多, 看似簡單的Dijkstra, 其變形程度是相當可怕的, 比如會消耗汽油的車的最短路問題, 這就是一個相對簡單的二維Dijkstra, 而更加複雜的, 例如08年哈爾濱賽區的H, 一道隱藏在搜索背後的三維Dijkstra, 全場沒有隊伍出. 解決這類問題的一個根本性方法就是充分理解Dijkstra的定標技術, 以及規範的狀態表示. 何爲規範? 即當狀態維數增高時, 需要對應的結構定義其狀態, 並且此結構體切不可與存入堆的結構相混淆, 只要明確了Dijkstra的狀態表示以及在某些限制條件下的狀態轉移(即圖中的"邊"), 則高維Dijkstra就不再是無法攻克的攔路虎了.

圖論的另一個大頭就是網絡流, 這是圖論中最容易套模板的一部分, 也是極其困難的一部分. 說容易套模板是因爲往往這類題目在賽場上本身就是中等題或難題, 如果再不能套模板, 八成就變成了無人能出的大自然題了...網絡流的變形數量幾乎可以趕的上Dijkstra了, 如果算上匹配類的題目則就是有過之而無不及.網絡流基本可以分爲最大流, 限制流, 費用流三種, 其中最大流可以變形爲二分匹配, 費用流可以變形爲帶權匹配. 其中最大流的算法是其它幾種流算法的基礎, 主流算法可以分類增廣路類和預流推進類, 這兩類算法幾乎沒有聯繫, 對於ACM, 只要學習前一種就足夠了. 

網絡流類題目, 包括匹配類題目的核心思想就是增廣路, 在匹配類題目中特化爲交錯軌, 這也是增廣路類算法的核心. 各種增廣路類算法的區別大都在於如何快速找到一條增廣路, 其中比較簡單的EK就是每次BFS找到一條增廣路, 我就不多說了, 而高級一點的ISAP和Dinic都屬於SAP, 兩者都是基於分層圖的思想, 實現分層圖的方法只要爲每個頂點標記所在層號即可, 其中Dinic是通過一次BFS建立分層圖, 然後按照建立好的分層圖進行多次DFS找到多條增廣路, 從而不用像EK那樣每條增廣路都做一次BFS. 而ISAP則是在DFS的同時建立分層圖, 即遇到DFS前進不了的時候對下一頂點重新標號, 於是這張分層圖是逐步建立的, 建立後可以被後面的DFS所利用, 從而降低尋找增廣路的消耗. Dinic和ISAP都可以用"當前弧"技術進行優化, 而ISAP還有一個進需要添加一行代碼的GAP優化, 具體實現很容易在網上搜到. 這裏要特別說一下Dinic和ISAP的適用範圍, ISAP是萬金油, 幾乎可以應付絕大部分最大流和限制流的題目, 而Dinic特別適用於有向無環圖, 即畫在紙上可以分層的題目, 此時Dinic往往只總共需要做一次BFS(因爲沒有可以回退的邊), 這時Dinic往往會比ISAP快很多. 要知道網絡流是一個極度悲觀的世界, 任何已知的算法都沒有能突破O(n^3), 所以最大流算法寫得不好很容易超時. 至於費用流, 可以基於EK算法, 只要將BFS改爲SPFA就可以應付幾乎所有的費用流問題了, 少量需要用到消負環算法的題目只要用SPFA找負環即可. 而限制流則只是一個定式的建圖, 沒什麼特別的地方. 最後還有一種限制費用流, 如果遇到, 幾乎肯定就是大自然題, 可以直接無視之. 關於而分圖匹配的算法, 網上資料很多, 核心思想還是基於最大流, 只是可能不用最大流來解釋也是可以的. 其中用於帶權匹配的KM算法只要準備好模板即可, 一般不會有太大變形.

上面一段說的是既有的算法, 大部分都可以模板化, 其中要注意準備模板的時候最要準備針對整數和浮點數的兩種, 對於C++程序員來說, 相應的只要寫成函數模板, 然後傳入比較函數對象即可, 代碼量幾乎不會有什麼增加. 

下面要說說網絡流類題目真正的難點之一, 建圖. 網絡流類題目難在它往往伴隨着一個不太直觀的建圖, 其中有些利用到最大流最小割定理的建圖已經有了套路, 比如說限制流的建圖, 最大權閉合圖等, 具體可以參見國家IO集訓隊2007年胡伯濤的論文. 另外一些建圖則很有技巧性. 比如"比賽"類題目, 有很多場比賽, 要你求得分能否達到某種條件等, 這時需要把每場比賽看成頂點, 然後兩條流進來, 只有一條可以出去, 這種題目的特色是存在大量容量1的邊. 還有拆點建圖, 這類題目往往一個頂點上包含了2種"屬性", 而網絡流算法中, 屬性是體現在連在邊上的, 儘量要使每個頂點表示的屬性單一化, 於是就把一個點拆分成兩個點, 然後把屬性分配出去, 比如PKU有一題說企鵝在冰塊上跳來跳去, 冰塊就有兩個屬性, 一個是冰上的企鵝數量, 另一個是冰塊再被起跳多少次後會碎掉, 這時就需要把兩個屬性拆分開來, 拆點的另一個應用就是求最小點隔集, 其中的思想就是像這題冰上企鵝一樣, 把出度和入度兩個屬性分離開. 另外一些更加巧妙的建圖可能涉及逆向思維等技高技巧性的思維方法, 這裏就不一一列舉了. 

網絡流的難點之二是算法變形, 特別是有的題目在增廣路上做文章. 有一種叫做"連續增廣路"的技術, 需要深入理解增廣路的原理, 今年的上海賽區F題就是基於連續增廣路的二分匹配加搜索, 雖然之前做過一個基於最大流算法的連續增廣路, 但是很遺憾, 當時沒有能想到這個算法. 另外, 與字典序相關的最大流題目往往需要枚舉刪邊, 如字典序最小邊割集. 與其它類型題目相結合的算法變形就多不勝數了, 最常見的當屬二分答案判可行性, 很多貌似運輸類的問題很多都可以歸結到這種方法上. 

剛纔說道了二分答案, 這也是所有圖論類(應該說不僅僅是圖論)題目最常見的變形, "最(大)小值最大(小)"是這類題目的最一般特徵. 這類題目常常跟分數規劃聯繫在一起, 比如最優比率生成樹, 最優比率環等. 

另外圖論的一些經典算法可以衍生出很多強大的應用, 比如差分約束就是Bellman-Ford或SPFA的一個最好的應用, 這類題目的建圖關鍵是找出差分式子. 一個需要特別注意的地方是[算法導論]上對於不連通圖上添加頂點的討論, 最好的方法是不用添加頂點, 開始時直接將dis數組清0, 然後所有頂點入隊即可. 

生成樹類的題目也有很多變形, 如歐幾里得生成樹, 往往需要利用平面圖上的一些幾何性質建圖, 如曼哈頓距離生成樹, 限制度生成樹等等, 此類題目套路不多, 且知識點比較散亂, 需要多做題來熟練. 

圖的連通性也是一個常見的考點. 割點, 橋, 強連通, 雙連通問題的求解不僅要準備模板, 還要充分理解模板. 一些地圖上的題目(二維的方格陣), 往往有些特殊的性質, 不僅需要你一些建圖的敏感度, 偶爾需要在模板中添加一些巧妙的代碼. 

圖論還可以與組合數學和計算幾何等產生緊密的聯繫, 比如生成樹和圖的計數, 最簡單的諸如n個頂點可以產生多少個不同的無向連通圖, 這時一些組合數學中的基礎原理往往十分有用, 最典型的就是容斥原理. 

圖論中還有茫茫多的定理, 性質等. 我所知道的最雷人要數08年哈爾濱賽區那道赤裸裸的Havel定理了. 這些定理和性質可能會在一些意想不到的地方發揮作用. 

最後圖論中的一些NP問題或非NP但是代碼不好寫的問題, 如旅行商, 同構, 支配集, 最大團, 以及由樹所引申出的一大堆樹形DP問題不好準備模板, 但可以考慮準備一些具有代表性的解題報告的紙版材料. 其中樹形DP是一個很容易寫錯的重頭戲, 它往往還和揹包問題聯繫在一起, 尤其是泛化物品的揹包, 關於泛化物品, 請參見DD牛的[揹包九講]. 

關於工具
ACM的學習, 對於我們一個弱校來說, 沒有牛B的教練, 沒有嚴格的教學, 最主要的學習方式莫過於收集和記錄, 不論是外部知識的搜索收集, 還是內部知識的記錄整理, 最離不開的當屬Google. 

搜索我就不用說了, 這裏關於知識的記錄和整理, 我要推薦如下幾個工具: Google Docs, Google Desktop, Google Calender, Everything. 

前兩個都是輔助你記錄和複習你的解題報告, 第三個用於時間管理以及任務計劃, 詳情請自己去用Google搜索去. 

最後一個Everything是windows平臺下特別針對NTFS文件系統的一個神奇的搜索工具, 它可以僅僅使用約5MB的內存在1秒內搜索出你的所有NTFS盤上任何一個文件名跟輸入關鍵字匹配的文件, 其原理據說是基於NTFS文件系統的一個特殊的記錄表的.

這個東西的一個最有趣的應用可以是這樣: 把你硬盤上的所有文件和文件夾都加上標籤吧, 用"[]"括起來, 然後用","隔開, 然後任何時候你都可以通過標籤搜索到你想要的東西, 一切圖片, 論文, 軟件等等, 比如PKU的1001題我就可以加上"[java,BigDecimal,浮點數,高精度]"之類的字樣. 

甚至更精細一點, 定義一些特殊的tag, 比如"tag.r"表示"需要review", "tag.h"表示"我是在別人的help下做出的題目", "tag.p"表示"這題我還有未解決的problem"等等. 

關於學習
我所知道的關於學習, 90%來自於[www.xiaolai.net](李笑來的blog), 和[www.mindhacks.cn](劉未鵬的blog), 把裏面關於學習方法的文章看完, 你就昇華了. 在此特別感謝上海第二工業大學的王學長告訴我Google Reader的存在, 大二開始的時候我因爲這個接觸到blog這種東西, 讓我對學習方法有了一個相對清醒的認識. 也許很多所謂的方法我們早就知道了, 可就是"很多道理我們其實我們老早就知道, 只是需要一個權威人士告訴我們它確實是正確的". 

這裏特別要說一些關於學習效率和順序的問題. 

大二就去看什麼人工智能, 自然語言處理, 對於絕大多數人來說, 那就是低效, 甚至你在看這些書的時候連筆記都不知道該怎麼記, 更何況還有那麼多人看書都沒有記筆記的習慣. 但是即使你用心做了筆記, 也不一定能學到什麼東西, 比如我當時就將近記了一大本的關於人工智能, 心理學之類的東西, 可現在回頭看看一恰的筆記幾乎已經不敢相信那是我自己寫的了, 完全不認識. 究其原因有二, 一是先導知識儲備不足, 二是沒有及時回顧筆記. 這兩點在很多人的學習過程中都在不斷重複上演着, 其結果就是浪費了大量時間卻學不到什麼東西. 所謂的"做開發"也是如此, 連關係數據庫的幾個範式都不知道是什麼就去弄什麼SQL Server, 搞什麼ORM, 全都是空談, 充其量也就是會用用工具而已. 

就我目前的經歷來看, 我認爲作爲一個軟件方向的CS學生, 相對高效的學習方案應該是學基礎課時學好高數和英語(我現在就特別想再去重學高數), 閒暇時間搞搞C++, Java, 等各種語言, 至少做到一個瞭解的程度, 個別的要熟練, 與計算機軟件關係不是很大的理科課程成績搞到90+就行, 比如物理, 比如電路, 線性代數很簡單, 概率論要特別認真學, 特別是經常要拿起來複習複習, 這是一門終身受用的學科. 然後其餘的時間可以用來啃算法導論, 相信我, 這本書普通人大學四年根本不可能啃完. 總之數學類的書看的再多都嫌少. 另外可以擴展出去接觸一些人文類書籍, 特別是傳記類, 勵志類的東西. 

關於修養
我剛上大學的時候有這麼一個習慣, 拿一些自己心中已經知道答案的問題去請教老師, 以顯得自己很好學, 很牛B. 記得我有過在軟件工程選修課上跑去問我們學校有沒有關於"設計模式"的課程, 或者問ben一些明顯Google一下就能知道答案的問題...等等等等都是內心浮躁的表現. 

自我修養是一種很要緊的東西, 對於一個性格內向的ACMer來說, 這往往不會有什麼問題, 這是由性格決定的, 但不是每個人都性格內向, 不是每個人都能保持內斂. 一旦你有裝B(一切驕傲, 或者因爲自己的某方面才能而沾沾自喜, 或者想要顯露自己, 不管和不合適, 暫且用"裝B"來代替吧)的行爲或者想法, 或者僅僅是潛意識, 那就預示着你會被大多數人看不起, 會大量浪費自己的時間, 會降低自己的學習效率, 會使自己成爲井底之蛙. 不過完全不裝B倒也不太好做到, 比如我以爲自己寫blog多少有些顯露自己的意思, 自我分析一下, 動機大概有如下幾條: 想讓日後身邊的某人突然發現我說:"啊, 你就是Answeror啊!", 想讓我以前女朋友在若干年後突然發現我的blog說:"原來我以前男朋友這麼好學, 這麼有修養有文化!", 想讓我被某些大學教授或者公 司裏的人認識, 想結交志同道合朋友, 想讓別人給我的解題報告挑錯...

寫blog這件事情也就算了, 畢竟是件利人利己的好事, 偶爾裝裝B也就算了. 但是像我在本文開頭說的那樣, 剛進華理僅僅因爲自己有點C++和網絡工程知識的皮毛就裝出一副很牛B的樣子, 那種裝任誰都無法忍受. 尤其是第一次跟羅老師的談話, 簡直就是裝到了極點, 以至於我後來就有這麼一個想法: 反正我可以做技術活, 幹嘛非要搞ACM, 我可以自由地去學心理學, 學人工智能, 學.NET, 我牛B着呢, ACM算個屁. 然後我就傻BB地搞了5個月的.NET, 然後到大三上數據庫原理的時候發現當時花了一個星期學的種種東西現在只是一節課的事情, 直到那時我還在裝B, 跟旁邊的同學說我上述的體會, 仿彿就是在告訴他說:"你看我牛B吧, 我老早就知道這是什麼東西了, 還做過它的開發", 時至今日, 我仍然有時會忍不住在同學討論C++種種語言特性時上去插插嘴, 裝裝B. 高中的一個好友曾這樣形容我: "他這個人啊, 只要看了什麼書或者電影之類的, 就要馬上在他的文章裏體現出來". 

聽起來很好笑吧, 請正在看這些文字的你不妨停下來反思一下自己最近一個星期有沒有類似的行爲? 

作爲一個ACMer, 改掉這些吧. 

我們做ACM的, 本來在這個學風不正的計算機學院裏就是一羣特殊人羣, 我們需要做的僅僅是不停地補充知識, 完善自己, 沒必要費盡心機去博得他人的一兩句讚美之辭. 我是誰? 我就是華理的一個ACMer. 我每天窩在機房裏爲的不是哪天去比賽有小MM來找我們簽名, 而是讓自己精通各種算法, 提升自己的數學修養, 增強自己解決問題的能力, 培養自己內斂的人格, 然後在某日某公 司的面試時讓面試官打心地裏認爲我是個人才, 然後用我以前長期積累的知識寫出卓越的軟件. 

希望你我都能早日問心無愧地說出上面的話. 

 

 

http://forum.byr.edu.cn/bbscon.php?bid=212&id=36861

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章