面试官问我 有阅读过哪些源码?

2021-02-09 10:26:59 +08:00
 hackingwu

这个问题我一时还真不知道该如何回答,平时在工作中,遇到问题或者对某个实现感兴趣的会翻阅一下源码。但是针对这个问题我也不知道回答什么?是因为我没有系统的完整通读一个框架的原因? 这种问题应该怎么回答? 日常中应该怎么积累?

6933 次点击
所在节点    程序员
26 条回复
l00t
2021-02-09 10:30:22 +08:00
阅读过手上项目的源码……
laojiaqing
2021-02-09 10:32:06 +08:00
面试官估计也没看过什么源码,他只是不知道该问什么,问这个准没错
drunkdog
2021-02-09 10:39:30 +08:00
十有八九这个面试官是个草包
widewing
2021-02-09 10:52:00 +08:00
然后你就脑补成“完整通读”一个框架了?
hxndg
2021-02-09 10:55:22 +08:00
实际上这个回答的重点,并不是你看过什么源码,而是看你怎么看源码的。
因为工作原因,我看过 OPENSSL 自动机的源码,分析过里面的功能,但是只看功能是第一步的,我原先总结的看代码目标是:

+ 自动机中功能性的划分,能迅速找到功能划分的位置。
+ 针对某些异常情况的处理,能迅速找到在不同步骤出异常或问题时的处理流程。
+ 系统竞争和瓶颈所在地,能迅速找到可能导致并发 /新建问题出现的地方。
+ 多线程或多进程同步的地方,能迅速分析清楚具体是哪种同步模型。
+ 能够将模块中可拆分 /变化的部分迅速找到,并零件化

具体可以看看这篇文章,这个是我总结这几年工作加看代码的经验和教训:
https://hxndg.github.io/2020/12/15/%E5%BC%82%E6%AD%A5%E7%A8%8B%E5%BA%8F%E7%BC%96%E5%86%99%E6%97%B6%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%95%99%E8%AE%AD/
l4ever
2021-02-09 11:08:32 +08:00
你就说阅读过 windows xp 的所有代码.
hongch
2021-02-09 11:20:48 +08:00
你直接和他扯一个他也不知道的项目源码,比如:嫦娥一号燃料控制器的源码
saberlong
2021-02-09 11:22:47 +08:00
估计是一下子没找到问的方向,问这个看看你熟悉什么,然后再深入问
CEBBCAT
2021-02-09 11:44:12 +08:00
就实事求是呗,这帖没读太懂。楼主如果还有其他目的,最好还是直接写出来
Kobayashi
2021-02-09 12:40:41 +08:00
前 3 楼至于吗?问问对方阅读过哪些源码怎么了?我自己就不想 3 年工作从来不知道自己用的框架怎么工作,最好有些开源贡献。近朱者赤、近墨者黑。源码不仅是学习框架远离,你也能学到优雅的设计、代码。
写代码不只是一位读文档写接口调用、CRUD,研究源码提高自己代码水平、接口设计水平也是重要一环。
fiveelementgid
2021-02-09 13:32:27 +08:00
@Kobayashi 读 fundamental 比读源码重要(逃
rodrick
2021-02-09 13:33:06 +08:00
这个题目其实等于:你看过哪些网上对源码的原理解析 or 你看过哪些八股文里的源码相关题目,不要想太多
hackingwu
2021-02-09 13:45:32 +08:00
@CEBBCAT
@Kobayashi 主要是不知道怎么回答,平时有读,但是真的让你去说,你好像又说不出啥来。
warush
2021-02-09 14:34:38 +08:00
请问 fundamental 是指什么呢?
DoctorCat
2021-02-09 15:23:10 +08:00
其实,面试官只想要一个态度:热衷技术钻研技术。
除非是参与社区项目,否则你具体看了啥代码,对于工作而言大概率是没有用的。
比较同意王垠大神的观点:不建议读代码,因为绝大部分代码都是不断迭代生成的糟粕,真正的核心精髓可能就几百行。
pkupyx
2021-02-09 15:51:10 +08:00
因为工作时间长了,总有文档描述不清楚的方法、接口,非得读源代码才能清晰确认输入输出。
mghio
2021-02-09 22:46:20 +08:00
@hxndg 有点东西。
hxndg
2021-02-09 23:23:38 +08:00
@warush
基础的理论,比方说你去看 linux 内核的 lru 可能看不明白,不如去看看《现代操作系统》里面的 second chance 和 lru 理论之类的东西,先搞明白原理。如果看代码很容易被不想管的东西干扰,看伙伴系统实现会看到不可回收 /不可移动 /可回收啥的,但是对伙伴系统的原理没影响。

@mghio
谢谢你的肯定,但是这种东西属于工作,查问题时候的总结。对于找工作没什么用,国内面试都是内卷(看到了很个糊弄的例子)。比方说我做 TLS 握手里面的多线程优化和状态机优化,主要是对新建有影响,面试官上来一个对并发如何如何,我就没话说了。所以还是多刷题,多背面试题比较好,按照自己的理解自己的语言来描述远差于背诵好的答案。


@DoctorCat
王垠属于理论学派,看不起实现派。实现派也看不起理论派。工业化代码追求简单有效,很多时候不追求美观的。嗯可以类比理论医学和临床医学。不过我看的多线程相关的代码对工作还是很有用的。
sss15
2021-02-10 10:05:42 +08:00
工作这么多年,除非是要写专题博客,真的没有去完整阅读过 spring 或者其他项目的源码,都是用到哪调试到哪。所以我会这么回答。
完整的看整个源码的是没有的,但是在使用框架的时候遇到问题,会断点进去调试,顺便就阅读一下对方的源码。
举个例子,有用过一个 ElasticSearch 的开源项目,在使用过程中,他能对写好注解的 dto 自动生成对应的 index,但是发现没有对 nested 对象的处理。于是阅读了他根据注解反向生成 index 的部分的代码,追加了一个注解类型,追加了一段 json 拼接的方法,使得其能支持 nested 对象的 index 生成。 还扩展了他分页返回的对象中的属性,之前分页是没有返回 max 的。 最后 pull 了代码给项目。作者也采纳了我的思路,并完善了他的框架。

完了之后估计面试官要追问,你是如何使得他能支持 nested 对象的 index 生成的。这都是套好吗,把面试官引到你的套里来。

回答 ElasticSearch 创建一个 index 就是拼接一个符合规则的 json 字符串,然后 post 到 Api 接口上去嘛。 其他的字段他都拼接好了,那我要追加的一个方法,就是判断当前属性是 nested 类型,然后去反射这个类型里面有哪些基础的类型,拼接一个正确的 json 部分组装起来就可以了。 如何判断属性是 nested 类型,通过注解嘛,我扩展了原项目中注解的类型,这样就非常好判断了,照着之前项目里的写法用就可以了,你要问我怎么获得属性上的注解,我现在背不出来,但是当时的场景中,我只要照着前面的代码写,就能获得注解和注解内的类型值了,这就是阅读源码和实践结合嘛。 再补充一点,我考虑到有 nested 嵌套 nested 的情况,这样显然复杂程度要增加,需要进行递归调用,不过当时项目时间有限,我就没有深入去实现递归的方法,仅支持了一个父类型里面嵌套一层 nested 类型。
kimjosda
2021-02-10 23:55:12 +08:00
前端,读过 redux-thunk 的源码🐶

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

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

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

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

© 2021 V2EX