软工博客一:新希望

项目 内容
课程:北航2020春软件工程 博客园班级博客
作业:阅读并撰写博客回答问题 第一次作业-热身!
我在这个课程的目标是 体验软件开发的全流程
这个作业在哪个具体方面帮助我实现目标 明确方向和学习重点

第一部分:结缘计算机

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

  • 计算机是你喜欢的领域吗?是你擅长的领域吗?

说来奇怪,直到高考填写志愿之前,我从来都没有想要去选择计算机这样一条路。我大概08年的时候,就接触了计算机,当初是一台奔腾某双核型号配512MB内存的机子,其他配置都不清楚了,用的是当时标配的Windows XP系统。因为当时家里还没通网络,我每天也就只能打打系统自带的蜘蛛纸牌消遣。计算机对我而言,不过是一个大玩具而已。很快我就变成了一个熟练的电脑使用者,尽管我不懂这大家伙的原理是什么,但是对一个小学生来说,能够熟练地甩动滚轮鼠标,在游戏中取得一个又一个的高分,已经足够了。

真正深入的去了解计算机,是我上了初一开始。那时的我,疯狂迷恋着装机DIY。定了一个叫《电脑报》的报纸,天天拿出来在翻,看报纸中写的CPU架构的介绍、多通道内存原理、显卡交火的注意事项还有超频的经验,算是我对计算机组成的初步了解吧。在家的时候也会经常拆开家里自己的电脑,扒出主板研究,看看哪个芯片是南桥、哪个接口是PCI-E、哪根电源线是多少伏的输出,还有尝试风冷超频。那段时间还喜欢装系统,自己动手DIY系统,,装了各种各样的系统尝鲜,以至于一不小心把所有硬盘格式化了(删库?)。这段时间的经历,让我了解了计算机内各各部件之间的职责和他们的配合,小小芯片的功能着实吸引着我的好奇。

但是在以后的很长一段时间内,我都再没有学习更多相关的知识了。初中和高中的时候学校也组织过信息竞赛,但我几次擦肩而过,原因是自己觉得这玩意太虚幻了,摸不到成型的实物,看起来太过抽象;相反,自己更加喜欢机械一点,沉迷与齿轮的咬合、蜗杆的旋转,幻想着自己设计出规律的精美的灵巧的机械出来。高考考前思考志向的时候,我第一个排除的工科专业居然就是计算机,最后定的第一目标是自动化或者是机械工程专业。

最后终于走上这条道路,还是因为自己高考分数,恰好落在了北航士谔书院的台阶上,而后分专业时自然而然地选择了士谔书院最好的计算机学院,仅此而已。所以说和从小喜爱计算机的博主们比、和算法编程经历丰富的同学们比,我算是出道尚晚、误打误撞的一个特例吧。

可是大学这两年半过来,我常常问自己一个问题:我真的喜欢计算机吗?

  • 我喜欢的是当我的程序终于能输出正确结果时,那大大的绿色的Accepted

  • 我喜欢的是当我的模型终于能够识别输入的图像时,那分明的清晰的结果

  • 我喜欢的是当我的网页终于能够渲染出界面时,那舒适和谐的用户体验

古希腊叙拉古赫农王时期,阿基米德坐进澡盆里时,看到水往外溢,突然想到可以用测定固体排水量的办法,来确定金冠的体积。他兴奋地跳出澡盆,连衣服都顾不得穿上就跑了出去,大声喊着“尤里卡!尤里卡!”(ερηκα,意思是“找到了”)。同样,我最喜欢的,是自己反复的查阅、思索、编码,殚精竭虑茶饭不思的努力之后,终于在某一次尝试中,终于看到了正确预期的效果时,心中呐喊的那一声Eureka。那着实令我兴奋而且着迷,或许学习计算机并不是唯一能体验到成功的途径,但是我隐约感觉,这是一条方便的道路。

但是要说擅长,我一定会说“不”。计算机这门学科给我一个这样的感觉:不管你取得了多少成就,你总是会看到有别人做的更多更好。今天你自学了一个前端框架,却看到身边的高人早已运营一套WEB系统;今天你爽快地体验了一把全栈开发的乐趣,却看到身边高人已经在研究集群、负载均衡那些东西;今天你参加了一个实验室,作为一个不知名的本科生扮演着微不足道的角色,却看到身边高人早已参加企业实习,拿着不多不少的工资,为开源项目或者企业产品作出着点滴贡献……每每看到他人的优秀,我都自惭形秽,并且激励着自己更加勤奋地学习。

大学这段时间,我对计算机的许多方面都有了涉猎和初探,越是学习,越觉得自己渺小。计算机的行业,学习似乎永远赶不上进步,层出不穷的新技术,日新月异的新“轮子”,让你感觉自己的力量是如此的有限,一门学科的生命力是如此的强大。或许我永远都不敢说自己“擅长”于计算机领域;不断的学习过程中,我也许会在某个方面,会变得非常地熟练,对各种需求都能够信手拈来,但是我相信,在日新月异的计算机行业,我永远只是孜孜以求的学生。

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

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

