MoreRSS

site iconWang Ziting | 王子亭修改

95年生,英文ID jysperm,开源参与者。曾创建RP主机和Atom中文社区,Ex LeanCloud 番茄土豆。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Wang Ziting | 王子亭的 RSS 预览

2023 年度小结

2023-12-31 01:00:00

今年 3 月我和蛋黄一起去了泰国旅行,算是我们两个第一次在国外「自由行」,我们先去拜访了之前一起在番茄土豆工作的朋友们,他们热情地招待了我们,带我们在清迈玩了三天,参观了他们的办公室,还体验了泰式按摩、一起玩狼人杀、爬山。之后我们又去了普吉岛,感受沙滩和大海,在岛上骑摩托车。

在经过几年稳定的工作和疫情封控之后,这是我第一次去体会不一样的生活方式 —— 也许除了在国内一线城市扎根,或者移民发达国家,还可以适当地放弃一些执念,来获得一个更简单的生活。经过这么多年,我也意识到了自己并不是一个喜欢竞争的人,更想要也更适合一个「低竞争」的环境。这时我感觉自己仿佛站在人生的分叉口,要不要考虑去到中国的二线城市或者甚至泰国生活呢?但蛋黄还是很简单地把我劝了回来 —— 毕竟去了加拿大以后还可以后悔回来,但现在躺平的话后悔可就去不了加拿大了。

9 月时我们还去了日本旅行,因为一直以来都在通过各种影视和游戏作品了解日本的生活习惯和文化,所以日本可能是我们最熟悉的国家了,到日本一下飞机果然是这种感觉 —— 真就和我们印象中的日本一模一样。我们在日本去了环球影城的任天堂园区、任天堂商店、藤子·F·不二雄博物馆、秋叶原,哆啦 A 梦和马里奥这些我们所熟知的形象在日本真的是无处不在。日本由新干线、电车和地铁构成的交通网络非常发达,没有安检、换乘方便、区分快慢车,很多商圈也是以一个电车站为中心,但价格确实不便宜,我们在日本总共竟然花了 1200 人民币来乘坐地铁和电车

在日本我们也拜访了一位年初才移居日本的前同事,他们距离东京市中心乘电车大概一个半小时,带我们逛了他们所在的居民区和超时。这里和新宿这样的商业区完全不同,密度比较低,街道非常干净整洁,就像是很多影视作品里的日本小镇。

在经历了 去年的疫情封控 之后,我便下定决心要将我们之前移居加拿大的计划提上日程,并以最高的优先级来执行。在经过了 2022 下半年的调研和准备后,我们决定由蛋黄申请留学签证,我作为配偶申请开放工签的方式移居加拿大。在我们准备签证的过程中,因为公司的一些变化,工作给我带来的压力和不适越来越大,所以在提交了我的签证申请之后,我马上就 离开了 TapTap 和 LeanCloud,准备休息一段时间,然后准备搬家。

在离职之后的这段时间,我开发并发布了 HostedBeans。这是我作为独立开发者的第一个尝试,我希望能利用上之前那么多年的工程经验,设计和开发一些体量较小,但能带来长期价值的产品,也能从中获得收入。

本来我们都已经买了 11 月 11 日的机票,准备带着皮蛋豆腐和所有东西一起搬到加拿大。然而到 9 月时我们发现,我的签证进入到了一个通常耗时半年以上的一个安全审查(Security Screening)的流程中,而蛋黄的开学时间也没法再推迟了。

其实在一开始我们就确定了两个人一定要一起出发,不能分开。但现在我们几乎已经走到了最后一步,安全审查除了等待时间比较长,几乎不可能拒签,难道要在这个时候放弃么?我很清楚这段时长并不确定的异地并不是我想要的,会给我们的关系带来很大的考验。但所有的朋友都觉得不能错过这个机会,理性上当然应该这样做,所以蛋黄在 12 月 25 日一个人出发去了加拿大,在 2023 的年底,我们暂时分开。

HostedBeans: 基于 Beancount 的协作托管服务

2023-11-01 01:00:00

我从 2019 年开始使用 Beancount 记账,作为一个开发者,我非常喜欢这样的纯文本工具 —— 纯文本意味着我可以使用我最熟悉的编辑器来编辑它、可以使用脚本进行批处理,还可以使用 Git 来进行版本控制,最大程度地利用我熟悉的工具。

