我拿到问题一看,不难。Linu×和OS X虽然师出同门,都是从老前辈LJNIX那儿毕业的,但是后来毕竟各练各的,在Linux编译好的程序不可能在OS X上用,但是在OS X上重新编译一下可能就没事了。我把这个想法告诉了这位程序员,得到的反馈是:对不起,哥,没有源代码!我被这个冷酷的回复震惊了,立刻意识到刚才的想法并不是最优解决方案,因为在重新编译的过程中,各种包的依赖关系和编译错误足以让你焦头烂额,我随即提供了B计划:在OS X上安装Docker,轻量级的容器Docker‘可以运行各种版本的Linux,把文件扔到Docker里,然后通过主机和Docker’之间的端口映射即可轻松解决这一问题。
虽然这里面会涉及很多技术细节,但是方向是没有问题的,所以这位程序员立刻表示“茅塞顿开”,然后“地一声就在屏幕对面消失了,没有留给我说“不客气”的机会。
这个问题装个Linux虚拟机也可以解决,但是虚拟机过于耗费资源,而且不如Docker。灵活,所以不是最佳解决方案。Docke r’是。作为一个程序员,我们除了要掌握多门程序语言和多种数据库,了解前端技术、后端技术,通晓网络七层架构,知道TCP/IP三次握手和四次挥手,编写漂亮的代码,设计优美的架构……之外,我们还要解决研发、程序运行和产品上线过程中遇到的各种问题,而且被要求以最小的代价来解决问题……我们容易吗?
除了编程技巧和程序设计能力,解决问题的稳准狠是衡量一个程序员是否优秀的重要因素之一,也是资深技术人员真正的价值所在。在科技浪潮澎湃、技术信息扑面而来的今天,一位刚毕业的大学生如果足够勤奋,他可以在两三个月之内掌握一门编程语言,并编写出像模像样的软件,他们的学习速度甚至超过了我们这些老程序员,但是解决问题的能力是无法速成的,只能依靠时间、经验和惨痛的教训历练而成。有时候还需要灵感和运气。很多军事迷读了大量的军事著作和历史小说,常常羡慕那些名将的风采,并浩叹自己“生不逢时”。但是名将不是那么容易炼成的。历史上叱咤风云的名将凤毛麟角,他们亲自持刀上阵追击敌人,见识战场的惨烈,目睹敌人的尸体,看到战友被杀,知道被刀砍中会流血死去,他们冷酷无情,坚如磐石,在全军即将崩溃的时候发现敌人的弱点并进行攻击,在瞬息万变的战场中进行决断,在多次失败后从无数士兵的尸体里站起来重新出发去挑战那个战胜你的对手,在所有人对你说“指导员,我们上吧”的时候,坚定地说出那三个字:再等等!
如果你做不到这些,那还是做个最终会被张飞枪挑的小兵吧。
优秀的程序员同样如此,莱乌常常羡慕高手在谈笑之间让难题灰飞烟灭,而自己却苦苦思索而不得入门之法,殊不知这些高手同样经历了名将的那些腥风血雨。他们在清晨的微光里编写代码,在轰鸣的机房中调试程序,他们彻夜不眠就是为了解决一个bug,他们要承受数据丢失或上线失败的痛苦,默默吞下眼泪,准备下一次的战斗。不停地学习、实践和思索,成千上万个小时之后,高手始成。
同样的问题,高手的解决思路和小球是截然不同的。一般来说,只要不是世界难题,给足时间、空间和人力,都能解决。如果你遇到问题告诉上级,这个问题交给我了,两年之内搞得妥妥的,那就不要怪项目组成员组团把你打出屎来,因为大家要的是分分钟解决,不是两年。在这个唯快不破的年代,我们没有那么多的时间,所以要通过逆向思维、经验教训、辗转腾挪、借力打力等方式以最小的代价快速解决问题。这才是老程序员的价值。再举个例子,一个运行良好的线上应用,在你修改bug增加功能之后,重新上线,出现了一些莫名其妙的问题,如占用资源增加或运行一段时间宕机等,怎么解决?
常规的做法就是通过阅读日志、模拟线上环境和调试程序未定位错误。容易的bug用这些方式基本就能搞定了,但是更隐蔽的bug会耗费大量的时间和人力。更好的方式是什么?
首先,排查是程序问题还是环境问题,把线上程序恢复到运行正常时的老版本,如果出现了同样的问题,那就是生产环境发生了改变。如果运行正常,要么是你修改老bug时引入了新bug,要么是新增加的代码出现了问题。
其次,阅读产品的修改日志,根据代码提交的时间线构建系统,通过二分法排查,定位是哪部分代码引起的问题。P4-5
给池院长的这本书写序并不是一件简单的事。当接到这个任务时,我是有点诚惶诚恐、受宠若惊的。在我的意识中,写序人的知名度或是在某领域的建树一般都会比作者高一个级别,好比李银河给冯唐的新书润笔,颇有法力加持的意味。我三表除了比院长帅一点、鲜一点外,何德何能呢?我在这样的“怀疑”中拖沓了一个月,直到池院长说: “再不写就只好割袍断义了。”
我和池院长大概是在2014年情人节,神秘人士Rov Li的粉丝见面会上结识的。那时候我刚踏入艺能界,表演脱口秀还不能脱稿,我在台上局促地表演,台下有一道充满慈爱、温暖、激励的眼神射向我,仿佛在说:全世界都放弃,至少还有我在聆听。这眼神就来自池院长。我谢幕后,他微笑着拍了拍我的肩膀,像长者又像仁兄。
我想我必须要了解这个谜一样的男人,我查阅了大量资料后得知他是一个程序员兼任“苹果亚太区总布道师”。我作为一个文青、艺人,素来和程序员井水不犯河水,在我的想象中, “程序员”的代名词就是:木讷、寡淡、无趣、死理性派。我不可能和这种特质的人成为朋友,除非他也爱喝酒、爱吃毛豆。
后来,我订阅了他的公众号,围观他的朋友圈,参加他组织的分享会,他三观奇正、风趣幽默、博闻广识、待人亲和,我笃定地认为:如果他都不是我的朋友,那我宁愿孤独终老。正所谓我见青山多妩媚,料青山见我应如是,我想他一定也是这么想的,否则他为什么会叫我表弟?为什么会不厌其烦向他的粉丝推荐我的公众号?为什么每次都会第一时间回答我使用Mac时遇到的傻问题?很多人包括我都是因为池院长才拥有了人生的第一台苹果产品,而他没有从中赚到哪怕一分钱提成。
如果池院长不是一个程序员,也会是一个极其优秀的写作者。自媒体时代,人人都是写作者,我订阅了上百个公众号,而最能给我启发,让我如坐春风、茅塞顿开的,“MacTa¨一定排在前三。鸡汤若汇成河,那我只取“池建强”这一瓢饮。“池氏鸡汤”不腻,并没有慷慨激昂的口号。他总能见微知著,从日常工作、生活中的一件小事入手,抽丝剥茧,最后浓缩成一点点人生质朴的哲理。
陆琪式的鸡汤是商品,是廉价的,是在消费绝大多数庸众的情绪。它的虚弱与无力在于,你并没有真正走进那复杂、多变又瑰丽的人生,而它也不过是像流水线一样锻造消费者需要的那点情愫罢了。而池院长是70后生人,已是越过山丘,历经荣辱,他谈技术变革也融汇人生智慧,他谈人生智慧亦不疏离科技跃升的宏大背景。信息浪潮下的比特世界,人们总爱自诩站在科技与人文的十字路口,而真正做到这一点的,舍池建强其谁呢?
池院长爱跑步、爱音乐,聊高晓松与诗,谈贝叶斯和黑天鹅,我们在为稻梁谋,而他已经在思考程序员终极归宿这种充满人性光辉的命题了。我不觉得这一切创作是“大而无当”的,他亲历了、他感悟了、他分享了,真实就是最澎湃的力量。
池院长不跟热点、专业灭high,当真该庆幸浮躁的社会有这样一个冷峻的智者。如今他舍弃了一份稳定且受人尊重的工作,投身到锤子科技。我得知这个消息后,颇惊讶了一阵,他如何敢以中年之姿投入一份未知且备受责难的事业中?后来我想到,没错,这就是他,知行合一,从不耽于安逸,为了他认为的美好事物,不温和地走进那个良夜。
作为朋友、读者,我们该庆幸的是:他又有很多好故事可以说。
三表
微信公众号“三表龙门阵”作者,著名脱口秀演员
《MacTalk跨越边界》是一个程序员的随笔文集,但不是一本技术图书。本书的主要内容来自作者的微信公众平台“MacTalk”,书中包含了5个主题,分别是:写给走在编程路上的人、文艺中年、自省、跨越和人物,共 60 多篇文章。书中有作者对生活的思考,对边界的探寻,有作者池建强身边的人和他们的故事,其中的一些文字还记录了这个时代的某个剪影,或某段情感。《MacTalk 跨越边界》中作者沿用了一贯的科技与人文相结合的风格,文风有趣,又增加了一点力量。作者充分享受着写作的乐趣,书中的文字对作者意义非凡,它们能够帮助作者探索、梳理和记录生活。希望你在阅读这本书的时候,也能获得这样的乐趣和感受。这是一本有趣且充满思考的书,适合所有喜欢技术、热爱生活的人阅读。
《一个安静的中年程序员》、《写作的乐趣》、《程序员真正的价值》、《当程序员老去》、《程序员如何选择技术方向》、《程序员犯过的错误》、《加班到底在加什么》、《程序员很穷》、《千万别惹程序员》……《MacTalk跨越边界》是一个程序员的随笔文集,书中有作者池建强对生活的思考,对边界的探寻,有作者身边的人和他们的故事,其中的一些文字还记录了这个时代的某个剪影,或某段情感。