作为一个Java程序员和软件开发者,我从许多『关于某某每个程序员必知』这类文章中学到了很多东西,它们会就一个特定的话题给出很多有用有深度而且难以被发现的信息。我在求知的过程中遇到过一些很有用的文章,并将它们存为书签用于日后参考和重复阅读。
个人认为所有程序员都能从中受益,这也是我写这篇文章和跟大家分享所有这些文章的原因。这些都是从我个人书签里挑出来的。你将在本文中看到每个程序员都应该知道的经典话题,诸如内存、Unicode、浮点运算、网络、面对对象设计、时间、URL编码、字符串等等。因为初学者和新手的实际经验匮乏,所以本清单对他们来说非常重要。由于大部分文章其实是从实践中来的,所以初学者和中间件编程者可以从中获得很多知识。同时在职业生涯早期获得基础知识也有助于避免犯错,这些错误其他程序员和软件开发者在他们学习过程中都已经解决过了。
尽管仅仅通过一次阅读并没那么容易就汲取这些文章中给出的知识。你可能并不能理解浮点数的一些细节,或者被内存那些微妙的细节搞得头很大,但是手头留有这些文章列表并时不时联系上下文用作参考还是非常重要的。所以祝你们好运并希望你们可以享受阅读的乐趣。同时,请记得分享其他不在这个列表中的《关于某某,每个程序员必知》的文章。
关于内存,每个程序员必知
这是一篇很经典的文章,它展示了关于内存的方方面面,老的、新的、已知的、未知的。尽管内存问题相当普遍无处不在,也并不是每个程序员都足够了解它。如果你正在写高性能应用,关于现代系统中内存的知识尤显重要。硬件设计者会遇到更多复杂的内存处理和加速技术,比如CPU缓存,但是这些在没有程序员帮助的情况下并不能得到最优性能。我还在阅读这篇文章,我也无法告诉你从中我学到了多少关于诸如RAM、CPU缓存之类的知识。L1缓存和L2缓存、不同类型的内存、DMA、内存控制器涉及和通用内存。简而言之,这是一篇所有经验层次程序员都必读的文章。
关于浮点运算的每个计算机科学家必知
浮点运算是一个很微妙的东西,且并不容易掌控。甚至很多Java程序员都不知道当使用==运算符来做float或double类型的数值比较时会出什么错。我们中的很多人在用float和double类型做货币运算时都经常搞错。本文是此类文章中另一篇佳作,也是所有软件开发者和程序员必读文章。随着经验增长,你期望了解普通问题的细节,而浮点运算就是这些细节中的一个。作为一个高级Java程序员,你必须知道怎么用float、double或是BigDecimal类做货币运算,怎么对浮点数取整,等等。即使你知道浮点运算的基础,通过阅读本文你也会学到一些新的东西。
关于Unicode的每个开发者必知
字符编码是另一个让很多程序员纠结的领域,《每个软件开发者绝对必须要无理由知道的关于Unicode和字符集的最基本常识》一文旨在填补这个领域知识的空白。附注一下,没错,这就是这篇文章完整的标题。它的作者是statckoverflow.com的创建者之一————Joel Spolsky。Joel差不多在十年前就发表了这篇博文,而今看来它仍然适用于当前情况。本文将告诉你什么是Unicode,什么是字符编码,字符是如何用字节表示的,以及其他许多许多。这篇文章最赞的部分是它的表达方式(语言和流畅性),即使你对Unicode一无所知,你也可以无障碍阅读。总之,这是一篇对所有程序员、编程者和软件工程师而言更重要的必读文章。
《关于时间,每个程序员都应了解的》(伯乐在线 2013年1月翻译)
在字符编码以外,时间和日期又是另一个让包括我自己在内的很多程序员纠结的领域。即使是高级开发者都会被GMT、UTC和夏令时,以及闰秒搞晕。坦白说,很难做到在处理时区问题时完全不犯错误,处理夏令时差以及它带来的影响同样也不容易。如果你用试错的方法时问题会更糟,因为这个办法永远无法帮你解决这个问题。有多少可能出错的地方,就有多少会发生误解的事。不管日期是否包含时区可以像地狱般把你搞混,将UNIX时间转化为其他时区会让你崩溃,从而忘记时钟同步和延时。我希望通过阅读这篇经典的文章可以消除你们对于时间的很多误解,可以打好关于时间的基础。
关于 URL 编码,每个开发者必须知道的
本文描述了一些大家对于URL编码的一般误解,在给出常见的问题及其解决方案前,先讲了HTTP的url编码。虽然本文并非针对某一具体的编程语言,它还是以Java来说明问题,并解释了如何在不同层次的Java web应用中解决URL编码的问题。你回学到URL语法基础,HTTP以及其他协议的通用URL语法。本文还阐述了URL的常见陷阱,比如字符编码、URL不同部分中的保留字符,以及URL编解码问题。如果你是一个Java程序员,你也将学会如何在Java应用中正确处理URL,如何构造URL和使用Apache CommonsHTTP客户端库。最后它还给出了最好的练习和处理URL的建议,比如应该在建URL的时候对URL编码,保证URL重写滤波器可以正确处理URL,以及其他很多很多。总之,这事一篇任何web开发者和程序员必读的文章。
关于Web开发的每个程序员必知
程序员和软件开发者必读文章。本文来自 stack exchange,是一篇每个程序员在发布站点前关于web应用需要学会的技术细节的文章。文章涉及接口设计、用户体验、安全、web标准、性能、搜索引擎优化、相关技术,还包含了一些重要资源。由于当今世界强烈依赖于互联网,程序员有个人网站和博客的现象很普遍,本文提供的经验不仅仅只对你的职业有帮助,也有助于你的私人工作。你将学到所有关键的技术,比如HTTP、HTML、XML、CSS、JavaScript、浏览器兼容性、降低网站载入时间的tips、XML地图、W3C规范和一些其他的关键细节。
关于SEO的每个程序员必知
这是另一篇对web开发者、程序员和博主来说非常重要的文章。SEO如此重要无法被忽视,因为很多程序员同时也是博客撰写者,所以学些搜索引擎优化基础来让Google搜到他们的文章并将文章展示给其他程序员很重要。在当今这个内联的世界,每个公司都必须将自己展示在网上才得以幸存,由此看来,SEO显得极其重要。如果你开办一个公司并开始销售商品,那么SEO就是你需要关心的东西。所有程序员,尤其是web开发者,都能从本文中受益良多。记住,搜索引擎优化是一个涉猎很广且变化迅速的课题,而且针对不同的搜索引擎差异很大,比如Google、Yahoo以及其他搜索引擎。所以为了掌握这门技术你将需要经常学习新知识。
关于未定义行为的每个C程序员需知
C语言有一个“未定义行为”的概念。未定义行为是一个有很多细微差别的很广泛的课题,这也是我喜欢Java语言的其中一个原因,Java的未定义行为少得多,混淆也很少,而且更加稳定和太平。C中很多看上去很合理的东西都有未定义行为,这也是程序里出bug的常见原因。此外,C中的任一未定义行为都允许实现方式(编译器和运行)来生成运行得很痛苦的代码,做一些完全不期望其发生的事,甚至更糟。这篇精彩的文章将带你在未定义行为的海洋中遨游。
关于网络,每个程序员需知
文中写道:“你是一个程序员,你是否曾想知道多人游戏是怎么运行的?这看起来似乎很神奇:两个以上的玩家通过网络分享同一段经历就像是在同一个虚拟世界里真正在一起一样。但是作为程序员,我们知道事实上发生的和看到的完全不一样。所有一切都是错觉。”
这是一篇关于网络的趣文,目标读者是游戏开发者,但我认为每个程序员和开发者都能从中受益。
关于String,每个Java开发者需知
这是我写的一篇关于java.lang.String的文章,我个人认为是每个Java程序员都需要了解的东西。String在每日的Java编程中很重要,所以任何Java开发者都必须了解这些。本文涉及了String的很多重要领域,包括string pool、string literal、用==和equals()比较String的区别、将字节转换为String、为什么String是不可变的、正确拼接String,等等。高级程序员可能已经知道所有这些情况,但是即使这样复习一下这些也是好的。
《程序员都应该了解哪些安全知识》伯乐在线 2012年3月翻译
这个问题是StackOverFlow上的一个电脑编程的学生问的。就像我们学了很多常见的编程概念(比如操作系统、算法、数据结构、计算机架构等)一样,学一下安全相关的知识也很重要。虽然安全是一个很大的课题,它涉及加密/解密、SSL、网络安全、模糊处理、身份验证、证书授权等等,一些最基本的常识对每个程序员而言都是必需的。刚开始工作的时候,我个人对安全知之甚少,当开始写基于Java web应用的Servlet/JSP的时候,才开始了解网络安全和一些类似SQL注入、拒绝服务、XML注入、跨站脚本攻击等的安全威胁。作为一个Java开发者,现在我开始跟一些fortify、PMP和其他静态代码分析工具提供的安全Java编程经验。本文是非常好的安全主题集和链接集,不管你是否在编程,你肯定可以从中受益。
《每个程序员都应知的延迟数字》
这是一篇额外奖励的文章,但也是每个程序员必读之文。无论用哪种编程语言,如Java或C++,为了写出高性能的应用程序,你都应该了解基本的耗时数问题,比如,从内存、L1缓存、L2缓存、SSD随机读、硬盘中读取变量分别需要耗费多少时长。对互斥锁加解锁需要花多长时间,城市间传输一个数据包或是同一个数据中心循环传输一次需要花多长时间。这些耗时数与编程语言无关,属于内核知识的一部分,开发者必须写出高性能低耗时的应用。这篇文章好在它还提供了这些耗时数在多年来演变的对比分析。你可以看到这些耗时数在2006年和今天分别是什么样子的。
后话
以上是所有每个程序员必读文章清单。坦白说,程序员要学的东西太多了,学习一门编程语言,如Java,仅仅是冰山一角,但我们不都对学习充满热情的吗?编程是一项很有挑战的工作,在你的整个职业生涯中唯一能帮到你的就是基础知识,如内存、Unicode、浮点数、时间、安全相关对任何程序员都很重要。很少有什么是与特定的编程语言相关的,比如我那篇关于Java String和关于未定义行为每个C程序员需要些什么的文章,但对于初学者和开发者而言仍然是很好的学习材料。
from:http://blog.jobbole.com/71723/