电子信息工程最好的出路的是什么?

沉默王二学习建议学习建议约 5142 字大约 17 分钟

最好的出路,在我看来是读研,然后做 IC;如果不想读研,想早点赚钱,建议转计算机专业;如果还想折中,考虑做嵌入式

说下我了解到的。

一、IC

IC 就是半导体元件产品的统称,主要分为数字 IC 和模拟 IC。数字 IC 就是传递、加工、处理数字信号的 IC;模拟 IC 是处理连续性的光、声音、速度、温度等自然模拟信号的 IC。

数字电路 IC 处理的是数字信号的器件,比如 CPU、逻辑电路等;模拟电路 IC 处理的是提供模拟信号的器件,比如运算放大器、线性稳压器。

模拟 IC 的厂商国内外知名的不多,比如说国外的德州仪器,国内的艾为电子。

反观数字 IC,国内外知名公司真不少,比如说 nvdia、AMD、中兴、海思等。

从入门门槛上来看,模拟比数字的门槛高一些,模拟如果想做的好一点,研究生学历是必须的,读博更好;数字门槛也不能说低,如果足够优秀,本科也是可以顺利就职的,版图岗位的要求更低一些,只有要数电、模电的基础,对大专生也是比较友好的。

至于薪资的话,如果是名校出身的科班生,50 万的薪资可以说羡煞旁人了。

二、计算机专业

从技术应用的角度来看,在相当长的时间里,社会对计算机从业人员的缺口都非常大。因为,各行各业都需要计算机专业的人员参与进来,进行数字化的改造。举个例子,我在某 2 线城市的 5 年计划中,看到这样一条:

未来5年内,借助互联网技术,着重提升群众办事的满意度,从原来“只跑一次”,变成“一次也不用跑”,打造“24小时不打烊”的政府窗口。

大家想一下,按这个思路,各行各业,全国上下铺开,是多么大的一个工程量,对计算机从业人员的需求量,可想而知。

另外,像专业领域的软件,完全被国外吊打。

  • AutoCAD、solidworks、proe、creo等3维设计软件,实体制造业,包括家电、家居、装修、机械、服装设备、各种设备制造、生产线制造
  • Adobe家族,设计、阅读行业,设计行业
  • ansys、fluent、MATLAB,结构应力分析、流体分析,所有有中高端实体产业、大型企业、科研所、尖端行业
  • CATIA 汽车行业、新能源行业
  • protel,电气行业,电路设计等等,涉及所有通电的数码设备,小到耳机,大到手机、笔记本显示器、家电等等

这些专业领域的软件,就需要更多计算机专业的人员参与进来,并且坚持做 5-10 年才有可能赶得上。

所以,电子信息工程专业转计算机专业也是一个非常好的选择。

计算机行业对于普通人来说,仍然是改变命运的绝好机会。相对来说,传统行业更注重资源,背景、人脉尤其重要,普通出身的人想要晋升,难度相当于爬 90 度的梯子。当然了,如果能把传统行业和互联网结合起来,那一定也能创造出巨大的价值。

古人云:两害相权取其轻。

往下看,是待遇低微、前途灰暗、血肉磨坊般的传统工科;

往上看,是门槛高、依赖家庭资源、依赖学校出身的金、法、医;

中间的计算机,算是这个时代给予贫寒子弟仅有的一点温柔。反正我就是靠着计算机专业完成逆袭的。晒张图,这是我的家乡,虽然树很多、空气也很新鲜,但确实比较穷。

我之所以能够逆袭成功,因素有很多,但我想以下这三点非常重要:

  • 父母的支持
  • 自己的努力
  • 选择了计算机专业

这里也分享一套非常完整的计算机必读的经典书籍,对计算机专业的同学会有非常大的帮助,这也是我十多年编程生涯里留下的宝藏计算机经典书单open in new window

里面的书单真的非常 nice,不管是学习编程的新手,还是工作多年的老手,应该都很有帮助

戳:计算机必读经典书单(可 download)!open in new window

