高级软件工程第一次作业

(1)回想一下你对计算机/软件工程专业的畅想

   A.考研时你是如何做出选择计算机/软件工程专业的决定的?
   这问题可以回溯到高考填报志愿时为何将软件工程作为第一志愿进行填报,很简单的原因,出于对计算机的好奇心,作为工科男,就喜欢倒腾一些电子设备,所以所报的志愿要么就是计算机相关要么就是电子相关的。和博客A的博主一样,第一次接触计算机也是在小学,同样是在暑假,在多次向父母恳求让我参加五笔培训后,父母只好勉强送我去培训公司,便开始了一段计算机初探之旅。从最初背五笔字根,到最后70字/min(当然具体的打字速度忘了)的那份成就感,就觉得自己的暑假过得十分充实。当然参加培训有个不错的奖励,那就是可以在打字太累时,玩起小游戏,纸牌、三维弹珠这几个Windows经典的自带游戏在当时也能玩得不亦乐乎,但吸引我的不仅仅是游戏本身,更吸引我的是这些游戏是如何被设计出来,然后呈现到屏幕上的。可是,后面限于条件(电脑还是很贵)和忙于学习,一路走来也只是将计算机当成工具,从没去深究当初对计算机的各种疑问。直到高二,家里终于买了电脑了,虽然是个二手电脑,但装完后的那几天还是相当激动的。父母给的要求是电脑仅仅是用来给你查学习资料用的,但这时候已经不能按捺住我想去探索这一“科幻”设备的冲动了,重装系统,简单的系统优化,每次优化后最大的喜悦就是看到开机只要10几秒,又比上一次减少了好几秒。当然也会玩游戏,但因为没时间刷各种装备,就琢磨着如何作弊,百度了一下,“外挂”一词第一次进入我的世界,原来是有工具可以修改作弊的啊,最开始使用内存修改器,但还是不能满足我,又开始学C,学如何DLL动态注入。虽然最终未能实现出一个可用的“外挂”,但还是让我了解到一些计算机的基础知识。再后来就是本科的学习了。回顾了个人接触计算机的整个过程,似乎仍然没有正面回答所提问题,为何要读研?最主要的原因的还是觉得自己学得不够深,还是没能真正学好计算机这门学科。在本科专业课程的学习过程中,往往只是为了能通过考试或者拿到高分,整个学习的关注点在于考试的范围,也没想过主动地去扩展相应的内容。有些课程甚至因自我感觉没用也没去深入学习,比如高数、离散等等,从现在来看,这些基础课程是多么重要。我也因基础知识的薄弱付出相应的代价,在阅读论文时还要去用额外的时间去翻阅简单公式的定义。正如博客B所说“我是科班,却没学懂计算机”,当看到这句话时,我深有感受。读了四年,虽掌握了各类语言、工具的使用,但对于其背后的实现却知之甚少;虽在各种课程实践中写过代码,但却从来没有为一个开源项目提交过代码;阅读一个完整的开源项目是本科一直以来的目标,但往往只是“三天打鱼两天晒网”,看了几天,热度减半,再过几天,就一点动力都没了。总而言之,读研就想通过再学习的机会,补上本科学习中存在的很多漏洞,完成本科中计划却未能达成的目标,当然最关键的是提升解决问题的能力。

    B.你认为本科阶段所学的知识是否符合你对计算机/软件工程专业的期待,为什么?
    从现在来看,我认为本科阶段学校安排的课程是比较符合计算机初学者的学习过程的,但在大一到大三的时候我并不是这种看法,之前想的是学校安排的课程大多以基础课程为主,似乎脱离了实际应用,我总不能靠着控制台写出来的程序去应聘吧,为何不多开一些实用性较高的课程,比如Android课程、PHP课程等等,光是前端框架就能开好几门课。现在想想,还是自身的问题,为何不主动去学习,反而是要等着别人强塞到嘴边的时候才勉为其难地学呢? 一些高校的计算机专业,四年下来编程语言也就开了一门C语言,但这些学校出来的学生却是样样精通,五花八门,依然能个个用到极致,既懂理论也善于工程应用。为何?原因在于懂得举一反三,懂得如何在学习基础课程之余,对整个学习体系进行拓展填充。所以,学校只开设基础课程是适合初学者的作法,从打好基础开始,踏踏实实地学好理论,才能指导实践,但这一做法也对一直习惯于填鸭式学习的我们提出了较高的要求,需要化被动为主动,找到适合自己的方向然后钻研进去。博客C中提到的一句话“其实看过《编程珠玑》的人,不是我想象的那么多”,这一下子让我顿觉惭愧,我看过的计算机经典书籍也没几本,但一个非计算机专业的前辈却能阅读这么多经典的书籍,积累的知识可见之深厚,佩服之余也感到自己的不足,我在本科阶段也是一直有着等着别人教的想法,缺乏自我求知的欲望,这点我也需要在研究生阶段有所改变。

    C.你觉得计算机/软件工程是你喜欢的领域吗,它是你擅长的领域吗?
    我很喜欢计算机这个领域,可以从回答的第一个问题中看出。一直以来就对计算机背后的运行机制有一种强烈的好奇心,希望自己有一天能写出一款很火的游戏或APP,希望自己能创建一个开源项目,享受一番审查从世界各地发来的代码的那种快感,感受和各位牛人交流学习的充实感。但说计算机是我擅长的领域这只能仅仅针对我个人而言,和其他同学相比,我真的还是一个菜鸟的级别。而对于我个人而言,我觉得计算机专业才更适合我,才是我想去发挥自己潜力的一个领域。本人五音不全,不懂艺术,如果真要强说自己擅长的领域,可能也就只能回答计算机了。

