沒有完美的語言,不要和一種編程語言廝守終生
發布時間:2016-02-02 責任編輯:susan
【導讀】chengxuyuanzaizheshouyigexiangmushi,xuyaozuodeguanjianjuedingzhiyijiushixuanzeyizhongyuyan,huoshiyizuyuyan,yongyushishigaixitong。zheyijuedingbujinhuiyingxiangxitongdeshixian,yehuiyingxiangsheji。jiranzhegejuedinghuidaozhishenkeerchangyuandejieguo,nameshibushizaizuozhegejuezeshiyinggaigengjiawushi?henduoshihou,womenhuimangmudipianpoyuwomenxuanzedeyuyan。
例li如ru,我wo們men應ying該gai使shi用yong麵mian向xiang對dui象xiang的de語yu言yan還hai是shi過guo程cheng語yu言yan?選xuan擇ze什shen麼me語yu言yan對dui項xiang目mu以yi及ji作zuo為wei項xiang目mu一yi部bu分fen的de程cheng序xu的de生sheng命ming周zhou期qi有you著zhe深shen遠yuan的de影ying響xiang,很hen多duo次ci,我wo們men基ji於yu一yi些xie非fei常chang善shan變bian的de因yin素su,沒mei有you思si考kao太tai多duo 就去選語言:這語言是我慣常用來實現這類係統的;這語言我了解得最透徹;這是我最喜歡的語言,我很享受於用這種語言編程;等等。

