太迷茫了,感觉学不下去了_how to design programs-程序员宅基地

技术标签: 杂类  

太迷茫了,感觉学不下去了……

原创 良许 良许Linux 昨天

大家好,我是良许。

有个读者朋友跟我发了这么一段话:

良许大佬,我是您的读者,从2018年就开始关注您了,一开始得知您转行的故事,再到后面看您在职搞公众号,再到后面全职创业,一路看着您走过来,真心替您高兴!

您的故事深深触动了我,因为我也是非科班专业,我的专业是生物,但目前是一名公务员。虽然拿着稳定的工资,但我的职业生涯真的是可以一眼望到头。

您转行的故事对我产生了很大的影响,我现在也在自学转行,希望能够像您一样转行成功。但是我现在学习效率很低,计算机专业真的太多知识了,我越学越迷茫,感觉都学不下去了!

您能告诉我,您当年的学习路线是怎样的呢?当时是怎么学习的?非常感谢!

首先非常开心,我的故事能够影响到一些人,我写公众号的意义也体现出来了。我转行的经验还算成功,经常有小伙伴私信我请教转行的细节。

其实当年我也挺迷茫的,后面我通过培训班的教程大纲,还有自己的摸索,总结出来计算机专业基础学习路线的大纲。

要说「非科班如何自学转行计算机专业」,我觉得应该是包括下面三大块:

  1. 计算机基础知识;

  2. 特定业务技能;

  3. 解决问题的能力。

计算机基础知识,是根本,是任何从事编程工作的工程师都应该具备的能力,包括:计算机组成原理、计算机操作系统、计算机编译原理、数据结构与算法、各种编程语言等等。

基础知识是基本功,你基础打扎实了从事任何一个领域的工作,都会游刃有余。

特定业务技能,就是你所从事的细分领域所应具备的业务及专业技能。比如,你做嵌入式,就需要学习一些硬件知识;做算法,就需要掌握比较深的数学及算法知识;做人工智能,就要学习更多专业技能了。

现在企业的业务各不相同,所以细分出来的领域也非常多。想要做到每个领域都精通,几乎不可能。所以大部分程序员只能挑选少数几个领域进行深耕。

解决问题的能力,这个应该是各个企业都非常看重。企业是请你来解决问题,不是吃干饭,更不是来创造问题。这是程序员的软实力,你是菜鸟程序员还是资深程序员,差别就在这。

在学校里,遇到程序问题还可以跟同学们甚至老师一起讨论,但在企业里,大家都很忙,遇到问题几乎都需要自己想办法解决。

业务技能及解决问题能力,需要自己长时间的积累,以及刻意训练,甚至贯穿程序员的整个职业生涯。

而计算机基础知识,大家学习的内容都差不多,下面我就给大家总结一下,作为计算机专业的学生,应该掌握哪些基础知识。

本文较长,全是干货,5000字长文警告!!欢迎点赞收藏,便于下次阅读。

首先给大家看一张图,计算机专业学生大学四年一般课程安排:

图片

各个学校可能会有些许的差异,但基本上都大同小异。

所以如果想自学计算机的话,可以按照上面学校的课程安排,自己去学习即可。

但是,上面的这些课程,很多又非常杂,如果你时间有限的话,可以先抓住计算机基础知识部分学习。

计算机基础知识部分,又分为:基础中的基础(数学/英语)、计算机组成原理、计算机操作系统、计算机编译原理、计算机网络、数据库、数据结构与算法、编程语言等等。

这几部分内容,我又都做成了思维导图,大家可以看看:

图片


 

一、基础中的基础

 

 

俗话说,基础不牢,地动山摇。所以如果你想学好CS,一定要在学习编程语言、计算机组成、计算机操作系统、编译原理、数据结构/算法等等之前,先打好最基础部分。

最基础的部分一般包括以下内容:

  1. 数学

  2. 英语

这两块内容,对于任何想学习CS的专业课之前,是必修的基础课。

其实,等你工作到一定年限之后你就会发现,代码只是工具而已,不管你是用Java、Python、还是C++,其实这些语言都或多或少有相通性,最终的结果都是要用来解决实际问题的。

所以,为什么会有很多人非常擅长写代码,却成不了一个好的「软件工程师」。这也正是区别「码农」与「工程师」的关键之处。

而如果你想拥有非常好的业务能力,肯定会离不开数据结构和算法。而这两块都需要很强的数学功底。

