Here lies one whose name was written in water.

零基础java是看韩顺平好,还是看赫尔辛基大学的java programming和cs61b配合使用好啊
本人北美转码,要死要活一年半之后顺利上岸faang啦!自己转码的时候用了一个很棒的网站:https://csdiy.wiki,是一个北大转码大神列出的他上过的课程。简直仰望。结合自己的转码经历和这个课程列表想给大家推荐一个亲测可行的自学转码后端道路。
写在最前面:
所有转码的jm肯定在开始转码面临的第一个问题就是:前端 or 后端。前端自学可能性比较大些,因为基本市面上的网课都是面向前端的。一般js/css/html三件套就可以解决了。比如特别火的yelp camp之类。后端一般会学习曲线陡一点,门槛也高一点(当然好处可能是就业面广一点)。尤其如果想做云服务,infra和system这类,所需要的知识结构是很难通过udamy之类轻量的网课达到的。所以我个人认为比较好的途径就是直接上大学的课程。如果已经不在学校或者没办法选cs课程怎么办呢?不过所幸现在网络资源发达,各种课程应有尽有。如果你拿不到mit的某门课程资料,还能找到cmu的不是?(狗头
下面列一下我觉得作为一个后端工程师需要的课程。相信我,你都学完了完全是科班水平了!
我预估如果足够拼,有小伙伴一起讨论,全脱产学习1-1.5年绝对够(我是大概一年学完的,基本7天不休)。
适合的人:
这不是一份速成转码教程。如果想要速成,应该尽快做接近工业界的项目然后刷题找工作。这个学习计划是给没有任何cs经验的姐妹提供一个有迹可循的,可以接近科班水平的自学路线。我之所以选择了这条路是我始终觉得,打好基础还是很重要的,尤其是建立系统的知识体系。
我的建议:
- 一定要做作业。这些名校课程的作业都是仔细打磨过的,不光是课程知识的重现,很多时候是延展。不做作业=上了个寂寞。
- 不要纠结于还不会一门语言。语言都是边做作业边学的。而且语言向下兼容容易,向上难,所以在python入门之后要尽快开始学Java/c这类比较复杂的语言。我吃了一个亏就是一开始一直在学和用python,等开始学java的时候哭的心都有了,再学c的时候又哭了一次。
红色为知乎回答
下面是推荐的课程列表:
- 入门+语言:
- ucb 61 a+b。学完的话python+java应该没问题了。数据结构和算法不用再学了,这门课的应该足够用一辈子了。
(mit 6.001, cs50,后者主要是拓宽一下视野;阅读 计组趣味入门书《编码》,可以边看边玩一个 steam 游戏 mhrd)
- 另外还需要1门c。我当时是自学的,但看了上面那个网站里的列表,或许duke那门c programming可以。c是一定需要的。官方说法是:不会c,就不懂内存指针,不懂计算机到底是怎么运作的,没法对内存,运算和数据有本质的理解。简短点说就是:因为大部分基础课都是基于c/c++的。
- 系统
- 体系结构:强推CMU 15-213 CSAPP。如果努力学下来,基本cs入门了。从编译,内存,信号,进程到网络这些应该都有了解了。不要怕艰难,这门课好像cmu的人也觉得难,听不懂就反复听,看教材,看中文笔记,问问周边科班的人。我上的时候基本像是在听天书,结果某一个瞬间突然明白了,就好了很多。一定要做作业。
- 南京大学操作系统课及附带的 lab(b站:绿导师原谅你了)
- 计算机网络:我会推荐马塞诸塞大学那门computer network。虽然Stanford cs 144那门看起来更硬核,但network真的太低层了,我觉得概念上理解就好了,主要是网络传输TCP/UDP这些,是为了分布式系统打基础,不用非要手写router了。
(个人认为进阶阶段最重要的课程是操作系统,一门课能覆盖的知识是有限的,这是为什么既要看 csapp 又要学南大操作系统。有条件最好能跟着清华的 rCore 再造一遍轮子)
到此,再刷刷 leetcode,就能作为一个应届生拿到大厂后端甚至基础架构岗位的校招 offer 了。(实际上这些课我好多知识没吃透都拿到 offer 了……)
- 数据库:其实后端呢,就是计算机-网络-分布式-数据库这几大块。学到数据库,那你基本要成功了!数据库这部分ucb和cmu的两门都可以,区别主要一个使用java,一个用c++。ucb的课程短一些,cmu好像更长一些,底层东西讲的更多。其实这门课解决的问题除了b+树这种查询上的基础知识,还有就是并发,恢复,以及死锁处理这种比较偏向系统的知识。
- 分布式系统:mit这门课声名在外,一定要学,一定要做作业。学完csapp和network,这门课应该学习曲线不会太高。当然难还是很难的。学完这门课基本对大规模的分布系统的设计,优化,一致性,故障恢复这些有了很全面的认知了。这门课我认识的很多要跳槽senior的人都在看,属于常看常新的课。
- 应用
- 软件工程:软件工程基本是教你一套开发模式,和一些开发中可能会用到的方法。比如git怎么用,文档怎么写,测试有什么方法,design pattern是啥,前后端是干嘛的等等。属于非常实用的课程。会让你的代码变得非常好看。在这个列表中我觉得MIT的更系统一点。但如果需要证书,ucb好像可以edx认证。
- 网站设计:在找工作的时候发现如果全做很底层的这些系统项目,可能会选择面比较窄,过简历不是很容易。推荐再上一门web开发,一方面扩展自己的skill set,另一方面也有一些比较便应用的项目,增加上岸机会。
这个path不知道国内这种比较看教育背景的环境是不是可行。但亲测在北美完全ok,学完直接上岸(当然题还是要刷的)。额外的好处就是转码选手经常会遇到计算机基础知识答不上来。我学完这些课答基础知识斩瓜切菜,连某抖这种很国内面试风格的面试官都连说impressive。
姐妹们加油冲鸭!
补一个时间表:
2个月: ucb 61a b
4个月: 学c,cmu csapp(这是最难的一部分,一度想放弃。一定要咬牙坚持下来。当时这个时候还学了个sql,后来发现做sde没太大用)
3个月: network + 分布式 + 从分布式学到一半多开始开了数据库
2个月:数据库学完,学了web
2个月:学了软件工程。开始找工作了
另外就是刷题一直没断过。
转码计划:目前是打算学完CS50,然后看MIT Missing Semester; 然后跟着Mosh学Python(可太喜欢Mosh的SQL了),学完之后61A;接着跟着Mosh学Java,学完之后61b……
目前进度:CS50已经学完C,开始学Python那节了。实话说,对零基础还是蛮有难度的(而且有些题目我看懂题目都要花一两个小时…),光学C我就花了快一个月(每天学习差不多5-6个小时那种,一方面想多学一方面又不想逼迫自己,后面就想着佛系一点算了)。说到每天花费时间这个,番茄时钟真的很有用,一开始我就每天坐下学习不给休息时间,导致进度超慢(想不出来硬想,哭),用了计时器定时休息之后效率提升很多,另外也会提醒自己这个花费太多时间了,直接看solution理解吧。所以后面进度快了很多。
另外还想说,几年前心血来潮学了Python,卡在for循环了,然后在CS50听懂了!虽然只是一点点进度,也是好的~第一次自己做出来作业也很开心,虽然大部分时候都是要靠ChatGPT(有时候发现ChatGPT也检查不出来Bug,还说得靠自己,换个思路不就是它还没法取代人工不是!虽然也可能因为我不是会员的)和油管视频才能完成~