分类 观点 下的文章

Linus 上个月骂了一个 Linux 开发者,原因是他向 kernel 提交了一份不安全的代码。

Linus 是个 Linux 内核项目非官方的“ 仁慈的独裁者 ( benevolent dictator ) ”(LCTT译注:英国《卫报》曾将乔布斯评价为‘仁慈的独裁者’),这意味着他有权决定将哪些代码合入内核,哪些代码直接丢掉。

在10月28号,一个开源开发者提交的代码未能符合 Torvalds 的要求,于是遭来了一顿臭骂。Torvalds 在他提交的代码下评论道:“你提交的是什么东西。”

接着他说这个开发者是“毫无能力的神经病”。

Torvalds 为什么会这么生气?他觉得那段代码可以写得更有效率一点,可读性更强一点,编译器编译后跑得更好一点(编译器的作用就是将让人看的代码翻译成让电脑看的代码)。

Torvalds 重新写了一版代码将原来的那份替换掉,并建议所有开发者应该像他那种风格来写代码。

Torvalds 一直在嘲讽那些不符合他观点的人。早在1991年他就攻击过 Andrew Tanenbaum——那个 Minix 操作系统的作者,而那个 Minix 操作系统被 Torvalds 描述为“脑残”。

但是 Torvalds 在这次嘲讽中表现得更有战略性了:“我想让每个人都知道,像他这种代码是完全不能被接收的。”他说他的目的是提醒每个 Linux 开发者,而不是针对那个开发者。

Torvalds 也用这个机会强调了烂代码的安全问题。现在的企业对安全问题很重视,所以安全问题需要在开源开发者心中得到足够重视,甚至需要在代码中表现为最高等级(LCTT 译注:操作系统必须权衡许多因素:安全、处理速度、灵活性、易用性等,而这里 Torvalds 将安全提升为最高优先级了)。骂一下那些提交不安全代码的开发者可以帮助提高 Linux 系统的安全性。


via: http://thevarguy.com/open-source-application-software-companies/110415/linus-torvalds-lambasts-open-source-programmers-over-inse

作者:Christopher Tozzi 译者:bazz2 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

要记住,当一扇门在你面前关闭的时候,另一扇门就会打开。 肯·汤普森 ( Ken Thompson ) 和 丹尼斯·里奇 ( Dennis Richie ) 两个人就是这句名言很好的实例。他们俩是20世纪最优秀的信息技术专家之二,因为他们创造了最具影响力和创新性的软件之一: UNIX。

用于推广 UNIX,以车牌形式出现

(题图来自:wikimedia.org,CC BY-SA 3.0)

UNIX 系统诞生于贝尔实验室

UNIX 最开始的名字是 UNICS (UNiplexed Information and Computing Service),它有一个大家庭,并不是从石头缝里蹦出来的。UNIX的祖父是 CTSS (Compatible Time Sharing System),它的父亲是 Multics (MULTiplexed Information and Computing Service),这个系统能支持大量用户通过交互式 分时 ( timesharing ) 的方式使用大型机。

UNIX 诞生于 1969 年,由肯·汤普森以及后来加入的丹尼斯·里奇共同完成。这两位优秀的研究员和科学家在一个通用电器 GE和麻省理工学院的合作项目里工作,项目目标是开发一个叫 Multics 的交互式分时系统。

Multics 的目标是整合分时技术以及当时其他先进技术,允许用户在远程终端通过电话(拨号)登录到主机,然后可以编辑文档,阅读电子邮件,运行计算器,等等。

在之后的五年里,AT&T 公司为 Multics 项目投入了数百万美元。他们购买了 GE-645 大型机,聚集了贝尔实验室的顶级研究人员,例如肯·汤普森、 Stuart Feldman、丹尼斯·里奇、 道格拉斯·麦克罗伊 ( M. Douglas McIlroy ) 、 Joseph F. Ossanna 以及 Robert Morris。但是项目目标太过激进,进度严重滞后。最后,AT&T 高层决定放弃这个项目。

贝尔实验室的管理层决定停止这个让许多研究人员无比纠结的操作系统上的所有遗留工作。不过要感谢汤普森,里奇和一些其他研究员,他们把老板的命令丢到一边,并继续在实验室里满怀热心地忘我工作,最终孵化出前无古人后无来者的 UNIX。

UNIX 的第一声啼哭是在一台 PDP-7 微型机上,它是汤普森测试自己在操作系统设计上的点子的机器,也是汤普森和 里奇一起玩 Space and Travel 游戏的模拟器。

“我们想要的不仅是一个优秀的编程环境,而是能围绕这个系统形成团体。按我们自己的经验,通过远程访问和分时主机实现的公共计算,本质上不只是用终端输入程序代替打孔机而已,而是鼓励密切沟通。”丹尼斯·里奇说。

UNIX 是第一个靠近理想的系统,在这里程序员可以坐在机器前自由摆弄程序,探索各种可能性并随手测试。在 UNIX 整个生命周期里,它吸引了大量因其他操作系统限制而投身过来的高手做出无私贡献,因此它的功能模型一直保持上升趋势。

UNIX 在 1970 年因为 PDP-11/20 获得了首次资金注入,之后正式更名为 UNIX 并支持在 PDP-11/20 上运行。UNIX 带来的第一次用于实际场景中是在 1971 年,贝尔实验室的专利部门配备来做文字处理。

UNIX 上的 C 语言革命

丹尼斯·里奇在 1972 年发明了一种叫 “C” 的高级编程语言 ,之后他和肯·汤普森决定用 “C” 重写 UNIX 系统,来支持更好的移植性。他们在那一年里编写和调试了差不多 100,000 行代码。在迁移到 “C” 语言后,系统可移植性非常好,只需要修改一小部分机器相关的代码就可以将 UNIX 移植到其他计算机平台上。

UNIX 第一次公开露面是 1973 年丹尼斯·里奇和肯·汤普森在 操作系统原理 ( Operating Systems Principles ) 上发表的一篇论文,然后 AT&T 发布了 UNIX 系统第 5 版,并授权给教育机构使用,之后在 1975 年第一次以 $20.000 的价格授权企业使用 UNIX 第 6 版。应用最广泛的是 1980 年发布的 UNIX 第 7 版,任何人都可以购买授权,只是授权条款非常严格。授权内容包括源代码,以及用 PDP-11 汇编语言写的及其相关内核。反正,各种版本 UNIX 系统完全由它的用户手册确定。

UNIX 分支演化

UNIX 分支演化

(来自 wikipedia.org,CC BY-SA 3.0)

AIX 系统

