軟體技術之「縱橫」學習法

通常軟體技術的各種學習資源,書籍也好,課程也罷,其內容不外乎兩種組織方式,對應地,也有兩種學習方式。

第一種方式是依次學習特定技術領域中的各個知識與技術模塊,我稱之為「分塊學習法」,如下圖所示:

軟體技術學習之「分塊學習法」

採用這種學習方式的好處是對某個子領域內的主要東西你一次就能了解個差不離,但弊端是你只得到了一些零散的知識模塊,難有大用。

另一種方式則是「項目驅動法」,以開發出某特定的示例項目或應用為中心,逐個地介紹開發這個示例要用到的知識與技術點,然後展示如何把這些東西組合起來構建出一個完整的應用。

軟體技術之「項目驅動法」

這種方式比第一種方式通常學習效果要好得多。但仍存在著一些問題,因為選為示例的項目或應用,由於受到其功能的限制,多半只能用到一些離散的特定技術點,使得學習者對於特定的技術領域了解得並不全面和深入,只知其然而不知其所以然。另外,這些技術點學習起來往往難度不一,還可能會涉及到特定的業務背景知識,也會給學習者帶來困擾。

上述兩種方式都有優缺點,當然可以混合著用以取長補短,這是很常用也很有效的學習方法。

不過,現在有一個問題浮現了出來:

還有沒有其他的也挺有效的學習方法呢?

回答是:當然有!

下面就是我總結出的另一種學習方法,我將其稱之為——縱橫學習法

1 軟體技術的縱橫學習法

請看圖。

軟體技術學習之「縱橫學習法」

「縱橫學習法」建立在「分塊學習法」的基礎之上,先採用「分塊學習法」單獨攻克每個特定的知識塊,然後,選擇一個特定的視角對己掌握的知識塊進行「橫切」,看看在這個視角之下,各個知識塊呈現出什麼「模樣」,力圖發現這些知識塊之間的關聯,抽取出它們的共性,區分出它們各自的特性。

抽象地說既不好理解也很沒意思,下面我就以Android技術為例,展示這種學習方法的一個具體應用實例。

2 使用「縱橫法」學習Android技術

請看圖。

Android學習中的部分 「知識與技術模塊」

上圖展示了Android技術學習中需要掌握的一些基礎知識與技術模塊,很明顯,這些知識真是夠散的,怎麼才能看出它們之間的聯繫呢?

方法很簡單,那就是換一個視角,從「信息交換方式」的角度來看它們,找出這些知識與技術模塊之間的關聯和特性:

以「信息交換方式」作為知識與技術模塊的「橫切點」

那麼,這些知識是怎麼給「橫切」的呢?讓我詳細地介紹一下。

現代的智能手機,其實可以看成是一個信息流動的前端核心節點,在這個節點之上,有無數個App完成各種具體的信息交換任務。

就拿Android App來說,我們會看到信息在同一App內部、同一台手機的各App,以及App與互聯網Server端應用之間頻繁地傳送。

信息交換髮生的三種典型場景

每一個信息傳送場景,每一種信息傳送任務,都有著具體的技術去實現。

下面我們來看看,在上述三種場景之下,都出現了哪些技術。

2.1 信息在Android App內部的交換

構成Android App的最主要構件不外乎以下幾個:

Activity、Fragment、Service。

信息在它們之間的傳送,請看下圖:

Android App內部各組件之間的信息交換

圖中的箭頭表示信息的流動方向,箭頭線旁的藍底白字,表示的是具體的實現技術要點。比如,Activity這塊有一個指向自己的箭頭,旁邊寫著startActivityForResult,它的含義就是:要實現Activity之間信息的傳送,可以調用startActivityForResult()方法,至於這個方法具體怎麼用,這裡就不展開了,請自己去翻書。我敢肯定,每本Android入門書都會講的。

看著這張圖,不難總結出,信息在Android App內部的交換,不外乎以下幾個編程場景:

  • 信息在Activity之間的傳送
  • 信息在Fragment之間的傳送
  • 信息在Activity與Fragment之間的雙向傳送
  • Activity與Service之間的信息交換

每種場景都有相應的編程模式,掌握這些編程模式,是學習的主要任務。

圖中沒有畫出來,但是我們可以想到的,就是同一App內部各線程之間也存在著信息交換。

