先不用說(shuō)"無(wú)論什么語(yǔ)言都是一種工具"。工具是我們身體的一部分,解放軍解放臺(tái)灣靠"小米加步槍"? "工具無(wú)所謂"論可以休矣。對(duì)于實(shí)際的軟件工程工具和平臺(tái)的選擇是很重要的,有時(shí)候是致命的 1. perl是強(qiáng)大的, perl=shell+awk+sed+一堆命令行工具。 但是反過(guò)來(lái)也一樣shell+awk+sed+一堆命令行工具可以替代perl. 2. shell的簡(jiǎn)約,可讀性比perl好,工具之間通過(guò)命令行stdio管道通信,任何一個(gè)小部分都可以拿出來(lái)測(cè)試和試驗(yàn),程序維護(hù)/修改很容易。學(xué)習(xí)曲線和積累方式比perl更優(yōu)。 3. perl是跨平臺(tái)的呀!java,sysv標(biāo)準(zhǔn), posix是跨平臺(tái)工具和標(biāo)準(zhǔn)。oracle還跨平臺(tái)呢! 但是實(shí)際軟件部署是需要選擇平臺(tái)的,一旦選擇好了就希望這個(gè)平臺(tái)穩(wěn)定。雖然unix/linux的命令行工具在不同的平臺(tái)特性稍有不同,但是你一旦選定了平臺(tái),那么這個(gè)平臺(tái)上的shell/命令行工具就是非常穩(wěn)定的可依賴(lài)集合,不但可靠而且基本不會(huì)有變化。軟件開(kāi)發(fā)商的投資也因此受到了保護(hù)。perl和python則處于不斷的變化當(dāng)中,新的數(shù)據(jù)庫(kù)DBI模塊/某種功能的版本來(lái)臨,需要perl/python升級(jí)到新的版本。那么新的版本是否可靠,是否影響原有系統(tǒng)的運(yùn)行參數(shù)? 那么需要很多的回滾測(cè)試。perl可以寫(xiě)文件到某個(gè)路徑,win下面用盤(pán)符開(kāi)頭,*nix下面用/路經(jīng)開(kāi)頭---軟件開(kāi)發(fā)和部署的成本并沒(méi)有因?yàn)閜erl跨平臺(tái)而減少。 如果perl只是用來(lái)作為"膠水"粘合其他的程序,那么跨平臺(tái)也就無(wú)從談起了。效率也比不上shell 4. python是面向?qū)ο蟮难?!不錯(cuò),只是沒(méi)有了shell使用管道拼接程序,難以單獨(dú)拿出某一塊來(lái)跑跑看看有什么效果。你必須讀完整個(gè)程序才能發(fā)現(xiàn)出了什么問(wèn)題。開(kāi)發(fā)成本不比shell低。 5. Unix的Kiss原則,perl和python都違反了。我剛學(xué)習(xí)shell,用的很爽。腳本里面有一部分是sed和awk,我不懂不要緊,我留給以后學(xué)習(xí)"sed和awk"。盡管如此我可以看到sed和awk的輸入輸出是什么,不影響我理解程序。我有用了,可以學(xué)學(xué)awk,學(xué)學(xué)find的高級(jí)用法。這些都不會(huì)使得原先的shell程序過(guò)時(shí)。perl呢? 就像java, swing出來(lái)了awt就過(guò)時(shí)了,一個(gè)新框架出來(lái)了老框架就得推導(dǎo)。作為一個(gè)語(yǔ)言,問(wèn)題域太大。而shell恰恰做到了kiss,它只做好自己的事情。 6. 作為弱類(lèi)型語(yǔ)言的perl,雖然避免了類(lèi)型的繁瑣開(kāi)銷(xiāo),同時(shí)也使得程序的調(diào)試更加困難,反而不如shell的文本IO來(lái)的直觀。 7. DBI很強(qiáng)大嗎? 我們的系統(tǒng)如果選定了oracle那我就在shell腳本里面sqlplus然后直接sql語(yǔ)句,用dbi豈不累死(5倍以上的代碼),難里理解,難以調(diào)試,可讀性也級(jí)差!為了dbi屏蔽了db的不同,提供統(tǒng)一的接口? 如果db要改變,那么定義文件,存儲(chǔ)過(guò)程,函數(shù)什么的全都要重寫(xiě)!腳本調(diào)用只是一小部分。python也存在同樣的問(wèn)題。如果完全不用存儲(chǔ)過(guò)程呢? 那么j2se+hibernate+spring好了,真正的跨平臺(tái)。perl/python的思想是大而全,和win+vs如出一轍。 8. python的很多用戶(hù)來(lái)自win,因?yàn)樯厦婺J(rèn)沒(méi)有shell,哈哈 9. python的運(yùn)行取決于變量,像perl一樣,無(wú)法如同shell一樣提取IO的結(jié)果來(lái)直觀的調(diào)試和修改。 10.是的, linux的anaconda安裝界面,yum都是基于python的,gnome/kde也大量依賴(lài)perl。那是為了有一個(gè)"像腳本一樣運(yùn)行的c/c++"。 但是問(wèn)題是操作系統(tǒng),虛擬機(jī),桌面管理器都是嚴(yán)肅的東西,那些系統(tǒng)級(jí)別的perl/python的代碼有牛人和牛組織來(lái)保證。如果是普通的應(yīng)用軟件開(kāi)發(fā)呢(賣(mài)錢(qián)的那種),用perl/python的人會(huì)因?yàn)楦鞣N目的,有的是為了程序今后的擴(kuò)展性(其實(shí)他離開(kāi)以后這個(gè)版本就完結(jié)了),有的是為了移植性(其實(shí)大部分的系統(tǒng)都被綁定在一個(gè)特定的平臺(tái)),有的是為了趕時(shí)髦(很多python用戶(hù)都是這么來(lái)的),還有的是為了顯示自己的編程多么厲害使用一堆perl/python的高級(jí)特性:總之,這個(gè)豪華的工具就是雙刃劍,對(duì)于普通的項(xiàng)目普通的軟件開(kāi)發(fā)者來(lái)說(shuō),會(huì)給我們展示一個(gè)虛擬的天國(guó)(其實(shí)團(tuán)隊(duì)達(dá)不到那樣的把握水準(zhǔn)),然后會(huì)把事情弄得一團(tuán)糟。 所以我選擇古老的shell,古老而且穩(wěn)定,保守而久經(jīng)考驗(yàn),足夠而且簡(jiǎn)潔。M16會(huì)被更好的M4取代,但是AK47卻是永恒的。 |
|