Currently browsing author

sbt

每日一点 – 儿童视角体验

曾经读过文章,说和小朋友交流的时候,如果站立着,那大人就会有种居高临下的感觉,小朋友也会因为仰视一个比自己更高大的人而有所畏惧。所以我们应该蹲下,保持视线和小朋友同高,营造一个相对平等的氛围。我之前在工作中涉及到一些和小朋友相关的内容,讨论中同事说,对于小朋友,一个我们随手打开的柜子,甚至水龙头,对小朋友们来说可能都是一场探险。当时我就很好奇,那是一种怎样的体验。

等等,为什么不做一个呢?做一个给成人通过各种形式体验孩童视角和生活的产品。

现有资料/产品

文学

首先,据我所知文学作品中鲜有把人类放在尺度上很渺小的地位上的。西方魔幻文学中会提到巨人,但是描绘的场景大多是巨人在人类世界生活的场景;东方文学也不例外,大多妖魔鬼怪都是和人类一般大小的,如来佛祖虽然大,但是每次也都是在天上出现,谁也不知道他家里什么样。

当然也有少数例外,比如杰克与豌豆 (Jack and the Beanstalk) 的故事其中描述了杰克种了豆子长大爬到巨人家里的情景,以及格列佛游记中对大人国的描述。但是相比反过来描述比人类渺小的生物的文学作品就很多了,蓝精灵,花仙子,拇指姑娘,牙齿仙女,七个小矮人,格列佛游记里的小人国,等等等。

游戏

小时候玩过一些电脑游戏,印象比较深的一个是操作玩具总动员里的那种绿色玩具士兵在家里打仗,零一个是可以控制玩具飞机在家里完成各种任务等等。 虽然对于游戏来说这些都是其本身的设定,但是让我到现在还能清楚记得当时画面,觉得很有创意的,正式这种在宏大空间中的设定。

知道现在,太空主题和一些魔幻主题的游戏还是会把主人公放在一个比他大很多的空间内,遇到的怪物,飞行器,建筑等等也可以给玩家带来某种程度的震撼。

影视作品

影视作品方面我了解的不多,但是印象深刻的有一个电影,描述了几个孩子玩弄父亲的实验工具,把自己缩小了。几个孩子于是在家中和花园中开始了各种探险,遇到了大很多的昆虫,植物等等。杰克和豌豆也有电影版。

游乐园

在巴黎附近有一个叫做“微型法国”(France Miniature) 的地方,里面建造了一些法国的标志性地点比如埃菲尔铁打,但确是缩小了几十倍的尺寸。国内深圳也有个世界之窗是同样的主题。这里只讨论体验,所以类似乐高之类的玩具并不考虑在内。

这些虽然是和这个点子相反的,但是却证明了潜在市场的存在。

产品构想

VR游戏

考虑到建设一个比人类大很多的实体环境可能不太现实,最简单的又有浸入式感受的,就是VR游戏了吧。好处是完全不受地点大小的局限,可以充分发挥设计者的想象力,但是缺点是需要游戏制作的专业人士参与,而且VR游戏的销量和其他游戏比还是相形见绌。而且也许已经有类似想法的游戏了。

密室逃脱

密室逃脱是另一个方案,可以把很多日常很小的物件放大若干倍,让迷失逃脱更有意思,比如一个人才能抱动的钥匙,一个需要合力才能打开的巨型鲁班锁等等。可是一般密室逃脱游戏的空间都很小,增加了设计的困难度。

游乐园

游乐园是另一个主意,相反于各类 mininature 的乐园,把一些平时很小的东西放大,然后让人们走在其中(比如可以做个类似《工作细胞》动漫中的概念,帮助小朋友学习人体内部的各种细胞和结构?)

 

写在最后

果然很久不写东西之后写作能力下降很多啊,也没法像之前专心下来连续一个小时写文章了,这篇文章也停了三四次,拖了一周多,越到后面约感觉虎头蛇尾,最后在去巴黎的火车上完成的。之后还有写瑞士指南的计划,希望可以坚持下去经常写点东西。

自制家用信息板 – 前言

我之前曾经计划把之前的 Nexus 7 平板电脑粘在衣柜门上做一个家用的信息板,当时主要用来显示天气。后来因为粘的不够紧摔到地上,我也就收起来了。近来一个瑞士小伙伴做了个可以控制家里只能家电的信息板,勾起了我重启项目的欲望。

背景

瑞士这个国家的一个特点,就是对数字化社会的接纳程度。无论是大小餐馆还是个人,有个专属的网站都是很正常的事情。各个滑雪场、景区、公共服务、银行的网站和APP质量普遍不错,特别是和隔壁的其他国家相比。

在瑞士生活不得不提到的就是瑞士铁路,简称 SBB/CFF/FFS(分别对应德语,意大利语和法语中“瑞士国家铁路”的简写)。瑞士铁路系统发达,虽然年限大多久远,运行速度不敢恭维,但是频次多,衔接好而且准点,是大多数人出行的主要方式。而其官方应用,SBB Mobile 也是必装应用之一。除了每次远行规划线路购买车票,平时每天早上上班也会打开看一眼,为什么呢?这其实和 SBB 的准点有关。我住在离火车站步行7分钟的地方,每天早上坐 09:23 的车去上班。因为火车一般非常准点,我不会提前去火车站,而是会计算好时间出门,大概在 09:22:40 的时候到站台,因为火车大概那个时间到,25秒后火车关门出发。

一般来说很美好,但是偶尔我会因为种种原因晚出门半分钟,那我就走快些。那晚出门1分钟呢?那我就要纠结了,要么连走带跑,要么坐15分钟后的下一班。再加上偶尔的火车晚点和取消,火车具体几点到的信息就非常重要。因为手机应用里只会显示超过3分钟的晚点情况,所以就需要其他的数据源和现实方式了,也就是文首说到的信息板。

技术

这种项目暂时没什么商业价值,所以主要用来打发时间,学习学习新的知识,做个人项目练练手。以安卓平板作为平台的话,大抵有 Native 安卓开发和 Web 网页应用开发两条路可以走。而身为全栈工程师的我基本不会安卓开发,而我对 Flutter 之类的新技术又不太有兴趣,所以准备做个 Web 应用。