在 1983 年,微软计划开发 Xenix 作为 MS-DOS 的多用户版继任者,他们在那一年花了 $8,000 搭建了一台拥有 512 KB 内存以及 10 MB硬盘并运行 Xenix 的 Altos 586。而到 1984 年为止,全世界 UNIX System V 第二版的安装数量已经超过了 100,000 。在 1986 年发布了包含因特网域名服务的 4.3BSD,而且 IBM 宣布 AIX 系统的安装数已经超过 250,000。AIX 基于 Unix System V 开发,这套系统拥有 BSD 风格的根文件系统,是两者的结合。

AIX 第一次引入了 日志文件系统 (JFS) 以及集成LVM( 逻辑卷管理器 ( Logical Volume Manager ) )。IBM 在 1989 年将 AIX 移植到自己的 RS/6000 平台。2001 年发布的 5L 版是一个突破性的版本,提供了 Linux 友好性以及支持 Power4 服务器的逻辑分区。

在 2004 年发布的 AIX 5.3 引入了支持APV( 高级电源虚拟化 ( Advanced Power Virtualization ) )的虚拟化技术,支持对称多线程、微分区,以及共享处理器池。

在 2007 年,IBM 同时发布 AIX 6.1 和 Power6 架构,开始加强自己的虚拟化产品。他们还将高级电源虚拟化重新包装成 PowerVM。

这次改进包括被称为 WPARs 的负载分区形式,类似于 Solaris 的 zones/Containers,但是功能更强。

HP-UX 系统

HP-UX( 惠普 UNIX ( Hewlett-Packard’s UNIX ) ) 源于 System V 第 3 版。这套系统一开始只支持 PA-RISC HP 9000 平台。HP-UX 第 1 版发布于 1984 年。

HP-UX 第 9 版引入了 SAM,一个基于字符的图形用户界面 (GUI),用户可以用来管理整个系统。在 1995 年发布的第 10 版,调整了系统文件分布以及目录结构,变得有点类似 AT&T SVR4。

第 11 版发布于 1997 年。这是 HP 第一个支持 64 位寻址的版本。不过在 2000 年重新发布成 11i,因为 HP 为特定的信息技术用途,引入了 操作环境 ( operating environments ) 和 分级应用 ( layered applications ) 的 捆绑组 ( bundled groups ) 。

在 2001 年发布的 11.20 版宣称支持 安腾 ( Itanium ) 系统。HP-UX 是第一个使用 ACLs( 访问控制列表 ( Access Control Lists ) )管理文件权限的 UNIX 系统,也是首先支持内建 逻辑卷管理器 ( Logical Volume Manager ) 的系统之一。

如今,HP-UX 因为 HP 和 Veritas 的合作关系使用了 Veritas 作为主文件系统。

HP-UX 目前的最新版本是 11iv3, update 4。

Solaris 系统

Sun 的 UNIX 版本是 Solaris,用来接替 1992 年创建的 SunOS。SunOS 一开始基于 BSD( 伯克利软件发行版 ( Berkeley Software Distribution ) )风格的 UNIX,但是 SunOS 5.0 版以及之后的版本都是基于重新包装为 Solaris 的 Unix System V 第 4 版。

SunOS 1.0 版于 1983 年发布,用于支持 Sun-1 和 Sun-2 平台。随后在 1985 年发布了 2.0 版。在 1987 年,Sun 和 AT&T 宣布合作一个项目以 SVR4 为基础将 System V 和 BSD 合并成一个版本。

Solaris 2.4 是 Sun 发布的第一个 Sparc/x86 版本。1994 年 11 月份发布的 SunOS 4.1.4 版是最后一个版本。Solaris 7 是首个 64 位 Ultra Sparc 版本,加入了对文件系统元数据记录的原生支持。

Solaris 9 发布于 2002 年,支持 Linux 特性以及 Solaris 卷管理器 ( Solaris Volume Manager ) 。之后,2005 年发布了 Solaris 10,带来许多创新,比如支持 Solaris Containers,新的 ZFS 文件系统,以及 逻辑域 ( Logical Domains ) 。

目前 Solaris 最新的版本是 第 10 版,最后的更新发布于 2008 年。 (LCTT 译注:据微信网友 @atoningfang涛 指出,Solaris 11.3#Version_history) 才是当前最新版本,发布于 2015/8/26。)

Linux

到了 1991 年,用来替代商业操作系统的 自由 ( free ) 操作系统的需求日渐高涨。因此,Linus Torvalds 开始构建一个自由的操作系统,最终成为 Linux。Linux 最开始只有一些 “C” 文件,并且使用了阻止商业发行的授权。Linux 是一个类 UNIX 系统但又不尽相同。

2015 年发布了基于 GNU Public License (GPL)授权的 3.18 版。IBM 声称有超过 1800 万行开源代码开源给开发者。

如今 GNU Public License 是应用最广泛的自由软件授权方式。根据开源软件原则,这份授权允许个人和企业自由分发、运行、通过拷贝共享、学习,以及修改软件源码。

UNIX vs. Linux:技术概要

  • Linux 鼓励多样性,Linux 的开发人员来自各种背景,有更多不同经验和意见。
  • Linux 比 UNIX 支持更多的平台和架构。
  • UNIX 商业版本的开发人员针对特定目标平台以及用户设计他们的操作系统。
  • Linux 比 UNIX 有更好的安全性,更少受病毒或恶意软件攻击。截止到现在,Linux 上大约有 60-100 种病毒,但是没有任何一种还在传播。另一方面,UNIX 上大约有 85-120 种病毒,但是其中有一些还在传播中。
  • 由于 UNIX 命令、工具和元素很少改变,甚至很多接口和命令行参数在后续 UNIX 版本中一直沿用。
  • 有些 Linux 开发项目以自愿为基础进行资助,比如 Debian。其他项目会维护一个和商业 Linux 的社区版,比如 SUSE 的 openSUSE 以及红帽的 Fedora。
  • 传统 UNIX 是纵向扩展,而另一方面 Linux 是横向扩展。

via: http://www.unixmen.com/brief-history-aix-hp-ux-solaris-bsd-linux/

作者:M.el Khamlichi 译者:zpl1025 校对:Caroline

本文由 LCTT 原创编译,Linux中国 荣誉推出

当开发人员说起世界顶级程序员时,他们的名字往往会被提及。

好像现在程序员有很多,其中不乏有许多优秀的程序员。但是哪些程序员更好呢?

虽然这很难客观评价,不过在这个话题确实是开发者们津津乐道的。ITworld 深入程序员社区,避开四溅的争执口水,试图找出可能存在的所谓共识。事实证明,屈指可数的某些名字经常是讨论的焦点。

图片来源: tom\_bullock CC BY 2.0

下面就让我们来看看这些世界顶级的程序员吧!

玛格丽特·汉密尔顿 ( Margaret Hamilton )

图片来源: NASA

成就: 阿波罗飞行控制软件背后的大脑

生平: 查尔斯·斯塔克·德雷珀实验室 ( Charles Stark Draper Laboratory ) 软件工程部的主任,以她为首的团队负责设计和打造 NASA 的阿波罗的舰载飞行控制器软件和 空间实验室 ( Skylab ) 的任务。基于阿波罗这段的工作经历,她又后续开发了 通用系统语言 ( Universal Systems Language ) 和 开发先于事实 ( Development Before the Fact ) 的范例。开创了异步软件、优先调度和超可靠的软件设计理念。被认为发明了“ 软件工程 ( software engineering ) ”一词。1986年获 奥古斯塔·埃达·洛夫莱斯奖 ( Augusta Ada Lovelace Award ) ,2003年获 NASA 杰出太空行动奖 ( Exceptional Space Act Award ) 。

评论:

“汉密尔顿发明了测试,使美国计算机工程规范了很多” —— ford\_beeblebrox

“我认为在她之前(不敬地说,包括 高德纳 ( Knuth ) 在内的)计算机编程是(另一种形式上留存的)数学分支。然而这个宇宙飞船的飞行控制系统明确地将编程带入了一个崭新的领域。” —— Dan Allen

“... 她引入了‘软件工程’这个术语 — 并作出了最好的示范。” —— David Hamilton

“真是个坏家伙” —— Drukered

唐纳德·克努斯 ( Donald Knuth ) ,即 高德纳

图片来源: vonguard CC BY-SA 2.0

成就: 《 计算机程序设计艺术 ( The Art of Computer Programming,TAOCP ) 》 作者

生平: 撰写了编程理论的权威书籍。发明了数字排版系统 Tex。1971年,ACM(美国计算机协会)葛丽丝·穆雷·霍普奖(Grace Murray Hopper Award) 的首位获奖者。1974年获 ACM 图灵奖 ( A. M. Turing ) ,1979年获 美国国家科学奖章 ( National Medal of Science ) ,1995年获 IEEE 约翰·冯·诺依曼奖章 ( John von Neumann Medal ) 。1998年入选 计算机历史博物馆 ( Computer History Museum ) 名人录 ( Hall of Fellows ) 。

评论:

“... 写的 《计算机编程艺术》 ( The Art of Computer Programming,TAOCP ) 可能是有史以来计算机编程方面最大的贡献。”—— 佚名

“唐·克努斯的 TeX 是我所用过的计算机程序中唯一一个几乎没有 bug 的。真是让人印象深刻!”—— Jaap Weel

“如果你要问我的话,我只能说太棒了!” —— Mitch Rees-Jones

肯·汤普逊 ( Ken Thompson )

图片来源: Association for Computing Machinery

成就: Unix 之父

生平:与 丹尼斯·里奇 ( Dennis Ritchie ) 共同创造了 Unix。创造了 B 语言、UTF-8 字符编码方案、ed 文本编辑器,同时也是 Go 语言的共同开发者。(和里奇)共同获得1983年的 图灵奖 ( A.M. Turing Award ) ,1994年获 IEEE 计算机先驱奖 ( IEEE Computer Pioneer Award ) ,1998年获颁 美国国家科技奖章 ( National Medal of Technology ) 。在1997年入选 计算机历史博物馆 ( Computer History Museum ) 名人录 ( Hall of Fellows ) 。

评论:

“... 可能是有史以来最能成事的程序员了。Unix 内核,Unix 工具,国际象棋程序世界冠军 Belle,Plan 9,Go 语言。” —— Pete Prokopowicz

“肯所做出的贡献,据我所知无人能及,是如此的根本、实用、经得住时间的考验,时至今日仍在使用。” —— Jan Jannink

理查德·斯托曼 ( Richard Stallman )

图片来源: Jiel Beaumadier CC BY-SA 3.0

成就: Emacs 和 GCC 缔造者

生平: 成立了 GNU 工程 ( GNU Project ) ,并创造了它的许多核心工具,如 Emacs、GCC、GDB 和 GNU Make。还创办了 自由软件基金会 ( Free Software Foundation ) 。1990年荣获 ACM 的 葛丽丝·穆雷·霍普奖 ( Grace Murray Hopper Award ) ,1998年获 EFF 先驱奖 ( EFF Pioneer Award ) .

评论:

“... 在 Symbolics 对阵 LMI 的战斗中,独自一人与一众 Lisp 黑客好手对码。” —— Srinivasan Krishnan

“通过他在编程上的精湛造诣与强大信念,开辟了一整套编程与计算机的亚文化。” —— Dan Dunay

“我可以不赞同这位伟人的很多方面,不必盖棺论定,他不可否认都已经是一位伟大的程序员了。” —— Marko Poutiainen

“试想 Linux 如果没有 GNU 工程的前期工作会怎么样。(多亏了)斯托曼的炸弹!” —— John Burnette

安德斯·海尔斯伯格 ( Anders Hejlsberg )

图片来源: D.Begley CC BY 2.0

成就: 创造了 Turbo Pascal

生平: Turbo Pascal 的原作者,是最流行的 Pascal 编译器和第一个集成开发环境。而后,领导了 Turbo Pascal 的继任者 Delphi 的构建。C# 的主要设计师和架构师。2001年荣获 Dr. Dobb 的杰出编程奖 ( Dr. Dobb's Excellence in Programming Award ) 。

评论:

“他用汇编语言为当时两个主流的 PC 操作系统(DOS 和 CPM)编写了 [Pascal] 编译器。用它来编译、链接并运行仅需几秒钟而不是几分钟。” —— Steve Wood

“我佩服他 - 他创造了我最喜欢的开发工具,陪伴着我度过了三个关键的时期直至我成为一位专业的软件工程师。” —— Stefan Kiryazov

Doug Cutting

图片来源: vonguard CC BY-SA 2.0

成就: 创造了 Lucene

生平: 开发了 Lucene 搜索引擎以及 Web 爬虫 Nutch 和用于大型数据集的分布式处理套件 Hadoop。一位强有力的开源支持者(Lucene、Nutch 以及 Hadoop 都是开源的)。前 Apache 软件基金 ( Apache Software Foundation ) 的理事。

评论:

“...他就是那个既写出了优秀搜索框架(lucene/solr),又为世界开启大数据之门(hadoop)的男人。” —— Rajesh Rao

“他在 Lucene 和 Hadoop(及其它工程)的创造/工作中为世界创造了巨大的财富和就业...” —— Amit Nithianandan

Sanjay Ghemawat

图片来源: Association for Computing Machinery

成就: 谷歌核心架构师

生平: 协助设计和实现了一些谷歌大型分布式系统的功能,包括 MapReduce、BigTable、Spanner 和 谷歌文件系统 ( Google File System ) 。创造了 Unix 的 ical 日历系统。2009年入选 美国国家工程院 ( National Academy of Engineering ) 。2012年荣获 ACM-Infosys 基金计算机科学奖 ( ACM-Infosys Foundation Award in the Computing Sciences ) 。

评论:

“Jeff Dean的僚机。” —— Ahmet Alp Balkan

Jeff Dean

图片来源: Google

成就: 谷歌搜索索引背后的大脑

生平:协助设计和实现了许多谷歌大型分布式系统的功能,包括网页爬虫,索引搜索,AdSense,MapReduce,BigTable 和 Spanner。2009年入选 美国国家工程院 ( National Academy of Engineering ) 。2012年荣获ACM 的 SIGOPS 马克·维瑟奖 ( SIGOPS Mark Weiser Award ) 及 ACM-Infosys基金计算机科学奖 ( ACM-Infosys Foundation Award in the Computing Sciences ) 。

评论:

“... 带来了在数据挖掘(GFS、MapReduce、BigTable)上的突破。” —— Natu Lauchande

“... 设计、构建并部署 MapReduce 和 BigTable,和以及数不清的其它东西” —— Erik Goldman

林纳斯·托瓦兹 ( Linus Torvalds )

图片来源: Krd CC BY-SA 4.0

成就: Linux缔造者

生平:创造了 Linux 内核与开源的版本控制系统 Git。收获了许多奖项和荣誉,包括有1998年的 EFF 先驱奖 ( EFF Pioneer Award ) ,2000年荣获 英国电脑学会 ( British Computer Society ) 授予的洛夫莱斯勋章(Lovelace Medal),2012年荣获 千禧技术奖 ( Millenium Technology Prize ) 还有2014年 IEEE计算机学会 ( IEEE Computer Society ) 授予的 计算机先驱奖 ( Computer Pioneer Award ) 。同样入选了2008年的 计算机历史博物馆 ( Computer History Museum ) 名人录 ( Hall of Fellows ) 与2012年的 互联网名人堂 ( Internet Hall of Fame ) 。

评论:

“他只用了几年的时间就写出了 Linux 内核,而 GNU Hurd(GNU 开发的内核)历经25年的开发却丝毫没有准备发布的意思。他的成就就是带来了希望。” —— Erich Ficker

“托沃兹可能是程序员的程序员。” —— Dan Allen

“他真的很棒。” —— Alok Tripathy

约翰·卡马克 ( John Carmack )

图片来源: QuakeCon CC BY 2.0

成就: 毁灭战士的缔造者

生平: ID 社联合创始人,打造了 德军总部3D ( Wolfenstein 3D ) 、 毁灭战士 ( Doom ) 和 雷神之锤 ( Quake ) 等所谓的即时 FPS 游戏。引领了 切片适配刷新 ( adaptive tile refresh ) , 二叉空间分割 ( binary space partitioning ) , 表面缓存 ( surface caching ) 等开创性的计算机图像技术。2001年入选 互动艺术与科学学会名人堂 ( Academy of Interactive Arts and Sciences Hall of Fame ) ,2007年和2008年荣获工程技术类 艾美奖 ( Emmy awards ) 并于2010年由 游戏开发者甄选奖 ( Game Developers Choice Awards ) 授予终生成就奖。

评论:

“他在写第一个渲染引擎的时候不到20岁。这家伙这是个天才。我若有他四分之一的天赋便心满意足了。” —— Alex Dolinsky

“... 德军总部3D ( Wolfenstein 3D ) 、 毁灭战士 ( Doom ) 还有 雷神之锤 ( Quake ) 在那时都是革命性的,影响了一代游戏设计师。” —— dniblock

“一个周末他几乎可以写出任何东西....” —— Greg Naughton

“他是编程界的莫扎特... ” —— Chris Morris

法布里斯·贝拉 ( Fabrice Bellard )

图片来源: Duff

成就: 创造了 QEMU

生平: 创造了一系列耳熟能详的开源软件,其中包括硬件模拟和虚拟化的平台 QEMU,用于处理多媒体数据的 FFmpeg, 微型C编译器 ( Tiny C Compiler ) 和 一个可执行文件压缩软件 LZEXE。2000年和2001年 C语言混乱代码大赛 ( Obfuscated C Code Contest ) 的获胜者并在2011年荣获 Google-O'Reilly 开源奖 ( Google-O'Reilly Open Source Award ) 。计算 Pi 最多位数的前世界纪录保持着。

