1. 程式人生 > >我的程式設計之路——知識管理與知識體系

我的程式設計之路——知識管理與知識體系

Coder-Knowledge-Graph

Knowledge Graph For Coder —— From My Daily Experience & Practice

六年前筆者開始接觸到C語言,寫了第一行HelloWorld。三年前開始進入工作崗位進行實踐,前前後後參與了公司裡、學校裡也有十來個專案,自己也有多次自主創業的經歷。在不懂事的時候,筆者自詡“全棧架構師”,從前端的Android、iOS、Web,到中介軟體的Apache、Nginx,再到後端的Laravel、Spring、Rails、NodeJs,還有MySQL、Redis、Mongodb,有時候還要做些CI,用用Hadoop、Docker、Spark做做雲端計算環境,再實踐實踐機器學習的演算法。呵呵,每當想起這些,筆者腦中就閃過了孔乙己一字排開八個大錢的畫面,只懂些名詞,真是連民科都不如。作為一個有底線的程式猿,知之為知之,不知為不知,雖然筆者在不長的實踐生涯中“被迫”著瞭解了計算機軟體行業的許多方面,但是筆者在這裡描述這個背景並不是自誇或者裝逼,只是想陳述一個事實:如果你還沒有感到知識管理、知識歸檔的痛苦,那說明你還了解的不夠多。如果你還只是停留在一字排開數個名詞的階段,那說明你瞭解的還不夠深。

技術分為術與道兩者,術即是具體的做事的方法,而道則是做事的邏輯抽象的原則與原理。一味地追求術的人往往都是希望走捷徑,不求甚解的。而道之所求也是符合一萬小時原理,需要大量的付出與總結。借用數學之美中的例子,如果你想要去建立一個搜尋引擎,直接拿來主義,用上Solr、ElasticSearch之類的,是術。而根據下載、索引與排序這三個抽象步驟來進行提煉與昇華,這就是道。電腦科學有兩類根本問題。一類是理論:演算法,資料結構,複雜度,機器學習,模式識別,等等等。一類是系統:作業系統,網路系統,分散式系統,儲存系統,遊戲引擎,等等等等。粗淺的說,學界會偏向前者,產界偏向後者,筆者作為一隻一直讀書的從本科到碩士,見多了二者相互嫌棄。但是這二者相輔相成,筆者自己數學一直不好,對於那些公式啊推導畏如猛虎,但是用心看了之後,甚多樂趣啊。所謂舉一反三,見微知著,這都是需要在一個廣博的知識的基礎上才行,所以對於知識,還是應該拿來主義,來者不拒。

筆者回顧自己這幾年的風雨歷程,老實說,談到絕望或者無奈的場景往往不是某個具體的問題,能解決的問題是一定可以解決的,而是在知識海洋麵前,感受到了宇宙的浩瀚與人類的渺小。莊子有云:吾生也有涯,而知也無涯。以有涯隨無涯,殆已!筆者最常感覺痛苦的事情有二:

(1)學過的知識都忘了。筆者算來開始用Java也有五年了吧,但是你現在要筆者立馬說出JVM的架構組成,筆者也是心有慼慼,吶吶不能言。我能夠記得的就是我係統的學習過五次,但是都忘了。再舉個例子,筆者之前學習語言的時候,因為工作關係同時在用Python、Java、Ruby、JavaScript,不談學的多深,當時感覺最痛苦的就是老把每個語言怎麼求取陣列長度給忘了或者搞混了,是不是覺得很傻比?或者每次寫Java的時候,筆者都會覺得讀取檔案好難好難,但是至少也寫過上萬行各種各樣的讀取檔案的程式碼了吧。我們構建一個完備的知識體系,不是為了讓我們不會去忘記,而是讓我們忘了之後能以最快的速度學會

。我們寶貴的時間不應該浪費在對於知識的重複學習,Learn Once,Know Forever。

(2)寫過的程式碼都沒了。舉兩個例子吧,還是以Java為例,我們很多專案都會用到一些字串輔助的方法,譬如加密或者編碼,然後筆者就發現每次做專案的時候都要把這些重寫一遍。另一個呢,筆者學習Spark的時候,80%的時間都用來重複搭建虛擬機器環境了,啪啪的。後來使用Docker之後才好一點。