后端呢,考虑到逻辑比较少,需求简单,也不是我学习的主要目标,所以在熟悉的 Django 和 Node.js 中选择了前者。注意我并不准备使用 Django 的 HTML 模板等功能。前端呢,我想尝试 Vue.js 很久了,这是个不错的机会。如果之后拓展需求的话,还可以考虑加入 PWA(Progressive Web App)的一些特性比如主动推送通知。

这些都会直接运行在我的小 Hub 上。我今年过年从国内买了个最近比较流行的小电脑,大小大概相当于5个移动电源,Gigabyte 品牌,Intel Celeron J4105 处理器带风扇,8G RAM,128G SSD + 1T HDD,集成显卡。这个新的电脑门类体积小耗电低,价格相对便宜,非常适用对性能要求不高的家庭,以及自己搭建服务器,性能比树莓派不知道高到那里去了。我在上面装了 Ubuntu,在路由器上做了端口推送 Port Forwarding,而瑞士的网正好 IP 一旦分配相对固定,所以直接把个人网站放在上面了,省的每年来回倒腾。再安装配置好 SMB 文件分享服务,这个小电脑就直接放在抽屉里了。平时用我的主机 Putty SSH 进去配合 Tmux 操作,代码和文件编辑则是直接通过 SMB,甚至可以再主机上运行 VS Code 直接编辑 Mini PC 上的文件。从此之后我下载的电影也都放在里面,配合我的 Android TV 里安装的 Kodi 来看,不要太爽。

说说之前一个 AppScript 项目中遇到的问题

今天写这么个技术文章,完全是因为我的一个AppScript项目遇到了些问题,之前一直没有想到什么解决的办法。直到今晚我又静下心来想,找到了解决方案,分享给大家。

背景

Google 的员工福利之一就是有在办公室有按摩服务。在绝大多数的办公室的人们都是使用一个内部的系统,可以在线预订按摩服务,20分钟作为单位,每个月有20分钟的免费额度。但是巴黎就非要弄个不一样的系统,不知道为什么,他们不愿意用公司统一的系统,而是一直采用手动联系的方式。就是说,每个想要按摩的人都要直接在线或者写邮件问一个管理人员,这个管理人员再负责所有的记录,收费,监督额度等等,实在是效率低下。而且像我这样内向的boy我相信有很多,不太愿意主动的和别人联系。

所以呢,我之前在巴黎上班的时候就和那个负责人联系,问问可不可以开发一个自动化的预订系统,一来是有个网页之类的界面方便预订,再来也能节约她的时间。

她当然同意啦,所以我花了些时间,用 Google Form + Google Spreadsheet + App Script 的架构把这么个东西写了出来,至于为什么用这么个架构,其实是有很多考虑的,这里就不展开了。简单地说,首先因为有个人信息,所以需要用公司内部系统;而自建网站的话,需要的后期维护成本很高,我也不可能永远负责;加上 Google Form 的 UI 很方便设计和更改,也支持 App Script。

程序不长,几百行,我也没有写 unit test,在简单的测试之后就上线了。之后得到了不少好评,但是随着使用频率的上升,也逐渐发现了些问题。

不知道 App Script 是什么?App Script 是 Google 开发的,语法非常接近 JavaScript 但是没有 DOM API 的一种语言。通常 App Script 程序被用来和 Google 的各类 API 进行交互,而 Google 的 Doc, Spreadsheet,Slide,Form 等等也支持 App Script,可以用来更改这些文档中的内容。

问题(们)

神秘的日历

先说个之前遇到的简单的问题,现在给你个年月日,number 类型,你建一个 js 的 Date 对象来储存起来传到之后的函数用。

我最开始想到的是,新建一个 Date,再把年月日改了,大概就是

// year, month, day are defined above
var startdate = new Date();
startdate.setYear(year);
startdate.setMonth(month);
startdate.setDay(day);

 

嗯,对的,这样大部分情况都没问题的,我也是这么想的,直到遇到了一个 bug,本来预约这个月的时段却加到了下个月的日历上。Debug 之后,发现问题在这:

// Suppose year, month, day are set to 2016, 9 and 27
// If today is 2017-08-31
var startdate = new Date();
// After setYear(), date will be 2016-08-31
startdate.setYear(year);
// After setMonth(), date will be 2016-09-31
startdate.setMonth(month);
// Wait a minute, 09-31? Hmm this doesn't sound right. September only has 30 days
// True, JavaScript will change this into 2016-10-01, so the date will always be valid
// even set an invalid date.
startdate.setDay(day);
// Now after setDay(), the date is officially 2016-10-27, instead of 2016-09-27

 

看懂了吗?对的,如果现在是31日,你把月份改到了一个只有30日的月份,那么 JavaScript 是不会报错的它会很智能的把日期算到一个正确的日期,同样的,如果你把日改到-2,那么它就会自动的把月份减一,日调到上个月的倒数第二天。而这就意味着,每到月底,new Date() 的日期为31,或者30 而下个月只有30或者28天的时候,程序就会有问题,新建的日期会是下个月的,而不是当月。

调换 setMonth 和 setDay 并不会改变这个bug,如果你在8月,setDay 到31的话,会自动变到09-01。

解决这个 bug 的办法很简单,就是利用直接利用 Date 的构造函数输入日期,而不是用 Date()

// new Date(<var>year</var>, <var>month</var>[, <var>date</var>[, <var>hours</var>[, <var>minutes</var>[, <var>seconds</var>[, <var>milliseconds</var>]]]]]);
var startdate = new Date(year, month, day);

更新冲突

了解这个问题需要一些背景知识。这个工具有三大部分,Form,Spreadsheet 和 App Script。

Form 是一个预先设计好的在线表格,其中大部分选项是固定的,但是可用时段的选项是可以被 App Script 更新的,这样当前面用户提交表格后,我们就用程序更新可用时段的列表。

Spreadsheet 是最主要的部分,其中首先有 Form 的原始用户输入结果;然后有所有按摩服务的时段的时间,日期和按摩师,是否已经被预约;还有一个整理后的所有用户的预约的信息,包括用户的姓名,预约时间,长度,以及手动添加的一些额外列。

