C 在不同领域有不同的技术栈,不同职级有不同的难度和层次。
先说领域。
以高频交易为例,最核心的目标是极限追求低延迟,因此空间复杂度、代码健壮性、吞吐量都可以牺牲。除此之外,还需要金融领域的知识。
以游戏引擎为例,你需要啃十几本图形学书,没日没夜地自己从头开始写shader、光照、材质,甚至脚本引擎、C 反射工具等工程细节,可谓是燃烧生命。
以存储系统为例,又细分为内存数据库(redis)、全文检索(sphinx,ES)、大规模分布式kv store(spanner、bytekv)、分析型数据库、容错强一致性数据库(zk,etcd)、非主从架构的分布式数据库(Cassandra,Dynamo)、关系型数据库(innodb,Oracle)。如何克服写放大,如何避免data loss,如何做data replication,如何做sharding,如何实现secondary index等等,不同类型的存储系统有不同侧重,也有不同的trade-off。
我在AI Lab招C 程序员,如果岗位偏引擎,会问关于微处理器架构、GPU优化、CUDA编程、高级并行算法、前向推理框架、CQT特征提取、SIMD、视频编码解码等问题。如果岗位偏服务,就会问分布式存储、网络通信与rpc、操作系统、log-structured database(比如rocksdb)、文件系统等。要知道lab里的工作领域已经非常接近,就是AI服务的落地,本质上追求的是离线业务的高吞吐和高SLA。如果是不同大类的C 岗位,那差异会更大。
除此之外,还有嵌入式开发、工业软件开发、音视频等领域,都各有各的技能栈。
再说层次。
实习生、应届生的问题和社招FTE的问题肯定不同。对低职级岗位的问题一般注重CS基础和智力水平。即使领域知识和业务知识不熟悉也可以培养。对于高职级岗位的问题则注重对过往经验的挖掘,在讨论技术问题时,期待的是完整的解决方案。如果是算法核心的解决方案,可与业界、学术界sota标准进行对比,解释思路的novelity。如果是产品化的解决方案,则要熟知国内外市场上的主要竞品。
面试时遇到Top school CS科班出身和普通985转专业到CS硕士的,出题的难度也不同。事实上根据我的经验也只有最顶级学校的CS科班学生能让我放心地跨越好几个抽象层次追根问底。其他情况下,问得太深,对方连题干都听不懂,场面反而尴尬,还不如多交流交流项目经历,然后出一道难一点的算法题,好让面试者在现场编程能力这方面弥补一下之前基础上的劣势。当然更可能的结果是心态崩溃连编程题也没发挥好。
1.第一我想说所有的提问都是好问题;
2.衡量一个开发人员是不是优秀的开发人员,不仅仅是从技术上评估,技术可以通过学习获得提升;
3.面试一个人要从各个方面提问,了解一个人是否是一个优秀的,有自我驱动力的人太重要,一个自觉,皮实,有自我驱动力的人是不需要去管理的,只管把事情交给他,看结果的时候一般都会超出你的预期;
4.所以技术面试也应该从多方面提问,多了解一个人。