授人以魚不如授人以漁,筆者一直覺得我這幾年磕磕碰碰精華所在就是這完整的知識體系架構,它給了我莫大的信心與勇氣去遨遊在璀璨的知識長河中。不積跬步無以至千里,程式設計之路亦如一場遊戲,隨時學點知識拿個EXP,或者打個大魔王爆個裝備啥的,一個完備的知識體系或者知識圖譜,就是你的背囊,也是你行走在知識海洋裡的一葉扁舟。當然,本文所講也只是一家之言,做不得準,大家見仁見智。順便說一句,筆者很感謝為知筆記為我提供了非常好用的工具,這裡友情推廣一波。

知識應該放在它應該在的地方

當我要學習一門程式語言:C++/Java/PHP/Swift/Rust/Go。。。

關於本部分的詳細文件和全部的知識結構圖可以檢視這裡

筆者從學習第一門語言開始,就被教導一個概念,學習一門語言的基礎,也就是語法本身,不代表你掌握了這門語言。學習一門語言應該是學習它所代表的完整的生態環境和在各個應用場景下最合適的組合。同樣的,筆者大大小小算是用過七八門語言,當然,你為了學習而去學習,用語言的數量標榜自己是毫無意義的。但是,每個語言都有其特性,就像才接觸Python時候它的弱型別、快速開發的便捷以及後面應用到大型程式開發時候的程式碼混亂都給我留下了深刻的印象。往往說一門語言不好是因為你沒學到家,但是就所處的技能水準和應用場景而言各個語言還是各有其優勢的。筆者看現有的很多教程,以Java為例,它的講解方式以及應用示例都是基於JDK本身和Java語言本身的特點的。那麼筆者自己總結的這份所謂的程式語言的知識結構圖或者拓撲圖,是會抽象了各個語言的特性而形成。唔,譬如筆者最早是在JavaScript中,在用jQuery的時候接觸到了Promise的概念,後來在Java、在Swift中都發現了類似的,但不一定叫這個名字的用法或者第三方類庫,那麼我們在做筆記時,首先要知道,你現在所學的,是應該放在哪一部分。

本文介紹的這種筆記排布方式不一定適合於初學者理解

語法基礎

學習一門語言呢,肯定首先要去學習它的語法基礎,那學習語法基礎的時候,我們要掌握哪幾個方面呢,筆者大概歸類到入門概述、Quick Start、資料結構、流程控制與異常處理、函式、模組與元件、類與物件以及IO這幾個部分。詳細的目錄式列表可以參考這裡

入門概述

在這裡你要了解這門語言的由來,它的特點,它的基本面貌。譬如你要了解下它各個版本迭代的特點。就像Java 8提出之後,你需要專門的對於Java8的語法特性進行一些瞭解,但是對於某個具體的語法知識點還是應該放到對應的語法講解的位置。譬如Java8裡面提出了函式式介面,那這部分具體的講解還是應該放置到介面那一部分。

其次呢,你還要在這邊瞭解基本的註釋與程式碼分割的規範,就好像筆者初學Python的時候,這貨沒有大括號,用的是縮排分割的方法,讓才從C++/Java走過來的筆者一頓酸爽。

接下來,在入門概述這邊,你還要放外部資料的連結。你不可能把全部的你看到的資料轉化為自己的筆記,那麼你需要把所有的你看到的有價值的參考資料地址存放在這裡。筆者大概分為了:

  • Tutorial & Docs:入門教程和指導相關

  • Practice&Tips:實踐、小貼士相關,就好像Github上流行的awesome-系列,就要把連結放這

  • Forum&Lessons:一些論壇和線上的視訊教程地址

  • Blog&News:部落格和資訊

  • Book&Resources:參考的書籍啊、資源啊放這裡

Quick Start

學習一門語言的時候,你肯定會寫HelloWorld,筆者在上面強調過,做筆記的一個目的就是在未來某天你可能全部忘記的時候能夠以最快的速度學會,那麼你再次學習的時候肯定會去繼續寫HelloWorld。在這一部門,你需要知道怎麼搭建開發環境,特別推薦是也要學下怎麼使用Docker去搭建開發環境。接下來呢,你要學下構建工具和依賴管理工具。在早年,筆者才學Java,還不知道用Maven的時候,那個時候根本分不清什麼構建啊、依賴管理的概念,每次要用jar包了只能手動拖拽,真心呵呵噠。當然,一門優秀的程式語言一定要有其對應的構建與依賴管理工具,這樣才能促進整個社群的活躍與交流。然後你要看看怎麼進行程式碼部署,就好像Python的Notebook、Swift的PlayGround這些個神奇的東西,還是非常好用的。

最後呢,還要看看常用的IDE,不過筆者目前基本上就用的是Atom加上Jetbrains(感恩)這一個系列。唔,之前看到很多大牛喜歡用Sublime啊Vim來寫程式碼,我表示,這個逼還是不要裝的好。

資料結構

學完了HelloWorld,我們就要來看看資料結構了,這是一個程式語言的基石所在。那麼不論哪一種語言,它會提供給我們哪些知識呢。

(1)首先是知道怎麼去定義變數與常量。就好像JavaScript裡面的var、let,以及未來Java裡面會加入的val,變數定義的方式也是有很多種的。還有就是要了解下系統的內建的常量,這個在使用PHP進行開發的時候比較用得上。接下來,要看看這個變數是怎麼賦值的,是必須單個賦值還是能夠鏈式賦值,或者是像JavaScript這樣還能支援解構賦值。最後呢,這一部分還要看看你怎麼進行型別、格式判斷的,好比instanceoftypeof這些操作符,都是在這裡介紹的。

(2)然後呢要看看一些基本的資料型別。首先是數值型別,是分為了整型、浮點型還是像OJC這樣的全是NSNumber,還要看看原始型別和非原始型別的區別。如果是數值的話,還要看看怎麼獲取隨機數、怎麼進行科學計算、怎麼進行型別轉換。接下來,還要看看空型別、布林型別、可選型別和列舉型別是怎麼定義的。

(3)接下來呢,看看字串型別是怎麼用的。字串也是每個語言必備的,說難不難,說簡單吧,那麼多用法呢。基本上就要看看它是怎麼建立增刪、怎麼索引遍歷、怎麼進行型別編碼還有些像反向啊之類的基本操作。這裡面也會有很多小的知識點,譬如Java裡面字串是不可變型別,譬如PHP裡面你連線字串不能用加號。

(4)然後呢,就要看看結構體是怎麼定義的了,這個在Swift裡面還是挺重要的,不過在有些語言裡就沒有。

(5)下面就要看看基本的時間日期型別,這裡還會涉及到時區轉換啊、日曆啊等等方面。基本上各個語言的時間日期,要麼是原生提供的不錯,要麼就會有第三方類庫支援,譬如JavaScript中的Moment.js,還是很不錯的。

(6)上面講的幾個資料型別都還好,現在開始就要了解高階複雜資料型別,也就是所謂的集合了。筆者把集合分為了序列型別與鍵值索引兩大部分,譬如分別對應Java中的List和Map。這邊也是要了解集合的建立增刪、索引遍歷、型別轉換還有排序啊、查詢啊等等高階用法。

(7)最後在這裡還要學學不可變資料,這一點在函數語言程式設計裡面很流行,就好像Facebook提供的Immutable.js這個類庫,還是很不錯的。

流程控制與異常處理

接下來就要看看流程控制與異常處理方面的知識了,首先要知道運算子相關,像邏輯運算子啊、加減運算子啊還有運算子過載(運算子過載是能用於資料分析計算的語言的一個重要優勢)。然後要看看怎麼進行分支選擇的,也就是常見的if、switch語句,在Swift中還有guarantee這樣好用的語句。接下來就要看看怎麼進行常見的迴圈了,最經典的肯定就是for迴圈,之後各個語言也都各有擴充,像什麼for-in、for-of、forEach迴圈,它們都是屬於迴圈遍歷。還有就是while以及do-while這種變種。