在和蛋黄在一起之后,我们的资金和帐目不可避免地混在了一起,如果不把她产生的帐目一起记录进来,那么记账这个事情就显得没有什么意义了。但 Beancount 对于非开发者来说使用门槛还是太高了,需要在本地配置 Python、Git 等环境,前面提到的那样纯文本的优势对她来说其实是一种负担。所以她之前一直很难参与进来,即使只是查看 Fava 的图表,也需要我先在我的电脑上启动 Fava,然后把地址发给她。

为了让蛋黄至少能够随时查看图表,我调研了几个现有的 Beancount 托管服务,但我觉得它们都缺少了一些关键的能力:

  • Git 访问:纯文本是 Beancount 最大的特点,即使使用托管服务也不应该影响使用 Git 和本地编辑的工作流。
  • 多人协作:可以让多人共同访问一个账本,在 Web UI 对账本的修改也应该反应到 Git 中。

于是我开发了 HostedBeans 这个项目 —— 基于 Beancount 的协作托管服务,同时支持 Git 和 Fava 访问,可以为账本添加协作者并管理他们的权限,在 Web UI 上的改动也会以协作者的名字被自动同步进 Git。

使用 HostedBeans 你可以保持之前的工作流不变,在本地使用你熟悉的编辑器、使用 Git 进行版本控制,但同时解锁了随时随地打开 Fava 的能力,而且可以和你的家人共享这种能力,让他们参与到你的记账中来。

目前 HostedBeans 的功能已经全部可用,我还在继续进行一些细节调整来改善体验。如前面所说,HostedBeans 的目标是 Beancount 和 Fava 的托管服务,我今后我专注在「托管」这个方向上,不会添加「私有」的功能来锁定用户,确保用户可以随时迁移出来。比如 HostedBeans 不会自己实现任何实际的「功能」,而是会接入 Beancount 和 Fava 社区既有的插件,如有必要会直接在上游的开源项目中来开发功能。

欢迎访问 www.hostedbeans.io 注册帐号试用,我们的免费版本可以让你创建一个私有的账本并和其他一名协作者一起记账。如有疑问或者建议欢迎通过邮件、Telegram 或者 Twitter 联系我,联系我还可以免费获赠 Pro 帐号。

本文原载于 HostedBeans 的文档页面

离开 LeanCloud

2023-08-12 01:00:00

从我 2015 年 加入 LeanCloud 已经 7 年多了,这是我人生中非常重要的一段时间,第一次独居、和蛋黄恋爱结婚、辗转三个城市、有了自己的积蓄、新冠疫情和封控,都发生在这期间。

我在 LeanCloud 一直在做 云引擎,加入公司两年后我就成为了这个产品的负责人。实际上在之前我就对后端托管很感兴趣,在 LeanCloud 这些年也是 Serverless 飞速发展的一段时间,我深度地参与到了云引擎的每一个方面 —— 无论是产品的设计、项目的管理,还是后端开发和运维这样的技术工作,尽我所能实现了这样一个适合于 LeanCloud 的产品形态,我也很高兴公司能在这个产品上给予我非常大的「自由发挥」的空间。

在这样一个技术主导、时间跨度接近十年的项目中,我得到了一个非常好的舞台去实践我的软件工程知识 —— 在开发功能的同时,我不断地在用我最新学到的知识来进行重构,为一些脆弱的实现寻找彻底的解决方案、降低代码的复杂度,用各种不同的方式来编写测试、文档、提升可观测性。同事们也都认可我在这些方面的努力,与大家的讨论也总是会给我带来新的想法。

江宏将 Google 的「工程师文化」带到了 LeanCloud,构建了一个对内透明、能够进行坦诚沟通的工作环境,并坚持执行了这么多年,实属不易。这样独特的文化也聚集了一群聪明、专业的同事。因为我的上一家公司番茄土豆同样非常独特,所以其实我是很晚才意识到 LeanCloud 的特别之处,意识到能和这样的同事一起工作是多么难得的事情。

