合理规划,勇攀高峰——读学长博客启示录 梁飞
在众多学员的翘首期盼之中,微软创新人才学员的重磅炸弹——高级软件工程,终于开课了。课程的整体目标定位于世界级的软件开发。在为期三个月的课程中,我们将体验一套完整的软件开发流程,学习先进的软件研发知识,最后所有学员以团队为单位开发出一套高水平的软件应用。课程的整体目标是世界级的软件开发。而我们的第一课就是联系上届同学,阅读他们的技术博客,学习他们的开发经验,为自己的软件开发之路起个好头。
一提到软件工程大家第一个想到的可能就是算法。没错算法的确是一款软件的灵魂所在。但软件工程和其他CS或EE领域不同的就是:only algorithm makes nothing. 我们必须通过在其他方面的努力让先进的算法真正焕发出活力,真正做到被用户接受并喜欢。在这篇文章中我会重点介绍我对软件工程除算法之外的部分理解。
最近,我仔细阅读了上届Rosting队伍的技术博客。他们开发的项目是家族树。简言之就是提供一个互联网搜索应用,方便用户(主要针对学术界)查找学术上人物关系。有了它,申请出国的学生就能很方便的找到和自己的理想导师相关的同事或学生,正在招收学生的老师也可以很方便的获取某同学的学术背景,从师经历等。他们的工作给我最大的启示就是做事的条理性与逻辑性。任何一件事绝对不是盲目的凭感觉去做,而是经过细致缜密的前期分析,最终才决定去做。这样就可以尽可能减小做事情的风险,如果做事只凭一时冲动,一时热情,很容易就出现事倍功半的情形。
严谨的可行性分析
当我们有了一个想法想开发某个应用时,第一件要做的事情就是可行性分析,仔细评估这件事情的意义和价值,最后有没有市场,用户究竟会不会去使用。因为软件开发和纯粹的研究还是有很大不同的。仅仅是求知不能作为软件开发的理由。软件开发的目标是赢得市场,只有用户愿意去用,软件才有价值,开发才有意义。Rosting队的同学使用了专业的NABC方法进行可行性分析,很值得我们学习。
N指的就是NEED(需求)。任何事情如果没有需求就没必要去做,尤其是对软件开发这种应用型很强的行业。在Rosting的需求分析中,他们主要从留学生的 角度来分析需求。列举了一些中国留学生数目庞大的证据,说明了他们迫切寻找一位好导师的愿望,尤其是那些不太可能找到顶尖学校顶尖导师的同学,寻找这些大牛曾经的学生作为导师也未尝不可。而且中国留学生的数目数量如此庞大,未来也只会有增无减,所以Rosting的队员们一致认为家族树的开发是非常有意义的。
A即为Approach(做法)。不是所有有需求的事情都值得去做,一定要考虑它是不是可能被完成。综合分析一件事情的实现过程的可行性,在当前的技术水平下有没有可能完成,有时还要考虑是不是符合当地的法律法规。对于家族树这个项目,核心问题就是去获取师生关系。师兄师姐们认为可以通过已发表的学术论文和个人主页来分析师生关系。只有找到了可能的做法,我们才有继续做下去的理由和勇气。当然我们要区别天马星空和难度大的区别。有些事情可能刚开始很有难度,但只有亲自做了才知道到底可不可行。所以在做这部分工作的时候多多少少要承担 一些风险。但我们我想办法把风险降到最低,及时排出那些纯粹是天马行空的设想。
B指的是Benefit(好处),这部分和need是紧密相关的。一般利益都是基于需求的,有了需求就会有好处。通过上面需求的分析我们可以看到一旦一个产品投入市场将会对人们的生活和体验产生多么大的影响。
C即为Competitor(竞争),竞争分析主要针对软件产品的市场而言。一般如果该产品其他人已经做了很长时间,而且效果足够好,在没有什么特别出奇的想法之前就不要盲目进入到这一领域。如果发现别人的产品有很明显的漏洞,并且自己有很好的改进方法,则此时参与竞争应该是很合适的。在Rosting的分析中,他们就指出了目前市场上此类产品的局限性,并将会自己的产品中加以改进。
用户至上的开发准则
因为软件最终的使用者是用户,所以开发时要时刻谨记用户至上的原则,要花很大工夫去尽量提升用户体验。如果用户在使用时无法获得非常舒适的用户体验,界面难看,操作复杂,用户很容易就会失去对该软件的兴趣。相反,那些拥有很高的视觉体验而操作有非常方便、人机交互做的非常好的软件肯定会得到用户的青睐。在Rosting的项目中他们很注重用户体验,他们用心设计了家族树的显示方法,因为一般一个老师会有很多学生,每一个学生也有可能有他的学生,所以家族树有时看起来就很庞大,如何合适的把它显示出来是个很重要的问题。另外,他们还利用了微软的silverslight开发了非常好的动画效果,使用户在使用时能能够得到更多美的体验。
从我个人而言,以前我并不注意界面,觉得算法才是软件最核心的生命,界面的工作没有什么技术含量而且十分枯燥,写起来也十分繁琐,所以我以前很少处理界面的问题,主要使用控制台去实现算法。但随着我对软件行业的了解不断加深,尤其是软件工业,我的看法也随之改变。界面是软件工业不可或缺的一部分,也是很有技术含量的东西。它不仅需要计算机科学的知识,还需要美学甚至心理学的知识。因为软件是面向用户的,不是面向计算机专业人士的,没有好的界面,没有好的人机交互,再好的算法也只是写在纸上的废话或存在计算机里一串没有意义的代码。我想这就是工业界和学术界最大的差别吧。希望通过软件工程课的学习与实践,我能大大提高自己编写界面的能力。
重视团队合作
接下来要谈的东西应该是做软件工程的一个共性问题。随着软件工程的高速发展,编写软件的工作量越来越大,需要各种各样的人才通力合作,很少有完全独立开发高水平软件的情况出现。正因为这样,团队合作才显得尤其重要。开发过程中团队各成员要多沟通,多交流,及时反馈自己的困难,报告自己的成果,使整个团队能够正常运转。我以前以团队为单位进行工作的机会不多,多数情况下都是自己单干。对我印象比较深的一次团队工作就是大二暑假参加学校组织的机器人竞赛。机器人是一个软硬件结合的项目,团队里有负责机械的,有负责程序的,也有负责电路的,虽然每个人工作都很努力,但是之间缺少交流,最后还是自己忙自己的,最后搞机械的一点程序都不懂,搞程序的一碰电路板就烧,这样最后的产品只不过是个人产品的简单组合,没有真正起到团队的作用,在未来的工作中,我希望能改变这种局面,我们的团队要真正像团队一样工作,外界应该感觉不到我们一个个个体,我们是一个整体。
说了那么多,先写到这吧。
Come on! Let’s make a difference!