首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

每个开发者都应该知道的10件事

2020-01-19

我是一个 Python+Go 开发者,曩昔几年一向从事于全球范围内的运用开发。我和我的团队每天要应对大约 200 万的客户,处理这种规划等级的业务其实是不太简略的,所以,我想共享一下曩昔几年我的一些经历和技巧。

运用的安全问题绝不该该是马后炮或许降级成为“稍后再考虑的事儿”。咱们需求从运用开发的第一天起,就将强有力的安全性考量贯穿到每次评论和开发流程中去,而不是开发到第 300 天才开端考虑。将安全问题放到终究考虑,反而会增加开发的时刻,需求回炉重构以习惯安全问题。更糟的状况是,你没有满足的时刻来处理任何缝隙,终究只能交给易受攻击的代码。能够去了解下yahoo这样的公司,他们是怎么做到这一点的。

你或许不需求微服务

我知道,微服务很诱人。能够在运用程序中独登时弹性各种组件是令人兴奋的,这也合理化了根据特定代码库的继续作业。但假如诚实地想一想,你或许没有必要“微服务化”,像诸如此类的原因,“我想将 X 功用和 Y 功用解耦”,“防止坏代码污染运用的其他部分”,亦或是 “运用程序溃散时,最小化受影响的半径”,这些都不是微服务化的托言,反而是坏的开发实践,code review 规范需求愈加严厉,缺少细粒度的安全操控的体现。

你真的需求独立弹性运用的不同部分,而且现在有才能处理一个或更多的组件问题吗?

你的运用是运转在根据虚拟服务器的架构上而且想要减缩开支吗?那么你不该该去探究微服务。

在最好的状况下,你能做到收支相抵。在最坏的状况下,需求发动额定的实例。假定你有一个包括五个服务的全体运用,然后你将其分解为多个微服务。现在,你有5个运用程序,要么a)为其发动专用实例,使初始内存占用增加5倍,要么b)运用现有内存占用,只需增加办理它的操作本钱。

具有规范的开发环境

当你与多个开发者协作时,其间一件最有裨益的作业便是在团队中规范化开发环境。这其实并不意味着非得一同运用根据容器,虚拟化开发环境的“巫术”。当然了,假如你想这么做也能够。但像运用相同版别的开发言语这种简略的规范,有时就会在团队中发明奇观。当搭档根据 Go 1.11 版别开发时,你去测验根据 Go 1.12 版别去定位 bug 时,你会哭的。在协作中晋级版别是有难度的,但假如操作正确晋级也能够很顺滑。

装备比看起来要困难,按需方案

与一些抢手网站所说的相反,装备其实要比“把一切东西扔进环境变量”杂乱的多。在我看来,装备一个运用程序应该至少有四种办法:

代码中的默许装备
本地装备文件
命令行符号
远端装备源

我将远端装备作为是可选的,但其他四种是必要的。

开发过程中,将依靠的 27 个装备值扔到环境变量中,覆灭是为了在本地运转运用程序,这一点至少是令人懊丧的。或许你或许需求更好的自动化以及一个 Makefile?能够供给一种办法如一个 application.yaml 文件来访问本地装备源,答应你设置默许的 “dev” 装备。别的, 代码中的默许装备 意思是你只需求设置需求修正的默许装备。当经过像 systemd 这样的初始体系运转运用时, 命令行符号 会十分有用,由于它能够在追寻进程时,愈加简略的看到装备信息。当运用运转在容器中时, 环境变量 会十分有用,但像秘钥这种装备不合适放在环境变量中。

我知道,微服务很诱人。能够在运用程序中独登时弹性各种组件是令人兴奋的,这也合理化了根据特定代码库的继续作业。但假如诚实地想一想,你或许没有必要“微服务化”,像诸如此类的原因,“我想将 X 功用和 Y 功用解耦”,“防止坏代码污染运用的其他部分”,亦或是 “运用程序溃散时,最小化受影响的半径”,这些都不是微服务化的托言,反而是坏的开发实践,code review 规范需求愈加严厉,缺少细粒度的安全操控的体现。

你真的需求独立弹性运用的不同部分,而且现在有才能处理一个或更多的组件问题吗?

你的运用是运转在根据虚拟服务器的架构上而且想要减缩开支吗?那么你不该该去探究微服务。

在最好的状况下,你能做到收支相抵。在最坏的状况下,需求发动额定的实例。假定你有一个包括五个服务的全体运用,然后你将其分解为多个微服务。现在,你有5个运用程序,要么a)为其发动专用实例,使初始内存占用增加5倍,要么b)运用现有内存占用,只需增加办理它的操作本钱。

当你与多个开发者协作时,其间一件最有裨益的作业便是在团队中规范化开发环境。这其实并不意味着非得一同运用根据容器,虚拟化开发环境的“巫术”。当然了,假如你想这么做也能够。但像运用相同版别的开发言语这种简略的规范,有时就会在团队中发明奇观。当搭档根据 Go 1.11 版别开发时,你去测验根据 Go 1.12 版别去定位 bug 时,你会哭的。在协作中晋级版别是有难度的,但假如操作正确晋级也能够很顺滑。

与一些抢手网站所说的相反,装备其实要比“把一切东西扔进环境变量”杂乱的多。在我看来,装备一个运用程序应该至少有四种办法:

代码中的默许装备
本地装备文件
命令行符号
远端装备源

我将远端装备作为是可选的,但其他四种是必要的。

按需运用包办理,而不是覆灭由于能用

咱们都知道 “left-pad” 事情,一个只要 11 行代码的 NPM 包从库房中移除,为何给全网构成了影响?咱们不要这样做。有合理的导包需求时,才应该运用 package,如特定供货商的SDK,是一组十分具体的规范库的笼统,或许导入被广泛运用的结构如 Go 言语的 Echo HTTP server 或许 Python 言语的 Flask WSGI server。一些便利的库也能够,比方 JavaScript 的 Lodash,它供给了一些规范库中没有的公共功用和附加功用。这些外部依靠应该让开发更简略,而且不需求手艺编写样板或集成代码 -- 这些是包办理的好处,可是,像 left-pad 这种,很简略堕入这种圈套--“这正好有一个能处理问题的库,直接用旧行了”。每一个你导入的依靠,都会增加不稳定、不安全或许覆灭不行保护的风险。

每导入一个包,新的依靠项自身的风险就会增加——这也称为传递依靠项。假如你导入一个独自的包,而这个包又导入了五个包,那么你现在就承继了这五个依靠项以及它们所带来的一切风险和风险。我和许多业内人士都以为包不该该引进传递依靠联系,但这是不现实的,至少包应该尽或许精简,假如需求更强壮的功用,则为用户供给显式扩展它的办法。

我现在遵从的一个简略准则是,假如导入的库,我自己能够在 10-15 分钟完结,就自己完结。不然,假如有可用的外部库,我就运用外部库。开发过程中谨记这个规矩能够让你防止导入一些不必要的包。假如你不期望每次都从头开端编写新的 HTTP 服务器来供给 API,那么这种办法就足了。

如无必要,无需笼统

一个极易堕入的大圈套便是“笼统一切”的黑洞。“这个我后边或许会复用”的主意或许会使你误入一些漆黑和可怕的面向对象歧途,我弄清了其间的个中缘由,DRY 准则现已家喻户晓且理由充沛。可是你花太多时刻去笼统反而没有满足的时刻写逻辑。只需安心编写代码,假如你发现需求完结一个与之前完结的其他作业相似的办法或函数,那么你能够回来并笼统它——但相同要有控制。我个人倾向于遵从的准则是,假如在笼统之前它是一个简略的三行函数,那么最好坚持不变,然后重复它。假如覆灭 3 行代码,或许能够自问,它是否需求变成一个函数?

你应该时不时地“涅槃”你的项目

本条准则是最可怕的,它让办理者严重,让产品司理气急败坏,让开发者愤恨,可是你肯定需求它。

每隔一段时刻就从头开端是一件功德,它答应你代码中删去废物,完结新的主意,而不需求改造现有的代码库,并迫使每个人从头评价项目。

把项目幻想成森林,每一行代码都是连绵数英里的大森林中的一棵巨大松树。跟着森林的演化,灌木丛、丢掉的松针、松果、枯死的树枝和其他杂物分布于森林之中。这是你讨厌的东西,你的技能债。它会一向不断堆积,直到某些剧变发作。关于森林而言,这种改变是以野火的方式呈现。大火横扫森林,焚毁了堆积起来的无用废物。树皮满足厚的树会留下来,未成熟或未发育彻底的树会在火灾中被焚毁。尽管这看起来是森林的止境,但它躲藏了一个巨大的隐秘:森林一向在等候这场火。耐心肠,年复一年地,森林一向在等候这场大火来净化自己,并带来改变。由于当大火在树冠下暴虐时,下一代的参天大树正在松果中发芽。当大火蔓延到森林地上时,软弱的幼树就会冒出来,与被大火熏黑的幸存者为伴。这也是你的运用程序该有的姿态:有弹性的、在铲除过程中,编写杰出的部分幸存下来,而其他部分则为新思想和新代码让路——就像涅槃相同。

你不是 Google

除非你是 Google,但假如你真的是 Google,为何你还在读这篇文章呢?关键是你大概率不是Google,不是 Microsoft,不是 Amazon,不是 Twitter,不是 Facebook。你不需求在全世界 17 个不同的数据中心的 10,000 个裸机服务器上编列 150,000 个容器。你的问题一般不会对世界上每一个人构成很大的影响。咱们为什么要评论这个?由于你的规划决议了你的操作渠道。假如你正在运转几百个容器,那么你真的需求 Kubernetes 吗? 你真的需求自己运转 Kubernetes,仍是覆灭想把它增加到你的简历中? HashiCorp Nomad 之类的东西十分合适处理中小型问题: 它易装备,简直不需求保护,有杰出的文档,而且十分简略就能够把运用程序搬迁曩昔,由于它能够与容器、体系进程和 JVM 运用程序一同作业。假如你真的想运用 Kubernetes,为什么不根据把冗杂细节都笼统好的 Rancher 来办理呢?运转 Kubernetes 这样的杂乱体系所带来的费事和开支关于一个团队来说是难以承受的。我甚至会开门见山地说,草创公司应该不惜一切代价防止运用它,除非他们的产品是专门针对 Kubernetes 的。需求留意的是,要运用 Google、Amazon 和 Microsoft 在各自的云产品中供给的保管服务。由于他们办理着一切的丑恶的东西,许多办理费用并不是由你来承当的。但千万别让我抓到你在物联网设备上运用 Kubernetes,千万不要。

不要照搬网上陌生人的开发哲学

关于开发风格和要遵从的准则,你应该构成自己的主意。即使是上面的 10 条主张也覆灭仅供评论,我覆灭网上的过客。

原文链接: 10 things every developer should learn

咱们都知道 “left-pad” 事情,一个只要 11 行代码的 NPM 包从库房中移除,为何给全网构成了影响?咱们不要这样做。有合理的导包需求时,才应该运用 package,如特定供货商的SDK,是一组十分具体的规范库的笼统,或许导入被广泛运用的结构如 Go 言语的 Echo HTTP server 或许 Python 言语的 Flask WSGI server。一些便利的库也能够,比方 JavaScript 的 Lodash,它供给了一些规范库中没有的公共功用和附加功用。这些外部依靠应该让开发更简略,而且不需求手艺编写样板或集成代码 -- 这些是包办理的好处,可是,像 left-pad 这种,很简略堕入这种圈套--“这正好有一个能处理问题的库,直接用旧行了”。每一个你导入的依靠,都会增加不稳定、不安全或许覆灭不行保护的风险。

每导入一个包,新的依靠项自身的风险就会增加——这也称为传递依靠项。假如你导入一个独自的包,而这个包又导入了五个包,那么你现在就承继了这五个依靠项以及它们所带来的一切风险和风险。我和许多业内人士都以为包不该该引进传递依靠联系,但这是不现实的,至少包应该尽或许精简,假如需求更强壮的功用,则为用户供给显式扩展它的办法。

我现在遵从的一个简略准则是,假如导入的库,我自己能够在 10-15 分钟完结,就自己完结。不然,假如有可用的外部库,我就运用外部库。开发过程中谨记这个规矩能够让你防止导入一些不必要的包。假如你不期望每次都从头开端编写新的 HTTP 服务器来供给 API,那么这种办法就足了。

一个极易堕入的大圈套便是“笼统一切”的黑洞。“这个我后边或许会复用”的主意或许会使你误入一些漆黑和可怕的面向对象歧途,我弄清了其间的个中缘由,DRY 准则现已家喻户晓且理由充沛。可是你花太多时刻去笼统反而没有满足的时刻写逻辑。只需安心编写代码,假如你发现需求完结一个与之前完结的其他作业相似的办法或函数,那么你能够回来并笼统它——但相同要有控制。我个人倾向于遵从的准则是,假如在笼统之前它是一个简略的三行函数,那么最好坚持不变,然后重复它。假如覆灭 3 行代码,或许能够自问,它是否需求变成一个函数?

本条准则是最可怕的,它让办理者严重,让产品司理气急败坏,让开发者愤恨,可是你肯定需求它。

每隔一段时刻就从头开端是一件功德,它答应你代码中删去废物,完结新的主意,而不需求改造现有的代码库,并迫使每个人从头评价项目。

把项目幻想成森林,每一行代码都是连绵数英里的大森林中的一棵巨大松树。跟着森林的演化,灌木丛、丢掉的松针、松果、枯死的树枝和其他杂物分布于森林之中。这是你讨厌的东西,你的技能债。它会一向不断堆积,直到某些剧变发作。关于森林而言,这种改变是以野火的方式呈现。大火横扫森林,焚毁了堆积起来的无用废物。树皮满足厚的树会留下来,未成熟或未发育彻底的树会在火灾中被焚毁。尽管这看起来是森林的止境,但它躲藏了一个巨大的隐秘:森林一向在等候这场火。耐心肠,年复一年地,森林一向在等候这场大火来净化自己,并带来改变。由于当大火在树冠下暴虐时,下一代的参天大树正在松果中发芽。当大火蔓延到森林地上时,软弱的幼树就会冒出来,与被大火熏黑的幸存者为伴。这也是你的运用程序该有的姿态:有弹性的、在铲除过程中,编写杰出的部分幸存下来,而其他部分则为新思想和新代码让路——就像涅槃相同。

除非你是 Google,但假如你真的是 Google,为何你还在读这篇文章呢?关键是你大概率不是Google,不是 Microsoft,不是 Amazon,不是 Twitter,不是 Facebook。你不需求在全世界 17 个不同的数据中心的 10,000 个裸机服务器上编列 150,000 个容器。你的问题一般不会对世界上每一个人构成很大的影响。咱们为什么要评论这个?由于你的规划决议了你的操作渠道。假如你正在运转几百个容器,那么你真的需求 Kubernetes 吗? 你真的需求自己运转 Kubernetes,仍是覆灭想把它增加到你的简历中? HashiCorp Nomad 之类的东西十分合适处理中小型问题: 它易装备,简直不需求保护,有杰出的文档,而且十分简略就能够把运用程序搬迁曩昔,由于它能够与容器、体系进程和 JVM 运用程序一同作业。假如你真的想运用 Kubernetes,为什么不根据把冗杂细节都笼统好的 Rancher 来办理呢?运转 Kubernetes 这样的杂乱体系所带来的费事和开支关于一个团队来说是难以承受的。我甚至会开门见山地说,草创公司应该不惜一切代价防止运用它,除非他们的产品是专门针对 Kubernetes 的。需求留意的是,要运用 Google、Amazon 和 Microsoft 在各自的云产品中供给的保管服务。由于他们办理着一切的丑恶的东西,许多办理费用并不是由你来承当的。但千万别让我抓到你在物联网设备上运用 Kubernetes,千万不要。

关于开发风格和要遵从的准则,你应该构成自己的主意。即使是上面的 10 条主张也覆灭仅供评论,我覆灭网上的过客。

热门文章

随机推荐

推荐文章