分类
大杂烩

2021年的最后一天

肉眼可见新冠疫情还是影响着我们的生活,虽然可能有时候不是很近,但也不远。又因为这个世界都是连接着的,所以心理总是会有扭结。今天是21年的最后一天,总结一年成果若干,最大的成果是身体状态异常的好,可以说达到历史巅峰水平,肌肥大训练到了一个新的层次,对自己的认识更充分。其次读了很多很多书,把南北朝的历史盲区补充了起来,以及元朝的历史和欧洲罗马史。希望22年大家都健康起来,病毒不再横行,找到终结病毒的办法。

分类
大杂烩

撤销了Serverless回到容器版本的wordpress

今天撤回WP回到自己的K8S上面,发现腾讯云的DOCKER HUB官方同步镜像停止更新了,需要自己把官方的wordpress镜像搬到CCR腾讯的个人版本容器镜像服务才能继续使用。拉到本地,打了个TAG,推到了CCR,重新部署完毕,是的,又好了。

分类
大杂烩

腾讯云CLB负载均衡大涨价,Serverless仍然是纸上谈兵。

年底了,腾讯云突然给CLB负载均衡涨价了,要知道一个问题,当你的服务全部容器化之后,暴露出的服务最好走的是ingress,而ingress是和负载均衡的功能绑定的,使用量最小单位是一个k8s命名空间使用一个(曾经腾讯的ingress是只能绑定一个证书,现在可以绑多个了)。这样带来的结果是,你的费用会突然大幅度的提高,尤其当你划分某些辅助用的业务在一个独立的namespace里方便管理,而单独提供此命名空间的clb费用可能比你单独租用轻服务器的费用还高,这样显然是极其不合理的!

试图降低费用,我把zhouzhou.net的服务以serverless的方式从k8s中分离。体验之后发现,serverless在现阶段依然是纸上谈兵,通过api网关他视图提供一个web服务的标准生态,比如版本,路由,日志等等重要的基础功能。但是serverless的问题是,第一点,它对代码是入侵的,你的代码必须和你使用的IaaS云服务绑定,而各个供应商之间是没有标准的,这就导致你需要修改代码才能部署,虽然不入侵到业务层面,但完整的测试流程依然是让你头痛的,他可能适用于SaaS方式给客户部署业务的供应商,这样的成本会相对的低廉。第二点,serverless的生态即它的运行时环境其实不友好,你得到的环境都相对的不是最新的,是云商给你做的,可能和你开发环境有非常大的差异,当你发现有因为环境而导致出现问题自己却无法解决的时候,是难受的。第三点,以前有传统的web容器,所以我们有了CGI(通用网关接口)来和各个语言通信,现在由于web容器的服务被api网关全部代替了,那么里面跑的是什么呢?很不幸,以PHP为例,是以内置服务器方式跑,而这个模式在官方手册中不建议跑生产环境。当然这个问题k8s也会碰到,你的镜像大都有套娃,ingress里面套nginx,只是为了看上去平滑兼容,如果有一种通用容器接口,就能解决最后一公里的问题。

分类
大杂烩

现阶段腾讯云的容器服务TKE是最好生产环境的 理由

TKE和腾讯云的资源结合很好,和自己的云服务器CVM配合完美,如果有钱也可以用黑石服务器。

使用了TKE就不用关心Master节点了,因为完全被腾讯云托管了,换言之,不管你有几个node,你不用支付Master节点的费用。

随着TencentHub这个DevOps半成品被腾讯自己收购的coding取代,你会发现TKE的镜像特别好用,因为大部分走了容器这条路之后,大部分公司尤其初创企业他没有特别多的构建步骤,TKE的镜像纯BUILD是完全可以满足你的,如果你要走完成的持续集成也不难。

TKE的日志服务也很方便,可以走kafka,ES,或者你自己的CLS服务,如果是小项目直接cls的控制台操作操作就很方便,开箱即用。

TKE的K8S版本更新还是比较快的,尤其是Master节点被托管了,升级没有什么压力,如果node升级失败,移出集群重新加回来即可。

