各位大佬好!
我是一个菜鸟程序员,作为非科班出身,自学转行的半吊子,希望能系统的补习一下基础知识。
这两天在看算法方面的书籍,但是像《算法导论》这样的大砖头真心啃不动,于是先看了一遍《算法图解》,但又感觉太过入门,不够系统,浪费了挺多时间。
希望有经验的大佬指条明路,推荐一些适合非科班选手入门 + 进阶的图书,能系统地补习一下基础知识。
个人理解至少需要补习的方向有:
计算机基础
数据结构 + 算法
设计模式
......
请大佬们帮补充方向 + 列书单,跪拜!
个人推荐 APP
A Programmer’s Perspective,中文书名叫做《深入理解计算机系统》。
之所以推荐这本是因为在很多 CS 专业会把这本书作为其他课程的基础课,而且这本书可以说非常全面。
最近我又重新看了 3 分之 2,又有一些新的收获。
第二章讲编码,三、四章讲汇编指令集和 CPU 结构,第五章结合三四章的内容讲一些程序优化。第六章讲存储体系和 cache,第七章讲编译原理。第八章讲中断和异常处理,第九章讲内存管理。后面三章分别讲 I/O、网络和并发。
这本书野心很大,将本来好几本书的内容整合到一本里,但是总体完成度很高。
可以一边读一边看国外的视频课程,做做习题。每章至少读三遍,完成这本教程以后,基础知识应该比较完整了。
这个时候再学别的很快,比如再去看《Understanding the Linux Kernel》时就会毫无难度,因为底层的东西几乎覆盖了。
推荐一本操作系统的书,Operating Systems: Three Easy Pieces:http://pages.cs.wisc.edu/~remzi/OSTEP/
免费的,是 UW-Madison CS 本科生的教材,非常易读
推荐几门公开课:
入门 CS50,基础 CS61A,算法 CS61B,这些在网上都可以找到,除了视频,还有课后作业(project)。
工程方面,推荐 CS169,前几年一直是用 RoR 讲的。
网络、操作系统这些,只在大学里学过,没上过公开课。都是根据具体问题学的。不过不只看一本书,而且也不仅仅是看书。
美国的课程,有几部分,上课讲、讲义、课后项目、助教辅助。教材一般会推荐几本,讲到具体的内容,会推荐相应的章节去看。老师的态度也是,你爱看不看,把问题搞清楚了就好。这样的话,就会发现,一门课程下来,一本书都没完全读完,但又多了好多书。有些书,其实是参考资料,当 wiki 用就好。
还真想不出来要推荐什么书,不过 算法导论 不推荐,很多人能背出算法的 i,j,k,但却说不出算法思路。算法推荐 算法引论。
推荐 CS61A 的课堂笔记。
再就推荐 设计数据密集型应用。很成体系,适合自学。
好的书和课程,不是面面俱到,而是要画好一个骨架,然后可以根据这个骨架,去添加血肉。
前辈介绍的很具体,最后的总结也很有指导性。
算法引论这本书之前自己了解过一些,觉得很有启发性,但是一问算法,大部分人都推荐算法第四版还有算法导论这两本,前辈的分析让我肯定了对算法引论这本书的选择。谢谢!
CSAPP(深入理解结算机系统)那本我推荐,可以说是浓缩了大学四年的所有理论课的主干知识,但是那个厚度(我读过第二版,这个书后来的改版越改越厚)...估计不会有太多精力读别的了。
我觉得你肯定能学会,但是最大的问题是能坚持多久。。。工作之后系统学真的很难,要 996、要学习应用层的技术、要了解业务上的知识、要陪老婆孩子(追求爱情)、要照看爸爸妈妈。。。
我建议你组合一下,你用 Ruby、Java、JS 等很难接触到的计算机基础是数据在内存里怎么被表示的,学一下 Rust、C、CPP 都可以,然后接着去搞一下数据结构,树搞明白二叉树,知道平衡树是什么东西就行了,红黑树面试要被问,你就反着干回去问面试官怎么写(当然面试官真能撸出来请跪下表示屈服),图也是理解最基本的表示,这过程基础算法也就都涉及到了。
设计模式牢记好 SOLID 五个原则,工作的时候尽量实践,然后看书对设计模式产生印象,还有读一些质量不错的开源项目去分析他用了啥模式就行,没有针对性学习的必要(不同语言设计模式有很多差别,经验不足很难融会贯通)
OS 要学可以看看那些 xx 天实现操作系统的书、教程,主要破除神秘感,实用的话,关注一下 网络、内存、线程/进程 这几个方面
前辈您这指导相当生动接地气儿啦!(红黑树那段我笑出了声)
就像前辈说的,时间和精力真的是感觉越来越不够用了,可能看一个框架一个月能基本上手干活,但是看一个月算法可能门儿都没入,大多时候迫于工作出结果就选择了前者。所以,对于坚持这个事,我真不敢夸下海口。现在被逼得每次上大号都会多上十分钟,在里面看算法书。。。
但不管怎么说,我还是要挑战一下自己,不以面试为目标,也不以炫技为目标,就为了不给自己的程序员生涯留下遗憾。(决心表完了,嘿嘿~)
感谢前辈愿意花时间码字指导!(敬礼~)
https://b23.tv/av21376839/p1 【计算机科学速成课】[40 集全/精校] - C rash Course Computer Science 我不知道这个对不对你口味 你可以自己看看试试 利益相关:我是译者之一
哈哈!这个思路挺新颖,一举两得。
记得大学时,我们学校报考的二级都是 C 语言,当时为了考的容易一些,特意跑到隔壁一个师范学校报了一个 Access 数据库,还嘚比嗖嗖地给一起考试的小姑娘传答案(后来坑蒙拐骗取了其中一个小姑凉。。。)
考二级的时候,内心的 OS 是,以后我可不要当程序员!结果兜兜转转还是做了程序员。。。
编程语言不光光只是计算机专业学的,电子,自动化等专业也会学习如 C 语言,汇编,C++ 程序设计之类的语言,那以我们电子系专业而言,还有单片机原理,数模电,信号分析与线性系统等,那最后你走哪个方向才会深挖。我们同学有的做销售了,那就看鸡汤书籍,做应用工程师或者半导体了,数电模电书就要一直拿着翻了,做单片机那汇编语言,c 语言就是常备书籍,做 PC 端就是 C++,C#,更多是看网络解决方案,如登录 stackflow, csdn 等网站需求解决方案了。 所以关键不是你是否是计算机或者非计算机专业的,而是需要看你走哪个方向,细分,很多理论性的东西,会把你看得头晕目眩,最后工作中可能只用到那么 10%,而且还不如有经验的同事告诉你怎么回事来得快。 所以找准你要走的方向,再去看看相关基础书籍,大部头,纯理论的东西没必要看太多,所谓纸上得来终觉浅,做过才晓得。也就是这个道理。 ruby 这块坛子里很多人是我老师,吹牛逼我是老师了,哈哈。
谢谢大兄弟~
弱弱地说一下,其实我深挖的方向是 web 前端。。。挖了这些年有点挖厌倦了,毕竟前端能够创造出的价值非常有限。
我也不熟悉互联网方面的技术,只是纯从这么多年学习经验来看的话,人的精力都有限吧,把一个细分领域做好,做到专业就难能可贵了,全面铺开而深入有点难度。
没有,身边做了很多年的基本上都是10y+的AE(应用工程师)或者模拟设计工程师,手边都会有一本模拟电路(清华版,绿色的)。10Y+的MCU开发工程师手边都是一般谭浩强的C语言基础。那我们写C++,C#的一般都是深入浅出MFC(侯俊杰)。这么多年也没发现更好的。
很多理论性的东西,会把你看得头晕目眩,最后工作中可能只用到那么 10%,而且还不如有经验的同事告诉你怎么回事来得快。
这点不是特别同意,一个人很多时候不会学习他不知道的知识,因为他不知道他所不知道而又缺少的东西。有些东西不需细学,走马观花即可,大致有个印象,概念。至少等以后可能需要的时候,不是张口就问,而是自己知道该学什么来解决这个问题,一般情况都是有时间/缓冲来供你学习而解决问题的。经常问别人问题,那是新手才干的事情。
这个我肯定是同意你的说法的,有问题张口就问是很遭人讨厌的,有问题了,先自己想想是不是自己的问题,一般而言 80% 都是自己的理解问题,10% 是文档说明没说清楚发生歧义,10% 是别人的问题。10% 是别人的问题的,也需要提问者拿出足够的证据从侧面证明是开发者的问题,这样开发者一下就能明白自己的问题是在哪,很高兴的去处理。 在这句“不如有经验的同事告诉你怎么回事来得快”是指,比如你看到同事在用某款软件时,非常快速的用一个快捷键搞定问题,你可以问他比去翻软件使用手册快,再比如对于多态,接口,虚拟继承理解不够深刻,拿出问题来问,资深程序师给出的理解会比书本给你的更深刻。 至于 bug 或者 issue,回到第一段处理方式。
所以事实上,在做我们这个方向的软件的时候,是常常让各个模块把自己内部的数据信号拉出来的,这样在调设备或者芯片的时候,为区分是硬件问题还是软件问题留下足够的证据。不然扯起皮来没完没了。
如果要学算法,我个人推荐一本书,图灵出版社的《算法图解》,易懂,图多,有漫画有比喻。 在出中文版之前我就看了英文原版《Grokking Algorithms: An illustrated guide for programmers and other curious people》最近因为面试要刷新下数据结构和算法的相关记忆,去广州图书馆借了中文纸质版(免费的)又简单刷了一遍