MacTalk 跨越边界

978-7-115-40563-0
作者: 池建强
译者:
编辑: 杨海玲
分类: IT人文

图书目录:

详情

这是一个技术人的随笔,但不是一本技术图书。本书的主要内容来自作者的微信公众平台“MacTalk”,书中包含60多篇文章,分为写给走在编程路上的人、文艺中年、自省、跨越和人物五个主题。书中有作者对生活的思考,对边界的探寻,有作者身边的人和他们的故事,其中的一些文字还记录了这个时代的某个剪影,或某段情感。

图书摘要

版权信息

书名:MacTalk跨越边界

ISBN:978-7-115-40563-0

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


池建强,70后程序员,Blogger,微信平台MacTalk作者。先后任职于洪恩软件和用友集团,从事互联网和企业应用软件研发。

热爱技术和编码工作,Apple和Google产品重度用户,分享技术,坚持梦想。

博客:http://macshuo.com

微博:@池建强

微信平台:MacTalk(sagacity-mac)

本书卖点

这是一个技术人的随笔,但不是一本技术图书。本书的主要内容来自作者的微信公众平台“MacTalk”,书中包含60多篇文章,分为写给走在编程路上的人、文艺中年、自省、跨越和人物五个主题。书中有作者对生活的思考,对边界的探寻,有作者身边的人和他们的故事,其中的一些文字还记录了这个时代的某个剪影,或某段情感。

本书中作者沿用了一贯的技术和人生感悟相结合的风格,文风幽默又能笔底见风雷。作者充分享受着写作的乐趣,书中的文字对作者意义非凡,但对某些人可能没什么意义,而对另一些人可能有那么一点儿意义。如人饮水,冷暖自知。

这是一本有趣且充满思考的书,适合所有走在编程路上的人阅读。


这是一个程序员的随笔文集,但不是一本技术图书。本书的主要内容来自作者的微信公众平台“MacTalk”,书中包含了5个主题,分别是:写给走在编程路上的人、文艺中年、自省、跨越和人物,共60多篇文章。书中有作者对生活的思考,对边界的探寻,有作者身边的人和他们的故事,其中的一些文字还记录了这个时代的某个剪影,或某段情感。

本书中作者沿用了一贯的科技与人文相结合的风格,文风有趣,又增加了一点力量。作者充分享受着写作的乐趣,书中的文字对作者意义非凡,它们能够帮助作者探索、梳理和记录生活。希望你在阅读这本书的时候,也能获得这样的乐趣和感受。

这是一本有趣且充满思考的书,适合所有喜欢技术、热爱生活的人阅读。

人生的可能性随着年纪的增长呼啸而逝,比如我已经不太可能在30岁遨游太空了,但对于一个今年10岁的少年来说,这一可能性依然存在,而我刚满1岁的女儿,甚至可以对此信心满满。所以年纪渐长,可能性越来越少,水面就会安静下来,人们也纷纷长出一口气,盘腿就坐,耳顺、知天命。

而老池却没打算这么安分。

今年5月,他宣布告别工作多年的瑞友软件研究院加盟锤子科技。在《心向大海,重新启航》一文中,他说自己走上了另一条道路,参与“更为激烈的竞争”“更多的尝试和失败”。据我所知,这并不是个一蹴而得、顺水推舟的决定,他面对的取舍、权衡以及挑战,远不止外人看上去从舒适区跳出来去搏一把那么简单。

他略显轻松地描述其中的来龙去脉,没有满脸苦涩的郑重,带着年轻人蓬勃的魄力和长者老成持重的眼界。我见识了他在各种困难和反复面前的决断,感慨万千。

更让我感慨的是他加入锤子科技之后的工作状态。我们过去时常会就一些大事小情私下交换一些意见,这样的聊天通常是发生在晚上七八点钟,可在他加入锤子之后,便推迟到了深夜甚至凌晨。

他的工作负荷开始变得越来越大,经常凌晨还待在公司。在我们这些“腰间挂着两颗滚烫的肾”的年轻人还在探讨加班和加班费的意义时。他早已提刀纵身上马,杀进漫天黄沙。

即便如此,他依然不辍写作。我在今年7月的某个凌晨收到他的消息——“把书稿整理完了”。

这份书稿如今就摆在各位读者面前,书中的60多篇文章精选自他的微信公众号,都经过了他的重新修订,源于他对职业、生活和技术的思考。如果你也像我一样一直是他微信的订阅者,或许你也会发现,从2012年开始维护MacTalk以来,他的文字也愈发成熟和风格化,举重若轻,嬉笑怒骂,恰到好处。

从程序员到技术管理者,再到写作者,从企业应用开发,到进军手机行业,他从不给自己设限。他不回头惜别岁月,只迎面抓住那些机会。“大龄程序员”“院长”“企业应用”之类的标签早就贴在身上,多少人被这样的如同符咒一般沉重的标签压得小心翼翼,喘不过气。他却回身一抖,便轻装上阵,穿过山岭,重新启航。

他用自己的实践展现了一个壮年程序员的各种可能性,他甚至还开始大量地研究产品和设计,他跟我聊信息架构、流程体验、利弊取舍,对自己的产品侃侃而谈,爱不释手,激动而热烈,一如他对技术和代码的痴迷一般。

我很庆幸能遇到这样的一个良师益友,也荣幸能再次为他的书作序。他的转变、尝试和成长让我意识到,怜惜那些随时间逝去的可能性是没有意义的,若不能把它变为脚下的砖头和石块,它自始至终一文不名。

而使我们变得碌碌无为的,也从来都不是被岁月带走的机会,而是面对机会时我们自己的胆怯和犹豫。

老池在文章中平静地写道:“在未来10年,我希望能够做出一些改变人们生活的产品,这是我的理想,我想要实现它。”改变世界这种有些矫情的志向总让人有点难以启齿,但世界总会被一些人和事改变的,不是吗?

我曾在知乎的某个关于老池的问题中回答到,但愿自己到他的年纪时,能有他一半的胆识和眼界。

我是认真的。

邱岳

微信公众号“二爷鉴书”作者,丁香园产品总监

给池院长的这本书写序并不是一件简单的事。当接到这个任务时,我是有点诚惶诚恐、受宠若惊的。在我的意识中,写序人的知名度或是在某领域的建树一般都会比作者高一个级别,好比李银河给冯唐的新书润笔,颇有法力加持的意味。我三表除了比院长帅一点、鲜一点外,何德何能呢?我在这样的“怀疑”中拖沓了一个月,直到池院长说:“再不写就只好割袍断义了。”

我和池院长大概是在2014年情人节,神秘人士Roy Li的粉丝见面会上结识的。那时候我刚踏入艺能界,表演脱口秀还不能脱稿,我在台上局促地表演,台下有一道充满慈爱、温暖、激励的眼神射向我,仿佛在说:全世界都放弃,至少还有我在聆听。这眼神就来自池院长。我谢幕后,他微笑着拍了拍我的肩膀,像长者又像仁兄。

我想我必须要了解这个谜一样的男人,我查阅了大量资料后得知他是一个程序员兼任“苹果亚太区总布道师”。我作为一个文青、艺人,素来和程序员井水不犯河水,在我的想象中,“程序员”的代名词就是:木讷、寡淡、无趣、死理性派。我不可能和这种特质的人成为朋友,除非他也爱喝酒、爱吃毛豆。

后来,我订阅了他的公众号,围观他的朋友圈,参加他组织的分享会,他三观奇正、风趣幽默、博闻广识、待人亲和,我笃定地认为:如果他都不是我的朋友,那我宁愿孤独终老。正所谓我见青山多妩媚,料青山见我应如是,我想他一定也是这么想的,否则他为什么会叫我表弟?为什么会不厌其烦向他的粉丝推荐我的公众号?为什么每次都会第一时间回答我使用Mac时遇到的傻问题?很多人包括我都是因为池院长才拥有了人生的第一台苹果产品,而他没有从中赚到哪怕一分钱提成。

如果池院长不是一个程序员,也会是一个极其优秀的写作者。自媒体时代,人人都是写作者,我订阅了上百个公众号,而最能给我启发,让我如坐春风、茅塞顿开的,“MacTalk”一定排在前三。鸡汤若汇成河,那我只取“池建强”这一瓢饮。“池氏鸡汤”不腻,并没有慷慨激昂的口号。他总能见微知著,从日常工作、生活中的一件小事入手,抽丝剥茧,最后浓缩成一点点人生质朴的小哲理。

陆琪式的鸡汤是商品,是廉价的,是在消费绝大多数庸众的情绪。它的虚弱与无力在于,你并没有真正走进那复杂、多变又瑰丽的人生,而它也不过是像流水线一样锻造消费者需要的那点情愫罢了。

而池院长是70后生人,已是越过山丘,历经荣辱,他谈技术变革也融汇人生智慧,他谈人生智慧亦不疏离科技跃升的宏大背景。信息浪潮下的比特世界,人们总爱自诩站在科技与人文的十字路口,而真正做到这一点的,舍池建强其谁呢?

池院长爱跑步、爱音乐,聊高晓松与诗,谈贝叶斯和黑天鹅,我们在为稻粱谋,而他已经在思考程序员终极归宿这种充满人性光辉的命题了。我不觉得这一切创作是“大而无当”的,他亲历了、他感悟了、他分享了,真实就是最澎湃的力量。

池院长不跟热点、专业灭high,当真该庆幸浮躁的社会有这样一个冷峻的智者。如今他舍弃了一份稳定且受人尊重的工作,投身到锤子科技。我得知这个消息后,颇惊讶了一阵,他如何敢以中年之姿投入一份未知且备受责难的事业中?后来我想到,没错,这就是他,知行合一,从不耽于安逸,为了他认为的美好事物,不温和地走进那个良夜。

作为朋友、读者,我们该庆幸的是:他又有很多好故事可以说。

三表

微信公众号“三表龙门阵”作者,著名脱口秀演员

估计很多人和我一样,是看着MacTalk微信号长大的。技术牛人很多,但是能写作的人少 ;能写作的人多,但是能写长久的人少 ;能写长久的人多,但是能写得有意思、有故事的人少。估计很多人喜欢看MacTalk,就是因为在那儿你可以经常看到有趣的故事。不论是技术杂谈,还是科普,甚至时评,作者都能将其编成一个有意思的故事,说给你听。我和MacTalk背后的主人公相识已久,多少知道些他的私生活,今天咱也借其新书发布之际扒一扒,想来也是极好的。

首先请注意,MacTalk的作者是池建强,不是“迟建强”。我就因为一“Chi”之差,被作者嘲笑了一年多,后来非常诚恳地威胁他要再提这些往事就灭了他,他才不提了。相比于有文化的池老师,我是一个世俗的人,有求于他的时候,我会亲切地叫他“池老师”(这次我也是求着他让我来写序的,所以本文统称“池老师”);求的事情比较不好办时,我会叫他“池大大”;如果没啥事,就想逗他一乐,则直呼“老池”。池老师是个聪明的人,现在根据我对他的称呼,就能立马判定我有什么意图。

在我和池老师的交往中,首先是将其定位成一个老实的人。熟悉池老师的人都知道,其实在他的整个职业生涯中,并没有待几个公司,在每个地方都能“誓把牢底坐穿”,如果不是因为特别的原因,估计他是不会选择离开团队的,这是职业上的老实。对于朋友他更是老实,有次我找池老师,请他为ArchSummit全球架构师峰会美言几句。结果他真的将其当作一个严肃的事情,前前后后对ArchSummit进行了多方位的了解,洋洋洒洒地写了数千字发表在MacTalk微信号上,比我们自己的宣传都写得详细。

更能说明池老师是一个“老实”人的案例,就真的是他对写作的坚持。在过去两年间,我是看到了很多人脑袋一热就开了个微信号,一开始写得真不错,很用心,每天都更新。但是慢慢地,频率越来越低,变成了“月更”,“季更”,甚至绝迹。而池老师绝对是笔耕不辍,不论是在瑞友研究院做院长,还是在锤子科技做技术总监,即使和我们很多人一样,他也忙得像狗,但你总能看到他越来越老辣的作品面世。估计池老师自己也经常在夜深人静的时候,对着电脑自勉“老老实实做人,勤勤恳恳码字”吧。

但是,于我而言,最能描述池老师的形容词就是“有爱”。一方面,当然是他对女粉丝的爱,每个穿着MacTalk标志T恤拍照并留言的女同学,总能够得到他的不吝表扬,而且可以作为和“小道消息”相比试的法宝。很多人估计不知道,池老师还是我们极客邦科技的天使投资人,当初我们想要筹集一些资金购买InfoQ在中国的运营权,带着尝试的心态问了问池老师。他是二话不说,满口应承下来。后来问他为什么那么爽快,又提供资金支持,还花时间帮助出谋划策优化产品、搭建团队?他说在他看来,我们团队太踏实,执行力太强了,肯定做什么都行,是未来中国技术社区的希望。嗯,后来我们自己内部复盘了一下,觉得池老师看得还真准。

按照池老师自己的话来说,他是看着InfoQ中国长大的,又看着极客邦科技诞生的。还说,如果我们团队不努力,不把他投的钱放大100倍,他肯定就会一直和我们没完。初听起来压力山大,现在已经释然,因为在我们的努力下,他的亿万富翁“美梦”正在成真,而且非常有希望成为21世纪最有眼光的天使投资人。

回到正题,开卷有益,希望这本书也能让你感受到池老师的“老实”和“有爱”。最后的最后,一个小秘密,和我们尊敬的冯大辉老师不一样,你可以将池老师想象成一个安静的中年美男子,任凭人情险恶,江湖变幻,他自安静。而从这份安静中流淌出来的文字,又演绎成诸多有内容的故事。所谓“桃李不言,下自成蹊”,这句话是非常贴合池老师的。

霍泰稳

InfoQ中国、极客邦科技创始人兼CEO

在这样一个时代,与其说人人都是产品经理,人人都应该学点编程,倒不如说“人人都来写点儿东西”。

我现在的爱好之一就是,有时间的时候写点文字。曾经有位做技术的朋友向我感概:“你能坚持写文章这件事,放到我身上就是奇迹!”大部分情况下,没有奇迹。之所以他认为这是个奇迹,就因为我是个程序员,他也是个程序员。如果是作家长期写作,就变得非常自然了,就像程序员长期编程一样。你不编程你还能干什么呢?

但是,程序员就不能长期写作么?这个逻辑显然是不通的,任何人都可以长期写作,尤其是用母语写作,要知道,我们从小就写过那么多命题作文呀。所以,不能或不愿意写东西这件事,与其怪到“自律性差”或“不能坚持”上,还不如说,写作,并没有成为你的爱好。

爱好是最容易坚持的,甚至不用坚持。

现阶段,我的首要任务当然是打造自己理想中的产品和服务,但是,我保持了自己的爱好。爱好是什么?爱好就是那种无论你多忙多累都会挤出时间去做的事情,比如跑步、打球、下棋、弹琴或写作。很多人说工作累得要死,哪里还有精力健身呢?其实,当你感觉自己精疲力竭头脑发晕的时候,去跑上20分钟就会发现,健身不仅会消除疲劳,提神醒脑,还能让你睡得更香,第二天精力更充沛,长此以往,二爷,你会年轻得不像一个中年人!

