回顧自己 2016 年的技術方面,Elixir 應該最值得一說了。這一年,寫了一些、參與了一些、看到了一些、想了一些,正好在這個時間點記錄下來,算是對此的總結,也或許能從我的視角看到 Elixir 的一些發展。
開源項目
翻看今年的 GitHub,雖然也就 400 多個提交,不算多,但卻是一直堅持在業余時間寫代碼的結果,主要就是 Elixir。除了代碼量的收獲,所有 Elixir 相關項目總共到達 200 多個 star,也算是對自己的一種鼓勵。
ExChat
上半年還在繼續開發 ExChat 項目,基本的群聊和私聊功能已經實現,但因為不擅長前端等各種原因,后來進展一直很慢,現在已經停止開發了。之后打算還是稍微維護一下,比如保持 Phoenix 版本更新,以及可以運行的狀態,但目前沒有增加新功能的計劃了。除非有前端/客戶端的同學感興趣,讓我只負責后端,倒是可以考慮重拾起來。
7 月份公司辦了 Hack Week 活動,現在看來算是一個轉折點,ExChat 從那之后就沒再動過。當時我們用 Elixir 做后端,還拿了二等獎。
grpc-elixir
從那之后,我開始想,要用 Elixir 做點什么。繼續做 ExChat 還是再拿 Phoenix 做個什么應用? 結果是可能對 Phoenix 越來越了解,但一方面,我并不希望 Phoenix 變成 Elixir 的 Rails,另一方面,做這種項目,業務邏輯會占很多時間,以我當前的精力恐怕是很難在業余時間維護好的。那就造輪子吧,什么輪子呢?寫個數據庫啥的,以我的水平暫時怕是寫不出來的,就整個簡單的吧。碰巧 Hack Week 的項目需要用 gRPC,當時因為沒有 Elixir 的庫,只能勉強用 Ruby 搭了個 proxy,把一個 gRPC 服務轉成了 HTTP。于是就想著要做個 gRPC 的 Elixir 實現,畢竟隨著微服務越來越流行,加上 Google 的推廣,gRPC 應該會被越來越多的使用,如果 Elixir 沒有這樣的輪子的話,豈不是很被動。
于是我剩下幾個月就一直在折騰 grpc-elixir,直到現在。一開始思路不太對,導致走了很多彎路,從九月份開始終于算是找到了方向。之后雖然有時會在一些問題上卡個幾天,但整體還算比較順利,到現在已經實現了 client 和 server 的基本功能(四種方式的調用),有了能跟 grpc-go 互相調用的 examples,Authentication 也快搞定了。接下來除了一些細節的處理,把 Benchmarking 做完,就比較可用了。
寫 grpc-elixir 的過程還是有不少收獲的。最大的感受是,Elixir 雖然年輕,但工具鏈簡直完勝 Erlang,想想 Erlang 發展這么多年,OTP 做的是好,但工具鏈實在不怎么樣,火不起來不是沒有道理啊。而且我能感受到,Elixir 的生態已經在慢慢地超過 Erlang 的了,首先 Erlang 的庫 Elixir 都能很方便地使用,另外我注意到一些高質量的庫已經先考慮 Elixir 而不是 Erlang 了。其實我在剛開始寫 grpc-elixir 的時候就想過要不要也支持 Erlang,畢竟有些邏輯應該是可以公用的,但考慮到效率問題,還是決定先用 Elixir 寫了。
說到效率,這應該算是另一個收獲。Elixir 在 productivity 這一設計目標 上確實做的不錯,沒有太多冗余代碼,就能很容易地實現需求,而且寫出的代碼很簡潔、直觀,利用 pattern match 對于二進制數據處理也非常方便。宏也是一個很好的工具,既能使得 API 很友好, 又能減少很多工作,對于 gRPC 這個需要有“生成代碼”功能的項目來說實在很合適。當然,宏確實不是很好寫,所以最好想清楚是不是一定需要使用宏,就算用也要盡量少用,畢竟像 Ecto 這種大面積使用宏的項目是 José 自己在寫啊,真心學不來。
The Zen of Elixir
上個月整理了 The Zen of Elixir,用來收集一些“必看”的、“最好”的 Elixir 資料。因為一直覺得 Elixir 入門不算難,但要想學好還是需要多花點功夫的,而且并不是把語法、概念、文檔記熟就夠了,有些思想靠自己可能還是比較難體會到的。這些思想甚至不僅僅限于 Erlang/Elixir 方面,比如 ?José 自己就寫過幾篇很好的文章,我在很多時候即使不寫 Elixir 都會想到,也經常會在 Elixir slack 上看到被不同的人貼出來。而這些好的資料可能會被淹沒在一大堆文章、視頻中,所以才創建了這個項目,希望能夠讓其他人更容易發現,也方便自己時不時能回顧一下。
社區
Elixir Shanghai
很多技術人其實并不怎么喜歡參與社區,特別是線下的活動,我也并不熱衷于參加各種活動,還是喜歡自己多研究技術、寫寫代碼。只是有時覺得定期的交流還是很有必要的,每個人可以學到更多,對整個社區都會有幫助,社區氛圍好了也會促進語言的發展,然后又對每個人產生幫助,這是一個正向的循環。年初就看到北京那邊在辦 Elixir 的 meetup,讓我羨慕了好久,到了年中的時候就在想為什么不在上海這邊也組織 meetup 呢,反正這事情誰做都是要做啊。于是就創建了 Elixir Shanghai meetup,然后找公司借了場地,想辦法聯系各種小伙伴,找演講者,終于辦了第一次 meetup。到現在一共辦了 4 次,并且形成了每兩個月最后一個周六的周期,每次平均會有10個人左右。因為社區還比較小,不管是演講者還是找參加者,其實都不是那么容易,但只要有人肯來分享相關的內容,有感興趣的人肯來參加,就已經是不錯的開始了。
搞線下活動最有意思的就是認識各種各樣的人了,既有之前比較熟的 Ruby 社區的,也有完全不認識,只是因為喜歡 Elixir 而湊在一起的,之前可能是 Erlang、Python、Go、Java 等后端背景,甚至是前端、客戶端的同學。也讓我感到辦這些活動是很有意義的,至少我自己覺得每次大家聚在一起,聽演講者講各種有意思的主題以及其他同學精彩的討論,都會受益匪淺,然后鼓勵我保持不斷地學習,再爭取分享給大家。
當然也學到了很多,除了直接從其他人那里學到的,因為怕主題不夠,我經常只能自己充數,迫使自己一直要有新的東西拿出來分享,就怕每次講的太水被大家嫌棄了。
Elixir China
之前一直覺得,Ruby China 的成功不可復制,Elixir China 應該很難像做得像 Ruby China 一樣好,特別是現在社區比較小,語言流行度也不夠,大家還不如潛心干點正事的好。近幾個月突然態度開放了很多,有些東西,有比沒有的好,即使做不成 Ruby China 那樣的,但只要能沉淀一些內容,對其他 Elixir 學習者、開發者都是好事。雖然一個人的力量微不足道,產出的內容有限,但能貢獻一點是一點咯,總會有人看到,會對別人有幫助的。所以最近還是經常有逛一下論壇,看看其他人的帖子,給個評論,有時會發發帖子。之前想發個分享,直接就發了,現在經常會選擇先發到 Elixir China,再發到社交網絡。
除了這些,最近還經常給 Elixir China 的代碼提 issue 或者 PR,自己有空就 fix 一些 bug 或者加一些功能,既有了寫代碼的機會,又能給社區做點貢獻。雖然我不覺得現在功能的完善是 Elixir China 當前最需要的(內容應該更重要),但還是能夠改善用戶體驗,讓大家更樂意去用。比如我在用的時候就發現不能直接上傳圖片、分享到微信的 title 不是帖子標題等可以改進的地方,都會有想要完善的沖動,于是就嘗試去修復了。
話說回來,為什么會產生這些心理變化,我想應該是在運營 Elixir Shanghai 的原因,深知社區的運營靠一個人是搞不定的,還是需要大家的參與,而這里的“運營”基本等同于“參與”,任何人發一些不錯的帖子或者是添幾行簡單的代碼都是在“運營”這個社區,都是對社區很有幫助的。
生態
我們常說,一個語言本身好不好可能并不會成為我們是否使用它的決定性因素,很多時候還要看它的生態。那 Elixir 現在的生態發展的如何呢?我不敢說看到了全部,但還是看到了很多有意思的事情。
應該大部分的 Elixir 開發者都會訂閱(幾乎算官方的) Elixir Radar,它從 2015 年二月份到現在,幾乎每周一期,已經有 79 期了,一開始只是些文章,然后又加進去了免費的招聘信息、各地的 Meetup 和 conf 信息。開始時招聘一般只有三四個,現在已經有幾十個,實在太多放不下,他們干脆做了個招聘版塊。每次有 meetup 活動的時候,我都會聯系他們,把 meetup 信息放上去,最近的一次居然沒有了,后來收到他們的一封郵件說,Meetup 列表實在太長了,讓大家還是直接去 Elixir Meetup 看吧,真是哭笑不得,讓人感嘆 Elixir 社區發展速度之快。
之前 Elixir 有兩個 mailing list,一個是 elixir-lang-core 用于討論 Elixir 核心的一些開發,一個是 elixir-lang-talk 用于討論問題和其他討論。而現在 elixir-lang-talk 的 mailing list 已經放到 elixirforum.com 的 Elixir Chat 分類了,還是挺驚訝于 Elixir 團隊這個決定的,畢竟印象中,很多語言核心團隊的開發者都很喜歡用 mailing list,但其實比較一下就能發現之前 mailing list 每個帖子只有幾十個瀏覽量,現在基本都是幾百甚至上千,說明大家還是很喜歡和能夠接受這種形式,畢竟體驗更好嘛。另外,Elixir 團隊成員也經常在這個論壇中發帖或者回復,Elixir News 更是已經成為了官方發布一些新消息的地方。
Elixir 語言本身則從 1.2 到了 1.4-rc,有關注過最近幾次 Elixir Conf 上 José 的演講的同學可能注意到,Elixir 除了語言層面的改動以及關注開發者的體驗,現在核心團隊非常關注如何更好地用 Elixir 來解決實際的問題,比如 GenStaging 關注的是如何更好的處理數據, Registry 則是從 Phoenix 代碼中提取出來,讓大家方便地使用。
其他的還有很多變化,比如 Elixir API 文檔現在跟其他所有的 hex package 文檔都放在一起了,使用 Elixir 的大大小小的公司也在變多,出現了各種各樣的 conf,awesome-elixir 的列表變得越來越長,ThoughtWorks 的技術雷達將 Elixir 和 Phoenix 都列為 TRIAL。
而在中國,參加 Meetup 的人慢慢變多,而且每次都有新的面孔。在線上,不管是 Slack 的 #china channel,還是 QQ 或微信群,大家經常會有一些討論。而且身邊就有一些同學已經在生產中使用,以及寫一些開源項目,造各種輪子了。
Elixir 2017
2017 年這些又會有什么變化呢?不知道,但應該會變得更好。
有些人說將來 Elixir 會變得很流行,有些人會問將來到底什么時候會來。我當然也希望 Elixir 會真的變得很流行,而且越快越好,但不管那一天是哪一天,甚至會不會到來,我還是會繼續保持關注和學習,畢竟這是門值得學習的語言,畢竟我可以愉快地以高的效率寫下高效率運行的代碼。