王辉的博客

是什么让我对未知世界始终充满热情?

0%

两顶帽子,说的是开发软件的时候,对重构和添加新功能这两种不同活动的区分。戴上不同的帽子就意味着要专心致志的做帽子所代表的事情。

重构是在不改变软件功能的情况下对软件内部结构的优化。为了保证重构只是在优化而不会引进新的BUG,重构的先决条件就是:所被优化的模块一定要有测试的保护。重构完毕以后换上另外一顶帽子,增加新功能,如果新的功能导致原有的测试失败,那我们可以确定这是由于所添加的新功能导致的。就像唱歌跳舞需要找到节奏一样,两顶帽子的灵活搭配,才能把代码写的又快又好。

可有很多时候,迫于时间的压力,很多人都不喜欢戴重构的帽子,对代码的重复,架构的死板,能忍则忍,忍了再忍。以为这样可以更快的完成任务,其实不然。一旦有重复代码的出现,就意味着,程序员犯错误的可能性会增加。首先,是因为每次做改动的时候,都要保证所有的重复处都要做出改动。其次,重复的要多,多以后优化的阻力就越大,如此一来,就进入了一个恶性循环,技术负债越来越多。

戴上重构的帽子,有利于改变这个状况。可有的时候,你给客户说,“别急,在增加新功能之前,让我先重构一下”。客户指定不买单,他付钱是为了要新功能的,而不是要你打磨老代码的。这时候唯一可以说服他们的论据,就是什么都不说,给结果就行了,他们指定喜欢又好又快的。所以,重构到底有没有用,一定得能在实际操作中表现出来。

戴好这两顶帽子,BUG会越做要少,新功能会越添越快,代码质量会越来越好。何乐而不为呢,偷着乐吧。

2017年4月更新 Murex程序员的学习氛围

11年毕的业,后来凭着对计算机的热情和执着,进了Murex,当了一名软件工程师,到如今,工作一年有余了。一直以来,都有学弟学妹或朋友向我询问关于Murex面试的种种事宜,我很高兴能帮助他们,一方面是能为他们顺利的找到自己喜欢的工作尽一点微薄之力,一方面也是为了多交些志同道合的朋友。搁这说说当时面试的心得,留点文字作为回忆的同时,也希望能给大家一点小小的启发。

暂且不说具体面试是怎么个经过,先说说当时的心态吧。

找工作之前,在一投行干了一半年的实习,对多线程,设计模式,稍有了解,经验不多,但热情很大,爱追根问底,倒腾代码。当时找工作的方向很清楚,就是要到金融业里做一个不懂金融的程序员。原因有二,一是在金融业里,搞编程,有挑战性,什么海量数据了,低延迟了,可以点起我战斗的热情,二是,赚钱多。另外,当时我的职业规划也很清楚,坚定不移的走技术路线,一是我好这一口,好到可以日有所思,夜有所梦,梦的都是代码,二是,走这条路,也能有肉吃,并且,也不少瘦肉。

之所以说完心态再说面试,是觉得,我当时的这个心态,对我最后取得Murex的肯定是有决定性关系的。

再来说面试。第一轮笔试,面过的普遍反映有点难,其实也是,和大部分公司要求做选择题不一样,Murex的题都是开放性的,给你些代码,让你说哪里好,哪里坏,坏的地方如何提升改进。不过说来说去,考的都是平日的积累。你说难吗?其实也不是特难,题出的也不偏,考的都是些基本的概念,比如面向对象的思想,多线程的使用。可正是如此,可以看出考生对基本概念理解的深浅。

所以第一轮面试,之前的准备是有必要的,但主要是要出于温故知新的目的。过与不过,要看的更理性一点。过了,说明工作适合自己。没过,可能是平日的积累没有达到要求,但也可能,工作本身不适合自己,毕竟每个人和每个人的情况不一样。把它看做一种测试,不仅是对知识的测试,也是一种匹配度的测试。

说到这,具体题是什么题,就没那么重要了,发挥出真实的水平就行,对别人负责,也对自己负责。

在接下来的和人力的面试,我觉的是些软能力的测试。比如,语言表达能力,另外最重要的就是自己对自己的了解,自己对自己的规划,自己的动机。人家就问为什么。问为什么要做程序员,为什么是金融业,为什么留在法国,为什么选的是Murex?所以,要多思考,思考自己的生活,思考自己的职业规划,思考自己的兴趣,思考自己为什么要下这一步棋,而不是另外一步,思考下一步棋的下一步该怎么走。所有的这些问题,我是学生的时候就在想,并且现在也在想,以后还要想,因为一切都是变化的,人在变,物在变。什么是动机,动机是内在的东西,推着自己往前走的那个东西,是主动的。而不是,人云亦云,随波逐流被动的。

第三面,我当时的印象,就是聊天,聊得高兴,聊得两情相悦,就被收了。但是,也有最后问问题的,写代码的,看情况。

今天写了这么些个情不自禁流出来的文字,其实就想说,在任何情况下,做自己,足矣。只有这样才能以不变应万变。另外把功夫用在平时,做到无怨无悔,就够了。Murex选你,其实你也在选它。

这三个词描绘了一个含有类型参数的类之间的子父类关系是如何随着它类型参数的变化而变化的一种性质。

够兜圈的吧。别急,举个例子就明白了。说,咱有两种箱子,一种装水果,一种装香蕉。问,如果香蕉是水果的子类,那么装香蕉的箱子也是那个装水果箱子的子类吗?

这里的箱子就是一个含有类型参数的类,而它的类型参数就是提到的水果和香蕉。

如果答案说,对,装香蕉的是装水果的箱子的子类,我们就说箱子这个类相对于它的类型参数是共变的,因为他们步调一致。如果答案说,不是,那么我们就用不变来形容上述关系。如果答案更出乎意料说,不仅不是,而且恰恰相反,装香蕉的是装水果箱子父类,我们就说,反了反了,是反变。

这一切重要吗?一方面说,重要,相当重要,因为我们先搞清了概念。一方面说不重要,因为要得到最终的答案,是共变,不变还是反变,还少了最重要的一个限制条件,少了它,谈什么都没有意义。那就是这个箱子能干啥,它有哪些可以被外界掉用的方法。因为这个条件是我们进行父子鉴定的基础。

在面相对象界,父子鉴定的理论依据是liskov替换原则,说的是,对于两个类甲和乙,如果甲能做的事乙都能做那么乙就是甲的一个子类,也就是说如果乙在任何条件下都可以替换甲,乙就是甲的子类。

所以说,得看看箱子能干什么,装香蕉的箱子能不能在任何条件下都能替换装水果的。

下一篇再举几个例子来具体感受共变,不变和反变。