快捷搜索:  汽车  科技

学算法怎么入门(十年程序员的感悟与算法之路)

学算法怎么入门(十年程序员的感悟与算法之路)张俊林:我大学本科读的是天津大学的管理学院,管理专业是个文理结合的学科,转入计算机和IT行业是很偶然的。我上大学的时候互联网还没有普及,当时计算机还没普及开,电脑还很贵,有电脑的家庭都是少数。大三的时候一个很偶然的机会参加计算机学院一位老师的讲座,我记得当时的主题是多媒体,那位老师演示了利用完全可视化的界面用计算机根据乐谱播放音乐,现在看这不算什么,可是当时大家很多人还在用DOS的年代,给我的感觉非常震撼,同时也很好奇这是怎么做到的,当时萌生了转行学计算机的念头,然后开始自学计算机专业的各种基础课程,并在大学期间考了程序员和高级程序员的证书,后来去了中科院软件所直接攻读博士学位,算是正式踏入了IT行业。现在回头看也很感慨,也许一个很偶然的选择对后面的人生走向会有巨大的改变,这也算是一种人生中的蝴蝶效应吧。CSDN:您是如何走上技术这条路的?CSDN:请简单介绍下您和目前所从事的工作。张俊林

【编者按】程序员的十年之后会怎样?恐怕很多的技术人在入行之初都曾信誓旦旦,不管是走上人生巅峰,还是单纯的对技术的热爱,坚持下去的又会有多少。本文采访的对象是大学时学习文科,后因兴趣转而征战技术圈的一名普通人——张俊林,他回顾了自己十年技术生涯,到初入职场、写书、算法学习、机器学习研究、大数据技术钻研……再到最后转型管理后的思考与感悟。小编也希望给那些正在前行的技术人员或发展遇到困惑的人以突破和提升,相信努力的力量。此外,对算法感兴趣的人不妨看下本篇采访,也会对你有所帮助。

以下为采访正文:

学算法怎么入门(十年程序员的感悟与算法之路)(1)

张俊林( 博客),畅捷通公共服务部总监,是技术书籍《这就是搜索引擎:核心技术详解》(该书荣获全国第十二届输出版优秀图书奖)的作者。在此之前,张俊林曾经在阿里巴巴搜索技术中心、百度商务搜索部凤巢广告平台以及新浪微博搜索部及数据系统部担任资深技术专家,新浪微博技术委员会成员,负责算法策略方向。他还曾是智能信息聚合网站“玩聚网”的联合创始人之一。他的研发兴趣集中在:搜索技术、推荐系统、社交挖掘、自然语言处理与大数据算法架构等方面,并在以上领域有多年工业界实践经验。

他本科毕业于天津大学管理学院,1999年至2004年在中科院软件所直接攻读博士学位,研究方向是信息检索理论与自然语言处理,就学期间曾在ACL/COLING/IJCNLP等国际顶级会议发表多篇学术论文,另外,他在此期间领导设计的搜索系统曾在美国国防部DARPA主持的TREC第二届高精度检索系统评测中在17支国际高水平研究团队激烈竞争中胜出,并取得综合排名第一名的优异成绩。

一个普通技术人的成长之路、学习之路、职场之路

CSDN:请简单介绍下您和目前所从事的工作。

张俊林:我目前在畅捷通做技术管理工作,畅捷通是用友的子公司,和很多直接面向最终用户的公司不同,主要是面向企业市场的,尤其是小微企业的财务管理领域。如今,畅捷通已经从传统的软件公司转型为“云 端”一体化的企业财务服务平台,我们既有自主知识产权的云平台,也有一些移动端产品,比如用于工作社交的应用“工作圈”、销售管理应用“客户管家”等,此外还有百万会计人员交流的社区“会计家园”。

目前我们除了为企业产品和服务社区提供常规的搜索、各种场景下的推荐等服务外,重心放在针对企业移动应用领域的创新性服务,比如如何让用户方便地用语音操控企业数据,例如,针对销售人员的客户管理应用,用户可以直接用语音问:北京东城区最近两个月开发了哪些新客户?再比如可以通过语音输入来进行会计账务做账等。除此外,我们还有针对企业大数据进行分析处理的团队以及为第三方独立开发者提供一些公共服务组件。

CSDN:您是如何走上技术这条路的?

张俊林:我大学本科读的是天津大学的管理学院,管理专业是个文理结合的学科,转入计算机和IT行业是很偶然的。我上大学的时候互联网还没有普及,当时计算机还没普及开,电脑还很贵,有电脑的家庭都是少数。大三的时候一个很偶然的机会参加计算机学院一位老师的讲座,我记得当时的主题是多媒体,那位老师演示了利用完全可视化的界面用计算机根据乐谱播放音乐,现在看这不算什么,可是当时大家很多人还在用DOS的年代,给我的感觉非常震撼,同时也很好奇这是怎么做到的,当时萌生了转行学计算机的念头,然后开始自学计算机专业的各种基础课程,并在大学期间考了程序员和高级程序员的证书,后来去了中科院软件所直接攻读博士学位,算是正式踏入了IT行业。现在回头看也很感慨,也许一个很偶然的选择对后面的人生走向会有巨大的改变,这也算是一种人生中的蝴蝶效应吧。

CSDN:您的职场经历非常丰富,可否简单总结下?以及技术人员换一份工作时需要考虑哪些?

张俊林:最初刚毕业的头几年在中科院做科研工作,后来和朋友一起出来创过业,做智能信息聚合网站玩聚网,之后进入阿里巴巴、新浪微博和百度等大型互联网企业从事研发工作,目前在畅捷通从事技术管理工作。每个类型的工作都各有特点,但不论在哪个公司,都从很多同事身上学到了不少终生受益的东西。

关于技术人员换工作这个问题我曾经深入思考过,当然也有对自己过去一些选择的反思。

  • 首先,我觉得换工作要慎重,尤其对于工作经验不多的年青人来说尤其要注意这一点。很多刚毕业没多久的年青人对工作环境存在不切实际的理想化的幻想,在现有公司稍微有些不如意就考虑跳槽,总幻想着下一个公司一定会怎样怎样,如果抱着这种想法那么一定会不断失望。应该意识到:这个世界上不存在各方面都能全方位让你感到满意的工作,不论是什么公司,必然存在这样那样的你所认为的问题,只要不突破你的原则和底线,遇到问题还是首先应该想办法沟通和解决,这也是一种成长,否则你现在碰到的不满意的地方换个公司依然会碰到类似的问题,那时怎么办?接着跳吗,这不现实,最终还是要面对问题解决问题。在一个公司就尽可能踏踏实实地尽自己所能把任务干好,甚至应该强迫自己, 如果干不出成绩就不跳槽,这是强迫自己适应你目前所不能适应的职场环境的有效方法
  • 如果考虑清楚了要换工作,一般人通常会考虑待遇职务等因素多一些,年青人刚开始进入职场其实不要过于看重这些,在差异不悬殊的前提下,最好把着眼点更多落在新岗位是否能够让自身快速成长,随着自身能力和经验的快速增长,物质方面的收获是水到渠成的,要相信一点:市场经济环境下,一个能够提供高价值服务的人,其自身价值是不会被长期低估的,这不符合经济学基本原理。换一个新环境时,有一些因素需要重点考虑,比如要跳槽的公司是否在所属领域里面是龙头公司,龙头公司和处于行业中下游的公司发展前景差异会很大;也要考虑公司处于什么发展阶段,最好选择所做内容符合行业发展趋势,所做业务处于蓬勃发展期的,这样的公司业务拓展快,对各种人才需求多,发展的机会比较多;另外,你所要进入的工作岗位所在部门对于公司的发展是否重要也很关键,避免要进入的部门在公司中处于边缘位置或者不太重要地位。还有,新的工作环境里是否有具备丰富行业经验的人传帮带也非常重要,老人的一句话也许新人要独立摸索很久才能体会,这种经验是很宝贵的,能让人少走不少弯路。当然,同时满足所有这些条件的工作岗位是很少的,所以这些因素也要根据个人情况,针对你更看重哪些来做些权衡取舍。

CSDN:当开发者成为技术主管之后,他们就必须在领导团队与继续进行技术工作之间找到某种平衡。您从技术人员走上管理的岗位,对自己的要求有了哪些变化?

