local spr = app.activeSprite
if not spr then
return app.alert("请先打开一个 .aseprite 文件")
end
-- 获取导出路径
local outputPath = spr.filename:gsub("[^/\\]+$", "") .. "layers_exported/"
app.fs.makeDirectory(outputPath)
-- 递归处理所有图层,包括组内图层
local function exportVisibleImageLayers(layerList)
for _, layer in ipairs(layerList) do
if layer.isGroup then
-- 递归组内图层
exportVisibleImageLayers(layer.layers)
elseif layer.isImage and layer.isVisible then
local cel = layer:cel(1)
if cel and cel.image then
local image = Image(cel.image)
local bounds = image.bounds
if not image:isEmpty() then
-- 创建临时 Sprite 用于导出
local tempSprite = Sprite(image.width, image.height, spr.colorMode)
tempSprite.filename = layer.name
-- 绘制图层图像
tempSprite.cels[1].image:drawImage(image, -bounds.x, -bounds.y)
-- 裁切内容
tempSprite:crop(tempSprite.bounds)
-- 保存为 PNG
local filename = outputPath .. layer.name .. ".png"
tempSprite:saveCopyAs(filename)
tempSprite:close()
end
end
end
end
end
-- 启动导出流程
exportVisibleImageLayers(spr.layers)
app.alert("✅ 所有可见图层已裁切并导出完毕")
分类: 学习笔记
-

Aesprite 脚本:分别导出每张可见图层实际像素部分
-

小程序开发笔记 2021.02.05
本期更新了 「时限管家」 小程序 0.2 版本,对 0.1 版本进行了大幅度的 UI 优化和部分代码层面的优化。在这期间遇到了一些很有意思的问题,花了不少时间寻找解决方案。
环形进度条
网上能找到很多使用 CSS+JS 制作环形进度条的方法,但大部分方法过于复杂。根据相关词在搜索引擎中检索到的环形进度条实现思路如下:
- 建立一个正方形 div 图层,调整圆角为 50%,将其变为圆形。
- 为该图层添加带颜色的 border 边框,同时利用 overflow:hidden 属性隐藏一半,得到半个环形。
- 以同样方法,换一种颜色建立另一个半圆环覆盖在原图层上。
- 在上方的半圆环围绕圆心旋转一定角度,位于下方的半圆环露出部分便实现了小于 50% 的环形进度条。
- 进度过 50% 后另半个圆环同理。重复 1-4 步建立左边半个圆环,最后再建一个右半环盖在其上,以实现大于 50% 的进度条。

可以发现,以上这种方法需要开发者创建至少三个图层,并且通过 JS 进行图层颜色改变、 z 轴高度变化和图层旋转。这是我不愿意使用的。
随后我发现了 css 的 clip-path 属性,由此思考出了一个以 JS 控制为主,较为简单的环形进度条实现方法。
clip-path 属性相当于为元素定义了蒙版,以此来让元素的某些部分显示或隐藏。利用 clip-path:polygon(x1 y1,x2 y2,x3 y3,……) 属性能创建不限顶点数的多边形蒙版。其中 xN 和 yN 分别表示顶点的 x 轴坐标和 y 轴坐标,坐标必须使用带像素单位的数字或百分比数字。
我设计的方法如下:
- 建立一个带颜色的正方形 div 图层,调整圆角为 50%,将其变为圆形。
- 用 clip-path 绘制一个 5 边型缺口。
- 再画一个以背景为底色的同心圆盖在原图层上方,形成进度条。
- 最后利用 JS 控制 clip-path 的顶点位置,以实现不同进度的进度条样式。

然而该进度条过于简单,且毫无设计感,我便添加了两个圆点遮盖在进度条上方,并通过 JS 控制圆点的定位,使其位于进度条开端和末端。
随后我发现计算出的圆点圆心因四舍五入的缘故无法准确对齐,会产生如图效果。最终通过放大圆点并微调圆心位置,遮盖了这点小瑕疵。

日期选择器
微信小程序自带了选择器组件,但我在使用过程中对其交互方式并不满意。
小程序自带的选择器和其他手机端选择器一样,都是轮盘式选择器。当当前日期为 2 月 1 日,用户想要拖到 2 月 28 日就必须将轮盘拖动一整圈,体验感非常差。

