- 浏览: 19064 次
- 来自: 北京
最新评论
最近我的圈子里人们都在讨论“如何成为更优秀的程序员”。 看了他们的讨论,我决定分享一下我关于“如何成为更优秀的程序员”的经验。我希望向别人介绍我认为有用的经验,以便他们应用到自己的生活中。
我“变得更优秀”的办法是建立在训练的基础上的。我每周都要做一系列的“练习”。我设计的训练有两个明确的目标:
学习如何解决我以前不知道怎样解决的问题;
学习如何更快地编写正确的程序。
我的训练方法总共由四个不同的练习组成,每个都能帮我实现上面的两个目标。这四个练习分别是:
读一篇论文;
学习一个新工具;
读一本书的几个章节;
在写程序时录制屏幕,然后审查写程序的过程,找出如何才能写得更快。
我会具体解释下每个练习。我还会分享一些我如何进行这些练习,以及我从这些练习中得到的好处。
读一篇论文
这个练习的目的是为了扩展我在计算机科学方面的知识。我发现阅读论文有两个直接的好处,第一就是一些论文改变了我对特定问题的看法,比如《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。
我强烈推荐记录你的屏幕——这是找出提高工作效率的小改进中,最容易的一个办法了。
我去年一整年都在进行这种训练,从我自身来说真的发生了很大的变化。我学到了许多本来不可能学到的关于系统和工具的知识,我还能比以前更快地解决问题。我希望你喜欢这些练习,并将其中一些应用到自己的工作中。
以后我将分享我在训练过程中的发现。首先,我要在每次做某个练习时写一篇博文,记录下我在练习中得到的经验和教训。我觉得记录下我的经验教训应该对我很有好处,也能成为其他人的很好的学习资源。
我“变得更优秀”的办法是建立在训练的基础上的。我每周都要做一系列的“练习”。我设计的训练有两个明确的目标:
学习如何解决我以前不知道怎样解决的问题;
学习如何更快地编写正确的程序。
我的训练方法总共由四个不同的练习组成,每个都能帮我实现上面的两个目标。这四个练习分别是:
读一篇论文;
学习一个新工具;
读一本书的几个章节;
在写程序时录制屏幕,然后审查写程序的过程,找出如何才能写得更快。
我会具体解释下每个练习。我还会分享一些我如何进行这些练习,以及我从这些练习中得到的好处。
读一篇论文
这个练习的目的是为了扩展我在计算机科学方面的知识。我发现阅读论文有两个直接的好处,第一就是一些论文改变了我对特定问题的看法,比如《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。
我强烈推荐记录你的屏幕——这是找出提高工作效率的小改进中,最容易的一个办法了。
我去年一整年都在进行这种训练,从我自身来说真的发生了很大的变化。我学到了许多本来不可能学到的关于系统和工具的知识,我还能比以前更快地解决问题。我希望你喜欢这些练习,并将其中一些应用到自己的工作中。
以后我将分享我在训练过程中的发现。首先,我要在每次做某个练习时写一篇博文,记录下我在练习中得到的经验和教训。我觉得记录下我的经验教训应该对我很有好处,也能成为其他人的很好的学习资源。
发表评论
-
微服务架构框架?这里为你汇总了15种
2020-06-29 14:51 540这几年来,微服务这个 ... -
2020年云计算的发展与应用现状
2020-06-09 15:05 391随着云技术的采用又出 ... -
7种会导致业务失败的数据分析方法
2020-05-29 16:27 502真正的数据价值取决于 ... -
你根本不需要去追求“完美”的软件!
2020-04-10 16:14 393每一个软件都不是完美 ... -
如何做一名出色的初级开发?
2020-04-07 11:03 452希望本文能够为初级开发人员提供一些建议,帮助他们成长为合格的开 ... -
黑客攻击,五个步骤保障公共云安全
2020-03-26 15:31 473对于任何组织来说,其 ... -
盘点全球十大搜索引擎:中国百度只能排第三!
2020-03-18 10:59 725在当今互联网高速发展 ... -
股价爆跌、员工确诊,美国科技公司的新冠肺炎挑战来了
2020-03-04 15:01 396就在上周,全球股市迎 ... -
科技行业的起步时代已结束
2020-03-03 14:00 382在理解科技行业的主导 ... -
Android 11 首个开发者预览版新功能抢先看
2020-02-26 21:31 3675G支持引领了Google移动 ... -
又一起删库跑路事件!宕机36小时、损失近10亿。。。
2020-02-25 21:03 465在家中坐,删库天上来。 靠给微信公众账号提供营销推广服务发家 ... -
2020 开春程序员面试必备!拿走不谢!
2020-01-21 16:15 436软件技能在科技界很重要,如果你不会正确使用编程语言或平台,你可 ... -
程序员构建总是出问题,怎么办?
2020-01-15 14:36 289构建这一问题,到底是哪个环节出了 Bug? 我总是听 ... -
为什么越来越多的企业选择云数据库?
2020-01-13 10:23 307提到程序员,就逃不过 ... -
5G来了,Wi-Fi会消失?
2020-01-10 09:43 276当移动网络越来越快, ... -
2019年互联网那些事儿
2020-01-09 14:06 1582019年互联网大事件盘点,你还有印象吗? ▍ 1. ... -
如何在技术浪潮中屹立不倒?
2019-12-24 11:20 425关于程序员,一直以 ...
相关推荐
3. **过度依赖生产指标**:有些管理层通过代码行数或修复的bug数量来衡量程序员的生产力。这种量化指标可能导致程序员为了追求数字而忽视代码质量,导致代码变得冗余和过度设计。 4. **爱慕虚荣的开发者**:部分...
在团队合作中,程序员不仅要处理与同事的技术交流,还要面对项目管理、沟通协调等复杂的人际关系。如何在技术领域保持专业,同时又能处理好与他人的关系,是程序员生涯中不可或缺的一环。这就像菜肴中的盐,虽然看似...
综上所述,成为一名优秀的程序员不仅仅意味着掌握技术技能,还需要具备良好的职业素养和个人品质。以上10条修炼秘籍涵盖了从技术细节到职场态度的多个方面,旨在帮助程序员全面提升自我,成为一个更为出色的开发者。
3. **技术创新与学习能力**:优秀的程序员应具备持续学习新技术的能力,能够引入创新的解决方案。考核这部分时,会看他们在工作中是否有使用新工具、框架或编程语言,以及解决复杂问题的能力。 4. **团队协作**:...
《程序员级高级程序员级程序设计》是一门深入探讨高级编程技术的课程,旨在提升程序员的技能水平,使之能够更高效、更智能地进行软件开发。本课程覆盖了多个关键的知识点,包括但不限于算法优化、数据结构、并发编程...
掌握Java的核心概念和技术,如多线程编程、异常处理、集合框架等,对于成为一名高级程序员来说是必不可少的。 #### 7. 测试与调试 编写高质量的代码不仅需要优秀的编码技巧,还需要良好的测试和调试能力。这包括...
《程序员老黄历》是一款专为程序员设计的日历应用,它结合了传统的黄历元素与现代编程行业的特色,旨在帮助开发者规划工作、规避技术难题,提高工作效率。这个压缩包文件包含的是某一天(2017年6月22日)的程序员老...
对于有一定经验的开发者,它可能深入讲解了内存管理、异常处理、多线程编程、COM组件等复杂主题,这些都是VC程序员必须掌握的关键技术。 在学习VC编程时,以下几个知识点尤为重要: 1. **C++基础**:理解C++的基础...
Java程序员在求职过程中,一份优秀的简历是至关重要的。简历不仅体现了候选人的专业技能,还展示了他们的个人特质和项目经验。以下是一些关于如何构建一份出色的Java程序员求职简历的知识点: 一、个人信息 简历的...
J2EE程序员在当前的软件开发环境中扮演着重要的角色,他们需要掌握一系列广泛的技术和框架,以便能够构建高效、可扩展的企业级应用。以下是一些关键领域的详细说明: 1. **Web开发框架**:Web开发框架如JSF、Struts...
4. 程序错误(bug):在程序员的世界里,bug是常见的问题,需要花费大量时间来查找和修复。 5. 工资与现实:程序员的薪资问题常常成为幽默的话题,这里暗示了程序员希望薪水能像传说中那样增长,但实际上可能并非...
Bug是程序员和测试工程师日常工作中常见的问题,它指的是软件或应用中存在的错误、缺陷或异常行为。在淘宝这样的大型电子商务平台上,任何小的bug都可能影响到用户的购物体验,甚至可能导致交易错误或数据丢失。下面...
《卓有成效的程序员》是一本专为程序员和软件开发者设计的迷你书籍,旨在帮助他们提升工作效率、优化工作流程,并最终成为一个卓有成效的技术专家。这本书涵盖了多个关键的知识点,对于那些希望在IT行业中脱颖而出的...
在BugFree中,用户可以创建、分配和跟踪bug的状态,它提供了用户友好的界面,让非技术人员也能方便地提交问题。系统通常包含以下主要功能: 1. **缺陷报告**:用户可以通过填写详细的问题描述、重现步骤、影响程度...
初级程序员是IT行业中入门级别的职位,对于初学者或者即将参加程序员资格考试的人来说,熟悉历年初级程序员试题及其答案是至关重要的。这份压缩包文件包含了历年来的考试题目和对应的解答,可以帮助考生更好地理解和...
18. 程序员分为不同阶段,从初学者到高手,逐步掌握bug处理技巧。 19. 不同编程语言的特性对应了程序员找对象的不同情况,如C++的多继承特性。 20. 程序员的幽默感体现在将技术术语应用于生活,如类风湿性关节炎与类...
图像处理是一个复杂且技术含量高的领域,它涉及到计算机视觉、图像分析、算法设计等多个方面。C++是一种广泛用于这类任务的编程语言,因其强大的性能和丰富的库支持而备受青睐。 在C++进行图像处理时,可能遇到的...
在IT行业中,"BugReport dump txt"通常是指一种用于调试和问题排查的技术,它涉及到C++编程语言中的异常处理和堆栈跟踪。当程序运行时出现错误或异常,程序员会生成一个dump文件,该文件包含了程序崩溃时的内存状态...
这个词通常被理解为信用,但它远远超出了信用的范畴,包含了同事、领导和团队对程序员能力、工作态度、技术特长和其他个人特质的广泛认同。张辉在其分享《程序员的credit》中深刻阐释了这一概念,并指出了如何在团队...