來自:碼農翻身(微訊號:coderising)
這世界上程式語言如此之多,想學完是不可能的,也是沒有必要的。
一般來說,一個人能精通一門語言,然後會使用另外一種語言就不錯了。
既然程式語言學不完,能不能把重點放到程式語言無關的技術上呢?
首先能想到的就是資料結構和演演算法,它的重要性已經不用再強調了,直接跳過。
“負載均衡,分散式,叢集,高可用……” 這些“高深”的技術在日常Coding也不常用, 略過不談,主要扒一扒工程中常用的、程式語言無關的具體技術。
1HTTP
HTTP誕生於1991年,是網際網路領域一個基石性的協議。全世界電腦上的內容能互聯起來,全拜HTTP所賜。
程式員主要透過HTTP來傳輸XML, JSON等資料。日常使用的就是GET、POST方法,但HTTP可不僅僅只有這些,它的細節相當多, 我覺得程式員至少應該掌握這些:
Cookie: domain, path, expiration
HTTP狀態碼
HTTP長連線 ,由此擴充套件到websocket。
HTTP重定向 ,非常有用的技術,對理解OAuth, CAS(SSO)很有幫助。
快取 :Last-Modified和ETag
chunked :分塊傳輸
代理:正向代理/反向代理
推薦書籍
《圖解HTTP》
《HTTP權威指南》
文章:
《小白科普:從輸入網址到最後瀏覽器呈現頁面內容,中間發生了什麼?》
《機房夜話》
2socket
socket是對TCP/IP的抽象, 網路程式設計肯定繞不過socket,絕大部分語言都提供了socket相關的API。
工作中直接對socket程式設計的機會不多,大多都是封裝好的, 但是要理解socket在客戶端和伺服器端的區別,伺服器端是如何維護連線的, 這就會引出一個重要的技術:I/O多路復用(select/poll/epoll) ,也是ngnix,redis等著名軟體的基礎。
I/O多路復用是I/O模型之一,其他還有同步阻塞,同步非阻塞,訊號驅動和非同步。
這方面最經典的書應該是《Unix網路程式設計了》。
文章:
3安全基礎
如果說socket,HTTP建立了傳輸的通道,Hash技術,對稱/非對稱加密, 數字簽名等安全基礎就是安全的守護者。
去看看最近大熱的區塊鏈,會發現這些安全基礎是區塊鏈基本的技術支撐。
他們是如此重要,到處都能看到他們的身影:
HTTPS:使用“非對稱加密”來傳輸“對稱加密的金鑰”,使用Hash,數字簽名來確保身份的合法性。
Secure Shell : 使用RSA的方式登入伺服器
Hash的用途更為廣泛:
使用者密碼的儲存: 現在基本上沒有網站儲存明文密碼了,基本上都是把密碼加salt生成hash 值以後來儲存。
HashMap等資料結構: 使用Hash來生成key 。
Memcached :分散式一致性Hash演演算法。
檔案傳輸校驗: 使用Hash演演算法生成訊息摘要,驗證檔案是否被篡改。
如果是做Web開發,還必須得掌握XSS/CSRF/SQL註入等常見的Web攻擊技術和和應對方案
推薦書籍:
《白帽子講安全》
碼農翻身文章:
《駭客三兄弟》
《駭客三兄弟續》
4併發程式設計
這是一個程式設計中繞不過的主題,單個執行緒的狀態變化, 多執行緒的同步與互斥,各種各樣的鎖,死鎖,ThreadLocal , volatile ,CAS…… 總之有點煩人。
擴充套件開去還有執行緒池,各種併發模型如Actor, Channel等等。
推薦書籍:
《實戰Java高併發設計》
《七週七併發模型》
5OOD/OOP(面向物件的設計/程式設計)
只要使用面向物件程式語言,就要修煉OOD內功,用OO的語言寫面向過程的程式實在是一件可悲的事情。
OOD/OOP的核心就是“抽象”, 什麼是抽象? 其實就是擯棄了細節,找到那些本質不變的部分。 舉個例子, Java中的List 是對一個可以透過下標順序訪問的集合的抽象,管你是什麼ArrayList, LinkedList, 都是List。
有了“抽象”,就可以針對介面程式設計,而不是針對實現程式設計。就像一個領導,說話的層次高,說出的話比較含糊。
正是由於這個特點,具體的實現可以替換,可以擴充套件,靈活性很高。
說起來簡單,做起來確很難,因為這個東西有點“玄妙”,需要自己去修煉,去體會哪些SOLID原則,去領悟設計樣式背後的思想,而不是學習招式。
閱讀優秀原始碼是個很好的途徑,看看大牛們是怎麼抽象出哪些“不變”的部分的。
推薦書籍:
《Head First設計樣式》
《敏捷軟體開發 原則、樣式與實踐》
6資料庫
關係資料庫也幾乎是每個系統的必備,即使是Android開發也需要利用sqlite這樣的輕型資料庫。
所以程式員要會根據需求來設計表,掌握基本的SQL操作。
深入一點的話,事務和索引是理解關係資料庫的兩個重頭戲。
需要理解事務的特性和隔離級別,理解Undo/Redo日誌的原理。
理解MVCC這個常見的併發控制技術。
理解索引的實現原理,以及在特定資料庫如MySQL的實現。查詢和索引的關係。
碼農翻身文章:
7函式式程式設計思想
函式式程式設計已經誕生很久很久了,雖然沒有成為主流,但是它的思想卻在很多語言中生根,發芽,結果。
很多語言都擁抱了函式式程式設計的思想,JavaScript,Python, Ruby, Scala….. 也包括非常“保守”的Java。
不僅如此,函式式程式設計中的Map 和 Reduce 的思想還在大資料的領域大放異彩。
我估計以後使用函式式程式設計的機會越來越多,瞭解它的思想有極大好處。
函式式程式設計的基本概念包括: 純函式,不變數,遞迴,高階函式。 高階一點的有Currying, 惰性求值,宏(macro)。
最著名的安利LISP的書就是《駭客與畫家》
相關文章:
8測試和重構
掌握單元測試已經是程式員的必備技能了, 如果還不會的話,趕緊去補上吧。
需要註意的是,一定要讓單元測試有這麼幾個特點:
1. 單元測試是“白盒測試”, 應該改寫各個分支流程、異常條件
2. 單元測試面向的是一個單元(“Unit”), 是java中的一個類或者幾個類組成的單元。
3. 單元測試執行一定要快!
4. 單元測試一定是可重覆執行的
5. 單元測試之間不能有相互依賴,應該是獨立的。
6. 單元測試程式碼和業務程式碼同等重要, 要一併維護。
另外還有自動化的功能測試, 效能測試,都是應該瞭解,甚至掌握的技能。
重構也是一大技能,在保證功能不改變的情況下,讓程式碼變得更好。
Martin Flower的書《重構》中介紹了巨多的重構方法, 我覺得最最常用的是兩個:
變數重新命名: 用清晰的名稱體現程式碼的意圖
提取函式:將大函式拆分成小函式,消除重覆,讓程式碼更容易閱讀
當然,重構需要IDE的支援,在這一點上靜態型別語言要比動態型別語言表現得更好。
推薦書籍
《重構》
相關文章
《張大胖的單元測試》
9版本管理
公司的原始碼肯定是要納入版本管理的,如果你的公司還在透過程式員之間複製的方式來共享程式碼,我建議馬上跑路。
如今程式員也愛社交,不會使用Git/GitHub簡直不好意思和人打招呼。
初學者不要把它想得很複雜,自己找個教程,動手做幾次,很快就掌握了。
相關文章
10正則運算式
這個不多說,對文字進行查詢、替換非常有用。
(完)
●編號323,輸入編號直達本文
●輸入m獲取到文章目錄
Python程式設計
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。