「面试有感」什么是良好的编程思维?怎样才能学习到这种能力?

2019-03-25 19:26:59 +08:00
 Deardrops

面试的时候,面试官喜欢出一些场景题考察应聘者的编程思维,尤其是对分析问题的能力和思考的方式。

想问下各位 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 库,或者拿什么语言写个并发调度器的情况。个人认为这两个问题需要非常多的工程经验积累,在不断的磨练和精进中才能学到。另一方面,虽然非常希望有个大佬能指导我一番这些经验性的和高深的知识,可是并没有这个机会。编程思维能力不是天生的,是在项目中慢慢养成的,可是我好像连掌握这样能力的机会都没有,永远都是按照自己的线性思维码代码。

请问,有办法破解这个死结么?

3530 次点击
所在节点    程序员
17 条回复
www5070504
2019-03-25 19:32:35 +08:00
感觉无解。。。
zealot0630
2019-03-25 19:42:19 +08:00
因为面试官基础不好啊,没法问你基础啊,哈哈哈。我一向认为面试是双向选择,双方互相选择的。
liprais
2019-03-25 20:19:28 +08:00
面试就是看眼缘,不要想太多,面试官问你的问题你反过来换个方式问他,他都不一定能想出来,所以不要想太多
wi
2019-03-25 20:40:59 +08:00
你就不能多想想面试官的意图?
“没错,他们就是想屌你!”
没事,多面试几家就好了,要找到合适自己的工作。应届生的第一份工作相对比较重要。
GTim
2019-03-25 20:45:15 +08:00
送给面试的你一句话,也是我一直记得:如果双方都满意,那是我们的缘分,如果不能,那是我们各有各有追求,不是你不好,也不是我不好

你们面试怎么这么多这种题目,话说,自我介绍的时候,至少要半个小时好吗?

我面试基本都是自我介绍,等我自我介绍完了,也差不多面试完了,与其让面试官问一些它们自己都不知道的问题,还不如让他们来发现我们以前的不足

1. 比如,我做了一个获取 PDD 接口的工作,然后就开始巴拉巴拉.... 期间一序列爬虫的问题

2. 比如,我会写 EOS 合约,然后又开始巴拉巴拉.... 期间说了下 C++11 然后就完了

3. 比如 MySQL,我说我很讨厌 InnoDB, 也讨厌 Datetime, 然后又开始巴拉巴拉为什么讨厌

4. 比如前端,我说 JS 的异步还是挺讨厌的,一旦异步,处处异步,一不小心,就错了

5. 比如,我比较讨厌 Maven 而喜欢 Gradle,就是不喜欢 XML 作为配置文件,顺带讨厌了下很多 Java 框架

6. 比如聊到 Servlet3.1 聊到 HTTP 也就那么回事,然后顺带牵扯了下 HTTP 各个请求的不同,幂等...

几乎都是我自己挑起话题,然后面试官感兴趣就会问问,不感兴趣就拉到....

聊的时候感觉懂的还挺多,面试的时候几乎都不怎么深入,因为没去大公司,没有实战机会.....比如 Redis 容错,一般公司搭个主从就不错了
Deardrops
2019-03-25 20:50:28 +08:00
@GTim 谢谢你的这句话,我会记住的。
我在二面的时候不敢像你这样说这么多,面试官比我厉害,他知道如何用几个问题层层深入把我给问倒。只敢展示我在操作系统网络算法这些基础知识扎实,不敢过多地展示其他方面的掌握程度。
GTim
2019-03-25 20:57:38 +08:00
@Deardrops 非技术面,就不要过多讨论细节,重点在于不计辛苦的解决碰到的问题。比如主动挑起团队的技术攻关任务,比如主动参与重大 bug 的查找。我记得有家公司要我就是因为我深根半夜骑电动自行车去公司修复 bug 然后回家。
herebury
2019-03-25 21:06:33 +08:00
我感觉这面试官挺有水平的啊
不过面试其实主要看顺不顺眼,思考问题的方式这属于外交辞令的拒绝法
搞不好他就是不喜欢你问的那个问题才不要你 233
上边也说了,面试是双向选择嘛,别太在意
Kilerd
2019-03-25 23:06:56 +08:00
log 那题。
现场写 NFA,优化到 DFA,然后写个词法分析,然后用 LL1 文法处理 的既视感?
scnace
2019-03-25 23:32:44 +08:00
whoisghost
2019-03-25 23:42:45 +08:00
哎,学海无涯苦作舟。
cheesemp
2019-03-26 07:58:29 +08:00
框架设计? 应届生??? 是打算让应届生来设计业务框架给公司用? 楼主是不是简历吹上天了?
Deardrops
2019-03-26 08:33:40 +08:00
@cheesemp 没有没有,简历全是写基础如何如何。三个个人项目也算是 blog 和小爬虫级别的。公司只有社招没有校招,可能问问题也按照社招的流程和标准走。
mcfog
2019-03-26 10:07:40 +08:00
很多人总觉得面试是倒在最后的难问题上面,但其实更多时候是前面没有表现到最好(但也没差到让面试官放弃),最后的困难问题是反场复活的,答的好的话评价就是“基础 or 工程 or 别的什么一般,但对某某困难的问题的思路很清楚,有潜力”,答的不好的话评价就是这也不够好那也不够好了
Deardrops
2019-03-26 11:21:35 +08:00
@mcfog 不知如何才能提升解决问题的能力,尤其摒弃掉直线思维,能全方位细致地考虑问题。在没有找到实习和没有人指点的情况下。
no1xsyzy
2019-03-26 14:14:10 +08:00
@Deardrops 先随便找些什么问题练习吧。
问题到处都是,可能对你来说首先的困难就是 “发现问题”,将原本忽略的问题转化为一个显露的、待解决的问题,然后解决它。
然后就是 we must know (solve) we will know (solve) 的信心了。
no1xsyzy
2019-03-26 14:29:46 +08:00
@Deardrops 对了奥数题可能有奇效。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/548432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX