125 洪强宁:从程序员到架构师,从架构师到CTO(一) 你好,我是爱因互动CTO、TGO会员洪强宁,在我的职业生涯中,经历了三个阶段,最初是一个典型的程序员,后来在豆瓣开始担任架构师,一直做到首席架构师,现在创业做CTO。对我来说,每次职位的跃升,都是一个提升眼界的过程。今天,我把这些提升的经验和体会分享给你,希望对你有用。

我们知道,技术人最典型的一条职业发展路径,就是由程序员,到架构师,再到CTO。那是不是技术人的职业通道就只有这一条呢?并不是,因为程序员、架构师和CTO,这是三个职业,每个职业都可以单独发展,不断深入与精进。而从程序员到架构师,再到CTO,主要差异在于看问题的层级和着眼点不同。

对于程序员来说,他们最关注的是技术中的细节处理,看到更多的是代码、模块这个层级,当程序员的着眼点从这个层级,提升到关注系统与协作时,他们就变成了架构师的角色。因为架构师会更加关注系统,着眼于组件和组件之间的协作,然后当架构师的着眼点再往上提升,关注更多的就是业务实现与战略发展,这时,角色就变成了CTO。

因此,我总结自己多年的职业发展经验,得出一个论断:职业发展的过程,就是眼界不断提高的过程。这不仅仅是对于程序员、架构师、CTO这个职业发展路线,还包括本岗位持续深入与精进的路线,比如程序员,随着能力的提高,眼界也在不断提升,关注点将不再是最初的细枝末节,而是会有大局观的意识,这也是一个优秀的程序员需要具备的思维。

优秀程序员需要具备的特质

其实相对于架构师和CTO来讲,做程序员是最简单的,只需要会写代码就可以,但问题是,只要会写代码就能成为一个优秀的程序员吗?答案显然是否定的。因为,成为一个优秀的程序员,需要多重考量,还需要具备一些特质。我根据自己的经验总结了五点,我把它称为“五精”。

1.精细,在细节之处深思熟虑。比如代码结构、变量命名、作用域、封装、类的关系等细节。举个例子,对一个变量的命名,应该用短命名,还是长命名,用A来表示,还是用一个特别长的句子来表示?这些细节,在你写代码时,就应该仔细衡量,因为它将影响代码后续的可读性与可维护性。

2.精湛,写出漂亮的代码。在豆瓣任职时,我们有一句半开玩笑的话,说豆瓣是工程师文化,意思是工程师要有文化。我觉得除了文化之外,工程师还需要有一定的美感,分辨一个设计是否简洁、优雅、高效。

3.精通,了解上下游知识。除了关注自己写的代码与模块,一个优秀的程序员还需要对上下游的知识有所了解。比如你是负责前端的,那你也需要了解一下后端是如何迎合你的请求的;如果你负责后端,你还需要考虑你的代码是如何做运维的;当你去访问数据库时,你需要了解,数据库是怎样应对你的产品请求的。只有将上下游的支撑都了解之后,写代码时,才能够更加准确、更加高效。

4.精深,掌握技术细节。包括语言细节、类库细节、算法细节、运行环境细节,等等。比如你使用一门语言,那你需要知道这门语言的各种语法细节,以及在什么地方最容易出错,怎么做能够有效的规避它等。再比如你使用的类库是怎样实现的,它在什么场景下的表现最好,在哪些场景下会出现问题等。还有运行环境,你不仅需要考虑业务逻辑,你可能还要考虑内存占用问题、缓存问题、磁盘问题等。这些都需要你对技术细节有较深的掌握度。

5.精明,做到准确交付。一个优秀的程序员不仅需要优雅、高效的实现需求,还需要在准确的时间内,交付符合质量的内容,这就需要我们去理解需求,并通过协商和沟通对不合适的需求作出调整。另外,也需要我们准确的评估工作量,判断优先级事项,做出考量和取舍。

