【软工热身作业】我与计算机:昨天、今天、明天

我与计算机:昨天、今天、明天

项目 内容
课程:北航2020春软件工程 博客园班级博客
作业:阅读并撰写博客回答问题 第一次作业-热身!
个人课程目标 补全自己在软件开发方面的能力和经验
这个作业在哪个具体方面帮助我实现目标 从计算机大专业的角度进一步认识自己、行业和未来

结缘计算机

大学前的生涯

我可能从小就对计算机和图形用户界面有某种“天赋”。“天赋”的一个体现是,对我来说新鲜的软硬件,无论是电脑、手机还是电子词典,我都很快就能上手。很多中小学设置了“电教委员”来帮助老师设置、连接那些对于中年人复杂的投影设备,而我就是一下就能读懂各项设置并思路清晰地解决问题的那个人。

身处全国课外班文化最浓郁的地区之一,北京海淀黄庄,我自小学开始就在各个课外培训机构上“班”。那时候大多都是奥数、英语课。之后看到培训机构“科技部”的招生简章,看到了有一门新课叫做“信息学奥赛”。当时有人对我说,学了“信息学奥赛”可能对数学竞赛也有帮助,于是我就被忽悠进了OI,在小学五年级。

那时,我拥有了我的第一任电脑,一台联想家用“影音娱乐本”,就是中低配啥都不全能的意思。我淘了一本古老的QuickBASIC教材影印版,利用光盘装好了那个长得像DOS的丑陋的环境,跟着教材一句一句敲了代码,运行起来做实验,和教材对比看“对不对”。那时候完全没有编程的意识和概念,基本是基于模仿学习——甚至在一开始我以为“累加器”只能叫S,“计数器”只能叫C,改了就会错。

一开始我的老师是来自北京市八一中学的信息学竞赛教练。他教的技术性的内容可能是我跟的所有老师里面最简单的,但是他启蒙了我对于“计算机”这门专业和行业的认识。他教给了学生们不要copy别人的代码自欺欺人,他教育我们技术向善不作恶,他不断提示我们要不停地学习不停地强化自己的脑力和技术才能在行业中有一席之地。他也带领我走向了第一门现代编程语言——C++。我不是一个很强的“计算机语言学家”——甚至我直到初三才基本理解了指针,但我仍然十分感激面向竞赛的C++对我真正编程能力的奠基、挑战和提升。

后来的小学生涯,我包揽了北京市的各种OI的一等奖,初中又拿到了NOIP普及组和提高组的一等奖。此时,才开始真正考验OI选手的思维能力。我的竞赛同学渐渐变得越来越强,而我却提升缓慢。我逐渐觉得自己不适合算法竞赛,之前拿过一些初级的成绩只是因为自己的学习能力和应变能力比较强罢了,要深耕算法竞赛是不太可能的。一些同学借OI圈逐渐兴起的“膜(拜)”文化和“神犇”文化也有意无意地让我感觉到我菜到被人嘲讽。我开始渐渐的脱离OI圈子,寻求新的发展了。

上了高中,我很荣幸成为人大附中“科学实验班”的成员。我开始主动地向“科研”方向和“科技实践”方向靠拢,以掩盖自己OI竞赛的失败。我直到今天都很感激科学实验班的老师们,包括数学的、物理的、化学的和生物学的。他们从某种角度上提前训练了我的科学素养和学术能力,让我积累了一点能力去尝试研究性的工作。

有一个厉害的家伙,我暂且称他Alvin,他是一个富有工程师精神而非科学家精神的人,他总是充满了对泛计算机技术的兴趣和热忱。在深度学习还没烂大街的时候,他为了支撑自己的一些小项目,在Coursera上自学了很多课程,总是兴奋地给我讲他的什么诸如无人车、无人机的小玩意又work了。在他的影响下,我开始喜欢上了计算机视觉和模式识别这个领域。偶然的机会,我有幸在北京大学人工智能实验室里接触了一点浅薄的称不上“研究”的工作——生物特征识别技术中的手指静脉识别。我的高中数学老师和科学实验班的班主任是对我影响最大的导师。她毕业于清华大学计算机系,在研究性学习课上教我如何查文献、读文献、提炼并形成自己的思想,也教给了我如何撰写论文来表述自己的思想。就这样我的naive的工作(甚至没有用任何机器学习算法,完全是自己瞎搞设计的传统算法,效果居然能比拟naive的机器学习方法)在“明天小小科学家”竞赛中居然获奖,我也拿到了计算机行业给我带来的第一桶金,虽然是奖金。

是的,和博客I的作者不同,我的计算机生涯的第一阶段是不同寻常的。一般的孩子对计算机的兴趣都在于创造,比如上述博客中的作者,他和他的同学们 “经常进行比赛,用自己最熟悉的语言写程序,比拼技术水平,看看谁写得更好” ,如图形化界面、游戏、软件等。而我好像不太一样,我对计算机的最初兴趣在于解决问题,比如算法竞赛,比如指静脉识别等等。我好像更喜欢拿到一个有良好规定的问题,然后设计一个思路去解决它,不过是使用计算机作为解决问题的工具、借助计算思维来思考问题。

然而,(伪)OI和(伪)科研从功利上来讲对我的升学没有起到任何帮助。而从五六年级一直和我一起学OI的同学们还在继续坚持,有的进了省队,有的拿了NOI的奖牌被清华给了降一本线。他们有的去了清华计算机系,有的在叉院,还有的去清华学数学,学临床医学,但毫无疑问我坚决承认他们都比我聪明、努力且优秀。我懒惰、愚笨且没自信,只是凭借着一些小聪明才没混到不堪的地步。

后来,我考了665分,离清华线提档线差5分,没有任何加分和自主招生优惠,我来了北航。

凭什么选计算机

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

高考过后,我收到Alvin的邀请,请他内推我到旷视科技(Face++)做算法研究实习。我很喜欢那里的工作气氛,自由、活泼且富有想象力,也十分感激这一机会让我第一次真正直接感受计算机行业。那时候,我已经坚定不移地决定我的专业是计算机科学与技术了。我从计算机科学中感受到了严谨而又直观的美,我从计算机技术中看到了实用主义的系统设计。更重要的是,读计算机专业我感觉很舒服:我似乎和很多学习计算机专业的人有着相近的特质,我阅读计算机专业的书籍和文献能感到激动、兴奋和欣赏。计算机专业既有崇尚智慧和创新的科学家精神,更有崇尚实用、可靠和有效的工程师精神。计算机专业的人们在生活上往往不拘小节、尊重自由与个性,但在学术上对知识和技术有着单纯的热爱,而这是我所赞赏和希望的。

我从未对我的专业选择产生动摇的念头,因为我知道我在这门学科上的投入、热情、经验和学识超越了大部分普通大学生。我有较同龄人更丰富的编程经验(由算法竞赛、“科研”项目和公司实习带来),我有本科阶段的算法、数据结构、离散数学的知识储备,我有强大的学习能力、信息检索和获取能力(后来在本科期间的经历告诉我,这些能力恐怕比专业知识更重要,也是很多学生所欠缺的)和足够的英文能力与学术能力。客观来讲,在清华大学的计算机专业本科生中,我的条件也许可以排在前列。

毫无疑问的,我和博客I作者的水平(现在和将来,在计算机学科整体能力上)差的远的多,但就大学前的计算机启蒙阶段而言,我与他能感受到经历上和灵魂上的共通。我们对计算机的学习都起源于兴趣,我们都有心甘情愿被计算机“支配”的课余时间。但就像上节所述的,我和他对计算机的兴趣和学习动力并不一样。

喜欢、热爱与擅长

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

毫无疑问,计算机是我喜欢的领域,但我却不能称之为我擅长的领域。我所拥有的核心能力中,并没有像前后端开发、ios/Android开发、.Net这样的技能,这些计算机行业内的重要方向的技能我都不掌握,因此我不能称之为我擅长的领域。与博客R里所提到的例子相比,我什么都不会,我写不出工资系统、打卡系统、和日流量上百万的搜索系统。

但是我不会像该文章里的往往声称自己热爱编程的年轻人一样,动不动就说 “你能推荐几本好的教材么?有易学易懂的视频么?有中文资料么?这个技术我不懂,你可以教我么?我英语不好,我不会翻墙,我们学校没教。这东西也太难了。” 我可以对这篇文章的作者声称,我热爱学习。我喜欢并立足于计算机领域的最重要的资本就是我的自主学习能力和信息获取能力。遇到一个未知的问题和小领域,我知道如何去查找资料去解决和理解它,我能很快的解决和理解它。

