编程的乐趣

最近这几个月我担任部门的测试面试官,在面试过程当中遇到各种各样的候选人,期间也发生不少有趣的事,今天抽时间来跟大家来分享一下。
目前公司招聘的要求是无论是开发还是测试岗位,都需要通过上机编程考试。开发人员强制上机考试很容易理解,毕竟这是其本身技能的体现,可测试人员也要通过上机编程,我身边就有一些非开发同学表示不太能理解,他们因此产生了一些消极的思想来吐槽公司的这个规定。对于这个问题我一开始和这些同事的看法类似,但当我亲身学习了编程之后更加理解了公司规定的本意。从公司的角度来看要求测试人员具备一定的编程技能有几方面考虑:

一方面从专业技能的角度来讲,开发测试不分家,测试人员具备一定的编码功底可以更好在应用在工作中(如编写自动化脚本)
另一方面掌握编程技能只是表面,更深层次的具备一定的编程思维,可以更加深刻地理解开发人员的所思所想,从而更好地进行测试。

更远一点说“是否掌握编程技能”也是用来区分候选人的一种有效手段,它就像一道门槛,把那些拒绝学习的人挡在了门外。在这一点上对求职者的筛选和大学有类似之处:

王树义老师在博文《MOOC教学中什么最重要》中提出过一个观点:好大学和差大学之间,师资水平的区别远远不及学生总体求知欲望的区别。在好大学里,“我要学”的人占多数。那些没有目标,而是“要我学”的人在同侪压力下,就不得不跟着跑,于是也学得好。在差大学里,“要我学”的人占多数。那些有奋斗目标,坚持“我要学”的人在同侪压力下,根本飞不起来。时间长了,他们中的有些人也就懈怠了。

为了能够和候选人进行更好的交流,刚开始我也是硬着头皮去学习python,在学习的过程当中我越发喜欢上了这门语言,为它的简洁优美高效所深深的折伏。在学习编程的过程当中一方面可以起到立竿见影的效果,通过开发一系列的小工具为我的工作带来了很大的便利和帮助,切实提升了我的工作效率,同时编程也帮助我解决学习、生活当中的一些小问题。因此,从我本人的实践来看,从“要我学”变成了如今的“我要学”,这个巨大的转变也给我带来很多新的体验。

建议一:千万不要放弃学习

在面试过程当中,我向候选人提出这样一个问题(故意挖一个坑):
在常规的密码验证过程当中有两种表现形式,一种是给用户以明确友好的提示,比如说是用户输入的用户名不存在或者用户输入的密码错误请重试。另外一种就是比较含糊的用户名或者密码不正确,你如何看待这两种方案呢?

如果有过安全相关知识的测试人员会明确的说要选择第二种,然而在面试过程当中有不少的候选人会掉到了这个坑里面:

有的人就应该选择第一种方式,这样对用户更友好。

有的人说应该选择第二种,这样写起代码来更方便,不管哪一种出错都给出一个提示语,写代码简单……

其实这个问题对于在大公司呆过的同学来说是很简单的,在工作当中非常常见,也是我们所说的测试常识,当然即使身在小公司如果平常学习一些安全测试的相关知识也会提到这些内容,但是仍有不少的候选人在这里栽了跟头,可见基础知识和技能是不扎实的。

建议二:知其然更要知其所以然

tips:以下内容对于不了解Python的同学可快速浏览,不用深究
我问候选人元组和列表的区别是什么,有些候选人直接跟我说元组是一个小括号,列表是一个中括号。这样的回复严格意义上来说并没有错,但是对于一个程序员来说却显得太过于肤浅了。我进一步提问到除了长得不一样外还有哪些区别呢?

一个是可变的一个是不可变的,那既然提到可变,列表增加元素有哪些方法呢?不少候选人答append,少数候选人答insert,更少候选人答extend,我进一步追问append,extend都是追加,那它们是一样的还是不一样的呢?此时候选人便含含糊糊起来讲不清楚,只是大概说可能是不一样的,但具体解释他们的差异就讲不清楚了。
append extend有什么区别?
append 在列表末尾添加新的对象
extend 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

append将整个元素作为整体添加,extend 将列表中的每一个元素逐个添加
有些候选人会讲到两个列表相加也可以实现元素的追加,那么我就接着问:
同样是扩展列表的方法extend与+号有什么区别
extend方法不改变原有列表的引用地址(即内存地址没有发生变化),而+号则是新生成了一个列表并将新的内存地址赋给了原列表
不少候选人只是临时抱佛脚学习了Python的基础语法,了解了一些表面现象却没有去透彻理解到它的本质。在学习编程的过程当中,我们不光要看到它们最浅显的区别,更重要的是要想到它们之间的区别与联系,如果能够更进一步想到它们之间的使用场景,就更好不过了。上面提到的是元素的添加,与之相关的就是元素的删除,比如说我们经常要从列表当中删除元素,pop和remove都可以实现,那么什么情况下会使用pop,什么情况下会使用remove呢?你能具体说出它们的适用场景么,如果不光能说出它的基础用法更能举出实际场景那么才算真正地理解它的用法。

建议三:看书、看好书


网上很多编程的初级教程里面为了照顾到初学者能够快速上手会讲一些原生函数的使用如os.system,因为这些函数是预置的相对来说方便学员上手。但学员们不清楚的是其实这些函数是存在一些安全漏洞与风险的,如果从一开始的学习中就没有意识到这些可能会对后续进阶的编程埋下隐患。当然并非这些函数完全不能使用,只是说这经有严格的使用范围限制,如果需要执行的命令是固化的,那么相应地命令注入的风险就低一些仍然是可以使用的,但是我们更为推荐的是使用一些比较新的函数来取代这些旧的函数(如使用subprocess来代替)。因此在编程语言学习的过程中,我们要掌握一个基础的原则就是:学新不学旧,在这一点上和买日常电子产品是一样的道理。

客观地说我现在仍是一名python的初学者,在学习的过程中我看了二三十本左右的书籍(当然有些是走马观花式的阅读),通过B站也看了不少视频教程,在学习的过程中切身体会到了教程水平的良莠不齐,有些视频和教程简直就是滥竽充数、所谓的免费课程惟一的目的就是为了让你报他们的付费班,这种课程不看也罢,与之相对应的是确实有一些良心UP主提供了大量精品课程,我这里仅推荐几位欢迎大家根据自己的喜好选择:麦叔编程、武沛齐、码农高天、杨洋博士(全民一起玩python)

Comments
Write a Comment