引入
最近在朋友圈里看到一道最新的阿里秋招的面试题,题目非常有意思。虽然,以我现在的水平还不足以应对这道面试题,但我能从中分析出,阿里这些大型互联网科技公司对软件人才提出了一些新的要求。本文便和你分享一下我的发现。
面试题中的软件人才需求
我们先来一起看一下这道面试题的原文
Goals:
○ Build a simulated filesystem that supports these operations:
■ mkdir
■ cd
■ ls
■ touch
○ The filesystem will hold directories created via mkdir, as well as (empty) files created via the touch command (modifying timestamps is not necessary).
○ You only have to implement the necessary parameters (e.g. mkdir foo), and not all the possible parameters (e.g. ls lrt)
○ Show that the filesystem works by issuing various commands.
We’ll be looking not just for functioning code, but good clean, well written code.
Note: The simulator does not touch the actual file system for the file operations. You’re building an inmemory system that behaves like a filesystem, not an intermediary that modifies the filesystem on your OS. (So for example if you program in Java, do not use the java.io.File class or ProcessBuilder).
You have up to 60 minutes to work on it. Good luck! (not that you’ll need it ;)
从中,我们可以得到阿里对人才的哪些要求呢?
首先,英语是基础。面试题全文是英文来描述,如果英文不过关,根本不清楚这道面试题的要求。
其次,阿里这些大型互联网科技公司开始寻求底层系统人才。本道面试题要求面试者在60分钟内写出一个不调用相关语言类库的模拟文件系统,并且支持简单的文件操作终端命令(如mkdir、cd、ls、touch)。软件人才市场中,会几款语言写应用程序的人才也许已经趋于饱和,真正了解系统底层原理的人才却很少。阿里出这样的面试题,可能就是想从软件人才市场中过滤出一些具有底层系统思维的人才,为优化或者重构自己的底层系统做人才储备。
这种人才决策,我想不仅仅是从公司层面上,更是国家的大势所趋。当前中国没有一款拥有独立自主的操作系统,这对于国家来说是十分危险的。当前中国互联网经济是建立在西方的操作系统之上,假如西方将相关系统对中国封锁,那对中国经济会产生极大的影响。从国家的安全性角度来说,一款完全国产的操作系统是非常必要的。而做出国产操作系统,正是需要这些底层系统人才。
最后,面试题中也包含了对面试者代码规范的要求。不信的话,你来看看这句话:
We’ll be looking not just for functioning code, but good clean, well written code.
用中文来说就是,代码不仅能跑,而且要写的非常的漂亮,阅读起来令人身心愉悦(此句不是原文逐字翻译,加上了我自己的一些理解)。
人们常说“字如其人”,我想对于程序员来说这就变成了“码如其人”。一个人写出的代码可以体现出他的编码习惯、思维方式以及处理具体问题的策略。编码习惯是否规范?思维抽象是否合理?解决问题的策略是否可行?我想这些都是互联网公司面试人才所需要考虑的。
我们的应对策略
说了这么多要求,好像是在空谈,似乎没什么实际价值。那么,接下来我们就来聊点实际的,也就是我们如何更好的适应这些要求。
学好英语
大学的英语通识教育要求太低,对于提升自己的英文水平没有很大的帮助。英语的学习还是要靠自己或者请一些校外培训班的老师。
除了这些传统的课堂学习,也应该将英语学习融入到具体的场景当中。比如多看一些 *TED* 演讲、国外产品发布会、学术研讨会等等。此外,英剧、美剧和英文歌曲也是一个不错的学习资源。如果你十分热爱游戏,那么那些不支持中文的英文游戏也是一个非常棒的选择。在选择这些多媒体资料时,一定要结合自己的兴趣,这样才能让你的英文学习变得丰富有趣。
在学习这些多媒体资料时,光看和听可不够,我想,做一些主动的思考与记录更重要。记录下一些常见的生词、思考其中的长难句,分析句子的成分,积累其中的金句等等。这里的记录和思考,我推荐一刷的时候不要做,二刷、三刷的时候做。也就是说,一刷是给你放松的,二刷、三刷是给你思考的。
多了解一些系统底层原理
大学里的计算机相关专业除了教授一些技术应用,也会讲一些计算机相关的一些原理。这些原理大多是概念性质的,听得像天书一般,其学习过程中的成就感也是那些技术性应用课程所无法比拟的。但是,这些原理课程对于我们构建起计算机系统思维是十分重要的。打个比方来说,技术性课程是教你如何搬砖,而原理性课程则会教你如何构建高楼大厦。因此,请努力学好这些课程。
那么,问题来了,怎么学好这些课程呢?
首先是课堂教学。大学里面一门课会有多个老师来教授,有机会的话去听听其他老师对这门课的理解,也许会使你对这些原理形成更加全面的认识。此外,线上的课程也是一个不错的选择。你要知道,一门课这个老师能够录制完整的视频放在网上,已经证明了他对这门课有着非常深的认识,足以让一个课程团队围绕着这位老师打造精品的课程。
其次,国内外相关的优秀教材也是不错的补充材料。抽出时间理解这些大师的作品,我想你也会一步一个脚印成为行业界的资深专家。
最后,寻找一些具体问题,测试自己。在问题的思考解决过程中,体会这些原理,发现并改进自己的不足。
养成良好的编码习惯和思维模式
思维模式和编码习惯并不是凭空产生,也不是马上就可以形成。我认为,这两种习惯的养成在于两个字,一是“看”, 二是“写”。
看
第一个字“看”,我想从两个方面来解释。第一个方面是“看什么”,第二个方面是“怎么看”。
看什么
“看什么”,分为三个层次。
第一个层次,适用于初学者。一些语言教学的优质教材中通常包括大量例程代码,这些代码大多数写的比较规范,逻辑结构也比较清晰。这些对于初学者来说,是一个不错的模仿学习的材料。
第二个层次,适用于进阶者。这个阶段可以针对自己的兴趣点,找到一些具有挑战性问题的开源解决方案,阅读这些源码,除了可以加深自己对该领域的认识,更重要的是其中的思维模式以及一些编码规范。
第三个层次,适合高阶者。当前很多软件系统并不是从头开始造轮子,其中使用了很多开源框架和组件。阅读这些开源框架,你可以找到很多计算机系统原理的影子,这对于你形成系统思维有着极大的帮助。
怎么看
针对“怎么看”这个问题上,我想简单谈谈我自己阅读代码的一些经验。
一个程序或者是一个系统,说的简单一点就是逻辑+数据。传统的面向过程的编程,利用结构体存储数据,书写函数来描述数据的处理逻辑。我想这一点大家在C语言中已有所体会。而当下很多大型系统的代码,利用的是面向对象的方法,将数据和处理该类型的函数组成一个有机的整体(这个整体称作类),使得代码的的层次结构和逻辑结构更加清晰。
一个面向对象的系统内,仅仅一个类难以描述其对数据复杂的逻辑处理,因而一个系统中通常由多个类的协作,完成系统的目标。
说了这么多概念,我们回到之前的问题。到底怎么阅读这些代码?
先阅读其中的一个核心类,以此理清系统整体的层次和架构。再依据其他类的重要程度,依次阅读各个类。
那么该怎么阅读类呢?
我觉得抓住两点,一个是数据,一个是函数(在类中也称作方法)。
数据、函数在类中的可访问性不同,有公有的,有私有的。私有的由类内部管理,公有的可以供别的类调用。
阅读时先从公有的入手。首先泛读这个类,弄明白这个类可以给其他类提供什么的功能。弄清这个问题后,再精读这个类,搞清楚这个类可以提供什么样的数据(如数据名字、类型、含义等)以及对应的方法(如函数名称,返回值类型、输入参数等)。公有的阅读完后,再用同样的方法处理私有的部分。
完整的阅读完一个类后,就可以阅读其他的与它逻辑密切相关的一组类。从中,我们可以找到这些类协作的关系,也能获得一些编程或者是思维上的灵感和启发。
一组一组的阅读完这些类,我想你应该会发现很多有价值的东西。这时候,你可以适当的将一些有用的记录下来,供日后参考。
写
第二个字“写”,就是将“看”到的编码习惯和思维模式熟练灵活运用。
这里的“写”,也具有三个层次。
第一层,模仿。说白了就是抄。这个阶段不要用复制粘贴,尽量用手一行一行地敲。如果代码量太大,可以一段一段的复制粘贴。这种做法虽然减慢了你写代码的速度,但却给你留下理解思考代码的时间。
第二层,修改。面对一个非常实际并且富有挑战性的问题,思考是否有类似的开源方案、这个方案的效率如何、我能否做出一定的修改,提高该系统的性能。边思考,边写就是这一层的关键所在。
第三层,移植。一个软件系统不可能处处都是亮点,但其一定会有几个令你眼前一亮的设计。把这些设计思想灵活地运用,写在你自己的系统当中。这便是我所认为的移植。
总结
今天,我向你分享了阿里的面试题,并从中获得以下三点对软件人才的需求。
1. 能够无压力阅读英语文章或者是技术文档
2. 对底层系统有着清晰的认识
3. 良好的编码习惯和思维模式
大家可以依据这三点,做好自己的学习充电规划,从而更好的适应社会对我们软件人才的需求。