其实我不太建议完全按照国内学校的计算机培养方案来学习...虽然国内的教育水平在不断提高,但是在计算机人才的培养上,还是容易偏向理论重于实践,如果你未来是想求职计算机的话,按照大学的培养方案学习是完全不够的,我在之前的回答里也详细分析过这个问题:
所以接下来的分享我会注重一个要点——求职实用性
科班与非科班程序员的区别主要就在于“编程基础四大件”的掌握程度,作为求职路上的高频考察知识点,只要小伙伴们掌握好这四大件的基础,就能够实现个人能力的提升,从而帮助自己在工作领域有更好的发展。
首先第一件,“
数据结构与算法”。算法能力是衡量程序员能力的一把利器,作为非科班程序员,大多数时候学习算法只能靠自己硬刷题,缺乏一些好的学习方式,没有把算法题目理解举一反三,这样就会出现有时候面试能通过是靠“记忆”算法答案的情况。因此对于非科班程序员来说,算法能力的欠缺无疑是工作中抽象思维和解决问题能力上的一大挑战。
为了在这方面得到提升,要做到把集中基础的数据结构烂熟于心,例如字符串、二叉树、
堆栈、队列等等;除此之外,对于基本的算法步骤也要了如指掌,比如查找、排序、
动态规划等。建议大家在刷LeetCode上的题目时候,也可以多看看优秀的solution的代码,尝试用更好的数据结构或者算法步骤来解决抽象化的问题。
第二件,“操作系统”。操作系统是很多编程语言能够运行的基础,不管你用的是Java,还是C++,你都要对操作系统有一定程度的了解,操作系统是你理解各种高级编程语言的基础,特别是后端编程,我们需要考虑内存管理,考虑并发编程,考虑
网络编程,等等,这些东西都必须跟操作系统打交道。这里大家需要掌握进程与线程的相关原理,
原子性并发锁、内存相关原理、内存的分布与调动等。这里推荐CMU的公开课15213:Introduction to Computer Systems这门课程,上完之后就会感觉脱胎换骨了。
第三件,“
计算机网络”。计算机网络指的是TCP/IP
协议栈,可以说它是当下互联网通信的基石。关于这部分,大家需要重点学习与掌握其背后的相关原理,这里篱笆老师向大家推荐这本书(《
TCP/IP详解卷一:协议》,作者W.Richard Stevens),这本书讲明白了网络通信之术,即TCP/IP协议簇的工作过程,逻辑清晰,能够对大家有所启发。
第四件,“系统设计”。能够写代码固然很重要,能够设计好的代码功能模块和系统架构就是更牛逼的程序员了。在这里增加自己的经验的方法有多学习其他人的产品技术文档,多逛一些开源的github项目, 并且在自己实际工作中,可以先多花时间思考系统设计的问题,再下手来coding。这里篱笆老师也推荐大家去学习一下24种Java常用设计模式, 在
软件工程中,设计模式是一种通用的、可重复使用的用于解决问题的软件设计方法。使用成熟可靠的设计模式,可以提高代码复用性,节省开发时间,从而实现功能更强大、高度可维护的代码。
希望以上分享对你有所帮助,也欢迎留言和私信篱笆老师免费咨询哦~