月度归档:2020年11月

《原则》

关于《原则》,我在一篇文章中介绍过一些相关内容,比如作者的背景和作者公司的背景。可以在这里查看:

读完这本书之后,我的收获有三点:

  1. 寻找、思考、整理自己的“原则”;
  2. 思考“五步原则”,并且联想到生活,技术(比如分治 divide-and-conquer);
  3. 瑞达利欧的 30 分钟经济学视频 – 简洁生动地介绍了经济机器是如何运转。

这是一本我极力推荐的书,因为读过这本书后我对生活和职场都进行了很多方面的重新思考。另外,还可以关注“瑞达利欧”公众号,每天会推送一个书中的“每日原则”,不停地对书中的信息回顾。

Doxygen – 治好了我的代码注释强迫症

在编写大量代码时,或者与多人协作进行开发时,文字记录很重要(文档或注释),尤其对于开发者本人回顾之前写过的代码和 code reviewer 查看。目前,代码中的注释进是程序员们最经常使用的记录方法。但是,由于每个人的注释风格不同,有些开发者甚至对API并不进行任何注释描述,导致很多影响生产效率的问题,也增加了软件维护的成本。很多人对于怎样写注释也会困惑和反感。因此,使用一些代码文档工可以帮助这个开发流程高效、规范地进行。

使用这种工具我个人认为最大的帮助是可以节省时间,并提高生产力

  • 不用去构思如何去写注释,用哪一种风格去写,从而专注于构思代码。
  • 减少看其他人代码的时间成本。

Doxygen 就是这样一种编写软件参考文档的工具。该文档是直接以注释的形式写在代码中的,因此比较容易修改和查看。而且对于代码里的注释,Doxygen还可以为C++项目生成html,Latex和PDF的文档。

虽然使用过Doxygen的开发者可能并不会经常阅读由Doxygen生成的那些文档,而是更加倾向于阅读源代码里的注释。但是并不妨碍Doxygen成为一款很受欢迎而且高效的代码注释工具,至少我个人很喜欢Doxygen对于注释的种种规范。

关于如何使用Dxygen的适用方法,可以参照官方的教程,不会有比这个更加权威并且详细的说明了:https://www.doxygen.nl/manual/index.html

