【软件工程】个人阅读作业#1

个人阅读作业#1

项目 内容
本作业所属课程 2020春季软件工程(罗杰 任健)
本作业要求 2021年软工-热身阅读作业
我的课程目标 具备一个软件工程师所需要的素质
本作业帮助 对专业/职业发展的规划

第一部分 结缘计算机

1.1

你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?

我跟计算机的缘分,应该是从很小的时候就有了,差不多是零几年的时候吧,我父亲因为工作的原因需要长期接触电脑(也不是软件/硬件开发的,是财务经管相关的),就在家里配了一台。小时候我父亲就教我用excel,教我做ppt,教我在ppt里加入动画,怎么加一些奇奇怪怪的特效,那个时候我到过年的时候,都会认认真真做一个ppt,把这一年的照片翻出来,加一些现在看起来十分辣眼的特效。

后来嘛,跟朋友同学一起,接触一些游戏,像DOTA、星际2、CS、PVZ(植物大战僵尸)之类的,那个时候打DOTA根本不敢在浩方、11之类的平台上跟人打,专注打人机。那一阵子我基本每天都在学校就把作业写完了(或者说是,作业没写完就不回家),回家丢掉书包就去开电脑,但是我视力一直不太好,近视度数很高,搞得好几年加里一直鸡飞狗跳的。

初中的信息课,学到了一些PS、Flash的基础操作,然后自己回家就自己捣鼓。PS的话,自己瞎捣鼓,目前也都是靠着那个时候摸索出来的经验在给自己P一些头像之类的。然后Flash就自己学了学控制流程用的ActionScript,初三的时候做了一个我表弟看了就直呼玩不下去的galgame。初三那会儿自己瞎捣鼓了一阵子Dreamweaver,中考完之后把全班同学那一年的范文正在一起做了个纯前端的网站,所有的内容都是靠我手动粘贴进去的。

后来高一的时候,有一个“翱翔计划”,就是让高中生提前参与一些高校的学习、研究,我就报名了一个信息类的。面试的时候我提到了那个网站,面试官就问我数据库、后端啥的。那时候的我,虽然喜欢捣鼓计算机,啥软件都喜欢试试,甚至那个时候自己都能把360给调教明白了,但是我哪知道这些东西啊,我还真以为大部分网站都是用Dreamweaver类似的东西做的。毫无疑问我的面试被刷了。

这次面试之后,我才意识到,我固然对计算机有所热爱,但是我做的事情、我喜欢的事情,跟计算机从业者们的主业,差了十万八千里。我身边并没有认识的IT行业的人,虽然发小很多,虽然父辈的朋友也很多、来往也多,但是没·有·一·个计算机从业者。不如轮子哥在《进入2012 -- 回顾我走过的编程之路》这篇博客说的那样,初中就开始学习编程,我那个时候甚至才意识到编程是个什么东西。

身边没有一个认识的从业者,我就算想补课也不知道该从哪里开始,也不知道去找博客看。我高中的信息老师是一个很奇怪的人,两个学期信息课,一个学期学计算机组成原理,一个学期学数据库,就我现在来看,这两学期的课,确实让我大学再上这两门课的时候轻松不少,像E-R图的数据库设计方法、简单的SQL语句、外存内存cache啥的,都是高中的时候了解的;但是这个人真的很奇怪,上课提问没人回答,他回十分耐心地等同学们思考,甚至愿意等到下课,高度近视又不戴眼镜,一年只有两套衣服,几乎所有老师都跟他不熟。面前唯一一个能稍微指导我一下的人,我却不是很敢去接触。其实还有一方面的原因,就是高中我确实很忙,高中年级主任特别热衷于给我们安排补课,而且那个时候参加了无线电社团,还当过一年社长,我在社团这两年,全国比赛的团体前两名全是我们社团的。高中无线电的时光确实对我影响很大,大一分专业的时候甚至差点把EE放在了CS前面。

高中其实还是有过不少编程的尝试的。一个是我了解到汇编是最底层的语言,然后就在b站找了一些视频来学。但是汇编实在是太抽象了,而且那些视频基本都是讲了汇编是啥样的,怎么写,是什么意思,完全不告诉我应该怎样才能让我写的汇编程序跑起来,所以没坚持多久就放弃了。另一个就是后来搞了本厚厚的C语言的书,照着书来配置环境,最开始是完全看不懂IDE里的英文,捣鼓好久终于会编译运行我的hello-world了,但是死活运行不起来。以我现在的经验来看,那个时候应该是360把我的第一次helloworld给扼杀了(看来还是没捣鼓明白360)。

