我的編程之路——知識管理與知識體系
六年前筆者開始接觸到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)最后在這里還要學學不可變數據,這一點在函數式編程里面很流行,就好像非死book提供的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「我的編程之路」計劃 ,歡迎正在閱讀的你也加入,一起分享。
來自: https://segmentfault.com/a/1190000004612590