技术选型
总结
- 原则
- 利于简化开发,提高开发效率
- 利于后期扩展、维护
- 利于公司技术积累
- 利于建立公司开发流程
- 资源
资源指与项目相关、目前可利用的一切,包括人力、物理资源(服务器、测试设备等)、时间等。 - 代价
除了现有资源外,需要增加多少预算来完成任务。是否需要招人、是否需要购买服务器及其它设备等。 - 目标
目标是最终要达成的结果,任何行为都应该有一个清晰的目标。当接收到任务时,第一件事应该就是分析其要达成的目标。技术选型也要从目标出发,有一个清晰的目标会使决策更加容易。任何目标都应该有一个清淅可衡量的验收标准。
个人认为,技术选型也就是一个技术的平衡与决策的过程,现在的技术五花八门,可供选择项过多也是痛苦的。所以在项目启动初期,我们就应该确定好必须遵守的原则,分析目标,从手中的资源与可付出的代价出发,选择最合适的技术完成任务。
原则
原则是必须要遵守的、在一段时间内不会变化的准则;但它不是永远不变的。公司在不同的阶段着重点不同,所以会有不同的技术选型的原则。
在公司初创时期,业务方向不确定,处在不停的试错阶段,这个时候要求版本不断的迭代更新,版本发布频繁,上线压力大,很多功能可能在试错过后就被放弃掉,所以这段时间的原则就以简化开发为核心,确定能尽快更新迭代。
经过一段时间的发展,公司确定了业务方向,主营业务不再频繁变化,公司进入发展期。这个阶段客户增长比较快,主营业务相关的功能会保留,但细节调整比较频繁,所以这个阶段即要确保更新迭代的效率,又对性能、扩展性等非功能性需求有更高的要求,我们的原则也要相应地加入扩展维护方面的考量。
利于简化开发,提高开发效率
这条原则在公司发展的任何阶段都是需要重点考虑的;但在初创阶段尤其重要。如果不考虑其它因素,在试错阶段,如非对原生功能有强依赖性,否则尽量不要开发原生app,虽然原生app在流畅度与用户体验上是其它任何方式无法比拟的,但其开发难度与开发成本也是最大的。可以利用目前已有的生态系统,如微信生态,利用公众号与小程序来试错,这样做可以节省大量的开发时间,用户、安全等都在微信的框架内,不需要特别关注,并且小程序的开发也要比原生开发效率高,有许多服务也可以由第三方提供,成本小效率高。后台程序可以使用php或者python等。php在web开发中效率高,但其是解释型语言,在变量生命周期、线程支持等方面有固有的缺陷。python这几年发展迅速,易上手,有大量第三方库与框架,几乎能做所有的事情,代码清晰,开发效率也很高,但性能是瓶颈。
利于后期扩展、维护
公司总是要发展的。在公司创立初期,因为方向未定、前途未卜,技术在快速试错阶段,本原则的重要性相对比较低,但是也需要适当考虑,比较技术是否成熟稳定,是否有丰富的社区资源,是否易上手,出现问题是否容易定位,是否容易找到对应的解决方案等;当业务逐渐确定,围绕这个业务展开的细节功能会越来越多,程序的可扩展、可维护性的重要就体现出来。原有的功能是否可满足后面发展的扩展需求?扩展的代价是否可接受?维护的成本是否过高?如果不能满足需求,则需要重构以前的系统,改用更符合需求的技术。
利于公司技术积累
每个公司都应该有特定的技术线,否则随着人员的增加、变动,新员工上手难度、系统维护成本都会成倍的增加。比如公司一直用java进行后台开发,那就不要轻易引入C++、go等语言进入业务系统,否则接手的人员维护难度会非常大。当然技术积累不是说不能使用别的新技术,只是说最好能保持主线技术的稳定性,新的技术可以在新系统或者子系统中试用,如果学习难度低,收益很高,则可以引入。
利于建立公司开发流程与规范
开发流程与规范的建立贯穿整个公司的生命周期。在初期可能是初略的,如只有简单的代码规范、数据库设计规范等。这里着重强调下,在公司初始阶段,数据库的设计流程规范是必不可少的,因为无论最终确定的业务是什么,代码可以重构,该业务的数据一定会保留下来,而数据库结构决定了代码的数据结构,所以数据库设计的合理性就特别重要。随着业务发展、人员的增加,各端单打独斗的情况就会结束,这时候开发流程规范就非常重要,一些框架与工具会限定开发的流程规范,如python语言会检测代码格式,好好利用这些工具能简化有助于更快建立开发流程,简化开发管理。
目标
有时候用户提出需求时并不会明确给定目标,这时候就会要发掘用户的真正目标。
目标是什么
目标不是需求本身,而是要完成需求最终要达成的目的。比如市场有个需求是要在app加入商城;加入商城的目的肯定是买东西,公司有个智能硬件产品,他们想要放在app上卖;但进一步了解到他们对也不清楚app的用户是否对该产品感兴趣,只是想测试一下是否有销量;那最终的目标就变成试错app用户是否会购买公司硬件产品,而不一定要开发商城。
验收标准
每一个需求都有一个验收的标准,达到验收的标准才能交付。需求提供者不一定会给出明确的验收标准,这时候就需要产品去详细的确定。只有确定用户的真正目标验收标准才会准确,比如上例中,最终市场需要的售买的数据,而不是用户体验方面的东西。
细化目标
确定了目标与验收标准之后,可以对目标进行细化,确定要需求的细节,完成之后就可以确定大致的技术原型。如商城的例子中,市场的试错最终需要哪些数据,如浏览数、加入购物车的人数等等。
资源
资源总是有限的,需要合理利用。
可利用资源
手头有哪些资源,哪些资源是可以动用的。有些资源是隐性的,可能掌握在别人的手中,但只要你正确的提出需求,就有可能利用起来。比如朋友的资源、老板的资源等。
人力资源
科技公司最大的成本是人力成本。在技术选型时,先考虑的应该就是人力资源,现在哪些技术人才,是否有必要引入新的技术人员等。公司建立技术线也是基于这方面来考虑的。
物理资源
软件技术公司对物理资源的需求相对较少,资源获取也相对容易,主要考虑成本及运维问题,比如说服务器资源,使用云服务器还是托管物理服务器、或者自建机房,这就需要计算成本,以及考虑安全、运维技术等问题。
代价
要达到目的,总要付出相应的代价。
时间代价
时间管理是软件开发中的一个难题,软件开发一种创造性活动,中间有太多的不可控因素,经常会出延期,所以在技术选型时,不论哪个阶段,第一条原则都很重要。
金钱代价
这里要考虑的包含了两个方面
- 人力,是否需要招人,找人的成本如何,或者现有人工学习这项技术的学习曲线是怎样的。
- 物理资源,是否采购服务器、增加带宽等等