App Script 拥有所有的逻辑。当用户提交 Form 之后,我们设置了一个 Trigger,这个 Trigger 触发器会执行一个函数,在这个函数里,我们首先检查用户是否已经使用了免费配额或者选择了付费,然后更新所有时段的表格,标记该时段为不可用,然后计算出剩下的长度分别为20分钟,40分钟以及60分钟的可用的时间段,更新 Form 中相关的选项,最后在记录表格内添加总结结果,在公用日历中添加一个事件并且添加用户信息这样用户就不会忘了。

嗯对的,虽然看起来要求很简单,但是实现起来也比较麻烦。

那么问题在哪呢?原来每次从用户提交表格触发函数开始执行,直到到最后一行执行完,需要好几秒的时间,因为 App Script 要反复调用 API 进行数据的读取和写入,还有一些计算要做。而如果在上一次的触发没有执行完,而又有一个用户提交表格的话,那么就会又触发一次这个函数。因为上一次的数据还没有写入,而这又不像其他更复杂的系统和语言一样可以设置进程安全的功能,就会出现连续提交的两个用户一个没有收到确认,另一个收到两次确认的情况。

在触发函数中,你是没有办法得到到底是哪个用户输入触发了程序的,所以我只能从用户原始输入那个表格中获取最后一行进行处理。而如果系统的同步做的不好的话,很可能出现问题,连续两次时间接近的触发都会使用最后的一行,而不是一个倒数第二行,一个最后一行。

总之,由于这个架构的限制,我们没有办法通过简单的技术手段实现两次触发之间的隔离。

那么怎么办呢?

一个办法是批处理,就是不是用户每次提交表格时更新表格和添加记录,而是每过一分钟执行一次,判断是否有新的输入,如果有的话,有几条就处理几条,轮流处理的话自然不会有问题。但是这个方法需要函数每分钟执行一次,如果这个时间太久的话,那么在用户选择了某个时段之后,这个时段在下次更新前仍然会显示可用,很可能出现用户无效预订的情况。

另一个办法,就是通过一个额外的表中的一个单元格作为 mutex,我们每次执行前判断 mutex 是否可用,如果可用的话,标记他为不可用,执行函数体,在执行完后再标记为可用。这是我目前偏向的解决办法,但是要注意,每次对 mutex 的修改后都要立即调用 Spreadsheet.flush() 来强制把更改刷入表格中,最小化可能出现死锁的情况。而这个方案的问题是,首先函数变得更复杂了一些,其次如果这种手动 mutex 还是出现了死锁的情况是,新的用户输入就都不能执行了,只能手动把 mutex 的那个单元格改掉才行。

也许还有其他的方法,但是考虑到这是个工作外的项目没有时间要求,我也就一直比较懒没有去处理。

 

在这里把这些想法和发现写出来分享给大家,共勉。

20170915 来瑞士的第一个月

太久没有码字,都已经不记得写字的乐趣了。

对我来说码字不是一个追求艺术的过程,我所有学科里最差的是语文,语文里最差的是作文。这么多年了,也写过不少东西,就是提高不了自己的作文水平,想来想去唯一的解释就是自己没这个天赋。想清楚这点以后,我就更加肆无忌惮的写流水帐了。

离上次写日记不知道多久了,生活也算是有不少变化,最重要的,就是来到了苏黎世。

其实换到另外一个国家工作生活,成本是很高的。人们都喜欢呆在舒服的环境里,你熟悉的一切,朋友,餐馆,公园,时间长了都会成为你生活的一部分。据说一个人能同时维持的朋友数量大概是200多,那么我想,你能熟悉的记得菜谱的餐馆,记得最佳散步路线的公园,记得某个时段人最少的电影院,也可能都是有限的

这本没什么需要感觉遗憾的,知道有人说了,要改变,要把自己放在不舒适的环境,这样才能进步。好,在有些事情上,这的确是对的,因为你对旧的事物的习惯已经影响到了你对新事物的接受能力,进而影响到了你的生活水平。可是对很多事情来说,改变的成本很高。

换一个城市生活,甚至换一个国家生活,意味着你不得不舍弃原先习以为常的便利和习惯,去培养,适应新的环境。你需要交新的朋友,一边需要找到志同道合的人,一方面又会担心想要维持以前的友谊;你需要找新的消遣,一边搜一边试;你需要适应新的工作,一边努力学习想早点做出贡献,一边又想尽快融入新的团队;你也许还要学习新的语言,处理各种繁琐的水电网交通住宿的手续,搬家买家具组装家具,找到周围最便宜的那个超市,,,

所以为什么还有那么多人要换国家换城市呢?

大抵只有两个答案:有的人是为了离开,有的人是为了更好的回来。

在安徽待了18年,在成都待了2年半,在台湾待了半年,在法国西边的布雷斯特待了3年,在巴黎待了3年,现在又到了苏黎世。我每次离开的原因不尽相同,决定去成都上大学,是因为本地没有好的学校,北京上海的好学校又成绩一般去不了;去台湾是为了拓宽眼界,虽然大部分时间都在玩;来到布雷斯特是因为不想考研也不想学GRE但是却想出国;来到巴黎是为了积累工作经验还有丰富的生活;而来到苏黎世,是为了职业的发展。

虽然都是换另一个城市生活,没次的理由都不尽相同,但是我感觉到最真切的,是每次改变需要的勇气越来越多。求学时期的我们很自由,大多数人没有生活的压力,但是当工作以后,生活的轨迹渐渐固定下来。举个例子,上学的时候就好像登山前的训练,每天重复着类似的训练,你之后去登哪座山并不重要。而开始工作就好象离开营地去登山,虽然视线里山还很远,但是你前面有之前登山者的足迹,背后也有跃跃欲试准备超越你的喘息。开始的时候每一步很艰难,但是你一旦适应了那个节奏,一步一步的,始终会离山顶更近。

好了这时候,你突然决定换个山攀登。

大多数人并不会在乎你,毕竟你只是和他们一起登山的众多人之一了,少了你他们照样继续。而你呢,要下定决心离开,还要准备离开的每一步,还要融入新的登山队伍里,习惯新的节奏和团队。

这个过程本身其实并不困难,我相信大部分人都能找到另一个城市的工作,也能负担更换城市的直接经济负担。最难的在我看来是下定决心的过程,决心去改变,去面对未知的生活,承担改变的风险。所以我一直很羡慕那些工作了以后还有决心改变的人,特别是在原先的环境已经不错的时候。

