精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
別和一種語言廝守終生:為工作正確選擇編程語言

本文由程序猿編譯團隊-薇WEI 編譯

原文鏈接:https://dzone.com/articles/do-not-marry-a-language-selecting-the-correct-lang

轉載請注明來自:程序猿(微信號:imkuqin)


在為您的下一個APP選擇編程語言時可以參考下面一些思路。


開發人員在項目上需要作的關鍵選擇之一,就是語言或者語言組的選擇,以執行系統。這個選擇不僅關系到系統的執行,也關系到設計。例如,是該選擇面向對象語言還是面向過程語言?這個選擇會對整個項目產生深遠影響,亦或是影響項目中的一部分程序的壽命。我們常常不多加考慮就輕易作出選擇:我總是用這種語言來執行這種系統;我最了解這個語言;我最喜歡這個語言;我享受用這個語言來編程的過程等等。


既然編程語言影響深遠,在選擇上就該契合實際。我們常常意識不到自己在選擇上的偏見;更何況,有時候我們不喜歡選用一種語言的原因卻正是我們必須選擇這種語言的原因所在。


如果能打開心胸,坦誠面對自己的偏見,或許就能減少比如硬要往圓孔釘方釘的痛苦。在選擇一個比較好或者比較合適的語言時,我們可以考慮以下幾個原則。


沒有完美的編程語言


開發人員包括新手都會承認“這個語言當然不是個完美的語言”,但同時也會說“但這是最好的編程語言”,對此我們并不會感到驚訝。說一個語言是一個項目的最好語言關鍵點在于項目環境,只在某種特定環境中是最佳語言。因此我們的第一個選擇原則是:


沒有完美的語言,每個語言都有優劣。


舉例說,許多常用運行時語言如Java或Python的開發人員聲稱C語言或C++讓人不勝其煩,總讓他們關注低級細節如內存管理或編譯時類型檢查的嚴格粒度。這點無可否認,只要我們所開發的項目并非真正的關注貌似瑣碎的任務如內存管理或單一循環內的copy-assignments操作量。


相反,如果我們所做的項目或項目的一部分對我們的編碼效率或安全關鍵有極端偏見,而這種偏見又是自然而然的事,那么這種看似繁瑣的細節可能就是我們所要找的粒度水平。在這種環境下,Jave或Python的運行時性質似乎顯得無動于衷或者事不關己的模樣。相反,我們會希望最大程度地嚴格控制在分配或解除分配內存時,執行了多少move-assignments 或copy-assignments,在編譯時上捕捉到盡可能多的錯誤而不是讓錯誤滲透到運行時(或在運行時異常時顯現)


雖然這一個原則在理論上顯而易見,但實際上開發者又經常偏離這一原則:我們說我們知道我們最喜歡的語言不是完美語言,但是我們仍舊在開發的每一個項目上使用這個語言,不管是否真正適合。而且,當其他開發者質疑我們的語言選擇時,我們又很教條式的捍衛自己的選擇,而看不到對方的論點中的優點。所以記住:每一種語言都有優點和缺點。理解你所知道的(和你所不知道的)語言的優缺點并依此作出選擇。


你不喜歡一個編程語言的原因或許正是你需要使用這種語言的原因所在


可能看似有反直覺,但有時,你不喜歡一個編程語言的原因或許正是你需要使用這種語言的原因所在。繼續剛才的例子,我做C++開發人員的時候,經常有很多不同概念要跟蹤(內存管理和對象壽命,執行編程三原則Rule of Three等等),所以完成一個項目的一個簡單功能也變得很冗長繁瑣。這種類型的開發跟蹤數周之后,你會發現用Python,Java或其他“更高級別”的語言會感覺像是受了恩惠;但是事實真是如此么?


有時,我們不喜歡一個編程語言原因或許正是我們需要使用這種語言的原因。如果我在開發一個驅動或者安全關鍵、實時系統,我上面所表達的繁瑣的理由正是這個語言最大的優點。比如,C++提供了一種機制用來表達該對象被復制時所執行的邏輯,當效率或者精確度井然有序的時候,C++在這點上的作用無可估量。


