英文原文: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 篇了...有几篇访问不了的,我也搬运到本身的博客上了。