转载

聊聊程序员的工匠人生

聊聊程序员的工匠人生

如果我们可以一次把事情做对,并且做好,在允许的范围内尽可能追求卓越,为什么不去做呢?追求卓越,追求完美,追求细节的极致。小时候看到那些修表 匠,握着一个小螺丝刀,或是看着电工,用烙铁沾着锡和松香,在那一小寸的世界里,把坏了的地方修好,那种专注的眼神,觉得很厉害。

现在再去回想那些工匠工作的场景,越发觉得钦佩。在我老家有一家刻章的店,在我上幼儿园的时候就已经在那开了很多年了。前段时间需要刻一个章,发现 那家店还在,于是走进去,门口坐着一个老人,我确实记不得当年是不是他,不过看这岁数八九不离十。我以前在别的地方刻的章,都是在电脑里设计完图案后,激 光刻蚀。但那次老人却是用的手刻,我着实惊呆了。只看他拿出一块红色的印底,右手持着刻刀,开始一下一下地刻着。虽然老人连话都不怎么说得清了,但是工作 时那专注的神情,和精湛的手艺,以及最后成品那比机器更完美的效果,着实让我心里非常动容。

一、技术人的执着

我见过很多人,也见过很多 程序员 ,都有如此的「工匠情怀」。

聊聊程序员的工匠人生

做产品需求评审,有的人善于快速提供技术解决方案,在最短的时间内解决问题。但我见过的很多牛人,他们除了能在脑海里最快地形成方案原型,并且更深 入地考虑各种细节点,最终能给出一个更趋于完善的技术方案。在他们身上,我看到了对这项职业的自我尊重,对自我价值的追求,也有对「卓越」的理解和渴求。

《精通正则表达式》的译者余晟老师写过他和正则表达式的 缘起 。只是因为项目经理让他「多用Google,查查正则表达式的资料」,余老师打开了正则的大门,读完了英文原版的《Mastering Regular Expression》,如今成为了国内最了解正则表达式的人之一。

看完那篇文章其实我想起了我的实习经历。那时候我刚去公司两三天,有一天我老板找我让我研究一下如何用Java里的 MappedByteBuffer做文件内存映射来读取大文件。尽管我们当时要处理的文件很大,以我在学校编码的经验看,用普通的Reader也是可以很 好地解决的。

于是我说,「这个其实用Reader也能做,更简单一些,没那么麻烦。」老板反问我,「什么叫没那么麻烦,这是一个做技术的人的态度吗?」那几天我 花了很多时间,去从Linux一直到JVM,去了解什么是内存映射,底层原理是什么,和其它技术的比较、优缺点,并和其它几种读文件的技术做了性能对比。 虽然最后项目没有采用这个方案,但是那句反问直到现在一直在我脑海里,时时地提醒我:「做技术的人,对待技术,应该拥有什么样的态度?」

所以其实我很感谢我的老板,以前他教我们这些新人优秀的职场习惯,有一条是每天的邮件必须没有未读数,即便是不需要阅读的邮件,也要一键置为已读, 不要留一个未读的数字在那。现在想起来,有点像iOS App右上角那个提醒数的角标,有些强迫症的人怎么也忍受不了有个红圈圈在那。开个玩笑,虽然有些习惯看起来可有可无,无关紧要,但这确实映射了一种态度 和思维习惯。完美有多远?我不知道,但我愿意多往前走一步。

二、拾起初衷

我们的生活,每天很忙碌。有时候忙得自己都忘记了为什么在此处,有时候忙得只能不断地用直觉、用以往的经验去设计一个解决方案,而没有时间去思考需求是不是合理,方案是不是最佳,我们以为自己设计的是最佳实践,谁知道呢?

这个社会,这个世界,处在一个以不可思议的速度向前直奔的时间线上,我们处在这个时代的浪潮之上,每个人都感到了那种令人窒息的紧迫感。父母都是不 希望孩子太累的,我们见过很多这样的话:差不多就行了。糊弄糊弄就完事了。不要与众不同。顺其自然。但是你应该问问自己,是不是真的要 顺其自然 ?

我记得在上大二的时候,听一个叫端木恒的人说过一句话,大意是,这个世界上,政治可以改变很多事情,而科技,可以通过促进信息的流通,最终去推动政 治的变革,去改变整个世界。当时觉得这事儿太酷了,是的,所以我当时的想法是,要去一个技术足够强大,并且对人们的生活有实质影响的公司。希望用技术的力 量去让更多人生活地更好。

这当然是一种不自量力,但又如何呢?只是一个普通人小小的想法,不断追求卓越,愿意比别人多往前走一步而已。就像冯大辉说的 :所有人都说你做不成,都告诉你不要去做,不靠谱,嘲讽你,而你最后真的把事情做起来了,这就是牛逼。

