2017软件工程第1次个人作业
第一部分 结缘计算机
1.计算机是你喜欢的领域吗?是你擅长的领域吗?
高中时期,我接触计算机的目的是上网、玩游戏,而进入大学,由于所选的专业偏于理论,我对计算机相关专业内容的学习仅限于大学开设的一门C语言课程,换言之,从高中到本科毕业这7年的时间,我对计算机领域的知识接触的非常少,所以在这方面的能力也比较弱。
但是这不妨碍计算机成为我越来越喜欢的领域。本科偏重于理论的授课方式让我感到很多内容都在纸上谈兵,没有实践基础很难加深理解。我认为这些知识应该用硬件去实现,所以我研究生选择了有关电子的专业。伴随着学习的深入,我开始使用Verilog语言烧FPGA,随着人工智能等研究方向的兴起,想将这些新技术和本科专业内容结合的愿望更强烈,这都让我需要学习计算机领域的相关知识,这样自己的很多想法才能落地。对现阶段的我来说,十分的乐意学习这个领域的知识,并且相信计算机会为我的很多想法创造更多可能。
2.你热爱这一专业吗?你对计算机的热爱是怎样的?仅仅是口头的吗?
我认为对一个事物的热爱,会产生无限的动力。在本科阶段,有两个课程的学习是让我感触很深的。第一个是C语言的编程,那时候老师在校园网搞了一个排名,编好代码通过测试,排名就会上去,在提高自己的排名和编程的过程中,我对C语言的学习着了魔,为了能够编好,上课在草稿纸上写语言,晚上加班到12点多,因为程序没调出来睡不着的情况也时有发生。第二个是电子设计,要求设计一个交通灯,当时脑袋构思了一个很满意的方案,着手设计后,总是遇到很多问题,加班是常态,有几次到晚上3点多才回去睡觉,神奇的是,第二天只要坐在实验箱前,我依旧充满了动力,毫无晚睡的疲惫。
举出这两个例子,是因为我在这之中感受到了自己对一个事物真正热爱时所迸发出来的能量。所以当我回答热爱这个词的时候,不仅仅是口头,我能明白它的含义。而我到底热不热爱这个专业,我想从我学习C语言开始它就种下了,但它还需要浇灌、发芽。
第二部分 学习生活
1.你对你的大学生活有什么想要吐槽的地方吗?你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。(必答)
从我个人的角度来看,我的大学生活确实有很多可以吐槽的地方,诸如老师上课方式的单一、上课容易睡觉、大学学术氛围不够浓厚、选修课程少等一系列问题。而我觉得理想的大学可能会有更加开放的上课方式、更贴近实践的授课内容,学生也许会有更好的自主选择和更多个性化的发展方向,不会为了某一种标准的考核方式而被束缚。
在这几篇关于国外大学教育的博客中讲了不少他们授课内容以及学习方式的先进点,但是这些内容还在我的认知范围内,而在我看博客[N]的时候确实眼前一亮,"PPT是我见过的最精美一份,图片动画视频很丰富,文字很简练,教室有四五种灯光组合供教师选择,营造了在博物馆听课或是在拍科教片的课堂氛围",这样的课堂,我脑海中浮现出来的无疑是一种授课的表演。我一直认为,内容和形式同样重要,这种教学在我看来是很有借鉴意义同时也不难达到的。
我所想的理想的大学教育,和母校带给我的相比,在理论学习和实践操作上都差的比较大,但是我认为不可能一蹴而就,一方面作为在中国长期存在的人才培养方式,中国大学的教育一定有其优势,老师和学校能够发展国外的模式,但需要时间来慢慢的试点和展开。同时,国外的模式不一定完全适应中国学生,在做到和国外那样的时候,我们也应该拥有自己的创新点,即中国特色。
2.迄今为止,你写了多少代码,描述你做的最复杂的软件项目/作业。(必答)
到目前为止,我写的代码大概在几千行(时间有些久了记不太清),主要写了C、verilog、python这些语言,细细想来,这些程序都不是非常的复杂,学C的时候主要完成了各种作业,学verilog的时候用modelsim仿真了分频器、加法器等,在学python的过程中可能是最有感触的了,主要困难是机器学习、深度学习的一些理论比较难理解,在编程实现上就很困难。而如果能够对这些理论有一个清晰的脉络,编程实现这些方法就不会太难了。
3.学线性代数和概率论的时候,你是否有过这样的疑问"我们为什么要学这么多数学,这和我们的计算机有关系吗",你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢?
是的,我有过这样的疑问。但伴随着学习数学建模等相关知识后,我对数学作为一门基础学科的理解更加深了。我认为,数学是解决实际工程问题的有利工具,它可以用来分析我们生活中遇到的各种各样的事物,对生活中所遇见的各种事物,我们都可以对其进行抽象后建模分析。在我学习了机器学习的一些入门知识后,更加体会到数学的重要性,它更改了我们传统的编程方式,使得程序变得更加智能。我想在未来,人工智能领域要想取得长足的发展,数学上的理论突破是必不可少的。
我在其他学科上也有这样的疑问,关于对该门课程到底该不该学习。我想,这和我们的学习目的、学习兴趣和格局有关,这好比速成的培训班、打基础的大学教育以及mooc之间的关系。如果我们只是想混口饭吃,那么很多课程不需要学的很懂,甚至不需要学,最后上一个培训班可能就可以管好我们的饭碗;但是如果我们对某方面学科非常感兴趣,我们会主动去学,这类似我们找很多mooc来学习,我们不会考虑该不该学习;在兴趣的基础上,想在该学科上做出一点成绩和贡献,那么就是一种格局的提高,这时候这些基础课程、专业课程就显得尤为重要了,我们需要基础的大学教育夯实自己,然后再做更深入的学习。而我想在本科的专业方向上有所进步,触类旁通,因此很多相关专业的知识都需要学习。
第三部分 未来规划
1.对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?(必答)
未来我不一定会在IT行业发展,但是实现我的梦想却需要计算机的支撑。我想结合人工智能的相关知识和技术,在自己本科的专业上能做出突出的贡献。
我看了这些博客,有科班出身和非科班出身的,在非科班的前辈们里面,我努力寻找自身和他们之间的共性,发现其实他们在我这个年纪的时候,很相像,他们也是从懵懵懂懂开始,但都有一颗热心,有毅力把坚持的东西学完,并且都累计了丰富的阅读量和实践操作经验,我想这是我在今后的学习中需要做的。但是,让我更产生共鸣的话是在博客[C]中的一句话,"所以,我带着三个理念进入了大学:第一是什么东西都可以自学,第二是慢即是快,笨笨地做一遍题是学习的捷径;第三是知识理想主义,知识就是力量,而读书学知识能够消除蒙昧,掌握改变世界的力量,所以是一件快乐的事情。"
我曾经也有过这样的时期,认为什么都可以自己学,但是做了毕设才发现,很多东西自己学是需要很长时间的,而有了引路人却可以少走弯路。在这样的理念下,在当前研究生阶段,我想在技术的学习上,我应该侧重自学,但是遇到难以解决的瓶颈,还是不能自己闷头解决,应该多和身边相关领域的人沟通交流。而在职业道路和社会道路的规划上,这可能是职业和事业的选择问题,我想我的职业暂时还是固定的,不需要做什么大的改变,但是在事业问题上,我认为应该咨询更多有相似成长经历的师兄和前辈。而从一个大方向来说,应该将个人成长融入国家发展中,因而我想将当前前沿的技术,比如人工智能,应用到本科的专业中,为专业的发展,国家的进步贡献自己的力量。
2.你对于实现自己的梦想已经做了或者计划做什么样的准备?
回答好这个问题可能会让我这几年的人生路有更清晰的规划。我准备在研究生期间,加强学习本科的专业知识以及当前人工智能领域的理论知识,希望在机器学习和深度学习领域能够获得更多自己的感悟并发表至少一篇EI级别以上的论文。同时,能够将所学知识用于解决实际工程问题,当前硕士阶段的学习很多人还是流于仿真分析,很少人能够将理论硬件实现。我想将人工智能领域的一些方法结合自己的研究方向用硬件的方式实现,哪怕是再简单的硬件,毕竟先做出一个框架,也算实现了从无到有的突破。
毕业后,在工作之余,想坚持做这方面的研究,但是这取决于工作的繁忙程度,因此现在讨论还为时尚早。但大佬给出的一些建议很值得我去思考,大佬在博[K]中,给新人程序员提了8条建议,我认为这8条建议不仅适用于程序员,这是每种职业的工作者都可以去思考的内容。归结起来,学做人、学做事、提高能力、考虑发展,大佬的建议给我的感受是,做这些事不可急躁,要踏踏实实、真心实意的去全方面发展。
第四部分 课程期望
1.你对这门课的期望是什么?你打算平均每周拿出多少个小时用在这门课上?你愿意为了一个你感兴趣的项目、或得到实战锻炼而付出更多时间和精力(包括熬夜)吗?(必答)
我想学完这门课,能够对软件从需求分析、设计、测试到最后的应用和维护有一个整体的认知,并且这个认知是我经过实践操作后得到的。当前3个星期有几门考试临近,所以在这门课上投入的时间会少一点,如果正常进行学习,我想每天会在该门课上投入4小时以上的学习时间。
在我感兴趣的项目上,我会投入很多的时间,这点我在之前也有讲到过。由于母校本科读书的时间很少,所以加班基本是常态。记得考研期间,赶上学校训练,每天都加班到1点半多才睡觉,那段日子对我来说很刻苦铭心,但也是那段日子让我认识到,当我有了目标的时候,付出再多的时间和精力,都是充实而充满期待的。
第五部分 分析软件
软件有很多种: ShrinkWrap(在包装盒子里面的软件)、Web APP ( 基于网页的软件)、Internal Software (企业或学校或某组织内部的软件)、Games(游戏)、Mobile Apps(手机应用)、Operating Systems(操作系统)、Tools(工具软件),这里我选择我生活中接触的比较多的手机应用、操作系统和游戏来分析。
1.这些软件的开发者是怎么说服你(陌生人)成为他们的用户的?他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的?
用户会和某款软件产生联系,我想主要有下面几种方式:一是自己有某种需求,主动搜索,根据软件下载排行榜等信息来选择下载自己需要的软件;二是经过周围朋友的介绍或者接收到某些关于软件的广告,感觉有趣因而下载;三是为了和使用这款app的人产生某种联系,不得不使用这款软件;四是和某些rom定制合作,定为系统自带的软件而不易被删除。之所以列举这四种方式,是因为它们都建立了这样一种模式:使得软件和使用者之间能够产生长期接触。这样长期下去,用户对某款软件形成了使用习惯,这样使用者对软件的依赖程度就大大提高了,换言之增强了用户粘性。我想这是软件开发者能够"说服"我们成为他们的用户最稳妥的途径,即提高用户粘性。但是细思下去,以上这些途径,很多都依赖于一定的用户基数,那怎么让一款软件在刚进入市场的时候,能够迅速圈拢人群,拥有最初的一批使用者呢?从我个人角度看,每一款软件在被定制出来打入市场前,都是基于一定的市场需求开发的,那么软件的设计就应该首先考虑这部分人群的喜好,迎合他们的使用习惯和使用风格,以此来拥有一定的用户基数。但是要想在长期和同类型产品的比拼中获得优势,更重要的是这个产品的理念,这个理念包括这个产品的设计理念、使用理念,如果还能够拥有迎合当前时代消费者需求的创新理念,那么无疑会受到市场的青睐。关于理念,我想在这些年有很多可以列举的例子。Bilibili就是一个很好的例子,这款app是为了迎合广大动漫迷的需要,因而它的"头衔"是二次元人的聚集地,甚至app的默认主题都大胆的采用粉红色,我认为"二次元"、"动漫"就是这款软件的标签,也就是设计理念。QQ的出现,"线上交友"就是它的使用理念,微信的出现,"交友"就是它的使用理念,不同于QQ的是,它不会显示使用者是否在线,网友们称它"革了短信的命",它的设计界面非常的简洁,真正的让用户有一种直接在发短信的轻松体验,因而我感觉这也是它的一种设计理念,即简洁、可替代短信。虽然QQ和微信同为交友软件,而微信这种设计理念,也使得其和QQ得以共存,毕竟在微信未出世前,短信和QQ不是相处的好好的吗?现在不过是微信替代了短信。在优步和滴滴打车出了以后,人们的出行生活得到了真正的方便,"随处可见的'出租车'",这是这两款软件开发者的创新之处,它们解决了城市生活的人群打车难的问题,这是它们的创新理念,因而得到了市场的青睐。此外,共享单车"共享"的理念,也是满足当代人群的创新理念,也迅速得到市场的拥抱。
然而这些软件开发者的目标不总是盈利的,但归根结底,它们肯定都是要为开发者最终能够盈利而服务的。在我看来,这也是产品营销的一种策略,很多产品只是想扩大用户的使用数量,好比使得一个微博帐号下面有尽可能多的粉丝关注,以此获得广告以及其他一些产业链的收入。所以,它们的目标有的是以吸收用户量为目的,以此获得其他方面的收入,并不总是赚取用户的现金。
2.你个人第一次用此类软件是什么时候,你当时多大,具体在什么学校读几年级,老师是谁,同桌叫啥?软件是如何到你手里的?例如:邮购,下载,互相拷贝,从应用商店购买,…….
我第一次接触操作系统、电脑软件大约在小学的时候,在市里的一所小学读四年级,目的也很简单,为了玩游戏,看到有人玩,跟着也想玩。而手机应用软件是大约初三左右,那时候还是塞班的时代,但我不是用的塞班机,玩的是山寨机,可是山寨机很多游戏软件收费,我开始琢磨山寨机能不能像当时的塞班系统一样安装软件。
疯狂的搜索过后,我发现山寨机在拨号界面输入特定指令是可以进入山寨系统的,那时候山寨手机装的软件都是.mrp格式的,从那时候起我对应用软件有了概念,开始寻找自己感兴趣的、好玩的游戏和软件。
3.我们知道有些软件是收费的,有些是"免费" 的, 那么,软件公司为何会给你免费使用这个软件呢? 写这个软件的工程师们,他们的工资如果不从你(用户)这里来, 从哪里来呢? 目前你们当地的软件工程师的工资大约是多少,请给出尽量详细的分析,精确到年收入多少万元人民币。
越多的人使用这个软件,这个软件的影响力就越来越大。好比一个微博帐号拥有的粉丝数,如果粉丝越多,那么该帐号的影响力就越大。这可能是软件公司让我们免费使用软件最大的理由。因为影响力虽然抽象,但是化为广告就好理解了,而广告费往往是很昂贵的。最近有媒体剖析微信公众号关于"别再吃了,某某东西有毒"这之类话题产生的根源,就涉及一套黑色利益链条,具体数值记不清了,如果某公众号粉丝数在几千人,则一条广告的费用可达几百,如果粉丝数在万以上,则一条广告的费用则会达到大几千,这些公众号为了增加粉丝数,采取了最快的捷径来发布这些抨击各类问题的信息,以此吸引广大微信用户关注。
我想软件工程师的工资,大部分应该来自于广告,可能还有其他我不了解的投资方向。好比百度在搜索上使用的"推广",Facebook想法子让广告变的清新而不影响社交。因为我没有从事IT行业,因此也不了解软件工程师的工资,CSDN对拉钩网上的招聘数据进行了分析,得出程序员的平均薪资是11k+,而全国所有行业的平均薪资是6k+,能与程序员这一行业在薪资上肩并肩的恐怕只有金融行业。
4.你是如何学会用这软件的?它给你什么好处,坏处? 这些软件是如何处理 bug 的? 如何更新新版本的? 你估计软件团队更新一个主要版本花了多少人月?请写上人月的定义. 如果你们宿舍(或者你和另外三四个同学)要做同样水平的软件,请估计你们需要多少时间?
我主要是通过看视频或者相关书籍教程来进行软件的学习,这两种方式相比,我认为看视频更容易学会相关软件,但是看书籍却可以提升阅读能力,以后再看这种教程类书籍,学习速度会更快,换言之,看书或者看开发文档学习软件,学习曲线一开始平缓,后期则变得陡峭。
在我的印象里,在我使用软件的过程中,如果软件出现问题,它会提示我上报bug。在安装某些软件时,软件会询问我是否加入用户体验计划,我想这也是他们处理bug的一种方式。软件版本的更新,有的可以直接在软件内升级完毕(比如游戏),而有的则需要重新下载最新版本,再重新进行安装。
更新一个软件的主要版本,在我的印象里可能涉及到对软件界面的重新设计,还有对软件内各种bug的处理以及软件内相关算法的优化。拿这次ios10到ios11这个大更新来说,苹果公司重新设计了软件的图标、全面屏的界面和手势,并对ios11操作系统下的默认软件都做了升级,我估计他们更新这一主要版本大约花了3个月左右成型,需要消耗100~150个人力,而后再花费若干个月的时间完成ios11的各方面测试工作。关于这个人、月的定义,我也是比较模糊的猜测出来的,我想,比如ios11有若干个界面需要设计(这包括图标、界面的设计)、若干个模块需要重写(设置内的模块主模块+子模块大约近40多种)、若干种软件算法需要调优(苹果的内置应用就有30种左右),我感到ios11整体还是很庞大的,工作量应该很大,所以给出了这个定义。如果让我们宿舍的同学(5人)写软件,估计只能写一个较为简单的app,而一个比较简单的app可能也需要大半年时间完成,因为我们要从零基础起步,学习软件的设计、数据库的搭建等内容。
5.同一类型的软件之间是如何竞争的?你现在还用它么,你为何选择这个产品,而不是它的竞争对手?
虽然软件是同一类型,但是它们之间依旧有其自身的特点,我想这也是开发者在开发之处首先会回答自己的一个问题,即我的软件和别人比有什么优势?每个开发者对自己的软件确定出来的优势是其核心竞争力,无论怎么拉拢用户数量,增加用户粘性,只有真正做到良好的用户体验,才能够赢得竞争。当然,也有用户体验都很好,双方势均力敌的情况,比如优步和滴滴的大战,这种情况下,是双方财力的比拼,谁能砸入足够的钱,增加用户,提高用户粘性,谁就能在竞争中胜出。
回顾我个人使用的软件,以前我有用新浪微博和腾讯微博,但后来我不再使用腾讯微博了,因为大多数朋友使用新浪微博,而新浪微博的信息消息也更多。
6. 5年后,这种软件运行的硬件会有什么变化,软件再过5 年还会存在么,为什么?
在我看来,当前,摩尔定律基本快饱和了,想要再做出更精细的集成电路是很困难的,这就决定了这种软件所运行的硬件在运算速度上不会有大的提升,而且,到目前为止,千元内手机的硬件支持都可以满足绝大部分消费者的需要,因此我认为硬件在量上的提升不再是发展的重点。但是可能发生质的改变,具体来说,人工智能领域的兴起,使得能够快速处理图形运算的GPU得到了更加的重视,华为前不久也推出人工智能芯片,这些芯片基于人工智能的算法定制,标志着一部分硬件在智能手机上的发展趋势。比如天气软件,没准5年后,我们了解空气中的PM2.5不再需要天气总站数据传输,而是调用手机的一个摄像头就可以完成当前空气PM2.5质量的分析,是雾还是霾?让摄像头告诉我们吧。再过5年,很难说某款软件会不会存在,塞班系统、柯达胶卷,都是教训,只有跟着时代创新,才不会被淹没在时代的大潮里。
7.列举你在使用上述软件的时候观察到的 "特殊"现象,它们和硬件有什么不同? 这些能说明软件的某些本质特性么?
我在使用软件的过程中,总体来看,对软件和硬件的区别有4点印象深刻。第一,软件可维护性强,而硬件制作完成后难以修改。第二,在我浏览博客时看到程序员说,在浏览前任程序员写的程序时,巴不得推翻重写,这说明不同的程序员有不同的编程习惯,难以继承下去,而硬件的电路构造标准较统一,同行容易理清楚。第三,软件的开发成本低,而硬件制作成本高。第四,软件的受众面广,而硬件只为特定对象服务。
这些差别当然也体现出了一部分软件的本质特点,这在《构建之法》中也有提到,比如软件的可维护性强,这是软件开发过程的易变形,第二点指的是软件的复杂性,而开发成本低决定了软件的灵活性等。

浙公网安备 33010602011771号