在之前分享过的C/C++ Coding Style(https://zhuanlan.zhihu.com/p/267645803)中,我介绍了使用Doxygen进行代码注释的一些风格,在这里详细介绍一些我经常使用的Doxygen属性。

一个例子

例如一个头文件中:

/*****************************************************************************
 * Portfolio Info
 ****************************************************************************/

/**
 * @file doxygen.h
 * @brief File containing example of doxygen usage for quick reference.
 *
 * Here typically goes a more extensive explanation of what the header
 * defines. Doxygens tags are words preceeded by either a backslash @\\
 * or by an at symbol @@.
 *
 * @author Chris Wu
 * @date 24 Oct 2019
 * @see <http://www.doxygen.nl/manual/index.html>
 */

/** @addtogroup DOXYGEN_API
 * @brief Doxygen api example.
 *
 * Detailed api description.
 *
 * @{
 */

#ifndef _TEMP_DOXYGEN_H
#define _TEMP_DOXYGEN_H

#ifdef __cplusplus
extern "C" {
#endif

/* INCLUDE FILES */
#include <stdint.h>
//#include <system_header2.h>

//#include "local_header1.h"
//#include "local_header2.h"

/* GLOBAL DEFINES */
/**
 * @brief Use brief, otherwise the index won't have a brief explanation.
 *
 * Detailed explanation.
 */
typedef enum eEnumMode
{
    ENUM_FIRST,  /**< Some documentation for first. */
    BOXENUM_SECOND, /**< Some documentation for second. */
    BOXENUM_ETC     /**< Etc. */
} tEnumMode;

/**
 * @brief Use brief, otherwise the index won't have a brief explanation.
 *
 * Detailed explanation.
 */
typedef struct BoxStruct
{
    int a;    /**< Some documentation for the member BoxStruct#a. */
    int b;    /**< Some documentation for the member BoxStruct#b. */
    double c; /**< Etc. */
} tBoxStruct;

/* GLOBAL VARIABLES */
extern int giValue;

/* GLOBAL FUNCTIONS */
/**
 * @brief Example showing how to document a function with Doxygen.
 *
 * Description of what the function does. This part may refer to the parameters
 * of the function, like @p param1 or @p param2. A word of code can also be
 * inserted like @c this which is equivalent to <tt>this</tt> and can be useful
 * to say that the function returns a @c void or an @c int. If you want to have
 * more than one word in typewriter font, then just use @<tt@>.
 * We can also include text verbatim,
 * when the language is not the one used in the current source file (but
 * <b>be careful</b> as this may be supported only by recent versions
 * of Doxygen). By the way, <b>this is how you write bold text</b> or,
 * if it is just one word, then you can just do @b this.
 *
 * @param [in] param1 Description of the first parameter of the function.
 * @param [out] param2 The second one, which follows @p param1, and represents output.
 *
 * @return Describe what the function returns.
 * @retval XXX_OK if successful.
 *
 * @see doxygen_theSecondFunction
 * @see Box_The_Last_One
 * @see <http://website/>
 * @note Something to note.
 * @warning Warning.
 */
int doxygen_theFirstFunction(int param1, int param2);

/**
 * @brief A simple stub function to show how links do work.
 *
 * Links are generated automatically for webpages (like <http://www.google.com>)
 * and for structures, like sBoxStruct. For typedef-ed types use
 * #tBoxStruct.
 * For functions, automatic links are generated when the parenthesis () follow
 * the name of the function, like doxygen_theFirstFunction().
 * Alternatively, you can use #doxygen_theFirstFunction.
 * @return @c NULL is always returned.
 */
void doxygen_theSecondFunction(void);

#ifdef __cplusplus
}
#endif

#endif /* _TEMP_DOXYGEN_H */
/** @}*/

版权声明注释

/*****************************************************************************
 * Portfolio Info
 ****************************************************************************/

我会把项目的版权声明信息放在这。

文件描述注释

/**
 * @file header.h
 * @brief Brief file introduction.
 *
 * Detailed file introduction.
 *
 * @author Name
 * @date day month year
 * @see Related link.
 */

在这里列出这个文件的名字,和一些基本信息:

  • @file: 文件名
  • @brief:文件一句话介绍
  • @author:文件作者
  • @date:修改日期
  • @see:额外的一些参考信息,比如有用过的链接

API Group

/** @addtogroup DOXYGEN_API
 * @brief Doxygen api example.
 *
 * Detailed api description.
 *
 * @{
 */
  • API codes…
/** @}*/

这两段代码搭配使用,一前一后,中间包含API代码。这部分定义了这个文件的API group,可以在Doxygen生成的文件中查看到其中包含的所有API group(比如变量,类,函数)信息。

变量前的注释

/**
 * @brief Use brief, otherwise the index won't have a brief explanation.
 *
 * Detailed explanation.
 */
typedef struct BoxStruct
{
    int a;    /**< Some documentation for the member BoxStruct#a. */
    int b;    /**< Some documentation for the member BoxStruct#b. */
    double c; /**< Etc. */
} tBoxStruct;

对于一些需要说明的变量,可以在变量前加上一段Doxygen注释,方便度代码的人查看,也可以声称在比如HTML等文档中。

API 函数注释

/* GLOBAL FUNCTIONS */
/**
 * @brief Example showing how to document a function with Doxygen.
 *
 * Description of what the function does. This part may refer to the parameters
 * of the function, like @p param1 or @p param2. A word of code can also be
 * inserted like @c this which is equivalent to <tt>this</tt> and can be useful
 * to say that the function returns a @c void or an @c int. If you want to have
 * more than one word in typewriter font, then just use @<tt@>.
 * We can also include text verbatim,
 * when the language is not the one used in the current source file (but
 * <b>be careful</b> as this may be supported only by recent versions
 * of Doxygen). By the way, <b>this is how you write bold text</b> or,
 * if it is just one word, then you can just do @b this.
 *
 * @param [in] param1 Description of the first parameter of the function.
 * @param [out] param2 The second one, which follows @p param1, and represents output.
 *
 * @return Describe what the function returns.
 * @retval XXX_OK if successful.
 *
 * @see doxygen_theSecondFunction
 * @see Box_The_Last_One
 * @see <http://website/>
 * @note Something to note.
 * @warning Warning.
 */
int doxygen_theFirstFunction(int param1, int param2);

对于所有头文件的函数,都需要进行函数注释。

  • @param:标记变量 [in] [out]表示输入输出方向
  • @return:返回值描述
  • @retval:具体返回值及其含义
  • @see:link信息
  • @note:备注信息
  • @warning:需要函数使用者注意的信息,比如:功能未经完全验证

总结

我对自己的要求是,对于 public 头文件中的所有信息,都应该进行详细的注释,方便使用者查看。而在代码源文件中可以不详细注释,自己可以理解。但是也需要按照Doxygen的格式列出基本信息方便回顾代码的时候提醒自己,让自己了解自己当时在想些什么,为什么要这么做。

对于一个开发团队,尤其是大公司,都会有严格规定的标准,包括代码风格,各种git hook,还有类似Doxygen这种文档工具。有些工程师会觉得这些“标准”很繁琐,很难要求自己遵守。但是不可否认的是,各种代码标准的目的不是以折磨程序员为乐趣,而是为了提高程序员的生产力,提高代码的可读性,可维护性,可靠性。

但是有时候,为了追求标准化而去不断强调“标准”这个概念,甚至花费大量的时间精力去专注在“标准”们上也是很荒唐的。所以无论我们使用哪些“标准”,参考各大开发团队的标准,形成一套适合自己团队的开发规范即可,内容永远大于形式。

这不是一篇Doxygen的使用教学,而是想推荐类似Doxygen这种代码文档注释管理工具,对于如何使用Doxygen,强烈建议参考官方教程:

Doxygen Manual: Overview​www.doxygen.nl

因为Doxygen对我和我们团队的开发提供了很大的帮助,因此推荐,祝开发愉快:D

《动物庄园》

What It’s About

这本书讲述了一群很像人类的动物社会,它们模仿人类从事生产,意图摆脱人类的奴役统治社会,最后却还是走上了相同的道路。

雪球和拿破仑代表了两种截然不同的统治者形象。雪球是一个理想主义者,而拿破仑则是一个十足的恶棍。雪球的被驱逐证明,智慧在绝对的权利和武力面前的力量有限,尤其是缺少足够的“同志”们。而从拿破仑身上我们可以看到很多不同的形象,有剥削劳动人民的资本家的身影,有绝对权力中心的中央集权形象,也有民族沙文主义,社会达尔文主义的种种映射。

How I Discovered It

从某部电影里面的一个“雪球”的名字,知道了这个角色的来源,即《动物庄园》。

Thoughts

这本书内容不多,却历经几十年的时间仍不过时。有趣的是,很多内容让无论是支持资本主义或者支持社会主义的人都很不爽。不得不说作者洞悉了社会的本质,并且能够用很简单的语言把这种复杂的概念表述清楚。即使英文原版读起来也没有什么难度,推荐最为英文作品的入门读物。

“有人的地方就有江湖。”有人的地方也会慢慢形成社会,由于社会资源的极度倾斜,导致革命的爆发,资源的重新分配。经过一段时间,资源的天平再次发生倾斜。因此,历史反复循环。

很多人说,我们生在一个幸福的时代,因为历史上很难经历100年的和平时代。事实确实如此,伴随着最近的新冠疫情,全球关系发生着巨大的变化。中美关系愈发紧张,西方资本主义社会在竭尽全力“去中国化”,我们国家也更加紧迫地需要面对南海问题,香港问题,新疆问题,印度问题等等。

可以说现在的世界并不是完全和平的世界,我们可能正处在一个敏感且很可能会被载入史册的一段时期。在这段时间里,我们能够做的有限,试着去了解社会学的一些知识,或者阅读几本书也许会缓解一部分的焦虑吧。

Who Would Like It?

这是一本适用范围很广的书,小孩子,学生,初入社会的打工人,社会关系研究者等等都可能发现吸引他们的地方。

为“真实”而生活

最近,“内卷”一词变得异常火热。人们为了某一个目标而彼此竞争,就像是囚徒困境,导致竞争的成本越来越高,所有人都渐渐不堪重负。还记得小时候,经济、科技都远没有现在发达,但是总还是会机会或者说意愿静静思考,或者和左邻右舍聊天,或者在楼下院子里静静呆上一下午。但是现在的环境下,娱乐和偷懒好像都会带给人很多负罪感。尤其是在我们国家,努力一直是一种积极的主流价值观,这种价值观帮助我们一代又一代人读过重重难关,也为我们的国家在战后迅速崛起提供了重要的力量。

但是,不知道我们在“努力”的时候是否思考过,我们为了什么而“努力”呢?为了挣更多的钱?为了学习更多的知识?为了别人的肯定?还是为了努力,而努力?我们真正的需求是什么呢?这是一个有趣的问题。

学如逆水行舟不进则退,大环境的推动使得我们每个人不得不向前走。在工作中,我会努力做好每一个任务,也因此收获了很多“Good job”,“Well done”之类的评价。但这就证明我真的做的比较优秀,或者说这就是我内心真正需要的吗?我的结论是,并不是的。犯错误少是因为我在舒适区待得太久,缺乏创新,故步自封。你看,人性就是如此可笑,当收获了很多积极正面的肯定之后,还是在想着如何能更“努力”,更“优秀”。我们已经“卷”到了骨子里。

所以我是在为了自己“真实”的需求而努力?还是为了外部环境的影响或者他人的评价而“努力”?我也许需要先定义什么是“真实”。

高中时期我的班主任有一句话影响我很深:“认真能把事情做对,用心才能把事情做好”。当其他同学觉得这是一句普通的鸡汤文的时候,我很严肃地看待了这句话,牢记至今,并且在做很多的事情时会以此自省。所以我觉得把事情都做对并不是一个值得骄傲的成绩,而是一种正常且普通的标准。如何能让更多的人为你的行为感到意外和骄傲,并忍不住竖起大拇指,才是一种更高的标准和追求。

这就是我所定义的工作中的“真实”。当我做一项工作或者设计一款产品的时候,我是不是满怀期待投入其中?这个产品会不会对它的用户产生实际帮助、体验愉悦?世界会不会因为它得存在变得更好一点点?

相似地,在学习过程中,如果没有考试或者老师的要求,我还会去学习这门知识吗?如果不为了挣钱找工作,我还想要去自学哪些知识?如果有再一次求学的机会,我会选择哪个专业,学习哪些知识呢?我看这些书是为了显示自己比别人“厉害”,还是真的从这些内容中窥探到了一丝人生意义的光芒,积少成多构成了更大的希望?

对于金钱,很多人也会把它和财富混为一谈。我们更为感兴趣的一定不是钱这堆纸,而是它能够带给我们的种种好处。可以是好的居住体验,可以是子女好的教育条件,可以是高的社会地位、别人的认可。在我看来,所有的外在因素都是发现“真实”的阻碍。别人的“高看一眼”除了满足虚荣心,对我而言并不会有真正实际的帮助。它不会是我变得更智慧,也不会让我活得更洒脱,反而会让我陷入其中,沦为它众多工具中的一个。

也许当年的达官显贵十分轻视陶渊明这样的人,而陶渊明自然也不屑“为五斗米折腰”。社会需要“达官显贵”们,需要有野心有能力的人领导推动社会的发展。也需要有一些“陶渊明”们,保持着一些浪漫与理想主义,晨兴理荒秽,带月荷锄归。然而,社会需要更多的“工具人”们,充当两者间的调和剂,让社会关系不至于失去平衡,发生动乱。

我猜这种结构大概会类似正太分布,像是一盘散沙经过各种选择与竞争,最终到达了各自的位置。两端的少部分沙子都不会觉得痛苦,有资源的享受资源,没资源的穷开心。而中间大部分的“工具”沙子则承担了更多的压力。默默无闻的“工具”出售劳动时间提供生产力,有野心的“工具”则幻想着有朝一日能爬到沙堆的那一端,享受充足的资源,并为此而不停地“努力”。

不以物喜,不以己悲,真的是一种高级的人生态度,自然、豁达、又充满坚定。我能做的也许就是寻找自己的“真实”。为“真实”而生活,也许可以帮我剩下大把时间,也许会减少我的一些欲望,或许也会帮助我减少一份痛苦而多发现一份生活的精彩。也许我还没有达到终点,捧得奖杯,也许永远不会。但是我愿一直在路上,保持前进与希望。

后记

本来想写一篇文章客观提供一些方法论识别“真实”和“不真实”,连提纲都已经列好。但没想到最后还是变成了一篇夹杂个人情感的杂文,也许这样可以说出一些真正想要表达的内容。最后提供一篇文章,供真正需要找到“真实”的方法论的朋友参考:

https://medium.com/personal-growth/7-things-you-should-do-if-you-want-to-find-your-passion-af9e96a795cc

为什么要学外语?

我并不是语言学的学者,只是从我在学习和使用语言的经验中想到这些。对我而言,学习和了解一门语言除了功能性的需求,比如考试、工作,更是一件很有趣的事情。像下面引用的维特根斯坦的话,也可以理解为,学习英语或任何一种一种语言都是一种可以拓宽我们的思维边界的方式

The limits of my language mean the limits of my world.

Ludwig Wittgenstein

举个例子,英语里面的谓语动词是有单复数的。I have a pen, and he has a pen.

而汉语里面是没有单复数的区别的。我有一支笔,他也有一支笔。

有一些国家的语言甚至,你、我、他(她),后面所接的谓语动词都需要是不同的形式。这种语法会不会造成我们的思维区别呢?这些会不会和西方文明中更为强调个体概念,而我们中国更推崇集体文化有关呢?在西方生活过的人会有这种感觉,每个人都特别注重自己的隐私,朋友之间的边界也很明显。能够很直接地感受到,你是你我是我,我不会干预你的生活,也请你对我的生活保持界限感。

而我们汉语明显没有这种区别的概念,你买了房子,我也买了房子,他同样也买了房子。是不是我们潜意识里或许觉得大家都没什么不同,你能干的事我也能干。所以很多人,包括我,总喜欢给周围的朋友出主意。你最好这样这样,那样那样。因为我觉得和朋友不应该有特别明显的边界,或者说,不想把你当成外人。所以,语言和意识形态的形成是否有什么关联呢?只是提出一种可能性,在这里不展开讨论。

有一种说法是,我们人类是不能理解用语言描述不了的的东西的。和维特根斯坦所说的语言是思维的边界相似。比如Pirahã语言没有数字的概念,所以巴西政府想教他们数数,教到2就不行了。我们并不能说所有的Pirahã人的智商都很糟糕,而是有时候我们会不知道如何去理解那些我们不知道或者无法描述的事情。

所以语言是会影响人的思维的。我们去学习一门语言或者说多去了解一些语言,可以帮助我理解使用这种语言的人是如何思考的,也提供给了我们一把接触新的思维方式的钥匙。比方说,我发现英语很注重时间的概念,动词有不同时态的表达(进行时,过去时,完成时)。因此,在早期说英语的时候我会很注意“时态”这个概念。

  • I go to somewhere today.
  • I went to some where the other day.
  • I will go somewhere tomorrow.
  • I have been here before.
  • I would have been here if there was no rain.

在说话的时候时刻注意这种时态的区别相信对每个国人来说都是 a pain in the ass。我在这句话中用了一句英文俗语表达出了我的一些情绪,而这种感觉只有懂英语的人才能理解。直接翻译成“屁股疼”可能很多人只会觉得我有毛病。

所以对于双语者或者多语者,他们需要频繁地在不同的思维模式下切换,这样或许会促进他们思维能力的锻炼,并且往往能够更加积极地思考问题。

而这就是我学习(好)英语的动力来源。

浅谈HAL设计(3)- 回调函数

在设计HAL,或者把代码结构分层的时候我们不可避免会遇到这种情况,一般函数调用顺序总是高级别函数调用低级别函数,比如HAL调用dirver层,或者app调用middleware。但是总有一些情况需要我们在较低级别的函数中调用较高级别的函数,这时候回调函数(callback)就十分有用了。

什么是回调

举一个例子,老板让张三去参加一个培训,培训时间要1000秒:

void start_training(char* name)
{
    delay(1000);
}

老板还想要让张三去给自己买一杯咖啡,时间需要100秒

void buy_coffee(char* name)
{
    delay(100)
}

老板同时执行了两个并行的任务线程:

execute_task_1()
{
    start_training("ZhangSan")
}
execute_task_2()
{
    buy_cooffee("ZhangSan")
}

张三不能去买咖啡,因为他还在参加培训。于是,老板只能一遍一遍发这个命令,或者等到张三结束培训之后再告诉张三。老板很恼火,觉得自己浪费了很多时间。

张三建议老板使用“回调”:

typedef void(*boss_cb)(char* name);
void start_training(char* name, boss_cb callback)
{
    delay(1000);
    callback(name);
}
void buy_coffee(char* name)
{
    delay(100)
}

于是老板只需要一条指令:

execute_task_1()
{
    start_training("ZhangSan", buy_coffee)
}

张三在培训完会直接去执行买咖啡的指令,老板不用一直等着或者反复催促,节省了老板很多时间,老板很满意,给张三加了薪。

张三在培训时候使用的就是回调函数,他不需要知道回调函数的具体内容,只提供这个接口。具体的内容由老板实现,老板让干什么就干什么,可以培训完去买咖啡,可以培训完去开车,也可以培训完去参加会议。

所以,回调函数是对某段代码的引用,该代码作为参数传递给其他代码,该代码允许较低级别的软件层调用较高级别的层中定义的函数[1]。在软件设计中,回调这种机制允许dirver这种较低层代码中设计某种接口,然后将具体如何实现这个接口功能留给上层的应用程序层。C语言中可以通过传递函数指针实现。

最简单的回调函数只是作为参数传递给另一个函数的函数指针。 在大多数情况下,回调包含三部分:

  • 回调函数
  • 注册回调函数
  • 执行回调函数

下图显示了这三个部分在回调实现中是如何工作的[2]:

一个简单的例子

在这个例子中有三个文件:

  • callback.c
  • reg_callback.h
  • reg_callback.c
/* callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* callback function definition goes here */
void my_callback(void)
{
    printf("inside my_callback\n");
}
int main(void)
{
    /* initialize function pointer to
    my_callback */
    callback ptr_my_callback=my_callback;                           
    printf("This is a program demonstrating function callback\n");
    /* register our callback function */
    register_callback(ptr_my_callback);                             
    printf("back inside main program\n");
    return 0;
}
/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);
/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
    printf("inside register_callback\n");
    /* calling our callback function my_callback */
    (*ptr_reg_callback)();                                  
}