我曾注意过苹果 iOS14 里,设计师将闹钟的时间设定栏由原来的轮盘变成了 「输入框+轮盘」 的形式,这使得用户既可以上下滑动改变所选时间,又可以自行输入时间,更加方便用户的使用。

在经过考虑后,我决定先将日期选择器改为输入框,用牺牲拟真体验的代价换来用户输入生产日期和失效日期的便利。
由于时间有限,日期的输入功能目前体验并不十分顺畅,在下个版本会进行优化。
另外,在制作该页面时,我遇到了该页面内生产日期和失效日期在改动一项时另一项同时变化,始终保持一致的情况。经过排查发现在页面初始化之初我调用了一个方法,设置了一个日期变量并将其用 setData() 的方法赋值给生产日期和失效日期,最终使得两者的值始终相等。解决的方法则是设置将该日期变量赋值给另一个新建变量,把这两个变量分别赋值给生产日期和失效日期即可。
动画效果
动画对于提升用户体验有着巨大的作用。适当的动画能吸引用户的注意,为用户可进行的操作提供暗示。 制作动画效果需要以下几步:
- 在指定的 view 图层添加 animation 属性,定义控制该图层的动画名。
- 在 JS 里使用 wx.creatAnimation() 方法创建动画实例。
- 基于该动画实例,添加所需的动态效果,并以.step() 结束。
- 使用 this.setData({<NAME>: animation.export() }) 导出运行该动画。其中<NAME> 为第一步中 animation 属性内所写的动画名。
通过以上步骤,我在小程序内实现了滑动和弹出效果,使得小程序不再像幻灯片一样生硬。

值得注意的时,我通过实践发现 wx.creatAnimation() 方法必须在每个动画效果之前单独运行。若该方法在页面初始化之初便运行,会导致该页面所拥有动画属性的图层同时运动。
实现毛玻璃遮罩效果
某些应用弹出遮罩时背景会虚化,将用户的注意力吸引到上层内容的同时又显得非常自然。 QQ 空间发布动态就是其中一例。

我曾以为该效果是通过对遮罩层进行设置得到的,而小程序没有提供相关设置。但他人的解决方案使我茅塞顿开:在遮罩层弹出的时候将底层设为模糊就行了。
将这个简单案例进行介绍的主要目的其实是想说明,某些问题看上去很难,但是换个思考方式便能迎刃而解。
-