大一的时候,第一学期有C语言课,感谢我的真正意义上的第一为编程老师荣文戈老师,讲C语言的时候,不仅仅是在讲语言,更多在讲代码是怎么执行的,更多在讲编程规范,在讲一个合格的软件开发人员写出的代码应该是什么样的,我至今都能清楚地记得那句“你这么写代码,是要被项目经理‘pia’的一下丢出去的”(可能是因为他说的太多了吧)。那个时候写作业,每次4道编程题,有一次我四道题写完直接一次过编译,交上去全部一遍AC,让我高兴了好几天,恨不得逮到一个人就要吹一番。因为学院的课程安排,大一的时候数学课课业压力特别大,所以好几次C语言作业都堆在快ddl了,元旦的时候,窝在家里埋头写了一天C语言作业,晚上写完之后还感觉意犹未尽。后来那一学期我C语言拿了满分,也是我目前为止所有课里唯一的满分。

大一这一年的编程初体验,让我确定了自己对编程的热爱,简单来说就是上头,这也让我把第一志愿从EE改成了CS。

1.2

你热爱这一专业吗?你对计算机的热爱是怎样的?仅仅是口头的吗?

我记得知乎上有个问题是什么原因让你觉得自己没选错专业?,虽说这个问题没什么热度吧,但是我看到这个问题,我就不禁想写下自己的回答:

以前假期作业都写不完的我,现在成天抱着好几本书啃得兴致勃勃。

我不知道大家是怀着怎样的心情去读一些很“硬”的书的,但是我自己把读这些书当做一件很开心的事情来做的。大二的时候,那个学期学计算机组成原理,课程设计时闯关式的微处理器设计,最后是用Verilog设计一个支持50多条指令、五级流水线、支持中断的MIPS微处理器,其实这个任务本身倒不是很难,主要是得独自完成,这就导致这一学期很忙很忙,这也是BUAA计院的第一座大山。而且这学期基础物理实验课还需要用C#做一个虚拟仿真实验(说实话,我是一般看着Java的书,一边在写C#)。对于一个只接触过一个学期的C语言编程的人来说,这个工程量堪称恐怖(因为学院的特殊性质,大一只有C语言这一门计算机相关课程,离散、数据结构都是后来补的)。这一学期我最快乐的课就是那门“印象北京”,薛峰老师的课确实有意思,这门课的考核也简单,但是最让我开心的事情是,上这门课的时候,不方便带电脑,所以只能看书,《Java编程思想》差不多三分之一都是在那门课上读的。第一次接触到面向对象的思想,第一次了解到继承、多态,了解到接口、抽象类、内部类,让我知道原来面向对象是从这样的角度来对世界进行建模,新鲜的知识是那样令人着迷。

后来的寒假赶上新冠爆发,出不了门,就窝在家里把《Java编程思想》一天一章给读完了,大二下学期面向对象课程的时候,就把读书的时候产生的奇怪想法落实下来。虽然后来事实证明实在是过度设计,不仅自己写的时候累得半死,而且还一堆bug。但是这个过程确实很快乐。

再后来,暑假的时候抽了一个月去看《C++ Primer》,加上那个时候喜欢在知乎上看一些技术文章/提问,让我看到了一个和之前学Java完全不同的世界。之前学Java,关注的是应该怎样设计,应该怎样建模,而学C++的时候,我感觉C++的发展就是一个不断追求极致的过程。从拷贝到移动,从指针到引用+智能指针,constexpr的不断扩充,空基类优化等等,我们在试图减少编程语言抽象带来的牺牲,我们在试图把更多事情在运行前完成,我们在试图减少犯错的机会——我们在尝试,我们在追求进步。

大三上为了把学分赶紧修够,可以安心准备考研,课特别多,但是我还是抽空去读《流场的python》,去读龙书《编译原理》,没别的原因,就是因为能给我带来成就感,能满足我的求知欲。最近在看《CLR via C#》,直接看的最后的并发那一部分,因为这一部分是我之前写C#一直没搞明白的东西,不得不感叹Microsoft的工程师在设计Taskasync/await的时候天马行空的想象力,以及这种设计背后体现的对编程的理解,甚至敢于在某些标准库里直接不提供同步方法,只有异步方法。