其实来瑞士这一个月觉得过得非常慢,因为工作和生活上的事情都非常多,说到底我也就换过一次国家,完全不记得有这么多麻烦的手续要办和新东西要学习适应了。有不少惊喜,也有不少要吐槽的,这些以后再说。

新的起点,我给自己定了三个目标,减肥练琴学语言。其实做着三件事都一样,就是锻炼自己的坚持力。离18岁越来越远,也越发感到发自内心的惰性。一天24小时,7小时在睡觉,8小时在工作,3小时在吃喝拉撒洗漱通勤,剩下6个小时。倘若再除去购物,旅游,发呆的时间,估计就只剩下4个小时了。这4个小时可以让你看三部电影,或者两部综艺,或者玩几局游戏,时间刷刷的就过去了。最讨厌的是在这样消费时间过后,内心还得感觉到一股内疚感,觉得自己的一天又这么过去了。左肩上的小人说你看你今天又没做正事,说好的目标呢你不觉得愧疚吗,右肩上的小人说没事今天上班一天好累了,休息好了才能更好的奋斗,洗洗睡,明天有空再说吧。

知道什么是对的,告诉自己什么是对的,去做什么是对的,坚持做什么是对的,这些是完全不同的。我庆幸自己能坚持做到一些事,也会经常懊恼为什么之前决定做的事情没有做到。换到一个新的环境也许是一个改变的好机会,虽然我也不知道哪个肩膀上的小人会赢。

20161120

流水帐君又回来了。。

时间是周日晚上。昨天周六出去了13个小时,好久没那么充实了。。然而我继续作死,中午吃的辣子鸡我没忍住把辣椒粒都个吃了,然后还喝了点水煮鱼的汤。。然后吃完饭下午去公园逛了逛吹了风,结果就是果断闹肚子,,一顿晚饭去了3趟厕所。。

不过还好今天在家宅了一天,基本就在刷电影刷剧,然后突然觉得自己要做近期的事情还挺多的,最近可能太放松了一点,感觉得振作一点。。

除了些兴趣之外的事情,这些事情我的目标是要在六个月内搞定。

  • 公司的按摩预订工具

公司每个月有个免费按摩一次的机会,然而直到现在还是有专人手动处理整个流程。然后我就自告奋勇准备利用Google Spreadsheet和Google Form加一堆App Script来做个智能系统,实时更新剩余时间段等等。然而最大的挑战是这种事情不算是主要工作,平时的工作都做不过来,这个就更没时间了,回家更难提起兴趣做这些公司相关的事情,然而已经拖了太久,一定要做出来了。

  • 20%项目

找了个20%项目,就是指可以在自己的工作时间内分配大约20%的时间用在不是核心工作内容的地方。我是机缘巧合,因为是巴黎办公室唯一一个中国人,一个同事喊我帮忙做Android Wear在国内市场的市场分析,产品测试之类的。虽然一点编程知识也用不到,但是接触到了另外的职业(marketing analyst)还有北京上海香港的同事,多了条门路嘛,还有好处就是好几个智能手表可以换着用。。

而平时工作忙,这个项目的内容基本都是我在自己的下班时间做的,有时候还有deadline,有点体会到做business的头疼。

  • 搬家买家具

目前这个公寓终究还是决定只给我延续到12月31日,所以我大概三周前开始找房子,想找带家具的比较方便,地点又想就在现在这个附近,再加上住了大的就想要更大的,所以一直没遇到什么好的选择。上周最后看到一个还算不错的,面积大一些便宜一些但是要自己买家具,然后没有阳台了。。时间其实很紧所以没法找到更好的。明早去签合同,12月1日拿钥匙就可以搬家了,然而还要买家具,装家具,搬家,想想还是头疼。。

  • 继续学金融和量化知识

进度实在是太慢了。。公开课都好久没学了,以后也许就指望这个挣钱呢,不能放下。。

  • 减肥

目标70, 现在73-74,当年高中就是这个重量了,不过我在法国最胖的时候83哈哈哈还是挺有成就感的。

  • 钢琴/吉他

钢琴一直在练,不过觉得到了需要找老师学习的时候了,有些东西毕竟自己注意不到,还是找老师学几个小时好一些。然后其实好久没碰吉他还是挺想有时候再拿起来玩玩的。

  • 学车

这个也是拖了好久的事情,其实要不是最初找房子这个事情,我应该很早就报名了,然而事情太多我会很焦躁,所以拖到了现在。争取搬完家就报名,6个月内搞定。

  • 电影网站

这个说来复杂,简单地说就是我发现自己的简历上除了实习工作经历比较亮眼之外别的真的没什么,以后回国和各界大神比真的不行,特别是美国名校的毕业生(讲真欧洲竞争压力更大。。)所以想做一个项目出来,一方面练习自己的全栈技术,一方面如果做大了还能赚点广告外快嘛。具体点子不方便公布。。(话说我有想过重启每日一点计划) 然而一个人呢没什么动力,两个人可以互相督促但是想不到合适的人选。

  • 公众号

法兰西上班狗最近重新开始写了,大概两周一篇的节奏。其实我很想尽快把找实习工作的这系列写完,因为我想分享给大家的东西还挺多的,也没有更合适的平台了。然而时间有限,我也还有科技蜘蛛的公众号任务要做。虽然是团队运营,可是还是有很多事,要编辑文章,要写内容,还有每周的周会。

  • 机器人小车

暑假爸妈来玩的时候托他们从国内带了很多电子元件来这边,我组装了一个自己的电动小车,准备用树莓派控制,还可以加装摄像头,塑料火箭发射器之类的。。其实整个架构都搭起来了,全套DIY,自己焊接,自己拿热胶枪固定,然而因为没有精力,一直没在树莓派上测试连接,也一直躺在我旁边。

img_0499%e5%89%af%e6%9c%ac

20161018 要回国了 – 吗?

上周某天下午,收到邮件说“你们可以开始看看这些其他部门的职位了,如果看到喜欢的就可以投了”。

事情很复杂。简略点说,就是我们这个部门从来不找新人,去年启动这么一个以比较低的等级招毕业生的这么一个项目。我们一批8个人在欧洲的不同办公室开始工作,大家都在一个组里,直到一个多月前经理在每周单独例会上推荐我看看其他的某些职位,大概透露了就是说这个项目其实最初计划持续18个月,18个月以后就把我们分配到其他的组里。