在被收购后我在很努力地了解大公司工作的方式,但大公司终究难以兼容之前的团队文化,并有着它自身的「大公司问题」,随着业务重心和管理风格的变化、很多一起工作多年的同事的离开,这份工作逐渐变得不那么特别了。

同时,这么长时间地在一份工作上也让我在业余时间少了很多创作的灵感。因为工作本身就会占用大量精力,加上工作中的开发有着更强、更确定的正向反馈(其中最大的当然是按时间计算的工资),导致相比之下更难在业余项目上集中注意力,有点类似于 Overjustification effect 中所描述的,因为外部激励过强影响到了人内在的兴趣。

所以我觉得是时候离开寻求一些变化了,接下来我会休息一段时间,然后和蛋黄一起去加拿大学习、工作,之后的一段时间对我们来说应该会充满未知与挑战。

为什么我选择 Apple 设备

2023-08-10 01:00:00

在最近几年,我发现自己渐渐买齐了差不多所有的 Apple 设备,我使用 MacBook Pro 在写这篇文章、工作时使用 Mac mini、手机是 iPhone、手上戴着 Apple Watch、使用 AirPods 听播客、在床上用 iPad mini 看视频,蛋黄同样也有自己的 iPhone、MacBook Air、iPad Pro 和 AirPods,我们家里还有一个 HomePod mini。

数据安全与隐私

我选择 Apple 的第一个理由是数据安全,iPhone 和 Mac 都是在业界率先普及全盘加密,并在近些年开始使用硬件安全隔区(Secure Enclave)强制加密的。就像 Apple 的很多功能一样,因为其对软硬件的垂直整合能力,Apple 可以在其所有品类的设备上,提供水平相当的数据安全保证。Apple 也在其在线服务中尽可能使用端到端加密,iMessage、健康、家庭等功能此前已经是端到端加密,2023 年起包括备份、文件、照片、备忘录、iMessage 聊天记录在内的几乎所有 iCloud 服务也都支持了端到端加密(Advanced Data Protection)。

在隐私保护方面,Apple 也是最特别的一家厂商 —— Apple 八成以上的收入来自于消费级硬件的销售,这也是 Apple 唯一的主营业务。这意味着 Apple 的商业模式决定了,相比于主要收入来自于广告和增值服务的互联网公司、相比于消费者业务仅占收入一小部分的软件公司,Apple 更有可能与消费者站在一起。

因此 Apple 的设备上你几乎见不到广告,Apple 也不会帮助第三方收集行为数据和投放广告,在互联网公司千方百计地希望你将数据上传到云端时,Apple 则是唯一坚持设备端机器学习的厂商 —— 将(明文的)数据留在设备端,使用设备端的机器学习芯片来提供 AI 能力。

我知道在一些人看来 Apple 不配于谈隐私,如果注重隐私的话应该使用能够自己掌控所有数据的开源方案。但我仍希望选择一家商业公司来获得更多便利和保证,Apple 则是其中最好的一个选择。

软件生态

对于大部分普通用户来说,Apple 最吸引人的是它的第一方软件生态,这些软件和系统、硬件有着深度的整合,有着非常不错的跨设备使用体验,也贯彻了前面提到的对数据安全和隐私的保护,以及 Apple 的对美学、工具和创造、社会责任和家庭等方面的追求。

照片可能是普通人在工作之外所产生的最多的「数据」了,Apple 在自己的生态内提供了一套无缝的照片管理体验。包括对 Raw 和 HDR 的支持、够用的照片编辑功能、对照片进行分类和搜索、用 AirDrop 或共享相册来分享照片等等。对照片的改动可以通过 iCloud 同步到所有设备上(包括手机、平板和电脑);但你也可以选择不使用 iCloud,因为所有的功能(包括机器学习驱动的功能)都是可以本地使用的。

这种贯穿所有设备的一致体验在所有第一方应用上都有体现,比如我平时每天都会用到的 Safari、备忘录、邮件、地图、播客等应用,虽然相比于更专业的第三方应用,这些系统内建应用的功能都比较有限,但它们共同保证了 Apple 设备的体验下限。曾经摄像头对我来说也是「扫个二维码而已」,但正是因为 Apple 提供了这样的照片拍摄、整理、处理的体验,才让我在最近几年慢慢喜欢上了摄影。

Apple 对于第三方应用有着非常强的控制,或者换一个角度来说是 Apple 非常善于搭建一个生态让第三方应用能够接入其中,权衡哪些部分应该由系统控制,哪些应该由应用发挥。例如 CloudKit、MapKit、HomeKit、HealthKit 这些框架为第三方应用的开发提供了便利,让第三方应用之间能够互相配合工作,降低用户的学习和迁移成本。出现新的软件或硬件功能时,也可以让第三方软件自动或简单地接入。所以我觉得不能简单地把 Apple 的生态描述为「封闭」,设计一个受控制但又能发展出繁荣生态的系统是非常困难的。

对于开发者来说,macOS 上有着社区驱动的 Homebrew,我几乎所有的软件都是用 Homebrew 安装的,可以让所有软件无论是 CLI 工具、各类 SDK 和 Runime 还是 GUI 应用都处于管理之下,可以一键安装、升级或卸载。因为 Homebrew 主要被使用在开发环境而不是生产环境,所以它会类似一些滚动更新的 Linux 发行版,通常只对最新版本的软件提供支持,刚好符合我的需要。

对于独立开发者来说,Apple 生态有着简单的学习路径、清晰的盈利模式,也正是因为如此,Apple 平台上有着大量高质量的独立软件,充分发挥比如 iPad、Apple Watch、Apple TV 这样的设备形态的独特优势。

硬件

Apple 在每个产品线上仅提供少量的 SKU,无论是不同产品线还是前后的两代产品,其设计都有着非常强的延续性。就我个人来说我更偏好这样有着清晰产品路线和规划的厂商,由厂商来对各种设计进行权衡,消费者只需做很少的选择。

因为 Apple 单个产品极大的出货量,Apple 是目前市场上为数不多能真正地按照自己的想法来决定产品的技术方向的公司 —— Apple 可以投入更多的资源去研发新技术,供应链的上下游也愿意配合 Apple 去将新技术落地。对于消费者来说,极大的出货量带来的好处则是更长的硬件支持时间、在遇到问题时更多的资料和配件,以及保值的二手价格。

实际上 Apple 也确实是在按照自己的标准在做硬件。你很难用其他厂商们都在竞争的屏幕刷新率、电池容量、相机像素数、内存容量去衡量 Apple 的产品,在很多配置参数上 Apple 确实并不占优,因为 Apple 的卖点始终都是包括软件功能在内的综合体验,硬件是为体验服务的,而不是为了与其他厂商竞争的。

不过作为一家公司,Apple 必须要让愿意花更多钱的客户能够有理由花更多的钱 —— 在 SKU 比较少的情况下,Apple 选择了用扩展内存和存储空间达到这一目的,这也是被很多人诟病的一点。

垂直整合

前面聊了几个具体的方面,但如果说有一个最本质的原因导致了这所有的结果的话,我觉得就是「垂直整合」。所谓垂直整合就是指 Apple 一家公司同时完成硬件的设计和制造、操作系统和第一方应用的开发维护、提供 iCloud 这样的软件配套服务,最后还通过 App Store 控制着第三方软件生态。

这种垂直整合使得 Apple 能够对其产品在消费者手中的体验有着完全的控制,贯彻一致的产品设计逻辑,同时也对所有的体验负责。因此 Apple 并不急于使用新的技术去与其他厂商竞争,而是可以以自己的节奏进行打磨,推出系统性的解决方案(例如 Mac 到 ARM 的转型、未来的 visionOS)。

所以说 iPhone 的对手并不是 Android,而是每一个 Android 设备厂商;Mac 的对手也不是 Windows,而是每一个 Windows 设备厂商,而整个 Apple 在个人计算设备领域则完全没有相同体量的对手。

2022 年度小结

2022-12-31 01:00:00

2022 年疫情防控愈演愈烈,我们从三月开始经历了两个多月足不出户的严格封控。上海的封城可以说是非常严格,在一开始的半个月中物资供应受到了不小的影响,无法买到自己想要的食物,而除此之外的非生活必需品,更是直到六月解封才恢复正常。就在这样荒诞、焦虑和对未来的不确定的情绪中,我们浑浑噩噩地度过了这两个月。

