面试的时候,面试官喜欢出一些场景题考察应聘者的编程思维,尤其是对分析问题的能力和思考的方式。
想问下各位 V 友,如何定义良好的编程思维?除了大量地编程实践以外,如何改变自己的思维方式,习得这种能力?
以下内容带有消极情绪,可以跳过不看。
提这个问题,主要是今天被 HR 通知面试挂了(三面挂)。得到消息后,我仔细反思自己哪里还有欠缺,感觉应该是场景类问题回答地不好。( PS:公司只有我一个人应聘,所以排除其他外部原因,原因出在我自己身上。)
二面的最后面试官出了道设计一个 log 库的题目,给定 pattern,要求输入原始日志,按 pattern 格式输出。我非常直线思维地回答了这个问题,在包中先定义结构体 Log,然后写一个 newLog()函数返回引用,newLog()函数传入 pattern。再分别定义 Log.Debug()和 Log.Info()两种不同日志级别的处理函数,在抽象出这两个函数中相同的部分到一个新函数中,pattern 部分可以用正则表达式或者 Sprintf()来处理。并且要将某些固定字符串(比如"DEBUG"
)命名为全局变量(魔法字符串)。最后面试官提示可以按字符串顺序挨个字符处理。
三面 CTO 出了一道 goroutine 调度模型原理的题目。先画了线程和协程的 1 对 1,1 对 n,和 m 对 n 的示意图。问为什么前两者不好,我不清楚,回答有阻塞会把线程阻塞掉,浪费 CPU 资源。然后 CTO 引导我一步步设计 goroutine 调度器的数据结构和功能,我只回答了将协程放在等待队列里面,运行时取出队列。将线程放到线程池中,在运行就移除去,结束了就放回来。CTO 几次尝试引导我都没领会到他的意思,不再继续提问。
和面试官交流的时候,我提出了一个问题:「我是找暑假实习,应届生,为什么要问我工程实践上的问题(场景题),而不多问点基础」,面试官说:「主要是想考察你思考问题的方式」。
现在,得到被拒结果的我,心情非常复杂。我个人觉得「应届生拥有良好的编程思维」是一个死结(无法解决的问题),对我而言是这样的。我写过不少的个人项目,网上看过不少的教程。但我一个人写代码的话,再写多少年也不会遇到设计一个 log 库,或者拿什么语言写个并发调度器的情况。个人认为这两个问题需要非常多的工程经验积累,在不断的磨练和精进中才能学到。另一方面,虽然非常希望有个大佬能指导我一番这些经验性的和高深的知识,可是并没有这个机会。编程思维能力不是天生的,是在项目中慢慢养成的,可是我好像连掌握这样能力的机会都没有,永远都是按照自己的线性思维码代码。
请问,有办法破解这个死结么?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.