虽然我不喜欢开发等工作,但当我不得不做时,我也会迅速的熟悉它并上手工作。这里我并不鼓励什么都不用提前接触、现学现用就好的方法。毫无疑问,虽然我可以学得很快,但与有相关经验的老手相比自己肯定是远远不如。但我在这里想强调的是,不仅要像作者在博客R里说的要肯下功夫努力去学习,且 “需要你一生的努力去背书” ,还要会学习。能熟读专业相关英文,混迹于国内外各大技术论坛的人肯定比只会查书的人学得好。会搜索文献,对某一主题能有快速概要了解的人,肯定要比等着人讲的人学得好。

“计算机”这个领域不但包含相关的技术、知识和思维,更包括在这个领域学习和成长所必需的各项技能,学习能力就是其中之一。要擅长计算机领域,必须掌握终生学习的能力。即使某人当下可以称得上“擅长”计算机,过10年之后却不一定了。有人调侃称程序员是吃青春饭的,到35岁以后就会被裁员。我认为对于学习能力不强的人来讲,这句话不无道理。而对我自己而言,虽然我有一定学习能力,但我作为一个名校本科生对常见领域的计算机能力和技能仍然不够熟悉!我必须利用自己的学习能力快速补足自己的短板(比如这次的软件工程)。

之前一直有人问我更喜欢R(Research)、D(Development)还是R&D,但是直到写下这篇博文之时我才系统地审视了自己的舒适区、偏好和短板,因此我对自己“对编程实现软件等纯D工作的有意回避”并不感到骄傲。我可以在今后的学术和职业道路上有所偏好,但处于学生阶段就对某一个方向产生明显的喜恶并有意避开并不可取。看来是时候走出舒适区,以软工课程为一个新的起点,系统地对自己软件开发相关领域的能力进行一个训练了。

希望以后我可以骄傲地宣称,我喜欢计算机领域,我虽然不擅长计算机内的所有领域,但我 可以 擅长!

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

我热爱计算机专业。我的热爱在于勇于面对挑战、不断探索的求知欲和解决问题的成就感。

还记得在刚学OI的时候,面对一道一直WA的算法题目,我能不断调试测试、不断在讨论区中寻找答案一晚上,不解决这个问题(或者找出这个问题并想到解决方案)就不会睡觉。后来仅凭兴趣,在初三/高一时那个Coursera还可以看免费课的时代,自学了吴恩达的Machine Learning,并一下一下截图打公式整理了几十页的笔记(很遗憾由于换电脑现在遗失了)。而后来在公司和学校实习期间,无论是枯燥的标数据、遇到思路瓶颈不停地读论文还是做实验测试各种idea,我都欣然去做,因为我期待因为我的努力,我或团队能够攻克一个问题,战胜一个挑战,实现一个进步。

博客L提到了, “兴趣能让你开始让你执着,但只有喜爱才会投入热情,只有投入热情才可能会出成绩 ”。

现在我自我反思,感觉自己做的还有所欠缺。毫无疑问,我不缺少兴趣,也不缺少喜爱,但偶尔我也许会在缺少热情下呆滞、莫名其妙地去做一件事,就像一辆车,不踩油门也不踩刹车,凭借着之前的惯性向前滑行。这辆车也能滑行很长的时间,但迟早会停下来。这样的情况在参与研究时少见,因为研究时往往能有新的挑战成为我的发动机;然而却在平时上学时经常发生:一开始做课程设计时往往动力澎湃,后来的时候就渐渐麻木、对自己要求降低、实现功能了事,不再多想、多学、多设计,直到期末评分时要刺刀见红打出学生间差异时才会重新复苏。

然而人不可能在任何时间都保持热情。在如潮起潮落的自然的热情减退时,不能逼迫自己强行去做事,不但事做不好,还会更加毁心情。然而在本应保持斗志却“自我放假”的时候就要对自己严格要求,好好利用那些珍贵的可以专注于学习和提升的时间,比如大一~大三的时间。

希望自己今后能够对计算机专业,永远保有兴趣、经常热爱、有时出成绩。

在计算机系

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

在算法竞赛方面,以每道题100行计,估计下来我应该写过了数万行代码。然而,这些代码恐怕有很多都是重复的(由于许多题的算法是一样的)。上了大学以后,我的主要代码经验来自于计组、面向对象、操作系统、编译原理的课程设计。在课外的项目中读的代码不少,但自己亲自写的代码并不多。

