转
原文链接:http://lucida.me/blog/on-learning-algorithms/
原文链接:http://lucida.me/blog/on-learning-algorithms/
严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的。
第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本科最重要的课程就被傻逼的我直接忽略过去了。
直到大三我才反应过来以后还要找工作——而且大二的折腾证明了我并没有什么商业才能,以后还是得靠码代码混饭吃,我当时惊恐的发现自己对编程序几乎一无所知,于是我给自己制订了一个类似于建国初期五年计划的读书成长计划,其中包括C语言基础、数据结构以及计算机网络等方面的书籍。
读书计划的第一步是选择书籍,我曾向当时我觉得很牛的”学长”和”大神”请教应该读哪些算法书籍,”学长”们均推荐算法导论,还有几个”大神”推荐计算机程序设计艺术(现在我疑心他们是否翻过这些书),草草的翻了下这两本书发现实在看不懂,但幸运的是我在无意中发现了豆瓣这个神奇的网站,里面有很多质量不错的书评,于是我就把评价很高而且看上去不那么吓人的计算机书籍都买了下来——事实证明豆瓣要比这些”学长”或是”大神”靠谱的多得多。
数据结构与算法分析——C语言描述是我学习数据结构的第一本书:当时有很多地方看不懂,于是做记号反复看;代码看不明白,于是抄到本子上反复研读;一些算法想不通,就把它所有的中间状态全画出来然后反复推演。事实证明尽管这种学习方法看起来傻逼而且效率很低,但对于当时同样傻逼的我却效果不错——傻人用傻办法嘛,而且这本书的课后题大多都是经典的面试题目,以至于日后我看到编程之美的第一反应就是这货的题目不全是抄别人的么。
至今记得,这本书为了说明算法是多么重要,在开篇就拿最大子序列和作为例子,一路把复杂度从O(N3)杀到O(N2)再到O(NlgN)最后到O(N),当时内心真的是景仰之情=如滔滔江水连绵不绝,尼玛为何可以这么屌,
此外,我当时还把这本书里图算法之前的数据结构全手打了一遍,后来找实习还颇为自得的把这件事放到简历里,现在想想真是傻逼无极限。
凭借这个读书成长计划中学到的知识,我总算比较顺利的找到了一份实习工作,这是后话。
我的实习并没有用到什么算法(现在看来就是不停的堆砌已有的API,编写一堆自己都不知道对不对的代码而已),在发现身边的人工作了几年却还在和我做同样的事情之后,我开始越来越不安。尽管当时我对自己没什么规划,但我清楚这绝壁不是我想做的工作。
在这个摇摆不定的时刻,微软的梦工场成了压倒骆驼的最后一支稻草,这本书对微软亚洲研究院的描写让我下定了”找工作就要这样的公司”的决心,然而我又悲观的发现无论是以我当时的能力还是文凭,都无法达到微软亚研院的要求,矛盾之下,我彻底推翻了自己”毕业就工作”的想法,辞掉实习,准备考研。
考研的细节无需赘述,但至今仍清楚的记得自己在复试时惊奇且激动的发现北航宿舍对面就是微软西格玛大厦,那种离理想又进了一步的感觉简直爽到爆。
我的研究生生涯绝对是一个反面典型——翘课,实习,写水论文,做水研究,但有一点我颇为自得——从头到尾认真听了韩军教授的算法设计与分析课程。
韩军给我印象最深的有两点:课堂休息时跑到外面和几个学生借火抽烟;讲解算法时的犀利和毫不含糊。
尽管韩军从来没有主动提及,但我敢肯定算法设计与分析基础就是他算法课程事实上的(de-facto)教材,因为他的课程结构几乎和这本书的组织结构一模一样。
如果数据结构与算法分析——C语言描述是我的数据结构启蒙,那么韩军的课程和算法设计与分析基础就是我的算法启蒙,结合课程和书籍,我一一理解并掌握了复杂度分析、分治、减治、变治、动态规划和回溯这些简单但强大的算法工具。
算法引论是我这时无意中读到的另一本算法书,和普通的算法书不同,这本书从创造性的角度出发——如果说算法导论讲的是有哪些算法,那么算法引论讲的就是如何创造算法。结合前面的算法设计与分析基础,这本书把我能解决的算法问题数量扩大了一个数量级。
之后,在机缘巧合下,我进入微软亚洲工程院实习,离理想又近了一步,自我感觉无限牛逼。
width="789" height="90" id="aswift_1" scrolling="no" vspace="0" hspace="0" allowfullscreen="true">
在微软工程院的实习是我研究生阶段的一个非常非常非常重要的转折点:
这里就不说1和3了(和本文题目不搭边),重点说说2。
由于当时组内没有特别多的项目,我负责的那一小块又提前搞定了,mentor便很慷慨的扔给我一个Kinect和一部Windows Phone让我研究,研究嘛,自然就没有什么deadline,于是我就很鸡贼的把时间三七开:七分倒腾Windows Phone,三分看书&经典论文。
然而一件事打断了这段安逸的生活——
基友在人人发百度实习内推贴,当时自我感觉牛逼闪闪放光芒,于是就抱着看看国内IT环境+虐虐面试官的变态心理投了简历,结果在第一面就自己的师兄爆出翔:他让我写一个stof
(字符串转浮点数),我磨磨唧唧半天也没写出完整实现,之后回到宿舍赶快写了一个版本发到师兄的邮箱,结果对方压根没鸟我。
这件事对我产生了很大的震动——
痛定思痛,我开始了第二个”五年计划”,三七开的时间分配变成了七三开:七分看书,三分WP。而这一阶段的重点从原理(Principle)变成了实现(Implementation)——Talk is cheap, show me the code.
由于一直觉得名字里带”Elements of”的都是酷炫叼炸天的书,所以我几乎是毫不犹豫的买了这本Elements of Programming(中译本:编程原本),事实上这本书里的代码(或者说STL的代码)确实是:快,狠,准,古龙高手三要素全齐。
百度面试被爆出翔的经历让我意识到另一个问题,绝大多数公司面试时都需要在纸上写C代码,而我自己却很少用C(多数情况用C#),考虑到自己还没牛逼到能让公司改变面试流程的地步,我需要提升自己编写C代码的能力(哪怕只是为了面试)。一顿Google之后,我锁定了C Interfaces and Implementation——另一本关于如何写出狂炫酷帅叼炸天的C代码的奇书,这里套用下Amazon的评论:Probably the best advanced C book in existance。
严格来说上面两本书都不是传统的算法书,因为它们侧重的都不是算法,而是经典算法的具体实现(Implementation),然而这正是我所需要的:因为算法的原理我能说明白,但要给出优雅正确简练的实现我就傻逼了,哪怕是stof
这种简单到爆的”算法”。
依然是以前的傻逼学习方法:反复研读+一遍又一遍的把代码抄写到本子上,艰难的完成了这两本书后,又读了相当数量的编程实践(Programming Practice)书籍,自我感觉编程能力又大幅提升,此外获得新技能——纸上编码。这也成为了我之后找工作面试的三板斧之一。
说老实话,自从本科实习之后,我就一直觉得算法除了面试时能用用,其它基本用不上,甚至还写了一篇当时颇为自得现在读起来极为傻逼的文章来黑那些动不动就”基础”或”内功”的所谓”大牛”们,这里摘取一段现在看起来很傻逼但当时却觉得是真理的文字:
所以那些动则就扯什么算法啊基础啊内功啊所谓的大牛们,请闭上你的嘴,条条大道通罗马。算法并不是编程的前提条件,数学也不会阻碍一个人成为优秀的程序员。至少在我看来,什么算法基础内功都是唬人的玩意,多编点能用的实用的程序才是王道,当然如果你是一个pure theorist的话就当我什么都没说好了。
然而有意思的是,写了这篇文章没多久,鼓吹算法无用论的我自己做的几个大大小小的项目全部用到了算法——我疑心是上天在有意抽我的脸。
我在微软实习的第一个项目做的是代码覆盖率分析——计算T-SQL存储过程的代码覆盖率。
简单的看了下SQL Server相关的文档,我很快发现SQL Reporting Service可以记录T-SQL的执行语句及行号,于是行覆盖(line coverage)搞定,但老大说行覆盖太naive,我们需要更实际的块覆盖(block coverage)。
阅读了块覆盖的定义后,我发现我需要对T-SQL进行语法分析,在没有找到一个好用的T-SQL Parser的情况下,只能自己动手搞一个:
比较奇诡的是,做这个项目时当时我刚好把ANTLR作者的Language Implementation Patterns(中译本:编程语言实现模式)看了一半,什么LL(k)啊Packrat啊AST Walker的概念啊正热乎着呢。
于是,自己自己就照着T-SQL的官方EBNF,三下五除二撸了一个T-SQL存储过程的LL(k) Parser,把代码转换成AST,然后用一个External AST Walker生成代码块覆盖的HTML报表,全部过程一周不到。
老大自然是很满意——我疑心他的原计划是花两三个月来完成这个项目,因为这个项目之后的两个月我都没什么活干,天天悠哉游哉。
拼音索引是我接的一个手机应用私活里的小模块,用户期待在手机文本框可以根据输入给出智能提示:
比如说输入中国:
同样,输入拼音也应给出提示:
中文匹配这个简单,但拼音匹配就得花时间想想了——懒得造轮子的我第一时间找到了微软的拼音库,但接下来我就发现微软这个鸟库在手机上跑不动,研究了下发现WP7对Dictionary的items数量有限制,貌似是7000还是8000个item就会崩盘,而标准汉字则有两万多个,尼玛。
痛骂MS坑爹+汉字坑爹之余,还是得自己撸一个库出来:
Int16
索引了汉字所有的拼音(貌似500多个)。Int64
建立汉字和拼音的关联——汉字有多音字,所以需要把多个拼音pack到一个Int64
里,这个简单,位操作就搞定。用户很happy——因为我捎带把他没想到的多音字都搞定了,而且流畅的一逼。
我也很happy,因为没想到自己写的库居然比MS的还要快几十倍,同时小十几倍。
从这个事情之后我变得特别理解那些造轮子的人——你要想想,如果你需要一个飞机轮子但市场上只有自行车轮子而且老板还催着你交工,你能怎么搞。
前面提到在微软实习时老大扔给我一个Windows Phone让我研究下,我当时玩了玩就觉着不太对劲,找联系人太麻烦。
比如说找”张晓明”,WP只支持定位到Z分类下——这意味着我需要在Z分类下的七十多个联系人(姓张的姓赵的姓钟的等等)里面线性寻找,每次我都需要滑动四五秒才能找到这个张姓少年。
这TMD也太傻逼了,本屌三年前的老破NOKIA都支持首字母定位,996->ZXM->张晓明,直接搞定,尼玛一个新时代Windows Phone居然会弱到这个程度。
搜了一下发现没有好用的拨号程序,于是本屌就直接撸了一个支持首字母匹配的拨号程序出来扔到WP论坛里。
结果马上就有各种问题出现——最主要的反映是速度太慢,一些用户甚至反馈按键有时要半秒才有反应。本屌问了下他的通讯录大小:大概3000多人。
吐槽怎么会有这么奇葩的通讯录之余,我意识到自己的字符串匹配算法存在严重的性能问题:读取所有人的姓名计算出拼音,然后一个个的匹配——结果如果联系人数量太多的话,速度必然拙计。
于是我就开始苦思冥想有没有一个能够同时搜索多个字符串的高端算法,以至于那两天坐地铁都在嘟囔怎么才能把这个应用搞的快一些。
最终还是在Algorithms on Strings, Trees and Sequences里找到了答案——确实有能够同时搜索多个字符串的方法:Tries,而且这本书还用足足一章来讲怎么弄Multiple string comparison,看得我当时高潮迭起,直呼过瘾。
具体细节不多说,总之换了算法之后,匹配速度快了大约九十多倍,而且代码还短了几十行。哪怕是有10000个联系人,也能在0.1秒内搞定,速度瓶颈就这样愉快的被算法搞定。
之后又做了若干个项目,多多少少都用到了”自制”的算法或数据结构,最奇诡的一次是写一个电子书阅读器里的分页,我照着模拟退火(Simulated Annealing)的原理写了一个快速分页算法,事实上这个算法确实很快——但问题是我都不知道为啥它会这么快。
总之,算法是一种将有限计算资源发挥到极致的武器,当计算资源很富余时算法确实没大用,但一旦到了效率瓶颈算法绝壁是开山第一刀(因为算法不要钱嘛!要不还得换CPU买SSD升级RAM,肉疼啊!!)。一些人会认为这种说法是有问题,因为编写新算法的人力成本有时比增加硬件的成本还要高——但别忘了增加硬件提升效率也是建立在算法是Scalable的基础上——说白了还是得撸算法。
说到优化这里顺带提一下Writing Efficient Programs——很难找到一本讲代码优化的书(我疑心是自从Knuth说了过早优化是万恶之源之后没人敢写,万恶之源嘛,写它干毛),注意这本书讲的是代码优化——在不改变架构、算法以及硬件的前提之下进行的优化。尽管书中的一些诸如变量复用或是循环展开的trick已经过时,但总体仍不失为一本好书。
实习实习着就到了研二暑假,接下来就是求职季。
求职季时我有一种莫名的复仇感——尼玛之前百度实习面试老子被你们黑的漫天飞翔,这回求职老子要把你们一个个黑回来,尼玛。
现在回想当时的心理实属傻逼+幼稚,但这种黑暗心理也起了一定的积极作用:我丝毫不敢有任何怠慢,以至于在5月份底我就开始准备求职笔试面试,比身边的同学早了两个月不止。
我没有像身边的同学那般刷题——而是继续看书抄代码学算法,因为我认为那些难得离谱的题面试官也不会问——事实上也是如此。
因为很多Coding Interview的论坛都提到这本红皮书,我也跟风搞了一本。事实证明,仅仅是关于Backtrack Template那部分的描述就足以值回书价,更不用说它的Heuristics和课后题。
这两本书就不用多介绍,编程珠玑和更多的编程珠玑,没听说过这两本书请自行面壁。前者偏算法理论,后者偏算法轶事,前者提升能力,后者增长谈资,都值得一读。
读到编程珠玑里面关于Binary Search的正确性证明时我大呼过瘾,原来程序的正确性也是可以推导的,然后我就在那一章的引用里发现David Gries的The Science of Programming。看名字就觉得很厉害,直接搞了一本开撸。
不愧为编程珠玑引用的书籍,撸完The Science of Programming之后,本屌获得了证明简单代码段的正确性这个技能——求职面试三板斧之二。
证明简单代码段的正确性是一个很神奇的技能——因为面试时大多数公司都会要求在纸上写一段代码,然后面试官检查这段代码,如果你能够自己证明自己写的代码是正确的,面试官还能挑剔什么呢?
之后就是各种面试,详情见之前的博客,总之就是项目经历、纸上代码加正确性证明这三板斧,摧枯拉朽。
求职毕业季之后就是各种Happy,Happy过后本屌发现即将面临另一个问题:算法能力不足。
因为据说以后的同事大多是ACM选手,而本屌从来没搞过算法竞赛,而且知道的算法和数据结构都极为基础:像那些元胞自动机、斐波那契堆或是线段树这些高端数据结构压根只是能把它们的英文名称拼写出来,连用都没用过,所以心理忐忑的一逼。
为了不至于到时入职被鄙视的太惨烈,加上自己一贯的算法自卑症,本屌强制自己再次学习算法:
算法(第四版)是我重温算法的第一本书,尽管它实际就是一本数据结构的入门书,但它确实适合当时已经快把算法忘光的本屌——不为学习,只为重温。
这本书最大的亮点在于它把Visualization和Formatting做到了极致——也许它不是最好的数据结构入门书,但它绝壁是我读过的排版最好的书,阅读体验爽的一逼;当然这本书的内容也不错,尤其是红黑树那一部分,我想不会有什么书会比此书讲的更明白。
Advanced Data Structures是MIT的高级数据结构教程,为什么会找到这个教程呢?因为GoogleAdvanced Data Structures第一个出来的就是这货。
这门课包含各种让本屌世界观崩坏的奇诡数据结构和算法,它们包括但不限于:
总之高潮迭起,分分高能,唯一的不足就是没有把它们实现一圈。以后本屌一定找时间把它们一个个撸一遍。
从接触算法到现在,大概七年:初学时推崇算法牛逼论,实习后鼓吹算法无用论,读研后再被现实打回算法牛逼论。
怎么这么像辩证法里的肯定到否定再到否定之否定。
现在来看,相当数量的鼓吹算法牛逼论的人其实不懂算法的重要性——如果你连用算法解决实际问题的经历都没有,那你如何可以证明算法很有用?而绝大多数鼓吹算法无用论的人不过是低水平码农的无病呻吟——他们从未碰到过需要用算法解决的难题,自然不知道算法有多重要。
Peter Norvig曾经写过一篇非常精彩的SICP书评,我认为这里把SICP换成算法依然适用:
To use an analogy, if algorithms were about automobiles, it would be for the person who wants to know how cars work, how they are built, and how one might design fuel-efficient, safe, reliable vehicles for the 21st century. The people who hate algorithms are the ones who just want to know how to drive their car on the highway, just like everyone else.
MIT教授Erik Demaine则更为直接:
If you want to become a good programmer, you can spend 10 years programming, or spend 2 years programming and learning algorithms.
总而言之,如果你想成为一个码农或是熟练工(Code Monkey),你大可以不学算法,因为算法对你确实没有用;但如果你想成为一个优秀的开发者(Developer),扎实的算法必不可少,因为你会不断的掉进一些只能借助算法才能爬出去的坑里。
原文链接:http://lucida.me/blog/developer-reading-list/
本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。
Reading makes a full man; conference a ready man; and writing an exact man.
Francis Bacon
优秀的程序员应该具备两方面能力:
和其它能力一样,程序设计能力和软件开发素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。
在过去几年的学习和工作中,我阅读了大量的程序设计/软件开发书籍。随着阅读量的增长,我意识到:
意识到这两点之后,我开始思考一个很功利的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:
这即是这篇文章的出发点——我试图通过程序员必读书单这篇文章来回答上面两个问题。
进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。当然你也点击这里直接跳转到书单开始阅读。
通过这几个标准,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。
自从开博以来,经常会有朋友在论坛,微博,和QQ上提问学习X技术读什么书合适(例如:学习Java读什么书合适?如何学习程序设计?)所以我在这里列出了一个“快速通道”——把常见的问题集中在一起,点击问题,即可直接进入答案。(当然,如果你把本文从头读到尾帮助会更大 :–))
这个阅读列表覆盖了软件开发各个关键领域的入门书籍和必读书籍,我相信它可以满足绝大多数程序员的需求,无论你是初学者,还是进阶者,都可以从中获益:
尽管我尽可能的去完善这个书单,但受限于我的个人经历,这个书单难免会有所偏颇。所以如果你有不同的意见,或者认为这个书单漏掉了某些重要书籍,请在评论中指出,我会及时更新。:–)
编码:隐匿在计算机软硬件背后的语言这本书其实不应该叫编码——它更应该叫“Petzold教你造计算机”——作者Charles Petzold创造性的以编码为主题,从电报机和手电筒讲到数字电路,然后利用数字电路中的逻辑门构造出加法器和触发器,最后构造出一个完整的存储程序计算机。不要被这些电路概念吓到——编码使用大量形象贴切的类比简化了这些概念,使其成为最精彩最通俗易懂的计算机入门读物。
深入理解计算机系统(第2版)这本书的全名是:Computer Systems:A Programmer’s Perspective(所以它又被称为CSAPP),我个人习惯把它翻译为程序员所需了解的计算机系统知识,尽管土了些,但更名副其实。
深入理解计算机系统是我读过的最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系架构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读深入理解计算机系统是最有效率的方式。
延伸阅读:
编程语言是程序员必不可少的日常工具。工欲善其事,必先利其器。我在这里给出了C,C++,Java,C#,JavaScript,和Python这六种常用编程语言的书单(我个人不熟悉Objective-C和PHP,因此它们不在其中)。
需要注意的是:我在这里给出的是编程语言(Programming Language)书籍,而非编程平台(Programming Platform)书籍。以Java为例,Effective Java属于编程语言书籍,而Android编程权威指南就属于编程平台书籍。
忘记谭浩强那本糟糕不堪的C程序设计,C和指针才是C语言的最佳入门书籍。它详细但又不失简练的介绍了C语言以及C标准库的方方面面。
对于C语言初学者,最难的概念不仅仅是指针和数组,还有指向数组的指针和指向指针的指针。C和指针花了大量的篇幅和图示来把这些难懂但重要的概念讲的清清楚楚,这也是我推荐它作为C语言入门读物的原因。
尽管C程序设计语言是二十多年前的书籍,但它仍然是C语言——以及计算机科学中最重要的书籍之一,它的重要性不仅仅在于它用清晰的语言和简练的代码描述了C语言全貌,而且在于它为之后的计算机书籍——尤其是编程语言书籍树立了新的标杆。以至于在很多计算机书籍的扉页,都会有“感谢Kernighan教会我写作”这样的字样。
延伸阅读:
作为C++的发明者,没有人能比Bjarne Stroustrup更理解C++。Bjarne在Texas A&M大学任教时使用C++为大学新生讲授编程,从而就有了C++程序设计原理与实践这本书——它面向编程初学者,既包含C++教程,也包含大量程序设计原则。它不但是我读过最好的C++入门书,也是我读过最好的编程入门书。
比较有趣的是,C++程序设计原理与实践直到全书过半都没有出现指针,我想这可能是Bjarne为了证明不学C也可以学好C++吧。
同样是Bjarne Stroustrup的作品,C++程序设计语言是C++最权威且最全面的书籍。第4版相对于之前的版本进行了全面的更新,覆盖了第二新的C++ 11标准,并砍掉了部分过时的内容。
延伸阅读:
平心而论Java核心技术(即Core Java)并不算是一本特别出色的书籍:示例代码不够严谨,充斥着很多与C/C++的比较,语言也不够简洁——问题在于Java并没有一本很出色的入门书籍,与同类型的Java编程思想相比,Java核心技术至少做到了废话不多,与时俱进(Java编程思想还停留在Java 6之前),矮子里面选将军,Java核心技术算不错了。
尽管Java没有什么出色的入门书籍,但这不代表Java没有出色的必读书籍。Effective Java是我读过的最好的编程书籍之一,它包含大量的优秀Java编程实践,并对泛型和并发这两个充满陷阱的Java特性给出了充满洞察力的建议,以至于Java之父James Gosling为这本书作序:“我很希望10年前就拥有这本书。可能有人认为我不需要任何Java方面的书籍,但是我需要这本书。”
延伸阅读:
try using
结构和invokedynamic
指令),这本书填补了这个空白;视频教程:
可能你会疑问我为什么会推荐这本接近1200页的“巨著”用作C#入门,这是我的答案:
CLR via C#是C#/.Net最重要的书籍,没有之一。它全面介绍了.Net的基石——CLR的运行原理,以及构建于CLR之上的C#类型系统,运行时关系,泛型,以及线程/并行等高级内容。任何一个以C#为工作内容的程序员都应该阅读此书。
延伸阅读:
async
分别是.Net 3.5和.Net 4.5中所引入的最重要的语言特性,所以我认为有必要在它们上面花点功夫——这两本书是介绍LINQ和async
编程的最佳读物。尽管JavaScript现在可以做到客户端服务器端通吃,尽管JQuery之类的前端框架使得一些人可以不懂JavaScript也可以编程,但我还是认为学习JavaScript从HTML DOM开始最为适合,因为这是JavaScript设计的初衷。JavaScript DOM编程艺术系统的介绍了如何使用JavaScript,HTML,以及CSS创建可用的Web页面,是一本前端入门佳作。
JavaScript语言包含大量的陷阱和误区,但它却又有一些相当不错的特性,这也是为什么Douglas Crockford称JavaScript为世界上最被误解的语言,并编写了JavaScript语言精粹一书来帮助前端开发者绕开JavaScript中的陷阱。和同类书籍不同,JavaScript语言精粹用精炼的语言讲解了JavaScript语言中好的那部分(例如闭包,函数是头等对象,以及对象字面量),并建议读者不要使用其它不好的部分(例如混乱的类型转换,默认全局命名空间,以及奇葩的相等判断符),毕竟,用糟糕的特性编写出来的程序往往也是糟糕的。
延伸阅读:
Promise
、Deferred
以及Async.js
编写出简洁高效的异步程序。Python的入门书籍很多,而且据说质量大多不错,我推荐Python基础教程的原因是因为它是我的Python入门读物——简洁,全面,代码质量很不错,而且有几个很有趣的课后作业,使得我可以快速上手。
这里顺便多说一句,不要用Python学习手册作为Python入门——它的废话实在太多,你能想象它用了15页的篇幅去讲解if
语句吗?尽管O’Reilly出了很多经典编程书,但这本Python学习手册绝对不在其中。
权威且实用的Python书籍,覆盖Python 2和Python 3。尽管它名为参考手册,但Python参考手册在Python语法和标准库基础之上对其实现机制也给出了深入的讲解,不容错过。
延伸阅读:
大多数程序员并不需要从头编写一个编译器或解释器,因此龙书(编译原理)就显得过于重量级;然而多数程序员还是需要解析文本,处理配置文件,或者写一个小语言,编程语言实现模式很好的满足了这个需求。它把常用的文本解析/代码生成方法组织成一个个模式,并为每个模式给出了实例和应用场景。这本书既会提高你的动手能力,也会加深你对编程语言的理解。Python发明者Guido van Rossum甚至为这本书给出了“Throw away your compiler theory book!”这样的超高评价。
程序员每天都要和编程语言打交道,但是思考编程语言为什么会被设计成这个样子的程序员并不多,程序设计语言——实践之路完美的回答了这个问题。这本书从编程语言的解析和运行开始讲起,系统了介绍了命名空间,作用域,控制流,数据类型以及方法(控制抽象)这些程序设计语言的核心概念,然后展示了这些概念是如何被应用到过程式语言,面向对象语言,函数式语言,脚本式,逻辑编程语言以及并发编程语言这些具有不同编程范式的编程语言之上。这本书或极大的拓宽你的视野——无论你使用什么编程语言,都会从这本书中获益良多。理解这一本书,胜过学习十门新的编程语言。
延伸阅读:
Crowbar
和一门静态类型语言Diksam
,把类型系统,垃圾回收,和代码生成等编程语言的关键概念讲的清清楚楚;现代编程语言的语法大多很繁杂,初学者使用这些语言学习编程会导致花大量的时间在编程语言语法(诸如指针,引用和类型定义)而不是程序设计方法(诸如数据抽象和过程抽象)之上。程序设计方法解决了这个问题——它专注于程序设计方法,使得读者无需把大量时间花在编程语言上。这本书还有一个与之配套的教学开发环境DrScheme,这个环境会根据读者的程度变换编程语言的深度,使得读者可以始终把注意力集中在程序设计方法上。
我个人很奇怪程序设计方法这样的佳作为什么会绝版,而谭浩强C语言这样的垃圾却大行其道——好在是程序设计方法第二版已经被免费发布在网上。
计算机程序的构造与解释是另一本被国内大学忽视(至少在我本科时很少有人知道这本书)的教材,这本书和程序设计方法有很多共同点——都使用Scheme)作为教学语言;都专注于程序设计方法而非编程语言本身;都拥有相当出色的课后题。相对于程序设计方法,计算机程序的构造与解释要更加深入程序设计的本质(过程抽象,数据抽象,以及元语言抽象),以至于Google技术总监Peter Norvig给了这本书超高的评价。
延伸阅读:
我在算法学习之路一文中提到我的算法入门教材是数据结构与算法分析:C语言描述,我曾经认为它是最好的算法入门教材,但自从我读到Sedgewick的算法之后我就改变了观点——这本算法才是最好的算法入门教材:
编程珠玑(第2版)是一本少见的实践型算法书籍——它并非一一介绍数据结构/算法的教材,而是实践性极强的算法应用手册。作者(Jon Bentley)从他多年的实际经验精选出一些有趣而又实用的问题,然后展示了他解决这些问题的过程(分析问题,选择合适的算法,解决问题,以及验证答案)。任何程序员都可以从中获益。
延伸阅读:
一个让非编程从业人员惊讶的事实是程序员的绝大多时间都花在调试上,而不是写程序上,以至于Bob大叔把调试时间占工作时间的比例作为衡量程序员开发能力的标准。调试九法——软硬件错误的排查之道既是调试领域的入门作品,也是必读经典之作。调试九法的作者是一个具有丰富实战经验的硬件工程师,他把他多年的调试经验总结成九条调试法则,并对每一条法则都给对应的实际案例。任何程序员都应通过阅读这本书改善调试效率,即便是非程序员,也可以从这本书中学到系统解决问题的方法。
延伸阅读:
width="789" height="90" id="aswift_1" scrolling="no" vspace="0" hspace="0" allowfullscreen="true">
Brian Kernighan是这个星球上最好的计算机书籍作者:从上古时期的Software Tools,到早期的Unix编程环境和C程序设计语言,再到这本程序设计实践,每本书都是必读之作。
尽管程序设计实践只有短短200余页,但它使用精炼的代码和简要的原则覆盖了程序设计的所有关键概念(包括编程风格,算法与数据结构,API设计,调试,测试,优化,移植,以及领域特定语言等概念)。如果你想快速掌握良好的编程实践,或者你觉着900多页的代码大全过于沉重,那么程序设计实践是你的不二之选。我第一次读这本书就被它简洁的语言和优雅的代码所吸引,以至于读研时我买了三本程序设计实践——一本放在学校实验室,一本放在宿舍,一本随身携带阅读。我想我至少把它读了十遍以上——每一次都有新的收获。
无论在哪个版本的程序员必读书单,代码大全都会高居首位。和其它程序设计书籍不同,代码大全用通俗清晰的语言覆盖了软件构建(Software Construction)中各个层次上所有的重要概念——从变量命名到类型设计,从控制循环到代码结构,从测试和调试到构建和集成,代码大全可谓无所不包,你可以把这本书看作为程序员的一站式(Once and for all)阅读手册。更珍贵的是,代码大全在每一章末尾都给出了价值很高的参考书目(参考我之前的如何阅读书籍一文),如果你是一个初出茅庐的程序员,代码大全是绝好的阅读起点。
延伸阅读:
无论是在Amazon还是在Google上搜索设计模式相关书籍,Head First设计模式都会排在首位——它使用风趣的语言和诙谐的图示讲述了观察者,装饰者,抽象工厂,和单例等关键设计模式,使得初学者可以迅速的理解并掌握设计模式。Head First设计模式在Amazon上好评如潮,就连设计模式原书作者Erich Gamma都对它给出了很高的评价。
需要注意,Head First设计模式是非常好的设计模式入门书,但千万不要把这本书作为学习设计模式的唯一的书——是的,Head First设计模式拥有风趣的语言和诙谐的例子,但它既缺乏实际的工程范例,也没有给出设计模式的应用/适用场景。我个人建议是在读过这本书之后立即阅读“四人帮”)的设计模式或Bob大叔的敏捷软件开发,以便理解设计模式在实际中的应用。
设计模式作为设计模式领域的开山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者将各个领域面向对象程序开发的经验总结成三大类23种模式,并给出了每个模式的使用场景,变体,不足,以及如何克服这些不足。这本书行文严谨紧凑(四位作者都是PhD),并且代码源自实际项目,属于设计模式领域的必读之作。
需要注意:设计模式不适合初学者阅读——它更像是一篇博士论文而非技术书籍,加上它的范例都具有很强的领域背景(诸如GUI窗口系统和富文本编辑器),缺乏实际经验的程序员很难理解这本书。
延伸阅读:
任何产品代码都不是一蹴而就,而是在反复不断的修改中进化而来。重构正是这样一本介绍如何改进代码的书籍——如何在保持代码行为的基础上,提升代码的质量(这也是重构的定义)。
我见过很多程序员,他们经常声称自己在重构代码,但他们实际只做了第二步(提升代码的质量),却没有保证第一步(保持代码行为),因此他们所谓的重构往往会适得其反——破坏现有代码或是引入新bug。这也是我推荐重构这本书的原因——它既介绍糟糕代码的特征(Bad smell)和改进代码的方法,也给出了重构的完整流程——1. 编写单元测试保持(Preserve)程序行为;2. 重构代码;3. 保证单元测试通过。重构还引入了一套重构术语(诸如封装字段,内联方法,和字段上移),以便程序员之间交流。只有理解了这三个方面,才能算是理解重构。
这里再重复一遍重构的定义——在保持代码行为的基础上,提升代码的质量。重构专注于第二步,即如何提升代码的质量,而修改代码的艺术专注于第一步,即如何保持代码的行为。
提升代码质量并不困难,但保持代码行为就难多了,尤其是对没有测试的遗留代码(Legacy Code)而言——你需要首先引入测试,但遗留代码往往可测试性(Testability)很差,这时你就需要把代码变的可测试。修改代码的艺术包含大量的实用建议,用来把代码变的可测试(Testable),从而使重构变为可能,使提高代码质量变为可能。
延伸阅读:
关于软件测试的书籍很多,但很少有一本测试书籍能像How to Break Software这般既有趣又实用。不同于传统的软件测试书籍(往往空话连篇,无法直接应用),How to Break Software非常实际——它从程序员的心理出发,分析软件错误/Bug最可能产生的路径,然后针对这些路径进行残酷的测试,以保证软件质量。
我在第一次阅读这本书时大呼作者太过“残忍”——连这些刁钻诡异的测试招数都能想出来。但这种毫不留情(Relentless)的测试风格正是每个专业程序员所应具备的心态。
注意:如果你是一个测试工程师,那么在阅读这本书前请三思——因为阅读它之后你会让你身边的程序员苦不堪言,甚至连掐死你的心都有 :-D。
How to Break Software注重黑盒测试,而这本xUnit Test Patterns则注重白盒测试。正如书名所示,xUnit Test Patterns覆盖了单元测试的每个方面:从如何编写良好的单元测试,到如何设计可测试(Testable)的软件,再到如何重构测试——可以把它看作为单元测试的百科全书。
延伸阅读:
很多程序员都向往成为横扫千军(One-man Army)式的“编程英雄”,但卓越的软件并非一人之力,而是由团队合力而成。极客与团队就是这样一本写给程序员的如何在团队中工作的绝好书籍,它围绕着HRT三大原则(Humility谦逊,Respect尊重,和Trust信任),系统的介绍了如何融入团队,如何打造优秀的团队,如何领导团队,以及如何应对团队中的害群之马(Poisonous People)。这本书实用性极强,以至于Python之父Guido van Rossum都盛赞这本书“说出了我一直在做但总结不出来的东西”。
尽管人月神话成书于40年前,但它仍是软件项目管理最重要的书籍。人月神话源自作者Fred Brooks领导并完成System/360和OS/360这两个即是放到现在也是巨型软件项目的里程碑项目的经验总结。它覆盖了软件项目各个方面的关键概念:从工期管理(Brooks定律)到团队建设(外科团队),从程序设计(编程的本质是使用正确的数据结构)到架构设计(概念完整性),从原型设计(Plan to Throw one away)到团队交流(形式化文档+会议)。令人惊讶的是,即便40年之后,人月神话中的关键概念(包括焦油坑,Brooks定律,概念完整性,外科团队,第二版效应等等)依然适用,而软件开发的核心复杂度仍然没有得到解决(没有银弹)。
延伸阅读:
不要被庸俗的译名迷惑,程序员修炼之道是一本价值极高的程序员成长手册。这本书并不局限于特定的编程语言或框架,而是提出了一套切实可行的实效(Pragmatic)开发哲学,并通过程序设计,测试,编程工具,以及项目管理等方面的实例展示了如何应用这套开发哲学,从而使得程序员更加高效专业。有人把这本书称之为迷你版代码大全——代码大全给出了大量的优秀程序设计实践,偏向术;而程序员修炼之道给出了程序设计实践背后的思想,注重道。
程序员修炼之道指出了如何成为专业程序员,这本程序员职业素养则指出了专业程序员应该是什么样子——承担责任;知道自己在做什么;知道何时说不/何时说是;在正确的时间编写正确的代码;懂得自我时间管理和工期预估;知道如何应对压力。如果你想成为专业程序员(Professional Developer)(而不是码农(Code Monkey)),这本书会为你指明前进的方向。
延伸阅读:
奇思妙想:15位计算机天才及其重大发现是一本极具眼光的技术访谈书籍——在这本书访谈的15位计算机科学家中,竟出现了12位图灵奖获得者——要知道图灵奖从1966年设奖到现在也只有六十几位获奖者而已。
奇思妙想把计算机科学分为四大领域:编程语言;算法;架构;人工智能。并选取了每个领域下最具代表性的计算机科学家进行访谈。因为这些计算机科学家都是其所在领域的开拓者,因此他们能给出常人无法给出的深刻见解。通过这本书,你可以了解前三十年的计算机科学的发展历程——计算机科学家做了什么,而计算机又能做到/做不到什么。从而避免把时间浪费在前人已经解决的问题(或者根本无法解决的问题)上面。
同样是访谈录,同样访谈15个人,编程人生把重点放在程序员(Coders at work)上。它从各个领域选取了15位顶尖的程序员,这些程序员既包括Ken Thompson和Jamie Zawinski这些老牌Unix黑客,也包括Brad Fitzpatrick这样的80后新生代,还包括Frances Allen和Donald Knuth这样的计算机科学家。这种多样性(Diversity)使得编程人生兼具严谨性和趣味性,无论你是什么类型的程序员,都能从中受益良多。
延伸阅读:
书如其名,写给大家看的设计书是一本面向初学者的快速设计入门。它覆盖了版式,色彩,和字体这三个设计中的关键元素,并创造性的为版式设计总结出CRAP四大原则(Contrast对比,Repetition重复,Alignment对齐,Proximity亲密)。全书使用丰富生动的范例告诉读者什么是好的设计,什么是不好的设计,使得即便是对设计一无所知的人,也可以从这本书快速入门。
写给大家看的设计书强调实践,即如何做出好的设计;认知与设计:理解UI设计准则强调理论,即为什么我们会接受这样的设计而反感那样的设计。如果你想要搞清楚设计背后的心理学知识,但又不想阅读大部头的心理学著作,那么认知与设计是你的首选。
延伸阅读:
书如其名,通用设计法则给出了重要的125个设计原则,并用简练的语言和范例展示了这些原则的实际应用。每个原则都有对应的参考文献,以便读者进一步学习。我之所以推荐这本书,是因为:1. 程序员需要对设计有全面的认识;2. 程序员并不需要知道这些设计原则是怎么来的,知道怎么用即可。这本书很好的满足了这两个要求。
交互设计精髓是交互设计领域的圣经级著作。交互设计专家(以及VB之父)Alan Cooper在这本书中详细介绍了交互设计的原则,流程,以及方法,然后通过各种范例(主要来自桌面系统)展示了如何应用这些原则。
需要注意的是这本书的第4版已经出版,它在第三版的基础上增加了移动设计以及Web设计等内容。
延伸阅读:
软件开发者路线图是一本优秀且实用的程序员职业规划手册。这本书由若干个模式组成,每个模式都对应于程序员职业生涯中的特定阶段。通过这本书,读者可以很方便的找到自己目前所处的模式(阶段),应该做什么,目标是什么,以及下一个模式(阶段)会是什么。如果你时常感到迷茫,那么请阅读这本路线图,找到自己的位置,确定接下来的方向。
延伸阅读:
作为程序员,我们需要不断地学习——既要学习新技术,也要学习如何解决各种领域的问题。为了提升学习效率,我们需要学习如何学习。程序员的思维修炼正是这样一本讲如何学习的书,它集合了认知科学,神经学,以及行为理论的最新研究成果,并系统的介绍了大脑的工作机制。通过这本书,你将学会如何高效的使用自己的大脑,从而提高思考能力,改善学习效率。
Mastery is not about perfection. It’s about a process, a journey. The master is the one who stays on the path day after day, year after year. The master is the one who is willing to try, and fail, and try again, for as long as he or she lives.
为什么同样资质的人,大多数人会碌碌无为,而只有极少数能做到登峰造极?如何在领域内做到顶尖?如何克服通往顶尖之路上的重重险阻?如何把事情做到最好回答了这些问题,并极具哲理的指出登峰造极并不是结果,而是一段永不停止的旅程。阅读这本书不会让你立刻脱胎换骨,但它会指引你走向正确的道路——通往登峰造极之路。
延伸阅读:
知己知彼,百战不殆。金领简历:敲开苹果微软谷歌的大门是程序员求职的必读书籍,它覆盖了程序员求职的方方面面:从开始准备到编写简历,从技术面试到薪酬谈判。由于该书作者曾在Google,微软,和苹果任职并进行过技术招聘,因此这本书的内容非常实用。
顺便吐个槽:这本书翻译的还不错,但我实在无法理解封面上的“进入顶级科技公司的葵花宝典”这段文字——找个工作而已,用不着切JJ这么凶残吧。-_–#
同样是来自金领简历作者的作品,程序员面试金典(第5版)专注于技术面试题,它既包含了IT企业(诸如微软,Google,和苹果)的面试流程以及如何准备技术面试,也包含了大量(超过200道)常见技术面试题题目以及解题思路。无论你打算进入国内企业还是外企,你都应该把这本书的题目练一遍,以找到技术面试的感觉(我在求职时就曾经专门搞了一块白板,然后每二十分钟一道题的练习,效果很不错)。
延伸阅读:
词汇量决定阅读能力,语法决定写作能力。计算机专业词汇并不多,但精确性非常重要,因此每个程序员都应具备良好的英语语法,但程序员并不需要过于专业的英语语法——掌握常用语法并把它用对就可以。The Only Grammar Book You’ll Ever Need正好可以满足这个需求,尽管它篇幅不大(不足200页),却覆盖了英语中的关键语法以及常见错误。把这本书读两遍,它会大幅度提高你的英语写作能力。
既是最畅销的英语写作书籍,也是计算机书籍中引用最多的非计算机书籍。风格的要素用极其简练的语言讲述了如何进行严肃,精确,清楚的英语写作。从这本书中,你不仅可以学到英语写作,更可以学到一种严谨至简的处事态度,而这正是专业开发所必需的。
延伸阅读:
学而不思则罔,思而不学则殆。
不愤不启,不悱不发。举一隅不以三隅反,则不复也。
不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之,学至于行之而止矣。
它山之石,可以攻玉。我在本文最后给出其他中外优秀程序员的书单,以便参考&补充。
以下同一条目下用“/”隔开的表示任选,当然也可以都读。
软件项目管理
编程技艺
编程哲学
界面设计
资本运作
图形设计
思维方式
编程入门
本文转载自:https://www.leiphone.com/news/201708/LEBNjZzvm0Q3Ipp0.html 雷锋网 AI 科技评论按:「Deep Learn…
如何成为当下一个合格的算法工程师 知乎上看了SimonS大神的一个live做了一些笔记 一,Q&A部分: 1.一个特征分析的例子。。。(听不懂) 2. 还是一个机器学习的例子,(听…
实习面试受挫,痛定思痛之下阅读了大量的程序设计书…因为算法的原理我能说明白,但要给出优雅正确简练的…
2018-6-1
很细致。从项目解决的问题,为什么要这么做,有什么意义,用了什么技术什么算法等等…一两周之后,部门的HR打电话沟通了实习期间的福利待遇和确认了实习录用意向书。…
2018-5-24
机器学习算法工程师需要掌握的技能与要踩的坑
1. 前言
本来这篇标题我想的是算法工程师的技能,但是我觉得要是加上机器学习在标题上,估计点的人会多一点,所以标题成这样了,呵呵,而且被搜索引擎收录的时候多了一个时下的热门词,估计曝光也会更多点。不…
2017年实习笔试面试经验总结 - CSDN博客
截止到现在为止,自己在大三时找实习的经历也应该算…一定要了如指掌,必要时真的是要了解到某些算法和…还问了我看过C++的哪些书,答了《C++ primer》,接…
2018-6-11
我的算法学习之路 - CSDN博客
实习面试受挫,痛定思痛之下阅读了大量的程序设计书…因为算法的原理我能说明白,但要给出优雅正确简练的…
2018-6-6
c语言算法大全(10本经典书合集)
2013年06月03日
27.75MB
下载
C语言100个经典的算法
POJ上做做ACM的题语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法题目:古典问题:有一对兔子,从出生后第3…
实习生面试经验(一)-图像算法岗 - CSDN博客
目前研二,女,模式识别专业,北京,为了方便明年找工作去试了试投实习。第一次实习面试,也不知道怎么准备,直接就去了。昨天问了问,面试挂了。还是打算记录一下面试…
2018-6-13
开始学习算法导论这本书咯~ - CSDN博客
利用寒假时间把算法导论这本书里面的内容过一下,为以后的实习做准备·… 利用寒假时间把算法导论这本书里面的内容过一下,为以后的实习做准备· 阅读更多 …
2018-5-22
算法推荐书籍
数据结构与算法篇
1.《算法导论》
l推荐理由
这本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于…
暑期实习–算法 - CSDN博客
1、假设淘宝一天有5亿条成交数据,求出销量最高的100个商品并给出算法的时间复杂度。先用哈希,统计每个商品的成交次数,然后再用在N个数中找出前K大个数的方法…
2018-6-7
2017阿里算法工程师暑期实习笔试题目部分解析 - CSDN博客
有7个连续整数的球,比如{1,2,3,4,5,6,7},连续抽取三个球,如果连续抽取的2个球的数字是连续的,则中奖,求中奖的概率第一次抽到1或7,则假如第二次出现…
2018-6-1
var width = $("div.recommend-box").outerWidth() - 48;
NEWS_FEED({
w: width,
h: 90,
showid: 'Afihld',
placeholderId: 'a_d_feed_0',
inject: 'define',
define: {
imagePosition: 'right',
imageBorderRadius: 0,
imageWidth: 120,
imageHeight: 90,
imageFill: 'clip',
displayImage: true,
displayTitle: true,
titleFontSize: 20,
titleFontColor: '#333',
titleFontFamily: 'Microsoft Yahei',
titleFontWeight: 'bold',
titlePaddingTop: 0,
titlePaddingRight: 0,
titlePaddingBottom: 10,
titlePaddingLeft: 0,
displayDesc: true,
descFontSize: 14,
descFontColor: '#6b6b6b',
descFontFamily: 'Microsoft Yahei',
paddingTop: 0,
paddingRight: 0,
paddingBottom: 0,
paddingLeft: 0,
backgroundColor: '#fff',
hoverColor: '#ca0c16'
}
})
最近需要学好算法,推荐学算法的书籍与教程
从武术的角度来看,算法是计算机的内功,学好算法可以使一个程序高效运行。同时算法与计算机是独立的,无论技术怎样发展,一些算法还会一直存在,这也是如何在高速技术发展的背景下生存的首要条件。更为…
有关算法方面的经典书籍推荐
最近在学习算法和数据结构方面的知识,看到一篇好的关于数据结构和算法的书籍一、概要如果计算机系只开三门课,那么这三门课就一定是:离散数学,数据结构与算法,编译原理。如果只开一门课,那剩下的就一定是:数据…
校招算法岗经验总结(看了大概15篇左右面经) - CSDN博客
如果非科班想逆袭算法岗,那么需要先打好编程跟基本机器学习算法的基础,然后参加一些比赛进行实践,临近找工作的时候集中精力投入多刷题,多刷面经,然后就是早实习。…
2018-6-8
undefined
JAVA八大经典书籍,你看过几本?
一、Java从入门到精通*
《Java从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。
《Java从入门到精通(第3…
我学Python都看了哪些书
前言
2017年11月29日,自己曾在公众号内写过一篇《聊聊我的R语言学习路径和感受》的文章,受到了很多朋友的关注和赞扬,同时,也有其他公众号在帮忙转载。当然,也有很多朋友也给…
算法类经典书籍
1、The Art of Computer Programming相信把这本书放在第一位不会有人反对。2、Introduction to Algorithms教学录像 MPG格式:http://...
《Python算法教程》中文版 高清完整PDF版
2017年03月12日
42.99MB
下载