首页 文章 精选 留言 我的

精选列表

搜索[提高],共10005篇文章
优秀的个人博客,低调大师

提高Android开发效率的9个Web工具

在Google的广大支持下,便捷开发Android程序的Native工具层出不穷。其实Android开发涉及到的范围也不小,一些Web工具 有时候也会带来事半功倍的效果。有些甚至是一些native应用无法做到的。本文,将简单列举一下本人正在使用的一些工具,当然也会持续更新。 查找优秀的参考工程 codota是一个查找可供参考的Android工程的网站,它的爬虫已经采集了将近7百万个工程。比如我们想要写一段Android中检测网络可 用性的代码,我们只需要在搜索框中输入network,就会找到已经存在的优秀工程中关于这一逻辑的具体实现,确实为我们编码节省不少重复造轮子的成本。 另外,codeta还有支持Android Studio的插件,让查找源码更快捷。 地址:codota,Find Great Code Examples Android军火库 android-arsenal,中文意思 Android军火库,里面手机了Android中的SDK,Library以及Android开发的工具,满满的干货。有木有一种想见恨晚的赶脚,快来加入书签吧。 地址:The Android Arsenal – A categorized directory of free libraries and tools for Android 注意https协议的地址稍有问题,建议使用http协议的地址。 Grepcode grepcode.com是一个Java源码搜索引擎,对于查看Android代码也不例外。并且支持多个API版本快速切换查看。如果你的IDE关联本地代码后,让机器累的喘不过气来,那么就试一试这个在线的工具吧。 地址:grepcode.com Android Asset Studio 这是一个神奇的网页,里面包含了多个与资源相关的在线工具,比如icon制作(桌面icon,通知栏icon等),9patch图片制作,ActionBar样式等相关的工具。当你有资源相关的工作时,不妨试一试这个网页工具。 地址:Android Asset Studio 快速下载Google Play应用 由于一些你懂的原因,国内无法直接访问Google Play商店。而且下载Google Play商店还是需要登陆谷歌账户,以国内的网络,下载成功简直是太困难了。 这里介绍一款不需要账户国内即可访问的Web工具。可以通过输入包名或者Google Play地址即可下载。 地址:APK Downloader 进制转换 Android中所有的资源都有一个对应的资源ID,资源ID的类型为16进制的整数。有些时候特殊的场合处理资源ID,为了调试需要进行进制转换,比如16进制转常用的10进制。不用自己算,使用下面的工具就可以轻松搞定。 地址:Hex To Decimal Converter UI相关必备 通常UI设计师都会给开花童鞋色值,当疏忽的时候,我们可以使用截图软件得到10进制的三个值,然后将其转换成色值。这里有一个便捷的RGB工具。 地址:RGB Color Wheel/ JSON格式化 在CS应用中,客户端和服务器端通常使用json作为数据交换格式。当分析的时候,我们必然是将raw数据转换成可读性更高的。快来使用这个强大的工具吧。 地址:JSON Parser 查看HTML5,JS,CSS可用情况 caniuse.com是一个检测HTML5,JS,CSS在各个浏览器平台是否可用的web工具。便于我们了解前端方案是否在目标设备上是否有效。 地址:caniuse.com 来源:51CTO

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

如何通过学习开源项目来提高自己

学习各种开源项目,已经成为很多朋友不可回避的工作内容了。笔者本人也是如此。在接触并学习了若干个开源项目之后,笔者试图对自己工作过程中的若干体会加以总结,以期对一些希望借鉴的朋友有所裨益。 需要说明的是,笔者本人接触的开源项目大多属于计算机系统领域,例如Linuxkernel,KVM,QEMU,OpenStack等。因此,此处介绍的经验必定也有些局限。请读者们自行分辨,区别对待。 1. 学习分层和目标管理 对于一个开源项目,可以将与之相关的各种知识和技能的学习大致划分为如下五个层次: 第一层次:了解项目的基本概念、基本用途、逻辑结构、基本原理、产生背景、应用场景等基本知识。 这个层次的基本定位其实就是“科普”。如果对于一个项目只需要有些基本了解,且短期内并不需要上手进行实际技术工作,则学习到这个层次也就可以先应付一下了。 第二层次:掌握项目的基本安装流程和使用方法。 这个层次的基本定位是“入门”,以便对这个项目获得直观认识,对其安装和使用获得亲身体验。如果只是需要以as-is方式使用这个项目,则初步学习到这个层次即可。 第三层次:了解代码的组织,找到各个主要逻辑/功能模块与代码文件之间的对应关系,通过代码分析走通几个关键的、有代表性的执行流程。 这个层次的基本定位是“深入”,开始理解这个项目的实际实现,能够真正将项目的功能、工作原理和代码实现对应起来,获得对这个项目工作过 程的直观认识。这个层次是学习开源项目代码的真正开始。如果希望基于这一项目进行应用开发,或者针对与这一项目密切相关的其他项目进行工作时,则对项目本 身的代码进行这一层次的理解,会很有帮助。 第四层次:了解该项目所有代码模块、程序文件的作用,走通所有主要执行流程。 这个层次的基本定位是“掌握”,能够比较全面、系统地理解这个项目的设计和实现,并且熟悉项目各个部分的代码。如果希望对项目进行深度定制修改,或者对社区有所贡献,则应当以达到这个层次作为目标。 第五层次:钻研、领悟该项目的各种设计思想与代码实现细节。 这个层次的基本定位是“精通”,精益求精,学无止境。这是大神们追求的境界。如果希望成为项目社区的重要贡献者乃至核心贡献者,则应当以这个层次作为努力的目标。 综上,对于一个开源项目的学习过程可以大致分为五个层次。至于到底要学习到什么阶段,投入多少相关精力,则完全取决于学习的目的。 2. 知识基础 学习一个开源项目需要的知识基础主要包括: 1)该项目涉及的技术领域的背景知识。 举例而言,分析Linux Kenrel,则应该了解操作系统原理;学习OpenStack,则应该知道什么是云计算。如果没有这些背景知识作为基础,上来就死磕源代码,只能是事半功倍。 2) 该项目开发使用的语言及其各种开发调试工具 这个就无需多言了。 3) 英语 很遗憾,目前为止真正流行的开源项目大部分不是起源于国内。因此,除了学习个别极其流行、文档完备的项目之外,大家还是需要自行搜集阅读英文资料参考。学好英语很重要。 当然,到底需要准备多少知识基础,完全取决于学习的目的和层次。如果只是想科普一下,也就不必太过麻烦了。 3. 学习思路 学习一个项目的过程,其实就是由表及里了解分析它的过程。上述提及的五个学习层次便组成了这样一个逐渐深入的过程。在此基础之上,学习、分析代码的过程,也可以尝试做到由表及里、逐渐深入。 在刚开始接触一个项目的时候,我们看到的其实就是一个黑盒子。根据文档,我们一定会发现盒子上具有若干对外接口。通常而言,这些接口可以被分为三类: - 1配置接口:用于对盒子的工作模式、基本参数、扩展插件等等重要特性进行配置。这些配置往往是在盒子启动前一次性配好。在盒子的工作过程中,这些配置或者不变,或者只在少数的情况下发生改变。 - 2控制接口:用于在盒子的工作过程中,对于一些重要的行为进行操纵。这是盒子的管理员对盒子进行控制命令注入和状态信息读取的通路。 - 3数据接口:用于盒子在工作过程中读取外部数据,并在内部处理完成后向外输出数据。这是盒子的用户真正关心的数据通路。 因此,在分析一个开源项目的代码时,可以围绕重要的配置、控制、数据接口展开分析工作,特别应该注意理解一个关键的接口背后隐藏的操作流 程。例如,针对数据接口,至少应当走通一条完整的数据输入输出流程,也即在代码中找到数据从输入接口进入盒子后,经过各种处理、转发步骤,最终从输出接口 被传输出去的整个执行过程。 一旦走通了这样一条流程,则可以将与数据处理相关的各个主要模块、主要步骤贯穿起来,并将逻辑模块图上和文档中的抽象概念对应 到代码实现之中,可以有效推进对于项目的深入理解。 在实践这一思路的过程中,笔者建议可以优先从控制接口和数据接口中各自选择一二重要者进行背后的执行流程详细分析,力争找到其中每一步的 函数调用及数据传递关系(对于一些系统、应用库提供的底层函数可以先行跳过以节省时间)。这一工作完成之后,则第1节中第三层次的学习目标即可初步达成。 配置接口在不同的项目中的重要程度不同。对于一些架构极为灵活、配置空间甚大的项目(如OpenStack的Ceilometer),则可以适当多花些时间加以研究,否则简单了解即可。 对于这个学习思路,下文中还将结合实例进行进一步的说明。 4. 若干小建议 以下是笔者的一些零散建议,供大家参考。 1)做好记录 在刚刚入手开始学习某个项目的源代码时,其实很有点破译密码的感觉。大量的数据结构和函数方法散落在代码的各个角落里,等待着学习者将它 们贯穿到一个个重要的执行流程中。因此,在分析学习的过程中,无论有什么零散收获,都值得认真记录下来。珍珠自然会串成项链的。 2)不要过分纠缠于细节 立志搞懂一个项目的每行源代码是值得尊敬的,但至少在刚刚入手的时候是没有必要的。如果过于纠缠于代码的实现细节,则可能很快就被搞得头 晕眼花不胜其烦了(看英文资料的时候,每遇到一个不认识的词都要立刻查词典么?)。不妨避免细节上的过度纠缠,还是先尽快走通关键的执行流程,将项目的骨 干框架搭起来,然后再以此为参照,就可以清晰判断什么代码值得深入分析,什么地方可以简单略过了。 3)想像和联想很重要 如前所述,从零开始搞懂一个项目的代码,就像破译密码。因此,不妨展开合理的想象和联想,将各个零散的发现和理解联系起来,并加以分析印 证。在这个过程中,对项目所在领域的背景知识、对项目本身的逻辑框架和工作原理等方面的理解,都是想像和联想的参照与指导。此外,一些关键的函数名、变量 名等等都是联想的hint。本质上,编程语言也是语言,而程序代码就是说明文。在分析代码时,一定要超越语言和代码的细节去理解被说明的事物本身。 4)该搜就搜 分析代码的时候,很容易出现的情况就是,一个执行流程走到半截找不到下一步了。。。在这种情况下,当然首先还是推荐采用各种调试工具的单 步执行功能加以跟踪。如果暂时不会,或者种种原因只能进行静态代码分析,那么该搜就搜吧。各种IDE工具的文本搜索都能用,哪怕是grep也行。至于到底 以什么为搜索关键词,就需要琢磨琢磨了。 5)外事不决问google,内事不决问百度 如题,不解释。 5. 一个例子:OpenStack Cinder分析 此处将以OpenStack Cinder为例,并结合KVM/Qemu和Ceph,说明如何参考上述思路对一个开源项目进行分析。 可能有朋友奇怪为什么选这么个东东做例子。这个吧。。。写文章是忽发起想,举例子是随手抓来。木有原因。。。 首先,想对Cinder进行分析,一定要了解若干相关的基础知识。什么是云计算?什么是块存储?什么是OpenStack?Cinder在OpenStack里的作用?等等等等。如果对这些东西没有概念,则后续学习是很难开展下去的。 在此基础上,如果有条件,则最好能够亲自部署和实际操作一下Cinder(包括必要的其他OpenStack组件),以便对Cinder 获得一个直观的认识和体验,为后续分析提供一些参考。此处假定Cinder使用的后端是Ceph,而OpenStack上运行的虚拟机是KVM。 然后,应该从概念上对我们要分析的系统的逻辑框架有个理解。从总体的范畴上讲,应该了解Horizon和Nova各自的逻辑模块结构,以 及它们和Cinder的协同工作方式、关系。这部分与Cinder的控制接口及执行路径分析密切相关。此外,还应该了解Cinder和KVM/QEMU、 Ceph之间的相互关系。这对于真正理解Cinder很有帮助。从Cinder自身而言,应该了解其内部逻辑模块构成、各自的功能、相互间的控制、数据连 接关系等。 在完成上述准备之后,则可以开始对Cinder的代码进行分析了。如前所述,应该考虑在控制接口和数据接口中各自选择一两个关键的、有代表性的加以分析。至于配置接口,假定其实现了某一配置即可,暂时不需要过多花费时间。 Cinder的核心功能其实是OpenStack上的volume管理。至少在Cinder+Ceph方案中,Cinder自身并不在数 据传输关键路径上。因此,控制接口的分析就是Cinder源代码分析的重中之重。就入手阶段而言,则有两个接口及其对应执行流程可以作为Cinder分析 的起点,即volume的create和attach操作。如果能够彻底打通这两个操作的执行流程(至少要看到Cinder与Ceph通过librbd交 互的层面),则对于真正理解Cinder的功能与实现大有帮助。 虽然基于KVM的虚拟机在通过QEMU访问Cinder创建的、Ceph提供的volume时并不通过Cinder,也即,这一部分的源 代码其实已经超出了Cinder源代码学习的范畴,但是,如果希望真正彻底地理解Cinder,则对于这一部分知识还是应该有所涉猎,至少应该有概念上的 了解。 在达到上述阶段之后,则可以根据自身的需求决定后续计划了。

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

提高警惕,山寨 KeePassXC 应用上架微软商店

KeePassXC是由 KeePass 密码管理器的一个分支发展而来的,相比原版 KeePass,KeePassXC 除了适配 Windows,还适配了 Linux 和 macOS。 近日 KeePassXC 在官方社交媒体发文,让用户小心 Microsoft Store 中出现的假冒 KeePassXC 应用,并表示这个应用与官方没有任何关系,KeePassXC 也在努力让官方应用可以上架应用商店,但目前用户需要从官方网站下载获得。 自从微软逐步开放 Microsoft Store,不再限制开发者仅能上传 UWP 应用之后,如今 Microsoft Store 中的应用数量和类型都逐渐丰富起来了。Visual Studio Code、VLC、GIMP 和 Audacity 等耳熟能详的开源软件也都陆续登陆应用商店。 虽然 Microsoft Store 软件库在逐渐丰富,但用户稍加留意就会发现商店中的很多软件并非原始作者自己上传的,而是第三方开发者复制的山寨产品。更加可恶的是部分原作者的软件本身就是开源或免费的,山寨产品反而是作为付费应用程序提供。比如上图的山寨 KeePassXC,就有一个价格为 0.99 美元的内购选项,而原版则是完全免费。 实际上在去年 11 月,KeePassXC 的维护者就在 GitHub 表示将会在 2.7.0 版本发布时将应用一同上架到 Microsoft Store,但在今年 3 月正式发布 2.7.0 版本后官方并没有按计划将应用上架商店。 KeePassXC 的维护者仅仅表示:“将应用上架商店比预期的要麻烦一些,他们仍然在努力尝试”。维护者并没有透露他们具体遇到了什么麻烦。 如今原版没有上架商店,反而是山寨产品率先上线,也不知道这其中到底发生了什么,而且这也不是微软第一次在商店里上架山寨软件了,此前 Audacity 的开发商就因此批评过微软。目前 KeePassXC 已经向微软发出了正式的版权移除请求,要求下架这款山寨产品。 官方正版下载地址:https://keepassxc.org/download/

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

设计上云,能多大程度上提高团队效率?

环境的演变催动着人们工作方式的“进化”;传统工作中的冗杂程序被迭代,也将成为必然趋势之一。那么在设计工种中,未来可能会出现什么样的办公新趋势?有可能是“上云”。而此次腾讯设计云系列产品的上线,也许就印证了这一点。 ——————/ BEGIN /—————— 受疫情的影响,传统的办公场景正在加速线上化。 如今,许多工作与协同,都可以在线上完成,并不会降低工作效率。但对于设计这个工种来说,即使在现实中,依然存在沟通效率低、信息不同步等诸多难题,更别说将沟通过程搬到线上。 在知乎「设计师们最大的悲哀是什么?」的提问中,高赞回答说,“是成为一个没有灵魂的作图机器”。这也是很多设计师的现状,困在冗长的流程里,项目参与感低,设计的价值被进一步稀释。 为了解决这样的难题,腾讯上线了腾讯设计云系列产品,面向设计协同、智能创作等多场景提供不同的解决方案,以自身产品能力,为传统的设计工种带来新变量。 那么,设计「上云」,为什么可以释放设计价值,提升团队效率? 设计师困在流程里 纽约时报曾这样评价雷蒙德·罗维:毫不夸张,罗维先生塑造了现代世界的形象。 罗维也是许多设计师的偶像,不光因为他设计的产品数不胜数,大到飞机轮船,小到口红和可口可乐瓶。 更因为:他是少有能推动产品从本质上进化的设计师。 在汽油问题成为世界关注焦点之前,罗维便提倡生产车体低,车形细的节油型汽车,这在当时并不受主流市场欢迎,而罗维始终坚持并将自己的理念落地,最后取得了成功。 这在国内的设计师工作氛围中是很少见的。 在企业里,设计师大多被看作“资源”而非“伙伴”,对产品的参与度和话语权都很低,这也造成了设计师很奇怪的处境:部门需要设计师,但不太需要设计师的意见。 这种现状是有历史原因的,互联网人口红利期里,产品忙着抢流量,重要的是补贴、功能和广告。 产品体验如何,设计是否美观,不是争夺用户首先需要考虑的事情,功能类需求的优先级往往要比体验类高很多。 也因此,设计并没能获得应有的重视。 在团队协作的过程中,比起参与共建者,设计师的位置更像一个随时等待接brief的乙方。 但实际上,设计应该是贯穿产品研发全程的整体性工作,需要从前期测试到迭代发布全阶段参与,这样才能保证用户体验始终统一。 而在传统的设计工作场景下,业务链任何一环的反馈,都很难及时同步给设计师,只有当产品经理想提需求时,这些反馈才会被有选择性地拿出来讨论。 更多时候,设计师每天的工作,是对接各种各样的需求方,汇总修订多方的修改意见,为前端标注图片等。 常见的场景是:审批者依靠截图标注出想要修改的地方,把修改意见逐字标在旁边,设计师对照反馈一一修改,再重新审核。如果涉及到多个审批者,流程将更加繁琐。 在冗杂的流程中,设计师做了太多无用的沟通和低效的工作,难以发挥设计的专业价值。时间一长,设计师感受不到参与感和价值感,更容易产生职业倦怠。 设计师的产出对于整个团队的影响也是巨大的。 好的产品离不开体验,设计师作为用画面与用户沟通的那一群人,更需要有时间和精力去思考和沉淀,而不光仅仅是做一个执行者。 想要迎来质变,首要任务就是将设计师从重复的工作、繁杂的流程中解放出来。设计师一直在期待一款好用趁手的工具诞生,能降低各需求方之间来回多次的沟通成本。 事实上也应该是这样,信息时代的最大特点,便是信息能够快速自由地流动,减少信息不对称,进而提升整体效率。 困难的地方在于:大而全的产品太臃肿,小而精的产品又不够普适。 需求推动技术革新 腾讯设计云给出了一种全新的想法和可能性:通过不同产品的组合,为不同的需求场景提供解决方案。 设计师工作中,存在的一大难题是信息差。 设计师得到的信息,往往来自于项目组沟通完需求与方案之后,产品经理去告知其需要做一件什么样的事情。 这样的工作模式往往会带来一些问题:设计只参与其中一环,对项目很难有全盘的理解。 另一方面,需求的信息可能实时都有变化,而这些很难及时同步给设计师。尽管有些变化对于设计师来说是重要的,可能会影响方案的最终产出。 腾讯设计云的ProWork和CoDesign两款产品的组合,是专门面向设计协同场景的。 团队成员可以在ProWork上通过任务清单进行日程管理,可以配置优先级、日程颜色、花费时间、关联项目。产品经理、设计师、技术研发等不同角色,都能在同一个平台上看见彼此的工作进展,信息实时流动,减少不必要的协同,做好项目的整体资源统筹。 设计师完成工作后,在CoDesign提交设计图,其他组员无需下载文件,就可在线预览设计稿,修改意见直接逻辑连线和文字备注标注在图上,反馈意见更及时。设计师通过评论列表就能一次性查看所有成员的评论意见,完成修改稿后上传,CoDesign会自动同步给其他同事。无缝对接产品经理、设计师、开发工程师的上下游高效协作。 通过ProWork和CoDesign的组合拳,设计师能够更全盘地掌握项目全貌,与多方实现高效协同,降低沟通成本。 “再小的个体,也有自己的品牌”,自媒体时代下,企业的营销渠道大幅增加,营销内容也更加多样化和碎片化,传统设计师的工作方式,难以很好地承接住这些碎片的需求。 这样的趋势下,人们越来越需要一个低门槛、简单好用的设计创作工具。 腾讯设计云的腾讯云智绘就是面向这种需求而生,它为用户提供一站式的素材智能化设计平台,平台拥有海量素材,用户可以根据需求,在平台上挑选适合的模版,替换文案后一键生成,就能轻松创作出想要的设计,节省搜集素材和处理图片的时间,还能规避侵犯版权的风险。 现在,很多公众号因为文章排版、头图设计等需求,依然需要为团队配置一名设计师,但实际上这类需求并不复杂,依靠智能设计工具大多可以轻松处理,降低团队人力成本。 另一方面,将简单的设计需求交给工具,也能进一步解放设计师的生产力,让其有更多时间与精力去做更有创造力的事。 大公司的效率损耗往往更高。 在很多互联网公司,每个部门甚至小组都有自己的组件库产品,各自服务于不同的方向,但本质上是类似的产品。 因为这些组件库产品,部门不得不专门分出部分人力维护,在重复造轮子的过程中,生产效率流失了。 为了解决这样的问题,腾讯做了TDesign产品,为设计师开箱即用的UI组件库,为产品体验设计的各个环节提供解决方案,做好连接的角色。 同时,因为各部门共用一套组件库,视觉风格和设计语言也能更好地保持一致。 搭配拥有高效开发能力的拖拽式开发平台微搭低代码,企业可快速实现云构建和发布,拥有敏捷开发能力,有效提升设计研发效能。 新能量注入,变化正在悄悄发生。 设计时代3.0 上个世纪末,电脑还未普及,设计师执笔,在白纸上一笔一画勾勒出产品草图。到后来,人们步入互联网时代,设计师开始借助设计软件完成工作,工作效率得以翻倍。 如今,线上化、数字化、智能化成为趋势,席卷各行各业,设计行业也重新迎来新一轮的改造。 从1.0到2.0的进化,是低效到高效,而2.0到3.0的更迭,是从无序到有序。 生产力工具层层迭代的价值,在于冗余流程的加速。 这也是行业发展的必然。 互联网野蛮生长年代,设计的价值一直被低估。 而来到存量时代,互联网产品遍地都是,而功能又大多趋同,人们不得不重新关注产品的精细度和完整度,糟糕的产品体验,势必会带来用户流失。 而这就要求设计师们不光仅仅是做设计,还要有分析用户,优化体验的能力。投资人Peter Levine曾说,新十年是“设计时代”,设计将成为整个产品研发的关键。 在这样的趋势下,设计协作工具的形态亟需被完善。 腾讯设计云矩阵共包含十款产品,如主打智能设计的云创、腾讯云智绘,主打设计协同的ProWork和CoDeign、主打快速研发的微搭低代码和CODING等。 通过产品的系列组合能力,能够应用在不同的设计场景下,比如市场调研应用场景,没有设计师的中小型企业的全流程设计应用场景、设计部门高效应用场景和开发者一站式的多端应用场景,从不同纬度帮助公司更好地提升设计环节的工作效率,进而推动整个项目流程加速。 几个月前,咨询师Jared Spool发推特说,任何影响设计的人都是设计师,包括开发人员、PM甚至公司的法务。 在这个人人都能指着设计师的屏幕,发表几句观点的环境里,设计师反而更应该保持理性和清醒,对于未来的设计师来说,比起作图能力和审美,洞悉用户与深度思考的能力反而更加重要。 有了新工具的赋能,设计师只需关注设计本身,繁琐的沟通、重复的工作由协同平台的项目流程和管理能力解决,为设计师创造一个高效和透明的协同环境;各端信息时时流动同步,设计师全程参与开发流程,设计产物与研发产品可始终保持一致,实现设计价最大化。 两千多年前,人们在陕西咸阳到内蒙古包头之间,修了一条笔直的马路,这是人类史上第一条高速公路,一直从秦朝使用到清朝。 到今天,国内高速公路公里数超过14万公里,已然成为城市重要的基础建设,持续拉动着各地经济。腾讯设计云正在做的事情也是这样,用自身产品能力,为设计行业修一条快车道,从而提升整体效率,创造更多价值。 对于设计师而言,或许他们也能离用户体验更近一些,逃离「作图机器」的命运。 —————— / END / —————— 文章来源于微信公众号:人人都是产品经理 作者:张美芽

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

