歡迎光臨
每天分享高質量文章

扒一扒那些和程式語言無關的技術

來自:碼農翻身(微訊號: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權威指南》

文章:

小白科普:從輸入網址到最後瀏覽器呈現頁面內容,中間發生了什麼?

從密碼到token, 一個授權的故事

機房夜話

2socket

socket是對TCP/IP的抽象, 網路程式設計肯定繞不過socket,絕大部分語言都提供了socket相關的API。

工作中直接對socket程式設計的機會不多,大多都是封裝好的, 但是要理解socket在客戶端和伺服器端的區別,伺服器端是如何維護連線的, 這就會引出一個重要的技術:I/O多路復用(select/poll/epoll) ,也是ngnix,redis等著名軟體的基礎。

I/O多路復用是I/O模型之一,其他還有同步阻塞,同步非阻塞,訊號驅動和非同步。

這方面最經典的書應該是《Unix網路程式設計了》。

文章

張大胖的socket

HTTP Server :一個差生的逆襲

3安全基礎

如果說socket,HTTP建立了傳輸的通道,Hash技術,對稱/非對稱加密, 數字簽名等安全基礎就是安全的守護者。

去看看最近大熱的區塊鏈,會發現這些安全基礎是區塊鏈基本的技術支撐。

他們是如此重要,到處都能看到他們的身影:

HTTPS:使用“非對稱加密”來傳輸“對稱加密的金鑰”,使用Hash,數字簽名來確保身份的合法性。

Secure Shell : 使用RSA的方式登入伺服器

Hash的用途更為廣泛:

使用者密碼的儲存: 現在基本上沒有網站儲存明文密碼了,基本上都是把密碼加salt生成hash 值以後來儲存。

HashMap等資料結構: 使用Hash來生成key 。

Memcached :分散式一致性Hash演演算法。

檔案傳輸校驗: 使用Hash演演算法生成訊息摘要,驗證檔案是否被篡改。

如果是做Web開發,還必須得掌握XSS/CSRF/SQL註入等常見的Web攻擊技術和和應對方案

推薦書籍:

《白帽子講安全》

碼農翻身文章:

一個故事講完HTTPS

駭客三兄弟

駭客三兄弟續

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的書就是《駭客與畫家》

相關文章:

函式式程式設計聖經

你為什麼學習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、資料庫、運維等。

贊(0)

分享創造快樂