我做的最复杂的项目是编译器课程设计中的一个支持类C文法的、优化后生成MIPS的C++实现的编译器,最终代码行数有4300余行,其中写过的代码有6千余行,删除的代码有1千余行。一开始,我抽象了编译过程的不同“趟”的过程,并提炼了多趟扫描中的共性部分,将其包装成类以简便编码。后来,随着功能的不断完善,代码架构也发生了较大的调整。但随着期末编译器优化竞速排名的到来,各种琐碎的小trick和大大小小的优化被加入其中,极大了影响了各个类和数据结构之间的联系,导致代码迅速复杂了起来。

我是一个反感过度设计的人,尤其是面向对象课程式的过度设计。我认为设计应当服务于业务和程序员:让程序员在业务功能实现中不出差错、保持可扩展性的前提下,越简单的设计越好。但如果早知道整个编译器版本迭代的过程,也许我会重新考虑自己的架构设计。

大学教育

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

TODOTODOTODO

有用与无用

问:学线性代数和概率论的时候,你是否有过这样的疑问“我们为什么要学这么多数学,这和我们的计算机有关系吗”,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?

博客C的作者写到,“成长路径中有很多的偶然,没人知道在一些关键时候需要什么样的知识储备,所以踏实地多储备一些是好事。我在经历告诉我,以前通过看书、自学,彻底地弄懂的一样知识,会在某个不经意的时候,突然被用到 ”。对此说,我非常赞同。在计算机的相关领域内,很多数学和物理学的知识说不定什么时候就派上了用场。

在旷视科技(Face++)实习的时候,每周五下午研究院会请不同领域的大佬举办Tech Talk。有一次我前去学习,主题是SLAM(同时定位与地图构建,一个在未知环境机器人上同时定位和重建地图的任务)。一开始听着还装模作样能听个大概,到后来就完全听不懂了——讲座涉及到了李群和李代数,一个我从来没有接触过的数学领域。那时候我尴尬到几乎溜走——书到用时方恨少啊!

这学期我在一门关于文献阅读的选修课上看到了一篇2019年在 Science 上发表的论文 "All-optical machine learning using diffractive deep neural networks",提出了利用多层不同的材料实现多层神经网络、利用波透射的振幅和相位来表示神经元间的数据、利用折射率的改变来变相实现神经网络的Weights和Bias。这篇文章就利用光学原理对传统计算机概念进行了重新实现,从而实现了光速推理、性能相似的3D打印神经网络实物。

这些“计算机外”的知识不但和计算机看起来没关系,还和线性代数、概率论等学科更偏远、更“没关系”,但它们都在计算机领域内发光发热。其实稍加了解就会知道,线性代数、数学分析和概率论等学科和计算机不仅相关,还在很多前沿领域成为重要的核心原理。比如微积分在BP神经网络中成为基本原理,线性代数在计算机视觉中常常与摄像机系统和成像相关,概率论在机器学习和强化学习中有着重要的地位等。

其实在2010年后,计算机科学已然成为一门新-中心科学,越来越多的学科正在和计算机发生交叉和关联。学习相关的学科,不但可以在“不经意的时候突然被用到”的时候感到庆幸,更让自己的学术和职业之路越走越宽。学习计算机,不代表着只学计算机。万物都在发生变化,人不能几十年只盯着纯计算机不变,说不定哪天就用到看似没用的知识了呢。

如果作为一个行业从业者,有推动领域前沿科技向前发展的野心和勇气,那么多学多看大有裨益;如果只是一个计算机科学技术的使用者、借用者,那么确实这样的知识积累用处不大——他们对知识的依赖并不强。

科班、培训班与自学

问:科班出身和北大青鸟有什么区别?速成的培训班和打基础的大学教育还有mooc之间有区别吗?

TODOTODOTODO

未来规划

职业规划

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

TODOTODOTODO

实现梦想

问:你对于实现自己的梦想已经做了或者计划做什么样的准备?

TODOTODOTODO

实习

问:你们马上就要面临实习了,你打算在企业内实习还是在实验室实习?

TODOTODOTODO

问:实习经验究竟有多重要?是否需要马上开始积累实习经验?

TODOTODOTODO

相关博客

博客I:我的软件开发生涯 (10年开发经验总结和爆栈人生)

博客R:不要轻易在简历上写我热爱编程,我热爱学习

博客L:对程序员职业的一些建议

博客C:徐宥:掉进读书的兔子洞

猜你喜欢

转载自www.cnblogs.com/FuturexGO/p/12370226.html