首页 > 代码库 > 每一个程序员都必须阅读的10篇文章
每一个程序员都必须阅读的10篇文章
原文:10 Atricle Every Programmer Must Read by Javin Paul
作为一名Java程序员和软件开发者,我已经从那些名为《关于XXX,每个程序员都应了解的》的文章中学了很多东西,这些文章倾向于提供许多关于某一个特定主题的实用的、有深度、难以发掘的信息。在我的学习过程中,我读到了不少非常有用的文章,我会收藏这些文章以便日后参考和再次阅读。我个人认为所有程序员可以从这些文章中获益,这也是促使我发帖,并与你们分享这些《关于XXX,每个程序员都应了解的》文章的原因。
这些文章都来自我的收藏夹。在这篇文章中,你可以读到那些非常经典的《关于XXX,每个程序员都应了解的》系列文章,主题包括内存、Unicode、浮点运算、网络、面向对象设计、时间、URL编码、字符串等等。这份文章清单对于缺乏实践经验的新手来说十分重要。正因为这些帖子就是从实践经验为出发点写的,所以初级和中级程序员可以从中学到很多东西。在职业生涯的初期就学习这些知识也可以避免其他程序员和软件开发者在他们的成长过程中所犯的错误。只通读一次很难掌握所有的知识要点。其中许多关于浮点数或内存的细节问题,你可能会感到不能理解或者困惑,但重要的是你的身边需要这样一份清单,当遇到文章中所描述的情形时,可以多次查询参考。
那么祝你们好运,好好享受阅读这些好文章的过程吧。对了,顺便说下,如果哪些《关于XXX,每个程序员都应了解的》文章不在这份清单中,不要忘了把它们拿出来分享给大家。
《关于内存,每一个程成员都应了解的》
这是经典文章中的一篇,介绍了内存的许多方面,一些比较老的东西、一些比较新的、一些已知的、一些未知的。尽管这些很常见,但不是每一个程序员都有足够的内存知识。如果你想要编写高性能的应用程序,那么当代系统中内存的知识就更为重要。硬件设计者设计了复杂的内存和加速技术——比如CPU的高速缓存——但只有在程序员的帮助下才能得到优化。直到现在我仍在阅读这篇文章,我从中学到了很多关于RAM、CPU高速缓存的知识,比如L1和L2高速缓存、不同类型的内存、直接存储器访问、存储控制器设计和通用内存。简而言之,这对任何水平的程序员来说都是一篇必读的文章。
《关于浮点运算,每一个计算机科学家都应了解的》
浮点运算是一个非常微妙的话题,一般很难精通浮点运算。甚至许多Java程序员都不知道当用==进行float/double类型对比时什么会出错。我们中的许多人经常在用float和double类型进行货币计算时犯错误。这篇文章是此系列中另一篇精品,也是所有软件开发者和程序员都必须要读的文章。当你的经验慢慢的丰富起来的时候,你就期望着能学到一些常见事物的细小方面的知识,浮点运算就是其中一种。作为高级Java开发者,你必须知道怎样用float、double或BigDecimal类实现货币计算,如何四舍五入浮点数等。即使你已经知道了浮点运算的基础知识,你仍可以从中学到些新东西。
《关于Unicode,每一个开发者都应了解的》
字符编码则是另一个令许多程序员纠结的领域,《关于Unicode和字符集,每一个软件开发者至少绝对必须要知道的(不要找任何理由,绝对是必须要知道的!)》就是要填补这一领域的空白。需要注意的是,对了,那就是文章的标题。Joel Spolsky写的这篇文章,他是statckoverflow.com的创始人之一。Joel大约十年前在他的博客里写了这篇文章,但直到今日,这篇文章仍然适用。这篇文章将教会你什么是Unicode、什么是字符编码、字符是怎样通过字节来实现显示的等等。这篇文章最棒部分是语言表达和流程图,即使对于Unicode你什么都不懂,也能很简单学会Unicode。简而言之,又是一篇所有程序员、编码员和软件工程师必须要读的文章。
《关于时间,每一个程序员都应了解的》
除了字符编码,时间和日期又是另一个令许多程序员纠结的领域,也包括我。甚至一些高级开发者都会对GMT时间、UTC时间、夏时令和闰秒感到迷惑。说实在的,仅仅是处理时区时能保证不犯错就很不容易了,更何况还要加上夏时令等其他一些影响。如果你使用试错法,问题会变得更严重,因为这么做永远解决不了你的问题。许多事情会让你犯错,还有同等数量的错误概念。比如说,日期是否包含时区,这问题将如地狱般折磨你;将UNIX时间转换成其他时区时间,这件事绝对会让你崩溃。忘了时钟同步和延时吧。我希望你能通过阅读这篇经典的文章来纠正许多关于时间的错误概念,并建立起关于时间的基础概念。
《关于URL编码,每一个网页开发者必须知道的》
这篇文章描述了关于统一资源定位符(URL)编码的一些错误概念,在提出常见问题和解决方案前,还尝试着阐明HTTP编码。这篇文章不是针对于某种编程语言的,文章举了一些Java的例子,并通过解释如何修复多个层次的Java和Web应用的URL编码问题来结束文章。你将学到URL语法的基础、HTTP等其他协议的通用URL语句。这篇文章也探寻了一些常见的URL缺陷,比如字符编码、URL不同部分的保留字符和URL编码/解码问题。如果你是一名Java程序员,那么你也可以学到如何正确处理Java应用程序中的URL、如何架构URL和使用Apache通用HTTP客户端库。文章的最后也提出了最佳范例或URL处理方式,例如,你应该在架构时就编码URL,保证你的URL重写过滤器正确的处理URL等等。简而言之,是一篇网站开发者和程序员必读的文章。
《关于网页开发,每一个程序员应了解什么?》
这是程序员堆栈交换中的一个很有趣的文章,在网站发布前,每一个程序员在实施网站应用的技术细节时应当考虑的问题。这包含了从接口设计、用户体验、安全、网页标准、性能、搜索引擎优化(SEO)、相关技术到几个相关的重要的资源。如今的世界极大程度的依赖于互联网,程序员拥有自己的网站、博客是很常见的。从这篇文章中学到的东西不会在你的专业工作上或私人工作上给予任何帮助。但你将学到所有关键技术,例如HTTP、HTML、XML、CSS、Javascript、浏览器兼容性、减少网站加载时间的小技巧、XML网站地图、W3C规格和其他一些关键细节。
《关于SEO,每一个程序员应了解的》
这是另一篇对于网页开发者、程序员和博客作者来说都非常重要的文章。SEO这个话题太大了,以致于我们无法忽略它,因为许多程序员同时也是博客作者,学习些SEO的基础知识来帮助谷歌找到他们的文章并呈现给其他程序员是非常重要的。在当今这个互联世界里没有哪个公司能脱离互谅网而继续生存,所以SEO就变得更为重要。如果你创建了自己的公司,销售任何产品,那么SEO绝对是你需要关注的东西。所有程序员,特别是网页开发者,会受益匪浅。记住,搜索引擎优化是一个巨大的且动态的主题,而且不同的搜索引擎之间也有差异,比如谷歌、雅虎等。所以为了精通SEO,你需要不断的学习新知识。
《关于未定义行为,每一个C语言程序员应了解的》
C语言有“未定义行为”的概念。未定义行为是一个非常宽泛的题目,它包含了许多微妙之处,这也是我喜欢Java的原因,更少的未定义行为、更少的困惑,更强的未定型和更多的祥和平静。在C语言里许多看似合理的事物实际上都有未定义行为,这在程序里是一个常见的bug来源。除此之外,C语言的任何未定义行为许可其实施(编译器和运行时间)产生可以格式化硬盘的代码,做一些不期望发生的事情,或者更糟。仔细阅读这篇精彩的文章,在“未定义行为”的知识的海洋里遨游吧。
《关于网络,每一个程序员需要知道的》
文章中说到:“你是个程序员。你有没有想过多人在线游戏是怎样运行的?外行人看来这简直是奇迹:两个或更多的玩家通过网络共享同一体验,就像他们真的同时存在于这个虚拟世界一样。但是作为程序员,我们知道其底层运行的真相和我们所看到的是非常不一样的。这一切都是幻觉。”这一篇非常有趣的关于网络的文章,虽然文章是写给游戏程序员的,但是我认为每个程序员和开发者都能从中受益。
《关于字符串,每一个Java开发者应该知道的》
这是一篇我写的关于java.lang.string的文章,我个人认为每一个Java程序员应当知道这些。字符串在Java日常编程工作中是非常重要的,这也是每个Java开发者都应该学习这些知识的原因。这篇文章涉及了字符串的许多重要领域,包括字符串池、字符串文字、对比==和equals()、将字节转换成字符创、为什么字符串是不可变的、正确连接字符串的方式等等。高级程序员可能已经知道这些了,那么也可以利用这篇文章好好的复习一下。
《关于安全,每一个程序员应该了解的是什么?》
这个问题是StackOverFlow上的一个计算机编程学生提出的。我们学习了很多通用编程概念,如操作系统、算法、数据结构、计算机系统结构等等,安全问题也是非常重要的。虽然安全是个非常宽泛的话题,它包含了加密/解密、SSL、网页安全、代码混淆、身份验证、授权等等,一系列程序员至少必须知道的知识。我在刚刚开始工作时不了解太多关于安全的知识,但当我开始编写基于Servlet/JSP的Java网页程序的时候,我开始接触网页安全和一些安全风险,如SQL注入攻击、拒绝服务攻击、XML注入攻击、跨站脚本等。作为Java开发者,现在我遵循fortify、PMP和其他静态代码分析提供商提供的安全Java代码实例。这篇文章是此主题和链接的很好的汇总,无论你是否在做编码工作,你绝对都能从中受益。
《每一个程序员都应知道的延迟数字》
这是篇文章是额外附送的,但是每个程序员必须要读一读。为了编写出任意语言(Java或C++)的高性能应用,你应该知道些延迟数字的基础知识,比如从内存、L1高速缓存、L2高速缓存、SSD和硬盘中读取一个变量将花费多长时间。锁住/解锁mutex、从一个城市发送一个数据包到另一个城市或一个数据中心的数据往返所需要多长时间。这些延迟数字独立于编程语言和核心知识,一个开发者必须编写出高频低延迟的应用。这个链接提供了这些延迟数字这些年演化的对比分析。你可以看到2006年这些延迟数字是什么状态,现在是什么状态。
这些就是《每个程序员必须阅读的文章》系列里的所有文章。通过阅读这些文章标题——“每个程序员或开发者应当了解的”,可以获得某个特定话题的一些比较深层次的知识。实话实说,对于程序员来说有太多的东西需要学习,而学习一门编程语言,比如Java,知识冰山一角,但我们不都是有学习激情的人吗。编程是个很有挑战性的工作,唯一可以在你的职业生涯里一直帮助你的就是基础知识,例如内存、Unicode、浮点数、时间、安全,这对于程序员来说,是非常重要的。只有部分内容是针对某个编程语言的,比如我的关于Java字符串的帖子和《关于未定义行为,每个C语言程序员应了解的》,但是这些对于新人和开发者来说,还是值得学习的。
本文经原作者许可翻译,未经许可禁止转载
每一个程序员都必须阅读的10篇文章