很高兴能够有机会与同学们分享一些学习上的经验。
首先对我的学习方向做一个简单的介绍。作为2018级计算机科学与技术专业的学生,我的主攻方向是嵌入式开发这一交叉领域:兼备计算机行业的“底层”与自动化、电信专业的“顶层”。在经历了长达一个月的简历沉底、一个小时的面试和一个星期的等待后,成功收到了来自全世界唯一一家能够同时开展高性能cpu与高性能gpu业务的amd(advanced micro devices, 超微半导体)公司的上海分部的bios开发工程师岗位录用意向书。
回顾大学生活,四年时光匆匆而逝。在全校弥漫着的“计算机就是java ee,java ee就是计算机”氛围之下,我成功地探索出了一条属于自己的道路,向周围的老师们和同学们证明:除了java ee之外,计算机也有许多领域正在释放属于自己的光彩。
在四年的大学学习历程中,我大致按照年级划分为了四个不同的学习阶段,供同学们参考:
1、大一学年:编程语言和计算机基础
大一入学时,相对于其他同学从零开始的计算机学习,我拥有一定的c语言(掌握基本语法)和arduino开发(点亮led、usb串口通信、spi通信)基础,以及windows server和linux服务器维护基础。虽然在起跑线上就已经领先周围的同学一步,但我深知自己知识的浅薄。因此,大一的一整学年中,我都认真学习c语言(未来工作方向)和java语言(应付学校的教学体系)。
在语言学习的标准方面,我的要求是:100%精确,不可以出现模棱两可的答案。我记忆中印象最深的一次经历,是c语言教材中的一个不规范写法:内存复制函数memcpy的不正确使用。c语言规范中要求目的地址与起始地址不能够出现重叠区域,而教材中的函数调用会产生重叠区间。当时我向教我c语言的老师反映了这一点,而他的观点是“这段程序在windows的c语言开发环境下可以正常使用并正常运行,所以这并不是错误”。或许,在大多数情况下,不规范但能够编译通过、运行正常的程序也可以被接受,但在为其他平台或其他环境开发c语言程序的时候,使用的c语言编译器不一定遵守这一规则。届时,不规范的写法就会出现各种不同的编译错误和运行错误,给开发和调试带来了麻烦。所以,为了确保程序的可移植性和兼容性,我推荐根据语言的规范编写程序。
在大一学年,除了专业课知识外,我同时通过了大学英语四级、六级以及浙江省大学生计算机等级考试一级linux、三级linux网络管理及应用测试并获得了相应证书。
2、大二学年:程序设计思路和数据结构
大一学年时期扎实的语言基础使我能够实现向下的“抽象”:给定一个程序运行逻辑,我能够使用c语言或java语言实现这一逻辑,而不会出现“提笔忘字”的现象。于是,大二时期,我的主要学习方向为程序设计思路和数据结构。
程序设计思路不仅仅指代程序执行的算法,还有一些模块级别的设计思路:代码分层与抽象、回调函数、消息机制与并发执行、数据包装;数据结构则是一些诸如栈、队列、散列表之类的抽象数据结构及其操作。虽然在“信工模式”下的学习内容大都以java语言实现,但这些结构对于硬件级别的程序设计也有所帮助:例如,当硬件dma与cpu共享内存时,就会发生同步问题;许多的硬件的指令缓冲使用循环队列……
在大二学年,除了专业课知识外,我同时参加了电子商务竞赛和浙江省大学生信息安全竞赛,分别了一等奖和二等奖的成绩。
3、大三学年:高层架构设计
大二学年的程序设计思路和数据结构知识使我能够在给定某一确定的需求描述下,设计出具体的程序执行流程并给出相关的数据模型,并使用大一学年的知识准确地编写程序。在这之后,大三学年的任务是跟随学校安排的高层课程(软件工程、企业级设计等)了解中大型项目的基本架构,了解这些项目中大概需要包括哪些模块、实现什么功能,不同的高层架构之间的差异与利弊。
与大一大二的知识相比,高层架构减少了对实际代码的需求,知识体系从“深”转为了“广”。在这个阶段,我主要了解了大量不同领域的相关知识及业界普遍采用的j9九游会网站的解决方案、项目结构、模块划分等,并加以应用。
由于高层架构任务相对轻松,我在大三学年开始了我的个人综合项目:操作系统内核的前期准备工作。
4、大四学年:综合设计
前三学年的学习任务使我从上至下了解并掌握了软件开发的流程与基本技术要点,是时候将它们组合在一起,进行综合项目的设计了。
我选择的项目是操作系统内核设计(项目地址https://github.com/fzos)。从各方面来说,操作系统内核对开发者来说都是挑战极高的项目:向下而言,它与硬件直接交互,需要完全理解并掌握硬件设备的具体工作原理,并在其基础上归结出通用的操作函数;向上而言,它与用户程序交互,因此需要暴露设计合理的接口给用户;在内核的内部,需要针对大量的设备设计适度抽象的架构,在通用性与系统开销之间取得平衡;内核的不同模块与服务之间相对独立却又相互依赖,对模块划分与高层架构设计也带来了较大的挑战;开发内核项目时,大部分情况下无法借助任何外部调试程序辅助开发,在“摸黑工作”时,扎实的语言基础也成为了必备技能……这一整个项目对我而言既是挑战,也是对我四年知识的检验和综合提升。
最后再针对信工的教学模式,向同学们给出几点建议供大家思考:
1.java ee确实具有就业优势,但很可能对于个人发展并不是最佳选择。计算机图形学、游戏开发、计算机底层开发(嵌入式开发、架构设计、操作系统、编译器开发、芯片设计等)、人工智能、计算机安全、交叉领域、计算机声学……如果感觉对java ee不感兴趣的话,我的建议是在其他的领域里试试,说不定就发现属于自己的优势项目。
2.在探索属于自己的领域的同时,不能忽略校内的相关课程。在自己兴趣所在的领域拓展虽然令人具有成就感,但独自前行的道路并不一定能够坚持着走到尽头。以我自己为例,若最后没有找到底层开发的工作,与同学们一起投递java ee的相关岗位时,也能保证一个相对优秀的职位。
3.学习过程中,始终需要将理论知识与实践相结合。我个人的学习习惯是,在老师教授之前先自行尝试。例如,老师即将讲授队列的相关知识,我会在前一天提前准备:翻书查看队列的相关基础知识(队列的理论定义、队列的基本操作)后,合上书本,按照自己的想法和构思实现一遍。因为这个时候还未系统学习具体知识,实现的过程中必然会充满困难、挫折与错误,但一般而言都能完成。在实现完成之后,再翻开教材,与书本上的程序对比,并分析自己的程序与书本的程序之间的差异,分析自己的优势与不足。经过这种方式的学习,我能对书本的知识进行更加深刻的了解,甚至在有些时候获得比书本更优秀的j9九游会网站的解决方案。
希望同学们也能在学习生活中获得属于自己的成功!