每个人都有成长的渴望,也都会遇到成长的瓶颈。

一个读者问我:如何才能训练成为一个编程高手?

先简单说下这个读者的背景:工作 3 年多,目前在大厂做后台开发,身边有不少编程高手,是他想要追赶的目标。最近半年时间,他花了一些精力在研究源码和底层原理上,但总觉得这些知识和实际工作衔接不好,提升很慢,学习动力也越来越差,希望我能给点建议。

我和他语音聊了半个小时,讲了一些我个人以及身边同事的案例。交流下来后,双方都有所启发。所以再次整理下,分享给大家。

何谓 “编程高手” ?

我觉得能分成这样 3 类:

  • 第 1 类:天赋和成就都很高的人中龙凤,比如能一个人写出 WPS 的求伯君、一个人开发出电子邮件 Foxmail 的张小龙,对开源领域影响很大的章亦春等人。
  • 第 2 类:有不错的口碑同时广为人知的技术大牛,他们一般在知名公司的重要岗位任职过,对技术纯真热爱,同时热衷分享,比如耗子哥、阮一峰、尤雨溪等人。
  • 第 3 类:工作中被我们视为崇拜对象、未来有希望企及的高 P 或者架构师。

前面两类不在我的圈层射程内( 除了跟耗子哥在亚马逊有过一面之缘以外 ),因此本文主要聊下第 3 类人。这个也是绝大部分读者最关心的、同时可以设定为超越对象的群体。

这样就有了一个新问题: 既然想成为第 3 类人,那如何给第 3 类人下一个相对准确且具象的定义呢? (如果目标都是模糊的,就难言超越了),这其实是一个很有意思的问题,每个人的答案可能都不一样,因为「编程水平的高与低」本身就是一个相对的概念。我先说一下我的看法。

刚毕业那会,我眼中的编程高手是我的同事 - 超哥,他是亚马逊的架构师,团队里面技术级别最高的人(后来他做到了亚马逊中国首架的位置,现在也算圈内比较知名的大牛了)。

超哥是那种能搞定一个复杂项目(跨多个系统),从架构设计、到编码、到自动化测试、再到运维工具、甚至写文档都非常全面的人。显然是我这个刚毕业的菜鸟极其崇拜的大佬。

再后来,我工作了四五年,走向了技术管理路线,因为带团队的原因,我又多了一个新视角来审视编程厉害的人。对比所谓的 PPT 架构师、以及讲到技术原理就满嘴跑火车而编码能力却稀松平常的人,我倾向给「编程高手」下一个更务实的定义:那就是实际工作中,能做到高效率、高质量、且稳定输出的人。看似容易,实则很难。我对这个定义的详细解读如下:

高效率:编程效率能做到团队中的 Top,对于复杂需求或者复杂问题能够快速理解,具备将复杂工作拆解成一系列简单子问题并搞定这些问题的人。他们能从实际场景出发,有造轮子的能力,也有不造轮子的觉悟。

高质量:编程质量能做到团队中的 Top,设计方案的合理性、编码的严谨性、测试方法、监控运维方案等,都能思考全面的人。

稳定输出:给高效率和高质量增加的限定。我觉得只有量变引起质变,真正形成了自己的方法论,能持续搞定一类问题,而不是单个问题的人才算是高手。

也许你会说要同时做到这 3 点太难了,但是实际工作中,一定有人能做到某个点或者某几点,那么以他们作为这一点的标杆即可。因为所谓的 「 编程 高手 」 不过是 我们设定 的一个 目标而已,你清楚这个目标是什么就足够了,不一定非得安在同一个人身上。

如何理解 “底层知识” 的价值?

要成为一个编程高手,底层知识是必不可少的。这是一句正确的废话,就不展开解释了。读者真正的问题在于:如何将底层知识和实际工作衔接起来,做到相辅相成?

