当前位置: 首页 > news >正文

编程高手是如何练成的?

9d90fcd803622a0d6656f0f39465334a.gif

每个人都有成长的渴望,也都会遇到成长的瓶颈。下面这个问题是一个读者问我的:

如何才能训练成为一个编程高手?

先简单说下这个读者的背景:工作 3 年多,目前在大厂做后台开发,身边有不少编程高手,是他想要追赶的目标。

最近半年时间,他花了一些精力在研究源码和底层原理上,但总觉得这些知识和实际工作衔接不好,提升很慢,学习动力也越来越差,希望我能给点建议。

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

 1 

何谓 “编程高手

我觉得能分成这样 3 类:

第 1 类:天赋和成就都很高的人中龙凤,比如能一个人写出 WPS 的求伯君、一个人开发出电子邮件 Foxmail 的张小龙,对开源领域影响很大的章亦春等人。

第 2 类:有不错的口碑同时广为人知的技术大牛,他们一般在知名公司的重要岗位任职过,对技术纯真热爱,同时热衷分享,比如耗子哥、阮一峰、尤雨溪等人。

第 3 类:工作中被我们视为崇拜对象、未来有希望企及的高 P 或者架构师。

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

这样就有了一个新问题:既然想成为第 3 类人,那如何给第 3 类人下一个相对准确且具象的定义呢?(如果目标都是模糊的,就难言超越了)

这其实是一个很有意思的问题,每个人的答案可能都不一样,因为「编程水平的高与低」本身就是一个相对的概念。

我先说一下我的看法。

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

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

再后来,我工作了四五年,走向了技术管理路线,因为带团队的原因,我又多了一个新视角来审视编程厉害的人。

对比所谓的 PPT 架构师、以及讲到技术原理就满嘴跑火车而编码能力却稀松平常的人,我倾向给「编程高手」下一个更务实的定义:那就是实际工作中,能做到高效率、高质量、且稳定输出的人。看似容易,实则很难。我对这个定义的详细解读如下:

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

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

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

也许你会说要同时做到这 3 点太难了,但是实际工作中,一定有人能做到某个点或者某几点,那么以他们作为这一点的标杆即可。

因为所谓的「编程高手」不过是我们设定的一个目标而已,你清楚这个目标是什么就足够了,不一定非得安在同一个人身上。

 2 

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

要成为一个编程高手,底层知识是必不可少的。这是一句正确的废话,就不展开解释了。

读者真正的问题在于:如何将底层知识和实际工作衔接起来,做到相辅相成?

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

很显然,这是一个系统性的工程问题,能同时对技术深度和宽度进行考察。

不仅仅是应用层的代码,还包括所使用的框架、中间件、虚拟机、网络甚至操作系统等等。有性能指标等基础性的知识,有监控和压测工具的运用,还有成体系的排查思路和优化方法等等。

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

1、性能指标都不清楚,遇到问题也不知道该用什么工具,这一类人应用层都不达标。

2、初步定位到一个疑似瓶颈点后,就着手优化,最终解决的只是一个浅层次的性能瓶颈问题,根本原因并未触达到。

3、能定位到根本原因,但是对于解决方案的合理性缺少深入思考,不追求极致,最终只是用了曲线的方案再次隐藏了性能问题。

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

1、不具备底层知识,你的视野根本就触达不到底层的东西,思维以及能力永远只能停留在应用层面,能解决的问题有限。

2、读源码、学习各种原理,所有这些都只是学习和巩固知识的过程,真正体现编程水平的是实际解决问题的能力,因此如何将知识变成有效的经验?这个才是关键,做不到要么是实践不够,要么是压根没研究明白。

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

大家可以先思考下:过往工作中那些对你编程能力帮助很大的经历,你认为你能获得提升最关键的因素是什么?是底层知识的储备吗?

细想一下一定不是,而是发现问题的能力(注意:我说的是最关键的因素,并不是否认底层知识的储备不重要)

大家可以去观察一个工作中很常见的现象:同一个问题你能看到哪一层?而编程高手又能看到哪一层?谁能更快地贴近问题的本质?谁又能衍生出一系列的问题?这其实就是「发现问题」的能力体现。

只有当你意识到它是一个值得深挖的问题时,才会有一层一层的思考,一层一层的分析。

那应该如何提高这方面的能力呢?其实就是思考力的提升过程,除了观察和刻意练习,我想不出更好的建议。多看高手是怎么做的?遇到问题时自己多问几个为什么?多反思自己的思路是否正确?日积月累水平自然会提高。

当你具备了发现问题的能力,就相当于给知识和经验之间架起了一座桥梁,真正做到相辅相成以及互相驱动。

 3 

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

编程作为一门实践性的学科,多动手解决问题是最基本的要求了,解决问题越多、越难,能力提升越快。

而在这个过程中,如果有知识输入(底层知识的储备),还有思考的加成(发现问题的能力),编程水平的提升会更加迅速。

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

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

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

欢迎大家评论区留言,说说你的看法。

RECOMMEND

推荐阅读

8366df95959fcc0ea23f7f1b8dc6e4df.png

01

编程原则

来自代码大师Max Kanat-Alexander的建议

6295ef4d17959af6ae91734c9791583f.png

作者:[美]马克斯·卡纳特-亚历山大(Max Kanat-Alexander)

译者:李光毅

编程大师向你展示如何让简约设计的思想回归到计算机编程中

