作为一名软件工程师,计算机基础学科到底要不要学?

【图:欧几里得,希腊化时代的数学家,被称为“几何学之父”。】

作为一名软件工程师,计算机基础学科到底要不要学?最近蛮有感触的一个问题。我这里说的计算机基础学科主要指的是计算机操作系统(进程管理,内存管理,文件系统),TCP/IP协议,编译原理,计算机组成原理,计算机体系结构,数据结构与算法,设计模式等等。我经常在公司跟新同学说基础学科的重要性,但能理解的很少,很多同学更乐意去学一门新语言,去学一个工具和装下docker玩玩。

我个人认为,新技术,新语言和应用相关的东西要学,基础学科也同样要学,两者并不矛盾。反而,两者是互相促进,学基础是为了应用,应用的过程中也更能理解基础的重要。但我觉得很多新同学对基础学科的重视度远远不够,我认为学习基础学科有以下三个好处:

第一:指数级地提高学习质量和效率

第二:让你遇到问题时更加自信和坚定

第三:学到很多优雅的设计和解决问题的方法

第一:学习基础学科可以指数级地提高学习质量和效率

举个例子,我在大学的时候,把Steven的《unix环境编程》和《tcp/ip协议三卷本》都翻了个遍,说真的,疑惑很多,很多时候是硬着头皮啃下来的。当时看到系统调用 int dup2(int oldfd, int newfd) 的描述后一头雾水。把一个文件描述符oldfd复制给另一个描述符newfd?那这个跟int myfd = oldfd的区别是什么?是不是等价于int newfd = open(oldfd对应的文件)?一直到我去学习linux的文件系统后,知道了每个进程维护着自己打开的文件描述符表,而内核维护着open file table 和 v-node table。open file table的entry存储的是文件的动态属性,比如文件偏移位置等;v-node table的entry存储的是文件的静态属性,比如文件大小,文件类型等等。我才知道,dup2()函数是让一个newfd跟oldfd一起指向(或者叫引用)着相同的文件,它们都可以操作这个文件,并且这个文件的状态,锁等都是共享的。了解了这个之后我才真正理解dup2这个系统调用,也让我更深入理解子进程继承父进程的文件描述符的情况以及重定向。

【图:进程文件描述符表,open file table 和 v-node table的关系】

再举个例子,我在大学的时候其实就去翻过编译原理的龙书,当时看简直就像天书,翻不下去只能作罢(后遗症就是接下来几年都不太敢去翻这本书)。后来几年我在刷了不少算法题,看了不少系统底层,指令集以及在搞机器学习时恶补了不少数学基础后再来看这本书时,感觉已经可以很愉悦地阅读了。现在新技术层出不穷,如果没有学好基础学科,使用低效的手段去不断跟进新技术,估计很快就撑不住了。但是如果你掌握好基础学科,你就会发现很多东西其实是基础知识的新组合和新应用而已。也许这就是所谓的万变不离其宗吧。

第二:学习基础学科可以让你遇到问题时更加自信和坚定

之前公司Android项目组曾经遇到一个问题,某台手机的4G网络访问不了公司的应用但访问其它应用正常,但使用wifi也可以正常访问公司的应用和其它应用。Android项目组负责人搞了好久没搞定,无比纠结中,然后公司的技术骨干们也在帮忙搞(因为那台手机是公司大boss的呀)也一直没结果(大boss一直在追问原因,而且要明确的原因,不要猜的)。我了解情况后,安装sshdroid,root那台手机,装了一个arm abi的tcpdum上去抓包。发现没有抓到任何包后检查手机操作系统的路由,也没有发现路由有什么问题,nslookup了一下公司域名,发现使用默认的域名服务器解析不了,换了个域名服务器就解析ok了,再确认了下那个域名服务器的位置是上海的。最后问了下大boss的4G卡是哪的?果然是上海那边的卡。问题最终确认,但是问题确认后基本大家哦了一声就散了,最多就问问我arm abi的tcpdump哪来的,tcpdump怎么使用。我在想,如果他们学好了计算机组成原理和计算机体系结构,就应该不会犯把x86的tcpdump往arm架构的Android机上放的错误;如果他们学好了网络,就应该知道域名解析的原理和知道使用什么命令查询域名解析;如果他们学好了网络,去了解过无线网络和基站,也应该知道无线网络跟IP网络是不一样的。

我还记得一个场景,一位后端同学在定位php程序内存泄漏无果后开始烦躁,并开始怀疑php有bug。他跑过来失望地跟我说unset了那个变量但依然内存泄漏。我笑了笑,很坚定地跟他说不可能,再回去检查下。看着我这么坚定和自信,他又回去认真检查了一遍,然后后终于发现是逻辑错误,unset错变量了!最近一个小例子是跟别的公司联调http协议的接口,别的公司给的是java的例子并且已经验证可以跑通。公司一位同学改写成项目语言php后跑不通后开始怀疑是不是只能有java语言才能调用他们的接口。我依然过去很坚定和自信地跟他说不可能,然后让他抓包定位,最后他自己发现自己的http header发错了(捂脸)。

第三:学习基础学科可以学到很多优雅的设计和解决问题的方法

