Kotlin 或將取代 Java —— 《Java 程式設計思想》作者 Bruce Eckel
熱文導讀 | 點選標題閱讀
Bruce Eckel 是《Java 程式設計思想》、《C++程式設計思想》的作者,同時也是 MindView 公司的總裁,該公司向客戶提供軟體諮詢和培訓。他是 C++ 標準委員會擁有表決權的成員之一,擁有應用物理學學士和計算機工程碩士學位。從 1984 年至今,他已經發表了超過 150 篇計算機技術文章,出版了 6 本書。他的《C++程式設計思想》一本書在 1995 年被評為“最佳軟體開發圖書”,《Java 程式設計思想》被評為 1999 年 Java World“最受讀者歡迎圖書”,並且贏得了編輯首選圖書獎。這兩本書的英文影印版及中文版均已由機械工業出版社引進出版。
這兩天,Bruce Eckel 來到中國,與我們分享了關於程式語言的一些思考,並講解了 Kotlin 的一些優勢。本文在此分享完整演講稿,希望能讓你開腦洞、漲姿勢!
以下為演講全文:
▌Kotlin 是怎樣為你提高效率和生產力的?
大家經常會問我,Java 之後的繼承者會是哪一門語言?我給出的答案可能是帶有偏見的,因為我在寫這本關於 Kotlin 的書《Atomic Kotlin》,所以從我的個人想法來看,Kotlin 將會成為 Java 的下一個繼承者。這就是今天為什麼我來分享這本書。
這個就是這本書的封面,我和 Svetlana Isakova 共同寫了這本書。
因為 Svetlana 本身是 JetBrain 這個組織裡面的一個負責人,她負責測試很多的功能,所以她能夠保證這本書裡面的內容都是非常準確的。這本書最後的出版大概會在今年秋天,和關於 Kotlin 的一個在阿姆斯特丹的大會同時進行。
今天主要是給大家講一講我這個書裡面的幾個例子,主要是給大家一個整體的對這門語言的感覺。Kotlin 這種語言是基於物件和函式混合的這樣一種語言,它跟 Scala 很像,但是 Scala 更多是一種實驗性的語言。Kotlin 側重於可供生產使用,能夠讓大家程式設計的整體體驗感覺更好。
大家可以發現,Kotlin 這種語言它是有修飾函式,然後它的識別符號是在 fun 這個函式後面,後面會緊跟著一個冒號。這個方法首先是從 fun 這個關鍵詞開始,接下來是這個函式的名稱,然後是它的引數、冒號,以及這個引數的型別,冒號之後是這個方法返回值的型別。
大家看第二個函式,我覺得這種風格的程式設計方法可能是來自於 Scala,首先是 fun 這個關鍵詞,然後是函式名,接下來你用一個等號表達這個函式的具體內容。這是我們第一次看到這種型別推測,和第一個方法進行對比,這個函式沒有返回值的具體型別,編譯器在看到這個方法具體構造的時候就能夠知道這個返回值是一個 String 的型別。這個地方大家可以注意到,這是和 Java 很不一樣的一點,就是我們不需要一定有一個類,這個地方我們只要確定一個方法,然後把它帶的引數全部列出來,然後我們就可以進行運行了,不需要一個類去包裹它。
大家可以觀察到,print 的方法也會變得簡單了很多,大家不用再打“System.out.println()”,這個地方很簡單的用 println()就可以打印出來。剛才那個 PPT 裡面也提到了 Java 的泛型,Kotlin 泛型,但是它會比 Java 的更簡單,我今天不會給更多具體的細節,但是大家可以自己去學習一下。
接下來是一個 for 迴圈的例子,不像 Java 會寫很多的引數和條件在 for loop 裡面,寫出 1..10 就可以迴圈從 1 到 10 的所有整數,這個讓我想起類似 Python 的這樣一個風格。Print 這個語句大家可以看到它是冒號裡面有一個$,這樣會把 for loop 裡面具體的數一個一個寫入 String 裡面去,這個讓我想到了 Python 最新的版本 3.7 是如何處理 String 這種型別的。
大家不要忘記,今天講授的例子都來自於這本書,這本書裡面我們創造的一個庫,是專門負責測試的庫,就是 atomictest.eq,通過簡單的一個命令列就可以對你的程式碼進行測試。Listof()這個方法創造了一個 list,大家看一下,這個地方我們沒有對 list 這個變數的型別做出任何的說明。
在 Kotlin 裡面一共有兩種變數,一種叫做 val,一種是 var。現在我們看到的這個是 val,這種是不可變的識別符號。另外一種 var 是可變的識別符號,我們可以對它進行重新賦值。在大多數情況下,我們會使用 val 這種不可變的變數,這也是函式類程式設計的一個基礎思想。這個地方 list 我們沒有給它任何具體的型別,編譯器能夠推測它的型別是什麼,在大多數情況下我們都是可以這樣去做的,不用告訴他型別是什麼,有一種例外就是在方法帶的引數裡面我們這個地方是要標示出它的型別的。
lst[1],這是一種創造索引的方法,在這個時候我們對“1”,就是 1 號這個元素進行了索引,然後通過 eq 這個測試方法測試它是否等於 88.3。這種方法也是 Kotlin 作為 DSL 一個非常好的語言的一種展示方法。
接下來大家可以看到也是這種函式類程式設計的一種自己特有的方式,lst.reversed(),還有 lst.sorted()這兩種其實並不會對原來的 list 進行修改,它會創造兩個新的 list。這也就是為什麼函式類程式設計是比較安全的一種方式,我們儘量的不要去修改原來的資料結構。這個是我們在程式設計當中經常會遇到的一個問題,就是當一個物件是在被共享的時候它的狀態發生改變的時候我們是比較難控制的,所以我們希望儘量不要去修改原來的變數。Reversed(), sorted()這兩個方法創造了兩個新的 list,還想再強調一遍。同時,大家看到的這五種方法,比如,max、main、sum 等都是 Kotlin 的標準庫裡面給大家提供的方法,大大家不需要自己再重新寫了。
類的寫法也被大大的簡化了,現在看到的 class NoBody 後面沒有跟著大括號,裡面也沒有具體的內容,這是一種很像 Python 的寫法,這也是 Kotlin 自己的一個理念,就是說如果你不需要做這樣的事情,它不會強制你去做。
大家可能也注意到了,Kotlin 不要求大家打分號,這是我不太喜歡 Java 的一點,就是 Java 本可以也不用寫分號的,我認為這是 Java 語言的創造者偷懶,所以導致我們現在必須要多打一個分號。我本人是很討厭讓我去做本可以去省略的一些事情的。
這個類 SomeBody 它的內容就是它的構造器,就是它的建構函式。在這個建構函式當中,建立了一個屬性,就是 name,在這個地方再一次的就是我們沒有去給它一個型別,而是通過型別推測來知道它是一個 String。
第三個 class EveryBody,這個地方的時候就是我們建立了一個 list,裡面包含了三個 SomeBody 這個類,大家可以注意到,這個時候我們在構造一個新的 SomeBody 的時候沒有用像類似 Java 一樣的關鍵詞 new。大家就會注意到 Kotlin 這種語言,它的很多的細節都是從其他的語言中獲取靈感的,它其實是集很多語言的優點於一身。
Badger 這個類大家可以看到它必須強制的帶兩個引數,一個是 id String 型別,一個是 age,是一個 Int 的型別,就是 Kotlin 你在建構函式裡面的時候必須要說明它的型別是怎麼樣的,因為編譯器是無法推測出你這個帶的引數的型別是什麼樣的。所以,這是一個非常特別的一個地方。
這邊我們建立了兩個屬性,一個是 name,一個 age,它們兩個的賦值來自於建構函式的引數。接下來可以看到我們這邊有一個是 override 的方法,叫 toString,這個跟 Java 的 toString 是一樣的,這是 Kotlin 的一個特點,就是它其實希望能夠跟 Java 非常緊密的結合,非常緊密的能夠互通的。在 Kotlin 的時候如果我們想要去 override 一個方法,是必須要加上這個關鍵詞的,要不然這個編譯器會報錯。
這是另外一個類,叫 Snake,它也有自己的變數和 override 的一個方法,大家看它和上一個 Badger 之間的區別就在於 Badger 的建構函式裡面帶了兩個引數,但是 Snake 這個建構函式裡面用到了 var 這種變數。
還有一點不同的就是在 Badger 裡面的時候我們是必須要明確的寫出來,明確的定義剛才的兩個,那個裡面的 var、val,然後在 Snake 裡面我們不需要把它明確的定義出來,但是在 toString 的方法裡面也可以呼叫到它,因為它是屬於 Snake 這個類裡面自己的變數。
所以說,這邊如果大家想做出類似的改變,最關鍵的是要把剛才建構函式裡面的那個引數拿出來,然後做出宣告,說這是一個 var 的型別。這是一個我們在建構函式裡面遇到 val 的一個例子,我希望大家能夠知道 Kotlin 這種語言的魅力就在於它極大的簡化了工程師的工作量,並且能夠減少工程師閱讀其他工程師程式碼時的痛苦。這邊在 main 方法裡面我們創造了三個物件,Badger、Snake 和 Moose,然後呼叫 eq 這個測試方法測試它們的值,在這裡面其實 toString 這個方法也是被預設的呼叫了。
這是又一個類,叫 JetPack,這個例子裡面主要想為大家展示 Kotlin 也是支援 Private、public 和 protected 這三種訪問符,你預設的情況下,如果你不做任何宣告它是一個 public 的變數,但是你也可以說明它是一個 private 或者 protected。
在這裡 if 被用作一個表示式,這個方法 check()通過一個等號來呼叫這個表示式,最後的結果就是如果是“是”就是 warning,如果是“否”,就是 OK 這樣結果。
我想再重申一下,Kotlin 從它誕生的那個時候我們就希望它是能夠非常緊密的和 Java 能夠結合在一起的。所以,你可以創造這樣的一個 Kotlin 的類,但是從 Java 的程式碼當中呼叫這個類,同樣的你也可以在 Kotlin 的程式碼中呼叫 Java 的類。這樣做的原因是,我們希望使用 Java 的程式設計人員能夠從他們程式碼的很小的地方開始試一試 Kotlin,從一些小的地方進行修改,這樣不需要大費周章的把整個程式碼全部改成 Kotlin 這種語言。
在這個例子當中,我想說明的是關於泛型這樣的一個例子。大家可以看到,numbers、strings 之後都有一個冒號,會有一個它們具體的型別,你在做 Kotlin 程式設計的時候可能會遇到你不得不,或者你希望去說明它的型別是怎麼樣的,有時候你不得不去說明,因為你不說明 Kotlin,就會給你提示你是錯誤的。
Kotlin 也支援可變引數這種型別,它通過這個關鍵字 vararg 來支援。在這個函式裡面,“s”是一個 string,“ints”它是可能有多個 int 組成的這樣一個變數。在這個例子當中,ints 就是一個數組,我們可以用 for loop,然後說 in 這個陣列,然後把數組裡的每一個進行迴圈呼叫,然後把它打印出來。下面這個 main 函式就是呼叫了上面的這個 vararg 這個方法,你可以看到我在後面打了多個質數。
在這個例子當中,我是想給大家看一下這三個引號這種寫法,三個引號幫我圈起來文字的區塊,在這種寫法當中,比如說像換行之類的,或者單引號之類的,都會被這個寫法照顧到。我非常確定這種功能,這種寫法是來自 Python 的,因為我只在 Python 見過這樣的寫法。
接下來我們呼叫了 split 這個方法,然後在裡面代入了一個正則表示式,這個 regex 正則表示式是直接來自於 Java 的庫。大家都很熟,這個正則表示式我們是在尋找一個或多個空格,然後通過一個或多個空格把上面的這個 String 進行分隔。而這個最後返回的結果可以是一個 list,也可能是一個數組,比如這個陣列的情況下,接下來我們呼叫 sort 的這個方法把它進行排序。
接下來大家可以看到一些 Kotlin 自帶的一些方法,比如說,我們剛才把這個顏色 colors 這個陣列進行排序,排序之後我們可以呼叫 toSet 這個方法,把它變成一個集,然後下一個操作是減去所有裡面空白的格。
接下來我們可以把兩個 iSet 加在一起,這邊應該它已經變成了一個集,所以我們可以這樣去做,這個也是很好的去解釋 Kotlin 的一個特性,就是它能夠過載一個運算子。這個“+”和上面這個“-”都是過載運算子的一個例子,因為它已經是一個 Set,一個集合,所以 iSet+iSet 最後的結果還是等於 iSet,所以這兩行打印出來的結果應該是一樣的。color.toSet 這個方法創造了一個不可變的 Set,MutableSet 的 Set。
接下來我們可以呼叫 ToMutableSet 這個方法,重新創造一個新的 Mutable 可變的一個集。接下來我這邊又是有一個運算子的過載,就是“+=”,這個時候我們把 color 這個陣列切割,讓它從第 3 到第 5 這樣序列的三個字元,然後加到 mSet 這個可變的集合當中。
接下來給大家展示的是如何能夠確認一個詞語是在一個集合當中,有兩種方法,一種是用 in,或者是用“.contains”這種方法能夠確認。大家可以看出來,第一種方法,in iSet 會比第二種讀起來更好讀,這也是為什麼我覺得 Kotlin 是一種很好的作為 DSL 的一個語言。
在這邊我做了一個例子,建立了一個 map,大家可以看到 to,這個 to 不是一個關鍵字,是一個 Kotlin 作為 DSL 這種方式創造的一種方法,這邊我把一個 string 和一個 Int 的對映關係存入 map 當中。理所當然,我們也可以看到,我們可以把它的一個 key 放進去,看它的值是多少,或者把它所有的 key 全部列出來,或者把它所有的值全部列出來。
接下來我把這一個 map 裡面的每一個 Entry 物件迴圈一遍,Entry 是作為一個類定義出來的,然後我把每一個打印出來,Entry 這個類有兩個自帶的變數,一個是 key,一個是 value。我還想再給大家看一下,在這個 for 迴圈裡面,我們沒有說 Entry 包含的值是什麼型別的,編譯器在這個時候它能夠知道你現在是在每一個的檢驗 map 裡面的這個值。所以,它會給你自己去推測它的型別。
接下來我給大家看一下這種 Data class,Data class 是來自於 Scala,但是在 Python 的 3.7 版本中我也見到了類似的這種表達方法。在 Scala 裡這種表達方法叫做 case class,case 類。
這個 Data class 主要的好處是在於它幫你創造了,一般在 Java 上一個類的時候裡面自帶的一些比較瑣碎的方法,比如,getter、setter 這樣的方法,它都幫你自動建立了,並且能夠幫你把它們都寫對。因為我把“i”這個變數宣告成 var 這種方法,所以我可以對它進行重新賦值,我現在把它的 Data.i 的賦值是 20。Data class 幫你建立了比如像 hashcode、 toString、getter、setter 這樣的方法,就是避免你忘記寫這些方法導致執行錯誤。
還有一個就是 Kotlin 做的很好的是關於 getter 和 setter 的方法,這個其實是 Java 被詬病很長時間的,但是一直大家也沒有解決的一件事情。Kotlin 的做法就是可以先宣告一個 var 這樣的型別,緊接著你可以寫一個 get 或者一個 set,或者兩個都寫,當每次你去讀寫這個變數時,get 或者 set 方法會被自動執行。
Field 是 Kotlin 裡面一個特殊的提示符,在這個情況下,如果把“i”這個變數改名字了,叫做“j”或者其他的什麼,但是你並不需要改變 Field,因為它能夠通過 Field 這個特殊的關鍵詞,能夠對這個類的變數,這個“i”進行修改。當大家看到這個方法的時候,我們建立了一個 GettersAndSetter 這個類,我們現在要呼叫“gs.i”,這是一個 Set 的方法,或者我們做一個 Println(gs.i), 這是一個 get 的方法,因為大家可以看到,剛才 get() 和 set 裡面都有列印,所以,在我們在做這兩行操作的時候,那兩個方法都會被呼叫,然後我們也會看到相應的列印。
今天給大家展示的只是 Kotlin 的冰山一角,其實還有非常多的內容。我其實是希望大家通過今天的這個展示能夠了解 Kotlin 語言背後的原理,希望大家作為程式設計人員能夠編的更順、編的更快。
在我這本書《Atomic Kotlin》裡面有非常多這樣的例子,為什麼我叫做 Atomic Kotlin(原子 Kotlin)呢?就是我們希望把每個章節都編的足夠小,不能再被拆分了,裡面包含這樣的小例子,讓大家最快的學習到這種語言。我們管這本書裡面的每個章節都叫一個原子。我希望今天的這個演講以及這本書能夠吸引你們去漸漸的嘗試使用 Kotlin。
▌關於 Kotlin 的現場問答:為什麼 Kotlin 比 Java 更好?
Q1:我是一個 Android 開發者,我平時發現 Java 需要通過 jvm 生成 Native 程式碼跟底層進行互動,我之前看過 Kotlin 可以直接程式設計二進位制碼,可以繞過 JVM 這一步,我想知道更多這樣的細節。
Bruce Eckel:在 Android 上程式設計的同學可能都有了解,Google 從去年開始把 Kotlin 作為 Android 程式設計的第二個語言,但其實我個人認為,相對於 Java 來講,Google 更希望用 Kotlin 作為他首要的 Android 的程式設計的語言。我個人來講,其實並不是希望對 JetBrains 這個組織的動態做出發言,我更多希望大家去了解 Kotlin 的這門語言。
我可能不會把所有細節都講的很正確,我現在理解,一共有兩件事情正在發生,第一件事情就是我覺得 Google 正在推廣關於 native code 的生成。第二件事情就是希望能夠通過單一源的程式碼能夠生成 native code,能夠給 iOS 和 Android 的同時使用。在這個過程中會遇到非常多的困難,因為需要做非常大的抽象才能把這個程式碼給兩個平臺都同時使用,有一些可能就無法完成,但大多數的應用都是能夠實現這樣的一個單一原始碼。
同時,我覺得 Google 那邊也是在致力於用單一原始碼提供給更多的平臺,我不知道這件事情什麼時候會發生,或者怎麼發生,但是我非常期待這件事情。
Q2:我是讀您的書長大的,這本書之前是 C++程式設計思想和 Java 程式設計思想,我覺得最重要的不僅是語言的本身,可能還是背後的十多年前的這種面向物件的東西。所以,您的那本書是 Kotlin 語言的本身,未來您對於設計的這種方面,比如說,現在微服務比較火,關於這方面您有什麼樣的想法?
Bruce Eckel:我非常感謝這個問題,但是我打算先把這本書好好寫好。我現在還不想想的那麼遠,因為這本書已經完全佔據我的頭腦。但是,你的這個想法非常好。
Q3:我想問的問題就是剛才您說過您的語言 Kotlin,裡面涉及到我們寫的程式設計的 class 類,class 類裡面涉及到之前 Java 一直垢病的一個 Setter 和 Getter 方法,您這邊簡化了一個方式,不用考慮是是 set 還是 get,我們直接複製,讓程式設計直接執行 set 和 get 獲取到我們所需要的結果。我想知道的是,當您決定了您這個程式設計想法,您怎麼會覺得您是否失去了這個效率,而獲得了更好的體驗,是什麼讓你覺得您的選擇是正確的?
Bruce Eckel:我剛才的這個例子只是非常初步的展示了 Kotlin 的語法。我認為,這樣做的好處主要有兩個原因:第一個原因,因為當大家做 getter、setter 這個方法的時候其實只是想訪問類裡面的一個值,並不是想呼叫一個方法。第二,我做這樣一個語法設計的時候寫起來會簡便很多,方便很多,這是最主要的原因,我希望大家自己更多的去探索。
Q4:Kotlin 我也看過一些,也寫過一些程式碼,因為我寫 Java 已經寫了 13 年。所以,處理問題的時候也是用這種 Java 的思維這樣去寫程式碼。然後,我會發現自己寫出來的程式碼雖然是用 Kotlin 來寫,但是它的風格仍然是 Java style,我想了解的是怎麼才能寫出具有 Kotlin style 這樣的風格的程式碼,怎麼能夠用 Kotlin 的思維去處理我的問題,去分解我的問題。
Bruce Eckel:當大家剛從 C 轉換到 C++ 這種語言的時候也面臨過類似的問題,雖然在寫 C++還是 C 的風格。我其實會建議你多去學習和了解函數語言程式設計,因為 Java 強調的是面向物件的程式設計,我們會非常熟悉面向物件的這種思考方式。但是,函式式的程式設計如果我們更多的瞭解它,會以它的這種方式去思考。我在寫這本書之前,寫了關於 Scala 的這本書,Scala 是一門函數語言程式設計的這樣一種語言,同樣還有類似像 Elm 這樣的程式語言,我在做這件事情的過程中,通過幾年的學習漸漸的理解了函數語言程式設計這樣的內涵。如果你認為主要是面向函數語言程式設計這樣的風格困擾著你,那就是應該你著重去學習的部分。
Q5:Java 是企業級開發比較好的一個選擇,我就想知道如果我們選擇 Kotlin 能比 Java 帶來哪些優勢?
Bruce Eckel:首先,這是一個非常大的問題。其實我這本書的主要目的也是為了回答你這樣的問題,就是為什麼 Kotlin 會比 Java 更好。我其實建議大家在讀書的過程中自己去尋找這個答案,一邊讀就會靈光一現,突然想到這個原來就是 Kotlin 比 Java 更好的原因。比如說你能寫出更簡潔的程式碼,或者效率更高,或者你的程式碼更容易被大家懂,這是我希望大家在學習這個語言當中自己去摸索,自己去體驗的。
Q6:考慮到剛才那個問題我延伸一下,Java 現在團隊開發的話,如果換到 Kotlin,看單個的程式碼會容易理解一些,但是對於從系統設計的這個層面來講,還會那麼簡潔嗎?
Bruce Eckel:首先 Kotlin 這個語言的發明就是為了簡化工作量,我自己其實並沒有真的實際做這樣的一個大的工程,所以我無法具有權威性的去說這個東西一定就是好的。但是,我認為,這個語言因為它的來源就是希望幫大家簡化工作量,所以我認為應該是沒有問題的。很多程式語言我希望最終解決的問題就是如何把你的專案能夠越做越大,能有延展性。Kotlin 這個語言從其他程式語言當中吸收了很多的精華,其實就是希望能夠解決這樣的問題。
▌應該如何關愛大齡程式設計師?Python 到底有什麼好?
Q1:Java 未來的趨勢是什麼?它會如何演變?會被替代嗎?如果會的話,將發生於何時,誰又是它的繼承者呢?
Bruce Eckel:在 Java 8 裡面已經發生很多改變,Java 8 進行了一些改造,如果你要學習 Java 8,還是有很多困難需要面對。Java8、Java9、Java10 也都會在後面的幾個月中進行一些探討。我在新書裡面對 Java9、Java10 會做更多的闡述。但是我的理解是,Java 是很難再被改變的更多了。當我在寫《Atomic Scala》(原子 Scala)這本書的時候,我覺得 Scala 有可能會成為 Java 的一個繼承者,但是我不是特別的確定。但是我在 Kotlin 出來之後,覺得 Kotlin 可能會比 Scala 更有希望去替代 Java。我們都知道 Java 語言有很多的惰性,有很多難以改變的東西,但是 Kotlin 的出現就可以跟 Java 進行一個無縫的切換和整合。Kotlin 現在正在悄悄的溜進一些 Java 的工程,會使 Java 開發變得更快。
Q2:現代技術發展的如此迅速,請問 Bruce Eckel 是如何保持不斷更新自己的技術庫呢?
Bruce Eckel:因為我用網際網路。我自己去參加很多會議,然後我自己也會舉辦會議,我也會舉辦一些開發者的活動,邀請可以容納到我客廳的一些人數來一起探討最新的進展。我現在更多的使用線上視訊來跟會,因為很多會議的演講都會被放到網上去,我發現這種方式比我自己親自到會議現場參加更好。舉個例子,我剛從一個 Python 國際會議上過來,我並沒有參加每一個單獨的話題討論,我只是參加了開場儀式。
我覺得在語言方面,我更多關心的議題是:第一,如何讓開發者更多產。我自己更關心的是,第一,多產。第二,多執行緒的問題。第三,錯誤,如何發現跟錯誤相關的一些議題。我並不能全面的跟隨所有科技,你知道這樣做是不實際的。
Q3:請問 Bruce Eckel 對大齡程式設計師有什麼職業建議?
Bruce Eckel:自己開公司。不管怎麼樣都是需要不斷的去學習,無論是初級還是高階程式設計師。有一段時間我會特別的痛苦特別的掙扎,我會覺得自己做不了或學不下去,但是我同時腦子裡也會不停的告訴自己,一定堅持學習。有時候我覺得可能真的是已經年紀大了,或者可能真的已經不夠聰明瞭。但是,無論如何我腦子裡的聲音都在支援自己不斷的學習,堅持下去。
Q4:請 Bruce Eckel 介紹一下您在不同場景下選擇不同程式語言的動因,比如 Java、Scala、Python 等。
Bruce Eckel:坦白來講,我最喜歡的語言是 Python。因為基本來說,每當我有問題需要被解決的時候我發現 Python 是最快可以給我結果的一個語言,所以我很喜歡,很享受 Python。當然,現在情況發生了一點改變,我覺得 Kotlin 是一門非常好的語言,所以現在 Kotlin 是我的第二喜歡的。我已經可以想像出來一個畫面,我用 Kotlin 寫一些我的專案,但是目前只是一個想象的東西。底線就是每當我有問題,我覺得需要被解決的時候,我第一個想到的就是 Python。除此之外,從 Python 社群發展開始,我就在他們的官方會議上有過兩次的筆記分享,我覺得我對於 Python 在方向上的把控上是有一定的影響力的,而且我發現 Python 的社群是我見過的,我覺得這個世界上最友善的社群。
但是,回到之前說的那個話題,我覺得語言方面我最關注的是多產這一個方向。所以,我覺得我在任何一個語言裡都學到了很多東西。每一種語言都有它的優勢和劣勢。雖然我自己偏好於 Python,但是我並不建議每個人都去用 Python,我更多的是建議每個開發者都找到合適自己解決問題的那個語言,不要固定或者侷限於某一種語言,我發現當我去學其他的語言的時候,我對於程式設計的能力也是在不斷的擴充套件的。
Q5:我剛才聽到 Bruce Eckel 說您對 Python 比較喜歡,第二喜歡是 Kotlin,Python 在機器學習和 AI 方面有很多的用處,比如說 Python Machine Learning 比較好,我想知道 Kotlin 在 Machine Learning 方面有什麼優勢,比 Python 更好一些。
Bruce Eckel:Scala 裡面有一個關於機器學習的一個庫,我覺得 Kotlin 有可能也會有類似的這樣的一些庫。我主要解釋一下為什麼 Python 會作為機器學習非常好的一種語言,因為 Python 把其他語言做了一個封裝,呼叫其他語言做的包。很多的資料科學家他們其實是不希望學習過於複雜的程式語言,能夠把他們關於資料方面處理的智慧進行封裝起來,通過 Python 來呼叫這樣會方便很多,這也是為什麼 Python 這幾年這麼流行的原因。
本文轉自“大資料”。
最後,歡迎大家加入我們的知識星球,這期是到2019年3月10日結束,所以越早加入越好,現在加入的球友快1000人了,到1000人時將大幅提價(還有最後幾十個名額了),所以快上車!
微信掃描或者點選上方二維碼領取Android\Python\AI\Java等高階進階資源
更多學習資料點選下面的“閱讀原文”獲取