CategoryResourceRepost/极客时间专栏/设计模式之美/不定期加餐/加餐六 | 什么才是所谓的编程能力?如何考察一个人的编程能力?.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

46 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="加餐六 | 什么才是所谓的编程能力?如何考察一个人的编程能力?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1f/1d/1fbdd7f0b0a0f92ce374fe5bf145361d.mp3"></audio>
在招聘要求里,我们经常看到“要求候选人有扎实的编程能力”。在面试反馈中,我们也经常看到面试官用“编程能力很强”来评价候选人。那到底什么是编程能力呢?如何考察一个人的编程能力呢?又如何提高编程能力呢?今天,我们就编程能力这个话题展开聊一聊。
话不多说,让我们正式开始今天的内容吧!
## 什么是编程能力?
所谓编程能力指的是把“逻辑”或者说“功能”“业务”翻译成代码的能力。所谓编程能力强指的是不仅能编写正确的代码而且编写代码的速度很快写出来的代码bug很少、性能很好、质量很高。
更加具体点讲一个编程能力强的人能熟练使用编程语言、开发类库等工具思路清晰面对复杂的逻辑能够编写出bug free的代码能够合理地利用数据结构和算法编写高效的代码能够灵活地使用设计思想、原则和模式编写易读、易扩展、易维护、可复用的高质量代码。
相反一个编程能力差的人往往逻辑思维能力比较差面对复杂的逻辑编写代码的速度很慢而且容易考虑不周写出来的代码bug很多更没有性能意识不懂得如何分析代码的时间复杂度、空间复杂度更不懂得如何借助现成的数据结构和算法来优化代码性能。除此之外写代码的时候几乎不考虑代码的可读性、可扩展性等质量问题只追求能运行就可以。
## 如何考察编程能力?
前面我给出了编程能力的简单的定义,从定义中,我们能很清楚地了解,考察一个人的编程能力的几个要素。总结一下,我觉得主要包含这样三个方面:编程语言,数据结构和算法,设计思想、原则和模式。
考察编程能力,那就离不开写代码。所以,在面试中,我一般都会出道编程题,让候选人写段代码看看,也就是所谓的“白板编程”。白板编程在外企面试中比较流行,国内有些候选人不怎么能接受,特别是工作年限比较长的候选人,一听说要写个代码,就觉得这是在“羞辱”他,觉得不应该从这么基础的东西考起。
不过从我多年的面试经验来看这种拒绝写代码的“大龄码农”满嘴“架构、高可用、高并发、分布式”往往代码写得惨不忍睹。所以只要是应聘一线技术研发岗的候选人不管是资深工程师、架构师还是技术Leader我都会要求他现场写一段代码。因为这是最直接、最有效检验这个人基本技术素养的途径。
一般来讲编程语言都可以快速掌握所以我一般都不会把它拎出来单独考察只是顺带着考察一下就可以了。我会重点考察后两个方面数据结构和算法设计思想、原则和模式。但是要想设计一个题目既能考察到这两方面的知识又能在不到1个小时的面试时间内完成还是挺难的。所以对于这两个方面我一般都分开来考察。我今天重点讲对数据结构和算法的考察对于设计思想原则和模式的考察我后面有文章专门来讲。
对于数据结构和算法的考察,我个人不建议面试题目涉及需要记忆的算法,比如被很多人诟病的面试题:写个快排。没有人会天天背诵快排算法,候选人写不出来也理所应当。如果我们换个问法,比如给候选人讲一下快排的思想,然后让候选人用代码实现,测试候选人的代码翻译能力,我觉得这反倒是一个比较好的面试题。除此之外,我也不建议面试题目涉及特殊解题方法或技巧,比如需要用到线段树、并查集等高级数据结构。毕竟大家在工作中不常用到这些知识,不知道或者忘记了我觉得也很正常。
所以那种不依赖很强的算法背景和特殊的解题技巧的题目比较适合用来面试。比如像下面这样的面试题就比较好“写一个函数将IPv4地址字符串仅包含数字、点、空格转化成32位整数。另外数字和点之间的空格是合法的其他情况均为非法地址要求输出合法地址的32位整型结果。”
我觉得这种题目是比较公平的对于没有刷过题的人来说也很友好因为它纯粹是在考察候选人的基本编程素质逻辑思维是否清晰细节是否考虑全面是否能写出bug free的代码是否有计算机思维会关注时间空间复杂度等。
## 如何提高编程能力?
刚刚我们讲了什么是编程能力,如何考察编程能力,现在,我们讲下如何提高编程能力。实际上,我的两个专栏《数据结构与算法之美》《设计模式之美》,就是为了提高你的编程能力而设计的。《数据结构与算法之美》专栏教你如何写出高性能代码,《设计模式之美》专栏教你如何编写易读、易扩展、易维护的高质量代码。
方向很明确,但是要真的提高编程能力,光学不练肯定是不行的。
对于数据结构和算法的练习我们推荐你多刷LeetCode上的题目。刷题不仅仅能加强你对数据结构和算法的掌握还能锻炼你的逻辑思维能力、写出bug free代码的能力、快速实现复杂逻辑的能力也能锻炼你的性能意识。所以刷题不只是为了面试刷题对这些能力的锻炼都有助于你在平时的业务开发中写出好的代码。
对于设计思想原则和模式的练习它就不像算法练习那样有现成的题库了。所以要在平时的开发中进行练习。比如拿到一个功能需求的时候我们先去思考一下如何设计而不是上来就写代码。写代码时我们时刻思考代码是否遵循了经典的设计思想、设计原则比如是否足够可扩展、是否满足SOLID原则、可读性如何等等。写完代码之后我们再思考一下代码是否有进一步优化的空间。做Code Review的时候看到别人的优秀的代码我们就去思考一下有哪些值得借鉴的地方。总之在平时的开发中我们要刻意地去做这种跟代码质量、代码设计相关的思考训练。时间长了这种思考就能成为习惯、本能反应慢慢地你的代码能力也就不自觉地提高了。这一部分内容你可以回过头去再看下第100篇我们前面有非常详细的讲解。
## 课堂讨论
实际上不管从事什么行业要积累的东西都可以分为“变”与“不变”两类。“不变”的是内功“变”的是招式。我们要善于发现、持续积累那种“不变”的能力而不是要去盲目追逐一直都在“变”的招式。除了编程能力之外在IT技术领域你觉得还有哪些不变的内功
欢迎留言和我分享你的想法。如果有收获,也欢迎你把这篇文章分享给你的朋友。