小程序开发笔记
前阵子考研时收集了一些想法和点子,这其中包括了前两年自己开发的小程序 「TRPG 偷懒君」,希望陆续实施。然而考虑到对这款产品的构思过于复杂,于是决定先实施另一个小程序开发计划,作为自己的小程序开发复健。这就是 「时限管家」 项目。
我经常会遇到生病时想起放置在家里的药品,却发现已经该物品已经过期的情况。而将场景再扩大,药品也能替换成食物、化妆品等物品。这些物品都具有共同的特征:与日常生活息息相关且具备一定的时效性。
「时限管家」 便是一款及时提醒用户手头物品即将过期,从而达到对物品进行管理的目的的应用。
考虑到使用的便捷性,最终我还是选择先开发微信小程序,并利用微信小程序的云开发功能构建数据库和存储环境。 在开发过程中,我学习到了很多开发知识,希望通过 《小程序开发笔记》 系列记录下我学习的过程。
云开发
云开发是微信小程序开发工具的一个服务。开发者可以使用云开发快速构建数据库与后端代码,更好地接入微信生态环境。
早些时候,我在 「TRPG 偷懒君」 开发之时便已开始使用云开发服务搭建数据库了,而这次对云开发的学习帮助我加深了对其的理解。
云开发提供了 JSON 数据库,每条数据都是以 JSON 格式储存的对象,因此并不像 MySQL 一样拥有外键、字段格式、限制长度等要求,构建更随意一些。在云开发后台,可以单独设置每个数据表的小程序端读写权限。 云开发能力还包含了云函数,即通过在开发工具内编写并一键上传部署即可运行的后端代码。云函数必须在 node.js 环境下运行。
云开发数据库的读写是通过 wx.cloud.database() 方法进行处理的,可以直接写在小程序的 js 文件内,也可以写在云函数里,前者称为小程序端而后者称为服务端。然而小程序端无法进行聚合操作;服务器端数据表的读写权限又不受云开发后台控制。
这些问题在开发初期为我造成了一定的困扰。比如我想利用云开发后台来方便的设置读写权限,便在小程序端编写数据库读写操作,然而这就无法使用聚合操作,先对数据进行排序再分步读取了。最终在这 0.1 版本中,我没有设置分步读取,而只是设置了简单的存取。接下来在 0.2 版本,我会对其进行改进和完善。
图片存储
我曾希望在用户录入物品时,可以附加图片备注。但是实际开发时,考虑到了一个问题:如果用户在上传或修改物品图片时,不删除存储在服务器里的图片,那么这些图片会成为垃圾占用服务器空间,日积月累会越来越多。
目前构想的解决方案是:
- 当用户修改物品图片并点击保存后,先删除服务器中的原图,再保存上传的图片。
- 当用户删除一件物品时,同时删除服务器中的原图。
因为上传图片操作涉及到同步和异步且比较复杂,在 0.1 版本中我直接删除了该功能。后续开发会补上。
表单
小程序官方文档里关于表单功能写的不是特别清楚,且官方文档和提供的案例片段里甚至有一些内容不一致,令我十分困惑。所以我并没有直接使用表单的提交方法。
但是女朋友说如果能用表单的响应就最好用表单的,那我还是找时间再学习一下吧。
流畅度
一个应用的使用流畅度是非常重要的。 在页面跳转、数据存储等操作时,如果不能加入一些响应操作或过渡动画,就会给用户带来 「不流畅」 的感受。
以下是我考虑的一些流畅性优化,会在后续版本开发:
- 跳转到新页面并加载数据时,显示加载动画。加载完成后关闭加载动画。若加载失败则弹出提示。
- 下拉首页显示加载动画。数据刷新并加载成功或失败后关闭加载动画并弹出提示,几秒后关闭提示。
- 保存产品数据时,显示加载动画。加载成功或失败后关闭加载动画并弹出提示,几秒后关闭提示。
UI
作为设计师,UI 竟是我最后考虑的内容。
在开发时限管家时,我优先考虑实现功能而非美化产品,所以 0.1 版本的界面非常简陋。
在 0.2 和 0.3 版本,我会为其设计一套较为美观的 UI 。
目前 「时限管家」 0.1 版本小程序已上线,后续还会继续优化。感兴趣的朋友可以扫描以下二维码试用。

-

WordPress 升级出现 「存在不一致的文件权限」 的解决方法
「因为我们不能复制一些文件,升级未被安装。这通常是因为存在不一致的文件权限。 [文件名] 安装失败」;
解决以上问题的方法是找到该文件的地址,并将文件读写权限修改成 777 。
以下是 CentOS 的指令:
chmod 777 [文件名]
如果不用指令,也可以用软件 CrossFTP(Mac) 或 FlashFTP(Windows),右键点击对应文件,选择 CHMOD 修改权限。
如果不放心 777 的读写权限,在升级结束后再次将文件夹修改为 755 。
-

