不擅长算法和数据结构的程序员就不是好程序员吗?

2015-04-17 10:08:09 +08:00
 linpf

我是phper,主要就是做网站项目,在大多数的项目中,根本用不到算法和数据结构。我不得不承认懂算法和数据结构是很牛逼的一件事,但是即使不懂,也可以解决80%的问题。

现在看到各种大公司的笔试面试,都涉及到大量数据结构,感觉无论这个岗位是不是很需要掌握数据结构和算法。诚然,这是一种大浪淘沙精益求精的做法,可是我还是受到打击了。

作为数学渣的我,在学校学数据结构和算法,及格都是谢天谢地了。但是我算法不好,我会去学很多技术、掌握更多的框架或者组件,学更多的语言,我认为我将来仍然也会是一名好的程序员。

元芳们,你们怎么看。

30121 次点击
所在节点    程序员
138 条回复
wizardforcel
2015-04-17 23:27:56 +08:00
@twl007 数学证明是数学系的分工罢了,就像搞土木的人负责列方程,拿给数学系的人去解一样。万物基于数学,并不等于万物都归数学系管。
OldPanda
2015-04-17 23:28:11 +08:00
@wizardforcel 不认同国外面试就是聊天,面了十多家,超过一半的要白板写码
jamiesun
2015-04-18 01:44:45 +08:00
为什么要成为一名优秀的程序员?成为一个优秀的自己不是更好吗。
wind3110991
2015-04-18 02:00:27 +08:00
额额。。。楼主
如果有人问你:Linux文件系统储存是基于什么数据结构的?能简单告诉我下是如何设计的

作为一个程序员,你应该至少懂得这是B+树吧 - - 在编程的生活中,不只是我们撸的程序,各种各样的数据结构都穿插在我们生活里:比如epoll的红黑树,大数据海淘中的hash,堆排序等等。。。
并不是说不精通就不是好程序员,只是,作为一个程序员,如果你在数据结构方面太软肋。。。你都不好意思说你是做软件的吧。。。虽然说这些东西不会经常用到,但是这些是程序设计最精髓的东西所在,这些人懂得去思考问题,解决问题
我身边打ACM的人基本都被微信要走了
个人意见。。不同意欢迎交流 = =
puncsky
2015-04-18 02:25:18 +08:00
少想那些没用的,该学的都得学。
pinepara
2015-04-18 05:15:13 +08:00
1. 不太恰当的比方:
假设我在玩一款游戏,主角现在的属性是攻击力 1000,护甲穿透 10%。
现在有两种加点方案:一种是攻击力 +50,一种是护甲穿透加 50%,我应该选哪种?
如果我决定今后一直只打无甲敌人,我会选前者,否则会选后者。
我觉得我会选后者。

2. 另一个不太恰当的比方
程序语言本质上只是一门语言,就好比中文,对语法越熟悉写得越流利。
框架好比文体结构,懂得文体才能写出结构清晰的文章。
业务逻辑则是行文的内容,决定了这篇文章能否产生有价值的内容。
这些都与算法/数据结构无关。
我所理解的算法/数据结构对应在自然语言中的类似概念是:词汇量。
词汇量缺乏的时候,有些意思能够表达但是表达得无比啰嗦,还有些意思则是无法表达出来。
对应地,对算法/数据结构缺乏了解的话,经常会重新发明一些效率低下的方轮子,也很难分析程序的效率瓶颈,某些效率要求苛刻的地方则根本无法实现。
当然,又要回答第一个比方类似的选择,一切取决于需求。
czyseo
2015-04-18 10:38:58 +08:00
既然不会一辈子做程序员,那还有啥可说的,爱学啥学啥呗
roricon
2015-04-18 12:20:03 +08:00
@pinepara 十分喜欢第一个比喻。
pinepara
2015-04-18 15:42:39 +08:00
@zhengkai Zuck 的 PHP 水平应该比你想象的要好
jacob
2015-04-18 18:18:38 +08:00
@cdffh 肯定有好处,不然也不会加上,至于影响性能,oo还影响性能呢。咋不都用纯过程呢,还有问,require 和require once区别的,我只说我宁愿多写点东西,也不想把时间花在这上面,如果真想研究这些细节,不如去看php源码。
JamesRuan
2015-04-18 23:17:23 +08:00
@wind3110991 额,文件系统还真不是都用B+Tree的……
JamesRuan
2015-04-19 00:10:06 +08:00
首先,我觉得,当一种固定的考试内容被制定下来的时候,作为考试,它就只能区别努力和不努力了,聪明不聪明只决定努力的时间。因此,我很反对这种直接考数据结构和算法的题目,手写算法啥的完全可以被废弃,互相浪费时间而已。
如果我出题,我会问一个我们开发中遇到的一个具体案例,以此未出发点,考察对方的对问题理解的角度和深度,当然算法问题也是其中的一部分。

其次,我和楼主的情况差不多,非科班,完全自学,对算法和数据结构十分不感冒,从来不想去学通,觉得认识认识,用到的时候有办法可以实现就好了。
你问我啥算法好的时候,我会去维基百科看一圈各类操作的时间复杂度,和空间复杂度,然后评价一下用啥(这个算是基本层次)。
我觉得,所谓算法好的人,就是不用去维基百科看一遍就能回答这个问题(这个算是优秀层次)。
所谓算法特别好的人,就是可以用维基百科外的算法更好的回答这个问题(这个算是精英层次)。
所谓算法更好的人,就是可以在现有算法基础上做些改动以更好第适应这个环境,比如Linux文件系统(ext系列)用的HTree就是改了B-Tree;比如Linux的链表,就是改动了数据结构的通常实现方式以换取了通用性(这个是精英中的少数,特别聪明,且有特殊机遇下才能提醒和普通精英的区别,而且必须是首创,像我这样知道的并不算)。
而算法神级人物,就是创造全新算法的,比如KMP之一的Donald Knuth无疑是其中一个。

普通人可以通过努力点技能树做的精英层次,特殊精英和神级人物就不用去想了,光努力是不够的,需要拼天赋和运气。

对于公司来说,要求是优秀层次的人并不为过。但是,还是要考虑到岗位的需要,你让一个写PHP的,PHP灭亡前都不会遇到维基百科以外算法的人,去熟练掌握维基百科内的算法,真有必要吗?他在工作中,算法方面还会有上升空间吗?如果他达到这样水平了,他就会不屑与仅仅做普通的PHP工程了,反倒是你的岗位太不能体现其价值了。

所以,把考算法作为评判努力程度的方式,实际和应试教育下高考非常相似。作为21世纪公民,初中知识完全够了,高中只要在任意一个学科方向达到优秀,其他方面达到及格上就算有用人才了;当然,没人反对你成为更加优秀的人才。
你非得逼着一个喜欢文科不喜欢理科的学生去考个数学95%分给你,无疑是互相浪费时间;因为高中反复操练的数学从知识点上说并不多,喜欢数学的只会觉得吃不饱,刷题目无聊;不喜欢数学的,就会觉得书上说的我都懂,但就是变态的最后几道题总是做不对。

事实上,算法问题交给算法专门人去解决不挺好的……IT分工那么细了,非得要求招个全才吗?

既然不招全才,仅仅凭借对方在算法这个方面达不到优秀(当然,不能不及格就是了)就刷掉真的对吗?如果是我的招聘的话,我会更在意一个人的技术兴趣点水平如何,其他方面只需要估计没有明显的认识漏洞和偏见就行了。一个看起来各种普通测试都能通过,却没有技术兴趣点的人,我到会更加慎重地对待,怕他是个刷题党混出来了,反而会问些更加刁难的问题。
gavinzgz
2015-04-19 18:35:48 +08:00
非计算机专业出身,工作中主要用Python,虽然工作中经常接触到算法,但数据挖掘的算法和计算机的算法还是有区别的,所以和LZ一样因为数据结构和算法被鄙视过。
我相信LZ解决问题的能力是非常出色的,我不相信一个数学能力不好的人解决问题的能力会强,反过来,解决问题能力强的人,肯定在逻辑和计算上有过人之处。所以LZ说的数据结构和算法不好,纯属因为LZ工作中接触得少,不需要去解决底层优化的问题。这确实也是大部分程序员的现状。
但是,以一种积极的角度去思考,能不能把面试也当成一个和工作中遇到的bug一样需要去解决的问题?不需要主动去学去看书,遇到问题和面试官交流一下,说说自己大概的思路,或者想一想利用工作中遇到的知识能不能解决(别说,有时想到的解决方案和经典的算法还真一样!),不懂的,回去再谷歌一下,有个大概的了解。相信多经历几次,遇算法不慌,看到数据结构不乱。不挺好的么。
cdffh
2015-04-19 21:42:25 +08:00
@jacob 其实没你想想的这么简单,为什么影响性能,影响多少,如何规避。这里面的细节是魔鬼。
ryd994
2015-04-20 05:08:55 +08:00
如果你问不学算法能不能做程序员?可以
如果你问不学算法能不能做优秀的程序员?不可能
qbaty
2015-04-20 14:39:11 +08:00
感觉你这个问题应该问到知乎去
qbaty
2015-04-20 14:44:34 +08:00
好的程序员 算法和数据结构绝对是必备的,虽然很多程序员日常工作中不在写算法了,多数是在处理业务逻辑,因为目前特别多项目缺的是功能、是业务逻辑,而处理业务逻辑,很少用到算法,除非是那种计算类型的逻辑。但是一旦把程序的使用范围扩大去看,就会发现往往掌握好算法和数据结构的工程师,程序员们,能够很好的应对复杂多变的业务逻辑,通常体现在通用的一些框架沉淀上
Allianzcortex
2016-04-26 10:09:55 +08:00
又看见这个问题了,再贴一次 http://mindhacks.cn/ 刘未鹏 pongba 的文章,程序员的关键是核心竞争力。数据结构是核心竞争力,对业务的熟悉也是核心竞争力。

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

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

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

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

© 2021 V2EX