沒有完美的語言,不要和一種編程語言廝守終生
發布時間:2016-02-02 責任編輯:susan
【導讀】程cheng序xu員yuan在zai著zhe手shou一yi個ge項xiang目mu時shi,需xu要yao做zuo的de關guan鍵jian決jue定ding之zhi一yi就jiu是shi選xuan擇ze一yi種zhong語yu言yan,或huo是shi一yi組zu語yu言yan,用yong於yu實shi施shi該gai係xi統tong。這zhe一yi決jue定ding不bu僅jin會hui影ying響xiang係xi統tong的de實shi現xian,也ye會hui影ying響xiang設she計ji。既ji然ran這zhe個ge決jue定ding會hui導dao致zhi深shen刻ke而er長chang遠yuan的de結jie果guo,那na麼me是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。
例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)。
ruguowomennenggoufangkaixionghuai,tanchengdiduidaizijichiyoudepianjian,namewomenjiukeyijianqingyixieleisizaizhuangxiushiyingyaojiangfangdingdingjinyuanxingkongdetongku。suiranwomenmeiyoushenmemijuelaiweixiangmuxuanzewanmeiyuyan,danhaishikeyizunxunyixieyuanze,bangzhuwomenzuochuyigegenghao,gengheshideyuyanxuanze。
沒有完美的語言
這一點對任何人,甚至是新手而言,都是在意料之中的,並且我們很多人都願意承認,“當然,這種語言並不是完美的語言,”但與此同時,我們很多人還是 會說,“這語言是最好的編程語言”。說一種語言是項目的最好語言的關鍵是項目的背景,也就是說,最好的語言隻存在於一定的範圍內。這就是我們的第一條原則:
沒有完美的語言:每一種語言都有它的優點和缺點。
例如,許多通常使用運行時語言,如Java或Python的開發人員,聲稱C或C ++lingrentoubuguoqilai,huiyinweiguanzhuliruneicunguanlizheleidicengcidexijie,huoguanxinbianyishileixingjianzhadeyangelidu,ereshafenzhiyukaifarenyuandezhize。zheshishishi,zhiyaowomenzhengzaikaifadexiangmubuguanzhukansisuosuiderenwu,runeicunguanlihuofashengzaidanyixunhuanzhongdecopy-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或另一種“更高級”的語言,簡直就像上天的恩賜:但真的是這樣的嗎?
有you時shi候hou,可ke能neng我wo們men不bu喜xi歡huan一yi門men語yu言yan的de原yuan因yin正zheng是shi我wo們men要yao使shi用yong該gai語yu言yan的de原yuan因yin。如ru果guo我wo正zheng在zai開kai發fa一yi個ge驅qu動dong程cheng序xu或huo一yi些xie關guan鍵jian性xing安an全quan,實shi時shi的de係xi統tong,上shang麵mian表biao述shu的de繁fan瑣suo不bu堪kan的de原yuan因yin可ke能neng正zheng是shi這zhe個ge語yu言yan的de最zui大da優you勢shi。例li如ru,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 ++的原因正是我應該使用這種語言的原因。
這是否意味著,我們應該愁眉苦臉地使用這些會讓我們對這語言惱怒的功能?也沒有必要。或許你可以換個角度:不要將這些功能當作缺點,也許我們應該擁抱它們,將它們當作完成任務的必需品。我們不應該說“這真是一個悲劇,”而應該說,“謝天謝地,我居然能用這種語言做到這一點。”請記住:zaimouxiebeijingxia,zhexiegongnengjiangshishangtiandeenci,erzaiqitaqingkuangxia,tamencaishileizhui。zhiyuweishenmebuxihuanmouyimenyuyandegongneng,qingchengshidigaosuziji。
越熟悉其他語言,越好
對於這一點,就是我們要說的第三個原則:
如果你擁有的唯一工具是一個錘子,那麼你看每一個問題都像是釘子。
這條規則並不適用於軟件工程,但它尖銳地表現了許多軟件開發的情況。很多時候,我們選擇一種語言,或一種語言支持的工具(如Java的JMS,Python的ASYNCIO,Rails的Ruby等),是因為我們知道它們存在。如果我們唯一熟悉的語言是Java,那麼我們會將我們碰到的 所有問題都適應到Java的上下文中。例如,“我需要為一個通信應用創建一個路由框架。在Java中我該怎麼做呢?”這就限製了可供我們使用的工具,並人為地限製我們為完成工作選擇合適工具的餘地。
解決這個問題的方法是擴大你的視野,了解其他語言的的功能和錯綜複雜之處。正如Andrew Hunt和David Thomas在《The Pragmatic Programmer》zhonggeichudejianyi,yigehaodezuofajiushi,meinianxuexiyimenxindeyuyan。zhekebumeiyoutingshangqunamerongyi,xuexiyimenyuyanduibutongderenjiangyiweizhebutongdeshiqing。 還hai有you一yi個ge衍yan生sheng問wen題ti是shi,我wo們men對dui正zheng在zai進jin行xing中zhong的de項xiang目mu往wang往wang隻zhi會hui使shi用yong這zhe一yi種zhong語yu言yan,從cong而er使shi得de學xue習xi的de另ling一yi種zhong語yu言yan顯xian得de毫hao無wu用yong處chu。例li如ru,假jia設she我wo是shi一yi個geAndroid開發人 員,基本上每天隻用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用yongC ++執行元編程,那麼他或她可以使用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;因此,了解最流行語言的這些功能是很有幫助的。
zhongjianjiankeyiyunxushiyongduozhongyuyan。liru,ruguoyoulianggebixujinxingtongxindeyingyongchengxu,ruyidongshebeiheyigefuwuqiyingyongchengxu,danzhebingbuyiweizhetamenbixushiyongxiangtongdeyuyan(當然也可以相同,如果你判斷認為這是最好決定的話)。如果這個移動設備是一款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
熱門搜索
微波功率管
微波開關
微波連接器
微波器件
微波三極管
微波振蕩器
微電機
微調電容
微動開關
微蜂窩
位置傳感器
溫度保險絲
溫度傳感器
溫控開關
溫控可控矽
聞泰
穩壓電源
穩壓二極管
穩壓管
無焊端子
無線充電
無線監控
無源濾波器
五金工具
物聯網
顯示模塊
顯微鏡結構
線圈
線繞電位器
線繞電阻





