危机时用云端——如何改善公司的运行
我们所认识世界正在发生着很大的变化。这迫使我们改变习惯以及工作和执行日常职责的方式。这还包括专业和私人的责任。我们所遇到的情况,现在导致了很多人必须远程工作。在这种疯狂的时期中,这种方式非常舒适,并且在家办公(英:home office)已成为成熟的工作场所。并非所有人都能轻松地适应此变化。对于已经开始向数字化转型的公司,与尚未适应新条件的公司相比,前者适应新条件应该容易得多。
当前为公司创建和交付专用软件的趋势已大大促进了外包模式的发展。这是一个非常方便的解决方案,是因为客户(公司)不必再维持整个编程部门。相反,客户可以使用IT外包服务,并聘请专家来专业地交付成品。在这种解决方案中,消除了在培训自己的程序员、测试人员、分析师、甚至IT经理方面的投资问题。这是一种方便且灵活的方法。其好处显而易见,并且IT专业人员和新兴软件公司的外包需求不断增长能当作证明。
如果我们做与其他人不同的话,会怎么样?在与IT少有共同点的公司中创建负责提供软件的部门会不会成功并是否有道理?有可能,因为毕竟,您始终可以聘请合格的人员来制定所有流程并组建团队。好吧,让我们现在提高一下标准。要不我们决定建立一个完全基于对自己公司的业务非常了解但以前与编程和IT行业无关的员工团队,会怎么样?此外,目标为在几个月内从头开始创建并实施新的生产管理系统。这听起来像是个疯狂的计划,对吗?有可能的,但是在这篇文章中,我想表明有时这种疯狂的方法很有效。我邀请您阅读对一家公司的案例研究,该公司决定了遵循这条道路并培训自己的开发团队。
首先介绍客户的公司简介。它是一家从事汽车行业的大型组织,在多个国家设有分支机构。其活动的主要领域包括汽车设备的生产。该公司在其分支机构中已实施了用于监视、控制和计划生产的系统。它由一名在编程爱好者和自学成才的员工而编写和维护。该系统运行良好,但是编写时没有使用任何架构模式、良好的编程习惯、甚至没有使用版本控制系统!为了能够在后续的生产工厂中进行其合理地开发和实施,有必要使用最佳技术和工具以专业的方式重新编写。出于这种需求,此客户找了Transition Technologies PSC。我们在大约8个月的时间内帮助该公司实现了编写适当系统的目标,并同时转让了有关整个软件开发过程的专门知识。值得一提的是,与客户的合作几乎完全是在线进行的。在本文的下一部分中,我将重点介绍如何在这么短时间内从头培训四名开发人员,让他们达到扎实的初级开发人员的水平,并对一名零水平工人进行培训,甚至到普通开发人员的水平。
显而易见,第一步是学习入门所需的基础知识。该设计将以.NET Core技术而创建。此外,我们选择Jira进行项目管理,源代码由Bitbucket维护和管理。为了提供持续集成,我们提出了Jenkins。首先,我们开始进行有关上述主题的一系列培训。在一周内,我们通过举办以下培训来提供了大量的知识:
其中每个培训都必须从头开始,最多要持续8个小时。因此这只是相关主题的介绍。要了解更多信息,该团队单独进行3-4周的培训,重点于:C#、ASP.NET MVC Core、Entity Framework Core、JavaScript和jQuery(没错,老牌的jQuery,我决定了对于完全初学者来说,现代js框架的入门门槛太高)。在此期间中,访问包含大量高质量在线培训数据库的平台是至关重要的。另外,值得一提的是,作为自学的一部分,在开始实际项目之前,一些程序员独立地实施了自己的开发项目,然后我们对此项目进行了评论。由于这个原因,关于编程开始的最初评论仍然可以在那些所谓的 演示项目而提出,并且进入正确项目的人员已经在实施项目演示期间获得了丰富的经验。
在项目的后期,我们每两个月在公司现场举办2-3天的讲习班。在这段时间中,我们能够对当前所需的主题向参与项目的人员进行解释和培训。面对面开会时,回答所有烦恼的问题并提供必要的信息要方便得多,拥有一台投影仪或一块白板,可以在上面画一些东西从而解决更困难的问题。
当我们开始从事正确的项目时,我的四位程序员团队仍在处理新近学习的问题中,感到稍微模模糊糊。然而,应该强调他们的野心和学习意愿。我们并没有时间来培训他们直到足够高的水平,然后才开始项目实施。我们有必要马上开始。幸运的是,每个人都知道并接受了团队学习会引起到的风险。我负责了管理整个项目的责任。对于客户而言,最重要的是创建高质量的产品,即使会延迟任务的执行。为此,我使用了所可用的工具来帮助我们工作。通过使用Jira,即我们有关该项目的单一真实来源(“one source of truth”),我们可以随时轻松地检查工作的当前状态并找出问题。
由于Bitbucket的提交请求(pull request),每个任务或错误修复都必须经过我的代码评论,然后才能迁移到主分支。最初,可以理解的是,评论很多。大多数的情况下,这并不是代码本身所有的问题,而是与git工作不当的问题。事实证明,如果一个人同时处理多个任务并具有多个特性分支,当有必要修改其中的一个时,该修改首先会落在他们当前工作的分支上,然后他们手动将其复制并应用于其它分支。这意味着在一个特性分支上存在了另外分支的代码。这导致许多合并冲突。只有在对git重新进行专注于实际存在问题的培训之后,才将代码分离和每个任务一个分支工作模式所带来的好处完全理解。除非我之前没有想到正确使用git会有困难,否则我以为他们在按照建议的体系结构和良好原则(例如面向对象设计,简写:SOLID)理解和正确执行任务方面会遇到问题。我会理解,对于没有经验的团队来说,这些话题实际上可能很难吸收。因此,我专注于教每个人如何尊重SOLID原则,并展示了一些简单的示例,说明如何用该方法编写代码以及它为什么如此重要。此外,我想要实施第一个用户故事,要求他们穿过系统每一层并将其作为模型示例进行展示。同时,我尝试了在代码审查时定期修改其它错误,但这在开始看起来也很不正常。为什么?您可能猜到了,错误很多。我的评论要具有事实性和建设性,并传达在哪里做错了,如何做得更好以及为什么另一种解决方案更有效,都极为重要。为了解释评论的含义并确保对其理解良好,我们通常需要与屏幕共享进行额外的聊天。该方法旨在学习并消除将来的类似错误。此外,因为评论不是固执或恶意,而是希望传到我的知识和经验(例如:请了解,如果您采用不同的操作方式,出于某个原因,这样做会更好),该方法让我与程序员建立良好的关系。通过如此艰巨的工作系统,团队迅速获得了经验。该方法唯一的好处是让他们可以从自己的错误中学习。他们自己体验了为什么在许多情况下代码的重复不太好,混合责任也会带来不好的结果,命名约定为何这么重要,并为什么单元测试基本上需要这么长时间编写。
像任何项目一样,有时不得不解决更困难的问题,并想出其除了方法。这类的问题通常被计划为客户现场讲习班期间而讨论。那时,我们可以一起坐在一个房间里,自由地进行集思广益,然后提出大纲和解决方案的详细信息。对于程序员来说,这也是极大的鼓励和发展。这也教会了他们如何寻找关键和复杂业务需求的解决方案,以便他们还考虑到整个系统的效率、可扩展性和安全性。通过参与此过程,他们不仅学会了将注意力集中在所讨论的问题上,而且还对其整个系统的影响进行了分析。
这样的工作带来了可观的收益。进步也在sprint回顾会议上是显而易见的。开发人员说他们在给定的sprint中学到了什么。此外,显而易见的是,如何实施从我们学到教训记录中获得关于改进设计的后续建议,以及如何影响了burndown和velocity报告所衡量的工作质量和绩效。同样可以看得出来是,来自代码审查的注释越来越少,并且提交请求合并的速度也越来越快。
最后一步为使团队成员做好准备,并让他们成为独立的程序员,确认他们能了解、理解和应用.NET中的基本编程技术和模式。他们应该能够解决(或寻找工具来解决)最常见的编程问题。同样重要的是,他们可以自己通过进行代码审查来识别另一个程序员代码中的错误。
达到这个水平的过程是逐步形成的。首先,当一名程序员犯下的严重错误越来越少,他本人能注意到该错误,并且仅在执行更困难的任务时需要帮助的时候,我们就任命他为评论家。从那时起,他可以对其他人进行代码审查,接受提交请求,但是还需要第二位评论家进行额外的审查(所谓的双重审查,英:double check)。这让他获得了不同的观点,是因为从那时起,不仅他的代码需要接受审查,而且他也有机会认真地研究团队编写的代码并将错误报告给其他人。另外,在所谓的双重审查中可以再次访问提交请求,并查看第二位评论家已报告了哪些其他的错误,但他自己没有发现。先前准备的文档列出了项目中正确编码的原理,即所谓的《开发人员指南》,对评论提供了帮助。当一名程序员进行了大量的代码审查,并且其质量满足了要求时,他能成为独立的评论家。从那时起,他对提交请求的接受导致其合并与目标的分支。
通过这种方式,我们达到了团队已经处于可靠的初级开发人员水平的阶段,并且其中至少的一名已经达到了常规开发人员的水平。因此,团队不再需要进一步的持续指导、控制和教学——他们可以自己进一步发展。如果出现严重的问题,并需要大量的知识和经验来解决,则客户仅在合同中留下了一道门,即可以在较短的时间内与我们进行咨询和培训。
由没有经验和专门知识的人员组成团队是否成功了?当然是的!该项目已按计划实施了。他们的产品非常顺利地通过了首次安全测试,仅检测到一个严重的事件。在我们合作结束时,该软件已准备好用于生产实施。理所当然,只有在生产中运行了一段时间后,才能对此项目质量以及它是否成功进行全面的评估。然而,我想强调,与项目本身的实施一样重要的是,公司获得与软件开发相关的能力和知识。这样,客户可以通过进一步扩展专家团队,不仅包括程序员,而包括测试人员、分析人员和开发人员,来建立及发展此能力。
让我们取得联系
联系我们