線程之間的信息交換,主要就是通過線程之間傳送各種數據對象實現的,這裡頭的核心組件就是Handler和Looper。還由這兩個東東引申出來了HandlerThead、AsyncTask、IntentService等另外一堆東東,這批東東都牽扯到在線程之間傳送與處理信息這個問題。

2.2 位於同一台手機上的各App之間的信息交換

Android一個很牛逼的地方,就是它能夠讓N多的不同廠商開發的各種各樣的App都能和諧地在一起工作而不是打成一團。

這裡頭的關鍵就是Intent,它是各App之間交換的信息的主要載體。

一個App可以通過Intent告訴Android,它需要其他App的協作完成特定的工作,然後Android就會「喚醒」相應的App去幹活,等活幹完,原來的App就得到了預期的工作成果。

這實在是很棒的一種機制。

從「不同App之間信息的交換方式」這個橫切點入手,經過思索與總結,可以畫出以下示意圖:

Android App與外部App之間的信息交換

對著這張圖,你就可以串起相關的知識了:

(1)使用Intent可以啟動外部App完成特定的任務

(2)可以通過編寫Broadcast Receiver接收外部發來的信息,或者也可以主動地向外界廣播消息

(3)編寫Content Provider可以將自己的數據向其他App公開,或者通過ContentResolver訪問其他App的數據。

這張圖,信息的「入」和「出」,具體實現的技術,一目了然。

下面再來看看最後的一個「橫切點」。

2.3 手機與Web後端的信息交換

在實際開發中,主要是基於HTTP協議,手機App訪問Web Server,提取或發送信息。請看圖:

Android App與Web Server間的信息交換

如圖所示,Web Server與App之間可以交換各種信息,最常見的是兩種:

(1)json格式的字元串

(2)諸如圖片、視頻、文件等二進位數據

要完成信息的交換,需要使用具體的技術去實現,比如信息本身需要完成編碼、解碼、壓縮和轉換等等工作,這就需要串起相應的具體技術,一個典型例子就是使用開源的Gson組件完成Java對象與Json字元串之間的相互轉換工作。

另外,Android App還需要完成從Server端下載或發送信息的工作,這同樣有N種技術可選。

最原始的方式是直接使用Socket連接Web Server,這種方式,因為要考慮大量的技術細節,開發效率實在太低,除非必要,恐怕現在己經沒人用了。

另一種方式是使用Android SDK中現成的組件,比如HttpURLConnection和DownloadManager,這些內置組件雖然簡單易用,但功能實在有限,所以除了在最初學習Android時使用它們來編寫一些示例應用,在真實項目中也用得很少了。

在開發中真正使用的其實是各種網路框架,比如OkHttp、Retrofit、Glide等等。

現在你看看,選擇「數據交換方式」這個橫切點,是不是將上述看上去似乎並不相關的幾大知識與技術模塊給「串」起來了?

3 小結

最後,小結一下軟體技術學習的「縱橫法」。

「縱」向學,是指學習與掌握單塊的技術領域。

「橫」向學,是指選擇一個具體的場景,或者是選擇某個視角,將多個技術領域的相關知識串起來對比學習,理清它們之間的關聯,明確特定技術最適合的應用場景。

縱橫結合,單個的知識就關聯起來,織成了網。

只有成網的知識,才是有用的知識。

看完了本文之後,你對應該如何高效地學習軟體技術,是不是又有了一些新的感觸呢?


說明:

本文是知乎Live「如何自學編程?」的補充學習資料,同時也是即將舉辦的「如何高效地掌握Android開發技術」這場Live的有機組成部分。

如果對Android感興趣,期望能在比較短的時間內(比如花三個月到半年的時間集中精力學習與實踐),通過自學高效地掌握Android技術,得到一份Android程序員的工作或實習機會,或者是能學以致用地開發出一個Android App以實現你的「偉大創意」,那麼歡迎你於2017年12月21日晚8:00參與這場Live,如何高效地掌握Android開發技術,我們一起聊聊Android學習這件事。

最後,吹個牛皮,做個廣告:

金老師作品,必屬精品! :-)

推薦閱讀:

Android項目開發如何設計整體架構?
SRC 對於音質會有怎樣的影響?
2016 年 7 月的 Nexus 5 醬體驗報告
面試官看一個Android項目看的是什麼?
Android 4.4 和 Android 7.0 的區別是什麼?

TAG:Android | 软件开发 | 自学编程 |