标签 程序员 下的文章

嘿嘿,明明你有很厉害的东西想要分享给自己的同伴,可是他们并不能理解那意味着什么,然后拿一些简单的不能再简单的事情来问你。是不是感觉好尴尬呢。看来有些事儿,分享也要看人的吧,否则表错情真的是大写的失落。


译者简介:

GHLandy —— 生活中所有欢乐与苦闷都应藏在心中,有些事儿注定无人知晓,自己也无从说起。


via: http://turnoff.us/geek/the-depressed-developer-13/

作者:Daniel Stori 译者:GHLandy 校对:wxy 合成:GHLandy 点评:GHLandy

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

消沉的程序员 1

depressed-developer

很有意思吧,很多看到这样的漫画对话的程序员,应该感觉似曾相识吧。Bug 出现了?

消沉的程序员 2

depressed-developer

有点疑惑,有好像有点眉目,好像是感觉到哪里错了,是不是要重构。

消沉的程序员 3

depressed-developer

哎,终于发现错误了,感觉有点可笑,自己居然犯这样的错误,原来是那次急于提交代码造成的。

消沉的程序员 4

depressed-developer

是啊,在编程里一生戎马,代码编写无数,各种平台、规范等等,到头来也是满身的错误啊。该是技术不行吧!

消沉的程序员 5

depressed-developer

呀,快要消除错误了,可是,不对。相信事后的 Bug 和 Debug 会是程序员生活中的一个部分。

消沉的程序员 6

depressed-developer

每个新建的工程都是有美好的设想吧,可后来为什么总是渐行渐远?大多时候的自言自语,总是有人认为是在和代码对话吧?可没有身在其中,别人又怎么懂得!

消沉的程序员 7

depressed-developer

好吧,产品的上线,总是要经过无数次的创建分支,Bug 和 Debug 总还是程序员的永恒话题。其中,有些东西总免不了自己推翻自己,感觉要从头再来一样。

消沉的程序员 10

depressed-developer

为了某项专门的研究,学习一门相关的语言,不知道是不是值得?是不是先要思考其必要性呢?最后发现自己并不喜欢这门语言,导致怀疑自己的专业技能,这样大概不好吧!

消沉的程序员 11

depressed-developer

其实,本来是愉快的蹲个坑,却不自觉的陷入编码的思考。想想,不仅是程序员,很多人有都有类似此景的情况吧,明明在做着某事,却想着另外一件事。

后记

看至此处,各位朋友是不是感觉少了系列的第 8 和第 9 篇?起初,译者也这么想,后来问了作者 Daniel Stori 之后,才恍然,原来序号采用了八进制,按照作者说的,一个隐式的玩笑。明白了吗,朋友们?

大伙儿都习惯了日常的十进制。当常态处于优先级的时候,日常一些非常态就如同细枝末节,也就往往容易被人们忽略。大概就是这样吧。


译者简介:

GHLandy —— 生活中所有欢乐与苦闷都应藏在心中,有些事儿注定无人知晓,自己也无从说起。


via:

作者:Daniel Stori 译者:GHLandy 校对:wxy

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

科技世界的探索总是让我们兴奋不已。很多科技日新月异,你探索得越深远,你看到的世界就越广阔无穷,这就像是一只驼一只的海龟一样。因此,科技世界也像宇宙一样无穷无尽。如果你也渴望加入到推动技术世界发展的社区中,你应该如何开始呢?你要做的第一步是什么?以后应该怎么做?

首先,你得明白开源指的是开放软件源代码的意思。这个很好理解,但是“开源”这个词最近一段时间经常出现在我们身边,所以估计有时候大家都忘记了开源只是用来形容一种文化现象,而不是一家世界 500 强公司的名字。跟其它公司或组织不同的是,你不用去参加面试或填个申请表、注册表的方式来成为一名开源程序员。你需要做的就是编程,然后把代码共享出来,并且完全保证在任何情况下该代码都保持开放状态。

只需要这样,你就已经成为一名开源程序员了!

现在你有了目标,那么你为之奋斗的基础能力怎么样了?

技能树

你玩过 RPG 游戏吗?在那些游戏中就有关于线性“技能树”的概念。当你玩游戏时,你掌握了基本技能后,便会“升级”,并且获得新的技能,然后你使用这些新的技能再次“升级”到一个更高的等级,你又会得到更多新的技能。通过这样不断的升级,获取新技能,以让你的游戏角色变得更强大。

成为一个程序员有点像提升你的技能树等级。你掌握了一些基础的技术,在参与开源项目开发的过程中,你不断实践,直至自己的技术等级上升到一个新的层次,之后你又懂了一些新的技术,并在项目开发过程中不断实践,不断提升技术等级,然后你再沿着这个技能树不断成长,不断进步。

