产品的一致性很重要

上周,在评审一个旧功能的改造过程中,发现同一件事,可以在多个场景适用,可以在单独的管理页面来管理,也可以在正常的流程中通过弹窗等方式管理,那么,同样的交互,如增删改,给用户的感觉,其内在逻辑和操作交互就应该都是一样的

对产品而言,保持逻辑一致,有助于降低用户认知成本,提高使用效率

对设计而言,是设计规范的一致性体现

对开发而言,能更好归纳总结需求,实现时一并处理,减少重复(并避免给未来留坑)

顶级工匠都在干掉行业内的低端从业者

最近做一个项目推动,期望是让设计师和开发人员之间可以用大量共识去快速推动新业务的开发上线,就是各种前端规范和组件,终极目标是希望产品人员直接原型给到开发,开发就可以根据已有的规范组件直接实现出来,而不需要设计再去设计页面交互等

其实想想,在这个过程中,需要参与的设计人员,是需要更高的抽象能力和把控能力,来促成这一项目完成,在完成后,就是让各种美工级别的同事没活干。推广一下,在工匠这个范畴内,顶级的从业者都是在不断的演化技术和能力,(在事实上)不停的干掉低端从业者,在对行业外人员提供更简单的应用的同事,抬高行业门槛

比如程序员和架构师,一直在发布更简单易用的开发语言和开发框架,后续的从业者要么是框架开发维护人员,要么就是产品人员整理好需求就可以直接产出结果,低端码农,只管从详细设计到实现的这一个层级,会被彻底干掉

比如设计师,在标品里提供设计规范,从而可以让产品原型直达开发人员,只要按规范直接产出就能有不错的界面效果,干掉切图仔和低端美工

比如历史上的打字员,在输入法各种改进后,人人都能轻松输入(拼音、语音 etc),整个职业直接消失

还有流水线工人和机器人应用,还有快递外卖和无人送货,等等等等

为 VPS 开启 BBR,生活更美好

Google 开发发布的 bbr 是为了优化 TCP 协议上的拥塞问题,早就被人各种安利,自己也一直也懒得整。前几个月另外买了台 bwg 的 vps 后,想起来有这么个东西,把在 vultr 和 bwg 的 vps 都开起来 bbr,开启后果然网速和丢包情况都得到了肉眼可见的显著改善,大赞。关于开启方法,现在的内核版本都跟上来了,不用像早期那样要各种折腾,基本是傻瓜式操作就可以解决,善用搜索,我就不制造垃圾信息了

还被安利了 kcptun 和 v2ray 之类的好久,一直也没有太大动力去整,毕竟我并不太在乎让某些人不爽的用法,仅仅只是能维持连通就行

大道至简

上年纪了就喜欢各种絮叨,开始给小朋友们灌鸡汤。当然,正面一点的说法是慢慢的也经历了这么多事情,开始归纳总结下人生经验

技术做久了,也经历那么多项目和需求,最后发现,还是大道至简。凡是能简单搞定的事情,就不要搞复杂了。做复杂了做的成本要高很多,用起来的学习成本和推广成本也要高很多,而且复杂后出问题的概率也要高很多

当然,怎么把复杂的问题拆解归纳,将其简单化,这也是非常重要的一个技能,在技术圈,面对源源不断的精力更旺盛的年轻人,这才是年资长的人的立身之本

大道至简。重剑无锋,大巧不工。无招胜有招。很多这样的武侠精义说的其实都是类似的观点

莫言莫语 5

爸爸你不要去上班了,妈妈去上班赚钱

早上不想爸爸走,但是不够啊

妈妈你是在当医生么

跟在上班的妈妈视频,看到妈妈穿着白大褂

我口水都要流出来了

晚饭后说拿个橘子来给他吃,刚起身去拿,小馋猫就开始务必期待

你没有带快递么?