可是毕竟之前没有沟通,收到那封邮件的时候大部分人是比较惊讶的,思考之后就是对这个项目的质疑等等,私下公开都有讨论。就在今天的讨论的时候,我无聊从内网里去搜国内的职位,在几个类似的工作之后,我发现有个就是我现在同一个部门的职位,在上海,级别和工作内容都很符合预期。这个发现直接引起了我今天内心不少波澜。

发给老板,老板态度是想让我留巴黎,可是要是我选择回去他会支持我;

发给国内一个小伙伴,小伙伴说你这么犹豫,就是还没有做好回去的心理准备;

发给在法国的小伙伴,小伙伴说怎么选择都支持你,还提供了些帮助。

我喜欢理性的思考问题,说服自己,所以我的犹豫并不是因为害怕改变,而是真的,问题很复杂。

首先,我本来的计划是工作满3年后回国,那个时候3年Google的工作经验可以允许我在国内大部分IT公司找到内容和待遇都还不错的职位。我甚至想3年后先找机会调回国内Google,再在在职期间寻找其他机会。

现在国内这个职位有空缺,其实是比较罕见的,这个组本来就不大,国内的广告业务也不是特别大,所以招人应该很难得。如果三年后想调回去却发现这个职位没了怎么办。

国内的工资相比于其他公司据说不高,可是福利不错,起码不用经常加班。因为没有得到具体数字的办法,我很难量化的权衡,这也是个问题。

其实主要问题是即使在法国,我也没法留在现在这个职位了,虽然没法强制我们离开,但是我们是被期望在6个月内找到合适的职位并且转过去的。这些职位在巴黎有3个,在伦敦有10多个,迪拜和都柏林都有,可是我个人还是倾向留在巴黎。即使是在巴黎,还是要换组,那么在换组的过程中,你和同事,客户的关系就需要重新建立,更别说不同组同一个职位的内容和要求也有所不同需要去适应了。另外升职的评定过程在这个转换过程中也有损失,因为在新职位做了几个月就立马升职也是比较奇怪。这些使得我留在巴黎Google的机会成本也不低,所以才会纠结。

这些职位空缺并不是特别有趣,所以就又会想,到底是等一段时间看看有没有更好的职位还是找现有的里面比较好的。如果等的话,没有等到更好的现在的都被人选走了怎么办。

如果直接回国去小公司/创业公司,也不妥。一般在Google工作的人是很少一年后就离开的,对方很可能会认为你的工作能力不够或者和Google氛围不符合等等,总之负面大于正面。

另外,如果我去欧洲的其他国家,那么我就要抛弃现在在巴黎还算充实快乐的业余时间,这些业余时间保证着我上班时间的高效率,很难保证去了伦敦之后我还能保持相同的状态。

所以现在就只有两个选择,一个是留在巴黎的其他组,一个是通过这个机会调上海。

在纠结了一整天过后,大概的想法是还是先留下。

人生没那么多岔路口,怕走错,更怕后悔。

说说 PWA 和微信小程序

作者:云图图
链接:https://www.zhihu.com/question/50874500/answer/123222341
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

本文稍后也会发在科技蜘蛛 – 知乎专栏里。
利益相关:微信小用户,谷歌小员工
微信发布了微信小程序,虽然还在内测阶段,但是无论从技术上,还是以后要不要开发原生应用(native app)上引发了不少讨论。其实看到微信小程序的消息, 我第一时间想到的是 Google 之前推出的PWA(Progressive Web App),两者的目的是类似的(伪原生应用),但是形式却又有不少区别,可以比较来看一下。
耐心点,先让我来说说PWA。
PWA 是什么?
PWA 的全称是 Progressive Web App,是 Google 在2015年提出,今年才推广开来的想法。具体的意思就是在移动端利用提供的标准化框架,在网页应用中实现和原生应用相近的用户体验

总而言之,它说到底还是一个网页应用,只不过通过最新的技术手段实现了某些以前原生应用才有的功能。
PWA 的优势在哪?
技术上不想说太深,我也不懂,所以从用户角度来说,列举一下和传统网页应用相比的优势。

  • 消息推送。用户只要允许,即使网页关闭后仍然可以在系统通知栏收到推送消息。(自从知道 Facebook 应用为了消息的即时性强制阻止安卓系统进入节电模式后,我就卸载了 Facebook 原生应用改用他们的网页推送了)
  • 后台加载。往常的网页应用只要关闭了网页他的生命就结束了,现在引入了一个 Service Worker 的概念,即使网页关闭,PWA 仍然可以在后台运行获取数据更新(当然有限制)。
  • 离线使用。PWA 打开后会缓存一些内容,之后再次访问即使没有网络也可以浏览之前的页面(如同IE时代的离线浏览)。
  • 原生应用界面。在某些情况下 PWA 应用可以隐藏浏览器本身的所有视觉成分,光从UI和UX上看,很容易认为这就是一个原生界面,如下图其实都是PWA而不是原生应用。
  • 桌面图标。PWA只要配上一个图标,再放快捷方式在桌面上(比如一定时间内第二次访问PWA会自动询问是否添加快捷方式到桌面),就真的和原生系统无异了,打开的速度也很快(当然功能不能很庞大)。