看完了迴圈下面繼續看看流程控制,就像break、continue這種,還有goto這樣可以隨便亂跳的語句。下面要繼續瞭解些作用域相關的知識,像JavaScript裡面,一不小心就全域性作用域了。然後還有關於迭代器的知識,在很多語言裡迭代器和生成器是密不可分的,而在Java裡面迭代器是一個介面。迭代器放在流程控制裡也是因為一般來說迭代器也是用於迴圈的。

最後,我們要來看看異常處理,包括怎麼定義異常、怎麼丟擲異常,還有怎麼用try-catch-finally這種形式來捕獲和處理異常。Swift裡面提供了try?的用法,也是非常Sweet。

函式

接下來我們繼續學習函式的概念,唔,像Java這種完全的OO的語言,是沒有函式的,裡面只有方法,這也是它經常被詬病的地方,老說別的語言HelloWorld就一行,但是Java裡面要寫好多行。在這裡筆者是把包括方法啊、函式都放在這邊介紹。

(1)函式定義

首先呢要來看看函式是怎麼定義的,不同的語言裡定義方式有區別有交集。像有什麼func、function、define等等N多不同的關鍵字。要注意下這個函式是不是需要返回值的,像Java裡面沒有返回值就是void,而Swift裡面可以寫可以不寫,還有很多弱型別語言裡沒有返回值。另外還要看看怎麼定義函式變數,這個和閉包經常放在一起使用。

(2)引數呼叫

看完了定義再看看引數定義和呼叫方式。引數的話需要了解下有沒有預設引數和外部引數。筆者剛接觸OJC的時候,它的外部引數確實大大提高了可讀性,後來Swift繼承並且發揚光大了。下面就要看看不定引數,譬如怎麼在Java裡面定義不定引數。最後,要看看引用傳值和複製傳值的區別,在有些語言裡還存在有in-out這樣的關鍵字。

(3)匿名函式/Lambda/閉包

Java8裡面引入了Lambda的用法,Lambda本身也是函數語言程式設計的一枚標杆,是一種設計模式吧。這裡要看看Lambda怎麼用,像有的語言裡是->,有的是=>,這個要區分下。還有就是看看閉包怎麼定義,Swift裡面提供了一個尾隨閉包的呼叫方式,非常方便。

(4)生成器

生成器、yield,最早筆者是在Python中接觸到的,現在看ES裡面也引入了這個概念。生成器一般和迭代器搭配在一起使用,不過也可以用來編寫非同步程式碼。

(5)裝飾器

裝飾器感覺有點像AOP的概念,筆者也是在Python和Angular2中接觸到的。

(6)函式柯里化和反柯里化

在電腦科學中,柯里化(英語:Currying),又譯為卡瑞化或加里化,是把接受多個引數的函式變換成接受一個單一引數(最初函式的第一個引數)的函 數,並且返回接受餘下的引數而且返回結果的新函式的技術。這個技術由 Christopher Strachey 以邏輯學家哈斯凱爾·加里命名的,儘管它是 Moses Schönfinkel 和 Gottlob Frege 發明的。這是來自維基百科的名詞解釋。顧名思義,柯里化其實本身是固定一個可以預期的引數,並返回一個特定的函式,處理批特定的需求。這增加了函式的適用 性,但同時也降低了函式的適用範圍。筆者在JavaScript與Scala會比較常用這個特性,這裡以JavaScript為例說明柯里化的核心思想。

模組與元件

這裡主要學習下模組化的概念,譬如Java、C#裡面都會存在有名稱空間,而Swift裡是全域性名稱空間。還有像ES6裡,這個export、import關鍵字到底是咋用的。

類與物件

筆者還真沒接觸過Lisp、Haskell這樣純函式式語言,基本上都是OO的吧。那麼類與物件也就是非常重要的一個部分。

(1)類的定義

怎麼定義類、怎麼用public、private、protected或者類似的方法來劃分可見域、怎麼來劃分屬性。像Swift裡面還有延遲載入啊、屬性監控啊等等。怎麼來定義方法(和上面的函式一起看)。

(2)物件