利用琐碎的时间去写一些简单的随笔、短篇或故事,就是我现在的爱好。为什么不写长文或长篇?非不为也,是不能也。我现在的水平还不足以驾驭长篇大论,遑论长篇小说。所以在这个阶段,轻松地写一些随笔就好,我的心情也会跟着放松。很多人写字时觉得苦,尤其是程序员,宁可千行代码,不着一页注释。我倒不觉得,一旦觉得辛苦,可能就不是爱好了吧。

每当想到一个主题,我就会利用一小段时间间隙,伏案而坐,竖起屏幕,横放键盘,思如泉涌,手指上下翻飞,在键盘上噼噼啪啪敲击出一千或几千字来,由于写得多了,差不多都能一挥而就,重读时修改一下错别字和重复音节对阅读的影响,调整一下长短句的分隔,基本就成文了,大致如此。

有朋友说你最近工作繁忙,怎么还会有时间写作?因为写作确实没有占用多少时间啊,除了工作之外,阅读才是占用我最多时间的事情。没有大量的阅读,想持续输出内容是徒劳的,读的书越多,你会发现知道的东西越多,不知道的东西就更多了,不知道远远大于知道,于是你在两者之间不断碰撞、焦虑、欢喜、忧伤,产生各种思想、情感和故事,记录下来,就是文章。

写文章容易,但要写出朴实无华的文字,却是难上加难。即使是短文,想达到这一点也得长期练习,另外还需要一点点天分。坚持总是好事,愚钝如我,写了几年也会感到有些许长进,回头再看,以前的文章,要么浮夸,要么沉重,要么为了有趣而幽默,大多是下乘之作。抬头看天,夕阳西下,“朴实无华”四个镶了金边的大字,依然隐没在紫色的晚霞里,距我有无限远的距离,好在我还在坚持,也许还有希望呢?

文字写得越多,越能体会到文字的好处和写作的乐趣。它会帮助你思考,梳理情绪,记录情感,讲述故事。这个世界无论发生什么变化,有些思想和信息,只能以文字的形态传播;有些跃动的灵魂,只能以文字故事的方式讲述。这就是写作的力量。古今中外有那么多的大师坚定地进行着文字创作,任凭狂风怒吼,枝叶摇动,兀自挺立不倒,凭借的就是对文字力量的信心。

于是就有了这样一本书!

这是一个技术人的随笔,但不是一本技术图书。书中包含了五个主题,分别是:写给走在编程路上的人、文艺中年、自省、跨越和人物。其中有我对生活的思考,对边界的探寻,有我身边的人和他们的故事,其中的一些文字还记录了这个时代的某个剪影,或某段情感。这些文字对我意义非凡。但是,偶有读者问:“可是,你写的这些文字,对我有什么意义呢?”我却无言以对。大部分情况下,这些文字对某些人,可能没什么意义,对另一些人,可能有那么一点儿意义。如人饮水,冷暖自知。我能够确认的就是,这些文字本来意义无多,但是在那么多人读了之后,就有了那么一点儿,但到底是什么,我却知之不详。

只管继续写下去就好了……

池建强

2015年秋,写于北京

问:池老师,我是个不爱互动的人,但是您所有的文章我都看了,非常感谢您的引导,我入手了人生第一台MBP。现在问题来了,但是找不到更合适的人解答,只能求助于您了,如果您有时间的话。问题是这样的:我有个32位UNIX文件(开启一个服务进程),在Mac上执行时的错误提示是exec format error,但是在Linux服务器上却可以执行,为何?Mac上有可以运行的方案吗?期待您的回复,不胜感激。

答:Linux和OS X是不同的操作系统,可以尝试在OS X里重新编译这个文件。

问:非常感谢!如果没有文件源码是不是就只能认命了?

答:可以在Mac上装Docker,然后对服务进行端口映射就可以了。

答:茅塞顿开。谢池老师。

以上是我和一位读者的对话,这位小伙子在拿到答案之后像一缕烟尘一样消失无踪,之后再也没有出现过。

在微信上加了很多MacTalk的读者之后,经常会收到一些奇奇怪怪的问题,关于职场、关于选择、关于朋友、关于Mac、关于技术等,不一而足。但是我能回答的却很少。问题不好没法回答,问题太复杂没法回答,问题领域超出我的认知范畴也没法回答,耗时太长的问题我也没时间回答,实在是惭愧。好在偶尔也能够帮助一些小伙伴解决一些实际问题,心理上略感安慰,比如上面这个问题。

把这段程序员之间的对话翻译一下,大致是这么个故事。

一位读者有一个32位的UNIX可执行文件,可以在某种版本的Linux服务器上正常运行,运行这个文件的作用就是起个进程,开端口,然后与其他程序进行交互。但是这个文件拿到Mac上完全没办法运行。就在他趴在Mac上愁肠百结万念俱灰的时候,突然想到了“池老师”。不就是这个老家伙把Mac夸得像一朵玫瑰一样,让每个程序员都去采摘吗?现在扎手了,你不管谁管?于是他给我发来消息,意思就是管也得管,不管也得管,您看着办。

我拿到问题一看,不难。Linux和OS X虽然师出同门,都是从老前辈UNIX那儿毕业的,但是后来毕竟各练各的,在Linux编译好的程序不可能在OS X上用,但是在OS X上重新编译一下可能就没事了。我把这个想法告诉了这位程序员,得到的反馈是:对不起,哥,没有源代码!

我被这个冷酷的回复震惊了,立刻意识到刚才的想法并不是最优解决方案,因为在重新编译的过程中,各种包的依赖关系和编译错误足以让你焦头烂额,我随即提供了B计划:在OS X上安装Docker,轻量级的容器Docker可以运行各种版本的Linux,把文件扔到Docker里,然后通过主机和Docker之间的端口映射即可轻松解决这一问题。

虽然这里面会涉及很多技术细节,但是方向是没有问题的,所以这位程序员立刻表示“茅塞顿开”,然后“biu”地一声就在屏幕对面消失了,没有留给我说“不客气”的机会。

这个问题装个Linux虚拟机也可以解决,但是虚拟机过于耗费资源,而且不如Docker灵活,所以不是最佳解决方案。Docker是。

作为一个程序员,我们除了要掌握多门程序语言和多种数据库,了解前端技术、后端技术,通晓网络七层架构,知道TCP/IP三次握手和四次挥手,编写漂亮的代码,设计优美的架构……之外,我们还要解决研发、程序运行和产品上线过程中遇到的各种问题,而且被要求以最小的代价来解决问题……我们容易吗?

除了编程技巧和程序设计能力,解决问题的稳准狠是衡量一个程序员是否优秀的重要因素之一,也是资深技术人员真正的价值所在。在科技浪潮澎湃、技术信息扑面而来的今天,一位刚毕业的大学生如果足够勤奋,他可以在两三个月之内掌握一门编程语言,并编写出像模像样的软件,他们的学习速度甚至超过了我们这些老程序员,但是解决问题的能力是无法速成的,只能依靠时间、经验和惨痛的教训历练而成。有时候还需要灵感和运气。

很多军事迷读了大量的军事著作和历史小说,常常羡慕那些名将的风采,并浩叹自己“生不逢时”。但是名将不是那么容易炼成的。历史上叱咤风云的名将凤毛麟角,他们亲自持刀上阵追击敌人,见识战场的惨烈,目睹敌人的尸体,看到战友被杀,知道被刀砍中会流血死去,他们冷酷无情,坚如磐石,在全军即将崩溃的时候发现敌人的弱点并进行攻击,在瞬息万变的战场中进行决断,在多次失败后从无数士兵的尸体里站起来重新出发去挑战那个战胜你的对手,在所有人对你说“指导员,我们上吧”的时候,坚定地说出那三个字:再等等!

如果你做不到这些,那还是做个最终会被张飞枪挑的小兵吧。

优秀的程序员同样如此,菜鸟常常羡慕高手在谈笑之间让难题灰飞烟灭,而自己却苦苦思索而不得入门之法,殊不知这些高手同样经历了名将的那些腥风血雨。他们在清晨的微光里编写代码,在轰鸣的机房中调试程序,他们彻夜不眠就是为了解决一个bug,他们要承受数据丢失或上线失败的痛苦,默默吞下眼泪,准备下一次的战斗。不停地学习、实践和思索,成千上万个小时之后,高手始成。

同样的问题,高手的解决思路和小球是截然不同的。一般来说,只要不是世界难题,给足时间、空间和人力,都能解决。如果你遇到问题告诉上级,这个问题交给我了,两年之内搞得妥妥的,那就不要怪项目组成员组团把你打出屎来,因为大家要的是分分钟解决,不是两年。在这个唯快不破的年代,我们没有那么多的时间,所以要通过逆向思维、经验教训、辗转腾挪、借力打力等方式以最小的代价快速解决问题。这才是老程序员的价值。

再举个例子,一个运行良好的线上应用,在你修改bug增加功能之后,重新上线,出现了一些莫名其妙的问题,如占用资源增加或运行一段时间宕机等,怎么解决?

常规的做法就是通过阅读日志、模拟线上环境和调试程序来定位错误。容易的bug用这些方式基本就能搞定了,但是更隐蔽的bug会耗费大量的时间和人力。更好的方式是什么?

首先,排查是程序问题还是环境问题,把线上程序恢复到运行正常时的老版本,如果出现了同样的问题,那就是生产环境发生了改变。如果运行正常,要么是你修改老bug时引入了新bug,要么是新增加的代码出现了问题。

其次,阅读产品的修改日志,根据代码提交的时间线构建系统,通过二分法排查,定位是哪部分代码引起的问题。

最后,排除了所有的不可能,剩下的无论看起来如何不可能,就是它干的。

以上只是一个简单的例子,实际的情况可能比这个例子复杂100倍,需要我们综合使用各种方式进行交叉比对和错误排查才能解决。这仅仅是遇到问题解决问题,更多的时候是需要你提出问题,并解决问题,那是更高的境界。

很多人学了那么多编程语言,写了十几年程序,最终依然无法做到以最小的代价解决问题,不禁让人扼腕叹息。

程序员真正的价值是什么?以最小的代价解决问题!知行合一,方可无敌于天下。

程序员将代码注入生命去打造互联网的浪潮之巅,当有一天他们老了,会走向哪里,会做些什么?

很多年以后,在我60岁的那天早晨,天刚蒙蒙亮我就起床了,先去公园晨练,然后回来做早餐(50岁的时候我学会了做饭),送完外孙上学,刚好8点。由于北京从2020年开始单双月限行了,这个月是单月,所以只能挤地铁。人一如既往地多,一小伙子要给我让座,看了看他的小身板,我说不用,你也是干IT的吧,今天咱们都是程序员。

来到公司,墙上那条新贴上去的刺眼规定总是让我很不舒服:所有的服务器端语言必须使用Come,移动端语言使用Swallow,还在使用Java、C、Go和Swift语言写程序的,罚款500元。我不知道自己还能学会几门新语言,工作了40年,我已经用过100多种编程语言了……

上午10点,00后Team Leader跑过来问我:“池大大,新上线的智能手表操控UI是您老做的吗?好像出了点问题。”我说是老王上周做的,他老花眼早就不该做UI了,这周没来,据说动脉硬化了。“唔,那您帮他改改得了……”

这个上午,老板又收到了两份在家办公的申请,其中包括老冯的,申请理由是:腰不好。坐着站着都不能解决问题了,只能把屏幕安装在天花板上,躺着编程。我还行,一直打羽毛球,腰好,身体就好,吃嘛嘛香。不过今天中午却没什么食欲,因为牙疼,各种牙都开始松动了,只好在食堂里挑了点软乎的饭菜吃了。

下午部门开会。我发现唯一的70后主程(主力程序员)记忆力减退了许多。说完第8个功能点的实现后,他突然来了一句:“好,以上是第1点,现在来说第2点。”直到下班,我们一直都在说第2点。会后主程怪我为什么没有提醒他,其实我一共提醒了他13次。不跟他计较,明年他65岁,就要退休了。

分配到需求之后,下午的工作就是画界面、做表单、填程序,这个工作我做了几十年,已经非常熟练了,编码的时间总是最快乐的,不知不觉就晚上10点了。回家吧,过了9点就可以打车了。

夜晚11点回到家,菜凉了,孩子们都睡着了。我躺在冰凉的床上,打开一本《Come语言编程实战》开始读。程序员,是一个终身学习的职业……

看到这儿,估计大部分程序员读者心都碎了……不用担心,不读MacTalk,晚景才是凄凉的,看了的都没事!

关于“程序员老去”这个话题,从我开始编写第一行代码的时候就有了。那时候我20郎当岁,正值青春年少,眉宇苍茫,中年人和老去仿佛是下一个世纪的事情(确实是),遥不可及。我时而在阿尔卑斯山脉编写代码,时而去草原天路调试程序,我觉得世上之事无所不可为。只有那些年近30岁的老程序员,听到这个话题时,才会紧蹙双眉一言不发,仿佛他们看到了无边落木和滚滚长江。

很快,我就站到了30岁的十字路口,望了望周围,其他三个方向都没有路,只能向前,于是我非常不情愿地挪到了35岁这个黄金分割线上,或者叫程序员的生命线。不知道是哪位大神为我们程序员画了这么一条线,三百六十行,行行出状元,为什么只有程序员才有这条线呢?用Google、百度搜索一下“程序员35岁”,尽是“不作35岁的程序员”“技术大龄恐惧症”“35岁后要转管理”“35岁前程序员要规划好的X件事”这样耸人听闻的字眼,一想到自己并没有规划过“这些事”,我绝望极了,35岁生日的那一天可能会发生什么不好的事吧,比如编程、演讲、写作、设计这些技能都会烟消云散?我可能会跟不上时代的发展?我可能会被解雇吧,我想。

35岁生日过去了,除了收到生日礼物,什么事都没有发生,我依然活蹦乱跳地编程、演讲、写作和设计产品,一切都变得更好了。

再也不相信年龄了……

回首往事,我发现当年那些对编程充满激情,对生活满怀理想的小伙伴,有的变成了某个领域的技术大牛,在做产品的同时忙着布道演讲写书;有的经营着或大或小的公司,同时还在编写程序;有的设计出了千万人使用的软件产品;有的则转变成了一个纯粹的管理者,经营着上千人的机构。他们都是程序员。

真正有可能晚景凄凉的程序员,是对技术和产品没有兴趣的人,是仅仅把编程当作生活工具的人,是那些不能终身学习的人。开篇的文字,就送给这些人吧,希望他们能够在40岁以前看到这篇文章。

关于程序员转行的问题,也是个伪命题。没有哪个人的职业是一成不变的,今天你在考虑LVS要使用IP隧道技术还是直接路由,负载调度使用“加权轮叫”还是“最少链接”,10年后你要做的可能是增加哪些产品特性和阅读用户的消费心理。时间会驱动着你去不停地选择自己的道路。

如果继续编程能够最大化你的价值,那就去编程,太多精深和复杂的技术需要长期的积累和实践才能化繁为简鬼斧神工,请在技术大神的道路上一路狂飙。

如果设计产品能够最大化你的价值,那就去设计产品,现代世界已经不再是“美学、艺术”与“电子产品、软件”毫无关联的年代了,人们越来越重视产品体验和艺术美学,如果你懂得产品之美,又能估算这个产品多久能够开发出来,还懂一些开发细节,不知道能够虐多少程序员啊,想想这个场景多么美好。

