设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

我如何知道自己是否善于编程?

2017-8-6 20:34| 发布者: joejoe0332| 查看: 271| 评论: 0|原作者: 铸造中, leoxu, txmnyzz, Tocy, 无若, 我是菜鸟我骄傲|来自: oschina

摘要: 我经常被问到“我如何能成为编程好手”这个问题,或者是“我能做些什么来成为编程好手”。 这样的问题的答案就是在自己的项目中不断实践,做功课,读书,和好的程序员合作,为开源项目做出贡献,综合下来得到的。 但 ...
最近我和一个初级程序员交流,他问了我一个很好的问题。这个好问题让我停下来思考自己对于学习的看法。他提的问题是:

“我怎么知道自己成了编程好手呢?”

我经常被问到“我如何能成为编程好手”这个问题,或者是“我能做些什么来成为编程好手”。 这样的问题的答案就是在自己的项目中不断实践,做功课,读书,和好的程序员合作,为开源项目做出贡献,综合下来得到的。 但是,如果你思考的问题是“我怎么知道自己已经可以了”,这种问题更需要某种系统性的方法来解答。要订立指标,然后跟进优化。

除了实践之外,改善任意任务最重要的事情是良好的反馈。当来到一个新的领域,在那里没有好的老师指导时,收到良好的反馈是很难的。例如,某课程可能会有你可以从中获得反馈的考试或项目。 但是,一旦你完成该课程,你如何获得针对你整体改进的更高层次的反馈呢? 如果你有一个良好的反馈机制,那么回答下一步要做的事情的将更容易。

那么我怎么知道我是否善于编程呢? 首先要问的是“什么是好的代码?”。 如果一个程序员不能产生好的代码,他们不是一个好的程序员。

什么才是好代码?

代码的存在是为了完成任务。好代码的第一个标记就是能完成所需的任务。任务在复杂程度上可能变化很大,但是就代码而言永远不会比可以完成任务的要更好。 要对此做出什么评价是很简单的,“代码是否达成预期的目标了呢?“代码只能是完成它需要完成的任务,而不应该有其他的不良的副作用。 围绕代码编写一些好的单元测试可以作为成功达成此项目标的指标。

如果你无法顺利地完成任务,这也是一个好的信号,表示你在接下来需要学习什么内容来补齐短板。识别出了你所缺乏的知识,然后寻找与其最相关的资源就行了。 系统理论告诉我们,如果你不是在限制条件下进行的优化,那么就是正浪费你的精力。明确了这一约束条件,就只学这个框框里面的东西。

代码可读吗?

一个写得好的代码是一系列干净简洁的想法的表达,让其他程序员能很快了解你所写的内容。熟悉你所使用的语言的惯用法和语法技巧,或许你就能发现将 3 行代码用 1 行表达的技巧,并且它依然具有可读性。确保你的代码被正确文档化,解释为什么代码不执行某项操作。如果没有朋友可以帮你看代码,我建议你将代码发布到 https://codereview.stackexchange.com/ 或其他类似的网站,让其他人帮你审查。 6 个月后,可能你也会成为某段代码的审查者。

是否容易扩展或者修改?

这是很多程序员最喜欢抱怨的地方,“需求改啦”。但这是现实,毕竟你不是在回答有明确功能和目标的编程考试问题。在现实世界中,需求总是处在变化之中,这是一件好事。 如果一个任务花了3个月的时间才能完成,而且没有新的需求,那就是有人没有做好工作。应该有更多的时间来引入新的信息和需求。

在一次采访中,我想请候选人完成一个相当简单的编程任务,比如编写电梯系统。等他们完成了,我就请他们继续去实现一个他们永远也无法预见到的疯狂功能。 他们对此的反应,可以从人际关系和技术两个侧面告诉你很多信息,以了解他们真实技能到底如何。