很多底层设计都是史书级别的。比如说linux操作系统,如果你好好研究和体会,去了解进程管理,文件系统和内存管理,本身就可以学到很多优雅的设计和解决问题的方法。进程是如何管理资源的?目录是怎么实现的?文件是怎么存储在磁盘上的?虚拟内存到物理内存的转换是怎样的?再比如tcp/ip协议,一个复杂的系统,如果你好好研究就会发现里边有很多很经典的算法,比如说为什么是三次握手?tcp怎么保证可靠?怎么优化交互模式的传输?怎么优化网络阻塞?再比如编译器的实现和原理,里边也包含了很多很经典的工具和方法。也许你研究完编译器的实现后,下次你设计配置系统时也可以定义自己的一套配置语言来实现;当你想处理字符和文本时,你的工具箱里边也会多了一套工具。

说了这么多,只是想让新同学们重视基础学科,如果之前拉下了就赶紧补起来吧,什么时候补都不迟,就怕你不补。因为学习计算机基础学科可以指数级地提高学习质量和效率,给予你自信和坚定以及学到很多优雅的设计和解决问题的方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 成为一名嵌入式软件工程师要学习以下几项技能: 1. 熟练掌握 C/C++ 编程语言 2. 了解嵌入式系统的基本结构和工作原理 3. 了解常用的嵌入式系统设备(如微控制器、传感器、外设等)的驱动编写 4. 熟悉常用的嵌入式开发工具(如编译器、调试器、烧录器等) 5. 了解常用的嵌入式操作系统(如Linux、FreeRTOS等)的使用 6. 熟练掌握嵌入式系统的硬件原理,如电路设计,单片机设计等 7. 了解嵌入式系统的常用通信协议,如串口通信,网络通信,I2C,SPI等 8. 熟悉嵌入式系统常用的编程技巧和调试方法 9. 了解嵌入式系统的安全性和可靠性。 ### 回答2: 要想从零开始成为一名嵌入式软件工程师,你需要学习以下内容: 1. 编程语言:首先你需要学习一种或多种常用的嵌入式编程语言,如C、C++或汇编语言。这是开发嵌入式系统的基础,你需要掌握语法、数据结构和算法,以及如何在嵌入式环境中使用它们。 2. 嵌入式系统架构:了解嵌入式系统的硬件和软件架构,包括处理器体系结构、外设接口和总线协议等。这将帮助你理解如何与硬件交互,并编写高效的嵌入式软件。 3. 操作系统:理解嵌入式操作系统的工作原理,比如实时操作系统(RTOS),以及如何使用其提供的功能和服务。掌握任务调度、内存管理和设备驱动等概念对于开发稳定和可靠的嵌入式系统至关重要。 4. 嵌入式开发工具:习使用嵌入式开发工具集,如集成开发环境(IDE)、编译器、调试器和仿真器。这些工具可以帮助你编写、调试和测试嵌入式软件,并优化系统的性能和功耗。 5. 电子基础知识:了解电路设计、数字和模拟电子元件、传感器和接口等基础知识,能够理解硬件电路和嵌入式软件之间的互动。 6. 实践项目:通过参与实际的嵌入式项目,锻炼你的实际操作和问题解决能力。可以自己制作小型嵌入式系统,或参与开源项目,与其他开发者合作,提升技能和经验。 7. 持续习和实践:嵌入式技术发展迅速,时刻关注新的技术和行业趋势,并不断习和实践,保持专业技能的更新和提升。 总之,成为一名嵌入式软件工程师要学习编程语言、嵌入式系统架构、操作系统、嵌入式开发工具、电子基础知识,并通过实践项目不断提升自己的技能和经验。 ### 回答3: 要从0开始成为一名嵌入式软件工程师,需要学习以下内容: 1. 编程语言:掌握C和C++是非常重要的,因为大部分嵌入式系统的开发都是使用这两种语言进行的。习这些语言的语法和特性,以及如何应用到嵌入式开发中。 2. 计算机体系结构:理解计算机的基本原理,包括中央处理器(CPU)、内存、输入输出等组成部分的工作原理和互联关系。熟悉嵌入式系统所采用的特定体系结构,如ARM、AVR等。 3. 操作系统:习操作系统的原理和特点,了解嵌入式系统中常用的操作系统,如嵌入式Linux、FreeRTOS等。掌握任务调度、内存管理和设备驱动等方面的知识。 4. 电子硬件基础:了解电子电路、模拟与数字电路、传感器和执行器等基本电子元器件的原理和工作方式。会使用示波器、逻辑分析仪等常用的测试和调试工具。 5. 嵌入式开发工具和平台:熟悉使用嵌入式开发环境,如编译器、调试器、仿真器等。了解常见的开发板和开发工具,如Arduino、Raspberry Pi等。 6. 算法和数据结构:掌握常用的算法和数据结构,如排序、查找、链表、树等。熟悉各种算法的特点和适用场景,为嵌入式系统的优化和性能提供支持。 7. 嵌入式系统设计与开发:习嵌入式系统的整体设计过程,包括需求分析、架构设计、模块划分、接口设计等。掌握嵌入式软件开发的常用技术和方法,如面向对象设计、事件驱动编程等。 同时,积极参与开源项目、实际项目或者自己动手做一些小项目,通过实践来提高实际操作能力和解决问题的能力,逐渐深化对嵌入式软件工程师的理解和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值