经常回家的时候会带着快递(特别是给莫莫的玩具啥的),小朋友经常看到爸妈回来两手空空,就会略失望下

你帮我剥开下

自己开门,自己找到放零食的纸盒子,自己拆包装,到最后铝塑包装撕不开了就会巴巴跑过来要求拆

我还要吃维生素!

按科学喂养每天补充维生素软糖,一天一颗,但是似乎这玩意儿味道还挺好的?有个娃总还想着多吃,经常还会闹着要。最近一次已经学会自己按住盖子拧开了。不过,这个要按住盖子才能拧开的设计,不就是防小朋友乱来的么?果然儿童锁都只能防一岁以内的儿童和老人?

莫言莫语 4

爸爸你要说「谢谢」,妈妈你要说「不用谢」

带了两个快递回家,有一个是给莫莫的白板,妈妈先拿了剪刀在拆自己的快递,莫莫催爸爸问妈妈要剪刀,等妈妈把剪刀给爸爸后马上安排爸爸说「谢谢」,等爸爸说了谢谢立马提醒妈妈还要说「不用谢」。现在的日常礼仪做的还挺好,有时候他说了「谢谢」或「对不起」,大人没回他「不用谢」和「没关系」,会很严肃的说「你没有说不用谢」

我们都剪了头发,我们都是小帅哥

给莫莫剪了头发,没两天爸爸也去理发了,某天在家陪莫莫玩,他突然盯着爸爸来了这么一句。妈妈表示你还挺臭美的

我够得着,我会自己想办法

家里贴了块白板贴到客厅墙上,莫莫最喜欢在上面各种画,有一盒笔放在玄关柜子上,他得踮起脚来才能够到,发现爸爸在看他,立马很得意的如是说

叶喵!

爸爸总这样叫妈妈,结果莫莫有时候叫妈妈没理的时候,也会学爸爸这样大喊,妈妈很无奈「我不叫叶喵啊」

我会自己想办法的

小朋友已经学会搬各种高矮凳子爬上去来让自己够到电视柜上面的各种零食,有大人看到会担心他摔了,想过去保护他时,反倒被得意反秀

你留一点给我嘛

妈妈吃零食,莫宝总是很机警的问「你在吃什么」「哪来的」「还有吗」「是给小朋友吃的吗」「小朋友可以吃吗」,某次妈妈又找出来某吃的时候,莫宝拖长了音用小委屈样对妈妈喊

我就吃一个

莫莫和妈妈吃葡萄干,一包都快吃完了,留了一点给爸爸,等爸爸把剩下的几颗全倒手上,问莫莫你还要不要吃,过来看看说我就吃一个,塞嘴里后立马伸手又把剩下的几颗都拿了往嘴里一塞,喂喂你说好了只吃一个的呢

民智未开:Google 靠什么赚钱?

前两天看到一个微信公众号的新闻,内容是微软时隔十多年,重新回到市值第一的位置,因为跌的少,超过了最近在大下行趋势下跌的更多的苹果和 Alphabet(Google 现在的母公司,其实就是以前大家意义上的 Google),下面不知何故扯上 Google,有人说「Google 靠广告赚钱」,然后就有脑残粉跳出来说「那些说 Google 靠广告赚钱的是把 Google 和百度混为一谈么」,以及「谷歌推动人工智能投了多少钱等等等等」,看完真的是气笑了,民智未开啊

有很多脑残粉,真的是一粉顶十黑。Google 在很多技术领域有卓越的贡献和引路作用,也提供了非常好的服务,但作为一个盈利性的公司,目前他的主要收入来源和商业模式确实就是广告。广告本身不是什么坏东西,笨狗做过几年互联网广告算法,个人理解广告的本质就是一种信息,至于这个信息是真是假,以及是否是推送给需要的场景,那是广告审核和广告效果考虑的问题。说 Google 靠广告赚钱,真不是要抹黑脑残粉心中的圣殿,而是事实如此,Google 的财报,新员工入职的培训等,都主动明确的阐述了自己的主要收入来源是广告

关于商业模式真的也挺有意思的,互联网其实就只有这几个主要收入方式:1) 广告;2) 增值服务;3) 实体售卖;4) 虚拟物品(游戏)。广告其实是绝大部分互联网企业的收入方式,包括 Google,Facebook,YouTube,微博,阿里巴巴等,这里可能出现了几个大家觉得奇怪的名字,后面会细说。增值服务拓展一下其实包括的内容挺多,包括服务订阅,比如 QQ 的会员,视频网站的付费会员,或按订阅付费的商业服务如 Office365。实体售卖比如纯粹的电商,低进高出,自己赚个差价。虚拟物品就像 QQ 秀(其实这个到底算虚拟还是算增值还有待商榷),以及各种游戏里的充值和物品

我们提到 Google 经常会觉得是人类之光的存在,但一个商业公司终究还是要活下去的,那么 Google 就是利用他的入口优势,在搜索结果里明示嵌入和当前搜索意图相关的广告信息,从而获利(AdWords),以及,把搜索结果扩展到各种其他站点的嵌入区域(AdSense),还有视频、地图等场景(YouTube)。之所以会有 Google 各种伟光正的感觉,一是 Google 的广告审核相对严格,不至于把各种虚假诈骗等信息堂而皇之的放出来,二是 Google 的广告匹配算法相对高效,确有其相关性,不至于很突兀,三是 Google 的广告展示还是相对克制,不至于一屏大部分都是广告而没有自然结果。再加上 Google 对国内市场也不占优,国人看到的广告的确少,所以道德婊们无法接受把 Google 和某些被唾骂的公司相提并论,事实上如果挂上美帝代理,搜英文结果看看更普适情况下的 Google,可能会让某些人大失所望

微博自己纯粹的广告体系不足以支撑那么大的估值,会员服务也不给力,必然会导致官方或大 V 有各种软广,比如热搜榜,比如大 V 软文带货,这也是社区无法避免的困境。Facebook 好在市场足够大,自己的相关度和效果跟踪也足够明确,所以还可以靠比较纯粹的广告体系提供营收,但一旦用户活跃度下降,市场压力下估计也难独善其身,这也是为什么现在 FB 在下行大环境下掉的比大盘多那么多,大家都有这样的担心。如果说看衰 FB 是杞人忧天,那么隔壁的 Twitter 总是个现成例子吧,看看过去的财报和数据,事实胜于雄辩

阿里对民众包装的都是个卖货的平台,除了阿里云这种企业服务,天猫收佣金,其他的大头也还是广告。阿里在 07 年的时候公开拒绝百度收录和提供搜索结果,所有的购物搜索还是从淘宝自己的入口进来,控制了入口,控制了流量分配,就决定了广告市场有多大。(事实上 07 年的事技术上挺难做到屏蔽,但公开喊话了百度也不太合适拉下面子去做这种还有点下三滥的事)

记得之前还在做广告算法时有位大神吐槽过「我们这个年代最聪明的人,不是探索未知星辰大海,而是竭尽所能让人们去点广告,真是可悲」,的确,因为互联网企业的高薪水,现在的聪明人大部分都去了这些互联网企业,很多人也确实在各种优化广告效果。对这个吐槽,反驳无能,像「只是为人们提供更匹配的信息服务」这样的理由还是苍白无力。公司和员工都还是要活下去的,金钱也不可能凭空生成,后面离开这个行业,多少也有点这个原因。现在做企业服务,就是帮人节省时间或人力,收取比他节省部分更少的服务费用,双赢,也更踏实

人人网备份工具终于算个活跃的 GitHub 项目了

人人网社交资产真的卖给了多牛所致,renrenBackup 这个项目在 GitHub 上很快多了好多 star(也是自己跑到人人和 v2ex 上安利了一波),也有人提 issue 和 PR,这样也挺好,项目有人用有人吐槽,才算一个合适的项目

开心的是

  1. 自己做的东西有人用,能帮到人,这是做技术的人最开心的吧
  2. 有更多奇怪的边界条件被挖掘到,从而增强项目健壮性
  3. 有人帮忙提 PR,主动帮忙处理边界条件

好气也好笑的有

  1. 各种无脑提需求或试图引入各种第三方库来实现某些功能的,我都各种努力把 BeautifulSoup 和 pyquery 给从依赖去掉,你还要我加回去?目标还是能尽可能的简单的运行起来,我还想做 .exe 的版本给 Windows 用呢
  2. 人人改过登录逻辑,不用每次都取加密 key 了,在撞上验证码时无法正常工作。修复前还跟人争了半天,不过之前那个取验证码的逻辑也写的有问题,多取了一次
  3. 真的是各种意想不到的脏数据
    • 评论里有用户已经销号,有字段缺值,返回的 json 都是不合法的
    • 相册加密,能看到里面的张数但是打不开
    • 抓别人的留言板遇上留言板不公开,第一页都打不开

比较不高兴的有

  1. 提问题像大爷一般,好像欠着他什么一样的口气,我做这个又没收你钱,做着玩的东西,大家有问题一起好好分析,能解决去解决,不能解决把问题复现步骤更明确的给出来让有能力的人去解决就好,谁也不欠谁

莫莫两岁半

两岁半了,国庆后去社区医院体检,身高还是在 30 分位的样子,体重转好到 30 分位,头围基本没变,这个倒有 70 分位。没有贫血缺钙,骨密度都偏高,暂时看不用太过担心补钙什么的问题

到医院还是各种不乐意,量身高体重都是爸爸伯伯加医生一起三个人按住才搞定,抽血也是三个人一人抱住,一人按手腕,医生捏手指。扎了点指尖血,后面一直要包着搞得跟受了多大伤一样,回来一上午都不高兴,中午破例睡了一觉才好

现在习惯了坐餐椅,到吃饭的点会自己踩着茶几爬上去,夏天结束爸爸把客厅的落地扇拿走后茶几靠边了点,现在不好自己爬了也是个问题

还是喜欢看电视,要一边看一边吃,更狠的时候要一边看电视一边给他读书一边吃饭,娃都这么惯的么

晚上睡前不让隔拉拉裤或尿不湿,会说穿起来「痛痛的」,都是等睡着了再隔上,毕竟现在晚上睡着了不会主动说要尿尿。有时候等睡着打算给他换的时候可能已经尿床了,洗床单和垫子的频率有点高,现在天气凉快后睡着后很快能睡比较沉,还是麻溜的换上好

看爸爸用电脑会跑去要看各种动物的图片,看了猎豹抓羚羊的图,在小区玩时会说「我是猎豹,爸爸你是羚羊,我来抓你」,终于可以不那么懒,需要路上一直要抱着

不过路上还是偏懒,各种赖着要抱,自己带滑板车出去都是要大人拖着走,而不是踩着走,到玩的地方了倒是下来折腾的各种起劲

打算白天给溜溜好睡午觉,都还是失败,现在彻底放弃中午弄睡他的念头,还是保持一个他舒服的稳定作息的好,晚上八点半左右进房间喂奶洗漱,平静下来,九点半到十点自己睡着,早上八点半左右叫醒来

晚上睡觉有时候会说「我还睡不着」,明明都困的不行都在各种打哈欠揉眼睛了,就是贪玩,早上被弄醒时会撒娇「我还想睡」,其实也睡差不多了,如果没睡够是不会一戳就醒,而且还会有很大起床气

国庆前带去动物园玩,想带去自己想玩的地方自己多走走,结果一路各种要爸爸和伯伯抱着,这么爱出汗的娃当天衣服一点潮湿的感觉都没有,到底是溜娃还是溜的大人(手动捂脸)

对自己的凉鞋情有独钟,出去总要穿凉鞋,天气刚转凉那会都劝不住,只能藏起来。对自己习惯的东西还是各种舍不得

会各种安排别人来照顾他,尤其睡前安排特别好,洗过澡后在床上让爸爸喂奶,然后「伯伯你去洗澡,妈妈你去洗奶瓶,爸爸陪我睡觉」

能很快从一数到十,不过真的让他数东西了又各种乱搞,也还不太会一个一个点着数

开始在小马桶上拉臭臭,在外面撒尿可以直接裤子往下扒了站着尿草丛去,在家还是大人抱着撒大马桶里,或者拉个小板凳来自己站在马桶旁边撒

各种热烈的表达爱意,每天想起来就会来一句「我爱你」,或者是面对多人时的「我爱你们」,但是如果要自己玩懒得陪你时就会来一句「我不爱你了」(手动笑哭)

还是喜欢折腾人,特别是伯伯和妈妈的长发,会抓的乱七八糟的,伯伯说多了「都被你抓成颠婆」后,还会主动说「我要把你抓成一个颠婆」

对自己的东西还是看的很牢,出去玩不太跟人交换玩具,会强调「这是我的」,真遇上别人有自己特别想玩的才会在劝说下试图跟人换换。平时还是都注意跟他讲要分享,再就是等这个物权欲时期自然过去吧

在家吃到好吃的,不想被爸妈分享或打算独吞时各种理由:「你不可以吃的」「这个有口水」「它脏了」「吃了会肚肚痛」,如果被当面强行吃掉,会发飙「吐出来!」

爸爸把半年多前买的宜家小火车再拿出来玩,现在能玩了就疯狂的痴迷小火车,等爸爸再去淘宝额外补了一些轨道和车后,更是痴迷的不行,早上醒来都会说「给我换衣服,我要玩小火车」

在电视柜前弄了各种假的吃的摆了一排,还会各种热情的拉家长说「你假装吃吧」

更坦然的面对离别,伯伯回家去了几天,提前跟他说好,然后他也能平静的说「伯伯回老家去了,过几天再回来」,不会像以前那样要闹一两天才能缓过来。不过每天早上爸爸去上班想主动告别,多半还是会被留下来「爸爸不要去上班」「爸爸陪我玩」

问想不想要妹妹,现在会说「妈妈你现在就给我生个妹妹吧」,再问你的玩具给妹妹一起玩好不好,立马紧张「这些都是给男孩子玩的,女孩子不可以玩的」,再问那我们把书给妹妹看好不好,还是紧张找借口「这个太复杂了,看不懂的」,笑翻旁人

还是不愿意好好区分兄弟姐妹之间的称呼,会管自己的毛绒兔兔叫姐姐,然后又说自己是她哥哥。先随他吧,现在嘴上逆反特别厉害,跟他说什么都会跟你唱反调

出去菜店买菜,已经会各种自己挑,「我要吃这个」「我们买这个吧」,这样也好,在没有特别挑食的情况下,也懒得大人费劲去安排伙食

刷牙现在大部分时间能自己好好刷,大人再帮忙把各种角落补刷一下,之前都不让数牙齿,体检时跟医生说半年前一样还是 16 颗,后面爸爸仔细看了下应该是有 19 颗,离 20 颗乳牙长齐也快了,并没有特别慢

会很享受蚂蚁爬树的背部按摩,有时候想给他哄睡,说给他捏一捏,小家伙还会要求把手伸衣服里去给他捏,才不要隔着衣服做隔靴搔痒的敷衍

补遗: 机器学习手记系列 3 线性回归样例程序

距离 2012 的两三年后(这篇的草稿时间)又过了两三年,这个补遗看起来也烂尾了 -.-

