Skip to content Skip to main navigation Skip to footer

IT 评论

Linux:Bodhi Linux 将引入 Moksha 桌面

Linux:Bodhi Linux 将引入 Moksha 桌面
Linux:Bodhi Linux 将引入 Moksha 桌面

基于Ubuntu的轻量级Linux发行版Bodhi Linux致力于构建其自家的桌面环境,这个全新桌面环境被称之为Moksha(梵文意为‘完全自由’)。Moksha将替换其原来的Enlightenment桌面环境

为何用Moksha替换Englightenment?

Bodhi Linux的Jeff Hoogland最近表示了他对新版Enlightenment的不满。直到E17,Enlightenment都十分稳定,并且能满足轻量级Linux的部署需求。而E18则到处都充满了问题,Bodhi Linux只好弃之不用了。

虽然最新的Bodhi Linux 3.0发行版仍然使用了E19作为其桌面(除传统模式外,这意味着,对于旧的硬件,仍然会使用E17),Jeff对E19也十分不满。他说道:

除了性能问题外,对于我个人而言,E19并没有给我带来与E17下相同的工作流程,因为它移除了很多E17的特性。鉴于此,我不得不将我所有的3台Bodhi计算机桌面改成E17——这3台机器都是我高端的了。这不由得让我想到,我们还有多少现存的Bodhi用户也怀着和我同样的感受,所以,我在我们的用户论坛上开启一个与此相关的讨论

Moksha是E17桌面的延续

Moksha将会是Bodhi所热衷的E17桌面的延续。Jeff进一步提到:

我们将从整合所有Bodhi修改开始。多年来我们一直都只是给源代码打补丁,并修复桌面所带有的问题。如果该工作完成,我们将开始移植一些E18和E19引入的更为有用的特性,最后,我们将引入一些我们认为会改善最终用户体验的东西。

Moksha何时发布?

下一个Bodhi更新将会是Bodhi 3.1.0,就在今年八月。这个新版本将为所有其默认安装镜像带来Moksha。让我们拭目以待,看看Moksha是否是一个好的决定。


via: http://itsfoss.com/bodhi-linux-introduces-moksha-desktop/

作者:Abhishek 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-5510-1.html

Linux:透过性能指数看如何率先撕开在线医疗的口子

越来越多的企业意识到将应用性能管理(APM)服务引入到整个应用生命周期所带来的积极意义。通过基于云端和大数据的SaaS服务,跨越电脑、手机、平板等种类丰富的用户终端,复杂的用户网络环境,API接口和布置广泛的主机、数据库等各个节点和技术栈,全面监控企业应用的性能表现,随时掌控网络另一端的真实用户体验,云智慧的新一代面向业务的端到端应用性能管理产品正在全面渗入各个领域,帮助企业大幅降低运维成本,全面提升IT性能运维质量。

在线医疗是未来“互联网+”发展的一个重要方向,就连一贯靠后发制人的阿里、腾讯、京东等大型互联网企业都纷纷投身其中,在线医疗更加呈现井喷之势。而在这个领域迎来发展黄金期之际,已有很多在线医疗企业着眼长远,注意采用应用性能管理服务。近期,一篇名为《应用性能是在线医疗健康发展的基石》风靡网络,引发行业关注。与此同时,“好大夫”、“寻医问药”等国内著名在线医疗服务企业的IT负责人都对云智慧应用性能管理的IT和业务价值给予了肯定。

应用性能管理(APM),全称Application Performance Management,指对企业系统进行即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理是一个比较新的IT管理方向,通过对企业关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,提高企业IT投资回报率(ROI)。

据了解,目前国内进入APM领域的服务商已经将近十家,不过率先将在线医疗领域列为重点客户,并着重开拓这块市场的是云智慧。云智慧是较早涉足应用性能管理领域的国内企业,从成立之初即注意在线医疗市场的开拓,在“互联网+医疗”提出之前,云智慧就已经成功服务了春雨医生、好大夫、寻医问药等众多互联网医疗企业。按照云智慧CEO殷晋的话说,在线医疗是云智慧的重点客户之一,这个行业离不开APM的支持,而云智慧也有幸承担了这个角色。

当前,行业普遍观点认为,移动互联网时代是一个以用户体验为中心的时代,尤其是在任何企业都在拥抱移动互联网的当口,企业之间的核心竞争力实际上早已转化为用户体验之间的对决,企业应用性能的管理能力将会决定其生命周期。互联网行业专家表示,在线医疗未来市场潜力巨大,提前认识到APM应用性能管理的重要性,会让在线医疗走的更稳健。

2015年4月20日~5月19日期间, 通过云智慧监控宝平台,对30家医疗相关的网站首页进行监控,看一下在线医疗行业各个网站的性能情况:

春雨医生、好大夫、寻医问药、丁香园等在线医疗服务企业的门户网站性能表现优秀,平均响应时间在500ms以内,通过监控宝部署在全国范围内100余个监测点进行主动监控的可用率均达到100%。数据显示,当网站页面加载超过4秒,1/4的用户将面临着流失。在线医疗行业要想留住用户,必须做到网站性能的全面监控和不断优化。

云智慧CEO殷晋表示,新一代的端到端应用性能管理服务不仅仅是企业业务的重要支撑,对企业的战略层面来讲也极具价值,比如APM通过 将性能分析机制推进至企业应用的开发生命周期当中,提前帮助企业运维人员掌握应用程序在进入实际运行状态时将带来怎样的执行效果,而建立起来的关键性能指标,可以帮助管理人员实现对生产环境运作状态的有效管控。殷晋认为,企业的科学有效管理是企业生存价值的重要参考,而这也将成为企业提前实现投资回报的重要前提。

毋庸置疑,作为国内应用性能管理的领头羊,云智慧已经撕开了在线医疗领域的第一个口子。未来这个口子在在线医疗领域还会撕开多大,规模将达几何尚需持续观察。

关于云智慧

云智慧(北京)科技有限公司是国内领先的应用性能管理服务商。基于大数据分析,云智慧为企业级用户提供全面、专业的端到端的应用性能管理(End To End Application Performance Management)解决方案。云智慧通过旗下两款产品:监控宝和透视宝,已累计为电子商务、移动互联网、IaaS云服务、在线游戏、教育医疗等行业的几十万用户提供了前瞻性的智慧性能管理服务,是新一代应用性能管理(APM)的领导者。

云智慧官网http://www.cloudwise.com/

透视宝https://www.toushibao.com/

监控宝http://www.jiankongbao.com/

联系云智慧:bd@yunzhihui.com

Linux:Ubuntu将Jonathan Riddell赶出Kubuntu

Ubuntu社区理事会在没有征询Kubuntu社区理事会意见的情况下赶走了Kubuntu项目负责人Jonathan Riddell。

双方的争议似乎主要集中在Ubuntu商标保护上,Riddell反对Ubuntu的商标保护政策,视为是自由软件权利的违背,而Ubuntu则认为这是正当的。

Kubuntu理事会成员Scott Kitterman将Ubuntu理事会决定驱逐Jonathan Riddell的一系列邮件全部予以公开,并发表了一篇博文表达他的看法:“从2006年我参与Ubuntu开发起,我就知道我们有一位仁慈的独裁者(即 Mark Shuttleworth )。我不是特别喜欢,但能够理解。仁慈独裁者创造和资助了 Canonical 和Ubuntu。他的沙箱,他的规则,都很公平。直到这周我才知道(仁慈独裁者)不只一位。”

来源:http://www.solidot.org/story?sid=44221

Linux:开源中国上海源创会 第36期开始报名

去年6月14日,和上海oscer相聚玩耍很愉快,今年还是6月14日,源创会上海之行继续和大家约起!

为了营造更好的面基环境,寻找场地可谓费尽心思,最后选定了这个叫lavin玫瑰里的地方,听这名字就让人无限遐想啊,先来张现场图感受下:)

玫瑰里

有没有灰常有feel!带上女朋友和好基友一起来都灰常不错~~

时间:2015-06-14 14:00

地点: 杨浦 秦皇岛路32号E栋lavin玫瑰里(杨树浦路地铁站2号口出走3分钟)

费用:¥30/人,女士免费,积分50以上和开源软件作者免费,提供饮料和小食

类型: 源创会

注:请提前下载 OSC 手机客户端,便于现场快速扫描二维码签到。活动费用到现场再交!

回归正题,本期主题有:

0、开场

主持人: @永和 开源中国 COO

1、App Container Spec 与Rocket项目现状

分享内容: 5月份CoreOS在旧金山举行了第一次CoreOS Fest会议,Google/Redhat/VMware宣布支持Rocket容器标准,Docker标准和生态面临挑战。本次分享从生态和社区角度介绍当前容器技术的现状与发展,重点介绍App Container Spec 与Rocket项目情况和未来发展。

分享嘉宾:汪洋 @victor_os ,华为开源能力中心研究员,有十多年电信设备基础软件技术产品化经验,致力于操作系统、虚拟化、IP网络技术等开源基础软件技术研究和布道。

2、开放搜索服务架构:从系统、平台、到服务架构演变(侧重开源技术)

分享内容: 

1、 近十来年阿里搜索引擎系统架构的演变历程 2、 阿里搜索引擎技术从系统到平台、到服务化的自我进化过程 3、 2015开放搜索服务在开源领域的构想

分享嘉宾:郭瑞杰(国泊) 

阿里高级搜索研发专家,2008年博士毕业于中国科学院计算技术研究所,毕业后加入阿里巴巴,负责了阿里巴巴新一代搜索引擎平台ISearch5的设计和开发工作,新平台完成了阿里集团搜索服务的统一, 承载了阿里巴巴全集团包括神马搜索在内的主要搜索业务流量。2012年提出搜索服务化想法,并组建团队专注于开放搜索(OpenSearch)产品研发,目前OpenSearch服务于集团内部几百个搜索应用,并于2014年7月在阿里云官网作为国内首款云搜索产品对外售卖。

3、基于Ceph构建文件共享服务

分享内容:主要介绍UnitedStack基于Ceph构建的文件共享服务中的实践经验

分享嘉宾:孟圣智,UnitedStack 资深存储开发负责人,专注于分布式文件系统开发。他有多年存储系统的开发、优化、测试的经验,对于大规模分布式存储系统有深刻的洞察和理解。

4、基于SequoiaDB与Pentaho打造开源一体化BI平台

传统的BI解决方案涉及到无数昂贵的商业软件,可能无法被广大的中小企业所承受。而使用基于大数据技术的SequoiaDB作为底层,配合上层常见的开源BI工具,能够从多方位打造一体化的纯开源解决方案。本讨论介绍如何使用SequoiaDB,Spark与Pentaho BI,共同搭建一套完整的开源BI环境。

分享嘉宾:SequoiaDB(巨杉数据库)CTO 王涛,曾是DB2领域的专家,作为IBM DB2全球最高技术专家小组的成员,参与了IBM下一代大数据平台的架构规划,精通数据库内核及体系结构。在IBM多伦多实验室工作了八年后,王涛选择了回国创业,目前担任巨杉软件公司CTO及总架构师,成功研发了自主产权的NoSQL数据库——SequoiaDB(巨杉数据库)。

5、Kylin Streaming: 面向流数据的实时在线分析引擎

分享内容:Apache Kylin是来一个基于Hadoop平台的大规模在线分析引擎,Kylin使用MapReduce将用户在Hive中的数据预计算成HBase中的cube,允许查询引擎在秒级时间内完成对海量数据的分析查询。Kylin Streaming与传统的Kylin MOLAP组合形成的lambda架构,可以有效兼顾用户在实时性与查询性能方面的需求。

分享嘉宾:马洪宾,Apache Kylin committer & PMC member,主要开发者之一,主要负责查询引擎,实时流数据处理,测试用例设计以及ODBC驱动开发等。在加入Kylin之前,马洪宾在微软亚洲研究院主要负责开发了大规模分布式图数据结构之上的查询引擎(Trinity, http://www.graphengine.io)


 

OSC 源创会坚持“开源,创新”的理念,邀请不同领域的技术专家来给大家分享最新最前沿的技术,提供相互交流的机会。这些主题可能和你的工作没有任何关系,但是可以拓宽你的知识面,结交技术好友:) 

本次活动将有丰富的抽奖礼品,包括写代码完全没 Bug 的高大上机械键盘 、开源马克杯、开源内裤还有充电宝,更多的奖品正在联系中。 

来源:http://city.oschina.net/shanghai/event/236572

Linux:可以将路由器变成社交网络机器人的 Linux 蠕虫

安全公司ESET Canada Research的研究人员发现了一个取名为Linux/Moose的恶意程序。

它针对的是调制解调器、家用路由器和其它嵌入式计算机,将这些设备变成一个代理网络,用于创建伪造的社交网络账号和展开欺诈。该蠕虫还能劫持路由器的DNS服务,将DNS请求路由到一个恶意服务器,窃取未加密的社交媒体cookies,如Instagram,利用Cookie去follow虚假账户。

来源:http://www.solidot.org/story?sid=44223

能存活19年的bug不是bug——有感于微软宣布修复了一个存在了19年的安全漏洞

近日,各大网站,包括新浪、腾讯、网易、搜狐都报道了一则关于微软宣布修复了一个存在了19年的安全漏洞的新闻,以腾讯科技为例,它的标题是《微软修复已存在19年的漏洞》。对于一个软件制造界外的人来说,这是一个大快人心的消息,就跟一个隐藏了19年的纳粹分子终于被抓住的新闻一样轰动。但以程序员为职业的我,听到这样一个消息,却有一种非常不解、甚至是荒谬、搞笑的感觉。从软件生产的角度讲,如果一个bug能存活19年,那它还是个bug吗?

一、很多项目生命期不超过19年

我在很多国企开发过项目,这些项目几乎每过几年都会重新开发一回,老项目或者废弃、或者推倒重来,遇到领导换班子或上级政策方向的改变,更容易发生这种事情。事实上,有大量的软件存活不到19年,都很短命。这一方面是技术的原因,更重要的一方面是国情的因素。如果在这样的一个项目里有一个bug,当这个软件几年后被遗弃时,从来没有被人发现——更符合软件科学的说,没有给用户带来任何烦恼。这样的bug对于用户来说是不可见、不可知、根本不存在的。我们没有必要、也不应该将这样的bug称作bug,更不应该为这样的bug大惊小怪。

二、修改bug有风险

我记得有一个非常有趣的关于bug段子,说的是:

代码中有99个小bug,
99个小bug,
修复了一个,
现在,代码中的有117个小bug。

虽然是个笑话,但作为程序员,我一点都笑不出来,因为这种事情在我们项目的开发过程中经常的会遇到。由于纠正接口中一个bug而导致其它程序调用这个接口时出现了另外的问题。你可能会嘲笑说这是测试程序写的不够周全,但很多时候,复杂的软件内部关联是很难让加班加点的程序员考虑周全的。

所以,在一个复杂的软件里,特别是对于老项目,最早开发这个项目的人已经流失,而项目文档又写的不够清晰,如果一个bug不是特别严重、不影响核心业务,如果能说服客户不修改,那就优先考虑不修改,如果非要修改,那必须要深思熟虑、准备充足的测试用例,并想好回退方案,以防万一。

三、是bug?还是设计的功能特征?

之前就有一篇很好的文章指出,Bash里一个所谓的bug实际上是25年专门设计的功能,只是时过境迁,现在的使用环境发生了很大的变化,人们并没有及时的调整过去的老代码,或者现在的新环境并没有照顾过去的老接口。

所以,我们今天看到的一个愚蠢的 bug,也许在历史上的某一天,是一个有意而为之的神奇特性。我们应该思考的不仅仅是这一刻的 bug 或者安全隐患本身,而是在软件开发这个极具创新的活动中,如何有效的保证某个特意设计的功能不会变成 bug。

总之,一个19年的bug,一直默默无闻,没有被人发现、没有给用户带来麻烦、造成损失。我想,时间证明了这个bug是个善良的bug,是个好bug,我宁愿将它升级成一个功能。即使不能如此,使用用户在这些年的使用中也早就适应了这个bug,能够很好的与它和睦相处,已经不把它当成危险的敌人了。事实上,在用户的心里,它已经升级进化,蜕掉了bug的外壳。这样的bug,还是应该顺其自然,不改为好。程序员朋友们,你说呢?

原文:http://www.vaikan.com/a-19-years-old-bug/

广东程序员在加利福尼亚

作者介绍:Ryan Chen(英文名)。目前在美国圣地亚哥城工作,就职于全球著名IT公司。Ryan Chen在美国工作生活多年,本文是他对在美国当程序员的一些观察和感受。他的微博是 @奋斗中的胖胖。你还可以通过邮箱 ryan.chen623@yahoo.com和他进行交流。

站长让我介绍一下在美国当程序员的工作和生活,因为国内很多同行都好奇,国外的月亮到底圆不圆。自从毕业工作后,我就很少码文字了。前段时间忙里偷闲的功夫断断续续看了一部高智商犯罪小说,叫作《谋杀官员》,对作者的想象力深感佩服,自己也有了写点什么的冲动。小说我自然是写不出来的,那么介绍一下我个人这几年的经历以及个人的一点感悟,一家之言,权当交流吧。

第一份工作

我在美国工作4、5年了,资历浅,工作内容软硬结合,就算是嵌入式吧,并不算标准意义上的程序员。08-10年读书的时候对于经济危机,没什么直接感受,貌似事不关己,临毕业找工作时才发现,原来经济好坏对于个人也是如此的重要。也许大家都还记得几年前的经济危机,2010年我毕业,正赶上美国萧条的时候,失业率很高,很多人找不到工作。身边很多同学朋友都没找到工作,不少人被迫海归,剩下的一部分选择继续深造读博士,一部分幸运的找到工作。我深知自己不是读博士的料,选择投身业界,并幸运地拿到了一个摩托罗拉的offer。由于我电子工程硕士的硬件背景,Google,Facebook,Amazon这类的纯软件公司并不对口,抱着有枣没枣打一杆的心理试着投了一下简历,好像也电话面试了一下,就再也没有消息。而摩托的知名度还不错,离学校比较近,待遇对于一个没有什么收入的学生而言也不错,于是就欣然赴约了。

(位于芝加哥近郊的摩托罗拉总部大楼)

那个时候摩托罗拉还没有分家。我就职于芝加哥近郊的摩托罗拉总部,部门负责开发对讲机设备。部门不大,负责软件、电子、机械等大小经理一共40多人。部门里一部分是印度人,一部分是白人,包括我在内有5个中国人。大老板是个印度人,人挺不错的,鹰钩鼻,高鼻梁。开组会的时候我常常在想,他的高鼻子必然阻挡了他双眼的部分左右视线。我的直属老板是个泰国人,美国长大,业界混了十几年,技术不错,人也很不错。

刚入职的时候,由于业务不熟悉,所以折腾了一阵子。熟悉业务以后,就真心感觉日子过得很滋润。一来从穷学生摇身一变为收入不错的“中产阶级”,二是工作实在轻松。我有了收入以后第一件事就是跑去买了一辆日产Altima(大概相当于国内的天籁)。由于在大公司工作,而且有高等学历,车行给了0利率贷款的优惠。我当时的想法是赶紧把手头的2000年款丰田花冠换了,也没怎么多想就把车子买了。现在我挺后悔,因为当时不懂行情,根本没还价,我花了2万4买的车,行家其实2万不到就能买到了。两年后,我一个朋友也是花了大约2万4,买了一辆大众途观。还有一个朋友也是花了2万4,居然买了一辆奥迪A4,当然了,她老公当时在英特尔工作,有各种购车优惠而且当地还免消费税。

我的旧车卖给了一个巴基斯坦人,好像是买给他刚来美国的岳父开。其实旧车是有点毛病的,被他买去了我心里还有点愧疚,生怕他报复我。旧车我一年前大概多花了3000刀买进,一年后2950刀卖出。

(公司里有人开的玛莎拉蒂)

轻松的工作