4 月 18 日英语翻译笔记
最近抽空做游戏 《星际传奇》 的字幕翻译,学到了一些生词和俚语,觉得非常有趣就记录下来了。 感兴趣的朋友可以点击阅读原文跳转至我的 bilibili 主页观看。
odds noun
可能性;概率 the probability that a particular thing will or will not happen
That minefield』s offering better odds than you』re gonna get takin』 me to Butcher Bay.
have a short memory
健忘;记性不好 to forget things quickly
You think Hoxie』s memory is that short?
bank verb
赢得一定数额的钱 to win or earn a particular amount of money
I bank your bounty plus fifteen.
buckle up
系紧安全带 to fasten the belt that keeps you in your seat in a car or a plane
vent noun
通风口 a small opening that allows air, smoke, or gas to enter or leave a closed space
rise and shine
快起床 said to tell someone to wake up and get out of bed
sign sth over
签字交接 to give the legal rights to own or do something to someone else by formally signing a document
get under sb.』s skin
激怒某人 to annoy someone
push it = push your luck
得寸进尺 to try too hard to get a particular result and risk losing what you have achieved
We can come to a number, but don』t push it.
deal or no (deal)
成还是不成
Extra or no, Riddick stays at Butcher bay.
在语境里,佣兵向典狱长索要 Riddick 的赏金外加 50 元,讨价还价也一直围绕这 50 元,所以最终典狱长将 deal or no 变形为 extra or no 。整句意为:成或不成,Riddick 都必须待在屠夫湾。
period noun
(用于话语结尾,表示某一话题已讨论完毕,不愿再继续) 到此为止 said at the end of a statement to show that you believe you have said all there is to say on a subject and you are not going to discuss it anymore
check verb
阻碍 to stop someone from doing or saying something, or to prevent something from increasing or continuing
So check those desires right now, because you will not get out.
contraband noun
违禁品 goods that are brought into or taken out of the country secretly and illegally
Don』t ask what』s contraband. I define it day by day.
have (one) by the balls
捏着某人的蛋蛋 (睾丸),表示完全控制住某人 to have complete control or dominance over one
Don』t worry. I got Rust by the balls.
think one』s shit don』t stink
(冒犯性言语) 觉得某人的屎不臭,表示某人非常自大 to assume an air of arrogance, condescension, or superiority over others.
delouse verb
给人或动物除虱 to remove lice from the body, hair , or clothing of a person or the fur of an animal
merc = mercenary noun
雇佣兵 a soldier who fights for any country or group that pays them
slam = slammer noun
监狱 prison
get hold of sb
抓住/控制某人 to gain total control, influence, or power over one
pass out
昏迷 to become unconscious for a short time
infirmary noun
医务室 a room in a school, college, or university where students who are injured or feeling ill can go to a nurse ofr treatment
run the show
掌控某物 to have automnomy or authority over something; to be in control of something
rock the boat
惹麻烦 to do or say something that might endanger a stable situation or upset the status quo
Best not to rock the boat, or you』re gonna get sunk.
the devil is in the detail(s)
细节决定成败 plans, actions, or situations that seem sound must be carefully examined, because minor details can end up causing major, unforeseen problems
That』s where the devil lives - in the details.
pull the strings
秘密控制某人或某组织 to have the real control over a person or organization, especially in secret or without it being public knowledge
Rust pulls all the strings in this block.
thorn in (one』s) side
心头刺,持续的威胁 a constant or persistent cause of annoyance, frustration, or trouble
Rust is a thorn in my side.
tighten the screws
向某人施压 to put more pressure on someone or something to do something
He』ll turn when I tighten the screws.
goon noun
打手,暴徒 a hooligan; a thug or bodyguard
big dog
重要人物 a slang term for an important person
I thought you were the big dog, Rust.
crumbs from (one』s) table从富人那里得到的细微好处 an insufficient or unfair amount of something provided by one when one has a sufficient or abundant amount
But everyone knew they feed on the crumbs that fell from Abbott』s table.
-

解决 WordPress 响应速度过慢的问题
关了 Jetpack!
就这插件导致我网站打开至少 10 秒钟,现在关掉之后好多了。
然后我挂了个腾讯 cdn,但是有时会有 http error 564 的报错,就很头疼。
总之问题大头还是个别插件的问题。
-

WordPress 开启腾讯云 CDN 遇到的一些问题
背景
WordPress 打开速度堪忧,影响体验。在查询资料的时候了解到可以通过 CDN 加速来优化网站加载速度,因为服务器用的就是腾讯云,所以最后决定用腾讯云的 CDN 加速。
问题描述
- 按照步骤开启 CDN 加速后,发现在手机上提示网站不安全,推测网站指向了 http;
- 进入后台进行操作时无反应,最后跳出无法连接数据库。
问题解决
第一个问题比较好解决:腾讯云后台能设置 http 跳转。

第二个问题:参考魏艾斯博客,发现需要调整缓存,因为 php 等文件缓存更新时间必须设置及时响应,否则会导致功能无法实现。
后续
使用了腾讯云 CDN 之后 Jetpack 的 Monitor 隔一会儿就发邮件给我说网站未加载/已重新加载,非常烦人。而且使用了腾讯云 CDN 之后加速效果不是很明显,网站打开比之前快了些。
查了下资料,参考了张旭虎 《经验分享:我是如何对 wordpress 博客加速的?/解决腾讯云 564 错误》,使用了 Autoptimize 和 WP Fastest Cache 两个插件,发现加速明显。再挂上腾讯云 CDN 之后发现还不如不挂,最终抛弃了腾讯云 CDN 。
-

