『壹』 如何學習Kotlin編程語言
為什麼說 Kotlin 是優秀的
本文不會像一般介紹語言的文章那樣,一開頭就羅列出語言那些酷炫的特性,我們稍後再來探討這些內容。
首先我將介紹一些其它的信息,因為2013 年一項研究顯示,當開發者評估一種編程語言時生態系統要比語言特性更重要。這符合我個人的經驗,下面就讓我開始介紹吧:
Kotlin 被編譯成 JVM 位元組碼或者 javaScript 代碼。Java 開發者將會是對它最感興趣的人,不過對於使用垃圾收集運行時語言的開發者而言它也具有一定的吸引力,比如 Scala、Go、Python、Ruby 和 JavaScript 等語言。
Kotlin 來自業界,而不是學術界。它解決了開發者現今面臨的實際問題。例如它的類型系統可以幫助你避免空指針異常。
切換到 Kotlin 無需成本!它是開源的但這不是重點,重點是它提供了一個高質量的一鍵從 Java 轉換到 Kotlin 的工具,並且十分關注 Java 二進制文件的兼容性。你可以將現有 Java 項目的一次性轉換成 Kotlin 項目,而該項目仍將可以正常編譯,即使這是一個包含上百萬行代碼的復雜程序。
顯然你可以從上文得知,Kotlin 程序能夠使用所有現存的 Java 框架和庫,甚至那些依賴註解處理的高級框架。它們之間的交互是無縫的,不需要包裝或者適配層。Kotlin 可以整合 Maven,Gradle 以及其它構建系統。
它十分平易近人,語法精煉直觀,僅僅是閱讀語言參考文檔幾個小時就能學會使用。Kotlin 看起來十分像 Scala 但是更加簡潔並且兼顧了可讀性。
它不遵循特定的編程哲學,例如極度的函數式編程或者面向對象編程風格。
它不會增加運行時的開銷。Kotlin 的標准庫十分小巧緊湊:專注於擴展 Java 標准庫,編譯階段的大量內聯操作意味像 map/filter/rece 等管道結構函數將被編譯成類似於命令式語言的代碼。
Anko 與 Kovenant 等框架的出現意味著在 android 開發者中 Kotlin 開始變得流行起來。如果你正在從事 Android 相關的工作,相信你很快就會獲得好的工作。你可以閱讀這份 Square 公司開發者 JakeWharton 的報告,了解用 Kotlin 進行 Android 開發的體驗。
Kotlin 允許你繼續使用你的工作效率提升工具。IntelliJ 的 IDE 對 Kotlin 的支持十分完善:你可以對代碼進行重構、搜索、導航以及使用自動完成,而且 IDE 充分支持調試、單元測試、性能分析等等功能。
除了 Android,我認為 Kotlin 還非常適用於企業中 Java 的應用場景。如果你的工作是整天埋頭於大公司的代碼庫中,那麼當 Kotlin 1.0 版本正式發布時你應該盡快去了解一下:
由知名公司為它提供強大的商業支持。 JetBrains 這家公司 有一個高度稱職的大團隊致力於該項目,有穩定的商業模式甚至在自己的部分旗艦產品中使用 Kotlin,這表明短期內 Kotlin 不會被放棄。
使用 Kotlin 風險較低:可以由一兩個感興趣的團隊成員在項目中小范圍的試驗 Kotlin,這並不會擾亂你的項目,因為 Kotlin 的類對外提供的 Java API 看起來就與普通的 Java 代碼一樣。
因為 Kotlin 十分注重語法的可讀性,代碼審查不會成為問題,對 Kotlin 不熟悉的團隊成員仍然能夠完成該工作。
Kotlin 基於 Java 6,所以假如你難以在項目中升級使用新版本的 JVM,你可以使用 Kotlin。
今年早些時候我向 Swiss Re 這家瑞士再保險公司的團隊(他們使用 Java 和 .NET)展示了 Kotlin。首先我定義了一個簡單的 Java 類包含一些欄位以及 toString、equals、hashCode 等方法,大概有 50 行代碼。然後我將它轉換成 Kotlin 代碼(大部分是自動完成的),結果僅剩 1 行代碼,接著我還演示了其它節省時間的特性。他們看過後對 Kotlin 充滿了熱情並且認為 Kotlin 是它們項目中 C# 語言的一個潛在競爭對手。
我認為 Kotlin 正中企業 Java 開發者的紅心,所以盡管 Kotlin 是免費的,JetBrains 還是能夠通過它增加商業版本 IDE 的銷售來賺大錢。這將激勵他們根據用戶的意願持續改進它。
與此相比,對於那些由不相關產品資助的語言開發者來說,當用戶需求與之前的設計理念沖突時,他們很少會因此作出調整。
特性
Kotlin 作為一門新的編程語言能夠脫穎而出,是因為它關注生態系統:JetBrains 懂得生產力的高低更多的取決於生態系統而不是便捷的語法。
盡快如此,Kotlin 還是有許多有用的特性能讓你編碼的過程變得愉快:
我們已經提過 null 安全(可選),它能夠讓編譯器系統的標記潛在的空指針引用。與一些語言不同的是它不涉及 option 類,因此是零開銷的,並且還有其它語言特性確保它不會造成不便。
精煉的語法:無處不在的類型推斷、簡單的函數只需要一行、簡單的結構以及 JavaBeans 也只需要一行就能聲明、真正的屬性——可以在背後自動生成 getFoo/setFoo 方法用於與 Java 進行交互、函數可以獨立存在於類之外。
異常均為非檢查型。(譯者註:感興趣的可以閱讀一下Java 理論與實踐: 關於異常的爭論)
使用 data class 關鍵字創建數據類會自動生成通用方法,例如 equals、hashCode、toString 以及 和 componentN(同時聲明多個變數時會調用該方法)。這將幫助你在不使用構建器的情況下便捷的獲得不變類(immutable classes)。
但如果你需要構造復雜的結構體,藉助類型安全的構建器這個特性可以簡潔的實現。如果你使用 Google Protocol Buffers 來存儲結構化數據, 通過 KBuilders 這個庫也能很輕易做到。
支持函數式編程以及零開銷的 lambda 表達式,能夠在 Java 的集合中做 Map、Filter、Folder 等處理。Kotlin 的類型系統能夠自動識別可變或者不可變的集合。
擴展函數特性能夠讓你在不改動源碼的情況下為類添加方法。乍眼一看以為是為了避免寫出像 FooUtils 這種風格工具類的語法糖,不過隨著使用的加深,你會認識到它不僅能幫你更加容易的通過自動完成使用方法,還能協助你集成現有的 Java API 以及藉助其它 Kotlin 特性構建功能強大的擴展。
支持運算符重載,但是不會像 Scala 或者 Perl 那樣出現難以理解的代碼。運算符被映射成相應名字的方法,通過重寫這些方法改變運算符的行為(包括函數調用),但是不能定義新的運算符。這使得程序能夠兼顧功能與可讀性。
Kotlin 沒有宏或者其它的方式來重定義語言,但是通過這些精心設計的特性能夠使第三方庫自由的對它進行擴展,官方對集合類進行的擴展也只是小試牛刀而已,請看以下例子。
想使用 fibers、actors 和 Go 風格的 channels?一個名為 Quasar 的庫已經為你實現了。
使用 Markdown 替代 HTML 來編寫 API 文檔,這樣編寫 JavaDocs 可比以前舒適多了。(譯者註:JetBrains 提供了相應的文檔生成器 Dokka)
更好用的泛型。如果你沒有完全掌握泛型參數中 super 以及 extends 的含義,別擔心,這不是你的錯。Java 的泛型的確令人費解,Kotlin 解決了這個問題。
委託是一個大家都知道的設計模式,Kotlin 原生支持它。
== 運算符的行為符合預期(譯者註:簡單來說 a == b 相當於 a.equals(b);新增了 === 運算符,用來判斷運算符兩邊是否指向同一個對象)
想快速便捷的進行非同步編程嗎?當然!
字元串插值「可以使用這樣的寫法在字元創中直接引用變數 {this.example}」
函數中的參數可以指定默認值、使用可變長度以及通過參數名傳參。
還有許多的調整與優化。假如 Java 中有某些讓你覺得困擾的問題,我相信 Kotlin 一定已經把它處理好了。
現在就來試用一下!
跟很多現代編程語言一樣,Kotlin 可以通過網頁瀏覽器來進行體驗。不過跟其他語言不一樣的是,Kotlin 的實驗網站提供了一個成熟的 IDE,包括響應很快的自動完成,實時的後台編譯,甚至還有在線的靜態分析!
在線試用一下吧
好了,讓我們繼續接下來的內容
目前存在哪些問題?
生活中沒有什麼是完美的,包括 Kotlin。以下是我嘗試這門語言時遇到的一些問題。
最大的問題是不夠成熟,因為 Kotlin 目前還處於 Beta 階段,這意味著:
每更新一個版本,語法、ABI 以及標准庫就變一次。好消息是這些變化通常比較微小,可以藉助 IntelliJ IDE 來自動升級你的代碼,所以這個過程並不會太麻煩。
Java-to-Kotlin 的轉換工具(J2K)還沒有完成。它偶爾會大規模的破壞和默默地擦除 Java 8 中的 Lambdas(修改:2015 年 10 月:M13 版本的轉換工具已經可以正確地處理 Java 8 的特性了)。由它轉換而成的代碼並不總是最好的寫法,但是 JetBrains 為這個工具付出了大量努力,它已經是我用過的語言轉換工具中最好的了。所以我並不太擔心這個問題,這個轉換器正在迅速的改進中,變得越來越成熟。
你會遇到編譯器錯誤。盡管我的程序並不大,但還是會發生無法編譯的情況,甚至錯誤的編譯結果。診斷這些問題並不難,但終歸還是影響了開發的體驗。
你會遇到 IDE 內部錯誤。當這個錯誤發生時,IntelliJ IDE 會彈出一個懸浮窗口,附帶向 JetBrains 報告的選項。大部分錯誤無需理會,不過依然會使人厭煩。
偶爾會出現無法載入提示文檔的錯誤(修改:M14 版本發布後,這個問題已被修復)
目前 JetBrains 正致力於完善發布 1.0 版本而不是添加新的功能,期待這些問題能夠得到修復。
第二個我遇到的比較大的問題是,有時與 Java 的交互會受到局限。
一個典型的 Bug 是 Java 的類型系統無法防止你改變 Map 中 Key 的類型。按理來說,這樣操作應該導致編譯器報錯,例如使用類型錯誤的 Key 刪除元素。有些 JDK 中的集合使用了泛型,它們某些重要方法的泛型參數是 Obejct,所以編譯器不會提示。當在 IntelliJ IDE 中編寫 Java 代碼時會有靜態分析的警告,但是目前 Kotlin 環境還沒有這個功能。因為 Kotlin 使用的是 Java 的集合框架沒有自己實現,所以這導致了一些類型安全方面的問題,我已經遇到好幾次了。
(修改:1.0 Beta 版本中這個問題已經解決了,Java 中集合框架的類型安全缺陷在 Kotlin 已經不復存在。喲呵!)
另一個例子是,當調用或使用 Java 代碼時 Kotlin 的 Null 安全特性無法發揮作用(可以藉助註解彌補)。作為 Kotlin 的初學者,剛開始你可能會寫許多調用 Java 庫的代碼,但是因為以上的問題它們並沒有你想像中那麼好用。這種情況的改善只能等待 Kotlin 使用人數的增長。JetBrains 一直在嘗試使 Null 安全特性能體現在 Java 交互中,這種想法是好的,但有時考慮並太周全。(修改: 從 M13 版本開始,在 Java 代碼中將自動以 @NotNull @Nullable 等註解實現 Kotlin 的 Null 安全特性)
雖然有以上的問題存在,但同時也使得我們能更流暢的使用 Java API,我覺得這種權衡是值得的,只是在開發中要注意。
其它需要考慮的問題:
Kotlin 的社區還比較小。雖然目前沒有多少 Kotlin 的庫可以使用,但是憑借優秀的 Java 交互能力,Kotlin 可以使用現有成熟的 Java 庫。
如果你喜歡看書來學習,那麼你需要等到今年晚些時候才能看到 Kotlin 開發者寫的書(譯者註:Kotlin in Action)
純粹的函數編程風格開發者可能會覺得類型系統中缺乏一些 Scala 或 Haskell 擁有的高級功能。如果你對類型系統一些功能比較看重,那麼 Kotlin 可能不適合你。
Kotlin 還能編譯成 Javascript 代碼,但是比較少用,所以可能會遇到更多的問題,這是我從論壇中得到的印象。(修改: 目前 Kotlin 的開發重心在於完成 1.0 版本並使其穩定運行在 JVM 中,Javascript 方面的問題將會在 1.0 發布後著手解決)
沒有標準的編程風格指南,目前 Kotlin 提供了多種語法可供選擇。不同人寫出來的 Kotlin 代碼很可能完全不一樣。這與 Go 嚴格的風格形成了鮮明的對比。(修改: Kotlin 1.0 版本開始,一些靈活的語法已經被移除了,例如現在重載運算符以及定義中綴函數時必須分別使用 operator 和 infix 關鍵字進行標記)
Kotlin 的編譯速度稍稍慢於 Java,以及 IntelliJ IDE 的智能提示反應有點緩慢,不算嚴重而且比 Scala 快多了。(修改:Kotlin 1.0 開始編譯速度有了明顯提升)
Kotlin 有一個 Eclipse 插件,但是很明顯沒有 IntelliJ 的好用。
Kotlin 在某些方面比 Java 要嚴格。它不會自動將 Int 轉換為 Long 類型,需要開發者顯示的轉換。這是因為 Kotlin 關注正確性和試圖解決《Java Puzzlers》一書中提出的問題。JetBrains 聲稱他們已經搞定一半了。
Kotlin 基於 Java 6,因此會受到它的局限。Kotlin 與 C# 在很多領域都很相似甚至比 C# 做得更好,但是它缺少一些功能,例如 Java 平台尚未支持的某些數據類型。
為什麼應該開始考慮使用 JVM
最近一段時間我遇到了很多使用動態腳本語言(JavaScript 或者 Go —— 譯者註:Go 應該是靜態編譯型語言)的創業公司。
我在 Bitcoin Space 工作的時候,使用動態語言是非常痛苦的事情。在這些語言里沒有安全性的類型,這已經導致了巨大的貨幣損失。Go 比較少出錯,但是在基礎層面上給人的體驗依然很差,比如說缺少好的調試工具,快速 GC 機制,穩健的管理器以及可靠的分析工具。
過去 15 年或者更長時間里,Java 變得越來越健壯,越來越冗長,甚至有過度設計的跡象,這些變化很大程度上源於它的聲譽。企業級 Java 類的名字 就是例證。在很長一段時間里我沒有考慮 JVM,我確信這種環境並不適合我。
最終我因為 Android 被迫回到 Java,發現 Java 的開發環境已經改變了。雖然 XML 仍然不合時宜的頻繁出現在各種場合,但是一些基礎功能十分完善,令人印象深刻。 IntelliJ 是比 Eclipse 更快並且更智能的 IDE。Maven 一出現就得到了迅速的發展,擁有許多原本我想要其它構建 / 依賴系統增加的功能。較新的 Web 框架像 Ninja 和 Play 從類似 Ruby on Rails 的框架中學到了輕量簡潔。有大量的庫可供使用。硬體性能變得更高以及 JVM 變得更有效率,等等轉變。
沒有真正改變的是語言本身,Java 代碼寫起來依然是令人不快的冗長。
現在有了 Kotlin,完全無需承受離開 Java 現有的生態系統的疼苦。你可以編寫更富有表現力的代碼,但是卻比腳本語言更簡潔,同時擁有更好的性能和更少的錯誤。
如果你喜歡 JavaScript,可以嘗試 Kotlin 的 JS 後端,或者在 Nashorn JS 引擎里運行你現有的代碼。
最後,如果你喜歡 Go 語言是因為它可以編譯獨立運行的程序,那麼試試 javapackager 工具。Kotlin 在本地為每個平台創建了捆綁包,這意味著在 linux 上不需要 JRE 的依賴就可以獨立自主的獲取 DEBs(linux 的安裝包)或者壓縮包。當然,它拆包之後不是單個文件而是單個目錄,從部署的角度來看並不難操作。
簡而言之:如果你之前因為看 Java 不順眼而忽略了 JVM 的生態系統,那麼你應該借著 Kotlin 這門新語言進入這個世界瞧瞧。
『貳』 GitHub 上有哪些值得推薦的開源電子書
語言無關類
操作系統
鳥哥的Linux私房菜 (簡體)
Linux 系統高級編程
The Linux Command Line (中英文版)
Linux 設備驅動 (第三版)
深入分析Linux內核源碼
UNIX TOOLBOX
Docker中文指南
Docker —— 從入門到實踐
FreeRADIUS新手入門
Mac 開發配置手冊
FreeBSD 使用手冊
Linux 命令行(中文版)
一步步搭建物聯網系統
Nginx開發從入門到精通 (淘寶團隊出品)
Git教程 (本文由 @廖雪峰 創作,如果覺得本教程對您有幫助,可以去 iTunes 購買)
git – 簡易指南
猴子都能懂的GIT入門
Git 參考手冊
Pro Git
Git Magic
GotGitHub
Git Community Book 中文版
Mercurial 使用教程
HgInit (中文版)
沉浸式學 Git
Git-Cheat-Sheet (感謝 @flyhigher139 翻譯了中文版)
GitHub秘籍
NoSQL資料庫筆談 (PDF)
Redis 設計與實現
Redis 命令參考
帶有詳細注釋的 Redis 3.0 代碼
帶有詳細注釋的 Redis 2.6 代碼
The Little MongoDB Book
The Little Redis Book
Neo4j 簡體中文手冊 v1.8
Neo4j .rb 中文資源
MySQL索引背後的數據結構及演算法原理
持續集成(第二版) (譯言網)
讓開發自動化系列專欄
追求代碼質量
selenium 中文文檔
Joel談軟體
約耳談軟體(Joel on Software)
關於瀏覽器和網路的 20 項須知
前端知識體系
瀏覽器開發工具的秘密
Chrome 開發者工具中文手冊
Chrome擴展開發文檔
Grunt中文文檔
移動Web前端知識庫
正則表達式30分鍾入門教程
前端開發體系建設日記
移動前端開發收藏夾
JSON風格指南
HTTP 介面設計指北
前端資源分享(一)
前端資源分享(二)
前端代碼規范 及 最佳實踐
w3school教程整理
大數據/數據挖掘/推薦系統/機器學習相關資源
程序員編程藝術
每個程序員都應該了解的內存知識(譯)【第一部分】
取悅的工序:如何理解游戲 (豆瓣閱讀,免費書籍)
OpenWrt智能、自動、透明翻牆路由器教程
awk程序設計語言
C++ 並發編程指南 (@傅海平ICT)
Linux C編程一站式學陪襲枯習 (宋勁杉, 北京亞嵌教育研究中心)
CGDB中文手冊
100個gdb小技巧
100個gcc小技巧禪碰
ZMQ 指南
How to Think Like a Computer Scientist (中英文版)
跟我一起寫Makefile(PDF)
GNU make中文手冊
GNU make 指南
Google C++ 風格指南
C/C++ Primer (by @andycai)
簡單易懂的C魔法
Cmake 實踐 (PDF版)
C++ FAQ LITE(中文版)
C++ Primer 5th Answers
學習CSS布局
通用 CSS 筆記、建議與指導
CSS參考手冊
Emmet 文檔
前端代碼規范 (騰訊alloyteam團隊)
Dart 語言導覽
Fortran77和90/95編程入門
實時 Java 系列
Apache Shiro 用戶指南
使用 Eclipse 和 Java SE 6 創建獨立 Web Services 應用程序
第 1 部分: Web Services 服務端應用程序
第 2 部分: Web 服務客戶端應用程序
JavaServer Faces 1.2 入門
第 1 部分: 構建基本應用程序
第 2 部分: JSF 生命周期、轉換、檢驗和階段監聽器
用 Eclipse Europa 進行 Web 開發
第 1 部分: Eclipse Java EE
第 2 部分: PHP 開發工具
第 3 部分: Ruby Development Toolkit 和 RadRails
使用 JavaServer Faces 構建蘆洞 Apache Geronimo 應用程序
第 1 部分: 使用 Eclipse 和 Apache MyFaces Core 構建基本的應用程序
第 2 部分: 在 JavaServer Faces 中使用 Tomahawk
第 3 部分: 使用 ajax4jsf 添加 Ajax 功能
第 4 部分: 使用 Apache Trinidad 組件擴展 JSF
第 5 部分: 將 JSF 應用程序與 Spring 集成
Apache Geronimo 和 Spring 框架
第 1 部分: 開發方法學
第 2 部分: 構建第一個應用程序
第 3 部分: 集成 DAO 與 ORM
第 4 部分: 混合使用 Spring AOP 和 Spring Web Flow
第 5 部分: Spring MVC
第 6 部分: Spring MVC:使用 Web 視圖技術
終極 mashup —— Web 服務和語義 Web
第 1 部分: 使用與組合 Web 服務
第 2 部分: 管理 Mashup 數據緩存
第 3 部分: 理解 RDF 和 RDFs
第 4 部分: 創建本體
第 5 部分: 切換 Web 服務
Jersey 2.x 用戶指南
MyBatis中文文檔
Google JavaScript 代碼風格指南
Airbnb JavaScript 規范
JavaScript 標准參考教程(alpha)
Javascript編程指南 (源碼)
javascript 的 12 個怪癖
JavaScript 秘密花園
JavaScript核心概念及實踐 (PDF) (此書已由人民郵電出版社出版發行,但作者依然免費提供PDF版本,希望開發者們去購買,支持作者)
《JavaScript 模式》翻譯,此書中文版有售,但是紙質書翻譯的還沒有這個版本翻譯的好
命名函數表達式探秘 (注:原文由為之漫筆翻譯,原始地址無法打開,所以此處地址為我博客上的備份)
學用 JavaScript 設計模式 (開源中國)
深入理解JavaScript系列
ECMAScript 6 入門 (作者:阮一峰)
jQuery
jQuery 解構
簡單易懂的JQuery魔法
How to write jQuery plugin
Node.js
Node入門
七天學會NodeJS
Nodejs Wiki Book (繁體中文)
express.js 中文文檔
koa 中文文檔
使用 Express + MongoDB 搭建多人博客
Express框架
nodejs文檔
Node.js 包教不包會
Learn You The Node.js For Much Win! (中文版)
Node debug 三法三例
underscore.js
Underscore.js中文文檔
backbone.js
backbone.js入門教程 (PDF)
Backbone.js入門教程第二版
Developing Backbone.js Applications(中文版)
AngularJS
AngularJS最佳實踐和風格指南
AngularJS中譯本
AngularJS入門教程
構建自己的AngularJS
在Windows環境下用Yeoman構建AngularJS項目
zepto 簡明中文手冊
Sea.js
Hello Sea.js
CoffeeScript
CoffeeScript Cookbook
The Little Book on CoffeeScript中文版
ExtJS
Ext4.1.0 中文文檔
Chrome擴展及應用開發
JavaScript入門教程
PHP調試技術手冊(PDF)
XDebug 2中文手冊(譯) (CHM)
PHP之道
PHP 最佳實踐
PHP安全最佳實踐
深入理解PHP內核
PHP擴展開發及內核應用
CodeIgniter 用戶指南
Laravel4 中文文檔
Laravel 入門
Symfony2中文文檔 (未譯完)
Phalcon中文文檔(翻譯進行中)
YiiBook幾本Yii框架的在線教程
簡單易懂的PHP魔法
swoole文檔及入門教程
iOS開發60分鍾入門
iOS7人機界面指南
Google Objective-C Style Guide 中文版
iPhone 6 屏幕揭秘
Apple Watch開發初探
馬上著手開發 iOS 應用程序
網易斯坦福大學公開課:iOS 7應用開發字幕文件
Android Design(中文版)
Google Android官方培訓課程中文版
Android學習之路
小白的Python教程
簡明Python教程
零基礎學Python
Python 2.7 官方教程中文版
Python 3.3 官方教程中文版
深入 Python 3
PEP8 Python代碼風格規范
Google Python 風格指南 中文版
Python入門教程 (PDF)
Python的神奇方法指南
笨辦法學 Python (PDF版下載)
Django 文檔中文版
Django 最佳實踐
The Django Book 中文版
web.py 0.3 新手指南
Web.py Cookbook 簡體中文版
Dive Into Python 中文版
Bottle 文檔中文版 (需翻牆)
Flask 文檔中文版
Jinja2 文檔中文版
Werkzeug 文檔中文版
Flask之旅
Introction to Tornado 中文翻譯
Python自然語言處理中文版 (感謝陳濤同學的翻譯,也謝謝 @shwley 聯系了作者)
Python 繪圖庫 matplotlib 官方指南中文翻譯
Scrapy 0.25 文檔
ThinkPython
Ruby 風格指南
Rails 風格指南
笨方法學 Ruby
Ruby on Rails 指南
Ruby on Rails 實戰聖經
Ruby on Rails Tutorial 原書第 2 版 (本書網頁版免費提供,電子版以 PDF、EPub 和 Mobi 格式提供購買,僅售 9.9 美元)
編寫Ruby的C拓展
Ruby 源碼解讀
Shell腳本編程30分鍾入門
Go編程基礎
Go入門指南
學習Go語言 (PDF)
Go Web 編程 (此書已經出版,希望開發者們去購買,支持作者的創作)
Go實戰開發 (當我收錄此項目時,作者已經寫完第三章,如果讀完前面章節覺得有幫助,可以給作者捐贈,以鼓勵作者的繼續創作)
Network programming with Go 中文翻譯版本
實戰 Groovy 系列
一份其實很短的 LaTeX 入門文檔
一份不太簡短的 LATEX 2ε 介紹 (PDF版)
ANSI Common Lisp 中文翻譯版
Lua編程入門
Real World Haskell 中文版
R語言忍者秘笈
Scala課堂 (Twitter的Scala中文教程)
Effective Scala(Twitter的Scala最佳實踐的中文翻譯)
Scala指南
The Swift Programming Language 中文版
Modern Perl 中文版
Perl 程序員應該知道的事
笨辦法學Prolog
Vim中文文檔
笨方法學Vimscript 中譯本
Vim中文文檔
編譯原理(紫龍書)中文第2版習題答案
把《編程珠璣》讀薄
Effective C++讀書筆記
Golang 學習筆記、Python 學習筆記、C 學習筆記 (PDF)
Jsoup 學習筆記
學習筆記: Vim、Python、memcached
圖靈開放書翻譯計劃–C++、Python、Java等
蒂姆·奧萊利隨筆 (由譯言網翻譯,電子版免費)
Octave 入門 (PDF版)
SICP 解題集
精彩博客集合
正則表達式簡明參考
『叄』 如何選擇編程語言
很多語言,像C、Java、Python和JavaScript在幾十年來一直持續支配著他們的各自的領域。另一方面,也要看到近期流行的需求語言,像Swift、Google Go 和 Rust。
怎樣選擇學習哪一種編程語言,其答案取決於學習之後用它來做什麼。許多人的選擇標准僅僅是「學習一門語言最大的需求就是能找到一份高收入的工作」。但這個標准並非人人都適用,還有很多其它的方面要考慮。例如,在大學里使用Python這門語言給學生講授編程,其主要原因在於Python功能強大,學生們能夠很容易地掌握編程概念。對於初學編程的人來說,使用Python是一個不錯的選擇;對於想從事移動程序開發的人來說,學習Swift、C#、Java和JavaScript是很好的選擇;對於web開發來說,在CSS、HTML、JavaScript這樣的前端技術支持下,使用PHP、Java、Python和Ruby on Rails是第一選擇。
如果要完成像訪問關系資料庫這樣的更加具體化的任務,可以學習SQL編程語言。SQL語言並非是用來開發應用程序的,而是用來支持應用程序和資料庫之間的連接。更何況,很多數據驅動應用都在廣泛地使用SQL,如今,對SQL的需求已經超越了對許多工作表的需求。
如果你對硬體編程感興趣,想要開發嵌入式系統、操作系統、通信設備或者復雜的游戲引擎等,那麼選擇的語言依然是C/C++(主要是C)。
1.JavaScript——多用途編程語言
時至今日,對JavaScript的需求依然巨大,招聘網站上充斥著有關JavaScript及其相關技術的招聘信息。JavaScript由Brendan Eich設計,運行在Netscape瀏覽器中。那時,他或許做夢也沒有想到JavaScript會有如此超乎尋常的發展。
JavaScript是WWW的默認語言,並且幾乎每個web瀏覽器都支持JavaScript,它已經成為了web前端開發的世界標准。隨著Node.js的發展,JavaScript的應用領域又擴展到了伺服器端開發,如今和java、.Net、PHP、Ruby on Rails以及其它的伺服器端技術展開了競爭。
JavaScript除了應用於前端和伺服器端開發外,它也快速地發展成為移動應用開發的選擇。開發者可以使用許多流行的JavaScript框架來構建混合移動應用程序,比如ionic、kendo UI和Sencha touch等。
後來,隨著React native框架的興起(由Facebook提出),JavaScript又出現在了Android和iOS原生應用開發領域。
JavaScript無處不在!然而,JavaScript本身不會讓你擁有最高薪酬的開發工作,你還需要學習基於JavaScript的技術、框架和庫(比如Node.js、React、React Native、ionic、jQuery、D3.js和Kendo UI等等)。相關技術的選擇完全取決於你要從事的工作。
說到學習JavaScript,它是一種動態編程語言,並且非常容易入門。熟悉了JavaScript基礎知識之後,你就可以很容易地學習相關的技術,比如 jQuery、Node.js、Angular或React。
2.Python——最好的編程語言
Python是另一種編程語言,目前世界各地的開發者正在使用它進行快速應用程序開發。Python是一種模塊化的、易於學習的、面向對象以及注重可讀性的高級語言。
Python廣泛地應用於教育領域、web與internet開發、科學與數值計算以及大數據、機器學習演算法開發。
Python的深度和廣度使得它成為教育和研究領域的首選語言,世界各地的學生正使用Python來學習編程和構建研究項目。如今很多進行計算機編程的學生把Python作為他們學習的第一門語言。
Python已經廣泛地用於web和internet開發,並且有許多流行的框架,比如Django、Pyramid、Flask和Bottle。Django CMS和Plone是兩種廣泛使用的基於Python的內容管理系統,許多流行網站和web應用程序都在使用它們。
最近,由於對大數據分析和機器學習演算法的需求急速增長,對Python的需求也在快速增長。用Python編寫的許多開源庫能夠實現數據科學廣泛使用的一些核心的機器學習演算法。R是統計與數據科學領域廣泛使用的另一種語言,但是學習曲線比較陡峭。
庫方面,一些流行的Python庫例如用於數學、工程和科學領域的scipy、用於庫建模和數據分析領域的「pandas」,以及其它一些有用的庫,比如iPython、kivy、pyqt和pyside。
3.Java——大眾化的編程語言
Java是大眾化的編程語言,它也是一種永葆青春的語言,多年來一直是各個招聘板塊的寵兒。Java於1990年由 Sun Microsystems公司發布,後來被Oracle公司收購,Java的哲學理念是「編寫一次,到處運行」。
Java廣泛地應用於web開發、企業軟體開發和Android app開發。隨著對運行在Android平台上的移動app的需求不斷增長,對java的應用也達到一個新高度,這也是為什麼全球范圍內對java的需求依然第一的原因。
Java是高級的面向對象的編程語言,學習起來比C++更容易,但是程序的性能要比C或C++差一些。因此,一般不用java構建核心引擎、操作系統或嵌入式系統開發。
4.SQL——結構化查詢語言
SQL結構化查詢語言是一種能被資料庫理解的語言。SQL是由IBM工程師於1970年開發的,用來創建、更新和檢索「System R」這個資料庫管理系統中的數據。從那時起,SQL已經走過了很長的路,時至今日,它仍然是市場最需要的一種技能。
近年來,使用非SQL資料庫來處理大數據的這種需求給SQL蒙上了陰影,但持續的時間不會太長。不久人們就會認識到SQL提供的大數據分析方法更好,它是一種更具有擴展性、可驗證性和經得起時間檢驗的技術。
SQL語言用以輔助進行數據驅動網站、web應用程序、桌面應用程序以及移動應用程序的開發。SQL在任何應用領域都有應用。從學習的角度看,SQL比較容易掌握,並且由於有很高的市場需求,你可以僅僅通過SQL就能找到第一份工作。
然而,要找到一份高薪酬工作,還需要擁有設計、管理和維護多種資料庫,比如Oracle、MySQL、PostgreSQL、IBM DB2和Microsoft SQL Server等的經驗。
5.C#——排名第一的微軟技術
C#是最通用的語言之一,它使得編程像Java語言一樣簡單。C#是類型安全的、面向對象的編程語言,運行在.NET框架運行時環境中。C#代碼被編譯成符合CLI規范的IL語言(中間語言)。
C#語言正迅速成為構建微軟家族各種應用的首選,你可以用來構建客戶端—伺服器應用程序、資料庫應用程序、web服務、移動應用程序、游戲等等。
C#在游戲開發中也有很好的應用(高級的但並非是硬核心),頂級游戲引擎Unity 3D就把C#作為支持的語言之一,除此外只有JavaScript語言被支持。C#還是許多交叉平台應用程序構建工具(如Xamarin)所採用的編碼語言。你可以使用Xamarin產品套件構建交叉平台移動應用程序。
盡管匯編語言是首選的游戲引擎開發工具,要進行硬核心終端游戲開發,仍然可以使用C或C++,Rust語言也可以應用在該領域。
6.C/C++——古老而金貴的編程語言
有人說C++很古老,但卻一致被認為依然金貴。當涉及更注重性能的硬核心系統編程時,C/C++ 仍然是首選的編程語言。C比C++更接近硬體,並且能提供更好的性能。
許多開發者轉向Java,是因為和C++(&C)相比,使用Java更便於開發,而且在很多情況下性能可以通過對硬體部分進行更多的投資而抵消。但並非總是如此,比如對於嵌入式系統,你就只需要管理最少的硬體組件。
C和C++仍然屬於高級編程語言嗎?
C/C++擁有最好的編譯器、開發環境、庫和核心開發部件,還擁有一個在未來也不可能被替換的巨大的生態系統。現有的生態系統和高性能應用程序的需要,使得對C/C++的需求一直很高,而且C/C++開發人員的工資檔次也比較高。
7.Swift——第一個工業質量級的系統編程語言
Swift是相對較新的語言,並且正快速地流行起來。Swift是完全用於Apple的開發語言,例如iOS應用程序、OS X應用程序、watchOS應用程序和tvOS應用程序。Swift引入了C和Objective-c的優點,並且能和cocoa以及cocoa touch框架很好地協同工作。
Apple擁有自己的巨大生態系統,毫無疑問,Swift將成為在未來幾年中引領其發展的語言。如果你想進入Apple生態系統,Swift正是要學習的語言。
Swift學起來很容易,用起來很有趣,究其原因在於它引入了嚴格類型語言(如C、Java、C++)的所有特性,而使用起來和任何腳本語言(如 Ruby或Python)一樣容易和有趣。你可以通過Swift playgrounds嘗試使用Swift,並且可以馬上看到結果,無需擔憂程序的編譯和運行。
Apple聲稱Swift是第一個工業質量級的系統編程語言,它提供了類似腳本的語法,能使開發變得絕對輕松。
8.PHP——基礎的編程語言
許多人認為PHP不是程序設計的未來,但PHP巨大的生態系統使得在未來幾年裡全世界需要大量的開發人員對其提供支持。排名前三的內容管理系統——WordPress、Drupal和Joomla都是使用PHP構建的,而且迄今大概有80%的網站運行在PHP之上。所以,它是巨大的!
PHP是容易學習的語言,它可以作為你進入編程世界的入門語言。PHP屬於就業市場中炙手可熱的語言,你可以找到大量的需要PHP技能的工作機會。PHP開發者的薪資水平和Java、C++、Python或Swift開發者相比,通常偏低。
PHP生態系統包括上述頂尖的內容管理系統(如WordPress、Drupal和Joomla等 )和PHP框架(如Laravel、Symfony、Yii和FuelPHP等)。這些內容管理系統和框架能使開發者在幾天內就構建出可以投入使用的網站和web應用程序。
近年來隨著 Node.js、Django和Ruby on Rails的出現,PHP蒙上了一層陰影,但是PHP正在改進,更新的版本完全可以和新興的語言與技術展開競爭。
9.Ruby——適合學習的編程語言
Ruby是另外一種開源的、面向對象的、通用的編程語言,這是一種簡單的、有助於快速應用開發的語言。Ruby最有名的框架是Rails(Ruby on Rails),這主要被用來web開發。
它在伺服器端開發是很有用的,有很多公司都使用它,如:Bloomberg、Airbnb、Shopify、Hulu和Slideshare等等,且被用在一個或多個項目之中。
Ruby是用來學習的最好的編程語言嗎?
Ruby常常被用來與Python的可讀性進行比較,它提供類英語的語法,這讓 Ruby 成為一個完美的候選者,最適合作為第一個編程語言來學習。
10.Rust——發展迅速的新一代編程語言
Rust是後起之秀,並且承諾要成為新一代的熱門技術。它快速地成為硬核心開發人員所痴迷的技術,並且以非常快的速度發展著。Rust語言還在發展之中,還是一門新語言,因此,Rust的就業市場尚未形成,傳播的深度與廣度還不夠。
Rust語言由Mozilla公司於2010年開發,它是Graydon Hoare所負責的一個研究項目。而現在開發者社區喜愛它並負責對其維護,他們決心將Rust推向一個新的高度。
Rust是一種低級的系統編程語言,其目標是提供高性能、安全性和並發性,它是一個不錯的C/C++的替代語言。過去,C開發人員努力使用Rust編寫操作系統、資料庫、嵌入式程序、內核以及各種系統程序。
Rust是一種現代語言,它擁有高級語言的靈活性和C這樣的低級語言才有的高性能以及對硬體的可控性。
11.其他
下面是另外的一些很受歡迎的編程語言,它們和排名靠前的那些語言進行著激烈的競爭。
GO——Go是谷歌公司推出的一款相對較新的語言,對於web伺服器開發、網路開發以及命令行程序開發來說,它是又一個比較優秀的選擇。
R——當要進行數據分析和統計軟體開發時,你可以選擇R語言。隨著大數據和機器學習的興起,R得以不斷發展並和Python和Matlab展開了激烈競爭。
Perl——最古老的語言之一,但它正越來越受歡迎並顯示出偉大復甦的跡象。DevOps是新生事物, Perl正發展成為用於DevOps的深受歡迎的語言,它或許會成為像Python語言那樣的下一個重要語言。
VisualBasic .Net——微軟公司推出的一種面向對象編程語言,對於開發.Net程序以及web程序和XML web服務這樣的專業領域程序來說,這是一個很好的選擇。
Haskell——統治著函數式編程的世界。和面向對象編程相比,函數式編程具有完全不同的哲學理念。函數式編程在分布式系統開發中應用廣泛,分布式系統開發的關鍵需求是並行執行和並發性。人工智慧和數學計算是函數式編程的又一應用領域,Haskell的應用同樣如此。
『肆』 程序員入門:如何自學編程
1、選定方向
編程的世界是多元紛繁的,大的方向就分前端開發、後端開發、移動開發、雲計算、數據處理、智能硬體、物聯網、虛擬現實等等,光編程語言都幾十種。如果沒有做過功課,貿然進入只會分分鍾懵逼。所以最好是根據自己的興趣愛好再結合市場前景,先選定一個方向,再選擇一門語言,然後頭也不回的深深扎進去。
2、優化學習方式
做好筆記,記錄經驗,我們大多數人並沒有過目不忘的神技,很多時候我們學了也不一定馬上掌握,需要過後花時間慢慢領悟,而且還有忘掉的風險,所以對於重要的知識點都要做好筆記。
3、多看官方文檔,外文資料
互聯網是一個更新迭代很快的行業,所有編程語言都會不斷的更新新功能和修復舊Bug,網上查的資料很有可能是舊的解決方案,現在已經不適用了。所以最好最快的方法就是查看官方文檔。
4、動手做項目
我們學習編程的最終目的就是用所學的做出具有一定功能的項目,而做項目又是最好的學習和鞏固知識的方式。如果前期能力不足就先做一些簡單的功能模塊,一步一步慢慢來,不要一開始就要實現各種酷炫炸天功能,遇到不會的就在網上查, 現在互聯網這么發達,獲取資源也及其方便。
『伍』 想成為一個Android開發工程師,還需學習其他什麼技術
開發android,需要掌握這些基礎。
①Java基礎知識 ②Linux基礎知識 ③資料庫基礎知識 ④網路協議 ⑤Android基礎知識 ⑥伺服器端開發知識①Java基礎知識
很多朋友一上手就開始學習Android,似乎太著急了一些。Android應用程序開發是以Java語言為基礎的,所以沒有扎實的Java基礎知識,只是機械的照抄別人的代碼,是沒有任何意義的。萬丈高樓平地而起,Java就是築起高樓的每一塊磚頭。那麼Java學到什麼程度才算是過關呢?我個人認為至少要掌握以下兩個方面的內容:
a)Java基礎語法:具體的知識點列表可以在這里下載:《Java知識點列表》V1.0。這部分內容沒有討價還價的餘地,必須爛熟於胸。至於具體的學習方法,可以看書或者是看視頻,但是關鍵是要多加練習,無論是書上的練習還是視頻裡面的練習,都需要仔仔細細的完成;
b)設計模式:由於在Android系統的框架層當中,使用了大量的設計模式,如果沒有這個方面的知識,對於Android的理解就會大打折扣。設計模式的種類非常之多,一個一個的全部掌握,是不現實的,必須首先掌握面向對象的基礎設計原則,有了這些基礎原則的支持,就可以舉一反三。這部分內容可以在《Effective Java》和《Agile.Software.Development:Principles,Patterns.and.Practices》這兩本書中找到。
②Linux基礎知識
大家都知道,Android系統的基礎是Linux操作系統。在開發過程當中,我們也需要使用到一些Linux命令。所以說一些Linux的基礎知識是必須的(話說現在的程序員,不懂Linux都不好意思跟人家打招呼),推薦大家看看《鳥哥的私房菜》這本書,寫的相當不錯;
③資料庫基礎知識
這個比較簡單,就是一個增刪改查的資料庫操作,可以看一下這本書:《SQL編程練習與解答》
④網路協議
至少需要學習兩種基礎的協議,HTTP協議與Socket協議;
⑤Android基礎知識
⑥伺服器端開發知識
由於很多Android應用程序都需要伺服器端的支持,所以掌握一些伺服器端開發知識還是非常有必要的。至於選擇哪一種伺服器端知識進行學習,就比較麻煩了,因為技術的種類實在是太多了:
a)Java EE:就是上面郵件當中所提到的SSH—Struts+Spring+Hibernate。這種技術的優點的功能完整、強大,已經使用了很多年,而且既然大家已經非常熟悉Java了,那麼學習SSH看起來也順理成章。但是使用這種技術開發伺服器端程序,非常麻煩。即使是一些簡單的功能,也可能需要大量的代碼和配置文件來實現;
b)PHP:簡單易學,開發快速。但是我們需要多學一種語言,是否得不償失,就要大家自己判斷了;
c).NET:這項技術的特點和Java EE差不多,但是要想掌握.NET,則需要掌握c#,也是個麻煩的事情;
d)ruby on rails:這是我個人最喜歡的伺服器端技術,簡潔,優雅,寥寥幾行代碼,就可以實現很復雜的功能,但是這需要Ruby語言知識作為基礎;
至於選擇哪一種知識,就看大家自己的判斷了,畢竟每個人想法不一樣,愛好也不相同。
安卓開發學習書籍
書的話建議買 精通Android2 ,或者 Android2高級編程 這兩本書,講解的細致,但是一定要結合sdk來看。國內的不要買。。。。(切身體會,千萬別買)
看完之後就可以自己動手做做項目了。
對於java基礎,我現在的感覺是 如果要深入學習android平台,java基礎一定要好(里邊包括各種java類庫的用法,本地代碼jni什麼的)。但如果平時隨便做做應用的話,會面向對象編程就完全可以了。
安卓開發學習學習網站
推薦你關注DevStore(主要是開發者服務商店)還有csdn和開源中國,都是開發者經常關注的網站。
DevStore(全球首家開發者服務商店)主要是整合開發者會用到的服務,可以實現在線對比評測,省去自己去網上搜索尋找的過程,還有sdk配置過程,很方便的,嘿嘿,我還在這個網站上寫評測掙過外快呢。
csdn是 中國最大的開發者技術社區,牛人還是很多的
開源中國是目前國內最大的開源技術社區,主要是軟體下載,源碼託管
自學的話平時就多看一些官方文檔,幫助文檔也是一個很好的參考資料,多看看,平時多敲代碼,多看住喲啊哈斯看規范,看完之後去敲代碼主要是在實踐過程中發現錯誤,多做項目自然多遇見問題,遇見問題解決問題,下次自然就知道怎麼解決,在實踐中發現真理。
當然可以的話有一個老師還是很好的,但是要記得要是的作用只是引導,師傅領進門修行在個人。