先前说了日子很滋润,到底多滋润呢?说一下我每天的工作吧。第一天上班,我想新人要好好表现,早早起来,开车到公司的时候大概是8点半,诺大的停车场就没看到几辆车。后来找到节奏后,每天我9点起床,吃个早点,洗个澡,然后开车20分钟到公司,大概是10点。到了办公室后,第一件事去倒茶叶洗一下杯子,冲上一杯好茶。然后坐下来上上网看新闻。接下来会工作一个小时或者去开会。到了12点,拿着饭盒去公司餐厅跟一伙中国人吃饭聊天。这里插几句,美国这边,午饭其实很次要,很多美国人就是随便对付一下。中国人喜欢做饭,所以中国人一般在前一天晚上多做一点晚餐,第二天装饭盒带到公司当午饭。

摩托罗拉毕竟是一家夕阳公司,这在我加入后不久就发现了。这里的中国人都是大叔阿姨级别,鲜有年轻人。中国人大都比较精明,年轻人稍微有点追求的都不会在这样的夕阳公司久待。大叔大婶不一样,他们当年进公司的时候,摩托还没走下坡路。所以一家人在一个地方生活了这么多年,再考虑到子女的关系网和教育等,轻易不愿意动。况且摩托虽然过气,工作还是很轻松的,薪水在当地也是高于平均水平,福利也还不错。芝加哥郊区的房价也不贵,不少人房贷也还得差不多了。所以很多人基本就当在那里养老,等子女一毕业,独立了,自己就是混日子。那一天公司倒了,被解雇了也无所谓,周游世界,享受人生去了。

吃午饭聊天无非就是各种八卦,小道消息,还有就是聊小孩。哪家的小孩去MIT啦,哪家的小孩去耶鲁哈佛啦等等。华人小孩一般比较重视教育,当然了唐人街里开餐馆的例外,这里指的是上一代出国留学的华人精英。他们自己当初在国内都是天之骄子,因此比较重视子女的教育,子女一般都比较争气。一起吃饭的中国人的子女们很多都是美国名校毕业的。

听说在硅谷的中国人,要是谁家小孩没去斯坦福而去了伯克利,那是很没面子的事,万不能声张。第二代名校毕业以后,基本看不上什么谷歌,Facebook,微软之流,要么去创业公司,要不就是去金融公司,赚大钱去了。我等连伯克利都没读过的,听着自觉惭愧,叹自己不是生长在美国,不然搞不好也能上个牛校什么的,毕业创个业什么的,也不至于当个程序员挣工资了。当然,事无绝对,也不可能所有的第二代都拔尖,即便如此,这些第二代也高于平均水平,终究成为社会的精英。

午餐后回到办公室继续上网看一小会新闻,帮助消化。然后工作到了6点下班。每周两次,下午5点左右,我跟组里的一个关系不错的华人大叔去公司健身房跑步30分钟3英里,接着洗个澡下班回家。偶尔,项目很赶,也是需要大量的工作甚至加班。但平时的基本节奏很慢。大家都按部就班的,休息一下工作一下,谁也不会为了公司的利益而牺牲自己的私人时间。这里要说一下,总体而言,虽然说节奏慢,但公司的绝大多数员工,尤其是白人,还是比较敬业的,既然领了一份薪水,项目上就不能胡来。

灵活的制度

据我所知,美国的高科技大公司对于全职员工都是实行上下班灵活制,也就是说不打卡,不规定什么时候上班什么时候下班,灵活支配。由于美国的公务员周末都不上班,美国人办事就必须要在周一到周五,9点到5点之间去办。大公司的灵活制的好处在于,你随时可以请假出去办事,必要的话请半天甚至一天假都没问题。如果生病的话,也随时可以请假。这些事假病假都不算在你的年假里。请假一般就是给组里发一份邮件,告知你不在办公室的时间段就可以走了,都不用等批复。于是乎在摩托罗拉我经常会收到这样的邮件:

标题:feeling a little under the weather (天气不太好:意思是有点不舒服)
正文:Leaving now, will monitor emails if possible. (现在就下班,可能的话会查收邮件。)

或者是:

标题:In late tomorrow @12pm (明天中午12点才上班)
正文:Need to run some errands (有点私事要处理)

现在的公司也是一样的制度,有时更为简洁:

标题:OOO, feeling under the weather (离开办公室,不舒服,完)

或者是:

标题:ILT@12pm, errands (明天上午12点上班,私事,完)

需要说明一下,一般而言,人们有比较高的职业操守,绝少有人利用灵活制而偷懒故意找理由迟到早退。人还是要靠自觉嘛。

离职

在摩托工作了一年半后,由于节奏实在太慢,对个人发展前景不太好,而且公司一日不如一日,组里也开始裁人,不少新人被裁,大小老板动用各种关系,帮助外籍员工找工作。为什么只帮外籍员工呢?因为我们(主要是中国人和印度人)有身份问题,在拿到绿卡变成永久居民之前都是拿的临时工作签证,如果饭碗丢了,签证就立即失效,必须立刻离开美国。很多人的“美国梦”就是这么破灭的,突然被裁,在离职前找不到下家,就悲剧了,要卷铺盖回国,否则就变成黑户,影响以后的绿卡申请。美国公民或者有绿卡的移民就不怕这个,裁员后拿着补偿的几个月工资,跑到夏威夷逍遥一下,然后找份新工作,很容易。大老板是印度人,深知我们这些外籍员工不容易,于是托各种关系保我们。我差一点被裁掉,由于大老板给我弄了个名额,幸运地躲过了这场灾难。

经历过这一次,我觉得必须要离开,于是开始找下家,2012年初投了现在的公司,拿了offer。年中临走前两天,中国人大叔大婶大哥大姐一起吃了个饭为我饯行。临走前一天,组里的同事,大小老板,一起吃了个最后的午餐,送我走。这里要再一次感谢大小老板,为了保我们,也是费了不少的事。顺带一提,2011年初,摩托分了家,做手机的摩托移动被卖来卖去最终到了联想的手里,我所属的做基站对讲机的摩托解决方案还存在,但日子好像不太好过。

(公司附近的芝加哥街道)

在美国的印度人

中国人私底下一般把印度人称为老印,白人叫老美,黑人叫老黑,墨西哥人叫老莫,自称老中。我个人觉得这些称谓其实本身并没有太多歧视的意思,更多是咱们中国人的习惯,比如我们常常把姓李的人叫做老李。但是一些老中,心里对老印很是不满,私下叫人家三哥三姐,就是歧视了,好比叫黑人黑鬼,这不太好。客观地说,一些留美老中心理可能确实比较阴暗,原因也许有几个方面。第一,老中的英文一般不太好,而老印虽然有口音,跟老美的交流完全没问题,文化也比较接近,因此同等工作能力下,老印更容易博得老美的好感。第二,老印很活络,会搞人际关系,老中通常都是书生,不懂得人际,再加上口语不好,比较孤立。第三,老印人数众多,互助,拉帮结派,搞政治是一把好手。于是整体而言,在高科技行业,老中基本是被老印压着打,心中自然有些怨气。

在美国某知名华人BBS,头条热门帖子常常看到辱骂老印的帖子,揭露老印各种“无耻”的行为。我个人觉得,其实这无关民族。无论哪个民族,败类总是客观存在的,但不可能所有人都是坏蛋。我遇见的老印们,人都还不错,我目前的老板就是个印度人,技术过硬。组里的明星程序员(就是那种有问题就找某某某,经常一堆人围观他工作的那类),也是个老印,跟我关系不错,偶尔一起去酒吧喝酒。刚入职的时候,我业务不熟悉,都是他带我。虽然我没碰到过,但我肯定老中里其实也有不少无耻之徒,只不过这些无耻之徒通常只敢窝里斗,给自己人使坏,因此没有老印去骂他们,他们也威胁不到老印。

(安卓主管Pichai)

据说在硅谷(其实人们用得更多的是湾区而不是硅谷)的科技公司里,老印占了半壁江山。不少人都混到了高层。这可能跟印度的IT业基础扎实有关系。我没有做过调查考证,但我估计印度软件业如此发达,可能跟软件业门槛低有关系。硬件的门槛较高,做不出来就是做不出来,没有一定的基础光看几本书没法弄。而软件就不一样了,门槛极低,任何智商正常的人看几本教材,有一台电脑,都可以写程序。于是在印度政府的主导下,培养了大量的软件人才,并输送到了美国,人口优势基本快占领美国的软件业了。所以搞硬件的老印比较少,老中反而比较多,可能因为老中博士多,有真才实学。在搞学术方面,老中似乎比老印多,也许是由于老中性格大多比较内向,适合留在学校里搞学术吧。

老板A和明星员工B

很多老印是有真本事的,比如我现在的老板还有那个明星程序员。老板直属的手下就只有两个人,我和明星程序员。

A比我高两个级别,听说早年从事linux某版本的内核开发,对于操作系统十分有经验。B和我一开始都是最低级别工程师,后来先后升了一级,B比我还小两岁。他们两个人教了我不少的东西。举一个小例子,搞linux的人一般用VIM编辑器,可依然有不少人倾向选择用IDE或者是source insight这种傻瓜式编辑器。组里并不管你用什么编辑器,因此同一个项目,每个小组用的编辑器都不一样,反正最后编译的时候都是在linux上make一下。由于使用的编辑器不同,Notepad++就成了通用工具,像桥梁一样,使Pair Coding成为可能。A用VIM,明星B比我早入职,不知道他是入职后学的还是以前就会,反正他也是用VIM。我们三个人负责的是同一个模块,因此一开始VIM不熟练的我很是尴尬。常常出现这种情况:同时修改几个源程序文件,A和B写的时候都用VIM,换我写就要重新开Notepad++去编辑。如果是分开干活的时候还好说,但Pair Coding的时候麻烦就来了。所以头几周除了熟悉业务外,就是练练VIM,一直练到熟练使用VIM各种技巧。Pair coding时如果B突然需要离开一下工作电脑的时候,我可以立刻补上去继续他的工作。

会用VIM没什么值得炫耀的,而愿意去学习并使用VIM代表了不愿意待在舒适区的一种积极的态度。我不知道其他公司的人是否全部用VIM,但就我的经历,VIM用得好的人各方面水平一般不会差,而依赖IDE什么的有可能水平不太高,当然事无绝对。并不是歧视IDE本身,实际上两种工具应该要会用,我业余做iOS开发的时候,感觉离了Xcode的自动补充就没法编程(吐槽一下Objective C的繁琐语法),VIM就没有自动补充,需要额外的插件。如果VIM很牛,换了IDE就缚手缚脚那说明水平也不咋地,这种情况很少见。A和B是两样都会得,后来我也是。组里几十个人,日常用VIM写代码的就几个人。其他组也有用VIM的,大多技术水平不差。

跟VIM一样,各种常用的命令行也是必须要熟悉的。入职后我受了B不少的影响。比如说一般人倾向于把复杂的命令拷贝下来,用的时候再去从notes中找。B就不这样,他尽可能地在脑子里记住所有的命令,要用的时候信手拈来,什么sed、awk之类的,非常熟练。当然,过于复杂或者冷门的命令,他也是写在一个叫做commands.txt的文档里,放在电脑桌面,作为备忘录。受B的影响,我也强迫自己熟记各种命令,到达即用即输入的状态。并在工作中总结各种技巧,这些技巧有时候也被B瞧见借鉴过去。回头再看其他人要不时到处查找命令,在IDE繁多的菜单里找某个功能时,或者在串口控制台里需要修改一个配置文件而被迫蹩手蹩脚地使用vi时,心理多少有一点点的欣慰。我说这些可能有人会骂我,程序员世界有个鄙视链,没看过的同学可以去网上搜一下,有点意思,凸显了人性的弱点。

明星B还有一种特殊能力——不上厕所。他经常在实验室几乎一坐一整天,只在下班时急忙去一趟洗手间,然后回家。我不知道他是刻意为之还是有特异体质,反正他只要一坐下来就会入定,除非有人喊他帮忙,几个小时之内不用起身,也不怎么喝水,只偶尔喝一两杯咖啡。B是个工作狂,他的工作台就在我边上,我下班的时候,常常见他依然全神贯注的工作,丝毫没有想下班休息的意思。最近他新婚,我下班时候常常调侃让他早点回家,家里有人在等。B的能力让我想起高晓松的《鱼羊野史》,“四大名旦”之一尚小云先生有控制汗腺的能力。那个时候的戏服由于工艺和染料的原因是不能洗的,为了不弄脏戏服,大师穿上戏服上台表演几个小时内可以控制不出汗。直到下台后助手脱下戏服,全身的汗才一下子涌出来。

Full Stack

近几年流行一个说法叫做Full Stack。站长曾经建议我写一篇关于如何翻译Full Stack的文章,我应了但是一直没写,因为没想出来。这里附带发表一下我个人的见解。很多人把Full Stack翻译成“全栈”,我们觉得这样翻译太生硬。Full Stack意指对于某个业务领域,从上到下,从大到小,从巨到细,到达了通晓并且能够动手实践的程度。我思来想去,觉得可能翻译成“通才”意义上最接近,但似乎力度仍是不够,感觉通才这个说法还是太普通。各位如果有好的辞藻,不如提出来分享一下?

对于嵌入式而言,想成为Full Stack,仅仅会VIM和命令行当然是不够的。我资历浅,只说一下个人看法,抛砖引玉。窃以为作为一名优秀的嵌入式软件工程师,须不断地向软硬两个方向扩展自己的知识结构,光依赖百度谷歌临时查询是不行的。汇编和编译原理一定要懂,偶尔会遇见奇怪的编译错误,必须了解编译原理或者反编译研究一下symbols才能解决。操作系统的知识也必须具备,不然碰到了进程调度类问题可能就会束手无策。硬件知识更是多多益善,各种接口协议都需要了解一下。当然,搞嵌入式ARM是必须的,什么寄存器、cache、时钟信号之类的要了解。设计模式最好也懂一点,不然设计出来的程序也许会被人骂。算法用的很少,但是知道一些工作上还是有用武之地的,特别是资源调度的时候,属于闪光点的能力,因为大部分搞嵌入式的,算法早忘光了,如果你能够在关键时刻熟练运用,会加分的。此外还有很多,学校里学到的东西虽是重要基础,但通常都是些皮毛,真正的东西要在工作实践中慢慢地积累。除非是天才,否则不累以时日,是无法成为Full Stack的。牛人见到过一些,但目前好像还没用碰到过真正的Full Stack。像《英雄》里的刺客无名,为刺秦王,十年练剑。

在美国的老中

(路边的特斯拉,右边是常去的中餐馆。)

我所接触到的老中,各个年龄阶段的都有。有4、50岁功成名就的,也有20多岁刚出校园的,或者3、40岁正在奋斗中的。除了前面提到的在摩托养老的老中外,目前公司的40多岁的老中,来得早的,靠着自己的本事和资历,也确实有一些混得不错,总监高级总监都有。2、30岁的都是刚出校门没几年,处于事业的起步阶段。

老中的衣着和习惯挺有意思,风格迥异。其实来过美国的人都知道,一般老美穿衣不怎么讲究,或者说品味不咋地,好在美国人不像国内那样攀比,更尊重个人的选择和自由,因此即便你打扮得再糟糕,也不会有人在意。深层原因是,美国作为一个移民国家,是个大熔炉,各个国家不同宗教信仰的人聚在一起,穿着打扮上自然会大不一样,没有统一的潮流,也无法做到统一,就顺其自然了。正因为如此,不同时期出国的老中,保留了不同时期的审美观,穿着打扮和生活习惯上也大致停留在出国时候的样子。譬如,有一次我见到一个出过多年的老中从口袋里掏出手帕擤鼻涕。手帕这东西貌似还是我孩童时期有人用,现在国内都用纸巾了吧,还有人用手帕吗?想必他出国的时候国内还是用手帕的。

(2014感恩节去Mammoth Mountain滑雪)

老中们的业余生活挺丰富,有人爱好摄影,大晚上跑到荒郊野岭里拍星轨。有人热爱钓鱼,时不时海钓一下,收货颇丰。有人喜欢远足露营,一有时间就全美各个国家公园里到处跑。还有人喜欢滑雪,到了雪季就一家老小上山滑雪。这些都是健康高雅的。俗一点的,一有时间就跑到赌城拉斯维加斯看表演,似乎没其他的地方可以去。美国的大自然很精彩,然而人文精神的东西比较匮乏。老美年轻人晚上动不动就是开party,去酒吧喝酒,老中放不开,一般玩不了这个。所以老中到了晚上都窝在家里看电视上网,有些人负面的东西看多了,又无处发泄,久而久之心理就出了毛病。

这几年国内发展势头迅猛,许多老中都动了回国的念头,极少的人下定决心海归,大多数人仍在踟蹰中。回国的原因只有一个:发展。许多早些时候出国留学的老中在国内的同学如今都混得有头有脸,自己心里不免有点酸,认为如果自己当初不出国,也能混得那般样子。有了许多海归成功的榜样,不少年轻人看到了新的发展机遇,于是放弃美国的高薪,毅然回国创业,最后也混得不错。不回国的原因有很多:环境,食品安全,子女的教育,美国的大房好车等等。一些人每日在回与不回之间犹犹豫豫,见面必谈回国,变成了祥林嫂,熬到最后年龄大了,有心无力。

(加州圣地亚哥价值140万的学区房)

稍微提一下房子。中国人喜欢买房,尤好大房子。跟国内一样,美国的房价跟地域和学区好坏是正相关。加州的房价高于全国平均水平。比如说同样条件的房子,在芝加哥要80万,圣地亚哥可能要140万,湾区可能要2、300万,然而收入水平却没差这么远,因此在美国买房的压力山大。前面说了老中重视子女的教育,所以宁缩衣节食也要把家安在好学区里,这样子女可以到好的公立学校里读书。40多岁的老中,如果是双职工的话,在经济上应该能够在好的学区按揭一栋大别墅,有眼光爱折腾的甚至还有几套投资房。等到子女毕业了,把大房子一卖,换个学区不好但环境好的地方安家,倒也不错。2、30岁的年轻人,大多数刚脱贫,租房子,少数有眼光有经济实力的也买几十万的小房子自住或者投资。

我见到的韩国人

由于业务的关系,公司有很多韩国人。韩国人的天然长相和后天气质,真的是很韩国,基本不存在把韩国人和中国人混淆的情况。韩国人男的头发基本梳得整整齐齐,女的长发也很是打理了一下。老中男的则普遍短发,女的长发,但不怎么打理。韩国人穿着比较整洁时髦,老中的打扮嘛,就不多说了,不少人头发流油。韩国人等级比较分明,讲辈分,在美国的华人一般不讲究这个。如果说老中见面是点头,那么韩国人见面就是哈腰了。有一次我跟一个韩国人在电梯里,进来另一个韩国人,电梯里的那个韩国人突然向着电梯门30度鞠了一个躬,还喊了一句:“哎!阿尼阿萨哟!” 愣是把我吓一跳。

韩国男人普遍抽烟,经常三五成群地搭电梯到楼外一角指定的吸烟处抽烟聊天。美国人也抽,但很少。多年以前,美国人也是普遍抽烟的,就像在年代剧里看到的那样。后来美国人也许是害怕癌症,所以整个社会就开始反对抽烟,公共场所禁烟,因此很多40多岁的人从不抽烟。当今的中国,在很多方面其实在走美国的老路,禁烟的问题上可能跟也美国差了一两代人。也许哪一天中国社会也开始反对抽烟,再经过一两代人,抽烟的人就不那么普遍了。跟公司的韩国人打交道甚少,了解不多。

说一点励志的

大约一年前跟同事在公司附近的馆子里吃午饭,结识一个牛人,是个越南籍的华人,年纪50有余,精神抖擞。我向他求道,他跟我讲自己是如何从越南跑到MIT读书的。他在越南长大,读高中的时候看上了一位美女同学,但是美女的母亲看不上他。于是他找到这位母亲,直截了当地问到底怎样才会把女儿嫁给他。母亲可能看琼瑶看多了,随口说,除非你去到MIT拿个学位回来。其实他们当时根本不知道MIT是什么,牛人满口答应。回家一查,哇,MIT这么难(这是他的原话)!但他没放弃,开始发奋学英语,背字典。最终还是没能申请到MIT,而去了德州州立大学。在德州读了3年,拿了本科,然后申请到了MIT,接着去MIT读了硕士博士。毕业后创业开了公司,把公司卖了后加入当时如日中天的一家高科技公司,在那里混到了中高层,还读了斯坦福的MBA。去年和新来的顶头上司不和,一怒之下辞职来了我们公司。当然,美女最后是娶回家了。完美。