我自己用了2年TKE,看着他一点点增强,还是非常满意的,即使遇到问题,腾云客服的响应速度也是杠杠滴!

分类
大杂烩

生活没有意义,只有生命才有意义。

切莫因为一句话而误解了初衷,我想表达的是很幸运我们生活在和平年代,这样才能让生命更有意义,而不用担心生活的琐碎。

算起来中国五千年的历史里没有战乱的太平日子其实并不多,处于经济上行拥有强大军事实力,老百姓不愁吃喝的日子估摸着只有现在了。你换个角度看,现在地球也不太平,坐个飞机换个车最快几个小时就能到达一个硝烟弥漫的战区。所以更庆幸有了太平,才有了生活的基础,这一点,很好。

生活就是衣食住行的构成,是维持你生命,工作学习的基本面。得益于经济发展和现代科技,我想说要达到生活舒适区的阈值其实并不难。

举个例子,不用买大牌,不说淘宝,店里的衣服绝对多的超越你的选择范围,而且要款式有款式要舒适有舒适,也并不是很贵。

当你明白食物有三大营养素构成之后,你会发现饮食的学问很简单,太多太少都不好,也明白了很多山珍海味并不会因为他的稀缺性而有获取它的渴望。而且吃的更简单更科学之后,也会帮助改进你的身体机能和外形。

小时候满街自行车,谁想到长大了可以开轿车上下班,有了车作为代步工具的功能,其实挺满足的,随时一脚油门可以来一次说走就走的旅行。同样的,生活中有了卫洗丽,洗碗机,烘干机,咖啡机,微波炉等等等等,都让你充满了便利,而且现在他们也并不贵。

SO,我想说的是,现在年代进入舒适区的阈值挺方便。因为我们的时间有限,可以“懒”一点,多做一些更有意义的事情,而不是在衣食住行上盲目的升级。

举一个不最惬当的例子,你星巴克喝一杯咖啡,本质上和你在酒店酒廊喝一杯带来的效果不会差太多,差不多的咖啡因摄入。抛开费用和社交功能,他们同样消耗了办个小时左右的时间,单位时间做的事情才是更关键的。

在有限的时间里,因人而异可以做很多学问,研究很多方向。而在此过程中获得的满足感远大于简单的衣食住行之类满足,这才是生命的意义。

所以我觉得你应该最快速的进入舒适区,这样生活就没有意义,你才有机会去追求生命的意义!

分类
大杂烩

Flutter真的很棒,Dart真香。

最早有文本,后来为了表述的结构化,有了标点符号。http的到来升级成了超文本,有了文档对象模型,这大大丰富的对于文本对象的描述,jquery能方便的操作dom感觉酷毙了!后来,react来了,他说,数据驱动一切,只要操作state剩下的他来搞定。那都数据驱动了,剩下dom有何用。所以用oop语言的高级特性来描述界面,没有比这个更棒了。

是的,flutter来了,彻底的革命性的移动ux/ui框架,包含了全套谷歌的最佳实践,只要你想得到的就能做到。

使用的dart语言也很棒,现代化语言的标志之一,是将设计模式语义化,有了within可以轻松的使用mixin(装饰器模式),有了factory构造工厂方法愈发简单,有了命名构造函数,静态阶段代码阅读性更好。

强烈推荐大家尝试使用flutter,即将彻底杀死原生ios和android开发。

分类
大杂烩

为了公益,为了狗狗,91xungou.com寻狗小程序上线了!

不太更blog,因为有太多工作上的事情,尤其zhouzhou.net的备案搞了半天终于弄完善了,终于我能回来了。

首先呢,我要推荐大家访问https://www.91xungou.com这是我最新制作的一个网站,其实它不仅仅是一个网站,起源自微信小程序“寻狗”(微信用户可以搜索“寻狗”两字就能找到我做的小程序)以及新浪微博账号“寻狗小程序”。