怎麼初始化物件,有的語言裡有new,有的沒有。怎麼實踐單例模式。還有就是this或者self這樣類似的用法到底幹啥的,像JavaScript裡面,因為最早的時候沒有OO的概念,各種自定義的物件,這時候this的用法也就非常的雜亂。還有就是物件屬於哪個型別進行的判斷,這一點和變數章節有所重複。

(3)繼承

怎麼繼承一個物件,還有就是繼承之後的方法對於訪問的父類中的屬性啊、過載啊咋搞的,這個在Java面試題裡面經常碰到。

(4)抽象類、介面/協議與委託

怎麼定義抽象類或者介面,在Swift和OJC中是協議的概念,還有就是譬如Java中的怎麼定義一個註解。

(5)內部類

這個在Java中用的比較多,又分為靜態內部類、成員內部類、區域性內部類以及匿名內部類。

(6)反射與類裝載

IO

這裡介紹基本的輸入輸出的方法,包括控制檯的輸入輸出、引數的處理、檔案基本的讀寫,還有像Java裡面繁多的什麼位元組流、字元流啊進行介紹。

語法應用

學完了語法基礎,那我們的筆記就要進入其他的具體的應用了,這裡又分為Advanced、Storage、TestRelease、SysProc這幾個部分。

Advanced

在這裡就要進行泛型程式設計、記憶體管理、序列化和反序列化、程式設計規範和程式碼風格以及由該語言實現的演算法的學習。

Network

本部分主要介紹網路訪問、網路呼叫相關。包括了NetworkManagement(網路管理)、Socket、HttpClient(網路客戶端)、RPC/RMI(遠端呼叫)

Storage

在這裡存放檔案系統、資料庫儲存等等相關的內容。包括了快取,像Java裡快取又會分為on-heap和off-heap兩種。然後就要看看常見的資料庫,資料庫包括了KeyValue資料庫,最常見的就是Redis。還有文件型資料庫,最常見的就是Mongodb,還有關係型資料庫。關係型資料庫的使用中又要注意ORM和資料庫分割槽分表等等外掛。

TestRelease

這裡主要是測試啊、釋出啊相關的內容。包括了單元測試,像JUnit、Debug,像在PHP裡面用XDebug實現單步除錯,還有Log 日誌,像著名的log4j,還有就是執行狀態監控。

SysProc

這裡主要存放系統程序相關的內容,包括了切面程式設計和最重要的併發、同步相關的知識。

(1)併發

併發這部分要了解多執行緒的基本概念、執行緒通訊的基本概念。基本的非同步模式,像Promise、Callback啊等等,還有就是非同步的資料流,也就是訊息匯流排,還有就是響應式開發。

(2)同步與執行緒安全

這邊要了解鎖的基本概念,譬如Java中的synchronized和Lock。然後還要了解一些內建的執行緒安全的資料結構。

當我要學習客戶端開發:iOS/Android/Hybrid/WebAPP

隨著前後端分離的概念日漸流行,實際上現在包括Web領域都可以認為是一個客戶端。筆者閱讀REST這篇論文的時候,最大的感受就是徹底的C/S化與無狀態化。那麼,在這一部分,筆者要解決的問題同樣是,當我要學習Android/iOS/WebAPP的時候,我應該學些什麼。這一部分會比上面的更加複雜,全部的列表可以看這裡

Language

此部分主要介紹用於開發對應程式的語言詳情,基本上和上面的程式語言知識體系結構相一致。

UI:介面呈現

這一部分基本上是整個客戶端開發的最重要的地方,首先在UI.md中介紹介面呈現的基本原理,什麼Screen、座標系之類的。

Components(基本元件)

本部分要介紹系統自帶的基本元件,譬如Android裡面的Activity、Fragment,iOS裡面的UIView、UIViewController等等。此外,還需要介紹: (1)Layout & Position

此部分介紹基本的佈局與定位的知識。包括基本的佈局約束,譬如左邊距、右邊距、居中等等。然後是基本的定位方式,包括絕對佈局、相對佈局、彈性佈局和線性佈局等等。接下來是基本的佈局管理器,Android開發的同學應該對這個概念不陌生。然後就是自動佈局或者所謂的響應式佈局,對應了iOS中的AutoLayout和Web裡面的響應式開發。

(2)Container

此部分主要介紹經常的作為容器的View,一個是頁卡檢視,就是常說的TabBar,譬如Android中的Tab、iOS中的TabbarController等等。還有導航檢視,就是NavigationView,譬如iOS中的UINavigationController。最後是最常用的滾動檢視,ScrollView,譬如Web中的Swiper等等。滾動檢視還要解決幾個問題:Infinite Scroll、上拉下拉重新整理以及像ViewPager這樣的基於頁面的滑頁式滾動。

(3)Router:頁面路由

譬如ui-router等等。

Interaction(使用者互動)

本部分主要介紹使用者互動相關知識。

(1)Event&Gesture(事件與手勢操作)

這裡對於使用者常見的點選、拖拽等事件進行響應處理,包括了基本事件的繫結與監聽、事件捕獲傳遞與分發機制以及複雜手勢的監聽與識別,譬如多點觸控、拖拽、滾動】縮放和搖晃等。

(2)Media(音視訊播放、錄製與相關操作)

主要包括了對於相機的基本操作、對於Audio的基本操作以及對於Video的播放。還包括譬如語音輸入啊、直播啊等等。

(3)Sensor

本部分主要包括對於各種感測器,包括陀螺儀、重力感測器等的使用,譬如iOS的HealthKit就是放在這裡的。

(4)Notification

這裡記錄對於通知欄的操作,包括本地通知與遠端推送的通知。

DVisual(繪圖以及資料視覺化)

本部分主要對於基本的繪圖與資料視覺化進行了記錄,包括但不限於: (1)Graphics

這裡記錄了基本的繪圖、畫筆的使用,包括了像顏色與取色、頭像啊、表情啊之類的處理。

(2)Style&Theme

樣式與主題的處理,在Android中就會經常涉及到樣式與主題的概念,還有什麼夜間模式、日間模式之類的。

(3)Filter

這裡進行基本的濾鏡與過濾的處理,注意,這裡與圖片部分的濾鏡區別在於這裡的濾鏡是面向於某個View,而不僅僅是圖片進行的。

(4)Chart

這裡記錄各種圖表,什麼折線圖、餅狀圖等等。

(5)Map

這裡記錄地圖相關,像對於百度地圖的使用就放在這裡。

(6)Barcode

這裡記錄二維碼、條形碼相關的內容。

Animation(動畫與變換)

本部分主要記錄動畫以及常見的變換的內容,包括了動畫構造庫以及常見的動畫集合。動畫構造庫的話又會分為幀動畫與屬性控制這兩種。

Widgets(介面外掛)

這裡存放各式各樣的外掛,算是最複雜的一塊。全部的列表可以看這裡

(1)Dialog:對話方塊外掛

包括了模態對話方塊、彈出層與提示層、覆蓋層、Action Sheet等等。

(2)Indicator:指示器

包括了介紹或者引導頁、時間顯示、進度顯示、文字顯示以及效果、標籤顯示以及效果等等。

(3)Picker:輸入器

包括了按鈕、選單、狀態列/工具欄、選擇器、文字輸入、時間與日期輸入等等。

(4)TableGrid:網格與表單

包括了基本的列表的使用、網格的使用以及卡片式介面的使用。譬如iOS 的 UITableView、Android的CardView、RecycleView都要放在這裡。

(5)Gallery:畫廊

包括了圖片的基本操作,譬如圖片的載入、懶載入、快取、動圖的播放與控制、圖片濾鏡、圖片標籤、圖片貼紙、圖片裁剪與美化等等。還有圖片相簿的瀏覽、圖片輪播、瀑布流方式圖片展示、焦點圖瀏覽等等。

(6)WebView

包括了WebView的基本使用、本地互動以及Cordova的整合等等。

Network:網路呼叫

本部分主要講解網路呼叫,包括了: (1)網路管理

譬如網路可達性判斷、開啟網路等等放在這。

(2)Socket

(3)HttpClient

常見的網路客戶端的使用,譬如Android中的okHttp、iOS中的AFNetwork等等的基本使用都放在這,基本的請求管理、併發請求等等。注意,這裡還有一個叫HTTPStubs或者MockServer,是方便開發或者測試進行的本地偽裝網路請求。

(4)Push

本部分進行推送與長連線實現的內容。

(5)FileTransfer

本部分進行基本的檔案傳輸,上傳和下載的記錄。

(6)Serialization 本部分進行常見的譬如JSON、FlatBuffer以及MsgPack序列化的研究。

Storage:儲存

本部分主要對於儲存相關的內容進行記錄,包括: (1)DataBase(資料庫)

像iOS的CoreData、SQLite的使用,以及最近比較火的Realm的使用。

(2)File(檔案)

這裡記錄了基本的檔案瀏覽與訪問,還有對於配置檔案、資原始檔的使用等等。

(3)Cache(快取系統)

SysProc:系統與程序

(1)元件之間的通訊

像Android中利用AIDL進行通訊、利用ContentProvider進行通訊等等。

(2)併發與非同步

(3)服務

(4)RPC:遠端服務呼叫

TestRelease

本部分主要記錄測試與釋出相關的內容: (1)Debug(除錯與記錄)

包括日誌、執行緒與Crash的監控等等

(2)Test

包括了單元測試、介面測試以及第三方測試等等。

(3)Release

包括了Android中的簽名、iOS裡面的提交到AppStore的流程還有類似於雲測這樣的第三方測試。

(4)Optimization

優化

(5)Plugin & Dynamic Patch(外掛化與動態更新)

這個在Android中用的比較多,像阿里的那個可以動態更新的工具。

(6)APM:應用狀態追蹤與評分

當我要學習服務端開發:SpringMVC/Laravel/Rails

  • Introduction
  • Quick Start
    • Installation
    • Generator
    • Dependence Managent:依賴管理與自定義模組匯入
    • Deployment
  • Application
    • LifeCycle
    • Configuration
      • Multiple Modules
  • Route
  • Controller
    • Request
    • Session
    • Response
      • Pagination
  • Model
    • Relational DataBase
      • ORM
      • MySQL
      • Oracle
      • SQLServer
      • PostgreSQL
    • NoSQL
      • MongoDB
    • Cache
      • Redis
      • Memcache
  • View
    • Template
  • Middleware
    • Auth
  • Service
    • IoC/DI
    • Log
  • Test
  • Concurrence
    • Queue

筆者在這裡打個廣告,介紹下筆者自己借鑑了微服務、Redux等等雜七雜八東西之後對於RESTful深入理解提出的一些構想:Reactive Abstract Resource Flow

當我要學習資料科學:MachineLearning/NLP/DeepLearning/Statistic

這是筆者自己的一個數據科學的Gitbook

對於資料科學這部分,筆者自己也正在完善中,只能是大概如下:

  • Methodology:方法理論

    • DataProcess:資料處理

    • MachineLearning:機器學習的計算演算法

      • ANN:人工神經網路

      • Clustering:聚類

      • Regression:迴歸

      • SVM

    • NLP:自然語言處理

      • PatternMatch:模式識別

      • SentimentAnalysis:情感分析

      • TopicModel:主題模型

      • Word2Vec:詞向量

  • Library:開發庫

    • ClusterComputing

      • MLib

      • Madout

    • Java

      • Weka

      • Deeplearning4j

    • MATLAB

    • Python

      • Scikit

      • Tensorflow

    • R

  • Application:應用

    • Classification:分類

    • CommunityDetection:社團發現

    • Personas:使用者標籤畫像

    • Recognition:模式識別

    • RecommendSystem:推薦系統

當我要學習雲端計算與大資料的基礎架構:分散式計算/運維/儲存/虛擬化

雲端計算和大資料的概念很火啊,作為一個程式狗,筆者也是算是從四年前就開始接觸到這方面的技術,不過講真,因為沒去過大公司,只能看著啥阿里、美團在InfoQ、程式設計師雜誌上分享自己的高可用平臺眼饞。很多技術筆者在自己的電腦上用過,也一直保持關注,但還真沒投入過實戰。這一部分在筆者筆記內的代號是Infrastructure,就是基礎架構,主要包括了DCE(分散式計算環境)、Distributed(分散式)、OM(運維)、Storage(儲存)以及Virtualization(虛擬化)這幾個方面。

