“嗨,阿米戈!”
“嗨,比拉博!”
“今天我要给大家讲讲程序通常是怎么开发的。”
“在 20 世纪,当现代 IT 还处于起步阶段时,每个人似乎都认为编程就像建筑或制造。”
“事情通常是这样的:”
“客户会解释他需要的程序类型——它应该做什么以及应该如何做。”
“业务分析师会听取他的意见,并根据他所说的内容制作一份完整的计划要求清单。”
“然后项目经理会将这些需求分解成任务,并且还会确定哪个程序员将执行什么任务以及以什么顺序执行。”
“然后程序员就会开始工作。有时他们会工作几年(!)。”
“当他们完成后,程序就交给了测试人员。”
“测试人员将检查每个程序的要求,以验证它们是否得到实施以及该程序是否按预期运行。”
“如果出现问题,测试人员会记录错误并将其发送给程序员。”
“然后程序员会修复错误并将修复的程序发回给测试人员。然后循环会重复。”
“当主要错误被修复后,程序就交给了客户。”
“事情真的是这样?”
“嗯,当然,我已经简化了很多,但这与事情的完成方式非常接近。”
“一个项目真的需要一年半到两年才能完成吗?”
“有时,如果一个项目的开发时间真的很长,他们会把它分解成单独的版本。每 3-6 个月,开发人员必须创建程序功能的特定部分,对其进行测试,修复所有错误,然后将其展示给顾客。”
“首先,他可以分享他的印象。其次,更重要的是,他可以继续为该项目的开发付费。”
“继续付钱?”
“那时候,开发的时间往往比计划的时间长 2-3 倍。而且由于程序员经常按小时支付报酬,所以程序的成本就高了 2-3 倍。而且,收益也减少了。毕竟,今天的客户想要什么3 年内可能不需要 100,000 美元——尤其是三倍的价格。”
“客户经常拒绝付款吗?”
“是的,后来他们开始在合同中增加惩罚,但这并没有改善这种情况。软件开发一直拖延,即使他们想做也没有人能做。”
“但为什么?”
“嗯,第一,在规划阶段知道的太少了。很多时候,一开始,没有人能预测到程序员会面临的问题。”
“但有经验的程序员应该能预见一切吧?”
“你能看出编程是一个独特的职业吗。”
“一个普通的工人经常一遍又一遍地做同样的工作。制表师制作手表,厨师做饭,老师教书,医生治疗等等。”
“这些专业人士中的每一位基本上日复一日地做着同样的事情。因此,他们开始越来越擅长自己的工作。”
“在编程中,方法是不同的。只要程序员每天面对相同的任务,他就会编写一个函数、模块或程序来执行它,并且再也不会回来处理它。”
“每个程序员通常在他或她的一生中完成一次任务。”
“就像发明东西的科学家或设计工程师。”
“啊。那么,在一个项目中最重要的角色是什么?”
“嗯,怎么回答呢。说哪个最重要容易,最不重要就难了。”
"测试人员(质量保证 ,QA)的主要工作是监控程序的状态并及时报告 错误。测试人员发现错误的次数越多、越早,修复的错误就越多。 一个好的测试人员对产品质量的影响超过一个好的程序员会。”
“为什么程序员不能测试他们自己的程序。毕竟,难道他们不比测试人员更清楚什么有效什么无效吗?”
“一个优秀的程序员根本无法成为一名优秀的测试人员。程序员知道该程序如何真正运行良好,因此他或她总是以某种方式使用它。这与普通用户相反,他们随心所欲地使用该程序。 “
“此外,测试人员不会测试还不能运行的东西。测试人员测试程序员所说的已经几乎完美运行的功能或部分程序。”
“当测试人员在该功能中发现大量错误,并且程序员修复它们时,产品实际上就更接近完美了。”
”程序员(S oftware D eveloper Engineer , Developer , SDE)的主要任务是实现新功能。或者,更简单地说,执行分配给他或她的任务。当程序员被分配具有新功能的任务时,他们执行它们。当他们被分配错误时,他们会修复错误。”
“但有时会有更具挑战性的任务,例如,为程序或其中的一部分提出架构。提出的架构越好,将来完成事情就越容易。”
“问题是架构需要在一开始就选择好,但是到了开发到一半的时候才清楚是否选择了正确的架构。”
“此外,如果架构成功并且程序运行良好,那么客户可能希望将其用作新版本程序的基础。”
“这就是我的意思。”
“无论你选择什么架构,总会有一堆架构没有考虑到的变化、添加和新功能。”
“这是一个很好的例子。”
“一位客户要求您建造一栋 5 层楼的建筑,因此您设计了一个建筑并建造了房子。”
“然后客户要求添加另一个故事,然后再添加一个,依此类推。”
“但是一楼的墙壁不是为那么大的重量设计的,地基也不是。所以一切都必须重做。”
“但是5层楼建好后,如果客户马上决定要50层楼怎么办?”
“拆除现有结构并从头开始重建一切会更容易……”
“但我有一条关于建筑的建议给你。”
“应用程序的架构首先必须是灵活的,这意味着如果您决定重做应用程序的一半,您将不必从头开始。这种类型的架构通常称为灵活和模块化。 ”
“项目经理的主要工作是做决定。项目经理是看到大局并根据大局做出决策的人。”
“假设在开发过程中,某项任务显然无法按计划完成。项目经理可以:”
" a) 尝试与客户协商修改任务"
“ b) 为任务分配更多时间”
“ c) 从其他项目中引进更有经验的程序员。”
“还有很多其他的可能性。”
“每个选项都需要你做出一些牺牲,而 经理的工作就是将这些牺牲造成的总损失降到最低。 ”
“例如,假设竞争对手以两倍的价格抢走了首席程序员。”
“项目经理可以:”
" a) 什么都不做。程序员会离开,项目很可能会落后并招致处罚。"
” b) 给他的工资加倍。然后团队里的其他人也会想要加薪。如果你给他们都加钱,那么这个项目的成本就会增加,可能会变得无利可图。”
“ c) 你想出的其他一些选择。”
“我懂了。”
“一个糟糕的项目经理,一个好的团队通常会延长一个项目,但并非总是如此。”
“一个拥有普通程序员团队的好经理几乎总是比一个拥有优秀程序员团队的糟糕经理更快地完成项目。”
“我懂了。”
“好吧,我们休息一下,然后我们继续。”
GO TO FULL VERSION