作為一個(gè)Java程序員和軟件開發(fā)者,我從許多『關(guān)于某某每個(gè)程序員必知』這類文章中學(xué)到了很多東西,它們會(huì)就一個(gè)特定的話題給出很多有用有深度而且難以被發(fā)現(xiàn)的信息。我在求知的過程中遇到過一些很有用的文章,并將它們存為書簽用于日后參考和重復(fù)閱讀。 個(gè)人認(rèn)為所有程序員都能從中受益,這也是我寫這篇文章和跟大家分享所有這些文章的原因。這些都是從我個(gè)人書簽里挑出來的。你將在本文中看到每個(gè)程序員都應(yīng)該知道的經(jīng)典話題,諸如內(nèi)存、Unicode、浮點(diǎn)運(yùn)算、網(wǎng)絡(luò)、面對(duì)對(duì)象設(shè)計(jì)、時(shí)間、URL編碼、字符串等等。因?yàn)槌鯇W(xué)者和新手的實(shí)際經(jīng)驗(yàn)匱乏,所以本清單對(duì)他們來說非常重要。由于大部分文章其實(shí)是從實(shí)踐中來的,所以初學(xué)者和中間件編程者可以從中獲得很多知識(shí)。同時(shí)在職業(yè)生涯早期獲得基礎(chǔ)知識(shí)也有助于避免犯錯(cuò),這些錯(cuò)誤其他程序員和軟件開發(fā)者在他們學(xué)習(xí)過程中都已經(jīng)解決過了。 盡管僅僅通過一次閱讀并沒那么容易就汲取這些文章中給出的知識(shí)。你可能并不能理解浮點(diǎn)數(shù)的一些細(xì)節(jié),或者被內(nèi)存那些微妙的細(xì)節(jié)搞得頭很大,但是手頭留有這些文章列表并時(shí)不時(shí)聯(lián)系上下文用作參考還是非常重要的。所以祝你們好運(yùn)并希望你們可以享受閱讀的樂趣。同時(shí),請(qǐng)記得分享其他不在這個(gè)列表中的《關(guān)于某某,每個(gè)程序員必知》的文章。 關(guān)于內(nèi)存,每個(gè)程序員必知 這是一篇很經(jīng)典的文章,它展示了關(guān)于內(nèi)存的方方面面,老的、新的、已知的、未知的。盡管內(nèi)存問題相當(dāng)普遍無處不在,也并不是每個(gè)程序員都足夠了解它。如果你正在寫高性能應(yīng)用,關(guān)于現(xiàn)代系統(tǒng)中內(nèi)存的知識(shí)尤顯重要。硬件設(shè)計(jì)者會(huì)遇到更多復(fù)雜的內(nèi)存處理和加速技術(shù),比如CPU緩存,但是這些在沒有程序員幫助的情況下并不能得到最優(yōu)性能。我還在閱讀這篇文章,我也無法告訴你從中我學(xué)到了多少關(guān)于諸如RAM、CPU緩存之類的知識(shí)。L1緩存和L2緩存、不同類型的內(nèi)存、DMA、內(nèi)存控制器涉及和通用內(nèi)存。簡(jiǎn)而言之,這是一篇所有經(jīng)驗(yàn)層次程序員都必讀的文章。 關(guān)于浮點(diǎn)運(yùn)算的每個(gè)計(jì)算機(jī)科學(xué)家必知 浮點(diǎn)運(yùn)算是一個(gè)很微妙的東西,且并不容易掌控。甚至很多Java程序員都不知道當(dāng)使用==運(yùn)算符來做float或double類型的數(shù)值比較時(shí)會(huì)出什么錯(cuò)。我們中的很多人在用float和double類型做貨幣運(yùn)算時(shí)都經(jīng)常搞錯(cuò)。本文是此類文章中另一篇佳作,也是所有軟件開發(fā)者和程序員必讀文章。隨著經(jīng)驗(yàn)增長(zhǎng),你期望了解普通問題的細(xì)節(jié),而浮點(diǎn)運(yùn)算就是這些細(xì)節(jié)中的一個(gè)。作為一個(gè)高級(jí)Java程序員,你必須知道怎么用float、double或是BigDecimal類做貨幣運(yùn)算,怎么對(duì)浮點(diǎn)數(shù)取整,等等。即使你知道浮點(diǎn)運(yùn)算的基礎(chǔ),通過閱讀本文你也會(huì)學(xué)到一些新的東西。 關(guān)于Unicode的每個(gè)開發(fā)者必知 字符編碼是另一個(gè)讓很多程序員糾結(jié)的領(lǐng)域,《每個(gè)軟件開發(fā)者絕對(duì)必須要無理由知道的關(guān)于Unicode和字符集的最基本常識(shí)》一文旨在填補(bǔ)這個(gè)領(lǐng)域知識(shí)的空白。附注一下,沒錯(cuò),這就是這篇文章完整的標(biāo)題。它的作者是statckoverflow.com的創(chuàng)建者之一————Joel Spolsky。Joel差不多在十年前就發(fā)表了這篇博文,而今看來它仍然適用于當(dāng)前情況。本文將告訴你什么是Unicode,什么是字符編碼,字符是如何用字節(jié)表示的,以及其他許多許多。這篇文章最贊的部分是它的表達(dá)方式(語言和流暢性),即使你對(duì)Unicode一無所知,你也可以無障礙閱讀??傊@是一篇對(duì)所有程序員、編程者和軟件工程師而言更重要的必讀文章。 《關(guān)于時(shí)間,每個(gè)程序員都應(yīng)了解的》(伯樂在線 2013年1月翻譯) 在字符編碼以外,時(shí)間和日期又是另一個(gè)讓包括我自己在內(nèi)的很多程序員糾結(jié)的領(lǐng)域。即使是高級(jí)開發(fā)者都會(huì)被GMT、UTC和夏令時(shí),以及閏秒搞暈。坦白說,很難做到在處理時(shí)區(qū)問題時(shí)完全不犯錯(cuò)誤,處理夏令時(shí)差以及它帶來的影響同樣也不容易。如果你用試錯(cuò)的方法時(shí)問題會(huì)更糟,因?yàn)檫@個(gè)辦法永遠(yuǎn)無法幫你解決這個(gè)問題。有多少可能出錯(cuò)的地方,就有多少會(huì)發(fā)生誤解的事。不管日期是否包含時(shí)區(qū)可以像地獄般把你搞混,將UNIX時(shí)間轉(zhuǎn)化為其他時(shí)區(qū)會(huì)讓你崩潰,從而忘記時(shí)鐘同步和延時(shí)。我希望通過閱讀這篇經(jīng)典的文章可以消除你們對(duì)于時(shí)間的很多誤解,可以打好關(guān)于時(shí)間的基礎(chǔ)。 關(guān)于 URL 編碼,每個(gè)開發(fā)者必須知道的 本文描述了一些大家對(duì)于URL編碼的一般誤解,在給出常見的問題及其解決方案前,先講了HTTP的url編碼。雖然本文并非針對(duì)某一具體的編程語言,它還是以Java來說明問題,并解釋了如何在不同層次的Java web應(yīng)用中解決URL編碼的問題。你回學(xué)到URL語法基礎(chǔ),HTTP以及其他協(xié)議的通用URL語法。本文還闡述了URL的常見陷阱,比如字符編碼、URL不同部分中的保留字符,以及URL編解碼問題。如果你是一個(gè)Java程序員,你也將學(xué)會(huì)如何在Java應(yīng)用中正確處理URL,如何構(gòu)造URL和使用Apache CommonsHTTP客戶端庫(kù)。最后它還給出了最好的練習(xí)和處理URL的建議,比如應(yīng)該在建URL的時(shí)候?qū)RL編碼,保證URL重寫濾波器可以正確處理URL,以及其他很多很多??傊?,這事一篇任何web開發(fā)者和程序員必讀的文章。 關(guān)于Web開發(fā)的每個(gè)程序員必知 程序員和軟件開發(fā)者必讀文章。本文來自 stack exchange,是一篇每個(gè)程序員在發(fā)布站點(diǎn)前關(guān)于web應(yīng)用需要學(xué)會(huì)的技術(shù)細(xì)節(jié)的文章。文章涉及接口設(shè)計(jì)、用戶體驗(yàn)、安全、web標(biāo)準(zhǔn)、性能、搜索引擎優(yōu)化、相關(guān)技術(shù),還包含了一些重要資源。由于當(dāng)今世界強(qiáng)烈依賴于互聯(lián)網(wǎng),程序員有個(gè)人網(wǎng)站和博客的現(xiàn)象很普遍,本文提供的經(jīng)驗(yàn)不僅僅只對(duì)你的職業(yè)有幫助,也有助于你的私人工作。你將學(xué)到所有關(guān)鍵的技術(shù),比如HTTP、HTML、XML、CSS、JavaScript、瀏覽器兼容性、降低網(wǎng)站載入時(shí)間的tips、XML地圖、W3C規(guī)范和一些其他的關(guān)鍵細(xì)節(jié)。 關(guān)于SEO的每個(gè)程序員必知 這是另一篇對(duì)web開發(fā)者、程序員和博主來說非常重要的文章。SEO如此重要無法被忽視,因?yàn)楹芏喑绦騿T同時(shí)也是博客撰寫者,所以學(xué)些搜索引擎優(yōu)化基礎(chǔ)來讓Google搜到他們的文章并將文章展示給其他程序員很重要。在當(dāng)今這個(gè)內(nèi)聯(lián)的世界,每個(gè)公司都必須將自己展示在網(wǎng)上才得以幸存,由此看來,SEO顯得極其重要。如果你開辦一個(gè)公司并開始銷售商品,那么SEO就是你需要關(guān)心的東西。所有程序員,尤其是web開發(fā)者,都能從本文中受益良多。記住,搜索引擎優(yōu)化是一個(gè)涉獵很廣且變化迅速的課題,而且針對(duì)不同的搜索引擎差異很大,比如Google、Yahoo以及其他搜索引擎。所以為了掌握這門技術(shù)你將需要經(jīng)常學(xué)習(xí)新知識(shí)。 關(guān)于未定義行為的每個(gè)C程序員需知 C語言有一個(gè)“未定義行為”的概念。未定義行為是一個(gè)有很多細(xì)微差別的很廣泛的課題,這也是我喜歡Java語言的其中一個(gè)原因,Java的未定義行為少得多,混淆也很少,而且更加穩(wěn)定和太平。C中很多看上去很合理的東西都有未定義行為,這也是程序里出bug的常見原因。此外,C中的任一未定義行為都允許實(shí)現(xiàn)方式(編譯器和運(yùn)行)來生成運(yùn)行得很痛苦的代碼,做一些完全不期望其發(fā)生的事,甚至更糟。這篇精彩的文章將帶你在未定義行為的海洋中遨游。 關(guān)于網(wǎng)絡(luò)的每個(gè)程序員需知 文中寫道:“你是一個(gè)程序員,你是否曾想知道多人游戲是怎么運(yùn)行的?這看起來似乎很神奇:兩個(gè)以上的玩家通過網(wǎng)絡(luò)分享同一段經(jīng)歷就像是在同一個(gè)虛擬世界里真正在一起一樣。但是作為程序員,我們知道事實(shí)上發(fā)生的和看到的完全不一樣。所有一切都是錯(cuò)覺?!?/p> 這是一篇關(guān)于網(wǎng)絡(luò)的趣文,目標(biāo)讀者是游戲開發(fā)者,但我認(rèn)為每個(gè)程序員和開發(fā)者都能從中受益。 關(guān)于String,每個(gè)Java開發(fā)者需知 這是我寫的一篇關(guān)于java.lang.String的文章,我個(gè)人認(rèn)為是每個(gè)Java程序員都需要了解的東西。String在每日的Java編程中很重要,所以任何Java開發(fā)者都必須了解這些。本文涉及了String的很多重要領(lǐng)域,包括string pool、string literal、用==和equals()比較String的區(qū)別、將字節(jié)轉(zhuǎn)換為String、為什么String是不可變的、正確拼接String,等等。高級(jí)程序員可能已經(jīng)知道所有這些情況,但是即使這樣復(fù)習(xí)一下這些也是好的。 《程序員都應(yīng)該了解哪些安全知識(shí)》伯樂在線 2012年3月翻譯 這個(gè)問題是StackOverFlow上的一個(gè)電腦編程的學(xué)生問的。就像我們學(xué)了很多常見的編程概念(比如操作系統(tǒng)、算法、數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)架構(gòu)等)一樣,學(xué)一下安全相關(guān)的知識(shí)也很重要。雖然安全是一個(gè)很大的課題,它涉及加密/解密、SSL、網(wǎng)絡(luò)安全、模糊處理、身份驗(yàn)證、證書授權(quán)等等,一些最基本的常識(shí)對(duì)每個(gè)程序員而言都是必需的。剛開始工作的時(shí)候,我個(gè)人對(duì)安全知之甚少,當(dāng)開始寫基于Java web應(yīng)用的Servlet/JSP的時(shí)候,才開始了解網(wǎng)絡(luò)安全和一些類似SQL注入、拒絕服務(wù)、XML注入、跨站腳本攻擊等的安全威脅。作為一個(gè)Java開發(fā)者,現(xiàn)在我開始跟一些fortify、PMP和其他靜態(tài)代碼分析工具提供的安全Java編程經(jīng)驗(yàn)。本文是非常好的安全主題集和鏈接集,不管你是否在編程,你肯定可以從中受益。 《每個(gè)程序員都應(yīng)知的延遲數(shù)字》 這是一篇額外獎(jiǎng)勵(lì)的文章,但也是每個(gè)程序員必讀之文。無論用哪種編程語言,如Java或C++,為了寫出高性能的應(yīng)用程序,你都應(yīng)該了解基本的耗時(shí)數(shù)問題,比如,從內(nèi)存、L1緩存、L2緩存、SSD隨機(jī)讀、硬盤中讀取變量分別需要耗費(fèi)多少時(shí)長(zhǎng)。對(duì)互斥鎖加解鎖需要花多長(zhǎng)時(shí)間,城市間傳輸一個(gè)數(shù)據(jù)包或是同一個(gè)數(shù)據(jù)中心循環(huán)傳輸一次需要花多長(zhǎng)時(shí)間。這些耗時(shí)數(shù)與編程語言無關(guān),屬于內(nèi)核知識(shí)的一部分,開發(fā)者必須寫出高性能低耗時(shí)的應(yīng)用。這篇文章好在它還提供了這些耗時(shí)數(shù)在多年來演變的對(duì)比分析。你可以看到這些耗時(shí)數(shù)在2006年和今天分別是什么樣子的。 后話 以上是所有每個(gè)程序員必讀文章清單。坦白說,程序員要學(xué)的東西太多了,學(xué)習(xí)一門編程語言,如Java,僅僅是冰山一角,但我們不都對(duì)學(xué)習(xí)充滿熱情的嗎?編程是一項(xiàng)很有挑戰(zhàn)的工作,在你的整個(gè)職業(yè)生涯中唯一能幫到你的就是基礎(chǔ)知識(shí),如內(nèi)存、Unicode、浮點(diǎn)數(shù)、時(shí)間、安全相關(guān)對(duì)任何程序員都很重要。很少有什么是與特定的編程語言相關(guān)的,比如我那篇關(guān)于Java String和關(guān)于未定義行為每個(gè)C程序員需要些什么的文章,但對(duì)于初學(xué)者和開發(fā)者而言仍然是很好的學(xué)習(xí)材料。 |
|