最近我的圈子里人们都在讨论“如何成为更优秀的程序员”。 看了他们的讨论,我决定分享一下我关于“如何成为更优秀的程序员”的经验。我希望向别人介绍我认为有用的经验,以便他们应用到自己的生活中。

我“变得更优秀”的办法是建立在训练的基础上的。我每周都要做一系列的“练习”。我设计的训练有两个明确的目标:

  • 学习如何解决我以前不知道怎样解决的问题;

  • 学习如何更快地编写正确的程序。

我的训练方法总共由四个不同的练习组成,每个都能帮我实现上面的两个目标。这四个练习分别是:

  • 读一篇论文;

  • 学习一个新工具;

  • 读一本书的几个章节;

  • 在写程序时录制屏幕,然后审查写程序的过程,找出如何才能写得更快。

我会具体解释下每个练习。我还会分享一些我如何进行这些练习,以及我从这些练习中得到的好处。

读一篇论文

这个练习的目的是为了扩展我在计算机科学方面的知识。我发现阅读论文有两个直接的好处,第一就是一些论文改变了我对特定问题的看法,比如《The Tail at Scal》(https://ai.google/research/pubs/pub40801)这篇论文介绍了长尾的违反直觉的延迟。

我从这篇论文里学到一个很有意思的事情,就是在多台机器上执行请求会影响延迟。作者研究的数据来自某个Google服务,该服务在处理请求时,会将请求的各个部分分发到多个不同的服务上。文章利用一些数据估算了将请求分布到100个不同的服务上时会发生什么。作者发现,如果测量从所有100台服务器上接收响应的时间,那么超过一半的时间是在等待最后五个响应!这是因为最慢的5%的请求要比所有其他请求慢得多。这篇论文还给出了几种降低长尾延迟的方法。我发现这些方法在我的工作中非常有用。

读论文的另一个好处就是它能为我提供知识,使我从整体上理解不同的系统。以Google的分布式数据库Spanner为例,Spanner使用了许多不同的技术,如Paxos、两阶段提交、MVCC和谓词锁等。通过阅读这些论文,我理解了这些技术的概念。这样我就可以从整体上理解Spanner,并理解与其他系统相比Spanner做出的权衡。

我发现,我阅读的大部分论文都来自于我读过的论文的引用,或者来自Morning Paper的推荐。《Designing Data Intensive Applications》(https://dataintensive.net/)这本书也引用了许多值得一读的论文。

学一个新工具

解决问题的最简单的方式之一就是使用一个已有的、专门用于解决该问题的工具。在这个练习中,我会选一个工具并学习之。通常我会在本地设置好工具,阅读几篇指南,再阅读一点手册。我过去学过的工具很广泛,从jq、sed等bash工具,到Kafka或Zookeeper等分布式系统。

学习bash工具能帮我更快地解决许多常见的任务。简单的文本处理使用sed通常比使用编程语言更容易。类似地,学习不同的分布式系统能帮我理解解决不同问题所需的不同工具。

这样当我面对某个问题时,我能知道该用什么工具来解决。

阅读一本书的几个章节

我用书籍来补充我无法从论文或工具中得到的知识。我阅读的书籍覆盖的话题非常广泛。我最近读的书包括:

  • 《重构》(Refactoring),我发现通过这本书能很好地理解好代码应该是什么样子,以及怎样将坏代码变成好代码。

  • 《尽管去做》(Getting Things Done),这本书对优先级排序和任务跟踪很有帮助。它帮我建立了一套规则,保证我能把重要的事情先做完。

  • 《新手经理人圣经》(The First Time Manager),我最近在工作上成了团队的协调人,主要责任是在有需要时与其他团队沟通,也负责组织我们团队的会议。这本书是理解基本的管理概念的很不错的入门读物。


录制屏幕

这个是我最喜欢的练习,它对我解决问题的改变最大。这个练习就像运动员审核自己的录像,以便找出改进的方式一样。我打算在编程上使用同样的办法。关于录制屏幕的练习,我有以下经验:

  • 它能帮我在编写代码时进行测试。这样做可以减少定位bug的时间,从而减少调试代码的时间。如果所有的代码都没有bug,那么bug必然出在新写的代码中。

  • 在调试一个问题时, 增加一个调试专用的功能通常很值得。举例来说,我之前解决过的一个玩具性质的问题是写一个LRU缓存,有个bug是无法把正确的元素替换出去。我加了一个函数用来输出缓存的状态,这样就能迅速确定出错的原因了。我能够看到缓存的实际行为和正确行为之间的差异,这样就能迅速地确定bug的位置。

  • 在写任何代码之前,花五分钟确定一个方案是物有所值的。这样做有两个好处,它能让我确定我选择的方案是正确的,更重要的是,它能强迫我选择唯一的一个方案。通过观察自己的视频记录,我发现我在两种不同方案的来回切换上浪费了很多时间。实际上任何一种方案都可以工作得很好。

现在回想起来,这些经验教训都很明显,但如果没有屏幕的记录,并观察我在哪里浪费了时间,我完全不能意识到这些问题。

这个练习的步骤是:

  • 记录我自己解决某个问题的过程。可以是我在工作上遇到的问题,或者是在某个编程挑战网站上(如Leetcode)遇到的问题。

  • 以10倍速度重放视频记录,找出每段时间我在做什么。

  • 计算我在每一类事情上花费的时间。我在调试bug上花了多少时间?在构建某个功能时花费了多少时间?

  • 查看我花费时间最多的分类,然后继续挖掘究竟是什么花费了时间。

  • 想办法找出节省时间的办法。通常都能找到办法,提前组织代码的结构,这样就能写更少的代码,或者更容易找到bug。

我强烈推荐记录你的屏幕——这是找出提高工作效率的小改进中,最容易的一个办法了。

我去年一整年都在进行这种训练,从我自身来说真的发生了很大的变化。我学到了许多本来不可能学到的关于系统和工具的知识,我还能比以前更快地解决问题。我希望你喜欢这些练习,并将其中一些应用到自己的工作中。

以后我将分享我在训练过程中的发现。首先,我要在每次做某个练习时写一篇博文,记录下我在练习中得到的经验和教训。我觉得记录下我的经验教训应该对我很有好处,也能成为其他人的很好的学习资源。

原文:http://malisper.me/my-approach-to-getting-dramatically-better-as-a-programmer/

作者:malisper,Heap的软件工程师,位于旧金山,他致力于多个TB级别的PostgreSQL数据库的性能优化。

译者:弯月,责编:郭芮

征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。

————— 推荐阅读 —————


优秀的程序员是如何处理技术 Bug 的?相关推荐

  1. 处理入参_看看优秀的程序员是如何处理NPE的

    点击上方 果汁简历 ,选择"置顶公众号" 优质文章,第一时间送达 西格玛的博客 https://urlify.cn/7j2uMz 在笔者几年的开发经验中,经常看到项目中存在到处空值 ...

  2. 用一句话证明你是优秀的程序员,程序员:曾几何时我也是满头秀发

    如何用一句话证明你是一名优秀的程序员? ㄟ(▔▽▔ㄟ) 曾几何时我也是满头秀发 (╯▔▽▔)╯ 网友评论: 我觉得优秀的程序员,不仅优秀在代码上,更重要在思维等方面. 我认为一个优秀程序员是谨慎的,在 ...

  3. 优秀游戏程序员学习资料推荐

    这两天给单位的技术做的一次学习材料推荐培训,直接ppt上拷过来的.          优秀游戏程序员学习资料推荐 主讲人:臧旭 前言 今天提到的纯粹是我个人心得和理解,可能片面,也可能以偏概全. 目的 ...

  4. 如何成为一个优秀的程序员

    本文给出了十五个评定软件开发人员的标准,可以帮助程序员朋友从一个好的程序员成为一个优秀的程序员,和大家共飨! 怎样评定一名软件开发人员?这是一个颇为奇怪的问题.现在已经有了很多的理论和形式来做这件事, ...

  5. 同样是程序员,优秀的程序员能够月入5万甚至50万!,一般的程序员却只能月入5千甚至更低?那么他们差别在哪里呢?

    从以下几点来谈谈差别: 1.思路 编程思路,是系统的计划和设想,是程序员写程序时的条理和线索.优秀的思路背后一定是不断的积累.在熟知编程基础的前提下,优秀的程序员会积累尽可能多的经验,这份经验让他们更 ...

  6. 成为优秀高级程序员的10个要点

     成为优秀高级程序员的10个要点 What 软件工程师的职业生涯要历经以下几个阶段:初级.中级,最后才是高级.这篇文章主要是讲如何通过10个步骤助你成为一名高级软件工程师. Why 得到更多的报酬 ...

  7. 如何成为优秀的程序员

    1.各种软件技术之间是怎样的关系? 我把软件技术分为三个层次:  问题域:计算机图形学.音视频编码.信息安全.模式识别.信息检索.自然语言分析.人工智能.科学计算等.  系统集成:C++和Java等面 ...

  8. 【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

    怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 ...

  9. 优秀的程序员VS糟糕的程序员

    优秀的程序员和一般的程序员差别在哪里?怎么才能成为优秀的程序员?我们选择了这个职业就要把他做好! 优秀的程序员: 1.逻辑能力很强,这也是解决问题的关键. 2.分析能力.可以很好的解决复杂问题. 3. ...

最新文章

  1. R语言命令行写linux,linux命令行下使用R语言绘图实例讲解
  2. linux中查看文件内容常用的命令
  3. 二进制与加减乘除的物理层实现
  4. 第2章 S交换机管理平面安全
  5. apache-2.4.12之虚拟主机配置问题与觖决办法
  6. [Android Pro] ant 编译android工程
  7. 磁盘空间管理工具FolderSizes
  8. Outlook2010怎么关联邮箱 Outlook邮箱关联的教程
  9. java失败javac成功_JAVA SE JDK-10安装、配置(解决java成功,javac失败问题)
  10. Silverlight:纠结的快捷键问题
  11. (转)限制字符长度及特殊符号不能输入
  12. win10系统下使用大漠插件后台截图卡住的解决方法
  13. 【RabbitMQ】基础四:路由模式(Routing)
  14. C语言中int、long等类型所占的字节数
  15. 利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
  16. JavaScript最详细攻略
  17. 一路PWM三阶RC滤波语音输出-噪声问题
  18. 程序员最喜欢说的20句话
  19. 树莓派4B入手体验及配置
  20. 易历知食c语言编程,易历知食_易历知食下载[2021官方最新版]易历知食安全下载_ 极速下载...

热门文章

  1. php.ini $ phphome,shell 脚本安装PHP扩展的简单方法
  2. 如何让地面不起灰_地面不平能铺地板吗?木地板不平怎么修复
  3. Flutter布局锦囊---绑定手机页
  4. 中国糖和甜味剂市场趋势报告、技术动态创新及市场预测
  5. 砸入近 30 亿美元后,马斯克拒绝加入 Twitter 董事会
  6. 元宵节,程序员用 Python 送你一盏 3D 花灯
  7. 简单的代码提交,还能玩出这么多花样?
  8. 工业物联网再起云涌,大咖共叙破圈之道
  9. 谷歌大脑组合模型霸榜 SuperGLUE
  10. Java 是如何优雅地实现接口数据校验的?