我的大学前两年半,都是唯分数论的萌芽生长的历史。大一的时候,刚刚进入大学,对很多东西都怀有兴趣,也不重视GPA,看到什么东西都感到有兴趣,也就浅尝辄止地了解了很多电子信息、软件、甚至机械原理、自动控制这方面的知识,日子很是潇洒。但是随着自己上了大二,我开始重视起GPA那一个数字并且决心努力去把这个数字提得更高一点之后,我不像大一学习得那么轻松了,没有时间也没有兴趣再去了解那些乱七八糟的其他科目的东西。我常常疲于应付课内的任务,尤其是计算机组成、操作系统和面向对象设计原理这几门硬核的课程,额外花上几十个小时就为了把分数提高两三分,只是觉得自己不应该比别人差。到了大三尤其上学期编译技术期末竞速排序的时候,这个现象更加明显。许多同学的代码效率相差极小,可能只有1%不到,但是由于同学们排名过于接近,这1%的排名却差别巨大,也就导致了得分差别巨大。那么这个分数或许也就不能够体现同学们对于知识的掌握驾驭水平,两个程序竞速结果只差1%的同学,最后得到的成绩差异可不止1%。最后的结果就是,大家为了这1%,绞尽脑汁,唯恐被人超过,这也就丧失了很多学习的乐趣。

另外一个体现,表现在我选课的时候。不论是专业课还是通识课,同学们选课时,普遍的第一反应是不是说这门课我喜欢吗?对我以后的发展方向有促进作用吗?而是:这门课给分怎么样?学分多少?评价好不好?给分好的课,可能虽然自己不太喜欢,那往往也是僧多粥少、供不应求;相反许多能让人受益匪浅的课,却因为给分不太“友好”,被迫沦为第二选择。

虽然我不知道国外的大学是个什么样子,但是我从国外同学的朋友圈课件中管中窥豹,大概了解到他们某些专业的本科生早已被分配入实验室进行学习,跟随老师研究课题、发表文章,从兴趣为导向的实验中学习知识。我理想的大学,应该是学生从网络或者图书馆中汲取知识,以组队学习新知识来作为完成任务的一种主要手段的大学,所以我对国外计算机系的教育方式表示一定的认可。但是现在我们学校,至少说我们系,核心是以成绩为导向的竞争式学习,在实践中的表现就是:部分教师过度关注重点、读课件的倾向过于明显。同学们在这样的环境下,已经形成了一种非常简单的学习习惯:

  1. 上课前下载课件教材
  2. 上课时听老师朗读课件
  3. 下课后按照课件,仿照例题,略微修改,完成作业
  4. 考试前通读课件,读透课件
  5. 考试考课件例题,得到高分

学习过程对于课件过分的依赖,是我这几年能够感受到的明显教学特点,或者说教学缺点。我认为的大学的学习,应该以经典教材为导向。理论课中,老师以讲解经典教材、提供旁批注释的方式,鼓励我们在学习重点知识的同时,了解附加的非重点知识;或者直接让我们去某个参考书中自行学习,加以小组讨论的方式,鼓励我们从广泛的知识库中汲取知识,而不是局限于精炼的课件和单纯的重点。

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

大学之前,我的代码量基本为零,也就是写过一些bash脚本。大学期间,最重要的计算机组成、操作系统、面向对象程序设计、编译技术和数据库课程设计这几门课的实验课的大作业。

  • 计算机组成课程设计 2000行

  • 操作系统课程设计 500行

  • 面向对象课程设计 4000行

  • 编译技术课程设计

  • 数据库课程设计 5000行

  • 各种各样花里胡哨的小程序 1000行

但是我渐渐意识到,虽然自己写了不少东西,但是大部分都是在搭积木。自己对于代码的理解,一直停留在表面,而没有耐心去体会代码中底层的东西。用java写了4000行代码之后,我对java的使用已经颇有心得,用起来也不会手足无措,但是这仅仅是使用别人的早好的轮子而已。《刘帅:在失望中寻找希望》中提到这样一个面试问题:

之后问const的问题,问我是不是想过,Java是不是精通,我说是,又被问到,Java如何实现const,Java的const和C++一样吗?怎么实现的?这个问题又让我崩溃了。
用到了Junit,被问到Junit哪些地方不好等,所有关于测试的这些东西基本全挂。

同样的问题,我根本就没有思考过。虽然自己写了不少java,甚至有时候吹牛的时候说自己java“有点东西”,但是我回答不出来这样的问题。即使我在数据库课程设计的大作业中,写了5000行基于React的前端代码,我却根本没看过源码,不懂它的精髓,不知道其背后的运作原理。我喊出“噢,原来这个是这么用啊”的次数远远超过了“噢,原来是这样运行的”的次数。或者说,我是在背一个框架的使用方法,并且将它复制一遍又一遍,完成自己的项目。也许哪一天,目前这一套框架被淘汰了,我也许会陷入无所适从之中,因为我只是一个熟练的工人,熟练地、机械地操作着别人设计好的机器,来实现固定的生产效益,一旦遇到解决不了的问题,便只能望洋兴叹;而不是一个设计者,自己研究机器的设计、自己造适用的轮子。

