kotlin
kotlin是一門相對比較新的jvm語言,jetbrains自2011年以來一直在積極地開發(fā)。
多年來,該語言在android社區(qū)受到的關(guān)注度越來越高,并在google io 2017大會之后成為android開發(fā)領(lǐng)域最熱門的話題。這次大會宣布,android正式支持kotlin。
遺憾的是,雖然已經(jīng)有許多關(guān)于kotlin的文章,但并沒有多少客觀信息,許多開發(fā)人員仍然在苦思冥想,遷移到kotlin是否是一條正確的道路。
在本文的剩余部分,我將嘗試提供一個在將kotlin作為java的替代項進行評估時需要考慮的更完善的事項清單。
kotlin與java的主觀比較
“kotlin比java好”,“kotlin可讀性比java強”,“kotlin開發(fā)速度比java快”,類似這樣的陳述缺少相關(guān)準確數(shù)據(jù)的支持,所以都歸為主觀看法一類。
主觀看法是個體開發(fā)人員在對與kotlin或java相關(guān)的主題作出一個或多個主觀判斷時形成。
開發(fā)人員的主觀判斷存在如下問題:
沒有與主觀判斷相關(guān)聯(lián)的量化指標。
主觀判斷存在很大的偏見。
主觀判斷的偏見在開發(fā)人員之間存在很大的差異。
由于沒有與主觀判斷相關(guān)聯(lián)的量化指標,建立在這些判斷基礎(chǔ)上的觀點只是反映出了開發(fā)人員之前就有的偏見。不同的開發(fā)人員可能有著截然不同的偏見,因此,有開發(fā)人員認為kotlin是不錯(或糟糕)的java替代者并不意味著其他開發(fā)人員也這么認為。
而且,由于沒有客觀指標,主觀分歧就無法客觀地消除,這經(jīng)常會導致“口水戰(zhàn)”。
主觀判斷的謬誤
為了說明主觀判斷可能導致的誤解,讓我們仔細審視一個非常常見的主觀看法:
1
2
3
|
kotlin可讀性比java強 ——web上無數(shù)的文章 |
理論上講,可以設(shè)法設(shè)計一個度量kotlin和java之間可讀性差異的實驗,但據(jù)我所知,沒有任何人真正地開展這樣一個實驗。因此,截至目前,這個看法沒有任何數(shù)據(jù)支撐。
kotlin的語法是許多開發(fā)人員稱贊其可讀性的一個原因。他們的邏輯如下:
1
2
3
|
kotlin有更好的語法,因此它的可讀性更強 ——web上無數(shù)的文章 |
在這句話中,“更好的語法”又是一個主觀判斷,本身就值得商榷,但為了避免爭論,我們假設(shè)kotlin的語法確實更好。但是,這就能說明kotlin的可讀性更強嗎?
為了觀察語法對可讀性的影響,請閱讀下這段“文本”:
開始的時候,這段“文本”很難理解,但慢慢地,讀起來會越來越容易。如果你再讀個兩三遍,那么你根本就不會再注意它是由非標準的字母組成的。準確地說,字母的替換不是句法變化,但這確實可以說明,對于熟練的讀者而言,外觀很少會成為可讀性的障礙。
我們也可以把這個例子擴展到自然語言。我了解三門截然不同的語言。雖然它們之間差別很大,但我發(fā)現(xiàn),當我不理解文本中使用的單詞時,閱讀任何一種語言的文本都非常困難。一旦我認識構(gòu)成文本的單詞并熟悉上下文——無論它使用了哪一種語言,我讀起來都不困難。
因此,對我而言,語言的選擇并不會影響可讀性,只要理解內(nèi)容和上下文就可以了。
編程語言同樣如此。
當我們開始使用一門新語言,我們會有一段時間很難理解源代碼,需要認真領(lǐng)會每個句法結(jié)構(gòu)。但是,隨著我們閱讀和編寫特定語言的代碼越來越多,我們逐漸就熟悉了那門語言的語法,到某個時候,我們就不會再注意句法結(jié)構(gòu)了。
我自己在多門語言上有過這種體驗:verilog、bash、perl、tcl、lisp、java。
根據(jù)我使用上述語言的經(jīng)驗,我可以告訴你:如果一個人適應(yīng)了lisp的代碼,并且不會再注意到小括號,那么跟java比起來,kotlin的語法完全不能對可讀性產(chǎn)生不可忽視的影響,即使它“更好”。
既然我們在討論這個話題,我就分享下自己對于影響源代碼可讀性因素的主觀判斷。
在讀過其他開發(fā)人員使用許多語言編寫的代碼后(上面只羅列了我在某個階段精通的語言;我用過的所有語言比這個多),我得出如下結(jié)論:如果開發(fā)人員使用某一門語言可以編寫出可讀性和可理解性都很好的代碼,那么他們通常也可以使用其他語言編寫出可讀性和可理解性都很好的代碼。
因此,我根據(jù)自己的經(jīng)驗作出的主觀判斷是,源代碼的可讀性和選擇的語言無關(guān),那取決于代碼編寫者的技能和讀者的技能(編寫者的技能更重要)。
如果你仍然認為主觀看法具有代表性,那么至少閱讀并思考下robert “uncle bob” martin在這篇博文中的觀點。
kotlin與java的客觀比較
與主觀比較相反,客觀比較使用量化指標來度量或評估kotlin比java有優(yōu)勢的地方。
用一套標準客觀地證明一門編程語言是否強過另一門,這種想法非常有吸引力,但是有個問題:據(jù)我所知,沒有與編程語言相關(guān)的通用客觀指標。
考慮到我們無法進行精確的直接比較,那我們能否客觀地比較kotlin和java呢?能!我們?nèi)匀荒茉u估從java切換到kotlin所帶來的積極和消息影響的程度,然后比較結(jié)果,并討論它們的影響。
為了評估kotlin所能帶來的最好結(jié)果,我們將做如下假設(shè):
開發(fā)人員可以立即切換到kotlin;
切換到kotlin后,開發(fā)人員不會損失任何技能(例如,有兩年java開發(fā)經(jīng)驗的開發(fā)人員可以神奇地獲得兩年的kotlin開發(fā)經(jīng)驗);
kotlin和java一樣穩(wěn)定;
kotlin工具和java工具一樣成熟。
事實上,上述假設(shè)沒有一個是合理的,但在開始的時候,有一個理想化的設(shè)定便于說明。然后,我們會拋開這些假設(shè),討論真實世界的效應(yīng)所帶來的影響。
kotlin最佳結(jié)果估計
遵循steve mcconnell在code complete一書中提出的模式,我們可以將軟件構(gòu)建活動分解成三個子活動:詳細設(shè)計、編碼與調(diào)試、開發(fā)測試。
kotlin對于詳細設(shè)計子活動沒什么影響(這項活動通常獨立于選用的特定的面向?qū)ο缶幊陶Z言),因此,在這一部分,kotlin和java需要付出同樣的努力。
據(jù)我所知,對于開發(fā)測試子活動,kotlin也沒有提出什么革命性的東西。因此,開發(fā)測試需要付出的努力也一樣。
就剩編碼與調(diào)試子活動了。
如果我們用kotlin替換java,那么我在編碼與調(diào)試活動中可以節(jié)省多少工作量?這個問題很難回答,不同程序員之間這一數(shù)值會有很大差異(有些程序員使用java更高效)。不過,既然我們在評估最好的情況,我們不妨假設(shè)從java切換到kotlin可以將開發(fā)人員在編碼與調(diào)試階段的生產(chǎn)力平均提高10%。
10%的生產(chǎn)力提升是一個不現(xiàn)實到令人吃驚的數(shù)值。即使我們在文本編輯器中手工輸入所有代碼,那也是不現(xiàn)實的。考慮到現(xiàn)如今ide的功能,這一數(shù)值更是不現(xiàn)實。考慮到有些開發(fā)人員使用java更高效,這個數(shù)值就毫無道理了。
我不介意使用這樣一個既不現(xiàn)實又對kotlin評估有利的數(shù)值,因為我知道,不管它對評估結(jié)果產(chǎn)生了怎樣不切實際的積極影響,一旦我們拋開其中部分“理想的假設(shè)”,由此帶來的負面影響會抵消掉那些積極影響。
那么,在編碼與調(diào)試方面提升了10%——我們把產(chǎn)品交付給客戶的速度快了多少?
下面這張圖片來自code complete一書,展示了軟件項目的各種活動所占的比例:
圖 小項目以構(gòu)建活動為主。大點的項目需要更多架構(gòu)、集成和系統(tǒng)測試工作來保證項目成功。這張圖沒有顯示需求,因為和其它活動不一樣,需求工作不是直接的程序功能。(albrecht 1979; glass 1982; boehm, gray, and seewaldt 1984; boddie 1987; card 1987; mcgarry, waligora, and mcdermott 1989; brooks 1995; jones 1998; jones 2000; boehm et al. 2000)
code complete,第二版
根據(jù)來自code complete的這張圖片,在一個較大的軟件項目中(多于10k行),編碼和調(diào)試只占項目總工作量的不足20%。
因此,在一個較大的軟件項目中,我們所假設(shè)的編碼和調(diào)試效率提升10%,只能將完成項目所需的總工作量縮減2%。
例如,一個需要5人年才可以完成的項目(這是相對比較大的android項目),總工作量的2%為:
5人-年 * 12 * 4 * 5 * 0.02 = 24(人-天)
如果我們真得能夠把項目工作量減少24人-天,這會是一個從java切換到kotlin的很好的理由。然而,我們應(yīng)該還記得,上述積極評估是在理想情況下得出的,其基礎(chǔ)是不切實際的假設(shè)。
在真實世界里,切換到另外一門編程語言會產(chǎn)生不可避免的影響,我們將評估這種影響,并與上述理想化評估作個比較。
開發(fā)人員準備
為了評估最好的情況,我們假設(shè)開發(fā)人員可以立即從java切換到kotlin。
實際上,雖然kotlin和java非常類似,但開發(fā)人員仍然需要花一些時間來學習,然后再花一些時間來調(diào)整開發(fā)實踐和工具。準備時間因人而異:有些開發(fā)人員可以三四天完成切換,其他人則需要10天甚至更多的時間。
讓我們樂觀一點,平均每個開發(fā)人員只要5天就可以從java切換到kotlin。
一個需要5人年才能完成的項目會有3到5名開發(fā)人員(最好的情況下)。平均每個開發(fā)人員的切換時間為5天,這樣,一個項目總計就需要15到25個人天的切換時間。
切換到kotlin所節(jié)省的工作量(樂觀估計)與切換所需的總工作量似乎差不多。
開發(fā)人員技能損失
使用一門特定的編程語言高效工作的能力是一項技能。
我們已經(jīng)討論了這項技能的其中一個方面(代碼可讀性),但還有許多其他方面。當從一門語言切換到另一門時,與舊編程語言相關(guān)的部分技能可以運用到新語言上,但該技能的其他部分會損失掉。
為了評估編程語言技能損失對項目工作量的影響,我們將使用源自cocomo2評估模型的“語言與工具體驗”因子:
語言與工具經(jīng)驗(ltex)
該指標用于衡量開發(fā)軟件系統(tǒng)或子系統(tǒng)的項目團隊使用編程語言和軟件工具的經(jīng)驗。軟件開發(fā)包括借助工具完成需求、表現(xiàn)形式設(shè)計與分析、配置管理、文檔提取、庫管理、程序樣式與格式化、一致性檢查、計劃與控制等等。除了項目編程語言經(jīng)驗外,項目支持工具集的經(jīng)驗也會影響開發(fā)工作。經(jīng)驗低于2個月會獲得一個很低的評級,有6個月或多年的經(jīng)驗則會獲得一個很高的評級,見下表:
我不知道這是什么樣的衰退,有多少項目受到了影響,但我的大腦自動將“重大性能衰退”這個搭配翻譯成了“浪費了許多小時的開發(fā)時間。”
此外,如果你讀一遍發(fā)布說明的評論,你就會注意到,許多人遇到了遷移問題。在1.1.2版本的評論里,甚至有人指出,這個“補丁”發(fā)布引入了破壞性(向后不兼容)的修改。
相比之下,如果你讀一遍oracle jdk8的發(fā)布說明,你就會發(fā)現(xiàn),它比較穩(wěn)定。大多數(shù)修改都是安全改進方面的。
因此,與java相比,kotlin是一門不穩(wěn)定且不成熟的語言——遷移到kotlin會對項目產(chǎn)生怎樣的影響?為了回答這個問題,我將使用來自cocomo 2評估模型的“平臺波動性”工作因子:
1
2
3
|
平臺波動性(pvol) 這里使用“平臺”一詞指代軟件產(chǎn)品執(zhí)行任務(wù)時調(diào)用的復雜硬件和軟件(os、dbms等)。如果開發(fā)的軟件是一個操作系統(tǒng),那么平臺就是計算機硬件。如果開發(fā)的是數(shù)據(jù)庫管理系統(tǒng),那么平臺就是硬件和操作系統(tǒng)。如果開發(fā)的是網(wǎng)絡(luò)文本瀏覽器,那么平臺就是網(wǎng)絡(luò)、計算機硬件、操作系統(tǒng)和分布式信息庫。平臺包括支撐軟件系統(tǒng)開發(fā)所需的編譯器或裝配器。如下表所示,如果平臺每 12 個月才有一次重大變更,則評級就會很低,如果每 2 周有一次重大變更,則評級就會很高: |
cocomo2模型定義手冊
你可能已經(jīng)注意到,編程語言并沒有直接出現(xiàn)在該工作因子的描述里,但出現(xiàn)了編譯器和裝配器。在我看來,這段描述沒有顯式包含編程語言,是因為得出cocomo2模型的所有項目都使用了穩(wěn)定的語言。
由于編譯器和裝配器屬于這個工作因子,所以我們也可以推斷出編程語言及相關(guān)工具。
根據(jù)平臺波動性的這種評級范圍,java的評級應(yīng)該是“verylow”,而kotlin的評級應(yīng)該是“low”或更高。kotlin的評級可能會更高,因為它內(nèi)部依賴于其它工具,增加了出現(xiàn)兼容性問題的風險。
由于“verylow”沒有提供工作因子,所以我們需要估計。
看下該因子從“veryhigh”到“low”的評分遞減規(guī)律,我認為,我們可以放心的假設(shè),“verylow”的評分不高于0.82。
基于這些假設(shè)(有利于kotlin),如果一個項目需要5人年的額定工作量,那么使用kotlin,工作量就變成了1044人天,而使用java的總工作量是984人天。
選擇使用kotlin而不是java實現(xiàn)這樣一個項目會使總工作量增加60人天。
語言和工具不穩(wěn)定所導致的額外工作是切換到kotlin所縮減的工作的2倍多。
綜合所有因素
我當成例子來討論的項目需要5人年的額定工作量。
根據(jù)上述評估,如果該項目由平均具備1年java開發(fā)經(jīng)驗的開發(fā)人員使用java實現(xiàn),則總工作量為:
5人-年*ltex(java)*pvol(java)=984(人-天)
如果同樣的項目由幾乎沒有kotlin開發(fā)經(jīng)驗的開發(fā)人員使用kotlin實現(xiàn),則總工作量為:
5人-年*ltex(kotlin)*pvol(kotlin)*0.98+t_ramp_up=1115+5*n_developers(人-天)
據(jù)估計,選擇kotlin替換java所導致的額外工作量為131+5*n_developers(人-天)。
評估注意事項
在評估討論的過程中,我們得出了與kotlin和java相關(guān)的、便利的工作量單點值。
但實際上,單點值根本不是估計——它們只是猜測。真正的估計必須有一個相關(guān)聯(lián)的不確定性。換句話說,估計表示可能性的范圍,而不是單點值。
我們最終使用單點值代替了范圍,那是因為我從估算范圍里選擇了最有利于kotlin的值,將所有的估計都轉(zhuǎn)換成了單點值。
例如,當討論kotlin對編碼與調(diào)試活動的影響時,我從估計出的可能性范圍[-5%,10%]中選擇了最大的生產(chǎn)力提升值10%。在其他情況下,當我們討論開發(fā)人員切換到kotlin的平均時間時,我從估計的可能性范圍[5天,21天]中選擇了最小的5天。
此外,我們使用了cocomo2估計模型專用的工作因子。這些因子并不是放之四海而皆準的真理,在最一般的情況下,應(yīng)該也有相關(guān)聯(lián)的不確定性。我賦給kotlin的評級高于我實際上認為它應(yīng)得的評級,我希望通過這種方式消除這種不確定性。
不用說,我們獲得的單點值并不是百分百正確。為了得出更完整的估計,我們可以利用真正的估計進行montecarlo仿真。通過這項技術(shù),我們可以觀察可能結(jié)果的分布,弄清楚哪種結(jié)果最可能出現(xiàn)。
請記住,由于我們將估計壓縮成了對kotlin而言最為有利的單點值,所以其他可能的結(jié)果會顯示出更大的kotlin切換開銷。因此,在所有可能的結(jié)果中,我們在上文描述的單點值是最有利于kotlin的。
小結(jié)
在文章開頭部分,我們展示了一些可能會對開發(fā)人員比較編程語言造成誤導的主觀判斷。
接下來,我們討論了客觀比較編程語言存在的困難,并進行了一系列的估計,以便弄清楚kotlin棧與java棧完成軟件項目所需的總工作量。在執(zhí)行估計時,我們一直使用估計范圍里最有利于kotlin的值。
通過我們的分析,從java切換到kotlin似乎會導致完成軟件項目所需的總工作量增加。
更多的工作意味著企業(yè)切換到kotlin需要花更多的錢才能獲得同樣的功能,而用戶需要等待更長的時間才能獲得產(chǎn)品。
有些開發(fā)人員可能會吃驚,覺得這個結(jié)果不容易接受。
在考慮了所有的情況之后,谷歌最終決定支持kotlinanroid開發(fā)。對此,谷歌可能需要相當大的投入——谷歌云平臺團隊是不是沒有人可以做類似的分析,從而弄清楚切換到一門新語言所帶來的負面影響?
我認為,谷歌員工都是非常聰明的人,我相信他們在決定支持kotlin之前已經(jīng)進行了非常深入的分析。
以上就是本文關(guān)于kotlin與java的主客觀對比分析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出!
原文鏈接:http://www.techug.com/post/kotlin-vs-java-the-whole-story.html