本文的資料放到了Github Repo
(本文介紹的這種筆記排布方式不必定適合於初學者理解)前端
六年前筆者開始接觸到C語言,寫了第一行HelloWorld。三年前開始進入工做崗位進行實踐,前先後後參與了公司裏、學校裏也有十來個項目,本身也有屢次自主創業的經歷。在不懂事的時候,筆者自誇「全棧架構師」,從前端的Android、iOS、Web,到中間件的Apache、Nginx,再到後端的Laravel、Spring、Rails、NodeJs,還有MySQL、Redis、Mongodb,有時候還要作些CI,用用Hadoop、Docker、Spark作作雲計算環境,再實踐實踐機器學習的算法。呵呵,每當想起這些,筆者腦中就閃過了孔乙己一字排開八個大錢的畫面,只懂些名詞,真是連民科都不如。做爲一個有底線的程序猿,知之爲知之,不知爲不知,雖然筆者在不長的實踐生涯中「被迫」着瞭解了計算機軟件行業的許多方面,可是筆者在這裏描述這個背景並非自詡或者裝逼,只是想陳述一個事實:若是你尚未感到知識管理、知識歸檔的痛苦,那說明你還了解的不夠多。若是你還只是停留在一字排開數個名詞的階段,那說明你瞭解的還不夠深。git
技術分爲術與道二者,術便是具體的作事的方法,而道則是作事的邏輯抽象的原則與原理。一味地追求術的人每每都是但願走捷徑,不求甚解的。而道之所求也是符合一萬小時原理,須要大量的付出與總結。借用數學之美中的例子,若是你想要去創建一個搜索引擎,直接拿來主義,用上Solr、ElasticSearch之類的,是術。而根據下載、索引與排序這三個抽象步驟來進行提煉與昇華,這就是道。計算機科學有兩類根本問題。一類是理論:算法,數據結構,複雜度,機器學習,模式識別,等等等。一類是系統:操做系統,網絡系統,分佈式系統,存儲系統,遊戲引擎,等等等等。粗淺的說,學界會偏向前者,產界偏向後者,筆者做爲一隻一直讀書的從本科到碩士,見多了兩者相互嫌棄。可是這兩者相輔相成,筆者本身數學一直很差,對於那些公式啊推導畏如猛虎,可是用心看了以後,甚多樂趣啊。所謂觸類旁通,見微知著,這都是須要在一個廣博的知識的基礎上才行,因此對於知識,仍是應該拿來主義,來者不拒。程序員
筆者回顧本身這幾年的風雨歷程,老實說,談到絕望或者無奈的場景每每不是某個具體的問題,能解決的問題是必定能夠解決的,而是在知識海洋麪前,感覺到了宇宙的浩瀚與人類的眇小。莊子有云:吾生也有涯,而知也無涯。以有涯隨無涯,殆已!筆者最常感受痛苦的事情有二:github
(1)學過的知識都忘了。筆者算來開始用Java也有五年了吧,可是你如今要筆者立馬說出JVM的架構組成,筆者也是心有慼慼,吶吶不能言。我可以記得的就是我係統的學習過五次,可是都忘了。再舉個例子,筆者以前學習語言的時候,由於工做關係同時在用Python、Java、Ruby、JavaScript,不談學的多深,當時感受最痛苦的就是老把每一個語言怎麼求取數組長度給忘了或者搞混了,是否是以爲很傻比?或者每次寫Java的時候,筆者都會以爲讀取文件好難好難,可是至少也寫過上萬行各類各樣的讀取文件的代碼了吧。咱們構建一個完備的知識體系,不是爲了讓咱們不會去忘記,而是讓咱們忘了以後能以最快的速度學會。咱們寶貴的時間不該該浪費在對於知識的重複學習,Learn Once,Know Forever。面試
(2)寫過的代碼都沒了。舉兩個例子吧,仍是以Java爲例,咱們不少項目都會用到一些字符串輔助的方法,譬如加密或者編碼,而後筆者就發現每次作項目的時候都要把這些重寫一遍。另外一個呢,筆者學習Spark的時候,80%的時間都用來重複搭建虛擬機環境了,啪啪的。後來使用Docker以後纔好一點。算法
授人以魚不如授人以漁,筆者一直以爲我這幾年磕磕碰碰精華所在就是這完整的知識體系架構,它給了我莫大的信心與勇氣去遨遊在璀璨的知識長河中。不積跬步無以致千里,編程之路亦如一場遊戲,隨時學點知識拿個EXP,或者打個大魔王爆個裝備啥的,一個完備的知識體系或者知識圖譜,就是你的背囊,也是你行走在知識海洋裏的一葉扁舟。固然,本文所講也只是一家之言,作不得準,你們見仁見智。順便說一句,筆者很感謝爲知筆記爲我提供了很是好用的工具,這裏友情推廣一波。數據庫
知識應該放在它應該在的地方。編程
關於本部分的詳細文檔和所有的知識結構圖能夠查看這裏。segmentfault
筆者從學習第一門語言開始,就被教導一個概念,學習一門語言的基礎,也就是語法自己,不表明你掌握了這門語言。學習一門語言應該是學習它所表明的完整的生態環境和在各個應用場景下最合適的組合。一樣的,筆者大大小小算是用過七八門語言,固然,你爲了學習而去學習,用語言的數量標榜本身是毫無心義的。可是,每一個語言都有其特性,就像才接觸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:參考的書籍啊、資源啊放這裏
學習一門語言的時候,你確定會寫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)反射與類裝載
這裏介紹基本的輸入輸出的方法,包括控制檯的輸入輸出、參數的處理、文件基本的讀寫,還有像Java裏面繁多的什麼字節流、字符流啊進行介紹。
學完了語法基礎,那咱們的筆記就要進入其餘的具體的應用了,這裏又分爲Advanced、Storage、TestRelease、SysProc這幾個部分。
在這裏就要進行泛型編程、內存管理、序列化和反序列化、編程規範和代碼風格以及由該語言實現的算法的學習。
本部分主要介紹網絡訪問、網絡調用相關。包括了NetworkManagement(網絡管理)、Socket、HttpClient(網絡客戶端)、RPC/RMI(遠程調用)
在這裏存放文件系統、數據庫存儲等等相關的內容。包括了緩存,像Java裏緩存又會分爲on-heap和off-heap兩種。而後就要看看常見的數據庫,數據庫包括了KeyValue數據庫,最多見的就是Redis。還有文檔型數據庫,最多見的就是Mongodb,還有關係型數據庫。關係型數據庫的使用中又要注意ORM和數據庫分區分表等等插件。
這裏主要是測試啊、發佈啊相關的內容。包括了單元測試,像JUnit、Debug,像在PHP裏面用XDebug實現單步調試,還有Log 日誌,像著名的log4j,還有就是運行狀態監控。
這裏主要存放系統進程相關的內容,包括了切面編程和最重要的併發、同步相關的知識。
(1)併發
併發這部分要了解多線程的基本概念、線程通訊的基本概念。基本的異步模式,像Promise、Callback啊等等,還有就是異步的數據流,也就是消息總線,還有就是響應式開發。
(2)同步與線程安全
這邊要了解鎖的基本概念,譬如Java中的synchronized和Lock。而後還要了解一些內建的線程安全的數據結構。
隨着先後端分離的概念日漸流行,實際上如今包括Web領域均可以認爲是一個客戶端。筆者閱讀REST這篇論文的時候,最大的感覺就是完全的C/S化與無狀態化。那麼,在這一部分,筆者要解決的問題一樣是,當我要學習Android/iOS/WebAPP的時候,我應該學些什麼。這一部分會比上面的更加複雜,所有的列表能夠看這裏。
此部分主要介紹用於開發對應程序的語言詳情,基本上和上面的編程語言知識體系結構相一致。
這一部分基本上是整個客戶端開發的最重要的地方,首先在UI.md中介紹界面呈現的基本原理,什麼Screen、座標系之類的。
本部分要介紹系統自帶的基本組件,譬如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等等。
本部分主要介紹用戶交互相關知識。
(1)Event&Gesture(事件與手勢操做)
這裏對於用戶常見的點擊、拖拽等事件進行響應處理,包括了基本事件的綁定與監聽、事件捕獲傳遞與分發機制以及複雜手勢的監聽與識別,譬如多點觸控、拖拽、滾動】縮放和搖晃等。
(2)Media(音視頻播放、錄製與相關操做)
主要包括了對於相機的基本操做、對於Audio的基本操做以及對於Video的播放。還包括譬如語音輸入啊、直播啊等等。
(3)Sensor
本部分主要包括對於各類傳感器,包括陀螺儀、重力傳感器等的使用,譬如iOS的HealthKit就是放在這裏的。
(4)Notification
這裏記錄對於通知欄的操做,包括本地通知與遠程推送的通知。
本部分主要對於基本的繪圖與數據可視化進行了記錄,包括但不限於:
(1)Graphics
這裏記錄了基本的繪圖、畫筆的使用,包括了像顏色與取色、頭像啊、表情啊之類的處理。
(2)Style&Theme
樣式與主題的處理,在Android中就會常常涉及到樣式與主題的概念,還有什麼夜間模式、日間模式之類的。
(3)Filter
這裏進行基本的濾鏡與過濾的處理,注意,這裏與圖片部分的濾鏡區別在於這裏的濾鏡是面向於某個View,而不只僅是圖片進行的。
(4)Chart
這裏記錄各類圖表,什麼折線圖、餅狀圖等等。
(5)Map
這裏記錄地圖相關,像對於百度地圖的使用就放在這裏。
(6)Barcode
這裏記錄二維碼、條形碼相關的內容。
本部分主要記錄動畫以及常見的變換的內容,包括了動畫構造庫以及常見的動畫集合。動畫構造庫的話又會分爲幀動畫與屬性控制這兩種。
這裏存放各式各樣的插件,算是最複雜的一塊。所有的列表能夠看這裏。
(1)Dialog:對話框插件
包括了模態對話框、彈出層與提示層、覆蓋層、Action Sheet等等。
(2)Indicator:指示器
包括了介紹或者引導頁、時間顯示、進度顯示、文本顯示以及效果、標籤顯示以及效果等等。
(3)Picker:輸入器
包括了按鈕、菜單、狀態欄/工具欄、選擇器、文本輸入、時間與日期輸入等等。
(4)TableGrid:網格與表單
包括了基本的列表的使用、網格的使用以及卡片式界面的使用。譬如iOS 的 UITableView、Android的CardView、RecycleView都要放在這裏。
(5)Gallery:畫廊
包括了圖片的基本操做,譬如圖片的加載、懶加載、緩存、動圖的播放與控制、圖片濾鏡、圖片標籤、圖片貼紙、圖片裁剪與美化等等。還有圖片相冊的瀏覽、圖片輪播、瀑布流方式圖片展現、焦點圖瀏覽等等。
(6)WebView
包括了WebView的基本使用、本地交互以及Cordova的集成等等。
本部分主要講解網絡調用,包括了:
(1)網絡管理
譬如網絡可達性判斷、打開網絡等等放在這。
(2)Socket
(3)HttpClient
常見的網絡客戶端的使用,譬如Android中的okHttp、iOS中的AFNetwork等等的基本使用都放在這,基本的請求管理、併發請求等等。注意,這裏還有一個叫HTTPStubs或者MockServer,是方便開發或者測試進行的本地假裝網絡請求。
(4)Push
本部分進行推送與長鏈接實現的內容。
(5)FileTransfer
本部分進行基本的文件傳輸,上傳和下載的記錄。
(6)Serialization
本部分進行常見的譬如JSON、FlatBuffer以及MsgPack序列化的研究。
本部分主要對於存儲相關的內容進行記錄,包括:
(1)DataBase(數據庫)
像iOS的CoreData、SQLite的使用,以及最近比較火的Realm的使用。
(2)File(文件)
這裏記錄了基本的文件瀏覽與訪問,還有對於配置文件、資源文件的使用等等。
(3)Cache(緩存系統)
(1)組件之間的通訊
像Android中利用AIDL進行通訊、利用ContentProvider進行通訊等等。
(2)併發與異步
(3)服務
(4)RPC:遠程服務調用
本部分主要記錄測試與發佈相關的內容:
(1)Debug(調試與記錄)
包括日誌、線程與Crash的監控等等
(2)Test
包括了單元測試、界面測試以及第三方測試等等。
(3)Release
包括了Android中的簽名、iOS裏面的提交到AppStore的流程還有相似於雲測這樣的第三方測試。
(4)Optimization
優化
(5)Plugin & Dynamic Patch(插件化與動態更新)
這個在Android中用的比較多,像阿里的那個能夠動態更新的工具。
(6)APM:應用狀態追蹤與評分
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
這是筆者本身的一個數據科學的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(虛擬化)這幾個方面。
分佈式計算環境主要會介紹基於批式計算和流式計算的常見的框架和原理,這裏推薦一波筆者翻譯的:Apache流計算框架對比。常見的批處理框架就是Hadoop的MapReduce和Spark(不知道有沒有理解錯) ,而流處理框架包括但不限於Flink、Storm還有Spark Streaming 。
分佈式系統這部分,一方面要了解分佈式系統的基本的知識原理,另外一方面就是應用了,筆者主要分爲了如下幾個部分:
JobSchedule:任務調度與管理,譬如Disque
MOM:消息中間件,像Kafka、RabbitMQ、ZeroMQ這些
ProgramModel:編程模型
ResManager:資源管理,典型的就是Yarn和Mesos
ServiceCoordination:服務發現和服務調度,典型的就是Zookeeper和Etcd,話說阿里的Dubbo我也放在這了,確實不錯的。
這部分是運維管理,也包含了DevOps的不少理念在這邊,主要就是:
ContinuousDelivery:持續交付,也包括了CI的概念,像Jenkins這樣的工具介紹
Log:日誌
ELK
Flume
MonitorAnalytic:應用追蹤與分析
這部分就是介紹各類各樣的存儲系統:
Cache:緩存,著名的Memcache就放在這
DataBase:數據庫系統
ColumnOriented:列數據庫,譬如HBase
Document:文檔型數據庫,譬如Mongodb、Cassandra
Graph:圖數據庫
KeyValue:鍵值數據庫,譬如Redis
Relational:關係型數據庫
MySQL
Oracle
SQLServer
DataWareHouse:數據倉庫,譬如Hive
ETL:數據存儲過程,譬如Kettle
FileSystem:文件系統
NTFS
ext4
RAMFS:譬如Taycon
這部分主要介紹虛擬化的相關知識和原理,大概以下:
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「個人編程之路」計劃,歡迎正在閱讀的你也加入,一塊兒分享。