而现在国外的计算机水平领先国内几十年,一些新技术、新框架往往都会先出现,所以你需要扎实的英文水平第一时间获取到这方面的信息。同时,如果编程过程中遇到问题,还可以在国外的论坛上得到更多的解答。

 

二、专业理论基础

 

 

在打好数学及英语基础之后,就可以开始学习计算机专业基础知识了。其中理论基础包括以下5门课程:

  1. 计算机组成原理

  2. 计算机操作系统

  3. 计算机编译原理

  4. 计算机网络

  5. 数据库基础

学好这几门课程,无论是你将来读研、读博,走学术路线,还是参加工作进入职场,走技术路线,升职加薪,都是非常非常关键的。

但是很可惜的是,现在太多人急于求成了,过于注重编程语言的学习,这4门课被严重忽略了,草草带过。

这是非常错误的行为!!如果你想成为一名优秀的软件工程师,这些课程一定要认真学习一遍!

很多人自学CS,一上来第一步就是开始学编程语言,比如Java/Python/C++,但实际上,学习编程语言不代表你就是学会了CS,编程语言只是一门工具而已。就比如,你学会了PS,并不代表学会了设计;你学会了打字,并不代表学会写作一样。

实际上,你完全不需要学任何理论知识,都有可能使用编程语言实现一些很简单且很实用的功能。但是,一旦涉及到更多需要基础含量的工作,理论基础扎实不扎实就马上体现出来了。

1. 计算机组成原理

计算机组成原理介绍了计算机的基础知识,包括计算机的各子系统(运算器、存储器、控制器、外部设备和输入输出子系统等)的基本组成原理、设计方法、相互关系以及各子系统互相连接构成整机系统的技术。

学好了这门课程,你的七大姑八大姨,或者你暗恋很久的翠花,叫你修电脑的时候,就会游刃有余。

这门课程不仅介绍了计算机软硬件的相关知识,也介绍了计算机的各大基本部件的组成原理、设计方法及相互关系。

书籍推荐

  • 入门系列

《计算机是怎样跑起来的》

《程序是怎样跑起来的》

《Computer Organization》

  • 深入系列

《计算机组成与设计:硬件 / 软件接口》

《深入理解计算机系统》

《计算机组成:结构化方法》

《计算机体系结构:量化研究方法》

视频教程推荐

1) 国外视频

视频则推荐伯克利大学 Brian Harvey 的 SICP 课程,CS61A。建议至少学完 SICP 的前三章,并把练习题做完。

CS 61A: Structure and Interpretation of Computer Programs

如果你觉得 SICP 的课程太难,可以选择 How to Design Programs。

How to Design Programs

还有两门课也很经典:

  • Harvard的CS50

CS50: Introduction to Computer Science

  • MIT的6.001

mit-6.001

2) 国内视频

  • 清华大学刘卫东老师的课程:

https://www.bilibili.com/video/BV1c4411w7nd?from=search&seid=12578695357351557326

图片

  • 哈工大刘宏伟(135讲)

https://www.bilibili.com/video/BV1t4411e7LH

图片

2. 计算机操作系统

即使不是程序员,每个人几乎每天都跟操作系统打交道(PC or phone)。简单来讲,操作系统是在为应用程序提供服务,比如:内存分配、进程调度、管理虚拟存储器,管理中断,管理磁盘,等等。

所以,对于程序员而言,你学了操作系统,你就会更加清楚如何去进行内存管理,如何进行进程调度。编写出来的程序也会比不懂操作系统的程序员更加优雅。

而且,不管对于大厂还是小公司,在面试或笔试的时候,都很经常考到操作系统,所以不管是工作还是为了应付面试,都需要好好学习一下操作系统。

书籍推荐

  • 入门系列

《现代操作系统》

《操作系统导论》

  • 深入系列

《深入理解计算机系统》

《自己动手写操作系统》

《操作系统真象还原》

视频教程推荐

1) 国外视频

  • MIT的操作系统公开课(http://pdos.csail.mit.edu/6.828)。MIT自己基于Unix v6开发的xv6类Unix系统。除了没有视频,课表,作业,考试等都有。youtube上有第四讲以后的所有视频https://www.youtube.com/watch?v=kDRHsNauoxk&list=PLfciLKR3SgqNJKKIKUliWoNBBH1VHL3AP

  • Udacity的Advanced OS公开课:Advanced Operating Systems from Udacity

  • Coursera上北大操作系统原理公开课(15年3月17日开课):Advanced Operating Systems from Udacity

2) 国内视频

  • 《操作系统原理》,清华大学老师的课程,讲得很浅显易懂。