一看名字就知道,这是一个帮助主人找回失踪狗狗的工具,利用小程序的特性可以快速的录入垂直字段,通过分享机制(生成朋友圈分享图片,分享好友和群,同步推送到网站以及微博)快速的帮助狗狗主人传播失踪狗狗的讯息,方便快速的发布寻狗启事。同时,将散落在各处割裂的信息源合并放一个页面,这样方便狗主人汇总线索!

目前来看,工作效果非常好,用户数节节攀升,可以明显看到数据在提高。我会把产品,代码的心得不定时的分享出来,加深自己的体会。

分类
大杂烩

自己的docker基础镜像php-fpm+nginx+alpine+composer,专为symfony4优化。

https://github.com/nickzhuo/phpallinone

Nginx: 1.13.10
PHP: 7.2.3
Redis客户端: 4.0.0
Composer: 最新版
ALPINE: 3.7

也可以直接使用build完毕的镜像

daocloud.io/nickzhuo/phpallinone:latest

分类
大杂烩

Hello world!

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

分类
大杂烩

把证书从startssl换到了腾讯云免费的TrustAsia

有点后知后觉,发现startssl的根证书即将被浏览器移除了,当然老的已颁发证书不受影响。ps:好像国内的证书,沃通也被禁了。

SSL对网络非常重要,尤其做接口来说,例如你可以在你的客户端做ssl pinning,保证百分百的传送安全,当然SSL会加重服务器的消耗,但这又算得了什么呢。

查了一下,腾讯云提供免费的DV证书,真的很不错,另外表扬下,腾讯云的产品感觉和性能感觉已经超过阿里云很多。

分类
大杂烩

时速云老是断,把网站搬到香港搬瓦工。

最近一段时间每天都能收到监控宝关于时速云的大量警告,也不知道是为什么,到底是误报还是时速云的问题。正巧也需要一台服务器跑点程序,弄了台香港搬瓦工,感受感受,目前来看很棒,用docker管理服务真的很惬意。

分类
大杂烩

让我们给业务做减法,给代码做减法。

最重要的写在开头:道术合一,知行合一

现在是讯息爆炸的时代,搜索引擎降低了学习的门槛,凡是都能从百度谷歌了解个一二。正因为这随手就来的一二,带来了想要的“结果”,让大家只掌握了术,但忽视了道。我认为“道术合一,知行合一”,术是千变万化的,但是道确实永远的,做减法就是我自己的代码之道。

可怕的观点:执行效率是第一

我经常听到一种观点,代码需要的是更快的执行效率。以及由这个观点产生的衍生观点,例如:设计模式并不重要等等,因为我们可以绕过框架或者现有的方法,用更“原生”的方式实现一样的结果,这样会运行的“更快”。这是一个可怕的观点,可怕就可怕在看上去没错。软件行业发展到现在已相当成熟,我们绝不能用单一指标衡量代码,如同我们不能用百公里加速来衡量一个车,如果这样想,无疑要选比亚迪,实际情况真的是这样么?

代码是一种业务的体现:全方位的评估才合理

代码是一种业务能力的体现,举个例子:小轿车是个人出行业务的体现,全方位评估软件工程带来的结果才更合理。尤其在国内,人天的成本大幅度的提高,技术团队每天的开支相比其他传统行业近乎天文数字,我们对于迭代周期要求非常的高,单个sprint产出的价值太重要,甚至于正版软件相较于人力成本也已经变得是一个合理的支出范围。所有,我更倾向于,在初期掌握一支小型化技术团队,把握住业务的核心,最大程度整合资源,打通外部内部数据,且团队要能不停的适应业务的变化。而且不光是技术团队,所有业务团队其实都应该如此。

业务好等于代码好:好业务是不停迭代出来的