既ji然ran這zhe個ge決jue定ding會hui導dao致zhi深shen刻ke而er長chang遠yuan的de結jie果guo,那na麼me我wo們men是shi不bu是shi在zai做zuo這zhe個ge抉jue擇ze時shi應ying該gai更geng加jia務wu實shi?很hen多duo時shi候hou,我wo們men會hui盲mang目mu地di偏pian頗po於yu我wo們men選xuan擇ze的de語yu言yan。而er且qie,有you時shi候hou我wo們men之zhi所suo以yi不bu喜xi歡huan選xuan擇ze這zhe種zhong語yu言yan的de原yuan因yin可ke能neng正zheng是shi為wei什shen麼me我wo們men要yao選xuan擇ze那na種zhong語yu言yan的de原yuan因yin。
如(ru)果(guo)我(wo)們(men)能(neng)夠(gou)放(fang)開(kai)胸(xiong)懷(huai),坦(tan)誠(cheng)地(di)對(dui)待(dai)自(zi)己(ji)持(chi)有(you)的(de)偏(pian)見(jian),那(na)麼(me)我(wo)們(men)就(jiu)可(ke)以(yi)減(jian)輕(qing)一(yi)些(xie)類(lei)似(si)在(zai)裝(zhuang)修(xiu)時(shi)硬(ying)要(yao)將(jiang)方(fang)釘(ding)釘(ding)進(jin)圓(yuan)形(xing)孔(kong)的(de)痛(tong)苦(ku)。雖(sui)然(ran)我(wo)們(men)沒(mei)有(you)什(shen)麼(me)秘(mi)訣(jue)來(lai)為(wei)項(xiang)目(mu)選(xuan)擇(ze)完(wan)美(mei)語(yu)言(yan),但(dan)還(hai)是(shi)可(ke)以(yi)遵(zun)循(xun)一(yi)些(xie)原(yuan)則(ze),幫(bang)助(zhu)我(wo)們(men)做(zuo)出(chu)一(yi)個(ge)更(geng)好(hao),更(geng)合(he)適(shi)的(de)語(yu)言(yan)選(xuan)擇(ze)。
沒有完美的語言
這一點對任何人,甚至是新手而言,都是在意料之中的,並且我們很多人都願意承認,“當然,這種語言並不是完美的語言,”但與此同時,我們很多人還是 會說,“這語言是最好的編程語言”。說一種語言是項目的最好語言的關鍵是項目的背景,也就是說,最好的語言隻存在於一定的範圍內。這就是我們的第一條原則:
沒有完美的語言:每一種語言都有它的優點和缺點。
例如,許多通常使用運行時語言,如Java或Python的開發人員,聲稱C或C ++令(ling)人(ren)透(tou)不(bu)過(guo)氣(qi)來(lai),會(hui)因(yin)為(wei)關(guan)注(zhu)例(li)如(ru)內(nei)存(cun)管(guan)理(li)這(zhe)類(lei)低(di)層(ceng)次(ci)的(de)細(xi)節(jie),或(huo)關(guan)心(xin)編(bian)譯(yi)時(shi)類(lei)型(xing)檢(jian)查(zha)的(de)嚴(yan)格(ge)粒(li)度(du),而(er)扼(e)殺(sha)分(fen)置(zhi)於(yu)開(kai)發(fa)人(ren)員(yuan)的(de)職(zhi)責(ze)。這(zhe)是(shi)事(shi)實(shi),隻(zhi)要(yao)我(wo)們(men)正(zheng)在(zai)開(kai)發(fa)的(de)項(xiang)目(mu)不(bu)關(guan)注(zhu)看(kan)似(si)瑣(suo)碎(sui)的(de)任(ren)務(wu),如(ru)內(nei)存(cun)管(guan)理(li)或(huo)發(fa)生(sheng)在(zai)單(dan)一(yi)循(xun)環(huan)中(zhong)的(de)copy-assignment的數量。
相(xiang)反(fan),如(ru)果(guo)我(wo)們(men)工(gong)作(zuo)在(zai)一(yi)個(ge)項(xiang)目(mu),或(huo)項(xiang)目(mu)的(de)一(yi)部(bu)分(fen),那(na)麼(me)對(dui)於(yu)代(dai)碼(ma)應(ying)該(gai)如(ru)何(he)高(gao)效(xiao)以(yi)及(ji)程(cheng)序(xu)的(de)關(guan)鍵(jian)性(xing)安(an)全(quan)的(de)偏(pian)見(jian)需(xu)求(qiu)是(shi)自(zi)然(ran)而(er)然(ran)的(de),這(zhe)些(xie)看(kan)似(si)繁(fan)瑣(suo)的(de)細(xi)節(jie)可(ke)能(neng)正(zheng)是(shi)我(wo)們(men)正(zheng)在(zai)尋(xun)找(zhao)的(de)粒(li)度(du)水(shui)平(ping)。在(zai)這(zhe)種(zhong)新(xin)的(de)背(bei)景(jing)下(xia),Java或Python的運行時性質似乎過於漠不關心或過於心不在焉。相反,我們希望當內存分配和釋放的時 候,能夠嚴格控製有多少move-assignment和copy-assignment被執行,並在編譯時捕捉盡可能多的錯誤,而不是讓錯誤滲入運行時 (表現為運行時異常)。
雖然在理論上“沒有完美的語言”這一點聽起來是顯而易見的,但是我們作為開發人員的行為通常會背離這個概念:我wo們men說shuo我wo們men知zhi道dao我wo們men最zui喜xi歡huan的de語yu言yan是shi不bu完wan美mei的de,但dan我wo們men還hai是shi繼ji續xu對dui我wo們men開kai發fa的de項xiang目mu使shi用yong這zhe種zhong語yu言yan,不bu管guan它ta是shi否fou適shi合he。此ci外wai,當dang其qi他ta的de開kai發fa人ren員yuan質zhi疑yi我wo們men選xuan擇ze的de語yu言yan時shi,我wo們men會hui堅jian決jue捍han衛wei我wo們men的de選xuan擇ze,而er不bu願yuan意yi從cong他ta或huo她ta的de反fan駁bo中zhong看kan見jian事shi實shi的de真zhen相xiang。請qing記ji住zhu:每一種語言都有它的優點和缺點。了解你掌握的語言的優點和缺點,然後根據實際情況做出選擇。