牛人说,前不久,他有个原手下请他帮忙推荐工作。他于是就托关系找了一家硅谷小公司。但那个手下很犹豫,第一要搬家,第二小公司未来不明朗,第三专业不是太对口。他鼓励手下说既然都联系好了就去试一下。于是手下去面试并通过收到了offer,但是牵涉到跨州搬家,手下犹豫再三,还是没有赴任。没过多久那公司被谷歌收购了,32亿美金,就是NEST。手下因为没去损失了价值好几百万美金的股票期权。

(甄珍和谢贤)

牛人问我们,知道甑珍吗?当年红遍东南亚的大美女,红到没人敢追。后来被谁追到了?谢贤!谢贤当年什么都不是,别人不敢追甄珍,只有他一个人死皮赖脸地追,结果追到了。

牛人总结,做事之前,不要太犹豫,担心自己不行,行不行要做了以后才知道。

我问他认识李开复不,他哼了一声,说自己一般不评价老中。最后他推荐我看《高效人士的7个习惯》。我回去立刻找来看了一遍。欣然告之,复曰,多看几遍。

他是狂妄,但他有狂妄的资本,我在谷歌输入他的名字,搜索出来的第一条就是他的简历,很牛逼的简历好几页。他跟我们说得最多的一句话是,一件事,不管有多难,只要你坚持不懈,就一定能做成!我很受振动,但很想告诉他,我听新东方的古典说,如果你有一根铁杵,你就不该把它磨成针,你该把它用来做其它的。但最终没说出口,怕被他看不起。也许把铁杵交给他,他真的就能给你磨成针!

关于加班

我听说在美国小公司,尤其是创业公司工作,加班加点也是常有的事。Facebook的女COO说自己每天5点就下班,好像效率很高似的,殊不知她早年的时候也是经常熬夜加班在办公室过夜的。在大公司,一般不加班。现在的公司的工作节奏要比摩托快得多,但也很少加班,特殊情况除外。因为赶进度,前段时间我就在实验室敖到了凌晨3、4点。陪同我一起加班的还有两个跟我老板同级别的工程师,虽然主要还是我在做,他们在说。我到了2点就困得不行,但他们依然精神抖擞,还跟我说年轻人熬下夜没什么的。我们是远程合作,印度分公司那边还有一个跟我同级别的工程师一起,不过当时他们那边是白天。除了我,他们三个人都是印度人。第二天我睡到中午才去上班,而跟我一起加班的印度人据说早上7、8点就来上班了。可见,印度人还是很吃苦耐劳的,千万不要小瞧了他们。老美很少加班,特殊情况除外。

(位于加州圣地亚哥公司窗外的景色)

我听说国内的私企,加班现象很严重。这对于个人来说,也许是一件坏事,但对于整体而言,不加班加点地努力,私企拿什么去跟欧美企业竞争?国家又何谈富强?战后亚洲所有的富强国家和地区,都经历过这个过程。等再过几十年,国家富强了,生活水平提高了,自然就没人愿意再拼命加班,那发展也就慢下来了,跟今天的美国一样。美国这个国家,要不是新移民以及美国本土精英拼命地工作,也不会有美国的今天。但今天美国大众如果继续舒适下去,这个世界的未来可能就真的是中国的了。

2015年

这一年我即将满30岁,这一段时间,每念及此,都感慨不已。常言道,三十而立。看看我自己的情况,真是挺惭愧,感觉离真正的“而立”差得远。如果说降低一点要求,把赚点钱养家糊口算作是“而立”的话,也许我符合这个条件。理想而言,“而立”应该指事业有所成。如果是打仗的话,“而立”的话应该至少是营长团长了吧,要是放在古代,30几岁的将军都一堆。如果是指工作,30岁起码也开创了自己的事业,即便不是创业,至少也能够在所属的领域里独当一面。按照这个标准看,我觉得革命尚未成功,同志们还需努力。光阴似箭,大好年华转瞬即逝,2015年大家一起加油努力吧!

—— 2015年1月1日 加州圣地亚哥

(P.S. 最近有国内的大学生邮件问我如何从国内直接申请美国的公司。我是留学出来的,不知道如何直接申请。个人觉得没必要太羡慕国外的,现在国内发展势头很好,很多公司都开始走向国际化了,比如阿里巴巴,比如小米,前途似锦。再者毕业生直接申请国外的公司确实很难,要么是极为突出,要么必须付出极大的努力,还不一定能够成功。我想,既然同样是付出努力,可以试一下在国内的有前景的大公司去工作一段时间。如果还是想出来看看,可以一边工作一边准备。)

原文:http://www.vaikan.com/guangdong-programmer-at-california/

神奇的 Dreamweaver 8KB bug

不久前Adobe公司退出中国的消息是令人伤心的。Adobe是个优秀的公司,开发出了令人惊叹的优秀软件,除了广为人熟知的Photoshop外,Web开发人员应该都接触过它的另外一款惊世骇俗的Dreamwearver,这款开发网站的利器对于初学网页开发的程序员更为重要,但即使像我这样有很长Web开发历史的老程序员来说,也经常会使用Dreamwearver来调整页面格式和校验代码。

Adobe退出中国是无奈的。因为我使用的也是盗版的Dreamwearver软件,我也知道盗版是可耻的,我想,如果我能再富裕一点,一定要买个正版的,支持正版软件,因为我也是开发软件的,如果有一天我也开发出来一款流行软件,自然也不希望别人盗版。

Dreamwearver这些年更新了很多种版本,从1.0到8.0,从CS3到CC,功能越来越强,用的也越来越方便。当然,软件无论做的如何完美,总还是有bug可以挑出,这就是软件开发更古不变的死咒。

最近在网上看到一个有趣的讨论,很多用户在使用Dreamweaver CS3时会在启动时遇到启动时崩溃的情况。Adobe官方甚至把它列为“常见问题”,给予官方说明。

说明中显示,有3种问题会导致Dreamweaver在启动时崩溃,一个是因为跟宏碁电脑中自带的数据安全管理工具冲突,第二个是因为缓存文件受到污染。第三个最有意思,叫做“The 8KB bug”:

This is a very rare bug that causes Dreamweaver to crash during operation, and then crash repeatedly each time you try to restart the program. It normally affects only Dreamweaver CS3 on Windows, and is caused by the presence of a file that’s exactly 8,192 bytes (8KB) or a multiple thereof.

就是说,当一个文件的体积刚好是8,192 bytes (8KB)时,如果用Dreamweaver打开它,会立即引起Dreamweaver的崩溃。听起来很荒诞,也很有趣,但做作为一个程序员的我,深知软件软件开发过程中比这更荒诞的事情都是正常的。程序员的价值正是体现在跟这些莫名其妙的bug做斗争的过程中。

对这个bug,我是一笑了之,但Adobe对这个bug提供的临时解决方案却让我思考,它提供的方案是:

用其它编辑器把文件打开,在里面添加几个空格或空行,或其它方法,总之是让文件的体积不是刚好8,192 bytes,就行了

似乎也是很搞笑的方案。但我突然想到,在开发软件的过程中,会遇到这样的情况,软件里出现了一个bug,很严重,很急迫,如果要完全从软件内部纠正,需要一段周期,但有一个很简单的外部方法能绕过这个bug。做为程序员,我通常会给领导提建议,不要加班加点的更正这个bug,先让用户委屈一下,使用这个临时方案避免这个bug,为我们争取足够的时间用正常的软件修改流程(评估-设计-修改-测试-提交),也不需要兄弟们这么加班加点的辛苦,而且软件质量也有更好的保证。但很少有领导能认同这个做法的。

程序员和经理的思考方向从来都是很难统一,各自有各自的利益出发点。程序员朋友们,你们怎么看待这个问题?

附:The 8kb bug 官方解释

原文:http://www.vaikan.com/dreamweaver-8kb-bug/

游戏中的“战争黑雾”和现实中的程序员处境

当还是个少年的时候,我记得经常会玩一些即时战略游戏像X-COM, Civilization, 红警之类的。

这些游戏使用一种被称作“战争迷雾”的机制。当玩家开始游戏的时候,他们被笼罩在一片黑暗中,而地图隐藏其中。唯一可以看到你周遭情形的方法就是探索。当你移动的时候,越来越多的地图就会展开在你面前。

这将玩家置于一种策略上的不利之处:他们不能看到附近的危险,障碍或者机会。每次成功的前进都需要一点儿运气。

这种场景是不是听着很熟悉?

“战争迷雾”是对当前程序员被要求工作情形的一个极好的比喻。他们被置于一个项目中,被要求完成某一特定模块的代码,但是他们对于这个任务之外的事情一无所知。

对程序员来说,看到“完整的游戏地图”是非常重要的。对全局清楚地认识可以帮助他们做出更好的决定。这里列出一些他们可能会问的问题:

  • 1. 我们为什么要做这个项目?它是如何改善了客户的生活?
  • 2. 和这个项目相关的历史代码是什么样的?
  • 3. 这个项目会影响到该应用软件的其他那些部分?
  • 4. 这个项目会影响到我们生意的其他哪些部分?
  • 5. 我们如何来评估这个项目是否成功(或失败)?

一旦他们可以看到这整个的布局,程序员就可以有目的的开始工作。他们不再是一台机器里面的齿轮而是可以影响项目取得成功的参与者。

这也带来巨大的激励好处。Joe Stump总结为:

程序员通常不知道任务背后的问题,这意味着一些最富有创造力的思考者却不能考虑到一个给定的目标可能会碰到的问题。

比如说,如果我是一个后端程序员,你告诉我要实现一个API,但我不知道为什么你需要这个接口。

但是如果我负责任,多很你聊一聊,我将会深入地围绕这个问题思考,因为我将作为程序员的工作和企业的成功更具体的联系了起来。

这突出了强调每个项目背后的愿景和使命的重要性。

  • 愿景:我们为什么要做?这将如何改变这个世界?
  • 使命:目标是什么?我们需要在哪里完结?

一旦他们理解了愿景和使命,程序员们也成为了项目计划过程中有价值的合作者。他们可以预见潜在的风险帮你避免犯一些代价高昂的错误。在这篇非常棒的文章中,Paul Boag描述了不让程序员参加需求设计会议的危险:

在Digg的全盛时期,我记得在Daniel Burka(掘客的首席设计师)和Joe Stump(首席程序员)的一段对话。他们讲了这么一个故事,Daniel想要改变Digg的按钮设计,从他的角度来说,这个改动微乎其微。但是当他和Joe说起的时候,他发现这个极小的改动可能会对网站的性能有非常大的影响,可能会迫使Digg升级它的处理能力和服务器架构。

应该怎么做

在Sprintly公司,来自产品,支持和工程技术方面的代表会一起开会制定开发计划。

会后,我们会创建一个Sprintly标准规格的需求书,包含我们在之后的三个月中将要做的事情。这份需求书会寄给所有的开发团队,他们需要在工作开始前签署同意。

经理不是将军,程序员也不是士兵

有时候经理表现的好像每个项目都是秘密活动,信息只有在需要知道的基础上才能给予。这个维基条目清楚地解释了为什么这种情况可能发生:

需知(诸如其他保密措施)会被一些人误用,这些人希望拒绝其他人知晓他所知道的信息,试图增加他们的个人权力或者阻碍对他们工作的回顾。

这种保护主义并不会生成更好的代码,项目或者增长的销售额。不要将程序员置于黑暗中。邀请他们参与到你的整个策略制定中。

注:Justin Abrahms写了一篇非常精彩的姐妹篇,The Omission of Why.

如果你正寻找一个好的框架来保持产品团队负责,可以查阅Jason Evanishproduct thesis.

祝好!

本文的译者:素材不乱

素材不乱(网名)。通信与信息系统专业毕业。从事软件开发,是一位软件业里的妹子。工作之余,喜欢看书。目前在江苏南京。她的微博是@素材不乱

原文:http://www.vaikan.com/dont-leave-developers-in-the-dark/

两个程序员的故事

两个程序员的故事.jpg

从前,有两家互不知晓的公司,一家叫做“自动会计应用协会”,另外一家叫做“统一计算资本公司”。他们同时决定开发一种提供相同功能的程序。

“自动”雇佣了一位分析程序员,艾伦,来解决这个问题。

而“统一”决定试一下新来的初级程序员查尔斯,看看他是否有真本事。

艾伦做过一些复杂项目,有着丰富的经验,决定采用PQR结构化方法来开发这个程序。于是他找到部门经理,要求增派3名程序员组成一个项目小组。这个小组于是开始工作,捣鼓出初步的项目分析报告。

“统一”这边,查尔斯抽了点时间想了一下需要解决的问题。同事们常常看到查尔斯把脚翘在办公桌上喝咖啡。偶尔见到他坐在电脑前,但是那有节奏的键盘声告诉别人他其实在玩小蜜蜂。

不久,“自动”的小组开始编写代码了。程序员们一半的时间用来编写编译代码,另一半的时间待在会议室里,讨论模块间的接口设计。

查尔斯的同事发现他终于不再玩小蜜蜂,而是一半的时间把脚翘到办公桌上喝咖啡,另一半时间在纸片上涂写着什么。他好像不是在纸上玩“井字过三关”,但看起来不像是在写有用的东西。

两个月过去了。“自动”的小组终于发布了项目时间表。计划再过两个月,他们就会发布程序的测试版本。然后再经过两个月的测试和改进,就可以发布完成版了。

此刻,对于查尔斯的游手好闲,他的经理再也看不下去了,他决定批评查尔斯一下。但当经理走进查尔斯的办公室时,他却惊讶地发现查尔斯在电脑前正埋头写代码。于是他决定把批评先放一放,随便跟查尔斯聊了一下就离开了。然而从此他更加注意观察查尔斯的表现,想借机批评查尔斯。不过不愉快的对话并没有发生,他很高兴地发现查尔斯一直在写代码。人们偶尔发现查尔斯推迟了午餐,且一周还主动加2、3次班。

第三个月的月底,查尔斯宣布他已经完成了这个项目。他提交了500行的程序。程序清晰可读,测试中符合所有的功能要求,甚至具备了一些更加便利的功能,极大地提高了程序的易用性。测试后,程序除了有一处疏忽外,表现得非常好。

“自动”的项目小组到此时已经将4个主要模块中的2个开发出来了。在这些模块被测试的同时,小组继续开发其余的模块。

又过了3周,艾伦宣布提前一周完成了程序的初级版。他提交了一份清单,列举了尚需解决的一些缺陷。测试中,客户发现了一些清单上没有的错误和缺陷。艾伦解释说这是意料之中的,毕竟这只是一个初级的版本,有错误很正常。

又过了两个月,项目小组完成了程序的正式版,包含了2500行代码。测试中发现,这个版本完成绝大部分的最初需求。程序功能上有一两处遗漏,且对于数据输入的格式要求非常严格。但公司最终决定使用这个程序,他们可以训练打字员严格按照要求输入数据。对于那些遗漏的功能,交由维护程序员去添加。

后记:

一开始经理对查尔斯的能力印象深刻。可当他阅读源代码的时候,发现原来问题比自己开始想象的要简单得多。现在看来,这种难度哪怕对于初级程序员来说也明显太低了。

的确,查尔斯平均每天产出了5行代码,这略高于平均水平。但是考虑到项目复杂度是如此的低,略高的生产率也不足为奇。而且经理对他头两个月的游手好闲记忆犹新。

业绩评估中,查尔斯薪水的涨幅大概是同期货币通货膨胀率的一半,他也没被提升。又过了一年,他感到沮丧而离开了“统一”。

“自动”这边,艾伦因为按时完成这个项目而受到表扬。他的主管翻了几页源代码,发现代码符合公司的结构化编程规范。但他很快便放弃了阅读代码的想法,因为它看起来相当深奥。他现在意识到项目的复杂度远比当初自己设想的高,于是他再一次夸赞艾伦的成就。

项目小组平均每人每天写3行代码,刚好是平均水平。但考虑到问题的复杂度,有平均水平就非常不错了。艾伦被大幅加薪,作为奖励,他被提升为系统分析员。

本文的译者:Ryan Chen

Ryan Chen(英文名)。目前在美国圣地亚哥,高通高级工程师。他的微博是@奋斗中的胖胖。你还可以通过邮箱ryanmailing@gmail.com和他进行交流。

原文:http://www.vaikan.com/the-parable-of-the-two-programmers/

和程序员打交道的十大禁忌

如果你正在读这篇文章,那么非常有可能是有人发给你了这条链接。这个人可能是你的朋友,同事,亲戚,父母,儿子,兄弟,表亲,姑嫂,外甥,或者恰巧帮你解决了电脑问题的一个人。他通常是程序员,系统管理员,或者 “擅长电脑”名声在外的某个人。

这篇文章的初衷是想要澄清跟程序员打交道的错误方式和禁忌。

1、不要“一遇到问题就去找程序员”

通常,技术问题通过阅读使用说明就可以解决。比如你刚买了一个新的播放器,想要把它连接到你的电视,你只需要找到使用手册里关于如何连接接口的那一页即可。

错误信息通常会被很清晰地列出来。通过仔细阅读并加以思考这个信息传达了什么来解决这个问题是非常有可能的。例如,如果你看到一条信息“你的硬盘已经快满了”,通常这就意味着你的硬盘要满了。为了安抚你的电脑,你需要删除一些你不再需要的文件(或者将它们转移到外部的移动硬盘中)。

我遇到过这种情况

2、不要认为“程序员对电脑无所不知”

朋友或某个亲戚可能很擅长电脑,但他们并非无所不知。一般他们也完全不知道怎么使用你电脑中出问题的程序,仅仅是使用一些简单的逻辑判断或google搜索来帮你找到解决方案。

实际上,用谷歌搜索已经足够了,因为它会引导你找到相关的论坛或者博客,早在你遇到这个问题之前已经有网友在讨论并且给出了一个大概的解决方案。通常,你可以不用麻烦你的免费技术支持顾问(你的程序员朋友)。

如果你试过了并且失败了,那么,请无论如何都要找他帮忙。

我遇到过这种情况

3、不要说“这并不费什么事儿,你几分钟就可以搞定”

你的程序员朋友可能会提供免费的技术支持,但这并不是说这件事完全不会耗费什么。一般解决一个问题远不止需要两分钟,再加上到你那儿的车程。依据我的经验,平均来说,从你联系他们解决这个问题开始到他们回到家(除非你们是住在一起)在一个小时之内已经是幸运的了。

如果他们不接受报酬,因为他们是家人或者一个老朋友,请依然要考虑补偿他们的时间。偶尔的一件礼物和一张致谢卡或者慷慨的姿态真的可以让他们更欣赏自己的努力。

我遇到过这种情况

4、不要以为“他们有义务对你提供无偿帮助”

一些骄傲的父母或者家庭成员会把自己程序员好友的联系信息发送给家族的朋友,这并不罕见。如果这些朋友准备支付酬劳,那没什么问题。然而,这么说吧,向朋友提供免费的程序员服务并不酷。

程序员可能很好心地想要帮助你,但是他们这么做并没有授予你拿他做筹码取悦别人的权利。

我遇到过这种情况

5、不要对程序员说“从你动了我的电脑之后,它就不能工作了”。

有些人请你提供免费的技术支持,然后因为电脑之后出现的另一个问题控诉你,没有比这更糟的了。实际上,如果程序员仅是远程协助的话,他们压根儿不是导致你电脑变慢或者窗口崩溃的原因。

你确定你没有在他们走后装一些新东西?删除了一些你本不应该删的文件?电脑中了病毒?罪魁祸首怎么可能是专家呢。

我遇到过这种情况

6、程序员告诉你别乱转软件,而你一意孤行

如果你信任的程序员阻止你装工具栏,笑脸符号,可疑的注册表清理软件和广告软件,你就不要非得装上。这些程序可能会攻击你的电脑,最后你还得再一次打给他让他来修电脑。要听程序员的话。

我遇到过这种情况

7、不要向程序员乱转发邮件

