Basic Training 总结

Basic Training结束了,9.1日开始Advanced Training,现在将这上班一个月学到的东西整理一下,因为公司的安全制度,所以在公司总结的东西不能带出来,现在只能靠回忆。这样也好,回忆出来的东西更加真实反映了所学的。

按照软件工程的基本流程,可以将整个项目分为几个阶段:Requirement Analysis, Project Plan, System Design, Documentation, Coding, Testing, Release.

Requirement Analysis

客户的需求是在一个文档中体现出来的,因为是training project,所以没有客户。通过分析文档,客户需要一个网上商城的项目,能够进行商品的管理,用户的管理,订单的管理等等,基本算是一个网上商城所需要的最基本最基本的功能。在需求中,我提出疑问,要不要加入用户注册功能,因为需求文档中没有说明。后面的QA session也告诉我这其实是Bug,因为属于“本应该有但需求文档中又没有的功能”。
另外客户需要一个User Service,要求要有Winform的管理平台。简单说就是用户双击桌面上的.exe,然后对数据库的客户进行管理。这部分要求用WCF实现,并且Client用C#实现。
整个的需求分析阶段是对分析能力的考验,你需要站在客户的角度来分析客户到底需要个什么东西,还好我们的客户需求文档是由Trainer写的,比较清晰。真实客户可能根本说不清楚自己需要什么,到时候也是对项目人员的考验。

Project Plan

当客户告诉你说,我们2个星期后要看到成果,你会怎么办?当然要做个详细的计划。而且这和上大学不一样,老师会告诉你这阶段你该做什么,到公司没人告诉你,你要学会自己安排。你可以前面安排得紧,后面安排得松,你可以选择每天加班到凌晨,也可以选择每天5:30回家(只要你有能力),公司24小时营业,如果你认为你是铁打的……扯远了。不过,到现在发现加班不是个好事,经常加班只能说明你的效率慢,能力不够。有本事每天按时下班,工作做得漂漂亮亮,那是最厉害的。
Plan就是对项目的每个阶段的时间估计,需要做什么,会遇到哪些Risk,遇到后怎么解决。特别是时间估计,这点在Plan中很重要。在后来我们的总结中,Trainer介绍经验,一般你的时间估计要比你认为“正常”的时间多一到两个时间单位。比如,我认为做Product模块要2天,但是时间估计要写3天或者4天,因为你不能保证在此模块中你遇到非常cost time的issue,所以要稍微延长些,以保证自己不会delay,经常的delay会给自己不少压力而且客户觉得你不Professional。

System Design

这部分考察工程师的抽象和设计能力。简单的说就是把客户的需求转化为软件系统的表述。根据客户的需求,我来设计相应的架构,从整个软件系统的大框架,到小模块的具体构成,以及coding时要采用的架构。这些整体设计不涉及details,只是各个模块的架构,然后可以把他们组合在一起。这一部分一般会和文档结合在一起。

Documentation

文档部分一般包含两个文档:Functional Specification, Technical Specification.
Functional Specification就是功能说明书,一般是对客户的需求进行总结。将客户口头或者简单文字描述的“场景”转化为清晰的模块架构。这文档不包含任何技术术语,只是对功能的描述,对模块的设计。文档里面包含有Use case(用例)以及各种模块的描述(包括总括和各种功能的描述)。Functional Spec 会给客户看,估计到真实项目中还会给客户签字确认。后面的QA session也说过,这里的设计很重要,如果前期不设计好,后面要改架构,时间和资金的cost会非常大。

Technical Specification就是技术说明书。一般是根据Functional Spec来写的。针对Functional Spec里面描述的模块,根据自己的System Design的抽象,将这些模块转化为技术接口的描述。接口的描述包括接口的功能描述,接口的方法头,接口的时序图,接口的运行过程描述。除此之外,还有对整个软件架构进行技术上的描述,包括分层(比如三层架构),数据库设计等等。总的来说,Technical Spec描述技术架构,但是跟技术语言和具体的技术实现details无关。你可以把Technical Spec给.NET, Java, PHP团队来分别实现。

这部分文档编写用了我们一个半星期,因为原来从来没有人做过,只有一个模版。模版每部分写什么也需要靠自己来悟,Trainer先不会告诉你,让你自己的理解来写,之后会一起来review和discuss怎么写好。

Coding

没话说,就是编码了。结合Technical Spec来写就对了。不过现实中很多人包括我也没有完全按照文档来编程,因为很多东西文档期间都没有想到。

首先来说三层架构,就是DAL, BLL, UIL层。DAL(Data Accessor Layer)数据接口层,所有对数据库的操作(写数据,读数据)都在这一层完成。BLL(Business Logic Layer)业务逻辑层,所有与业务相关的算法都写在这一层。比如说“删除一个用户的同时要删除这个用户的所有订单”。UIL(User Interface Layer)用户接口层,就是我们说的界面。所有的界面的元素,以及界面上的逻辑和验证都在这一层完成。