而当你到达考量与取舍阶段时,就说明你已经开始具备一些架构师所需的特质了。

如何成为一名优秀的程序员

那怎么做,才能拥有这些优秀程序员需要具备的特质呢?我认为最重要的事情是互相学习,向更优秀的人学习。

举个例子,在豆瓣时,我们有一个非常好的实践就是做Code Review。最开始的时候,大家把所有的代码投到屏幕上,并各自讲出写代码的思路,其他人可以自由发表评论。这样做其实效率非常低,但我们一直坚持了下来,直到GitHub出现,我们用其中Pull Request的方式来做Code Review,效率才大大提高。

用GitHub做Code Review,收到的评论会非常多。如果一段代码几乎没有人表达反对意见,很大程度就能代表这是一个不错的代码。如果出现一段糟糕的代码,评论内容就会非常犀利的指出问题。也正是在这样不断评判与被评判的过程中,大家逐渐学会提高自己的代码水平,成为一个更加优秀的程序员。

另外,我们可以多参与技术社区,多参加各种技术交流活动和技术大会,多多跟他人交流。我们也可以不断地去参与开源项目,现在是一个最好的时代,GitHub的存在,让每个程序员能更容易地看到更多优秀的代码。

从程序员到架构师

你可能会问,那是不是一个程序员,只要能写出漂亮的代码,并且能够优雅、高效地实现业务需求,做到准确交付,就一定能成为架构师呢?

答案是否定的,即使一个程序员做到了“五精”,把“五精”做得再好,他的个人能力也是有上限的,他所实现的系统的复杂度也是有上限的,而业务的发展会远远超出个人的能力。

因此,我们需要把业务需求拆分成多个组件,再将每个组件分发给优秀的程序员来完成,通过互相协作,最终完成一个整体的业务需求。

在这里,分发的工作就是架构师的职责,架构师主要在解决Scalability的问题。它包括两个方面,一方面是人的Scale,比如业务需求变复杂后,单人不足以承担,这时就需要多人协作,那如何分解业务,如何将分解后的业务匹配合适的人,如何协作,就需要架构师来进行判断。

另一方面是量的Scale,比如当QPS从几十个增加到成千上万个,甚至几十万个的时候,面对这种情况该怎么办?这就是架构师需要解决的问题。

因此,当你从实现一个具体的功能,到考虑解决Scale问题的时候,你就已经开始走上了架构师这条路。即使你的title还是程序员,但是,你已经开始向架构师这个角色转变了。

总结

本文,我主要分享了一名优秀程序员所需具备的特质,即精细、精湛、精通、精深、精明这五个特质。另外,从程序员到架构师,不在于title如何,而是当你的着眼点更上一个层级,更多的理解业务需求,然后思考如何解决宏观问题、提炼通用组件、设计协作方式等问题的时候,你就是一名架构师了。

下一篇文章中,我将分享优秀架构师所需要具备的特质,以及从架构师到CTO转变之路的关注点,欢迎持续关注。

作者简介

洪强宁,爱因互动 CTO ,TGO鲲鹏会会员,资深Python程序员,曾任豆瓣网首席架构师与宜信大数据创新中心首席架构师,编程 30 余年,拥有11 年互联网从业经验。

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e6%8a%80%e6%9c%af%e9%a2%86%e5%af%bc%e5%8a%9b%e5%ae%9e%e6%88%98%e7%ac%94%e8%ae%b0/125%20%e6%b4%aa%e5%bc%ba%e5%ae%81%ef%bc%9a%e4%bb%8e%e7%a8%8b%e5%ba%8f%e5%91%98%e5%88%b0%e6%9e%b6%e6%9e%84%e5%b8%88%ef%bc%8c%e4%bb%8e%e6%9e%b6%e6%9e%84%e5%b8%88%e5%88%b0CTO%ef%bc%88%e4%b8%80%ef%bc%89.md