张俊林:技术研发岗和技术管理岗位对人的要求有很大的不同侧重点。技术研发岗位相对更简单更纯粹一些,主要处理的是人和任务的关系,沟通对象主要是产品经理以及团队内部人员,可以把更多精力放在如何尽可能高质量完成手头任务上,其它相对次要。技术管理虽然最终目标也是高质量地完成任务,但是需要考虑的因素会更多样化一些,面临的各种场景也更复杂一些,比如要透彻理解公司的战略目标,要了解团队成员的个性与特长,合理地在团队间和团队成员间进行任务分配,在资源有限情况下分清事情的轻重缓急,项目进度的高效管理,如何凝聚团队的向心力等等,不一而足。技术管理对人的沟通能力以及和人打交道的能力要求会比纯技术岗位高很多,对人待人接物等情商方面的要求更高。技术能力强对于一个好的技术领导人来说当然是好事,但是这并不必然意味着技术能力强的人就能当好一个技术管理者,这对人的能力要求还是有很大差异。

CSDN:目前担任畅捷通公共服务部总监,能否谈谈您现在的研发团队规模和人员搭配?对于团队建设所关心的沟通、学习、激励还有文化培养方面,您有什么心得和体会可分享?

张俊林:目前我们部门三十多人,大多是研发和测试人员,在算法、大数据以及工程架构方面大约各占三分之一。

对于大多数技术人员来说,我感觉普遍有个值得引起注意的方面,就是过于技术化了。专注钻研技术是好事情,但是如果做过了,很容易导致更关注细节,看事情不够宏观和长远。我这方面做得也不是特别好,不过一直以来有这方面的警醒意识,能够有意识地进行改善,加上个人兴趣比较杂,所以对很多技术外的东西也有些关注,“它山之石,可以攻玉”,很多道理是相通而且是可以互相启发的。我觉得好的技术人员应该是“要技术但是不要太技术”,能潜心钻进去也能轻易钻出来。就这方面,工作中我会在各种场合分享下这方面的经验,我相信长远看这对一个技术人员将来的发展是有巨大好处的。

CSDN:一个企业的团队难免会面临人才流失和引进,在避免人才流失方面能否说下您的做法?在人才招聘的时候,怎么找到适合自己团队的人?

张俊林:技术人员很关心是否能在工作中学到新技术,所以我比较重视这一点,会定期安排不同部门间的技术分享以及专业技术培训,一方面能够增加同事间工作方面的相互了解,另一方面也能接触到很多新技术,提升自身技术素养;另外,我个人还比较重视激励机制的设计,期望通过合理的激励手段,鼓励认真踏实、积极主动、能力出众、工作成果突出的同事,在部门内形成“奖功戒过、奖勤罚懒”的工作氛围,如果真是优秀的人才,那么一定会在这种氛围中脱颖而出,这对于留住核心人才也是非常关键的。

招聘时面试过程对于找到合适的候选人非常关键,我个人比较倾向于招那些发自内心喜欢做技术的人,这种人通过一些面试方法是很容易识别出来的,对于这类人,即使是专业知识相对欠缺也不是大问题,经过适当的培养,他们往往会有大的发展潜力。

算法的应用与学习之道

CSDN:您对算法是怎样理解的?以及您认为算法有哪些应用领域?

张俊林:算法这个概念比较广了,我个人经验主要集中在人工智能相关的领域,所以就谈谈对这个领域算法方面的一些认识。我个人理解,如果说得通俗一点,算法本质上就是:

告诉机器让它们做一些人们知道该怎么做的一些事情。

听起来比较绕,这里面核心有两点,一点是机器代替人脑的部分判断和决策功能,要替人做事;另外一点是机器只能做人们已经知道怎么做的事情,如果人都不知道怎么做,那么你也不可能告诉机器如何做。第一点讲的是算法的作用;第二点是算法使用的限制。

有了上面两点,我们再来谈人工智能算法。首先,人工智能算法一定会在人们的日常生活起到越来越重要的作用,这点毫无疑问。这是基于上面说的第一点,机器要通过算法来替人做事。那为什么人工智能算法会越来越重要呢?根本原因是现实社会中产生的电子数据越来越多了,数据少的时候其实不需要算法,找个人处理下就行了,成本低效果还好,但是如果数据量大到一定程度的时候,可能一个简单的事情要1万个人处理一年,但是让机器去做,可能几毫秒就处理完了,明显成本低得多,这是算法为什么会越来越重要的一个简单的经济账。数据量急速变大这个事情是确定无疑的,尤其是UGC、智能手机等移动端的广泛普及,使得每个人在每时每刻都可能产生新的信息,这种数据增长是爆炸式的,未来的可穿戴设备物联网更不用说了,到时候将是每个物体每时每刻都会产生新的信息。这么大量的数据靠人处理可能吗?那是不可想象的,所以将来一定都要靠算法来处理如此大量的数据,也即是说,将来算法无处不在,有大量数据的地方就需要有算法。