一开始一直以为自己是三层架构,后期才发现自己是两层架构,就是把DAL和BLL写在一起去了。然后先前低估了UI层的时间,其实UI层很多东西很复杂,包括那天研究gridview到凌晨4点,还是自己效率太低了。其实分层的好处是方便日后的维护以及架构的清晰,虽然说时间和代码量都要比两层或者不分层多得多。但是越到后期效果就越好。

使用存储过程。第一就是为了防止拼字符串太费力,拼得费力看得也费力。第二就是用存储过程不会出现当UI层输入非法字符的时候导致的安全问题。之前就没有用存储过程,然后到了后期全部改工程量很大。不改又容易出现安全问题,所以只好在验证上下足功夫。

还要注意一点是,开发的时候一定要开发完一个模块就立马测试一个模块。我之前是先把所有的逻辑层写完,然后再写UI层。这样有个隐患就是,逻辑层的错误和UI层错误要一起处理,而且当项目很大的时候容易让人抓狂。所以最好的办法就是写完一个模块就去实现一个模块,然后测试它,然后再下一个模块。比如“AddProduct()”写完DAL和BLL层后,立马做个简单的UI层界面,把算法调用,然后去数据库看有没有这个Product(测试)。

WCF Service以及Winform编程也就那样,感觉微软的东西会一样之后,其他的都差不多。不过要深入还是要下功夫的。

I18N,国际化和本地化,体力活。不过要在文化上进行国际化和本地化还是很有挑战的。

log4net。主要是对所有的Exception进行日志记录。

Testing

测试,对软件进行测试非常重要,是在给客户之前的一个保障。基本我们是在QA session,然后我的作品有幸被公测,其他的同事或者QA team的报bug,我就在那里debug。虽然说开发的时候很注意UIL层的验证,可是后来发现bug最多的依然是UI层。

Unit Test。基本是由工程师自己写的模块测试程序,用NUnit实现。

然后在测试阶段,软件工程师要时刻去debug QA报上来的bugs。

Re
lease


Release Note, 告诉客户和QA怎么去配置环境。
Config Tool, 将基本的参数(服务器名字,用户名,密码,数据库备份文件地址,web.config地址)提供给客户输入,然后只需要按一个按键便可以实习所有环境的配置。用C# Winform实现。数据库方面用的是SQLDMO的COM组件实现。

其实感觉 Basic Training 目的是让我们搞清楚软件开发的流程,学习技术是无止境的。

上班还是上学

上班还是上学,我问自己。之所以这么问,因为公司太像大学了。

首先同事像同学。同事几乎都是应届毕业生,trainer都很年轻,一群年轻人在工作。大家每天在一起的时间很长,长达十几个小时没有问题,然后中午和下午一起去吃饭,有时候更是去腐败。周末我们有很多活动,足球,篮球,游泳,周五下班还可能一起去吃火锅。还期待着我们的Anual party。^^

其次同事关系单纯。就像同学那样单纯,因为大家没有什么利益冲突,而且公司文化也是互帮互助的关系。大家共同成长,共同进步,不但自己成长,而且也希望身边的人同样成长。因为我们是一个团队,现代软件开发进入工业时代,所有的大项目都不可能几个人几杆枪能够出来的。所以只有大家都上升到一个高度,那么我们的产品才能够优秀,只有团队优秀了,你的价值才能够体现的出来。如果只有一个人很厉害,其他人很稀烂,那么这样的团队是没有战斗力的,而且也做不出来好的产品的。这让我感到很舒适,可以专注于成长,而不拘泥于尔虞我诈之中。

这个星期又学到了很多东西,I18N(国际化本地化), Unit Test, log4net, Release note. 而且还自我研究出了GridView的动态Paging和Sorting, 小小的自我满足了一把。下个星期培训测试。加油吧!

累并快乐着

中国男篮对美国梦之队。晚上10:15分,爸爸给我发来短信,让我安排好时间去欣赏这场比赛。

我知道,可是收到短信的时候我还在公司捣鼓我的E-Shop项目,Trainning project, 我自己的项目。

自然而然,到了比赛开始的时间,我还在办公室。当时只有一个想法,今天我要把E-Shop做完。因为是第一次做项目,没有经验,把逻辑层写完后,认为UI层会很简单,拖几个控件上去显示数据就可以了。可是真正在做的时候,才发现UI层很难做到这些想象中的场景,甚至花了很长时间才会出来一点点的效果。

那天,我决定通宵。

同事一个一个回家,最后我们这个组只有我留了下来。我不能看喜欢的篮球,我也没闲情去看,因为好不容易找到点感觉想趁机多做点事情,尽管已经是凌晨。

终于,终于我认为我应该回去睡觉以便第二天还可以来公司。此时我有点疲倦但也很兴奋,至于兴奋的原因,第一是进程终于又回到把握中了,第二是我第一次这么晚回家。

我看了看表,凌晨4点。