如果经营一家公司能够最大化你的价值,那就去创业,去招募战友,服务伙伴,提供产品,去创造属于你自己的天空。

如果演讲……如果咨询……如果市场……,很显然,我看到的程序员未来有无限可能,而且我们最大的优势是:这帮家伙甚至能编写代码,这真是太酷了!

当然,我们程序员也不要过于沾沾自喜,在某个领域深耕细作的同时,不要忘记拓宽自己的知识面。如果一个人的领域太过专业化,一段时间后,你可能会发现自己的专业已经陈旧了。如果一个人的知识面很广,在终身教育的配合下,你的专业可以随着时代的变化而改变。

另外,在调试程序或程序出现问题的时候,程序员要避免说这些暗语:

扯淡,这不可能!我机器上就没事!不应该啊……

一定是隔壁老冯的问题!原来怎么没问题?

每少说一次,就能前进一大步!

最后,对不是程序员的读者也说两句吧,如果你身边有程序员,一定要对他们好,不懂技术不要对程序员说这很容易实现,平时多送些小礼物,他们不开心了就请吃海底捞,加不加班都要给他们加薪,没有女朋友的给介绍女朋友,还没订阅MacTalk的让他们赶紧订阅……你会有回报的。

经年以后,当你偶然之间再次翻到这篇文章,也许会说:唔,这个老家伙说得还有点道理呢!

最近写了《程序员真正的价值》和《当程序员老去》两篇文章,传播甚广,今天是第三篇——《程序员如何选择技术方向》,史称“程序员三部曲”。

那之前写的几篇程序员文章算什么呢?算前传吧。以后再写程序员文章算什么呢?算后记吧。

2008年秋天的一个午后,温暖的阳光透过落地窗落在我面前这个长长的写字桌上,桌子对面坐的是一个瘦小的程序员,他的名字叫小明。小明有些茫然,他看着我,不知道该说些什么。

程序员都是很严谨的,我不得不首先发出一个System Call:

“你在客户现场这半年做什么工作?”

“写单元测试。”

“还有呢?”

“没了,就一直写JUnit。”

“别人也写单元测试吗?”

“没人愿意写单元测试,只有我写。”

……

“你为什么想来研究院呢?”

“我想写一些真正的程序。”

“什么是真正的程序?”

“比如Java,比如面向对象编程,你总要写一些类和各种各样的方法,而不是一直写测试用例(test case)。”

“好的,沿着这个楼梯上三楼,那里有一群和你一样的程序员,他们不仅写Java,还写JavaEE相关的各种程序,你会找到自己需要的东西。”

“真的吗?”

“真的。”

那时候我风华正茂,没有现在这么老成持重。阳光照在我的翘着二郎腿的脚面上,一切都显得十分虚幻。在小明的眼里,那时的我估计很像“黑客帝国”里的墨菲斯,但是他不能确定自己是不是“The One”。小明疑惑地看了我一会,最终还是上楼了。至此,他完成了第一次技术方向的选择。在三楼,他碰到了一群同样严谨的程序员,他不仅学会了写真正的Java程序,而且掌握了部分Web编程和服务器端编程,包括JavaScript、jQuery、Spring、Hibernate、JMX、Web Service等。小明变得快乐起来,渐渐摆脱了注定孤独一生的阴影。

过了一段时间以后,小明已经不满足只写Java相关的程序了。有一天他看到我手里的iPhone和Mac,仿佛见到了初恋的情人,眼中重新燃起了绿油油的光芒,他知道了iOS开发者这回事。很快,他花掉了所有的银子购买了Mac和iPhone,开始日夜兼程,学习iOS开发。他在写Java的间隙编写Objective-C代码,在编译Web App的同时构建IPA,在清晨的微光中调试程序,在每个夜晚与模拟器窃窃私语……他完成了第二个阶段的技术方向选择。

终于到了离别的时候,他要去寻找更大的梦想。经年以后,在南方的某个城市,他成了一个知名公司的iOS主程,并开发出了多个著名的iOS应用,比如“丁香医生”“用药助手”“家庭用药”等。难以想象,如果没有小明,张老师怎么去见小姨子,冯老师何以拯救互联网,二爷怎么鉴书,西湖何以养醋鱼!

第一个故事讲完了,主角小明利用两次主动的技术方向选择,完成了从小球到小牛的逆袭,以至于现在连女朋友都有了。

这时候就有读者要问了,那些大牛是如何做技术选择的呢?

大牛不需要做技术方向的选择,他们需要什么就学什么,学什么就成什么。他们就像掌握了“九阳神功”的张无忌,各种类型的技术和程序到了他们的手里都能发挥出巨大的威力。技术,是他们生命中最重要的组成部分。

如果你们以为我在吹牛我就给你举个例子。我在《MacTalk·人生元编程》中写过一个技术高手,他的名字叫做攀攀。很长一段时间我都不知道他掌握了哪些技术,因为他的技术是我们很多人的超集,我们遇到的所有问题都可以在他那里得到解决,他只是叼着烟翘着腿敲下几行代码而已。后来我才知道,他在高中的时候已经痴迷于计算机了,大学时代自学了大量的计算机相关的知识,在他大学毕业之后,操作系统、数据结构和算法就已了然于胸。

直到最近,我才从网络上拿到一份他几年前的简介,那个时候,他的履历是这样的:

ID:攀攀

性别:男

师门:电子科技大学1998年计算机系

职业:网络引擎设计者

人物背景:精通C、C++、Java、Pascal、Basic、Fortran、Cobol、PL/M、Perl、Python、Lisp、Prolog、Smalltalk、Ldap、PVM、MPI、编程自动化、Linux核心代码、JDK源码、GLibc源码、Apache源码、常见的网络协议内部实现、网络通信……是真的精通。

武学造诣:决不要把计算机强加给人们的限制认为理所当然,人不是机器的奴隶,把了解机器的限制作为通晓计算机的标准只能是自欺欺人。

游戏感言:IP路由和认证的双重功能将是未来网络游戏发展的障碍,今后的网络应该是以分布式目录服务为基础的,以网络设备为中心,与具体主机无关,集成了广泛的认证与授权能力的网络(全公司上下没有人能听得懂他在说什么,好在大伙儿都已经习惯了)。

都是1998年毕业的,人和人的差距怎么那么大呢?无语泪千行!

两个故事讲完了,究竟如何做技术方向的选择呢?答案就飘在风里……

1.操作系统、数据结构、算法、网络等基础技术应该在大学时代深入学习,如果毕业了你还没有掌握这些内容,那就随用随学好了。学习这些基础理论极为枯燥,只有实际工作中的需求才能给你最大的学习动力去掌握这些艰深的内容。

2.至少要掌握一门静态语言,如C、C++、Java、C#、Objective-C等。至少掌握一门动态语言,如Python、Ruby、PHP等。

3.推荐学习一些同时具备动态语言特性和静态语言特性的语言,如Go、Swift、Scala等。这样你会对面向对象编程、面向过程编程、编译型、解释型语言有更深入的了解。

4.系统地构建自己的知识体系,而不是局限在某个点上。经常有读者问我,我前几年一直在写VBA/ActionScript/Delphi/SQL……现在项目组突然不再采用这些语言了,怎么办?很多人难以预料未来技术的走向,但是你至少要构建自己的技术壁垒和平台。学习Java,就应该构建你自己的JavaEE平台;Objective-C对应iOS/OS X开发平台;C#对应.Net平台;SQL对应数据库平台。如果你在用ActionScript,那你不应该局限在Flex上,你对应的应该是整个前端平台。立足平台,你会站得很稳。立足一个点,你可能摔得很惨,就是这样。

5.主动选择技术方向比被动等待好。根据自己的兴趣和技术的发展主动选择,就像小明一样,有时候放弃也意味着得到。

6.不要过于追新,不要每出一门“颠覆性”的语言或技术都投入精力、物力。追新的后果很可能是该学的没学会,不该学的学完也忘了。我有一哥们儿,我们都在写JavaScript的时候,他认为Java新推出的JavaFX才是前端的未来……然后就没有然后了。我们都用Java的时候,他认为Erlang才是编程语言的未来……然后就没有然后了,可谓一步早,步步早,让人扼腕叹息。

7.也不要过于保守,比如Go、Swift、Docker等技术,我个人以为是值得投入时间和精力的技术。

没有8了,写到这里,冬夜已经黑得不像样子。站在阳台望出去,仿佛看着某个巨大IDE的黑色编码主题,我想起了某位大牛的一句话:我不是懂得多,我只是学得快而已。

2014年1月,苹果联合创始人史蒂夫·沃兹尼亚克来到北京参加了“极客公园创新大会”,非常遗憾,由于个人事务,我错过了近距离观摩沃大神的机会,每每想起,扼腕叹息。如果上天再给我一次目睹沃神的机会,我绝对不会错过。(机会很快就来了,2015年我在硅谷见到了沃兹……那是另一篇随笔。)

很早就读过纸版的《我是沃兹》(2007年版),后来中信出版社再版此书,更名为《沃兹传》,于是在“多看阅读”上购得电子版,最近拿出来又跳读了一遍。好的故事总是常看常新,不同阶段的阅读,总会萌生不同的想法,今天就和大家说说沃兹当年犯过的错儿。

1977年年底,沃兹和苹果第6号员工兰迪·威金顿经过不眠不休的编程和调试之后,终于完成了Apple II对软盘驱动器支持的大部分程序。于是二人起身飞往赌城拉斯维加斯,准备参加CES展会。到了赌城之后,拉斯维加斯的滚滚红尘彻底迷乱了两个土鳖程序员的心,一出悲剧正上演……

当天晚上,沃兹和兰迪完成了最后的调试工作,一切都那么完美,两个好朋友就差对饮一杯红酒然后相拥而眠了,这时候,沃兹做了一个“明智”的选择:兄弟,咱是不是该备份一下程序再睡?沃兹带了两张软盘,于是他决定在空白盘上再备份一份仅有的数据盘,备份进行得很顺利……只是他把该死的空白盘当成了数据盘,于是他得到了两张干干净净的空白盘!

如果普通的程序员碰到这种灾难后,估计自杀谢罪的心都有了,沃兹不是普通人!

在确认了这个“致命”失误之后,沃兹这个编程狂人,就去睡觉了……第二天一早醒来后,沃兹恢复了上帝般的自信,他冷静地坐在Apple II面前,一机在手,天下我有,用一上午的时间盯着屏幕、敲打键盘,他重建了所有的程序,并在展会上进行了完美的演示,Apple II获得了“言语无法描述的成功”!

伟大的程序员如沃兹者,年轻时也会犯下如此的错误,何况我等……

这时我想起了另一个程序员犯的错,这位朋友在一家网络游戏公司工作,他的一部分工作就是手动维护数据库里的一些数据,这个库居然是奇葩的生产库。终于,在一个懒洋洋的下午,暖暖的阳光照在身上,他发现自己昏昏欲睡,鼠标光标神差鬼使地移到了用户表上,右键菜单弹了出来,“delete”被选中,并重重地点了下去……所有游戏用户的资料都消失了,就像一阵风一样。当时这位程序员的感受是:

我的所作所为带来的严重后果并没有立即击倒我。我只是感觉到灵魂似乎出窍了,悬浮在黑暗房间的某个角落,看到各位同事都弓着腰趴在发光的显示器上,他们惊恐地发现,所有的用户数据都不见了。

随后的一记重拳彻底击垮了这家公司,他们的数据库提供商告诉他们,这个数据库实例的备份两个月前就停止了,然后,就没有然后了。

同样是犯错,沃兹犯错后重新拯救了自己和公司,而另一个程序员则击倒自己之后又给公司补了一枪。

这就是伟大与平庸的区别。

总结:

各位程序员,你们犯过哪些愚蠢而致命的错误呢?

端午假期里写《We Build Things》的时候,又翻出了这本书来读,因为我始终觉得,这本书也在讲“Building Things”,抛却浮华,追逐本质,在这样一个工业和信息时代,相信爱,相信生活。书中除了旅行和摩托车修理,还涉及了工业、科技、人文和诸多哲学问题的思考。好吧,这其实是本哲学书。

书的作者是一个非常奇特的人,这位兄台名叫“罗伯特·M.波西格”,上大学时是个典型的理科生,主修生物化学,后来不知道为什么,这个理工男悍然迷上了哲学,然后就跑到东方哲学胜地印度去学习哲学和艺术了。(为什么都去印度?)回国之后,他并没有像乔布斯那样在科技与人文的交汇点孤零零地创建一家科技公司,而是进了当地一所大学当了一名光荣的写作老师。

当老师后,波西格也没闲着,他继续不停地思考哲学问题,并陷于西方倡导的二元对立与二分法带来的分裂之中无法自拔,然后就疯掉了。1961年,波西格被诊断为偏执型精神分裂症和临床忧郁症,被多次送进医院。从1963年开始,医院对他进行了多达28次的电休克疗法,在此期间妻子与他离了婚。

人世间最痛苦的事莫过于此!艰难的时候想一想波西格,你会觉得,产品经理提的那点需求根本不是个事,I want more!

1968年,波西格出院了,他放弃了让自己困扰的理论,转而开始旅行和写作,以文字表达思想。在进行了一次长长的父子摩托车长途旅行之后,波西格用心灵自传的方式写出了这本《禅与摩托车维修艺术》(Zen and the Art of Motorcycle Maintenance)。这本书在被拒了上百次之后,于1974年出版(嗯,是属于我们70后的书),目前累积销售量超过了1000万本。

谁在被拒绝了上百次之后还好意思找下一家出版社呢?波西格可以!所以产品经理提需求被拒绝了也不用伤心,找个工程师心情好的时候再提就是了,万一人家答应了呢?梦想总是要有!

这本书出版之后,在每个时代都被讨论过,喜欢的人读了,因为喜欢,讨厌的人也读了,因为要看看讨厌在什么地方。那么,这是不是一本好书呢?我觉得算,能让我做一些笔记和摘录的书,应该算一本好书吧。不过这本书阅读起来可没有吃冰激凌的快感和一口气读完的冲动,如果你真想理解书中的哲学真意,找个阳光明媚的下午,泡一杯绿茶,就着蓝天或西山的落日细细读完,也许会有收获。如果你那么忙,没有时间和耐心,读读我的摘录,也能慰藉人心。

为什么要骑摩托车呢?因为风在路上

骑摩托车可就不同了。它没有车窗玻璃在面前阻挡你的视野,你会感到自己和大自然紧密地结合在了一起。你就处在景致之中,而不是观众。你能感受到那种身临其境的震撼。脚下飞驰而过的是实实在在的水泥公路,和你走过的土地并没有两样。它结结实实地躺在那儿,虽然因为车速快而显得模糊,但你可以随时停车去感受它的存在,让那份踏实感深深印在你的脑海之中。

有多少人在真理敲门的时候充耳不闻呢?数不清吧,好像女朋友也是

这的确是件令人迷惘的事,就好像真理已经在敲你的门,而你却说:“走开,我正在寻找真理。”所以真理调头就走了。哎,这种现象真是让人不解。

为什么要“Build Things”,因为在平庸的时代里可以有个念想,留点痕迹

我们常常太忙而没有时间好好聊聊,结果日复一日地过着无聊的生活,单调乏味的日子让人几年后想起来不禁怀疑,究竟自己是怎么过的,而时间已悄悄溜走了。

如果你不愿意了解科技的本质,那么你命中注定会有个滴水的水龙头

我很惊讶,水龙头这样日复一日、年复一年地滴滴答答地响,人们难道不会神经衰弱吗?然而我发现他们一点都不担心,也不去注意这件事。所以我的结论是他们不怕被水龙头打扰。有些人的确如此。

我不记得是什么改变了这个判断……好像是思薇雅正要说话,而滴水声又特别大,无意中引起她情绪上的变化。她的声音一向很轻柔,而有一天她想大声说话压过滴水声,这时候孩子们走进来打断了她,她不禁发起脾气来,仿佛是滴水声引起的。

事实上是这两件事引起的,但是她并没有怪罪到水龙头上,她甚至有意不去怪罪它。其实她早已注意到水龙头的问题,只是刻意压制自己的怒气,那个该死的水龙头几乎要把她逼疯了!但是她仿佛有隐情,不肯承认这个问题有多严重。我很奇怪,为什么要对水龙头压抑自己的怒火?

遇到bug的时候怎么办?冷静地想一想,然后去好好睡一觉,你会发现,醒来后bug就解决了

常常会有这种情况出现,一旦遇到瓶颈,你只好停下来,仔细思考一番,看看是否有新的信息,然后出去逛逛,等你再回来时,原先隐而未显的原因就会浮现出来。

沙砾的世界里,每个产品经理都是不一样的,需求也不一样

一旦我们手中握着这把沙子,也就是我们选择要认知的世界,接下来就要开始分辨。我们把沙子分成很多部分,此地、彼岸;这里、那里;黑、白;现在、过去,也就是把我们认知的宇宙划分成很多部分。但是我们看得越久,就越会发现它的不同。没有两粒沙是一样的,有一些在某些方面相同,有一些在另外一方面相似,而我们可以根据彼此之间的类似和差异,堆成不同的沙堆。我们也可以按照不同的颜色、颗粒,不同的大小、不同的形状或者是否透明来分。你认为这种划分一定会有尽头,但是事实却不然,你可以一直分下去。

从哲学角度考虑,程序员接到需求的时候怎么办?

程序员接到需求的时候,最重要的不是做不做或什么时候做,而是去了解真实的需求。所有的产品经理都希望自己的需求在一小时内实现,我们要做的,就是让他们冷静下来,告诉他们,说出真实的需求,并分清轻重缓急,你别想从我这里拿走一行代码。如何获取真实的需求呢?

要解决一般思维无法解决的难题,就要通过自己的观察和别人提供的需求,不断交替运用归纳法和演绎法,如此才能找到问题的解决之道。

1.问题是什么。

2.假设问题的原因。

3.证实每个问题的假设。

4.预测实验的结果。

5.观察实验的结果。

6.由实验得出结论。

爱因斯坦曾经说过……为什么是他说呢,因为爱因斯坦最大嘛

人类用最适合自己的方式,描绘了一幅最简洁、最容易了解的世界图像。然后试着用经验取代某种层次的世界,然后征服它……

他创造了这个宇宙和他感情生活的支柱,这样才能由中找到安宁,而这安宁是无法从个人狭窄的经验当中获得的……最崇高的工作……就是要建立这些宇宙基本的法则,这些法则经过演绎就能创造出现今的世界。而要通往这些法则没有合乎逻辑的路;只有靠着直觉和对经验的体谅才能进入其中……

花儿

这些小小的、粉红色、蓝色、黄色和白色的野花,在黑色的阴影之中,闪烁着太阳一样的光芒,到处都是这样的风景。

一束小小的、彩色的光向我射来,而它的背景却是一片沉郁的绿色和黑色。

愿每个程序员的心灵之旅都能够平静和美好,即使我们的前方,永远都有一辆哈雷摩托在突突作响,那上面,坐着一位充满二元论想法的产品经理!

上一篇访谈是“极客邦”推出的一个新节目,叫做“大牛V课堂”,我的访谈算第一期。我并不是什么大牛,只是帮霍老板做下试验罢了,所以应该叫小白鼠。我帮霍老板的极客邦做过不少试验,这次算不错的,还有些试验内容你们可能都没见过,因为我也没见过。做试验有什么回报吗?应该有吧,反正我是每次拿着空头支票就走了,比如吃大餐啊,去国外参加技术大会啊什么的。然后就看到霍泰稳不停地在朋友圈里晒美国的大餐、法国的美女、西班牙的建筑等。

世界本来就是残酷的,意识到这一点很重要……

今天的文章并不是为了夸霍老板,只是开个场,其实想说的是另一个事儿。因为在文章中谈到了“我们的加班是要被批准才可以的”,这句话引来了很多读者发问,现在互联网公司加班成风,该如何对待加班这个事情呢?我记得当时的回复是:哦,稍等,正在加班呢!

加完班之后,这个问题又重新浮上心头,关于加班,可以稍微说两句。

很久以前参加过一个安全会议,其中360的CTO谭晓生也出席了,并介绍了360的企业文化。360虽是上市公司,但是摊上了一个好战的老板,所以是非不断,引用冯老师刚刚写毕的《我看360》中的一句话:“中国互联网这么多公司来来去去,360是一个独特的存在,是唯一一家挑战过BAT三巨头的公司,这一点很了不起。”因为这样一种文化氛围,360整个公司大抵处于某种一触即发的备战状态。他们推崇创业文化、拒绝平庸、减少层级、延长工作时间、增加工作强度等。360能够力战BAT,强敌环伺而不倒,想必靠的就是这种精神。

我个人对创业文化和减少层级并无异议,至于加班文化,就仁者见仁了。每个创业公司成长的过程中都会逐渐由人制变法制,由流程取代激情,尽管人们会对初创的氛围与理想念念不忘,就像思念初恋的情人一样,不断地强调奋斗、加班的精气神儿,幻想自己还是那个干三天三夜完成任务后再浮一大白的汉子,或女汉子……然而并不一定有回响!

每天工作时间10小时以上,每周超过60小时或80小时。这种付出,到底有没有价值?

我自己并不赞同加班文化,我们很少要求加班,但真的有紧急任务或Deadline要求的时候,我也不排斥通过加班的方式达成必要的成果。年轻人,没有加班的经历是不值得纪念的。你,初入职场,一腔热血、两袖清风,腰上挂着两颗滚烫的肾,你说你“不加班”干什么?

我在洪恩工作的时候,曾经为了赶一个产品连续工作过两天两夜。2001年做互联网的时候,每天工作时间都在10小时以上,可以说除了吃饭和睡觉都在公司泡着,但那时没人意识到在加班,因为大家觉得在做有价值的事情,同时自己的能力得到了充分的提升。每天睡觉时仿佛都听到了心智力量嘶嘶增长的声音,这种加班,何乐而不为呢?

加班是有技巧的,长时间加班往往事倍功半,疲态尽显。加班的坏处千百人说过,不再重复。如果你是个Team Leader,在安排加班之前,最好问自己以下三个问题。

1.是不是必须要加班,有没有其他解决方案?

2.加班做的事情是否有价值?

3.能否提升公司的能力,进而提升自己的能力?

答案是正面的,就值得加班;负面的,就把改变世界的机会留给超人和蝙蝠侠,咱们去干点儿更适合自己的事情。当然,是否能适应高强度的加班,还和年龄段有关。25~30岁,你是超人你怕谁?35~40岁,再这么拼体力和智力,哥就真吃不消了……40岁以上,加班的机会,要留给年轻人!

短期加班能够解决某些问题,在唯快不破的时代,也许能在关键时刻为你的业务助力和加油。但长期来看,提升工作效率,做最有价值的事情,让美好的事持续发生,才是最重要的。大部分情况下,笑到最后的,并不是最拼命的。

是的,世界本来就是残酷的,意识到这一点真的很重要!

程序员很穷,他们要么是显得很穷,要么是真的很穷。

前几天,一位做市场的同事跑过来问:“池老师,我有一位朋友,快30了,想转行写程序,您觉得有戏吗?”我看了看满目疮痍的他说:“如果是你就没戏。”

30多岁转行做程序员当然可行,毕竟历史上存在一些大器晚成的案例,这些经过渲染和修饰的案例给在时间长河中苦苦挣扎的人们带来了些许希望的火光,但那毕竟是火光,一阵风来过,兴许就灭了。如果你真的热爱技术和编程,渴望通过自己的代码实现别人的想法,或自己的创意,为世界带来更美好的产品,那么任何时候学习编程都不晚。编程给你带来的好处绝不仅仅限于你的工作领域,关于这一点,你看看李笑来老师就可以了,有时候我觉得,他简直是个专业的程序员兼产品经理。但是,如果你只是觉得程序员挣钱容易,那还是算了吧,因为程序员不轻松、不浪漫、不被人理解,也许,还很穷。

很多人羡慕程序员工作没几年就可以拿着看起来不错的薪水,但是,如果他们在未来的几年内技术水平没有突破性的提升,或者缺乏一点灵性和品味,那么可能在未来很长一段时间内,他们都会保持这个薪资水平,直到有一天,他们会接受,比自己小5岁或10岁的程序员,也拿到了和自己一样的薪酬。不是经常说程序员年薪百万吗?是啊,那是行业里的顶级程序员,他们为了让自己的水准达到这样的要求,经常要付出10年以上的刻苦努力和练习。初春,寒冬,清晨,深夜,当你们去欧洲浪的时候,当你们去卡拉OK唱的时候,他们都在不停地Practice、Practice、……

大部分程序员看起来都很穷,即使是极为成功的程序员,如果你没有看到他的豪华座驾,你也会觉得对面这个戴着眼镜玩手机的人是个屌丝。程序员对外在的东西鲜有追逐,鞋子、衣服,穿着舒服就够了,所以你会看到熟悉的格子衫、灰T恤、大裤衩、夹角凉鞋和永远的双肩背包,那个包,几乎是程序员的一切……偶尔见个红色耐克T恤,上书“Just do it”,抬头一看,哦,原来是罗老师。

不过,你们一定不要被程序员们的表象迷惑,他们有时候消费起来非常可怕,下死手,与腐女逛街相比毫不逊色。大部分程序员虽然对衣服不感兴趣,但是对电子设备往往缺乏免疫力,女生会花掉2万元换来一个LV包,程序员会花掉2万元买一台配备了Retina 5K显示屏的iMac,然后双方都认为对方疯了。

关于程序员的消费观,一般是这样形成的,你工作了两年,写了很多代码,伴随的是没日没夜的加班,产品上线了,产品下线了,团队出发了,团队解散了,然后你会感到疲惫,生活没有希望,这样的日子什么时候是个头啊!你看了看破旧的ThinkPad,对自己说,要不要买个Mac试试?然后你就有了一个Mac,你突然发现了一个新世界,充满阳光和雨露,原来操作系统可以设计成这样……于是你觉得每过一段时间就需要阳光和雨露。你开始购买正版软件,不管多贵。你开始学习移动开发,你发现你需要两部手机,因为iOS和Android平台都值得学习。于是你有了一部iPhone和一部Smartisan T1,后来你又有了iPad和Kindle,然后很多硬件和软件都升级了,你有了好几台Mac,移动的,台式的,好几部手机、平板和电子阅读器,一代的,二代的,好几代的。你的女朋友很迷惑(如果你已经有了女朋友),她会问,你买那么多手机、电脑和其他乱七八糟的东西干嘛?不都一样用嘛。你觉得很难解释,就说:你看这个新款有指纹识别功能,还有这个,从这边划入,就可以进行分屏操作……然后你的女朋友白了你一眼,默默的用你的信用卡刷了一个LV的包。

事情还没有结束,Google Glasses走了,Kinect Box来了,Oculus VR还在路上,无人机已经飞起来了。“嗯,听说喷气背包能让人飞起来?要不要试试?”“我身体不好,去跑步了。”跑步应该需要一套好的装备才不会受伤,于是你把自己装配得比专业马拉松选手还酷,另外,你似乎还需要一块Apple Watch。如果这个最初玩Mac的程序员——你,竟然鬼使神差迷上了单反,那将是一场更大的灾难,据说一个徕卡相机要8万多元,镜头就不要再提起……

需求是没有止境的,这就和产品经理的需求一样。所以,程序员们虽然挣得不少,但他们花的也多啊。最终,他们还是很穷,至少是看起来很穷……

另外,程序员在心理上也很“穷”,大部分情况下,与行业内其他角色相比,程序员地位都不是最高的,待遇不是最好的,连加班都不是最多的。最惨的情况是:哦,程序员只是我们实现想法的工具!程序员很少一战成名,当年百度贴吧风头最劲的时候,人们只知道这个互联网产品是一个叫做李明远的年轻人做的,没人知道前端工程师是谁,后端架构师是谁,即使你通过一己之力完成的技术架构抗住了每天数以亿计的流量,那又怎么样呢,没有用户知道嘛。什么时候会知道呢?当你去极客邦的QCon技术大会上讲“构建高并发系统之百度贴吧实战”的时候,大家才会知道,喔,原来也有你一份功劳呀,然后转身就去找李明远签名去了。

程序员比较烦的是半瓶子醋的技术领导,或自以为懂了点技术的产品经理。关于商业模式,关于产品,关于用户体验,每个人都可以头头是道地说两句,比如我曾经看到无数的用户要为锤子手机、App、云服务、官网、电商提各种建议,还有一些创业失败的年轻人觉得锤科最大的问题是战略和商业模式,愿意免费为老罗提供战略咨询,等等。这都可以理解,但是谈到技术,懂就是懂,不懂就是不懂,界线是很明显的。

有些产品经理与技术人员打交道多年,多少也了解了一些技术架构和实现思路,这时候与程序员们聊天就要非常小心了。如果你顺嘴溜达出一些开源技术和架构名词,程序员们就会围上来笑嘻嘻地说“哇,你很懂技术嘛”,这时你要赶紧装作一脸无知的样子说“我懂个屁啊,也就知道个概念,我连‘Hello World’都不会写”,然后程序员们就会放下手里的板砖,安心去编程了。

和程序员交流的正确方式是什么?当一个程序遇到瓶颈的时候,大部分程序员会非常无辜地说:“现在就是最好的解决方案,没有其他办法了。”这时候别着急,拍拍他的肩膀温和地说:“没事儿,你再想想,肯定有更好的解决办法。”如果你本身就是做技术的,也可以提供一些实现思路供他参考。一般情况下,过一阵他就会喜滋滋地告诉你:“I have a better idea!”

选择了一个程序员,就去相信他!

最后,贫穷的程序员们还会相互鄙视。文人相轻,程序员似乎也是如此。写汇编的鄙视写C的,写C的鄙视写C++的,C++程序员鄙视Java和C#程序员,Java程序员和C#程序员相互鄙视,写Python的和写Ruby的相互鄙视,写Scala、JRuby、Clojure的一起鄙视Java程序员。写静态语言的和写动态语言的相互鄙视,写前端的和写后端的相互鄙视,Vim程序员和Emacs程序员相互鄙视,然后一起鄙视使用IDE的程序员。

Go语言程序员鄙视所有其他语言的程序员,所有其他语言的程序员都鄙视PHP程序员。PHP程序员说,PHP是世界上最好的编程语言,因为Facebook的扎克伯格也是这么说的。

程序员之间的鄙视链极其复杂,估计得用一个混沌算法才能描述出来,这能怪谁呢?只能怪我们自己了,谁让那些技术先贤们发明了这么多语言和技术框架,却没有制定出一个美国宪法那样的规章制度呢?毫无疑问,这个鄙视链会继续持续下去,直到程序员这个职业消失的那一天。

程序员穷,累,苦,加班,可能还不被理解,公司领导甚至不知道你是干嘛的。一个正常人成为伟大程序员的几率估计比飞机失事也高不了多少,那么,为什么还有这么多年轻人前赴后继加入这个群体呢?我想,是这个时代把程序员们推上了风口浪尖,当你看到自己的代码奔跑在成千上万台服务器上的时候,当你做的App运行在每个人的手机上的时候,你会觉得,一切都是值得的。

我是一个程序员,我喜欢这个职业!

作为一个程序员,看电影的一大乐趣就是观摩电影中出现的那些技术场面。当年看不死小强的24小时,非常痴迷CTU的操作系统,电脑之间的交互操作像Solaris,整体UI看起来又像是定制的Linux,上网Google了半天而不得其解。后来国外一个朋友告诉我,很多国外电影里的操作系统画面为了达到炫酷的效果,都是用Flash做出来的动画,所以你看不到他们敲错程序,也没有人按退格键。

得知了这个消息之后,我怅然若失了很久,一直以来,我以为军方和FBI的操作系统不知比Linux高到哪里去了。

除了操作系统和UI界面,国外的科技电影镜头中还会出现大量的代码片段,分析这些代码,也为我们的编程生涯带来了很多乐趣。当然,产品经理和程序员的女朋友是无法理解这些快乐的。一个男程序员没有女朋友并不是什么丢人的事,有女朋友,凑巧她是个不懂技术的产品经理,这才是人生最痛苦的事。在可以预见的未来,这个程序员将度过自己灰暗的、不被理解的后半生。

哎,还是说电影吧。据说2001年拍摄的美国大片《剑鱼行动》中,休·杰克曼扮演的黑客在破解系统时使用了C程序,而且这些代码是真正的DES加密程序,完整的源代码来自http://www.ic.unicamp. br/~lucchesi/cracking-des/CH5/SEARCH.C

休·杰克曼肯定不知道这些代码是什么意思,当年惊鸿一瞥,我也没看出这是什么语言编写的程序。不过可以肯定的是,这是一部优秀的科技动作影片,导演在制作程序相关的情节时,一定咨询过专业技术人员。

第一部《钢铁侠》里也有C语言抛头露面的镜头。在钢铁侠的心脏第一次初始化的过程中,那个破笔记本上陆续显示着一些C语言片段。有好事者最终找到了这段代码的出处,它来自乐高积木的固件下载程序,由斯坦福大学的Kekoa Proudfoot编写。完整的程序代码可以从http://graphics.stanford.edu/~kekoa/rcx/ firmdl3.c下载。

《龙纹身女孩》的女主人公同样是个黑客高手,她常年背双肩电脑包,走位飘忽,宛若一个孤独的侠客行走在网络之间,遇到楼舍密室,要么跳跃穿行,要么潜入一窥究竟。在电影中,她轻松突破瑞典警察局的数据库,然后开始输入命令检索数据。屏幕上翻滚着绿色的程序代码和用户信息,但是无法看清她使用了什么SQL语句。这时候居然有程序员跳出来截取了屏幕画面,然后PS拼接再加上推演之后得出了完整的SQL语句。最终他给出的结论是:一个顶级黑客为什么会用outer join的方式进行表关联呢,性能明显不高嘛。

我想这个程序员一定没有女朋友!

国内的电影在这方面差距就非常明显了,早期看过一部中国黑客电影,当蠕虫病毒来袭时,屏幕上就出现一些丑陋的虫子动画,一闪一闪的,看起来非常恶心。还有的电影在展示网络攻击的时候,不停地在Windows的终端窗口输入一些Linux命令,结果就是:男程序员沉默,女程序员流泪。

最近看了吴京的动作片《战狼》,虽然情节有硬伤,但总算是吴京的用心之作,不过在程序员看来,这部电影算是被技术场面毁了。明明是入侵并发送炮团作战指令,但屏幕打印出来的却是一堆格式错乱的代码,代码逻辑就是根据输入的字符输出星期几,难道星期几就是作战指令吗?哎,建议吴京下次拍电影的时候咨询一个会6门语言的程序员,不谢。

本来今天就想写写电影里代码的事情,结果携程网站挂了,具体原因未知,因为我和携程的CTO叶总就在一个微信小群里,当我和其他人在激烈地讨论携程挂掉的原因时,叶总神情刚毅,一句话都没说。很多内外部消息显示携程是被攻击了,或被程序员误操作了,也有人说携程的数据库被一个叫做“物理”的家伙删除了,真实情况如何,恐怕只有携程的人才知道。可以肯定的是,这件事一定和程序员有关。

所以,别惹程序员!

当然,不要以为我们程序员都是看电影找bug,不开心就删数据的人,那只是程序员中的极品。真正的高帅富程序员多了去了,比如最近看到一篇文章里提到的马克·安德森先生,他是网景公司的创始人之一,Mosaic浏览器的开发者,现在的安德森·霍洛维茨基金创始人,投资了很多著名的科技公司。

2006年,当雅虎出价10亿美元想要收购Facebook时,全天下的人都敦促扎克伯格赶紧接受交易套现走人。扎克伯格承受了巨大的压力,只有安德森不停地鼓励他坚持下去,他告诉扎克伯格,公司未来的价值远远不止这个。安德森坚信Facebook能够以前所未有的方式影响这个世界:“你们需要的只是一点时间。”Facebook现在的市值是2180亿美元。

安德森能取得这样的成就,我觉得和他的婚姻生活密不可分。他的妻子认为,安德森简直是她的梦中情人,集天才、程序员以及秃顶于一身。他们婚后经常在床上阅读,并且围绕各种问题展开讨论,包括智能手机的组件、二进制代码的工作方式、无人机的管制政策以及普京是否利用乌克兰来转移民众对国内金融危机的关注等,她表示,自己每天都在和一个活生生的维基百科睡在一起。

“集天才、程序员以及秃顶于一身”,感受一下!

所以,没事别惹程序员,对他们好一点,不懂技术不要对他们说这很容易实现,平时多送些小礼物,他们不开心了就请吃海底捞,加不加班都要给他们加薪,没有女朋友的给介绍女朋友,还没订阅MacTalk的让他们赶紧订阅……你会有回报的。

写了很多文章之后,不同时期的不同读者都会问我,为什么要持续写作,你不是程序员吗?不去好好做“编程”这么有前途的职业,写MacTalk干什么?

每次遇到这样的问题,我都要看看窗外的流云(当然有时候没有窗,有时候没有云)和手边的Mac,然后感慨万千地回复:可能是因为接受了上帝的召唤吧,我愿意做个会写作的程序员。

生活本无规划,一切源于Mac。

我是从10.5(Leopard)这个版本开始使用Mac的,在用了那么多年Windows和“最好”的笔记本ThinkPad之后,我发现,世上永远存在你所不知道的美好事物。那种感觉,就像遇到了多年不见的知交好友,陌生而熟悉。

Mac的OS X操作系统融合了传统UNIX和现代用户界面,既继承了所有UNIX的优良传统,如稳定、安全、脚本化、管道和强大的用户及权限管理等,又有一个无以伦比的用户界面。事实上,OS X就是一个具备所有服务器功能的个人操作系统,这一点对Linux/UNIX用户有致命的吸引力。除此之外,对于IT从业者,我们还可以从Mac的工业设计和OS X的UI/UE上学到很多产品设计思想。

在意识到这些之后,我开始不断学习和挖掘Mac相关的知识,并试图发挥出Mac的最大效能,以提升自己的工作和编程效率。持续了一段时间之后,我开始写一些文字来描述和分享这些知识,并获得了一些反馈,那篇《开始使用Mac》在我的博客上获得了几十万的点击率,并得到了广泛传播。那时并没有MacTalk。

开始写MacTalk的那一天我至今都记得,2012年12月25日,在忙碌了一整天之后,我开始在微博上谈论IBM的WAS,IBM的东西在技术含量和性能上是没有问题的,但是山高路远坑深,没有彭大将军,项目组每次求助时眼神都充满了绝望。在其他容器里运行良好的程序,部署到WAS上立刻瘫痪,让人极其恼火。能怪谁呢,想想只能怪IBM了。当我正在微博上骂到口吐莲花的时候,突然看到了一位读者的回复:“与其在这儿骂无法改变的WAS,还不如多讲讲Mac。”

这条信息就像天空中偶然飘落的一根羽毛,它不停地在风中旋转,然后落到了我的掌心。于是写起来一发不可收拾,直到今天。

Mac是因,Talk是果,如果从因来看,Mac只是打开了一扇窗,它带给我的远远不止一台个人电脑。

苹果公司具有独特的理念和气质

苹果公司成立于1976年,盛极而衰后东山再起,并成为科技公司的带头大哥。近40年的光阴穿透了每个人的身体,但始终没有带走苹果的理念和气质。如果说要把这些无形的东西赋予到有形的事件上,那么我们就要把时间的指针拨回到两个时间点,1984年和1997年。第一个时间点Mac诞生,第二个时间点乔布斯重返苹果。这两个时间点伴随了两个著名的广告:“1984”和“Think Different”。这两个广告体现了苹果不同阶段的企业文化,“1984”体现的是叛逆、海盗精神和反对主流文化的嬉皮士精神,而“Think Different”则伴随了乔布斯的回归,其时乔布斯大宗师气度已成,所以整个广告的创意设计和独白显得沉稳、平和、大气磅礴而充满时间的沧桑感。

广告词的最后一句:只有疯狂到自以为能够改变世界的人,才能真正地改变世界。从叛逆到疯狂,从海盗到大师,但内在的东西并没有改变,那就是特立独行,改变世界。

关于这两个广告,我在《MacTalk·人生元编程》里用了两篇文章进行详细的描述,这里不再多谈。

每个程序员都该使用Mac

这个话题足够写个专题的,简单说两句。

OS X是类UNIX的操作系统,苹果在收购了NeXT之后,花费了整整4年的时间,对原有的Mac OS和收购的NeXTSTEP进行了技术整理和融合,打造了OS X的底层框架,命名为Darwin。Cocoa、Mach、IOKit、Xcode Interface Builder、开发语言和面向对象技术都来自NeXTSTEP,而全新的GUI(Aqua)、改进的文件系统、AppleScript则继承自经典的Mac OS,两套操作系统在OS X里得到了完美的融合!

根据以上描述,你就知道,你手里的Mac其实是一个具备优秀GUI的服务器,几乎所有的服务器端技术都可以在Mac上进行开发、调试和运行(前端就不用说了)。我曾经画过一张图来阐述这一点,如果你看了这张图,你就知道,OS X几乎是为程序员而生的。

苹果的产品设计思路

毫无疑问,苹果在工业设计和软件设计层面都是世界级的,因为他们汇聚了世界最顶级的设计天才和乔布斯、乔纳森这样的设计领袖。但是,苹果的产品设计思路和设计流程一直不为外人所知。他们很少参加行业会议,也不会公开发表相关的论文和设计文档。乔布斯时代,你甚至无法猜到苹果会发布什么样的产品。虽然现在保密程度没那么严格了,但是也没有成形的文档来阐述这些内容。

我通过阅读《乔布斯传》《iGod》等图书,以及大量的个人和机构的博客文章,根据自己的认知和思考,大致总结了这么几点,不一定正确和准确,分享给大家。

1.为自己设计产品,然后投放到市场上去让细分领域的人群去认知和追随。

2.设计师的任务不是取悦和创新,而是像科学家一样去发现和揭示。

3.为产品设计众多原型,不断淘汰和选择,确定最终的产品。

4.从不过于依赖某一产品线,无论这个产品多么赚钱。

5.创造伟大的产品,而不是赚钱。尽自己的可能把事物重新放回历史和人类意识的洪流之中。

乔布斯对这事儿是这么解释的:

“这事儿和流行文化无关,和坑蒙拐骗无关,和说服人们接受一件他们压根儿不需要的东西也无关。我们只是在搞明白了我们自己需要什么。而且我认为,我们已经建立了一套良好的思维体系,以确保其他许多人都会需要这个东西。”

人人都是产品经理

知道了上面这些内容,再加上你平时的积累和不断的思考,你已经是个产品经理了。

记住,永远去追逐那些美好的东西,这样就没有产品经理这个职位了,因为人人都是“产品经理”。

今天给大家说说大数据下的贝叶斯定理,算是科普。如果有朝一日你能以之推算出搭讪美女的成功率,算我一份功劳。

每当有技术热点或新概念出来的时候,人群就会分成三种:炒作的、观望的和踏踏实实干活的。炒作的是不懂的,观望的是保守的,沉下来去研究那些浮萍下面的算法、引擎、框架和语言的人,才是最后吃到果子的人。云计算、大数据莫不如是。

随着搜索、社交网络、电子商务和移动互联网的发展,数据总量和增长速度已经到了常人(注:我这样的人)无法想象的地步。其中数学相关的知识是大数据应用和发展的原动力。

举个例子,比如贝叶斯定理。

搞数理统计如果不知道贝叶斯定理,那么你的人生肯定是不完整的。贝叶斯定理是贝叶斯推断的应用,是英国数学家托马斯·贝叶斯在1763年首次提出的。与其他统计学不同,贝叶斯定理是建立在主观判断的基础上的,它需要有大量的样本数据,并在数据的基础上进行计算,数据量越大,计算结果越能反映现实世界。

在计算机诞生之前,这个前提条件是很难满足的,所以贝叶斯定理在历史上很长一段时间内都没有得到很好的应用。然后,互联网时代来临了……

现在贝叶斯定理广泛应用于中文分词、垃圾邮件处理、机器学习、图像识别、拼写检查和一些常用的分类算法上。可以说,我们现在最常用的互联网服务上,贝叶斯定理无处不在。贝老爷子没能挺到今天看到他提出的理论在互联网时代大放异彩,也算是憾事。其实做基础研究和艺术创作的人都非常不容易,每天徜徉在知识的小黑屋里冥思苦想,时时刻刻准备改变世界,结果很多学术成果和艺术成就都是自己挂了之后才流芳百世的,这种事随便想想也会让人感到悲伤。

当然,这些伟大的创造者和先知先觉的神人大多是以认知世界和发现规律为己任,他们注定是要去拯救和影响一代又一代的后人,所以早已超凡脱俗长袖飘飘,肯定不会有我等这些俗人俗想。

关于贝叶斯定理,刘未鹏和阮一峰的博客上都做过详细的介绍,大家可以去深入学习。我这里做个最简介绍,希望能够帮助大家入门。

贝叶斯定理主要是用来描述两个条件概率之间的关系,先介绍下条件概率。

而条件概率的意思就是:事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。同理,P(B|A)就是事件A发生的情况下,事件B发生的概率。

用文氏图可以很容易地推导出贝叶斯公式,如下图所示:

当事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B),也就是:

P(A|B) = P(A∩B)/P(B)

即:

P(A∩B) = P(A|B)P(B)

同理可得:

P(A∩B) = P(B|A)P(A)

换算一下就得到了贝叶斯公式:

P(A|B)P(B) = P(B|A)P(A)

也就是:

P(A|B) = P(B|A)P(A)/P(B)

用人话说出来就是:事件B发生的情况下事件A发生的概率等于事件A发生的情况下事件B发生的概率乘以事件A发生的概率,然后再除以事件B发生的概率。

我承认这句话更像是绕口令而不是人话,反正你们懂的,如果不懂竟然能看到这里,那么你赢了。

下面我们举个例子看看这个公式怎么用。有A、B两个一模一样的箱子,每个箱子里都放了很多黑球和白球。A箱子里有6个黑球,4个白球;B箱子里有1个黑球,9个白球。现在随机选择一个箱子拿出一个球,发现是黑球,请问这个球来自A箱子的概率是多少?

解题思路如下。

我们把“从A箱子拿出球”的事件设置为A事件,“拿出的球是黑球”设置为B事件。由于两个箱子是一模一样的,那么“从A箱子拿出球”的概率是二分之一,即:

P(A) = 0.5

“拿出是黑球”的概率也很容易算出来,把所有的黑球加起来除以球的总数,即:

P(B) = (6+1)/20 = 0.35

“从A箱中拿出黑球”的概率就更容易了,用A箱中的黑球数除以A箱中球的总数,即:

P(B|A) = 6/(4+6) = 0.6

那么根据公式,这个黑球来自A箱的概率就是:

P(A|B) = 0.6×0.5/0.35≈0.857

生活中,我们也常常会被类似的概率问题困扰,比如医患关系中常见的误诊问题,这些都是可以通过贝叶斯公式进行概率演算的,网络上有很多相关案例,有兴趣的可以去阅读学习(搜索“贝叶斯实例”即可)。

以前推荐过的书《黑客与画家》的第8章“防止垃圾邮件的一种方法”,就采用了贝叶斯原理实现垃圾邮件过滤器,其中有详细的描述和实现思路,有这本书的读者可以去看看。

还有一个学习材料,是PyCon上的一个视频讲座,配有相关的Python代码库,相关网址为https://sites.google.com/site/simplebayes/home/pycon-2013

另外,如果你想从事大数据领域相关的工作,R语言也是值得关注的一门语言,关于这门语言,我还没入门。

15年前,我第一次在工作中使用Linux的时候,并不知道这个操作系统会对我的生活和职业产生多么大的影响。15年后,我在《林纳斯,一生只为寻找欢笑》一文中写道:

当大家使用Google搜索时,使用Kindle阅读时,使用淘宝购物时,使用QQ聊天时,很多人并不知道,支撑这些软件和服务的,是后台成千上万台Linux服务器,它们时时刻刻都在进行着忙碌的运算和数据处理,确保数据信息在人、软件和硬件之间安全地流淌。

Linux不仅仅从技术层面影响了人们的生活,其本身还产生了很多有意思的话题和文化,我读了不少UNIX/Linux相关的书籍,很多技术内容已经忘得一干二净,但那些话题、模式和文化,却像醇香的好酒、美丽的传说,历久弥新,不断地为我带来思考和启发……

最初的想法,并不是决定性的

Linux并不是凭空创造出来的,当年林纳斯(Linus)只是觉得迷你版UNIX操作系统MINIX的终端太难用了,既不能登录学校里的UNIX Server,也没法上网。这种功能缺陷对林纳斯这样的极客来说是无法接受的,于是他决定从硬件层面开始,重新为MINIX设计一个终端仿真器。

当时是三月,也可能是四月,就算彼得盖坦街上的白雪已经化成了雪泥我也不知道,当然我也并不关心。大部分时间我都穿着睡衣趴在相貌平平的计算机前面噼噼啪啪地敲打键盘,窗户上的窗帘遮得严严实实,把阳光和外部世界与我隔离开来。

经过不眠不休的编程之后,终端仿真器做出来了,但那个时候林纳斯已经意识到自己的雄心壮志远不止于此,神山上的另一座圣杯“操作系统”已经向他发出了召唤,于是始有Linux。

另一个伟大的操作系统Macintosh,同样起步于一个微小的项目,期间历经换帅、更名、争吵、妥协,最终与NeXTSTEP经过长达4年的整合才形成现代的经典操作系统OS X(参见《MacTalk·人生元编程》)。

几乎所有成功的产品都是边走边看做出来的。伟大的梦想,常常始于微不足道。

所以,很多人问我如何找到一份长期稳定的工作时,如何开启一个能够带来巨大成功的项目时,我只能说,最初的想法,并不是一切,开始去做就好了。

好的软件产品,常常源于开发者自身的需求

林纳斯为给自己开发终端仿真器最终做出了让其名垂青史的Linux操作系统,沃兹因为热爱计算机设计出了Apple I,乔布斯想把1000首歌装进口袋推出了iPod。

如果有什么工作能让你保持长久的热情,那一定是做自己需要的产品。当年我们在给程序员开发工具平台的时候,我要求每个工具研发人员都使用我们自己开发出来的工具,而不是仅仅把工具推给测试人员和项目组的程序员。过了一段时间,我发现那个IDE突然增加了很多“善解人意”并“出人意料”的功能。

如果有一天放下现在的工作,我一定会找一件足以让我穷尽半生去探索和追求的事情,用“术”解决问题,用“道”创造解决问题的方法,顺便改变生活。

优秀的程序员知道如何编程,卓越的程序员知道合理复用

林纳斯并没有尝试从零开始编写Linux,而是以重用MINIX的代码和理念作为开始,虽然在Linux最终的版本中几乎所有MINIX代码都被移除或重写了,但它在Linux成长初期确实起到了类似脚手架的作用。

卓越的程序员通常都很懒,我们把这种懒叫做“建设性懒惰”,因为他们知道,很多时候我们要的都是最终的结果,而不是勤奋的过程。如果有可以复用的基础,显然比从零开始更具有建设性。

在开源社区澎湃发展的今天,我们有了更多的技术选择。所以,当你拿到一个轮子的需求时,去社区里找找问问,如果有可以复用的东西,就不要再费劲去造一个新轮子,况且你无法保证自己造的轮子比旧轮子好用。

我从来不是卓越的程序员,我只是模仿他们。

如果你有正确的态度,有趣的事情自然会找到你

林纳斯从写下第一行Linux代码的开始,就保持了一个开放的态度,可以说,Linux一诞生就被打上了开源的烙印,这一点对其后续的发展起到了至关重要的作用。因为开放和开源,Linux吸引了全球的开源爱好者和顶级黑客,无数卓越的程序员为Linux贡献了源代码,同时,林纳斯在开源协作方面也展现出了编程之外的天赋,他井井有条地运作着庞大的开源社区,回复邮件,发起讨论,阅读代码,合并分支,Linux操作系统在开源社区的推动和林纳斯的调教下以惊人的速度发展。

从来没有一款如此复杂的软件系统是以这种松散的方式构建的。几千名散落在世界各地的开发者,凭借着脆弱的互联网建立关系,他们利用业余时间,构建出了一个鬼斧神工般的操作系统,随即这个系统又成为互联网的基石,其间沧海桑田,让人叹为观止。

一切都源于开放的态度。我对这一点深有体会,从写下第一条MacTalk推送开始,我只想向世界传递我的讯息,结果各种有趣的人和事纷至沓来。但行好事,莫问前程。

为什么要登山?因为山在远方。为什么要阅读?因为历史在书里。为什么要写作?因为思想流淌在心头和指尖。就是如此。

如果你对一件事情不感兴趣了,最好的做法是找到一个有能力的接棒者

每个人的兴趣都会转移,林纳斯也不例外。在Linux进入稳定发展的阶段,他把更多的精力放到了开源社区上,但是这并没有降低Linux操作系统的代码质量,因为他找到了更多的顶级源代码贡献者。

在软件开发的项目中我们同样会遇到类似的问题。某个功能的开发者突然对该功能失去了兴趣,这时候,我们就有责任为这个功能找到一个可以胜任的接棒者,而不是强迫原来的开发者在原地踏步。

很多时候,我们厌倦了一件事情,并不是能力缺失,而是因为已经洞悉了这件事的所有秘密,于是转身离去,开辟新的征程……

把早期用户当作你的合作者或开发者,这是提高代码质量和产品质量的有效途径

林纳斯把Linux的源代码放到网上之后,很快就收获了一批既是开发者又是合作者的用户,他选取了其中5人组成了核心开发小组,除了Linux内核建设的最终决定权属于林纳斯之外,一切都是开放的,这5个人承担了绝大多数关键的开发和组织工作,在各自的领域组织自己的用户和开发者,推进Linux有条不紊地向前发展。

这些合作者和开发者就像筑巢的蜂群一样,围绕着Linux辛勤地工作,看起来杂乱无章,实际上细致严密,因为任何人的工作都在阳光下进行,没一个错误的产生和修复是隐藏在暗影中的。一个人的代码出了漏洞,立刻有另一个人冲上去打补丁,打完之后,两人交换眼神,握手,然后转身投入下一轮的开发和测试中。

通常一个几十人的项目组就能把整个公司搞得鸡犬不宁,这种事我们见得太多了,但是林纳斯却依赖自己的早期用户构建了历史上最大的合作项目,成千上万的开发者依赖邮件列表和相互之间制定的规则进行交流和研发,同时开展的项目经常超过4000个。

如果你找到了产品的早期合作者用户,那么你的项目已经成功了50%。

即便是高层次的设计,如果能有很多合作开发者在你产品的设计空间周围探索,也是很有价值的。设想下一滩雨水是怎么找到下水口的,或者说蚂蚁是怎么发现食物的。探索在本质上是分散行动,并通过一种可扩展的通信机制来协调整体行为。一个外围的游走者可能会在你旁边发现宝藏,而你可能有点过于专注而没能发现。

现在很多创业项目在早期发布的时候常常采用邀请制,这其实是获取早期合作者用户的最佳时期,合理地选择用户并通过邮件列表、群组和线下交流活动等方式不断获取反馈,并让用户参与其中,会大大提高你的产品质量和代码质量。我参与过的早期项目中,有道云笔记·协作版算是做得不错的,可惜的是,产品版本正式发布之后,这种参与和反馈感渐渐消失了。

更多的创业产品只是把邀请用户当作普通用户看待,意义寥寥。正确的做法应该是把所有潜在的合作者用户加入你的邮件列表或特定群组,每次发布新版本时,向邮件列表发送朋友对话般的通知(而不是例行邮件),鼓励他们参与,听取他们的意见,征求他们关于设计决策的看法,当他们发来补丁和反馈时给他们以热情回应。

你会有回报的。

最好的领导就是“不要试图去领导”

林纳斯是一个懒惰的程序员,所以他很早就认识到,好的领导者,并不是大包大揽,也不是让下属去完成领导部署的任务,而是让他们做自己真正想做的工作。好的领导者不应该总是去试图领导别人,他们要及时反思,修正自己的思路和决策,听取别人的意见,并把一些决策权交给他人。

作为整个Linux项目的领军人物,林纳斯只是在操作系统内核的争端上进行仲裁和决策,其他时候,大部分是集思广益,多头并进。林纳斯说:

我有时会赞同他们的工作,有时会批评他们的工作,但是大多数时候我都是放任自流的。如果两个人同时维护了相同的功能,我会接受两份工作成果,评估哪一份更可行。如果两者竞争激烈,那么我会同时拒绝他们,直到其中一位开发者失去了兴趣。

如果你是一位创业公司的领军人物,要常常反思的不是“我是不是做得太少了”,而是“我是不是管得太多了”。

及早发布,快速发布,并倾听用户的声音

很多人都习惯性地认为,除非是很小的项目,否则及早发布和频繁发布的做法有益无害。因为早期产品大都问题多多,过早发布会耗尽用户的耐心和开发者的雄心。这种看法直到互联网时代才开始有所改变。各大互联网公司为了抢占先机,开始无快不破,虽然第一代产品存在很多问题,但是他们会通过迅猛的迭代速度,快速推出第二代和第三代产品去弥补缺陷,赢得用户和占领市场。

其实这种策略Linux系统在20世纪90年代就开始采用了,林纳斯在早期(1991年)发布内核的频率甚至超过了一天一次!他把用户当作了自己的合作者,他不断倾听用户的声音,以持续发布来回报用户,用自我满足感激励那些黑客和顶尖高手。有的人会提出问题,有的人会发现问题,有的人会解决问题,这一切都会淹没在Linux频繁发布的版本浪潮里……

当然,在那个年代,林纳斯能做到这一点,和他自己的才能与设计天赋不无关系。《大教堂和集市》一书中对林纳斯的描述是:

他更像是一个工程实施上的天才,他具备一种避免bug和防范开发走入死胡同的第六感,而且有一种能发现从A点到B点最省力路径的真本事,事实上,Linux的整个设计,都透露着这种特质,并反映了林纳斯那种本质上保守而简洁的设计取向。

在移动互联网时代,及早发布、快速发布还会带来另一个附加值:如果你的App能够一周更新一次,那么用户永远不会忘记这些App和开发者,他们知道这些App的后面有一群鲜活的生命在不断地进行产品改进、性能调优、功能增强,通过频繁的发布,用户能够感知到这些数据之外的东西,并给你丰厚的回报。

如果一个问题解决不了,那么要问问自己,是不是提出了正确的问题

当你发现自己在开发中四处碰壁的时候,当你发现自己苦苦思索也难以确定下一个特征的时候,当你发现自己辗转腾挪也无法解决一个老问题的时候……停下来,喝杯咖啡吹吹风,你会发现,过了今天问题还是解决不了。

通常这时候,你不该再问自己是否找到了正确答案,而是是否提出了正确的问题,也许是问题本身需要被重新定义。

在不损失效能的前提下,不要犹豫,扔掉那些过时的特性吧。为了挽救IE6的用户,还不如去为那些愿意使用高级浏览器(支持HTML5)的用户提供更好的服务。

设计上的完美并不是没有东西可以加了,而是没东西可以减

有时候,我们在设计软件的时候会尽可能让自己表现得聪明而有原创性,这让我们在前行的时候常常忽略那能够直达目的地的小径,我们被蓝色湖泊上飘荡着的雾气吸引,在高山上怒放的美丽花朵之间徜徉,而忘记了真正的目标。

在应该保持软件健壮性和简单性的时候,设计者常常下意识把它弄得既华丽又复杂。应该用自动内存管理的时候使用了引用计数,能够最简实现的时候使用了各种设计模式,也许在潜意识里,很多程序员认为,使用了复杂技巧并难以读懂的代码才是好代码。

对于产品的设计和实现来说,增加功能和代码是最容易做到的,反而是代码减无可减,功能砍无可砍,最难实现。如果你的产品减少任何一个功能都会带来完整性和体验缺失的话,这款产品的功能就已经接近完美了,代码同样如此。

无论是产品设计还是编程实现,永远记住这样一个原则:KISS(Keep It Simple, Stupid),简单即为美。

Linux可以说是IT发展史上圣杯级别的产品,它的故事没有终点。几十年过去了,Linux散落在历史长河中的点点滴滴,依然像耀眼的珍珠一样在时间的深水河中发出璀璨的光芒。如果你是一个开发者,多读读Linux相关的技术书;如果你是互联网从业者,多读读Linux相关的故事和传奇。如果你两者都不是,多读读MacTalk就好了。

我第一次见到Mac是在2001年,那时候洪恩有一个做音乐的流浪歌手,名为老郭,头发蓬乱,夹克坚硬,伊常常在午后橙色的阳光里,怀抱着吉他,安详地坐在Mac Pro前调音和谱曲。我清晰地记得,那个版本的OS X是10.2 Jaguar,充满科技感的金属拉丝界面让我们这些用惯了Windows和Linux的程序员眼中充满了攫取的目光。奇怪的是,伊使用的鼠标没有像普通PC鼠标那样前半部分叉,而是一个浑然一体的半圆形,这一点让我们浮想联翩。

我凑过去问:“这玩意儿是鼠标吗?为什么没键?”

郭哥懒洋洋地扭过头来,眼睛向上,鼻孔朝天,他告诉我:“这叫单键鼠标,晓得吗?单击就是左键,按住Control单击,右键!”橙色的阳光打在伊的脸上,鼻梁上的眼镜变得五彩斑斓,我当时多么希望,阳光就是我的巴掌……

我和几位程序员面面相觑后走出了办公室,苹果不是最注重设计的公司吗?不是最人性化的公司吗?为啥生产鼠标会漏装右键呢?我们看着大楼对面清华大学破旧的东门,陷入了久久的沉思……

在我年轻的编程时代,这是少数几个困扰我的问题之一。直到有一天我用软件设计里的KISS(Keep It Simple, Stupid)原则做了一个非常勉强的解释:单键鼠标,简单到傻子也能使用!

又过了几年,我在老罗(罗永浩)写的“苹果五部曲”中找到了支持自己的证据,他在“关于苹果的粉丝”一文中写道:

2005年,迟钝的苹果公司终于推出双键式鼠标的时候,很多一直硬着头皮坚持使用苹果独有的弱智单键鼠标、嘴里还念叨着“复杂的社会,简单的苹果”和“Think Different”的苹果粉丝们终于装不下去了,纷纷冲出来购买,还在网上互相通知难兄难弟,“苹果鼠标有右键了!苹果鼠标有右键了!”是啊,苹果只用了短短的20多年就在鼠标上加上了右键,这是多么了不起的发展速度啊,要知道自行车可是诞生了近百年的时候,才有人给它加上了车闸的呀。

我第一次在一个朋友(他是个超级苹果粉丝)的办公室里试用苹果电脑的时候,很惊讶地发现苹果鼠标没有右键,更惊讶的是我发现苹果的操作系统是支持PC双键鼠标的,但我这个宝贝哥儿们说他一直都用单键的苹果原装鼠标,还告诉我:“其实,没必要用双键鼠标,在Mac上,你只要单击鼠标的同时按住Control键就能调出右键菜单……”我看了看他,很心疼地对他说:“兄弟,别这样,对自己好一点儿。”

复杂的社会,简单的苹果;标新立异,化繁为简。这可能就是苹果坚持使用这么多年单键鼠标的原因吧……

这个认知一直持续到我最近读了一本书,书名是《软件故事:谁发明了那些经典的编程语言》,书中的第8章“服务于大众的计算机:从Gooey到Macintosh的漫漫长路”谈到了鼠标的按键,我觉得我终于找到了苹果最初推出单键鼠标的原因。

在用户界面领域,一个很重要的争论点就是鼠标上的按键数目,这一争论一直持续到今天,现在你依然可以看到一个键、两个键、三个键和N个键的鼠标(我从来没用过超过三个键的鼠标),每个设计师都能为鼠标的按键找到存在的理由。

施乐最早的鼠标是三个键的,后来研究人员担心三个键会把用户搞糊涂,公司最终推向市场的鼠标装配了两个键。微软原封复制了施乐的创意,同样使用了双键鼠标。

苹果最终选择了单键鼠标,仅仅是为了标新立异吗?苹果公司在选择的背后确实有自己的用户哲学。苹果设计师特里布尔回想起在西雅图时路过电子游戏厅,他反复观看孩子们玩复杂的战争策略游戏,很多新手并没有查看操作指南,仅仅是通过站在旁边看有经验的玩家玩一两次就学会了。

特里布尔说:

关键是你看着别人这么做,自己就能学会了,你并不需要操作手册。这就是苹果公司在Lisa上采用、并在Mac上发扬光大的方式,最大程度地体现简单易学的理念。这么说吧,就像是在医学院里老师教授一个新技能:看一遍,自己做一遍,然后就可以去教别人了。

这种方式对视觉化的东西都适用,Mac就是个视觉化的东西……这就是我们使用单键鼠标的原因。有一个按键时,你可以边看边学习;要是按键多了,你反倒看不清别人是如何单击的了。

直到现在,苹果的产品大都没有操作指南,所以,他们会把软硬件做到足够简单。对应单键鼠标的,可能就是iPhone/iPad上那个亮晶晶的Home键吧,无论你在屏幕上走了多久,轻轻按下Home键,就能安全地回到主界面。家的感觉!

关于iPhone的Home键,微信之父张小龙在题为“微信背后的产品观”的演讲中,利用很大的篇幅进行了讲解,有兴趣的可以去找来听听。

现在为什么会生产双键鼠标或多键鼠标呢?可能是早就过了“边看边学习”的历史阶段了吧。

2010年的夏天,Chris Lattner接到了一个不同寻常的任务:为OS X和iOS平台开发下一代新的编程语言。那时候乔布斯还在以带病之身掌控着庞大的苹果帝国,他是否参与了这个研发计划,我们不得而知,不过我想他至少应该知道此事,因为这个计划是高度机密的,只有极少数人知道,最初的执行者也只有一个人,那就是Chris Lattner。

从2010年7月起,克里斯(Chris)就开始了无休止的思考、设计、编程和调试,他用了近一年的时间实现了大部分基础语言结构,之后另一些语言专家加入进来持续改进。到了2013年,该项目成为了苹果开发工具组的重中之重,克里斯带领着他的团队逐步完成了一门全新语言的语法设计、编译器、运行时、框架、IDE和文档等相关工作,并在2014年的WWDC大会上首次登台亮相便震惊了世界,这门语言的名字叫做“Swift”。

根据克里斯个人博客(http://nondot.org/sabre/)对Swift的描述,这门语言几乎是他凭借一己之力完成的。这位著名的70后程序员同时还是LLVM项目的主要发起人与作者之一、Clang编译器的作者,可以说Swift语言和克里斯之前的软件作品有着千丝万缕的联系。

同样是70后程序员,差别怎么那么大呢?

克里斯可以说是天才少年和好学生的代名词,他在2000年本科毕业之后,继续攻读计算机硕士和博士。但克里斯并不是宅男,学习之余他手捧“龙书”游历世界,成为德智体美劳全面发展的好学生。之后就是一篇又一篇地发表论文,硕士毕业论文即提出了一套完整的运行时编译思想,奠定了LLVM的发展基础,读博期间LLVM编译框架在他的领导下得到了长足的发展,已经可以基于GCC前端编译器的语义分析结果进行编译优化和代码生成了,所以克里斯在2005年毕业的时候已经是业界知名的编译器专家了。

注:很多计算机专业的大学生经常问我在大学里学点什么好,看看克里斯就行了。以目前的科技信息开放程度,如果你在自己感兴趣的领域里用心耕耘,再加上那么一点点天分,毕业时成为某一个专有领域的专家应该不是问题。那时就不是你满世界去找工作了,而是工作满世界来找你!

克里斯毕业的时候正是苹果为了编译器焦头烂额的时候,因为苹果之前的软件产品都依赖于整条GCC编译链,而开源界的这帮大爷并不买苹果的账,他们不愿意专门为了苹果公司的要求优化和改进GCC代码,所以苹果一怒之下将编译器后端直接替换为LLVM,并且把克里斯招入麾下。克里斯进入了苹果之后如鱼得水,不仅大幅度优化和改进LLVM以适应Objective-C的语法变革和性能要求,同时发起了Clang项目,旨在全面替换GCC。这个目标目前已经实现了,从OS X10.9和XCode 5开始,LLVM+GCC已经被替换成了LLVM+Clang。

Swift是克里斯在LLVM和Clang之后第三个伟大的项目!

2007年之前,Objective-C一直是苹果自家院落的小众语言,但是iOS移动设备的爆发让这门语言的普及率获得了火箭一般的蹿升速度,截止到今天,Objective-C在编程语言排行榜上排名第三,江湖人称三哥,大哥二哥分别是C和Java这样的老牌语言。同时,苹果在2012年和2013年分别对Objective-C进行了大规模的优化和升级改进,增加了各种现代语言的特性,让编写App更加容易,更多的程序员投入到了App Store的生态圈里……

在这种情况下,苹果公司为什么会发布一门新语言呢?

这个问题没有标准答案,不过我们可以试着去分析一下,谈谈苹果的心路历程……

Objective-C是21世纪80年代初由Brad Cox和Tom Love发明的,1988年乔布斯的NeXT公司获得了这门编程语言的授权,并开发出了Objective-C的语言库和NeXTSTEP的开发环境。后来NeXT被苹果收购,Objective-C阴差阳错地成了苹果的当家语言。掐指一算,30年倏忽而过,OC也成长为爷爷辈儿的编程语言了。

为了伺候好这位“爷爷”,苹果煞费苦心,把GCC的编译链先替换成LLVM+GCC,又替换成LLVM+Clang,做语法简化、自动引用计数、增加Blocks和GCD多线程异步处理技术……终于,OC在30年后重新焕发出勃勃生机,并占据了兵器谱排名第三的位置。但是,苹果却有点烦了,OC改进了这么多年,怎么看都像是在修修补补,用Blocks去实现一个类似Python的lambda闭包功能,看起来总是那么别扭。好吧,既然已经全盘掌握了LLVM和Clang,为什么我们不去基于现在的编译器设计一门全新的语言呢?一门属于苹果的语言!你看,邻居谷歌家里叫做Go的孩子不是玩耍正酣吗?

于是Swift诞生了……

当然,事实的真相也可能是行动缓慢的乔老爷子把克里斯拉到一边说:

“I want to be swift to...”

“行了,您别说了,不就是想要Swift吗,我这就给您做一个去。”

于是Swift诞生了……

1.Swift是面向Cocoa和Cocoa Touch的编程语言,编译型语言,生产环境的代码都需要LLVM编译成本地代码才能执行,但是Swift又具备很多动态语言的语法特性和交互方式。

2.Swift是一门类型安全的语言,可以帮助开发者清楚地掌控代码片段中的值类型。如果你期望输入的是字符串,类型安全的特性会阻止开发者错误地为其传递一个整数。这一切使得开发者能够更早地发现和修复错误。

3.支持各种高级语言特性,包括闭包、泛型、面向对象、多返回值、类型接口、元组、集合等。

4.Swift能与Objective-C进行混合编程,但代码分属不同的文件。

5.全面的Unicode支持,你甚至可以用一只表情狗作为变量名,实现以下操作:

注:程序里的(表情狗)为此图标 ,现在程序里加不上图标,物此说明。

控制台会输出“大狗菠萝”四个字。

6.编程语句取消了大部分语言使用的“;”分隔符,只有一行写多条语句时才需要分号。

7.很多人简单阅读了Swift的数据类型,就认为Swift没有类似Set和List这样的数据结构,其实Swift提供了两种Collection的数据类型:数组(Array)和字典(Dictionary)。这两个数据类型的表达式都用中括号标识。其中数组可以存储任意类型的变量,也可以强制声明存储同一种类型的变量。同时数组提供了类似Set的功能,你可以修改、追加、替换和删除数据的元素。另外,Swift还提供了元组(Tuple)的功能,支持函数多返回值。

8.Swift没有提供显式的指针,参数传递根据数据类型的不同分为:值类型和引用类型。值传递进行内存复制,引用传递最终传递的是一个指向原有对象的指针。这一点和Java的参数传递是类似的。需要注意的一点是,Swift里的数组和字典虽然都是结构体(struct),但在参数传递过程中处理方式却不一样,默认Array是引用传递1,Dictionary是值传递。而在Java中,由于数组和Map都是对象,所以传递的都是指针。

在Swift中,如果你不想传递数组引用,可以用copy()方法先复制一份出来,另外,也可以用unshare()表示,这个变量不传递指针。

9.闭包,Swift终于提供了一种优雅的闭包解决方案,在Swift中,函数变成了闭包的一种特殊形式。全局函数是一个有名字但不会捕获任何值的闭包,内嵌函数是一个有名字可以捕获到所在的函数域内值的闭包,闭包表达式是一个没有名字的可以捕获上下文中的变量或者常量的闭包。下面是一个闭包表达式的简要示例。

在标准库提供的排序函数sort中进行函数传递:

事实上更简单的写法是:

10.可选变量Optional的引入主要是为了应对一个变量可能存在也可能是nil的情况,这种情况在很多高级语言里都存在。比如你想使用String的toInt方法将String转化为Int类型,但是你并不知道这个转化是否正常,这时候系统会返回一个可选变量,如果转换成功就返回正常值,转换失败就返回nil,如下:

这时nn就是可选变量,想得到nn的值,可以通过if进行判断并通过追加感叹号获取变量值,如下:

可选变量的引入解决了大部分需要显式处理的异常,这部分工作也扔给编译器去做了。想了解更多可选变量的用法,请阅读苹果的官方文档。

11.Swift中的nil和Objective-C中的nil不同。在Objective-C中,nil是指向不存在对象的指针,而在Swift里,nil不是指针,它表示特定类型的值不存在。所有类型的可选值都可以被设置为nil,不仅仅是对象类型。

12.Swift没有从语言层面支持异步和多核,不过可以直接在Swift中复用GCD的API实现异步功能。另外,没看到Swift的异常处理机制,可能有了可选变量,异常的使用会非常少吧。

Swift是一门博采众长的现代语言,在设计的过程中,克里斯参考了Objective-C、Rust、Haskell、Ruby、Python、C#等优秀语言的特点,最终形成了目前Swift的语法特性。我在阅读了官方教程和做了些代码实验之后,自我感觉会喜欢上这门语言,在这里简单谈点感想,更深入的内容需要你们自己去深入学习。

关于语法相关的内容,先写这么几点吧。

给大家推荐一篇王巍(@onevcat)写的《行走于Swift的世界中》,深入阅读必有收获:http://onevcat.com/2014/06/walk-in-swift/

基本上,Swift绝对不是玩具语言,而是一门可以被大众接受的工业级编程语言。相信假以时日,Swift必将在App开发领域大放异彩。

let (表情狗)= "大狗菠萝" 
for n in (表情狗) { 
  println( n ) 
}
let names = ["D", "B", "R", "C", "A"] 
func backwards(s1: String, s2: String) -> Bool { 
return s1 > s2 
} 
var rnames = sort(names, backwards)
var rnames = sort( ["D", "B", "R", "C", "A"] ) { $0 > $1 }
let str = "123A" 
let nn = str.toInt()
if nn { 
println(nn!) 
}

Swift在WWDC上展示出来的性能还是让人非常吃惊的,在进行复杂对象排序时,OC的性能是Python的2.8倍,Swift是Python的3.9倍;在实现RC4加密算法的时候,OC的性能是Python的127倍,Swift是Python的220倍。总之Python在某一个深坑里膝盖中箭了,OC也没好到哪去,而Swift,就是快啊就是快!

对于这一点我并不是很理解,首先是WWDC上展示的语言层面的基准测试过于简单了,另外,OC和Swift都是被LLVM编译成本地代码执行的,理论上针对Swift的优化同样可以应用于OC,但是Swift居然比OC快那么一点点,难道LLVM单独针对Swift做了优化吗?我不是很明白,但觉得很厉害。

当然,还有更较真的程序员,他在第一时间针对于循环、递增、数组、字符串拼接等功能进行了测试,发现Swift的性能比OC还是差那么一点点的(http://www.splasmata.com/?p=2798)。

无论这些测试数据是否准确,我觉得性能是我们最不需要担心的问题,苹果已经全盘掌握了这个语言的方方面面,从底层编译框架到编译器再到语言设计,优化之路才刚刚开始,我们只要给这门新语言一点耐心就可以了。

对于开发者来说,Playground是本次WWDC最大的亮点。能够在编码的同时实时预览输出结果是每个开发人员的梦想,这一次苹果为大家提供了这样的福利。

Playground不仅实现了很多脚本语言支持的交互式编程,而且提供了控制台输出、实时图形图像、时间线(timeline)变量跟踪等功能,开发者除了可以看到代码的实时运行结果,还能根据时间线阅读某个变量在代码片段中值的变化。这真是太棒了!

最初看到这个功能的时候,我甚至以为每个Swift文件都可以基于Playground进行实时编码预览,仔细阅读文档后发现,只能在XCode提供的Playground文件中实现以上功能。看来Playground顾名思义,目前还只是为开发者提供了一个玩耍代码的地方。

当然不仅仅是玩耍,我们可以基于Playground做这些事情:

1.学习。通过Playground学习Swift,制作Swift教程实现交互式学习,同时还可以培训其他初学者。

2.代码开发。执行算法程序,迅速看到算法结果,跟踪变量;执行绘图程序,即时看到图像结果,及时调整。执行通用代码,查看变量的改变情况。

3.实验性代码。无需创建项目,直接打开一个独立的Playground文件即可编写代码,尝试调用新的API。

对于Playground,设计者克里斯是这样描述的:Playground功能倾注了我个人很多心血和激情,我希望新的编程语言具备更好的交互性,更友好,更有趣……我们希望通过这门语言重新定义“如何教授计算机科学!”

作为一门新语言,Swift的定位非常明确,就是吸引更多的开发者加入苹果的软件生态圈,为iOS和OS X开发出更为丰富的App,如果你是App Store的开发者,推荐尽早学习和掌握这门苹果力推的新语言。对于大部分新事物来说,越早介入,获利越多。如果你是一名Web相关的开发者,与其等待Swift增加Web开发的相关特性,还不如去学习一下Go语言Web编程。

如何开始Swift呢?

1.下载Xcode 6版本。

2.下载苹果官方提供的Swift编程语言电子书(https://itunes.apple.com/cn/book/swift-programming-language/id881256329?mt=11),中文版本(http://yuedu.baidu.com/ebook/6f6c3b1ef01dc281e43af000)。读。

3.下载WWDC Swift的Session视频和PDF。看。

4.基于Xcode 6创建Swift语言的项目,在项目中创建Playground,在其中调试玩耍。

5.根据官方提供的GuidedTour.playground学习Swift语法特性。下载地址是https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/GuidedTour.playground.zip

6.熟悉了基本的语法特性、与OC的混用、与Cocoa和Cocoa Touch的交互、调试等功能之后,就可以构建你的第一个Swift App了。

可以说Swift是我所见过关注度最高的新语言,一经推出即万众瞩目,媒体和开发者在数天之内对Swift进行了长篇累牍的报道和讨论,英文手册迅速被翻译成中文,即使是江湖上的另一位大佬谷歌2009年推出Go语言时也没有如此浩大的声势。当然,这和Go语言的定位有关,作为一门系统级的服务器端语言,开发者的可选余地太大了,如果谷歌推出Go是用来取代Java开发Android App,那可能情况就完全不一样了。

截至今天,苹果公司的股价报收于102.13美元,市值突破了6000亿美元,达到6115亿美元。时隔两年,苹果再次成为全球市值最高的公司,比全球市值第二大的埃克森美孚公司高出了30%。

在后乔布斯时代,苹果的股价曾经一度跌去三分之一,很多互联网分析师和金融专家开始唱衰苹果,市场上一片悲鸣之声。甚至有人认为苹果已成往事,就像微软一样,6000亿美元永不重来。适时很多朋友问我的看法,我说,第一,咱自己的公司还处于有上顿没下顿的年代,就不用太操心现金堆积如山的苹果的未来了。第二,如果操心,那也是因为咱是苹果产品的用户,就我个人对苹果公司的了解,以苹果在技术和产品设计上的经年积累,以及庞大而稳定的产品生态圈和用户群,在未来的5~10年内,苹果会一直处于科技领域的风口浪尖,顶尖尖的公司里,苹果该有一席之地。咱就别咸吃萝卜淡操心了,还是回去把今天测出来的bug改了吧,对了,别引入新的bug哦。

很多人知道苹果公司可能由于2001年的iPod,更多人知道苹果公司可能是由于2007年的iPhone,但是,苹果并不是一家新锐的科技公司。从1976年Apple I诞生,到1984年“超级碗”上的Mac,到1997年的Think Different,到2007年的iPhone问世,再到今天,苹果公司已经形成了独特的理念和气质,无论是早期的海盗精神,还是“只有疯狂到自以为能够改变世界的人才能真正地改变世界”,都诠释了苹果公司的产品设计理念,他们通过一套良好的思维体系和工业制度,把自己喜欢的东西精确地设计和制造出来,并送到用户手上。优秀的用户体验会让用户与产品建立情感上的连接,并确保用户会需要这个东西。

情感的注入是保证产品具备长久生命力的关键因素。

iPhone可以说是现在这个时代的标志性产品,它将设计和商业完美地结合了起来。好了,现在拿出你的iPhone,想象一下,我们先把iTunes去掉,这样我们就失去了音乐、播客、各种各样的iTunes U教程。然后再去掉iBooks,我们就失去了一部分的阅读体验。再去掉iTunes App Store、Mac和Mac App Store,我们就失去了开发第三方App的能力和所有的第三方App。再去掉iCloud,我们就失去了云端的数据。再拿掉苹果的零售店,我们就失去了真机体验和良好的购物环境。再去掉广告、包装和手机上的苹果Logo……,当所有的这些都不存在的时候,你确信自己手里还是一部iPhone吗?

当这样的手机厂商衰落的时候,如诺基亚、摩托罗拉,大部分用户只是一声叹息,转身就去买下一部手机了,留给厂商一个绝望的背影。

苹果不是这样的厂商,iPhone也不是这样一个冰冷而精巧的物件,它是通往缤纷体验的入口。苹果围绕着iPhone、iPad、Mac这些冷冰冰的硬件,打造了一整套温暖的、注入了情感的生态环境,最终形成了一系列完整的用户体验,这才是软件和硬件设计的灵魂。从更广泛的角度来定义设计的时候,你会发现,只有产品设计者融入了情感,这些情感才会通过用户对产品的每一次使用和触碰传递开来,最终形成用户与产品公司的连接。这样的连接有多牢固,决定了这个公司在浪潮之巅能跳跃多久。

看到我每天都会使用的iPhone、iPad和Mac,我想,我可能是最不希望苹果公司倒掉的那些人之一吧。如果有用户在意你的公司,关注你的价值,那这样的公司,在股票走势上不会差到哪里去。

实际上很多国内的产品公司已经在构建这样的设计链条了。我从2014年开始关注Android手机的设计,并使用了三部Android手机,分别是小米的米3、锤子的T1和华为的P7。

江湖传言,有多少人爱小米,就有多少人恨小米,现在看来,这句话同样适合锤子科技。但这两家公司确实在产品设计中注入了设计者的情感,并试图建立这样的生态环境。小米一直在打造自己的粗粮帝国,从MIUI、手机、平板、手环到社区、营销方式,都提供了非常一致的体验。锤子虽然是后起之秀,产品线极为单一,但是锤子从一开始就把“情怀”和体验放在第一位,他们的网站、Smartisan OS、T1手机无不传递了这样一种信息。

华为的P7,似乎走的是传统大厂的路子。P7本身的工艺设计可谓精良,轻薄、适手,Emotion UI也非常漂亮易用,但是你在某些细节上能感觉出设计的不一致性。如整体的UI都是非常现代、扁平、缤纷、华丽,但是偶尔会蹦出一个厚重的、笨笨的界面,打破体验的平衡感,让人有种“你是在逗我”的感觉。其实从包装上也可以明显地感觉出来,iPhone的包装让人感到简约,米3让人感到质朴,T1让人感到喜悦,P7就只能让人感到简陋,无论是外包装和内部配件,都很难说这是一个旗舰产品的包装盒。这种设计让人一入手的感受就是:这仅仅就是一部手机而已,无他。

作为一个有技术底蕴的华为帝国,不会没有意识到这一点,2013年华为荣耀已经作为独立品牌经营了,相信华为在未来的设计中,会更加注重技术、设计和一致性体验的整合。

真正的好设计对于用户来说应该是透明的,它确实有用,你无法离开,就像空气一样。只有空气变糟的时候,你才会觉察出来。

再举个例子,近些年我一直在做开发工具和应用平台相关的工作,我们的用户是全天下最难伺候的程序员,给程序员开发工具可不是闹着玩的。自古文人相轻,老婆永远是别人的好,文章一定是自己的好。程序员同样如此。如果你胆敢给程序员做一个不好用的功能,他们会暴力不合作或非暴力不合作,动之以情、晓之以理、威逼利诱、请吃冰激凌,告诉美眉微信号都不能动摇他们的铁石心肠。他们完全不顾自己刚才被产品经理虐得体无完肤的残酷事实,转身就拿出永不妥协的精神和你死磕到底。

对于这样一群可爱的程序员,他们的情感诉求是什么呢?后来我琢磨出来了,除了1024,大致有以下三点。

1.程序员要写代码。

2.使用你提供的工具时能获得能力上的提升。

3.写有价值的代码以获得精神上的愉悦。

如果你提供的开发工具和平台能够满足这些需求,程序员会乖得像猫咪一样一口气写8小时的程序。这也是一种设计链条。

前几天看了一篇文章《张小龙:走出孤独》,其中的一段话很喜欢,送给大家:

一名多次见过张小龙的记者评论说,他更愿意活在自己能掌控的世界中,而对于无力去掌控的东西没兴趣。现在他可以掌控的东西越多,也就变得越发的强大和自信。他穿着短裤在办公室里走来走去,确保团队开发出的每一行代码和每一个产品细节都灌注了他的情感。

写到这里,身边的电话响了,接通后电话那一端传来女儿美妙的声音:爸爸,妈妈喊你回家吃饭呢。

好,吃饭!

现代世界,互联网服务几乎渗透了人类生活的方方面面,无论你向左走还是向右行,密码管理都成为躲不开的问题。想当年“左青龙,右白虎,一串钥匙挂腰间”的日子一去不复返了,现在你得依赖云端的“钥匙串”。

关于密码使用的一些基本原则,我总结了一下。

1.密码不要过于简单,比如使用123456或你的生日等,大小写字符+数字算是合格的密码。

2.不要一个密码走遍天下,为不同类型的网站准备多套密码方案,分级使用。

3.首次使用某些软件系统(如路由器),一定要改掉初始密码。

4.如果可能,采用密码管理工具,如1Password、Keychain等。

既然密码是刚需,那么一定会有聪明人通过软件来满足这个需求,所以我们今天主要聊聊最后一点:密码管理工具。

上文中提到的1Password是一款跨平台的收费密码管理软件(OS X、iOS和Windows),很好用,但我今天并不准备介绍它,因为这家公司并没有给我推介费。有人说了,库房管理员库克同志同样没给过你一个子儿,你还不是巴巴地讲那么多Mac的事儿?

这……我思来想去,只能在未来的某一天和他算这笔总账了。

今天给大家介绍一下云端的钥匙串吧,iCloud上的Keychain,算是Mac上的原生应用。

OS X在升级到10.9(Mavericks)的时候增加了一个Keychain(钥匙串)的功能,可惜很多Mac用户升级时可能没有注意到这一点。

写到这,我忍不住要插播一句,很多人的处事原则是,给不了解的东西固执地打上否定的烙印,而不是去试着了解。这种态度会让你错过很多风景。比如我一直以为《MacTalk·人生元编程》是给老爷们看的,没想到很多如花似玉的女读者一样捧在手中细细阅读,于是错过了很多人面桃花和MacTalk交相辉映的情景。这个教训告诉我,永远不要低估女同胞的理解能力和分享能力,如果你还有这样的风景,请尽快发给我,不要犹豫,世界就在前面等你。

插播完毕!

什么是iCloud Keychain呢?这是一个云端的密码管理软件。既然记密码是一件让人头疼的事情,那么就让软件去记好了。iCloud Keychain会为你记住用Safari访问过的网站的用户名和密码、你的信用卡信息和Wi-Fi网络信息。它将你的网站用户名和密码存储在经过你许可的Mac和iOS设备上,并使用可靠的256位 AES技术进行加密保护,Apple也无法读取,还能让它们在每部设备上保持最新状态和实时更新。它还会在你需要的时候自动生成密码,或自动填写密码相关的信息。

总之,有了iCloud Keychain,你就不用再去记那些该死的密码了。那么,怎么去使用这个钥匙串呢?

1.在Mac上打开系统“偏好设置”→“iCloud”,让右侧的“钥匙串”选项处于选中状态。在其他iOS设备上同样操作。

2.没有第二了,正常登录你的网站、设置Wi-Fi密码就好了,系统会接管一切。

当你第一次注册某个网站并输入密码时,Keychain会为你自动生成不同安全等级的密码,等你下次登录时系统根据账户名自动填充。

你可以采用Keychain自动生成的密码,因为这些密码你自己都记不住,更不用说透露给你的敌人了。

当你想知道这些密码的时候,也很容易,打开Safari→“偏好设置”→“密码”,输入你想知道的网站密码,如apple.com,系统就会检索到你在这个网站的所有账户和密码,密码以“······”的方式展现,单击左下角的“显示所选网站的密码”,系统会提示你输入Mac用户的密码,之后就可以看到该网站的密码了。

当然,如果你自己的密码已经是分级并成体系的,不用Keychain自动生成密码也没问题,反正系统会为你记住它的。

一次使用之后,无论是网站密码,Wi-Fi密码,还是信用卡信息,系统都会记在心里,并贴心地在你的各个终端设备上同步。你不会找到这么好的密码管家了。再也不会因为忘记密码被妈妈打!

有关钥匙串的详细信息,大家可以参考以下网址:http://support.apple.com/kb/HT5813?viewlocale=zh_CN

相关图书

元宇宙中的硬科技
元宇宙中的硬科技
AIGC提示词美学定义
AIGC提示词美学定义
专利写作:从创意到变现
专利写作:从创意到变现
产品经理方法论——构建完整的产品知识体系(第2版)
产品经理方法论——构建完整的产品知识体系(第2版)
开发者关系实践指南
开发者关系实践指南
架构思维:从程序员到CTO
架构思维:从程序员到CTO

相关文章

相关课程