英文原文:10 Articles Every Programmer Must Readhtml
做爲一名 Java 程序員和軟件開發人員,那些每一個程序員都應該知道的 XXX 的文章教會了我很多東西,它們提供了某個特定領域的一些實用的而且有深度的信息,這些東西一般很難找到。在我學習的過程當中我讀到過許多很是有用的文章,我把它們添加到了書籤裏,方便之後閱讀或者引用。我我的認爲全部開發人員都能從這些文章中受益,所以我也寫了篇「每一個程序員都應該瞭解的」文章,準備分享給大家。這是個人我的收藏。在這篇文章中,你會看到每一個程序員都應該瞭解的一些經典文章,涵蓋了內存,unicode,浮點數,網絡,面向對象設計,時間,URL 編碼,字符串等話題。這個列表對初學者和新手來講很是重要,由於他們如今缺的正是實戰的經驗。而這些文章正好是實踐相關的,他們能夠從中學到不少東西。在職業生涯的初級,早點了解一些基礎的知識有助於從此避免犯錯,這些坑已經被其餘的程序員和軟件開發人員在他們學習的過程當中踩過了。你可能還搞不明白浮點數的一些細節,或者被內存的細節弄得暈頭轉向,不過將這份列表保留在手邊仍是頗有必要的,在適當的時候能夠時不時的參考下。祝你好運,但願你能喜歡這些文章。順便提一句,若是有任何的程序員必讀系列的文章沒在這個列表中,別忘了分享一下。java
一、程序員必知以內存篇程序員
這是篇很是經典的文章,它將會帶領你走入內存的各個方面,有老的,也有新的,有知道的,也有不知道的。儘管內存十分常見,無處不在,但並非每一個程序員都足夠了解它。若是你正在編寫高性能的應用程序的話,瞭解現代系統中的內存尤其重要。硬件設計師們帶來了更復雜的內存處理及加速的技術,好比說 CPU 緩存,但若是離開了程序員它們也沒法發揮出最大的價值。我仍在閱讀這篇文章,很難說清楚我到底從中學到了多少關於隨機訪問內存(RAM),CPU 緩存,包括 1 級,2 級緩存,不一樣類型的內存,直接內存訪問,內存控制器設計及普通內存的知識。簡而言之,它是各個層次的程序員都必讀的文章。web
浮點數運算是一個很是有技術含量的話題,不太容易掌握。許多 Java 程序員都不清楚使用==操做符比較 float/double 類型的話到底出現什麼問題。許多人在使用 float/double 進行貨幣計算的時候常常會犯錯。這篇文章是這一系列中的精華,全部的軟件開發人員都應該讀一下。隨着你經驗的增加,你確定想去深刻了解一些常見的東西的細節,浮點數運算就是其中之一。做爲一名 Java 高級開發人員,你必須瞭解如何進行貨幣運算,什麼時候使用 float,double 或者 BigDecimal,如何對浮點數進行舍入運算等等。就算你知道了浮點數運算的一些基礎知識,讀下這篇文章,你確定還會學到一些新的東西。編程
字符編碼是另外一個許多程序員痛苦掙扎的領域,」每個程序員都絕對絕對應該瞭解 Unicode 以及字符集(不準找任何藉口!)「填補了這一空白。標註一下,是的,這就是這篇文章的標題。它是由 stackoverflow.com 的創始人之一,Joel Spolsky 所寫的。Joel10 年前就在他的博客上發表了這篇文章,不過對於如今而言仍然適用。這篇文章會告訴你什麼是 Unicode,什麼是字符編碼,字符是如何經過字節來表示的等等。這篇文章最讚的一點就是它的語言及行文,儘管你根本不知道什麼是 Unicode,你也可以很容易地看懂。一句話,這又是一篇程序員,碼農,軟件工程師必讀的文章。瀏覽器
四、每一個程序員必知之時間篇緩存
除了字符編碼外,時間和日期又是另外一個程序員常常栽倒的領域,包括我本身在內。甚至是高級開發人員也會被格林尼治標準時間(GMT),世界標準時間(UTC),夏令時,閏秒這些東西搞的死去活來。坦白地說,在處理時區這個問題上,很難不踩一些坑,更別說再加上夏令時什麼的。若是你想要試錯法的話則更糟糕,由於這麼作永遠也解決不了你的問題。這裏有許多可能出錯或者產生誤解的地方。比方說,日期是否包括時區可能就會困擾到你,將 UNIX 時間轉化成其它的時區可能會讓你崩潰,你仍是忘了時鐘同步和延遲這些事吧。我但願讀完這篇經典的文章後,你的許多關於時間的誤解都可以消除,本身可以鞏固一些關於日期的基礎常識。安全
這篇文章介紹了 Uniform Resource Locator (URL)編碼中的一些常見的誤解,而後試圖闡明什麼是 HTTP 的 URL 編碼,最後列舉了一些常見的錯誤及解決方案。儘管這篇文章的內容並不特定於某種編程語言,但它是用 Java 來進行問題的描述,並修復 URL 編碼中存在的問題。你會學習到 URL 的基礎語法,HTTP 及其它協議中通用的 URL 格式。這篇文章還介紹了 URL 中的一些常見錯誤,好比字符編碼,URL 不一樣部分的保留字符,以及 URL 編解碼問題。若是你是一名 Java 開發人員,你會學習到如何在 Java 中正確地處理 URL,如何構造 URL,以及如何使用 Apache Common Http client 庫。最後它還提供了一些最佳實踐的建議,好比你應該在構建 URL 的時候進行編碼,確保你的重寫 URL 的過濾器正確地處理了 URL,等等。這是任何 WEB 開發人員必讀的文章 。
這是 programmers.stackexchange.com 上的一篇很是有趣的文章,它講的是程序員在將網站對外發布以前須要實現的技術細節。這包括接口設計及用戶體驗,安全性,WEB 標準,性能,搜索引擎優化(SEO),以及一些重要的資源。當今世界嚴重地依賴於互聯網,不少程序員都有本身的網站,一般是一個博客。這篇文章中學到的東西可能對你的專業沒有幫助,但它對你我的的事情確定會有所幫助。你會了解到一些關鍵的技術,好比 HTML,HTTP,XML,CSS,JavaScript,瀏覽器兼容性,減小網站加載時間的技巧,XML 站點地圖,W3C 規範,以及許多其它的關鍵的細節。
這對 WEB 開發人員,程序員,博主而言又是一篇很重要的文章。因爲不少程序員同時也是博主,你沒法對 SEO 視而不見,學一個搜索引擎優化的基礎知識仍是很是重要的,這能幫助 Google 檢索到你的內容並推薦給其它程序員。在今天這個網絡互聯的時代,沒有任何公司能夠脫離 WEB 而存在,SEO 變得尤其重要。若是你有一家初創企業在賣一些產品,那麼 SEO 就是你要關注的事情。全部程序員,尤爲是 WEB 開發人員,均可以從這篇文章中受益良多。記住,SEO 是一個很寬泛變化的題目,不一樣的搜索引擎,好比 Google,Yahoo 等,它們的 SEO 都各不相同。所以,要想掌握這項技能你得常常更新你的知識庫。
C 語言有一個未定義行爲的概念。未定義行爲是一個很寬泛的主題,它有許多細微的差異,這就是爲何我喜歡 Java 的一個緣由,沒有這麼多的未定義行爲,沒有這麼多的困惑,更穩定也更消停。不少人看起來很天然的事情在C裏實際上是未定義的行爲,這也是程序 BUG 的一個常見的來源。除此以外,C中的任何未定義行爲都由具體實現來決定(編譯器和運行時),它們生成的代碼會格式化你硬盤,作一些意想不到的事情,甚至更糟。讀下這篇文章,到未定義行爲的海洋裏遨遊吧。
九、程序員必知之網絡
這段話摘自這篇文章,」你是一個程序員。你有想過多玩家的遊戲是如何實現的嗎?從外面看起來它是:兩個或多個玩家經過網絡共享相同的經驗,就像他們在同一個虛擬世界中同樣。不過做爲程序員,咱們知道底下的真相和你看到的東西是有所區別的。事實上這都只是一個錯覺「。這是篇關於網絡的很是有趣的文章,它是爲遊戲開發人員而寫的,不過我認爲每一個程序開發人員都能從中受益。
這是我本身關於 java.lang.String 的一篇文章,我我的認爲每一個 Java 開發人員都應該瞭解一下。String 在平常的 Java 開發中很是重要,這就是爲何每一個 Java 程序員都應該對它很是瞭解。這篇文章涉及到了 String 的許多重要的領域,包括 String 池,字符串常量,使用==和 equals 比較字符串,將字節數組轉化成 String,爲何字符串是不可變的,如何正確拼接字符串,等等。高級程序員應該都知道這些東西了,不過回顧一下也是不錯的。
十一、程序員必知之安全
有一個計算機系的學生在 StackOverFlow 上問了這個問題。就像咱們瞭解到的一些常見編程概念好比操做系統,算法,數據結構,計算機體系結構,以及其它東西同樣,瞭解安全也一樣重要。安全是一個很大的話題,包括加密解密,SSL,WEB 安全,混淆,認證,受權,等等,它是每一個程序員都應該瞭解的基礎知識。剛進這行的時候,我我的對安全這塊還不是很瞭解,這時候我就開始基於 Servlet/JSP 寫一些的 Java WEB 程序,後來我才瞭解到 EWB 安全性以及一些安全威脅好比 SQL 注入,拒絕服務,XML 注入,跨站腳本,等等。做爲一名 Java 開發人員,我如今遵循 fortify, PMP,以及其它一些靜態代碼分析器提供的 Java 安全編碼規範進行編碼。這篇文章是關於安全這個主題的一個很好的合集,無論你如今還寫不寫代碼,這些資源對你來講都很是有用。
十二、程序員必知之延遲時間
這篇文章是一份額外的福利,但也是每一個程序員都應該讀的。無論用的是什麼語言,Java 仍是 C++ 都好,要寫出高性能的應用程序,你都得了解延遲時間的基礎常識,好比從內存中讀取一個變量須要多久,從一級緩存中讀取又須要多久,二級緩存呢,SSD 硬盤中隨機讀又須要多久,還有要是從磁盤中讀呢?互斥鎖的加鎖解鎖須要多長時間,從一個城市發送一個數據包到另外一個城市須要多長時間,在同一個數據中心又須要多久?這些延遲的數字是獨立於任何編程語言的,開發人員必需要想寫高頻低延遲的應用程序,它們是核心知識庫中的一部分。這篇文章還有一個好消息就是,它會告訴你這些年以來這些延遲時間的變化。你能夠看到 2006 年的延遲時間是多少,而如今又是多少。
這就是全部程序員必讀文章的列表。看到這些文章的標題,每一個程序員都應該知道的 XXX,你能瞭解到關於某個主題的一些比較有深度的知識。坦白說程序員有太多東西要學了,像學習 Java 語言這種只是冰山的一角,但並非全部人都有熱情去學習。寫程序是一份頗有挑戰的工做,在你的職業生涯中,能幫忙到你的就是這些基礎知識,好比,內存,Unicode,浮點數,時間,安全,這些對任何程序員來講都很是重要。有些文章是和語言相關的,好比我本身那篇關於 String 的文章,還有每一個C程序員都應該瞭解的未定義行爲,不過對於許多初學者來講學習一下也有好處。
譯註:我以爲還有一個必讀的,就是數數,這裏一共是 12 篇了...有幾篇訪問不了的,我也搬運到本身的博客上了。