不要给程序员转发那些连锁邮件。他们已经看过数不清的这类邮件,知道大多数情况下很明显都是谣言。就算不是谣言,许多请求在你看到并转发的时候也已经很悲剧地过期了。例如,那个寻找骨髓捐赠的孩子,已经去世好几年了。你的转发只会导致越来越多的人联系他悲伤的家人。

如果程序员回复了你的信息,附了一条Snopes的链接。不要觉得被冒犯了。这无关个人。从这个小插曲里吸取教训,记得忍住不要去转发这类邮件(或者在鉴别真伪前就在Facebook上分享某个故事)

我遇到过这种情况

8、“他太多疑了,这是一笔大买卖。”

如果你信任的程序员告诉你网上的某事是个骗局,靠不住的,相信他们。无论是你从未亲身遇到过的外国王子或者完美恋人,成为秘密买手的机会,或者某个伪装成你的银行职员需要验证你的登录认证信息,你正在处理的诈骗邮件被设计成利用人性中的轻信。

和技术及互联网相关的所有事情都请相信程序员。实际上,关于一些网上常见的陷阱一定要问问他们,以免你自己陷于其中。

我遇到过这种情况

9、“我有个非常棒的创业想法,你可以帮我实现吗?我们对半分。”

实现一个创业想法并不是一个简单的任务。大多数情况下,你绝妙的创意或服务如果没有认真地思考,投入时间、精力和金钱是不能被创造出来的。即便是在全职工作也要讨论数周甚至数月。

你会请你的表兄,一个建筑工人,抛开原材料的成本帮你免费建造一座房子吗?

甚至如果你的想法很好,在你并没有可能真正实现的情况下,请你的程序员朋友实现并不意味着你可以拿到50%的 收益。

想法本身并没有太多价值,如果你是一个企业的合伙人,在市场和生意上像程序员在技术上花费一样多的时间,然后并且是只有这样后你才可以要求对半分。

我遇到过这种情况

10、“扎克伯格赚了几十亿,为什么你不行?”

“嗨,John,我在新闻上看什么扎克伯格用Facebook赚了好几十个亿。你为什么不也做点儿这样的事情?我们得为下一代做点儿什么呀。”你知道外面有多少扎克伯格和Facebook吗?他们都是在统计分布的一端。基本上,你的程序员朋友中大乐透的概率和他们成为下一个扎克伯格的概率差不多。

不要误会我们程序员。通过在线的应用和网址是有可能创造财富的,但是只有极少数才能完成像Facebook这种不太可能的壮举。如果你的程序员朋友非常擅长他所作的事情,野心勃勃,并且日以继夜的努力工作,那就有可能看到他们的商业变得可行。再有点儿运气的话,他们有可能成为百万富翁。但是不要指望他圆满完成更不用会所挣个几十亿。同样地,不要因为他们买不起私人岛屿就认为他们是个loser。他们的出色的完成工作,日复一日做一些很棒的有用的或者创造性的事情,就像适用于其他职业道路一样,这在技术领域是非常值得骄傲的事情。

我遇到过这种情况

就这样。尊重程序员,你可以享受他们免费的技术支持,长期的专家服务。


1.如果你是我的读者,那你非常有可能就是我文中谈到的程序员。把这篇文章转给需要的人吧!

2.我最初在2012年把这篇文章发表在一个意大利博客上,当时大受欢迎。几天前,我恰巧又一次看到,我想我可以把它翻译成英语。在意大利很清晰地能知道这篇文章只是调侃,但是我不确定是不是在英语里也这样。但是,不要太当真。

本文的译者:素材不乱

素材不乱(网名)。通信与信息系统专业毕业。从事软件开发,是一位软件业里的妹子。工作之余,喜欢看书。目前在江苏南京。她的微博是@素材不乱

原文:http://www.vaikan.com/interacting-with-geeks/

站着编程严重伤了我的膝盖

编者按:本文的作者是波兰克拉克夫的一个程序员。他写博客的原因是想通过写作更好的表达自己。

2013年冬天网络上涌现出一大波关于站着办公的帖子。许多人都在尝试的新奇的办公方式。

从常规的坐在显示器前的工作方式转换出来的理由是非常有信服力的。有大量的研究和文章都展示了久坐是如何让你短命的。作为一个喜欢去尝试的人,我试着一整年都以站立的方式工作。

第一次打造站立式办公桌

建造一个新的站立式办公桌并不难,Google上的搜索结果的头几条会让你惊奇的发现有只要花费22刀就能制作一个站立式办公桌。所以,单板滑雪回来的路上,我去宜家买了一些部件,同事们也对我的尝试非常感兴趣。

这张图是组装完成后的效果(2013年3月)

站立/休闲交替进行

在计划一整天都站着工作之前,我读到一些文章建议加强腿部锻炼,以及应逐渐开始站立式工作。于是我在锻炼计划中增加了额外的腿部锻炼计划,在家里使用电脑时,我会每天坚持站立工作2-3个小时。另一个让站立变得容易的方式是光脚站在瑜伽垫上。这个时候,看起来每件事都很棒,在睡觉前站立一段时间会让我稍微疲劳,我喜欢这一点,这会让我能更快入睡。

那个时候我放弃了完成硕士学位,开始尝试一些有趣的工作。我开始每天8-10个小时站立工作。起初我感觉还不错,它能让我更集中精力工作。但这样几周之后,我的腿在我不站立的时候也感觉很累。这让我意识到整体都站立并不是个好主意,于是我改成了站两周再坐两周的方式。

开始这样节奏后,所有的事情都恢复正常,我开始享受这种新的方式。大概过去了一年,到了2014年冬天,在每次站立周期结束后,我开始觉得腿疼。我不知道是什么原因,但我开始减少站立周期,站立一周,坐两周。在三月的一个周五下午,我正处在站立周期中,我突然被右腿膝盖上可怕的疼痛放倒并在沙发上结束了我的正常工作。

站着编程带来的伤害

第二天我醒来后在公寓周围散步,右腿膝盖开始出现和昨天相同的疼痛,我采取冰敷,在沙发上度过了一天。这种疼痛在之后的几天都没有消失,于是我预约了一位医生看看到底发生了什么(这时我已经完全停止了站立办公。)

进行了膝盖超声扫描和一个磁共振成像(这个噪音真的超大),我被诊断出半月板撕裂和韧带拉伤。医生说,有两件事可能导致了这个结果:几年前的一场车祸和我的站立工作试验。但问题是,三年前我没发现任何这些伤害,而且在玩滑雪板或户外工作的时候也没有任何问题。所以看起来是我的站立工作试验给膝盖增加了额外的压力,而这些小伤害最终演变成了一个大问题。

这是我在结束了一个月的治疗之后的样子,实际也并没有什么帮助。

现在我在做很多针对性的练习并且避免对膝关节的任何压力。还有一个坏消息是如果这种疼痛持续下去,唯一的解决办法是关节镜,而这对一个像我这样活跃的年轻人可不是什么好事。

这个故事想说的事情

我发这个帖子的原因并不是让每个人都放弃站桌,而是想讲述这种工作方式可能导致的结果。

了解你的身体状况很重要,而且在使用站立式办公桌之前,最好去做一些诊断检查。

在我的例子中,我以前并不知道膝盖受了伤并且可能我到50岁前都不会注意到。而现在我不得不在我20岁时就开始面对这个问题。

注意安全!

 

本文的译者:湖泊秋色

湖泊秋色(网名)。目前在北京邮电大学,读研究生。她的微博是@湖泊秋色。你还可以通过邮箱425399742@qq.com和她进行交流。

原文:http://www.vaikan.com/standing-experiment-and-consequent-knee-injury/

【小测验】你能看出这是哪种语言写的程序吗?

世界上存在的编程语言有上百种,有的非常流行,有的默默无闻。有的适合商用,有的适合教学,有的适合玩耍。初学程序员可能只知道一两种语言,但随着经历越多,学的编程语言种类越多。懂多少种编程语言可以作为一个程序员能力大小的重要标准。如果你想知道自己的实力,请测一下自己,这里一共有12题,看看能选对几种?

1、

#include 
 int main()
 {
 	std::cout << "Hello, World.";
 }
    1. java
    2. python
    3. C++

2、

#!/bin/sh
 echo "Hello World"
    1. ruby
    2. shell
    3. C语言

3、

>>> def fib(n):
>>>     a, b = 0, 1
>>>     while a < n:
>>>         print(a, end=' ')
>>>         a, b = b, a+b
>>>     print()
>>> fib(1000)
    1. JavaScript
    2. Objective C
    3. Python

4、

 public class Hello {
  	public static void main(String []args) {
 		System.out.println("Hello World");
  	}
 }
    1. Java
    2. Lisp
    3. C语言

5、

# The Greeter class
class Greeter
  def initialize(name)
    @name = name.capitalize
  end
  def salute
    puts "Hello #{@name}!"
  end
end
# Create a new object
g = Greeter.new("world")
# Output "Hello World!"
g.salute
    1. JavaScript
    2. Ruby
    3. Objective C

6、

package main
import "fmt"
func main() {
	fmt.Println("Hello, 世界")
}
    1. C#
    2. Objective C
    3. Go语言

7、

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
    1. Scala
    2. PHP
    3. JavaScript

8、

#import 
int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSLog(@"Hello World!");
    }
   return 0;
}
    1. Objective C
    2. C语言
    3. Clojure

9、