这里重申一下我学习计算机的理论观点吧,如果要转计算机的话,我想对你快速建立起自己的知识体系很有帮助!

如果你要学习物理,我推荐你顺着物理的发展史学习,先学习牛顿的经典物理,再学习热力学、电磁学,然后学习相对论、量子力学这些彻底推翻经典物理的,最后学习电动力学这种硬核的。

整个学习过程,是自底向上的。但是学计算机,这样行不通。

先学习电路,然后学习冯诺依曼结构,造一台计算机?接着再学习如何用汇编写个 mini os?接着学习如何写一个简易版的编译器?最后再学习高级编程语言,比如说 Java、Python?

显然这样是行不通的!计算机的学习最好是自顶向下

什么是顶?我想一门高级的编程语言就是,比如说 Java、C++、Python!

当你学习到 Java 并发编程中的“原子性”、“同步”、“异步”、“进程”、“内存分配”这些概念的时候,你自然而然会产生很多疑问,然后就会去学习计算机组成原理、操作系统,然后你的一系列问题就会逐渐被解决。

当你发现,用 Java 实现某个业务需求时,人家的算法实现比你快得多,你自然会好奇,为什么会这样?然后你发现人家用的数据结构和你的不同,然后你就会去学习数据结构,接着了解一些高效的算法,比如动态规划等。

那么接下来,再来说说计算机专业的学习路线吧,需要的学习路线的同学可以 mark 了!非常硬核,值得收藏和点赞。

一、Java 语言基础

初学者可以到通过《Java程序员进阶之路open in new window》进行学习,也就是本站,这是一个风趣幽默、通俗易懂的 Java 教程,对 Java 初学者极度友好和舒适,内容包括但不限于 Java 语法、Java 集合框架、Java IO、Java 并发编程、Java 虚拟机等核心知识点。

更详细的学习路线戳:https://tobebetterjavaer.com/xuexiluxian/java/yitiaolong.htmlopen in new window

二、开发框架

可能很多人会对开发框架嗤之以鼻,感觉学这个没多大用处,提升不了你的技术功底。但是呢,如果你想做练手项目,没有开发框架的帮助,很难。

Java 之所以流行,很重要的一部分原因就是拥有 Spring 系列框架这个大杀器,包括 SSM(Spring+SpringMVC+MyBatis)、Spring Boot、Spring Cloud。

我们只是不应该停留在只会用的层面上,要懂背后的原理。说一千道一万,Spring 的核心就两个概念:AOP、IoC。

AOP(Aspect-Oriented Programming),也就是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

IoC(Inverse of Control),也就是控制反转,是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。

先学习 SSM,再学习 Spring Boot。Spring Boot 的出现,并不意味着 Spring 和 SpringMVC 已经过时了,从设计目的上来说,Spring Boot 只是实现了 Spring 的自动装配,降低了项目搭建的难度。

从技术角度来说,Spring Boot 的底层依然是 Spring 的核心机制,也就是 AOP 和 IoC,Spring Boot 只是一个承载者。在我看来,学习 Spring 的正确路径应该是 Spring -> Servlet -> Spring MVC -> Spring Boot。

三、数据库

增删改查,增删改查,要想做一名只会 CRUD 的程序员,数据库这块是逃不掉的。不过,这里就不重点说了,推荐一些资源给大家。

小破站上的三个视频。

四本书。

  • 《SQL 必知必会》
  • 《高性能 MySQL》
  • 《MySQL 技术内幕-InnoDB 存储引擎》
  • 《Redis 深入历险核心原理与应用实战》

四、计算机组成原理

计算机是由 CPU、内存、输入输出设备,这些硬件组成的,但我们程序员,往往从事的是软件开发的工作,怎么在硬件和软件之间搭起一座桥梁呢?

答案就是学习计算机组成原理。

计算机组成原理的知识点可以拆分为四个部分:

  • 计算机的基本组成硬件
  • 计算机的指令和计算
  • 处理器涉及
  • 存储器和 IO 设备

按照冯诺依曼的体系结构,计算机分为运算器、控制器、存储器、输入输出设备;我们编写的代码,要想在计算机上运行,就需要通过编译器转成汇编代码,再经过汇编器转成一条条指令,这些指令的执行,是由控制器来完成的。

计算机组成原理该怎么学呢

如果英语功底非常不错的话,安利一门 Coursera 上的课程,从与非门到俄罗斯方块,简单来说,这门课会教你怎么从与非门开始造一台计算机。

地址:https://www.coursera.org/learn/build-a-computer​www.coursera.org/learn/build-a-computeropen in new window

这门课的视频拍的那叫一个优质,虽然没有中文翻译,但视频下方的字幕会有节奏的移动。

国内的推荐哈工大的这门视频课,整体评价非常高(建议 1.5 倍速食用),戳:计算机组成原理(唐朔飞)哔哩哔哩_bilibiliopen in new window

五、数据结构与算法

可能有人会觉得:就算不懂数据结构与算法,照样可以把 Java API、开发框架用得飞起?

但这里我想表达的是:

1)数据结构与算法是很多大厂筛选人才的要素之一

这是因为校招的时候,参加面试的学生大多数都是没有实际项目经验的,公司只能通过考察这些基础知识来筛选。

大厂不怕你没有项目经验,而怕你没有长期发展的潜力。所以,很多参加校招的同学,在面试前都会疯狂刷题的,至少会突击个 100 道左右的题目。

2)实际工作当中肯定是会用到的。

举个例子,存储某个业务数据时,你打算用 ArrayList 还是 LinkedList,它们底层用的是哪种数据结构,增删改查上有哪些优缺点?

再比如,Redis 中的有序集合是用什么数据结构实现的?为什么要用跳表二不是二叉树呢?

不懂数据结构和算法,行得通吗?

3)掌握了数据结构与算法,对阅读源码会有很大的帮助。

因为很多时候,源码当中都会考量到不同数据结构之间的优点和缺点。

你比如说,HashMap 为什么在链表长度大于 8 的时候将其转为红黑树?为什么不能是二叉树?

那数据结构与算法该怎么学习呢?

我画了一张图,里面几乎涵盖了所有数据结构与算法书籍中都会讲到的知识点。

如果英语功底不错的话,推荐国外的 MIT 6.006,是经典的数据结构和算法入门课程,涉及到排序、哈希、图论、动态规划。

https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/open in new window

国内的推荐浙江大学的一个的课程,很系统很经典,适合小白入门。

数据结构-浙江大学_哔哩哔哩_bilibiliopen in new window

至于练习,推荐到 LeetCode 或者牛客网上刷题吧,上面的问题往往有趣且带有良好的解法和讨论。此外,在竞争日益激烈的软件行业,这些问题可以帮助你评估自己应对技术面试中常见问题的能力。

我的心得就是简单粗暴:从易到难,一遍一遍地刷,尽量使用自己熟悉的编程语言,比如说 Java 程序员尽量用 Java 来解题,这样刷题的幸福感也会提升很大一截。

如果不是天赋异禀,不要怕,一开始就是抄题,先把别人的解题思路照着敲出来。刷的题多了,尽量控制一下刷题的时间,掐个点,不能让自己一直想、一直写下去,如果半个小时没有解出来,就果断放弃,去背别人的答案,不要觉得不好意思,等到真的熟了,再去想自己的解题思路。

更详细的学习路线戳:https://tobebetterjavaer.com/xuexiluxian/algorithm.htmlopen in new window

六、操作系统

操作系统是管理计算机硬件和软件资源的程序,是计算机的基石。

操作系统负责的工作有:管理设备、文件读写、控制进程、管理内存等等,算是所有软件中的老大,掌握着生杀大权。推荐的学习资料有《现代操作系统》、《深入理解计算机系统》这两本书。

考过研的同学应该知道《深入理解计算机系统》这本书是必读的,我自己最近又买了一本新的,算是我读的第二遍了。

操作系统中的很多思想和经典算法,都可以在日常开发使用的各种工具或者框架中找到影子。