https://www.bilibili.com/video/BV1uW411f72n

图片

  • 《操作系统》,哈工大李治军老师,32讲

https://www.bilibili.com/video/BV1d4411v7u7

图片

 

3. 计算机编译原理

 

编译简单来讲就是把高级语言翻译成计算机可识别的机器语言,但这个过程并不容易,而且,你理解这个过程也同样不容易。

编译原理是计算机技术中相当基础的一门技术,同时它也是计算科学中技术含量较高的一门学科,它和算法、数据结构、编程语言等都有非常密切的联系,对这些相关技术的深入学习提供基本的理论基础,所以学好编译原理不但对该技术非常重要,而且对于学习相关的技术也非常重要,掌握编译原理你才有机会掌握更多的技术。

编译原理非常难,而且非常枯燥,需要要很强的功底才可以入门学习。

书籍推荐

《编译器设计-第二版》

《编译原理》

视频教程推荐

1) 国外视频

  • CS143: Introduction to Compilers

  • CS243 - Program Analysis and Optimizations

  • CS 343

  • https://www.cs.cmu.edu/~410/

  • 15-411: Compiler Design (Fa'12)

  • 15-440/640, Spring 2015: Distributed Systems

2) 国内视频

  • 《编译原理》,哈工大,81集

https://www.bilibili.com/video/BV1zW411t7YE

图片

  • 《编译原理》,东南大学,廖力老师主讲,全64讲

https://www.bilibili.com/video/BV1cW411B7DW

图片

 

4. 计算机网络

 

在互联网如此发达的今天,几乎没有应用软件不连接网络的,所以对于一个程序员而言,不懂计算机网络的话简直寸步难行。

学习计算机网络,你需要懂得Socket编程,知道TCP/IP网络模型,了解OSI七层网络架构,知道一个数据包是如何层层包装,再层层拆包,从客户端发送到服务端。

计算机网络应该是除操作系统与算法之外,另一个面试常考的方向。所以,准备面试的小伙伴计网也一定需要好好准备一下。

书籍推荐

《网络是怎么连接的》

《计算机网络-自顶向下方法》

《图解HTTP》

视频教程推荐

1) 国外视频

  • http://www-net.cs.umass.edu/wireshark-labs/

  • https://lagunita.stanford.edu/c

  • Stanford的CS144

2) 国内视频

  • 《计算机网络》(谢希仁第七版)-方老师

https://www.bilibili.com/video/BV1yE411G7Ma

图片

  • 《计算机网络》,哈尔滨工业大学,李全龙老师

https://www.bilibili.com/video/BV1Up411Z7hC

图片

5. 数据库基础

数据库当然就是存储数据的地方,很多人自称CRUD工程师,但如果你连数据库都不懂,恐怕连这个称号都担不起。

一个软件在运行过程中,需要保存大量的输入信息,同时也会产生很多中间信息,所以数据库是必不可少的一个组成部分。它无所不在,网站的背后、应用的内部,单机软件,区块链里,甚至在离数据库最远的Web浏览器中,都有它的身影。

数据库分为关系型数据库和非关系型数据库,但近年来又出现了个NewSQL的东东,也需要稍微了解一下。学习数据库,你不仅要懂得SQL语句,表设计结构这些基础部分,还要懂索引、慢查询优化,配置参数调优,更深入的还要学习SQL优化、备份与恢复、架构优化等等进阶内容。

书籍推荐

  • 入门系列

《MySQL必知必会》

《SQL学习指南(第2版 修订版)》

  • 深入系列

《MySQL技术内幕——InnoDB存储引擎》

《Redis设计与实现》

《ZooKeeper:分布式过程协同技术详解》

视频教程推荐

1) 国外视频

  • 斯坦福的数据库公开课Introduction to Databases:http://www.db-class.org

  • 伯克利的 CS168 课程

  • https://archive.org/details/UCBerkeley_Course_Computer_Science_186

2) 国内视频

  • 《数据库系统概论》,王珊老师,中国人民大学

https://www.bilibili.com/video/BV1pW411W7Do

图片


 

三、编程语言

 

 