我对于计算机有着我自己都不太相信的求知欲,这不仅体现在让我能够拿得住那些“硬”书,还给我强大的克服困难的动力。

从初中我的英语就是一块短板,现在回高中甚至都可能会被英语老师数落一顿,但是我现在渐渐地,开始能够适应阅读英文文档,虽然自己CET-6都过得费劲,但是在面对全篇不见一个中文的文档,我能坦然地着手开始读。虽然最开始的时候还有一些抵触,有一些不敢尝试,但是想要理解某个api的行为,想要用那些命令可以达到我的目的,想要了解怎样把这个github的项目部署上,就必须硬着头皮上。久而久之,甚至有的时候面对已经有的中文版文档,比如cppreferencedocs.pythonmsdn,如果有些细节我觉得写得不清楚,我甚至会主动去翻英文的原版文档,因为就我的经验来说,确实有不少文档在汉化的时候会缺少东西,比如cn.cppreference就经常会缺少demo。

第二部分 在计算机系里的学习

2.1

你对你的大学生活有什么想要吐槽的地方吗?你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。

说实话,读到Scalers:大学生上课为什么一定要认真听讲?这篇文章的时候,我是有点心虚的。

学生只是用“这课很烂”,作为“我不听讲”的理由。然而和几个同学抱团一下,相互认可彼此的观点,于是就在一节课上给自己放水。

真的让我感觉自己好像就是这种状态。

但仔细想想,自己倒不是觉得老师上课讲的不好,而是我自己已经渐渐不习惯听课了,大一的时候还好,后来就越来越听不进去课了。看书看文档的时候,已经了解的部分就不用仔细看了,忘记的部分还可以往回重新看一遍,但是上课的时候,如果老师讲自己已经会的东西就会忍不住开小差,降到自己记得不太清楚的东西,要么直接傻眼,要么拿着pad去翻前面的ppt,看完回来就发现不知道老师在讲什么了。

也因为如此,大学时光给我带来最大的收获确实不是课堂,而且那一个个有测评、有返回的课设、大作业。我觉得对我而言,这就是很理想的状态了。

随着自己做的项目越来越多,我也渐渐发现一个很糟糕的状况:我大学本科时光已经过去了将近三年,但我的编程能力,基本都集中在了造轮子上,Spring用着十分生疏,Mybatis写一个DAO能有仨方法的注解写的是错的,ASP.NET只停留在能够快速在MSDN找到文档,WPFnode.js只停留在知道有这么个东西,因为数据库课的调研大作业也了解过redis的运行原理,但也仅限于此了,根本不会用。

大部分偏向实践的课程在准备考研的时间段才开设,这一点令我十分难受。

2.2

迄今为止,你写了多少代码,描述你做的最复杂的软件项目/作业。

这种题目本来应该晒一下我gitee/github的个人代码提交的活跃统计图的,但是很可惜,我去年重新装了系统,本地git里config的邮箱跟gitee/github不一致,虽然通过SSH Key可以push上去,但是没统计到我头上,导致我一大片空白。(这里应该配一个痛苦的表情包

粗略估计一下

  • 大一C语言作业不算,别的课的小作业也一概不算;
  • 计组课设差不多3k;
  • OS课设因为有好多是课程组搭的架子不好计算,我估计能有3k左右;
  • OO课4个项目全都2k~3k,加起来算1w吧;
  • 基物实验的虚拟仿真实验后端是我一个人写的,3k左右;
  • 我平时写项目就喜欢用python写一些辅助工具,像手动NER标注的辅助工具、自动测试、自动转码打包等,上学期机器学习相关的也写了不少,但是都杂七杂八的,我也不知道该咋统计;
  • 数据库大作业后端,4k;
  • 最多的还是上学期写的编译器,src文件就1w多行,测试(不算样例)3k多;

我自己统计代码量一般是用cloc,一般都直接看纯代码行数,不算空行和注释。能统计明白的差不多有3w+。

最复杂的还是上学期写的编译器MIPS-Compiler,从一个C语言子集编译到MARS可以运行的MIPS汇编,其实是一个烂尾项目,一方面因为错过了申优文档的提交时间,所以很多优化都没动力继续写下去,另一方面上学期选的课太多了,期末太忙了。

虽说项目很大,但是大部分都是课上明确讲过的算法,像词法分析的游戏安装台自动机、语法制导的语义分析等,这些书上都有明确的代码。

但是这终究是一个纯代码就1w行的大项目,大项目的问题一个都逃不了。

首先是测试,这也是我十分庆幸自己做得好的部分,测试的代码有3k,其实还有6k的测试样例。经过先前OO课的毒打,我在写编译器之前,就先去了解了C++的单元测试框架,最后选用的Visual Studio支持的比较好的MSTest,但还是碰到一些坑,我写在项目文档里了,这里就不赘述了。从词法分析开始,我就有写单元测试,写到后面添加错误处理的时候,需要修改词法分析部分,有了先前的单元测试,就能很方便地知道自己的改动会不会带来副作用。在写递归下降、语法制导翻译的时候,在同一个文件下要进行多次迭代开发,而且是十分大刀阔斧的增添或者更改,同样,有着丰富的单元测试,我也不怕改出什么问题。感谢自己的好习惯。

调试方面,利用宏和条件编译,写了一套简单的日志,提交的时候可以方便关掉日志。虽然日志没有写到文件,但调试也足够了。

版本控制,虽然自己git commit的信息写的很糟糕,但是全程都在用git跟踪修改,有好几次修改之后单元测试挂掉一大片,赶紧回档了。git commit的信息写的不好,而且没有利用好分支功能,这是我需要改进的地方。

设计,先思考,先写设计文档,定好约定,在开IDE前多想想,确实能让coding的时候爽很多。目标代码生成(一)的那次checkpoint,一共两周,我花了一周多来设计中间代码的表示形式,改了好几版文档,然后花了一天时间就coding完了,目标代码生成(二)的时候,大部分同学还在懵逼的时候,我已经开始着手写优化了。

虽说算法都是理论课上讲过的,但是很多地方实现起来就是另一码事儿了。中间代码,理论课上为不同中间代码的变量取个名字就完事儿了,但是实现起来就得考虑用什么结构去存才能比较方便地判断相等,怎样方便地追踪。比如构造DAG图进行公共子表达式删除,理论课上构造一张图轻轻松松,但是放到计算机里就得考虑用什么结构去存,而且由于DAG图最后还得还原为IR,所以还得考虑还原问题。变量活跃分析,理论课上把in/out集写在代码边上就行,但是实现起来又得考虑怎么存。

这次编译器的大作业是我对以前的所学的一次综合的应用,让我收获颇丰。

第三部分:未来规划

3.1

对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?

未来该怎么走,其实是我最纠结的地方。学院的“学业导师”计划下,我跟着荣文戈老师捣鼓了一些NLP的东西,也选了一些数据挖掘、机器学习之类的课,说实话,感觉自己有些不适合这些方向。想尝试一下AR、VR、游戏引擎方向,但是自己又没有任何基础。很多实用性的技术栈我也十分生疏,也需要恶补。

但是我知道软件开发能力是从业者无论如何都必须的,如何与同伴写作、如何写出可维护的代码、如何保证自己的作品的健壮与稳定、如何把理论的算法实现出来、如何攻克遇到的难点,是无论如何都要面对的。

计算机的诞生,是源自于理论与空想,不同于其他自然科学,计算机科学是自上而下的,但是这不代表计算机能够蓬勃发展到现今的模样亦是如此。

人们从最初的面向过程开发中总结并升华,提出了面向对象的构造方法;人们从手动管理内存的事故频发中,吸取教训推广了Java、C#这样的托管语言;面对Web开发天然对并发的依赖,golang被设计了出来;在对常年的C++的使用中总结经验,用所有权的交接、借用的检查避免内存泄漏而出现了Rust;面对面向对象开发中常常出现的依赖问题,出现了控制反转技术;Spring总结了纯xml配置的缺点,引入了注解,不再单纯地追求配置与代码的分离……

软件的发展,离不开一代代程序员的经验总结。软件开发,不是一个空想的、理想的、纯理论的课题,软件开发需要的是不断“吃一堑长一智”、不断反思、不断在需求的驱动下不断创新。

我希望自己不要囿于什么方向,而要作为一个技术过硬的开发人员,能够凭借丰富的阅历选择正确的技术栈,能够凭借长年的经历与同事合作顺利,能够凭借丰富的手段把新的需求和理论实现,能够凭借更高的视野设计更好的结构……

这样的路一定会坎坷,我离这样的状态也相差甚远;所以我还需要努力,我还需要实践,我还需要马不停蹄地走下去。

共勉。

引用

posted @ 2021-03-11 01:10  SnowPhoenix  阅读(173)  评论(2编辑  收藏  举报