学习代码和生产可用软件之间的差距

2020-07-02 00:11:05

关于软件开发的一个不言而喻的领域是构建可用的软件。学习如何编码,编码一些东西,并让成千上万的人使用它并不是一件容易的事情。在本文中,我将讨论在发布产品之前需要解决的最重要的支柱。

我做过的第一个应用程序是社交媒体,如果你的评论/帖子超过100条,应用程序就会变得非常慢,数据库过度获取,身份验证被破坏,整个世界都被烧毁了。这不是一个很好的位置,但这是不言而喻的,密切关注一些小细节将省去你数月的技术债务和头疼。

注意:每一点都是可以商榷的,这就是你的入门之道,你学得越多,你的应用程序就会变得越可靠。

在对应用程序进行编码时(或在完成时),您需要确保环境安全,没有用户数据泄露,并且应用程序是可靠的,并且可以随时扩展以应对任何使用高峰。

避免以不安全的方式解包值(也称为检查值是否为空),然后执行您的逻辑。令人惊讶的是,这并没有太多的讨论,作为一个新的软件开发人员,你永远不知道什么会让你的应用崩溃。你永远不能百分之百确定一个值不会为零,会发生奇怪的事情。

避免保留周期:虽然这些是无意造成的,不易检测到,但您需要对应用程序运行检查,以检测是否为一些未使用的对象保留了内存。每个IDE都有帮助您检查保留周期的工具,您需要使用它们。例如,Xcode有一个选项卡,您可以在其中检测内存峰值、释放和CPU使用情况。有很多方法可以检测你的应用程序是否有问题,硬件方面,确保根据你的平台在网上搜索。

保护好你的秘密钥匙!通常情况下,您会发现自己在使用第三方服务。这些服务提供“密钥”和“测试密钥”来访问它们的API。在生产中使用“密钥”是有原因的。如果泄露了,另一个人会用它,而你要付账:)没什么意思。更糟糕的是,这可能会泄露您用户的数据,甚至关闭服务器。这就是为什么利用“环境变量”很重要。顾名思义,这些都是驻留在本地计算机中的变量。比方说,当脚本想要访问该密钥时,它可以从本地计算机获取该密钥。这样,您就不需要将任何东西硬编码到脚本中,同时保持代码的整洁和安全。

密码:现在,这是一个被低估的问题,没有人谈论,可能会让整个公司倒闭。在某些情况下,当您没有使用可靠的第三方服务(如AWS&;Firebase)进行身份验证时,您需要自己散列密码。就我个人而言,我总是将散列函数作为API的一部分保存在单独的文件中。我包含了一个随机环境变量,我可以跟踪该变量,该变量指示如何根据提供的信息为特定用户生成密码。我们准备好了!我不需要知道我的用户的密码,我通过使用我之前存储的环境变量触发相同的散列函数来触发“登录”,一切都是安全的。

为生产而构建时,不要保留“日志”(类似于打印)!这是一个很好的自食其果的方法,将日志记录功能扩展到构建中,如果您正在记录敏感信息,则会遇到麻烦。只需坚持使用经典的print()语句;这些语句在生产中使用是安全的,并且不会被记录(从iOS的角度来看)。

在以中等难度在不同领域构建了几个应用程序之后,您会希望自己做了很多不同的事情,请将它们记下来,并在您的下一个项目中使用它们!我的项目从一团糟的意大利面条变成了干净的等级制度。

在我的例子中,我发现很难跟踪我的文件在Xcode中的位置,所以对于每个屏幕,我都有一个文件夹。该文件夹包含前端逻辑、后端逻辑和独特的实用程序。至于通用实用程序,我会将它们保存在全局文件夹中,以便从其他文件中引用它们。

考虑最大程度的因数分解。在编码时,您希望将文件作为使用相同功能的其他脚本的全局因素。

在某些时候,您会意识到您正在处理多个文件夹,并且您的项目非常庞大,但这要比将所有内容都塞到一个文件夹中并且仅查找一个文件就浪费30秒要好1000倍。

有时使用第三方服务很有诱惑力,因为它们可以让生活变得更轻松。我完全同意使用这些服务,事实上,我经常使用它们。但是,您需要了解他们的计费政策的内部情况,并知道您要支付的费用是什么。

仅当服务可以为您节省成本和/或增强用户体验时才添加该服务。是的,我刚才说你需要增加一项能帮你省钱的服务。例如,AWS对每个服务都有一个自由层使用。因此,与其只对一项服务施加压力,你可以利用多项服务,你可以走环形交叉路口,但最终你会在早期节省成本。

从算法上讲,您可以在客户端节省数据库成本。直观的方式是进行更少的调用,缓存用户信息,并预加载数据以备将来使用。这显然增加了客户端的工作,但是集成离线功能变得比以往任何时候都更容易。

注:根据经验,我注意到你在客户端节省的钱越多,你的UX就越好,性能也就越高。我意识到这是一个大胆的观点,所以我将把它留到下一集去讨论。

在可伸缩性方面,请确保您的代码可用于巨大的流量峰值,这些都是基本的算法分析技术,而且它们的代码通常较短。例如:使用内置的排序函数,不要每次都迭代100项以上的列表,缓存结果,利用动态编程(简而言之,前一个结果有助于下一个结果;请在此处阅读更多信息)。

到目前为止,您可能认为您已经完成了,但这个故事还有更多的内容。虽然你离我们很近了,但是振作起来!

通常在构建项目、检查教程、堆栈溢出等…时。您可以找到硬编码的像素值,通常为:(宽度:100,高度:100)或类似的值。这些硬编码是为了简单起见而制作的。不,您的应用程序不会缩放,因为每台设备的像素数都不同,等等。这就是为什么:

编码时,避免使用硬编码值,而使用百分比。在一个单独的类中可以有2个静态变量,从中可以获得当前屏幕的高度和宽度。这样,在对我的布局进行编码时,我可以快速访问并以可伸缩的方式呈现我的布局。

通常,您会将该类称为:SomeClass.creenWidth*0.5,这意味着“使我的按钮宽度为超级视图宽度的一半”。

在不同的物理设备上测试,模拟器并没有那么糟糕,但有时会在布局上出错,因为它们在您的计算机上运行,所以性能也更高。有时,当布局或动画看起来很流畅时,您可能想要在其他物理设备上测试它,并自己仔细检查。

不要过于强调布局,要有一个好看的布局,利用第三方软件包/插件/库来制作动画,有很多免费的服务可以让你的应用程序看起来更整洁,尽最少的努力。请记住,在这份时事通讯中,我们都是20%左右的投资80%的回报:)

客户端错误处理:您可以不受影响,但不要忽视它。

错误处理很有趣,不是吗?或者,您可能认为您不需要它,所以您只需使用标准弹出窗口来显示任何“错误,稍后再试”消息。不要。糟糕的编码,糟糕的。每个应用程序都会在某个时候崩溃/失败,你想要提供一条针对发生的事情的有针对性的消息。虽然您不能知道失败的所有原因,但您知道错误代码。为了启动和运行我的项目,我用一个标准的失败弹出窗口嵌入错误代码,这样,当用户在beta/Production期间报告问题时,我会检查代码的日志。快速简单的调试!

在稍后的阶段,您希望删除代码并转到“自然语言解释”。当进一步增强用户体验的时机到来时,您将开始这方面的工作。

与前面的情况相同,但如果您处理的是财务后端(又名Strike等),则需要考虑一个重要事项。您希望拥有您的WebHook(接收来自条纹、贝宝等…的事务调用的应用编程接口。在这里您可以更新您的数据库)以正确的方式作出反应。这里的错误处理非常关键,因为您不希望将用户标记为未付款,因为他们的付款尝试成功,但您未能调用数据库并进行必要的更新。

编写测试用例对于可靠的软件来说是必不可少的,特别是在团队中扩展和添加更多功能时。您永远不会知道是谁编写了什么,以及它对您编写的一段代码有何反应。如果您是一名独立开发人员,并且即将发布一个基本产品,您可能会跳过这一步,但您需要记住,您必须编写测试用例以避免将来出现基本错误。

嗯,这是一个很长的故事。我希望这篇文章对您有帮助;对不起,我不得不把它写得这么长,但这个过程必须是详细和实用的。考虑与你的朋友和任何可能觉得这篇文章有帮助的人分享;如果你没有订阅,可以考虑这样做!