(defun should-be-constant ()
  '(one two three))
(let ((stuff (should-be-constant)))
  (setf (third stuff) 'bizarre))   ; bad!
(should-be-constant)   ; returns (one two bizarre)
    1. Perl
    2. Lisp
    3. Scala

10、

class Hello {
 	static void Main() {
  		System.Console.Write("Hello World");
 	}
 }
    1. C#
    2. JavaScript
    3. Android Java

11、

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
    1. Perl
    2. Bash
    3. node.js

12、

Imports System.Console
Module Program
    Sub Main()
        Dim rows As Integer
        Dim current = 1
        For row = 1 To rows
            For column = 1 To row
                Write("{0,-2} ", current)
                current += 1
            Next
            WriteLine()
        Next
    End Sub
End Module
    1. Pascal
    2. Swift
    3. Visual Basic .NET

原文:http://www.vaikan.com/codes-writen-by-programming-languages/

以一当十的程序员不是传说

昨晚,我发了下面的微博:

有些人议论所谓“10x”或者“超级”的程序员都是传说。可那些著名运动员,艺术家,作家,呃,还有摇滚明星的都是神话吗?

— Yevgeniy Brikman (@brikis98) September 29, 2013

我收到了大量的回复和问题,但微博不适合讨论问题,所以我写了这篇博格来进一步讨论。

已经有 文章号称10x的程序员根本不存在。反对观点一般分为以下三种:

  1. 最初10x这个数字来自一个研究(Sackman,Erikson, and Grant (1968)),不是很有说服力。
  2. 生产力是个很难测量的模糊概念,所以我们不应该声称诸如10x之类的度量。
  3. 个人才华确有高低不同,但一个程序员不可能比另一个程序员高出10倍的工作能力。

我不同意以上的这些观点,我来逐条看一下这些论点。

[译者注]:10x程序员(10x效应来自一个有趣的观察:伟大的程序员相比普通程序员的生产力不仅是15-20%的差距,很可能会10倍甚至更多)的说法最初来自于www.forbes.comwww.tempobook.com

对10x程序员的研究不只有一个

尽管微博和Hacker News里那些坐在摇椅里的学术专家喜欢驳斥同行的研究结果,然而10x程序员的证据相当令人信服而且并不限于单个研究。请允许我引用来自StackOverflow里得票最多的回复

Sackman, Erikson, and Grant在1968年进行的最初研究发现程序员的编程效率有巨大的差异。他们研究了平均有7年经验的专业编程人员,发现最好和最差的编程人员初次写代码所用的时间比率大概是20比1;调试时间大概是25比1;程序大小大概是5比1;程序执行速度大概是10比1。他们还发现,编程者的经验和代码质量的好坏并没有关系。

对他们的发现进行详细的考证,可以看出一些方法论上的缺陷。。。然而,即使考虑了这些缺陷,他们的数据依然可以呈现出最好和最差的程序员之间不止10倍的差距。

在首个研究之后的几年里,“程序员之间倍数级的差距”这一发现被其他许多专业程序员的研究所验证(Curtis 1981, Mills 1983, DeMarco and Lister 1985, Curtis etal. 1986, Card 1987, Boehm and Papaccio 1988, Valett and McGarry 1989, Boehm etal 2000)…

这里 and 这里你可以读到更多。

即使不能测量,依然可以推理

即使你无视上面的研究,声称“编程效率”很难测量-那也表示我们依然可以讨论下10倍效率程序员。仅仅是因为一个东西很难测量并不代表我们不能测量。

比如,你是如何为你最近的项目挑选编程语言的?你有去搜索证明这种语言比其他更有效率的研究吗?个人来讲,我不需要经验就可以证明Ruby在构建网站方面比C高效了好多倍。你可以抛出一些粗略的准则(程序库的可利用性,社区支持,文档等),但现实是大多数人会基于直观推理来选择语言,并不是什么双盲研究。尽管缺少数据资料,我打赌选Ruby而不是C去做网站开发大多数时候都会被证明是一个正确的决定。

当然,编程并不是个例:什么样的度量标准可以判断某个作家,艺术家,教师或者哲学家比另外一个好?仅通过观察,我不能给你一个“生产力度量标准”说莎士比亚,纳博科夫,或者奥威尔比一般的作家好了好几倍,但是大多数人会同意他们是的。

编程不是体力劳动

针对10倍效率程序员的最大问题是有些人认为编程不过是体力劳动,程序员也不过是流水线上的工人。一些程序员可能会比其他人好一些,但是,一个程序员必定不可能持续地比其他人解决10倍多的问题。10个人的团队总是会胜过一个程序员!9个女人一起也不可能在一个月内就生出一个孩子啊!

上面的逻辑听起来就像编程效率就是打字速度;好像10x程序员只是简单地比普通程序员多产了10倍的代码。这种推理无视了编程其实是一个创造性的专业,并不是体力劳动。解决同一个问题有许多许多种方式。更多地考虑刑侦级推理而不是简单的婴儿式推理:10个普通的侦探对一个夏洛克。谁可以更快地破案?

一个10x程序员有普通程序员无法企及的解决问题的能力和洞察力;他们将会避开耗费普通程序员大量时间的所有问题。10个写错误代码的工程师肯定不如一个写正确代码的程序员。

编程是选择

想一想一个软件的构建需要做多少决定,比如一个网站:你要采用什么语言?采用什么样的架构?用什么存储数据?用什么来高速缓存?在哪里托管站点?如何监测?如何推动新的改变?怎么存储代码?需要设置什么样的自动化测试?

10个普通程序员在每个阶段都可以做出“平均”水平的决定,这些决定的成本或者收益会累乘。设想流量呈指数增长,但是这个普通的团队构建了一个普通的网站,难以分区的数据存储,缺少足够冗余的托管,没有合适备份的版本控制,没有持续集成环境,以及没有监测。如果他们的时间全在忙于到处灭火,这10个程序员能有多高效?

如果一个程序员可以以倍数级降低的工作量的方式来建模这个问题,那么这一个程序员就胜过一个10个人的团队。从我多年的经验来看,一个伟大的程序员知道那些事后修补更为昂贵的错误。预先做出一个好的决定,一个10x程序员可以避免数月的工作。

编程不是写更多的代码;是要写正确的代码。成为一个10x程序员并不是因为你做了几倍多的工作,而是因为你更为经常地做出更好的决定。

这不是说10x程序员就完全不会犯错;而是程序员每天都要做出许多选择,伟大的程序员会比普通的程序员更为经常地做出正确的选择。

而且这并不只是说编程。你是更想要10个普通科学家呢还是牛顿?10个普通科学家可不会提出运动三定律,万有引力,二项式序列,微积分等;一个牛顿就做到了。在你的团队里你是更想要一个迈克尔乔丹呢还是10个普通球员?(注意:乔丹拿着10倍于NBA球员的平均薪资)?你是更想让史蒂夫乔布斯或者艾伦马斯克运作公司或者把钥匙交给10个普通的企业家?

10x程序员非常稀有

把目光放长远一点很重要。明星程序员,运动员,作家以及科学家是极为稀有的。我并不推荐仅雇佣这些“摇滚明星”的招聘体系;这只会看起来愚蠢又孤独。不要让完美成为不错的敌人:雇佣能找到的最好的的工程师,给他们变得越来越好的机会。

然而,不要掉入所有的程序员生来平等的谬论。在任何一个创造性的专业都存在一个巨大的能力谱图。一端是可以毁掉一个组织的雇员类型,每行他们写下的代码都增加了技术负债。另一端,则是那些可以写出任何可能的代码,而且数倍地优秀于普通人的人。

本文的译者:素材不乱

素材不乱(网名)。通信与信息系统专业毕业。从事软件开发,是一位软件业里的妹子。工作之余,喜欢看书。目前在江苏南京。她的微博是@素材不乱

原文:http://www.vaikan.com/the-10x-developer-is-not-a-myth/

程序员久坐伤身,站起来,走出去,别回来

最近,美国明尼苏达州罗切斯特的专家在发布了一组新健康指南,旨在帮助使职场人士保持身心健康,他们建议人们站起来,走出去,别回来。“许多人每天至少在办公室里坐8个小时,而研究中我们发现,哪怕就一次,如果你站起来,走出门,别再回到办公室工作的话,你的身心健康状况将获得极大的改善,” 研究员Claudine Sparks解释道,那些站起来走出去的人们在当天余下的时间里心情更愉快,精神压力变小,这种效果甚至可以持续好几周。“我们鼓励人们尝试一下,哪怕就一次,走出去,活动下筋骨,忘掉所有的担子,看看感觉如何。通常人们会立刻变得更高效,更积极,更快乐。我们发现,当你走过停车场,用力把你的员工卡扔到停车场对面真的有助于加速你的血液循环。” Sparks还说,为了增强效果,人们可以在午餐时间出去走走,一直走到一个陌生环境为止,如此你将重获新生。

本文的译者:Ryan Chen

Ryan Chen(英文名)。目前在美国圣地亚哥,高通高级工程师。他的微博是@奋斗中的胖胖。你还可以通过邮箱ryanmailing@gmail.com和他进行交流。

原文:http://www.vaikan.com/health-experts-recommend-standing-up-at-desk/

和Lambdas的第一次亲密接触

Lambda工程是即将到来的Java8的一大主题,可能也是程序员们最期待已久的东西。随着Java lambdas的到来,还有一个有趣的东西被附带的加进了Java语言——defender(守卫者)方法。在这篇文章里,我的目的是要看看面纱后的东西——看看在运行时环境里lambdas是表现的,在方法的调度过程中涉及到哪些字节码指令。

尽管Java 8还没有正式发布,我们仍然可以下载各种平台上的早期预览版,在其上做简单的尝试。

你也想试试lambdas,是吗?

如果你熟悉其它的还有lambda表达式的编程语言,比如Groovy 或 Ruby,当第一眼看到Java里的lambda时,你也许会吃惊于它的不简单。在Java里,lambda表达式是“SAM”(Single Abstract Method)——一个含有一个抽象方法的接口(是的,现在接口里可以含有一个非抽象的方法,defender守卫方法)。

举个例子,大家熟知的Runnable接口就可以完美的被当作一个SAM类型:

Runnable r = () -> System.out.println("hello lambda!");

,这同样也适用于Comparable接口:

Comparator cmp = (x, y) -> (x < y) ? -1 : ((x > y) ? 1 : 0);

写成下面的样子也是一样的:

Comparator cmp = (x, y) -> {
return (x < y) ? -1 : ((x > y) ? 1 : 0);
};

从中可以看出,单行的lambda表达式似乎是隐含了一个return语句。

那么,如何写一个能接受lambda表达式作为参数的方法呢?这样,你需要先把这个参数声明成函数式的接口,然后把lambda传入:

interface Action {
void run(String param);
}
public void execute(Action action){
   action.run("Hello!");
}

一旦有了一个能将函数式接口作为参数的方法,我们就可以像下面这样调用它:

execute((String s) -> System.out.println(s));

还可以更简洁,这个表达式可以被替换成对一个方法的引用,因为它只是单个方法,而且它们的参数是相同的:

execute(System.out::println);

然而,如果参数上有任何其它形式的变化,我们就不能直接引用方法,必须写全lambda表达式:

execute((String s) -> System.out.println("*" + s + "*"));

我觉得这种语法还是相当漂亮的,现在,Java语言里有了一个非常优雅的lambdas解决方案,尽管Java里并不存在函数式类型。

JDK 8里的函数式接口

我们已经知道,lambda在运行时的表现形式是一个函数式的接口(或“SAM类型”)——只有一个抽象方法的接口。尽管JDK里已经有了不少这样的接口,例如RunnableComparable ,它们符合这种标准,但很显然,对于一个新API的进化来说,这是不够的。我们不可能所有地方都用Runnables接口。

在JDK 8 里有个新包,java.util.function,里面包含了很多函数式接口,都是提供在新API里使用的。我不想把它们全列出来——你们自己可以去看一下,学习一下这个新包

但看起来这个新包在不断的变化,经常性的一些新接口会出现而另一些会消失。例如,以前曾有过 java.util.function.Block 这个类,最新的版本中却没有它,我写这篇博客时使用的版本是:

anton$ java -version
openjdk version "1.8.0-ea"
OpenJDK Runtime Environment (build 1.8.0-ea-b75)
OpenJDK 64-Bit Server VM (build 25.0-b15, mixed mode)

我研究发现,它现在被 Consumer 接口替代,collection包里的所有新方法都将使用它。例如,Collection接口里定义了forEach方法,如下:

public default void forEach(Consumer consumer) {
for (T t : this) {
    consumer.accept(t);
}
}

Consumer接口里一个有趣地方是,它实际上定义了一个抽象方法——accept(T t)和一个defender方法——Consumer chain(Consumer consumer)。这就是说你可以链式调用这个接口。我不确定如何使用,因为我在JDK包里没有找到chain(..)的使用方法说明。

我还发现所有的接口都使用了@FunctionalInterface运行时注注解注释。这个注释不仅仅是个说明,它还被javac使用来验证这个接口是否真是一个函数式接口,是否至少有一个抽象方法在里面。

所以,如果我们来编译下面的这段代码

@FunctionalInterface
interface Action {
void run(String param);
void stop(String param);
}

编译器会告诉我们:

java: Unexpected @FunctionalInterface annotation
  Action is not a functional interface
	multiple non-overriding abstract methods found in interface Action

而下面的就能编译通过:

@FunctionalInterface
interface Action {
void run(String param);
default void stop(String param){}
}

反编译lambdas

我对语法语言特征其实并不是很好奇,我更好奇的是这些特征在运行时的表现形式,这就是为什么我像往常一样,拿起我喜爱的javap工具,开始查看lambdas里的这些类的字节码

目前(在Java 7之前),如果你想在Java里模拟lambdas,你需要定义一个匿名的内部类。它在编译后会产生一个具体的class。如果你在一段代码里定义了多个这样的类,你会发现这些类后面会跟着一些数字。那lambdas也会这样吗?

看看下面的这段代码:

public class Main {
  @FunctionalInterface
  interface Action {
Object run(String s);
}
public void action(Action action){
    action.run("Hello!");
}
public static void main(String[] args) {
new Main().action((String s) -> System.out.print("*" + s + "*"));
}
}

编译产生了两个类文件:Main.classMain$Action.class,没有匿名类实现里那样的序号化的类。那么,在Main.class里应该会有一些东西来代表我在main方法里定义的lambdas表达式的实现。

$ javap -p Main
Warning: Binary file Main contains com.zt.Main
Compiled from "Main.java"
public class com.zt.Main {
  public com.zt.Main();
  public void action(com.zt.Main$Action);
  public static void main(java.lang.String[]);
  private static java.lang.Object lambda$0(java.lang.String);
}

啊哈!编译类了产生了lambda$0方法!使用-c -v指示符会让我们看到真正的字节码,以及常量池的定义。

main方法里显示,invokedynamic被用来调度这个调用:

public static void main(java.lang.String[]);
  Code:
   0: new               #4    // class com/zt/Main
   3: dup
   4: invokespecial #5        // Method "":()V
   7: invokedynamic #6,  0    // InvokeDynamic #0:lambda:()Lcom/zt/Main$Action;
   12: invokevirtual #7       // Method action:(Lcom/zt/Main$Action;)V
   15: return

而在常量池里,你也可以找到运行时的启动方法:

BootstrapMethods:
  0: #40 invokestatic java/lang/invoke/LambdaMetafactory.metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
  Method arguments:
    #41 invokeinterface com/zt/Main$Action.run:(Ljava/lang/String;)Ljava/lang/Object;
    #42 invokestatic com/zt/Main.lambda$0:(Ljava/lang/String;)Ljava/lang/Object;
    #43 (Ljava/lang/String;)Ljava/lang/Object;

你会发现到处都是在使用MethodHandle API,但我们现在不打算深入到里面。现在我们可以确认一点,我们的定义是引用了编译出来lambda$0方法。

我很好奇,如果我定义一个相同名字的静态方法会怎样——毕竟“lambda$0”是一个有效的标识符!于是,我定义了自己的lambda$0方法:

public static Object lambda$0(String s){ return null; }

而编译失败,编译器不允许我在代码了拥有这个方法:

java: the symbol lambda$0(java.lang.String) conflicts with a
           compiler-synthesized symbol in com.zt.Main

同时,如果我删掉这段定义lambdas表达式的代码,程序能顺利编译通过。这就是说,lambdas表达式在编译期间会比类里的其它数据早先分析,不过这只是我的猜测。

请注意:在这个例子中,lambda并没有去引用任何变量,也没有引用类内部的任何方法。这就是为什么产生的lambda$0方法是静态的。如果lambdas引用了上下文中的变量或方法,那生成的将是一个非静态方法。所以,不要被这个例子误导——lambdas是可以捕获上下文环境内容的!

总结lambdas

我可以毫无疑问的说,lambdas和伴随它一起的各种特征(守卫方法(defender)
,升级的集合类库)将很快给Java带来巨大的冲击。它的语法相当的简单,一旦程序员们意识到这些功能给开发效率带来的好处,我们将会看到大量的程序员都会运用这个功能。

看看lambdas会编译成什么样子,这对于我来说是一件非常有趣的事情,我很开心,因为我看到这些所有的invokedynamic指令调用都没有出现匿名内部类。

原文:http://www.vaikan.com/java-8-the-first-taste-of-lambdas/

你需要学习的九种最前沿编程语言

这些可作为当前流行语言强力替代的语言正在蒸蒸日上,或许你的下个项目正好能用到它。
有时候大量的烂大街的主流开发语言也没办法满足你对特定问题的开发需求。有时候你不得不展望未来以期待能出现一门语言:有着良好的语言结构,能提供 额外的功能,无需不断调整优化就能使你的代码提高运行速度。这门语言有着更好的稳定性以及良好的的代码结构,能帮你避免写出杂乱的或者错误的代码。
这个世界有太多灵巧的语言,例如 C#,Java,Javascript。有些语言可能只有少数拥护者,但是大多数语言,拥有庞大的社区拥护者,这些拥护者有着对这门语言能解决特定领域问 题能力的相同的喜爱。可能知道这门语言语法的程序员没有过亿,但是有时候稍稍的变动或许是有价值的,当你学习了一门新的语言,说不定下个项目就能发挥用 处。
以下的九门语言应该列在每一位程序眼的读书列表中。它们可能并不适合每个工程,因为大多数语言都是针对特定领域的。它们都值得研究和投入精力去学习,说不定哪一天就能派上用场。

Erlang:面向实时系统的函数式语言

Erlang 最初是由瑞典电信设备制造商爱立信为通信应用(电话交换机)设计的。爱立信的开发者鼓吹 Erlang 的9个9指标的性能,声称 Erlang 能够传输99.9999999%的数据。这时 Erlang 才开始引起人们的关注。
Erlang 的秘密是它的函数式设计范例。大部分代码都被强制运行于它的虚拟机中,这很好的避免了其他系统的干扰。函数都在虚拟机内部运行,运行在小的“类似沙箱模式 的轻量级进程中”,并且只能通过消息传递相互通讯。你不可能仅仅抓取一个指针就够快速该变指针在栈中的状态。你必须保持在调用层次内部来保证函数状态的一 致性。设计上或许有些不妥,但是这样很好的保证了错误向外扩散。
这种模式简化了运行逻辑,让运行时代码决定同时能够运行什么任务。并发处理也很容易管理,运行调度程序能够减少上下文切换。Erlang 迷们喜欢吹嘘“在Web服务器上同时运行2000万”处理器“(轻量级进程)。假如你正在构架一个类似移动电话交换机的实时收费系统,但是并没有足够的空 间存储数据,那么 Erlang 正好符合你的需求。

Go:简单、动态

谷歌不是第一家调查集合语言的组织,最终发现语言杂乱,复杂并且效率不高。2009年,谷歌发布了它自己的解决方案:一门静态类型的语言,类似于 C 语言但是包含了其所不具备的特征,它让程序员避免了类型声明和被 malloc 调用锁迷惑。通过 Go 语言,程序员能够受益于塔的简洁、已编译的c语言的结构以及动态脚本语言的的易用性。
同时,Sun 和 Apple 也以相同的方式创建了 Java 和 Swift 语言,相应的,Google 做出了一个重要的不同的决定:Go 语言的发明者希望它能足够简单以至于每个程序员都能轻松的掌握。Rob Pike,发明者之一,向 Ars Technica 豪言道:长远来说,通过将事件分开处理,你能够获得更多。因此,Go语言还有一些灵活的特性,泛型,类型继承,断言,只通过干净的简单代码块操作字符串、 数字以及哈希表。
据报道这门这门语言在巨大谷歌帝国内部被很好的接受,在其它方面也获得了认可,动态语言 Python 和 Ruby 的爱好者接受了编译已编译语言的严密性。假如你想要获得 Google 的青睐,并且需要建立服务器端的业务逻辑,那么 Go 会是一个好的选择。

Groovy:提供 Java 的脚本支持

Java 世界是异常的灵活。但是你需要仍忍受它”穿个背带裤又要系皮带”的方式,例如,声明,每个变量的类型,分行代表每行结束,类的访问只是返回一个值。但是 Go 语言瞄准了动态语言的吸引人之处并且将它自身紧紧的与 Java 相集成。
Groovy 弃置了 Java 乏味的引号和分号方式,提供一种简单的编程习惯,也能用于扩展现有的 Java代码。运行在 jvm 上。不仅仅如此,Groovy 紧紧的月 JavaJAR 相结合,所以你能和好的利用一有的Java 代码。Groovy 运行起来像一门动态类型语言,并且能够访问静态类型 Java 对象的数据。
Groovy 程序眼认为他们技术与 Java 程序员,同事也是 Groovy 程序员。基于 Java 代码,能够提供非常多的功能。充分使用 Java 拥有的闭包,操作符重载,多态性。不要忘了使用问号来做空指针的判断的简易性,这比使用 if-then 语句来判断要简单得多。因此,简洁的语法,使程序员敲击键盘次数减少了。谁会不喜欢呢?
最后,令所有 Java 程序员羡慕的动态语言的简单特点让他们能够减少工作量,有更多的娱乐时间,但是又不跳出 Java 圈。

OCaml:复杂数据层次把戏

一些程序员不喜欢声明变量,于是他们创建了动态语言。其他人喜欢声明一个变量的特定类型,integer,string 或者是 object。对于他们来说,大多胡编译型语言都对类型声明提供了支持。
这是一些喜欢详细声明变量层次类型的,甚至谈到要创建“algebras”(代数)类型。他们想象列表和多种类型的表能用来表示复杂、多层次的数据。他们提到了多态,模式匹配原型以及数据封装。这只会他们期望的复杂的,高结构化类型、原型以及原原型世界的基础。
对于他们,OCaml,一门有多个编程社区为了让前述想法被广泛接受而共同努力的语言。OCaml 提供类对象的支持,自动内存管理以及跨平台。甚至苹果App商店也提供了 OCaml 的 App 支持。OCaml 的理想的工程可能是建立一个符号数学网站来教授代数。

CoffeeScript:使 JavaScript 更简洁

技术角度来说,CoffeeScript 并不是一门语言。这是一个将你写的代码转换 Javascript 的预处理器。但是它看起来有所与众不同,因为它缺少大量的标点符号。你可以人为他是 Ruby 或者 Python,尽管内部表现像 Javascript。
当封号厌恶者被强制用浏览器支持的 Javascript 编程的时候,Coffeescript 开始流行了。改变浏览器工作的脚本语言是不切实际的,于是他们写了他们自己的预处理。结果是程序员们能够写干净的嗲吗并且让 CoffeeScript 将那些代码转译成各种符号的 Javascript 语言指令来操控浏览器。
少了分号紧紧支持开始。通过 CoffeeScript,你甚至不需要通过var来声明变量。声明函数也不需要function 关键字或者大括号。事实上,大括号在 CoffeeScript 中也不太被使用。代码是如此的简洁,以至于相比于哥特式教堂,它看起来像现代主义建筑物。这就是为什么很多新的 Javascript 框架通常是用 CoffeeScript 写的然后编译成 Javascript。

Scala:JVM上的函数式编程

假如你想要让你的代码有面向对象的清晰层次结构又喜欢函数型编程模式,那你有很多选择。假如你熟悉 Java,Scala 会是你的一个选择。
Scala 运行在 JVM 上,并将所有的清晰的函数式编程的约束转变成 Java 支持的语法以及联接到具体的 JAR 文件。假如那些额外的 JAR 中有副作用和其他不可避免的令人讨厌的头痛代码,那么使用Scala 刚刚适合业务场景,你的代码会变得很清晰。
Scala 是静态类型的。编译器负责在编译时推断出具体类型,对象类型和原始类型没有区别,因为Scala 想让每一个对象都继承自 Any。Scala 的语法比 Java 更加简洁。Scala 程序员称之为“低礼节”。你可以把驼峰式命名方式遗留在 Java 世界了。
Scala 提供了很多函数型语言的特征,例如懒初始化,尾递归,常量。但是为了能在 JVM 中运行,做了适当的修改。基本的原类型或者列表变量(像lists和哈希表),可以是可变或者不可变的。尾递归通过简单的例子运行,而不是必须通过详细声 明的可变递归。以上是 Scala 的全部实现思想,但是因为需要运行在 JVM 上,具体实现会有所限制。Scala 能够所有 Java 平台上运行,能很好的与已存在的开源 Java 代码混用。这对于许多实践性问题是一种权衡。
假如你需要将数据放在一千个处理器的集群中处理,并且有一堆遗留的 Java 代码,那么 Scala 是一个很好的解决方案。

Dart:不像 JavaScript 的 JavaScript

流行并不是被吹捧出来的。可能有越来越多领域使用到了 JavaScript,“事君数,斯辱矣;朋友数,斯疏矣”,有时候太过于亲近反而会导致疏远,疏远了然后就开始寻找替代。Dart 是 Google 出品的一门适用于 Web 浏览器端的新语言。
Dart 并没有从 JavaScript 基本概念中脱离出来。它工作在浏览器中,操作所有的 DIV 和我们所见的Web 对象。Dart 的作者仅仅只是为了清除 JavaScript 中所有恼人的部分,使之变得更简洁。底层结构并没有太大的变化。因为他们希望将 Dart 代码转成 Javascript 来提高运行速度。
高亮可能在许多 JavaScript 类库中提供的额外功能。你不需要通过 jQuery 或者其他通用类库来修改部分 HTML 页面。Dart 提供了默认的支持。也许一些熟悉的数据类型以及语法的速记技巧能够少敲几次键盘。Google 通过提供开源的支持大多数主流平台的开源工具来答题推广 Dart。
假如你正在建立一个动态的 Web 应用。并且已经对于 JavaScript 厌烦了,Dart 提供了清晰的语法结构来创建有多种 Web 资源数据的 Div 块。

Haskell:通用纯函数式编程语言

经过超过20年的时间,一直研究函数型编程的学术研究者开发了 Haskell 语言,一门用来表达他们对于副作用的坏处的想法的语言。这是一门更加存粹的表达式函数型语言,通过精细的机制来处理 I/O Channels 和其他不可避免的副作用。其余的代码应该是相当有用的。
Haskell 社区相当活跃,那里有很多 Haskell 的变体等着你去探究。有些是单机版的,其他的是通过与像 Java(Jaskell,Frege)或者 Python 那样的主流语言集成的。大多数的名字显示他们来自苏格兰,那里是 Haskell 研究,或者是哲学家/逻辑学家(他们是许多 Haskell 思想的启蒙者)的温床。假如你认为你的数据结构和类型太复杂了,你可以考虑用 Haskell。

Julia:给Python界带来了新的消息

科学计算领域有一群 Python 的爱好者,享受 Python 带来的简单语法以及能够避免陷入乱用指针和字节的细节中的自由自在。除了所有的优点,Python 通常在科学计算中处理大数据所表现的令人发狂的运行速度一值是一个诟病。为了提高运行速度,很多科学家转而使用c语言来编写核心的运行代码。但是这带来了 新的问题,用两种语言写的程序很难修改或者扩展。
Julia 是这种复杂问题的一种解决方案。它的作者带来了零 Python 程序员欣赏的干净语法并且做了稍稍修改使之能够在后台编译代码。通过这种方式,你能够像 Python 那样打开个记事本或者命令行来编码,但是你写的任何代码都会被即时编译。
Julia 真是非常了不起的语言。它提供了非常强大的类型分析引擎能够帮助优化代码。假如你喜欢元编程,这门语言提供了足够的扩展接口。它最大的附加价值是通过集群发布并行算法的简单机制。其内置了大量的数学算法库用来做数据分析。
最好的消息应该是它的运行速度。它的许多基本标准的运行速度是 Python 的30倍,甚至比 C 语言还快一点,假如你需要处理大量数据并且喜欢 Python 的语法,那么你最好快去学学 Julia 吧。
来源:程序师

不要轻易在简历上写我热爱编程,我热爱学习

95年的时候,我高中同学郭军买了一本Borland C++手册,我们两个人此后两年没机会碰真的电脑,没见过Tubro C更没见过Borland C++,生看这本书,看了两年,百看不厌。做不到,别轻易说,我热爱编程,热爱学习。
97年,父母在高考前三天给我买了一台电脑,整个假期,全部在电脑面前度过,把VB的全部文档看完,自己学会VB,啃Delphi和Borland C++的英文文档。一个假期胖了30斤,进入100公斤阵营。做不到,别轻易说,我热爱编程,热爱学习。
99年第一次接触互联网,那天晚上和4个学长用一台电脑在宿管员的办公室学习上网,最后靠着年轻抗困,他们都回寝室睡觉了,我一个人从12点钟,一 直扛到早晨9点钟,直到师兄把猫带回给老师以前,都一直在用Google搜索,渴求知道多一点关于互联网和这个世界。做不到,别轻易说,我热爱编程,热爱 学习。
01年,进入第一家公司,从趴在桌子底下连接网线的工作做起,后来做了这家公司的工资系统、饭卡系统和打卡系统,以及这几个系统的联动。做不到,别轻易说,我热爱编程,热爱学习。
07年,我和霍矩两个个人网站日流量都不过万的年轻人开始做技术咨询工作。从不会用反向代理,自学到给客户做了一个方案,到客户日流量从15万到上百万都没有改过。做不到,别轻易说,我热爱编程,热爱学习。
后来的春节,我从没有正经写过Java程序出发,用Lucene出发,写了7天写了一个搜索系统。从日搜索量单机扛10万,到后来日搜索量单机可扛2000万。做不到,别轻易说,我热爱编程,热爱学习。
我有个朋友,一个女孩儿,13-4的时候,辍学在家务农,16-7岁到北京打工,18-19岁的时候,在姐姐的理发店做理发师,挣800一个月。直 到有一天听说某青鸟出来,做程序员可以做白领,可以挣2000,求姐姐姐夫出钱,去培训。后来几经辗转,自学转型,被开过无数次,自己奋斗过无数次,做过 ASP, PHP, iOS, Android程序员,目前月薪近两万,自己买了两套房子。做不到,别轻易说,我热爱编程,热爱学习。
我司的主程Sycx,学校没正经学过编程,也没有自己学过,一直是一个混子。直到遇到iPod touch,喜欢上苹果,自己安装黑苹果,学了半年,到上海找到我问有没有工作机会。我看了他的作品,了解了他的故事,觉得基础再差没有关系,有真学习能 力的人,都有机会,结果,现在是我司最牛逼的程序员。做不到,别轻易说,我热爱编程,热爱学习。
好吧,除了惯常的装逼炫耀一下以外,我到底想说什么?
这行业这20年,是中国最好的行业,不管你的出身,你的学历,你的背景,你的户口,只要你能干活,你肯学习,你总是可以找到不错的工作,甚至可以拥有傲人的薪水。
但是,这个行业中的大多数年轻人,只会说,我热爱编程,我热爱学习。
但是,真的需要他付出努力的时候,他会说:
你能推荐几本书么?
有好的教材么?
有易学易懂的视频么?
有中文资料么?
这个技术我不懂,你可以教我么?
我英语不好。
我不会翻墙。
我们学校没教。
这东西也太难了。
学这东西有前途么?
苹果是不是要盛级而衰了?
等等,等等……
但是,你能不能稳住,问问自己,我真的热爱编程,我真的热爱学习么?
想清楚这个问题,对你的价值,太大了,值得你用一个小时去好好思考,一天,甚至一年。
苦海无边,回头是岸,等你明白了,当当当当当,回来跟老衲来唱这首Only you吧!
来源:程序师

码农、黑客和2B程序员之间的区别

笔记本电脑

码农:

黑客:

2B程序员:

求2的32次方:

码农:

System.out.println(Math.pow(2, 32));

黑客:

System.out.println(1L<<32);

2B程序员:

System.out.println(2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2);

交换两个数:

码农:

void swap(int &a,int &b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}

黑客:

void swap(int &a,int &b)
{
    a=a^b;
    b=a^b;
    a=a^b;
}

2B程序员:

void swap(int a,int b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}

类属性定义:

码农:

public static int TYPE = 1;

黑客:

/**
* 此策略下消息类型为全局类型,用以通知所有符合B05协议要求的处理者
* …… ……
*/
public static int TYPE = MsgTypes.TYPE_GLOBAL;

2B程序员:

public static String TYPE_ONE = "1";
public String TYPE = TYPE_ONE;

手机开发平台:

码农:WinCE/BlackBerry/Symbian/Android
黑客:iPhone
2B程序员:MTK

桌面应用界面开发:

码农:Swing/MFC/C#
黑客:WPF
2B程序员:VB(哈哈,不要怪我,我也做过VB项目,我没有偏见,不过关于VB的非议实在是太多太多了,连 Dijkstra都说,“It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.”)

即时通讯软件:

码农:工作:MSN,生活:Skype
黑客: 工作:GTalk、生活:保密
2B程序员: 工作:腾讯QQ,生活:QQ

问题查询:

码农: Google搜索
黑客: Google Scholar/Scirus
2B程序员: 百度知道

Window 死机的解决方案:

码农: 根据异常信息搜索问题原因和解决方法
黑客: 哥从懂事起就不用Windows的!
2B程序员: 重装系统(万能解决方案),安装360

个人Blog:

码农: CSDN/CNBlogs/BlogBus
黑客: 个人站(俺不是自夸啊,哈哈)
2B程序员: QQ空间

面试地点:

码农: 会议室/教室
黑客: 咖啡厅
2B程序员: 食堂

Java面试题目:

码农: 请分别说一说封装、继承和多态的含义?
黑客: 如果要设计一个系统,用来统计世界上所有道路的总数,你会怎样设计?
2B程序员: 请说说Spring2.5.6版本和2.5.5版本的区别?
仅此一笑,你还有什么更有意思的程序员版本?
来源:程序师

是不是太扯淡了,微信点赞,月入4万

很多商家把微信作为品牌的根据地,为了吸引更多网友成为粉丝,纷纷推出公众号,通过各种微信体验式营销活动,为粉丝提供奖品。一些微信用户看好这一商机,千方百计拉朋友点赞。更有专职“点赞党”,月累计奖品价值高达三四万元。然而,一些弄虚作假的“礼品吃家”,扰乱公平竞争秩序,误导消费者,应引起有关方面的关注。
是不是太扯淡了,微信点赞,月入4万
反映
为领奖品,有人专门收集“赞”
近日,燕赵晚报编辑部收到一封署名张先生的读者来信。来信说,他是石市一家企业微信公众号编辑,工作中他发现,该企业每次组织微信体验式营销活动,常常遇 到“礼品吃家”。即每次活动投放不久,就有微信粉丝表示,他已经集齐领奖要求,而且每次来领奖的人中,都有那张熟悉的面孔。让他奇怪的是,为什么在如此短 的时间内,那个人就能集齐这么多的赞?是不是存在造假问题?这样的“礼品吃家”会不会导致那些诚实守信的粉丝拿不到奖品?误导消费者?希望媒体关注。
微信体验式营销,也就是“微信送礼”活动。石市很多企业公众号为了吸引更多网友成为粉丝,相继推出了微信体验营销服务,通过点赞得奖品等活动,留住粉丝。 于是,微友们常在朋友圈里看到这样的请求:“为了我的港澳游,小伙伴们来点赞啊!”“这个项链想要很久了,请用赞砸晕我吧!”
2月26日,现年30岁的微友尹先生在石市一家企业的电动车微信体验式营销活动中,以最先达到50个赞的业绩,获得这家企业免费提供的价值3386元的电 动车一辆。27岁的王先生属于半专业的“点赞党”,业余时间几乎全用来参加各种微信体验式营销有奖活动,也曾获得过一部手机。他说,所谓点赞,就是微信粉 丝打开商家微信公众号活动或刊登商品广告的网页,点击表示称赞这个活动或商品,也可发动其他微友前来重复这个过程。
王先生之所以能发动微友们帮自己点赞,是因为他加入了微信互赞群,互赞群里聚集了很多像他一样需要互相帮助点赞的人。帮助点赞的人多了,获奖机会也就水涨船高。
微友尹先生今年春节才开始接触商家点赞营销活动,每次参与几乎都中奖,获奖率98%。最小的奖品是冰淇淋,最大的奖品是冰箱和电动车,月累计奖品折合人民币万元以上。
还有位专职从事点赞活动的微友,月收入达到三四万。不久前,他集齐了1573个赞,获得一部价值5000多元的平板电脑。
调查
专职“点赞党”,月收入三四万元
揭秘
网上买“赞”获奖,卖掉礼品赚钱
一些商家为了获得更多粉丝,竞相抛出惊人的诱饵,奖品越来越多,也催生了一些用不良手段获取奖品者。有微友揭秘,靠造假获奖者,主要是在淘宝上花钱买赞。
记者网上搜索发现,有多个做“卖赞”生意的商家,购买者很多,店铺成交量从几十到几千不等。一位不愿透露姓名的微友告诉记者,他参加商家微信有奖营销活 动,专门挑选有贵重礼品的大企业,可单靠拉朋友点赞很难获奖,因此他常常在网上买赞,每个赞0.5-0.8元不等,一个半小时,就能刷到100个赞。以每 个赞0.6元计算,100个赞花费60元,而获得的奖品在网上七八折卖掉后,其价值远远超出买赞支出。因此,他借此开始公司性运作赚钱。还有一种造假方 式,是用电脑PS图像处理技术,制作一张有很多人点赞的图片,然后发给商家。
有的商家营销不靠谱,常玩失踪
商家将微信公众号作为品牌的根据地,当有奖营销吸引来的粉丝转为忠实粉丝后,与商家就慢慢建立起信任关系,最终会成为广告商品买家。可事实上,并非所有搞 活动的商家都讲诚信。29岁的微友杨女士说,她参与的商家微信体验式营销活动,中奖率并不高。其原因,主要是遇到了很多不靠谱的商家。有的商家点赞活动, 中途会莫名其妙地“消失”;有的则让你集满30个赞,再集50个,让你防不胜防。
观点
商家:有的不在乎有的呼吁禁止
一家商城负责微信公众号的人士表示,他们欢迎粉丝通过积极的点赞、转发,争当“礼品吃客”,并不担心“礼品吃客”会影响企业微信平台的经营。某旅行社王经理也认为,微信营销能对自己的企业产生良好的口碑宣传,不太在意“礼品吃客”问题。
然而,也有商家认为企业免费提供礼品的目的,是让更多的微友订阅自己的公众号,如果有人将其商业化运营,无形中对企业微信运营造成了不良影响,误导了消费者,理应禁止。
律师:商家微友都违法
河北明杰律师事务所王惠民律师认为,商家以物质利益诱惑微友点赞支持自己的活动或产品的行为,侵犯了微友和消费者的知情权,违反了消法规定,属于不正当竞争。微友在不知商家产品质量的情况下,为一己私利,拉朋友点赞、网上买赞的行为,帮企业误导他人,也属于违法行为。
网站:不允许点赞营销
既然点赞营销存有诸多弊端,为何还有那么多商家在搞?记者在腾讯网了解到,早在去年他们就在公众平台上提示,不允许企业搞点赞营销,可仍有很多企业在利益 的驱使下,我行我素。为搭建企业和微友之间良好互动平台,一家企业微信负责人表示,今后将采取线上线下相结合的方式,不但让粉丝在网上参与企业营销活动, 还要把他们请到活动现场,当面倾听他们对企业活动和产品的理解,由管理者评出获奖者。
来源:94dede.com

编程中的“末行效应”

我研究过数百个因“拷贝-粘贴”导致的错误。可以肯定的是,程序员常常会在一大段代码的最后一段里犯错。好像还没有任何编程书讨论过这种现象,因此我决定自己写点什么。我称之为“末行效应”。
编程中的“末行效应”1
我叫Andrey Karpov,我的工作有点不寻常:我借助静态分析工具研究各种应用程序代码,并描述从中找到的错误或者缺陷。我这么做既有实际效益也因为工作需要。使用 的方法正是基于我们公司所推广的PVS-Studio和CppCat工具的原理。套路很简单:找bug,然后写文章分析bug,文章吸引到潜在用户的注 意,接着就是收益。但今天这篇文章不是介绍这些工具的。
在分析各种软件项目的过程中,我把找到的bug以及相关代码存入一个特殊的数据库。顺便说一下,有兴趣的话各位可以看一看这个数据库。我们把它转换成网页格式并上传到了公司网站的“Detected errors”栏下。
这个数据库独一无二!目前它收录了1500块问题代码片,正等着程序员们去研究,从中总结出特定规律。为将来的研究,手册和文章奠定一个基础。
我还没认真地分析过目前搜集到的材料。但是过程中我发现有一个明显的模式反复出现,决定深入研究一下。你大概看到了,文中我反复使用短语“注意最后一行”。在我看来,这一定有某种规律。

末行效应

编程的时候,程序员常常需要写一系列相似的结构。逐行敲键盘输入无聊且低效。这就是为什么他们会使用奥义-“拷贝-粘贴”大法:一段代码被拷贝粘贴 几次,然后修改。谁都知道这样做的坏处:你很容易在粘贴后忘记修改某些内容最后滋生出问题。不幸的是,常常找不到比这更好的方法。
那么我发现了什么规律呢?我发现错误常常发生在最后的一块粘贴代码里。
下面是一个简短的例子:

inline Vector3int32&amp; operator+=(const Vector3int32&amp; other) {
  x += other.x;
  y += other.y;
  z += other.y;
  return *this;
}
 

注意这一行:”z += other.y;”。程序员忘记把‘y’替换成‘z’了。
也许你以为这是个假设的例子,然后它其实来自一个真实的应用程序。接下来,我会让你相信这是高频常见的一种错误。程序员们经常在一连串相似操作的结尾犯这种错误。
我听说攀岩者常常在最后的几十米中滑落下来。并不是因为他们累了,而正是由于他们对即将到达的终点过于兴奋,他们想象着成功后的喜悦,变得疏忽大意,最后失足。我猜想程序员们也是这样的。
接下来看一组数据。
研究了数据库后,我分离出了84个代码段由“拷贝-粘贴”大法生成。其中41段中错误发生在中间的某些粘贴块。比如:

strncmp(argv[argidx], "CAT=", 4) &amp;&amp;
strncmp(argv[argidx], "DECOY=", 6) &amp;&amp;
strncmp(argv[argidx], "THREADS=", 6) &amp;&amp;
strncmp(argv[argidx], "MINPROB=", 8)) {
 

“THREADS=”字符串的长度是8个字符,而非6。
另外的43段代码中,错误发生在最后的粘贴块。
当然,43比41大不了多少。但是请注意,一段程序中,可能有很多类似的代码块,因此错误可能发生在第一,第二,第五甚至第十块中。因此在其他代码块中我们有一个相对均匀的分布,而最后一块却存在一个峰值。
平均而言,相似代码块总数为5。
于是前面4个代码块中均匀分布了41处错误,平均每块代码有10个错误。
然而最后一块代码中有43个错误!
下面的分布概图凸显出这个现象:
编程中的“末行效应”2
因此我们可以总结出一个规律:
在最末的粘贴代码块中出错的概率是其他代码块的4倍。
这个规律可能并没有普适性。它只是个有趣的发现,其实际效用在于:提醒在你写最后一块的时候保持警觉。

实例:

下面我要证明这并不是我的胡思乱想而是有真实的趋势的。请看下面的实例。
当然,我不会列出所有例子,仅列举简单而有代表性的。

Source Engine SDK

[cc lang=”c”] inline void Init( float ix=0, float iy=0,
float iz=0, float iw = 0 )
{
SetX( ix );
SetY( iy );
SetZ( iz );
SetZ( iw );
}
[/code] 最后一行应该是SetW()。

Chromium

if (access &amp; FILE_WRITE_ATTRIBUTES)
  output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n"));
if (access &amp; FILE_WRITE_DATA)
  output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
if (access &amp; FILE_WRITE_EA)
  output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
if (access &amp; FILE_WRITE_EA)
  output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
break;
 

最后两行相同。

ReactOS

if (*ScanString == L'\"' ||
    *ScanString == L'^' ||
    *ScanString == L'\"')
 

Multi Theft Auto

[cc lang=”java”] class CWaterPolySAInterface
{
public:
WORD m_wVertexIDs[3];
};
CWaterPoly* CWaterManagerSA::CreateQuad (….)
{
….
pInterface->m_wVertexIDs [ 0 ] = pV1->GetID ();
pInterface->m_wVertexIDs [ 1 ] = pV2->GetID ();
pInterface->m_wVertexIDs [ 2 ] = pV3->GetID ();
pInterface->m_wVertexIDs [ 3 ] = pV4->GetID ();
….
}
[/code] 最后一行冗余代码来自于惯性粘贴。数组的大小是3。

Source Engine SDK

intens.x=OrSIMD(AndSIMD(BackgroundColor.x,no_hit_mask),
                AndNotSIMD(no_hit_mask,intens.x));
intens.y=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask),
                AndNotSIMD(no_hit_mask,intens.y));
intens.z=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask),
                AndNotSIMD(no_hit_mask,intens.z));
 