一个好的程序员对此应该有个计划。 如果你编写了一个程序来完成任务 x,就可以对其进行修改以实现执行任务 x 和 y,而当条件 k 通过 q 发生时就不执行(除非 k 和 m 同时发生,就执行 y 而不是 x),然后看看这件事情的容易程度如何。CS 101 概念 - 像多态性还有继承与组合之间的区别 - 虽然当时觉得似乎没有意义,现在来看就有趣多了。

编写代码然后进行修改是一件能让你拥有更多经验的事情,不过不要太早地为此添加很多的抽象层。 过早的抽象会导致企业性的 FizzBuzz(https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition)。

代码是否高效?

效率有几个不同的组成部分,包括执行速度以及诸如内存使用率、CPU 使用率等等各种资源组件。幸运的是,所有这些部分都易于跟踪,而且每种语言都有可以显示程序执行时间和资源使用情况的的剖析器。你要熟悉这些工具,然后借助它们来看看如何去对这些指标值做削减优化。 如果你正在就存在的问题进行重新设计,例如自己去编写 LRU 缓存,可以去查一下理论上的最佳性能并拿来跟你自己的实现做比较。 在这里,你可能希望站在时间复杂度的立场来着手优化代码,这时候就要大致了解不同操作所需要的时间了 https://people.eecs.berkeley.edu/~rcs/research/interactive_latency.html

你可以快速地把代码写出来吗?

尤其是在早期的学习阶段,不要那么专注于速度。编程竞速比赛虽然令人印象深刻,但是在编程领域,这其实是一种糟糕的学习方式。速度不应该是目标,我们应该更多衡量的是进步才对。如果你正在掌握一个领域,那么就应该能够编写出完成该领域任务的代码,而代码要高效,可读且易于在短时间内进行扩展。

要测量完成任务所需的时间很容易,但是根据该度量很难看出些什么来。相比于此,尝试去分析花费在各种子任务上的时间更加有意义。这些是你需要加深理解的领域吗?也许你花费了大量的时间来手工测试代码,这样的事情可以通过自动化来加速吗?你可以开始审视一下自己正在使用的工具。你的IDE具备各种有用的快捷键,它们可以帮助你提高速度,并且从机械任务中将你的大脑释放出来,从而将思考的重点放在更高层次的问题上。

最后

如果你的代码可以高标准的实现所有这些事情,那就证明你是擅长编程这项业务的。如果不是就得明确需要做出改进的领域。 然后,你就可以寻求本领域更复杂的任务或者挑战一下其它的领域了。

我想再说一件事情来完成本文。鉴于当天的小时限制以及生产时间的限制,一个程序员只能做到一点点事情。Elon Musk 作为一个富有成效的人而享有声誉,但如果他是 PayPal 的唯一工程师,那么他们的事业就不会走这么远。 在一定程度上,如果你想成就一件伟大的事情,就需要在一个团队中工作。在这一点上,编程就成了社会性的活动。 成为一名编程好手不光需要你自己的双手和头脑,还要在一定程度上倚赖同整个团队的精诚合作。 在这一点上,一个好的程序员其表现不仅仅是要看他自己代码写得有多好,还要看与他合作的人他的代码写得有多好。

有很多方法可以获得有关这方面的反馈。 在对同事进行代码审查后,他们会编写更好的代码吗?下一个问题是他们是否改进了您审查的具体代码或改进了其一般的代码?以这种方式改善,不仅仅是技术反馈的问题,也是动机。你可以调动他们对这项任务的积极性,了解为什么不同的改进或方法很重要。你是否能提高周围人的整体技能?著名的 27 倍研究表明,最好的程序员工作效率是最差程序员的 27 倍。那么,如果你是一个 7 倍程序员,并且你帮助你的团队中的其他 4 个人从 1 倍到 7 倍,那么你的效率将远远超过 27 倍。

对于我来说,这些是一个好的程序员的基本技能,如果你实现任意一个小的方面,你就可以安稳入睡,因为你知道你是一个好的程序员。


酷毙

雷人

鲜花

鸡蛋

漂亮

最新评论

(200字以内)
验证问答 换一个 验证码 换一个

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187  

返回顶部