很多人都告诉我,自己的代码写的多么多么的好,一次写完永久运行。但这样好么,我可以负责的说,这样的代码不值钱。互联网业务是不停的试错出来的,业务好不好对公司来说就是赚钱不赚钱,也就常常带来一个问题,需求肯定不停的变化。我以为业务的打磨是好事,因为没有人能一下找到赚钱的模式,再牛X的业务都是不停的迭代变化出来的。所以,要做到能快速的迭代,我们必须让代码能够快速的变化。可能有些负责通知或者工具类的运维小脚本,写完之后可以静静的躺着运行若干年,但不代表这个代码是好的,只是代表业务是死的。但唯有赚钱的业务才需要不停的修改不停的改变,所以我的观点就是代码是不停的在迭代改变的,同样的我很悲观,盖房子的还能看到楼房屹立100年,作为软件从业者,你的作品可能只能在世界上存活3个月,这是一个非常残酷的事实。

代码变化的本质:反应业务的变化

业务随着时间的推移,往往公司从一开始一个人管全部到后来的运营分工精细化,这背后涉及的是人员和部门的变化。所以当设计系统的时候必然会参考业务部分的划分,使用者划分,和场景的划分等来做设计。如果能在动手写代码之前闭上眼睛看到使用者工作的状态,线下业务转线上的整个过程,思考出每个节点,那就是一种正确的模式,因为你看到了业务,看到了代码的真正价值体现!

语言的进化:都是为了业务

面向过程编程之所以进化到了面向对象,是因为我们发现所有的业务都是存在现实世界中事物对照的,以及他们的关系。有了面向对象,抽象让我们可以更好概括真实世界,多态让代码中事物拥有同时对应多个现实世界事物的能力,继承让我们能够复用大量的代码。进化到了面向切面,我们发现业务不停的在做微调,所谓的微调无非是一些业务逻辑在场景中顺序的改变,有了AOP这样棒的工具,代码的组织变得更合理,当然阅读性会差点。所有的代码特性进化其实本质都是为了更好的表达业务,包括可以用trait来实现一些非通用的多继承,用生成器让函数的返回变得“动态”起来。

最后

业务是一组代码的集成,如同你开了一个面馆,没有必要非自己磨出面粉做出的面条才是最好的。站在一个更高的格局看系统,你需要的是有限的资源下,包装面馆,整合所有。把握最核心,例如浇头做核心,抓大放小。夸张的说,即使只开了一个小店,但是想着一个跨国企业规模。还是那句话,尽可能的在年轻的学习阶段过度设计自己的系统,然后不停的做减法,就能真正的感悟系统,最后你会特别理解罗斯科的作品,真的不用太复杂。

最最后

谨以此文,把自己的小小感悟献给刘锦,一个任劳任怨,每天认真工作学习的安庆少年,未来的安庆马克·罗斯科。

分类
大杂烩

最近互联网周边的体验

今天订阅号直奔主题,简单的说说一些周边体验,可能有些与实际已经不符,而且也仅仅是一家之言,如有冒犯请见谅。

开头题外话多说一句,为什么要用周边,我觉得艺术圈给我带来最大的理解之一就是艺术品的市场价值和艺术价值是不挂钩的,同理也适用在软件行业,代码的商业价值和技术价值是不挂钩的。切莫局限在技术的片面表现中,越走越细,举个例子,当你把关系型数据库看成一个服务的时候,不仅仅是简单的提供sql运行能力,还要有分布式,要有冷备份热备份,还有高可用,要有健康程度监控,要有审计,等等,当你完成了这整个服务方案的时候你发现你的业务还没开始。再举个例子,如果没有七牛这样的周边,可能一些图片APP团队还在自建分布式文件系统中,沉没在fastdfs的泥潭中。我们要最快的整合周边,把商业价值放大,这样才有闲置资源放大技术价值。

再中间插一句,很多很多小伙伴和好朋友问我现在去了哪里,借订阅号宝地说一句。老夫已经把天赋带到了空艺术,一个艺术平台。贯穿艺术领域各垂直和横向、国内和国际产业链,整合线上和线下资源,打破艺术领域与资本和非专业化消费受众壁垒间迅速发挥领军作用。(妈蛋,这个介绍是复制的,不是我写的。)

容器和持续集成篇

Daocloud:国内容器团队,他提供了一套容器管理面板和完整的CI功能,可以完成代码上传后的自动触发构建,测试,部署,监控。生产环境容器必须部署在自己的云上,本身提供的主机称为胶囊主机,只是作为调试用。他提供的SaaS服务包含数据库和缓存也只能用在测试环节,如果你已经有自己的托管主机或者有自己的IaaS供应商可以考虑使用它。但Daocloud有一个致命问题,不支持集群,它的集群是一个“假”集群,只是随机把服务放到某一台机器上而已。CI部分,Dao的优点在于他有国外主机用来build镜像,速度非常的快,因为我们的代码包大量依赖第三方源。可惜的是,对于junit的输出xml格式兼容性有点问题,嵌套多个testcase输出的结果无法兼容,可能要手工输出成dao需要的格式,或者等他们升级。Daocloud的服务很棒,上班时间客服反映迅速,我个人强烈推荐容器爱好者注册一个Dao,只要有一台自己的PC机,简单装上他们的agent,就能开启你的第一次容器之旅。对了,Daovoice也是一个很棒的功能,可以为你提供一个在线客服聊天,当然很简单很初级。最新他们也出了DCE可以部署在私有云上的管理套件,但还是那个问题,没有解决集群的话,他对企业的帮助不大。

数人云:他提供了一套开源的可以私有化部署的基于SwarmKit的管理面板,但我真想说这个公司就是完全来搞笑的,代码的完成度非常的低,开源并不是可以为质量不负责做借口的依据,使用过程中充满BUG,用了之后我整个人都不好了。

灵雀云:很干脆,基本就是一个镜像仓库加速和容器面板,没有数据库缓存之类的周边,这个是致命伤,CI做的也很一般,和Daocloud不能比。最讨厌的是客服也不友好,当你表达出没有付费意愿之后,就把你切成了免费账号,只有一个镜像功能,有点大牌哦。

网易蜂巢:迅速的成长中,每次登陆都可以发现大网易版本迭代很快的,而且投了百度的关键字竞价。但就从Build环节老失败说起,没有国外节点,很容易buld不过去。没有提供测试环节,所以就是镜像构建加部署等等,用起来的感觉很稚嫩,不过界面配色我挺喜欢的。

时速云:放在最后必然要重点介绍,如果你是一个创业公司刚起步,那么我觉得时速云是最棒的体验,他提供了创业团队需要的一切,我指的是一切。在保证自己代码团队已经完全容器化之后,你无须购买任何主机,只要push代码就能完成CI/CD,部署,监控等一条龙服务。他是基于k8s的架构,所以自然而然的天生能力强者,他提供的主机完全可以用在生产环境,关键是一个容器的最便宜收费才28.8人民刀一个月,简直太便宜了不是。他的团队也提供了分布式的Mysql和分布式Redis给你使用,当然Mongodb以及大数据的周边还没,但是对于创业公司来说这已足够,关键足够的便宜!缺点也有,没有外国的Build主机,我有超过1G的镜像会很容易build失败,界面追求炫酷,有些控件不实用,例如查看构建日志就容易把浏览器弄崩溃。还有一个很神奇的地方在于,帮助文档没有搜索,这挺诡异的。但我还是强烈推荐时速云,我觉得是国内目前容器提供商中最有潜力最有前途的一个。

IaaS篇

青云QingCloud:着重介绍下青云,目前我公司的业务都跑在上面。青云的最大优势在于技术上非常先进,尤其刚开的上海区,网络完全基于SDN/NFV,我一直认为光主机虚拟化是不解决任何问题的,网络必须虚拟化。这点青云目前国内做的最好,不像阿里云的经典网络被很多人吐槽,没办法,技术肯定是越新越好的。青云的后台及其的友好,产品经理应该是下了大工夫的。尤其是大数据部分,做的真的很全,Elasticsearch,Spark,Storm青云是目前最好的选择,有点爱不释手,我简单计算了下计算能力,同等计算能力下,费用是阿里云的8折。青云还有一个独门秘籍,因为支持SDN,所以可以让Docker直接用SDN代替Docker Overlay,简单到只要装一个他们的插件即可。推荐青云+Daocloud的组合,可以满足中大型互联网公司的基本95%的需求。

Ucloud:和青云的对决中已经处于下风,本来也是一个很新的IaaS,周边不全,可能聚焦的不是大数据的业务,听说服务游戏商比较多。

阿里云:有点老了,但是阿里云有自己的优势,ECS可以选择的机房多,例如我公司的SS服务器就放在阿里云香港节点,但时间跨度太久了,他真的老了,而且价格体系非常混乱,同配置的服务器测下来总感觉慢一点。如果你有机房地区的特殊要求,可以选择阿里云,但不推荐。

Azure:试用的流程有点繁琐,爱买不买的样子,放弃。

代码库

Github:私有库要收费,其他没缺点啊!

Coding.net:因为自己团队代码在上,体验比较深刻。有很多bug,例如:项目在团队和个人之见转移可能会出权限问题,感觉还不能商业化,最诡异的地方在于当你希望成为付费用户的时候,你会发现收费是基于项目而不是团队,对你来说收费的好处仅仅是可以让一个项目的开发者超过50个人,天哪,真有单项目那么庞大的开发团队吗,恩。除此之外,界面很丑,交互操作的感觉很糟糕。

测试

Swathub:简直让我大呼哇塞的一款产品,简单说就是SaaS化的selenium,非常非常有前途,使用难度非常低,通过向导式的表单可以很轻松的建立一个testcase,并且保存在云端供整个测试团队学习使用,说的通俗点他真的就是一段可以控制浏览器的代码,让你的测试团队不再是按键精灵,节约了很多鼠标。通过api触发配置在CI环节简直神器!能大大幅度的提高测试过程的效率!但是特殊的控件,例如:bootstrap的组件,由于DOM的多层嵌套或者布局的缘故需要自己手写对应的选择器。如果我有钱我会考虑收购这家公司,非常有前途。:D

分类
大杂烩

想要成为PHP高手的十个建议

勇哥对我说,我写的都是道,但是大部分人需要的是术。我恍然大悟,想想这有道理,道理虽然是根本,但是术还是要有的。特别推出一针灵系列,顺手弄个耸动标题吸点粉,请轻喷。

PHP使用简单,上手特别的快,这导致使用者水平参差不齐。而且因为诞生时间太久,有很多冗余的东西,缺点堆堆的,这里不展开。有太多技巧可以提高水平,今天先说十个,有些可能非常颠覆你的想法,但请听听我的看法。

1。熟练使用SPL,这是基础

PHP本身是一门工具,SPL是工具中的工具。SPL的使用会大大简化你的设计,我发现N多程序员无法回答和SPL相关的问题,这是致命的。例如:SplSubject接口可以轻松帮助你做出一个观察者设计模式,SPL系列迭代器满足99%的使用场景,虽然你可能不写自动加载,但是spl_autoload干嘛的总要知道吧。

2。参数需要注入,不要和环境发生依赖关系

你写的代码承载的是你的业务,业务是可以工作在CGI或者CLI下的。看到太多的Sample中控制器会直接使用$_GET,$_POST之类的环境变量,这是致命的。如果你的模型层也有直接获得GPC,恭喜你,重构已经提上议事日程,因为你的业务根本无法再CLI下执行,请把环境变量和业务参数的绑定设计成注入的关系。

3。不用写任何一行注释,熟练运用PHPDoc

代码本身是不用注释的,难道你会在一个user变量中保存一个order讯息么?当然不会,因为他叫user呀,代码本身应该如同说话一般流畅,在写代码的同时最好打开一个词霸。而PHPDoc是你的备注,强化代码对使用者的帮助,让所有的“人”(例如:IDE)明白你的意思,静态代码检测是一切效率的基础。

4。任何模板引擎都是垃圾

这是我的个人观点,为什么要使用另外一种DSL去描述模板呢?除非你能将模板工作交给一个专门团队做,而且用的引擎应该是跨语言的。实际生产环境中,只要有静态页面,和JS的模板引擎足够了,除非你要为SEO做服务。额外说一下,大量的模板引擎把模板和缓存有绑定在一起,灾难加灾难等于毁灭。SO,我从不会面试提问任何Smarty的问题,因为那就是一坨屎。

5。使用PHP编写路由而不是依赖HTTP容器

这个问题和参数注入类似,很多代码中包含的.htaccess其实是很无厘头的,路由也是业务的一部分(除了锁定入口)。我只想问一句话,你的代码难道不想运行在nginx,IIS,lighthttpd上了么?还有很多http容器呢!如果你想把自己的代码商品化,切记把路由放在代码中。而且我想说.htaccess简单的语法,是无法和高级路由器相比的。

6。显示声明变量并且初始化

任何变量使用之前请初始化,如果你是一个合格的程序员。虽然PHP本身会很无厘头的包容你的这些做法,但是这很不职业,尤其extract函数配合GPC使用,导致的后果是致命的,可能覆盖任何关键变量。如果要我配置php.ini,第一个就把extract给disable掉。

7。优秀的代码必须使用Composer

代码是一种服务的载体,所以必须灵活部署,他需要有自己的包依赖管理和autoload管理。千万别在自己写autoload了,我相信你可以,Composer的出现解放了太多PHP程序员。而且请记得千万在本地部署一套本地Composer(Docker做很容易),因为你的CI(持续集成)用得到他。

8。只有视图才会用到Array

这一点很难做到,因为PHP的Array太变态好用。在我的理解中Array只是一具尸体(无法控制读写,无法控制公开程度,没有方法),在业务中所有的值必须以对象的形式传递,这样才能在每一层中做对应的约束等等。只有在视图中才会用到Array,当然前面说了如果没有SEO,也就没有PHP视图,那么其实你的代码中可能就没有Array了。好吧,我的言行有点过激了。

9。不要在代码中随意退出

我想举个例子,你去别人家做客,从大门走进去,走的时候为什么要从窗户跳出去呢?MVC中单一入口进入,其实还有后半句话,要从单一出口退出。如果代码不是你一个人写的,任何程序员无权在自己的辖区内中断代码,因为你根本不知道Runtime时候上下文关系,可能导致OB失效,导致HOOK失效,等等。如果你说这样节约性能,我只想建议别用百度。

10。优秀的PHP程序员必须关注死亡皇后岛订阅号

好吧,这才是这篇文章的目的,只有关注了死亡皇后岛,才能第一时间获得舟哥手写各种语言的心得。谢谢大家,关注之余不要忘记随手转发,万分感谢。

分类
大杂烩

