原帖提了一个面试题,用来考察对 JS 异步控制的熟悉程度。
个人在学习 JS 时特意看了一遍 Promises/A+ 并尝试实现过,感觉这类东西跟算法等计算机基础课一样,平时工作中肯定用不到,99% 的概率不需要你手搓一个 Promise 或事件循环之类的东西,但仅读过文档说明,跟真的参考规范并尝试实现过,理解程度肯定是不一样的。
又或者以 Java 举例,仅了解 Java 语法和标准库,和深入探索过 JVM 的各种机制与细节,在线上排查 OOM 问题的时候,思考的层次和维度就会不同。
然而人生苦短,学海无涯,没人且没必要事无巨细地深入到这种程度,需要将有限的精力投入到更重要的地方去,所以才有此疑惑:
对一个软件工程师(而非研究人员或特定领域的技术专家)来说,技术领域什么才是值得深入学习的?
或者回过头来,仅以 Promise 为例,如果不去了解 Promises/A+ 等规范,想要加深对异步本质(是什么,解决了哪些问题、如何解决)的理解,应该去学习哪些方面的内容呢?
![]() |
1
MonikaCeng 20 天前 via iPhone
我面试也遇到过让我手动实现 promise 功能
|
![]() |
2
murmur 20 天前 ![]() 深入只限于面试,一个企业能在轮子层面有创新的就那么几个,还得是大厂,一般的公司能把轮子用明白就不错了
轮子要的是稳定性和工程性不是创新,你的轮子转的比别人快 10%,但是 3 天就断轴,也没人敢用 |
3
yaodong0126 20 天前 ![]() 那个人我已经 block 了,我说一个不同的,技术领域没有什么是值得深入学习的,所有的技术达到面试可过的程度即可,哪怕是死记硬背都可以,反正工作也不会用到,把其他时间多留给自己和家人,如果你是一个技术狂,那当我没说
|
4
Rickkkkkkk 20 天前 ![]() 所以工作上遇到的实际困难/问题要把握住,是快速学习的好机会。
|
![]() |
5
superhot OP @murmur
@yaodong0126 仅以通过面试为标准来学技术,感觉这种说法有点绝对了,工作中确实会遇到自己知识盲区而束手无策的情况,比如我之前遇到过 JVM OOM 的问题,当时对 JVM 一无所知,连 Heap Dump 都不懂,就觉得如果对 Java 的认识足够深入的话,遇到这种问题应该马上就会有思路,至少有方向才对。 |
6
craftsmanship 20 天前 via Android
@MonikaCeng 这种面试问题出发点是考察基本理解 本意是好的 但形式确实不理想
|
![]() |
7
xtreme1 20 天前
arch compiler os
|
![]() |
9
coefuqin 20 天前 ![]() 所有的一切所谓的“技术深度“,无非是孔乙己研究的茴香豆的茴字有几种写法罢了。原帖提 js 的问题,那我问他 golang 的问题呢?问他机器学习的问题呢?他不会是不是就意味着他技术实力不行?
现在前端领域被 llm coder 挤压了,他在前端领域积累的这些技术领域的深度还有发挥空间吗?市场都快没了,会一百种复杂的茴字写法也没用的。 |
![]() |
13
coefuqin 20 天前 ![]() @superhot #11 没有性价比更高的东西。真正最重要的是学习能力,不分横向和纵向。
横向,能不能快速的( 2~8 周)切换领域,比如从前端、移动端快速地切换到后端(各种七里八里的逻辑,姑且把底层开发也攘括进来),后端快速地切换到算法(传统 cs 算法(计算机程序设计艺术),机器学习)。 纵向,遇到你在工作的某个领域里的陌生问题,能不能快速的( 1~2 周)通过各种手段( llm deepresearch,搜索引擎,个人人脉(你认识某些领域的大腿),花钱去论坛或者群套路......)分析问题,找到解决方案。 你所说的深度都是领域纵向的一些 trick ,这种 trick 谁去死记硬背啊,某一次靠它搞定问题了,下一次遇到同样的(同类型的)问题,你只要知道有这么个 trick 并且曾经做过笔记,能快速找到即可。记的多不能代表什么。在真正有智慧的人眼里,只会显得更蠢。 这种抽象的共性学习能力,才是最重要的,但肯定不会是性价比的,因为它需要各种机遇(或许大部分人的过程并不相通,有人很早就得到,有人花了很长时间才得到(比如我))才能修炼得到。 |
14
sunwellselfheart 20 天前
我觉得系统的范式或者说结构是最重要的,系统内部各个组件是如何组织以及各个组件内部是如何运行。
|
![]() |
15
acthtml 20 天前
前期宽度,后期深度。
前期什么都会点更容易左右逢源;但人的精力是有限的,你不聚集一个领域很难有更高的竞争力。 |
![]() |
16
msg7086 20 天前
这事儿吧,本来就挺难的。你要是搞标准化考试,肯定有人跳出来说深究这些东西鸟用没有。但是你不考这些,你考啥?
就和简历筛选一样,一千份简历放在你面前,第一步你先把硕博的跳出来,别的直接丢进废纸篓里,硕博的面完不理想的再回去捡几份出来。面试也是,假如现在 20 个人等着让你面试,你问他们什么东西能帮助你选出你要的人? 所以现在大企业招人就是标准化流程,起手白板 coding ,然后面一圈系统设计,最后留点时间问 behavior question 。你说这样就能招到合适的人了吗?未必,但至少大差不差,现实里能用。 反正就我现在这几年在我们团队里的感觉,开会占 50%,写文档审文档审 PR 占 40%,写代码占 10%并且现在都鼓励用 AI 写了,有时候一个月下来写代码不超过 1 小时。你天天刷 LC 的成果,其实也就是送你上岗位的敲门砖而已。 |
17
yanulg 20 天前
手写过 promise 确实对这块理解会更深入一些,那个我也是看标题就想到 thenable 了,但是就算没了解过也不会怎么影响工作的,除非你做的很底层,但是 99%的程序员都是做的很普通的工作,有时候你想到一个多一个解法会让自己开心一下,但是用笨方法实现依然是完成了工作
|
![]() |
18
icyalala 20 天前 ![]() 最珍贵的是学习能力、好奇心、精力。
问这些不是说工作中一定会用到,而是看你这个人还有没有动力和好奇心愿意去探索。 你要是说技术够面试就行了工作都用不到,那就是说甘愿作为螺丝来用,够用的话那也不差。 |
![]() |
19
jybox 20 天前
我觉得很多面试者和面试官有个误区:这类问题不应该以是否能够快速、正确地回答上来作为评价标准。如果很快就一次性写出,只能说明之前准备过,起不到太多考察的作用。更重要的其实是回答的过程,以日常使用的特性/接口去推测其实现,可以考察相关的知识储备和解决问题的思路。
|
20
iOCZS 20 天前
跟肌肉是一个道理,用进废退
|
21
allencloud 20 天前
就像“回”字的几种写法? 我倒是觉得这种技术讨论挺有意思的,平时工作不会钻研这么细节,可以开拓思路
|
22
catazshadow 20 天前 via Android ![]() 数学和物理
|
![]() |
23
GuguDan 20 天前
找不到文档的领域
|
24
Brain777 20 天前
看了下,有种感觉是个杠精,就是来秀优越感的
|
25
GuuJiang 20 天前 via iPhone
一道好的面试题,应该是让候选人能够一步一步想出来,并且整个思考过程中能够展开挖掘出很多的点,而不是用来区分听过和没听过这个东西的,很可惜现实中被赶鸭子上架临时拉来的面试官能想出来的题绝大部分都是后者
|
![]() |
26
momocraft 20 天前 ![]() 对于大多数人,一件事值不值得做是由结果反推的。但是很多成功结果无法复制,或者说能复制的结果我们不称为成功。
活着就是用自己的时间赌,只有自己能为自己负责 |
27
icy37785 20 天前 via iPhone
你们都基于面试题在讨论,可那老哥根本就不承认是面试题啊,他说这是有用的解决现实问题的,这是高性能开发。
当然后来他是不是招了这是他出的面试题我就不得而知了,我把他 block 了 |
![]() |
28
ckvv 20 天前
实际工作中能用到的, 用 Promise 写一个任务调度器要比那好的多, 比如说
```js function timeoutConsole(timeout) { return new Promise(() => { setTimeout(() => { console.log(timeout); }, timeout) }); } class Scheduler { constructor(limit) { this.limit = limit; // 最大并发数 } addTask(task, ...args) { } } // 同时运行的任务最多有两个 const scheduler = new Scheduler(2); // 添加任务 scheduler.addTask(timeoutConsole, 1000); scheduler.addTask(timeoutConsole, 500); scheduler.addTask(timeoutConsole, 400); scheduler.addTask(timeoutConsole, 300); // 输出 // 500 // 400 // 1000 // 300 ``` |
![]() |
32
enpitsulin 20 天前
这种题就是没有任何意义的,本质和语文考试考察古诗词背诵一样,有的人可能是理解了含义从而记住了题目,但是拦不住死记硬背的
你硬要说我掏出 `Atomics.wait` 原 OP 都不知道该怎么办了,甚至是同步方法🤡 |
33
momo2789 20 天前
@superhot 是的,耗子叔的“我做系统架构的一些原则”写的太好了,工作超过五年之后,技术本身可能真的没那么重要了。所以我也觉得这种原 po 把这道题当面试真的是浪费时间,面试一个小时需要考察的地方太多了,我宁愿问一些 behaviour questions 而不是这种看过就会写,没接触过就完全没有思绪的问题。
|
34
yzqtdu 20 天前 ![]() 推荐两个我时常回看的回答给 op ,也许看了会有不同体会
什么才算是真正的编程能力? https://www.zhihu.com/question/31034164/answer/553533545 计算机的哪些学科是被建议在本科阶段学掉的? https://www.zhihu.com/question/595969891/answer/3054501672 |
35
iceheart 19 天前 via Android
单线程模型的场景搞什么 sleep ,真 sleep 会赌死,假 sleep 的意义何在?
|
36
wefgonujnopu 19 天前
我觉得这不算深入吧,就是普通的 js 知识,要真深入那得学浏览器进程模型,底层 c++事件循环,我 js 就学了一个月而已,现在基本不怎么用了,都有点生疏了,还有我学编程不是为了工作,单纯的兴趣,也没有工作过
|
![]() |
37
xFrye 19 天前
原帖 op 就不是带着讨论的心态来发帖,就好像他发现了新大陆然后过来发帖炫耀一下看这里有多少人不知道的,显得自己很牛,还自己创造了很多不必要的东西来支撑他的观点
什么领域的技术值得学习?我觉得都可以,前提你最好是真的带有学习的心态去对待它 |
![]() |
38
SanjinGG 19 天前
能得到应用的就值得深入,相反,无法应用的,深入也没用
|
39
qingyingwan 19 天前
如果觉得计算机技术的核心是语法糖或者各种规范,那估计够呛。技术方面的核心是如何实现语法糖,比如 js 多线程或者协程,另一个核心是让技术和现实世界产生联系
|
40
burnsby 19 天前 ![]() 人力有穷的,值得深入的领域其实就是那些有难度有挑战的工作(需求)。软硬件(底层到顶层)的迭代和深入也都是需求驱动的,实现需求才是让你深入某一领域的最佳实践。
原帖的 Promise 中一个有 then 方法的对象会被 await 调用并生成一个新的 Promise 这种情况在 JS 中比比皆是,比如`Array.from`方法,只要传入带 length 属性的对象即可。 寻找**解决问题**更好的方法才是值得深入的,所有的有现成内容(知识点)的你都应该使用 AI 来帮助你,AI 是效率更高的搜索引擎,AI 无法解决的问题才是值得深入的。 |
41
veightz 19 天前 via Android
稍微跑个题,我现在更在意那些和特定语言无关的问题…
考察对道的理解,而不是术的实践。 越具体的问题,LLM 的效果一般更好一些。 而那些宽泛的问题,LLM 给了答案,并不能保证提问人能正确的实践。 |
42
pastor 19 天前
个人觉得左耳朵耗子、酷壳的多数内容,其实并不是好的技术文章。更偏散文风格,对于一些技术人有兴趣上的激励效果,但干货不多,甚至很多工程、技术观点是错的。
他文章的效果,就像他在阿里的成绩一样。 我对他个人没有意见,但是感觉他被太多小白过度吹捧了。 |
43
pastor 19 天前 ![]() 如果已有的特性无法实现、或者实现效果不佳,去折腾这种,可以叫 hack ,否则就是茴字的 N 种写法、装逼炫技纯傻 x 。
折腾 Promise 的实现和折腾算法完全是两类事情,拿来对比不太合理。 算法是训练和培养你的逻辑、思维能力,即使算法课里讲的那些日后多数用不到,但至少你在写普通业务逻辑的时候也能更流利熟练角度更多,更何况很多高级岗位高级功能确实需要算法这些基础内力。OP 和很多层把这些都定义为反正用不到、说明各位自己没啥技术追求对自己定位就是这个档次了,但不代表所有人。 很多人说背八股也用不到,但我实际见过的很多人,不是用不到,工程里用得到,但是这些人熟练背诵八股却不知道灵活运用,例如 java ,就知道社区全家桶,确实需要性能优化的地方,背过八股也不知道用,然后给团队挖坑。 总结就是:自己菜鸡不会用,然后还说背了也没用! |
![]() |
44
swananan 19 天前 ![]() 对一个软件工程师(而非研究人员或特定领域的技术专家)来说,技术领域什么才是值得深入学习的?
==== 最终你还是要选择一个技术领域深耕😂,我觉得构建好自己的计算机知识体系基础,然后选择一个你感兴趣或者工作中需要的技术领域不断深挖,是一个很有意思的过程。 或者回过头来,仅以 Promise 为例,如果不去了解 Promises/A+ 等规范,想要加深对异步本质(是什么,解决了哪些问题、如何解决)的理解,应该去学习哪些方面的内容呢? ===== 我觉得可以拿网络编程的演进过程来举例。比如说,服务端网络编程,更关注怎么提升 IO 密集型服务的响应能力,从 IO 模型开始,选择了多路复用 IO 模型,即 epoll 为代表的那一批(本质上是减少了上下文中断开销),然后基于 epoll 的网络库往往提供的是异步回调的网络编程模型,这意味着加大了研发人员的心智负担。所以出现了引入协程来隐藏底层异步网络模型的解决方案,比如说 openresty 引入 lua 协程,来结合 NGINX 网络 IO 实现来提供同步的网络编程模型,又比如说 go 从语言层面来提供解决方案,又比如 Rust tokio runtime 。 |
![]() |
45
lyxxxh2 19 天前 ![]() 懒就是懒 还说一点用没有。
我以前学设计模式, 正因为会了,才能读 laravel 框架源码。 不懂设计模式,绝不可能懂源码。 正因为懂源码 实现功能的时候,直接找源码有没有功能。 官方文档是没有的,比如: DB::purge 或者某个扩展包不如意/有 bug,直接继承,自己覆盖容器。 不懂原理,有很多操作 自己想不到的。 |
46
uds9u32br 19 天前
不要太焦虑了,能继续深入的前提是要有热情,有热情自然就会有方向。看你提到“有限的精力投入到更重要的地方”,说明你已经有答案了,差不多就行了,做去更重要的事。
|
![]() |
47
Curtion 19 天前
那个帖子说的东西是可以作为兴趣去了解学习的,没有什么坏处,但是不适合作为面试题,我相信大部分人反对的也是这点
|
![]() |
48
agagega 19 天前 via iPhone ![]() 逻辑能力、反思能力、洞察力。而这三者的共同基础是好奇心,就是遇到问题能自发研究「为什么是这样?为什么不是那样?」的意愿。
一些人不把技术看成抽象的能力、思维方式和知识,只把技术等同于具体的软件概念,比如你是前端,技术就应该是 NextJS 、VueJS 等,所以他们会认为技术是死路,钻研技术会让你的人生和他们的人生一样失败。 然而很少会有人如此贬低一个机械爱好者、电气爱好者、无线电爱好者、木工爱好者对技术的热情。它们其实没有本质区别。弄明白协程为什么能解决问题,和弄明白为什么手动档汽车需要离合很相似。 不要被纷繁复杂的概念迷惑,看到任何新东西就提一个问题:它能解决什么困难?为什么别的不行?马斯克信徒喜欢吹捧第一性原理,放在这里还真没错。 |
![]() |
49
levelworm 19 天前
我觉得唯一值得和能够深入下去的,要么是自己非常感兴趣,要么就是自己的工作,总之是可以长时间(以年和年代为起点)和不中断的研究才能够深入的下去。我自己也写过一点玩具,现在毛都记不住了。
|