V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
linpf
V2EX  ›  程序员

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

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

    我是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  
    apex42
        1
    apex42  
       2015-04-17 10:16:06 +08:00
    不知道你工作了几年了,算法数据结构这东西不搞清楚,会比较快得碰到天花板。
    linpf
        2
    linpf  
    OP
       2015-04-17 10:18:40 +08:00
    @apex42 还没毕业,现在大三
    zhuchong0329
        3
    zhuchong0329  
       2015-04-17 10:21:18 +08:00
    你可以解决80%的问题,但也只能做80%的程序员了。。
    况且作为一个公司的角度来看,当然希望自己招到的员工尽可能的是那20%,或者是将来有机会能够成为那20%了
    braineo
        4
    braineo  
       2015-04-17 10:22:40 +08:00
    能不能解决需要算法跟数据结构的那20%的问题

    决定了你是software engineer 还是 code monkey
    saki
        5
    saki  
       2015-04-17 10:23:22 +08:00   ❤️ 1
    只是作为工具的奴隶的话是不需要算法和数据结构的。
    当你觉得这个框架的xx特性怎么这么傻缺,想动手做个更好用的出来的时候,最后发现比原有的还傻缺=.=
    如你所说的去学“很多技术,框架,语言”其实并无必要,因为算法才是程序设计的核心。大部分语言只是将一种东西用不同方式表现出来而已,其本质都是为了解决一个实际问题,而 how to 才是重点,具体技术和框架也是基于物理世界的实际规则来实现的。
    dustinth
        6
    dustinth  
       2015-04-17 10:23:30 +08:00
    不用怕, 其他20%会有人帮你解决的.
    linpf
        7
    linpf  
    OP
       2015-04-17 10:24:07 +08:00
    @zhuchong0329
    @braineo
    但对我来说 学那些真的特别吃力。。
    canesten
        8
    canesten  
       2015-04-17 10:24:19 +08:00
    这种程序员的可替代性是100%
    不是只是80%
    liuchang0812
        9
    liuchang0812  
       2015-04-17 10:24:46 +08:00
    说白了,连数据结构这种难度的东西都学不会,还想怎样。
    fashioncj
        10
    fashioncj  
       2015-04-17 10:27:22 +08:00
    数据结构用到了会提高效率,其实很多数据结构其实你都在用,只是你不知道而已
    Ison
        11
    Ison  
       2015-04-17 10:29:25 +08:00
    其实嘛。。。
    术业有专攻
    如果你真觉得自己在算法跟数据结构方面很难深入的话
    你可以重其它方面做突破嘛
    何必呢。。。
    zhyu
        12
    zhyu  
       2015-04-17 10:30:54 +08:00 via iPhone   ❤️ 1
    程序=算法+数据结构
    linpf
        13
    linpf  
    OP
       2015-04-17 10:33:29 +08:00
    @saki 可能一个程序员的出发点就不一样吧。数学是我的弱点,对于现在的我来说,我把时间耗费在弥补弱点上,不如去把时间放在我擅长的地方,去多学一些别人的成果。就像@braineo 所说的,我适合做一个code monkey。但是努力成为一个good code monkey也不一定不好。
    @canesten @liuchang0812 不完全赞同你们的观点。算法和数据结构不能代表一切。
    zipher
        14
    zipher  
       2015-04-17 10:33:54 +08:00
    知其然 知其所以然
    想要理解框架为何优秀并很好的使用,需要理解他的算法以及数据结构
    kepenj
        15
    kepenj  
       2015-04-17 10:34:05 +08:00
    知其然,也要知其所以然。
    apex42
        16
    apex42  
       2015-04-17 10:36:24 +08:00
    @linpf 你对数据结构的看法有偏差,所有的项目都会用到。用堆栈还是队列、树还是链表、字符串的各种操作等等,这些都是数据结构的知识。还在大三,好好学下编译原理你就知道这些东西的作用,比你想象的大得多。
    linpf
        17
    linpf  
    OP
       2015-04-17 10:36:39 +08:00
    @zhyu 这个我是知道的,我说的是不擅长写出最优和复杂的算法和数据结构。
    @Ison 我也是这么想的。
    @zipher @kepenj 我感觉现在的水平还达不到那个层次。以后有机会的话,我会静下心来把优秀的框架代码给读一遍的。
    linpf
        18
    linpf  
    OP
       2015-04-17 10:38:27 +08:00
    @apex42 编译原理学过了,学过了等于没学。根本听不进去,感觉又麻烦又枯燥。我知道这样不好,但是求不喷,因为我打心里抵触这些东西。
    linescape
        19
    linescape  
       2015-04-17 10:41:51 +08:00
    用着python,php,js这些脚本语言的你来玩算法,不就是重复造轮子吗
    想研究算法 果断用C去吧
    ryd994
        20
    ryd994  
       2015-04-17 10:42:08 +08:00 via Android
    code monkey很短命啊,分分钟有一堆培训机构三个月速成出来的monkey来把你顶掉
    MForever78
        21
    MForever78  
       2015-04-17 10:43:56 +08:00
    是。
    ryd994
        22
    ryd994  
       2015-04-17 10:44:07 +08:00 via Android
    @linescape 大O区别很大的好吧
    如果人家写的O(logn),你写的O(a^n),换什么语言都是悲剧。
    dbfox
        23
    dbfox  
       2015-04-17 10:46:24 +08:00
    这些东西,总觉得没意思

    需要工作实践,具体解决了 xx 问题的时候,才觉得有意义

    平时去学,感觉不到有什么
    ryd994
        24
    ryd994  
       2015-04-17 10:46:33 +08:00 via Android
    @linpf 我觉得除开这些东西,编程就没什么好学的了(再往上要么是数学要么是管理)
    不学这些学什么?单纯语言的话3个月速成不难的
    bash99
        25
    bash99  
       2015-04-17 10:47:15 +08:00   ❤️ 1
    其实好的code monkey的需求就是
    1. 把讨论的逻辑(大部分是if else for)转化为代码
    2. 考虑到上述逻辑的边界条件,不出bug

    但是这个我觉得真心会被AI所替代,那样出路 就是往和人打交道的方向转,比如产品/项目,或者是领域知识。

    像我这类心里不算热爱和人打交道的,只好走另外的路了。
    linpf
        26
    linpf  
    OP
       2015-04-17 10:48:46 +08:00
    @ryd994 我就是不想研究算法。我喜欢做项目,做出来以后很有成就感。我觉得这是我鼓励我前进的动力之一。
    @linescape monkey也分高级monkey和低级monkey,就算不精通算法和数据结构,我懂的多,我的价值就高。我一个人顶3个人的时候,那我就不怕别人会来顶掉我。
    @MForever78 打击我。
    lion9527
        27
    lion9527  
       2015-04-17 10:48:53 +08:00
    现在觉得枯燥没意思很正常,大部分学生都很难对这些产生兴趣。
    主要原因还是项目做得少,代码量不够。觉得算法什么之类的没多大用途。
    现在大家跟你说这些很基础很重要也没用,因为你自身就没兴趣,学不进去,学了不用也会忘记。
    但是这些东西工作几年以后再补也是没问题的。只是相对在校基础打得牢的那些人,困难很多。
    rentaro
        28
    rentaro  
       2015-04-17 10:51:34 +08:00   ❤️ 2
    这个问题在各社区都能常见新手提问,道理说了无数遍,我每次想参与 GitHub 上那些出众的项目结果都卡在算法和协议上,正在恶补。还是那句话学不学是个人自由,如果有人喜欢一辈子写 PHP 搞网站不学算法也可以活下去。每个选择都会有不同的代价和后果,对我来说学习是生存之道,多学会提高自己的竞争力,如是而已。
    zhuchong0329
        29
    zhuchong0329  
       2015-04-17 10:55:32 +08:00   ❤️ 3
    @linpf
    是吗?那你一定没有找到好的学习方式,算法和数据结构是个很有趣的东西,动动脑子想想隐藏在问题后面的规律,继而掌握规律。
    尽管有一些问题刚接触需要花费一些的脑子,慢慢去弄懂,可是一旦你掌握了,那么你再回头去看,就会觉得一切是那么自然
    我们在换个角度来看,有一定的难度是肯定的,这样你一旦掌握了,别人追上你也一样要越过这个难度
    so,怕什么真理无穷,怕什么难度,进一寸有一寸的欢喜
    推荐你一本书《算法引论》相对简单有趣一些
    然后推荐你一个网站 http://www.51nod.com/ 一个有趣的做算法题的网站

    ps. 本文也是菜鸟一枚,楼主共勉之
    kifile
        30
    kifile  
       2015-04-17 10:58:17 +08:00
    校招会比较注重这一块吧,毕竟公司也不知道你的能力,如果正式工作了,应该会主要问工作相关的东西
    linpf
        31
    linpf  
    OP
       2015-04-17 10:58:18 +08:00
    @lion9527 我没觉得算法之类没多大用途,我深知其重要性。我现在就是感觉,我学那些东西十分吃力,我就像换个方向。我深度进不去,我走广度的道路。
    zipher
        32
    zipher  
       2015-04-17 10:59:37 +08:00   ❤️ 1
    @linpf 你觉得你目前做的项目用不到算法的时候
    请思考一下 在现有硬件环境下并发扩大十倍,你的项目会怎么样
    反复的摧残自己的工程,你就会发现算法和数据结构的价值
    cfm1989
        33
    cfm1989  
       2015-04-17 11:00:22 +08:00
    只能是一枚好程序猿,好码农
    lion9527
        34
    lion9527  
       2015-04-17 11:05:02 +08:00
    @linpf 你走广度的路线也没事,不过你还没毕业,校招基本上所有公司对于应届生都是考察算法之类的基础知识。深度不够的话很难进好的公司,在起跑线上就输了一段,后面想追回来就更困难。
    devon
        35
    devon  
       2015-04-17 11:05:38 +08:00
    不懂算法,码农都算不上。离开算法,还叫什么程序?
    ryd994
        36
    ryd994  
       2015-04-17 11:08:08 +08:00 via Android   ❤️ 1
    @linpf 问题是
    虽然别人比不上你高产,但是一进生产环境别人的代码不仅性能好消耗低还稳定,这时候老板怎么说?哪怕别人写的代码量不及你十分之一,但是别人写一行是一行,你重构十次还有bug,这个时候怎么比?
    程序员是智力密集型工作!程序员是智力密集型工作!程序员是智力密集型工作!因为很重要所以说三遍。不要以为程序跑通就算完了,也不要以为程序员的生产力是以代码量计算的。
    neilwong
        37
    neilwong  
       2015-04-17 11:08:22 +08:00
    会算法和数据结构,公司至少可以保证,这是一个系统学习过程序开发的人,能用程序员思维思考问题。要比一般的monkey靠谱很多。

    做过四年的网站工程师的一些分享:
    如果单纯用php框架开发普通网站的话,数据结构和算法如你所说,的确用到的地方非常少。完全不需要算法和数据结构也是ok的。

    不过以下对数据结构和算法要求就比较高了:
    1. 后端接口开发(排序,搜索,消息推送等等)
    2. 任何平台的游戏开发
    3. c++, java,swift 等编译性语言开发。


    如果楼主以后只是单纯的想用解释型语言开发网站的话,的确可以,不过现在时代发展这么快,移动互联网会往什么方向发展还不好说啊,基础打好了,以不变应万变才是明智的选择啊。
    young
        38
    young  
       2015-04-17 11:15:00 +08:00   ❤️ 6
    http://pan.baidu.com/s/1jGsxdwq 拿好, 晋升了不要忘记请客撸串
    ZHenJ
        39
    ZHenJ  
       2015-04-17 11:47:35 +08:00
    大厂招本科生,算法题是一个很方便的帅选工具。。。
    bullettrain1433
        40
    bullettrain1433  
       2015-04-17 11:52:36 +08:00
    @young 空的说
    mazingyu
        41
    mazingyu  
       2015-04-17 11:55:49 +08:00
    大三狗一枚+1,在学校里没怎么学 ACM 简直是硬伤,现在找工作各种问算法,真心受不鸟,其实有些题自己能想出自己的思路,但是因为没有训练过真心比不上那些搞过 ACM 的,代码的严谨性和可靠性以及在纸上写代码的可运行性,唉~数据结构肯定要学,但是我觉得学以致用的能力才是关键,平时用到的小算法在网上 copy 就行了,但是仔细想一想公司不是都有算法开发部门吗,面试还问基数排序冒泡排序二分查找干蛋用啊,用到的时候在网上一看就能明白写出来,非得搞到像应试教育似的,真心无语。--一枚没搞过 ACM 的找实习的大三狗的吐槽 =。=
    wizardforcel
        42
    wizardforcel  
       2015-04-17 11:56:34 +08:00 via Android   ❤️ 1
    其实你写朴素算法就好,没必要搞那么高大上,人家是看你是否能把自己思路表达出来,又不是竞赛非得优化到nlogn。

    比如说人家让你实现string.find,你非搞个kmp,结果没写出来,作死了。而另一个人,虽然用的是暴力搜索,但是他完整写出来了,你觉得哪个好呢。这是我的真实经历。
    wizardforcel
        43
    wizardforcel  
       2015-04-17 12:01:59 +08:00 via Android
    @ryd994 除非是那些np问题,也除非自己作死,否则任何一个程序员很难写成指数阶的。


    @ryd994 培训机构出来的只会复制粘贴代码,连什么叫高内聚低耦合都不知道,很难在软件工程的思维中取胜。
    young
        44
    young  
       2015-04-17 12:03:16 +08:00
    @bullettrain1433 嘛意思
    话说瞬间被保存了30+
    chengzhoukun
        45
    chengzhoukun  
       2015-04-17 12:04:22 +08:00
    @linescape python写算法题很常见吧
    wizardforcel
        46
    wizardforcel  
       2015-04-17 12:05:21 +08:00 via Android
    @mazingyu 主要是因为天朝人太多了,要靠这个筛选。国外的基本就是聊聊天,看项目经历,看背景什么的。让面试官考工程,没办法出试题考,而且不通过实际项目练手很难看出来一个人究竟怎么样,考语言又太low了。于是只能考算法。

    不过我见到的面试题里面,还有考os、组原和网络的,你觉得这个怎么样?
    chengzhoukun
        47
    chengzhoukun  
       2015-04-17 12:06:28 +08:00
    算法其实很有用的,比如计算机网络中p2p协议是怎么实现的,操作系统的任务调度是什么算法等等
    uleh
        48
    uleh  
       2015-04-17 12:15:02 +08:00
    程序=算法+数据结构
    mthli
        49
    mthli  
       2015-04-17 12:15:13 +08:00
    显然不是一个好程序员。

    前两天面了一个大厂的实习,一面就挂,其实我挺想吐槽的。很多技术上不如我的人可以拿到offer,但是你问他们一些常用的算法或数据结构,不知道;你问他们一些偏底层的东西,不知道。那么进了公司以后你觉得你是做码农呢,还是码农呢,还是码农呢?以上算我的吐槽吧。
    mthli
        50
    mthli  
       2015-04-17 12:18:33 +08:00
    @mazingyu 基数排序冒泡排序二分查找这种是心里面默念都会吧?而且人家一般是让你写出来看你的代码风格的,如果你连这些基础的算法都不会你让面试官怎么办?
    mthli
        51
    mthli  
       2015-04-17 12:22:15 +08:00
    @linescape 按照你的说法Java里都用泛型C++都用STL似乎也没有什么不可以。
    moe3000
        52
    moe3000  
       2015-04-17 12:29:06 +08:00
    好像就是码农和攻城师的区别
    linpf
        53
    linpf  
    OP
       2015-04-17 12:32:15 +08:00
    @ryd994 我没有说高产,我说的是可以做更多方面的任务。培训机构出来的,三个月可能就会java。公司让他写java可以,但是让他写前端,他就不会了是吧。
    @mazingyu 同感,但是真没办法。就像我说的,大浪淘沙。中国那么大,总有又擅长算法又擅长开发的。
    @wizardforcel 我现在就是遇到问题,如果有常用算法可以解决的,直接百度出来。没有常用算法的,就自己慢慢琢磨,大多情况下能够解决出来。唯一的问题就是在效率上。但是我想,我现在能经手的项目,估计都没必要考虑性能达到瓶颈的问题……哎。
    @mthli 有些整天刷ACM的人,虽然算法很厉害,但是他们没有项目经验,真的开始做点东西了,往往各种问题。这种人用起来真心不如我们这样的。你可以把他们安排到算法部门……
    bullettrain1433
        54
    bullettrain1433  
       2015-04-17 12:34:25 +08:00
    @young 不好意思,忘记关梯子了,梯子打开文件夹空的
    otakustay
        55
    otakustay  
       2015-04-17 12:35:43 +08:00   ❤️ 1
    我的感觉是不用记住算法实现,但至少要知道有XX算法能解决YY问题,且不限于大学学的那些基础算法
    otakustay
        56
    otakustay  
       2015-04-17 12:36:46 +08:00
    比如你不知道冠军树,那某天要你做前缀索引怎么办。你不知道平衡二叉树,哪天要你做查询性能优化怎么办
    mthli
        57
    mthli  
       2015-04-17 12:38:36 +08:00 via Android
    @linpf 其实ACM的人没你想象的那么糟糕的,你应该多认识一些(不要局限于你们学校),你就知道自己的差距了。不要在这种事情上给自己找理由。
    VirgilMing
        58
    VirgilMing  
       2015-04-17 12:40:30 +08:00
    楼主,你必须走出「我学那些东西十分吃力,我就想换个方向」这种显然是安于 comfort zone 不想出来的思维方式。

    楼上已经有很多老兵痛陈算法与数据结构的重要性,我没办法比他们说得更好。我们这一行,语言、框架层面以上的东西,你不可能永远靠搜索引擎。

    但我可以告诉你,你的思维方式有问题。如果真想做点事情,就必须对自己狠一点。
    mazingyu
        59
    mazingyu  
       2015-04-17 12:47:57 +08:00
    @mthli 嗯,懂了,先把这几个算法背过吧,毕竟要面试,说再多,总归还是要面对现实。
    ryd994
        60
    ryd994  
       2015-04-17 12:58:25 +08:00
    @wizardforcel 举个例子而已,不要纠结具体数字,高手O(logn)和普通O(n)这样的情况不少吧?性能能比么?
    又不会算法,又不会数据结构,从楼主的发言来看,也不会管理。那不就只剩CtrlCV的能力了么……
    至少在我看来脱开算法、数据结构和管理,剩下的完全可以速成。

    @linpf 比会的语言数量技术数量,你是比不过速成党的。或者说,如果你喜欢和别人比语言数量、技术数量的话,你已经成了速成党。你碰不到性能瓶颈,说句不好听的,那是因为PHP是世上最好的语言……(不过就算是这样,前一阵子还是有关于关闭gc大幅提升性能的帖子,底层的东西还是会碰到)。

    人年纪一大,学习新技术的能力就会大幅下降,而新的速成党是源源不断的。这时候你拿什么和年轻人比?所以code monkey死的快,因为总有年轻的monkey比你记性更好。
    但是对于算法,对于底层的了解,还有管理经验,这些是不会过时的。除非计算机大改结构,这些东西对于任何语言,技术,都是避不开的话题。

    @wizardforcel 说的过度优化,过度纠结大O,这个有时候是有的,而且事实上越是好程序员越会遇到这样的事。我的观点是:工作是工作,娱乐是娱乐。老板要赶进度那没办法。但是自己的GitHub就不能这样敷衍。锻炼好了,下次要用的时候就能用上。不能说因为学习成本高就一直逃避。
    mazingyu
        61
    mazingyu  
       2015-04-17 12:58:26 +08:00
    表示现在的困惑是想恶补一下 ACM ,但是我觉得可行性非常不靠谱,因为在学校中刷 ACM 是可以拿来比赛的,有一个目标在那里,可是都现在了,工作中基本用不到很深的算法,起码 ACM 那些古怪的各种算法题目用不到,根本没有学习的动力和价值,即使今天看懂了这个算法,明天又忘了,在工作中这个算法用到的概率几乎没有。工程师是成长起来的,是结合实践运用知识积累沉淀,那些优化项目的工作我觉得你也不会让一个实习生或者毕业生来做。所以我觉得大家把优化项目和规划整个项目作为实习生毕业生必须掌握各种数据结构以及设计模式的理由未免太有点扯淡了。你会让一个实习生去做一个商业项目的核心逻辑吗?去优化一个百万条数据查询吗?去规划一个项目的模块和设计模式吗?
    lbp0200
        62
    lbp0200  
       2015-04-17 13:17:26 +08:00
    这些公司考的算法都可以通过短时间的训练得到提高
    choury
        63
    choury  
       2015-04-17 13:33:26 +08:00 via Android
    @mazingyu 我刚毕业啊,我就在做百万以上数据处理的优化啊,面试面的就是算法和数据结构,这有什么问题吗?这些部门招人算法和数据结构是硬要求,“工作用不到算法”,那得看你干的是什么工作
    targz
        64
    targz  
       2015-04-17 13:36:18 +08:00
    个人觉得,这只是一种手段。相同情况下,你会选择懂算法的还是不懂算法的?这是最简单快速筛选人才的方法了吧?BTW,好好研究你喜欢研究的东西,拿出东西来了,或许,算法就没那么重要了。
    zhengkai
        65
    zhengkai  
       2015-04-17 13:56:00 +08:00   ❤️ 24
    现在整个产业已经高度专业化了,可很多人还抱着死脑筋,一定要觉得通才才牛逼。这样的人是不是觉得一个医生也应该包治百病,又能开颅手术又能做心脏搭桥、顺便还能治胰腺癌?

    首先你需要知道整个 IT 业的规模有多大,先从地球上有 20% 的网站是用 wordpress 搭的去了解吧,大部分人的工作跟算法没那么紧,这是事实

    而且越底层的东西越通用,比方说,你非常牛,写出来的 web server 能比 nginx 还牛么?一个普通人,只需要知道地球上性能最好的 web server 是 nginx,稍微调调参数就可以去用了

    还拿 nginx 做例子,你光是程序写的好就够了么?你说你的 web server 效率比 nginx 高 50%,又能怎样?我会用么?稳定性如何?如果我有各种奇怪的需求,可能 nginx 已经支持了,或者网上能搜到解决方案,你能保证在用你的软件时也能同样解决么?每个软件背后都有个庞大的社区来支持,你能保证你的软件不断有人给你提交 issue 或者代码来不断更新么?

    MySQL 的代码里必然包含了非常多的算法,正常人根本不需要到看源代码来了解,如果能熟读《高性能 MySQL》并明白写的都是什么意思,就可以说得上是精通了,也就是说“如何使用”跟“如何实现”是分开的。如果你是一个项目的主程,MySQL 只是项目中的一个组件而已,如果有 MySQL 解决不了的问题或者表现不佳,你不会去想着改 MySQL 代码,更有可能是换个别的方案,如果你不是 MySQL 的 committer 根本不会去想着改进算法。很多时候知其然就够了,没那么多精力去知所以然

    每个人的精力是有限的,比方说前几年我才意识到,人的阅读时间是有限的,就算一个月看一本书,50年也只能看600本而已,那就把目标定在600本,去想看哪600本,而不是去相信什么“看完一万本书,你的人生会有很大改变”

    你可以举例子,很多算法好的人没毕业就拿到 facebook offer 然后过年薪 $20万+生活,但是这起点本来就不一样好么?A 去了 facebook,B 去了某个小公司成天改 wordpress 模板,到底是因为 A 比 B 更聪明、更勤奋、更有天赋,还是因为两个人一样聪明勤奋有天赋、仅仅是因为 B 不够重视算法?

    什么东西都很有用,说一个项目从本质上是基于算法的,就像说一个宠物本质上是基于原子的一样,没什么意义,一个搞 IT 的最终达到什么样的高度,在于一个综合的努力,而不是懂很多算法就牛逼,不懂就是傻逼。精通算法的回报,是一个选择努力方向的问题,而不是放在那你要不要的问题。

    谁要跟我说,你多懂点算法你就牛逼了,我会告诉他,废话,我要再多懂点数学还能拿图灵奖呢,我要多点手腕还能当总统呢

    去想想自己擅长什么、优势是什么
    xiaowangge
        66
    xiaowangge  
       2015-04-17 13:56:11 +08:00
    只拿工资来举例(虽然很不“政治正确”) =. =

    游戏行业,认识一个有“经验”的程序员,工资算是很高了。数据结构、算法基本不会。 ;-)
    laoyur
        67
    laoyur  
       2015-04-17 14:06:15 +08:00
    支持65楼
    很多喷楼主的人说不定项目经验、算法和数据结构都比不上楼主
    xhacker
        68
    xhacker  
       2015-04-17 14:12:30 +08:00
    算法没什么用,真用到的时候再看即可。我不知道鼓吹算法有用的人在实际开发中被算法卡住过几次。
    binux
        69
    binux  
       2015-04-17 14:19:54 +08:00
    会算法不是说你能写出这些算法,而是理解它们。
    不然用 nignx 加个缓存,inode 超限都不知道。
    不然你看《高性能 MySQL》,脱离例子,该用什么索引都不知道。
    zhengkai
        70
    zhengkai  
       2015-04-17 14:25:15 +08:00
    @binux 你真的以为一个 ACM 拿过奖的人会认为“知道 Quicksort 是干什么用的”也算“懂算法”?

    你确认楼上那些人也跟你一个意思?
    nagato
        71
    nagato  
       2015-04-17 14:28:53 +08:00
    周围算法好的人貌似工资都比我高--
    az
        72
    az  
       2015-04-17 14:35:52 +08:00
    一般的网站用PHP基本不会碰到什么算法类的。什么难题,Google加上你的思考就行。好比晒车手,你管他车子是怎么做的,会开就行。
    binux
        73
    binux  
       2015-04-17 14:36:00 +08:00
    @zhengkai 你对『理解它们』的理解就是『知道是干什么用的』?
    vietor
        74
    vietor  
       2015-04-17 14:40:36 +08:00 via Android
    别拿别人定义的“他自己符合”的“所谓标准”,来要求自己。制定自己的标准吧。
    mazingyu
        75
    mazingyu  
       2015-04-17 14:43:34 +08:00
    @choury 不同的岗位要求不同吧
    zhengkai
        76
    zhengkai  
       2015-04-17 14:45:14 +08:00
    @binux 那你觉得会正确的设置 Covering Indexes 需要对算法理解到什么程度?连 Quicksort 是什么都不需要知道
    canautumn
        77
    canautumn  
       2015-04-17 14:46:49 +08:00
    不想搞算法不深入可以,但大学教的还是要会的。平时都用现成的库是不错,但稍微有点运算,至少要了解各类算法的复杂度吧。拿c++来说,举个最简单的例子,你要使用一个集合,是用set,还是unordered set,还是vector?不同的问题用不同的算法性能是完全不一样的。这类基本的东西都搞不清楚,数据量稍微大一点,那就不是优化不优化的问题,而是能用不能用的问题了。
    wangccddaa
        78
    wangccddaa  
       2015-04-17 15:18:21 +08:00
    @ZHenJ 哇,抓住一个使用五笔的~~哈哈
    johnsmith123
        79
    johnsmith123  
       2015-04-17 15:21:53 +08:00
    同支持65楼。来说一下我认识的人的校招的经历:
    没有一家大公司在笔试时不考算法的,而这些算法基本上就是网上常见的几大排序。而且必须要使用白纸写。
    而且这些公司面试的时候也会有所要求。
    那么问题来了。这些算法和他们以后的工作有多大的关系?
    一些人报的测试,甚至是运维,都需要白纸写快排,堆排,写出来了,就过,不管是笔试面试,没写出来,对不起滚蛋。还有那些开发面运维岗的我也是给那些公司跪了。
    和我一起找工作的一个人,一开始各种被刷,后来背了两个算法,当然他还是有些基础的,就进了某知名互联网公司。
    我想LZ说的应该是这些:
    我虽然不会用白纸写这些排序算法,但是我知道他们是O(1)的还是O(N)的,而且我认为我目前学到的东西至少要比这两个排序算法多N倍,但是大部分公司还是会让我白纸写算法,然后刷掉我,我不服。
    kyze8439690
        80
    kyze8439690  
       2015-04-17 15:25:01 +08:00
    我猜你读的是软件工程
    sandideas
        81
    sandideas  
       2015-04-17 15:32:43 +08:00 via Android   ❤️ 1
    因为算法看得出一个人的自学能力。
    能自学算法的,要么聪明,要么努力。
    哪个不是工作上要的
    johnsmith123
        82
    johnsmith123  
       2015-04-17 15:32:45 +08:00
    @binux inode和算法有什么关系?这个是文件系统的东西,而且你说的这个情况是个经验之谈。
    至于索引,我想你只需要知道其适用场景以及需求,再加上一些注意事项就好了,没有必要知道其实现细节,就算是知道了又怎么样?能源码优化mysql?就算能,你能比percona做得更好?
    binux
        83
    binux  
       2015-04-17 15:34:13 +08:00
    @zhengkai 需要知道哈希索引是 O(1) 的 平衡树是 O(logn) 的
    binux
        84
    binux  
       2015-04-17 15:41:50 +08:00
    @johnsmith123 如果 nginx 用的 hash 是不均匀的呢?你是否需要考虑,当站点集中的时候,会不会导致某个文件夹下 inode 超限。
    mthli
        85
    mthli  
       2015-04-17 15:49:28 +08:00 via Android
    @zhengkai 你说的看上去好像很有道理,然而你似乎在混淆问题,俗称一本正经地扯淡。举个简单的问题,一亿条url你是愿意花内存存一亿次,还是你自己来优化?
    ant_sz
        86
    ant_sz  
       2015-04-17 15:49:50 +08:00
    johnsmith123
        87
    johnsmith123  
       2015-04-17 15:56:36 +08:00
    @binux
    我就问一句:这些经验之谈和算法的具体实现有什么关系?你在使用nginx时会考虑到不均匀而导致inode不足吗?nginx缓存会使用多级目录,有可能会导致inode耗尽,这和它的缓存策略有关,而不是算法。再说,这些基本上都是出了问题之后的经验之谈。

    我就不吐槽文件夹下的inode超限这段了。
    yxzblue
        88
    yxzblue  
       2015-04-17 15:57:32 +08:00
    废话
    lijingyu68
        89
    lijingyu68  
       2015-04-17 16:10:00 +08:00
    在我看来,楼主无需犹豫你现在的选择,在足够量的项目实践之后可能会顿悟,然后研究数据结构、算法和设计模式等等,然后称为大神,如果一直没有顿悟,那也没什么关系。没有什么必须不必须的,行业经验有时候可能比单纯的技术方案更为重要,无需考虑很久以后的东西。
    lxrabbit
        90
    lxrabbit  
       2015-04-17 16:17:12 +08:00
    @xiaowangge 手游或者回合制端游可以这样,实时的,尤其是竞技/PVP为主的游戏,涉及底层的时候都要讲算法的
    isaced
        91
    isaced  
       2015-04-17 16:21:33 +08:00
    和楼主有同感,深知这方面欠缺,但我从不打算放弃学习算法、数据结构的提升。现在的软件开发很多东西都被抽象出来,开箱即用,真正能用上多复杂的数据结构或算法还是少数;但并不是说不学这些就行,有时候的确行,但是想要更上一层楼还是得钻。我觉得这也是一个方向的选择问题,是更精通原理、效率还是更丰富的经验和知识广度,也跟不同的应用场景有关。不能说哪一个更好,只要有着积极的心态去学习与进步就好。
    共勉!
    hustlzp
        92
    hustlzp  
       2015-04-17 16:21:34 +08:00
    顺其自然。

    对于我来说,主要是用技术去make something people want,然后过程中需要什么就去学什么就好。
    binux
        93
    binux  
       2015-04-17 16:23:57 +08:00
    @johnsmith123 会啊,就因为知道我知道是随机的,所以没问题啊。不然单文件夹下,文件数过多会不会有影响(不然 nginx 为什么要用多级目录)。后者是经验的话,前者是不是算法?
    binux
        94
    binux  
       2015-04-17 16:30:02 +08:00
    @johnsmith123 单文件夹下 inode 超限这个(这个提法有错),也和算法有关啊。你得知道,文件夹路径是怎么和 inode 对应的,如果一个文件夹下文件很多,会对性能有什么影响,是 O(n) 还是 O(1) 的。
    这个不是查一下说,哦是 O(1) (或者 O(n),我不清楚)。而是了解它用的什么算法,然后能判断出来。如果还有其他的坑呢?
    johnsmith123
        95
    johnsmith123  
       2015-04-17 16:50:14 +08:00
    @binux
    这个我认为是文件系统的内容吧。都是些概念性的东西,懂了装个X,不懂或者遇到问题的话Google一下就差不多了。
    而且这些都是系统调优方面的东西,这些的话,基本上就是改参数+测试,也许需要懂一些原理,但也是知道个大概就好。并没有说是"我给你个IDE或者白纸,你实现一个算法",而是“在这种情况下使用这种方法效率比较差,要使用另一种方法”。
    于是,这些内容我个人认为属于操作系统以及文件系统方面。并没有涉及到太多的算法问题。

    举个例子:
    大学的时候有人认为会手算微积分的高数就好。
    但是你把参数输入到matlab中的时候,会得到更精确的结果,而此时,你并不知道这是怎么算的,只需要知道这个函数在这种情况下可以使用就可以了。
    dddd
        96
    dddd  
       2015-04-17 16:52:09 +08:00
    笔试都过不了,比如……

    还有操作系统,计算机网络,数据库,数学方面的知识

    不信,去投几份简历,我也是大三
    binux
        97
    binux  
       2015-04-17 16:58:28 +08:00   ❤️ 1
    @johnsmith123 我觉得比起知道是什么,知道为什么是什么更重要。虽然很多时候网上存在『最佳实践』,但是知道为什么,能在某些场合意识到什么,然后再通过 google 和测试来确认,这个就是差距。
    至少我面试的时候,实现算法给你的都是非常容易的那种,目的在于实现,而不是算法。而通过算法来问,主要原因是,不需要查阅 API,能了解在稍微复杂逻辑下的表达能力。
    MarioLuisGarcia
        98
    MarioLuisGarcia  
       2015-04-17 17:06:02 +08:00
    一个奇怪的槽点,“元芳们,你们怎么看。” 这句话已经obsolete了。
    johnsmith123
        99
    johnsmith123  
       2015-04-17 17:11:29 +08:00
    @binux 这当然是差距,不过我个人看来,知道为什么这段没有必要到去徒手写算法的地步,以一个算法来说,知道这个算法的特点,适用场景,与同类算法相比较的优缺点,使用时可能出现的问题以及解决方法。我感觉,知道这些就够了。而不是具体的实现以及徒手。
    我鄙视的是那些,认为徒手写算法是筛选程序猿的好办法而刷人的人。以徒手写排序算法作为面试重要依据的人。
    mthli
        100
    mthli  
       2015-04-17 17:21:17 +08:00
    @johnsmith123 徒手写算法被刷这点我也有类似的经历。只能说和和公司没有缘分吧。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2761 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 13:01 · PVG 21:01 · LAX 05:01 · JFK 08:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.