现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

什么是互联网精神?唯快不破

2019-11-27 14:01 工业·编程 ⁄ 共 3042字 ⁄ 字号 暂无评论

随着经济的发展老百姓也越来越有钱,我们也不再以性价比为唯一标准去评价一件商品的好坏,更多关心是你是否认可这件商品,认可了它你就会愿意为它去花钱,就像你认可了这枚蛋,你就愿意用10块钱的价格去买一个几毛钱的东西。你用京东是认可它的物流,你用天猫是认可它的性价比,你去私立医院是认可它的服务,所以如果你是互联网企业的老总,你不用担心客户没有钱,你只需要担心你凭什么让客户认可你愿意为你掏钱,这就是互联网精神。

对我们程序员来说,这个定义可能显得比较遥远,因为并不是每个程序员都要去创业当老板的,所以如果站在程序员的角度来定义互联网精神,那就是一个字,“”。

快包含两层意义:

第一层: 对于产品来说(性能快、终端响应快、扩容快);

第二层: 对于开发人员(轻量级、上手快、开源)。

只有够快才可以提高客户体验,没人愿意盯着手机屏幕等5秒钟以上。至于如何为客户提供更舒服的服务方向那属于策划部门考虑的问题,不属于咱们程序员能左右的。

产品要“快”:

基础设施:

CPU、内存等硬件设施在充分压榨利用的前提下配置越高越好,非图形化的Linux肯定是操作系统的首选,关系型数据库的PK中mysql比Oracle领先了一个身位,服务节点间的网络跳纤越短越好,静态的部分是否可以交给Nginx甚至CDN。基础设施的选择和构建是最重要的一环,这一步没有考虑清楚的话很可能会寸步难行。

客户端响应:

再好的产品如果客户点一个按钮后顶着手机5秒都没有反馈的话,那你将会永久失去这个客户,所以提高客户端响应速度是非常必要的。客户不会听你的解释,你的后端将会为这次操作执行多么复杂的运算、跳转了多少个网络节点,客户只关心你耽误了他们的时间,他们不认可你的产品,就这么简单。

提高客户端响应的手段有很多,最通用的两大手段缓存和异步

*缓存是一种通用的技术,意义在于减少重复运算和提高少量数据的IO,有磁盘缓存和内存缓存,Spark对缓存的使用达到了登峰造极的地步。我们最常用的缓存是Redis,它可以做持久层二级缓存、系统的共享缓存、分布式锁、消息队列、NoSql数据库。

*异步的意义有2个,第一个意义是迅速响应客户,减少客户等待时间,实现手段是通过Ajax之类的Js代码;第二个意义是削峰填谷,在高QPS时保证产品的稳定性,实现手段是通过Kafka、RabbitMQ等消息队列技术,当然每种消息队列有其特有的设计思想,也就对应着不同的应用场景,有的注重吞吐,有的注重稳定。

扩容

因为你的客户体量是不断增加的,所以要以发展的眼光去评价一个组件或者一种技术的好坏。绝大部分的互联网组建在这方面已经设计的很好了,我们除开根据自己的需要学习特性之外,还需要抽象出其中的共性,像Master/Slaver、Metadata、分片、冗余这些常用的分布式名词一定要掌握。

 

开发要“快”:

互联网时代每天都可能风云突变,商机也会转瞬即逝,所以一个好的Idea和策划要想真正落地还得靠咱们程序员们去实现。而我们程序员们拿人钱财替人消灾,但又不想通宵达旦冒着猝死的风险去燃烧自己,怎么办? 那就需要用科学的办法,从技术的角度来提高自己的开发效率

编码快:

语言分这么多种类就是因为它们有自己的应用场景,要开发一套系统虽然在理论上讲用任何语言都可以coding,但是每种语言在实现不同场景时的开发速率是不一样的,这是由语言本身的特性所决定的。一般我们能用脚本语言搞定的就不用Java,能用Java搞定的就不用C,而且语言本身也有很多变种和分支,例如JavaScript的三驾马车,Java的Scala、Groovy两大变种。就拿Groovy来说,它的coding效率估计要比Java快一倍。

利用开源:

不要重复发明轮子,因为你不是第一个吃螃蟹的人,github肯定有巨人们已经给你把路铺好了,用现成的永远比自己重新开发来得更快些。我刚入职谋某份工作的时候用8个月的时间开发了一套系统,其实github上google和Netflix等公司早就开源了类似的产品,而且我8个月的东西跟他们的比起来就是玩具,可见合理利用开源是多么重要的技能。

但是国内的开源氛围并不好。

一方面研发人员都是拿来主义用完就算,很少有人会回馈社区;

另一方面,客户方对开源仍存在误区,总以为开源是廉价、不稳定、野路子、不专业的代名词,他们更愿意多花个几百万去买个商业的工具,殊不知这些商业工具很多就是开源包装起来的。

目前以BAT为首的大型互联网企业已经开始注重开源这一块,例如一些涉及到混合云的开源工具,如果你不去支持开源,那么使用这些工具的企业也不会采购你的云平台。反之,你支持自己云平台的代码提交到github上,客户在使用过程中发现的bug和修复的代码也会源源不断地回馈回github上来,就会形成一个良性循环。

上手快:

互联网中用到的所有的技术基本都是默认可用和水平扩展的,为了满足“上手快”的要求。例如Spring Cloud中启动参数基本都有默认值,zookeeper、elasticsearch、logstash、kafka等组件目录结构都是bin里是启动程序,conf里是配置程序,解压开箱即可用,都有默认值,通过配置做水平扩展。Redis、MqSql等在Linux中甚至可以以apt-get或者yum的方式来安装使用,

如何学习新技术

每天都有新技术的推出,我们该如何学习这些新技术或新组件呢?我分享下我自己的学习思路,我把它称为4轮学习法

第一轮,初步了解新技术的背景、特性、解决场景,对它的作用有个宏观上的理解。

第二轮,深入这个技术的算法和原理,架构图、数据流向、角色特性等等,这是个相对漫长的过程,需要有一定的聪明才智和学习能力。可以通过默写法来检验自己的掌握程度,在白纸上把原理和设计恢复出来,哪里有疑问就标注下来,回头继续去查。

目前为止应该掌握了80%了,但是有些细节通过理论学习还是不清楚怎么办?

第三轮,研究新技术安装和消费程序代码。安装过程中每一个操作步骤是在干什么,里面的配置是为了干什么,客户端代码里每一行代码,特别设计到端口配置项的都是为了干什么。这些可以弥补细节上的不明白的地方。

第四轮,实战中去碰壁,遇到问题后再慢慢研究吧。

禁止空中楼阁

设计思想的实现必定基于具体的技术,所以在学习过程中不要妄图绕过不懂的技术直接去看高大上的课题,例如在学习HBase时如果不明白元数据、zookeeper这些概念你是不能真正学会的,学习上层技术时遇到底层技术的空缺应道立刻停止当前学习,先把底层的掌握好再回来继续,否则你根本看不懂别人为什么那么去设计

找到它的小伙伴

孤立的去学习一项技术很难彻底理解它的意义,很多东西组合起来才会迸发出无穷的魔力。例如ELK日志三兄弟,zookeeper解决master/slaver选举问题,Git+Jenkins这对CI搭档。就像乐高积木一样,你会的技术越多,你手上的资源就越多,组合后的种类也就越多,搭建起来的成品也就越丰富多彩

而且产生关联的技术点是最不容易被忘记的。例如妈妈要去国外旅游一个月,叮嘱过我记得给她的花浇水,但是我每天都会忘记。后来我想到一个绝招,用我的洗脚水来浇花,因为我每天回到家第一件事就是要泡脚,然后顺便用洗脚水来浇花,让洗脚与浇花产生了关联关系,就不再那么容易忘记了。

总结:

如果你相当一个创业公司的老板,请先想清楚如何让客户认可你愿意为你买单;如果你相当一个技术大牛,那就要掌握互联网技术的“快”。

作者:牛麦康纳

给我留言

留言无头像?