推荐语:在本书中,富有传奇色彩的编程大师马克斯·卡纳特-亚历山大(Max Kanat-Alexander)将会向你展示如何让简约设计的思想回归到计算机编程中。马克斯会解释程序员为何会感到力不从心,以及应该如何持续改善。世界上存在太多复杂的事物。复杂并不可取,因为它会给我们的工作带来隐患。

马克斯从他久负盛名的技术博客CodeSimplicity中精选了一部分文章,对如何在软件行业工作以及取得成功给出了自己的想法和建议。相信这43篇文章能够让你学会如何在工作中避免复杂,拥抱简约,从而让你的职业生涯更加顺利和成功。

633a8ede79840e7c09323ae40c9acff3.png

02

计算机系统解密

从理解计算机到编写高效代码    

5071e0fd6b1068507236a8ca213405bf.png

作者:[美]乔纳森·E.斯坦哈特(Jonathan E. Steinhart )

译者:张开元、张淼

计算机程序硬件软件从底层实现到高层展现原理讲解

对底层知识的多个主题进行了公平的覆盖

推荐语:计算机编程不是抽象的,程序是在机器上运行的。了解计算机如何工作以及程序如何在计算机上运行是成为一名更好的程序员的必要条件。在本书中,资深工程师Jonathan E. Steinhart深入探讨了计算机背后的基础概念,比如计算机硬件,软件在硬件上的行为,如何编写高效的程序,计算机安全基础知识,以及在编写代码时需要考虑的现实问题。本书对底层知识的多个主题进行了公平的覆盖——介绍有助于提高整个系统质量的许多领域的知识(包括计算机硬件、组合逻辑、时序逻辑、计算机体系结构、计算机组成原理、操作系统、系统程序设计等)。

03f9bd87f2798046d024c7502c343075.png

03

 深入理解计算机系统(原书第3版)

c0d4f372382b5078ba0dcc7d0100ae83.png

作者:[美] 兰德尔 E.布莱恩特(Randal E. Bryant)

大卫 R. 奥哈拉伦(David R. O'Hallaron)

译者:龚奕利 贺莲

将所有计算机系统相关知识融会贯通,助你成为凤毛麟角的高级程序员的必备神书。如果你研究和领会了这本书里的概念,你将开始成为极少数的“牛人”!

 推荐语:本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。卡内基-梅隆大学、北京大学、上海交大等国内外众多知名高校选用指定教材。本书的最大优点是为程序员描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为,以及造成效率低下的原因。从程序员的角度来学习计算机系统是如何工作的会非常有趣。最理想的学习方法是在真正的系统上解决具体的问题,或是编写和运行程序。这个主题观念贯穿本书始终。

66e11498ca123c8730767c812716f40c.gif

b21f6ca5ae1a83bae9a539901d59cfd3.png

扫码关注【华章计算机】视频号

每天来听华章哥讲书

884662ee4a432dc8d3ce41148cfb83eb.gif

更多精彩回顾

书讯 | 12月书讯(上) | 冬夜寒冷,读书暖心,华章科技上新啦!

书讯 | 12月书讯(下) | 冬夜寒冷,读书暖心,华章科技上新啦!

资讯 | 科普两个著名人工智能思想实验:图灵测试和中文房间

书单 | 为什么 Rust 是编程的未来?

干货 | 详解数据治理相关的7个术语和名词

收藏 | 解决卡脖子问题:盘点中国工业软件产业细分领域市场格局

上新 | 【新书速递】金融商业数据分析入门、实战、进阶,一本书全掌握

赠书 | 【第85期】业务架构将引我们走向何方

0fa46345ccde9da9d880dbf2b47edd43.gif

c719df19c844784e3879642ec71c1c4a.gif

点击阅读全文购买

相关文章:

  • 【新书速递】国内首本!系统全面介绍DevSecOps落地实践
  • 【新书速递】高效使用Greenplum
  • 2022年六大值得关注的边缘计算趋势
  • 机器人的「三体问题」
  • 原来报表与统计图要这么做!
  • Excel摸鱼技巧:快速实现分列转到行
  • Hi~您的圣诞礼物已到达,请查收
  • 【第86期】CPU 空闲时在干嘛?
  • 机器学习的挑战:黑盒模型正面临这3个问题
  • 数据治理项目失败,90%都是被这样搞垮的!
  • 6本书,读懂2022年最火的边缘计算
  • 详解数据分析体系构成框架
  • 【新书速递】金融领域可解释机器学习模型与实践
  • 说大话还是真实力,Rust 是被炒“火”的吗?
  • 用Python写了一个图像文字识别OCR工具
  • 【React系列】如何构建React应用程序
  • JS题目及答案整理
  • RxJS: 简单入门
  • spring boot下thymeleaf全局静态变量配置
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 详解NodeJs流之一
  • 消息队列系列二(IOT中消息队列的应用)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 智能合约开发环境搭建及Hello World合约
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • zabbix3.2监控linux磁盘IO
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 飞书APP集成平台-数字化落地
  • #AngularJS#$sce.trustAsResourceUrl
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (安卓)跳转应用市场APP详情页的方式
  • (补)B+树一些思想
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (六)Hibernate的二级缓存
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)Java对象在Hibernate持久化层的状态
  • (原)Matlab的svmtrain和svmclassify
  • (转)EXC_BREAKPOINT僵尸错误
  • *上位机的定义
  • .chm格式文件如何阅读
  • .md即markdown文件的基本常用编写语法
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net连接oracle数据库
  • .Net小白的大学四年,内含面经
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .net中的Queue和Stack
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /3GB和/USERVA开关