从你拿到第一份码工的工作开始,你就可以说你会写代码了,因为毕竟面试是需要写代码的。
然而会写面试的代码于工作是没有太大益处的。仅仅是你必备的一项找工作技能。
真正能写出在 production 也很 solid、很靠谱的代码,可能很多人都经历过类似的不同阶段:
第一阶段:抄代码
大部分公司对于比较新手的程序员,不太会上手就让你从无到有的开创一个新的代码库。而是在某一个代码库里增加或者修改一个功能。或者至少又类似的代码库可以参照。从产品的角度说,就是增加或者修改一个已有产品的特性。很多时候,公司的代码库已经有了很多类似的代码模块可以参考,而这种代码写起来其实没有太大技术难度,按照前人的写法写就行了。
叫抄代码有点偏颇,但是什么意思,我想很多人都能体会。我在 Square 的前半年,感觉大部分代码是这么写出来的。其实收获会很大:第一,你见识了这样的系统的架构是什么样子的。第二,很多地方别人为什么要那么写,反复琢磨,琢磨透了,就会学会处理实际编程中的很多技巧。比如怎么处理并发,怎么处理异常,怎么减少代码耦合度,等等。第三,很多语言的巧妙之处,系统设计的精巧,这些都是单纯读文章或者读代码很难体会的,自己从需求出发去理解这样的方案,其实学习语言的效率也是事半功倍。
第二阶段:学代码
当我们对业务逻辑,代码库都比较熟悉之后,这个时候多看看进阶的书和各种学习资料,我觉得是最有效的。因为你有了一定的基础,所以阅读起来更容易理解。更重要的,是书本或者资料里提到的一些优化方案或是设计技巧,会特别容易引起共鸣。
记得有一次,我要写一段处理 REST API request retry 情况下怎么保证 request 的执行在 timeout 或是 lost 等情况下都能保证 service 的功能函数被且只被调用一次。因为涉及到异步和并发,所以有很多奇怪的情况需要考虑。那几天满脑子里都是在想各种不同的出错场景该怎么处理,如何正确使用 idempotency key 来保证实现的严谨和正确性。就在这个时候,很幸运地看到一段类似情况的处理的代码,当时再读这样的实现,就对其简洁和全面无比欣赏,感觉就像发现了一件设计精巧、打造完美的艺术品似的。
工作中从别人、从资料积累的这样的学习慢慢会变多,这个时候,经常可以在对别人的代码审核中给出比较有价值的建议,或者能够对已有代码库做出进一步的优化和完善。
第三阶段:心中有代码
虽然说很多时候,大家觉得程序员这个职业,年轻人更有优势。我倒真的不是完全认同。一个程序员如果坚持不断的上手写代码,不断思考,不断学习,这样积累下来的经验应该只会让自己不断增值的。
前几天和二爷说笑,二爷说,和一些牛人聊技术,聊团队,聊模式,往往之后会觉得技术之外的东西更有帮助。其实就是这个道理,技术不是靠一次能讲清楚的,牛人一次分享会给你一些启发,但是这些启发有多少能转化到产品中,其实还是有很多别的更重要的因素的。
所以很多公司都需要挖一些这样的高级甚至高高级的程序员,因为他们是心里面有代码,知道一个service 应该怎么写,会有哪些坑。哪怕是写出的只是几十行代码,其实可能都是多少年经验积累下来的最宝贵的经验。
第四阶段:心中无代码
这句话好像有点虚。最近看了曹政哥的一篇文章《从值乎谈执行力》,有一段觉得写得特别好。(文末 “阅读原文” 点击可阅读)
以前我请大牛云风给我们讲过课,讲系统架构设计,他口头语也是,这个什么什么其实很简单,从头到尾你看不到他卖弄什么技术,讲什么特别高深玄奥的东西,但是人家搞出来的系统确实好用,后来提问环节我们有员工问过一些新的技术名词相关的什么什么,云风也很直白,很务实的说我们目前这个需求,用不上什么什么的。我就觉得这是重剑无锋的一个典范;现在云风他们团队分享的skynet开源引擎已经有非常多游戏团队在用,代码量也不复杂,功能也不算丰富,但是很实用的一个轻架构,能极大减少某些类型游戏的服务端开发成本。
这恰恰引起了我的一点感触。最近我们 Airbnb 支付组在重构我们支付系统的 API,大家都知道 Airbnb 支持 191 个国家 75 种货币 几十种不同的支付方式,在设计中需要保持 API 的简洁,又要留出足够的灵巧性可以方便的扩展和支持任何一种已有的或是新的支付方式。在设计和实现的过程中,所有的编程模式要熟悉,却不可能硬搬任何一种模式。只有真正吃透了需求和所有的编程技巧,才有可能做出干净而实用的方案。(题图作者杨江明也是这个系统的主要架构师。)
最后小八卦一下。硅谷码工随着等级的上升,收入不是呈线性增长,很多时候是翻倍地长的。我觉得其实是合理的。所以在初入职场面临的很多选择,其实还是应该以提高自身水平作为最重要的因素。年薪上差的那几万十几万,如果好好发展,到了后面,真的就不算什么了。第一份工作为了 package 做选择,真的不值得。