近期解决的 WordPress 相关问题
更新 PHP 之后网站出现 403,后台出现 file not found
经过各种排查,觉得可能需要更新所有内容,包括 mariaDB 和 php 相关配套内容 (php-fpm 等),更新之后依旧如此。
最后迫不得已重新安装了最新的 wordpress,安装之前关闭了主题和插件,因为据某篇文章 (https://www.v2ex.com/t/240774) 说会影响。重装后登录/wp-admin/install.php 设置了一下数据库,最后成功还原。原数据都还在,不影响正常使用。
要执行请求的操作, WORDPRESS 需要访问您网页服务器的权限,输入账号密码错误
文件属主属组不对。
使用 ls -l 指令查看文件权限,大部分文件属主和属组分别是 root root,有几个文件是 apache root 。
使用 chown -R u:g file 指令修改属主属组,u 为属主,g 为属组,file 为文件或路径。
修改所有文件为 root root 之后没有解决问题,修改为 apache root 后解决问题。
MariaDB 经常崩溃而导致网站无法连接
查了一下类似的问题,多是因为数据库内存不足而无法分配资源。使用了创建 swap 分区的方式,目前已不再崩溃。
分配 512M 的交换分区:
dd if=/dev/zero of=/swap.dat bs=1024 count=524288 mkswap /swap.dat swapon /swap.dat free -m为了让系统自动挂载 swap 分区,编辑/etc/fstab 并添加一行:
/swap.dat swap swap 0 0重新启动 MariaDB,没有再出现崩溃问题。
参考资料:https://linux.it.net.cn/e/data/MariaDB/2014/1014/6509.html
2019.04.24 追加
看起来分配 512M 空间不够,上次又崩了,于是调整了一下,重新分配了 5G 交换空间,妈妈再也不用担心我的数据库崩溃了。
-

解决 WordPress 无法上传音频
问题描述
- 上传音频文件,提示 「此响应不是合法的 JSON 响应。」
- 图片可以正常上传。
问题推断
图片可以正常上传,说明不是文件夹权限的问题。网上没有搜到和非法 JSON 响应相关的内容。怀疑是无法上传比较大的文件导致。
因为之前已经调整过 Wordpress 的文件最大上传限制了,所以不太可能是 Wordpress 的问题。
解决方法一
治标不治本的方法:把音频文件直接放进/wp-content/uploads/目录下面,插入音频时输入 URL 。
虽然可行,但是后台媒体库不显示该文件,无法方便管理。且每次添加文件得用 FlashFXP 传,非常麻烦。
解决方法二
根据 https://yq.aliyun.com/articles/625723 所述,修改 nginx.conf,在 http 段添加代码如下:
client_max_body_size 100m;服务器输入指令重启 nginx:
systemctl restart nginx重启后测试可以正常上传音频了。
-

尝试解决 WordPress 经常无法连接数据库的问题
问题描述
- 最近 Jetpack 经常提醒我 Wordpress 崩溃。上网站一看,貌似是无法访问数据库。
- 修改 Wordpress 上传文件大小限制,然而传输超过 1M 的音频竟然会导致网站崩溃,出现与上一条类似的情况。

问题推断
怀疑是因为内存限制过小导致的。
解决方案一
在 wp-config.php 文件内添加代码如下:
define(『WP_MEMORY_LIMIT』, 』128M』);其结果是在网站首页顶部出现了如下代码:
Constant WP_MEMORY_LIMIT already defined in /etc/wordpress/wp-config.php on line 104看起来是对于内存限制的代码重复了。
解决方案二
根据 https://blog.csdn.net/qq_17087739/article/details/48137359 的描述去修改了/wp-includes/default-constants.php 里的相关代码:
// set memory limits if( !defined('WP_MEMORY_LIMIT') ) { if( is_multisite() ) { define('WP_MEMORY_LIMIT','128M'); }else{ define('WP_MEMORY_LIMIT','64M'); } } if( ! defined('WP_MAX_MEMORY_LIMIT') ) { define('WP_MAX_MEMORY_LIMIT','256M'); }将其改为了:
// set memory limits if( !defined('WP_MEMORY_LIMIT') ) { if( is_multisite() ) { define('WP_MEMORY_LIMIT','256M'); }else{ define('WP_MEMORY_LIMIT','256M'); } } if( ! defined('WP_MAX_MEMORY_LIMIT') ) { define('WP_MAX_MEMORY_LIMIT','256M'); }并且将解决方案一里添加的代码去掉。目前正在观望结果。
2019.04.03 跟进结果
目前依旧偶尔会崩溃。
2019.04.24 跟进结果
结合前段时间解决的问题汇总 (近期解决的 WordPress 相关问题),猜测是因为数据库内存不足,无法分配资源,而导致 mariaDB 崩溃。解决方法已在文章里说明。
-

《腾讯产品法》 第一章阅读笔记
产品设计的三个阶段
- 阶段一:以片面、固化的眼光看问题,只看到零散的表象和静止的格局。解决方案呈点状随机分布。
- 阶段二:以宏观、系统的眼光看问题,能看到产品与产业、产品与其他产品的关系和位置。解决方案开始具有系统性特征。
- 阶段三:以动态、演进的眼光看问题;能看到时间长河中问题变化的趋势。解决方案能够助推产品顺势成长。
收集问题是容易的,不容易的是分析问题,找到问题的本质,并且与其他问题结合起来,找到更合适的解法。
连环提问法
- Q1:他们当时为什么要那样设计?
- Q2:这种设计基于当时的何种前提条件?
- Q3:所有前提条件直至现在都还保持不变,没有发生任何变化吗?
- Q4:随着时间和环境的变化,有引入新的问题吗?
需要警惕前人留下来的陷阱。不是所有的解决方法都适合,有些解决思路是过时的。要抱着打破沙锅问到底的想法,了解每个产品的设计思路,借鉴设计思路到当下产品的环境里。连环提问法有助于理解用户需求的真实动机,挖掘隐藏在问题背后的真实场景,并有针对性的解决对应的问题。需要多研究 app 重要功能的设计过程。
微信群的设计
- 1.0 设计认为 「群功能」 是中心:所以当你使用 1.0 的群时,要跑到 「群功能」 入口位置去创建,拉人的时候必须提供 「群功能」 的 ID,人们也要通过搜索 「群功能」 的 ID 才能进群。用户一直在围着 「群功能」 打转。
- 而 2.0 设计真正认为 「用户」 才是中心,至于群功能,让它无形地存在就好。所以没有什么创建的说法,你拉人直接开聊就是了;搜索的时候也是一样,你只需要直接搜某个人就行。常用的、人多的群,人聚好了再取名字以方便查找。
设计者在 1.0 时认为群是固有属性,但是实际上群是一群人聚合的产物。现实中人群沟通逻辑是先有说话的动机,再找人说话,再有给这个群体取名称的需求。所以 2.0 的设计思路是直接拉人聊天,这一个过程就是创建群的过程。让功能贴近人的实际操作场景,简化操作,降低门槛。
- (为避免重复造轮子) 最好的办法是时刻保有从源头思考的意识,充分理解过往思路和关键环节,关注旧模式的前提是否发生变化、是否存在新的优化空间,快速判断是否存在全新的解决方案。第一性原理是一种从问题源头进行思考的意识,好的设计者能够把这种意识纳入所有思考过程。
相对思维的运用
- 微信的优势:产品渗透力极强,用户体量巨大,横跨多个年龄层;产品策略聚焦移动端,目标定位是做用户身体和大脑的延伸。
- 微信的劣势:用户体量巨大决定了微信在设计时必须以通用性和兼容性为主要考量,不能向某一特定群体过度倾斜;聚焦移动端意味着 PC 端相对弱势,不能为某些与 PC 场景联动的需求提供深度服务。
- 通过分析微信,QQ 定制的差异化产品策略:聚焦年轻群体,以个性化、趣味化为主升级手机 QQ;凭借 QQ 在 PC 端多年的积累优势,在移动端推出满足 PC 场景联动需求的全新产品。
TIM 的策略
- 企业内部交流主要有两种:沟通和流程处理。主流的企业内部通信工具,主要是自上而下从决策者入手,也就是从老板的角度考虑问题,以建立企业内部关系链为起点,然后支持沟通和流程问题 (相当于集成了 OA 办公自动化),这样的产品往往集成了很多审批流程和强制管理性质的功能,可见诉求更为 to B 。相较于主流企业社交的强组织关系管控,TIM 显然弱化了组织管控,自身是自下而上的结构,以熟人关系链为起点,解决了普适性的沟通协作问题,却抽离了管理诉求,这样的角度更 to C 。用鄢贤卿的话说,「员工用起来更有愉悦感」。
具象与抽象
- SPU(Standard Product Unit,标准化产品单元) 、商品 (京东叫 product,淘宝叫 item) 和 SKU(Stock Keeping Unit,库存量单位) 。
SPU 、商品到 SKU 是从抽象到具象的概念,比如跑鞋、某一款型号的跑鞋、该型号下不同颜色和尺码的跑鞋。
- 精明的商家一定会根据环境和客户需求有针对性地设计自己的 SKU 。好的 SKU 设计,就是运用数量有限的 SKU,去实现高满意度的销售 (当然销量也很重要,这和用户对所购产品的自然需求相关) 。而没信心的表现,往往是把产品布得满满当当,不知道哪个好卖,数量众多的 SKU 堆积,最后却往往积压了一堆卖不出去的 SKU 。
将 SKU 组合在一起,构成套装,如 QQ 秀的套装和网易云音乐的歌单,针对不同喜好的用户推出不同的组合产品。
- (网易云音乐) 通过对最基础的单曲进行强内容导向的聚合,聚合自由度更高的歌单切中用户情感需求,取代老旧的 「专辑」 聚合方式,赢得了广大用户的青睐。网易云音乐更是以这一功能作为初始发力点,在众多音乐类 App 中从无到有,异军突起。虽然网易云音乐不是第一个推出歌单功能的应用,但它却是第一个以此功能为核心、全面撬动产品的音乐应用。
反馈的重要
一方面是产品对于用户行为的反馈,另一番面是用户对于产品的反馈。魏则西事件是没有反馈的结果,淘宝、京东等商品的排序同样是受广告排序影响,但是因为存在用户评价,买家的反馈能作为其他人的参考意见,所以能尽量减少信息不对称带来的后果,避免商家欺瞒消费者的情况。
微信支付扩张的破局思路
微信支付最开始一直被支付宝压着无法翻身,直到推出微信红包功能,让微信支付的使用量和微信群的数量翻了好几倍。红包功能是支付功能的衍生,是基于微信强项——社交属性而打造的功能。有人发红包,就会带来收红包的人绑定微信支付,进而促进这一群人在其他群里发红包,雪球就会越滚越大。
演化
- 具有生命力的产品,和环境息息相关。环境变了,能够存活的条件变了,它也会随之迭代更新、调整改变。因此,互联网市场变化极快,互联网产品就成了最讲究 「迭代」 的产品。产品从最开始第一个版本发布,到后面不断地更新迭代,每次迭代都是在当时的环境下寻找最佳存活路径的结果。
- 因为不能百分百确定存活条件是什么,必须以最小的成本、最大的数量积极试错——这样的系统就是类生命特性的系统,这样的企业、这种类型的产品才不会轻易死掉。
- 对初创型企业来说,运用精益创业思路,以最小成本快速迭代,积极试错,犯错的次数就是企业制造 「生命」 的数量。当排除很多的错误路径后,产品就能不断向着对的方向前进。后文将谈到的最小可行性产品原型之所以有效,就在于它以非常小的成本获得了极大的可能性,是以小博大的典型工具。
- 对成熟型企业来说,需要思考的是整个公司产品体系的稳定性以及重点产品的架构稳定性。通过思考整体布局,让处于不同生命周期的产品承担不同的任务目标,进而使企业获得更强的稳定性。
产品的框架设计
- 好框架在每个阶段体现出来的核心任务只有一个。选出那个最重要的任务,聚焦再聚焦,利用产品框架去放大它,完成任务后再把它收纳起来。可以支撑上述这些行为的框架才算得上是好框架。