另一方面,和原生应用比,PWA 又不需要用户安装,只需要浏览器支持 PWA 就可以了。
为什么要推出PWA?
首先,网页应用在一定程度上受到了浏览器的局限,所能获得的权限,效能都是的很多复杂的功能很难实现,这是更简单的方法就是开发原生应用了。而 PWA 就是一个试图把两者相融合的尝试。如果需求不大,新公司已经没有必要花血本雇佣不同平台的开发人员做原生了,只要一个 PWA 就够了。另外当网页应用发展更好之后,整个移动平台的用户都提升了,对于正在转型移动平台的 Google 来说当然价值非常。
我个人觉得这是一个很好的尝试,也会推进行业的发展,但是究竟能走多远抱有谨慎乐观的态度(如今微信也加进来应该更乐观了)。
其次,当你主导的技术在市场上被广泛采用的时候,你在整个行业的话语权都会提高,也有更多的获利机会。
比如我在广告业务的的技术支持部门工作,有的同事就会去有的广告业务客户那里推销 PWA,同时公司内部也有各种 PWA 的培训和讲座。如果公司没有或者用户没有安装原生应用的话,PWA 拥有比传统网页更好的体验,在计算竞价排名上也有优势(Landing page experience),PWA 就会给客户公司带来更多的用户,而更多的用户也就带来了更多的收入,自然的Google也就获得了更多的广告收入。。
发展
这个概念在行业内发展的挺快,在本文的这个时间点上,基于 Chromium 的浏览器 Chrome 和 Opera 已经完全支持 PWA 了,Firefox 和微软的 Edge 正在开发中,水果公司的 Safari 最近刚刚表达了可能会支持 PWA。从长久的角度看,只要 Google 不断推动一些网站往 PWA 转型,其他的浏览器或者竞争对手也就会自然跟风上船。
网上已经可以找到大把的 PWA 例子了,这里有不少:https://pwa.rocks/,其中不乏 The Washington Post,Flip Board,AliExpress,Wikipedia,Gmail,Booking 这样的大头。
里面有个 Air Honer 很有意思,大家可以玩一下(小心有声音别在开会的时候打开。。),The Air Horner,从点开到使用只需要点击一次屏幕(不需要安装),使用体验又非常接近原生应用(UI/UX设计,桌面图标)。


微信小程序
我没有第一手资料,只是从最近的新闻和其他文章中得到的微信小程序的一些消息,大体和我想象的相同,就是微信提供一个内嵌的封闭运行环境,让开发者可以利用基于Web的技术开发出和原生应用类似的用户体验和功能。(如果不准确望指正)
先说结论,在我看来,微信小程序相比于 PWA,虽然起步晚一些但是前景会更好。
从技术手段上来说
两者都是基于现阶段 Web 技术的,但是又不同:PWA 是 Web 的父集,通过提供更多的外部接口和规范来让网页应用获得原生应用才有的特点;微信小程序是Web的子集,通过简化 Web 开发过程和提供封闭完善的空间,使得原先的公众号用户以【1.成本低于原生应用开发 2.体验高于网页应用】 的伪原生应用。这是两个不同的思路,PWA 更多的是说服现有应用转型,微信小程序更多的是说服新用户寄生在其中。愚见虽然 PWA 的格局更广,但是显然微信小程序的前景更好。
从推广手段上来说
两者不太相同。PWA 其实是个抽象的技术标准,Google 只能通过自己行业内的影响力和一些刺激因素来说服浏览器支持 PWA,客户开发 PWA,推广其实受到不少阻力。微信这边情况就好很多,作为一个蓬勃发展的生态系统,大多数企业为了不落后,都无法忽视微信的任何一个动作。微信出公众号就要弄公众号,出支付平台就要支持微信支付,出小程序就要开发小程序。这是个双赢的行为,微信在推广自己的平台,目标企业在推广自己的业务,所以这阵东风谁不愿意吹一下呢。
从目标用户上来说
两者基本接近的,PWA 只有加法没有剪法,所以即使原有网站的功能很复杂,只要投入足够的资源总能开发出等效的 PWA,甚至可以拥有类似拍照之类的原先只有原生才有的功能。微信则是在一个简化的封闭环境中。就好像微信公众号,虽然文章是基于 HTML 的,但是有很多 HTML 标签不能用(比如 hr,a 等)。所以微信小程序能实现的功能一定是受限的,牺牲了一部分功能,但是带来的是开发流程的简化。这会更吸引那些对权限,技术接口要求不高,更多以内容为主的应用。最好的例子就是微信公众号,他们十分依赖微信平台,但是受到公众号平台的限制,内容的丰富程度十分有限,相信推出后会有大批的微信公众号尝试小程序。
从目的上来说
两者都是为了扩大围绕自己的生态圈和行业影响力。如果 PWA 推广开,就相当于 Google 引领了 Web 的发展方向,这会给公司带来巨大的长期利益。而与微信小应用,则是推广开后,其裙下寄生的应用越多,就越能给微信吸引用户流量,让微信往平台转变。微信从最开始的即时消息软件,发展到后面的内容平台,支付平台,这一步则是应用平台。另一方面,寄生其下的应用内的交易必定需要经过微信支付的通道,正好两者相辅相成。
从局限性来说
两者首先有个共同的局限性:


现实点说,大部分公司不会立马抛弃现有的网页应用或原生应用,所以在一定的时间里,公司需要额外分配一部分资源用来开发 PWA/微信小程序。这是无法避免的,特别是微信平台,当用户养成使用小程序的习惯后,公司为了扩大自己的覆盖面,很可能会入住微信,但是另一方面原先的 App 即使活跃用户很少了,却也不能完全抛弃,不然用户会不满甚至弃用你的产品。所以前期公司需要投入一定资源在新平台的开发上,后期也需要投入在原有久平台的维护上。
微信额外的局限性就在于内容的丰富程度上,这其实是个妥协。如果内容要丰富,那么就对性能和接口有更多的需求,这样就对微信平台本身的要求更高,简直可以理解成开发了一个新的操作系统 WeChat OS。而且一个系统一旦功能多了,上手就会变慢,很容易就吓跑那些原先之生存在微信公众号里的用户,得不偿失了,所以我猜他们会在一定程度上限制这些小程序可以使用的接口数量。
PWA 在局限性这点上是有优势的,但是在推广方面却缺乏关键动力。毕竟相对于微信小程序,开发 PWA 需要的资源更多,不是所有中小团队都能付出的起的。
总结一下
微信小程序和 PWA 作为墙里墙外的两个巨头试图改变移动互联网行业的努力,看起来很类似,但是其实格局很不一样。现阶段来看微信的这个新平台很有前景,但是毕竟还在 Close Beta,究竟以后发展如何还是留给市场决定吧。

 

20160920 重启

人真是一种神奇的存在,有时候无论怎么下决心,有的事情就是怎么也开始不了,又有的时候一件小事就能让你下定决心。