但是,另一方面,人工智能算法还远未发展成熟,说是处于婴儿期也不算过分,目前能替人做的事情是非常非常有限的。这回到了上面谈及的算法的有限性这一点。语音识别发展了几十年,目前应该算是人工智能应用领域里面比较成熟效果也比较好的方向了,识别日常普通话效果还不错,但是涉及到某个领域或者带上方言,效果离让人满意还有很大的差距。拿自然语言处理来说,目前的技术水平想让机器真正理解人的语言还谈不上,其它领域我不熟不敢乱下结论,但是想来现状比NLP也不会好得太多。前一阵子霍金谈人工智能说怕人工智能威胁人类生存,这个很明显是他想多了,我相信最乐观的人工智能研发者也不会这么看。

CSDN:您在大数据领域有着较深的研究,能否简单介绍下大数据常用的算法?

张俊林:就通用的大数据常用的算法和数据结构来说,有不少技术在处理海量数据时是广泛使用的,比如布隆过滤器、跳表SkipList、LSM树等。布隆过滤器是判断海量数据集合中某条数据是否存在的利器,尤其是空间利用率相当高,能够用小内存处理大数据。跳表用于高效维护序列数据,使用场景也非常多,比如LevelDB维护内存数据时用的就是SkipList,再比如Redis的Sorted Set以及Lucene维护倒排索引都是用的它;LSM树是很多NoSQL系统的核心构件,比如BigTable、Cassandra、RAMCloud等,非常重要。《大数据日知录》里面第三章专门讲述了这些常用的算法与数据结构,有兴趣的同学可以参考。

至于智能信息处理领域,比如计算广告领域里广泛使用的逻辑回归、推荐系统里常用的矩阵分解算法、搜索引擎领域的LambdaMART等机器学习排序算法、DistBelief等分布式深度学习等都是非常广泛使用的常见算法。当然大数据处理重心放在如何用大量机器来构建高效的分布式算法上。感兴趣的同学可以参照《大数据日知录》里的第十六章,专门讲解了智能信息处理领域里常用的分布式算法。

CSDN:在这么多年的工作中您肯定使用了很多算法,再结合目前的工作,您感觉哪些算法比较重要?他们各有什么优势和劣势。

张俊林:就自然语言处理(NLP)领域来说,在2013年之前,最主流的算法包括隐马尔科夫模型、最大熵模型、CRF(条件随机场)模型,其中隐马尔科夫模型和最大熵模型是相对早期的模型,总体而言效果不如CRF模型效果好,CRF作为改进模型,是在NLP各个子应用领域使用最广泛、效果最好的state-of-art算法,基本上是NLP领域必须熟练掌握和应用的方法。

最近几年随着深度学习技术突飞猛进的发展,越来越多的研究和应用开始使用深度学习来处理NLP问题。从最近两年的研究进展来看,CNN(卷积神经网络)、RNN和及RNN的改进模型LSTM很可能会成为将来NLP领域最主流的方法,起到类似过去CRF在NLP领域中的作用。CNN和RNN能够很好地融合更多历史信息来解决当前的问题,这是传统统计方法很不容易做好的地方,再加上word embedding能够直接将语义编码,而且解决了传统NLP中的数据稀疏问题。综合来看,我个人对于深度学习在NLP方面的应用抱非常乐观的态度。

对于新入NLP这行或者想进入但是还没有进入的人来说,深度学习是个非常好的礼物。我觉得传统的方法如果有精力的话可以看看,没精力的话不看也完全没问题,只要深入了解下word embedding、经典三层神经网络、CNN/RNN/LSTM这些模型应该基本就站到NLP领域研究最前沿了。目前的现状是,无论对于有经验的还是没经验的NLP从业者来说,大家其实是站在深度学习这同一条起跑线上。

CSDN:如果想从事算法方面的工作,能够推荐一些有效的学习方法?以及结合多年工作,可否推荐一些工具或学习库。

张俊林:我觉得对于这个行业的新人来说,首先,要把机器学习的基础打牢,最好是找些口碑好的教材系统地学一下,比如Bishop 的Pattern Recognition And Machine Learning。NLP也好、推荐也好或者搜索技术,尽管看上去是很不同的方向,但是如果深究,其共同的内核还是机器学习,不同的领域无非是结合领域特性选择更合适的具体机器学习方法,但万变不离其宗,机器学习基础打好了对于快速掌握一个具体领域有很大的帮助作用,这是一个磨刀和砍柴的关系。

另外,如果新进入一个不太熟悉的领域,建议先找些领域综述看看,首先通过综述建立对这个领域要解决的关键问题、技术是如何进化的、技术发展现状和未来可能的发展方向有一个全局的认识,然后再深究自己更关心的某个较窄领域的具体问题。先见森林,再看树木,这样不容易迷路,否则反过来做的话,很容易搞了很久还是一头雾水的感觉。

最近两年我比较关注深度学习在NLP等领域的应用,感觉Theano和Torch框架对于常规的机器学习和深度学习研发来说是很好用的工具,尤其是Torch,值得花精力学习了解应用。

著书感悟和技术的人文关怀

CSDN:在去年您出版了《大数据日知录: 架构与算法》,据说耗时了三年才完成?其中有什么让你难忘或有趣的事情?

张俊林:这本书从有写书的念头,到准备收集理解相关技术资料,分析开源系统源码,在实践中具体使用相关技术,再到实际动手写,确实花了大约三年时间。主要有三方面因素:

  • 首先,大数据是个新概念新学科,很不成熟,在几年前,大数据到底包含哪些具体的技术点,其实并没有公认的说法,所以对其进行脉络梳理是很花费时间和精力的;
  • 其次,大数据本身包含的具体技术点非常之多,从数据到架构,从系统到算法,方方面面无所不包,要全面深入理解这些知识也是非常耗费精力的;
  • 再者,从我写书的初衷来说,还是期望自己写的东西能够成为精品,尽可能做得专业些,再加上只能利用空余时间来写,所以进度很慢。

大数据领域方兴未艾,其实很多方面的理论基础是比较薄弱的,写书的过程也是一个知识脉络梳理的过程,通过不断的分析、归纳和总结,能够渐渐领悟到相似系统的一些共有特性。大数据这块几乎每天都有新系统冒出来,有时候看到一个新出的系统,就先想想这个系统的整体架构大致会是什么样子,里面关键的技术点会采取什么解决方案,然后再看相关的文档,你会发现很多情况下能够猜得很准,因为很多基础的理念和思路其实是贯通普适的,这个时刻还是挺兴奋的,也许这就是技术人员能从技术本身获得的一种快乐吧。

CSDN:书中的每一章节前都有一段您摘录的歌词或诗,让我有一种技术之中的人文关怀的感觉,很暖心,能说说你这样做的原因吗?

张俊林:这可能跟个人兴趣有关。我个人平常喜欢听歌,尤其喜欢那些歌词写得非常精彩的歌曲,对不少歌的歌词很熟,很多歌词能背下来。在写大数据这本书时,构思章节内容安排有时会很自然地联想到某些歌词,比如大数据要通过分布式存储来处理海量数据,这时候面临数据分片的问题,就是把非常巨量的数据切割成若干相对小的数据,单机环境下本来存储在一起的数据在这种场景下会被分开放到不同的机器上,如果把一条条数据想象成一个个红尘男女的话,这和恋人之间的“异地恋”很相像:本来深深相爱的两位恋人,由于世事沧桑、环境变化,不得不分居两地,有些甚至阴阳分隔,其间自有苦乐。这场景很容易联想到《似是故人来》:“同是过路, 同做过梦,本应是一对;人在少年, 梦中不觉,醒后要归去。”其实每章开头的歌词和书中内容都有与这个例子类似的照应关系,当然这有点隐晦,大多数人不会注意也不会关心,所以归根结底这算是个人趣味吧。

CSDN:您还有其他的技术书籍,如本次采访开头介绍中的《这就是搜索引擎:核心技术详解》,您是如何在繁忙的工作抽出时间写书的?以及对于一个技术人员的时间管理,你有什么心得和体会可分享?

张俊林:写书这事情说到底是私事,所以只能利用业余时间来写,在写这两本书的期间,加起来大约横跨了比较连续的5年时间。写书是个很辛苦的事情,起码比我没动手前想象中要苦得多,业余时间基本完全投入到这件事情上,周六日、节假日自不必说,加班不严重的工作日里,早晨四点多起床动手写一节也是家常便饭。所以说到底是用空余时间堆出来的。

就写书这件事情来谈时间管理的话,我体会最深的是:如果在持续的一阵时间里面保持专注,坚持把主要精力投入去做一件事情,那么我相信最终的产出很可能会超出自己最初对这件事的期望。其实我写书其中一个目的也是通过写书这个具体的任务强迫自己专注起来,把业余时间利用好。我个人兴趣比较杂,很容易把时间花在各种不同的事情上, 同样是两年的业余时间,投入到一件事上的产出可能会明显优于分散精力的结果

CSDN:您感兴趣的技术方向非常广,包括搜索技术、推荐系统、社交挖掘、自然语言处理与大数据算法架构等方面,您对新技术是抱以一个怎样的态度?又是如何学习新技术的?

张俊林:从读书开始到后来10多年的工作,确实接触了很多不同的方向。对于计算机行业的技术人员来说,技术的快速变化是个常态,每年都会有很多新技术涌现出来,我觉得能够快速适应技术变化以及快速的学习能力是对IT从业人员的一个基本要求,如果一个人很被动地学习新东西可能会感觉越来越累,被行业淘汰只是时间问题,但是如果真心热爱这个行业,具有好奇心,可能学习的乐趣要大过其间的辛苦。所以如果有建议的话,我建议技术人员能够找到一个你真正感兴趣的方向钻下去,这是持续推动自己不断学习的最好方法。如果每天感觉很辛苦,建议换个方向试试看。

另外一点,面对五花八门的新技术,到底应该学哪些舍弃哪些?所有新技术都去学是不可能的,人的精力毕竟有限。除了上面说的首先对这个方向要有兴趣,除此外,在这方面我也可以给另外一个建议: 首先判断下技术发展趋势和潮流,找到未来5到10年的技术发展趋势,然后选择能够满足这个发展趋势的具体技术方向,之后深入下去。很多新技术生命周期很短,可能你刚学会这个技术就被淘汰了,学习这种技术对自身发展没什么好处,徒费精力而已。

至于学习新技术的方法,归纳起来无非是理论加实践。选好方向后,阅读网上相关的好的技术博客,追踪最近的论文,尽快让自己对这个方向有个全局的综合的认识。然后最好能实际动手做些相关的项目,这对技术细节的深入理解非常有帮助。

CSDN:您是什么时候接触CSDN的?它对您学习和工作都带来哪些影响?同时,对CSDN有什么建议?

张俊林:我在CSDN成立非常早期就开始使用了,读研期间就经常上CSDN找一些学习和参考资料,2004年在CSDN开了技术博客,分享一些技术方面的经验与看法。应该说CSDN是陪伴我一路来技术成长的好帮手,很多时候如果遇到不好解决的具体技术问题都会到CSDN找些参考资料,大多数时候都能找到满意的答案。另外,通过CSDN平台也结交了一些志同道合搞技术的朋友。CSDN对于技术人员来说是个好的技术学习平台与问题解决平台,也希望你们能够越办越好。

如果有什么建议的话,我觉得在CSDN上解决具体技术问题是非常方便的,但是对于人工智能这种领域性较强的学科,参考资料相对少了些,期望在这块也能看到更多更高质量的信息。

若想获悉技术人张俊林更多动态,请关注:

CSDN博客: 新浪微博:

(责编/ 钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,交流探讨可加微信qshuguang2008,备注姓名 公司 职位)

值得一提的是,由CSDN举办的 SDCC 2015中国软件开发者嘉年华将于11月19-21日在北京举行,本次大会涵盖:新型数据库、编程语言、工具与平台、产品与设计、前端开发、算法、微信开发、架构实践、安全等九大分 论坛,届时国外知名讲师将分享所在领域的最佳实践。

学算法怎么入门(十年程序员的感悟与算法之路)(2)

猜您喜欢: