本文的資料放到了Github Repo
(本文介紹的這種筆記排布方式不一定適合於初學者理解)
六年前筆者開始接觸到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這樣還能支持解構賦值。最後呢,這一部分還要看看你怎麼進行類型、格式判斷的,好比instanceof啊typeof這些操作符,都是在這裏介紹的。
(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屬於這一塊
-
無線安全
-
-
本文參與了 SegmentFault「我的編程之路」計劃,歡迎正在閲讀的你也加入,一起分享。