后来,我在《进入2012 -- 回顾我走过的编程之路》这篇自传中,看到了一个深谙底层源码的计算机爱好者的样子,并且自惭形秽。

大一的时候做的JoveScript是第一个我觉得还能见人的脚本引擎。第二个就是大二失败了一整年吸取了很多教训之后,于大三开发出的动态语言,名字叫FreeScript。最近正在打算将其更新到3.0来配合一个正在开发中的显卡加速的GUI类库GacUI。接下来就是在去微软上海的WCF Tools组实习的那一段时间里面,利用每天晚上的时间完成的一门纯函数式语言叫KernelFP,这后来成为了我的毕业设计。提交了毕业设计之后,我又在毕业前的几个月时间里面完成了CMinus。这不是编译原理课程设计上的那个简单到没法再简单的CMinus,而是一个完整的C语言编译器(其中函数指针的语法被我改掉了,但是仍然支持)。其编译结果是保存到内存中的一段X86二进制代码,可以将函数的起始地址强制转换成函数指针直接在C++程序中使用,这是因为我在生成指令的时候遵守了Visual C++中的一些在MSDN里描述得很清楚的约定。毕业后我又雄心勃勃地做了NativeX,是一个带泛型以及concept mapping的C语言。……图形界面(GUI)类库我也写了不少。继高中的时候为RPG而开发的两个控件类库之后,在上大学的过程中使用OpenGL开发的两次GUI类库均告失败。后来还封装了一次Windows的API(Vczh GUI),试图让其易用性接近VCL或WinForm。

调库、用别人造好的轮子,永远不是核心竞争力。

这也是我认为的,速成的培训班和打基础的大学教育还有mooc之间最大的区别。带着科班的骄傲,大学本科的计算机教育绝对不可以局限于会用别人造好的轮子,而应该学习怎么阅读源码、查阅文档、造自己的轮子。学习了计算机组成之后,我对CPU的原理再也不陌生了;学习了操作系统后,我知道每次点击鼠标背后,计算机大概都干了什么;学习了编译器设计之后,我有信心挑战JVM了……但是我知道自己不能够止步于此,我现在越来越相信这样一个观点:

阅读源码的能力,才是程序员的核心竞争力

第三部分:未来规划

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

关于未来的工作,我的希望是在一个企业中工作,从事产品研发、测试或者运营那些和用户应用层面相关的产品,而单纯一味的研究理论我并不喜欢。但是同时,我更希望自己能够参与到公司的一个开源项目之中,在公司集体的合作下研究实用的模型和框架,去创造轮子。相比技术,我更加重视组织管理和表达的能力(或许以后会成为一个PM吧),重视甲乙两方的沟通、重视顶层的设计。

《谈谈职业规划——CSDN对我的采访》这篇文章给了我很多的建议,让我在学习课内知识的同时,提醒我要注意更多的东西:

  • 从毕业开始到毕业后至少5年内,踏踏实实地专研技术,这是一个积累过程,千万不要把心思放在钱和职位上。钱和职位只是能力的附属品,不要让其喧宾夺主。主要是量的积累,要不停地积累知识和方法
  • 从毕业后3年到7年的时间,注意学习工作当中的方法以及相关的管理和流程,不但要知其然,还要知其所以然。主要是质变,应该着重于思维和想法的更新。后五年应该有很强的包容能力和接受新东西的能力,千万不要太过固执和坚持自己的想法
  • 不要只把心思放在技术上,技术是hard skill,只要下工夫就一定会掌握。更要注意与人沟通等为人处事的soft skill上。hard skill像一个大树的根,而soft skill则像一个大树的枝叶。树根是你的根基,能让你站得很稳,而枝叶能让你向天空伸展,获得发展。
  • 对于程序员来说,应该始终记住,技术不是主要的,主要的是通过技术能够解决什么样的问题。一定经常想要解决什么的问题,要满足什么样的需求,而不是要用什么样的技术

我一直认为程序员不仅仅需要一定coding的水平,也需要更多的soft skill,注意人际交往、持续的学习能力、听取他人意见的能力。未来我会在暑期实习中,继续培养soft skills;会在考研中,培养自己的知识储备,谋求更高的平台;会在工作中,重视培养阅读源码和文档的能力,以及人际沟通的能力。

第四部分:结语

这篇文章一方面是自己回忆了一下以往的故事,另一方面是给自己立Flag。

时刻告诉自己别瞎学习,提醒自己别沉溺于搭积木的小满足中,而要深刻地学习积木咋造出来的,把玩意儿学透;同时也要多了解需求缺口、技术前沿,注重非技术的积累。

接下来的日子,将是一条和过去完全不同的道路,在这迷茫的学业中,又有了新希望。

posted @ 2020-03-01 10:18  lzhmark  阅读(192)  评论(2编辑  收藏  举报