35年编程史沉淀下来的8条宝贵经
01
1. 时刻提醒自己:学习
学习某件事的第一步是承认你不知道。这听起来很正常,但经验丰富的程序员还记得要真正让自己承认这一点需要花多长时间。很多计算机科学专业的学生毕业的时候,都有一种很傲慢的态度,就是“我知道最好的”,但其实这只是一种虚张声势,他们不知道从哪里来的自信,就好像他们什么都知道,并且需要向每一位新同事强烈的证明这一点。换句话说:你所谓的“我知道我在做什么!”这种态度会妨碍你学习新的东西。
02
2. 不要试图证明自己是正确的
要想成为优秀的人,你必须学会吃一堑长一智。但是千万小心,经验也可能教会我们重复一些不良行为,甚至也教会我们养成一些不好的习惯。我们都遇到过有8年经验的程序员。对于他们来说,同样的经历,重复了8次。为了避免这种综合症,看看你做的每一种事情,然后问自己:“我怎样才能让它变得更好?”
新手(以及很多经验丰富的开发人员)会看着他们自己写的代码,欣赏它的奇妙。他们编写测试来证明他们写的代码是可以运行的,而不是试图让它运行失败。真正优秀的程序员会积极地寻找他们的错误在哪里,因为他们知道最终用户会发现这些遗漏的bug。
03
3. “代码可以运行了”这个目标不是终点,而是起点
是的,你的第一步总是想写出质量很高的代码,而且代码上面都写满了注释。但是一般的程序员在这一点上就退出,然后继续下一件事。
但是一旦“完成”就停止了这种思想就像是拍一张快照,然后期待它是一件艺术品一样。伟大的程序员都知道第一次迭代只是一次迭代。它运行起来了,恭喜你!但你的工作还有很多。现在,使它变的更好。
其实这个过程就是在定义“更好”的含义。让它变得更快能有什么价值吗?可重用更高有什么好处吗?更可靠吗?答案随着每个应用程序的不同而不同,但是过程都是一样的。
04
4. 写三次代码
好的程序员目标是写出可以运行的软件就可以了。伟大的程序员写出来的软件目标是运行得非常好。通过一次编写这种情况几乎不可能发生。最好的软件通常被写三次:
首先,编写软件以向你自己(或客户)证明解决方案是可行的。其他人可能没有意识到这只是一个概念验证,但你确实这么做了。
第二次可以让它正常地运行。
第三次你能够让它平稳的运行。
当你看到最优秀的开发人员的工作时,这种级别的工作可能并不明显。他们所做的一切看起来都很出色,但你没有看到的是,即使是开发界的大腕儿,也可能在向其他人展示他们的软件之前就已经抛弃了第一个和第二个版本。抛弃之前的代码并开始编写另一个版本是一种强大的方式,可以将“更好地”融入到您的个人工作流程中。
如果没有其他情况,通过“写三次代码”可以告诉你解决问题的方法有多少种。而且它可以防止你陷入停滞不前的状态。
05
5. 阅读大量的代码
你可能希望我能够引导这个建议,实际上,这也是提高编程技能的最常见和最有价值的建议。阅读他人代码的原因也很重要,只是不是很明显而已。
当阅读其他人的代码时,你会看到其他人是如何解决编程问题的。但不要把它当成是文学作品,而是把它当成一种教训和一种挑战。想要变得更好,问问自己:
那块代码我该怎么写呢?既然你已经看到了别人的解决方案,那你会有什么思路呢?
我学到了什么?我如何将这种技术应用到我过去编写的代码中?(“我从来没有想过可以使用递归下降处理那块的逻辑”)。
我如何改进这段代码?如果这是一个开源项目,你对自己的解决方案更有信心,那就去做吧!
以作者的风格编写代码。练习这个可以帮助你进入作者的思维,这可以提高你的同情心。
不要只是漫不经心地思考这些步骤。写下你自己的答案,无论是在个人日志、博客、审查代码的过程中,还是与其他开发人员交流的论坛中。就像向朋友解释问题可以帮助你解决问题一样,记录和分享你的分析可以帮助你理解为什么你会以一种特定的方式对别人的代码做出反应。这是我之前提到的自省的一部分,帮助你冷静地判断你自己的优点和缺点。
警告:在不需要成为一名优秀程序员的情况下,很容易阅读大量的代码,就像一个想要成为作家的人可以在不提高自己散文的情况下阅读伟大的文学作品一样。很多开发人员都在寻找开源或其他软件来“找到答案”,而且很可能是复制和粘贴代码来解决类似的问题。这样做实际上会让你成为一个更糟糕的程序员,因为你盲目地接受别人的智慧而不去审视它。(另外,它可能比夏季野餐还要麻烦,但因为你没有花时间去理解它,你永远不会意识到你就像是大自然的搬运工一样,只是在做体力劳动。)
06
6. 不要把编写代码仅仅看作是任务
从事个人编程项目有很多优势。首先,它为你提供了一种学习工具以及学习技术的方法,而这些工具和技术在你当前的工作中是用不到的,但是这将使你在下一份工作中更有市场。无论你是为开源项目做贡献,还是为当地社区组织做公益工作,你都能获得技术技能和自信。(此外,你的个人项目向潜在雇主证明,你是一个从不停止学习的人。)
编写代码的另一个好处是它强迫你自己去解决问题。你不能把这些难啃的问题留给别人,所以它会让你过早地寻求帮助。
专业提示:不要只选择那些你永远不会失败的个人项目。你需要失败!但是你可能不想在工作中失败,或者给你限定期限时你也不想失败。
07
7.尽一切可能做到与其他开发人员面对面的工作
倾听别人的意见是很有帮助的。这可能意味着结对编程,或者参加黑客马拉松,或者加入一个编程用户组(比如Vermont Coders Connection)。当你为一个开源项目做贡献时,要关注一下你从用户和其他开发者得到的反馈意见。你在他们的批评中看到了什么共同点?
这样做你可能会很幸运地认识了一位可以完全信任的导师,无路是编码技术还是职业决策,你都可以完全信任他。所以不要浪费这些机会。
08
8. 你是在学习技术,而不是在学如何使用工具
编程语言、工具和方法这些都只是一时的。这就是为什么需要你在这么多的语言和框架中尽可能多的获得经验。重点关注编程基础,因为基础永远不会改变;更关注体系结构而不是如何编程。如果你觉得做某件事只有一种正确的方式,那可能是时候进行现实核查了。条条框框的限制会妨碍你学习新事物的能力,也会使你很难适应变化。
我可以继续前进,但自我提升的关键原则是知道何时停止。
原文:https://mp.weixin.qq.com/s/VU551CnnjSRwi-IwUmqFjw
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
35年编程史沉淀下来的8条宝贵经相关推荐
- 如果人类起源是一部编程史
目前关于人类的起源有两种比较"流行"的猜想,一种是"进化论",另一种是"神创论".本文的猜想是后者的衍生,即"神"用编程 ...
- 今天在csdn看到一博主今年大三,初中就喜欢上编程,学习了各种知识,初中…挺震惊。不禁细数我的编程史,挺有感。
今天在csdn看到一博主今年大三,初中就喜欢上编程,学习了各种知识,初中-挺震惊.不禁细数我的编程史,挺有感. 要说我第一次接触编程,也是在初中,但这次接触我觉得并没有对我有所影响. 初中时期,记不清 ...
- 一行代码损失数亿美元!来看看编程史上的著名bug!
作为程序员最大的敌人,bug是很多程序员挥之不去的噩梦,一行小小的代码bug,就可能造成致命的问题,造成整个系统的崩盘.今天,菜鸟哥就为大家分享,编程史上的最著名的5个bug. 1.欧洲航天局阿丽亚娜 ...
- 35.JAVA编程思想——JAVA IO StreamTokenizer
35.JAVA编程思想--JAVA IO StreamTokenizer 尽管StreamTokenizer并不是从 InputStream或 OutputStream衍生的,但它只随同InputSt ...
- 零基础入门学习Python(35)面向对象编程
self是什么? Python的self相当于C++的this指针 由同一个类可以生成无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,Python就知道要操作哪个对 ...
- 一文搞定Linux shell脚本编程( 史上最全汇总 )
目录 Shell是一种脚本语言 第一个Shell脚本 Shell编程语法 Shell变量 字符串 Shell数组 位置参数 内建命令 echo read printf exit test 流程控制 i ...
- [译] 被遗忘的面向对象编程史(软件编写)(第十六部分)
原文地址:The Forgotten History of OOP 原文作者:Eric Elliott 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:ge ...
- Shell脚本编程史上最全手册
Shell脚本简介 shell命令按一定语法组成的文件. Shell脚本有什么用? 批处理文件 / 整合命令 软件启动 性能监控 日志分析 ... Shell命令的本质 内置命令 / 外部命令 She ...
- c语言函数视频编程,史上最高效编程学习方法,十分钟学会使用C语言函数
一.什么是函数 1.C程序的基本单元 C程序中,为了方便规划.编写.调试,需要把程序分模块来编写. 加法 乘法 减法 除法 2.用来实现程序的一些具体的功能 每一个模块实现单一功能. 3.函数注意: ...
最新文章
- 基于redis的悲观锁实现
- FileZilla 连接不上虚拟机 ubuntu
- 第十九天:实施定性风险分析
- shadow dom一个最简单的例子
- dazhilu飞鸽传书 2013 官方网站
- linux打开二进制文件后终端乱码处理
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。...
- java版如何使区块常加载,Java类加载机制 - suer27zhu的个人空间 - OSCHINA - 中文开源技术交流社区...
- Redis基本操作练习
- 怎么方便地不通过鼠标在应用之间复制/粘贴文本
- CenterNet :Objects as Points/CenterTrack:Tracking Objects as Points
- 三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方
- ejb2.0详细开发过程
- 视频直播系统源码,比较图片
- Centos7下WebLogic安装部署
- 2.17.3-Python爬虫(requests登录)
- oracle分区表和分区索引的概念
- cer证书的命令导入
- 韩天峰php教程,韩天峰 - Swoole4-全新的PHP编程模式
- Lucene打分公式详解(TFIDFSimilarity)