這點看似很好,但有時又沒辦法理解為啥我們的憎惡在某種環境下會變成一種優點。所以,這種時候我們該如何抉擇?這就引出了第二個原則:


坦誠面對自己:了解你不喜歡一種語言的原因,別對自己的憎惡教條化處理。


仍舊是上面C++的例子,我不喜歡長時間用C++編程,因為這個語言要求很高的精準度,很容易導致錯誤或,就像困于叢林中(只見樹木不見森林)。這種精準度會阻礙開發人員去質疑一些決定,“這個對象要建立在堆棧上還是堆上?還是創建在堆棧的某一部分或是另外一個堆?”。在其他語言上,開發人員只要簡單的創建一個對象,或用面向對象繼承來各自完成任務,并直接轉移到下一個功能,因為這些語言(或者更準確的說,編譯器或注釋器)能負責這些底層實現。


但是,如果誠實一點,我會承認我不習慣C++這些特性的原因是它讓我來承擔實現這些細節的責任。在其他語言上,我并不需要負責這些細節,也不懂得如何實現:這些細節已經從開發者身上抽離出來。在一些這種細節必不可缺的環境中,我不喜歡C++的原因正是我們需要用這個語言的原因。


所以用這種讓我們惱怒的語言會讓我們苦不堪言么?未必。或許可以換個角度:不是將這些功能視為缺點,或許可以擁抱他們,將他們視為完成任務的一種必須。不說“苦不堪言”,而說“謝天謝地我可以用這個語言來完成任務”。只需記住:在一些環境中,這些功能會是恩賜;而在其他環境中,又會很繁瑣。坦誠面對你不喜歡一種語言特征的原因。


越熟悉其他語言,對你越有幫助


關于這一點,我們直接開始第三個原則:


如果你所擁有的唯一工具是錘子,那么每個問題看起來都像是釘子。


這個原則并不特定適用于軟件工程,但也深刻地體現在許多軟件開發情況中。很多時候,我們選擇一門語言,或一門語言所支持的工具(如Java的JMS,Python的asyncio,Ruby的Rails等),因為我們知道它們的存在。如果我們所熟知的語言只有Java,我們就會用它來解決在Java環境中所遇上的任何問題。比如,“我需要為通信軟件創建一個路由框架,可以怎么通過Java來實現?”這便會限制我們能使用的手段并人為地限制我們為工作選擇正確語言的能力。


解決這個問題是為了拓寬你的眼界,學習其他語言的功能與復雜性。正如Andrew Hunt和DavidThomas在《程序員修煉之道》(《The PragmaticProgrammer》)中所建議的那樣,重要的原則就是每年學習一種新語言。這并不像聽起來的那么簡單,因為學習一種語言對不同的人來說意味不同。還有個事實問題是,我們經常用一種單一的語言來實現一個項目,這就使學習的其他語言顯得毫無用處。比如如果我在開發Android應用時每天都是用Java,那么學習C#對我來說就顯得浪費時間。


但正如第三個原則所揭示的,這只是假象。 學習其他語言的好處會在我們從不同的角度看待問題,以及選擇應對問題工具的能力時凸顯出來。為了凸顯這種能力,我們必須學習多種語言帶給我們的警示,學習開發人員用它們解決問題的方式。比如,如果一個開發人員要用C++執行元編程,TA可能會使用C++的模板元編程TMP(TemplateMetaprogrammming),但也可能會用Java的反射(reflection)。知道了用其他語言解決類似問題的方法就會減少把自己局限在特定思維的風險。


再舉個例子,如果我們需要能夠改變一個類的運行時特征,那么一個熟知C++的復雜程度的C++開發人員,可能創造出能夠拓展編譯時語言邊界的解決方案。而另一個稍微熟悉Java的開發人員就能說,“我喜歡C++,但Java的運行時反射更適合解決這個問題”


供開發人員選擇的編程語言不計其數,因此優先學習哪種語言至關重要。從今天流行的語言開始學起便是不錯的選擇(比如可參考《most popularlanguages on Github》,《Language Trends on Github》,《The9 most popular computer languages》,《according to theFacebook for programmers》等)。


一個好的做法是不僅學習語言的語法,也學習語言的特質。在Stackoverflow上查閱那個語言的最普遍問題,加入該語言最流行的社區板塊或論壇。


編程語言只是方法,不是目的


第四個也是最后一個原則似乎最充滿哲理,也最重要:


編程語言是一種方法,不是目的。


除非你是個語言標準作者或編譯器作者,否則編程語言是只是一種通往目標的方法,這個目標便是完成項目:就是完成項目,而不是使用一種特定語言。這并不意味著每個開發人員都無權選擇喜歡或不喜歡的語言(實際上,如果夠誠實,這些好惡可以成為我們的優點,參考上面第二個原則),但我們不應該自欺欺人地做出這樣的決定比如“這是我們用那種語言功能的好機會”,除非這個語言功能確實適用于這個項目。


將這一點銘記于心很重要:語言只是一種對手頭的問題表達解決方案的一種手段。確保你選擇了最能實現解決問題域的一種語言。


其他需要考慮的原則:


這里有一些補充原則供你選擇語言時作考慮:


1、考慮某些語言是如何與其他語言相互作用的。比如,如果你覺得Python是你完成大部分項目的最好語言,但項目中又存在極端要求粒度水平或效率水平的定義良好的部分(通常適用C或者C++),這并不意味著你不能在該項目使用Python。相反,應該使用Python,用C或C++做這些特定部分的編寫,并和以Pyhton C API做接口。注意,為了實現這個方案,我們必須知道Python有CAPI;因此知道最流行語言的一些功能對我們很有好處。


2、中間件可能允許使用多種語言。舉例說,如果有兩個應用程序需要通信,比如移動設備和服務器應用程序,這并不意味著需要二者必須用同一種語言(雖然可以,如果你判斷說,這是最好的選擇)如果移動設備是一個安卓手機,服務器應用程序也適合于Python應用程序,那就是用消息代理中間件,比如RabbitMQ,可以讓你在通信時使用兩種語言:安卓應用程序可以使用Java Rabbit MQ API,服務器應用程序可以使用Python Rabbit MQ API。


3、擁抱其他語言的怪異。如果你是個Java開發人員,你會使用包來分割源代碼的邏輯單位;如果是個Python開發人員,會用Python包架構來做同樣的事;如果是C++開發人員,就會使用命名空間或前綴類名(如'DZone_MyClassName').了解你所使用的語言的特別之處,擁抱它們:入鄉隨俗。否則就像是用意大利口音說德語,因為你更喜歡用意音發音。當然如果一種語言的某個特性長盛不衰,這必有其因,那么你得確保你知道個中原因。



●本文編號111,以后想閱讀這篇文章直接輸入111即可。

●輸入m可以獲取到文章目錄

推薦↓↓↓
 

Linux學習

推薦15個技術類公眾微信

涵蓋:程序人生、算法與數據結構、黑客技術與網絡安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、數據庫、運維等。

本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
千萬不要和一種編程語言廝守終生
Python會超越JAVA而成為世界上第一大編程語言嗎?
參加IT培訓選擇python還是Java?
Java成為最受世界 500 強企業青睞的語言,你還不學?
Python能做哪些東西
安利5個技術大牛學習編程的網站
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 乐昌市| 西昌市| 福州市| 乐昌市| 鸡泽县| 平果县| 临夏县| 莱芜市| 弥勒县| 锡林浩特市| 临洮县| 庆阳市| 双江| 嵊州市| 贞丰县| 射阳县| 宜春市| 巴林左旗| 磐安县| 阿巴嘎旗| 延庆县| 鄂伦春自治旗| 广饶县| 蒙山县| 合江县| 綦江县| 安岳县| 绥江县| 安宁市| 密山市| 天长市| 锦州市| 西畴县| 乐清市| 大洼县| 贞丰县| 铅山县| 临泉县| 乌鲁木齐市| 承德县| 隆德县|