但好在封城的这段时间我下定了决心要把英语学好,相比于之前几年断断续续、晒网多过打渔的学习,今年虽算不上高强度,但至少是持续性地在学习。我大量地增加了英文内容的输入:全部改听英文播客、对于英文视频直接看原视频而不是翻译、阅读英文的技术书籍和博客。为了弥补我词汇量的短板开始改用英英字典,除了去查见到的每一个单词之外,也专门背了一些单词。我甚至在封城期间甚至报名了一个线上的英文课程,但随着封城的结束生活回到正规,也因为工作方面的变化,这个课程并没有上完。

封城结束后,上海则开始要求 72 小时的核酸阴性证明,我们也开始了差不多两天一次核酸检测的生活。在此之前我只在去年和公司一起去桂林时做过 2 次核酸检测,而在今年一年我们就做了超过 100 次的核酸检测。但即使是这样,因为奥密克戎极强的传染性,在接近年底时,「动态清零」变得越来越难以持续下去,终于在 12 月 7 日随着「新十条」的发布,接近三年的疫情防控措施划上了一个句号,大家很快地就回到了正常的生活轨迹。

在「新十条」发布后,我和蛋黄马上就计划了去沈阳的行程,在沈阳领了结婚证。因为我们彼此早已确认我们会一直生活在一起;因为无论是客观原因,还是我们自己都不希望婚姻是很多人说的「两个家庭的事情」 ,而就是我们两个人的事情;也因为我们都很清楚接下来我们会有更大的挑战要面对,所以结婚这件事更像是我们旅途上的一个小站点 —— 然后就在我还没来得及回味更多时,在沈阳的最后一天我开始发烧,第二天顶着高烧回到了家里,之后通过抗原检测 确认了是新冠感染,这趟行程是如此地匆忙,等回过神来已经到了 2023 年。

三年的疫情重塑了我们每个人对于「风险」的认知,有人会冒着隔离和封城的风险继续旅行,也有的人会选择留在熟悉的城市或稳定的工作。随着阅历的增加,我们能越来越全面地预料到一件事情的风险,或者说其实去做每件事情都是有风险的。总的来说我觉得我自己在这三年中表现得过于谨慎,而我本来不应该是这样一个畏首畏尾的人。

这一年工作上面也发生了很多变化,很多一起工作多年的同事离开了我们。在外部环境好的时候大家当然都很开心,但当大公司面临压力时,这种压力自上而下传导时就会走样,好不容易建立的文化也会很快地被破坏掉。总的来说这一年的工作让我觉得不是很有成就感,花费了很多时间在难以对自己、公司或社会产生价值的事情上。在接下来的一年中,我希望自己能将之前仍有维护价值的 side project 捡起来,同时在开始新的项目时能够快速试错,用上我这么多年积累的工程经验,看看能否在几年内实现我理想中的自由职业。

今年我购买了我的第一台可更换镜头的相机 EOS M6 Mark II 和几支镜头,也拍摄了很多照片。此前我的照片一直是放在 iCloud 上的,编辑、整理、同步的体验非常好,但随着照片接近 200G 的容量上限,我花了一些时间去 寻找基于 NAS 的管理方案。但这些方案和 Photos 的差距实在是太大,再加上 iCloud 发布了 Shared Photo Library 和 Advanced Data Protection,最后我还是选择了升到 2T 继续用,NAS 仅作为备份使用。在近几年我开始越来越喜欢拍照,除了每张照片都是一个创作的过程中之外,整个照片库也是一个有关数字化的回忆的作品,所以我一直很重视照片库的管理,也是为什么只有 Photos 能够达到我的需求。

此外今年还购买了我的第一个全面屏手机 iPhone 13 mini 和 Steam Deck,也遇到了 Persona 5 这样相见恨晚的游戏,算是这沉重的一年中的一点色彩。

如何进行技术面试(面试官视角)

2022-05-02 01:00:00

我参加过几十场技术面试,其中作为面试官的次数要远多于候选人。

说起来在我第一次做面试官之前,并没有人教过我应该怎么做,我则一直将面试视作通过一小时左右的沟通,对候选人形成一个整体的印象,最后给出一个主观的评价的过程。在这么多次的面试中,我也总结出了一些经验可以和大家分享。

验证简历真实性