做成了,其实牛不牛逼对你自己而言已经不重要了。没做成,所有人都笑你是傻逼,但起码也对得起自己的内心。再说,如果 青年人 想的都是养老和退休,那做事的人在哪?

三、发现更好的自己

在一个完美主义者的眼里,这是一个怎样的世界?

这个社会上很多人在生活上追求更高的品质,但愿意对自己手头所做的事情坚持高标准坚持卓越理念的人已经不多见了,以至于我们发现花再多的钱也买不到 安全的食品了,花了一辈子的积蓄买的房子却有各种质量问题。扪心自问自己在工作中是否能坚持某些东西,大部分人的态度都差不多,只是你糊弄一下不会怎样, 而他马虎一点就会死人,区别仅仅在于这里。

M·斯科特·派克说过一句话: 规避问题和逃避问题的趋向,是人类心理疾病的根源 。很多人把随大流把妥协作为一种 「成熟」的标志,小时候敢想敢说可能也敢做,长大以后懂得了人情世故,懂得向现实妥协,45度角仰望天空说自己终于长大了。再看身边那些「冥顽不灵」、 「认死理」的所谓完美主义者,认为这些人才是不正常的群体,把这些人要么当做傻逼要么当做装逼。

天哪,我都想问,「这是一个怎样的世界?」

肯定有人会说,站着说话不腰疼。诚然,在生活中,有的人是为了活下去,有的人是为了活得更好,有的人是为了帮助别人活得更好。这是不同的人生阶段,每个人的情况不一样,但这并不影响每个人内心的精神寄托和对信念的追求。

我从不指望去改变别人,但我相信我可以改变自己,虽然也很难。学生都喜欢问,如何最快地告诉自己的能力。说实话,我真的不知道什么是捷径,我的经验 就是和比你优秀的人一起工作,经常请教比你资深的人,不断挑战过去的自己(每天审视自己太紧张了,只要比前段时间的自己更好就可以了)。

四、细节是魔鬼

Devils are in the details, 细节是魔鬼 ,这句话很多人都听过,但要在工作中时时刻刻注意?难。

聊聊程序员的工匠人生

前几天给同事做Code Review,就几行代码,发现了一个问题。场景是我们发现某个系统中存在占用内存超大的HTML字符串,需要统计HTML字符串的长度,于是为了获得准 确的字节长度,这段代码调用的是String.getBytes().length,一眼看起来并没有什么大问题。

但是考虑到本身这个字符串就比较大,联想到Java内部是用UTF-16存储字符串的,而getBytes()会转换为系统默认编码(GBK或是 UTF-8等等),这里必然存在底层字符数组的拷贝(可以去参考String.getBytes()的源代码证实),一个本身就很大的字符串,经过拷贝, 将会占用更多的内存,加剧这个问题,而在HTML中,中文其实只占了非常小的一部分,所以直接用String.length(),虽然会少数几个字符,但 对统计结果影响其实并不大,并且这里不存在任何数组分配的开销。

另外建议所有调用String.getBytes()的地方通通显式传入编码,这是个大坑。(陈皓注:用String.length代替 getBytes().length,也是在给未来挖坑——如果未来有人要用len来干别的事,那么这个不精确的len可能就是一个大坑)

另外一个案例,也是在Code Review的时候发现的。

某个调用场景下,每次都会新建一个解析器对象去解析结果,尽管解析器没有任何实例变量不会产生线程安全问题,创建的开销也并不大,但我还是坚持要改成单例,使用同一个实例去处理,这也符合面向GC编程的思想。

这些场景,每天我们都在遇到,也许我们会说这些都是很小的问题,无伤大雅,差不多就行了。但就像前面说的,这是一种态度,一种思维习惯,当你坚持用最高的标准去要求自己,去要求自己的工作时,你才有可能渐渐接近卓越。细节是魔鬼,它会在完全察觉不到的时刻,把人拉回平庸。

「我不是为了输赢,我就是认真。」这不代表我们不在乎输赢,从头至尾我都坚信,只有坚持完美,坚持品质,坚持那些我们曾经了解现在可能已经放弃了的 美好的东西,像一个老工匠,把一种专注、追求极致的情怀融入我们的作品里,也许有一天,就有人,追寻着 梦想 ,发现了 生活更多的可能性 ,像乔布斯、像贝索斯,改变整个行业,改变全世界。

我们是被这个时代推上浪潮之巅的人,是去做一个见证者,或是一个冲在最前面也不怕被拍死的傻瓜,是我们每个人选择的权利。只是不要忘记,那些傻瓜,不是真的不怕死,他们只是认真。

正文到此结束
Loading...