之前在机器学习手记系列 3: 线性回归和最小二乘法后面留了个问题, 也给了结果, 但是当时说好的程序代码并没给出来, 那个手记系列的坑感觉填不上了, 但是已经刨好的小坑还是填上吧

现在已经有很多深度学习框架和教程来教这个,自己也忘得差不多了,就不班门弄斧裸写。推荐看一下 动手学深度学习 http://zh.gluon.ai/index.html,Deep Learning 领域大神 李沐 等人在维护(我能凑不要脸的蹭热度说下这是前百度同事我们还一起吃饭打牌来着么)。刨的小坑就按 线性回归的从零开始实现 http://zh.gluon.ai/chapter_deep-learning-basics/linear-regression-scratch.html 里的做法来实现

先重复下问题

如下式子里不同的阿拉伯数字只是一个符号, 实际表示的可能是其他数字
967621 = 3
797321 = 1
378581 = 4
422151 = 0
535951 = 1
335771 = 0

根据上述式子, 判断下式等于?
565441 = ?

这题的脑筋急转弯版本答案是看每个数字有几个圈,就代表几,这样 1/2/3/4/5/7 都是 0 个圈,6/9 是 1 个圈,8 是 2 个圈,所以最后 565441 里面只有 6 有 1 个圈,答案为 1

按 gluon 上的教程我们也来走一遍,装环境什么的就看 gluon 了,先引入要用的包

from mxnet import autograd, nd

真正做线性回归是没法只用这么一点数据来模拟的,所以我们要先根据真实值来构造一些数据(这里跟 gluon 不一样的是我没有 bias 因子 b,后面也请一并注意)

num_inputs = 9          # 特征数,当前问题里的变量数 1-9
num_examples = 1000     # 样例数,我们会随机生成多少份样例来学习
true_w = nd.array([0, 0, 0, 0, 0, 1, 0, 2, 1])  # 真实值
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))  # 随机生成数据集
labels = nd.dot(features, true_w)                                   # 数据集对应的结果

初始化模型参数并创建梯度

w = nd.random.normal(scale=0.01, shape=(9, 1))
w.attach_grad()

定义模型,我们就是做的矩阵乘法

def linreg(X, w):
    return nd.dot(X, w)

定义损失函数,用平方损失

def squared_loss(y_hat, y):
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

定义优化算法,用小批量随机梯度下降(因为我们只用了一个大参数 w,所以还是比 gluon 的样例简单)

def sgd(param, lr, batch_size):
    param[:] = param - lr * param.grad / batch_size

训练,取步长 lr 为 0.01,轮次为 1000 轮

def train():
    lr = 0.01
    num_epochs = 1000
    net = linreg
    loss = squared_loss

    for epoch in range(num_epochs):
        with autograd.record():
            l = loss(net(features, w), labels)
        l.backward()
        sgd(w, lr, labels.size)
        train_l = loss(net(features, w), labels)
        if epoch % 100 == 99:
            print("epoch {}, loss {}, w {}".format(epoch + 1, train_l.mean().asnumpy(), w))

验证下结果看看

if __name__ == "__main__":
    train()
    test = nd.array([1, 0, 0, 2, 2, 1, 0, 0, 0])    # 测试集,565441
    print(nd.dot(test, w))

随便跑了一次输出如下,注意模型里每个值的科学计数法的指数

epoch 1000, loss [  5.72006487e-09], w
[[ -6.20802666e-06]
 [  1.62000088e-05]
 [ -1.03610901e-05]
 [  7.82768348e-06]
 [  2.59973749e-05]
 [  9.99964714e-01]
 [  1.86312645e-05]
 [  1.99990368e+00]
 [  1.00001490e+00]]
<NDArray 9x1 @cpu(0)>

[ 1.00002611]
<NDArray 1 @cpu(0)>

忽略精度问题,可以认为符合真实结果

全部代码详见 https://gist.github.com/whusnoopy/af0aa6fd276ace8a7c4d483e586e936d