评论:

“我觉得法布里斯·贝拉做的每一件事都是那么显著而又震撼。” —— raphinou

“法布里斯·贝拉是世界上最高产的程序员...” —— Pavan Yara

“他就像软件工程界的 尼古拉·特斯拉 ( Nikola Tesla ) 。” —— Michael Valladolid

“自80年代以来,他一直高产出一系列的成功作品。” —— Michael Biggins

Jon Skeet

图片来源: Craig Murphy CC BY 2.0

成就: Stack Overflow 的传说级贡献者

生平: Google 工程师, 深入解析C# ( C# in Depth ) 的作者。保持着有史以来在 Stack Overflow 上最高的声誉,平均每月解答390个问题。

评论:

“他根本不需要调试器,只要他盯一下代码,错误之处自会原形毕露。” —— Steven A. Lowe

“如果他的代码没有通过编译,那编译器应该道歉。” —— Dan Dyer

“他根本不需要什么编程规范,他的代码就是编程规范。” —— 佚名

亚当·安捷罗 ( Adam D'Angelo )

图片来源: Philip Neustrom CC BY 2.0

成就: Quora 的创办人之一

生平: 还是 Facebook 工程师时,为其搭建了 news feed 功能的基础。直至其离开并联合创始了 Quora,已经成为了 Facebook 的CTO和工程 VP。2001年以高中生的身份在 美国计算机奥林匹克 ( USA Computing Olympiad ) 上第八位完成比赛。2004年ACM 国际大学生编程大赛 ( International Collegiate Programming Contest ) 获得银牌的团队 - 加州理工学院 ( California Institute of Technology ) 的成员。2005年入围 Topcoder 大学生 算法编程挑战赛 ( Algorithm Coding Competition ) 。

评论:

“一位程序设计全才。” —— 佚名

"我做的每个好东西,他都已有了六个。" —— 马克.扎克伯格 ( Mark Zuckerberg )

Petr Mitrechev

图片来源: Facebook

成就: 有史以来最具竞技能力的程序员之一

生平: 在 国际信息学奥林匹克 ( International Olympiad in Informatics ) 中两次获得金牌(2000,2002)。在2006,赢得 Google Code Jam 同时也是TopCoder Open 算法大赛冠军。也同样,两次赢得 Facebook黑客杯 ( Facebook Hacker Cup ) (2011,2013)。写这篇文章的时候,TopCoder 榜中排第二 (即:Petr)、在 Codeforces 榜同样排第二。

评论:

“他是竞技程序员的偶像,即使在印度也是如此...” —— Kavish Dwivedi

Gennady Korotkevich

图片来源: Ishandutta2007 CC BY-SA 3.0

成就: 竞技编程小神童

生平: 国际信息学奥林匹克 ( International Olympiad in Informatics ) 中最小参赛者(11岁),6次获得金牌 (2007-2012)。2013年 ACM 国际大学生编程大赛(International Collegiate Programming Contest)获胜队伍成员及2014 Facebook 黑客杯 ( Facebook Hacker Cup ) 获胜者。写这篇文章的时候,Codeforces 榜排名第一 (即:Tourist)、TopCoder榜第一。

评论:

“一个编程神童!” —— Prateek Joshi

“Gennady 真是棒,也是为什么我在白俄罗斯拥有一个强大开发团队的例证。” —— Chris Howard

“Tourist 真是天才” —— Nuka Shrinivas Rao


via: http://www.itworld.com/article/2823547/enterprise-software/158256-superclass-14-of-the-world-s-best-living-programmers.html#slide1

作者:Phil Johnson 译者:martin2011qi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

电子邮件应用的所有界面。前两张截图展示了标签/收件箱结合的视图,最后一张截图展示了一封邮件。

电子邮件应用的所有界面。前两张截图展示了标签/收件箱结合的视图,最后一张截图展示了一封邮件。 [Ron Amadeo供图]

邮件视图是——令人惊讶的!居然是白色。安卓的电子邮件应用从历史角度来说算是个打了折扣的 Gmail 应用,你可以在这里看到紧密的联系。读邮件以及写邮件视图几乎没有任何修改地就从 Gmail 那里直接取过来使用。

即时通讯应用。截图展示了服务提供商选择界面,朋友列表,以及一个对话。

即时通讯应用。截图展示了服务提供商选择界面,朋友列表,以及一个对话。[Ron Amadeo供图]

在 Google Hangouts 之前,甚至是 Google Talk 之前,就有了“IM”——安卓1.0带来的唯一一个即时通讯客户端。令人惊奇的是,它支持多种 IM 服务:用户可以从 AIM、Google Talk、Windows Live Messenger 以及 Yahoo 中挑选。还记得操作系统开发者什么时候关心过互通性吗?

朋友列表是黑色背景界面,如果在聊天中则带有白色聊天气泡。状态用一个带颜色的圆形来指示,右侧的小安卓机器人指示出某人正在使用移动设备。IM 应用相比 Google Hangouts 远比它有沟通性,这真是十分神奇的。绿色代表着某人正在使用设备并且已经登录,黄色代表着他们登录了但处于空闲状态,红色代表他们手动设置状态为忙,不想被打扰,灰色表示离线。现在 Hangouts 只显示用户是否打开了应用。

聊天对话界面明显基于信息应用,聊天的背景从白色和蓝色被换成了白色和绿色。但是没人更改信息输入框的颜色,所以加上橙色的高亮效果,界面共使用了白色,绿色,蓝色和橙色。

安卓1.0上的YouTube。截图展示了主界面,打开菜单的主界面,分类界面,视频播放界面。

安卓1.0上的 YouTube。截图展示了主界面,打开菜单的主界面,分类界面,视频播放界面。[Ron Amadeo供图]

以 G1 的 320p 屏幕和 3G 网络速度,YouTube 可能不会有今天这样的手机上的表现,但谷歌的视频服务在安卓 1.0 上就被置入发布了。主界面看起来就像是安卓市场调整过的版本,顶部带有一个横向滚动选择部分,下面有垂直滚动分类列表。谷歌的一些分类选择还真是奇怪:“最热门”和“最多观看”有什么区别?

这是一个谷歌没有意识到 YouTube 最终能达到多庞大的标志——有一个视频分类是“最近更新”。在今天,每分钟有100 小时时长的视频上传到 Youtube 上,如果这个分类能正常工作的话,它会是一个快速滚动的视频列表,快到以至于变为一片无法阅读的模糊。

菜单含有搜索,喜爱,分类,设置。设置(没有该图片)是有史以来最简陋的,只有个清除搜索历史的选项。分类都是一样的平淡,仅仅是个黑色的文本列表。

最后一张截图展示了视频播放界面,只支持横屏模式。尽管自动隐藏的播放控制有个进度条,但它还是很奇怪地包含了后退和前进按钮。

YouTube的视频菜单,描述页面,评论。

YouTube 的视频菜单,描述页面,评论。[Ron Amadeo供图]

每个视频的更多选项可以通过点击菜单按钮来打开。在这里你可以把视频标记为“喜爱”,查看详细信息,以及阅读评论。所有的这些界面,和视频播放一样,是锁定横屏模式的。

然而“共享”不会打开一个对话框,它只是向 Gmail 邮件中加入了视频的链接。想要把链接通过短信或即时消息发送给别人是不可能的。你可以阅读评论,但是没办法评价他们或发表自己的评论。你同样无法给视频评分或赞。

相机应用的拍照界面,菜单,照片浏览模式。

相机应用的拍照界面,菜单,照片浏览模式。[Ron Amadeo供图]

在实体机上跑真正的安卓意味着相机功能可以正常运作,即便那里没什么太多可关注的。左边的黑色方块是相机的界面,原本应该显示取景器图像,但 SDK 的截图工具没办法捕捉下来。G1 有个硬件实体的拍照键(还记得吗?),所以相机没必要有个屏幕上的快门键。相机没有曝光,白平衡,或 HDR 设置——你可以拍摄照片,仅此而已。

菜单按钮显示两个选项:跳转到相册应用和带有两个选项的设置界面。第一个设置选项是是否给照片加上地理标记,第二个是在每次拍摄后显示提示菜单,你可以在上面右边看到截图。同样的,你目前还只能拍照——还不支持视频拍摄。

日历的月视图,打开菜单的周视图,日视图,以及日程。

日历的月视图,打开菜单的周视图,日视图,以及日程。[Ron Amadeo供图]

就像这个时期的大多数应用一样,日历的主命令界面是菜单。菜单用来切换视图,添加新事件,导航至当天,选择要显示的日程,以及打开设置。菜单扮演着每个单独按钮的入口的作用。

月视图不能显示约会事件的文字。每个日期旁边有个侧边,约会会显示为侧边上的绿色部分,通过位置来表示约会是在一天中的什么时候。周视图同样不能显示预约文字——G1 的 320×480 的显示屏像素还不够密——所以你会在日历中看到一个带有颜色指示条的白块。唯一一个显示文字的是日程和日视图。你可以用滑动来切换日期——左右滑动切换周和日,上下滑动切换月份和日程。

设置主界面,无线设置,关于页面的底部。

设置主界面,无线设置,关于页面的底部。[Ron Amadeo供图]

安卓 1.0 最终带来了设置界面。这个界面是个带有文字的黑白界面,粗略地分为各个部分。每个列表项边上的下箭头让人误以为点击它会展开折叠的更多东西,但是触摸列表项的任何位置只会加载下一屏幕。所有的界面看起来确实无趣,都差不多一样,但是,嘿,这可是设置啊。

任何带有开/关状态的选项都使用了卡通风格的复选框。安卓 1.0 最初的复选框真是奇怪——就算是在“未选中”状态时,它们还是有个灰色的勾选标记在里面。安卓把勾选标记当作了灯泡,打开时亮起来,关闭的时候变得黯淡,但这不是复选框的工作方式。然而我们最终还是见到了“关于”页面。安卓 1.0 运行 Linux 内核 2.6.25 版本。

设置界面意味着我们终于可以打开安全设置并更改锁屏。安卓 1.0 只有两种风格,安卓 0.9 那样的灰色方形锁屏,以及需要你在 9 个点组成的网格中画出图案的图形解锁。像这样的滑动图案相比 PIN 码更加容易记忆和输入,尽管它没有增加多少安全性。

语音拨号,图形锁屏,电池低电量警告,时间设置。

语音拨号,图形锁屏,电池低电量警告,时间设置。[Ron Amadeo供图]

语音功能和语音拨号一同来到了 1.0。这个特性以各种功能实现在 AOSP 徘徊了一段时间,然而它是一个简单的拨打号码和联系人的语音命令应用。语音拨号是个和谷歌未来的语音产品完全无关的应用,它的工作方式和非智能机上的语音拨号一样。

关于最后一个值得注意的,当电池电量低于百分之十五的时候会触发低电量弹窗。这是个有趣的图案,它把电源线错误的一端插入手机。谷歌,那可不是(现在依然不是)手机应该有的充电方式。

安卓 1.0 是个伟大的开端,但是功能上仍然有许多缺失。强制配备了实体键盘和大量硬件按钮,因为不带有十字方向键或轨迹球的安卓设备依然不被允许销售。另外,基本的智能手机功能比如自动旋转依然缺失。内置应用不可能像今天这样通过安卓市场来更新。所有的谷歌系应用和系统交织在一起。如果谷歌想要升级一个单独的应用,需要通过运营商推送整个系统的更新。安卓依然还有许多工作要做。

安卓 1.1——第一个真正的增量更新

安卓1.1的所有新特性:语音搜索,安卓市场付费应用支持,谷歌纵横,设置中的新“系统更新”选项。

安卓 1.1 的所有新特性:语音搜索,安卓市场付费应用支持,谷歌纵横,设置中的新“系统更新”选项。[Ron Amadeo供图]

安卓 1.0 发布四个半月后,2009 年 2 月,安卓在安卓 1.1 中得到了它的第一个公开更新。系统方面没有太多变化,谷歌向 1.1 中添加的新东西现如今也都已被关闭。谷歌语音搜索是安卓向云端语音搜索的第一个突击,它在应用抽屉里有自己的图标。尽管这个应用已经不能与谷歌服务器通讯,你可以在 iPhone 上看到它以前是怎么工作的。它还没有语音操作,但你可以说出想要搜索的,结果会显示在一个简单的谷歌搜索中。

安卓市场添加了对付费应用的支持,但是就像 beta 客户端中一样,这个版本的安卓市场已经不能连接 Google Play 服务器。我们最多能够看到分类界面,你可以在免费应用、付费应用和全部应用中选择。

地图添加了谷歌纵横,一个向朋友分享自己位置的方法。纵横在几个月前为了支持 Google+ 而被关闭并且不再能够工作。地图菜单里有个纵横的选项,但点击它现在只会打开一个带载入中圆圈的画面,并永远停留在这里。

安卓世界的系统更新来得更加迅速——或者至少是一条在运营商和OEM推送之前获得更新的途径——谷歌也在“关于手机”界面添加了检查系统更新按钮。


Ron Amadeo / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/7/

译者:alim0x 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

T-Mobile G1

T-Mobile G1 [T-Mobile 供图]

安卓 1.0——谷歌系 app 和实体硬件的引入

到了 2008 年 10 月,安卓 1.0 已经准备好发布,这个系统在 T-Mobile G1(又以 HTC Dream 为人周知)上初次登台。G1 进入了被 iPhone 3G 和 Nokia 1680 classic 所主宰的市场。(这些手机并列获得了 2008 年销量最佳手机称号,各自卖出了 350 万台。)G1 的具体销量数字已难以获得,但 T-Mobile 宣称截至 2009 年 4 月该设备的销量突破了 100 万台。无论从哪方面来说这在竞争中都处于落后地位。

G1 拥有单核 528Mhz 的 ARM 11 处理器,一个 Adreno 130 的 GPU,192MB 内存,以及多达 256MB 的存储空间提供给系统以及应用使用。它有一块 3.2 英寸、320x480 分辨率的显示屏,被布置在一个含有实体全键盘的滑动结构之上。所以尽管安卓软件的确走过了很长的一段路,硬件也是的。时至今日,我们可以在一个厂商提供手表中得到比这更好的参数:最新的三星智能手表拥有 512MB 内存以及 1GHz 的双核处理器。

当 iPhone 有着最少数量的按键的时候,G1 确实完全相反的,按键几乎支持每个硬件控制。它有拨通和挂断按钮,home 键,后退,以及菜单键,一个相机快门键,音量控制键,一个轨迹球,当然,还有 50 个键盘按键。未来安卓设备将会慢慢离开按键多多的界面设计,几乎每部新旗舰都在减少按键的数量。

但是这是第一次,人们见到了运行在实机上的安卓,而不是跑在一个令人沮丧的慢吞吞的模拟器上。安卓 1.0 没有 iPhone 那样顺滑流畅,闪亮耀眼,或拥有那么多的新闻报道。它也不像 Windows Mobile 6.5 那样才华横溢。但这仍然是个好的开始。

安卓1.0和0.9的默认应用列表。

安卓 1.0 和 0.9 的默认应用列表。[Ron Amadeo供图]

安卓 1.0 的核心与两个月前发布的 beta 版本相比看起来并没有什么引人注目的不同,但这个消费产品带来了不少应用,包括一套完整的谷歌系应用。日历,电子邮件,Gmail,即时通讯,市场,设置,语音拨号,以及 YouTube 都是全新登场。那时候,音乐是智能手机上占据主宰地位的媒体类型,其王者是 iTunes 音乐商店。谷歌没有自家的音乐服务,所以它选择了亚马逊并绑定了亚马逊 MP3 商店。

安卓最重要的新增内容是首次登场的谷歌商店,叫做“安卓市场 Beta”。与此同时大部分公司满足于将它们的软件目录称作各种“应用商店”——意思是一个出售应用的商店,并且只出售应用——谷歌明显有着更大的野心。它搭配了一个更为通用的名字,“安卓市场”。这个名字的想法是安卓市场不仅仅拥有应用,还拥有一切你的安卓设备所需要的东西。

第一个安卓市场客户端。截图展示了主页,“我的下载”,一个应用页面,以及一个应用权限页面。

第一个安卓市场客户端。截图展示了主页,“我的下载”,一个应用页面,以及一个应用权限页面。[Google供图]

那时候,安卓市场只提供应用和游戏,开发者们甚至还不能为它们收费。苹果的 App Store 相对与安卓市场有 4 个月的先发优势,但是谷歌的主要差异化在于安卓的商店几乎是完全开放的。在 iPhone 上,应用受制于苹果的审查,必须遵循设计和技术指南。潜在的新应用不允许在功能上复制已有应用。在安卓市场,开发者可以自由地做任何想做的,包括开发替代已有的应用。控制的缺失导致福祸相依。它允许开发者革新已有的功能,但同时意味着甚至是毫无价值的垃圾应用也被允许进入市场。

时至今日,这个安卓市场的客户端是又一个不再能够和谷歌服务器通讯的应用。幸运的是,它也是在因特网上被真正记录的为数不多的早期安卓应用之一。主页提供了通向一般区域的连接,像应用,游戏,搜索,以及下载,顶部有横向滚动显示的特色应用图标。搜索结果和“我的下载”页面以滚动列表的方式显示应用,显示应用名,开发者,费用(在那时都是免费的),以及评分。单独的应用页面展示了一个简短的描述、安装数、用户评论和评分,以及最重要的安装按钮。早期的安卓市场不支持图片,开发者唯一能使用的区域是应用描述,还有着 500 字的限制。这使得类似维护一个更新日志变的十分困难,因为只有描述的位置可以供其使用。

就在安装之前,安卓市场显示了应用所需要的权限。这是苹果直至 2012 年之前都避免做的,那年一个 iOS 应用被发现在用户不知情的情况下将完整的通讯录上传到云端。权限显示给出了一个完整的应用用到的权限列表,尽管这个版本强迫用户同意应用权限。界面有个“OK”按钮,但是除了后退按钮没有办法取消。

Gmail展示收件箱,打开菜单的收件箱。

Gmail 展示收件箱,打开菜单的收件箱。[Ron Amadeo供图]

下一个重要的应用也许就是 Gmail。大多数基本的功能此时已经准备好了。未读邮件以加粗显示,标签是个有颜色的标记。在收件箱中每封独立邮件显示着主题,发件人,以及一个会话中的回复数。Gmail 加星标志也在这里——快速点击即可给邮件加星或取消。一如往常,对于早期版本的安卓,菜单里有收件箱视图应有的所有按钮。但是,一旦打开了一封邮件,界面看起来就更加的现代了,“回复”和“转发”按钮永久固定在了屏幕底部。单独回复可以点击它们来展开和收缩。

圆角,阴影,以及气泡图标给了整个应用“卡通”的外表,但是这是个好的开始。安卓的功能第一哲学真正从此开始:Gmail 支持标签,邮件会话,搜索,以及邮件推送。

Gmail在安卓1.0的标签视图,写邮件界面,以及设置。

Gmail 在安卓 1.0 的标签视图,写邮件界面,以及设置。[Ron Amadeo 供图]

但是如果你认为 Gmail 很丑,电子邮件应用又拉低了下限。它没有分离的收件箱或文件夹视图——所有东西都糊在一个界面。应用呈现给你一个文件夹列表,点击一个文件夹会以内嵌的方式展开内容。未读邮件左侧有条绿色的线指示,这就是电子邮件应用的界面。这个应用支持 IMAP 和 POP3,但是没有 Exchange。


Ron Amadeo / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/6/

译者:alim0x 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

"相较于其它方式,我一直热衷于推崇围绕数据设计代码,我想这也是Git能够如此成功的一大原因[…]在我看来,区别程序员优劣的一大标准就在于他是否认为自己设计的代码还是数据结构更为重要。"

-- Linus Torvalds


"优秀的数据结构与简陋的代码组合远比反之的组合更好。"

-- Eric S. Raymond, The Cathedral and The Bazaar

数据结构与算法分析

学习数据结构与算法分析会让您成为一名出色的程序员。

数据结构与算法分析是一种解决问题的思维模式。 在您的个人知识库中,数据结构与算法分析的相关知识储备越多,您将越多具备应对并解决各类繁杂问题的能力。掌握了这种思维模式,您还将有能力针对新问题提出更多以前想不到的漂亮的解决方案。

您将更深入地了解,计算机如何完成各项操作。无论您是否是直接使用给定的算法,它都影响着您作出的各种技术决定。从计算机操作系统的内存分配到RDBMS的内在工作机制,以及网络协议如何实现将数据从地球的一个角落发送至另一个角落,这些大大小小的工作的完成,都离不开基础的数据结构与算法,理解并掌握它将会让您更了解计算机的运作机理。

对算法广泛深入的学习能为您储备解决方案来应对大体系的问题。之前建模困难时遇到的问题如今通常都能融合进经典的数据结构中得到很好地解决。即使是最基础的数据结构,只要对它进行足够深入的钻研,您将会发现在每天的编程任务中都能经常用到这些知识。

有了这种思维模式,在遇到磨棱两可的问题时,您将能够想出新奇的解决方案。即使最初并没有打算用数据结构与算法解决相应问题的情况,当真正用它们解决这些问题时您会发现它们将非常有用。要意识到这一点,您至少要对数据结构与算法分析的基础知识有深入直观的认识。

理论认识就讲到这里,让我们一起看看下面几个例子。

最短路径问题

我们想要开发一个软件来计算从一个国际机场出发到另一个国际机场的最短距离。假设我们受限于以下路线:

Dijkstra 算法

从这张画出机场各自之间的距离以及目的地的图中,我们如何才能找到最短距离,比方说从赫尔辛基到伦敦?Dijkstra算法是能让我们在最短的时间得到正确答案的适用算法。

在所有可能的解法中,如果您曾经遇到过这类问题,知道可以用Dijkstra算法求解,您大可不必从零开始实现它,只需知道该算法的代码库能帮助您解决相关的实现问题。

如果你深入到该算法的实现中,您将深入理解一项著名的重要图论算法。您会发现实际上该算法比较消耗资源,因此名为A*的扩展经常用于代替该算法。这个算法应用广泛,从机器人寻路的功能实现到TCP数据包路由,以及GPS寻径问题都能应用到这个算法。

先后排序问题

您想要在 开放式在线课程 ( MOOC,Massive Open Online Courses ) 平台上(如Udemy或Khan学院)学习某课程,有些课程之间彼此依赖。例如,用户学习 牛顿力学 ( Newtonian Mechanics ) 课程前必须先修 微积分 ( Calculus ) 课程,课程之间可以有多种依赖关系。用YAML表述举例如下:

# Mapping from course name to requirements
#
# If you're a physcist or a mathematicisn and you're reading this, sincere
# apologies for the completely made-up dependency tree :)
courses:
  arithmetic:         []
  algebra:            [arithmetic]
  trigonometry:       [algebra]
  calculus:           [algebra, trigonometry]
  geometry:           [algebra]
  mechanics:          [calculus, trigonometry]
  atomic_physics:     [mechanics, calculus]
  electromagnetism:   [calculus, atomic_physics]
  radioactivity:      [algebra, atomic_physics]
  astrophysics:       [radioactivity, calculus]
  quantumn_mechanics: [atomic_physics, radioactivity, calculus]

鉴于以上这些依赖关系,作为一名用户,我希望系统能帮我列出必修课列表,让我在之后可以选择任意一门课程学习。如果我选择了微积分(calculus)课程,我希望系统能返回以下列表:

arithmetic -> algebra -> trigonometry -> calculus

这里有两个潜在的重要约束条件:

  • 返回的必修课列表中,每门课都与下一门课存在依赖关系
  • 我们不希望列表中有任何重复课程

这是解决数据间依赖关系的例子,解决该问题的排序算法称作 拓扑排序算法 ( tsort,topological sort ) 。它适用于解决上述我们用YAML列出的依赖关系图的情况,以下是在图中显示的相关结果(其中箭头代表需要先修的课程):

拓扑排序算法

拓扑排序算法的实现就是从如上所示的图中找到满足各层次要求的依赖关系。因此如果我们只列出包含radioactivity和与它有依赖关系的子图,运行tsort排序,会得到如下的顺序表:

arithmetic
algebra
trigonometry
calculus
mechanics
atomic_physics
radioactivity

这符合我们上面描述的需求,用户只需选出radioactivity,就能得到在此之前所有必修课程的有序列表。

在运用该排序算法之前,我们甚至不需要深入了解算法的实现细节。一般来说,你可能选择的各种编程语言在其标准库中都会有相应的算法实现。即使最坏的情况,Unix也会默认安装tsort程序,运行man tsort 来了解该程序。

其它拓扑排序适用场合

  • 类似make的工具 可以让您声明任务之间的依赖关系,这里拓扑排序算法将从底层实现具有依赖关系的任务顺序执行的功能。
  • 具有require指令的编程语言适用于要运行当前文件需先运行另一个文件的情况。这里拓扑排序用于识别文件运行顺序以保证每个文件只加载一次,且满足所有文件间的依赖关系要求。
  • 带有甘特图的项目管理工具。甘特图能直观列出给定任务的所有依赖关系,在这些依赖关系之上能提供给用户任务完成的预估时间。我不常用到甘特图,但这些绘制甘特图的工具很可能会用到拓扑排序算法。

霍夫曼编码实现数据压缩

霍夫曼编码 ( Huffman coding ) 是一种用于无损数据压缩的编码算法。它的工作原理是先分析要压缩的数据,再为每个字符创建一个二进制编码。字符出现的越频繁,编码赋值越小。因此在一个数据集中e可能会编码为111,而x会编码为10010。创建了这种编码模式,就可以串联无定界符,也能正确地进行解码。

在gzip中使用的DEFLATE算法就结合了霍夫曼编码与LZ77一同用于实现数据压缩功能。gzip应用领域很广,特别适用于文件压缩(以.gz为扩展名的文件)以及用于数据传输中的http请求与应答。

学会实现并使用霍夫曼编码有如下益处:

  • 您会理解为什么较大的压缩文件会获得较好的整体压缩效果(如压缩的越多,压缩率也越高)。这也是SPDY协议得以推崇的原因之一:在复杂的HTTP请求/响应过程数据有更好的压缩效果。
  • 您会了解数据传输过程中如果想要压缩JavaScript/CSS文件,运行压缩软件是完全没有意义的。PNG文件也是类似,因为它们已经使用DEFLATE算法完成了压缩。
  • 如果您试图强行破译加密的信息,您可能会发现由于重复数据压缩质量更好,密文给定位的数据压缩率将帮助您确定相关的 分组密码工作模式 ( block cipher mode of operation ) 。

下一步选择学习什么是困难的

作为一名程序员应当做好持续学习的准备。为了成为一名web开发人员,您需要了解标记语言以及Ruby/Python、正则表达式、SQL、JavaScript等高级编程语言,还需要了解HTTP的工作原理,如何运行UNIX终端以及面向对象的编程艺术。您很难有效地预览到未来的职业全景,因此选择下一步要学习哪些知识是困难的。

我没有快速学习的能力,因此我不得不在时间花费上非常谨慎。我希望尽可能地学习到有持久生命力的技能,即不会在几年内就过时的技术。这意味着我也会犹豫这周是要学习JavaScript框架还是那些新的编程语言。

只要占主导地位的计算模型体系不变,我们如今使用的数据结构与算法在未来也必定会以另外的形式继续适用。您可以放心地将时间投入到深入掌握数据结构与算法知识中,它们将会成为您作为一名程序员的职业生涯中一笔长期巨大的财富。


via: http://www.happybearsoftware.com/how-learning-data-structures-and-algorithms-makes-you-a-better-developer

作者:Happy Bear 译者:icybreaker 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出