公司门口街上等候的的士早已离去,路灯也早已熄灭,真难想象我居然可以凌晨4点回家,这要是在我的大学是不可能的事情。

公司重塑了我们的世界观,让我们知道该以什么样的方式去做那些Mission impossible的事情。当你不会这个东西的时候,你的效率自然很慢,但是deadline又会压迫你用更多的时间来保证你的输出。真的觉得一个人的适应力可以在一定的压力下释放出来,现在已经基本习惯每天那么少时间的睡眠和那么大的压力。

所以我坚持着。来公司不知不觉已经3个星期,快一个月了。感觉很快又很慢,因为每天8:30到公司,然后回家的时间通常在第二天的12:00 - 2:00am。3个星期,感觉过了超过一个月了。我们这组一共有20名同学,可是现在只剩下13个,其他因为种种原因辞职。

我说过,我想活下来,我至少要接触下真正的项目。我不会主动退出,除非公司对我说“你不行,你不能符合团队的要求”,那我问心无愧,因为至少我尽力了。不过,还好,现在我尽力去做这些,而且情况逐渐好转。甚至到本周末,我的加班时间比平均加班时间少。在公司的3个星期学的东西比在大学学的多得多。不光是技术,而且最重要的是意识,思想层面的转变,学习方式,以及勤奋,坚韧。

我知道未来还会有更大的挑战,那些传说中的世界级项目在哪里我不敢奢望,如果能有幸参与,哪怕只做一点点事情,也是见了世面了。在这个公司遇到很多牛人。我们的CEO,我们的两位Director,真的可以在日后从他们身上学习到很多东西。

累并快乐着。相信这一切会慢慢好起来的。

淹没

Trainer把我们一行人叫到水池边站成一排。

水是什么?我们当中除了个别人会在水中游以外,其他人都只看过别人游,或者接触过水的感觉。有很多人更是第一次见水。

三个Trainer一定知道我们的实力,不过他们不care。

Marvin淡然的对我们说:下水,每个人以标准蝶泳姿势游400m(100*4)上来。最后上来的,才能跟我们一起去长江。

长江是什么?长江是好东西,每个人都梦想去接触到长江,因为在长江里面游过泳的人,别人都叫他牛人。

我们知道,长江之外,还有大海,连通世界各地的大海。

不过现在没法想这么多,因为接触到大海之前,要先接触到长江,接触长江之前,要先把这400m游完。可是,我自己还不会游泳……

我们一个个被推到水下。而Trainer在岸边看着,似乎在想着什么。

我下去就呛了几口水。我现在不敢想大海,因为我知道,我现在在水里能够让自己浮起来不沉下去,比什么都重要。

我拼命挣扎着,我看到大家也在挣扎着。我知道,Trainer把我们这群不会水的人推下水,还要限时完成以前从来没想过的东西,是在考验我们的潜力。潜力大的一定会拼命让自己浮起来,不行的人就只能沉下去。

已经有3位已经沉下去了,再也没有起来,原因多种多样,不过沉下去确是事实。看到他们,我更加拼命挣扎着让自己浮起来,因为我不想被淹没。

我一定要活下去,我对自己说,尽管不知道自己是清醒还是恍惚。

上班一周感

公司很规范,一上手的Training Project就是很现实并且有很多功能,对自己的学习能力和适应能力是个极大的挑战。全英文的环境,不管是每天写的Report还是写文档,再或者是问个小问题也得用英文。安全制度非常严格,很多网站不能上,不能下载或者上传文件,这一切都是因为要向我们的客户负责。英文环境下慢慢都会习惯,安全方面只要不触动底限是很自由的,甚至自由的有点不习惯。公司都是任务制,一开始的Training Project,每个人任务都一样,但是他不告诉你怎么去做,最多只能启发你,你自己去安排时间,去想软件架构,去Resolving Problem.

至于外界流传的加班很晚也不是这回事,虽然是很晚离开,但那不是加班。因为任务分配给你,你完成不了,而deadline又很紧,你又是一个工作效率低下的菜鸟新手的情况下,你自然而然的选择“晚点离开公司”。我第一天下班离开公司的时间是10:07分。

感觉公司整体都在发展,是个快速成长的公司。今天CEO到武汉来开all hands meeting,会议开了一上午,有个隐含的理念被传达出来:公司不怕你起点低,但要求你要成长,要快速成长,以适应快速成长的公司。所以一开始特别对菜鸟们的那些“impossible task”,我们也要想办法完成。如果效率低,那就用更多的时间换来输出。一旦你完成了一个个“impossible task“你就会成长起来,效率会提上来,但所用时间不变甚至延长,因为任务可能更重。你的能力会逐渐变大,公司会用加薪升职的方式证明你的能力。

不过公司的Family Sports Meeting 以及 Annual Party 以及旅游是非常精彩的东西,而且公司厨房里面的咖啡和绿茶红茶会陪伴你渡过一个个精神不好的上午以及极有可能发生的包夜。

痛并快乐着。