自从2013年7月3日正式入职以来,已经参加工作将近4个月。加上毕业之前两个多月的实习,这样算来在这个公司也工作了半年的时间了。并且在这个月,我经过了试用期,正式成为公司员工。在这里对这几个月的工作做一下总结。
首先简单列举一下在这几个月里,我所参与的项目以及在每个项目中所做的具体工作。
项目列表
以下部分是我在工作中的感悟
一 关于业务和需求
经过这几个项目,我认识到对于一个新项目来说,理解业务和需求是非常困难的,主要原因是我们不了解客户所在的行业。例如,我们要开发作业区统一采集平台这款软件,但是对采油采气这些业务流程不了解,对使用人员的工作方式也不了解,导致前期理解需求花费了很长时间。所以真正的人才应该既是技术专家,又是某个行业的业务专家。
所以在项目前期一定要做充分的讨论, 以确保项目组中每个人对项目的理解一致;并且充分和客户沟通, 确保客户和开发人员理解一致,开发人员之间也要进行有效的沟通。此外,领导在开关于项目的讨论会时,应该尽可能的让开发人员参与进来,这样有助于尽快对项目有一定的了解。
二 关于开发过程中遇到的问题
由于前期对项目的理解不充分,又迫于时间的压力,必须开始动手编码,在编码的过程中肯定会引入错误。并且在开发的过程中,自家各扫门前雪,每个人只会关注自己负责的一部分,很难有时间和精力去理解别人写的代码,这样导致每个人对于项目都没有整体的把握和理解。
另一个影响开发的因素是项目组中人员的变动,由于对项目的理解不充分,后来的人融入项目组需要一段时间,这样就造成了一种浪费。所以,应该尽量保持项目组中成员的稳定。
有时随着项目的进行,感觉代码越来越多,越来越混乱,难以管理。这种现象其实是由于对项目没有整体的把握。
开发人员在写代码的时候,没有遵守一定的编码规范,也没有遵守一些必要的设计原则,这会严重影响代码的质量和软件的结构。关于编码和软件设计方面的总结,已经写入《编码规范》中。
开发模式和协作方式非常重要。我们在做开发时,基本上是按界面分工,每个人负责一个界面,或者有的人专门负责一个功能,然后每天把写完的代码传到服务器上。其实这未必是最好的开发模式。找到一种高效的开发模式,能在很大程度上提高生产率。开发模式有很多种,比如瀑布式开发,增量开发等,还有最近兴起的敏捷开发等。由于经验所限,我对很多开发模式也不了解,只能在以后的工作中慢慢感悟和总结,尽量摸索出一套能适合移动开发的有效的模式。
三 关于项目后期维护
由于项目在开发过程中没能较好的保证质量,没有一定的扩展性,这就导致后期维护时候改太大,成本太高。所以开发的时候花一些时间和精力提高质量是很有必要的,如果开发的时候引入的错误和不合理的地方太多,会给后期修改带来很大的麻烦。
出现的问题尽量由代码的作者维护, 即能提高效率也能保证修改的正确性, 避免改动牵扯其他模块。在对应云盘BUG的过程中,我深刻认识到读懂别人的代码太难了,第一个原因是不理解项目的需求,第二个原因是每个人的思维逻辑相差太大。
鉴于前期考虑不周全,开发时间紧张等情况,可以肯定的是第一次写的代码不可能是完善的。比如每个人写一个界面,到最后发现这些界面上有很多重复性的东西;在项目开发过程中,有时需要添加新的功能,这时只是将新功能追加上,导致功能的堆砌,使软件结构趋于混乱;由于前期对需求和业务不是很熟悉;有些代码可能是在一种比较模糊的状态下写的,随着项目的进行,对业务和需求理解的才会越来越清晰,对项目中各个模块的划分和各模块的职责也能比较清晰。所以,高质量的代码是不可能一次写成的。鉴于这些问题,我认为做以下两点是很有意义的。
我认为开发完之后,最好花时间把所有的代码核查一遍,代码的作者负责讲述代码的逻辑,项目组中的其他人理解作者的逻辑,并提出疑问。这样既能对软件有整体的认识和理解,也能有效的发现和解决问题。可以发现很多高质量代码都会有一个author,还会有一个checker。
如果对软件的质量要求比较高,在开发完之后有必要进行代码重构。代码重构的概念是这样的:在开发完成后,在不改变原有功能的条件下,通过调整程序的结构让代码变得更清晰,更具可读性,让软件更具健壮性和可扩展性。很多高质量的软件都是在一次次的重构迭代出来的。
四 关于学习和进步
每个人都不能拒绝学习与进步,否则就会被淘汰。另一方面,通过学习让自己变得越来越好,能力变得越来越强,本身就是一件很有意义的事,也会在这个过程中得到快乐。
要养成学习的习惯,最重要的一个前提是认为学习是有用的。很多人说做java的学习C++没用,其实大部分底层代码都是C/C++写的,要能读懂,语言是基础;也有人说设计模式没用,其实设计模式是软件领域最精华的东西,会让提升软件设计能力;也有人说做软件的,学习网络知识没用,这也是错误的,下面会有一个例子说明这一点。
有时知道一个小问题或小技巧, 就可以节省几个小时甚至几天的时间,一个很小的知识点,可能会帮上大忙。下面举两个例子说明这一点。
在物联网项目中,使用了公司总部的ESP框架,android端直接下载表单对象并序列化到android本地,但是在反序列化的时候并没有得到需要的信息,当时这个问题也拖了好几天。最后我进入到ESP平台的源码中,发现表单对象中我们需要的字段被transient关键字屏蔽了,也就是说这个字段在序列化的时候不能被序列化到本地,所以反序列化时得不到这个字段的信息。总部的人联系之后,去掉ESP源码中的transient关键字,才解决了这个问题。如果当时学java时没有注意到这个知识点,天知道这个问题要耗多久!
在移动办公的项目中,要基于华为的esdk进行二次开发。首先要做的就是根据esdk中的API连通华为的VPN服务器。但是华为给的demo中,写的确是他们VPN服务器的内网地址10.170.99.235,由于我不知道是内网地址,所以认为连不通VPN错误出在程序的逻辑上,折腾了好长时间,还是无法连通,最后给华为打电话要的公网IP。如果能提前意识到可能是私有IP,也不会折腾很长时间。其实私有IP是能看出来的,只是我没想起来。以下是私有ip的范围:10.0.0.0~10.255.255.255,172.16.0.0~172.31.255.255,192.168.0.0~192.168.255.255。而10.170.99.235明显在10.0.0.0~10.255.255.255这个范围内!
所以有时明白了一个原理, 就可以加快写代码的速度, 避免潜在的错误,还能很快的解决问题。对整个系统和框架理解的越深刻,在做应用的时候就会思路越清晰。
我认为我们不能埋头苦干,要有开放的,学习的心态。比如有很多做外包的,他们可能有些做法值得我们借鉴,我发现别人的方法很好,那我也可以使用这种方法。移动开发也是,学习别人的软件怎么设计的,项目是如何管理的,开发的时候是如何协作的,也是一件很有意义的事。如果每天只是搞自己的那一套,是很难有突破的。所以很多公司会把自己的团队打造成学习型团队。
项目组中的人要相互帮助,共同进步。提升项目组的整体水平。如果有人对开发有所感悟,希望能够分享出来。比如对某个需求理解的比较深入,发现了某个技术能解决某个问题,或者是在某个地方上跌倒过想要告诉别人避免陷阱,发现某个工具比较好用,都可以分享,可以定一个公司内部的分享会,或者将自己的感悟写下来,共享到开发部的群上。
以下是我认为现阶段比较重要的,需要加强的知识。
五 关于沟通
为了节约时间和避免错误,一定要学会高效沟通。 尤其是项目牵涉的部门比较多的时候。以下举例说明。
移动办公项目牵涉到以下三方面的人员----普联:负责移动端开发和维护;华为:VPN技术提供方;新疆:移动办公后台开发。并且我是临时接的这个项目,对项目本身不熟悉。华为方面的提供技术支持的人员也有变动,有一部分工作进行了交接。这样的话各方得到的信息就可能不同步,导致在开发过程中,很多时间都白白浪费了。现在总结一下,就是没有做到有效的沟通。
首先说一下上文提到的IP地址错误的例子。华为提供的demo上的地址是内网地址,导致连接VPN服务器花了很长时间也没连通,最后还是打电话询问的华为的技术人员。这个问题华为也有责任,既然你的技术提供出去了,不公开你的公网地址是说不过去的。当然也有我的责任,没有意识到地址可能是私有的,有自己的思维定式在里面,一般都认为以192.168开头的地址为私有地址,其实A类,B类和C类IP地址中,都保留了一份作为私有IP,这部分IP是不能出现在互联网上的。
第二个问题是关于集成文档的。在我这边连通VPN之后,新疆方面要把应用集成到华为的安全平台中去,我一听就一头雾水了,不知道说的什么意思。这个还牵扯到明确第一阶段任务的问题,我一直认为连通VPN,第一阶段就成功了,其实还包括集成测试。但是我又不知道集成是干什么的,耽误了很长时间。最后开了电话会议,原来是华为的工作人员少提供了一份说明文档。
第三个问题是关于登录验证的。移动端登入网页之前,要对用户名和密码进行统一验证。原来的实现是基于webservice,并且使用了第三方库。但是连通华为的VPN之后,所有的网络接口都必须用华为的esdk实现, 使用的webservice库肯定是用标准的网络接口实现的,所以要重写。忙了一整天,用华为的esdk写了一套发送xml soap协议的代码。然后第二天后台人员告知验证的方法改变了,所以这一天的工作白费了。这就是没有及时沟通,后台验证方式改变之后,后台开发人员应该及时告知我。
六 开发小技巧总结
有时候掌握一些小技巧,可以给我们提供很大的方便。以下是我在工作过程中总结的开发小窍门
1 避免重复制造轮子
有时候我们要学会拿来主义,别人已经有了,我直接拿过来用就行了,自己再搞一套浪费时间不说,还不一定有别人写的好
另一方面注意积累自己的类库,比如前段时间做通讯录,积累了一些对系统联系人进行操作的库,以后再遇到这种需求,可以直接拿过来就用了。
有效利用开源项目或框架(推荐两个网站: 开源中国 和 github), 自己很难写出这种框架,就算能实现, 也不会比别人写的更好。例如在开发通讯录时,我使用了github上的RoundImageView开源组件,还有其他一些框架也很优秀,例如异步http框架,xUtils框架实现文件断点上传和断点下载,下拉刷新框架等等。如果我们在自己的项目中使用第三方组件或框架,能打打提高开发效率。
2 android反编译
现在感觉反编译还是很好玩的,有时发现某些资源(图片)比较好,并且能应用到项目中,那就别客气了,直接反编译某个软件的apk包,把他的图片拿过来用就得了。有时候缺乏美工,让程序员做图片那是不现实的。例如在我的项目中有两处资源是反编译的qq通讯录和微信(不要告我剽窃奥,我只是拿来用用而已)。
有时发现某个软件的某些功能比较好,自己也需要这个功能,但是不知道怎样实现,那就直接反编译apk的代码就行了。在我的一个项目中,创建快捷方式的功能不会实现,反编译了腾讯QQ的apk找到了实现方法。
反编译工具推荐 apktools(反编译资源) 和 dex2jar(反编译源码)
3 多使用和体验其他优秀android软件
可以把别人好做的好的地方为我所用,有时候也能激发自己的灵感,拓宽自己的思路,了解最新的移动开发趋势。
4 养成查看源代码的习惯
android是开源的, jdk也是开源的,这对我们来说都是一座宝库。这些源码都是高手写的,整个理解也不可能,还要花费巨长的时间和很大的精力,所以不推荐把源码从头到尾拿来读。只要遇到问题,比较迷惑时,记得去源码里面看一眼,可能就能豁然开朗。即能较好的解决问题, 也能提升自己的能力。
如果想研究android的话,github上有很多开源项目,另外推荐一个比较好的开源app: 开源中国Android客户端。 当然,它的IOS和WP客户端也是开源的。