(2)即将开始研究生生涯,对照前人们走过的路和描述未来发展,现在的你

    A.自我感觉你已经具备的专业知识、技能、能力有哪些?
    在本科四年的学习中,自己学过的编程语言很多,C、C++、Java、PHP、Python、MATLAB……,但杂而不精。从大二开始,自学安卓APP开发,想想当初的方法还是比较笨的,没去找一本能快速入门的某某教义书,直接就跟着Andorid Development上的Tutorial学,心想着这可是官网,上面的东西应该是比较符合安卓编程规范的,所以,接下来的日子就是开始模仿着一些APP跟着做。琢磨了几个学期,终于基本摸清了安卓的运行机制,和开发的一些细节。为了摆脱老是只能写黑窗口程序的状况,先学了MFC,但因为其界面控件还是过于粗糙,要定制化的话还得去继承重写很多东西,而且还用自己paint上去,感觉很麻烦,所以为了界面的美观,开始尝试使用其他界面库,找到国人开源的DUI,第一次看到了以XML文件进行界面定义这种全新的设计方式,一个简单的配置就能生成一个长得还不错的界面,对于一直想偷懒的我,还是不错的选择。大四,为了完成毕业设计,学习Python和MATLAB,开始接触图像处理这一领域,惊叹于各种算法的强大,同时也被它虐得体无完肤。目前掌握的专业知识大部分集中在编程语言以及一些简单框架的使用上,而技能方面,说得上去的也就是自学能力了,根据现成的文档和API索引,能较轻松地掌握一门新技术。

    B.离成为一个合格的计算机专业硕士毕业生,在专业知识、技能、能力上还差距哪些?
    正如在上题所讲,在专业知识方面,自己最需要的就是对技术的精通,而不仅仅是了解掌握而已。如果将本科比作“广撒网”的尝试阶段,那么我希望到了研究生,能是一个“挑大鱼”的精通阶段。专注于自己的研究方向,深入去了解这个领域所涉及的方方面面的知识。同时,计算机是一门注重实践的学科,正如博客A中所说“坚持在读书的时候把代码一行行亲手敲出来并编译通过”,以前的做法是书籍附带源码光盘,看懂源码或直接照搬源码就行了,从没想过自己如果去重新实现这些方法时,会碰到意想不到的困难,然而这些困难却是帮助自我理解知识点最好的导师,所以需要多实践,多敲代码。而在能力方面,需要提高的是沟通能力以及团队协作能力,本科也完成过团队实践课程,但往往就是一两个人挑起重任,其他人就只有喊666的机会了,从不讲究团队合作和团队沟通。然而,在真正的项目开发中,团队分工合作才是提高效率最好的保证。可以把项目开发比喻成一个归并排序,先要将大问题分解成小问题,这就需要进行项目子任务的分配以及前期的沟通和规范,再将子问题进行合并,得到全局最优解,完成这一步需要的是规范化的文档编写和系统设计时对模块化的深度考虑,才能无缝地连接各个模块,最终完成整个项目。整个过程扮演重要角色的就是沟通,沟通不一定指的是面对面的沟通,文档也是一种沟通方式,甚至连代码注释也算是一种沟通方式。沟通可以避免重复做同样的事情,也能较好地避免“各自为政”,各干各的,干的却都是对项目无关紧要的。所以,我希望提升自己的项目沟通能力。

