到底是Java好還是Python好?
語言的優(yōu)劣之爭是個(gè)永恒的話題,有時(shí)候一次偶然地“擦槍走火”甚至可能會(huì)引發(fā)一場鐵桿粉絲之間的“戰(zhàn)爭”。
也經(jīng)常有人問我:“老劉,到底是Java好還是Python好? 我應(yīng)該學(xué)習(xí)哪個(gè)語言?”
我也挺為難的,只好說道:
Python挺適合入門的,看起來很簡單,適合創(chuàng)業(yè)團(tuán)隊(duì),可以快速開發(fā),快速上線,快速迭代。適合特種部隊(duì)的突襲。等到發(fā)展到一定規(guī)模,動(dòng)態(tài)語言的劣勢就會(huì)體現(xiàn)出來,維護(hù)/重構(gòu)難度高,特別是我覺得動(dòng)態(tài)語言寫的代碼腐化速度要比靜態(tài)的Java要快一些。
Java呢,語法相對Python啰嗦,表達(dá)力要弱一些,開發(fā)起來一板一眼,有很多規(guī)范,適合集團(tuán)軍的大規(guī)模協(xié)同作戰(zhàn);有很多著名的框架和類庫,性能不錯(cuò),系統(tǒng)穩(wěn)定而成熟,是開發(fā)大型系統(tǒng)的極好選擇。
他說:“老劉你這是在和稀泥嘛,我到底應(yīng)該學(xué)啥?”
我說:“你應(yīng)該把注意力放到那些和Java無關(guān),和Python無關(guān),能反映一個(gè)程序員水平高低的編程的共性問題。”
舉個(gè)非常簡單的例子,開發(fā)中需要實(shí)現(xiàn)一個(gè)定制的、簡單的緩存,如果使用ehcache ,memcached, redis這樣的開源系統(tǒng)就太重量級(jí)了,經(jīng)理要求你新寫一個(gè),可以支持(key,value)存儲(chǔ),設(shè)置過期時(shí)間,過期的可以自動(dòng)清理掉,你能不能快速地實(shí)現(xiàn)一個(gè)高質(zhì)量的版本?
這其中涉及到的就是數(shù)據(jù)結(jié)構(gòu)和算法、以及線程的知識(shí),和具體的語言關(guān)聯(lián)度很小。
再比如給你一個(gè)需求,你能不能找出其中“概念”,從而設(shè)計(jì)出類?能不能做好信息的封裝和隱藏,定義出良好的接口,讓每個(gè)類的職責(zé)單一而準(zhǔn)確?
Python中有class , Java 中也有class, 但是上述工作卻和具體語言沒什么關(guān)系。你需要做的是利用你的經(jīng)驗(yàn),在腦海中做一次思維體操,然后用某個(gè)語言工具把他們表達(dá)出來。
有些“概念”比較容易發(fā)現(xiàn),有些“概念”和現(xiàn)實(shí)沒有直接的對應(yīng)關(guān)系,需要抽象一下才能找到,這就比較考驗(yàn)抽象的能力了。
可能有人說,我們Web開發(fā)都是“面向數(shù)據(jù)庫”編程的,都是基于數(shù)據(jù)庫的增刪改查,用不上你說的這些東西。 那如果經(jīng)理給你一個(gè)項(xiàng)目需求,讓你完整地設(shè)計(jì)出表結(jié)構(gòu)來,要求方便后續(xù)的程序開發(fā),又要考慮到靈活性和擴(kuò)展性,你能不能搞定呢?
在編程中,你發(fā)現(xiàn)了重復(fù)的代碼,那能不能找到一個(gè)概念(最終可能由一個(gè)類或者函數(shù)來表達(dá)),來表示這個(gè)重復(fù)的模式,從而極大地消除重復(fù)代碼?
你能否區(qū)分哪些是不變的部分,哪些是變化的部分,把他們區(qū)分開來,“發(fā)現(xiàn)變化,并且封裝變化。”
說到底,本質(zhì)上還是那個(gè)抽象的能力, 這樣的例子有很多,這里不再一一列舉了。
作為一個(gè)程序員要發(fā)展,要成長,不可能一直增刪改查,不可能一直停留在編程語言的特性上面,爭論孰優(yōu)孰劣。
對于做技術(shù)的人來說,總有一天,眼光和視野要超越編程語言,進(jìn)行設(shè)計(jì)和架構(gòu)的工作,停止無謂的爭論,開始扎扎實(shí)實(shí)地學(xué)習(xí)吧。