说说软件外包
今天想从以下几个方面和大家聊聊我对软件外包的一些感受和体会,不一定合理,仅供参考。
外包公司、外包团队、独立开发者、个人定位、外包与培训、框架选择、业务模型、API的重要性、武器库、合作机制、服务资源等等。
一、角色与定位
外部环境和生存压力越来越大,现在工作有相对保障的是主流互联网企业和军工企业,其它行业和企业都很难,能活多久都很难说。于是越来越多的公司、团队和个人参与到了外包的研发和交付中,都是为了能生存下来。
因为个人的精力有限,我想努力把技术能力体现在以下几个方面:
1、Actor:编程模型,计算原子,Actor World(无处不在的计算环境)
个人非常推崇 Actor model,也会积极和持续的参与到这块项目和业务。
2、API:商业模式,能力输出(API优先)
3、Identity:身份和访问管理,用户模型,权限系统(你是谁,你可使用哪些资源)
4、Android 整个生态系统(更多的用户触达)
5、核心编程语言:C#/Java/C++(业务系统承载)
6、RoR 驱动的 Redmine, Gitlab, Travis CI + cd.foundation 等应用(分布式协作基础)
另外,在客户没对实现技术做特殊要求时,我倾向用 RoR 去实现原型、快速迭代和持续的数据库迁移,个人很看重 RoR 的生产力。也会从 Redmine 和 Gitlab 两个开源 RoR 的项目管理和代码仓库托管入手,更多的部署、使用和 Hack。
(图片来自:Orleans)
二、外包与培训
在大家抢食软件外包业务时,为了拼价格和利润,多会把招聘放在刚毕业、工作时间很短的应聘者身上(也常和培训机构合作,完成人才输入输出,这也成了一个产业链)。因为成本考虑,但带来的问题是技能不足、经验不够、有太多要学习提高的地方。这时候一个外部的技术培训和支撑环节就显得格外重要。简单讲,就是帮助这些外包企业打造一个更好的培训体系、招聘流程和能力提升管道,并有一个能留住人才的工程师文化和激励机制。
在培训和外包的发展道路上,我个人的定位是:交流培训各种团队,承接各类项目,做好技术支持和研发能效提升、框架工具链、模块化、DDD、微服务、各种参考实现和 DevOps 基础设施。
核心开发平台:
.NET(ABP),Java(Spring、JHipster),前端(Vue、Angular)...
核心支撑系统:
Redmine + GitLab + Jenkins + MariaDB + Rancher
在培训、外包的背景下,研发团队的效能提升是我最关心的,也是个人价值集中体现点。因为,研发效能几乎是所有技术公司可能都忽视的地方,但它确是最最应该关注的。这块没管理好,会花很多冤枉钱,也输出不了高附加值。
简单讲:研发效能,是团队能够持续为用户产生有效价值的效率,包括有效性(effectiveness)、效率(efficiency)和持续性(maintenability)三方面,是开发者能够长期既快又准地产生用户价值。
想想现实中,虽然都是几号、10-20号人的不同项目组和团队,但不同的效能管理,其生产力和交付能力却有着巨大的差异。有点活的很好,有的就快解散了。
于是,紧随主流厂商的研发效能提升最佳实践,消化、引入公司和各个项目组,打造高效能技术团队,逐步形成强有力的技术品牌就成了必修课。
三、框架选择
一个好的,优秀框架对于一个团队和个人都非常重要。因为好的框架带来的是更好的设计与规范,一个强壮的参考实现。而对于这些若让一个人或团队去慢慢摸索和实践总结那就太耗费时间了,且结果也不一定理想。
最近,以往团队在开发系统时,对于数据库的修改方式都是直接操作数据库表,而没有采用类似 RoR 的数据库增量迁移的方式。这样带来的问题是,修改数据库的随意性,给后期的系统维护升级带来巨大痛苦和灾难。
比如:.NET 项目可采用 FluentMigrator 方式进行。使用 .cs 文件定义数据库表和字段的方式去创建、维护和升级数据库,而不是在数据库里直接创建和修改,其数据库里也维护着数据库迁移升级的版本信息。
这只是一个简单例子,也表明好框架带来好的习惯养成。
同时,个人也在 C++, .NET, Java, PHP, Ruby 的几个框架(Godot 游戏框架、ABP DDD & Microservices 框架、Axelor ERP 平台、Spring 框架、Symfony PHP 框架、RoR)上做持续积累,目的是将核心、模块、实体、域、服务等基础能力打扎实,之后能在这些优质框架上快速开发原型和交付系统。就是要最大程度的代码复用,维护更多高质量模块、组件、实体域模型、微服务等等可重用的软件部件。
对于大型应用,其系统的所有Module、Model、Entity、Table(Fields)、View、Action、Translations 等都要能集中管理和维护,Axelor 就是这样的 Java 应用平台,这点非常重要。
要更大程度的提高生产力,相应编程语言的主流框架一定要持续把玩和熟练。
这里的模块可分为系统模块(如:日志、缓存、序列化等)和应用模块(产品目录、用户管理、内容管理等)。大多框架都基本实现了常用的系统模块和一些扩展和第三方的应用模块。把它们熟练用好,生产力会极大提高。
好的框架还提供脚手架功能,一行命令就完成模块主体框架和目录结构生成,剩下的就是往里面填肉。
系统程序员可更多参与框架工作,业务程序员更好更熟练使用框架和可重用模块。
ABP、Spring、Qt、RoR ...
四、业务模型
业务是企业的核心,而这个核心是由一个个企业业务模块实现和支撑的。所以,业务模块的设计、开发、构建就变得重中之重。
一个完整的业务模块,要实现一系列相关联的业务功能,需要一个完整的数据层 - 服务层 - WebAPI层 - 前端UI层 的代码链的支持,各个层次各司其职,共同来完成当前模块的业务处理。
其中,数据传输对象(DTO)用于在应用层和表示层或其他类型的客户端之间传输数据。数据传输对象 DTO 与实体类 Entity 之间的转换与更新是通过对象 Mapper 映射(例如AutoMapper)自动完成的。输入输出 DTO 主要负责各层次之间的数据传输工作,避免在外层暴露实体类。
目前,比较完整的业务模型解决方案是 DDD 领域驱动设计模型,但它显得比较重量、有些复杂,它可分为四个基础层:
业务逻辑分为两层,分别为领域 (Domain) 层和应用 (Application) 层,它们包含不同类型的业务逻辑。
1、领域层:只实现领域业务逻辑,与用例无关。
2、应用层:基于领域层来实现满足用例的业务逻辑,用例可以看作是用户界面(UI)或外部应用程序的交互。
3、展现层:包含应用程序的 UI 元素。
4、基础设施层:通过对第三方库的集成或抽象,来满足其它层的非核心业务逻辑的实现。
但实际应用中更多使用的是可能更简化的层次和目录结构,但其基本思想和思路是大致一样的。
业务模块的设计、实现和大规模重用会变得越来越重要,只有在实践中多摸索总结了,逐步完成业务模块构建的最佳实践输出。
一个业务模块的良好设计和高效实现,将带来研发团队生产力的大幅提升。参考业务模块最佳实践,其它业务模块依葫芦画瓢就好了。
五、API的重要性
面对当前的复杂环境:全球化、多云、多供应商、客户多样性、需求多变和复杂性、政策法规等等,API网关、API平台治理都是企业、软件开发商、外包团队的关键能力和核心内容。
API 的重要性就不多说了,若需要多了解可搜索一下自己补充。
个人也在不断清晰自己角色,以及软件外包、分布式协作等等这些工作场景对 API 网关和平台的依赖和商业模式(数据、应用、服务的 API 化,包括各种外包业务和能力的 API 化)。
API 就像是中间商,一边是各行业客户和无尽需求,一边是自己的研发、业务和供应链能力。通过 API 做桥梁,有边界,有交互,有安全保障,有订阅经济。
API 的设计、架构、运营、治理更易催生出开放平台和生态系统。
所以,软件公司、外包团队对外能力体现的一大亮点就是 API。
六、武器库
在承接项目和交付各种外包的同事,要不断丰富和完善自己的武器弹药库,储备和准备各种开发用的框架、平台、模块、类库、领域模型、数据模型、demo等,主要为了应对各种用户需求和客户场景能迅速做出相应的解决方案、演示和产品雏形。如核心关注 .NET 和 Java 开发和应用平台,可参考的储备路线图:
1、.NET
Orchard Core:一个面向 ASP.NET Core 的开源、模块化、多租户应用程序框架和CMS。
ABP 是一个开源应用程序框架,专注于基于 ASP.NET Core 的 Web 应用程序开发,但也支持开发其他类型的应用程序(如:模块、服务、控制台),对 DDD 和 Microservices 的支持是其核心价值体现。
2、Java
Axelor Open Platform + Axelor Open Suite 给出了清晰的企业应用路线图,Axelor 是一款开源商业应用的模块化开发框架和智能管理平台,
Axelor Open Platform is based on Apache Shiro。
3、前端
主要采用 Vue 或 Angular
4、设计
统一采用 Material Design
5、App
先实现 Android 的交付
6、统一 API、Identity、K8s 基础设施。
7、统一的项目和软件协作管理(Redmine)和代码仓库管理(Gitlab)。
8、统一文档格式:使用 Markdown 生成项目文档,像软件版本一样维护。
喜欢将项目文档版本化、Markdown化和HTML化,这样,项目交付时,完整的文档也一同交付。
9、最终就是构建、定制各种开源 ERP & CRM & CMS 解决方案,各种业务系统是核心应用。
七、C++和Qt
可考虑以 Qt 切入嵌入式,微控制器、物联网领域的开发,Qt for MCUs 是一个完整的图形框架和工具包,包含在微控制器上设计、开发和部署GUI所需的一切。你可在裸机或实时操作系统上运行你的应用程序。
软硬件结合的嵌入式、微控制器的项目开发,价值会更大,且民用、军工、军品的需求也很大。
Qt & C++ 都是这一类软件的标配,我发现很多军工外包企业都采用了它。
另外两种主流语言是 Java 和 C#,也包括 C 语言。
编译型语言是军工外包企业的标准语言。
你可能没有这方面资质,但你可以和有资质的公司合作,你和团队输出 C/C++/Java/C# 技术和研发能力就可以了。
目测了一下,类似这样的外包项目甲方现金流是比较充足的。认识的一个小团队,去年做 500多万软件外包业务,公司刚成立1年多,也是不错的成绩。
另外,军工项目多喜欢软硬结合的产品。若只有软件,他们不喜欢,看不着摸不着,卖不出价钱。而内置了软件的硬件(块头越大越好,最好按吨计算)能卖好价钱。不用去想着改变他们的想法,投其所好就好了。所以特种计算机就是市场,且能有连续的产品消耗产生服务的持续性你就更幸运了,若再搭上一个好项目,你10-20年就不用愁了。所以软硬件、嵌入式开发、C/C++/Qt 就非常重要了。
还有,C4ISR(指挥、控制、通信、计算机与情报、监视、侦察)系统是核心的核心。
八、合作机制
这里的合作牵涉的东西很多,公司间的合作(优势互补)、团队合作、与独立开发者合作、共同参与应标、外包转包等等。
这里有认识、交流、磨合,以及后面的逐渐默契和信任,要尽可能排除政治和官僚因素,以项目快速落地和满意交付为共同目标,利益的清晰分配。小步快跑,争取研发费用的持续到位,保障团队和项目组的稳定性和持续性。
九、离岸交付
之前这块有交流,大家可参考。
这里也不仅仅只有离岸交付,还有各种的交付方式。重要的还是高效的沟通机制,大家和多方能比较早的达成各种共识,一切最好可记录和量化。这样有更好的指导和参考意见输出,避免不必要的分歧、相互埋怨和扯皮。为长期满意和愉快合作打下基础,尽可能做成不是一锤子买卖或失败交易。大家都来日方长,未来可期并有更多合作机会。
十、服务资源
软件培训和外包所涉及的一些开放基础设施服务和开发者资源,我也在做持续整理,并发布 GitHub 上,期待大家一起来丰富与完善。
1、.NET平台和C#, F# 服务
3、数据库、存储、大数据、数据科学服务
4、机器学习、深度学习、自然语言处理
5、分布式、微服务、容器云、中台、DevOps服务
6、灰狐开放职位需求服务,以 GitHub 的方式维护招聘信息
以上是从我个人的视角和经历所做得一些总结,若与你的认识有些出入,请多谅解。
若你分享点赞和点击在看,我会非常受鼓舞,谢谢。