【软工热身作业】我与计算机:昨天、今天、明天
我与计算机:昨天、今天、明天
项目 | 内容 |
---|---|
课程:北航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里所提到的例子相比,我什么都不会,我写不出工资系统、打卡系统、和日流量上百万的搜索系统。
但是我不会像该文章里的往往声称自己热爱编程的年轻人一样,动不动就说 “你能推荐几本好的教材么?有易学易懂的视频么?有中文资料么?这个技术我不懂,你可以教我么?我英语不好,我不会FQ,我们学校没教。这东西也太难了。” 我可以对这篇文章的作者声称,我热爱学习。我喜欢并立足于计算机领域的最重要的资本就是我的自主学习能力和信息获取能力。遇到一个未知的问题和小领域,我知道如何去查找资料去解决和理解它,我能很快的解决和理解它。
虽然我不喜欢开发等工作,但当我不得不做时,我也会迅速的熟悉它并上手工作。这里我并不鼓励什么都不用提前接触、现学现用就好的方法。毫无疑问,虽然我可以学得很快,但与有相关经验的老手相比自己肯定是远远不如。但我在这里想强调的是,不仅要像作者在博客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和大大小小的优化被加入其中,极大了影响了各个类和数据结构之间的联系,导致代码迅速复杂了起来。
我是一个反感过度设计的人,尤其是面向对象课程式的过度设计。我认为设计应当服务于业务和程序员:让程序员在业务功能实现中不出差错、保持可扩展性的前提下,越简单的设计越好。但如果早知道整个编译器版本迭代的过程,也许我会重新考虑自己的架构设计。
大学教育
问:你对你的大学生活有什么想要吐槽的地方吗?
博客H写到了,“ 大学本科的所有知识都可以自学获得。 ” 我非常赞同。但大学本科的课程也不是没有意义的,在此我想讨论一下计算机作为一个系统学科和实践学科,关于它的课程教学合理性的一点看法。
在北航计算机系本科教学中我认为,除了《计算机组成》《编译原理》《面向对象》《操作系统》《软件工程》《算法》这些众所周知且关注的“硬课”以外,其他课程的质量参差不齐。诚然不可能每门课都像这些课一样有专门的课程组、助教团队和教学系统,但每门课都应该踏踏实实地把该学的知识讲透,并且引导学生把知识串联起来,形成系统思维。比如《计组》《操作系统》和《编译原理》就是密切相关的课程,其中关于运行栈、内存分配、层次存储结构、页表和TLB等等知识是相通的,课程组在教学的时候也确实将它们串联了起来,让学生对这些内容有一个系统性的认识。但是在诸如《数据结构》这样的课程中,就完全只拘泥于教好自己课程本身,将一些知识边缘化、独立化。比如讲B树和B+树,完全可以讲一下文件系统和数据库里分别用的是哪种数据结构、为什么?各种平衡树有什么优缺点,为什么工程中使用红黑树多,使用AVL少?
这是我关于计算机学科教学中系统思维的一点拙见。另外我还想讨论一下“世界一流大学 ”的大学生不会实践、不敢实践、不重视实践的问题。这里的实践不光包括写代码和写代码的方法与策略,还包括工程实践所相关的如Git等工具的使用,甚至广义地,还包括写文章所用的LaTeX等工具。我不止听过一个同学被我问到为什么不用IDE内置的Git帮自己做版本管理时,回答我诸如“麻烦”“我能记得住”“我不会”的理由。好像很多大学生把计算机科学和计算机技术相分开了,认为理论知识总是高贵的、实践知识总是“一上手就会了”的没什么大不了的东西。幸亏有《操作系统》和《面向对象》课的强制使用Git,才让他们补上了这一本不需要老师去教的知识。不过我仍然看到了,有人写一个C++版本的60行DP算法题需要debug一个小时;有人一个Java类写了数百行解决一个问题;有人使用IDE中的debug功能都需要老师教。我对博客B中提到的,“ 当场写程序的朱仲涛老师的’数据结构‘课 ”并不完全赞同。学了有必要亲自实现的知识,学生应当有自发的动力去编程写写,老师并没有这个义务带着学生写程序。如果偏得要老师带着写、留作业要求写才会写一点的话,这个学生对计算机的学习是脱节的。
问:你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。
在我理想的大学教育中,课程本身的内容应该让学生觉得酷酷的、精巧的、令人叫好的、启发式的,而不是让学生就DBMS的功能和编译的五个阶段到底是什么纠结一下午。老师应当是博学的、踏实且稳健的,永远能向学生新的东西并给以启迪。学生应该是热情而不浮躁地向往知识与技术的。很遗憾在我现在接受的大学教育中,多数课程不够格、一半老师不够格、多数学生也不够格。这不是某个老师、某个学生和某门课的问题,这是浮躁而传统的大环境所决定的。从技术、智力上来讲,从来我也不认为北航的老师和学生比哪个学校差。然而从环境和心态上来比较,我认为我校比起某些学校、甚至世界一流大学还差得远。
在国外大学教育中有一个词儿叫“undergraduate research”。在国内可能没有多少大学推行这个系统地让本科生参与科研的项目,但还有很多机会能让本科生进到实验室去做一些事情。但是在这样的实验室真的能学到东西吗?
我曾在校内的某实验室的某小组实习。两个月的时间,我一次都没有见过实验室的老师,和我对接的从来都是博士生和研究生——那大老师手底下那么多博士生那么多项目,怎么可能管得上你一个小小本科实习生?而这个由五六名博士组成的小组,却同时负责着六七个与外面公司和组织合作的项目,一个个都是“人工智能”的,都是“大数据”的,都是先进的高科技呢。我曾问其中一个博士生他的研究方向是什么,和这六七个项目是否有关系,是否有时间做自己的研究?得到的答案让我惋惜。此外就我所知,实验室的管理非常的“层级化”——导师与几个博士直接对接,几个博士就成了剩下的博士和硕士研究生的“导师”,实验室内分出几个“分支机构”,分别有小组长和组员。这真的是一个现代一流理工科大学的实验室吗,还是某国企事业单位领导树?
后来我有幸到某大学的某位老师下面做实习生。虽然这位老师手下的博士生和硕士生也很多,但这位老师在百忙之中总是和每个小课题的小组经常开会和见面,即使是和我这样的臭鱼烂虾本科实习生也经常交流。这样扁平化的指导、交流和管理有效地保证了学生和老师之间的沟通,同时让每个学生直接与老师对接,减少了行政上的效率浪费。而该实验室的研究就显得十分的纯粹、沉淀、不浮躁。虽然实验室可能也和外面的一些公司有合作,但都是和学生课题高度相关的内容,做研究和项目是为了学术、学生和老师,而非实验室和老板——我无比厌恶“老板”在高校内的使用,而在北航我不止一次听到学生和老师称某些老师为“老板”。该实验室在人工智能的学术水平远在北航平均水平之上,我却没有听说过任何人在任何地方吹嘘“人工智能”“大数据”“物联网”的“国家战略”“创新创业”,而这样的沸腾我在北航却听了很多——有人夸张地说,北航所有系除了计算机系,人均都在搞“人工智能”“大数据”!
但愿北航早日沉淀下来,聚焦学术和技术本身,将金钱和荣誉往后放放,早日改善浮躁的环境。当然这只是我的个人浅见,希望某些群体有则改之,无则加勉。
有用与无用
问:学线性代数和概率论的时候,你是否有过这样的疑问“我们为什么要学这么多数学,这和我们的计算机有关系吗”,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?
博客C的作者写到,“成长路径中有很多的偶然,没人知道在一些关键时候需要什么样的知识储备,所以踏实地多储备一些是好事。我在经历告诉我,以前通过看书、自学,彻底地弄懂的一样知识,会在某个不经意的时候,突然被用到 ”。对此说,我非常赞同。在计算机的相关领域内,很多数学和物理学的知识说不定什么时候就派上了用场。
在旷视科技(Face++)实习的时候,每周五下午研究院会请不同领域的大佬举办Tech Talk。有一次我前去学习,主题是SLAM(同时定位与地图构建,一个在未知环境机器人上同时定位和重建地图的任务)。一开始听着还装模作样能听个大概,到后来就完全听不懂了——讲座涉及到了李群和李代数,一个我从来没有接触过的数学领域。那时候我尴尬到几乎溜走——书到用时方恨少啊!
这学期我在一门关于文献阅读的选修课上看到了一篇2019年在 Science 上发表的论文 "All-optical machine learning using diffractive deep neural networks",提出了利用多层不同的材料实现多层神经网络、利用波透射的振幅和相位来表示神经元间的数据、利用折射率的改变来变相实现神经网络的Weights和Bias。这篇文章就利用光学原理对传统计算机概念进行了重新实现,从而实现了光速推理、性能相似的3D打印神经网络实物。
这些“计算机外”的知识不但和计算机看起来没关系,还和线性代数、概率论等学科更偏远、更“没关系”,但它们都在计算机领域内发光发热。其实稍加了解就会知道,线性代数、数学分析和概率论等学科和计算机不仅相关,还在很多前沿领域成为重要的核心原理。比如微积分在BP神经网络中成为基本原理,线性代数在计算机视觉中常常与摄像机系统和成像相关,概率论在机器学习和强化学习中有着重要的地位等。
其实在2010年后,计算机科学已然成为一门新-中心科学,越来越多的学科正在和计算机发生交叉和关联。学习相关的学科,不但可以在“不经意的时候突然被用到”的时候感到庆幸,更让自己的学术和职业之路越走越宽。学习计算机,不代表着只学计算机。万物都在发生变化,人不能几十年只盯着纯计算机不变,说不定哪天就用到看似没用的知识了呢。
如果作为一个行业从业者,有推动领域前沿科技向前发展的野心和勇气,那么多学多看大有裨益;如果只是一个计算机科学技术的使用者、借用者,那么确实这样的知识积累用处不大——他们对知识的依赖并不强。
科班与非科班
问:科班出身和北大青鸟有什么区别?速成的培训班和打基础的大学教育还有mooc之间有区别吗?
就计算机的技术而言,说句不好听的,什么课都不上,给学生一台联网的电脑,假以时日什么都学会了。那么能说大学本科计算机这个学位没用吗?
就算上了大学本科,或是上了北大青鸟,学到的内容都是计算机领域庞大内容的冰山一角,真正重要的是在大学中锻炼得到的(自我)学习能力、合作能力和计算思维。依我之见,北大青鸟恐怕不会教学生为什么Dijkstra不能用于含负权边的图,也不会像学生展示从Memory Hierarchy和Cache中我们能学到什么idea,更不会教学生github和stackoverflow是什么网站。
而MOOC在我眼中,与自己上Youtube搜索视频讲解,甚至买本教材自己看没有任何区别。大学的可贵之处不在于学知识和技术,而在于在大学里面学知识和技术。这里的环境、老师和学生都带着知识的高贵气质。
未来规划
职业规划
问:对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?
趁还年轻的时候,希望加入一个有活力和有智商的团队,帮助推动计算机科学向前一小步。
再老一点的时候,希望加入一个需要IT工程师的非著名互联网公司,朝九晚五的做好自己的事,不去996地对着KPI抢破脑袋。
我很喜欢博客A的标题:“ 时刻调整方向 找到人生的蓝海 ”。我希望自己在职业生涯上不要紧缩在自己的舒适区内,要勇于跳出舒适区,尝试新的领域,面对新的挑战,逼迫自己学习新的技术,这样才能保持持续的职业竞争力。都说程序员吃青春饭,我觉得不见得,只要自己能保持终身学习的能力。只会深度学习的话,万一过气了,就不工作了吗?
更广泛一点来说,不仅技术上要跳出舒适圈,职位上也可以发生新的改变。在学校和企业做研究做科学家做腻了,去当一个工程师吧。当工程师当腻了,不妨试试产品经理?在IT行业呆了10年了,不妨去高中当老师教教算法竞赛?人不能在一棵树上吊死,单调颜色的人生未免太过无聊。
实现梦想
问:你对于实现自己的梦想已经做了或者计划做什么样的准备?
在课内有好好上课,在课外有过和正在有几段高质量的实习经历,并且勇于面对其中的挑战,尽力去战胜它而不是主动躲避。
计划把自己缺失的技能补全,没做过的工作需要躬行。年轻人就要多尝试不同的道路,不可能本科阶段就说我就要去做研究,做开发自己做不了,我天生就是研究的命。那样路就走窄了。
实习
问:你们马上就要面临实习了,你打算在企业内实习还是在实验室实习?
我曾经在旷视科技、北航、北大、清华都实习过或长或短的时间。基于我自己的经验,我认为企业实习和学校实习的区别在于:
在企业实习往往能接触到更前沿的技术和走出实验室的实际问题。以机器学习领域为例,学校实验室往往止步于提出一个数据集,在数据集上达到State-Of-The-Art,说服自己,发篇文章了事。而企业中还关心实际使用时的问题,如有速度要求下,模型如何加速如何压缩?是否具有足够的鲁棒性?如何解决遮挡、群体目标、图像质量差的问题?这些问题都是大多数实验室不会考虑的。实验室的目标在于发论文,发完就没我事了,方法在数据集上work了,能不能用另说。
在学校实验室实习有着更小的压力。企业的大多数部门都有绩效的考核,毕竟公司不是慈善机构,实习生不干活肯定是要被push的。而且作为实习生自己也不好意思——白拿工资一个月还没出成果,Team Leader坐你边上两天给你发封邮件问进展,还能好好睡觉吗?而实验室就没有这样的压力,没有人要求你多长时间内得出个解决方案。
就我个人选择而言,我会说这取决于具体的企业和实验室。我向往自由、创新和智慧,就这一条评价标准。
问:实习经验究竟有多重要?是否需要马上开始积累实习经验?
实习经验非常重要,它会再一次地向你揭露你在学校学的那点玩意是多么的幼稚、过度简化和不堪一击,它会再一次提醒自己身处菜鸟的地位,勉励自己多听多看多学。在有一定压力(来自上级的压力和来自同学/同事的压力)的条件下快速学习新领域,厉害的人会激发出自己的潜能,不太行的人会被压力摧毁退出。学了这么多年,是时候对自己狠一点,看看自己是个什么样的人物了。
博客D里提到了,“ 企业要的应届毕业生就是一张白纸,这些白纸吸墨能力的高低决定你能否找到好的工作,而吸墨能力高则主要是基本功扎实、自学能力强的体现 ”。基本功扎实是大学本科的贡献,而想要锻炼自己的自学能力,尽早高质量地实习就是最好的办法。
在不影响毕业、保研等长期目标的条件下,实习越早越好。就研究的岗位而言,首先一般需要一个月的时间上手和学习新知识——别担心,虽然你什么都不会,但是会有一群热心(等着你学完创造新东西)的人来引导你、教你,但自己也要努力。之后还需要好几个月的时间来赶上你的同事/同学的水平和经验。之后想要科研出有效的成果,半年到一年的时间是必不可少的。如果仅仅实习两三个月就跑路的话,可以认为是去领三个月工资,没做出什么贡献的。
结语
感谢《软件工程》的这次作业,迫使我系统地回顾了自己十年的计算机学习和实习生涯,让我在回忆中意外而又必然地发现了自己的诸多问题。
但愿对这些问题的反省和立下的flag在不远的将来都能被实现。
但愿十年后自己再来看这篇博客,不会发笑:“哈哈!傻了吧唧的!”
相关博客
博客I:我的软件开发生涯 (10年开发经验总结和爆栈人生)
博客R:不要轻易在简历上写我热爱编程,我热爱学习
博客L:对程序员职业的一些建议
博客H:【野生程序员】:优先招聘
博客B:刘帅:在失望中寻找希望
博客C:徐宥:掉进读书的兔子洞
博客D:一直在路上——记我从初中到本科近十年的学习成长历程
博客A:辜新星:时刻调整方向 找到人生的蓝海