现在网上关于第一门编程语言的选择有很多不同的看法,主要都在争论是C还是python。虽然现在很多大V能说出很多理由选python,但是我在这里比较推荐C。

因为像python这样的高级编程语言更多的是面向API编程,或者说就是熟悉API,很容易给人造成一种假象:计算机就是调包然后各种花里胡哨。

然而C这种更偏向“底层”的语言更注重的是逻辑,可以帮你培养出非常良好的编程思维和习惯,尤其是指针章节,虽然的确新手不好理解,但是这块知识非常适合给新手初窥一下计算机系统的门径,后面学习其他语言和理论知识也是事半功倍。

而且C也没有OOP(面向对象)的特性,刚上手不推荐学很多很杂的理念,很容易把人的思维搞乱。

书籍推荐

《C程序设计语言》

C语言三剑客(《C和指针》,《C专家编程》,《C陷阱与缺陷》)

《C primer plus》

不推荐谭浩强的书,写得很烂,里面还各种错误。

视频教程推荐

1) 国外视频

如果听得懂澳大利亚的口音的话,这门课是从C语言入门编程最好的公开课。

讲课的教授幽默风趣,知识丰富。面向的学生也是大一新生。绝对值得一学。

C programming by Richard Buckland UNSW 2008

2) 国内视频

强烈推荐翁恺老师的这门公开课,讲得浅显易懂,口碑十分好!

https://www.bilibili.com/video/BV1sJ411E7St

图片

四、数据结构与算法

4. 数据结构与算法

大家或多或少都听说过,在企业面试的时候,数据结构与算法是必考的一部分内容。所以,你如果想要进入一个心仪的公司,一定要学好数据结构与算法。

但是,难道除了面试,数据结构与算法就没有用武之地了吗?肯定不是的!即使你整天的工作就是CRUD,但是如何你不懂时间、空间复杂度,你如何更合理调用那些API?如何降低功耗,提高程序运行效率?

而且,作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。

如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。

书籍推荐

  • 入门系列

《算法图解》

《大话数据结构》

  • 深入系列

《算法-第四版》

《算法导论》

视频教程推荐

1) 国外视频

  • Stanford: Algorithms

这门课由斯坦福大学计算机科学系教授Tim Roughgarden授课,适合至少掌握一种编程语言的编程学习者。斯坦福的课强调理论和概念上的理解。学完这门课后,对你今后面对技术面试时将会非常有利。

  • UCSD:数据结构与算法

Daniel M Kane、Pavel Pevzner等五位老师共同授课,这门课程的最大特点是理论和实践的结合,你将学习到解决各种计算问题的算法技巧,并实现大约100个算法编码问题。

  • Prin:Algorithms, Part I

Kevin Wayne和Robert Sedgewick共同授课,涵盖了有关算法和数据结构的基本信息,重点是Java实现的应用程序和科学性能分析。第一部分包括基本数据结构、排序和搜索算法。第二部分重点讨论了图形和字符串处理算法。

2) 国内视频

  • 《数据结构》,浙江大学陈越和何钦铭教授联合授课,其大名在计算机领域可谓耳熟能详了。

https://www.bilibili.com/video/BV1JW411i731

图片

  • 《数据结构与算法C++版》,由由北京大学张铭教授等七位授课老师全力打造,国家精品公开课。

https://www.bilibili.com/video/BV1R741117bK

图片

  • 《数据结构》,武汉大学李春葆教授

https://www.bilibili.com/video/BV1gb411C71L

图片


 

写在最后

 

 

小伙伴们如果有任何问题或烦恼,都欢迎跟我交流哈,良许在线陪聊~太技术性的问题我可能回答不上来,但关于转行、副业、职场,我还是可以有干货可以分享的。

我的私人微信:coderliangxu-6

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wzlsunice88/article/details/116262922

智能推荐

【九度】题目1090:路径打印 && 【LeetCode】Simplify Path_打印目录结构 leetcode-程序员宅基地

文章浏览阅读1.3k次。1、题目1090:路径打印时间限制:1 秒内存限制:32 兆特殊判题:否提交:1319解决:230题目描述:给你一串路径,譬如:a\b\ca\d\eb\cstd\你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录向右缩一格,就像这样:a b c d eb cstd同一级的需要按字母顺序_打印目录结构 leetcode

如何使用Cordova将SAP Fiori应用打包并安装到Android平台上_fiori发布安卓-程序员宅基地

