不知不覺即將踏入大三,我想寫寫過去這兩年來在編程上面的一些思考,算是對(duì)過去這兩年學(xué)學(xué)習(xí)的概括性總結(jié).
在大學(xué)最開始的時(shí)間里,我用了不到一個(gè)星期的時(shí)間補(bǔ)完高中沒學(xué)完的C語言,然后用它做了200多道OJ題.200道題對(duì)于ACM隊(duì)員來說是非常少的級(jí)別,對(duì)我算法的提高也有限,但正是這200多道題,幫我熟悉了C這門語言和代碼的執(zhí)行流程,我今天都覺得這很幸運(yùn).
比起兩年前,隨著學(xué)習(xí)的深入,我覺得編程開始變得越來越難。大一時(shí),我覺得算法是最難的,那時(shí)我做的最多的事是刷Oj,只要我掌握了最高深的算法,我就能爬上程序員之巔。然而事實(shí)是,算法只是當(dāng)中最難的一部分而已,算法學(xué)得好,只是成為優(yōu)秀程序員的必要條件,僅此而已.
再后來, 我認(rèn)為編程最難的是如何把想法描述成代碼,只要我能把所有的想法抽象為代碼,那我將能在編程世界中所向披靡。現(xiàn)在的我明白,擁有良好的代碼抽象能力,也只是成為優(yōu)秀程序員之前的必經(jīng)之路而已。除了知道怎樣去描述代碼,還得考慮如何把代碼寫得具有可讀性和可擴(kuò)展性,畢竟軟件大多是由多人團(tuán)隊(duì)合作完成的,而且隨時(shí)都有可能進(jìn)行擴(kuò)展.
現(xiàn)實(shí)生活中我對(duì)方言的興趣也體現(xiàn)到了編程語言上,過去的兩年來,我把幾門主流語言都接觸了一遍,C++,Java,C#,Js,Python等等.Ruby的作者松本行弘有一本書叫<<代碼的未來>>,里面介紹了很多種語言的特點(diǎn)和部分實(shí)現(xiàn).接觸語言多的一個(gè)好處,就是快速學(xué)習(xí)一門新的語言對(duì)我來說不是問題,因?yàn)楹芏喔拍畋举|(zhì)上都是相通的.當(dāng)然你說學(xué)而不精我也覺得有道理,比如C++,我學(xué)了一個(gè)學(xué)期,可能我能用C++寫一些簡單的程序,但是寫一個(gè)復(fù)雜的系統(tǒng)完全是不可能的.但總的來說還是利大于弊.(現(xiàn)在我最喜歡用的Python和Golang,誰用誰知道 :)
慢慢地我開始會(huì)用Java構(gòu)建一個(gè)簡單的網(wǎng)絡(luò)服務(wù),在準(zhǔn)備開始學(xué)Java三大框架的時(shí)候,Python突然跑了進(jìn)來.對(duì)Java冗長的語法和XML的厭倦讓我對(duì)Python格外喜歡,一直到現(xiàn)在我依然在學(xué)習(xí)和使用它.接下來的時(shí)間里我陸陸續(xù)續(xù)嘗試了flask,django,tornado框架的使用.現(xiàn)在回過頭來評(píng)價(jià)這三個(gè)框架,最讓我喜歡的是tornado.
從廣義來上說,如果編程不僅僅表示寫代碼,而是構(gòu)建一個(gè)可用的程序(服務(wù))的話,那么學(xué)習(xí)編程的難度曲線會(huì)陡然上升.拿我接觸比較多的服務(wù)端開發(fā)舉例,當(dāng)我寫完程序部署代碼的時(shí)候,我發(fā)現(xiàn)需要一個(gè)Web服務(wù)器,比如Nginx或Apache之類,這類軟件不需要我寫代碼去實(shí)現(xiàn)(感謝這個(gè)時(shí)代的開源文化),但是如果你想用好它,不去了解它的實(shí)現(xiàn)是不可能的.而這就需要你去深入得學(xué)習(xí)一些重要軟件,看它的源代碼,理解它的工作方式,知道它擅長什么,哪些地方有坑需要注意.類似的軟件還有而不僅限于Docker,Mongodb,Redis,Git等等等等.甚至是你經(jīng)常使用的框架,如果你能去扒一扒它源代碼來看,也肯定會(huì)有不一樣的收獲..
就算掌握了這些,如果想繼續(xù)深入學(xué)習(xí)的話,還是有很多方面能夠投入.你可以去了解SSH協(xié)議的原理,Socket5的原理,然后自己動(dòng)手實(shí)現(xiàn)一個(gè).嘗試去深入得學(xué)習(xí)編譯原理和操作系統(tǒng)(大三這一年我想干的事),只要想學(xué),在計(jì)算機(jī)這塊沒有你學(xué)得完的知識(shí).所以在今天大家才說學(xué)習(xí)能力對(duì)一個(gè)優(yōu)秀的程序員來說有多么重要.
我說了這么多關(guān)于編程難的內(nèi)容,不是我感到氣餒,而是因?yàn)閺淖铋_始對(duì)編程的簡單認(rèn)知,到現(xiàn)在漸漸在這個(gè)門檻上踏過半支腳,我越來越意識(shí)到需要更加用心得去學(xué)才能有所成就.
至于我為什么要編程,我覺得已經(jīng)不單單是為了興趣了吧.畢竟我不是Linus,能夠說自己Just For Fun,也不能像Swartz一樣For Freedom.我相信每一個(gè)人的潛力,但基于現(xiàn)在自身和外部的條件,我做不到Change the world(But I want),我只能讓我編程成為改變我自己的一種方式.編程對(duì)我來說,像是一把錘子,一方面我要讓這把錘子變得更加強(qiáng)大(專業(yè)能力強(qiáng)),另一方面我也要讓自己有足夠的能力去揮動(dòng)它(其他能力/品質(zhì)).為的就是有一天我能夠揮著這把錘子指哪打哪,讓我不僅僅能夠改變自身,還能幫社會(huì)做一些有意義的事,能夠提供生產(chǎn)效率,讓社會(huì)能夠變得公平點(diǎn),我覺得這就是有意義的.