详情

怎样开发出好的App软件

  世界上没有多少事情是用金钱解决不了的。坏软件就是其中之一。大型航空公司生产的航班搜索应用程序通常无法与学生生产的应用程序相比。尽管现有的出租车公司面临共享出租车服务的威胁,但世界各地的出租车公司都没有很好的出租车应用。最痛苦的企业it系统通常是多年来开发的预算巨大的项目。所以不管软件质量差的原因是什么,它似乎与缺钱无关。


App开发


  令人惊讶的是,坏软件的根本原因与特定的项目选择几乎没有什么关系,而是有关如何管理开发项目的更多信息。最糟糕的软件项目通常以非常特殊的方式开始:


  项目业主要首先制定了具体的解决方案,但从来不知道他们想解决一下。然后,他们收集了大量的一系列请求的利益相关者。然后交给列表中相应的外部大的开发团队,谁就会从头开始开发这种高度定制的软件。一旦你满足所有的需求,每个人都将迎来释放系统,并宣布该项目。


  坏软件的根本原因与具体的工程选择没有什么关系,而是更多关于如何管理开发项目的信息。


  然而,当系统在技术上符合要求时,当将其移交给实际用户时,会发现严重的问题。系统缓慢、混乱和充满了难以捉摸的错误,导致了完全令人沮丧的体验。不幸的是,目前已解散了外部发展小组,没有剩余的资源进行必要的维修。几年来启动了新的项目时,关于这个问题的原因的所有知识已经离开了本组织,然后又开始了一轮。


  适当的编码语言、系统架构或接口设计将因项目而异。然而,一些独特的软件功能总是导致的传统管理实践失败,同时允许小型初创企业在微薄预算情况成功:


  很容易重用好的软件;这是快速开发好东西的秘诀。


  软件的局限性是投入开发的资源数量,但软件在崩溃前变得多么复杂;以及


  软件的主要价值不在于生成的代码,而是知识编码的积累。


  理解这些特征并不必然保证良好的结果,但它确实有助于解释为什么这么多项目会产生不良结果。此外,这导致了一些核心操作原则,这可以大大提高成功的机会:


  开始要尽可能的简单;


  寻找问题,然后迭代;以及


  可以聘请最优秀的工程师。


  尽管还有许多更微妙的因素需要考虑,但这些原则构成了开发优秀软件的基础。


  软件的重用允许您快速开发好的东西。


  软件易于复制。的代码机械水平线可被复制并粘贴到另一个计算机上。通常有关于如何使用现有的在线代码模块,开发不同类型的互联网上的系统很多教程。现代软件几乎从未从零开始开发。即使是最创新的应用是通过兼并和现有软件开发的修改。


  可重用代码模块的最大来源是开源社区。开源软件代码可以免费分发给任何人查看和使用。开源社区最大的贡献者之一就是科技巨头。如果你想使用最先进的可扩展数据库,比如facebook,只需在2008年下载他们的开源cassandra代码。如果你想体验谷歌的尖端机器学习,请下载他们在2015年发布的TensorFlow。使用开源代码不仅可以让您更快地开发应用程序,还可以让您访问比您开发的任何技术都更复杂的技术。最流行的开源代码更安全,因为更多的人关注并及时修复漏洞。这就是为什么数字技术取得了如此迅速的进步:即使是年轻的工程师也可以利用该行业最先进的工具。


  云服务的出现进一步改善了可重用性,使得用户可以仅通过付费订阅来充分利用包括专有系统在内的资源。想要一个简单的网站吗?在诸如“鳞片”或“WIX”的直线上,单击几下鼠标可以进行配置。要数据库吗?订阅AmazonWeb服务或MicrosoftAzure的虚拟版本。云服务使开发人员能够受益于专业化认证;安装、维护、服务提供商,并为所有用户开发高质量和可靠的软件。软件开发人员注重提供真正的价值,而不是浪费时间。


  如果你把所有的时间花在现有技术的重新开发,你不能得到的技术。软件工程是自动化系统的软件工程工作的发展,和常规的第一件事自动化。关键是要了解如何重新使用相应的系统,如何根据自己的独特需求定制,并修复发现的过程中的新问题。


  软件工程是自动化系统的发展,而传统的软件工程工作是实现自动化的主要任务之一。


  软件受制于复杂性


  软件的用途通常受到其复杂性的限制,而不是它投资的资源数量。


  它的典型特征,丰富的系统,但用户仍然讨厌他们,因为他们变得如此混乱。相反,移动应用点排名经常称赞,因为它的简单和直观的。学习使用该软件是非常困难的。在某种程度上,新功能将让用户真正感觉更糟,因为累积的复杂性变得不堪忍受。例如,iTunes的苹果公司的媒体的近20年生态系统的中心,今年终于被分为三个不同的应用程序(音乐,播客和电视),因为它的功能已经变得过于复杂。从可用性的角度来看,限制了许多功能没有实现,但如何整合到一个简单的,直观的界面。


  即使可用性被忽略,一旦项目变得过于复杂,项目的进度也会停滞。添加到应用程序中的每一行新代码都有机会相互交互。应用程序代码库越大,则在开发新功能时引入更多的错误。最终,创建新bug的能力超过了开发新函数的能力。这也被称为“技术债务”,是对专业软件开发的重大挑战。为什么许多大型IT系统多年来都有未解决的问题?这就是原因。向项目中添加更多的工程师只会增加混乱:当代码库被简化时,应用程序运行得更快。


  开发软件需要一个交替的扩展循环和降低复杂性。


  在这种情况下,唯一的出路是撤回,合理化和简化了代码库。它可以被重新设计的系统架构,以限制非预期的相互作用。即使非关键功能的开发,这些功能也可以被删除。您可以部署自动化工具来检查错误并编写不正确的代码。 比尔·盖茨曾,说:“与代码行的数目来测量程序的进展,作为由飞机作为建设进度的重量来测量。”人类的大脑只能处理有限的复杂性,因此,该软件系统的复杂性依赖于预算效力的复杂性。


  开发软件需要一个扩展和降低复杂性的交替循环。随着新功能的开发,系统自然会积累不平衡。当这种混乱开始造成问题时,必须搁置发展,以便有时间加以清理。这两个步骤是必要的,因为一个好的柏拉图式设计根本不是什么:它取决于你的需要和你遇到的实际问题。即使在google搜索栏这样的用户界面中,也存在着无法在迭代中完善的巨大复杂性。现在的挑战是管理好这个周期,使之足够混乱,以便在不压倒它的情况下取得有意义的进展。


  一个好的柏拉图式的设计什么都没有:它取决于你的需要和遇到的真正的问题。


  在尊重知识的形成,而不是编写代码的软件


  在软件开发中,大多数想法都是错误的;这不是任何人的错。只是因为有很多可能的想法,所以如果你非常谨慎和明智,任何特定的想法都可能行不通。要取得进步,你需要从一堆坏主意开始,抛弃最坏的主意,并逐渐形成最有前途的主意。苹果是一个基于视觉设计的例子。在推出最终产品之前,苹果将体验数十种原型。最终的结果看似简单,但其背后却是一个非常复杂的认知结果,即在比较各种解决方案后选择一个具体的解决方案。


  即使在已经开发了产品之后,这种感觉仍然是重要的。如果新团队接管了不熟悉的软件代码,软件就会迅速退化。操作系统将被升级,业务需求将发生变化,需要解决的安全问题将被找到。处理这些精细误差通常比第一开发软件更困难,因为它需要对系统体系结构和设计原则进行彻底的理解。


  短期内,不熟悉的开发团队可以解决这些问题。但是随着时间的推移,新的错误将随着附加代码的适当而累积。由于设计模式的不匹配,用户界面变得混乱,整个系统的复杂性增加。软件不应该被认为是静态的产品,但作为开发团队的生动体现理解。


  软件不应被视为静态产品,而是发展团队共同理解的生动表达。


  这就是为什么很难依赖外部供应商进行核心软件开发。你可以得到一个可以运行的系统和代码,但是它是如何开发的,为什么这些设计选择的有价值的知识被拿走了。这就是为什么一个有系统的新供应商的“维护保养“经常会导致问题。即使系统被存档,每当一个新的团队接管时,就会丢失一些知识。慢慢地,这个系统变成了许多不同作者的拼凑。继续运行正在变得越来越困难;最后,没有人能够真正了解系统的运作方式。


  为了让软件运行很长一段时间,让你的员工学习外界的帮助,这样的重点工程知识可以留在你的组织。


  开发好软件的3个原则


  1。尽可能简单地开始。


  对于特定领域,那些想成为“一站式解决方案”的项目往往注定要失败。这样一个项目的原因似乎是合理的:有什么更好的方法让应用程序解决尽可能多的问题,以确保应用程序解决每个人的问题?毕竟,有一个像超市一样的功能,就像一个超市。但应用的不同之处在于实体商店开张后,新产品的销售相对容易增加,应用函数乘法的开发难度不仅成倍增加,而且使用难度也更大。


  良好的软件开发人员需要重点关注:从最简单的解决方案。对于设计良好但过于简单的应用程序,添加必要的功能从来不是问题。然而,庞大的IT系统可以做,但不能做任何事情,往往没有简化和固定。即使是微信,抢和Facebook这样的应用程序,只要一切顺利完成,从一开始就非常具体的功能,只有慢慢开始后,才站稳脚跟扩大。很少有软件项目失败,因为它太小;失败,因为它太大了。


  软件项目很少失败,因为它们太小;它们失败是因为它们太大。


  不幸的是,很难把重点放在实践的时间上:收集所有利益攸关方的必要性导致了大量的职能。


  管理方法之一是延长使用的优先级列表。仍需要收集,但每个要求应标,这是绝对关键看它是否具有高附加值的特点,是非常实用的功能。通过这种方式,在规划过程的调度也不会那么紧张,因为没有明确排除的任何功能。然后,涉众可以安全地讨论哪些功能最重要,而不必担心会错过哪些项目。此法还明确增加更多的功能需要进行权衡。如果利益相关者要增加功能的优先级,他们必须考虑什么功能,他们希望减少。团队可以从最关键的目标开始,然后,如果时间和资源允许,这个有限的列表。


  我们所有最成功的申请都遵循类似的程序。Go.SG最初是一个手动Outlook宏。我们花了六个小时才建立了第一个用户,但今天它已经处理了大约100万个公开提交的内容。数据。最初直接从开源项目中复制出来的sg已经增长到每月超过300000次访问。停车。sg有大约200个可能的特性需要开发,但它仍有110多万用户。这些系统的简单性正是它们受到如此广泛欢迎的原因。


  2.找出问题然后迭代


  事实上,现代软件是如此复杂,因此,任何数量的规划都不能消除所有的缺陷。在编写好文章时,必须提前起草初稿,以了解最终文件应该是什么。要开发好的软件,你必须先开发坏的软件,然后积极寻找问题并改进解决方案。


  这可以用一个简单的事情做起,比如,谈谁想要帮助你的人。我们的目标是要了解你要解决和避免基础上直接跳转到该解决方案先入为主的偏见问题的根本原因。我们刚开始做停车场。如果是这样的话,我们认为执法人员认为,烧毁计算量的优惠券是令人沮丧的。但是,在经验丰富的执法人员度过一个下午,我们发现,这些计算为专业人士其实很简单。这次谈话可能是在浪费时间我们节省了数月,让我们专注于帮助司机。


  应该提到的是,假装是问题陈述的官僚目的。”司机们在处理停车罚单时感到沮丧“是个问题”。作为我们部门家庭数字化项目的一部分,我们需要开发驱动程序。没有任何用户对在政府网站上查找信息的困难感到恼火。作为数字政府蓝图的一部分,我们需要重建我们的网站,以满足新的设计服务标准。如果我们的最终目标是使我们公民的生活更好,我们就需要清楚什么会使他们的生活更糟。


  一个清晰的问题陈述可以让你尝试一个理论上很难确定的不同解决方案的可行性。与聊天机器人的沟通并不一定比浏览网站更容易。用户可能不想在手上安装另一个应用程序,不管它对国家有多安全。软件的看似明显的解决方案往往是一个致命的缺陷,而这又是在投入使用之前没有出现的。我们的目标不是开发最终产品,而是尽可能便宜地找到这些问题。界面设计使用非功能原型进行测试..使用半功能原型尝试不同的功能。使用仓促编写的原型代码帮助更快地收集反馈。在这个阶段创建的任何内容都应该被认为是一次性的。这个过程不需要编写代码的输出,但需要更清楚地了解正在开发的内容。


  假装与规定的官方目的的问题。如果我们的最终目标是使人们的生活更美好,我们必须清楚地认识到他们的生活雪上加霜。


  有了合适的解决方案,你就可以开始开发真正的产品了。在这一点上,你停止探索新的想法,并缩小它们,这样你就可以识别你的思维方式。从几个测试器开始,它们可以快速识别需要修复的缺陷。随着问题的解决,你可以向更多的人开放,让他们发现更难抓住的问题。


  大多数人只提供一个反馈。如果你一开始就为大量的观众而发展,每个人都会给你同样的反馈,所以你将无法取得进步。即使是由最好的工程师开发的最好的产品概念也会引起重大问题。这里的目的是一次又一次地提高产量,并仔细研磨,直到一个好的产品出现。


  所有这些迭代已经完成后,也出现了产品发布后是最重要的问题。在测试过程中,只有0.1%的人没有得到认可。但是,一旦你有一个百万用户,而不是仅仅一天解决这个问题,你有1000愤怒的人们每天处理。您需要解决新的移动设备,网络中断或攻击造成的安全问题,然后造成实质损害给用户。我们给Parking.SG开发了一系列辅助系统,它可以不断地检查主机系统是否有金钱,复制停车场和应用程序崩溃失算。随着时间的推移,建立一个“免疫系统”可以帮助您避免因出现新的问题的负担,是不可避免的。


  通常,我们的方法是使用不同的反馈环路来有效地识别问题。小反馈回路可以容易和快速地校正,但它们会错过更大范围的问题。大型反馈回路可以捕获更广泛的问题,但它们是缓慢和昂贵的。当然,您希望使用这两种方法以紧凑的循环尽可能地解决此问题,并保留一个较大的反馈循环来捕获意外错误。开发软件并不是为了避免失败,而是要在战略上尽快遇到失败,从而获得开发好东西所需的信息。


  3.尽可能多地雇用最好的工程师


  关键是使软件工作有一个好的工程师。谷歌,Facebook,亚马逊,Netflix和微软运营着世界上最大的技术系统,但他们的面试过程是众所周知的选择性,可以说是最严格的,每个人都在激烈的竞争中招募面试的大部分能力。随着这些企业的发展,甚至毕业生工资将上升,而不是因为他们喜欢扔掉钱。


  史蒂夫·乔布斯和马克·扎克伯格(MarkZuckerberg)都说,最佳的工程师比一般工程师要高至多10倍。对于优秀的工程师来说,这不是写代码速度的10倍。但由于他们做出了更好的决定,他们节省了10倍的精力。


  优秀的工程师能够更好地把握现有的软件,因此他们可以重复使用,从而最大限度地减少从头开始的东西发展。他们也可以更好地了解工程工具和使用这些工具大部分日常工作的自动化。自动化还意味着人员的释放,使工程师能够解决一些意想不到的错误,最好的工程师在这方面做得更好。优秀的工程师设计的系统更强大和更容易理解。这就产生了事半功倍的效果,从而使他们的同事能更快速的基础上,更加安全可靠。在一般情况下,很好的理由工程师高效的,而不是因为他们产生更多的代码,但由于决定他们让可以让你从你不知道的工作自由。


  这也意味着,最好的工程师组成的小团队往往比普通工程师组成的大团队成长得更快。他们将充分利用现有的开源代码和复杂的云服务,将普通任务的琐碎性质留给自动化测试和其他工具,以便他们能够专注于创造性的问题解决。通过对关键功能进行排序以减少不重要的任务,他们依靠用户快速测试不同的想法。这是经典著作《人与月亮的神话》的核心论点。一般来说,增加更多的软件工程师不会加快项目进度,但只会使项目更大。)


  开发软件的目的不是为了避免失败,而是为了尽快在战略上遇到失败,以便获得开发好东西所需的信息。


  有工程师,错误和安全问题的工程师较小的优秀团队产生较少的大型通用队相比。而类似的论文写作,更多的作者,更协调的最终期望的产品结构的编码风格,假设和偏心,可能会接触到更多的问题。相反,优秀工程师的小团队开发的系统将更加简单,一致,并更好地了解创作者。没有简单不能达到安全性,这是很少大规模协作的结果。


  技术工作越强,需要的工程师就越多。工程规范中的问题不仅影响到自己的工作,也影响到同事的工作。在大型项目中,糟糕的工程师最终会为彼此创造更多的工作,因为错误和糟糕的设计选择会导致许多问题。大型项目需要建立在可靠的代码模块、有效的设计和非常清晰的假设之上。你的工程师越优秀,你的系统就越好,因为它本身的重量。这就是为什么最成功的科技公司,尽管他们的规模,坚持拥有最好的人才。系统复杂性的硬极限不是技术工作量,而是质量。


  结论


  好的软件开发首先要清楚地理解您想要解决的问题。这样,您可以通过重用适当的开源代码和云服务来测试多个可能的解决方案并集中在“很好。“上,以允许立即访问现成的软件系统和复杂的新技术,加快开发过程。开发周期在探索和集成之间交替,从新思想的快速和混乱的探索入手,然后集中和简化以维护复杂性的可管理性。随着项目的进行,它将逐渐被更广泛的人所测试,以解决日益异常的问题。发布是一个良好的开发团队的实际工作的开始:应该开发自动系统层,以快速处理问题并防止对真正的用户造成伤害。最后,虽然软件开发的复杂性是无限的,但理解这个过程可以为如何开发软件奠定基础。


上篇文章:App开发泛滥成灾金融行业要抓紧机会