程序员忘记把最后一行的中的“BackgroundColor.y”改成“BackgroundColor.z”。

Trans-Proteomic Pipeline

[cc lang=”c”] void setPepMaxProb(….)
{
….
double max4 = 0.0;
double max5 = 0.0;
double max6 = 0.0;
double max7 = 0.0;
….
if ( pep3 ) { … if ( use_joint_probs && prob > max3 ) … }
….
if ( pep4 ) { … if ( use_joint_probs && prob > max4 ) … }
….
if ( pep5 ) { … if ( use_joint_probs && prob > max5 ) … }
….
if ( pep6 ) { … if ( use_joint_probs && prob > max6 ) … }
….
if ( pep7 ) { … if ( use_joint_probs && prob > max6 ) … }
….
}
[/code] 程序员忘记把最后一个判断中的“prob > max6”改为“prob > max7”。

SeqAn

[cc lang=”c”] inline typename Value<Pipe>::Type const & operator*() {
tmp.i1 = *in.in1;
tmp.i2 = *in.in2;
tmp.i3 = *in.in2;
return tmp;
}
[/code]

SlimDX

[cc lang=”c”] for( int i = 0; i<2; i++ ) { sliders[i] = joystate.rglSlider[i]; asliders[i] = joystate.rglASlider[i]; vsliders[i] = joystate.rglVSlider[i]; fsliders[i] = joystate.rglVSlider[i]; } [/code] 最后一行应该用rglFSlider。

Qt

[cc lang=”c”] if (repetition == QStringLiteral(“repeat”) ||
repetition.isEmpty()) {
pattern->patternRepeatX = true;
pattern->patternRepeatY = true;
} else if (repetition == QStringLiteral(“repeat-x”)) {
pattern->patternRepeatX = true;
} else if (repetition == QStringLiteral(“repeat-y”)) {
pattern->patternRepeatY = true;
} else if (repetition == QStringLiteral(“no-repeat”)) {
pattern->patternRepeatY = false;
pattern->patternRepeatY = false;
} else {
//TODO: exception: SYNTAX_ERR
}
[/code] 最后一块少了‘patternRepeatX’。正确的代码应该是:
[cc lang=”c”] pattern->patternRepeatX = false;
pattern->patternRepeatY = false;
[/code]

ReactOS

[cc lang=”c”] const int istride = sizeof(tmp[0]) / sizeof(tmp[0][0][0]);
const int jstride = sizeof(tmp[0][0]) / sizeof(tmp[0][0][0]);
const int mistride = sizeof(mag[0]) / sizeof(mag[0][0]);
const int mjstride = sizeof(mag[0][0]) / sizeof(mag[0][0]);
[/code] ‘mjstride’永远等于1。最后一行应该是:

const int mjstride = sizeof(mag[0][0]) / sizeof(mag[0][0][0]);

Mozilla Firefox

if (protocol.EqualsIgnoreCase("http") ||
    protocol.EqualsIgnoreCase("https") ||
    protocol.EqualsIgnoreCase("news") ||
    protocol.EqualsIgnoreCase("ftp") ||          <<<---
    protocol.EqualsIgnoreCase("file") ||
    protocol.EqualsIgnoreCase("javascript") ||
    protocol.EqualsIgnoreCase("ftp")) {          <<<---

最后的“ftp”很可疑,它之前已经被比较过了。

Quake-III-Arena

if (fabs(dir[0]) > test->radius ||
    fabs(dir[1]) > test->radius ||
    fabs(dir[1]) > test->radius)

dir[2]的值忘记检查了。

Clang

return (ContainerBegLine <= ContaineeBegLine &&
        ContainerEndLine <= ContaineeEndLine &&
        (ContainerBegLine != ContaineeBegLine ||
         SM.getExpansionColumnNumber(ContainerRBeg) <=
         SM.getExpansionColumnNumber(ContaineeRBeg)) &&
        (ContainerEndLine != ContaineeEndLine ||
         SM.getExpansionColumnNumber(ContainerREnd) >=
         SM.getExpansionColumnNumber(ContainerREnd)));

最后一块,“SM.getExpansionColumnNumber(ContainerREnd)”表达式在跟自己比较大小。

MongoDB

bool operator==(const MemberCfg& r) const {
  ....
  return _id==r._id && votes == r.votes &&
         h == r.h && priority == r.priority &&
         arbiterOnly == r.arbiterOnly &&
         slaveDelay == r.slaveDelay &&
         hidden == r.hidden &&
         buildIndexes == buildIndexes;
}

程序员把最后一行的“r”忘记了。

Unreal Engine 4

static bool PositionIsInside(....)
{
  return
    Position.X >= Control.Center.X - BoxSize.X * 0.5f &&
    Position.X <= Control.Center.X + BoxSize.X * 0.5f &&
    Position.Y >= Control.Center.Y - BoxSize.Y * 0.5f &&
    Position.Y >= Control.Center.Y - BoxSize.Y * 0.5f;
}

最后一行中,程序员忘记了两个地方。首先,“>=”应改为“<=”,其次,减号应改为加号。

Qt

qreal x = ctx->callData->args[0].toNumber();
qreal y = ctx->callData->args[1].toNumber();
qreal w = ctx->callData->args[2].toNumber();
qreal h = ctx->callData->args[3].toNumber();
if (!qIsFinite(x) || !qIsFinite(y) ||
    !qIsFinite(w) || !qIsFinite(w))

最后一个qlsFinite中,传入参数应该是‘h’。

OpenSSL

if (!strncmp(vstart, "ASCII", 5))
  arg->format = ASN1_GEN_FORMAT_ASCII;
else if (!strncmp(vstart, "UTF8", 4))
  arg->format = ASN1_GEN_FORMAT_UTF8;
else if (!strncmp(vstart, "HEX", 3))
  arg->format = ASN1_GEN_FORMAT_HEX;
else if (!strncmp(vstart, "BITLIST", 3))
  arg->format = ASN1_GEN_FORMAT_BITLIST;

字符串“BITLIST”长度为7,而非3。
就此打住吧。我举的例子已经够说明问题了吧?

结论

本文告诉你“拷贝-粘贴”大法在最后一个粘贴代码块中出错的概率很可能是其他块的4倍。
这跟人类的心理学有关,与技术水平无关。文中说明了即便是像Clang或者Qt项目中的编程高手也会犯这种错误。
我希望这个现象的发现对于程序员们有所帮助,也许可以促使他们去研究我们的bug数据库。相信如此有助于在这些错误中发现新的规律并总结出新的编程建议。

历史上最伟大的12位程序员

所谓程序员,是指那些能够创造、编写计算机程序的人。不论一个人是什么样的程序员,或多或少,他都在为我们这个社会贡献着什么东西。然而,有些程序 员的贡献却超过了一个普通人一辈子能奉献的力量。这些程序员是先驱,受人尊重,他们贡献的东西改变了我们人类的整个文明进程。下面就让我们看看人类历史上 最伟大的12位程序员。

1、第一位计算机程序员:埃达·洛夫莱斯 Ada Lovelace

历史上最伟大的12位程序员1
埃达·洛夫莱斯,原名奥古斯塔·埃达·拜伦,是著名英国诗人拜伦之女。数学爱好者,被后人公认为第一位计算机程序员。
在1842年与1843年期间,埃达花了9个月的时间翻译意大利数学家路易吉·米那比亚讲述查尔斯·巴贝奇计算机分析机的论文。在译文后面,她增加 了许多注记,详细说明用该机器计算伯努利数的方法,被认为是世界上第一个计算机程序;因此,埃达也被认为是世界上第一位程序员。不过,有传记作者也因为部 份的程序是由巴贝奇本人所撰,而质疑埃达在电脑程序上的原创性。
埃达的文章创造出许多巴贝奇也未曾提到的新构想,比如埃达曾经预言道:‘这个机器未来可以用来排版、编曲或是各种更复杂的用途。’
1852年,埃达为了治疗子宫颈癌,却因此死于失血过多,年仅36岁。她死后一百年,于1953年,埃达之前对查尔斯·巴贝奇的《分析机概论》所留下的笔记被重新公布,并被认为对现代计算机与软件工程造成了重大影响。

2、Pascal之父:尼克劳斯·维尔特 Niklaus Wirth

历史上最伟大的12位程序员2
尼克劳斯·埃米尔·维尔特,生于瑞士温特图尔,是瑞士计算机科学家。
从1963年到1967年,他成为斯坦福大学的计算机科学部助理教授,之后又在苏黎世大学担当相同的职位。1968年,他成为苏黎世联邦理工学院的信息学教授,又往施乐帕洛阿尔托研究中心进修了两年。
他是好几种编程语言的主设计师,包括 Algol W,Modula,Pascal,Modula-2,Oberon等。
他亦是Euler语言的发明者之一。1984年他因发展了这些语言而获图灵奖。他亦是Lilith电脑和Oberon系统的设计和运行队伍的重要成员。
他的文章Program Development by Stepwise Refinement视为软件工程中的经典之作。他写的一本书的书名Algorithms + Data Structures = Programs(算法+数据结构=程序)是计算机科学的名句。

3、微软创始人:比尔·盖茨 Bill Gates

历史上最伟大的12位程序员3
威廉·亨利·”比尔”·盖茨三世,是一名美国著名企业家、投资者、软件工程师、慈善家。早年,他与保罗·艾伦一起创建了微软公司,曾任微软董事长、CEO和首席软件设计师,并持有公司超过8%的普通股,也是公司最大的个人股东。

4、Java之父:詹姆斯·高斯林 James Gosling

历史上最伟大的12位程序员4

詹姆斯·高斯林,出生于加拿大,软件专家,Java编程语言的共同创始人之一,一般公认他为“Java之父”。
在他12岁的时候,他已能设计电子游戏机,帮忙邻居修理收割机。大学时期在天文系担任程式开发工读生,1977年获得了加拿大卡尔加里大学计算机科 学学士学位。1981年开发在Unix上运行的Emacs类编辑器Gosling Emacs(以C语言编写,使用Mocklisp作为扩展语言)。1983年获得了美国卡内基梅隆大学计算机科学博士学位,博士论文的题目是:”The Algebraic Manipulation of Constraints”。毕业后到IBM工作,设计IBM第一代工作站NeWS系统,但不受重视。后来转至Sun公司。1990年,与Patrick Naughton和Mike Sheridan等人合作“绿色计划”,后来发展一套语言叫做“Oak”,后改名为Java。1994年底,James Gosling在硅谷召开的“技术、教育和设计大会”上展示Java程式。2000年,Java成为世界上最流行的电脑语言。

5、Python之父:吉多·范罗苏姆 Guido van Rossum

历史上最伟大的12位程序员5
吉多·范罗苏姆是一名荷兰计算机程序员,他作为Python程序设计语言的作者而为人们熟知。在Python社区,吉多·范罗苏姆被人们认为是“仁慈的独裁者(BDFL)”,意思是他仍然关注Python的开发进程,并在必要的时刻做出决定。
2002年,在比利时布鲁塞尔举办的自由及开源软件开发者欧洲会议上,吉多·范罗苏姆获得了由自由软件基金会颁发的2001年自由软件进步奖。2003年五月,吉多获得了荷兰UNIX用户小组奖。2006年,他被美国计算机协会(ACM)认定为著名工程师。

6、B语言、C语言和Unix创始人:肯·汤普逊 Ken Thompson

历史上最伟大的12位程序员6
肯尼斯·蓝·汤普逊,小名为肯·汤普逊,生于美国新奥尔良,计算机科学学者与软件工程师。他与丹尼斯·里奇设计了B语言、C语言,创建了Unix和Plan 9操作系统,他也是编程语言Go的共同作者。与丹尼斯·里奇同为1983年图灵奖得主。
肯·汤普逊的贡献还包括了发展正规表示法,写作了早期的电脑文字编辑器QED与ed,定义UTF-8编码,以及发展电脑象棋。

7、现代计算机科学先驱:高德纳 Donald Knuth

历史上最伟大的12位程序员7
唐纳德·尔文·克努斯,出生于美国密尔沃基,著名计算机科学家,斯坦福大学计算机系荣誉退休教授。高德纳教授为现代计算机科学的先驱人物,创造了算 法分析的领域,在数个理论计算机科学的分支做出基石一般的贡献。在计算机科学及数学领域发表了多部具广泛影响的论文和著作。1974年图灵奖得主。
高德纳最为人知的事迹是,他是《计算机程序设计艺术》(The Art of Computer Programming)的作者。此书是计算机科学界最受高度敬重的参考书籍之一。此外还是排版软件TEX和字体设计系统Metafont的发明人。提出 文学编程的概念,并创造了WEB与CWEB软件,作为文学编程开发工具。

8、《C程序设计语言》的作者:布莱恩·柯林汉 Brian Kernighan

历史上最伟大的12位程序员8
布莱恩·威尔森·柯林汉,生于加拿大多伦多,加拿大计算机科学家,曾服务于贝尔实验室,为普林斯顿大学教授。他曾参与Unix的研发,也是AMPL与AWK的共同创造者之一。
与丹尼斯·里奇共同写作了C语言的第一本著作《C程序设计语言》之后,他的名字开始为人所熟知。他也创作了许多Unix上的程式,包括在Version 7 Unix上的 ditroff 与 cron。

9、互联网之父:蒂姆·伯纳斯-李 Tim Berners-Lee

历史上最伟大的12位程序员9
蒂莫西·约翰·伯纳斯-李爵士,昵称为蒂姆·伯纳斯-李(Tim Berners-Lee),英国计算机科学家。他是万维网的发明者,麻省理工学院教授。1990年12月25日,罗伯特·卡里奥在CERN和他一起成功通 过Internet实现了HTTP代理与服务器的第一次通讯。
伯纳斯-李为关注万维网发展而创办的组织,万维网联盟的主席。他也是万维网基金会的创办人。伯纳斯-李还是麻省理工学院计算机科学及人工智能实验室创办主席及高级研究员。同时,伯纳斯-李是网页科学研究倡议会的总监。最后,他是麻省理工学院集体智能中心咨询委员会成员。
2004年,英女皇伊丽莎白二世向伯纳斯-李颁发大英帝国爵级司令勋章。2009年4月,他获选为美国国家科学院外籍院士。在2012年夏季奥林匹 克运动会开幕典礼上,他获得了“万维网发明者”的美誉。伯纳斯-李本人也参与了开幕典礼,在一台NeXT计算机前工作。他在Twitter上发表消息说: “这是给所有人的”,体育馆内的LCD光管随即显示出文字来。

10、C++之父:比雅尼·斯特劳斯特鲁普 Bjarne Stroustrup

历史上最伟大的12位程序员10
比雅尼·斯特劳斯特鲁普,生于丹麦奥胡斯郡,计算机科学家,德州农工大学工程学院的计算机科学首席教授。他以创造C++编程语言而闻名,被称为“C++之父”。
用斯特劳斯特鲁普他本人的话来说,自己“发明了C++,写下了它的早期定义并做出了首个实现……选择制定了C++的设计标准,设计了C++主要的辅 助支持环境,而且负责处理C++标准委员会的扩展提案。”他还写了一本《C++程序设计语言》,它被许多人认为是C++的范本经典,目前是第四版(于 2013年5月19日出版),最新版中囊括了C++11所引进的一些新特性。

11、Linux之父:林纳斯·托瓦兹 Linus Torvalds

历史上最伟大的12位程序员11
林纳斯·本纳第克特·托瓦兹,生于芬兰赫尔辛基市,拥有美国国籍。他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者,是当今世界最著名的电脑程序员、黑客之一。他还发起了Git这个开源项目,并为主要的开发者。
林纳斯在网上邮件列表中也以火暴的脾气著称。例如,有一次与人争论Git为何不使用C++开发时与对方用“放屁”(原文为“bullshit”)互 骂。他更曾以“一群自慰的猴子”(原文为“OpenBSD crowd is a bunch of masturbating monkeys”)来称呼OpenBSD团队。
2012年6月14日,托瓦兹在出席芬兰的阿尔托大学所主办的一次活动时称Nvidia是他所接触过的“最烂的公司”( the worst company)和 “最麻烦的公司”(the worst trouble spot),因为Nvidia一直没有针对Linux平台发布任何官方的Optimus支持,随后托瓦兹当众对着镜头竖起了中指,说“ Nvidia,操你的! ”(So, Nvidia, fuck you!)。

12、C语言和Unix之父:丹尼斯·里奇 Dennis Ritchie

历史上最伟大的12位程序员12
丹尼斯·麦卡利斯泰尔·里奇,生于美国纽约州布朗克斯维尔(Bronxville),著名的美国计算机科学家,对C语言和其他编程语言、 Multics和Unix等操作系统的发展做出了巨大贡献。在技术讨论中,他常被称为dmr,这是他在贝尔实验室的用户名称(username)。丹尼斯·里奇与肯·汤普逊两人开发了C语言,并随后以之开发出了Unix操作系统,而C语言和Unix在电脑工业史上都占有重要的地位:C语言至今 在开发软件和操作系统时依然是非常常用,且它对许多现代的编程语言(如C++、C#、Objective-C、Java和JavaScript)也有着重 大影响;而在操作系统方面Unix也影响深远,今天市场上有许多操作系统是基于Unix衍生而来(如AIX与System V等),同时也有不少系统(通称类Unix系统)借鉴了Unix的设计思想(如Solaris、Mac OS X、BSD、Minix与Linux等),甚至以Microsoft Windows操作系统与Unix相竞争的微软也为他们的用户和开发者提供了与Unix相容的工具和C语言编译器。
来源:外刊IT

让老妈告诉你如何编程

在今天开发人员的周例会上,大家吵的不可开交,我们在讨论在敏捷开发中是否应该将“故事点(story point——敏捷开发中的一种工作量单位)”分配给修改bug和代码整理工作——将它们跟软件功能需求一样对待。我们使用的story类型都是 Pivotal Tracker系统里缺省指定的。概括起来,通常认为软件功能单位是一种能够给用户带来价值的“story”(所有你可以对它们使用这样的套话“做为一个用户,我想要的是…”),但bug和代码整理工作不属于这类(尽管它们有些是必须处理的,例如偿还技术债务)。
根据Pivotal Tracker系统里的设定,只有软件功能特征才配分配给”故事点“。团队的“成绩”依仗于在过去的3-4个迭代开发周期里完成的“故事点”的多少,所 以,如果你将大量的时间浪费在重构代码和修改bug上,你的“成绩”就会下滑。于是,经理会极力反对将“故事点”分配给代码整理和修改bug,因为“只有 把时间用在开发功能上,客户才会认可我们的努力工作”。
让老妈告诉你如何编程
遇到这种情况,勾起了我对往事的一段回忆,那是我在童年时整理房屋的事情。如果你跟我小时候一样邋遢懒惰,你会像我一样将脏袜子、糖纸丢的满地都 是,几乎看不到地板。妈妈会反复唠叨说“每天记住把袜子丢进洗衣机,把糖纸丢进垃圾桶,这样你就永远不需要打扫房间。”但有时候,这些事情看起来需要太多 的努力,于是垃圾总是越积越多,直到无法忍受。
问题是,正确的保持室内整洁的方法给人太大的压力。于是,大家最终还是选择了将脏衣服不断的塞到衣橱里,用力的推衣橱门关上(用力,不然会塌落出来),这样屋里似乎整洁了。但事实上,脏乱依旧存在,尽管你看不见(不想看见)它。
修改Bug和整理代码的努力对于软件开发来说是同样的道理。敏捷开发中使用“故事点”的最大好处是,用给用户创造了多少价值来衡量一个程序员的生产 效率,这样正确的激励程序员的工作积极性。将“故事点”分配给bug修改?花一个月时间里重构代码中的数据库层?你的“成绩”的下降是指警告你某些事情有 问题。你需要思考,需要明白这是为什么,以及如何纠正。
也许是你的需求不完整,或根本就是错误的,你并没有开发客户真正想要的东西。也许你没有写出足够的单元测试和集成测试,所以在开发迭代中bug越来越多。也许你们的编码速度太快,没有充分的规划,所以你的架构设计无法接入新来的需求,需要频繁、大量的重构。
不管是哪种情况,如果必须把“故事点”分配给bug和代码整理,这是存在底层问题的一种反映,就像是整理房间一样。让“故事点”充分发挥它的作用,让它提示你在你们的开发过程中存在潜在的问题。但不要只理解我的话的表面意思,就像你妈妈如何告诉你整理房间的话一样。
来源:外刊IT

千万别理程序员

很多时候,我发现自己需要向编程界以外的人反复解释为什么随意的打搅一个编程中的程序员是多么的讨厌。我需要费力的向他们解释什么是‘流’境界——程序员陷入深深思考和理解一个问题时,一个电话,一个提问,甚至一句“你好”,都会像一声炸雷似的将程序员从“盗梦空间”里惊醒——梦境中建好的一切建筑都会立刻坍塌。
很简单——这是一种非常脆弱易碎的精神境界。
千万别理程序员2
让我很高兴的是,ninlabs研究所的Chris Parnin (@chrisparnin)刊登了一篇非常好的文章,正是关于外界打搅对工作效率和注意力的影响,伴有非常严谨的科学分析。这篇文章里说:

基于从86位程序员使用Eclipse和VisualStudio的1万次编程活动采样的分析,以及对414位程序员的问卷(Parnin:10),我们发现:

当修改一个程序函数时被打搅,只有十分之一的程序员能在一分钟内回到之前的思路。
一个程序员打搅后,他需要10-15分钟的时间才能重新恢复到之前的编程状态。
程序员一天中只能得到一段2小时不被打搅的时间。
太残忍了。
对程序员影响最大的打搅是发生在什么时候?

研究显示,影响最大的打搅是发生在程序员的大脑高负荷运转时,如果运用神经运动来反映大脑负荷,比如瞳孔测量法,结果显示,瞳孔扩展到峰值的时候的打搅最具摧毁力。

“我们称之为‘处于流境界’” – Chris解释什么是’最高负荷’时说。
被打搅最大的坏处是影响工作效率,这是我这么多年一种反复强调的事。我很高兴有科学的试验论证了这一点。
很好的一篇文章,我高度推荐那些认为程序员脾气暴躁的人去看看。它也许能改变你的偏见。

程序员如何留住健康?

相信大家已经注意到了,程序员的大部分时间都花在电脑桌前编程,这会损害程序员的健康。其实不需要多么复杂的养生,你只需每天做一些小小的改变,就可以摆脱病痛、保持健康。
程序员如何留住健康

变换姿势

虽然站立桌、昂贵的椅子和一些基于人体工程学的玩意的确很酷,哪怕LINUS(linux创始人)都在踏步机前工作,而事实上你并不需要这些。
关键是要变换姿势,如果你保持一个姿势数个小时不活动,你的脖子在数天后疼痛是必然的。每15分钟站起、坐下、跳、蹲下、活动一下手脚、放松一下眼睛;每小时变换一下姿势;每天走一走,爬一些楼梯,保证你的健康会得到很大的改善,关节的僵硬和肌肉的疼痛都会得到缓解。
我个人拥有一个电动站立式办公桌, 每个小时我都变换一下姿势。而且我运行一个程序来提醒我每15分钟做一个小休息,每个小时做时间较长的休息。对于苹果X操作系统而言,有个“Time out”应用非常好,在windows上,我一般采用“Big Stretch Reminder”。

锻炼

锻炼是改善健康最好的方法之一,但是必须用正确的方法锻炼。首先要确保不要在无用的事情上浪费时间。

不要跑步

跑步被广泛当作一种锻炼方式,其实并不适用于所有人。在决定通过跑步来锻炼以前,你需要确认两件事情:1 你的身体状态足以满足跑步锻炼所需,一个严酷的事实是大部分程序员达不到跑步锻炼所需的身体条件。(译者注:对胖程序猿来说,跑步极有可能会损伤膝关 节)2 跑步锻炼需要掌握正确的跑步姿势和跑步方法。
我曾经常跟随在街道跑步的人们,紧跟他们的步伐和僵硬的背部(译者注:作者可能指一部分跑步的人姿势不对,背部僵硬),不正确的跑步姿势极有可能损 伤背部和膝部。如果你想跑步锻炼,请先确保体重不要过大,学习正确的姿势和方法,以慢速跑和短距离跑开始练习。所有超过5公里的跑步练习都是过度的,最好 是不要以跑步来锻炼(译者注:对长期缺乏锻炼的程序员而言?)

不要骑自行车

你都在电脑前坐了一天了,锻炼的时候又坐在自行车上,哈哈。多么有才的选择啊,先生!如果你真的喜欢骑自行车,那么去骑吧,但不要期望能从中得到什么。

不要到健身房健身

高强度的健身方式适用于有意保持健美外形或有意取得某种特定目标的职业人士。通常,高强度训练不适合程序员们。
我们都有自己的职业目标和适合自己的使命,所以就不要玩健身了嘛。
没有效果,太多疼痛和受伤。健康的程序员不需要高强度健身。

应该步行健身

步行比跑步和其他的方式更好。步行简单、安全而且有效。我每天步行5-10公里,这个习惯给我的健康带来很大的改善。请买双薄鞋底的好鞋子(仔细看好,不要买仿制经典篮球鞋)开始步行锻炼吧!
如果感到太单调,跑步时可听电子书或者播客。边学习边锻炼,多么充实!

更强壮 更灵活

你开始步行锻炼了?很好。让我们进入下一级。首先学会正确的腹式呼吸。这可能需要花几天甚至几个星期的时间来养成这个锻炼时的呼吸习惯,这个技能非常必须,可有效缓解颈部和上背部的疼痛。
程序员们花了太多时间坐在电脑前,可能都忘记怎么运动了。建议从头开始,但不需要任何额外的器材,你只需要在视频网站上搜索运动操视频,然后跟着一起运动即可。
当你的移动变得自然平稳,当你走路柔软得像老虎,当你采用腹式呼吸,你的身材正在变得优雅,而大部分疼痛都将离你而去。我建议以下简单的辅助练习:
俯卧撑、下蹲、引体向上和桥式运动。使所有事情简化而不是复杂化。设定小的目标,百分之百关注在动作技巧上。如果你有兴趣,请阅读《The Naked Warrior by Pavel Tsatsouline (裸体战士)》 这本书有很多智慧技巧能帮助你进步。

睡眠

最后,我必须指出的是优质睡眠。大家知道,但却实践的少。使你自己在一个结实的床垫上度过一整晚。不要在晚上还盯着电脑或者手机和平板,至少保证睡前一小时不使用这些电子产品。10点上床,6点半起床,你就是个快乐程序员!

结论:

你已经知道了,获得健康很容易。只需保持以下习惯:

  • 变换姿势
  • 经常休息
  • 不做蠢事,比如高强度器材健身
  • 更多的步行
  • 正确呼吸
  • 训练灵活性和力量
  • 更多的睡眠

只要坚持几个月,你就会看到收获。
来源:外刊IT

Linux之父Linus说:并行计算基本上就是浪费大家的时间

本文的内容翻译自 Linux 之父 linus torvalds 最近发表的一个帖子。
并行计算有什么好的?
硬件的性能无法永远提升,当前的趋势实际上趋于降低功耗。那么推广并行技术这个灵丹妙药又有什么好处呢?我们已经知道适当的乱序CPU是必要的,因为人们需要合理的性能,并且乱序执行已被证明比顺序执行效率更高。
推崇所谓的“并行”极大地浪费了大家的时间。“并行更高效”的高大上理念纯粹是扯淡。大容量缓存可以提高效率。在一些没有附带缓存的微内核上搞并行毫无意义,除非是针对大量的规则运算(比如图形处理)。
没人会回到从前了。那些复杂的乱序运行内核不会消失。扩展不会一直进行下去,人们需要的是移动性,因此那些主张扩展至上百内核的都是疯子,不要鸟他们。
他们究竟是如何幻想那些神奇的并行算法会有用武之地的呢?
并行是浪费时间
并行只有对图形计算和服务器有意义,而在这些领域我们已经大量应用并行了。把并行推广到其他的领域没有意义。
所以说忘记并行吧。它不会到来的。4个左右的内核对终端用户来说没有问题,在移动领域里,不大幅增加能耗的情况下,你没办法再塞进更多的核。任何一个理智的人都不会为了要塞入更多的内核而阉割内核以降低其大小和性能,阉割内核的唯一理由是你想进一步降低功耗,因此你还是不会得到大量的核。
所以争论是否要讲究程序的并行性根本就是谬误,其前提条件都是错误的。它只不过是一个早该过时的时髦术语罢了。
并行程序在上面提到的一些地方是有用的,并且已经大量地运用了,比如在服务器领域,人们已经并行很多年了。
在其他的领域,并行不是一定必须的,即便是在将来的一些未知领域也是如此,因为你做不到。假如你要做低功耗通用计算机视觉,我基本可以保证你不会使用通用图形处理器(GP CPU)。你甚至不会用图形处理器,因为其功耗也太高了。你大概会用特殊的硬件,很可能是基于某些神经网络的硬件。
放弃吧。“并行就是未来”的说法就是一片浮云。
Linus
来源:外刊IT

程序员们,让你的孩子当个网页工程师吧!

截止到今天凌晨,互联网上已经有大概 6 亿 8 千万张网页,而且依然在迅速增加。今天就来严肃地展开一下网页工程师的话题吧,关于他们的工作,关于他们的职业;关于 HTML,关于 Python;关于浏览器,关于这个世界。
程序员们
周围有一些朋友的孩子也快要诞生了,将来可以考虑做个网页工程师呢~
每天的我们,在 (还算) 安静的办公室里,面对着电脑屏幕,忍受着窗外的喧嚣,随手点开浏览器,输入一段 URL,敲下回车键。有没有这样的体验,网站瞬间被打开了,高质量的内容,干净的布局和优秀的设计让你过目难忘。感到吃惊是吧?这一切都归功于一类人,网 页工程师,所谓的 Web Developers 们,他们不仅负责网站的搭建和网页的编码,还负责各种测试分析,以及一切和网站相关的维护。
如今网页的重要性毋庸置疑,在商业上,好的网站已经是企业保持竞争力的重要环节。伴随着网页开发技术的日新月异,优秀的网站层出不穷,网页工程师对于自己的工作已经不能有半点马虎,成为一个好的网页工程师也没有任何的捷径。
但问题就来了,正在频繁迭代产品的苦逼创业者们,应该寻找怎样的网页工程师呢?想成为网页工程师却只是刚刚试水 HTML 和 JavaScript 或者刚刚开始了解 Python 和 Ruby 的童鞋,又应该如何规划自己的技术之路呢?
登录过智联前程大街猎聘周伯通拉勾等等网站,浏览过各类工程师在线课程,接触过网页工程师相关的招聘和应聘的,应该不难发现一个趋势,就是这群人被集中分成了三大类:
前端工程师,后端工程师,全栈工程师
一个一个来说吧
前端工程师 Front-End Developer
和用户发生交互的那一部分叫做网页的前端,说白了它就是你在浏览网页时可以看到的所有东西,字体、颜色、导航栏、下拉菜单、滚动的图片,等等等等,这一切都是由 HTML + CSS + JavaScript 拼装而成,在浏览器的渲染下变得井井有条,很神奇的!
首先来了解一下相关技能和工具。
前端工程师主要负责网站面向用户部分的代码,以及用户体验相关的架构。一个前端工程师必须熟练地掌握三门基本的语言:HTML,CSS 和 JavaScript。除此之外,前端工程师还应该熟悉一些样式框架比如 Bootstrap 和 Foundation,和逻辑框架比如 Backbone,AngularJS 和 EmberJS,这些框架确保了网页在不同平台上的质量和稳定性。最后还应该能够熟练的使用一些基本的工具库比如 jQuery 和 SASS/LESS,这些能让开发更加高效,代码更加优质。
另外,很多招聘文案中都会要求求职者有 Ajax 的开发经验。Ajax 技术使用 JavaScript 默默地和服务器通信来动态加载网页内容,以实现无缝的浏览体验。虽然这不是所有网站都必须的,但这也可以算是前端工程师的基本功之一,毕竟 Ajax 技术如今也越来越多地被应用到了网页中。
有了前面说的这些技能,前端工程师就可以很好的和设计师合作,和用户体验分析师合作,把草图和原型开发成成品。牛逼的前端工程师还能精确的发现用户 体验相关的问题,给出建议和解决方案,用代码来增强设计。一个好的前端工程师还应该能够和业务人员流利的沟通,明白他们的目的,理解他们的需求,了解市场 上的机会,并且顺利地执行。
总之在后端工程师造好屋子以后,前端工程师主要负责房屋的内饰。至于房屋的类型和品位,这就取决于房屋的主人了。相比于后端,前端工程师一般来说更 加满足于自己的成果,毕竟这是一份技术和创意相结合的工作。经验丰富的前端工程师不仅是一个技术人员,不仅是一个 Geek,因为他不仅实现了用户可以看到一切和可以交互的一切,还致力于给用户留下过目不忘的印象,所以他也是一个视觉达人。
那我们看到的网页是怎么来的呢?
再补充一下这个很多人都关心的话题吧,在网页开发过程中,设计师绘制 Logo 和图像,摄影师拍摄照片,文案编写文字,最后由前端工程师把它们组装在一起,用网页向我们阐释所有内容,用网页向我们提供独一无二的体验,把我们在网站上看到的所有内容变成可能。
后端工程师 Back-End Developer
新的问题来了,网页上的数据存在哪里?API 又是什么?
就像一间没有造好的屋子,光有室内装饰还是远远不够的。于是我们还需要后端工程师。网页的后端包括服务器,应用程序,以及数据库。这些组件相互作用,使用 API 和前端通信,确保了网页前端的存在。后端工程师的主要工作就是搭建和维护这些组件。
还是先来看看相关技能和工具。
相比于前端开发,后端开发的技术和工具比较多元。为了实现服务器、应用程序和数据库三者之间的通信,后端工程师通常使用 Python,Ruby,PHP,Java,.Net 等语言来编写应用程序,用 MySQL,Oracle,MongoDB 来查找、存储和修改数据,然后把它们部署到服务器上来为前端代码提供支持。在实际工作中,后端工程师至少需要掌握一个开发框架,比如 PHP 的 Zend 和 Symfony,或者 Python 的 Django;还需要能够熟练使用版本控制工具,比如 Git 和 SVN;以及了解 Linux 开发环境。这些看起来比前端开发枯燥多了!
后端工程师需要使用这些框架和工具来为网站编写优质的代码,有可读性,可移植性,有完备的文档。然而和前端工程师一样,在开始埋头编码以前,后端工程师需要和业务人员充分沟通来理解他们的感性目标,将其转换为技术需求,提出具有可行性的有效方案,来搭建技术架构。
优秀的后端工程师同样热爱自己的工作,沉浸在后端的他们从来不觉得无聊,反而乐在其中。他们喜欢玩弄数据,编写出有用的 API,按照不同的权限分配给网页前端、移动应用和其他系统,让前端工程师可以安心的沉浸在交互和布局中。通俗易懂的高质量的 API 受人尊敬,这就是后端工程师的价值所在。
我们怎样才能感受到后台的存在?
点击 http://qidlove.com 打开婚礼邀请函。此时 八音盒 的服务器会把信息发送到你的手机或电脑中,然后变成你所看到的内容。这就是后台工程师所做的事情。如果你向下滚动屏幕到最后,留下自己的姓名和祝福,点击 发送,别人就可以看到你的留言,下一次你再打开这个网页,留言也不会消失,这些都多亏了后端工程师啊!
全栈工程师 Full-Stack Developer
说到这里,首先要明确一点,前端开发和后端开发并不是黑与白的区别,前端工程师和后端工程师之间也没有恐怖分子和反恐精英这样子的暧昧关系。在目前 的经济形势下,在这个资源紧缺的市场环境中,前端工程师往往需要学习(至少了解)一些后端开发的技能,反之亦然。产品开发有很多通用的规则,跨越了前后端 的界限,于是我们开始寻找一种通才。
它的由来?
全栈工程师自然很早就存在,但是“全栈工程师”的叫法诞生于 Facebook 的开发部门。四年前,有一类特别的人群被挖掘出来,他们的工作内容涉及到了技术架构(技术栈)中的每一个环节,包括前端和后端,他们可以和后端工程师一样 在服务器端玩弄应用程序和数据,也可以使用前端语言控制页面内容和调节用户体验,他们能够提供一套完整的系统。
总之,全栈工程师是网页开发的全能战士。
感觉很酷是吧?成为一个全栈工程师,同时精通前端和后端开发,无形之中给自己的职业生涯创造了很多机会。不过也别高兴得太早,就和烹饪一样,有人更 擅长热菜,有人更擅长甜点,精通两者需要时间和经验。妈妈的手艺可不是一日炼成的,更不是简简单单的按照食谱来做就行(事实上很多工程师依然在这样错误的 做着)。一个好的全栈工程师和一个好的大厨一样,需要有自己的内涵,需要有所有的烹饪原料,需要掌握所有的方法,才能奉献上一顿完美的晚餐。
全栈工程师需要掌握的技能相对复杂,甚至有些主观,因为这不仅仅只是技能相关的需求,而且随着时间的推移,人们对于他们的要求也在一点点变化。除了 要根据不同项目掌握前端和后端开发的相应技能外,全栈工程师还需要充分理解网页正常运行的每一个环节,不仅包括合理的服务器配置,规范的 API 结构,还要通晓 JavaScript 的哲学,以及 CSS 背后的设计情怀。
举个栗子,现阶段一个典型全栈工程师的装备,HTML5/CSS3 + Scala + MongoDB + 云服务 + JavaScript
有了知识和技术,就还差经验了,这也是最后一道门槛,全栈工程师尤其需要能够在一个项目面前,快速地定义前端开发和后端开发的职责,分析各种解决方案的优势和劣势,最终选择最合理的执行方式。
老问题,作为用户如何感知网站背后的全栈工程师?
这个我真的说不出来了,自己去感受吧,页面加载需要多久,内容布局是否专业,交互体验是否自然,等等等等。
最后说一句:
不要迷恋全栈工程师,任何时间,任何场合,都有一个“大而全”和“小而精”的选择,好的网站从来都不是一个人的功劳,不要忽略了设计师、摄影师、文 案、产品经理、客户经理、销售、客服、用户、以及其他所有直接参与和间接参与到网页制作中的人们。识别优秀的工程师也并不一定只是技术层面的事情,无论是 前端、后端还是全栈,工程师的自我修养还需要包括对细节的关注,自主学习的速度,解决问题的效率以及良好的沟通能力。
如果你是个网页工程师,那么恭喜你,你现在最不需要担心的就是找到一份称心的工作。事实上接下来五到十年是网页工程师最好混的时期了,HTML5 终于定稿,五花八门的屏幕的出现,跨平台应用的需求越来越高,微信至少还火热着,加油啊!!!
来源:36kr.com

2015年薪酬大涨的15个IT岗位

近日,国外科技 IT 招聘公司 Robert Half 分析了 70 个科技职位后发现 2015 年从事 IT 从业人员的平均起薪将攀升至 5.7%,其中 15 个职位的提升潜力最大。
2015年薪酬大涨的15个IT岗位 -osetc.com
当企业在招聘过程中怨声载道高端技术人才的短缺的同时,高端 IT 开发者对薪资福利的期望值正节节攀升。总的来说,随着新一年的到来,高端 IT 工作者的就业前景依旧十分可观。
根据 Robert Half 的数据显示,19% 的企业 CIO 表示今年上半年有扩大招聘额度的计划。同比 2014 年的 14% 的占比,今年增加幅度很大。在薪资方面,IT 相关工作者的工资比其它岗位工作者的工资涨幅大很多。Robert Half 预测,2015 年全国所有岗位的平均起薪将增长 3.8%。涨幅最大的将是技术岗–新入职员工的平均起薪将上涨 5.7%。
以下是这 15 个职位(涨幅从高到低):
一、移动应用开发者薪水涨幅:10.2%
2014 薪酬水平:100000~144000 美元
2015 薪酬水平:107500~161500 美元
二、 大数据工程师 9.3%
2014 薪酬水平:110250~152750 美元
2015 薪酬水平:119250~168250 美元
三、 无线网络工程师 9.1%
2014 薪酬水平:91500~125250 美元
2015 薪酬水平:99000~137500 美元
四: 商业智能分析师 7.4%
2014 薪酬水平:101250~142250 美元
2015 薪酬水平:108500~153000 美元
五、 数据安全分析师 7.4%
2014 薪酬水平:100500~137250 美元
2015 薪酬水平:106250~149000 美元
六、 数据架构师 7.2%
2014 薪酬水平:111750~153750 美元
2015 薪酬水平:119750~164750 美元
七、 应用开发经理 7.2%
2014 薪酬水平:99750~137750 美元
2015 薪酬水平:106250~148250 美元
八、 数据库开发者 7.2%
2014 薪酬水平:92000~134500 美元
2015 薪酬水平:98000~144750 美元
九、 软件工程师 7.2%
2014 薪酬水平:89750~137250 美元
2015 薪酬水平:96000~147250 美元
十、首席安全官 7.1%
2014 薪酬水平:126750~189750 美元
2015 薪酬水平:134250~204750 美元
十一、 软件开发 6.9%
2014 薪酬水平:80250~127250 美元
2015 薪酬水平:85500~136250 美元
十二、 高级 Web 开发 6.8%
2014 薪酬水平:97750~135250 美元
2015 薪酬水平:104500~144250 美元
十三、 网络安全工程师 6.7%
2014 薪酬水平:99750~131250 美元
2015 薪酬水平:105000~141500 美元
十四、数据建模 6.7%
2014 薪酬水平:97250~134250 美元
2015 薪酬水平:101750~145250 美元
十五、信息系统安全经理 6.6%
2014 薪酬水平:115250~160000 美元
2015 薪酬水平:122250~171250 美元
来源:程序师

你深爱的操作系统其实很烂

1.Windows
嗯,你用Windows,很好。这说明你会用电脑。感到非常自豪,不是吗?大家猜一猜,谁是个大孩子了?谁刚学会用facebook了?是你。没错,就是你!
那么你用电脑都干些什么呢?把所有的时间都花在抱怨为什么自从你下载安装了Spammy Smiley Toolbar 9000 (TM)(注:应该是作者杜撰的一种垃圾邮件扩展工具栏) 后所有程序都不工作了。这不是你的不对,都是别人的不对。你只不过是想把全世界垃圾邮件制造者开发的工具栏都装上,可这个残酷的世界却不能如你所愿,可怜的家伙。
什么样的人用Windows:除了Windows不会别的,因为他们既买不起苹果电脑,又笨得学不会Linux。
Windows用户眼里的自己
你深爱的操作系统其实很烂
别人眼里的Windows用户
你深爱的操作系统其实很烂
2.Linux
噢,看看是谁在使用这个超酷的操作系统啊。即便是做一件最简单的事情,你也要输入一串巨长的命令行命令:
sudo apt get install install-this-damn-thing-so-I-can-actually-do-some-work-rather-than-just-staring-at-the-screen
(注:以超级用户权限安装一个程序,程序名为“安装这个该死的东西,好让我能开始工作,而不是望着屏幕发呆”)因为Real Men™ ( and Real Women™) (注:可以理解为 “好汉” 以及 “女汉子”)用命令行,哪怕这需要多花10倍的时间。
神马情况?你连花40分钟查看一下Man Page的时间都没有?(如果你过的是正常人生活,大概不知道Man Page的意思是操作手册吧。)Man Page里面什么都有。它是由一个完全不懂得人类的思维习惯的人编写的。此人常年待在他母亲的地下室里,只是偶然一次出来活动了5分钟,从10英里外远远地看到了一下人类。(注:man page起源于UNIX)
什么样的人用Linux:被动攻击型书呆子。他们不断地告诉别人RTFM(注:一句粗话,懂Linux的人都懂),以显示他们的优越性,因为在他们看来,Man Page无所不知无所不晓,甚至连圣经都有个Man Page。
Linux用户眼里的自己
你深爱的操作系统其实很烂
别人眼里的Linux用户
你深爱的操作系统其实很烂
3.苹果电脑(无论你装了什么操作系统)
哇,你有一台苹果电脑啊,你大概会觉得自己很了不起。
你很可能整天跑到辛巴克,点上一杯咖啡,享用那里的免费无线网。你也许在那里写你的“书”,这本“书”你写了整整5年了却只写了3页。又或者你是个“美术家”,因为你成功地把自己的头像PS到了安吉丽娜-朱莉的身上。
很可能你喝的饮料是草茶,吃的还是有机食物。这些都是你用粮票换来的。(因为购买苹果电脑花光了你所有的积蓄。)(注:粮票在美国是一种救济低收入人群的社会福利,许多食品店都接受粮票。有机食物一般比较贵。)
什么样的人用苹果电脑:自以为很有优越感的人,因为他们花了两倍的价钱买一台电脑。他们是昂贵苹果电脑的铁杆粉丝。
苹果电脑用户眼里的自己
你深爱的操作系统其实很烂
别人眼里的苹果电脑用户
你深爱的操作系统其实很烂
4.Unix/BSD
嗨老爷爷,能听得到我说话吗?你今天吃药了没?
Unix/BSD用户眼里的自己
你深爱的操作系统其实很烂
别人眼里的Unix/BSD用户
你深爱的操作系统其实很烂
(译者:作者调侃了所有主流操作系统,难道他自己用的是DOS?)
来源:外刊评论