为什么软件开发方法论让你觉得糟糕?

Why Software Development Methodologies Suck

There’s a lot of dogma in the religious wars around software development practices and methodologies. Are phase-gate methodologies effective at managing the risk of software development, or just risk management kabuki? Does TDD really make for higher quality software? Is pair programming a superior replacement for code review or just a way to inflate consulting rates? I’m going to argue that while scientific evidence to decide these claims is lacking, there are two general principles which can help us choose good practices while at the same time improving the value of the software we deliver: reduce cycle time and increase feedback.

Michael Feathers makes the following observation:

I think that, in the end, we just have to accept that developer skill is a far more significant variable than language choice or methodological nuances1. Frankly, I think we all know that, but we seem to suffer from the delusion that they are the primary knobs to tweak. Maybe it’s an extension of the deeply held view that from an economic viewpoint, it would be ideal if people were interchangeable.

The problem is, how do we get skilled developers? Since the concept of individual productivity in IT has never been satisfactorily defined, this is a particularly hard problem to solve. Lines of code - still a popular measure - suffers from the devastating flaw that a line of code is a liability, not an asset as is often thought. Measuring number of hours worked encourages heroic behavior - but experience shows that the “heroes” are usually the same people that cause projects to become late through taking unacceptable risks early on, and working long hours makes people stupid and leads to poor quality software. There is still no generally accepted set of professional standards or chartering system for IT professionals, and recruiting good people is very much an art rather than a science.

Psychologists have at least addressed the problem of why it is so difficult to acquire and measure skill in IT. As Daniel Kahneman says in Thinking Fast and Slow, there are “two basic conditions for acquiring a skill: an environment that is sufficiently regular to be predictable; [and] an opportunity to learn these regularities through prolonged practice.”

But traditional software projects are the opposite of a regular, predictable environment. The only good measure of success of a project - did the end result create the expected value over its lifetime? - is so distant from the critical decisions that caused that success or failure that it’s rare for anybody from the original team even to be present to get the feedback. It’s practically impossible to determine which of those decisions led to success or failure (in artificial intelligence, this is known as the credit-assignment problem).

原文:Why Software Development Methodologies Suck

       在围绕软件开发实践和方法论中有很多教条式的战争。阶段式方法在管理软件开发风险方面是有效的还是仅仅是风险管理?TDD真的能为高质量的软件做出贡献吗?配对编程是代码评审的一种更好的替代方法,还是仅仅是一种夸大咨询率的方法?我想说的是,虽然缺乏科学证据来确定这些说法,但有两个一般原则可以帮助我们选择好的实践,同时提高我们交付的软件的价值:缩短周期时间和增加反馈。

Michael Feathers给出了以下观点:

        我认为,我们最终还是得倚重开发者的能力,这才是个更重要的考量因素,而非选择哪门语言或纠结于方法论间的细微差别。坦诚地说,我们都清楚这点,但我们看起来好像过度纠结于开发能力是关键因素这事儿上。或许这是个经济学里一个被广泛接受的观点的引申,要是人人都可以替代(随便找个人都能顶上),那该有多好呀?但事实并非如些。

怎样才能找到有(合适)技能的开发者?

        心理学家至少对这个问题进行了研究:为什么IT业的技能很难被掌握和度量?Daniel Kahneman说(Thinking Fast and Slow),掌握技能有两个基本条件:一个环境足够规律以便可预测;有机会通过长时间实践来学习掌握这些规律。

        但是典型的软件项目往往是没有规律及可预测环境的。项目成功的唯一正确度量就是:最终的结果通过整个生命周期里的实施达到了预期目标吗? 很难知道什么关键活动导致了项目成功和失败,很少有人能够通过旧有或现有的项目获得答案。几乎不可能判定哪些决策导致了成功或失败(在人工智能领域,这叫作信度分配问题)。

         这些因素造成了IT专业人员很难掌握引导产品和服务走向成功所需的能力。然而,开发者掌握能帮助他们更高效地达到目标的技巧,将使他们更有动力 – 通常称之为“开发完成”,尽可能快的、不考虑是否功能被集成以及生产就绪。类似的场景也常出现在其他功能性实施领域。

         实际的软件项目是复杂的,没有规律可循,这会导致另一个问题 – 为了证明某种技术、实践和方法论是实际有效而收集相关数据是极度困难的,几乎不可能在脱离收集环境的情况下归纳出这些数据。

         但传统的软件项目与常规的、可预测的环境正好相反。衡量一个项目成功的唯一标准–最终结果是否创造了其生命周期内的预期价值?–与那些导致成功或失败的关键决定相距甚远,即使是原始团队中的任何人,也很少能得到反馈。几乎不可能确定哪一个在那些导致成功或失败的决定中(在人工智能中,这被称为信用分配问题)。

         这些因素使得IT专业人员很难获得成功的产品和服务的技能。相反,开发人员获得的技能使他们能够以最有效的方式实现他们受到激励的目标–通常会尽快宣布他们的工作“开发完成”,而不管这些功能是否集成和生产准备就绪,在其他功能领域也会出现类似的问题。

         软件项目是复杂的系统而不是常规环境,这一事实导致了另一个问题–收集关于哪些技术、实践和方法实际有效的数据极其困难,以及在收集数据的背景之外几乎不可能概括这些数据。

         因此,我们不可能认真对待任何关于敏捷开发实践是否优于瀑布式开发实践的一般说法–反之亦然。“思想领袖”的直觉也是一个很差的向导。正如卡尼曼所说,“人们对直觉的信心并不是判断其有效性的可靠指南.在评估专家直觉时,你应该始终考虑是否有足够的机会来学习这些线索,即使在一个正常的环境中也是如此。“正如本·巴特勒-科尔在他的同伴职位上指出的,“为什么软件开发方法摇滚乐”采用新方法的行为本身就能产生采用该方法的人打算带来的一些结果。

感想

          出发点很好,由于软件开发受到各种因素的制约,典型的软件项目往往会面临一个平凡而不可预知的环境,反馈间隔应尽可能短。这样,通过多功能团队,才能了解关系,找出原因和结果,建立一个能够很好学习和适应的组织。这样可以追踪的工作模式有助于员工有序地执行任务。但是,实际上,这并不是大家所希望的方法论的深化和脱离现实的全部。因此,我们不能制定理想的计划和方法。我们需要对变化做出反应和可以有效学习的团队。否则结果是,我们必须再次依赖工程师的个人技能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值