你不喜歡一種語言的原因可能就是你應該使用它的原因
這似乎違反直覺,但有的時候,我們之所以不喜歡一門語言可能正是使用某種語言的原因。還是上麵的例子,在我作為一個C ++開發人員的經驗中,很多時候因為有那麼多不同的概念要跟蹤(內存管理和對象壽命時間,C ++編程三原則等),以致於完成項目的一個簡單功能都會變得繁瑣不堪。在用C ++開發幾周之後,使用Python,Java或另一種“更高級”的語言,簡直就像上天的恩賜:但真的是這樣的嗎?
youshihou,kenengwomenbuxihuanyimenyuyandeyuanyinzhengshiwomenyaoshiyonggaiyuyandeyuanyin。ruguowozhengzaikaifayigequdongchengxuhuoyixieguanjianxinganquan,shishidexitong,shangmianbiaoshudefansuobukandeyuanyinkenengzhengshizhegeyuyandezuidayoushi。liru,C ++提供了一種機製用於表達當對象被複製時被執行的邏輯,這在效率和嚴謹性井然有序的時候是非常寶貴的。
這(zhe)可(ke)能(neng)看(kan)上(shang)去(qu)都(dou)很(hen)好(hao)都(dou)很(hen)棒(bang),因(yin)此(ci)我(wo)們(men)很(hen)難(nan)確(que)切(qie)指(zhi)出(chu)在(zai)某(mou)個(ge)背(bei)景(jing)下(xia),某(mou)種(zhong)你(ni)看(kan)不(bu)順(shun)眼(yan)的(de)語(yu)言(yan)可(ke)能(neng)反(fan)而(er)更(geng)有(you)幫(bang)助(zhu)。那(na)麼(me),我(wo)們(men)該(gai)怎(zen)麼(me)知(zhi)道(dao)哪(na)些(xie)你(ni)不(bu)喜(xi)歡(huan)的(de)語(yu)言(yan)是(shi)有(you)幫(bang)助(zhu)的(de)呢(ne)?這(zhe)就(jiu)引(yin)出(chu)了(le)我(wo)們(men)的(de)第(di)二(er)條(tiao)原(yuan)則(ze):
對自己要誠實:知道自己為什麼不喜歡一門語言,不要教條化自己的憎惡。
例如,在上麵那個C ++的例子中,我之所以不喜歡長時間地用C ++編程,是因為這語言要求思想嚴謹,否則很容易犯錯,就像是被困於叢林中(過多地關注樹木,而不是樹林這個整體)。這種嚴謹會妨礙開發人員去質疑,如“我要在堆棧上或堆上創建對象嗎,或者部分在堆棧上,另一部分在堆上?”或“要讓這個類可擴展,應該通過模板參數還是通過繼承?”等決定。在其他語言中, 開發人員隻需分別創建一個對象以及使用麵向對象的繼承就可以完成這些任務,然後進入到下一個功能,因為語言(或者,更準確地說,編譯器或解釋器)關注這些細節。
但是,如果我對自己誠實的話,我會承認,我之所以不喜歡C ++的這些功能,是因為它將表達這些細節的責任歸咎於我。在其他語言中,我不僅不需要負責這些細節,而且我也沒有責任表達這些細節:它們被抽象遠離開發人員。在一個這些細節是必不可少的上下文中,我不喜歡C ++的原因正是我應該使用這種語言的原因。
這是否意味著,我們應該愁眉苦臉地使用這些會讓我們對這語言惱怒的功能?也沒有必要。或許你可以換個角度:不要將這些功能當作缺點,也許我們應該擁抱它們,將它們當作完成任務的必需品。我們不應該說“這真是一個悲劇,”而應該說,“謝天謝地,我居然能用這種語言做到這一點。”請記住:在(zai)某(mou)些(xie)背(bei)景(jing)下(xia),這(zhe)些(xie)功(gong)能(neng)將(jiang)是(shi)上(shang)天(tian)的(de)恩(en)賜(ci),而(er)在(zai)其(qi)他(ta)情(qing)況(kuang)下(xia),它(ta)們(men)才(cai)是(shi)累(lei)贅(zhui)。至(zhi)於(yu)為(wei)什(shen)麼(me)不(bu)喜(xi)歡(huan)某(mou)一(yi)門(men)語(yu)言(yan)的(de)功(gong)能(neng),請(qing)誠(cheng)實(shi)地(di)告(gao)訴(su)自(zi)己(ji)。
越熟悉其他語言,越好
對於這一點,就是我們要說的第三個原則:
如果你擁有的唯一工具是一個錘子,那麼你看每一個問題都像是釘子。
這條規則並不適用於軟件工程,但它尖銳地表現了許多軟件開發的情況。很多時候,我們選擇一種語言,或一種語言支持的工具(如Java的JMS,Python的ASYNCIO,Rails的Ruby等),是因為我們知道它們存在。如果我們唯一熟悉的語言是Java,那麼我們會將我們碰到的 所有問題都適應到Java的上下文中。例如,“我需要為一個通信應用創建一個路由框架。在Java中我該怎麼做呢?”這就限製了可供我們使用的工具,並人為地限製我們為完成工作選擇合適工具的餘地。
解決這個問題的方法是擴大你的視野,了解其他語言的的功能和錯綜複雜之處。正如Andrew Hunt和David Thomas在《The Pragmatic Programmer》中zhong給gei出chu的de建jian議yi,一yi個ge好hao的de做zuo法fa就jiu是shi,每mei年nian學xue習xi一yi門men新xin的de語yu言yan。這zhe可ke不bu沒mei有you聽ting上shang去qu那na麼me容rong易yi,學xue習xi一yi門men語yu言yan對dui不bu同tong的de人ren將jiang意yi味wei著zhe不bu同tong的de事shi情qing。 haiyouyigeyanshengwentishi,womenduizhengzaijinxingzhongdexiangmuwangwangzhihuishiyongzheyizhongyuyan,congershidexuexidelingyizhongyuyanxiandehaowuyongchu。liru,jiashewoshiyigeAndroid開發人 員,基本上每天隻用Java,那麼學習C#可能就會顯得不合時宜地浪費時間。
不(bu)要(yao)被(bei)假(jia)象(xiang)所(suo)蒙(meng)蔽(bi)。學(xue)習(xi)其(qi)他(ta)語(yu)言(yan)的(de)優(you)勢(shi)體(ti)現(xian)在(zai)我(wo)們(men)能(neng)從(cong)不(bu)同(tong)的(de)角(jiao)度(du)去(qu)看(kan)問(wen)題(ti),並(bing)且(qie)使(shi)用(yong)最(zui)適(shi)合(he)該(gai)問(wen)題(ti)的(de)工(gong)具(ju)。為(wei)了(le)做(zuo)到(dao)這(zhe)一(yi)點(dian),我(wo)們(men)必(bi)須(xu)學(xue)習(xi)其(qi)他(ta)語(yu)言(yan)的(de)相(xiang)關(guan)警(jing)告(gao),以(yi)及(ji)開(kai)發(fa)人(ren)員(yuan)使(shi)用(yong)這(zhe)些(xie)語(yu)言(yan)解(jie)決(jue)問(wen)題(ti)的(de)方(fang)式(shi)。例(li)如(ru),如(ru)果(guo)一(yi)個(ge)開(kai)發(fa)人(ren)員(yuan)想(xiang)用(yong)C ++執行元編程,那麼他或她可以使用C ++中的Template Metaprogrammming(TMP),但他或她也可以使用Java中的反射。理解其他語言是如何解決類似問題的,可以減少我們認為它毫無用處的風 險。
再說一個例子,如果我們需要能夠改變一個類的運行時特征,那麼一個深入熟悉C ++錯綜複雜性的C ++開發人員,可能會試圖編造一個延伸這個編譯時語言的界限的解決方案。而另一個C ++開發人員,由於對Java也有一定的了解,就能夠說,“我喜歡C ++,但Java的運行時反射更適合解決這個問題。”
因為有如此之多的編程語言任開發人員擇選,因此,優先安排學習什麼語言很重要。不妨從當今最流行的語言入手(可參考《most popular languages on Github》,《Language Trends on Github》,《The 9 most popular computer languages》,《according to the Facebook for programmers》等)。
語言是手段而不是目的
這是第四條,也是最後一條原則,聽上去可能最哲學,但也可以說是最重要的:
編程語言是一種手段,而不是目的。
除非你是一個語言標準的作者或是一個編譯器的作者,否則你就應該將編程語言當作是一種手段而不是目的,目的是完成項目:最終的目標是要完成項目,而不是使用特定的語言。這並不意味著每個開發人員就無權要求他或她喜歡或不喜歡的語言(實際上,如果我們對自己誠實的話,這些好惡反而能夠讓我們受惠;參見 上麵的第二條原則),但我們不應該自欺欺人作出這樣的決定,如,“這對我來說是使用該語言這一功能的一個很好的機會”,除非該語言的功能真正適合項目的需求。
重要的是要記住,語言隻是表達如何解決手頭問題的一種方法:請確保你選擇了最能表達解決問題域的語言。
其他需要考慮的地方
下麵是一些我們在選擇語言的時候,需要補充考慮的地方:
考慮語言如何與其他語言的交互。例如,如果你認定Python是完成大部分項目的最好語言,但在你的項目中有一個定義良好的組件,需要極高水平的粒度或效率(更適合用C或C++ ),這並不意味著你不能在這個項目上使用Python。相反,考慮使用Python,特定組件用C或C ++寫,然後使用Python C API接口此組件。請注意,要製定這樣的解決方案,我們需要知道Python有一個C API;因此,了解最流行語言的這些功能是很有幫助的。
中(zhong)間(jian)件(jian)可(ke)以(yi)允(yun)許(xu)使(shi)用(yong)多(duo)種(zhong)語(yu)言(yan)。例(li)如(ru),如(ru)果(guo)有(you)兩(liang)個(ge)必(bi)須(xu)進(jin)行(xing)通(tong)信(xin)的(de)應(ying)用(yong)程(cheng)序(xu),如(ru)移(yi)動(dong)設(she)備(bei)和(he)一(yi)個(ge)服(fu)務(wu)器(qi)應(ying)用(yong)程(cheng)序(xu),但(dan)這(zhe)並(bing)不(bu)意(yi)味(wei)著(zhe)它(ta)們(men)必(bi)須(xu)使(shi)用(yong)相(xiang)同(tong)的(de)語(yu)言(yan)(當然也可以相同,如果你判斷認為這是最好決定的話)。如果這個移動設備是一款Android手機,而服務器應用程序非 常適合作為一個Python應用程序的話,那麼使用一個消息代理,如RabbitMQ,可以讓你在通信的同時使用這兩種語言:Android應用程序可以 使用Java RabbitMQ API,而服務器應用程序可以使用Python RabbitMQ API。
擁抱其他語言的古怪之處。如果你是一個Java開發人員,那麼你會使用包來分隔源代碼的邏輯單元;如果你是一個 Python開發人員,那麼你會使用Python的包結構做相同的事情;如果你是一個C ++開發人員,那麼你會使用命名空間或前綴的類名(即“DZone_MyClassName”)。了解你正在使用的語言的特別之處,並擁抱它們:在羅馬, 就(jiu)入(ru)鄉(xiang)隨(sui)俗(su)。否(fou)則(ze)的(de)話(hua)就(jiu)像(xiang)是(shi)因(yin)為(wei)你(ni)更(geng)喜(xi)歡(huan)單(dan)詞(ci)用(yong)意(yi)大(da)利(li)語(yu)發(fa)音(yin),而(er)用(yong)意(yi)大(da)利(li)口(kou)音(yin)說(shuo)德(de)語(yu),這(zhe)樣(yang)就(jiu)顯(xian)得(de)不(bu)倫(lun)不(bu)類(lei)了(le)。當(dang)然(ran)也(ye)有(you)可(ke)能(neng)一(yi)種(zhong)語(yu)言(yan)的(de)一(yi)個(ge)功(gong)能(neng)長(chang)期(qi)存(cun)在(zai),但(dan) 是這樣的話,其中必有其原因:確保自己明白其中的道理。
推薦閱讀:
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- 貿澤EIT係列新一期,探索AI如何重塑日常科技與用戶體驗
- 算力爆發遇上電源革新,大聯大世平集團攜手晶豐明源線上研討會解鎖應用落地
- 創新不止,創芯不已:第六屆ICDIA創芯展8月南京盛大啟幕!
- AI時代,為什麼存儲基礎設施的可靠性決定數據中心的經濟效益
- 矽典微ONELAB開發係列:為毫米波算法開發者打造的全棧工具鏈
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
微波功率管
微波開關
微波連接器
微波器件
微波三極管
微波振蕩器
微電機
微調電容
微動開關
微蜂窩
位置傳感器
溫度保險絲
溫度傳感器
溫控開關
溫控可控矽
聞泰
穩壓電源
穩壓二極管
穩壓管
無焊端子
無線充電
無線監控
無源濾波器
五金工具
物聯網
顯示模塊
顯微鏡結構
線圈
線繞電位器
線繞電阻


