V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linpf
V2EX  ›  程序员

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

  •  
  •   linpf · 2015-04-17 10:08:09 +08:00 · 29978 次点击
    这是一个创建于 3507 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    元芳们,你们怎么看。

    第 1 条附言  ·  2015-04-17 16:03:39 +08:00
    我想补充一点:我没有觉得数据结构和算法不重要,反而我深知他们的重要性。我也是一个很重视程序性能的,在我写代码的时候,我也会在我能力范围内做到写出高效的代码。

    问题知识我只是觉得那些对我来说学起来很吃力。我想把我的学习研究重点转到多学一些新技术上,我感觉也会有前途。我也考虑过技术淘汰的问题。但是你们觉得,你们会做一辈子程序员吗?反正我觉得我不会,我能赶上3次互联网浪潮改革就差不多该撤了。所以请不要喷我好嘛。
    第 2 条附言  ·  2015-04-17 17:31:57 +08:00
    我感觉大家有点偏题了。我的问题目的不是数据结构和算法是否重要,而是我不去学它的话,我会不会仍然成为一个优秀的程序员。
    138 条回复    2016-04-26 10:09:55 +08:00
    1  2  
    linpf
        101
    linpf  
    OP
       2015-04-17 17:22:17 +08:00
    @MarioLuisGarcia 我可不可以吐槽你还在用80年代的游戏主人公当头像 →_→
    linpf
        102
    linpf  
    OP
       2015-04-17 17:25:30 +08:00
    @johnsmith123 我感觉会解决问题,比会亲自实现问题的解决要有价值。
    sumhat
        103
    sumhat  
       2015-04-17 17:26:43 +08:00   ❤️ 4
    @zhengkai 你关于 nginx 的例子不对,在 nginx 出来之前,Apache 是世界上最牛 x 的 web server,一般人也会觉得 Apache 的性能最强了,不用再去重写一个新的 web server,然后就被 nginx 打脸。你的这番话会被下一个 web server 打脸。

    我同意 @binux 的观点,不用每个算法都会实现,但需要知道它的优缺点。在 ACM 界有一个共识,就是硬件(或参数)层面的优化,是无法和算法优化相比拟的。也就是说,即使换了全新的硬件(CPU、内存等),如果无法把算法复杂度降低一个等级,该过不了的题目,依然过不了。换到实际工作中,如果你能清楚地知道系统性能的瓶颈在哪里,并且有能力去优化它,这比只会改改参数的程序员,要高出很多档次。为什么 Google 会发明 Map Reduce,是因为这个算法适合 Google 的应用场景,Google 的程序员当年并没有迷信“Oracle 很牛了,我不需要知道它是怎么实现的,只要调调参数就行了”,这才有了现在的高效搜索引擎。
    mthli
        104
    mthli  
       2015-04-17 17:28:47 +08:00
    @sumhat 这是我赞同的观点 :)
    xiaowangge
        105
    xiaowangge  
       2015-04-17 17:36:10 +08:00
    「怎么培养算法不错,但是工程能力较弱的实习生」

    http://www.v2ex.com/t/158387



    什么样的人都有。关键是看自己 =.=

    分享一个和主题关系不太大的:
    「一个程序员的情怀」

    http://python-cn.org/guide/#/post/pythonista.md
    MarioLuisGarcia
        106
    MarioLuisGarcia  
       2015-04-17 17:45:44 +08:00
    @linpf 必须可以啊
    sumhat
        107
    sumhat  
       2015-04-17 17:54:15 +08:00
    @johnsmith123 面试的时候手写算法,目的并不是根据算法的正确性来选人。

    (实际的目的太长,这里写不下)
    cdffh
        108
    cdffh  
       2015-04-17 18:00:45 +08:00
    大三提这种问题很正常 以后你会意识到的。php我就问你一个我今天思考的问题,php使用 namespace有啥好处,性能上是否会有损耗。
    zhengkai
        109
    zhengkai  
       2015-04-17 19:33:34 +08:00   ❤️ 8
    @sumhat 必须精通算法才能比较出 nginx 和 apache 的优劣么?而且你想过没有,为什么撼动 apache 地位的是 nginx,而不是比 nginx 更早流行的 lighttpd?仅说效率肯定盖过 apache 啊?

    @linpf 说极端点,不去深研究技术 30 岁就转管理的也大有人在,当年我一个同事是美术组的头,去年他的公司上市了,联合创始人,他的美术水平只能算很好,全国排不上数,但是每年的上市公司创始人也不算多,他已经是其中之一了。

    我觉得这事很简单,你觉得更擅长学习算法,那你就去钻研,如果你觉得其他地方更强,那就发挥你别的长处,程序员成功不是靠算法这一条路,软件工程不是只有算法

    你可以擅长抽象,代码灵活,来随时应对 startup 时期对产品的频繁调整

    你可以擅长宏观的分析和实践,去做架构

    你也可以自己不懂技术,但是知道谁最懂技术,照好小弟,别让小弟加班太苦逼、给他们争取福利,他们信任你、能做出东西来

    这每个方向,都是需要思考需要去练的,也不是谁都能胜任的

    现在非搞成,不精通算法就你有天花板,过两年就等着被培训班出来的把你挤兑到失业吧!总之算法最高!不精通算法你也配叫程序员?

    我只能评价两个字:

    呆子

    我觉得说得够明白了,别 @ 了,懒得回了

    还有楼上的问我一亿条 url 怎么处理,你要是放上世纪末,大家电脑都只有 64 - 128MB 内存的时候这么问我,我还觉得是个问题,但是 5 年前我就开始用 16GB 内存的机器了,一亿条,也就是 100M 条,是个事么?你开个虚拟机都不会碰到瓶颈吧?而且我相信,所有练习写爬虫的人的,在他的爬虫能顺利工作之前,绝大部分人都是不知道 Bloom Filter 的。如果你一整年的工作就是优化一个爬虫,你需要了解算法,但如果从某个网站扒一些你想要的数据,而你不需要超过 5 个小时去琢磨这个爬虫脚本呢?

    我为什么喜欢用 facebook 举例子?扎克伯格的 PHP 水平肯定不怎么样,但是他手下的手下赵海平,不管哪个写 PHP 的都得承认这是位大牛吧?我衷心希望所有呆子们能认识到,你们的价值是由你们创造的东西的价值来决定的,而衡量这个价值,算法既不是充分条件,也不是必要条件,就像不知道什么是 Bloom Filter 的人也可以写爬虫一样。
    lcqtdwj
        110
    lcqtdwj  
       2015-04-17 19:41:29 +08:00
    @hustlzp 赞同
    vivalon
        111
    vivalon  
       2015-04-17 19:57:56 +08:00
    觉得,“不精通算法数据结构”的“好程序员”也许能做出“可以用”的东西,但“精通算法数据结构”的好程序员是可以做出“足够好”的东西。
    twl007
        112
    twl007  
       2015-04-17 20:12:09 +08:00 via iPhone
    在这里说算法不行就不合格的人 遇见天花板的人 请问有几个是数学系出来的 或者是计算机+数学双修的…… 一般广义的认知就是实现一个算法或者拿你知道的算法去解决一个实际问题 真叫你从理论上改良算法的楼上有几个做得到的
    nikolai
        113
    nikolai  
       2015-04-17 21:32:06 +08:00
    让我想起这个问题: http://zhi.hu/aGQB
    yangff
        114
    yangff  
       2015-04-17 21:38:19 +08:00 via Android
    至少说明你无法驾驭一类代码
    wizardforcel
        115
    wizardforcel  
       2015-04-17 21:43:00 +08:00
    @twl007 数学这个词太大了。数学里面有初等的有高等的,有微积分这样连续的也有离散数学这样离散的,有数理逻辑之类偏证明的还有高等代数计算几何这些偏计算的。总不可能都需要吧,要不然计算机系并进数学系得了。

    所以说算法就说算法,扯数学系是干嘛。计算机就算和数学沾边也是类似于土木或者金融,拿数学来计算东西,而不是研究它本身。
    Tianpu
        116
    Tianpu  
       2015-04-17 21:44:17 +08:00
    简单点说:

    Follow your heart
    falcon05
        117
    falcon05  
       2015-04-17 21:53:55 +08:00 via iPhone
    与其整天想个算法把自己搞得郁闷,不如自己开开心心做个完整的项目。
    wizardforcel
        118
    wizardforcel  
       2015-04-17 21:57:03 +08:00
    @linpf 只用库也是有问题。标准库基本能给你的,只有数组和哈希表两种,你哪天需要写个树或者写个图怎么办呢。

    公司考的那些算法,说白了,就是模式匹配。算法是有限的,而你要解决的问题是无限的,所以需要你用某种方法往上面套(专业术语叫做“归约”)。当然你自己得有一些素材才能组合出解决方案,基本的东西是要死记硬背的,比如树和图上面的几种操作。这些东西也可以通过看题解来快速弥补。

    现在的web开阿发也是翻来覆去的套框架,做几个就烦了。估计等到烦了之后才会大彻大悟,对算法感兴趣吧。一切只是没到火候。
    twl007
        119
    twl007  
       2015-04-17 22:11:47 +08:00
    @wizardforcel 计算机本来就是数学的分支 你看看那些算法哪个没有数学证明 说白了大部分程序员所谓的算法就是在实现人家已经设计并证明好的东西 所谓的算法能力其实就是运用算法的能力和对语言的熟悉程度 如何选择合适的算法去解决合适的问题并最优的实现这个算法才是大多数程序员的任务 真要说到自己去设计全新的算法或者真的去改进人家设计好的算法 真心难

    上面说算法不好会碰到天花板 呵呵 有几个可以去投行给人家写模型的 都不说设计模型了 有能力把人家设计好的模型能实现出来的有几个 再说不好研究算法的数学出身的其实编程技术真不如一般码农好 很多时候还要去找编程能力强的人去实现他们的算法 但是真论算法功底没数学系统的培养很难说自己算法很精通了 大部分时候所谓的精通就是我知道-我会用-我能实现-进行一点小的变动 真要大幅提升没几个人做得到
    mucid
        120
    mucid  
       2015-04-17 23:08:11 +08:00
    先补好数据结构功底吧,这个还是必须的,
    至于算法非一日养成,共勉。
    wizardforcel
        121
    wizardforcel  
       2015-04-17 23:27:56 +08:00
    @twl007 数学证明是数学系的分工罢了,就像搞土木的人负责列方程,拿给数学系的人去解一样。万物基于数学,并不等于万物都归数学系管。
    OldPanda
        122
    OldPanda  
       2015-04-17 23:28:11 +08:00
    @wizardforcel 不认同国外面试就是聊天,面了十多家,超过一半的要白板写码
    jamiesun
        123
    jamiesun  
       2015-04-18 01:44:45 +08:00
    为什么要成为一名优秀的程序员?成为一个优秀的自己不是更好吗。
    wind3110991
        124
    wind3110991  
       2015-04-18 02:00:27 +08:00
    额额。。。楼主
    如果有人问你:Linux文件系统储存是基于什么数据结构的?能简单告诉我下是如何设计的

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

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

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

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

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

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

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

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