上次的访谈,介绍了下可爱的依云酱,回忆传送门。不知看了上期访谈的小伙伴对依云酱有什么印象,清蒸就一个印象:可爱。可爱的人和事物总是受大家欢迎的,比如,可爱的 Gakki,被 SF 前端小姐姐亲切地称呼为老婆,当然喜欢可爱事物的不止是前端小姐姐,还有清蒸认识的其他程序员 -- 豪大大、传奇老师等等,今天的访谈的社区用户也是一个喜欢可爱事物,混迹 ACG,给他灌一个称谓:在 ACG 界混的最好的 developer,在 Coding 界混的最好的 ACGer,不服来战。
有请本期嘉宾:mcfog ?
轻松的个人部分
作为本期的嘉宾,mcfog 兄弟走个流程,先来个自我介绍下吧
大家好,我叫 mcfog,现居上海,闷骚傲娇属性,{技术|动漫|游戏}宅,本身是全栈工程师,近两年主要做后端方向。比起解决纯技术问题,更擅长的还是抓业务和技术的结合点,语言方面按照个人经验和水平来排的话 PHP >= JavaScript > CSS > 其他吧
清蒸认识几个程序员都是自带二次元属性的,貌似 mcfog 个人主页也打了一个 acg 标签,最近可有追新番?有什么推荐吗?
年纪大了已经从追新番退化成追完结了,今年一月番质量实在高,导致现在看四月番都挑不出几个感兴趣的呢,一月番给萌豚推荐「龙女仆」和「加百列」,给非萌豚推荐「昭和」(第一季没看务必补上)和「兽娘动物园」吧。
这里简单地介绍下「龙女仆」,全名「小林家的龙女仆」,为什么介绍这部剧呢?因为 SF 设计狮 -- 颜值同学也安利了这部。
剧情简介:在独身又劳累的小林(划重点:一名程序员
)身边突然出现的穿着女仆服装的美少女托尔。长着犄角和尾巴的她,有着正如龙娘一样的身姿。说是被喝醉酒的小林邀请到家中来的托尔,在一阵手足无措中居然开始作为小林家的女仆工作…
不知道 mcfog 有没有收藏什么手办,可以放几张照片让清蒸舔舔屏吗?
手办坑太大太深,我完全没有跳坑的胆量…平时也就弄点小小的周边宅物,比如这种,如字面意思的天天舔。
我司的前端小姐姐最近沉迷农药不可自拔,不知道 mcfog 你是否也是身中农药之毒?除了农药之外,你更倾向玩哪类游戏呢?
啊,同事都已经开农药联赛了,被带着前两天下载了试玩了,已经卸载。从分类上我即使不算 core gamer,至少也是最接近核心的那一拨类型的,一个游戏没有背后的世界观、文化背景,同时又没有真正意义上的竞技价值的话,我是完全提不起劲的。哦,只有竞技价值的因为我手残所以也提不起劲
除此之外我的狩猎范围倒还挺广泛的,各种各样的主机掌机游戏基本都有玩,按照 MRU 来算最近最常玩的大概是家里玩屁股和 FIFA,路上玩火纹和塞尔达吧。
严肃的正文部分
我逛了你的个人主站,首页效果非常酷炫,你的个人主站搭建过程中用到了哪些技术呢?
就 impress.js,没了。看到这个库感觉蛮来电的就拿来搞了个 about 页面。最后出入 #/overview 的时候 radial-gradient 配上 transition 的效果我还挺满意的,发现我源码没贴,最近有空更新一波顺便把源码也传一下吧,有兴趣的关注 mcfog@github 吧。
你在问题:怎么衡量前端达到了什么水平中谈到编码是我们最不重要的工作,思考,归纳,演绎才是我辈本职,该怎么理解这句话呢?
台上三分钟, 台下十年功。作家把书稿写到纸上也好,歌手在舞台上演唱也罢,程序员把程序敲到电脑里编译调试也罢,都只是最后出成果的那一下而已。作家书写的好不好看的是他写书之前的素材、灵感积累,文笔磨练,歌手歌唱的棒不棒看的是他台下的练习试唱彩排,程序员也一样,台下部分的思考、归纳、演绎这些工作才是日常,你看别人,如果只看上机编程熟练无比代码写的又快又好,就像你作为一个外行看作家写的书感人肺腑,歌手唱的歌余音绕梁一样,那是外行看热闹而已。
最近有个小话题【十年的老代码,你敢动?】,mcfog 你是怎么看待这个问题的呢?你觉得怎么样的代码才是优雅的呢?
怎么搞老代码我还真的在有一次团队分享里聊过,不过那次路径是反的,先从好代码长什么样聊起,最后才提到的老代码怎么办。
大概讲一下我的观点吧,“代码是给人看”这句话的潜台词,其实是代码除了机器要能运行,符合需求之外,需要包含足够的信息,比如技术方面的,你的整体架构,你的模块粒度,解耦的边界,也包括业务方面的,哪些东西是经常变的业务规则(夏季大促满100减25
),哪些东西是偶尔变的参数配置(类目树
),哪些东西是业务上不会变的核心((订单金额-代金券) * 优惠规则+运费+支付手续费=支付金额
)
优雅的代码就是这些信息高效而规则的聚集在一起,我知道我想看你怎么承担高并发可以直接看数据层到最终落地存储的过程,想看下单业务逻辑可以去看下单 service 的校验方法和下单方法等等
因此我觉得最优雅的代码就是能做到很清晰的分成三部分:
- 第一部分:“业务逻辑层”里面的代码是任何懂英文的人都看得懂的,需求文档的描述,唯一的区别就是他真的能运行
- 第二部分:“规则引擎层”负责把上一层里的东西落地实现,提供业务 DSL 能力
- 第三部分:基础架构层抽象硬件的能力,比如存储模块抽象 DB 和缓存的存储能力,路由模块抽象网卡的分发能力,又比如前端组件化后的前端组件抽象了客户端的交互能力等等
这样基本能做到“技术需求”比如提高并发能力之类的只管第三部分,“业务需求”如果不突破原有的 DSL 限制,可以只改第一部分,如果有突破,那么先增强第二部分的 DSL 能力,再在第一部分里描述。
我把这种理想状态叫做“CODE AS PRD”,代码即需求文档,随便你产品怎么改需求,我都可以不动脑筋地跟上你修改的速度,跟不上算我输;随便哪个开发来接我的项目,我都告诉你这几个类就是需求文档,至于他为啥能跑,自己 trace,句号,交接不顺利算我输。
(扯的好像太远了)最后关于处理老代码的问题,我有上中下三策和一个核心关注点:
- 下策曰忍,应该不用解释
- 中策曰滴水穿石,在大致掌握了需求和系统的全貌以后选择一个点来击穿,比如先重构用户体系,那就先把非用户体系的需求搁着在原有体系中维护,而把用户体系构建一个新的,好的新模块替代掉。一个常见的稳妥办法可以先不动数据结构也不动写入逻辑,先接管读取逻辑,再一点点改写数据的逻辑,因为读取逻辑已经接完,此时同时变动数据结构风险也比较小。
- 上策曰自动化测试,让你疼的代码多半没有完善的测试覆盖,所以你不敢改,所以先搞自动化测试体系,这让你即使因为项目时间压力无法大规模重构,也有基础的安全绳拉着你不摔落悬崖。只要是被测试基本覆盖的模块,重构起来负担自然小很多,结合中策按业务拆分循序渐进、结合SOA微服务设计思路,一夜跨入现代化时代不是梦
核心关注点:你必须接受老代码最重要的优势:it works。虽然是老代码,但那是生产上运行的,千锤百炼的老代码。做任何事情之前,都和你的QA部门作好沟通和计划。专业的程序员是一定不会号称“重构基础架构”结果搞出一堆生产问题的
mcfog 前东家 ifaclub 是主打金融类产品,可以谈下你加入团队的初衷吗?以及产品开发过程中使用的技术栈吗?
作为本科生加入腾讯,初始职级实在太低(后来已调高),升级路太远,前老板拉我创业,项目当时看也有很好的机会,于是就去了…
技术栈的话,标准的 LNMP,Redis 这些之外,我们选择了 RabbitMQ 来做消息队列,除了活跃度、生态、性能等因素以外,主要看中他在数据一致性方面相对可靠。
金融类产品都相当注重数据的安全、可靠性,你们团队是如何确保数据的安全性的呢?
编码角度来说,做好两件事:贯彻防御式编程风格,产生任何副作用(写数据也好,请求外部接口也罢)前一定完整检查所有前提。完善日志体系,确保所有关键节点的日志,做好日志的收集归纳等自动化工作,持续优化告警体系,小心不要让告警数量超出一定范围,频繁的告警尽快整理方案系统性解决
还有就是架构角度和 QA 角度的支持了,完善的监控告警体系,备份体系,测试和自动化测试的用例覆盖等等
当然,线上问题是防不胜防的,“亡羊补牢”也是非常重要的环节,在出现生产问题,解决之后的总结,寻找同类问题,重构系统,也是我们能把整个系统越做越好的重要方式
在PHP开发中,选择合适的框架有助于加快软件开发,而你在文章【如何挑选PHP框架?】 中谈到要从团队、项目、框架本身等三个方面考虑,可以从框架本身的基本素质谈一谈 Yii 和 Laravel 吗?
就我个人的角度,向未来看,Yii2 和 Laravel 都是即将过时的框架了,可能大家觉得我有些狂妄,但我是基于非常理性的总结思考得出这个结论的
- 请大家想想,如果 Composer 对于 PHP 来说是迟到的 NPM,那么对应 Node 生态的 web 框架胜者是谁?它的特点是什么?如果我们认同 Composer 这样的包管理依赖管理是先进的,那么未来框架的演化方向必然是远离 Yii2 和 Laravel 这样的“全干全包”的框架的
- 移动端,微服务,SOA 的大趋势下,未来 php 框架需要支持的场景将会越来越差异化,API 项目不需要路由和模版渲染,中前端项目不需要 DB 访问抽象,框架的入口从 FPM,Crontab 拓展到队列 Consumer,Thrift 等 RPC 服务入口等等,单一的单体框架势必越来越无法满足这样的差异化
当然我不是说 Yii2 和 Laravel 会挂,实际上 Yii 从 1 到 2 就已经跨了一个世代,但相对 Yii1 是 2008 年的东西了,我相信到 2027 年我们回头来看当前的 Yii2 和目前的 Laravel4 和 5,一定和我们现在看 CI2 看 Yii1 是一样的心情和看法
就 Laravel 和 Yii2 两者之间比较的话,首先就社区生态来说,Laravel 完胜(能媲美的也就只有 Symfony 社区了),这让 Laravel 在周边的扩展、模块等占上风。Laravel 的问题在于,它堆叠了很多的概念,其中不乏真正的好东西,但也有花架子,如果要用,请带上你的思考,切记生搬硬套。而 Yii 的核心要简洁明了一些,这让 Yii 偏向中庸一些,是个非常安全的选择。
我眼中未来的 PHP “框架”,就概念上就一定和现在的框架有区别(目前的两个世代大致是按命名空间和 composer 来划分的,概念上并没有本质区别),不再是“全家桶”式的单体框架,而是走向差异化。大概可以分为三类,一类是真正在技术上(而不是语法糖或是 convention 层面的)提供基础能力的,比如 Swoole 提供异步、协程的能力,比如 Zephir( Phalcon 的底层)提供的非常容易整合系统底层能力和 PHP 上层能力的中间语言
另一类则是真正类似 Express、Koa 这样的,核心中间件协议+大量周边中间件的框架生态群。目前看来似乎反而是 ZF 家的 Zend-expressive 在这方面稍稍领先,另一个不得不提的是 StackPHP,他们跑的太早,快于 PSR,所以现在面临永远用 adapter 继续坚持 symfony/http-kernel 体系,还是转战 PSR 体系和 zend-expressive 竞争。目前看来这样的转变还需要一段时间,我觉得大家也可以和我一起关注一下这个趋势。顺便,我觉得虽然这波趋势很明显地像 Express,但生搬硬套的效果可能并不好,毕竟比起 JS,PHP 在语言层面其实一直在接近“动态的 Java ”
第三类则是 Drupal,Wordpress 这样的,带基础功能实现的“框架”,快速支持实现相对标准的需求,对这类框架(系统)来说,Composer 的出现反而是个很好的机会,可以通过 Packagist 快速形成社区生态(而无须像 Drupal、Wordpress 那样通过商业公司运作来养生态),这也是一个“穿越牛熊”的,无论PHP如何演化都会持续存在的类别
当然实际上 PHP 的生态演化的速度其实并不快(我觉得适中,Laravel 这样的速度作为最快的那个够了,现在不少社区跑的比Laravel快的,开发者追的太辛苦),所以目前来看选择单体框架还是非常现实的选择,我心目中一流的选择,除了 Laravel 和 Yii2 之外,还向大家推荐 Symfony2 和 Slim3 吧,哦,提到 Slim3 也就还应该加上 S 和 L 两家的派生小弟弟 Silex 和 Lumen。
突如其来的招聘
不知道 mcfog 的新东家是如何的,以及新东家是否还在招兵买马呢?
实际上在收到访谈的这两天,我已经敲定了离职和新东家,Amino Apps 是业务在国外,研发中心在国内的移动端兴趣社交公司,36kr报道,我们招高级前端和全栈(语言不限,嗯,我这两天在恶补 python,哈哈),我们走的是精英小团队的路线,你得有足够的技术能力和责任心来单独 cover 一条线。简历请发 bWNmb2d3QGdtYWlsLmNvbQ==(补充说明:有关于邮箱的解释请看本文的剧场版之硬广时间)
采访小花絮
小剧场之封面设计
(清蒸):(一本正经地咨询)你有什么想法吗,对你的封面图?每个专访都会设计一个封面图的
(mcfog):没啥特别的想法……(来自清蒸的解读:总觉得这个省略号隐藏着什么信息…)
(清蒸):那,我可以用艾斯的背影当元素吗?
(mcfog):艾斯是啥
(清蒸):- -。海贼里面的哥哥啦
(mcfog):[捂脸]海贼王不算动漫
(清蒸):(╯‵□′)╯︵┻━┻ 海贼怎么了
(mcfog):死火海和柯南都不算啦
(清蒸):(勉强维持的微笑)请举例说明它们不符合动漫的原因 1 2 3
(mcfog):(一言不合甩链接)民工漫
(清蒸):(一言不合甩需求)给设计师妹纸写了一个设计需求
卒
小剧场之硬广时间
(清蒸):mcfog 大兄弟,我们给你留了一个广告位,需要吗?啤酒花生随便卖
(mcfog)思考状
(清蒸):不要浪费啊,你看看隔壁公子,卖床位招人,现在有一个免费的广告位预留给你,好好珍惜呀
(mcfog)招聘,眼前一亮
(mcfog):那就为新东家 Amino 招个人吧,简历发送至:bWNmb2d3QGdtYWlsLmNvbQ==
(清蒸)一脸懵逼:这个邮箱没给错吗?
(mcfog):邮箱是对的,看不懂的程序员不要[傲娇脸]
以上,就是对邮箱的解释,且看且珍惜,祝你们好运~
mcfog 的语录
为什么突然增加了这么一块内容呢?因为清蒸对 mcfog 大兄弟的某些言论深表赞同
- 我特别想谈谈“文章”和“笔记”的区别,前者是你表达一个观点,描述一种思想的,“一身功力的结晶”,而后者只是某些知识点的整理记录。(摘录自:怎么衡量前端达到了什么水平)
- 想清楚学习的目的,避免为学而学.比如高并发,秒杀,架构,这些经常都是现有业务接触不到的东西,学习起来一般两种目的:要么为了应对面试,要么为了日后业务发展,需要的时候能够顶上(知识储备)(摘录自:感觉学PHP开发网站到瓶颈了,技术上不知如何突破,希望大神指点推荐几本书,谢谢!)
放在文末的下期预告
下一期的访谈对象是清蒸认识 coding 时间最长的一名程序员:@边城 ,据说 97 年开始写代码,20 年的码龄,且看他如何 Coding Twenty Years , Learning Twenty Years。本期访谈到此结束,下期见~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。