编程感悟系列:本地方法和远程方法与可见性问题

    数据库一不小心说了四节,自己觉得有点枯燥,那就开一个新系列讲关于编程感悟吧(多一个一级菜单真是一个不错的选择啊)。

    我总是建议年轻的程序员(虽然我也很年轻)应该把项目复杂化,尝试各种手段让自己的项目充满过度设计的感觉。然后静下心来做‍减法,当你会用减法并且理解其中奥秘的时候,才能学到编程的精髓,才能学会用编程的方式思考问题!

    而且你会惊讶的发现,解决问题的过程实在是令人着迷,倘若你的工作只是完成需求,那么根据契约精神你只能收获的是工资。罗伯特清崎在《穷爸爸和富爸爸》里写到,“老板发你的工资是保证你不会离职的下限”。我的理解是,在工作中不应该只获得工资,更多的是学习知识!

    说到减法,举一个不恰当的例子,暴雪的最新游戏《守望先锋》就是一个做减法的典型,当国内游戏从业者一个劲的往产品叠加功能,例如:每日签到模块,抽奖模块等。《守望先锋》却大幅度精简系统,没有一丝的肉。是他没有能力做类似签到模块么?显然不是,是因为他的终极诉求是为了带来愉快,所以玩守望的每一分钟都没有被浪费的感觉。

    为什么这次的题目是《本地方法和远程方法与可见性问题》呢?我发现问题都是连环相扣的,我要用代码可见性问题做引子,推出我的观点,代码本身就是最最好的注释。本地方法就是本地文件夹定义的function,通过本地引用方式调用定义的方法,缺点是调用者和实现者必须相同语言,你无法用java调取ruby写的方法。本篇中我把跨语言的调用都称呼为远程方法,当然可能他不是真的在“远程”,同语言也可能是远程方式调用。

    为了进一步说明代码本身是最好的注释,我创造了三个名词,代码可见,文档可见和定义可见来帮助大家阅读。对每个人来说,本地方法使用起来非常便捷,常常得到一个软件包放到项目内就能跑起来,这其实就是代码可见。当你无法理解上下文的时候,只要进入代码里看一眼便能明白有什么问题。代码可见简单直观,只要你有源代码,你就明白他是干啥用的。

    远程方法使用起来很是麻烦,我们需要去找实现者写的定义文档,可能是一个json,可能是一个wiki,也可能是一个Markdown文档,里面的描述尽可能的详细,总之按照里面说的定义方法使用肯定没问题。但是糟糕的是,万一远程方法返回了“不该发生的东西”,这怎么办?这往往是因为文档的更新总是落后于代码造成的,也许我们在条件充足的情况下,会精心的制作文档。一旦hotfix来临,谁还会想起在深夜2,3点更新自己的文档呢?常常以来,文档成了第一行代码者的专利。

    文档可见看着很美丽,真正用起来,但也别着急否定它。我认为这是一个好东西,因为代码不光面对是的研发人员还有测试人员等。不要有了点缺点就否定它,我们要帮助它变好,只是需要大量的周边去维护,手工维护文档是不科学的!

    Github上充斥着大量的RPC框架,基本都是基于某个协议层,支持多语言的服务客户端实现等云云,最最关键的一点是会告诉你,一旦用了它速度提高N个级别等等。毫无疑问,这些性能指标肯定是真实存在的,但衡量服务调用难道就用一个性能指标就够了吗?到底我们需要什么样的框架呢?

    定义可见浮上水面,用SOAP举例子。经常听N多人说SOAP好慢呀,没有自己写的简单框架来得快,我永远不参与类似讨论,虽然我不是SOAP支持者,性能太过低下,但我们要理解为什么这样做。SOAP支持WSDL,这就是定义可见,我支持定义可见。支持WSDL的IDE,例如:Eclipse,只要基于WSDL实例化客户端,代码的使用如同本地方法!

    WSDL给了我们什么启示?原来定义可见多么的重要,我们的工作方式也会随之改变。先定义我们要的方法,基于定义产生文档,也基于定义实现客户端和服务端。这一切不就是TDD(Test-Driven Development)么?通过现代化的工具(例如:Swagger)帮助你完成“无脑”工作岂不是更好,所有围绕这个方法工作的人们,都能协作无偿提高效率,这就是定义之美。

    可见性就是为了让“人”更懂方法,这个人可能是真的人也有可能是电脑(IDE),也可能是以前的你和未来的你,一切的定义都必须显示,他真的能让效率提高。看到这里,你想说你的代码里没有那么多远程调用,但我想说的是,即便很多本地代码也定义含糊不清,静态代码分析在你的代码面前失了效,没有代码提示怎么让你的代码被传播,多利用注解Annotation等等技巧(请关注新的一针灵系列)让你的代码更容易被更多的人读懂吧。        

    当你调用远程方法和调用本地方法已经完全一样之后,那更抽象的理解方法到底是什么呢?方法是提供某个业务的能力,他需要分层,每一层既是调用者也是实现者更是定义者,到底该怎么分层?怎么描述结果,请支持关注本公众号,死亡皇后岛,老夫会为你做进一步解释。随手转发,关爱优质订阅号!