在软件项目中选择技术,架构和设计-无需现金

朋友们! 我们继续不间断地发布有关设计流程,IT技术以及如何有效工作的一系列出版物。 今天,我们将讨论一个引起大脑灼热的非常痛苦的话题-选择技术,编程语言,架构师,分析师,团队负责人和心理学家解决史诗性问题的作用:如果可能,在合理的时间内发布软件解决方案。 让我们分别停下来,以免完全感到无聊,对团队一个部分的身体各部分的大小与另一部分的大脑的生产力之间的相关性进行分析。 倒咖啡,走吧!

如何成为专家


为了客观地理解为什么所指出的问题仍然不清晰,还有许多与人类牺牲有关的``宗教''纠纷,您需要分心,微笑并用菜刀将IT专家的生活画在桌子上的虚线上,并用正方形表示意味着已获得的知识。


有趣的是,通常甚至在专业大学中,也没有足够的知识来进行专业编程,而专家的能力直接取决于懒惰者的精神斗争:拿一本书/代码几个小时或在电视前喝一罐啤酒倒下。 显然,只有一小部分人能够承受社交网络,电视连续剧,在线游戏和无私的学习,但是即使像僧侣一样,他们每天不断地牺牲自己的一部分生命,他们也可以轻松地理解一种,很好的,有时是两种工业编程语言以及几种语言。相关技术。 还有胡子,退休金开始了,而蜜蜂又种了蜜蜂。

但是,面对如此困难,事实证明,成功获得的知识仍然不够,需要在开发项目中不断进行专业化,最好是在最后期限之内,因为立即快速正确地书写技能很快就会丢失。

结果,用刀只能切出几个正方形,通常,右边越多,正方形就越少,因为孩子出生了,熟人出现了,爱好也增加了,所以您至少要至少在晚上为自己生活一点,最后再得到足够的小坦克。

一位武术专家可能是一个非常可理解的比喻,他是一名武术专家,他放学后离开沃罗涅日到中国,在修道院里待了10年,用手指把指关节filled在肩膀上,用剑割掉了生殖器,每天训练20个小时。 一位战士甚至会很高兴知道几种汉语方言,但是有一天他会遇到一个皮肤黝黑的家伙,他一直致力于卡波耶拉 。 在信号层面上,他们很可能会互相理解,并且能够为软件项目选择技术,但是不幸的是,最常见的是,您必须遇到一位角色扮演和科幻小说的狂热粉丝-穿着绝地服装,手里拿着塑料光剑。

复制粘贴,框架和科幻小说


显然,只有极少数人能够如此无私地学习和学习真理,而在现实生活中,关于技术和编程语言的会议和争议主要发生在不同且时尚的“系列”爱好者之间,他们常常不知道IP和TCP之间的区别。 外部激进营销使问题更加严重-大多数大型IT供应商都在利用激增的信息渠道积极“吸引”关注者。 您不需要走很多例子-Mozilla在推广Rust,Google在推广Go,Oracle感兴趣(?)在推广Java,Microsoft在开发C#,JetBrains是Kotlin,外星人是Haskell,并且在以AI和ML(神经元)为幌子的情况下,科学界也不会为之兴奋。和数据撒旦主义,卖了很多钱。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


当《权力的游戏》(Game of Thrones)的粉丝开始与女高音家族的粉丝争论面向方面的编程mixin闭包的好处时,剩下的就是用来自西藏和麦当劳土豆的圣洁的沙子真诚地笑着并撒在辩论者身上。 您将无法等待任何有用和客观的结论,您将更加困惑-甚至更糟的是,您将获得病毒般的流行,并开始穿着条纹外套。

传统与“正确性”


事实是,例如,组装铁制汽车是一项昂贵而漫长的任务:您需要材料,焊接,知识,房间,形状正确的女孩海报等。 编写程序(尤其是不单独编写程序)非常普遍。 虚拟创造力-爆炸式增长,并继续破坏和伸展世界。 充满数字内容的海洋,通常毫无头绪,原始的,所有作家和艺术家都泛滥成灾。 由于“自我表现”的相对简单性,在第二次世界大战之后的较短时间内,世界上不仅出现了程序,而且出现了许多编程语言。 编写新的编程语言并不难,而且要困难得多-要使其流行起来。 历史上曾经发生过这样的事情:学会“正确编写”的语言(例如C ++,Java,ECMA262)现在很流行,而“后来发现并似乎更好的语言”(例如C#,Python3,Rust,Kotlin)不太受欢迎。 选择一种“更正确的”语言,会冒找不到足够的开发人员了解这种语言的风险,或者可能会出现这种语言只是停止开发或升入永恒,例如Haskell。 因此,在常识的指导下,他们通常会选择传统的技术,即使不是很“正确”和一致的,也充满了拐杖和成长的痕迹,但经过测试,流行和发展。


在活跃的开发性书写狂(特别是在前端的方向上,尽管npm也很有趣)的背景下,我要警告不要过分使用库和框架 。 重要的是要查看框架的开发历史,开发人员的队伍(技术越简单,惊喜越多)以及版本支持的持续时间。

通常,在开放源代码项目中,通常不需要长时间维护框架(例如3-5年或更长),这是老套,昂贵且乏味的。 因此,通常,在获得足够数量的“拐杖”后,一两年内就会创建下一个版本,我建议以前版本的用户转移他们的项目...自己动手做,因为先前的版本将不再更新,并且其中的安全错误也不会得到修复。 这种“不负责任”的例子就是大海。

通常 ,商业图书馆和框架不会遭受类似的儿童期疾病(尽管并非全部,您都需要仔细阅读文档并彻底研究此问题),并保持5年或更长时间的向后兼容性。 请特别注意这一点,否则您将突然不得不从头开始重写您的Web解决方案!

通常,在这一点上,最好使用关于山雀和起重机的谚语。

新的或...完成


开发中另一个非常流行的心理问题是在“从头做”和“准备好”之间进行选择。 我将告诉您一个秘密-每个人都想成为神,新手开发人员,顺便说一句,这很正常,他们想抽空并在履历表中获得一个条目,然后选择“从头开始”。 但是,通常情况下,他们会因为六个月或一年后的无聊而离开,并且通常是由于缺乏经验,因此不得不从头开始一遍又一遍地重写他们的作品。 通常,经验丰富的少林和尚通常会确保自己免受儿童的错误和意外的影响,选择现成的解决方案和库,并将剩余的空闲时间用于开发此Web项目功能专有的非标准产品。 而且不会很无聊!


一个良好的关联可能是选择一个数据库-用于Web项目,Oracle数据库或MySQL数据库的数据库(是的,我知道它们现在由一家公司开发)。 根据经验-在MySQL中,即使在高负载下,也有99%的Web开发任务可以很好地解决,并且速度很快。 如果结果没有不同,为什么...? :-)

因此,通常一个软件项目现在由一堆现成的,经过测试的库和框架组成,具有良好的支持期限,并且仅占该项目特定功能的一小部分。 恕我直言,这是正确的。

困难而漫长还是...快速而容易?


这也是许多无休止的争执的已知原因。 实际上,现代IT技术和编程语言大致分为两部分:对大多数人来说很简单(无需深入研究,几天就可以理解)而对少数人则很难(它需要认真而漫长的专业化,需要几个月的理解时间)。 如上所述,大多数人不喜欢学习,因此,如果您实施正确而可靠的技术,您将不会成功,因为没人能完全理解它,并且您会玩带有黑匣子的俄罗斯轮盘赌。 一个流行的例子: rediscassandra之间的选择-不同复杂程度的产品。 或者,另一个示例:python或C ++。

实际上,在简单的语言中,编程通常要快很多个数量级-将python脚本与5行进行比较,将类似的C代码与100行进行比较。 但是,通常,“简单”语言和通用技术有时工作起来会慢得多,并且消耗更多的RAM :-)毕竟,您必须付出一切。


尽管如此,“简单”语言越来越多地用于解决软件项目的大多数任务,在这些项目中,不需要超速和RAM的特殊要求。 铁变得越来越便宜。 PHP现在对于快速的Web开发非常流行,而python具有清晰易读的语法,可用于一般任务和机器学习。 JavaScript非常方便,不仅可以自动化Web界面,还可以...在Node.js上创建真正快速的服务器应用程序 即使使用其原始语法,Go仍可以使您在执行系统任务时无需更多功能,但要理解Java就更加困难了,而且对于初学者来说,开发Kotlin可以更轻松,更容易地访问一个数量级的移动应用程序。 在Rust中运行高负载应用程序而不必深入研究C ++中内存管理的复杂性,可能会降低风险。 但是没有人会想到用Java写游戏,回想起流行的Minecraft,它只能在离显示器10米的距离上玩,着眼睛:-)

因此,对于每项任务,建议选择一种经过特定的,流行的工具。 使用的现成工具越多越好。

这是可笑的,但是在当前的现实中,甚至语言的选择都没有,但是语言特征的选择可能对成功产生决定性的影响。 例如,如果一个团队没有面向对象编程的经验,并且没有设计模式的知识,那么您可以编写一个公然的对象动物园,以至于每个人都可以理解在一个整体文件中使用100个函数来解决问题,而不是隐藏在办公室里数百个对象中站立而不是头部,耳朵而不是腿的怪物。 这就是为什么通常没有简单的语言(例如python,php,javascript,ruby)不会为发展的绘画狂和完美主义提供多余的机会,而是专注于清晰度,歧义性(python)和简洁性(php)使得成功越来越有可能。 当用C ++制作网站时,故事是如此受欢迎,后来又变成了一场噩梦,这并非毫无道理。

这里有一个很好的类比,是一个昂贵且难以“调配”中世纪骑士和流氓枪械的流氓的例子。 您可以训练自己的整个生命,并成为多线程Java武士,但是当您遇到一个用python或Go编写的相似且简单得多的解决方案的学生时,您可能会突然终止自己的生活。

建筑师和建筑


的确,在10到15年前,有必要长时间阅读和阅读厚书,以了解将对象及其相互作用放置在单独的服务器和群集(j2ee,corba,com)上的原理。 这种繁荣的建筑和建筑师的回响仍然可以在像Spring这样的奇特作品中找到。 但是时代在变化,技术变得越来越强大且负担得起。 通过在Amazon的某个位置部署几个免费的Apache Web服务器,MySQL数据库和RabbitMQ队列,您可以解决绝大多数应用程序服务器配置中以前存在的大多数问题,这些问题是绝大多数用户可以理解的。


如果任务是支持大量的网络连接,则可以使用Node.js机器集群,或者更好的使用Erlang的机器集群,并且比用Go或C ++编写自己的服务器解决方案更安全地睡眠。

如果您需要在流程中不断进行研究,从10-20种机器学习模型中选择一种并快速将其部署到云中以提供客户服务,那么具有大量库的python当然将成为非常方便实用的解决方案,依此类推。

当然,在狭义的项目中,当然仍然需要对OOP, FP ,体系结构和计算机科学有深入的了解,但是越来越多的情况足以知道从哪个块中组装解决方案,这通常会使软件系统更快地达到目标。

团队配对


基于上述内容,很明显,团队很可能只会在为该项目选择的一组技术的有限框架内进行开发。 单元将开始挖掘相关主题,其中一小部分将阅读专业文献,但是,a,这是一个特例。 因此,建议选择那些已经使用过指定语言/库的人员,可以在简历和面试中进行检查。 而且,只有那些真正无法被电视节目和社交网络击倒的人,才能在收到由动脉血预先签署的合同后才能获得“成长” :-)

但是,在非标准项目中,您将必须至少找到一名了解其他事情并且非常出色的开发人员,但python,ruby,php,javascript,go,perl,bash,chanson除外。 战斗机了解算法,设计模式,网络标准和OOP的机会大大提高。


如果该项目与机器学习有关,并且您需要深入研究某些东西,那么您将必须找到一位真正的数学分析师,最好具有科学学位和python知识。 我是认真的-对于机器学习,如果没有专业教育,您需要每天努力学习数小时(概率理论,线性代数,最小二乘法,统计学,贝叶斯定理及其技术),即使不是几年,也要几个月。

流程还是技术?


您通常会发现使用看似“不合适”的编程语言或库集编写的大型软件项目。 例如,人们经常会遇到庞大的bash控制脚本或庞大的科学库和框架,这些语言和框架可在...上使用Dodbyba 鸭子类型的 python进行精确计算。 秘诀在于严格的流程和实践。 使用:

  • 初步设计,压力测试和风险分析
  • 自动化的单元和集成测试(覆盖率最好为100%)
  • 通用编码标准
  • 良好的代码和系统组件文档
  • 团队内部最大程度的透明沟通
  • 监视和分析服务器环境

原则上,您可以根据可以使用多年并能吸引客户的任何技术来创建软件解决方案。 反之亦然,使用带有黑匣子的高价“炫耀”,而不是深入研究技术细节,鼓励疏忽大意和个人利益而不是团队利益,您可以尝试启动一个项目数月,纠正一个错误并引发数十个问题-不幸的是,这种情况很普遍。


总结


总结并确定优先级:

  • 越来越多的人可以观察到这样一种情况,即启动软件项目的速度恰恰是成功的决定性因素。 比起快速发布对客户有用的解决方案并为下一次抽奖收集反馈,糟糕的是,不必要地长时间冗长而艰苦的工作
  • 仅当使用最多具有足够支持期限的现成组件,框架和库时(考虑到Web系统的预期寿命),才能快速入门。
  • 不幸的是,对算法和体系结构知识的需求较少。 通常,我们欢迎您解决类似问题的经验以及使用工具箱的实践以及云提供商的实力。
  • 无需限制自己,只用一种技术和最好的一种编程语言就可以完成所有工作-握住孩子手中的枪支比武士对所有有意识和无意识生活进行的武术学习更有效。 完美主义和理想化扼杀了软件系统。 为项目中的每个任务选择合适的武器。 完成后将剩下的精力集中在非标准上。
  • 选定的技术应该简单,清晰,并且大多数团队都可以使用。 看一下他们主要编写了一个类似项目的内容,然后自己掌握这项技术。 不要使用Haskell使托管自动化,也不要使用C ++编写网站:-)如果您的项目“起飞”并开始开发,则只有这样,您才可以考虑使用更复杂的技术和编程语言来重写其一小部分。 但是通常,软件项目要么没有达到这个阶段,要么几年后才达到。
  • 该框架使您可以将软件项目的启动速度提高几个数量级。 确保检查良好文档的可用性,并指定对框架的支持期限,以便在2-3年内完成完全重写不会有任何麻烦。 这是我们客户经常遇到的情况。
  • 不要相信团队的学习能力-生活中有太多分心的事情,情况只会越来越糟。 仔细研究您的简历,检查证书和考试,并尝试将重点放在实际结果上。 至少在创建工作解决方案的第一个版本时,将实践置于理论之上。
  • 技术和编程语言不是成功的关键因素。 专注于构建最必要的流程并实施关键的开发和设计实践。 通常,正确的过程可以保证导致“正确”的结果。 « » « », . , 2-3 .

, , !

Source: https://habr.com/ru/post/zh-CN436460/


All Articles