今天是看到某个同学出去玩了挺久后发了状态说在写游记,整理思绪。下面有人回复说如今每天工作很久没有机会思考了,又有人说读起之前自己的文字感觉很奇妙。不自觉地我发了一会儿呆,突然想到自己频繁更新博客的那些年,虽然最开始的文字很幼稚,有的又很做作,但是写日记的时候,真的是我内心最平静的状态。

自从来到法国,我就丢下了写日记的习惯。回想起刚上高中时用我的索爱K300c手机用九宫格键盘每天晚上睡觉前慢慢的码字;大学时每天晚上熄灯断网后室友们都上去睡觉只留我一个人在下面码字知道电脑没电;出国前我一篇篇的整理过做过备份,从2006年到2010年,我写了42万字的日记。这个数字让我自己都吃惊。虽然大多是没有营养的文字,却是真真切切发生在自己身上的故事。如今回头看这些文字,思绪在滑稽,稚嫩,尴尬,骄傲,矛盾中摇摆不定。但无关内容,每当我看到自己在故事里表达的思想状态,都仿佛回到了那一秒的状态,这些字符已经悄然成为一个时光机。

于是我就默默的告诉自己,我需要继续写日记。除了记录下生命的轨迹,还有一个重要的目的:自省。我发现在写日记的时候,自己仿佛在以上帝视角看着另一个人的生活。不要吓我这不是精分。。这个过程中主角的我不停的暴露着自己的想法,客观的我又在同时审视着这些想法。这个矛盾的过程曾经让我纠结过,但是回想起自己的成长就在于这些自省的过程,一个人和自己对话,不需要言语。当然我也得很注意,有时候极限的理智和精神分裂并没有明确的界限。。

我没有把博客的链接从我的个人网站主页删去,可是又没有告诉任何人我博客的地址。也许我心底希望有人读到自己的想法,可是又不愿意让这些影响到我的生活。如果有人莫名点进来并且能继续读下去,相信他们会理解吧,这种单向交流的状态其实很微妙。

和昨天说声晚安。

月饼门

本文也发布于知乎专栏:科技蜘蛛

声明在先,没有利益相关,仅仅代表本人观点,瞎扯而已。

从朋友圈看到这个,我最开始是以看故事的心态点开的。可是读完之后又觉得不太对,这件事情像个段子,却又真实发生了,真是活得久了什么都能见到。之后,问题变成了事件,事件变成了话题,到现在发生不到一天感觉知乎IT圈子里的人都知道了。

我的第一反应是这是不是小题大做了,我猜大部分人都是这么想的,本来没多大的事情,怎么发展到了解聘员工的地步。假设那些答案里的信息都是真实的,我现在最好奇的是该司人员是怎么做出这样的决定的。。

从规则的角度上来说,很多事情的处理上是不考虑当事人是内心想法的。行为和导致的结果才是客观评判的主要考量。考虑到这件事情也就是为了几盒月饼,我是相信当事人所说的只是因为直接买买不到,才写了个脚本抢一盒月饼的陈述应该是真的。就算他真的抢到了10多盒月饼的购买资格,考虑到影响,应该也不会下单的吧。。

不过这种假设显然不具备通用性。假设有个人在某个拥有互联网公司当程序员,他通过内部材料,发现了一个公司外部系统漏洞,然后利用这个漏洞获取了他本来没有权限的大量用户个人信息。他也没有传播,只是放在自己电脑里。然而就在他还没反应过来的时候,公司的内部监管部门发现了,联系到了这个人。这时候这个人解释自己只是对技术十分好奇,是为了帮助发现公司漏洞才做的,得到的数据也准备删掉。但是公司可不会这么想,也许在朋友和同事的口中他是个好人。但是没办法,行为和结果摆在那里,谁又能保证他陈述的完全真实,以及之后不会有人用同样的说辞逃避责任?

换个例子,阿里100周年庆祝的时候决定发放10个免费去火星旅行1个月的名额。某个做前端开发的工程师发现了一个漏洞,果断写了个脚本,很快抢到了两个名额准备带自己和自己的女朋友去玩。事情没有被公司高层发现,只是口口相传在公司里传开了,事情不了了之,那两个人也去火星玩了一圈。那么公司同事又会怎么想呢?“这件事情是不对的,我要不要揭发?”揭发了破坏自己的社交关系,不揭发又觉得这不公平心里不爽。什么?你说人家技术就是牛就是应得的,那公司的非技术人员呢?他们为公司付出同样的努力,本来也拥有均等的机会,他们知道了这件事他们会爽吗?反过来如果是技术人员听说有3个名额都被和这个抽奖项目组长关系很好的某个销售人员提前拿到了,我们技术人员又会爽吗?就算大家都无所谓,这种公司文化你觉得没有问题吗?。。

说这么多,我估计要招来一顿骂,可是我想表达其实是大家心底都知道这件事情是不对的,于情,于理,都不对。

好了下面要开始为程序员辩护了。。

这件事情当然是错的,但是事情闹这么大,原因不在错不错这个判断上,而是该怎么处理这个关键点上。

考虑到阿里在IT业和程序员圈子里的形象和声誉来说,处罚的确过重。事情这么轻微,直接取消这几个人的订单,在内部发通告邮件匿名批评一下这种行为,让他们知道这么做不对不就行了?再严重一些,点名批评这些人,让他们的经理约谈警告。如果这么做了,为了这么点小的利益,一般人都不会再做同样的事情了吧。

对事情的处理流程我也充满了疑问。按照高票答案所述,半个小时约谈一个半小时解聘。这得是何等的效率,国内公司决策效率都这么高吗?我不知道。。公司又没有直接针对这种事件的规则,那么在类似内部事件的时候,就要靠人员的经历和判断了。在我假设,理想的情况下事情应该是这么处理的:

首先,事情通过种种方式传到了HR主管的耳朵里,HR主管觉得这件事情需要处理,所以他首先联系了抢月饼项目的技术负责人,找他确认了这件事情的存在。得到肯定的答复后,主管找到这些行为人,了解具体情况并且记录下来。之后联系若干个自己部门的同事,法务部同事,召开紧急HR会议。在会议上的时候,主管陈述事情的5个W (what, who, when, where, why),然后提出这件事情严重,需要解聘这些人以及这么做的原因和合理性在哪里。参会方讨论这件事情,确认所有的信息以及这么做是否符合公司各项规定。最后投票多数通过,确认要解聘这些人,法务部的人员确认解聘的流程,步骤。会后主管起草一份完整的事件报告,包含事情的具体描述,处理的流程,最后的决定及其原因,以及接下来的步骤。这份文件分别发给HR部门和每个当事人部门的Director甚至VP级别的人进行最终批复。如果有人提出异议,那么主管就会拉着个人再次组织开会讨论,知道有一方被说服为止。最后决定解聘,那么再按照公司流程走。整个决定过程中可以先停职。