DCE:分散式計算環境

分散式計算環境主要會介紹基於批式計算和流式計算的常見的框架和原理,這裡推薦一波筆者翻譯的:Apache流計算框架對比。常見的批處理框架就是Hadoop的MapReduce和Spark(不知道有沒有理解錯) ,而流處理框架包括但不限於Flink、Storm還有Spark Streaming 。

Distributed:分散式系統

分散式系統這部分,一方面要了解分散式系統的基本的知識原理,另一方面就是應用了,筆者主要分為了以下幾個部分:

  • JobSchedule:任務排程與管理,譬如Disque

  • MOM:訊息中介軟體,像Kafka、RabbitMQ、ZeroMQ這些

  • ProgramModel:程式設計模型

  • ResManager:資源管理,典型的就是Yarn和Mesos

  • ServiceCoordination:服務發現和服務排程,典型的就是Zookeeper和Etcd,話說阿里的Dubbo我也放在這了,確實不錯的。

OM:運維管理

這部分是運維管理,也包含了DevOps的很多理念在這邊,主要就是:

  • ContinuousDelivery:持續交付,也包括了CI的概念,像Jenkins這樣的工具介紹

  • Log:日誌

    • ELK

    • Flume

  • MonitorAnalytic:應用追蹤與分析

Storage:儲存

這部分就是介紹各種各樣的儲存系統:

  • Cache:快取,著名的Memcache就放在這

  • DataBase:資料庫系統

    • ColumnOriented:列資料庫,譬如HBase

    • Document:文件型資料庫,譬如Mongodb、Cassandra

    • Graph:圖資料庫

    • KeyValue:鍵值資料庫,譬如Redis

    • Relational:關係型資料庫

      • MySQL

      • Oracle

      • SQLServer

  • DataWareHouse:資料倉庫,譬如Hive

  • ETL:資料儲存過程,譬如Kettle

  • FileSystem:檔案系統

    • NTFS

    • ext4

    • RAMFS:譬如Taycon

Virtualization:虛擬化

這部分主要介紹虛擬化的相關知識和原理,大概如下:

  • Container:容器技術,很火的,不多說

    • Docker

    • Rocket

  • OpenStack

  • SandBox:傳統的沙箱的技術

  • Hypervisor

    • Xen

    • VShpere

當我要學習資訊保安:移動安全/計算機取證/滲透測試/逆向工程/加固

筆者本科裡學習的是資訊保安,當時做Windows驅動開發的,每天扒MSDN的文件,當時是以越向下為榮,現在想想就覺得好悽慘。後來筆者的第一份兼職也是和資訊保安相關,也搞過站抓過雞,不過後來覺得唔至少在自己淺薄的認知裡,做安全很大程度上是去發現現有系統的問題,不能說無聊,只能說沒有做工程開發那樣讓我來的有興趣。筆者在自己的資訊保安相關的學習中,大概進行了如下歸類:

  • ComputerForensics:計算機取證相關

  • Cryptology:密碼學與編碼相關

  • MobileSecurity:移動安全,包括像應用程式的逆向還有木馬啊、系統破解啊之類的,筆者當年也研究過Xposed,還弄了個Android-AppMonitorDroid

  • Reinforce:主機加固啊之類的

  • ReverseEngineering:逆向工程,就是傳統的用OD、IDA進行破解的,還有免殺也屬於這一塊

  • PenetrationTesting:滲透測試,這波就比較大了

    • Tools:常見的滲透測試工具的介紹,像Kali、Backtrack、MSF之類的

    • Vulns:漏洞和0Day的總結

      • Application:應用程式的漏洞,像什麼ECShop之類的

      • DataBase:資料庫漏洞

      • Middleware:中介軟體漏洞

      • OS:作業系統漏洞

    • Tech

      • 踩點掃描,啥社會工程啊之類的

      • 漏洞利用,DDOS之類的

      • 內網滲透,內網監聽、DNS投毒之類的

      • 前端安全,啥SQL注入、XSS、CSRF屬於這一塊

      • 無線安全