程序員造輪子的正確姿勢

程序員造輪子的正確姿勢

作者 | 黃峰達,CSDN 博客專家 Phodal

頭圖 | 作者繪製並授權 CSDN 使用

出品 | CSDN(ID:CSDNnews)

過去的幾年裡,我一直在打造各式各樣的編程相關的工具。這些工具有的是用於指導軟件開發工作,有的是用來進行編程學習,還有的純粹是為了提升技術而寫的。在我寫了越來越多的工具,接觸了越來越多的工具思路之後。我便想寫一篇文章,用於記錄一下過程中發生的一些變化。

一、如何打造工具?

如果你擁有廣泛的技術棧知識,還有相對充裕的時間,那麼加上一些激情,你就能寫出一個不是那麼差的工具。

工具的技術棧

在我短短十幾年的編程生涯中,我嘗試了不同的層級技術棧,大抵也是瞭解怎麼從底層到頂層做各種工具。連接物理世界的工具:

  • 純嵌入式系統編程。

只需要一個 Arduino IDE + 一個 Arduino 開發板,配合各式各樣的輸入設備(如傳感器),配合一些輸出,這就是一個簡單的計算機原型。

  • 嵌入式操作系統編程。

對於複雜的場景來說,你還需要一個簡單的操作系統,以幫助你進行任務調度。你可以簡單的寫一個任務調度,又或者是根據你的能力基於 uCOS、FreeRTOS、Contiki、Zephyr 等系統開發應用。

  • 基於 GNU/Linux 的嵌入式系統編程。

對於大部分人來說,只需要一個 Raspberry Pi + Python 就可以編寫一個高性價比的機器學習相關的應用;又或者是在路由器上運行 OpenWRT 這樣的操作系統,這種性價比更更高的方案。

  • 編譯 GNU/Linux 操作系統。

如果時間充裕,可以用諸如於 Linux From Scratch 這樣的工具,自己編譯一個自用的操作系統。

  • 物聯網時代的嵌入式編程。

我喜歡使用 ESP32 (ESP8266 的繼任者)來搞搞智能家居,它們自帶 Wi-Fi 和藍牙,有各種模擬現有設備的方案,配置上 HomeKit。考慮到成本原因,對於沒有硬件基礎的開發者來說,採用 Android Things 又或者是 Windows IoT 是一個更簡單的選擇。我沒有玩過 Fuchsia,它可能也是不錯的,哈哈。

對於大部分開發者來說,連接物理世界是一項昂貴的事,畢竟硬件太貴了(考慮一下 Raspberry Pi,它也相當的不錯)。於是乎,我們所能做的就是在操作系統之後,開發一些工具。

  • 桌面應用。

過去我嘗試使用 QT 來開發一些桌面應用,後來我改為了 PyQT / PyGtk + Python,而現在我都轉向了 Electron,用 Web 技術來開發桌面應用就是這麼簡單。

  • 移動應用。

儘管 React Native、Flutter 是一個非常不錯的移動應用框架,我也用它們開發了一系列的應用。但是,從架構上來說,我偏向於使用混合式架構的應用,Flutter + Ionic / Angular,或者是 RN + Ionic / Angular。

  • 小程序。

我討論小程序,它們都有各種審查。

  • 命令行界面應用(CLI)。

對於日常工作來說,我們只需要一個簡單的命令行,對於前端來說,也許 Node.js 就夠了,對於後端來說,也許 Python 就夠用了;不過,現在我更喜歡用 Go 來開發 CLI 應用。

  • Web 應用。

對於我們而言,考慮到跨平臺特性,我往往使用後端 Serverless + 前端 Angular + 微前端架構來開發 Web 應用的工具。

  • 瀏覽器插件。

偶爾我也會開發一些瀏覽器插件,但是當我切換到 Firefox 瀏覽器之後,我正在考慮怎麼遷移舊的 Chrome 插件。

願意這些花式的介紹能給你的新工具帶來一些想法。然後你就可以把這些知識串起來,開發一些有意思的應用:

  • 基於 Arduino + Raspberry Pi 的持續集成告警燈。

  • 通過 ESP8266 模擬各種硬件,部署個服務器,來實現遠程。

  • ……

現在,我們已經離題很遠很遠了,回到正題上。

找一個想法

配合上上述的技術棧,你就可以輕鬆地開發一個工具。

完了?

還沒有

還有一半的內容

二、工具的開發模式

對於開發工具來說,存在一些特別固定的開發模式。我大概也經歷了三個階段,它們大概是三種不同的模式:

  • 『隨心所欲』造輪子模式。即,我愛怎麼做,我就怎麼做,我缺什麼,我就加什麼。

  • 『轉化原則與模式』的模式。我從某些地方,尋找一些原則與模式,並將它們沉澱到工具裡。

  • 『標準化特定流程』模式。我將過程、流程轉變為工具,以弱化人在過程中的作用。

