作为一名做 Web 开发的 Java 工程师,算法在工作中基本不怎么用到,但为什么面试总会问算法的问题?

我工作也有四五个年头了,个人觉得算法在工作中基本不怎么用到,也可能是因为我工作内容的原因,我主要做web开发,请问大家对这个问题怎么看?
关注者
1591
被浏览
456192

71 个回答

关于这个问题,我很想告诉lz一个残酷、有趣而又有些玄妙的事实。

告诉你算法没用的人,很多都是拿着高薪,并且懂一定算法的。
告诉你算法是cs科学的灵魂的人,未必是这方面的大牛。

你去问算法牛人,算法有多重要,他们多半会强调算法只是理论,工程性才重要。
但如果你去问一个工程做的比较深,算法学的比较浅的哥们,他们很多会说算法NB才是真正NB。
(也不排除有些2方面都不算很懂,但喜欢站队发表自己观点的)

这种答案究竟是出于什么情感?说不太清,多半是对于自己不熟悉的领域有所敬畏。对于自己熟悉的东西比较谦虚。但看到这类回答的时候,你需要多分析一下他们的答案。
Web 开发啊?不如我问你一个很简单的问题啊。

现在大家用 JavaScript 都讲求模块化,例如 AMD、CMD 之类的。假设网站上要用到的功能都是 JavaScript 模块,它们的依赖关系也是已知的,页面对这些模块的依赖关系也是已知的,例如页面 X 需要模块 A、B,页面 Y 需要模块 B、C。我们也知道通常网站在发布时会把非常多的 JavaScript 源文件打包成少数几个文件,这样可以减少对每一个源文件独立请求一次的开销,但又能保证几个文件能够并行下载。

简化的问题是这样子的:假设只考虑上面提到的页面 X 和 Y,模块 A、B、C,请问该如何打包?说得直白点,应该分两个打包 [A, B] 和 [B, C] 还是就一个打包 [A, B, C]?假设我们已知页面 X 和 Y 的流量,也有数据能够表明多少访问页面 X 的用户会点击打开 Y 的链接,或者是反向。假设我们也有 TCP/HTTP 性能开销的数据。如何计算以便作出判断?

真实存在的问题其实是这样子的:对于好像 Facebook 这样复杂的网站,如此之多的页面和模块以及如此复杂的依赖关系,如何打包模块才能使得用户在下载 JavaScript 文件资源时的时间开销尽可能小?Facebook 是有专门一套概率模型来解决这个问题的,感兴趣的话可以自行搜索 Velocity 相关视频。

你只看着你手头上的问题和工具,当然说不需要扩充工具包了,因为你没想过要去解决更大的问题。你要敢去想象那些看起来无法解决的问题,然后才知道自己缺了什么。
为什么?