每日一博 | 怎么提高自己的系统架构水平?

系统设计与架构理论这个问题,回答起来非常宽泛,基本所有的技术理论都可以涵盖。作为一个撸代码快 10 年的后端技术人员,简单发表一下我的看法。 系统设计与架构,与系统的业务类型关联还是很大的,比如传统的业务系统主要关注的是领域建模设计,高并发、高可用、数据一致性等系统,在设计的时候会与业务系统有较大的差别,所以这里针对不同类型的系统,来简单介绍一下设计的时候面临的一些难点与解决方案。 背景常规业务系统设计关键——领域模型 业务系统设计的关键是在于如何定义系统的模型以及模型之间的关系,其中主要是领域模型的定义,当我们在模型确定之后,模型之间的关系也会随之明确。 模型设计可以参考领域模型的经典书籍《Domain-Driven Design》一书,通过这个基本可以对领域定义、防腐层、贫血模型等概念有一个较为清晰的认识了。 单个应用内的领域模型系统也需要注意领域分层,作为开发大家是不是见过、重构过很多Controller-Service-DAO 样式的代码分层设计?往往在在做重构的时候会令人吐血。 设计较好的领域设计这里给一个分层建议: ▐接口层 Interface 主要负责与外部系统进行交互&通信,比如一些 dubbo服务、Restful API、RMI等,这一层主要包括 Facade、DTO还有一些Assembler。 ▐应用层 Application 这一层包含的主要组件就是 Service 服务,但是要特别注意,这一层的Service不是简单的DAO层的包装,在领域驱动设计的架构里面,Service层只是一层很“薄”的一层,它内部并不实现任何逻辑,只是负责协调和转发、委派业务动作给更下层的领域层。 ▐领域层 Domain Domain 层是领域模型系统的核心,负责维护面向对象的领域模型,几乎全部的业务逻辑都会在这一层实现。内部主要包含Entity(实体)、ValueObject(值对象)、Domain Event(领域事件)和 Repository(仓储)等多种重要的领域组件。 ▐基础设施层 Infrastructure 它主要为 Interfaces、Application 和 Domain 三层提供支撑。所有与具体平台、框架相关的实现会在 Infrastructure 中提供,避免三层特别是 Domain 层掺杂进这些实现,从而“污染”领域模型。Infrastructure 中最常见的一类设施是对象持久化的具体实现。 高并发系统设计 在面试中是不是经常被问到一个问题:如果你系统的流量增加 N 倍你要怎么重新设计你的系统?这个高并发的问题可以从各个层面去解,比如 ▐代码层面 锁优化(采用无锁数据结构),主要是 concurrent 包下面的关于 AQS 锁的一些内容 数据库缓存设计(降低数据库并发争抢压力),这里又会有缓存、DB 数据不一致的问题,在实际使用中,高并发系统和数据一致性系统采用的策略会截然相反。 数据更新时采用合并更新,可以在应用层去做更新合并,同一个 Container 在同一时间只会有一个 DB 更新请求。 其他的比如基于 BloomFilter 的空间换时间、通过异步化降低处理时间、通过多线程并发执行等等。 ▐数据库层面 根据不同的存储诉求来进行不同的存储选型,从早期的 RDBMS,再到 NoSql(KV存储、文档数据库、全文索引引擎等等),再到最新的NewSql(TiDB、Google spanner/F1 DB)等等。 表数据结构的设计,字段类型选择与区别。 索引设计,需要关注聚簇索引原理与覆盖索引消除排序等,至于最左匹配原则都是烂大街的常识了,高级一点索引消除排序的一些机制等等,B+树与B树的区别。 最后的常规手段:分库分表、读写分离、数据分片、热点数据拆分等等,高并发往往会做数据分桶,这里面往深了去说又有很多,比如分桶如何初始化、路由规则、最后阶段怎么把数据合并等等,比较经典的方式就是把桶分成一个主桶+N个分桶。 ▐架构设计层面 分布式系统为服务化 无状态化支持水平弹性扩缩容 业务逻辑层面 failfast 快速失败 调用链路热点数据前置 多级缓存设计 提前容量规划等等 高可用系统设计 对于可用性要求非常高的系统,一般我们都说几个9的可用率,比如 99.999% 等。 面对高可用系统设计也可以从各个方面来进行分析 代码层面:需要关注分布式事务问题,CAP理论是面试的常规套路 软件层面:应用支持无状态化,部署的多个模块完全对等,请求在任意模块处理结果完全一致 => 模块不存储上下文信息,只根据请求携带的参数进行处理。目的是为了快速伸缩,服务冗余。常见的比如session问题等。 ▐负载均衡问题 软件部署多份之后,如何保证系统负载?如何选择调用机器?也就是负载均衡问题 狭义上的负载均衡按照类型可以分为这几种: 硬件负载:比如F5等 软件负载:比如 LVS、Ngnix、HaProxy、DNS等。 当然,还有代码算法上的负载均衡,比如Random、RoundRobin、ConsistentHash、加权轮训等等算法 广义上的负载均衡可以理解为负载均衡的能力,比如一个负载均衡系统需要如下4个能力: 故障机器自动发现 故障服务自动摘除(服务熔断) 请求自动重试 服务恢复自动发现 ▐幂等设计问题 上面提负载均衡的时候,广义负载均衡需要完成自动重试机制,那么在业务上,我们就必须保证幂等设计。 这里可以从2个层面来进行考虑: 请求层面由于请求会重试所以必须做幂等,需要保证请求重复执行和执行一次的结果完全相同。请求层面的幂等设计需要在数据修改的层做幂等,也就是数据访问层读请求天然幂等,写请求需要做幂等。读请求一般是天然幂等的,无论查询多少次返回的结果都是一致。这其中的本质实际上是分布式事务问题,这里下面再详细介绍。 业务层面不幂等会造成诸如奖励多发、重复下单等非常严重的问题。业务层面的幂等本质上是分布式锁的问题,后面会介绍。如何保证不重复下单?这里比如token机制等等。如何保证商品不超卖?比如乐观锁等。MQ消费方如何保证幂等等都是面试的常见题。 ▐分布缩式 业务层面的幂等设计本质上是分布式锁问题,什么是分布式锁?分布式环境下锁的全局唯一资源,使请求串行化,实际表现互斥锁,解决业务层幂等问题。 常见的解决方式是基于 Redis 缓存的 setnx 方法,但作为技术人员应该清楚这其中还存在单点问题、基于超时时间无法续租问题、异步主从同步问题等等,更深一点,CAP理论,一个AP系统本质上无法实现一个AP需求,即使是 RedLock 也不行。 那我们如何去设计一个分布式锁呢?强一致性、服务本身要高可用是最基本的需求,其他的比如支持自动续期,自动释放机制,高度抽象接入简单,可视化、可管理等。 基于存储层的可靠的解决方案比如: zookeeperCP/ZAB/N+1可用:基于临时节点实现和Watch机制。 ETCDCP or AP/Raft/N+1可用:基于 restful API;KV存储,强一致性,高可用,数据可靠:持久化;Client TTL 模式,需要心跳CAS 唯一凭证 uuid。 ▐服务的熔断 微服务化之后,系统分布式部署,系统之间通过 RPC 通讯,整个系统发生故障的概率随着系统规模的增长而增长,一个小的故障经过链路传导放大,有可能造成更大的故障。希望在调用服务的时,在一些非关键路径服务发生服务质量下降的情况下,选择尽可能地屏蔽所造成的影响。 大部分熔断返回默认值 null,也可以定制,RPCClient 原生支持最好,业务方少改代码(熔断放的地方),进入熔断时,打印熔断日志,同时返回 Exception(业务方定制熔断方法),需要有服务治理平台,可以看到服务的状态、是否降级、是否熔断、可以实时下发阀值配置等。 ▐服务降级 服务整体负载超出预设的上限,或者即将到来的流量预计将会超过阀值,为了保证重要或者基本的服务能够正常运行,拒绝部分请求或者将一些不重要的不紧急的服务或任务进行服务的延迟使用或暂停使用。 主要的手段如下: 服务层降级,主要手段 拒绝部分请求(限流),比如缓存请求队列,拒绝部分等待时间长的请求;根据Head,来拒绝非核心请求;还有其他通用算法上的限流比如令牌桶、漏桶算法等等。 关闭部分服务:比如双11大促0点会关闭逆向退款服务等等。 分级降级:比如自治式服务降级,从网关到业务到DB根据拦截、业务规则逐渐降低下游请求量,体现上是从上到下的处理能力逐渐下降。 数据层降级 比如流量大的时候,更新请求只缓存到MQ,读请求读缓存,等流量小的时候,进行补齐操作(一般数据访问层如果做了降级,就没必要在数据层再做了) 柔性可用策略 比如一些指定最大流量的限流工具,又或是根据CPU负载的限流工具等,需要保证自动打开,不依赖于人工。 ▐发布方式引发的可用性问题 发布方式也是影响高可用的一个点,哈哈,以前还经历过一些线上直接停机发布的案例(银行内部系统),不过作为高大上的互联网,主要会采用这几种发布方式:灰度发布、蓝绿发布、金丝雀发布等等。 数据一致性系统设计 一般一些金融、账务系统对这一块要求会非常严格,下面主要介绍下这里面涉及到的事务一致性、一致性算法等内容。 ▐事务一致性问题 在 DB 层面,一般通过 刚性事务 来实现数据一致性,主要通过 预写日志(WAL) 的方式来实现,WAL(write ahead logging)预写日志的方式。就是所有对数据文件的修改,必须要先写日志,这样,即使在写数据的时候崩溃了,也能通过日志文件恢复,传统的数据库事务就是基于这一个机制(REDO 已提交事务的数据也求改 UNDO 未提交事务的回滚)。 除了这个方式之外,还有一个就是通过 影子数据块 来进行数据备份,提前记录被修改的数据块的修改前的状态,备份起来,如果需要回滚,直接用这个备份的数据块进行覆盖就好了。 其他的就是基于二阶段提交的 XA模型 了。 但是目前互联网系统,已经广泛采用分布式部署模式了,传统的刚性事务无法实现,所以 柔性事务成了目前主流的分布式事务解决防范,主要的模式有下面几种: TCC 模式/或者叫2阶段模式在 try 阶段预扣除资源(但是不锁定资源,提升可用性),在Confirm 或者 Cancel 阶段进行数据提交或者回滚。一般需要引入协调者,或者叫事务管理器。 SAGA模式业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,支持向前或者向后补偿。 MQ的事务消息就是先发 halfMsg,在处理完之后,再发送 commit 或者 rollback Msg,然后 MQ 会定期询问 producer ,halfMsg 能不能 commit 或者 rollback,最终实现事务的最终一致性。实际上是把补偿的动作委托给了 RocketMQ。 分段事物(异步确保)基于可靠消息+本地事务消息表 + 消息队列重试机制。目前这也是一些大厂的主流方案,内部一般称为分段事物。 柔性事务基本都是基于最终一致性去实现,所以肯定会有 补偿 动作在里面,在达到最终一致性之前,对用户一般展示 软状态。 需要注意的一点是,并不是所有的系统都适合引入数据一致性框架,比如用户可以随时修改自己发起的请求的情况,例如,商家设置后台系统,商户会随时修改数据,这里如果涉及到一致性的话,引入一致性框架会导致补偿动作达到最终一致性之前,资源锁会阻塞用户后续的请求。导致体验较差。这种情况下就需要通过其他手段来保障数据一致性了,比如数据对账等操作。 ▐一致性算法 从早期的 Paxos 算法,再到后面衍生的 zab 协议(参考:A simple totally ordered broadcast protocol),提供了当下可靠的分布式锁的解决方案。再到后来的 Raft 算法(In Search of an Understandable Consensus Algorithm),也都是分布式系统设计里面需要了解到的一些知识要点。 最后 这里简单介绍了不同系统设计的时候会面临的一些难点,基本里面每一个点,都是前人在解决各种疑难问题的道路上不断探索,最终才得出的这些业界解决方案,呈现在大家眼前,作为一个技术人员,学会这些技术点只是时间问题,但这种发现问题、直面问题、再到解决问题的能力和精神才是我们最值得学习的地方,也是做为一个系统设计人员或者说是架构师的必要能力。 ✿拓展阅读 作者|勇剑 编辑|橙子君 出品|阿里巴巴新零售淘系技术 本文分享自微信公众号 - 淘系技术(AlibabaMTT)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

程序员如何提高自己的工作效率

如何高效地工作是每个优秀程序员必须要做到的,如果你不想总是加班,总是最后一个下班,那么你就应该高效地进行每天的工作,只有这样,你才能够有更多的时间去提升自己,从而让自己的工作效率更高,循环往复。 尽快开始工作 很多人习惯上班之前做点其他的事情,然而根据我的个人经验,当我尽可能早地投入到工作中,我的一天的工作效率会格外地高。我们都知道要进入状态需要一定的时间,而过早地工作会让你不被周围所打扰,而进入状态之后的你会很难被打扰。 上班之前进行锻炼 体育锻炼可以让你的精神格外地饱满,当你每天早起锻炼之后,你会发现你一天的精神都在状态,你不会有困得感觉。很多人会觉得早起锻炼会让你失去多睡一会的时间,然而,我的经验告诉我,早起锻炼之后,我的精神处于亢奋状态,根本不会觉得有困得感觉。 不要吃太多 是的,你不要吃得太多,保持7分饱的状态不会让你犯困,特别是每天午餐,你最好不要吃得太饱,否则下午你会觉得很困。 吃得太饱往往都会积累过多的能量,而这些能量会产生脂肪,最终你会变得越来越胖,而因为胖你会吃得更多,循环往复,你将使得自己陷入难以自拔的境地。 尽量远离电子产品 将自己的手机静音,关掉打扰你的邮件,关掉那些影响你的社交媒体,当你一天看手机的次数减少的时候,你会发现你的效率格外高,因为电子产品正在剥夺你的碎片化时间,而这些时间本来是你用来创造价值的时间。 专注做一件事 每天你的任务可能会有很多个,你要列出它们的轻重缓急,集中精神专注做一件事。尽量不被外界所打扰,集中精神做你当下最重要的事情。 如果由于某种原因我必须将一项任务设置成几个小时或更长时间,那么我通常只是把它做完之后,再去做其它任务。因为在多个项目切换的时候,你会感到脑袋可能要炸掉,这不是夸张,你需要不停地切换你的大脑让它去适应,而这往往会让你失去理智。 每晚做总结和第二天的计划 吾日三省吾身,我们每天都要总结当天我们是否以高效率完成了工作,是否荒废了时间,每天都要比昨天进步一点,这是我们必须要做到的。 除了反省,我们还要计划明天的工作,知己知彼百战百胜,我们要计划好明天的工作,这样我们不仅可以在第二天做到有的放矢,遇到特殊情况的时候,我们也能从容面对。 总结 效率对一个人的工作格外重要,不仅仅是程序员,每个行业,每个人都应该高效率地工作,上班摸鱼浪费的永远都是你自己的生命。 鸿蒙官方战略合作共建――HarmonyOS技术社区 【责任编辑:赵宁宁 TEL:(010)68476606】

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

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等操作系统。