编译运行后可以得到输出:

This is a program demonstrating function callback
inside register_callback
inside my_callback
back inside main program

正如图片里所展示的关系,较高层的函数将较低层的函数作为普通调用来调用,并且回调机制允许较低层的函数通过指向回调函数的指针来调用较高层的函数。使用回调函数,相当于把两个异步的任务关联了起来。

所以,在C语言中回调函数只不过是将函数指针传递到需要调用回调函数的代码,使用这种方法,我们可以实现一些比如,错误处理,退出前清理内存等很有实用性的功能。

Reference

[1] https://en.wikipedia.org/wiki/Callback_%28computer_programming%29

[2] https://www.beningo.com/embedded-basics-callback-functions/

《你当像鸟飞往你的山》

我最初看到这本书的中文标题会觉得有些不知所云,不确定这本书到底教书了怎样的内容。但是看到这本书的英文标题《Educated》,我明白这可能是一个讲述和教育有关的故事。但如果中文直接翻译为《教育改变人生》或者《教育的力量》,读过本书的读者可能会觉得并不恰当。因为这本书其实并不是一本励志鸡汤文学,鼓励人们去努力学习然后考入名校,而是投射了作者的很多情感、挣扎与思考。

根据这本书的出品方,当时他们对于如何翻译这本书的标题很是纠结,既想要表达出作者的原意,也要结合中文的语境。作者甚至为中文标题给出了另一个书名 “Tings Gained and Tings Lost”。而你当像鸟飞往你的山(Flee as a bird to your mountain)。出自《圣经·诗篇》,这句话本身有双重解释,一种是“逃离”,一种是“找到新的信仰”。所以,“你当像鸟飞往你的山” 好像确实更加符合这本书的原意,而最终作者也指定其为简体中文版的书名,拒绝了比如《教育之名》的其他出品方的书名推荐。 值得一提的是,作者十分推崇《圣经》,并且她评价其为 “As a work of literature the Bible has everything”. 在这本书中也出现了很多与《圣经》有关的内容。

这是一个关于中文译名的由来的小插曲,却解释了我,一个不十分熟悉圣经内容的中国读者,第一时间看到中文书名后的一些疑惑。

这本书是关于教育的,却又不仅仅是讲述求学求知的过程。在求知的路上,我们注定会得到一些东西,也注定会失去一些。每个人的成长之路都会伴随着怀疑、迷茫、但也有珍贵的坚定与感动。不可否认原生家庭的影响对于一个孩子的影响是十分巨大的,不管是在中国还是在作者所在的美国。与作者所处情况不同的是,即便是在我国出生于垃圾处理厂的儿童,也是有很大机会接受九年义务教育的。而教育会带给我们哪些改变呢?很多人所疑惑,教育有什么“用”呢?

在阅读这本书的过程中,我很容易带入进自己。虽然有着和作者完全不同的人生经历,但是对于作者的很多遭遇,处境都能感同身受,仿佛想起了许多年前同样时常感到困惑无助的小小的自己。不得不说,作者的坚定让人尊敬,于是她在一条大河中独自流淌出一条自己的路,而终点就是浩瀚的知识大海。

对于教育很多人都有着自己的理解,对于教育,作者是这样理解的:

教育意味着获得不同的视角,理解不同的人、经历和历史。接受教育,但不要让你的教育僵化成傲慢。教育应该是你思想的拓展,同理心的深化,视野的开阔。它不应该使你的偏见变得更顽固。如果人们受过教育,他们应该变得不那么确定,而不是更确定。他们应该多听,少说。他们应该对差异满怀激情,热爱那些不同于他们的想法。

——塔拉·韦斯特弗,《福布斯杂志》访谈

知识或者教育这件事情是很容易让人上瘾的,一旦你尝到了它的甜头,它就会引诱你一步一步陷入其中。在我看来这就是知识的魅力,在攀登求知高峰的过程中我们会愈发感受到自己的无知,攀上这一座,又看到下一座。

我们或许可以在读这本书的过程中感受教育的力量,感受作者的复杂情感,或许也会想起自己当时为什么被知识吸引,而如今又身在在何方。

消费主义:买买买会让我们更幸福吗?

消费主义:买买买会让我们更幸福吗?

“Consumption is the sole end and purpose of all production。” – Adam Smith

消费”或者“买买买”这些词会让人有一种复杂的感受,既兴奋又有压力。而 consumption 这个英文单词最初源自拉丁语“consumere”,并在12世纪首先出现在法语中,然后又在英语中流行,后来又在其他欧洲语言中流行。 这个词最初意味着用光食物,蜡烛和其他的资源。拉丁语中有一个很类似的词 consummare 含义更为复杂。例如,在基督在十字架上的最后遗言中:“ Consummatum est”,意思是“完成了”。所以,Consumption 这个词被用来表述用光,消耗和完成。而与消费这个词密切相关的就是消费主义,一种饱受争议,让人们又爱又恨的意识形态。

消费主义是一种观察和理解经济和社会的方式。个人消费者对商品和服务的消费有助于驱动消费主义社会的经济引擎,因为它为工人创造了就业机会,也为企业创造了财富。尽管消费主义作为一种意识形态可以出现在几种不同类型的经济体系中,但它通常与资本主义有关。但是随着近年来中国经济的不断提升,各种西方的意识形态对中国年轻人的影响,消费主义这个概念也开始在国内的年轻人中流行起来,尤其是一线大城市的年轻男女中。最近很热闹的上海“名媛群”就是一个很好的例子。

尽管跨不同文明和时期的人们一直在购买和消费商品,但追溯消费主义这个概念真正被提出是在1600年代后期的欧洲。随后在1700年代和1800年代,这种观念愈演愈烈,使得对产品的消费已成为社会上大多数人必不可缺少的“日常任务”,也让消费主义成为了一种普遍而主要的社会现象。如上所述,消费主义通常与资本主义的经济体系有关。因此,消费主义作为一种意识形态与资本主义一起出现,并随着资本主义成为地球上占主导地位的经济体系而遍及欧洲,北美和世界其他地区。在消费主义发展的早期,两个重要的历史事件开始发挥重要作用:帝国主义时代(Age of Imperialism)和工业革命

帝国主义时代

在15至18世纪的“地理大发现(Age of Exploration)”期间,欧洲探险家“发现”了许多以前未知的土地,例如:美洲,非洲,澳大利亚以及远东的亚洲部分地区。当时欧洲主要国家的这种探索最终导致了新探索地区的广泛殖民主义。欧洲国家(尤其是英国,法国,西班牙和葡萄牙)在这些地区建立了殖民地,这个时代被称为帝国主义时代。

这一过程为欧洲国家提供了来自世界各地的大量原材料,并以多种方式帮助提高了消费主义的扩张速度。首先,原材料为欧洲的工业工厂提供原料,并被用来制造无数的消费品,然后这些消费品分布到世界各地。然后,广阔的殖民地使欧洲国家得以进入世界各地的庞大市场。例如,几个欧洲国家在许多殖民地建立了糖或烟草种植园。然后,这些糖和烟草种植园生产了糖和烟草(通常与大西洋奴隶贸易的奴隶一起)运回欧洲,在那里这些资源将被用于生产其他产品。而这些产品随后在欧洲国家控制的许多殖民地以及欧洲本地销售。

工业革命

工业革命在消费主义的传播中也发挥了重要作用。它始于1700年代的英国,并很快传播到欧洲和北美的许多其他国家。从本质上讲,工业化利用资本主义经济政策,促生出许多不同工厂和矿厂。由于当时的经济环境十分自由,这些工厂能够大规模发明和生产产品。在工业革命开始之前,商品是在“家庭手工业”的系统中生产的。也就是说这些商品通常是在人们的家里小规模生产的。这种方法的结果是,商品通常在产品性质上是单一的,并且无法大量生产。工业革命从根本上改变了这一状况,取而代之的是将工厂设在可​​以大规模生产商品的城镇。大量的新奇廉价的商品意味着人们可以用更少的价格购买更多种类的商品。这导致了消费主义,因为它创造了一个人们可以合理地购买各种商品的系统。同样,企业家们在这段时期内积累的财富使他们有能力负担更多的商品,同时也进一步加速了当时社会的“消费主义化”。

在工业革命开始之前和工业革命期间,欧洲和北美的社会因巨大的收入差距而分裂。这意味着有些人,例如企业家,正在赚大钱,而另一些人,比如工人阶级,则在努力维持生计。结果导致,工业社会中的许多人很贫穷,勉强能负担基本生活开销。但是,随着时间的流逝,出现了支持工人阶级的社会主义价值观,出现了强大的中产阶级人民。这些中产阶级有能力负担得起更好的住房,教育和消费品。结果,许多历史学家认为欧洲和北美中产阶级的出现是对消费主义加剧的重要贡献。由于他们的收入较高,因此他们有能力购买更多的奢侈品,消费了更多的商品。

现代发展

消费主义在20世纪进一步发展。例如,有些人将1950和1960年代视为消费主义的“黄金时代”。在此期间,由于有效的营销活动,商品的价格变得便宜得多,并且某些产品能够大规模销售。通常,营销是指公司为将产品销售给广大受众而制作的广告。营销一直是销售商品的一种很流行的方法,但是20世纪的营销活动更加复杂。例如,这些营销活动中的许多活动都营造了一种观念:消费是一件很有身份有地位的事情,并使人们将其社会地位与消费水平和消费质量联系起来。这引起了当时消费率的爆炸式增长,即使在21世纪,营销仍然是重要的消费主义工具。

近年来,消费主义的另一个重要方式是资本主义的外包。通常,外包是指美国和加拿大等西方国家的公司将制造业务转移到墨西哥和中国等其他发展中国家。公司这样做是为了降低开发产品时的总体成本,因为像中国和墨西哥这样的国家的工人工资将以比美国和加拿大的类似工人少得多。外包作为一种概念在整个1980年代在北美和欧洲变得很流行,并且一直持续到今天。

外包一个非常有争议的行为,在资本主义国家有些人认为它是正面积极的,而另一些人则认为它是负面消极的。那些从正面看待外包的人认为,这样做可以降低商品成本,并帮助公司在竞争激烈的经济中保持繁荣。那些对此持否定态度的人则认为,外包导致了整个北美和欧洲的制造业岗位流失。而我们国家正是把握住了这样一个机会,创造了大量的就业机会,并且引入了很多国际资本进入中国。从而打开了国内外的经济市场,让中国经济得以飞速发展。

无论如何,外包这种方式有助于在全球范围内增强消费主义的扩张:

  • 首先,它使许多商品的成本保持在较低水平,从而使大量生产和销售消费品成为可能。
  • 其次,它导致很多国家,例如中国和墨西哥,发展自己的消费主义社会,从而在全球范围内进一步提高了消费主义的速度。

消费主义的弊端

可以看到,消费主义缘起于西方资本主义世界,并且在全球化浪潮的推动下十分迅速地扩张。时至今日,伴随着过去几十年经济、互联网的快速发展,人们想要或者说需要消费的声音也到达了一个史无前例的高峰。无论是电话,社交媒体应用,网站,电视节目,电影,还是移动支付,都在鼓励消费,同时也给现在的消费者带来了巨大的压力。在过去的一百年里,我们逐渐相信拥有更多的东西就等于幸福。消费定义了我们当前的成功社会准则。

要承认的是,消费这个行为很大程度上刺激了市场经济的发展。问题是,所有在消费主义中的过度消费并没有使我们更快乐。实际上,这使我们和我们的社会比以往任何时候都更加迷失和畸形。因此我们不得不思考,消费主义可能会造成哪些伤害:

  1. 高债务积累

现在的车贷、房贷、信用卡贷款急剧增加。央行数据显示,2019年底我国居民的贷款总额为153.11万亿元。现在越来越多的人急于以信贷方式购买时尚,科技产品,汽车和房产。导致一些的真正财务需求,比如养老、个人投资等,并没有被充分考虑进去。身上几百万的负债只会让人感到焦虑和压力,透支的是精神和身体,而社会期待的却是生产力和创造力。

2. 心理健康问题

“买买买”会让人产生无法满足的饥饿感。冲动性消费是令人上瘾的“零售疗法”的结果,我们可以使用这种方法来缓解负面情绪或分散我们的注意力。但讽刺的是,极端的消费主义却只会滋生更多的欲望、焦虑和不满。因为,金钱和物质通常无法实现我们追求的真正的生命意义或归属感。

3. 对环境的破坏

消费主义带来的另一个严重后果就是,对维持我们至关重要的自然环境和生态系统的持续破坏。当消费主义继续不断扩散,生产过程继续消耗资源,浪费资源时,也许就是环境灾难的开始。

这篇文章我用了很大的篇幅去介绍了“消费主义”这个意识形态的有来的发展历史,目的就是希望能够从历史看到其中的本质,以及了解消费主义和资本主义的关系。其实更多时候不是我们去消费,而是我们被消费。

消费不是件坏事请,我们不可能不去消费,双十一到了我也会买一些打折的生活用品。但是我努力不去被消费主义所“绑架”,比如,研究双十一的各种攻略,四处发拼多多的链接给亲朋好友要求帮忙“砍一刀”。这些方式并没有真帮我们省下钱,反而会增加我们额外更多的消费,刺激我们的购买欲望,同时浪费了我们更加宝贵的注意力和个人时间。

我们在消费的时候可以想一想,这种消费是否真的是需要的,是内心希望的。如果你觉得买一只好看的口红可以提升你的信心,让你一整天心情愉悦的话,我觉得这种消费是合理的。如果“名媛群”的女孩们希望能够用自己更少的钱体验优质的服务,甚至是想要体验一下有钱人的优越感,我也觉得可以理解,虽然不赞同但也没有必要对她们口诛笔伐。

我所反对甚至是痛恨的是无法辨别诱惑,甚至利用周围人的善意去满足自己消费欲望的行为。比如,自己用着父母亲辛苦攒了一辈子的钱去花天酒地,或者因为商家的一些宣传而脑子一热购买了一堆没有用的“消费品”。学习和思考可以帮助我们建立正确的价值判断。

我们可以选择将在消费主义上浪费的时间用于阅读、思考,可以选择用于陪伴家人、和朋友社交,甚至也可以选择看一天电视剧、玩一天游戏放松自己。我不想灌鸡汤,鼓励每个人提升自己,只是希望我们能够了解我们辛苦挣来的钱去了哪里,看到消费主义背后的资本家的目的。

最后

希望当有一天我们老去,我们会发现我们用尽一生的时间、劳动,换取的不仅仅是一堆房子、车子、满屋子的奢侈品藏品,而是有更多和爱人、亲人的美好回忆,有更多和同学朋友通宵K歌、打游戏的大哭大笑,有也许因为一个想法创业,每天吃泡面最后却无奈失败的刻骨铭心,有坚持了一生的读书习惯,就算已经忘了绝大部分的书中内容,还是记得那些文字曾经带给我们的力量与感动。

仔细想想,真正感动我们的不会是我们买的那个房子有多大多豪华,这样的感动不会持续太久,真正打动我们的是在这个空间内,和自己的爱的人的所有经历和喜怒哀乐。生命中有太多的事情值得我们去努力,去争取,也有太多的风景等着我们去探索发现。不管结果怎样,我们有着大把的时间想要实现我们的一切想法,而不应该轻易允许自己被任何人以任何方式“绑架”。

或许我们内心会有一个隐秘的清单,列满我们心甘情愿被“绑架”一辈子的名字。但是希望这些名字让我们看到后嘴角会忍不住微笑,而不是被资本主义和企业家的名字代替或霸占。

参考

https://www.theatlantic.com/business/archive/2016/11/how-humans-became-consumers/508700/

https://www.historycrunch.com/history-of-consumerism.html#/

https://medium.com/@KarenWilliams.Louise/is-consumerism-robbing-us-of-our-humanism-and-happiness-cb748cb40fba