先看一个具体的例子。对于简历中写自己做过性能优化的候选人,我面试时比较喜欢问:你是如何定位性能瓶颈并完成调优的?如果再次碰到此类问题,你的详细思路是什么?

很显然,这是一个系统性的工程问题,能同时对技术深度和宽度进行考察。不仅仅是应用层的代码,还包括所使用的框架、中间件、虚拟机、网络甚至操作系统等等。 有性能指标等基础性的知识,有 监控和压测工具的运用,还 有成体系的排查思路和优化方法等等。

如果是编程低手,他们的答案通常有这几类:

  • 性能指标都不清楚,遇到问题也不知道该用什么工具,这一类人应用层都不达标。
  • 初步定位到一个疑似瓶颈点后,就着手优化,最终解决的只是一个浅层次的性能瓶颈问题,根本原因并未触达到。
  • 能定位到根本原因,但是对于解决方案的合理性缺少深入思考,不追求极致,最终只是用了曲线的方案再次隐藏了性能问题。

通过这个例子,我其实想说明两点:

  • 不具备底层知识,你的视野根本就触达不到底层的东西,思维以及能力永远只能停留在应用层面,能解决的问题有限。
  • 读源码、学习各种原理,所有这些都只是学习和巩固知识的过程,真正体现编程水平的是实际解决问题的能力,因此如何将知识变成有效的经验?这个才是关键,做不到要么是实践不够,要么是压根没研究明白。

然后,我们再回到问题身上:究竟如何才能做到底层知识和实际工作的衔接呢?如果衔接不好,那问题出在哪个环节?

大家可以先思考下:过往工作中那些对你编程能力帮助很大的经历,你认为你能获得提升最关键的因素是什么?是底层知识的储备吗?细想一下一定不是,而是发现问题的能力。 (注意:我说的是最关键的因素,并不是否认底层知识的储备不重要)

大家可以去观察一个工作中很常见的现象:同一个问题你能看到哪一层?而编程高手又能看到哪一层?谁能更快地贴近问题的本质?谁又能衍生出一系列的问题? 这其实就是「发现问题」的能力体现。只有当你意识到它是一个值得深挖的问题时,才会有一层一层的思考,一层一层的分析。

那应该如何提高这方面的能力呢?其实就是思考力的提升过程,除了观察和刻意练习,我想不出更好的建议。多看高手是怎么做的?遇到问题时自己多问几个为什么?多反思自己的思路是否正确?日积月累水平自然会提高。当你具备了发现问题的能力,就相当于给知识和经验之间架起了一座桥梁,真正做到相辅相成以及互相驱动。

成为 “编程高手” 的几点建议

编程作为一门实践性的学科,多动手解决问题是最基本的要求了,解决问题越多、越难,能力提升越快。而在这个过程中,如果有知识输入(底层知识的储备),还有思考的加成(发现问题的能力),编程水平的提升会更加迅速。

我带过的团队里面,还有一类人总说自己技术进步很慢,工作没有挑战。但是当团队遇到一个技术难题时,他根本没有意愿去做深入了解,嘴上说热爱技术、渴望成长,但是却看不到行动,这种人是永远成为不了编程高手的。

真正的热爱来源于行动上的投入,不是找借口,不是追求舒服,这是很重要的一个区别。

编程高手是如何练成的?这样看来,它其实是一个体力、脑力、心力的修仙之路。