上面是我瞎扯的,但是我觉得在一个制度,流程完善的公司里就应该这样。按照阿里这个事件的处理速度,我觉得不可能经过了上面的流程。最起码的,公司应该拥有一套严格的规则来规范解聘员工的具体流程。应该需要多层确认,不是某个人可以单独决定的。这种流程不仅是为了保护员工的利益,也是为了避免草率决定以及这种事情的发生。。

如果做出解聘决定的那个人职位权限不高,那么这个人能直接秒裁员工的事实就说明公司内部的管理流程不到位或者完全没有被遵守;反过来如果当事HR权限很高,那么我就很怀疑这个人的综合判断能力,包括从处理决定本身到这背后可能带来的外部公关危机以及对内部氛围和文化的负面影响。

总之,就是这件事情当事人做的不对,但是公司处理的方案的确也有问题。如今话题们消退的这么快,我更希望的等风头过去之后,广大的程序员们和公司的领导都能从事件中学到些东西。

 

来说点别的,说说我在法国和公司的经历。

趣事:记得今年欧洲杯快到决赛的时候,有个人给全欧洲范围内的mailing list发了个邮件说有决赛的票,原价130欧现在卖300,有没有人要。这个消息大概发到了几千个人的邮箱里。很快就有人回复说按照内部规定买卖信息不应该发到这个mailing list里,这个人回复说这个票是替朋友卖的不是自己的。再不久有人说你提价贩票是违法的,然后还有人找出了官方网站关于实名票不可私自买卖的规定。不久卖票的那个人作死又说“票已经卖掉了:)”。然后就有人回复说你这样卖票本身就不对,而卖完之后又来炫耀更不对。甚至还有回复发了公司内部举报系统的链接。最后是有人出来当和事佬说“好了好了,大家都知道这样不对,相信他以后不会这样了,我们散了吧”事情才算告一段落。

我目前公司招人是要经过Hiring Committee开会投票的,最后还要所在部门的Director/VP最终确认。我没经历过解聘流程(也不想经历)。。但是我觉得解聘流程应该也是对等的,就算没有个Firing Committee,起码也有个几个经理讨论的过程,没几周是搞不定的。就算解聘了,如果理由不合理,对方申请仲裁之后公司会面临很多麻烦。

当初在某IT公司做第一份实习的前几天,就听说公司要大范围裁员几千人,结果之后就每天都有人在公司入口发小传单,原来是公司工会组织大家抗议。真的就像大字报一样写着各种我们要一起行动!抵制公司这种行为!之类的。。

法国的工会那真是相当的可怕,工会是个独立于公司管理的组织,工会之间联系又很紧密,感觉全国的工会简直就是一个党派一样。每年不罢工几十次感觉都奇怪,从铁路,到公交,学校,机场,垃圾清理,所有公共行业都罢工过。。有的公司要裁员,无论是批量的还是特定的,只要理由不恰当又被工会知道了,都可能要插两脚。如果同样的事情发生在法国,员工可以去联系工会,工会会派律师帮助这个人和公司协商,如果没有结果会通过法律途径来帮员工争取利益。所以我们平时一方面在吐槽在法国公司要裁人有多么难,一方面又在享受着这种保护。。

20160830 难道还在原地

大抵还是累了,不知道是白天繁重的工作,还是因为晚上回来还看了两个小时的公开课。一杯白酒下去,就有点晕了。1点了,困意袭来,却觉得此事再适合不过写日记了。于是趁着脑子乱乱的,放一个随机的歌单,打开了连我自己都几个月没打开的博客,想着说些什么。

最近生活过得很充实。出去玩,见朋友,仿佛是我想要的生活。可是隐隐中,我又想,会不会,转了一圈又一圈,我缺还在原地。

我是个很强迫的人,倒不是说现代人没个强迫症都不好意思出门那种,我是真的强迫。我喜欢强迫自己,顺带也会不自觉强迫别人,这是后话。我喜欢逼着自己做认为正确的事情,也许这里分量最重的,就是内向和外向吧。我不记得思索过多少次,我到底是一个内向还是外向的boy了。可是每当我累了,醉了,思维变简单以后,内向的我充斥着这个身体。内向并不是一个可悲的性格,很多事情是需要内向的人的敏感才能做的。可是,内向的人们总是向往外向人们的那个事实,是不容否认的。我们向往,想要,却又犹豫不决,一生就这么踱过去了。

是啊,纠结态的我到现在还没弄清楚到底自己是不是内向,应不应该改成外向,以及能不能成功。也许外向的人也会有这种种情绪,也许我是外向人们中更内向的那个?我喜欢独处,可是独处的时候又会感到孤独。我可以享受孤独,但是我不愿。可是当我以外向的态度生活着,看到周围分明外向的朋友,又觉得自己永远做不到那样。

我实在不想继续思考这个问题了。

孤独,是一种修行吗? 如果是,睁开眼睛我会在哪里?如果不是,又是什么让我不愿改变?

所以我在想,是不是每一个生命,到头来,都还在原地。

你可以试图改变,可是没人在意,因为你并没有改变。你只不过让自己相信在改变,期许这种态度可以带来些什么。可是事实上,没有人那么的在意你,你于世界的存在是必然,可是这种必然并没有比偶然好多少。。

时间不够。我不知道当我有时间的时候,是应该做自己喜欢的事情,还是可以帮助自己工作的东西,还是可以帮助自己事业的事情,还是可以帮助自己快乐的事情。这些事情都重合的那些人儿是多么幸福啊,为什么我每个都不一样。我试图压缩自己的休息时间,我试图利用每一个碎片时间,却还是觉得徒劳无功。内向并不代表我不是乐观,如果有人可以做出改变,为什么不是我?我还是期待美好生活的。

所以,内心的修行于外在的表现真的在无形吗?

这是篇负能量MAX的日记。。