比如说 Redis 和操作系统的高速缓存就很像,Redis 是用来解决程序处理速度和访问 MySQL 速度不对等的问题,而内存就是用来解决 CPU 处理速度和访问磁盘等外存速度不对等的问题。

像操作系统,国内通常会考 PPT 上那些需要死记硬背的知识点,而国外往往会要求实现一个简单的操作系统内核。

如果英语功底非常不错的话,推荐国外的 MIT6.828,是一门公认的硬核课程,是理论与实践相结合的经典。建议有一些 C语言语言的基础后,再来看这门课程,一定会大有所获。只要你跟着项目一步一步走,就能实现一个简单的操作系统内核。

课程地址:6.828 / Fall 2018open in new window

操作系统应该提供的功能:

  1. 多进程支持
  2. 进程间隔离
  3. 受控制的进程间通信

内核(kernel)是操作系统的核心,它是一种为运行的程序提供服务的特殊程序。每个运行着的程序叫做进程,每个进程的内存中存储着指令、数据和堆栈。一个计算机可以拥有多个进程,但是只能有一个内核。

每当进程需要调用内核时,它会触发一个system call(系统调用),system call进入内核执行相应的服务然后返回。

网友在学习这门课程的时候做的笔记:MIT 6.S081 Lecture Notesopen in new window,大家可以作为参考。

国内的「清华大学公开课:操作系统」口碑也相当的不错。

清华大学公开课:操作系统open in new window

还有哈工大的操作系统课:

操作系统哈尔滨工业大学李治军老师_哔哩哔哩_bilibiliopen in new window

以“如何给一个拥有单核 CPU、内存、磁盘、键盘和显示器的基本计算机配备一个可实际运转的操作系统”这一基本问题作为主线,分为四大块:

  • 操作系统基础
  • 进程与线程
  • 内存管理
  • 设备驱动与文件系统

下图是课程的封面,一个简易版的操作系统,和我们当前使用操作系统界面比起来,显然丑露无比,但它能让你体会到快乐——一种真正地学到了本领的快乐。

更详细的学习路线戳:https://tobebetterjavaer.com/xuexiluxian/os.htmlopen in new window

借这个机会,我希望把多年来整理的硬核学习资料分享出来,帮助到更多小伙伴,包括编程语言的入门教程,操作系统、计算机网络、数据结构与算法这种偏基础的硬核知识,以及能“吊打”面试官的八股文:

直接长按识别/扫描下方二维码,关注后回复 「00」 下载这份 PDF 吧:

扫码关注后回复「00」关键字
扫码关注后回复「00」关键字

三、嵌入式

嵌入式可以进一步细分为嵌入式硬件和嵌入式软件。

嵌入式硬件工程师要求具备硬件工程师的基本技能,还必须完成部分软件工程师的工作,比如说能对底层驱动的嵌入式操作系统进行裁剪、移植。

嵌入式硬件工程师的主要职责是为产品设计硬件电路原理图、PCB 板(印刷电路板),选择合适的元器件,焊接调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力。

一个资深的嵌入式硬件工程师的年薪在 15-30 万左右。需要有非常扎实的理论知识,以及高频 CPU、多层 PCB 板的设计经验。

嵌入式软件工程师指在 wince、linux 等嵌入式操作系统下进行用户应用软件开发的人员,硬件平台有手机、pad 等;开发工具有 wince 下的 evc,Linux 下的 QT 等。

嵌入式软件工程师的主要职责是根据产品的功能需求设计出好的软件,让硬件工作起来。一般情况下,软件工程师的需求量更大一些。

一个资深的嵌入式软件工程师的年薪也在 15-30 万左右。要熟练掌握 C/C++,熟练使用CortexM4系列单片机、RTOS(FreeRTOS, UcosII,RT-thread)等。

希望能给大家提供一点点帮助和启发~


GitHub 上标星 7600+ 的开源知识库《二哥的 Java 进阶之路open in new window》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 7600+ 的 Java 教程open in new window

微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。