如何才能训练成为一个编程高手?相关推荐

  1. 如何成为一个编程高手

    在过去5年中,我面试了数百名IT工程师,我认为很值得把我的面试IT工程师的经验同大家分享.这能够: ●帮助人们为他们的下一个面试准备 ●帮助IT工程师找到合适的工作. ●帮助IT工程师创造更好的环境. ...

  2. 编程高手是如何练成的?

    每个人都有成长的渴望,也都会遇到成长的瓶颈.下面这个问题是一个读者问我的: 如何才能训练成为一个编程高手? 先简单说下这个读者的背景:工作 3 年多,目前在大厂做后台开发,身边有不少编程高手,是他想要 ...

  3. 骆俊武:编程高手是如何练成的?

    每个人都有成长的渴望,也都会遇到成长的瓶颈.下面这个问题是一个读者问我的: 如何才能训练成为一个编程高手? 先简单说下这个读者的背景:工作 3 年多,目前在大厂做后台开发,身边有不少编程高手,是他想要 ...

  4. 前亚马逊工程师、现大厂技术总监与你分享:编程高手是如何炼成的!

    作者 | 骆俊武 来源 | 武哥漫谈IT(ID:BestITer) 每个人都有成长的渴望,也都会遇到成长的瓶颈. 一个读者问我:如何才能训练成为一个编程高手? 先简单说下这个读者的背景:工作 3 年多 ...

  5. 如何才能成为年薪百万的编程高手?

    念念不忘,必有回响--李叔同 以前写过一篇文章<有哪些让程序员受益终生的建议>,讲过要成为一个编程高手,最好同时具备外部名气和内部实力. 外部名气就是,表面上看起来像个高手. 最好是,别人 ...

  6. 扯谈之编程高手VS武林高手

    不经意间觉得编程高手和这个武林高手好像有那么"一腿子",特列举了以下 证据,文字丑陋,欢迎补充修改. 体质-计算机基础    如果没有一个强壮的身体,就想成为武林高手,难免有些牵强 ...

  7. 梁肇新 编程高手箴言 书评

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 引用地址 ...

  8. 【转】心目中的编程高手

    -- Bill Joy MIT BBS上说微软电话面试的一道题就是"Who do you think is the best coder, and why?".我觉得挺有意思的,也 ...

  9. 潜心十年,修炼成编程高手

    richardcao 于 2013-01-03 00:00 翻译 |来源:金译通网·译文 Eeach Yourself Programming in Ten Years 潜心十年,修炼成编程高手 Pe ...

最新文章

  1. jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
  2. 哥伦比亚大学计算机工程面试题
  3. C#调用C++ memcpy实现各种参数类型的内存拷贝 VS marshal.copy的实现 效率对比
  4. 零基础学Python(第二章 中文编码)
  5. python体育竞技分析代码200行_使用Python进行体育竞技分析(预测球队成绩)
  6. 圆章能随便刻吗_自己晒干的蒲公英能长期当茶随便喝吗?医生:3个危害不请自来...
  7. java gof_java GOF23设计模式-简单工厂模式进阶
  8. 腾讯云mysql升级失败怎么办_本地连接腾讯云Mysql失败问题
  9. yii2实现WebService 使用 SoapDiscovery
  10. 基于Ubuntu 18.04配置固定IP方法
  11. vgg16网络模型的学习理解
  12. 数据库原理及应用-李唯唯主编-实验3-2
  13. 你想成为阿里巴巴的一名数据工程师吗?以下的应聘要求你得好好看了
  14. C#:查找文件所在位置
  15. docx文件是什么?如何打开后缀名.docx格式的word2007文件?
  16. 电脑只有飞行模式 不显示任何WiFi信号
  17. HDFS小文件的危害
  18. 微信解封快手链接;AWS 证实宕机;微软内部疑禁用 Slack | 极客头条
  19. “一见杨过误终身” ——体验式营销,你也可以创造传奇_营销人论坛
  20. Unicode编码的理解

热门文章

  1. 金蝶K3发货通知单下推外购入库时,报数据读取错误,列名无效处理过程
  2. maven项目如何生成war文件并部署到tomcat
  3. MLSys 2020 | FedProx:异质网络的联邦优化
  4. Ajax数据类型转化
  5. 广州APP开发多少钱一个呢,品向告诉你知道
  6. UVa 111 - History Grading
  7. ORACLE SPATIAL介绍
  8. Macaw:让你像处理图片那样写Web代码
  9. 服务器再次全球宕机 谷歌官方回应:内部技术故障所致
  10. 什么是 IP地址 NAT 公网 内网 端口