『隨心所欲』造輪子

沒啥可說的,我愛怎麼做就這麼做。但是,它有這麼一些點,你可以去玩:

  • 積累技術和素材。要隨心所欲地造輪子並不是一件容易的事情,你要有強大的學習能力,以實現自由自在的目的,上要會焊電阻,下要會拿錘子。

  • 尋找現成、學習現有的工具。你可以在它們身上學習到一些優點。

  • 構建、並持續完善常用的工具。通過持續的使用,你就可以完善這個工具,直到它順手。突然間,我有了一個想法,自己寫一個瀏覽器(基於 Electron),笑~。如果提升技術對於你來說很重要,那麼這是一個非常不錯的提升點。

然後, 你就可以和我一樣,開開心心地天天看著自己的 bug 在自己的電腦上覆現,然後覺得在其它電腦上應該是好的。等我有空的時候,我再來修這個 bug 吧。

轉化原則與模式

這個大抵是去年在造工具的一大收穫。當時和公司的同事一起討論造工具的時候,討論出了沉澱出原則與模式,然後將使用工具來承載它們。

原則與模式這種東西,本身就是我們對於日常工作的一些沉澱。所以,它們特別容易被轉換到工具上。我們也可以寫一個工具,它用於介紹各種原則與模式,狗頭。

轉化原則與模式的另外一大意義是,告訴你:你可以通過學習別人,來打造出自己的工具。就這麼來說,去年我在寫 Coca 的時候,我做了這麼一件事:

  • 尋找各種 paper。

  • 下載各種 paper。

  • 閱讀各種 paper。

然後,我就把各種 paper 轉換到我的工具中了。雖然,大部分的 paper 都寫得特別水(我覺得讀完 100 篇之後,寫出一個工具之後,我能寫出一篇比 99% 的都強),但是我們就輕鬆地 copy 了別人幾個月的研究經驗。

從書中讀也是一個不錯的主意,但是大部分技術書偏向於實踐為主,比較難轉換。

標準化特定流程

如果說,前兩者是造輪子的話,那麼標準化流程做的是平臺。我最近在研究各種成熟度模型,它們有五個階段。我更喜歡 GitHub 官方寫的一個開源成熟度模型的定義:

  • 臨時(Ad-hoc) —— 新的或未記錄的過程是不受控制、反應性的和不可預測的,通常是由個人驅動而沒有協調或溝通。成功取決於個人英雄主義。

  • 管理(Managed)—— 流程已部分記錄在案,有可能導致一致的結果。成功取決於紀律。

  • 已定義(Defined)—— 記錄,標準化流程並將其集成到其他流程中。成功取決於自動化。

  • 度量(Measured)—— 對過程進行定量管理。成功取決於根據業務目標衡量指標。

  • 已優化(Optimized)—— 通過增量和創新更改,該過程正在持續可靠地得到改善。成功取決於減少變革的風險。

抽象完這段話,我們就可以提到這樣的過程:

個人的實踐 -> 團隊的實踐流程 -> 標準化流程為工具 -> 集成到其它流程,作為平臺的一部分 -> 持續完善平臺

再一次抽象就是:

實踐 -> 模式 -> 工具 -> 流程 -> 平臺

對,就是這麼簡單。所以開發這一種模式的工具,只需要尋找現有的成熟度模式,然後就成平臺了。

三、結論

沒有輪子,哪來的 KPI?

沒有技術,哪來的輪子?

沒有興趣,哪來的技術?

最後,我又造了一個新輪子,一個『DevOps + 研發效能』知識平臺,歡迎大家 Star:https://github.com/phodal/ledge/ 。

作者簡介:黃峰達(Phodal),ThoughtWorks Senior Consultant,CSDN 博客專家。長期活躍於 GitHub、CSDN,專注於物聯網和前端領域。出版著作《自己動手設計物聯網》,以及《Growth:全棧增長工程師指南》等六本電子書,並譯有《物聯網實戰指南》。

作為“百萬人學AI”的重要組成部分,2020 AIProCon 開發者萬人大會將於6月26日通過線上直播形式,讓開發者們一站式學習瞭解當下 AI 的前沿技術研究、核心技術與應用以及企業案例的實踐經驗,同時還可以在線參加精彩多樣的開發者沙龍與編程項目。參與前瞻系列活動、在線直播互動,不僅可以與上萬名開發者們一起交流,還有機會贏取直播專屬好禮,與技術大咖連麥。

評論區留言入選,可獲得價值299元的「2020 AI開發者萬人大會」在線直播門票一張。 快來動動手指,寫下你想說的話吧!

程序员造轮子的正确姿势


分享到:


相關文章: