首页 文章 精选 留言 我的

精选列表

搜索[智能扫码],共10000篇文章
优秀的个人博客,低调大师

好码分享:开源算法框架Open Tabu Search求解VRPTW的JAVA代码

程序猿声 代码黑科技的分享区 一、前言 很早之前就想写这篇文章了,由于各种不可描述的原因拖延到了现在,今儿就把坑给填上吧~ 前排提示:小伙伴们可以收藏下这篇文章哦,说不定那天你们就用上了。因为真的是很干货哦! 二、Open TS算法框架 做元启发式的小伙伴都知道,一开始需要学习一些固定的算法框架,这是理论基础。有了理论基础以后就可以针对各种奇奇怪怪问题把这些算法框架给套上去,总能跑出一些结果,无论是好的差的。 经常有很多人来问我,这个问题用什么算法比较好啊?那个问题用什么框架比较合适?一开始我还很耐心的跟他们扯淡说:没有最好的,只有更好的。。。其实不是的,按照我这几年做启发式的经验来说,算法框架这东西其实吧,只要是一个类别的,基本都不会有太大差别(比如TS和SA、LNS和ALNS、GA和AFAS等等)。我们做算法开发的时候,更应该把重心放在一些问题特性的推导,或者搜索算子的思考上。 好了又扯远了……今天的主题是分享一份代码,一个开源的Tabu Search框架,以及如何利用该框架进行二次开发。先介绍下今天的主角:Open TS。这个是由Robert Harder开发的一个基于java平台tabu search算法框架。用他的话说就是: Use these classes to help build a structured and efficient Java tabu search. 该package包含了实现一个tabu search框架需要的各种元素,可以说得上非常全面了。大家在编写tabu search相关的算法时,只需要extend相关的class或者implements相关的interface即可。 这就使得我们可以将更多的时间和精力放在算子的设计以及其他问题特性的考虑上,而不是将大量的时间浪费在维护算法框架上。当然了,这个框架由于考虑了很多general的东西,同时也做了很多额外的异常处理什么的从而使得代码更为健壮。thus,代码的速度可能就会有一点点损失。 嗯……我这里指的损失是相对那种超级大神级别的人来说的,毕竟他们写代码会把各种冗余的计算去掉,把所有的可能slow down算法速度的因素都杜绝掉,恨不得直接用汇编写的那种……咱这些普通打工人也还没到那么牛逼的地步嘛! 总之,这个算法框架还是非常牛逼的,平时撸撸论文,做做项目直接拿来做二次开发也是一个不错的选择啦。 三、二次开发 其实上面给了很多类,但是对于一个单线程的tabu search来说,并不需要用到所有的class,只需要继承一些基本的元素,然后针对你的问题将他们special化就行啦。下面我介绍下二次开发的要实现的一些东西吧。 1. SolutionAdapter 求解任何问题,首先还是要定义该问题的solution结构了。只需要extend Open TS的SolutionAdapter类即可,该类中只有一个成员变量为: privatedouble[]objectiveValue; 为该解的目标值向量,然后你就可以在你自己的solution中定义问题的其他变量了。比如存储路径啊,解的其他中间变量等等。 2. TabuSearchListener 该类呢为接口类,里面有几个抽象方法需要实现的,分别为: publicvoidnewBestSolutionFound(TabuSearchEventevent){} 找到一个全局最优解时,要做的事情可以写在里面。 publicvoidnewCurrentSolutionFound(TabuSearchEventevent){} 找到一个新的当前解时要做的事情可以写在这个函数。 publicvoidtabuSearchStarted(TabuSearchEventevent){ 算法开始时触发的事件。 publicvoidtabuSearchStopped(TabuSearchEventevent){} 算法结束时触发的事件。 基本上重新写一下上面几个抽象方法就可以满足大部分的需求了。当然里面也定义了一些nonimprove相关的时间,可以作为shake使用。 3. ObjectiveFunction 该interface比较重要,继承以后需要实现下面这个抽象方法: publicdouble[]evaluate(Solutionsolution,MoveproposedMove){} 它表示评估当前解solution经过proposedMove以后形成的邻居解的目标值向量,就是前面SolutionAdapter中那个objectiveValue哦。这是什么意思呢,其实在算法实现中,我们一般不直接生成邻居解,而是生成一个称之为 的东西,这是个什么东西呢,画个图: 其中我用紫色标出来的就是一个 ,简单来说他记录了生成邻居解需要对当前解进行的一些操作,比如exchange(6, 15)。 因此每次生成邻域时,可以先生成邻居解对应的 ,然后去评估每个 对应的邻居解的cost,以比较各个邻居解的好坏。 4. ComplexMove 为interface,该算法框架的邻居解是通过当前解+move获得的,因此你的问题中设计的operator算子需要实现该接口,它有一些抽象方法如下: publicabstractvoidoperateOn(Solutionsoln); 该方法其实是更上一层extends来的,表示对该move对soln执行相应的操作,比如exchange(1, 2)或者relocate(1, 3)等等。 publicabstractint[]attributesDelete(); 执行该move时,删除一个元素时返回的信息提供给tabu list记录。比如{1, 3}表示exchange了1和3,那么tabu list就要记录起来,防止后面的迭代中再进行exchange(1, 3)这样的操作。 publicabstractint[]attributesInsert(); 执行该move时,插入一个元素时返回的信息提供给tabu list记录。和删除时类似的。 5. MoveManager 这也是一个interface,是不是很爽,只需要implements相关的接口即可完成一个算法,简直不要太轻松!它的抽象方法只有一个: publicMove[]getAllMoves(Solutionsolution){} 这个方法是需要我们自己实现的,而且非常重要,因为这里定义了我们设计的算子所生成的move集合。 我觉得这个框架最好的地方就是这里了,他把所有的move都放在一起集中进行管理,后面进行约束变更的时候只需要修改这里的生成规则即可。比如客户i不能插入路径j,那么你在这里生成的时候就进行这些限制即可。 6. ComplexTabuList 这是一个类,表示tabu search中的禁忌表,里面有一个多维的tabu list可以记录很多信息: privateint[][][][][]tabuList;//Datastructureusedtostorelist 同时该类已经实现了setTabu和isTabu的方法。这两个方法需要结合之前设置的attributesInsert()和attributesDelete()方法一起使用,如果做出修改那么需要修改相应的这几部分,特别是tabu list要进行修改的话。。。 四、实例 好了以上就是一些简单的介绍,当然这样介绍可能大家没什么感觉,因为这东西在没有对代码有一个很好的全局掌控之前,很难体会到其中的精髓,反而很多人因为其中巨大的代码量感觉极为繁琐。 毕竟用别人的东西,万一出错了都不知道怎么调。这里呢为了让大家更好的熟悉这个框架,我贴上了一个使用该框架实现一个求解VRPTW问题的例子,这个代码是来源于GitHub(好像是意大利都灵理工大学一些masters的课程大作业吧……)原链接为oma-vrptw。 https://github.com/oma-vrptw/oma-vrptw 这个代码本身也有很多值得借鉴参考的地方的,比如它里面实现了一个relocate(代码中叫SWPA MOVE,但是我觉得relocate更合适点)算子,在评估一个move的时候就用到了此前我们讲过的以O(n)复杂度计算邻居解的一些操作: 如何实现一个高效的启发式算法?(VRPTW篇) 这个算子的效果还可以的,在Solomon的标准算例中C系列大部分能跑到最优,速度更是快得飞起。大家阅读源码时照着我上面贴出来的思路看即可。算例呢我也整合好了,我对源代码做了一些修改,使得他能够正常运行(不然待会又有很多人跑来问我代码咋不能运行呢?),更改算例在以下位置即可更改。 单线程tabu search的主体呢是在SingleThreadedTabuSearch这个类中,执行一次迭代的逻辑都写在了protected void performOneIteration()这个方法里面。 其实要写的比较高效的话,每个算子生成的move都应该定制好自己单独的evaluate函数,示例只写了一个算子,如果move是由多个算子生成的话,需要判断下move属于哪个算子的,然后进行相应的evaluate,可以更改ObjectiveFunction的evaluate函数成如下形式: 当然啦,你也可以修改框架中的代码以达到更多个性化的功能,不过我是不太推荐这样做的,因为别人封装好的东西,你一整的话,出错了都不知道去哪里找。不过熟悉以后可以尝试修改一下底层的代码。我就对那个tabu list进行了修改,因为感觉给的那个不是很好用吧~ 五、代码下载 我把修改过的代码放在了GitHub上,地址为 https://github.com/dengfaheng/omatest 好了,大家可以慢慢去看代码了。。。have a nice day!看在小编这么勤劳的份上,帮我点个在看呗~万一你的老板喜欢看微信的看一看,看到你又在微信上学习代码,ta肯定要高兴得不得了呀!你就可以大胆告诉他: ‍‍‍‍‍‍ 推荐阅读: 干货 | 想学习优化算法,不知从何学起? 干货 | 运筹学从何学起?如何快速入门运筹学算法? 干货 | 学习算法,你需要掌握这些编程基础(包含JAVA和C++) 干货 | 算法学习必备诀窍:算法可视化解密 干货 | 模拟退火、禁忌搜索、迭代局部搜索求解TSP问题Python代码分享 记得点个 在看 支持下哦~ 本文分享自微信公众号 - 程序猿声(ProgramDream)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

可视化搭建系统码良 v1.0.6 发布,支持组件商城

Bug Fixes element-ui 降级,解决 codepanel 标题栏数据不更新问题 (ea0f350) vue-router 路由以后,页面适配错误 (63ad4b2) 不上传psd源文件 (cb835c1) 不上传psd源文件 (25e78b8) 修护psd导入资源动画设置失效bug (4a64a73) 修护编辑器在保存的时候,保存失败的bug (715266d) 修护预览页面没提前保存,以及保存过程截图性能慢的问题 (230d39d) 修改动画功能描述图片 (45f0661) 修改数据熟悉外部修改数据,不能同步到编辑器中的bug (9de8893) 修改点击按钮前往商城的逻辑 (f276d18) 删除无用代码 (35a812e) 动画编辑器禁止状态切换失败bug (23561fc) 升级vue版本到最新2.6.11 (b577ca5) 去除默认组件,添加添加组件的引导 (c6ba88c) 对tip添加最大宽度 (ab33be0) 引入vue最新版本 (fa809db) 比例调整 (a0e05ea) 添加商城文档更新 (3698035) 组件不可见时,不必重新计算尺寸;点击保存,mouse事件冒泡,引发组件位置错误计算 (0377aab) 适配Array取值#22(2198461) 颜色实时更新 (9f472b3) Features 属性编辑面板显示组件版本 (512cd75) 新添加动画编辑器,可实时预览 (af816ab) 样式设置添加文字大小控制面板 (3582df7) 添加图片裁剪功能 (bfb8401)

优秀的个人博客,低调大师

硬核干货:一位菜鸟码农的架构师“封神”之路!

云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 几年前有人问我:你是怎么成为一名软件架构师的?我们就此探讨了必备技能、经验,以及储备相关知识所需的时间和精力。 除此之外,我也回顾了自己走过的路、使用或尝试过的技术,以及我从那些五花八门的工作中学到的东西。 架构师技术路线图 软件架构师是什么? 在进行深层次的探讨之前,我们先来看两个定义: 软件架构师是指那些制定高级设计决策,并确定技术标准(包括软件编程标准、工具和平台)的软件专家。这之中的首席专家就是总架构师。 软件架构是系统的基本组织构成,这种组织主要体现在其组件、组件之间的关系、组件与环境之间的关系,以及决定系统设计与演化的原则。 架构的“层级” 架构主要可以抽象成以下几个层级。不同层级所需的技能也不同。 尽管对层级的分类有很多种标准,但是我最喜欢把架构分成三个层级: 应用级:最低层级的架构。只关注单一的应用。层级低,但是很详细。这方面的交流一般是在一个开发团队内展开。 解决方案级:架构的中间层。关注一或多个满足业务需求的应用(也就是商业方案)。这之中有些设计是高层次的,但大部分还是低层次的设计。这种层级架构的交流就开始涉及多个团队了。 企业级:架构的最高层级。关注多个方案。这种架构的设计层次高且抽象,因此也需要方案级和应用级的架构师对此进行细化。这种层次的架构就需要多个组织进行沟通了。 有时候,架构师也被看做不同工作组之间的粘合剂。以下是三个例子: 横向:在业务部和开发人员或是不同的开发团队之间架起沟通的桥梁。 纵向:在管理者和开发人员之间架起桥梁。 技术:将不同的技术或应用整合在一起。 软件架构师的日常 要了解架构师的必备技能,我们得先知道架构师主要做什么。 我认为架构师最重要的活动包括: 定义和确定所需的开发技术与平台。 定义开发标准,如编程标准、工具、审核流程、测试方法等。 对确定和理解业务需求提供支持。 设计系统并根据需求做出决策。 对架构定义、设计和决策进行讨论记录。 检查并审核架构与代码,比如检查前期确定的模式与编程标准是否被正确实施。 与其他部门和架构师合作。 对开发人员的引导及咨询。 将高级设计细化,并转化为较低级的设计。 PS:架构设计是一项持续性的工作,尤其是在敏捷软件开发过程中。因此,我们会一遍又一遍地重复这些工作。 软件架构师必备技能 为了支撑上述工作需要很多重要的能力。就我个人的经验,每个软件架构师应该具备如下十项技能: 设计能力 决策能力 化繁为简能力 编码能力 文档架构能力 沟通能力 评估能力 平衡能力 指导、答疑能力 营销能力 设计能力 什么是好的设计?这可能是最重要和最具挑战性的问题。要把理论和实践区别开来。 根据我的经验,两者兼而有之是最有价值的。让我们从理论开始: ①了解基本的设计模式:设计模式是架构师设计开发可维护、可扩展系统的一项最重要工具。 通过设计模式你可以设计解决通用问题的可重用方案。由 John Vlissides,Ralph Johnson,Richard Helm,Erich Gamma 撰写的《设计模式:可重用面向对象软件的要素》一书,每个从事软件开发的人都有必要阅读一番。 尽管上述模式发布于 20 多年前,其仍然是现代软件架构的重要基础。例如,本书描述了模型-视图-控制器(MVC)模式,该模式应用于许多领域,也是一些新模式(如 MVVM)的基础。 ②深耕模式和反模式:如果你已经知道了所有的基本 GoF 模式,那么可以用更多的软件设计模式扩展你的知识或者深入你感兴趣的领域。 我最喜欢的应用程序集成相关的内容之一是 Gregor Hohpe 编写的《企业集成模式》一书。 本书适用于两个不同环境的应用程序需要交换数据时,无论是一些传统系统的旧式文件交换还是现代微服务体系结构。 ③了解质量测量:定义架构远不是终点。指引手册和编码标准的定义、应用和管理是有原因的,这么做是因为质量和非功能性需求。 你想拥有一个可维护、可靠、可适应、安全、可测试、可扩展、可用等的系统,而实现所有这些质量属性的一个方法就是应用好的架构工作。 你可以在维基百科上了解更多关于质量衡量的信息。理论很重要。如果你不想成为一名站在空中楼阁上的架构师,那么实践同样重要,甚至更重要。 ④尝试了解不同的技术栈:这是成为一个更好的架构师的一项重要工作。尝试新的技术栈并至上而下的学习他们。 不同的技术可以给你带来不同的设计理念和模式。对新技术的学习最好不要浮于表面,应该去多实践深入感受解决的痛点和其存在的问题。 架构师不仅需要涉猎广泛,在某些领域也要有深厚的知识。当然并不需要掌握所有的技术,你需要对你所在领域最核心的技术有扎实的了解。 你也可以尝试其他领域的技术,例如,如果你深入 SAP R/3,你就应该也去尝试一下 JavaScript,反正亦然。时刻保持好奇心并付诸实践。还可以去试一些你讨厌了很多年的技术。 ⑤分析和理解应用模式:看一下当前的任一比较流行的框架,例如 Angular。可以在实践中研究很多模式,例如“观察者模式”。 尝试了解它如何在框架中应用,为什么要这样做。如果真的很有时间且认真,可以更深入地了解代码并了解其实现方式. ⑥加入一些用户组,例如 Meetup。 决策能力 架构师需要能够做出决策并将项目或整个组织引导到正确的方向。 ①知道重点:不要把时间浪费在不重要的决定或者行为上。学会抓住重点。据我所知,目前还没有一本书讲这方面的内容。 个人评估某件事是否重要,通常考虑如下两点: 概念完整性:即使您决定以一种方式做到这一点,坚持下去,即使有时以其他方式更好地做到这一点也是如此。通常,这会让概念整体上更简单,简化可理解性并简化维护性。 一致性:例如,如果您定义并应用命名约定,它就无关于大小写,而是以相同的方式在任何地方应用它。 ②优先级:有些决定是非常关键的。如果不尽早决策,会产生很多冗余到后期不太能删除的方案,导致维护困难,甚至于导致开发人员无法继续开发,直到给出决策。 这种时候,往往给出坏的决定好于没有决定。当然,遇到这种情况时优先选择当前方案中的最优解。 这里我建议看看在敏捷软件开发中广泛使用的加权最短作业优先(WSJF)模型。尤其是时间关键性和风险降低是评估体系结构决策优先级的关键。 ③明确自己的职责:不要决策在你能力或者职责范围之外的事情。这是至关重要的,如果不考虑的话,它可能会严重破坏你架构师的地位。 为了避免这种情况,一定要与你的伙伴们明确你承担的责任及角色。如果架构师不止一个,那么你应该尊重当前的组织架构。 作为级别低的一方,最好是给出建议不是决策。此外,我建议始终和同伴一起评审关键决策。 ④评估多个选项:在决策时,一定要有一个以上的选择。在我参与的大多数案例中,有不止一个(好的)选择。 只有一个选择是不好的,两个方面:首先,似乎你没有做好你的工作,其次,它阻碍了做出正确的决定。 通过定义度量标准,可以基于事实而不是直觉(例如许可证成本或成熟度)比较选项。这通常会导致更好、更可持续的决策。 此外,向不同的利益相关者推销决策也更容易。此外,如果没有正确评估选项,则在讨论时可能会遗漏一些因素。 化繁为简能力 请记住 Occam 剃刀的解决问题的原则,它表示更喜欢简单。 我把这个原则解释为:如果你对这个问题有太多的假设要解决,那么你的解决方案可能是错误的,或者导致不必要的复杂解决方案。为了得到一个好的解决方案,应该减少(简化)假设。 ①方案规整:为了简化解决方案,从不同的位置角度评估它们通常有助于清理、规整解决方案。尝试通过自上而下和自下而上的思考来形成解决方案。 如果您有一个数据流或进程,那么首先考虑从左到右,再从右到左。可以提出一些问题,比如:在一个完美的世界里,你的解决方案会怎么样?或者:“X 公司/个人会怎么做? 其中 X 可能不是你的竞争对手,而是 BAT之一。这两个问题都迫使你减少 Occam 的 Razor 建议的假设。 ②退一步:经过激烈和长时间的讨论,得出的结果往往是高度复杂的草案。你永远不应该把这些看作是最终的结果。 退一步:再看一眼大局(抽象层面)。还是有意义的吗?然后在抽象的层次上再进行一次重构。 有时,停止讨论并在第二天继续讨论会有帮助。至少我的大脑需要一些时间来处理和想出更好、更优雅和更简单的解决方案。 ③分而治之:把问题分成小块来简化。然后独立解决。然后验证这些小块是否匹配在一起。退一步看一下这个的整体情况。 ④重构不是坏事:如果找不到更好的主意,从更复杂的解决方案开始完全可以。如果解决方案遇到麻烦,您可以稍后重新考虑解决方案并应用您的学习。 重构不是邪恶的,但是在开始重构之前,请记住要进行以下工作: 进行足够的自动化测试,以确保系统的正确功能。 从利益相关者得到的支持。要了解有关重构的更多信息,建议阅读《重构 改进现有代码的设计》,作者是 Martin Fowler。 编码能力 即使作为一个企业级架构师,最抽象的架构层次,你仍然应该知道开发人员每天都在做什么。 如果你不明白这是怎么做到的,你可能会面临两大问题: 开发者不会接受你的嘴炮。 不了解开发人员的实践需求和面临的困难。 ①有一个辅助项目:这样做的目的是尝试新技术和工具,以了解当今和未来的开发方式。 经验是观察,情感和假设的结合(Kurt Schneider 的“软件工程中的经验和知识管理”)。 阅读教程或一些利弊是好的。但这仅仅是“书籍知识”。仅当你自己尝试事物时,才能体验到情绪并建立关于事物好坏的假设。 而且,使用某项技术的时间越长,你的评估就会越准确。这将帮助您在日常工作中做出更好的决定。 当我开始编程时,我没有代码完成,只有一些实用程序库可以加快开发速度。显然,在这种背景下,我今天会做出错误的决定。 今天,我们拥有大量的编程语言,框架,工具,过程和实践。只有您对主要趋势有一定的经验和粗略的了解,才能参与对话并引导开发朝正确的方向发展。 ②找到合适的东西去尝试:您无法尝试所有内容。这根本是不可能的。您需要一种更有条理的方法。 我最近发现的一种来源是 ThoughtWorks 的 Technology Radar。他们将技术,工具,平台,语言和框架分为四类:采用,试用,评估和保留。 通过这种分类,更容易获得新事物的概述及其准备情况,以更好地评估下一步要探索的趋势: 采用:已经准备好提供企业级服务。 试用:能够在一个承担一定风险的项目中尝试。 评估:还需进一步评估其对业务的影响。 保留:谨慎处理。 文档架构能力 架构文档有时更重要,有时则不重要。重要的文档例如体系结构决策或代码指南。 在开始编码之前通常需要初始文档,并且需要不断改进。其他文档可以自动生成,因为代码也可以是文档,例如 UML 类图。 ①代码整洁:如果做对的话,代码是最好的文档。一个好的架构师应该能够区分好的代码和坏的代码。 罗伯特·C·马丁(Robert C. Martin)所著的《代码整洁之道》一书是了解更多关于好坏代码的宝贵资源。 ②尽可能生成文档:系统变化很快,很难更新文档。无论是关于 API 还是以 CMDBs(配置管理数据库)形式出现的系统环境:底层信息通常变化太快,无法手动更新相应的文档。 例如:对于 API,如果您是模型驱动的,则可以基于定义文件自动生成文档,或者直接从源代码生成文档。有很多工具存在,比如 Swagger 和 RAML 是一些不错的初始选择。 ③必要而精简:无论您需要记录什么文件(例如决策文件),都应尝试一次只关注一件事,并且仅包含关于这件事的必要信息。大量的文档很难阅读和理解。附加信息应存储在附录中。 特别是对于决策文件,讲一个有说服力的故事而不是仅仅发表大量论据,更为重要。此外,这为您和您的同事节省了很多时间,而后者需要阅读。 看看您过去做过的一些文档(源代码,模型,决策文件等),然后问自己以下问题:“是否包含所有必要的信息才能理解它?”,“确实需要哪些信息,并且可以省略吗?”和“文档中是否有红线?”。 了解有关架构框架的更多信息: 该点也可以应用于所有其他“技术”点。我把它放在这里,是因为 TOGAF 或 Zachmann 之类的框架正在提供“工具”。 这些工具在文档站点上感觉很沉重,尽管它们的附加值并不限于文档。在这样的框架中获得认证可以教会您更系统地解决体系结构。 沟通能力 根据我的观察,这是最被低估的技能之一。如果你在设计上很聪明,但不能传达你的想法,你的想法可能会影响较小,甚至无法成功。 ①学习如何传达你的想法:在会议上进行协作时,知道如何正确的沟通传达你的想法,将其同步到你的同行是至关重要的。 我发现《 UZMO-用笔思考》是提高我在这一领域技能的好资源。作为架构师,你通常不仅会参加会议,而且通常需要主持并主导会议。 ②大型的演讲:将你的想法呈现给小型或大型团体应该对您来说可行。如果对此感到不舒服,请开始向你最好的朋友介绍。 慢慢扩大小组。这是你只能通过离开自己的舒适区来学习的东西。请耐心等待,此过程可能需要一些时间。 ③找到合适的沟通方式:不同的利益相关者有不同的利益和观点。它们需要在各自的层面上用不同的方式单独解决。 在你交流之前,退后一步,检查你想分享的信息是否有正确的层次,关于抽象性、内容、目标、动机等。 例如:开发人员通常对解决方案的非常小的细节感兴趣,而经理则更喜欢知道哪个选项能节省最多的钱。 ④经常沟通:如果没有人知道,再香的架构也是毫无意义的。定期在每个组织级别上分发目标体系结构及其背后的思想。 安排与开发人员、架构师和管理人员的会议,向他们展示所需或定义的方式。 ⑤透明:定期交流只能部分缓解缺少的透明度。您需要使决策背后的原因透明化。 特别是,如果人们不参与决策过程,则很难理解和遵循其背后的决策和理由。 ⑥随时准备发表演讲:总有人有疑问,你想马上给出正确的答案。尽量把最重要的幻灯片放在一个统一的集合里,你可以展示和解释。它为你节省了很多时间,也给你自己带来了安全感。 评估能力 ①了解基本项目管理原则:作为架构师或首席开发人员,您经常被要求估算实现您的想法:多长时间、多少人、哪些技能等。 当然,如果你计划引入新的工具或框架,你需要对这些“管理”问题有一个答案。最初,你应该能够给出一个粗略的估计,如天,月或年。 别忘了,它不仅仅是关于实现,还有更多的因素要考虑,比如需求管理、测试和 Bugfix。 因此,您应该了解所使用的软件开发过程中的工作。通过过去的使用数据,你可以得到更好的评估,并从中得出你的预测。 如果你没有过去的数据,你也可以尝试一些方法,如巴里 W 鲍姆的 COCOMO。 如果你被分配在一个敏捷项目中,学习如何正确地进行评估和计划:Mike Cohn 的《敏捷评估和计划》一书提供了这个领域的一个坚实的概述。 ②评估“未知”架构:作为架构师,您还应该能够评估体系结构对于当前或未来上下文的适用性。 这不是一项简单的任务,但是您可以通过手头的一组问题来准备,这些问题对于每个架构都是常见的。 它不仅关乎体系结构,还关乎系统的管理方式,因为这也让您了解了系统的质量。 我建议总是准备好一些问题并准备好使用。一般问题的一些想法: 设计实践:架构遵循哪些模式?它们是否得到正确使用?设计是否遵循红线或是否存在不受控制的增长?是否有明确的结构和关注点的分离? 开发实践:制定并遵守规范指南?代码的版本是怎样的?部署实践? 质量保证:测试自动化覆盖范围?静态代码分析到位且效果良好?同行评议到位? 安全性:有哪些安全概念?内置安全?渗透测试或自动安全分析工具到位并定期使用? 平衡能力 ①质量是有代价的:早些时候我谈到了质量和非功能性需求。如果过度使用架构,将会增加成本,并可能降低开发速度。你需要平衡架构和功能需求。应避免过度设计。 ②解决矛盾目标:矛盾目标的典型例子是短期和长期目标。项目往往倾向于构建最简单的解决方案,而架构师考虑的是长期的远景。 通常,简单的解决方案不适合长期的解决方案,并且有可能在以后被丢弃(沉没成本)。 为了避免实施方向错误,需要考虑两件事: 开发人员和业务部门需要了解长期愿景及其好处,以便调整其解决方案。 负责预算的经理需要参与进来,以了解财务影响。不一定要把 100% 的长远眼光直接放在适当的位置,但开发出来的成本大体在预算范围内。 ③冲突管理:架构师往往是不同背景的多个群体之间的粘合剂。这可能会导致不同层次的沟通冲突。 为了找到一个平衡的解决方案,同时也反映长期的战略目标,架构师的角色往往是帮助克服冲突。 关于传播理论的起点是舒尔茨·冯·图恩的“四耳模型”。基于此模型,可以显示并推论很多。但是,该理论需要一些实践,在交流研讨会上应该有经验。 指导、答疑能力 在咨询和辅导方面,积极主动可能是最好的选择。如果有人问你,那就太晚了。架构重构是尽量要避免的。 你需要以某种方式预见未来几周、几个月甚至几年,并为下一步做好准备: ①有远见:如果你参与在一个项目中,无论是传统的瀑布式方法还是敏捷方法,你始终需要对要实现的中长期目标有一个愿景。 这不是一个详细的概念,而是针对每个人都可以落地的路线图。由于无法一次完成所有工作(这是一段旅程),因此我更喜欢使用成熟度模型。 它们给出了易于使用的清晰结构,并且每次都给出了当前的进度状态。对于不同的方面,我使用不同的模型,例如开发实践或持续交付。 成熟度模型中的每个级别都有明确的要求,这些要求遵循 SMART 准则,以便轻松衡量是否已达到要求。我发现一个很好的例子是持续交付。 ②建立实践社区(CoP):在一个共同兴趣小组之间交流经验和知识有助于分发思想和标准化方法。 例如,你可以每三个月左右将所有 JavaScript 开发人员和架构师聚集在一个房间中,讨论过去和当前的挑战以及如何解决它们或采用新的方法论和方法。架构师可以共享,讨论和调整其愿景,开发人员可以共享经验并向同行学习。 这样的交流不仅可以为企业带来极大的好处,而且对个人本身也非常有利,因为它有助于建立更强大的网络并传播思想。 还可以查看 SAFe 框架中的文章实践社区,该文章在敏捷环境中解释了 CoP 概念。 ③进行公开会议:误解或模棱两可的一个原因是缺乏沟通。在固定的时间段内,例如每周 30 分钟,与同事交流热门话题。 这次会议没有议程,一切都可以讨论。尽量当场解决小事。安排对更复杂主题的跟进。 云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 原文发布时间:2020-02-08本文作者:Justin Miller本文来自:“51CTO技术栈公众号”,了解相关信息可以关注“51CTO技术栈”

优秀的个人博客,低调大师

零代码一分钟创建 HTTP 服务(入门)

一、背景 如果你想快速搭建一个 HTTP 服务来测试,以往可能需要用 Java/Node.js 等语言写个脚本部署到服务器上,但现在你多了一种完全无需写代码方案:阿里云逻辑编排。 借助逻辑编排,不要一行代码不到一分钟就可以实现 HTTP 服务。 二、实现 2.1 创建编排实例 首先进入逻辑编排控制台 https://lc.console.aliyun.com/flow,点击 “创建编排实例”: 2.2 图形化设计 创建成功后,会有个弹窗提示是否使用模板,默认不使用,我们也不需要使用,点击“确定” 直接进入到实例的图形化设计界面。 我们先不管这么多概念,直接操作。 2.2.1 接收 HTTP 请求 点击 “当收到 HTTP 请求时”,会进入下图的界面: 可以看到有几个属性: HTTP Endpointe:就是 HTTP 服务的 URL,保存后会自动生成。而我们自己编程实现 HTTP 服务,则需要我们自己绑定域名到部署代码的服务器上; Method:就是通过 GET 或 POST 方法来请求该 HTTP 服务 请求正文 JSON Schema:非必填项,先不管它 现在我们就使用默认配置,继续往下。 2.2.2 设置 “HTTP 响应” 前面的操作,就相当于创建了 HTTP 服务器,能够接收 HTTP 请求。接下来就需要设置 HTTP 响应了。 跟着下面的动图点几下鼠标,在 “响应” 页面设置 Body 为你想返回的值, 这里是 hello world。 设置完成后点击右上角的 “保存”,保存后我们的 HTTP 服务就创建好了。这个时候再点击 “当收到 HTTP 请求时”,展开后就能看到我们的 HTTP 服务的地址了。 2.2.3 运行 接下来就可以使用我们创建的 HTTP 服务了。复制 HTTP Ednpoint,粘贴到浏览器中访问,就可以看到正确返回了 hello world: 另外,我们可以点击右上角的 “运行” 按钮来模拟访问刚创建的 HTTP 服务: 2.2.4 日志 我们还可以在看到该 HTTP 服务的所有访问日志,看到访问的时间和耗时等信息: 三、总结 通过上述实践,可以发现使用逻辑编排创建 HTTP 服务真的非常简单迅速,完全用不到一分钟。 当然,你可能会说,我的需求可没那么简单,我想要传入复杂的参数,还想要根据参数动态返回数据,逻辑编排能实现吗? 完全没问题!如何实现且听下回分解。 附 逻辑编排正在公测中,欢迎大家体验。如有任何问题,可以直接在钉钉群和我们联系。 逻辑编排 https://www.aliyun.com/product/logiccomposer 逻辑编排钉钉群号:21995282

优秀的个人博客,低调大师

零代码一分钟创建 HTTP 服务(一)

一、背景 如果你想快速搭建一个 HTTP 服务来测试,以往可能需要用 Java/Node.js 等语言写个脚本部署到服务器上,但现在你多了一种完全无需写代码方案:阿里云逻辑编排。 借助逻辑编排,不要一行代码不到一分钟就可以实现 HTTP 服务。 二、实现 2.1 创建编排实例 首先进入逻辑编排控制台 https://lc.console.aliyun.com/flow,点击 “创建编排实例”: 2.2 图形化设计 创建成功后,会有个弹窗提示是否使用模板,默认不使用,我们也不需要使用,点击“确定” 直接进入到实例的图形化设计界面。 我们先不管这么多概念,直接操作。 2.2.1 接收 HTTP 请求 点击 “当收到 HTTP 请求时”,会进入下图的界面: 可以看到有几个属性: HTTP Endpointe:就是 HTTP 服务的 URL,保存后会自动生成。而我们自己编程实现 HTTP 服务,则需要我们自己绑定域名到部署代码的服务器上; Method:就是通过 GET 或 POST 方法来请求该 HTTP 服务 请求正文 JSON Schema:非必填项,先不管它 现在我们就使用默认配置,继续往下。 2.2.2 设置 “HTTP 响应” 前面的操作,就相当于创建了 HTTP 服务器,能够接收 HTTP 请求。接下来就需要设置 HTTP 响应了。 跟着下面的动图点几下鼠标,在 “响应” 页面设置 Body 为你想返回的值, 这里是 hello world。 设置完成后点击右上角的 “保存”,保存后我们的 HTTP 服务就创建好了。这个时候再点击 “当收到 HTTP 请求时”,展开后就能看到我们的 HTTP 服务的地址了。 2.2.3 运行 接下来就可以使用我们创建的 HTTP 服务了。复制 HTTP Ednpoint,粘贴到浏览器中访问,就可以看到正确返回了 hello world: 另外,我们可以点击右上角的 “运行” 按钮来模拟访问刚创建的 HTTP 服务: 2.2.4 日志 我们还可以在看到该 HTTP 服务的所有访问日志,看到访问的时间和耗时等信息: 三、总结 通过上述实践,可以发现使用逻辑编排创建 HTTP 服务真的非常简单迅速,完全用不到一分钟。 当然,你可能会说,我的需求可没那么简单,我想要传入复杂的参数,还想要根据参数动态返回数据,逻辑编排能实现吗? 完全没问题!如何实现且听下回分解。 附 逻辑编排正在公测中,欢迎大家体验。如有任何问题,可以直接在钉钉群和我们联系。 逻辑编排 https://www.aliyun.com/product/logiccomposer 逻辑编排钉钉群号:21995282

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册