1. 该不该坚持学习MachineLearning?
赵天琪,程序媛,INTJ
我觉得你不必过于担心,上了那几门公开课后完全可以胜任机器学习的工作,不必和Ph.D比,他们是搞学术的,将来留在高校任教,发文章居多。
我实习的主管原来在linkedin,他说那里最常用的算法是logisticregression。
陈然,Data Scientist @ http://Trulia.com
一个技能学与不学,肯定有千万种理由,然而并没有一种理由叫做‘因为赶不上最牛的人,所以不学了’。如果你真有这样的观点,为何要继续‘老老实实做开发’呢?别人做开发了几十年了,你赶的的上最牛的人吗?为何要‘多看看系统设计类的东西’呢?别人系统设计也做了几十年了,你赶得上最牛的人吗?既然什么东西都赶不上最牛的人,还继续学什么呢?混吃等死就好了。
然而你并不会这么想,既然不会这么想,为什么会把这个观点用在‘是否要学ML’上呢?
换个角度想想,为什么觉得‘老老实实做开发,多看看系统设计类的东西’听起来是一个保险的选择,而‘学和ML相关的技术’是冒险的选择?因为工作环境,周围所接触实实在在的人,都是按照这个路子走出来的,因此心中会觉得这样子理所应当。然而换一个环境,在一个充满‘新技术改变世界’的氛围中,可能会觉得‘学和ML相关的技术’是更保险,甚至唯一的选择,而‘老老实实做开发,多看看系统设计类的东西’反而是需要犹豫的选择。
我不想说到底应不应该坚持学习某项技术,毕竟每个人有自己的选择。我只是认为做决定的时候,要多考虑技术本身,历史的潮流,而不要仅仅因为自己小圈子所带来的感受。要跳出圈子,不做井底之蛤,看到更大的世界,才能顺应时代发展的需求。毕竟
‘一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的行程’
谢澎涛,CMU机器学习
谢邀。我觉得很有必要,而且相信有一天,机器学习算法会成为和基础算法(如查找、排序)同等重要的本科生必修课程。计算机这个学科本质上就是在跟数据打交道。基本的数据处理和分析已经做得非常好了:比如查询、排序、数据库操作。那么接下来的发展方向就是高级数据分析了:从大量数据中找到规律和知识,然后用规律和知识做决策。机器学习正是进行高级数据分析的一个学科方向。上次和腾讯的一个engineer lead交流,他说现在大学本科提供的机器学习教育几乎为零,而他们对懂机器学习、能分析数据的人才的需求又非常大。如果能在技能列表里有机器学习这一样,对于在工业界发展应该是很有优势的。
再进一步,我们希望机器学习在未来不光是码农的必备技能,而且会成为普通用户群的必备技能。想象有一天在EXCEL软件里,有这样一些按钮 “分类”,“聚类”,“话题分析”,使用它们就如同使用 ”求和“, ”取平均“,”排序“这些基础功能一样简单、方便,成为人们平时工作的日常操作。
匿名用户
ml会变成本科生的基础课,早入行早得益
2. 为什么要学习算法和数据结构?
说到这里,我想说的就是,利用你的时间增加你的实力,而不是简单的经验值。
坦白讲,我不认为开发100个Android项目和认真完整开发1个有什么本质不同。
毋容讳言,其实大学的现状培养的就是未来的码农。毕竟精英岗位有限。
但是,你可以通过优异的成绩让自己进入programmer上层,让你的人生之路更加顺畅,通过尽量少的体力劳动赚到需要的钱。
所以,多学些高级技能,比如参加一下ACM,软件的根本不是写代码,而是代码背后的思想。
作者:赵天琪
来源:知乎
谢邀。
我从高一开始搞OI,大学继续搞ACM,拿过银,大二时也做过安卓手游。现在大三,正准备去清华攻读研究生。从我自身角度,稍微谈谈看法吧,可能有失偏颇,请题主有选择性地采纳。
你学的这些技术都会过时,但算法永不过时。
这里说的技术就是指API和框架,不包括设计哲学,我不认为一个大一的专业课都没学完的学生能体会到哲学这种玄妙的东西。
我的第一个正经项目就是写个安卓手游,刚开始觉得一片茫然,首先学习Android,什么Activity,什么xml,令人眼花缭乱。后来又学了Cocos2D游戏引擎。写的时候涉及到操作系统、数据库、网络编程的知识(都是自学的),用到了这么多专业知识,觉得收获好大。两周之后,一个游戏就完成了。然后开始觉得索然无味。和其他技术一样,无非调用API,无非是像脚本语言一样写一些所见即所得的界面。第一个游戏觉得新鲜,第二个、第三个呢?无非是以上过程的重复。
一个游戏能不能火,关键是创意、画面、剧情脚本,和程序员关系不大。Flappy Bird需要多少技术呢?在做安卓游戏的过程中,我的团队成员起了关键的作用,是他们提出的创意,用Photoshop做出的素材,用百度找到的资料,而我,不过是阅读几本在市面上随处可见的书,把他们的努力用代码转换为游戏而已。
算法和数据结构是内功,项目是招式。两者缺一不可,然而有了招式,内功才有用武之地;内功好了,无论什么招式都能很快精通。
轻算法,重项目,在我看来非常短视。想必题主也觉得专业课不太重要吧。大学本科,正是打基础的时候,不去把内功练好,专门学些花里胡哨的东西,不是本末倒置了吗?轻视基本功,那本科学生和中专学生有什么区别呢?
虽然有些答案是支持工程反对ACM的,但我不得不提醒题主一句,他们能拿到BAT实习、奖学金、名校保研机会,很大程度上是因为ACM奖牌。
还有些答案让题主从心所欲,随着兴趣走,这种鸡汤看看就行,千万别喝。高考的时候你说我的兴趣是魔兽世界,不喜欢数学英语,是不是可以不考?况且题主已经刷了300题了,这能叫没有兴趣?相信我,你不是没有兴趣,只是暂时看不到回报而已。继续努力,拿到奖牌,拿到奖学金,拿到好实习,收获学弟学妹羡慕的目光,你的兴趣就来了。
去CSDN上看一下类似问题的答案:
要ACM集训,还是项目?-CSDN论坛-CSDN.NET-中国最大的IT技术社区
大家说,ACM比赛和做项目,哪个更重要些???-CSDN论坛-CSDN.NET-中国最大的IT技术社区
有些东西,不一定要自己去碰壁,能借鉴前人的经验也是很聪明的做法。
有自己的判断力,不要人云亦云,是成熟的重要标志。 ACM大牛说算法不重要,就好比富人说钱不重要一样。高票答案固然精彩,但它们不能为题主的人生负责。还是要三思。
我觉得题主才大一,正是打基础的时候,应当好好学算法,数据结构,操作系统等基础知识,工程量力而行。个人意见。
什么?你就想当个码农?当我没说。
jun zheng,在大学写程序
单曲循环地听歌、路漫漫兮姜子瑜、osie 等人赞同
讲一下我的个人理解。本人担任某二本院校acm指导教师近10年。
排名第一的答案是朝着牛人的路子去的,但绝大多数人都不会成为牛人。如果不准备考研、搞学术,普通工程师应该有更合适的路子。
首先说一下acm。
搞算法可能涉及大致三类
1 基本数据结构,枚举,递归,回溯,搜索算法,动态规划,图论(基础)
2 图论(高级),博弈,数论,几何,组合数学.......
3 神经网络、遗传算法等等等等(这些对acm也没有大用,有兴趣可以玩)
能搞定第1类,基本可以拿到省级比赛的三等奖,冲击二等奖。
搞定第2类,可以冲击省级比赛一等奖,参加亚洲赛甚至总决赛。但对非985、211学生来说,一是要付出大量时间精力,二是还要看天赋。
做acm的好处是
a 快速提高编程基础能力
b 培养逻辑思维能力
c 培养自主学习能力
所以,在做项目的时候,搞过acm的学生优势在于:学习比较快,逻辑更清晰,不容易出低级bug。但这些能力在你能较好的掌握第1类算法后,就已经具备了;再去研究第2类算法,增加的主要是对具体算法的理解,对逻辑思维和学习能力的提高已没有之前明显了。
因此,对于想玩一下acm的同学,好好学习一下第1类问题就可以了。
花大量时间精力去研究第2类问题,意义并不大
1)工程中用到的概率很小
2)如果工程中要用,到时候再学也不迟
除非对acm非常有兴趣和信心,想拿更好的奖,准备考研,你可以继续下去。
否则,绝大多数同学,我建议在学完第一类问题就不要在acm花太多时间了。
一般985、211的学生acm可以一直玩到大4甚至研1,因为acm成绩好的估计都保研了。但如果本科毕业要工作的同学,在大3参加完一些比赛后,就应该离开acm了,否则你没时间去积累项目经验。当然,你可以和acm的同学继续玩在一起,但不应该是主力。
积累项目经验的意义
1 有个说法是,”学《编译原理》,就自己实现一个编译器,学《操作系统》,就自己写一个操作系统,学《数据库原理》,就自己写一个小型的数据库管理系统,学《数据结构》,就把书上的代码习题全都做一遍,并且熟练掌握“,这个方法在国内可能并不可行
a 国外每门课的大作业基本都是项目级的。但国内由于师生比和教学方法的问题,老师如果出大作业,最多最后简单给你评个分,过程中能给的指导有限,全靠你自己去摸索。
b 靠你自己摸索做的结果多半是,做的不会很深入并且很难真正理解,因为你不知道这些东西到底有什么卵用。
当你做过几个Java项目,能熟练使用List、Map、Set这些工具类的时候,你对《数据结构》的理解更直观了。
当你做过几个手机端项目,其中要用到数据库并且数据量还比较大,你会发现原来看起来没有卵用的索引、联合查询、事务是多么有用。
当你做过有一定复杂度的Android项目后,对进程与线程、Activity堆栈、Android消息机制这些操作系统的基本知识也掌握的差不多了,如果还想深入,可以去看Android源码,甚至底层Linux内核源码。
做项目的意义在于,把书本知识变成属于你的活的知识。
2 计算机专业的几门课程主课,”数据结构与算法“、”计算机组成和计算机系统架构“、”编译原理“、”数据库“、”操作系统“、”计算机网络“、”软件工程“,往深里学,每一门可以学的没完。
另外,其他专业的课程间的关联性和延续性要更强。相对来说,计算机专业的这几门主课,都基本独立并自成一个体系。
所以,对于本科生来说,想在4年时间把这些课程都学得很精深,是不可能的,也没有必要。靠谱的做法是,多数课程能做到基本掌握即可,抓住一两个方向去深入学习。
当然,一开始你也不知道哪些方向适合你,并且更有兴趣。那么,多做几个不同类型的项目,应该能找到兴趣点。
3 当你在做第一个项目的时候,你考虑可能只是实现功能和消除bug。当你在做第二个项目的时候,你会发现之前的程序运行效率很差,很会考虑优化问题,使用合适的数据结构和算法,简化程序流程,合理的使用线程。当你做第三个项目的时候,你会发现之前的代码架构都多么恶心,扩展性和可维护性很差,你会考虑程序架构的问题,考虑复用性、扩展性等等问题。你每做一个项目,你关注的点应该随之拓展,能力可以不断提高。
所以,沿着Android、iOS、前端或后端,任何一个方向深入下去,你学到的不仅是这个方向的招式,也会获得一种叫项目经验或工程素养的东西,这就是内功。
最后总结一下。
在我看来,在这个信息爆炸的时代,知识的稀缺性变的没那么重要了。知识总是在哪里,不是在这本书上就说在哪个书上,不是在这个网页上就说在哪个网页上。你要学,随时都可以。
相对的,人的时间和精力变成更稀缺的东西,在有限的时间里,学什么和怎么去学,变得更重要。所以,充分利用大学4年时间,形成一个能提升个人核心竞争力的能力架构,比囤积大量分散的知识,要有价值的多。
另外,绝大多数人的归宿都不是牛人,在计算机的任何一个领域,做一个靠谱的工程师,就已经很了不起了。
PonLee,鹅厂码农
dog dot、Leannode、old tree 赞同
数据结构是对业务数据抽象出来的一种模型,而算法则是解决业务问题的思维方法论。因此,理解好算法和数据结构对于程序员的思维能力的提升有极大地帮助,我一直觉得,是否有高度的抽象能力和是否具有计算机思维是高水平程序员和一般码农的分水岭。
在实际的项目中,确实直接能应用上教材上所描述的那些算法的情况是很少的,因为稍微高级点的语言都会对常用的算法和数据结构进行很好的封装,或提供了相应的库,但如果你对算法和数据结构有较好的掌握,知道vector,map(c++容器)等的实现原理,那么在实际的开发过程中,你就会设法规避采用这种结构所带来的负面影响,给程序带来更高的效率和稳定性
陈亚星,Engineer @
善勇、Ray0、Young Ethan 等人赞同
个人见解,这个问题应该是看公司的。
1. 对于较大的公司来说,
1) 应届生所谓做过的大部分项目其实并没有什么实际意义,甚至大部分仅仅是课程项目,以练习为目的。应届生自身经验不足且参差不齐,以项目经验为标杆并不好考察一个面试者。公司的考察点自然也就放在基础上,考这些基础问题相比所谓项目经验更能说明应届生自身的能力如何。
2) 对于应届生更加注重的应该是是个人能力和发展潜力如何,简单来说基础扎实,思维活跃,其实是做好其他的基本。如果基本算法,数据结构能够运用自如,手到擒来,自然不会是一个不好的软件工程师,而且我认为在大公司能够容忍你一个学习期,一定程度上弥补经验的不足。
2. 对于小型的公司,尤其是部分创业公司,可能更需要的人是能马上上手干活,甚至是多面手。这样就需要经验型,熟练性的人才。相比来说面试的题目可能更加偏重实践和经验。
mountain,只缘身在此山中
善勇、redky、徐鱼鱼 等人赞同
几乎所有计算机专业都会教数据结构和算法,如果你掌握的不好,一般有两种可能。
1.你比较讨厌他们,根本不重视。这个问题是很严重的,你以后到公司了,肯定会遇到枯燥、难懂、惹人厌烦的问题,试问到时你如何处理?没人会相信你的学习态度来个180度大转弯。
2.你的能力有问题。数据结构和算法很难,他们暂时没有什么用处,可是他们有一个特殊的用处,就是可以检验出你的智商和学习能力。
另外,你所谓的项目经验在企业看来可能都弱爆了,根本不值一提。尤其是互联网企业,需要你在短时间内掌握好任何一门新技术,我从来没看见一个数据结构和算法学的很好的人搞不懂Java或者C#。
张鹏,兼听则明
刘宇、OTS ABC、星空不远 等人赞同
· 编程就说写iOS或者android各种控件,布局这些属于外功招式而你说的这些再加一个面向对象就属于内功招式决定你段位的始终是内功内功扎实外功学起来也更快更能深入理解就举点实际在ios和android客户端开发中常见的例子
· 先说数据结构,现在业务需求需要一个数据结构来存储数据,如用户的购物车中的数据,或者下载列表的数据,优秀的码农会找策划或者产品经理确认该业务的基本述求,是增删频繁还是查询更频繁,或者两者之间,从而选择更适合的数据结构进行存储。而不是无脑用任意数据结构来进行编码。
· 再说算法,最常用的就是排序或者查找,这里举例排序,业务需求会需要几种排序,商品的话会根据销量,价格,评价信用等方式进行排序,应用商城会根据下载量,热度,关键字相关度等进行排序,根据业务的需求来选择更好的排序算法,根据业务对算法的时间和空间复杂度进行权衡。
· 各种原理,这算是内功中的内功,属于内功心法级别,能潜移默化的提高编程能力,比如更好的理解内存管理,编译器加载,线程通信之类的问题。
· 这里再补充一个面向对象,这对于客户端编程来说,是不可或缺的部分,编程菜鸟和大牛,看代码是否遵循OO的几个原则就能看出差距。
· 新手比招式,高手比内功
匿名用户
曹越、邱伟轩、王豫园 等人赞同
好吧,说一下自己的情况,请在阅读下面的建议时参考——22年前接触编程,然后就一直本科硕士博士的折腾代码,毕业后留学校也是搞计算机。
感觉楼主的纠结其实很没有必要,不管是做项目,还是做ACM,都是比较错误的方向。真想成为一个大牛,就先把本科生的专业课学好!把本科生的专业课学好!把本科生的专业课学好!按惯例重要的事情说三遍。
大家可以对照一下国外牛B名校的计算机专业课程体系和本学校的专业课程体系,会发现基本上差不多,所以至少这些专业课的设置是没有问题的。但是!但是!我们学习的深度根本就跟国外不能比啊!我们要学英语啊!我们要学政治啊!我们一个学期七八门课啊,国外是一个学期顶多选三门课啊!
吐槽完了,给一个建议,就是学好专业课——学《计算机组成原理》,就自己设计一个CPU,至少做一个单周期的,有余力就做多周期和流水线的,学《编译原理》,就自己实现一个编译器,学《操作系统》,就自己写一个操作系统,学《数据库原理》,就自己写一个小型的数据库管理系统,学《数据结构》,就把书上的代码习题全都做一遍,并且熟练掌握,……,也就说,每门专业课都学懂学透,到了大学本科毕业的时候,能够融会贯通,那就是一个非常非常优秀的计算机专业毕业生了,到了那个时候,有无限的可能性。
这里说一下这种方式的可行性问题:因为计算机本身就是人造的东西,里面的原理都是公开,本科期间涉及到的知识都是很清晰的,网上也非常多的源代码,所做的实验有台电脑,装个虚拟机也就可以了,而且还有不少名校的公开视频课,所以只要你真想学,是没有什么太多难度的。但是!你除了有兴趣外,还需要投入大量的时间和精力,在美国的计算机专业本科生,一个学期只选三门课就已经是极限了,每天晚上基本都要到凌晨一点才睡!
所以总结一下,如果想成为牛人,还是要自己付出时间和精力。“Android专精”和"ACM专精"其实都只是技能树上的一个分支,都只适用于某些场合。
苏椰,搞了个车库,研究机器人。
一片小树林、syawlaus、浩浩tangtang 等人赞同
很多学计算机的朋友,都有类似的困惑:我学了计算机专业,怎么还是做不出网站、软件、APP?很多人误以为是教材不接轨,因此崇拜国外教材,其实不是那么回事。我尽量详细地答一下,顺便也讲讲计算机科学到底是干什么的。
假如有个同学,受过基本的语文训练,初学写作,梦想成为金庸那样的小说家。他现在想知道,如何提高创作能力,并练习写第一篇小说。这时,有个中文系的大学生路过,面对这位略有稚气的同学,给出了高票答案:
我不认为学生写小说有啥意义。学生,就要沉得下心。你看我懂文学理论,要写小说的时候,哪怕不会组词,有本辞典就能写了。所以你不要浪费时间去搞那些,你要先把文学的本质理解透彻,达到我的境界,就能“会当凌绝顶”。所以你现在应该学习《深入理解现当代诗歌》、《文本的结构和意义的生成》以及《音韵导论》,然后脚踏实地学习2+年,这些才是语言的内功。
这位同学当场被这些华丽的书名击倒,跑到知乎恭恭敬敬提问:
我想写小说,大师给我推荐三本经典,我应该按什么顺序学?学了这些,我能写出什么?
不用觉得滑稽,初学者被高大上的书目击倒是正常的,这三本书也确实都是入门经典。但是我们要先搞明白,它们入的是什么门。
CSAPP 《深入理解计算机系统》
这是 CMU 的“计算机科学导论”的教材。是操作系统入门。(这门课程要求学生有编程基础)
SICP 《计算机程序的构造和解释》
这是 MIT 的6.001课程的教材。是编程语言入门。(这门课在好几年前就改成Python了)
CLRS 《算法导论》
这是 MIT 的6.006课程的教材。是算法分析入门。
那么操作系统、编程语言、算法分析又属于什么呢?我们系统地看看,计算机科学到底是干什么的。CS大体可以分成这么几个大领域:硬件、系统、软件、网络、计算理论、计算方法。
硬件 —— 数字电路、集成电路、存储器、各种硬件设计和验证方法等。
系统 —— 计算机架构(指令集、串/并行、网格、云端之类)、嵌入式、实时系统等。
软件 —— 操作系统、虚拟机、编程语言、软件设计/开发/验证的工具和方法论等。
网络 —— 计算机网络的架构、协议、组件、路径算法、性能分析等。
计算理论 —— 可计算性、形式语言和自动机、密码、逻辑、算法分析等。
计算方法 —— 数值计算、符号计算、并行计算、计算机图形学、人工智能、机器学习等。
你可以按这个提纲,逐个了解一下CS是干什么的。但现在可以先看着这些词,大概感受一下。我们再说那三本书:操作系统和编程语言,是软件领域中小领域,而算法分析是计算理论中的小领域,这是那三本书在计算机科学中的位置。它们作为所谓“经典”,入的就是这几个门。现在你知道这几本书是干什么的了,那么你的问题来了:做网站、做APP又属于这里面的哪个位置?
答案是,哪个也不属于。你看整个计算机科学,研究的都是非常底层或基础的东西,与你说的“现实中的产品开发”,基本上是没有关系的。即使有些名称看着和开发有关,其实也不是一回事。比如这里所说的“编程语言”,就好比语言学,是研究各种语言结构的,而不是教你用语言写作的。你要认识到这一点,这不是教材好坏的问题,而是分工不同。就像天文学不是教你制造望远镜的,机械动力学不是教你开挖掘机的。
那么问题又来了,你现在就想学习做网站、做APP,这是什么?怎么学?哪家强?
实际上,国内大学极少有独立的CS专业,都是加个“与技术”,全称叫“计算机科学与技术”。顾名思义,这就包括计算机科学、计算机技术两部分。你想学的这些,就属于那个“与技术”。你想学的是技术方向,别人推荐的却是科学方向的经典,这个就是你困惑的根本原因。
说到这里,我想题主应该已经理解了:计算机科学是干什么的,那三本书是干什么的,以及为什么学完了还是做不出来网站和APP。接下来,我想你会问这两个问题:
1、如果我想搞技术,那么学习科学部分还有没有必要?
我的观点是,这不是有没有必要的问题。这两者之间的区别,是追求的目标不同:科学追求尽量深入,探索原理;而技术追求尽量封装,提高效率。各种高级技术都是力求隐藏细节,以提高效率。而你选择学习内容的标准,就看它能否显著提高你的生产力。有些技术高度依赖底层细节或原理,造成了效率瓶颈,就应该学。但具体到Web、APP开发,最能提高你生产力的,就是那些前/后端框架和脚本,学完了你马上就能做产品,而不是《计算机程序的构造和解释》什么的。当然,上边有些朋友告诉你,你要学挖掘机,一定要先学机械动力学,否则你就没有内功,永远不可能成为挖掘机高手,机械动力学才是真正的知识,只是现在社会太浮躁,没人愿意花时间学。然而,我并没否认机械动力学的价值,它能让你把挖掘机分析得头头是道,甚至设计制造挖掘机。但是,如果你的目标是开挖掘机,那你就不该这样入门,因为这是两回事。说了这么多,希望你明白了。
2、我现在应该如何提高技术水平?
学技术的关键思路是两点:一个是模仿,一个是边实践边学。比如说学挖掘机,首先你要知道基本操作,然后看别人是怎么开的,最后自己上去开。遇到问题,比如跑偏了,你研究一下,挖掘无力,你再研究一下,弄明白了就继续开。具体到你说的做网站为例,首先你可以看看《Head First HTML5》和《HeadFirst PHP & MySQL》,或者用Codecademy,学会基本操作。然后找一些作品,比如WordPress,和它的一些经典模板,去看别人是怎么做的。然后,你就可以自己设计一个小网站,尝试把它做出来。不用等什么都学会了再开始做。做的过程中,你遇到什么障碍,再有针对性地去学习和解决。这种边实践边学习的模式,才是学技术的正确思路,这跟搞理论研究的思路是不一样的。
最后,再跟你说两个题外话。
第一,这几本书,就是大学教材而已,没有那么神。我们以前搞OI,初三就把《算法导论》的习题做得滚瓜烂熟,也就算是入个门,从地下室来到地面的水平。只是有人刚来到地面,就跟你大谈“会当凌绝顶”、“程序员世界的高富帅”什么的,这个不至于的,没必要激动。
第二,我面试过一个前端,问他最喜欢什么书,他说TAOCP,连QQ签名都是“只盼TAOCP出第五卷”。我问这对前端有何帮助,他说这是内功。后来考查写代码,他写不出来,说这个不是内功,而他擅长内功。我说那你先证明一下辗转相除法吧,他又强调他擅长的是计算机内功,而不是数学。但其实这个证明,就是TAOCP第一卷、第一章的第一道例题。
想学python之后学机器学习其他工具,走数据挖掘路线,这样前景怎么样?那如何迅速掌握python呢?
SimonS,Life is short, I use Python.
小叶同志、Cecilelmo、乐山乐水 等人赞同
建议读两本书:
1、集体智慧编程 (豆瓣)
因为Python是一门不需要花太多精力(甚至可以说很少),就可以基本掌握的一门语言,所以推荐这本书。题主提到以后想学机器学习,这是一本非常好的入门书,书中的例子源码都是Python实现的,并且能帮你迅速熟悉Python相关的各种计算库。
2、统计学习方法 (豆瓣)
考虑到题主要学得踏实,这本书深入浅出地讲了和机器学习有关的一切数学基础知识,一整本的干货,没有废话,非常值得一读。题主数学专业的话,读起来应该会比我更顺畅。
前景非常好,这两本书让我的年薪提升了不少,而且不会是死搬砖的工作。
想自学编程怎样下手?
406赞同反对,不会显示你的姓名
兰亭风雨,不过尘世一浮尘!公众号:兰亭风雨(lant…
罗杰文、Gorewaiiieuo、李easy 等人赞同
谢题主邀请,据我印象,题主应该是看了这个回答之后,普通二本搞计算机应该准备实习然后工作还是考研? - marton zhang 的回答,邀请的我,对吧?
貌似过了两天了,周末有空,才过来回答,见谅。
这次不留悬念了,直接来回答!
我没太仔细看题主上面贴的技术路线之类的图片,应该是某培训机构的,没参加过培训,也不发表意见。下面着重来回答下怎样自学编程:
1、首先,要搞清楚一点,计算机技术发展这么多年,新技术层出不穷,但是基础的东西是几十年都不变的。
从长远角度来讲,不要把太大的精力放在层出不穷的新技术上,比如HTML5、Hadoop等,这些只需要跟得住就可以了(但是要跟得住,至少也要有七八年对基础技术的研究),但实际上现在90%的程序猿基本都在追新技术,以至于android开发、ios开发这几年火到猪都能飞起来,其实这也很明显能折射出当前国内技术氛围的浮躁。
新技术层出不穷,不断更迭,但C/C++、Unix、数据结构、经典算法、TCP/IP、路由协议、操作系统原理。。。这些成熟的技术,基本是几十年不变的,Unix有40多年了吧,C++有30多年了吧,就连Java都有20多年了!
所以,第一点,要把基础打牢固,尽自己最大的努力,能打多牢打多牢。比如操作系统原理、计算机网络、数据结构与算法,这些也是互联网企业笔试面试的时候喜欢考察的地方。
这一块的学习,建议题主目前以看书、做题为主,当然如果你能自己写个数据库引擎、自己能搞个编译器出来,那最好,只要你有这个能力。
2、然后,鉴于国内浮躁的大环境,对新技术还是要找个点去专攻下,毕竟以后毕业了,很可能要靠这个吃饭。
现在的技术方向有很多,比如J2EE方向、云计算方向、Android开发方向、前端开发方向、机器学习方向(这个题主现在应该接触不到)。。。就当前求职及工作情况来看的话,最好是有一个主攻方向,主攻方向的技术最好积累的深一些,然后其他方向尽量也拓展下。
所以,第二点,这些技术方向,最好做到一处精,两处通,甚至处处通,当然如果你能做到处处精,那最好了,只要你有这个能力,这也是未来技术人员的趋势。
这一块的学习,建议是项目驱动学习,从零开始做项目,不断增加功能,项目中需要用到什么,就学什么,直至最后把整个项目的功能点做的比较完善。
-----------------------------------------------------------分割线总结----------------------------------------------------------------
总结:主要就是这两个大块头,一个是万年不变的技术,打牢根基,一个是不断更新的技术,顺应市场。