对于任何编程语言,数据结构和算法对于一个程序员重要到什么程度?

2016-11-13 14:50:50 +08:00
 keikeizhang

首先表达一个态度就是我认为数据结构和算法很重要,但是有一个前提。

最近一直和朋友探讨这个问题,也咨询一些其他程序员,如果排除装 X 因素,你自己有没有为项目特地的研究一下数据结构和算法。

而设计模式中,除了工厂和单例真的很少用到其他的。

我知道 V 站都是大牛,但是到底什么程度的项目会用涉及到数据结构和算法,或者说不懂数据结构和算法的人,怎么样的一个项目就是他的技术极限。

V 站也好,知乎也好,感觉数据结构和算法放佛神话一般,可是我知道很多根本不懂数据结构和算法。

而本人大学学习的数据库原理,网络协议,操作系统,计算机原理,到先在我不知道给我带来多少的帮助,也许我还没有涉及到更高层次的编程体验,感觉自己一直在增删改差,处理一些数据,然后输出渲染就好。

总结的一个问题就是,如果不懂不学习一些计算机的基础知识,他的技术极限是什么?

14563 次点击
所在节点    程序员
58 条回复
waruqi
2016-11-13 18:42:36 +08:00
我现在连链表都不敢多问了
pyufftj
2016-11-13 18:47:27 +08:00
@nagato 非常同意你说的。不过有的题目,别人的代码我看一天都看不明白,但自己仔细想想代码能写出来,真是奇怪 T_T
Sight4
2016-11-13 18:49:26 +08:00
@kukuwhu 说出了真理, RMDBS 可以是对算法的依赖变成了对 DB 的依赖,当然, DB 本身已经是一个集算法大成的系统
anubiskong
2016-11-13 18:52:12 +08:00
编程一大误区: 算法能力=解决问题的能力
f1r1ng
2016-11-13 18:56:39 +08:00
可以把科班生和非科班生,或者说培训班量产出来的和真正热爱这方面的人区分开来
tomczhen
2016-11-13 20:09:27 +08:00
野生半个程序员出来说一下吧。

很多情况下,确实用不到算法。这个跟工作内容有关系,毕竟现在分工这么细致了。算法能锦上添花,但是不会算法,也是能解决问题的,虽然会有一些“效率”的问题——但很多情况下“效率”不是问题。

打比方说的话,扫地这个工作谁都能做,但是合理规划能提高效率,问题是上面验收的人只要你一天内完成,至于你是 3 个小时,还是 1 个小时,不好意思——工资是一样的。

同样解决一个问题,写一堆 if else 和一个函数式,水平差距还是有的——最简单的位运算,我这家公司开了 3 个小时会跟前后端开发讲,还有人弄不太明白,而且还有人说,用字符串判断也是一样,更容易做一些。

总的来说,如果你处于底层,那么算法对你的收益确实很低,远没有你学个框架,熟悉一下各种 API 来得高。但是,请看清楚一点,现在各种开源库,框架,工具,文档中文化,让进入这个行业的门槛越来越低,当你上升到一个阶段时,你会发现——各种问题都要算法来解决。

总的来说,机会永远是留给有准备的人。
murmur
2016-11-13 20:18:36 +08:00
做前端的
很简单的一个需求
若干个 n x m 的方块 排布在 w x h 的空间内,忽略方块的间隙(也就是紧贴着排放)
请想出一个尽可能美观的排版方式
这个代码找别人现成的可能 10 行就搞定了 js
你自己写写的出来么
我连思路都没有 所以我把这算法存起来了 每次直接复制
murmur
2016-11-13 20:21:21 +08:00
我们本科老师说过 现在的本科意义不在于你记住什么 是你有朝一日用到的时候曾想起有个东西可以帮你解决 你去查资料 知道查什么 这门课就没白学
可惜很多码农连用什么算法解决问题都不知道吧
现在的库别说是简单的数据结构了 各种高级算法你想要都有库而且都不差 就怕想都想不出来
bumz
2016-11-13 20:31:38 +08:00
不懂不学习一些计算机的基础知识,他的技术极限是正无穷。

就像 Srinivasa Ramanujan 一样大量重复前人的工作,反倒有了过人的洞察力,从而有能力作出开拓时代的发现。

然而对大多数人而言,把前人的成果摆在眼前尚且不能立即掌握,要让他从零开始独自一人重复千万人的工作恐怕更是天方夜谭。

这样的结果恐怕只是,在技术上,独自一人被全世界丢在身后,奋起直追,然并卵。