文章浏览阅读591次。There is a wonderful tutorial Building SAP Fiori-like UIs with SAPUI5 in 10 Exercises written by Bertram Ganz.In this blog, I will show step by step how to package the UI5 application built by this tutorial as a native application into your Android device_fiori发布安卓

程序员代码面试指南下(7-9)-程序员宅基地

文章浏览阅读182次。目录第7章 1 不用额外变量交换两个整数的值(士 ★☆☆☆) 2 不用任何比较判断找出两个数中较大的数(校★★★☆) 3 只用位运算不用算术运算实现整数的加减乘除运算 4 整数的二进制表达中有多少个1 5 在其他数都出现偶数次的数组中找到出现奇数次的数 6 在其他数都出现A次的数组中找到只出现一次的数第8章 1 转圈打印矩阵 2 将正方形矩阵顺时针转动90度 3 之..._if (map.containskey(xor)) { int pre = map.get(xor); mosts[i] = pre =

uva-1399 Puzzle-程序员宅基地

文章浏览阅读152次。AC自动机上的dp

C++中 sprintf函数的用法_sprintf %c-程序员宅基地

文章浏览阅读871次。C++中 sprintf函数的用法1.常用方式sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了,看个例子就明白了:例:将”test 1 2”写入数组s中#include<stdio.h>int main(int argc, char *avgv[]){ char s[40]; sprintf(s,"%s%d..._sprintf %c

Java开发的医院门诊挂号系统_医院预约挂号er图-程序员宅基地

文章浏览阅读2.2k次。医院门诊系统,挂号预约系统,有四个角色(管理员,医生,护士,普通用户)_医院预约挂号er图

随便推点

Android Socket Demo [ 附客户端与服务端源码 ]_android socket客户端下载-程序员宅基地

文章浏览阅读818次。如果要跑通demo首先: 服务端我是用 intellij idea 开发的。如果用其他软件打跑不起来就用 intellij其次: 要将手机跟电脑连在同个网络下最后: Constants的ip地址要填写上电脑的ip地址实现功能:客户端连接服务端,客户端发数据到服务端,客户端收到服务端发来的数据服务端收到客户端发的数据,服务端发数据给客户端贴部分核心代码客户端连接服务端:首先客户端连接服务端必须要在线程里(后面的是 ip地址 跟端口,端口是服务端的socke..._android socket客户端下载

定制win10桌面_win10联想 自带主题-程序员宅基地

文章浏览阅读1.3k次,点赞4次,收藏7次。壁纸在文末先上几张美化后的照片 主题链接win 10 美化相信很多人都厌倦了win10原装主题了,陈旧的窗口边框,一如既往的图标,老掉牙的窗口样式和菜单栏……算了,就不吐槽了,直接上教程吧!前方高能第零步关掉杀毒软件(新手建议卸载),这点非常重要,如某数字,某讯,某霸,如果关掉以后放心不下自己电脑的安全,以下文章请勿食用!(后果自负)第一步破解原装win10系统主题。友..._win10联想 自带主题

jQuery懒加载插件 – jquery.lazyload.js简单调用-程序员宅基地

文章浏览阅读57次。 Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的.在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担。一、下载和引用  ..._jq.lazyload.js配置

mysql_172.25.2.1-程序员宅基地

文章浏览阅读404次。一.cmake升级https://cmake.org/download/ #cmake下载地址 yum install jsoncpp-0.10.5-2.el7.x86_64.rpm jsoncpp-devel-0.10.5-2.el7.x86_64.rpm -y yum install cmake3-3.6.1-2.el7.x86_64.rpm cmake3-data-3.6.1-2.el7.noarch.rpm -y二.mysql编译安装升级gcctar zxf mysql-boost-_172.25.2.1

基于Numpy的线性代数运算_numpy线性代数运算-程序员宅基地

文章浏览阅读737次。标题中的英文首字母大写比较规范,但在python实际使用中均为小写。1.Numpy中的matrix1.1 创建matrix对象numpy.matrix方法的参数可以为ndarray对象numpy.matrix方法的参数也可以为字符串str,示例如下:import numpy as npm = np.matrix("1 2 3;4 5 6; 7 ..._numpy线性代数运算

搭建LAMP环境(源码方式)_this software is subject to the php license, avail-程序员宅基地

文章浏览阅读3.7k次。源码方式,搭建LAMP环境。_this software is subject to the php license, available in this | | distribut