你会发现自己面临的不只一棵技能树。开源软件涉及到的技术比较多,包括很多参与者自身的优势、能力及兴趣爱好等。然而,有一些非常重要的技能有助于你成为一名伟大的程序员,不断的提高这些技能是成功参与到开源项目中的重要组成部分。

脚本编程

对于像 Linux 或 BSD 系统这样的 POSIX 系统而言,最大的优势之一就是在你每次使用电脑的过程中,你都有机会练习编程。如果你不知道如何开始编程,你可以从解决工作中的一些基本问题做起。想想你日常工作中有哪些重复性的工作,你可以通过编写脚本的方式来让它们自动执行。这一步非常简单,比如说批量转换文件格式或重置图片的大小、检查邮件,甚至是通过单击运行你最常用的五个应用程序。无论是什么任务,你可以花一些时间去编写脚本以让它们自动完成。

如果有些工作需要在控制终端下操作,那么你就可以编写脚本来完成。学习 bash 或 tsch 编程,把编写系统脚本作为你写代码和理解系统的工作原理的第一步。

系统管理

从这一点来讲,你也可以转变成一个程序员,也可以整个跳到另外一个不同的技能树上:那就是系统管理工作。跟程序员比起来,这两个职业在技能上有一些相似(一个优秀的系统管理员应该有一些编程经验,并能够熟练使用 Python、Perl,或者其它类似的编程言语来解决一些独特的问题),而程序员指的是那些一直编写代码的人。

程序员

开源是学习编程技巧最好的方式:你可以查看其他人写的代码,从中借鉴他们的想法和技术,从他们的错误中学习,并跟自己写的代码进行对比以发现两者的优缺点;如果你是使用 Linux 或 BSD 操作系统,整个环境对你来说都是开放的,目之所及,随心所欲。

这就像旅游指南里所说的,随意行去。事实上你不大会去深入到一个项目的源代码中,但是如果这样的话,可以让你在某一时刻突然意识到自己会编程了。编程是一份很难的技术活,否则大家都可以从事编程工作了。

幸运的是,编程是有逻辑而结构化的,这些特性跟编程语言相关。你也许不会深入的去研究编程,但是你研究得越深,你懂的越多。

懂得如何控制以及让电脑自动执行任务是一回事,但是知道如何编写其它人想自动实现任务的代码,才能说明你已经真正进入到编程领域了。

精通多种编程语言

所有的编程语言都旨在处理相同的任务:让计算机能够完成计算工作。选择一种编程语言时你得考虑以下几个因素,学编程的目的是什么,你所做的工作最常用的编程语言是什么,你最容易理解哪一种编程语言以及你的学习方式。

随便查下相关资料,你就可以了解编程语言的复杂性了,然后再根据自己的能力水平来决定先学习哪种编程语言。

选择编程语言的另一个方式是根据你的使用目的来决定,看看你身边的同事使用哪种编程语言。如果你是为了开发桌面环境的工具,你应该学习 C 语言和 Vala 语言,或者 C++ 语言。

总之,不要在各种编程语言之间不知所措。编程语言之间都是相通的。当你学好一种编程语言并能用它来解决工作中的一些实际问题的时候,你会发现学习另外一种编程语言更容易。毕竟,编程语言只是一些语法和相关规则的集合;学会一种编程语言后,再使用同样的方法去搞懂另外一种语言完全不是个事。

主要目的还是学会一种编程语言。选择一个比较适合自己或者你感兴趣的编程语言,或者是你的朋友在用的编程语言,或者是选择文档比较丰富,并且你理解起来也容易的编程语言,但是,最好是只关注并先学会其中的一种编程语言。

这是一个开源项目吗?

无论你是编程新手还是一个老司机,在你进入到开源新世界之前,你需要搞明白做开源软件的重要一点就是“开放源代码”。

最近一些厂商惯用的市场营销策略就是宣称他们的软件是开源的。然而,有些厂商只是发布了一个公共的 API 或者表示他们愿意接受其它开源用户提交的代码而已。“开源”这个词不是一个商标,并且也没有任何组织来决定怎么使用这个词。但是, Debian Linux 创造人 Ian Murdock 联合成立的 开放源代码促进会 ( Open Source Initiative ) 对开源这个词进行了定义(授权“允许软件被用户自由地使用、随意修改及分享”),并且被正式批准和授予许可证的软件才属于真正的开源软件。

给你的软件代码应用一个开源许可证,你就成为一名开源程序员了。恭喜你!