然而现实是,这样被丢在后面的人很多。。。孩子你不孤独,就算没有能力理解和掌握一种算法,你也可以把它当作黑盒调用前人写好调好的程序;虽然你可能始终无法理解 i++ 和 ++i 在速度上的差别,没关系,现代的编译器始终为你优化,你无需再在意该使用哪一种;看到开源代码中出现 (i << 3) + (i << 1) 你或许一脸蒙逼,但其实就算老老实实写成 i * 10 ,开高优化,二者生成的代码也都相当于 ((i + i) * 4 + i + i) ……

相反,冒泡排序背到滚瓜烂熟,真到应用时始终不如语言标准库实现的快排;熟悉动态规划、递归递推之间的转化,你能写出时间复杂度只有 O(mn)、空间复杂度只有 O(m + n) 的 Levenshtein 距离的实现,却不如隔壁老王从维基百科、 Stackoverflow 上复制粘贴;熟悉 IEEE 754 的你借助位运算近似得到 1/sqrt(x) 的值再用牛顿法迭代造就传世平方根倒数速算法,然而机器性能的增长使得这一运算不再成为瓶颈,同时借助 GPU 和开源工具任何人都能写出更快更好的程序……

好了我写不下去了,神来之笔在计算机科学界比比皆是,没有坚实的跨领域基础在背后支撑,你玩不到光影绚烂的 3D 游戏,搜不到 Chris Lomont 发表的研究平方根速算法的论文,用不上带有多点触摸 Touchbar 的 nbmp ,甚至想写程序还要在卡片上打孔,不,计算机压根就不存在,算盘也不存在,数学也不存在,人类还在茹毛饮血……

话说回来,如果没有坚实的计算机科学基础,你也能灵活运用别人写好的算法、程序让周围的人、老板对你刮目相看;但是懂得原理终究是不一样的,只会调用别人写的 Levenshtein 距离而不懂得原理,如果想实现 Sublime Text 那样先筛选子序列再按编辑距离排序,你永远也想不到要怎样修改……
bumz
2016-11-13 20:38:42 +08:00
简而言之,不懂计算机科学,你也可以成为自己小圈子中的佼佼者,胜任遇到的大多数任务;但是不学习计算机科学,你便永远也无法超越自己的小圈子,仅此而已。
tomczhen
2016-11-13 20:45:06 +08:00
@bumz 哈哈,工程师和艺术家是两种职业。

建筑设计师总归是少数,砌墙工人的收入也比低级设计师高得多——说不定当个包工头比设计院那些加班的那帮苦逼们要滋润多了。

只是为了赚钱,自然有着每个人的最优解,但是,最优不代表最有趣。给我来说如果做程序员却要放弃创造力这种可能,还不如回老家卖猪肉呢。:doge:
sheep3
2016-11-13 21:21:56 +08:00
算法上面都说了,对于设计模式这方面,当你阅读框架源码的时候你会发现大量的设计模式在其中处于非常重要的地方。当然如果你觉得程序员写一辈子业务代码就行了的话,当我没说= =
xiaoxiaoming
2016-11-13 21:51:17 +08:00
如果想要做得更好更快更爽,引入设计模式是非常必要的!不管是业务代码还是框架代码!
但如果没有那个追求,也能凑合着过。。。
mko0okmko0
2016-11-13 21:59:42 +08:00
我觉得会搜寻的比会算法的更重要.
不会搜寻.整个自己搞.最高水平就是自身状况了.
会搜寻.你会得到这个世界前 10 优解.
Yc1992
2016-11-13 22:02:07 +08:00
日经贴,有意思吗?爱会会不会拉到
jackie9692
2016-11-13 22:08:42 +08:00
软件工程 VS 计算机科学,同感软件工程专业貌似更强调解决工程问题,不够重视算法和数据结构,只有部分搞 ACM 的算法较强,同样为面试刷题。
ihuotui
2016-11-13 23:24:45 +08:00
@withlqs 我也是这样认为,看人,两种,一是他的行动(基础知识体现),二是智商(算法,聊天,思考)
isbase
2016-11-14 00:07:57 +08:00
凡事无绝对,还有人记得 homebrew 作者吗
SlipStupig
2016-11-14 01:33:37 +08:00
@snnn python 狗表示不懂算法,只懂轮子,如果轮子都没有,说明目前能解决的是极少数,所以我也解决不了.....
hackpro
2016-11-14 02:20:18 +08:00
FLAG 的面试基本都是算法题
所以题主你看。。。

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

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

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

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

© 2021 V2EX