引出四个维度
工作快十五年了,从十年前开始经常会有新项目,需要从头开始做方案和设计。做技术选型很少成为我的难题。不是因为这方面我多有方法,而通常是很少有选择。在做技术选型的场景下基本有以下四个维度:
维度一
从系统构成上有两种:
第一种,有之前的老系统,需要重构
第二种,从零开始建的服务
维度二
从稳定性要求上有三种:
第一种,现在没有什么业务量,将来估计也不会有什么增长,甚至很可能不成
第二种,现在没有什么业务量,将来对稳定性要求很高
第三种,现在对有稳定性要求很高
维度三
从环境上有三种:
第一种,公司有很多基础设施
第二种,公司有一些基础设施
第三种,公司基本没有基础设施
维度四
从要求上有两种:
第一种,公司有标准化规范,需要用公司的统一组件
第二种,公司没有要求
各个维度组合的选项考虑
从零开始项目现在没有什么业务量,将来估计也不会有什么增长
从目标上,遇到这种项目,工作的重心就不在于把项目做好做坏,而在于人员培养。
如果公司对组件上没有什么要求,那我的建议是大家想学什么,就用什么。直接拿学习的试验田来用,一举两得。
如果公司有标准化规范,需要用公司的统一组件。但是公司的组件一般也是开源进行二次开发的,也一样可以想学什么就用什么,弄不明白的,还可以找维护组件的人请教。也可以用公司自研的,但是在业界有一定知名度的产品。研究的好可以作为面试的一个亮点。
瞎举个例子哈:
一六年、一七年做P2P并且不合规的公司,眼看就不行了。有的团队用的kafka,就是为了学习这个东西;有的团队自己搭建redis集群也是为了学习。
从零开始项目现在没有什么业务量,现在或者将来对稳定性要求很高
从目标上,这个是产生业绩的最佳项目,要精心规划。
做这种项目需要做好调研,包含业界调研和公司调研。业界的同类产品是怎么做的,有哪些缺点和优点。公司有没有同类或者可以登高类比(登高类比是指先找相似度最高的,找不到在逐渐扩大范围)的,那些项目遇到过哪些坑或者问题,是否和架构或者技术选项有关。
在做好调研基础上,如果公司对组件上没有什么要求,那就需要根据项目本身的特点综合比较。举例如下图:

不考虑项目本身特性,使用技术通用的考察项主要有:优势、劣势、技术成熟度、社区活跃度、资料丰富程度、是否有大牌公司在持续维护。
可参考我之前的文章《SpringBoot整合web容器》里面有介绍我当初对tomcat还是jetty选择的考虑点。
如果公司有标准化规范,需要用公司的统一组件。
这时候,如果公司的组件可选性很多,比如之前美团的监控告警组件就有cat、digger、tracing、大白等。这时候一方面考虑各个组件的侧重点和自身是否切合,最重要的是要看其他团队都用什么。周围团队用的很少,咱们也不要用了。兄弟团队有福同享有难同当,如果大家都用这个,组件稳定性有问题了,影响的不止一个团队,也相互有个依靠。就自己用了还出事了,额,让我想起一句歌词:“多少秘密在其中 欲诉无人能懂”-----一帘幽梦。暴露年龄了。
如果公司的组件只有一个,也要看看兄弟团队有没有在用,还需要组件团队给提供相应的SLA,对于还在推广中的组件要谨慎。
重构老系统现在没有什么业务量,将来估计也不会有什么增长
建议放弃重构!
重构老系统现在没有什么业务量,将来对稳定性要求很高
参考从零开始项目现在没有什么业务量,现在或者将来对稳定性要求很高的方法。
重构老系统,现在对稳定性要求很高
建议选型尽量和之前保持一致,以便于和之前的逻辑尽量一致。避免踩到特殊需求导致的特殊逻辑等坑。
实在不能一致,比如十二年前我们有个“新鲜事”中间件,类似于网页版的发朋友圈吧。之前是用c++写的,后来c++的同事都离职了,要求我们改成java。这时候要考虑的主要是技术的成熟度。这个成熟度包含业界技术本身的成熟度和团队成员对技术的熟练度。
对于这种类型,还有几句忠告:
不要特立独行,要合群!
使用成熟的技术!
使用成熟技术的成熟功能!
最后对使用成熟技术的成熟功能做个解释说明:比如redis很成熟了,redis有很多高级特性,比如订阅转发,稳定性要求高的不要用。用更加成熟的常用做订阅转发的比如MQ!
往期推荐
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc
我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason