2024-12-22 22:37:53
其实我以前一直不理解雷军。
原因一是我在猿辅导工作,我们做的产品都是追求创新和高品质。因为成本不低,所以我们的产品定价不那么便宜。像我们公司的学练机、月子中心、咖啡、月龄盒,以及我负责的斑马玩教具,说实话定价在行业都是比较高的。
原因二是我比较欣赏的人,不管是公司内部的同事,还是公司外部的一些人,都对 “性价比” 这个词表现出不喜欢。这种不喜欢主要是站在商业角度,这种模式做起来太辛苦,太容易失败。
原因三是我自己曾负责过一款基于微信传播的英语学习产品。在这个产品失败前,我们尝试过极致的低价,但是最后并没有带来同等回报的增长,所以我知道,低价并不好做。
最近读了根据雷军口述整理出来的《小米创业思考》,终于有那么一点点理解雷军要做什么了。
以下是一些感悟。
雷军的 “极致性价比” 的想法来自 Costco,他在采访中说,一个在中国国内卖几千块钱的新秀丽的行李箱,在 Costco 只需要几百块钱。同时,雷军是一个有比较多社会责任感的企业家,他希望在互联网时代,大家可以用厚道的价格买到极致体验的东西,于是,小米成了他这个理想的实践地。
企业的存在,首先是因为有社会价值,即用户需求。首先因为用户需要某种服务,才会有相应的企业存在。在用户需求的基础下,企业才会有自己的经营使命和战略,战略应该围绕着自己的社会价值,去更好地满足自己的社会价值,这样的企业才能活得更久。
小米运用 “极致性价比” 逻辑,选择了一个极度差异化的经营模式,这种模式下:
所以,小米其实是选了一条几乎没有人,也几乎没有人走成功的路。
所以,了解完小米的逻辑之后,我理解了雷军。其实常见的经营模式雷军都知道,也都理解,但是雷军就是想走一条不一样的路。同时他也认为这条路虽然难,但是对于开创者的回报巨大。
小米这种模式,需要同时做到三点:产品好、价格低,以及要有合理的利润(也就是股东回报),雷军称之为 “不可能三角”。那他是如何完成的呢?
产品好。雷军要求团队只做高端和创新的产品,即便是做充电宝,也是将原本用在笔记本电脑上的铝外壳做到了充电宝中。除了产品好外,小米在打造新品时,首先考量的第一要素是,产品是否具备“明天属性”。“明天属性”是指代表先进趋势的体验,而且这种体验是用户一旦用过就不想放手的。比如用户一旦用了智能手机,就再也不想用非智能手机了。
价格低。雷军相信厚道的定价会带来规模效应,所以,他的很多产品是贴着成本价来定的。首款小米手机,成本 2000 块,他就定价 1999。这充分诠释了他对于价格的理解。
合理利润。这么低的价格还能有利润吗?只有向制造环节要规模效应和生产效率,同时向流通环节要效率。
在合理利润这个点上,雷军做了很多事情。比如在制造环节:
在向流程环节要效率这个点上,雷军遇到了很大的挑战,没有线下的渠道愿意与他合作。于是在初期,他只能和自己的售后合作伙伴来合作开店,最终把线下渠道的成本压到了 10% 左右。而传统的渠道,成本是 20% 左右。
但是,即使到了现在,小米在合理利润这个点上,也没有完全通过市场检验。在手机端,小米因为有大量应用市场广告和 App 预装等服务性收费,才使得他有足够的利润。但是在硬件端,不是每款硬件都可以靠服务收费的,比如大部分小米生态链产品就不太需要服务,小米还需要在未来回答这些问题。
芒格说:如果你知道自己可能死在哪里,就永远不要去那个地方。雷军在书中提了很多小米犯的错误,这些错误让我记忆犹新。以下是一些记录:
小米早期连 SIM 卡的卡针都要用 10 倍于同行的材质和工艺,这事后来被雷军叫停了。雷军认为,所有的产品体验成本,应该用在用户价值上,如果用户用不到,就是自嗨。SIM 卡的卡针大部分用户只会用一次,这个卡针上就没必要用 10 倍于同行的成本。
在消费品行业,一些产品包装也会有同样的问题。如果消费者收到的产品过度包装,消费者就会认为 “羊毛出在羊身上”,这反倒是一种浪费。
雷军认为,自己在红米品牌上犯了错,以及之前用了很多 X 米的生态链品牌都是不对的,这些品牌模糊了小米品牌。所以,后来红米改名成为了 Redmi。
小米品牌,最终只用在了非常核心的产品上,包括:手机、电视、路由、音箱、笔记本电脑,以及后来做的汽车。
小米切入造车行业,刚开始下属的提案有很多创新。雷军觉得不好,他觉得大公司做新业务的三个大坑:认知错位、惯性思维、偶像包袱。总觉得自己牛逼,做新业务要干件大事,但是自己在新领域很可能就是一个小学生,有很多该交的学费都还没交。
所以,雷军要求团队 “先确保做一款好车,一款能够与当下同级所有产品比拼的好车,在确保这个目标的基础上,再考虑颠覆的部分。”
当目标变成 “一款好车” 时,颠覆不颠覆就不那么重要了,什么东西好拿过来借鉴就好了。于是,小米的第一款车显得很熟悉,很多保时捷上的设计被借鉴来了,大家也被一款好的设计所吸引。
虽然入局晚了几年,但小米汽车还是获得了一个梦幻开局。
雷军在书中提到了消费电子行业的规律:当 15-20 年后行业进入成熟期,全球前 5 的品牌必将手握 80% 以上的份额。也就是说,只有最终进入全球行业前 5,做到年出货 1000 万台以上才有意义。
雷军在进入这个行业的最初,就想好了 20 年后的终局。这种终局思维才让他能够做长期主义的事情,包括投入三电等基础能力的研发,包括为造车留够足够的资金,也包括他自己的 All in 行为。
以上。
2024-12-15 16:54:30
在学习完数据结构队列(queue)后,就可以让学生学习宽度优先搜索了。
宽度优先搜索(BFS)的形式相对固定,但是写起来代码偏长,学生在学习的时候,老是容易忘掉一些环节,所以需要加强练习。
我整理了一个 BFS 的模版,每次教学前让孩子复述这个环节,通过这种方式来强化模版的记忆,帮助学生掌握这个算法。
模版如下:
void bfs() { |
在教学宽度优先搜索的初期,其实并不需要将入队的数据整合成结构体。这样反而会让代码变得更复杂。可以直接将需要入队的数据成组地 push 和 pop,这样就实现了简易的类似结构体的效果。
推荐的教学题目如下:
题目名 | 说明 |
---|---|
B3625 迷宫寻路 | 新手入门,没有陷阱,学习方向数组写法 |
P1443 马的遍历 | 需要求步数,需要写 8 个方向 |
P1135 奇怪的电梯 | BFS 不仅仅可以是在地图上,也可以是另外的搜索形式 |
P1162 填涂颜色 | 学习标记技巧:将地图往外扩一圈 0 ,减少标记难度 |
P1825 Corn Maze S | 变种的地图,可以传送 |
P1451 求细胞数量 | 多次的 BFS 标记 |
推荐更多练习的题目如下,可作为基础训练之用:
题目名 | 说明 |
---|---|
P1746 离开中山路 | 比较标准的练习,无坑 |
P1506 拯救oibh总部 | 强化P1162 填涂颜色 中学到的标记技巧 |
P1331 海战 | 多次 BFS 标记的同时,如何判断标记物是矩行 |
以下题目难度更高一些,可以作为强化训练之用:
题目名 | 说明 |
---|---|
P1141 01迷宫 | 数据量很大,需要提前保存查询结果 |
P2802 回家 | 状态变为走过时的血量有没有变高 |
P8604 危险系数 | [蓝桥杯 2013 国 C]题目,用 BFS 暴力尝试 |
Takahashi is Slime 2 | 变种的 BFS,需要用优先队列 |
以下是详细的例题代码说明。
B3625 迷宫寻路 是一道非常基础的宽度优先搜索,只需要输出 YES 或者 NO,对输出的要求也较小,适合拿来入门教学。
在本例题中,我们也要开始教会学生定义 movex、movey 数组,后续在迷宫一类的宽度搜索题目中,这种技巧非常见。movex、movey 的快速定义技巧是:movex 和 movey 的结构交替,每一组都是一个 1 和一个 0,同时变换 1 的正负号。记住这样的技巧就可以快速定义出这两个数组。代码如下:
int movex[]={-1,1,0,0}; |
本例还需要一个数组标记是否走过,我们使用 flag 数组。参考代码如下:
/** |
有了上面的代码,我们可以在题目上做变动,比如把输出的要求改为:
如果能到达,则输出到达终点的最短步数 ,引导学生思考,现有的代码要做怎样的改造,才能实现新的要求。
于是,我们讨论得出,需要将”步数”引入到代码中,于是,原来的代码增加了两处修改:
改动的代码如下:
/** |
当我们需要输出路径的时候,我们需要做两件事情:
1、把 BFS 经过的数据全部保存下来。这个时候我们就不能用队列了,只能用 vector,然后另外用一个变量 idx 来记录处理过的元素下标。于是,判断是否处理完的条件变成了如下的形式:
while (idx != q.size()) |
2、我们需要对每个元素中增加一个 parent
变量,记录它是来自哪一个下标。这样就可以把整个路径串起来。如下的形式:
struct Node { |
最终,整体的代码如下:
/** |
有了迷宫寻路的变种练习基础,我们就可以正式练习用 BFS 来求最近的步数一类的题目了。这其中比较适合的题目是: P1443 马的遍历。
《马的遍历》一题要求我们把所有位置的最近距离都求出来,我们可以用一个数组来保存结果。
同时,马可以跳 8 个方向,有了之前的建 movex, movey 的经验,我们知道,每组数是 1 与 2 的各种组合。于是可以快速写出来这两个方向数组。
具体写法是:
-2,-2,-1,-1,1,1,2,2
具体如下所示:
int movex[]={-2,-2,-1,-1,1,1,2,2}; |
完整的《马的遍历》的代码如下:
/** |
本题还有一个小的教学点,就是用 memset 来初始化值为 -1。可以顺便教学 memset 可以初使化的值,告诉学生不是每种值都可以用 memset 来初始化。
P1135 奇怪的电梯 一题的意义在于,用非地图的形式来教学 BFS,让学生知道 BFS 不仅仅可以是在地图上。
但从实现来说,此题的难度相对较小。此题的参考代码如下:
/** |
P1162 填涂颜色 可以用来学习地图标记的一个技巧:将地图往外扩一圈 0 ,减少标记难度。实际在写的时候,只需要从下标 1 开始读数据即可。
此题的参考代码如下,代码的最后用注释带了一个测试用例。
/** |
P1506 拯救oibh总部 强化上一题学到的技巧。
同时我们此题学习用 memset 将 char 数组统一设置成字符’0’:
memset(tu, '0', sizeof(tu)); |
参考代码:
/** |
P1825 Corn Maze S 增加了“地图传送”这种新的玩法,使得 BFS 代码写起来会更加复杂一点。
像这种更复杂的 BFS,我们就可以引入结构体,来让代码更整洁一点。结构体定义如下:
struct Node { |
因为在 BFS 的过程中,我们还需要记录步数,所以我们用 STL 的 pair 来存储队列元素。借此题,我们完成了 pair 的教学。
pair 的关键用法如下:
// 定义 |
完整的代码如下:
/** |
P1451 求细胞数量 是一道非常基础的 BFS 题目。此题需要多次调用 BFS,参考代码如下:
/** |
P1331 海战 一题的标记矩形的形式比较难想到,我个人用的是另外一个判断方法:看看所填充的坐标最小和最大值计算出来的矩形面积与标记的数量是否刚好匹配。
参考代码如下:
/** |
P1141 01迷宫 这道题的难度在于,我们需要 BFS 之后,把结果全部保存下来,之后每次查询的时候把答案直接输出就可以了。
参考代码:
/** |
P1746 离开中山路参考代码如下:
/** |
P2802 回家一题的解题技巧是:将 flag 数组用于保存走上去时的最大血量。如果走上去最大血量可以更高,也是可以再次走的。
另外,当只剩 1 格血时,下一步不管走到哪儿都是死,所以就不用扩展了。
参考代码如下:
/** |
2024-12-01 11:29:19
查了好多资料,大多是不能 work 的。感谢这个视频教程:https://www.youtube.com/watch?v=LmR8sRcqbq0,最终帮我完成了需求。
以下是步骤概述:
1、在命令行执行:echo | g++ -v -x c++ -E -
,我的运行结果如下:
> echo | g++ -v -x c++ -E - |
2、在上一步的结果中,寻找 include <...> search starts here
那一行,在那一行后面有提供 5 个路径,找到中间那个路径,按住 cmd 点击,可以用鼠标打开那个路径。如下图:
3、找开之后,在那个路径新建名为 bits
的文件夹。
4、进入 bits
文件夹,随便粘贴一个头文件进去,然后改名为 stdc++.h
,修改文件内容如下:
// C++ includes used for precompiling -*- C++ -*- |
完成以上步骤,搞定!
2024-11-17 22:56:13
最近看了 DeepMind 联合创始人和微软人工智能 CEO 苏莱曼的 《浪潮将至》。
该书主要介绍了未来极大可能改变世界的三个技术领域,分别是人工智能、合成生物学、量子技术。
以下是一些读书感悟。
对抗非对称性指:拥有颠覆技术的一方可以用极小的力量对抗过去不可能对抗的力量。
这可以类比为在冷兵器时代拥有机关枪的一个人就可以对抗一整个敌人军队。
核武器的对抗也具备非对称性。拥有核武器的一方对非核国家也具备碾压性的优势。当然,后面全球努力在限制这种能力,以免被恐怖组织拥有带来全球的灭顶之灾。
人工智能的非对称性体现在对很多方面:拥有超级人工智能的组织的生产力可以是千倍于传统生产力。
书中列举了 DeepMind 公司在预测蛋白质结构上的突破,在这个技术出现之前,人类的蛋白质结构数据库中只有大概 20 万个蛋白质结构。DeepMind 公司一次性上传了 2 亿个新的蛋白质结构,几乎覆盖了所有已知的蛋白质。2 亿 vs 20 万,就是一个 1000 倍的对抗优势。
马斯克的擎天柱人形机器人如果成功大规模量产,也可能将全球制造业格局重塑。现在制造业主要还是集中于人力成本低廉的国家(例如中国,东南亚,墨西哥),到时候不需要吃饭和休息的机器的成本可能是人类的 百分之一。
现在看起来,人工智能似乎可以改变所有行业,唯一不可能替代的是人类亲自服务和沟通带来的某些情绪价值。
不同于核武器技术,这些颠覆性技术的获取难度非常低。现在非常多的大模型技术公司的代码和模型都是开源的,普通人可以方便地从网上获取到相关资源。GitHub 平台上已经有 1.9 亿个代码库,其中大部分都是开源的。
现在全球顶尖的研究成果论文也可以从网上免费下载。特别是预印本网站,它加速了全球获取论文的方便程度。arXiv 上已经收录了超过 200 万篇论文。
对于生物技术来说,可打印定制 DNA 链的 DNA 合成器的购买只需要几万美元,而且该机器小巧便捷。下图是我在微信公众号搜到的一款 DNA 合成器,重量为 60 公斤,尺寸为 1/8 立方米,比一个家用洗衣机还小。
作者打了一个比方:一个邪恶的恐怖组织只需要在网上下单,就可以拥有制造出新型病原体的能力。这些病原体可以被设计成规避人类的已知对策,以无症状的方式传播,具备对抗治疗的能力。
所以,未来一个人很可能“具备杀死 10 亿人的能力”,所需的仅仅是一个动机。
“绝命毒师”如果出现在那个时代,会有这样的动机吗?
颠覆技术不像原子弹那样明显让人意识到危险,所以大众还没有对监管产生紧迫感。
作者曾经在谷歌成立了一个人工智能伦理委员会。但是最终因为委员会里面有几个人曾经发表过反对跨性别的言论,于是大家的争论变成了要求这几个人从委员会辞职。
政治正确比人工智能的伦理更重要,于是这个委员会就解散了。
顺便说一下,几年前我听说谷歌所有项目成立的时候,都需要考虑这个项目组成员有没有黑人,有没有女人,是不是政治正确的。
颠覆技术的监管连政治正确都克服不了,更别说国际社会之间的各种利益鸿沟了。
颠覆技术在未来如果把工作替代了,会产生怎样的动荡?200 年前的工业革命可以给我们一些参考。
1807 年,由于工资被消减,6000 名英国织布工人发起抗议示威。1811 年,破坏者袭击了当地的工厂,摧毁了 63 台纺织机。
颠覆技术如果让大量普通民众失业,很显然是非常危险的。我们应该在推进技术进步的同时,考虑到对现有工人的就业影响,以尽量温和的方式来推进变革。
我曾经想过如何减小自动驾驶技术对滴滴司机的就业影响。我的方法如下:
通过以上办法,慢慢把滴滴司机都安置好了,再减少税收,让自动驾驶慢慢赢得市场。
以上假想只是针对自动驾驶技术,但如果颠覆技术一次性颠覆了大部分行业,其应对方案会变得更难。
《浪潮将至》介绍了颠覆技术(人工智能、合成生物学、量子技术)的对抗非对称性,知识普及性,和监管的难度。
未来如何发展,我们拭目以待。
以上。
2024-11-08 09:09:08
小学生在学习编程的时候,我们必然需要使用电脑上机练习。但是,电脑上也充满了各种“诱惑”:
那我们如何保证孩子能够在上机的时候一直专心练习编程呢?难道得一直在旁边盯着吗?
为此,我做了一些功课,分享给大家。
微软的 Windows 操作系统中有一个家长控制功能。通过该功能家长可以限制小朋友对计算机功能的使用,以及规定和限制使用 Windows 的某些功能。
例如: 限制孩子的账户只能使用某个应用程序、游戏等。
使用 Windows 的家长控制功能可以在不安装其它软件的情况下,控制孩子使用Windows的绝大部分应用和功能。
具体操作方式如下。
在管理链接中就可以管理孩子的时间了。
以上。
2024-11-07 09:13:43
小学生在学习编程的时候,像变量,赋值,输入,输出,分支这些逻辑相对容易理解。因为这与人类真实世界的很多行为相似,所以学生会很容易吸收。具体来说:
但是,for 循环由于其很难与现实世界“类比”,所以成为小学生学习编程的第一个障碍。
如何理解 for 循环,并且灵活运用 for 循环,成为一个教学难点。
我在教学 for 循环的时候发现,如果我们用尽量渐进式的方式,让孩子刚开始接触到的 for 循环与现实世界数学中的数列一一对应。然后,再一步一步拔高难度,随着难度提高,最终 for 循环可以实现求解“非波拉切数列”以及“小数点后 10000 位”这类已经高度变型的题目。
因为每一步的难度提升梯度很小,所以学生虽然找不到现实世界类比,但终于还是比较容易理解整个渐进变化的过程。
这就类似于我们学立体几何前先学平面几何,学平面几何前先学点线面一样。从微小的简单事物开始,我们最终可以创造整个世界。
以下是我对 for 循环的具体教学拆解。
输出从 1-N 的等差数列是使用 for 循环最基础形式。我们先用这个引入,让孩子先初步了解 for 循环的三段形式。
for 循环的三段式其实对初学者来说还是有点绕,借此环节把 for 的基本格式熟悉。
示例代码:
cin >> n; |
累加器的写法对于初学者来说是一个小障碍,但是累加器与 for 循环的结合使用在之后的变化很常见,所以我们在这个阶段把累加器引入,帮助孩子建立累加器的使用习惯。
示例代码:
int sum = 0; |
注:对于不习惯 += 的学生,也可以刚开始用 sum = sum + i
来教学,减少学生的陌生感。
此题对应的线上练习是:《2016:【例4.1】for循环求和》
此题也可以进一步变化为:分别求奇数和、偶数和。让学生学会在 for 里面嵌入 if 表达式。
平均值的计算涉及整除的概念,需要在除之前将被除数转化为小数,同时需要用 iomanip 头文件中的函数来控制输出格式,这一编程技巧正好在这一步引入,让学生逐步熟悉对输出的控制。
示例代码:
|
此题对应的线上练习是:《1060:均值》
大部分学生以为 for 循环是 for 循环,输入是输入,却不知道for 循环里面也可以写输入。通过此题,学生可以更多了解 for 循环的用处:用来批量输入。
示例代码:
int sum = 0, a; |
相关练习:
与上一题类似,我们在这里引入 if 条件,让学生了解,for 循环里面可以放前面学过的分支结构。
另外,本题的累加器变形为“计数”。让学生对计数的操作产生基本的认知。
示例代码:
int cnt = 0, a; |
我们在上一题的基础上增加难度,让累加器可以是多个。
示例代码:
int cnt1 = 0, cnt5 = 0, a; |
相关练习:
我们学会了在 for 循环中累加,计数,那更多的变化就是求乘积了。在求乘积的时候,这个累积的变量值要从 1 开始。
示例代码:
int mul = 1, a; |
此题对应的线上练习是:《2019:【例4.4】求阶乘》
次方是乘积的另一种变化。线上的练习题是:《1069:乘方计算》
示例代码:
int mul = 1, m, n; |
M 的 N 次方还有两种难度的加强,分别是:
《1075:药房管理》一题就展示了一种更复杂的 for 循环。
原来我们不但可以累加,计数,求积,还可以做减法。
示例代码:
cin >> m >> n; |
《1071:菲波那契数》 要求求第 K 个斐波那契数。
我们在这个 for 循环中实现了递推算法。递推是一个对新手来说很“神奇”的计算机算法,对于初学者来说,斐波那契数是最佳的一个学习例题,因为代码可以非常短。容易理解递推的核心思想。
示例代码:
|
N*(N+1)*(N+2)*(N+3) = 1680
请问 N 的值是几暴力枚举的基础代码也是 for 循环,我们用一个最简单的题目来引入枚举的思想。
示例代码:略。
我们可以让学生试图输出一个二维的图形,比如输入 N,输出 N 层的金字塔。
金字塔的形状可以是这样:
* |
也可以是这样:
* |
也可以是这样:
* |
借此让学生锻炼模拟的能力。
此题对应的线上练习是:《2027:【例4.13】三角形》
输入矩形的宽高,输出下面的形状。借此更一步强化学生模拟的能力。
***** |
此题对应的线上练习是:《1097:画矩形》
for 循环中的三段,除了正向的写,也可以逆向的写。所以,我们可以让学生尝试把 1-N 倒着输出。
类似的,也可以提醒 for 的第三段i++
其实也可以改成 i+=2
之类的形式,实现各种跳着输出的情况。
在实操中,我们可以用一块白板进行代码的演示,然后不断擦写相关的关键代码,保留基础的 for 框架。这样方便学生观察到其中的变化与不变。
在没有白板的时候,也可以用电脑中的 IDE 或 PPT 来进行演示。
对于每一步的问题,可以让学生来应答。通过应答的过程,观察学生对此类问题的掌握情况,有选择的加速进度或者放慢进度,保证学生对知识的吸收到位。
在多人教学的时候,可以让大家在纸上写下自己的答案,然后待大家都完成或大部分完成后,随机选择一位学生给其他人讲解,通过互助的方式,既锻炼了学生的表达,又强化了学生对知识的理解。
对于未完成的同学,可以让他反向提问,其他人帮忙解答。老师在这个过程中只需要监督整个过程,保证知识传递是正确的即可。