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

我最近和一个初级程序员说话,他问我一个很好的问题。一个很好的问题,让我停下来思考我对学习发生的看法。问题是:
 

“我怎么知道我是否善于编程?”

我经常被问到“我如何善于编程”这个问题的另一面,或者“我能做些什么来擅长编程”。答案是您自己的项目实验的一些组合,做课程,阅读书籍,与好的程序员合作,为开源项目做出贡献。但是,如果想在以下方面的问题,“我怎么知道我是不是好?”这变得 更加的工程方法。您有一个指标,进行优化。 

除了实践之外,改善任务的最重要的事情是良好的反馈。当没有好老师的新领域开始时,很好的反馈是困难的。例如,课程可能会有您获得反馈的考试或项目。但是,一旦你完成课程,你如何获得更高层次的整体改进反馈 如果你有一个良好的反馈机制,那么下一步要做的事情的答案更容易。  

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

什么是好的代码?

所有代码都可以完成任务。良好代码的第一个标记是完成所需的任务。任务可能在复杂程度上有很大的变化,但是代码永远不会比完成任务更好。对此的反馈很简单,“  代码是否 达到预期的目标?代码只能 完成所需的任务,不应该有其他不良的副作用。在代码周围编写好的单元测试可以作为成功的指标。
 
如果您无法顺利完成任务,这里是您的第一个好的反馈信息 将显示您需要接下来学习的内容。认识你缺乏的知识,并找出最相关的资源。系统理论告诉我们,如果你不是在限制条件下进行优化,那么你正在浪费你的精力。这是约束,只学这个东西。 
 
 

代码可读吗?

一个写得好的代码是一个干净简洁的想法表达。程序员应该尽可能简单地了解你所写的内容。熟悉你的语言的成语和语法糖。可能有一种很好的方法,只需一次写入3行中所写的内容,同时仍然保持可读性。确保您的代码正确记录,解释为什么代码不在做什么。为了测试这个,如果你没有朋友可以看看你的代码,我会建议你的代码发布到https://codereview.stackexchange.com/  或其他类似的网站。自己今后6个月也是一个很好的替代陌生人。 
 
 

是否容易扩展或修改?

这是很多程序员最喜欢的投诉,“要求改变了”。这是现实,你不是用明确的功能和目标编程考试问题。在现实世界中的需求总是在不断变化,这是一个很好的 事情。如果一个任务花了3个月的时间才能完成,而且没有新的要求,有人没有做好工作。更多的时间应该引入新的信息和要求。
 
在接受采访时,我想请 候选人完成一个相当简单的编程任务,如编程电梯系统。一旦他们完成了,我请他们实施一个他们永远无法预见的疯狂功能。对人际关系和技术的回应告诉你,他们的技能很大。
 
一个好的程序员应该计划这个。如果您编写了一个程序来完成任务x,那么看到修改它以执行任务x和y,但是当条件k到q发生时不是很容易(除非k和m同时发生,然后执行y而不是x)。CS 101概念 - 像多态性和继承与构图之间的区别 - 当时似乎没有意义,现在可以感觉到有趣。
编写代码来 改变是一种让您感受 更多经验的东西,但是不要太早地添加更多的抽象层。过早的抽象导致企业FizzBu​​zz(https://github.com/EnterpriseQualityCoding/FizzBu​​zzEnterpriseEdition)。 
 
 

代码是否有效?

效率有几个不同的组成部分,速度完成以及诸如内存使用率,CPU使用率等各种资源组件。幸运的是,所有这些都易于跟踪,并且每种语言都有可以显示程序时间和资源的剖析器正在使用。熟悉这些工具,然后查看您可以削减这些指标。如果您正在重新设计存在的问题,例如编写自己的LRU缓存,您可以查找理论上的最佳性能并将其与您自己的性能进行比较。在这里,您可能希望从大O角度开始考虑您的代码,大致了解不同操作需要多长时间https://people.eecs.berkeley.edu/~rcs/research/interactive_latency.html
 
 

你可以快速写吗?

特别是在学习中,不要把重点放在你的速度上。能够在速度编码竞赛中竞争是令人印象深刻的,但是在编程方面,这是一个糟糕的学习方式。速度本身不是目标,更是衡量进度。如果您正在掌握域,那么您应该能够编写完成任务的代码,并且在较短的时间内可以高效,可读和易于扩展。
 
很容易衡量完成任务所需的时间,但是这个度量难以实现。而是分析花费在各种子任务上的时间。你是否需要加深理解的领域?也许你花费大量的时间来手工测试你的代码,这可以通过自动化来加速吗?您可以开始查看您正在使用的工具。您的IDE具有各种有用的热键,可以提高速度,并从机械任务中释放大脑,从而可以将重点放在更高层次的问题上。 
 
 

整理

如果你的代码实现了所有这些事情的高标准,那么你擅长编程的任务。如果不是有明确的领域要改进。然后,您可以在希望成为其他领域的其他领域寻求更复杂的任务或任务。
 
我想再添加一件事情来完成这篇文章。 鉴于当天的小时限制以及生产时间的限制,只有一个程序员才能做到这一点。Elon Musk作为一个富有成效的人,享有声誉,但如果他是PayPal的唯一工程师,他们就不会有这么远。在一定程度上,如果你想建立伟大的事情,你需要在一个团队中工作。在这一点上,编程成为社会活动。你想要能够编程不仅仅是你自己的手和大脑,而是在一定程度上通过整个团队合作。在这一点上,一个好的程序员不仅仅是你的代码是多么好,而是与你合作的人的代码有多好。
 
有很多方法可以获得有关这方面的反馈。在对同事进行代码审查后,他们会生成更好的代码吗?下一个问题是他们是否改进了您审查的具体代码或改进了其一般代码?以这种方式改善人们不仅仅是技术反馈的问题,而且也是动机。你可以让他们对这项任务感到兴奋,了解为什么不同的改进或方法很重要。你是否提高周围人的整体技能?着名的27x研究表明,最好的程序员是最差的27倍。那么如果你是一个6x的程序员,你帮助你的团队中的其他4个人从1到6倍,那么你的效率远远超过27倍。
 
对于我来说,这些是一个好的程序员的基本技能,如果你甚至在一些小的方式实现任何一个,你可以睡得很好,知道你是一个好的程序员。
 
原文:http://www.danielslater.net/2017/07/how-do-i-know-if-im-good-at-programming.html
posted @ 2017-07-24 23:48  编程码农大叔  阅读(423)  评论(0编辑  收藏  举报