开源社区

咨询任何开源软件爱好者,他们会告诉你开源软件最关键的是人。没有积极的开源贡献者,软件开发就会中止。计算机需要用户、提交缺陷的人、设计师及程序员。

如果你想加入全球开源社区为开源软件做贡献,你同样需要成为该社区的一个成员,即使你并不善于社交也不要紧。这通常包括订阅邮件列表、加入 IRC 频道,或者在论坛里表现活跃,从最低级别开始。任何成熟的开源社区都已经存在了足够长的时间,见惯了来来往往的人们,所以,在你真正融入这个世界、在他们接纳你之前,你需要证明出你并非流星一逝般的过客,如果你想要做成一件大事,那就得有长期投身于其中的打算。

如果你只是想给他们提供一些小的帮助,这也是可以接受的。我自己也提交一些小的补丁到一些项目中,有时候项目管理者会觉得这个更新比较好,有时候他们也会拒绝我提交的代码补丁。但是,如果这个被拒绝的补丁对我很重要,我就会为我自己和客户维护它,并一直维护下去。

这就是参与到开源项目。

但是这些社区在哪里呢?这个跟开源项目有关。有些项目有专职的社区管理员,他们会把所有的社区参与者招集到一个打大家都能访问的地方。有些项目则围绕论坛运行,他们使用邮件列表,或者使用问题追踪器与参与者联系。找到这些开源社区对你来说也不是个事儿。

还有个重要的事情就是研究他们的源代码。“开源”就是开放“源代码”,所以你可以把他们的代码拿来瞅瞅。尽管要全面了解他们的项目可能超乎你的能力,但是你可以知道这个项目是如何管理的,他们最可能需要帮助的是什么。关于代码是如何组织的?这些代码有注释吗?它们使用统一的程序风格吗?这些问题你可以查阅相关文档,尤其是 README、 LICENSE ,或者是 COPYING 这几个文件。

不要低估遵守开放源代码承诺的重要性。这是你被允许参与进来到开源项目来的原因,因此,你得深入地考虑下你能从中学习到什么,以及你将如何为该项目提供帮助。

找到最佳的开源社区更像是约妹子,尤其是更像在《偷天情缘》)里的约会。这需要时间,并且刚开始那几次有可能会失败。你参与这样的聚会越多,你就越了解这些开源项目。最后,你会更了解自己,当你找到了与其它参与者融为一体的方式时,你就已经成功了。总之,你得要有耐心,一切顺其自然。

行动比语言更重要

作为一名开源程序员最重要的是写代码(开源中的“源”),任何想法都没多少意义。关键是把你的想法变成实际的东西。你要让大家都知道你在做什么、知道你不怕苦不怕累,也愿意在开源项目上花时间,并且能够通过编程的方式来实现自己的各种想法。

为了更高效地完成那些工作,你需要对开源项目做做功课,包括项目怎么样才能听取你的建议、哪个分支是稳定的哪个是开发的等等。

从下面几点开始:

  • 熟悉一个项目及其协作开发的氛围,并且接受这种氛围。
  • 编写软件升级包、缺陷修复包,或者一些小的功能需求,并且提交它们。
  • 如果你提交的补丁被拒绝了,也不要难过。他们拒绝的不是你个人,而是开发小组在针对你提交的代码进行评估后作出的一个反馈。
  • 如果你提交的代码被改得面目全非后才被接受也不要泄气。
  • 从头再来,不断努力,再接受更大的挑战。

在开源项目中不应该开设排行榜。然而,有些开源社区却弄了个贡献排名,其实这没必要。大家只需要积极参与、奉献,贡献你的才智、提交你的代码,这样就可以了。

开发软件

编程不管在那种情况下都关乎于你自身的发展。无论你是否为了寻找解决问题的新方法,寻找优化代码的方式,学习新的编程语言,或者是学习如何更好的与其它人员合作,你都不会停止成长。你自己成长得越多,对开源项目越有帮助。

个人成长和职业技能的提升是你参与开源项目的终极目标,但是实际上这是一个贯穿整个项目的持续过程。成为一个开源程序员跟得到一份公务员工作不同;这是一个持之以恒的过程。学习、分享、再学习,或许你会去编写一个“康威生命游戏”,然后你会学到越来越多。

这就是开源的过程:自由地开发,每一行代码。因此,发现你的技能树,激发潜能,付出努力,不断提高自己的技能,并最终参与其中。

(题图素材修改自:woot.com)


作者简介:

Seth Kenlon —— Seth Kenlon 是一位独立多媒体艺术家,开源文化倡导者, Unix 极客。他还是 Slackware 多媒体产品项目的维护人员之一,官网:http://slackermedia.ml 。


via: https://opensource.com/article/17/1/how-get-started-open-source-programmer

作者:Seth Kenlon 译者:rusking 校对:Bestony, wxy

本文由 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中国 荣誉推出

"相较于其它方式,我一直热衷于推崇围绕数据设计代码,我想这也是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中国 荣誉推出

这个星期我将给本地一所高中做一次有关于程序猿是怎样工作的演讲。我是志愿(由 Transfer 组织的)来到这所学校谈论我的工作的。这个学校本周将有一个技术主题日,并且他们很想听听科技行业是怎样工作的。因为我是从事软件开发的,这也是我将和学生们讲的内容。演讲的其中一部分是我为什么觉得软件开发是一个很酷的职业。主要原因如下:

5个原因

1、创造性

如果你问别人创造性的工作有哪些,别人通常会说像作家,音乐家或者画家那样的(工作)。但是极少有人知道软件开发也是一项非常具有创造性的工作。它是最符合创造性定义的了,因为你创造了一个以前没有的新功能。这种解决方案可以在整体和细节上以很多形式来展现。我们经常会遇到一些需要做权衡的场景(比如说运行速度与内存消耗的权衡)。当然前提是这种解决方案必须是正确的。这些所有的行为都是需要强大的创造性的。

2、协作性

另外一个表象是程序猿们独自坐在他们的电脑前,然后撸一天的代码。但是软件开发事实上通常总是一个团队努力的结果。你会经常和你的同事讨论编程问题以及解决方案,并且和产品经理、测试人员、客户讨论需求以及其他问题。 经常有人说,结对编程(2个开发人员一起在一个电脑上编程)是一种流行的最佳实践。

3、高需性

世界上越来越多的人在用软件,正如 Marc Andreessen 所说 " 软件正在吞噬世界 "。虽然程序猿现在的数量非常巨大(在斯德哥尔摩,程序猿现在是 最普遍的职业 ),但是,需求量一直处于供不应求的局面。据软件公司说,他们最大的挑战之一就是 找到优秀的程序猿 。我也经常接到那些想让我跳槽的招聘人员打来的电话。我知道至少除软件行业之外的其他行业的雇主不会那么拼(的去招聘)。

4、高酬性

软件开发可以带来不菲的收入。卖一份你已经开发好的软件的额外副本是没有 边际成本 的。这个事实与对程序猿的高需求意味着收入相当可观。当然还有许多更捞金的职业,但是相比一般人群,我认为软件开发者确实“日进斗金”(知足吧!骚年~~)。

5、前瞻性

有许多工作岗位消失,往往是由于它们可以被计算机和软件代替。但是所有这些新的程序依然需要开发和维护,因此,程序猿的前景还是相当好的。

但是...

外包又是怎么一回事呢?

难道所有外包到其他国家的软件开发的薪水都很低吗?这是一个理想丰满,现实骨感的例子(有点像 瀑布开发模型 )。软件开发基本上跟设计的工作一样,是一个探索发现的工作。它受益于强有力的合作。更进一步说,特别当你的主打产品是软件的时候,你所掌握的开发知识是绝对的优势。知识在整个公司中分享的越容易,那么公司的发展也将越来越好。

换一种方式去看待这个问题。软件外包已经存在了相当一段时间了。但是对本土程序猿的需求量依旧非常高。因为许多软件公司看到了雇佣本土程序猿的带来的收益要远远超过了相对较高的成本(其实还是赚了)。

如何成为人生大赢家

虽然我有许多我认为软件开发是一件非常有趣的事情的理由 (详情见: 为什么我热爱编程 )。但是这些理由,并不适用于所有人。幸运的是,尝试编程是一件非常容易的事情。在互联网上有数不尽的学习编程的资源。例如,Coursera 和 Udacity 都拥有很好的入门课程。如果你从来没有撸过码,可以尝试其中一个免费的课程,找找感觉。

寻找一个既热爱又能谋生的事情至少有2个好处。首先,由于你天天去做,工作将比你简单的只为谋生要有趣的多。其次,如果你真的非常喜欢,你将更好的擅长它。我非常喜欢下面一副关于伟大工作组成的韦恩图(作者 @eskimon) 。因为编码的薪水确实相当不错,我认为如果你真的喜欢它,你将有一个很好的机会,成为人生的大赢家!


via: http://henrikwarne.com/2014/12/08/5-reasons-why-software-developer-is-a-great-career-choice/

作者:Henrik Warne 译者:mousycoder 校对:wxy

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