首先花一些时间聊一聊简历上提到的项目,请对方进一步介绍这个项目的业务、自己在其中承担的职责和遇到的问题。然后针对其中自己了解的部分提几个问题,如「据我所知这类项目的难点是某某方面,请问你是否有遇到、是如何解决的」,确认对方的项目经验是否真实、是否比较深度地参与了项目。

围绕简历提问

尽量提问对方了解和擅长的话题,让对方有足够的表达机会,发挥出正常水平,考察候选人擅长的部分要比不擅长的部分更有价值。

开放性问题

避免问有标准答案的问题,而是可以问「遇到某种情况时可能是什么原因、你会怎么做」或「请解释一下某个事物是如何工作的」这样开放性的问题,给对方足够的发挥空间、主动提到一些自己的知识和经验。

也许有些候选人不喜欢这样的问题,认为缺少安全感、不知道该说什么,但我觉得开放性问题才有足够的区分度,才能在短时间内对候选人形成立体的印象。我们可以在候选人实在不知道从何说起时,对问题再做进一步的解释和提示。

围绕话题由浅入深

应该针对同一话题准备多个难度逐步增加的问题,让对方回答时思路能够相对流畅,更容易考察对方在这一话题上的深度;反过来应该避免大量零散、无联系、无难度区分的小问题。

没必要执着于答案

有时在反复提示下对方的答案仍差那么一点,在面试时间大多比较紧张的情况下,我们没必要花更多的时间去让对方答出答案。在候选人表示无法准确回答问题时,也可以引导他做出一些合理的猜测(这时的重点在于猜测是否合理而不是是否正确)。只要候选人在这一问题上说足够多的话,我们就可以考察到其水平了,不一定要等他说出最后的答案。

自己不懂也没关系

在一开始,我会担心问出的问题我自己也不了解,对方回答之后会把自己问倒或者无法考察对方水平。但后来发现完全没有必要,因为面试官没有义务即时地对候选人的回答做出评价(告诉对方对还是错),即使对于不了解的话题,自己也可以从对方的自信程度、逻辑层面,对回答有一个大体的判断的。

现场编码可以很简单

候选人在现场会非常紧张,面试时间也有限,在现场编码环节没必要出太难的题,重点在于考察候选人是否有最基本编程思维和编码能力。例如我觉得一些难度不高,但适合用递归解决的题目会比较合适,可以考虑在候选人编码的过程中一直保持沟通,注重过程而不是结果。

同时我反对为候选人在面试前或面试后布置编码的作业,这会让候选人付出不对等的时间去准备面试,也很容易从「考察候选人的能力」变成「考察候选人的诚意」。

重复使用一套题库没什么问题

可以自己建立自己的面试题库,在一次次面试中对其进行反复地打磨,让问题更准确、考察更全面。有些话题可能是永远都不过时的,例如对于后端工程师可能是并发模型及与之相关的线程、内存等话题。

给对方提问的机会

一般面试的最后一个步骤是让候选人提问,不要把这个过程敷衍掉,可以引导对方提问,告诉对方都可以问哪些问题。如可以补充一下没有提及的技术话题、可以问我司的技术架构或选型、可以问所面试的职位和如果入职之后所参与的项目、可以问日常工作环境和时间等。这样可以让对方有一个主动打开话题的机会,互相判断需求是否匹配,即使没有通过面试也让对方对公司有一个比较好的印象。

有任何顾虑都可以 pass 掉

我们前面做了这么多都是为了让候选人有更好的面试体验、发挥出自己最好的水平。这种情况下如果仍对候选人某一方面的表现有顾虑的话,应该果断地拒绝掉,招进来一个不合适的人损失远比错过一个合适的人大。

沟通是否顺畅很重要

沟通是后续开展一切工作的基础,如果觉得与候选人的沟通不顺畅,对方总是不能理解自己的意思,那么即使候选人的技术水平满足要求,也应该慎重考虑。

留下面试的记录

我每次面试结束后都会尽快开始写对候选人的评价,大多在一两百字,先列出面试聊到的内容、觉得好和不好的地方、了解到的对方的技术栈,然后总结一下对候选人技术水平和沟通情况的评价。这样可以帮助自己整理思路,在候选人比较多的时候也不会记混,最后给出通过与否的评价,同时还能给下一轮的面试官提供参考。