天天看点

软工热身作业

项目 内容
课程 软件工程 
作业要求 热身作业
课程目标 学习一个“足够好”软件的开发迭代流程
作业帮我实现目标 认清自己,理清方向,制定规划

第一部分:结缘计算机

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

    直接原因是我在高三看了一部电视剧,男女主角都是计算机专业,觉得这个专业很潇洒。

    兴趣确定方向

    作为一个理科生,我面临着理和工两大方向。我的兴趣是从事实践类的工作,我喜欢从自己的作品中积累成就感,所以选择了工科。而计算机专业最吸引我的部分,也就是如此。当我看到自己的程序实现了特定功能,或是搭建起一个系统的雏形时,我有一个深刻的感觉——计算机技术能构造出另一个世界,而程序员是这个世界的工程师,掌握计算机技术就是掌握了改变世界的钥匙。

    成绩决定专业

    我的高考成绩正好够上北航信息大类,它也是我的第一志愿。顺利进入信息大类后,在大一结束时我做了第二次选择,从计算机、软工、电子信息、网安四个方向中选择了计算机。年级中流行着一股风气,很多竞赛大佬都选择了计算机专业,成绩好的同学削尖了脑袋往计算机专业钻。而我成绩能上计算机,不太清楚计算机和软工的实质区别,就选择了更传统的计算机专业。俗话说当你不会做选择时,就应该去更多学科的基础专业,那里发展更开阔。就像我选择计算机,也还有做软工方向的余地。

    自身条件

    在进入计算机专业之前,我人生中没怎么接触过计算机。可以说我起点较低,没有形成自己的大局观和方法论。好在所有专业课没有门槛,认真看书敲程序是不会落后的。这两年半的经历告诉我,我有一点重理论少实践。数学类基础课单独每一门分数都很高,计算机硬核专业课理论部分学的很仔细,但是实验课申优困难。

    像博客B博主一样,我也认为自己是没有学懂计算机的科班生。困境在于不能理解核心专业课之间的交叉和联系。举个栗子,访存这件事在计算机组成、操作系统、编译原理中都提过,侧重不一样,而我还没能形成一个整体认识。我欠缺教材之外的补充知识,需要阅读最详尽的原版大部头书籍。

    跟博主们比

    跟这些博主相比,我们最大的差距是他们拥有对计算机近乎痴狂的热爱,这份热爱可以让非科班出身的程序员晋升为行业大佬。不得不说博主成功是有原因的,博客C在校期间敲完《Thinking in Java》、《编程珠玑》的坚韧让我很钦佩,博客K自学了很杂很泛的知识再伴以实习中的应用,使他学习新的技术时可以触类旁通。很遗憾我没有体会过技术宅“瞎鼓捣”学会技术的成就感。但是我所处的学习环境是不输任何博主的,北航有一流的教授指导,有竞争激烈的同学,有挑战的程序设计课程。以后还是要充分利用环境,有意识的加强工程能力。

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

    我是喜欢计算机的,就像我之前说的,它作为工科的代表散发着独特魅力。但我在遇到不能突破的困难时,会变得焦躁。一个大佬很快就能解决的问题,不熟练的人连软件都会装了卸卸了装一整天,这曾经让我产生怀疑。

    我觉得喜欢的情绪是需要培养的,在正反馈中会越来越喜欢,完成好的作品会激发我对计算机的喜爱,从而完成下一个。博客M一句话让我醍醐灌顶,

    “如果要快速提高自己的编程水平的话,你必须总是去做一些你做得出来,但是难度大到只要再难一点点你就做不出来的事情。”

    我正是需要用这样的项目来锤炼自己。

    我对计算机没有达到擅长的水平。我作为科班生首先没有把核心专业课学通,能在自己搭建的CPU上跑自己的操作系统这样的程度才能算是通了。其次我接到一个软件类的项目时还不知从何下手,看见技术博客中的专业名词会犯懵。从这两层面,我和学懂之间的差距需要更大阅读量和独立思考来填补,在技术实践上欠缺的是勇敢尝试和经验。

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

    我引用博客L中的话来定义热爱,
    “很有热情,会因为专研某个问题,学习某个东西,尝试某个东西,达到废寝忘食的程度,而且以些为乐。”

    我的热爱还没有达到这种程度。

    比如大三上学期完成的编译器,优化编译器是无止境的。优化的过程我觉得很有意思,但我实现了常规的优化项以外,时间所剩无几所以就停下了,比我更热爱的人或许会熬夜继续优化吧。

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

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

    吐槽
    • 大学里面绩点的高低几乎影响着一切机会,所以很多人(包括我)选课的时候会很关注给分情况,毕竟不能为了此时学到技能不顾未来前程。尤其是一般专业课,很难按照自己原本的规划,成系统的选择贴合自己发展方向的课程。
    • 大类招生把一群成绩优异的学生汇聚到了计算机系,内部又展开了更激烈的较量。有些课程严卡正态分布限制高分数量是不太科学的,因为大家都很优秀。

    我理解的大学教育

    我理解的大学教育是为学生将来从事的事业做铺垫的。现在学校教授给我们的知识跟企业需要的技术有些脱节,大部分是需要自学的。但这不是一两个学校的个例,而是普遍的矛盾。

    我认为学校做到的

    我目前感受到北航计算机系很棒的部分是计组、操作系统、编译、面向对象这些实验课,他们每年都在改进(变得更难)。老师在第一节课会给出国外大学的实验课安排,拿我们学校的对比,我们模仿和改良得比较成功。最终在紧凑的实验中,我们都能做出完整的cpu、操作系统和编译器。

    跟国外学校相比欠缺的

    • 缺少与发展前沿的交流,因为国外更容易请到学界最具影响力的大佬来讲座。我们学着基础的知识,对目前技术发展到什么阶段都没有太清晰的认识。
    • 有些实践类课程不怎么讲实践。给我印象很深的是,吴恩达的deep learning课程,有很完善的在Jupyter notebook的练习资源,可以很快学以致用。国内一些专业课讲完没怎么提过实践流程,还要自己再学一遍。
  • 迄今为止,你写了多少代码,描述你做的最复杂的软件项目/作业。(必答)

    我一共写了万行级代码。

    最复杂的项目是一个简单的编译器。这是我第一次用高级语言写出一个完成度很高的项目,每一行代码都不是借鉴的,开发周期持续一学期,用C语言编写。

    另一个同样很复杂的项目是面向对象的表达式运算,实现到求导运算花费了四周,用java编写。

  • 科班出身和北大青鸟有什么区别?

    比较科班出身和北大青鸟各自平均水平的计算机人才,
    • 科班出身有更多选择:

      科班出身的人对核心知识掌握的比较牢固,北大青鸟的软件实践能力会强一点。基于这个特点,科班出身的人在计算机方向的选择不仅限于软件开发,从体系结构、并行计算到人工智能,在本科阶段都能找到理论支持。科班出身的发展不仅仅是进入公司从事研发,还可以投入科学研究。

    • 科班出身视野更广:

      掌握了体系结构、操作系统等底层知识,让科班出身的人可以从更宏观的角度思考和解决软件方面的问题。

  • 速成的培训班和打基础的大学教育还有mooc之间有区别吗?

    有区别。我认为数学等基础学科以及核心的专业课应该细嚼慢咽,知其然也要知其所以然,需要在大学中好好打基础。因为计算机的各门专业课之间有千丝万缕的联系,形成知识体系才能融会贯通。就像博客B中讲述清华朱仲涛老师的“数据结构”课,
    “每遇到一个算法,一边写程序,一边讲解,不懂就将程序的运行结构拿出来分析,并不时地穿插离散数学、概率论、内存管理、C语言、汇编语言等知识,几乎将我们学到的东西非常恰到好处地拿出来,让我们从心里面觉得原来所有的知识是连贯的。”
    我们还需要在扎实的核心知识之上,通过观看mooc或参加培训班迅速学会新的技术。新技术往往更新迭代很快,我们也要持续学习。而且多数情景是,往往先有项目在手,发现还要为此掌握一些新技术,需要在几天之内会用,而不必精通。这时靠网课速成是很合适的。
  • 学线性代数和概率论的时候,你是否有过这样的疑问“我们为什么要学这么多数学,这和我们的计算机有关系吗”,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?

    我现在没有这样的疑问了。因为我在看深度学习的论文中见到大量矩阵运算的公式,需要复习线性代数才能看明白。神经网络反向传播的求导运算,需要高等数学知识。而数学建模中的模型也会用到微积分,大学物理,和概率论的知识。

    数学是计算的工具,一切理工科学的基础,有这个疑问是因为仅仅接触程序的时候没有触及复杂数学知识,应用计算机解决实际问题的时候很容易碰到。比如,很多计算大规模宇宙问题的科学应用的算法并不是最优的,于是碰到性能瓶颈,而简化算法需要数学本领高强的人推导大量公式。