(3)研究生毕业后你的选择是什么?

    A.在这种选择下,你认为你相比其他同学来说有何优势,有何劣势?
    研究生毕业后,我希望自己能到图像处理的相关企业做研发岗位。相比于其他同学,自己的优势在于快速上手的能力以及对新技术的狂热追求,通过自己课余时间的积累,除了理论上的学习,也掌握了一些项目实践的相关知识,从编程语言、框架使用、安装部署等,都有所涉略,通过不断丰富自己的技术栈,帮助自己成长为一个既会理论研究又懂项目的程序猿。而自己的劣势在于对技术的精通程度还不够,以及在数学方面的薄弱。有些同学可能不会去多方面的涉略各种技术,但他却熟练地掌握一门,到了炉火纯青的程度。这对于我来说,真是一大劣势,我学一门技术,往往就观其皮毛,知道有这么回事,看腻了就又跑去追求下一门技术,也不去“深入技术本身的骨髓”。由于本科阶段对于数学课程的忽视,自己的数学能力实在是太弱了,简单的公式硬是要看半天才能搞懂,缺少对这方面能力的训练,积累的知识还不够,所以在阅读论文时就显得很是吃力。

    B.针对你的选择,你给自己的研究生生涯设定的规划安排是什么?
    博客K中给新手程序员的一条建议就是“拼命看书”,我想我的第一个规划目标就是每学期完成一定量的书籍阅读。不仅仅是读完就好了,更要有技巧地阅读。我发现自身的学习方法一直呈现出一种倒退的状态,可能跟越来越懒有关系,其实之前的一些学习习惯现在看来非常有用,比如应试阶段最常用的做笔记、做错题集,正如古话讲的“好记性不如烂笔头”,会看会说但不如会写,这是真道理,做笔记会提醒自己去复习重点,反复去看笔记,反复记忆所学的知识,这是符合“记忆曲线”规律的。所以,现在我也开始尝试恢复做笔记的习惯,使用“云笔记”这类工具,随时同步到各个设备上,可以充分利用自己的碎片化时间。第二个目标还是引用博客K的建议“不要只把心思放在技术上,技术是hard skill,只要下工夫就一定会掌握。更要注意与人沟通等为人处事的soft skill上”,所以第二个目标就是提升自己的沟通能力,多参与到团队项目中,比如组个队去参加各类竞赛等等。最后一个目标就是希望培养多个“独特之处”,比如我是程序员里文档写得较好的,我是程序员里球打得较好的等等,提升自己的竞争力,往往需要额外的技能。

(4)你愿意为了一个你感兴趣的、或得到实战锻炼的项目熬夜吗?你想脱离小菜鸟的level吗?如何评价上一届同学说的“和队友一起熬夜打代码是个不错的体验,或许还可以一起吃夜宵!”

    ①似乎对于程序猿来说,熬夜应该是常态,在本科学习的时候,有时候也会为了一个课程实践项目去熬夜敲代码,翻看API指引和文档,所以深夜一两点的时候可能是我灵感来临的最好时间,越写越兴奋,写完又要测,测完又想提升性能,丝毫不察觉到时光在一点点流逝。带着一个未解决的BUG去休息,是无法美美地进入梦乡的。
    ②一直想脱离菜鸟的level,但也知道突破的过程“任重而道远”。多学习,多敲代码,多与身边的大牛们接触交流,是成为大咖之前必须反复经过的训练。博客L中的一句话“我们不害怕转行,害怕的是自己对自己缺乏认识,害怕的是小猫钓鱼,害怕的是一山望比一山高”很好地应证了这一点,好高骛远不是解决问题的方法,踏踏实实的积累,一步步提升,才是“王道”。
    ③一起敲代码,确实是一种很不错的体验。分解模块编程、互换代码审阅、互相调试代码,确实比自己“闭门造车”学得更多。这一过程中,还可能要接受来自队友的批评建议,我们都需要去冷静地去分析问题,与队友进行沟通,找到出错的所在,并进一步完善自己的程序。当然要实现“1+1>2”的目标,除了各自都要有拼搏的劲头,更需要良好的团队沟通,互相理解,互相学习,才能发挥出团队编程的优势。

(5)针对上述问题(2)、(3)、(4),你对这门课的期待是什么?你打算平均每周拿出多少个小时用在这门课上,以达成你的期待以及你在(2)或(3)或(4)上的目标?

    ①我希望通过《高级软件工程》这门课学习到本科学《软件工程》时没用心去深入研究的内容,包括对项目的把控、项目的分工、设计模式等等。本科的时候把《软件工程》这门课当成一门纯背诵的科目,也就考试前临时突击背了点内容,也没真正了解软件工程在工程实际中的应用,也没想过将其用到自己的实践项目中去,所以通过重新学习来补充遗漏的内容,同时了解其高级特性,将其较好地应用到实际项目中,并最终达到将软件工程的思想贯通到将来的每一次软件开发上。
    ②我更喜欢用任务量去衡量自己用在某个科目上的时间,比如我这周需要完成阅读《构建之法》第1到第3章,每天完成作业的几道题,或者项目的几个功能点等等。每周先给自己制定的一个周计划,而每天的学习时间动态浮动,但每周的任务量必须保证如期完成,实在受限于时间未能完成,那就将其列到下一周计划,但将其标注为最高优先级。

posted on 2017-09-30 12:15  蔡鸟一斤  阅读(172)  评论(4编辑  收藏  举报

导航