我是一个比较反感“反问”的人。
总的来说,是因为我对于反问的感观不太好,特别是反问背后所表现出的挑战(这可能源自我是一个不那么自信的人)。反问带给我的感受更多的是“不认可”、“不信任”,从而激起我的反抗。反问,拥有一定的攻击性。
而疑问,则是一个更好的选择,特别是在人多、鱼龙混杂的时候,能够更好的隐藏自己的意图,将自己保护起来。反问则会更加暴露出你的倾向,并不适合自我保护,过于锋芒毕露。
提醒自己,不要做一个总是”反问“的人。
我是一个比较反感“反问”的人。
总的来说,是因为我对于反问的感观不太好,特别是反问背后所表现出的挑战(这可能源自我是一个不那么自信的人)。反问带给我的感受更多的是“不认可”、“不信任”,从而激起我的反抗。反问,拥有一定的攻击性。
而疑问,则是一个更好的选择,特别是在人多、鱼龙混杂的时候,能够更好的隐藏自己的意图,将自己保护起来。反问则会更加暴露出你的倾向,并不适合自我保护,过于锋芒毕露。
提醒自己,不要做一个总是”反问“的人。
五一因为一些私事,提前回了河南,也有空去了趟南街村,一个很有意思的地方。
我知道南街村还是因为南街村方便面,作为一个回族,其实能吃的东西不多。南街村在历史上曾推出清真的方便面 —— 北京方便面。
不过,这次去南街村,倒不是因为北京方便面,而是我妈提到,如今的南街村的定位是”共产主义第一村“。
这个定位很有意思,我国是社会主义国家,而其中有一个村子是以“共产主义第一村“为其宣传口号的,而且还宣称自己一直是一个非常不错的福利村子,令我十分惊讶,所以,在去之前,我就做了一些基本的研究。
以下一些内容,是我在调研南街村时,关注到的一些我认为有意思的点:
百度百科,南街村
- 在南街村,村民完全依附于集体经济,如果不在集体内劳动,就丧失一切收入和福利待遇。为了体现建设“共产主义小社区”的优越性,南街村修起了城墙,将自己与其他村庄隔开。
南街村的村民完全依赖集体经济,这就要求这个村庄完全能够经济自给自足,这个是很高的要求,需要有一个独立的经济型。此外,他还把自己和其他村隔离起来,有点独立社区、国中之国的意味了。
南街村与其他村有一个巨大的区别,那就是他们以基于毛泽东思想的集体主义为理念,提出建设“共产主义小社会”的目标。毛泽东式的集体主义因80年代取消人民公社而失去了影响力。但是,南街村却把毛泽东的集体主义树为旗帜。已经富裕起来的南街村被称为“南街村现象”,并引起了全国的关注。 南街村“共产主义的要素”的核心是独特的平均主义的经济体制。村民们在村的行政机构及村营企业上班,根据工作内容,每月付给150元到200元的固定工资。 工资虽然很低,但是村民免费享受粮食、肉、油等配给。住宅、教育、医疗、办红白喜事也一概不收费。如果村民上大学,学费也由村里负担。村民享受的福利费用每年每人平均6700元。
百度百科,南街村
南街村的村民必须在村办企业当中才能享受福利,而享受福利之后,只能享受到 150 ~ 200 元的固定工资,在如今这个物欲横流的时代,感觉生活是比较难的。实际上一年的福利也并不多,仅有人均 6700 元(这里有个背景,南街村是村级单位,村民只能享受村一级的低保标准,按照漯河市 2023 年的标准,农村低保大概是 5280元/年)。考虑到一年的工资,实际上一年的收入不足万元。
这个钱对于我来说是无所谓的,但对于河南的农民来说,应该还是一个不错的选择,特别是村里本来其实干农业就不赚钱,经过这么一搞,至少还能享受一定的福利,至少比种地是划算的。
而对于南街村来说,这样的福利成本其实也还好。南街村如今有 1000 户,3000人,人均福利 6700 元,加上 2400 的工资,一年单人的成本是 9100 ,全村的福利 + 工资的成本大概是 27,300,000 ,2700 万,对于一些大型国企来说,并不困难。而分配的房产,属于集团的资产,不属于个人,无需单独计算。
在南街村游览时,导游在讲解时说的一句话,引起了我的注意:
在南街村,所有的生产资料都姓“公”
如果说,所有生产资料都姓公,那这个模式其实并不特殊,即使在改革开放以后,我国也有大量的生产资料都姓公的存在 —— 比如各种国企。而如果你把他理解为国企,那这个模式也就不存在所谓的推广可行性,实际上我国历史上有很多类似的尝试 —— 比如公私合营。
南街村唯一不同的,便是他提供了更多的福利。但这些福利如果我们回想八九十年代的国企,其实也是类似的:
南街村相比于以前的国企,只是分配了更多的资源给大家来满足生活的基础需求,而不是持续投产上,从而表现出了更加的“共产主义”,其实质还是一个国企罢了。
而南街村的模式,如果希望推广,其实只要让我们现在的国企把利润更多的放在福利上,其实就可以大面积推广,并没有什么特殊的。
这也是我困惑南街村模式的问题。在我看来,南街村模式有两个问题:
导游带着游览时,带我们逛了南街村的酱厂,推广南街村的酱料。同组的小朋友提了一个问题:“为什么我在外面看不到这个酱”
很显然,南街村的酱在全局来看,并不出名。而南街村的大部分产品,也都没有那么出名。这种不出名决定了他很难做出高利润的产品,产品的附加值相对较少,赚的是个辛苦钱,就很难长期的支持一个高福利社会(就像社保)。
这个问题是比较严重的,甚至可以影响上一个问题。南街村的福利并不多,对于人才来说,他的选择必然是出走,不享受村里的福利。这种选择机制,使得最终留在南街村的人相对偏平庸,长期很难保持增长。
这种情况下需要一个极具前瞻性和极具领导力的人来带领整个村子持续往前走,那么南街村的老党委书记王宏斌可能是这样的一个人,但他之后,谁来引领整个南街村继续向前?还是南街村终将迎来又一次国企改革,员工下岗?
南街村只不过是国企的一个福利加大版,并没有什么特别的。如果真的有什么特别的,大概就是南街村在当年的那个一穷二白的时代,能够提供给村民不错的分红,让村民享受更好的待遇。但南街村终究不是共产主义的答案,我们还是需要继续探索。
我们在投资过程中,会有不同的投资风格,有的人追求的是胜率优先,重点关注的是获胜的几率,则会选择一些长期更可能获胜的投资方式 — 比如购买指数基金。而也有一些人,追求的是赔率优先,通过扩大赔率,提升收益的上限,从而实现快速的获得收益。
对于我们绝大多数的普通人来说,应该选择“胜率优先”的模式,因为人生是无限的,虽然一方面我们感叹人生苦短,但另一方面,我们不得不要面对现代人平均寿命不断增长的事实。
在一个几十年的游戏当中,我们可以短暂的选择赔率优先,但终究来说,我们需要选择胜率优先的模式,以在一个近乎无限的游戏中生存下去。
Tha’s Why I Investment & Investment to Index Fund.
此说明书用于更好地和白宦成协作。
我个人关注的领域较多,但底层的核心逻辑是我关注的领域大多和个人的自我实现有关。
在此基础之上,可以细分为:
我会长时间关注上述领域,如果你和我沟通上述领域的内容,我会非常高兴和你详细聊一聊。
我的 MBTI 类型:INTJ
我的排名前10位的盖洛普优势才干为:理念、专注、行动、沟通、完美、搜集、积极、分析、关联、取悦。
我既可以与人沟通,也可以与自己沟通,且我大部分时间都与自己沟通。如果我们见面沟通,那么,我会希望你我可以有不一样的观点可以分享。
我很喜欢和别人聊一些不一样的体验。如果是第一次见面,不妨聊一聊最近看的书,最近去过的地方,我都很有兴趣听你分享你的故事。
对于细节问题,我会更倾向异步的沟通方式,你可以将问题的细节整理好,发送邮件给我,我在看到邮件后会和你具体的沟通。
对于宏观问题,我会更倾向同步的沟通方式,我们可以在这种同步的沟通方式中,探索出新的可能。
天津市
某条消息很久没有回你不一定是因为我不想回,很有可能是我没注意。现在看书比较多,所以看微信相对就会少一些。不妨再 Ping 我一次。
如果你看了上述信息,仍然认为有必要与我建立联系,达成沟通,那么你可以扫描下方二维码和我取得联系。
大部分中国人是没有信仰的。
你可能会问,中国人不是也去寺庙去拜佛,也到教堂去做礼拜。为什么说中国人没有信仰呢?
在维基百科中,对于信仰的定义是“人事物或概念的坚定信念或信任。”,但对于那些去寺庙拜佛、去教堂礼拜的人来说,他们可能并不坚定的认为这些“神”的存在的,他们关注的也不是自己对于“神”的信仰,而是关注神到底能为自己解决多少问题?
这也是为什么我们发现,财神庙总是香火最旺。
在对外开放 OpenAPI 的时候,错误的设计也是一个极为影响开发者开发体验的设计点。今天我们简单聊聊关于错误码和错误处理
由于我们不能保证系统可以完全处理用户的请求,因此我们需要通过错误码来告诉开发者发生了不符合预期的情况。不符合预期的情况可能由用户输入错误导致,也可能由内部微服务故障导致。为了建设一个健壮(Robust)的系统,我们需要通过对外暴露一批错误码,帮助开发者更好地处理各种异常情况。
既然我们的目的是帮助开发者解决异常情况,那么一个合理的答案是:和异常情况匹配的错误码数量是一个好的错误码数量。
如果在某个 API 接口上提供了一个错误码,则意味着我们认为这个接口只会出现一种情况导致的错误。而实际上,很可能会有多种情况导致错误发生。这种情况经常在 OpenAPI 评审过程中被提出来,也是用户在使用 OpenAPI 时常遇到的问题:为什么我找不到这个错误码?对于开发者来说,无论输入何种错误,都会得到相同的错误码,难以定位和解决问题。同一个错误码也意味着你无法提供足够的错误信息来进行排查。例如,常见的 “400 Bad Request” 错误,如果参数很多,排查错误可能是一个极其痛苦的过程。
另一方面,错误码数量过多也会导致问题。有些 OpenAPI 接口提供了几十个不同的错误码,看起来感觉很不错。但是仔细一看,就会发现这些错误码实际上只是针对不同的字段错误而已,导致错误码数量快速增长。而实际上,可以将参数错误放在同一个错误码中,并通过动态的参数和原因来解决,而不是返回一堆类似的错误码。大量的错误码对于开发者来说,存在记忆困难的问题,在实际编写代码的过程中,也需要编写大量的错误处理逻辑,来兼容我们对外抛出的错误处理逻辑。
如果你无法很好的掌握拆分和组织错误码的粒度,那我可以给你一个建议:按照用户处理错误的手段来拆分错误码。过去从内部视角来组织和错误码,很容易出现错误码过多或过少的情况,而从外部视角来梳理错误码,则可以帮助我们更好的厘清错误码的分类和组织。
用户并不关注我们的系统到底因为什么出现了错误,他们只关心出现了什么样的错误?我应该如何处理这些错误?那错误码可以非常快速的收敛为以下几类:
通过上述的分类方式,我们可以快速的将错误码归类到几个大的分类,从而实现合并同类项,收敛错误码但不至于让开发者不知道下一步 Action 的情况。
看到这里,相信你对于文章中提出的什么才是好的错误码设计已经有了答案。但我想说的是,错误码从来都不是核心。实际上,如果我们回看各种编程语言的范式,大多没有错误码这种设计,而是选择将更多的信息通过 exception 这样的形式暴露给开发者。错误码的设计虽然给到开发者一个可以用来做唯一判定的数据,但可以做唯一判定的不一定非要是数字。数字错误码的设计严格来说,并不是一个好的设计,因为他使得你的代码中必然会存在某些特定的 Magic Number,你需要小心的维护这些 Magic Number 来确保向开发者返回错误时不至于返回错误的错误类型和错误码。
对于一个已经存在的 OpenAPI 系统来说,错误码已经成为既定事实,则要做的是让这套系统可以更好的运转下来。但如果你要设计一套全新的错误系统,那么类似 Slack 这样的返回形式,可能是一个更好的选择,既可以规避掉 Magic Number 的问题,又可以确保每一个错误有其对应唯一的枚举值。
好的错误码设计是适度的,你需要学会平衡错误码和对应错误信息的数量,不要太多干扰开发者,但也不可太少,不足以支撑实际的接口调用。好的错误码可以帮助我们和开发者建设更加健壮的系统,减少不必要的沟通成本,也可以让我们每一个使用这个 API 的人,都更加的幸福。
最近在写 LCTT 译文的解析工具,写正则、调试正则的过程非常的痛苦。
比如,下面的这个正则表达式就是我用来提取文章的英文标题的正则。由于 LCTT 的文章元信息存储历史上出现过多次,所以我不得不写一个比较复杂的正则来匹配出想要的结果。
比如,下面的这段代码是我用来从文件路径当中提取出不同内容的正则,看起来十分复杂,对吧?
/(?<collectDate>(?<type>(?<path>\.\/)(?:published))\/(?<yearOrSeries>(?:.+)?)\/(?<month>(?<=\d+)\.(?=\d+))?)(?:⭐️|⭐️⭐️)?(?<title>.+)\.md/
相比于看起来复杂,更加麻烦的是可维护性。正则表达式的可维护性相比于正常我们熟悉的编程语言来说,是差了一大截。基本上如果要对上述这段正则表达式进行修改或者二次开发,难度极高。但借助一些工具,我们可以使用类似 DSL 的方式来管理正则表达式,则可以以一个更友好的方式来维护你的正则表达式。
比如,以我为例,上面这张图片中的定义,便是上方正则的等价替换。虽然写了更多的代码,但确实可读性、易于理解性和易于维护性,有了显著的提升。
想要使用,也不复杂,只需要使用对应的 DSL 语法来完成定义,即可完成正则表达式的构建。以我上面的这段正则为例,我使用的是 javascript 的 magic-regexp
包,实际使用时,大概是这样的,定义出对应的正则,直接基于其进行匹配即可。
const magicRegxp = require('magic-regexp');
const { createRegExp, exactly, oneOrMore, char, anyOf, carriageReturn, global, multiline, linefeed, maybe, digit } = magicRegxp;
const regExp = createRegExp(
exactly("./").groupedAs("path")
.and(anyOf("published")).groupedAs("type")
.and(exactly("/"))
.and(maybe(oneOrMore(char)).groupedAs("yearOrSeries"))
.and(exactly("/"))
.and(maybe(
exactly(".").after(oneOrMore(digit)).before(oneOrMore(digit)).groupedAs("month")
)).as("collectDate")
.and(maybe(
exactly("⭐️").or(exactly("⭐️⭐️"))
))
.and(exactly(oneOrMore(char)).groupedAs("title"))
.and(exactly(".md")
));
let result = regExp.exec(file_content);
console.log(result.groups.title);
Code language: JavaScript (javascript)
当然,这样的维护方式,在不同的语言下有着类似的实现,如果你使用 Golang ,那么 Rex,也是一个不错的选择。
这个工具是我在研究别人的的 Notion 工作流时发现的,一个支持从网页中提取核心数据的 Notion Saver 插件 —— Save To Notion(官网)
和绝大多数 Notion Saver 类似,Save To Notion 也支持直接存储一个书签到 Notion 当中,对于平时需要大量阅读的人来说,这是一个和其他产品无法形成差异化的 Feature。
但 Save To Notion 一个非常厉害的功能,是你可以在你的保存表单中,设置从网页中提取数据,它应该是采用了 XPath 来实现这个 Feature,你可以根据自己的需求,从页面中选择数据来提取,从而可以基于 Notion 完全实现一套自己的数据库。相比于其他 Saver,多了一步解析数据的能力,而这个能力,可以帮助你节约许多的时间。
Just Use IT!
我的美股持仓里有两支股票,MSFT 和 AAPL,应该说是互联网人常买的了。而正是这两支股票,让我真正理解了买好资产和好价格。
从资产的视角来看,这两家企业都是值得购买的,至少 5 年内,微软不会崩盘(Windows/Office 的实力你一无所知),苹果得益于其订阅生态,也不是那么容易被干掉的公司。因此,至少在我的认知内,他们都还算是好公司。
而好价格,在我购买的这两家公司的过程中,则体现出了不同的风格。这两支股票我都几乎购买在了顶点。苹果的平均持仓价格为 $156,而微软的平均持仓价格则是 295 美元。
从 K 线图上可以看到,我几乎是都买在了山顶,但因为实际购买的时机来看,距离山顶的距离又有所差异,苹果是左侧购买,而 MSFT 则是右侧购买。
我购买的价格平心而论,都不算是特别好的价格,MSFT 的52周最高价格是 312 美元,距离我的价格只有 10 美元左右的空间,可以预测到,这一笔投资我大概率没有什么收益。AAPL 类似,52 周最高价格为 177 美元,稍微好点有大概 20 美元的空间,盈利的机会相比于 MSFT 都要更高一点,但相对也有限。
好在是美股当中投的钱本来对我来说,也属于闲钱,不太依赖他求生,所以这笔钱大概率我可以等到它回本以后卖出,甚至是重新涨回到高点卖出,我的实际损失可能不多。
但这两笔投资还是值得复盘:
如何选择一个好的价格?这个就需要我们心中对其有个定价。之前我关注的主要是愿景,但确实没有仔细算过这个到底是不是一个值得购买的价格,从而导致这两笔不成功的投资。
如果基于现在我的认知,再买股票我应该做的:
听《无人知晓》和《知行小酒馆》给我带来的反思还是挺多的。至于关于「好资产和好价格」,我推荐你看看有知有行的投资第一课,在第 9 课中的:好公司等于好股票,就提出过类似的话题。