第三部分:未来规划

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

    我的梦想是参与到家喻户晓的软件的研发队伍中去,未来会到企业中工作,具体职位现在也说不清。

    我详细的规划如下,

    • 大三保证课内学习的基础上,参加实验室实习锻炼科研能力,积累一定资本;
    • 大四参加企业实习熟悉企业的工作方式和节奏,申请国外研究生,课余时间通过阅读算法的原版书籍强化算法;
    • 出国读研究生的时候,快速吸纳新技术,尽量在国外企业找到毕业后第一份工作;
    • 在外锻炼一段时间回国内发展。
  • 你对于实现自己的梦想已经做了或者计划做什么样的准备?

    为了申请国外的学校,我花很大努力保持住了绩点,额外时间几乎都花在准备英语考试上面。

    我参加过一次并行计算方面的比赛,确认了自己并不适合这个方向,随后加入了校内计算机视觉的项目组实习。在项目组摸鱼阶段掌握了快速阅读论文,以及论文写作的方法,但提出问题的能力和实践的能力没有得到太大锻炼。大三下半学期,如果还有科研机会我会更注重提高实践能力。

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

    我打算都尝试一下,大三在实验室实习,大四到企业内实习。我最终是想要去企业工作的,因此在工作前应该了解企业是不是真的适合我。但是本科阶段,在实验室实习更方便,而且申请研究生时更被重视,所以毕业前在实验室实习为主。
  • 实习经验究竟有多重要?是否需要马上开始积累实习经验?

    我认为实习经验和本科学习是相得益彰的。学习成绩好更容易得到好的实习机会,实习经验反过来对我们的学习有指引的作用,让我们知道哪些东西是需要熟练掌握的,最应该打好基础。有些技能,在我们按部就班地学习之前可能先在实习经历中接触到了,那个时候会感觉游刃有余。习惯了实习中的焦头烂额,就不会觉得课内学习特别困难了,自学会变成一种习惯。

    计算机专业的实习经验很重要,尽量从大三开始关注实习消息,积累有效果的实习经验。但是课内的学习更重要,实习应该在力所能及的范围内适可而止。

博客 链接
博客C 徐宥:掉进读书的兔子洞
博客K 谈谈职业规划——CSDN对我的采访
博客M 进入2012 -- 回顾我走过的编程之路
博客L 对程序员职业的一些建议
博客B 刘帅:在失望中寻找希望