博客

  • 谷歌(Google)开源内部代码评审规范

    谷歌(Google)开源内部代码评审规范

    Visits: 1

    代码评审标准

    代码评审的主要目的是确保代码库的整体质量随时间推移逐步得到提升,所有代码评审工具和过程都是为了实现这一目标而设计的。

    为了实现这个目标,必须做出一系列权衡。首先,开发人员的开发任务必须要有所进展。如果他们不提交改进的代码,代码库质量就得不到改善。此外,如果评审人员过于严格,开发人员就没有动力进行持续改进。

    评审人员的职责是确保每个 CL(变更列表)的质量,保证代码库整体质量不会随着时间的推移而下降。这是一项艰巨的任务,因为代码库整体质量常常会随着每次提交代码质量的小幅下降而退化,特别是有时候开发团队时间很紧,并认为必须走捷径才能完成交付任务。

    评审人员要对他们评审的代码负起责任,确保代码库保持一致性和可维护性。

    以下是可在代码评审中使用的准则: 

    一般来说,如果 CL 达到可以提升系统整体代码质量的程度,就可以让它们通过了,即使它们可能还不完美。

    这是所有代码评审准则的最高原则。

    当然,也有例外的时候。例如,如果 CL 中包含了系统不需要的功能,那么即使代码写得很好,评审人员也可以拒绝让它们通过。

    这个世界上没有“完美”的代码,只有更好的代码。评审人员不应该要求开发人员对 CL 中的每一个微小部分都进行细致入微的打磨,而应该在满足需求和变更重要性之间做出权衡。评审人员不应该追求完美,而应该追求持续改进。如果一个 CL 能够从整体上提高系统的可维护性、可读性和可理解性,那它就不应该仅仅因为它不够“完美”而被延迟几天甚至几周。

    评审人员应该提供建议,告诉开发人员哪些方面可以做得更好。但如果这些建议不是很重要,可以在前面加上像“Nit:”这样的前缀,让开发人员知道这只是一个改进建议,他们也可以选择忽略。

    指导 

    代码评审的一个作用是向开发人员传授知识,比如关于一门语言、一个框架或一般软件设计原则的知识。分享知识是提升系统代码质量的一个组成部分。但要注意,如果你的建议纯粹是带有教育性质的,并且对于满足本文所描述的标准来说并不是那么重要,那么请在前面加上“Nit:”,或者以其他方式告诉开发人员,他们并不一定要在 CL 中解决这些问题。

    原则

    • 客观的技术和数据比个人意见和偏好更重要。
    • 在代码风格方面,可以参考谷歌风格指南。任何没有在这个风格指南中出现的东西(比如空格等)都属于个人偏好。代码风格应该与原有代码保持一致,如果之前没有规定代码风格,可以使用代码提交者的代码风格。
    • 软件设计从来就不只风格问题,也不只是个人偏好问题。它们建立在一些基本原则之上,所以我们应该基于这些原则做出权衡,而不只是基于个人偏好。有时候,一个问题有多种解决方案,如果开发人员能够证明(通过数据或基于可靠的工程原理)几种解决方案是同样有效的,那么评审人员应该接受开发人员的选择,否则就应该基于软件设计标准原则做出决定。
    • 如果没有其他适用的原则,评审人员可以要求开发人员与当前代码库保持一致,只要不破坏系统的整体代码质量。

    解决冲突

    在代码评审过程中出现冲突时,开发人员和评审人员首先要尝试根据本文、CL 作者指南和评审人员指南达成一致意见。

    如果很难达成一致意见,评审人员和开发人员可以进行面对面会议或者视频会议,而不是只是试图通过代码评审评论板来解决冲突。

    如果还不能解决问题,那么就要考虑把问题升级,进行更广泛的团队讨论。让团队负责人参与进来,请求代码维护人员作出决定,或请求工程经理提供帮助。不要因为开发人员和评审人员无法达成一致意见就让 CL 一直挂在那里。

    代码评审要注意哪些事情?

    设计

    代码评审中最重要的部分是 CL 的总体设计。CL 中不同代码段之间的交互是有意义的吗?这个变更应该属于代码库,还是属于某个包?它与系统的其他部分可以良好地集成吗?现在是引入这个变更的好时机吗?

    功能

    这个 CL 是否达到了开发人员的目的?开发人员的意图对代码用户来说有好处吗?代码“用户”可以是指最终用户(他们受代码变更的影响)和开发人员(将来要“使用”这些代码)。

    大多数情况下,我们希望开发人员先测试好 CL,确保它们能够正确运行。但作为评审人员,你仍然要考虑一些边缘情况,比如查找并发问题,尝试像用户一样思考问题,并找出只是通过阅读代码无法看到的错误。 

    如果愿意,你也可以验证一下 CL。如果一个 CL 会影响用户,比如做出了 UI 变更,那么这是验证 CL 的好时机。如果只是看代码,很难理解一些变更将如何影响用户。对于这样的更改,如果不方便自己运行,可以让开发人员提供功能演示。

    另一个重要的考虑点是 CL 中是否存在可能导致死锁或竞态条件的并发问题。只是简单地运行代码很难发现这类问题,通常需要有人(开发人员和评审人员)仔细思考这些问题,确保不会把它们引入到系统中。

    复杂性

    CL 比实际需要的更复杂吗?从每一层面检查 CL,细到每一行代码,它们是不是太复杂了?函数是否过于复杂?类复杂吗?“太复杂”通常意味着“阅读代码的人难以很快理解它们”,也意味着“开发人员在调用或修改这些代码时可能会引入 bug”。

    过度设计是一种特殊的复杂性,开发人员把代码写得比实际需要的更通用,或者增加了系统当前不需要的功能。评审人员要警惕过度设计,鼓励开发人员只解决现在需要解决的问题,而不是将来可能需要解决的问题。未来的问题应该在它们出现之后再去解决,因为到了那个时候我们可以看到它们的实际状况和需求。

    测试

    要求开发人员进行单元测试、集成测试或端到端测试。一般来说,CL 中应该包含测试,除非这个 CL 只是为了处理紧急情况。

    确保 CL 中的测试是正确、合理和有用的。因为测试本身无法测试自己,而且我们很少会为测试编写测试,所以必须确保测试是有效的。

    如果代码出了问题,测试会失败吗?如果代码发生改动,它们会误报吗?每一个测试都有断言吗?是否按照不同的测试方法对测试进行分类?

    请记住,测试代码也是需要维护的。

    命名

    开发人员是否使用了良好的命名方式?好的命名要能够充分表达一个项(变量、类名等)是什么或者用来做什么,但又不至于让人难以阅读。

    注释

    开发人员有没有用自然语言写出清晰的注释?他们所写的注释都是必需的吗?通常,注释应该用于解释代码的用处,而不是解释它们在干什么。如果代码不够清晰,无法自解释,那就应该简化代码。当然也有一些例外(例如,正则表达式和复杂的算法,如果能够解释它们在做什么,会让阅读代码的人受益匪浅),但大多数注释都应该指出代码中不可能包含的信息,比如这些代码背后的缘由。

    CL 附带的其他注解也很重要,比如告知一个可以移除的待办事项,或者一个不要做出代码变更的建议,等等。

    注意,注释不同于类、模块或函数文档。文档的目的是为了说明代码的用途、用法和行为。

    代码风格

    谷歌为主要编程语言和大多数次要编程语言提供了代码风格指南,所以要确保 CL 遵循了适当的指南。

    如果你想对指南中没有提及的风格做出改进,可以在注释前面加上“Nit:”,让开发人员知道这是一个你认为可以改进的地方,但不是强制性的。但请不要只是基于个人偏好来阻止 CL 的提交。

    开发人员不应该将风格变更与其他变更放在一起,这样很难看出 CL 发生了哪些变化,导致合并和回滚变得更加复杂。如果开发人员想要重新格式化整个文件,让他们将重新格式化后的文件作为单独的 CL,并将功能变更作为另一个 CL。文档

    如果 CL 导致用户构建、测试、交互或发布代码的方式发生了变化,请确保相关的文档也得到了更新,包括 README、g3doc 页和其他生成的参考文档。如果 CL 有移除或弃用代码,请考虑一下是否也应该删除相关的文档。如果文档缺失,要向开发人员索要。

    查看每一行代码

    查看每一行代码。有些东西可以看一看,比如数据文件、生成的代码或大型数据结构,但不要只是粗略地扫一下类、函数或代码块,并假定它们都能正常运行。显然,有些代码需要仔细检查,至于是哪些代码完全取决于你,但你至少应该要理解这些代码都在做些什么。

    如果代码很复杂或者你难以快速看懂它们,导致评审速度变慢,你要让开发人员知道,并在进行进一步评审之前让他们做一些澄清。如果你看不懂这些代码,其他开发人员很可能也看不懂。因此,要求开发人员澄清代码其实也是在帮助未来的开发人员更好地理解代码。

    如果你理解代码,但又觉得没有资格做代码评审,可以确保有资格的 CL 评审人员在代码评审时考虑到了安全性、并发性、可访问性、国际化等问题。

    上下文

    代码评审工具通常只显示被修改的代码,但有时候你需要查看整个文件,确保代码变更是有意义的。例如,你可能只看到新添加了四行代码,但如果你看一下整个文件,会发现这四行代码位于一个 50 多行的方法中,这个时候需要将这个方法拆分为更小的方法。

    你需要基于整个系统来考量 CL。这个 CL 是提升了系统的代码质量,还是让整个系统变得更复杂、更不可测?不要接受导致系统代码质量退化的 CL。大多数系统都是因为累积了很多小的变更而变复杂的,所以要尽量避免小的变更带来的复杂性。

    好的一面

    如果你在 CL 中看到一些不错的东西,要让开发人员知道,特别是当他们以一种很好的方式解决了问题。代码评审通常只关注错误的东西,但其实也应该鼓励和赞赏好的代码实践。有时候,让开发人员知道他们做对了事情比让他们知道做错了事情更有价值。

    总结

    在进行代码评审时,你要确保:

    • 良好的代码设计。
    • 功能对代码用户来说是有用的。
    • UI 变更应该是合理的。
    • 并行编程是安全的。
    • 代码复杂性不要超过应有的程度
    • 不需要实现可能会在未来出现的需求。
    • 有适当的单元测试。
    • 精心设计的测试用例。
    • 使用了清晰的命名方式。
    • 清晰而有用的代码注释,要解释“为什么”,而不是“什么”。
    • 恰如其分的代码文档化。
    • 代码要遵循风格指南。

    检查每一行代码,查看上下文,确保你正在改进代码质量,并为表现不错的开发人员点赞。

    检查 CL

    在知道了代码评审要关注哪些东西之后,如何有效地进行跨文件代码评审呢?

    • 代码变更有意义吗?它们有没有良好的描述?
    • 先看一下代码变更中最重要的部分,它整体设计得如何?
    • 按照适当的顺序检查 CL 的其余部分。

    第一步:从整体查看代码变更

    先看一下 CL 描述,看看这个 CL 做了些什么。做出这个变更有意义吗?如果这个变更是不必要的,请立即做出回复,并解释为什么不应该发生这个变更。在你拒绝这样的变更时,可以向开发人员建议他们应该做些什么。

    例如,你可以说:“看起来你在这方面做得不错,谢谢!不过,我们正打算移除这个系统,所以现在不想对它做任何修改。或许你可以重构一下另外一个类”?

    注意,评审人员在拒绝一个 CL 并提供替代建议时要做得很有礼貌。礼貌是很重要的,因为作为开发人员,我们要彼此尊重,即使可能意见不一致。

    如果有很多 CL 是你不希望出现的,就要考虑重新调整开发团队或外部贡献者的开发流程,以便在开发新的 CL 之前进行更多的沟通。提前告诉人们哪些事情不要做,这比等他们做完了这些事情再把它们扔掉或者进行彻底重写要好得多。

    第二步:检查 CL 的主要部分

    找到 CL 的主要文件。通常一个 CL 会有一个包含了主要逻辑变更的文件,也就是 CL 的主要部分。先看看这些主要部分,有助于了解整个上下文,加快代码评审速度。如果 CL 太大,以致于你无法确定哪些部分是主要的,可以询问开发人员,或者让他们把 CL 拆分成多个 CL。

    如果 CL 的主要部分存在严重的设计问题,要立即回复开发人员,即使你还没有时间检查 CL 的其余部分。这个时候检查 CL 的其余部分可能是在浪费时间,因为如果主要部分存在严重的设计问题,那么其他部分就变得无关紧要了。

    为什么要立即回复开发人员?原因有二:

    • 开发人员在发出一个 CL 之后会继续开始后续的开发工作。如果你正在评审的 CL 存在严重的设计问题,他们也需要重写后续的 CL。所以,最好赶在开发人员在有问题的设计上花费不必要的时间之前告诉他们。
    • 大的设计变更比小的变更需要更长的时间。为了让开发人员能够在截止日期之前提交代码,同时又能保持代码库的质量,要尽早让他们开始重写工作。

    第三步:按照适当的顺序检查 CL 的其余部分

    在确认整体 CL 没有严重的设计问题之后,试着按照某种逻辑顺序来检查其他文件,确保不会错过任何一个需要检查的文件。通常,在你检查完主要文件之后,按照代码评审工具显示它们的顺序来浏览每个文件就可以了。你也可以在检查主要代码之前先查看测试代码,这样可以对代码变更有一个大致的概念。

    代码评审的速度

    为什么代码评审要快速进行?

    在谷歌,我们对开发团队的整体交付速度(而不是针对个体开发人员写代码的速度)进行了优化。个体开发速度也很重要,但其重要性比不上整个团队的开发速度。

    如果代码评审的速度很慢,就会发生以下这些事情:

    • 团队的整体开发速度降低了。如果个体开发人员无法快速地对评审做出响应,可能是因为他们有其他事情要做。但是,如果每个 CL 都要等待一次又一次的评审,那么其他成员的新特性和 bug 修复就会被延迟,可能是几天、几周甚至是几个月。
    • 开发人员开始对代码评审流程提出抗议。如果评审人员要隔几天才回复一次,但每次都要求对 CL 进行重大修改,开发人员可能会觉得很沮丧。通常,他们会抱怨评审人员太过严苛。如果评审人员能够快速提供反馈,抱怨就会消失,即使他们要求做出的修改是一样的。代码评审过程的大多数抱怨实际上可以通过加快评审速度来解决。
    • 代码质量受影响。如果评审速度很慢,开发人员的压力也会随之增加,因为他们不能提交不甚完美的 CL。缓慢的评审流程还会阻碍代码清理、重构和对现有 CL 做出进一步改进。

    代码评审应该要多快?

    如果你不是在集中精力完成手头的任务,那就应该在第一时间评审代码。

    对代码评审做出响应最好不要超过一个工作日。

    如果遵循这些原则,那么一个典型的 CL 在一天内(如果需要的话)可以进行多轮评审。

    速度和中断

    有一种情况,即如果你正在集中精力完成手头的任务,比如写代码,那就不要打断自己去做代码评审。研究表明,开发人员被中断之后可能需要很长时间才能恢复到之前的状态。因此,从团队整体上看,在写代码时打断自己比让另一个开发人员等待代码评审要付出更大的代价。

    所以,对于这种情况,可以等到你手头工作可以停了再开始代码评审。可以是在完成手头的编码任务之后,午饭后,会议结束后,休息结束后,等等。

    快速响应

    我们所说代码评审速度指的是响应时间,而不是 CL 完成整个评审过程并提交到代码库所需的时间。理想情况下,整个评审过程也应该是很快的,但单次评审请求的响应速度比整个过程的响应速度更重要。

    有时候可能需要很长时间才能完成整个评审过程,但在整个过程中评审人员的快速响应可以极大减轻开发人员对“慢”评审的沮丧感。

    如果你太忙了,可以先向开发人员发送一个响应,让他们知道你什么时候可以开始评审,或者建议让其他可以更快做出响应的评审人员来评审代码,或者提供一些初步反馈。

    最重要的是评审人员要花足够的时间进行评审,确保代码符合标准。但不管怎样,最好响应速度还是要快一些。

    跨时区代码评审

    在进行跨时区代码评审时,试着在开发人员还在办公室的时候做出响应。如果他们已经回家了,那么最好可以确保他们在第二天回到办公室时可以看到代码评审已经完成。

    带有注解的 LGTM

    为了加快代码评审速度,对于以下两种情况,评审人员应该给出 LGTM(Look Good to Me,没有问题)或者通过,即使他们在 CL 中留下了未解决的问题:

    • 评审人员确信开发人员将会处理好评审人员给出的建议和意见。
    • 其余的改动是次要的,不一定要求开发人员完成。

    当开发人员和评审人员处于不同的时区时,最好可以使用带有注解的 LGTM,否则开发人员可能需要等上一整天才能获得“LGTM,批准”。

    大型的 CL

    如果有人给你发了一个很大的代码评审,而你不确定是否有足够时间完成评审,通常的做法是要求开发人员把 CL 拆分成几个较小的 CL。这样做通常是合理的,对评审人员来说是有好处的,即使开发人员需要做点额外的工作。

    如果一个 CL 不能拆分成更小的 CL,并且你没有足够的时间进行快速评审,至少要对 CL 的总体设计写一些注解,并发给开发人员。评审人员的目标之一是在不影响代码质量的情况下快速对开发人员做出响应,或者让他们能够快速采取进一步行动。

    持续改进代码评审

    如果你遵循了这些指导原则,并且对代码评审过程严格要求,你会发现,随着时间的推移,整个代码评审过程会变得越来越快。开发人员知道为了保证代码质量需要做些什么,并从一开始就向你发送非常棒的 CL,这样评审所需的时间就会越来越少。评审人员也学会了如何快速做出响应。但不要为了提高评审速度而牺牲代码评审标准或质量——从长远来看,这样做并不会让任何事情变得更快。

    紧急情况

    在一些紧急情况下,CL 必须非常快速地通过整个评审过程,在质量方面会有些许的放松。请参看这些“紧急情况”,看看哪些符合紧急情况标准,哪些不符合。

    怎样写评审注解

    概要

    • 礼貌。
    • 解释你的理由。
    • 给出明确的方向,指出问题,并让开发人员决定如何在两者之间做出权衡。
    • 鼓励开发人员简化代码,或者添加代码注释,而不只是让他们解释代码的复杂性。

    礼貌

    一般来说,礼貌和尊重是很重要的。一个是要确保你的评论是针对代码而不是针对开发人员。你不一定要一直这么做,但当你想说一些可能会让开发人员感到激动或有争议的话时,绝对有必要这么做。例如:

    不好的说法:“为什么你要在这个地方使用线程,这样做显然不会获得任何好处”。

    好的说法:“在这里使用并发模型增加了系统复杂性,但我看不到任何实际的性能好处,所以这段代码最好使用单线程,而不是多线程”。

    解释理由

    从上面的正面示例可以看出,这样有助于开发人员理解你为什么要给出这些建议。你并不一定总是要在评审中提供这些信息,但如果你能够为你的意图、所遵循的最佳实践或你的建议将如何改进代码质量给出更多的解释会更好。

    给予指导

    一般来说,修复 CL 是开发人员的责任,而不是评审人员的责任。你不需要为开发人员提供详细的解决方案或者为他们写代码。

    不过,这并不意味着评审人员就不应该帮助开发人员。你最好可以在指出问题和给予指导之间做出权衡。指出问题,并让开发人员做出决策,这样有助于开发人员学到东西,并让代码评审变得更容易。这样还可以产出更好的解决方案,因为开发人员比评审人员更了解代码。

    不过,有时候直接给出指令、建议或代码会更有用。代码评审的主要目的是获得尽可能好的 CL。第二个目的是提高开发人员的技能,这样以后需要的评审就会越来越少。

    接受注解

    如果你要求开发人员解释一段你不理解的代码,他们通常会去重写代码,并把代码写得更清晰。有时候在代码中添加注解也是一种恰当的做法,只要它不只是用来解释太过复杂的代码。

    不要只是把注解写在代码评审工具里,因为这对于将来要阅读代码的人来说并没有多大帮助。只有少数情况可以接受这种做法,例如,你对评审的东西不太熟悉,而开发人员的解释却是很多人所熟知的。

    代码评审回推

    有时候,开发人员会回推代码评审。他们可能不同意你的意见,或者他们抱怨你太严格了。

    谁是对的?

    如果开发人员不同意你的意见,先花点时间想一下他们是不是对的。通常,他们比你更熟悉代码,所以可能对代码的某些方面更了解。他们的论点有道理吗?从代码质量角度来看,他们的回推是有道理的吗?如果是,就让他们知道他们是对的,这个问题就解决了。

    然而,开发人员并不总是正确的。在这种情况下,评审人员要进一步解释为什么他们的建议是正确的。

    如果评审人员认为他们的建议可以改善代码质量,并认为评审所带来的代码质量改进值得开发人员做出额外的工作,那么他们就应该坚持。改善代码质量往往是由一系列的小步骤组成的。

    有时候你需要花很多时间反复解释,但要始终保持礼貌,并让开发人员知道你知道他们在说什么。

    激动的开发人员

    有时候,评审人员会认为如果他们坚持要开发人员做出改动,会让开发人员感到不安。开发人员有时候确实会感到沮丧,但这种感觉通常都很短暂,之后他们会非常感谢你帮助他们提高了代码质量。如果你在评审过程中表现得很有礼貌,开发人员一点都不会感到不安,这种担心可能是多余的。通常,令开发人员感到不安的是你写注解的方式,而不是你对代码质量的坚持。

    稍后再解决

    一种常见的回推原因是开发人员希望尽快完成任务。他们不想经过一轮又一轮的代码评审,他们说他们会在后续的 CL 中解决遗留问题,你现在让 CL 通过就可以了。一些开发人员会做得很好,他们在提交 CL 后立即就开发后续的 CL。但经验表明,开发人员开发原始 CL 的时间越长,他们进行后续修复的可能性就越小。除非开发人员在提交 CL 之后立即进行修复,否则在通过之后通常不会再去做这件事情。这并不是因为开发人员不负责任,而是因为他们有很多工作要做,而修复工作通常会被遗忘。所以,最好让开发人员马上把 CL 修复掉。

    如果 CL 引入了新的复杂性,在提交之前必须将其清理掉,除非是紧急情况。如果 CL 暴露了一些目前还无法解决的问题,开发人员需要把 bug 记录下来,并将其分配给自己,这样它就不会被遗漏。他们还可以在代码中加入 TODO 注释,指向已经记录好的 bug。

    抱怨评审太严格

    如果你之前的代码评审很放松,然后突然变得严格起来,可能会引起一些开发人员的抱怨。不过没关系,加快代码评审速度通常会让这些抱怨逐渐消失。

    有时候,这些抱怨可能需要几个月的时间才能消除,但开发人员到最后通常会看到代码评审的价值,因为他们看到了严格的代码评审有助于产出优秀的代码。有时候,抗议最大声的人甚至会成为你最坚定的支持者。

    解决冲突

    如果你遵循了上述方法,但仍然会在评审过程中遇到无法解决的冲突,请再次参阅代码评审标准,了解那些有助于解决冲突的指导原则。

    谷歌风格指南:

    http://google.github.io/styleguide

    CL 作者指南:

    https://google.github.io/eng-practices/review/developer/

    评审人员指南:

    https://google.github.io/eng-practices/review/reviewer/

    代码风格指南:

    http://google.github.io/styleguide/

    紧急情况指南:

    https://google.github.io/eng-practices/review/emergencies.html#what

    查看原文:

    https://google.github.io/eng-practices/review/reviewer/

  • 如何打出自己不认识的字 | 【技巧】

    如何打出自己不认识的字 | 【技巧】

    Visits: 2

    我们在平常的写作或者读文章的时候,经常会碰到不认识的字。对于大部分人来说,一般打字都使用的是全拼,那么我们怎么输入自己不认识的字呢?大家跟随小编来学一技傍身吧,以下是具体的步骤:

    步骤:

    1. 譬如我们要输入以下文字,如:龘,嘂,蓁,膐,壵等

    2. 切换到搜狗输入法,先输入u

    3. 然后再分析每个文字由哪几个汉字组成,然后在u后面直接输入全拼即可,如下图:

    4. 是不是很神奇啊,以后再也不会碰到汉字说不会了,动手试一下,马上就知道如何读了。

  • 2020,冰火交融,至少我们还活着

    2020,冰火交融,至少我们还活着

    Visits: 154

    再坚持一下吧,或许会有转机呢? 

    2020年,对于大多数创业者而言都是充满挑战的一年。疫情像块突如其来的试金石,用困难考验并试炼着公司的韧性和创业者的心态。 

    这里有20位艰难熬过2020年的创业者,他们在没风的地方找太阳,在最绝望的时候咬牙坚持,他们的公司曾濒临倒闭,最终冲过2020年的终点,他们没有在困难面前认输。 

    为了将公司拉回生死线,他们有的用自己的特长赚外快维持公司运转;有的不得不忍痛裁员,迅速转变用人模式以降低成本;有的借钱硬撑,在最后关头幸运地拿到了救命的投资……而在这过程中,他们或曾焦虑到天亮才合眼,或被相处多年的女朋友抛弃,或者年纪轻轻就查出了各种疾病。 

    他们说,没有胜利可言,挺住就意味着一切。 

    在信念成为稀缺品的2020,希望他们的故事能带给你一些信心。 

    PART1
    一些纠结与坚持

    今年6月之前
    整个团队都不知道明天会怎样
    Rany | 30+岁 24KiCK创始人 

    我们是做格斗健身的,今年疫情,前6个月我们几乎没有收入,直到今天仍然在生死线上徘徊。 

    我们的成本主要是人员和房租。原来70多人的团队直接被减到十几个人,我宣布某个项目组解散的时候,全体组员哭着说不要赔偿,赔偿我肯定会给,但那是我第一次在职场有明显的情绪崩溃。至于房租,所有的房东最多给免1-2个月的房租,我还欠着4个月的房租,所以只能关掉三家门店。 

    店开不了,为了创造收入,我们用最后仅存的一点钱和几个朋友合伙开了一个餐厅,另外在电商上卖一些周边,但这两部分的收入远远跟不上我们需要付的钱。 

    今年6月之前,整个团队都不知道明天会怎样,当时都没有办公室,我带着仅剩的几个小伙伴,在咖啡厅里、我家里,点灯熬油做计划,但是突然间就会有人崩溃,问做计划的意义到底是什么,根本不知道什么时候才能开业。 

    每天,一睁眼就是一个团队要吃饭,我都没法形容那种焦虑。资金吃紧的时候,我自己去跟朋友、投资人借了200多万,对方都是二话不说直接转账,这份信任我都记在心里。 

    可这还是解决不了根本问题,借钱也有限度,我不可能无休止地去负债,那几个月脱发很厉害,头顶已经快秃了,但也没办法。 

    我们门店6月才开始恢复运营,曾一个月被投诉11次,经过多方打探最后知道是同行。他们的理由是我们上课的时候人多聚集,还有不知道从哪来的外国人。当时只要收到举报就得检查,24小时内就不能营业。 

    好在后面几个月生意还不错,但到了12月,北京又零星出现了几例病例,对比11月同期,我们12月的收入下降百分之六七十。

     但好歹这一年就这样过来了,我要感谢太多人。我的一个供应商曾拍着我肩膀跟我说,你千万要继续撑下去,钱等你有了再给。我们还有一位老会员今年充了8万元的私教,这明摆着是在帮我们。这样的事太多了,大家做出了巨大的让步跟牺牲,来让我们存活。 

    艰难的时候我时常会想:我们做的是一件帮人获得健康跟快乐的事,一不偷二不抢三不骗,我们没有理由放弃。 

    明年我们也想在异地开拓一些连锁市场,24号南宁店开始投入试运营,明年3月份开始,我们会去成都、杭州、武汉、深圳、广州,试图让24KiCK在更多的地方留下火种。 

    疫情之下三文鱼背锅
    日料店至今生意惨淡
    梁潇 | 28岁  日料店老板 

    年初的疫情没有打垮我们,6月北京新发地出现的疫情却对我们日料店造成了毁灭性打击。 

    这家精品日料店在望京,原本生意不错。年初疫情期间,我们做了一些小型外卖,5、6月份逐渐开始恢复线下经营,整体上损失还能承受。 

    新发地疫情出现,我们整个行业都受到巨大冲击。事情一出,我们立刻下架了所有的三文鱼菜品,大量的三文鱼都倒掉了。我们不可能自己天天吃,倒掉的时候心疼极了,随后整个店就关停了。一个多月后再次开业,生意依然非常惨淡。 

    其实我们挺冤枉的,新发地出现疫情不是因为海鲜携带病毒或冷链市场有问题,但很多人在网上说应该放弃冷链市场,对日料店也是一片谩骂。其实国际冷链市场对国内餐饮影响非常大,不能一竿子拍死整个行业。 

    6、7月份,我们店根本没有人来,本来我们是预定模式,但那段时间我们要现场出去拉客。人们一听日料就嘟囔日料不能吃,解释半天,别人觉得我们是为了抢客人,把我们当坏人。 

    近几个月疫情已经过去,我们的生意还是没有回暖。10月以后我们的临时客人几乎没了,只能靠老客户,但老客户也不可能天天吃日料。我们现在的状态是工作日没什么人,周末稍微有点人,收入连以前的1/3都不到。 

    我们现在只能重点服务一些老会员,让散客再去接受这件事还有点难,但还是希望大家能够扭转对日料的偏见。 

    接下来我们会考虑把模式做轻一点,尽可能压缩不必要的成本,发展线上,让店活下来,看能不能等到行业好转的那一天。 

    原本家里不管我创业,但今年我母亲让我不要随便创业,好好找工作上班,但我还是会继续坚持。我们最近也做了一些转型,开了一个无人超市,期待我们的新项目。 

    被股东、员工“背叛”
    家长的信任让我撑到现在
    夏丽 | 35岁 某托育品牌创始人 

    作为一个创业十年的“老人”,我真心觉得今年是最难过的一年。 

    我们是做培训的,总部在北京,旗下600家加盟商中,有20%都被迫关掉了。 

    我们的直营店也很艰难,1月份疫情开始的时候,全国线下店面全部暂停营业。5、6月份的时候南方店面逐渐开了起来,但是到了6月份,北京又出现疫情,9月份才稍微缓过来一点。等于说,我们的部分直营店从1-9月份,是没有一点收入的。而每个直营店又有高昂的房租成本以及人工成本。 

    信任这个东西,在利益与风险面前其实非常脆弱。对于员工来说,看不到前途很容易摇摆。我们中间有一两个星期工资延发了,这个时候竞争对手就开始下手。最困难的时候,从实习生时期就一直跟着我们干的老员工被竞争对手花两倍的价格挖走了。最后我不得不站在一线,大家觉得我就像旗杆一样站在那里。我觉得创业者的精神就是这样,如果今天没有人扫地你就去扫,如果今天没有人做销售你就去卖产品,要做到全能。 

    最崩溃的是,这次我还看到了资本的残酷。疫情期间我们的股东要求回购股份,意愿非常强烈,甚至不惜以诉讼的形式。如果不是我创业经验足够丰富,股东的撤资很可能会是压垮我的最后一根稻草。这也导致我开始重新审视资本。我想向所有广大的创业者分享一个道理——我们要想清楚需要怎样的资本,我们不应该是为了钱而要钱,而是应该选择一个可以一起走的伙伴。 

    等到最后,我发现真正支撑我的其实是我们的终端客户,他们能看见你所有的付出。比如,我们北京有一个门店要关了,家长们都是分批次退费的,没有一窝蜂涌上来,很多家长还通过我们的后台找到我的微信表达感谢,为我加油鼓劲。相比于员工和股东来说,我发现我们的客户其实是最信任我们的。为了不辜负他们,我也要坚持下去。 

    作为创业者,如果一直停留在难上,那大家就永远都走不出困境,因为会有更难的时候。 

    所以我们企业内部有一句话叫做“山不过来,我过去”。我们为了活下来,需要积极适应当下的环境,比如研发一些线上的课程、降低客单价、减少加盟费,还开始走下沉市场的路线。 

    扛了一年还在亏损
    想关店但下不了决心
    海文 | 35岁 奶茶店老板 


    我有两家奶茶店,北京东边和西边各一家,都是开在商场里。西边的那家去年年底刚装修完,开业不久就赶上了疫情。 

    前半年,商场不开业,6月份解禁后,商场做了很多促销活动,当时效果还挺好,那几天生意不错,我们也挺有信心,甚至还想在西边的商圈再开第二家店,没想到赶上疫情反复,商场又关了。 

    我们当时非常沮丧,好不容易看到的一点希望又破灭了。一个多月以后再开张,客流虽然慢慢恢复,但生意还是受影响。再加上西边的店铺靠近五棵松体育馆,今年没什么演唱会,生意就更难做。 

    撑到现在,基本上每个月都是入不敷出,每个月房租加人工、物料的费用大概5万,收入最多能有1-2万,西边的门店加上前期投入,亏损三四十万。 

    现在要想继续就得持续往里投钱,但奶茶店在北京已经非常饱和了,头部品牌体量也非常大。如果从产品形态和整个品牌调性来讲,没什么太多区别的话,其实没有太多机会。 

    我跟旁边的其他商户聊,他们的看法也类似。现在竞争激烈,在一个商圈里能见到太多相似的品牌,而且租金成本非常高,想靠单体店迅速挣钱,难度很大。 

    之前我非常焦虑,在大势面前有一种强烈的无力感。但是这半年来,心态慢慢平和一些,认清了整个环境,也在默默忍耐和等待,我觉得这也是一种积累。 

    任何行业开始做的时候肯定是满怀激情和憧憬,但这跟能做起来,还相差非常远。不是不努力,也不是产品不好,但就是不见得能挣到钱,商业就是这么残酷。 

    创业者首先得有强大的内心,要能经得起折腾,失败是一种常态,成功是非常小概率的事情,就看怎么把心态调整好,把所有积累变成今后的财富。 

    我们几个合伙人在商量年前或年后把奶茶店关掉,但也没有想清楚,一方面觉得没必要再这么扛下去了,另一方面关掉也挺可惜的,还在徘徊纠结。 

    账上的钱不够发下个月工资时
    我会怀疑人生
    王勉 | 34岁 游戏公司创始人 

    我们公司成立六年了,但还没进入到稳定的状态,这其实也和游戏的行情相关。 

    除了王者荣耀这种游戏之外,大部分游戏产品的寿命不超过三年,一般的产品甚至不会超过一年。不过大公司有钱,可以同时做很多个项目,我们这种小公司就只能一个项目一个项目做。如果一个项目做不成,营收不好,公司很容易命悬一线。 

    创业每时每刻都会遇到糟心的事情,比如培养出来不错的下属,经常会被大厂挖走;遇到不靠谱的技术或者策划让项目走了弯路,不得不中途换掉人等等。 

    但是最要命的事情是“产品想得很好,但最后落地不尽如人意”。而我们正在经历这样的危机——研发了一年多的产品原定在今年就要上线,结果实际测试的数据和预期不符,我们不得不改进产品,延期上线。 

    之前公司有一款老产品,还能持续提供一定的收入,现在随着新项目的投入增多,老项目已经没法养活新项目了,公司进入了缓慢的亏损期。一旦明年上线的项目数据没有达到预期,公司就会很危险。

     产品没出来,要持续投入,压力成倍增长,这个过程非常痛苦。如果中间不投入了,相当于之前所有的努力都白费。你只能花漫长的时间和巨额的资本去赌明天,赌我的产品上市后能够赚到钱。不过就目前的情况来看,产品算是在步入正轨。 

    我们一共做过五款产品,前两款产品不及预期,中间一度资金遇到困难,我当时每天看着账上的钱都不够发下个月的工资时,会怀疑人生:我出来这么折腾到底是为了什么? 

    其实做这个行业最大的好处是,你依然可以凭借着你的创意和想法做出来一款大家都很喜欢的游戏,这个行业永远都有底层逆袭的故事。回顾自己的初心,就是希望我们做的游戏有很多人来玩。如今这样的想法依旧没变。 

    PART2
    那些咬牙硬撑的辛酸

    所有人冲在一线
    我每天只睡三四个小时
    杨斌 | 44岁 无锡淘宝影视基地老板 

    按照原计划,今年1、2、3月我们会服务著名导演张黎的电视剧《输赢》,4、5、6月有正午阳光的新剧,是很完美的一年。疫情一来,剧组没法开工,后来忙的时候忙得不得了,亏的时候又亏得喘不过气。 

    和横店、象山不同,我们是现代化的影视基地,要大量租赁现代化的办公室、写字楼、样板间,为剧组量身定做配套场景,差不多有10万平方米,工作人员有100多人。 

    年初,为了当时大剧组的大戏,我们灯光、美术、摄影、木工等等都给安排好了,特地还留了一两百个群众演员,为了剧组囤了很多新鲜蔬菜,租了一百多辆车。房租一个月150多万,人员工资每个月30多万,结果停工3个月,面临着资产损失、人员滞留,每天都是苦熬。虽然政府补贴了两个月房租,但粗略算下来亏损至少还有一千多万。 

    我们这是重资产行业,没有放弃一说,放弃就是破产。 

    我们团队在这行干了二十多年了,最老的员工跟我干了15年了,干不了别的,大家都拖家带口在我这里,比如老公做场地的木工,老婆做饭馆服务员,儿子做剧组司机。他们也很不容易,还给我们打气,说等正常了再拿工资。 

    这让我挺感动的。我跟爱人商量,卖一套房子,先挺挺,工资不发不行。后来有个政策扶持,去年借的500万贷款,今年可以晚点还,税收可以晚点交,才勉强撑过来。 

    转折出现在6月份,影视行业复工,戏一部接一部来了,7月份最多接了15个剧组。但其实对于基地来说,人手和场地有限,再多来的剧组我们也签不了了。 

    复工后,家里没人,所有人都在一线,每天都工作十几个小时,连我都上一线了。我每天只睡三四个小时,导致血糖升高身体出了问题,住院都没时间,熬到10月撑不住了,每天上午去医院,下午还得回剧组,折腾了半个月。 

    不过,行业情况还是不太好。去年我们规划好今年有50部戏,现在总共只接了32部。很多戏说过要来拍的,后来就没有了,资金流跟不上。同行也很难,很多损失和成本我们也得和合作伙伴分摊,不是你倒闭,就是我倒闭,有的没谈拢,就因此没得合作了。 

    之前本来想年底带团队出去团建,好好犒劳一下大家。现在疫情又有些反复,还没有最终决定。总之,总算暂时熬过来了。 

    不敢倒闭
    否则后半辈子都要打工还钱
    高倩 | 32岁 实体书店+实践教育项目创业者


    我的公司为什么没倒闭?因为我没有勇气宣布“不做了”,所以还在硬撑着。

    我把所有的精力、金钱全部投到这个项目了,当初所有能帮我一把的朋友,都实实在在地拿钱支持我了。如果我现在放弃,相当于纯赔近三百万,那就彻底没有翻身的余地了,可能后半辈子都要打工还钱。 

    起初我想得很辉煌,在顺义西北部做了一个书和印刷的结合体——实体书店+实践教育展览基地,服务内容是接待中小学生来这里参加课外实践活动,给孩子们讲述中国印刷史。 

    这个想法源于我的父亲,他是一个残疾人,从印刷工人做到厂长,在2018年走完了他的一生,在我眼中,他这一生非常有教育意义。我刚好三十岁,觉得人生应该做一件有意义的事。那年年底,我以缅怀他的方式做了这个项目,希望能给孩子们带来更好的文化教育。 

    跟设计师初期商量时,我就说,我知道一次展览不能把所有的孩子都变成品德高尚的孩子,

    但我愿意给他们种下一颗种子,当他的人生面临某种选择时,可以选择做一个好人,哪怕是一个平凡的好人

    书店和基地落成后,没运行几个月就赶上疫情,孩子们停课了。


    去年和今年上半年,我们拿到了国家对实体书店的项目补贴,这让我感觉,做有意义的事,是有反馈的。说真的,如果没有上半年的补贴,我绝对撑不下去。当我知道下半年没拿到补贴的消息时,简直就是暴雨中的一个大霹雳。


    这一年昏天黑地,好像过了好几辈子一样,永远也盼不来天亮的感觉。我跟员工们说,有事就来,没事就别来,因为养不起,我连自己都快养不起了。 

    对我来说,生活特别艰难,是坚持还是放弃,真的就在一念之间。大部分同行已经倒闭了,转行做微商、做医美,我在想,文化产业研学怎么这么脆弱,行业完全没有支撑感,明年怎么办呢?


    今年我没闲着,把基地进一步细化装修了,又投入了15万,还在争取社会大课堂的授牌,年底,我们交了明年上半年的房租,准备抢明年开学后的第一块蛋糕


    如果我撑到那时候了,不求能赚多少钱,只求不赔得这么惨。 

    我的公司没暴雷
    但一出去就被人当成骗子
    叶均 | 34岁 前P2P从业者 

    2020年对我们公司来说是劫后余生的一年。 

    今年,P2P行业经历大清退,我在P2P行业做了多年,老东家也暴雷了,外界认知存在惯性,客户认为我和现在公司做的业务还是P2P。每次解释半天,客户还是将信将疑,这让人很苦恼。紧接着疫情来了,前半年公司业务进展缓慢。 

    前几年,行业蒸蒸日上,从业者日进斗金,但这都是暂时繁荣。一位朋友发朋友圈说,自己公司月净利润1亿,结果今年他滞留海外了。我九年前打过一场麻将,桌上其他三人运营的三家平台今年暴雷总金额超过500亿。我五年前参加过一次P2P高管饭局,一大半今年都进去了。 

    P2P暴雷,受伤最大的是出借人,亏损几十万、上百万的很多,有人甚至亏掉了救命钱、棺材本。到这个阶段,他们的钱就更难回来了。更可怜的是,他们还会被二次、三次收割。 

    比如有人会说,在平台内部有关系,能“私兑”,但得提前给钱。有人打着维权旗号建各种群,实际是帮平台分化、瓦解、收割出借人。这种操作内行一眼就能看穿,但是出借人会一次又一次上当,劝都劝不住。 

    P2P商业模式天生存在缺陷,几千家平台恶性竞争,越骗出借人,出借人越信,造成逆向淘汰。这是一场悲剧、闹剧,值得好好总结、反思,以免重蹈覆辙。


    行业已经被污名化,曾经的从业者也会被当作骗子。甚至有些公司的HR表示,只要有P2P从业经验的,一概不招聘,因为要么脑子有问题,要么人品有问题。未来,我只能慢慢消除误解。 

    今年下半年,我们公司的业务开始有了恢复。不过,我们今年也不敢奢望业务上有太大成长,重要的是活下来、想明白、把路趟出来。  

    合伙人一个考证一个开店
    就靠我一个人死撑
    张谦 | 33岁 小程序电商创业者


    前两次创业经历起起伏伏,我就一个感觉,不甘心,总感觉我再使点劲,还能再成功。


    第一次创业赶上P2P大行其道,我创办了一家网络广告代理公司,那一年半,我和小伙伴每个人赚了将近200万。2018年底我做货到付款的二类电商,结果资金链承受不住,2019年我就把业务停了。我现在这个项目,是奔着社群营销和直播电商两块业务去的,目前做了一个小程序,拿到品牌的代理权后,在小程序商城、抖音上卖。


    这事从去年底开始谋划,找到了另外两个人,一个是做媒介的大姐,是我之前接触过的唯一一个不拿回扣的人,另一个是做营销的一个兄长,发迹于蓝标,有人脉资源。 

    我不太懂管理,希望你好我好大家好,在设计股权的时候,我给自己定的45%,他们加起来刚好超过我。我想得很美好,希望大家通过这次创业,都能翻身。 

    这位大哥跟我有八年的交情,可每天给我传递负能量,他没房,我帮他找房,他说没工作氛围,我租办公室,他说“没钱了”,我给他拿。大姐之前一门心思在望京开饭店,赔得很惨。后来我帮她缴社保,加上借给她的,一共是45万,到现在两年多了还有一半没还。 

    接下来,公司运行了两个月时间,我发现,大哥每天忙着上网课,说要考消防师工程证,大姐在燕郊开了一家奶茶店。现在的状态是,只有我一个人干活。我给他们安排的事情他们也不做,我特别生气,要强行稀释他们的股权,结果他们一个一个都不出现了。

    慈不掌兵,义不掌财。一个老好人没有办法统领团队,一个人太仗义的人不适合理财,这两个错误我都犯了


    今年我的心态真的崩了,年纪轻轻就检查出了糖尿病。住院期间,今年这一堆事在脑子里转啊转,再加上得这病的都是老年人,和他们相处一个月,真的会被暮气传染。 

    我来北京15年了,现在开始怀疑自己,感觉自己做什么都做不成,能力驾驭不住野心。这段时间有个朋友给孩子换学区房,我突然意识到,就算我真的翻身了,我的下一代大概率还是如此,周而复始,无解。


    但可以明确的一点是,因为骨子里的自卑,我肯定会继续坚持,我给自己的时间至少还有半年到一年。直播带货这个行业在趋于规范化,我相信这个项目在春节前后就能听到让我振奋的消息。 

    不想未来35岁还去面试
    所以要坚持熬到产品上线
    Jeffrey | 26岁 互联网创业者


    入行五六年,经历过办公室政治,做过斗争下的牺牲品,陪同过初创公司从起步到遣散;从研究助理,到后端,再到主程(技术开发程序员),最后做全栈。我看清楚了,你再努力打工,明年买房换车的也只有你的老板。


    去年10月,我和目前一个合伙人做的小程序“国庆头像”意外收获了一波流量。这给了我一种指引,让我觉得只有自己做产品、运营下去,才能长久生存,不能去做外包,做一次收一次钱。


    12月我裸辞创业,选择了广州。跨年当晚,拉上了几个好友,祈求新项目新一年的起飞。这个项目简单说就是用自己做的小程序流量变现,再做一些增值付费服务。后来我组织了一次线上会议,讲解产品,我们当时约定,各自发挥长处,产品开发前后端互相监督,大干一场。


    谁知刚过不久,遇上了疫情,项目也搁置了。疫情持续到2-3月份,我还没敢把裸辞的事告诉家里,3月从老家回到广州,闷在宿舍,创作并且上线了几十个小程序。4月左右,我开始真正启动计划,分析竞品、体验竞品、拉拢合伙人,讲解自己的想法、设计产品和盈利模式,几个人注册了一家公司。


    说好的5个人合作,团队都是股东,但尴尬的是,大家没有聚到一起。有些合伙人一直是在职状态,只有我自己是全职策划、开发。但我理解他们,如果全盘扔下去,那就不是叫创业,而是赌博。赌赢了是运气,赌输了,是正常。

    现在公司有零星的收入,但只是杯水车薪,我也没给自己发工资。让我糟心的是,这种孤独的状态贯穿一整年,而且还会继续,规划好的产品,想着能在2020这个历史性的一年上线,眼看还有几天了,却不能如期上线。一鼓作气,再而衰,三而竭,但我相信项目不是失败,只是还没成功


    好在,我今年挺过来了,我觉得自己只能靠这行起飞。因为我不想未来35岁还去面试,40岁被开除后没有收入来源,没有依靠。 

    PART3
    绝地求生的方法

    靠出租电脑、改造电竞房
    网咖店艰难回血
    钟炎烈 | 37岁 艾尔文网咖创始人 

    我们公司做的是智能网咖连锁店,也就是电竞线下场馆。目前我们在泉州有30多家门店。 

    春节前两个月,我们新开了12家直营门店。本来我们已经苦苦挣扎一年多了,传统模式成本高,一度我们公司困难到创始团队只领一块钱工资。去年底找到了现在的新模式,刚刚得到验证,终于走出困境,还投入近千万做了改造。 

    疫情来的时候,我们账上只剩下10万块现金。本来30多家门店一天收入就有8万,我们没有过多的现金储备,而且我们刚刚开了那么多店,所有的钱都投进去了。疫情一来,业务直接停摆。30家门店的房租,总部的工资、工程款、电脑款等都要支付。 

    我们先跟房东谈判,房租暂缓了,然后赶快开始裁员,每个门店只保留两个员工,减少支出,总部没裁员,因为组建团队不容易,但是员工第一个月工资只有30%,后面陆续发到60%。 

    疫情期间很多人要隔离,第一个14天,第二个14天,第三个14天,感觉离疫情结束遥遥无期。 

    也是穷则思变,没办法的情况下我们开始做电脑出租,把电脑送货上门给客人在家里玩。一方面电脑出租有收入,另外有押金,这就增加现金流了。 

    后来我们发展很多酒店也是闲置的,我们就跟酒店合作推出了电竞房。不会有大量人员聚集,收入我们跟酒店五五分,毕竟有一些有条件的重度用户疫情期间还是愿意玩。 

    复工的时候,因为泉州有个酒店发生了坍塌事件,我们又不能开业了。但我们已经到了生死边缘,为了生存,我们组织了一些商家沟通协调,最终推动了我们的线下店全面复工。 

    整体上来看,刚开始就是我们最难的时候,但是两个多月以后,特别是酒店电竞房做出来了以后,我们就有生存能力了,到后面我们一天都有2万多收入。那时候全行业都停了,其他网吧的顾客没地方去也都被我们吸引过来了。 

    整个过程我们在同行中跑得最快,在同行业务下滑50%的情况下,我们用最快的速度恢复到了百分之八九十,现在有很多门店已经超出去年的盈利水平。 

    裁员自救,把运营和销售换成了AI
    老王 | 33岁 AI测肤企业联合创始人 

    我的这家公司创立于2019年,为医美行业提供技术支持,专注于女孩子拍张照片就能测肤质、脸型、颜值的算法。由于B端业务运营非常复杂难懂,融资就没那么容易。另外,去年很多甲方收缩预算,我们的账期也延长了,现金流告急。 

    我评估了一下,觉得运营和销售人员对于公司当下解决现金流困难的作用不大,就开掉了3名销售、运营和视频拍摄人员。有一句话我一直特别认同:当创业者不再关注模式和梦想,而是开始关注现金流,就说明这家公司,真的变成了一家公司,而非模式创新的一场赌博。 

    在这种危险的情况下,我赌了一把:用技术代替销售和运营大部分的工作。我偏执地认为:一家公司,有60%-70%的事情都能用技术来解决。人力成本过重的企业,很难熬过2020。而我们自身又是做人工智能的企业,这种自救思路其实也顺理成章。 

    我们的转型路径是——把一切重复的、浪费时间的工作交给技术部门,不追求技术做到极致,达到人的百分之六七十的能力即可,把大部分的钱都投给技术部门,做到一个技术大约能代替3个运营,让技术提升工作效率,提升到不能再提升的时候,再请更专业的人才。


    这件事听起来挺不可思议的,一开始也遇到过波折,比如运营需要综合理解销售、市场、产品的业务,而技术的理解很多时候是单线条的,但是没关系,从最初“呆头呆脑”的版本不断迭代优化,现在技术能代替销售和运营40%和50%的工作,每个月还会上涨将近2%,会越来越省力。 

    目前来看,这步算是赌对了。至少我们活下来了,有了稳定的收入,现金流转正,也不担心融资了。 

    另外,疫情期间我意外地开辟出一条获客的方法——创始人亲自下场写文章。因为疫情,没法出门聊业务,又裁掉了以前能帮我产出内容的小伙伴,但我又有很强的表达欲,就给一些大的互联网资讯平台投稿,因为当时VC趋冷,我就从客户的需求角度出发,写了一篇文章,阅读量很不错,后来也确实因此吸引来了客户。 

    使出浑身解数,大胆寻求变革的路径,我们最后在这奇幻的2020中活了下来,还验证了我们的业务模型设想,回过头来看真的是万万没想到。 

    发展副业给员工发工资
    也是在尝试转型
    Jack | 31岁 外贸公司创业者 

    外贸行业,订单就是生命线,公司没有订单就像人在ICU,心电监测仪变成了横线,今年我们公司的状态就是,还在喘气,偶尔有一些订单维持着。 

    我们是做户外手推车产品的,从工厂拿货,做B端的批发。疫情之后3、4个月都没有订单,今年一年公司赔了70多万,原来公司有13个人,现在只剩下4个人了。 

    从3月开始,每天我的脑海里都有这样一个念头——这个公司可能要完了。最绝望的时候焦虑到天亮才能睡着,感觉我把脑子里的一团乱麻理明白了才能入睡,晚睡让我有安全感。 

    所有的焦虑完全都是我一个人扛着,员工每个月照常拿工资,他们不会觉得公司快不行了。之前还有女朋友会鼓励我,后来她觉得我不适合创业,也因为忙于工作,疏于和她互动,两个人就分手了。至于家人,压根不知道我创业,他们一直以为我在上班。因为我的父母观念比较传统,觉得稳定最重要,我不想让他们担心,就一直没告诉他们。 

    活得这么痛苦的情况下,之所以没有散伙打工,就是因为自己还是不甘心,总觉得还能在方法和产品上找到翻盘的机会。而且团队已经搭起来了,也联系上一些工厂和客户资源了,不想轻易地扔掉。每个创业者可能都会有这样一种心态——创业越久,越不想轻易承认自己失败,还是会挣扎一下。 

    前段时间有个朋友和我说想创业,我一开始还告诫他:你想明白了再做。但最近我想明白的一件事就是——创业永远没有想明白的时候,很多如今头部的一些公司,他们创业时候也没有想明白很多东西,只不过他们可能资源更好一些,用一个故事就可以打动别人。我现在的态度变成了,如果真的想创业就去做吧,遇到问题,解决问题就好了。 

    为了不让这家公司倒掉,能每个月按时给员工发工资,我一直在消耗自己的积蓄。而且我还会自己找赚钱的路子——比如我有网站优化方面的特长,会接一些网站搭建、优化的活儿,目前服务了几个客户,收入还不错,想着再找一些同行,为他们做服务。这也是探索公司转型的一次尝试吧,以后也有可能重点发展网站优化这块业务。 

    半年没一分钱收入
    工作室从拍短片转型长片储备
    Arkay | 26岁 影视工作室 

    我从传媒大学毕业没几年,和同学一起开了一个工作室,拍广告和短片。 

    4月份,刚花20万在高碑店文化园租下三层楼,一层办公,一层拍摄,一层住宿。前几个月疫情短暂性缓解,行业有所好转,我们都有点松懈,但没想到在资金回转的关键性节点,北京第二次疫情把所有计划都打乱了。 

    当时,我们手里的项目黄了一半,去年项目的十几万尾款一直到不了账,今年直到7月份,工作室还没有一分钱收入。而且那个时间点又快交下一波房租了,我们手里的钱,基本上都耗尽了。我找最好的朋友,开口借了10万,第一次借这么大一笔钱,勉强熬过去了。 

    这次疫情促进了团队的转型。首先,广告和短片的制作,本身已经到了瓶颈期,如果继续下去,可以预见未来很长一段时间,我们不会死,但也不会有爆发。这些对于我们这些想做电影创作的人而言,没有太多能力提升上的帮助。

     所以,我们准备先把这部分原有的业务暂停,集中精力做长片剧本内容开发。这个不需要场地,等房租到期可以退租,也能节省人力,轻量化办公处理。目前收到了一部分尾款,按照这个计划,资金坚持到明年年中应该是可以的。

     这一年,在北京的同行朋友少了很多,他们要么转行了,要么回老家了,太多人没坚持住,身边一下子就冷清了。 

    我热爱这个行业,无论如何都会把这行做下去的,只是需要做一些取舍。经历这一遭,我觉得自己还是不太适合做商业,坚定了要实打实做内容创作者的信念,也算是收获吧。 

    最糟糕的一年出来创业
    但好的内容还是有市场
    李岚峰 | 30岁 语问教育创始人 

    在今年这个所谓最糟糕的一年,我决定出来创业了,做的是一家K12 To B的内容公司。 

    当时的判断是,在中国这几十万家培训机构中,除了极少数的玩家有自己的研发之外,很多中小型机构其实是没有研发实力的。而从To B这个大方向来说,我是觉得行业发展到一定程度,一定会出现行业分工。所以就想着切入到教培行业To B的内容赛道上。 

    结果,真正试水之后才发现,现实要比想象中困难得多,今年整个教培行业受到的冲击挺大的。 

    为了宣传我们的企业和产品,我们报名参加了一个行业的展会,为此认真地筹备了几个月的时间报名,希望能够得到行业的认可。会展当天我们兴致冲冲地去了,想着肯定能签不少客户,甚至打印了合同,把乙方的名字都签了上去。 

    没想到竹篮打水一场空,整个展会一个单子都没有,零成交量。后来我问了同展会的人,零成交的参展商非常多。而且大家都普遍表示今年比去年到场的人次成交量都降了很多。去年一个口才类的项目一天就签了二三十单,结果今年连三分之一都没有。 

    那次受到的打击真的是非常大。我一度怀疑自己的创业选择是否是正确的,每晚都睡不着觉,每天都在焦虑,“万一我带着我的团队、我的兄弟们干,最后只干了几个月项目黄了这可怎么办?“所以也不敢轻易地说放弃,每天都逼着自己想公司的哪些地方可以再完善一点,战略上是否可以再做调整。 

    真正的转折点是前段时间签了几个客户,尽管成交量不大,但这是个非常积极的信号。尤其是有一个客户,他们自己开车从河北香河来到北京,专门坐下来听我们讲产品和创意理念。原本计划是半个小时就结束了,最后越聊越起劲,我把我们教学总监也叫来一起聊,聊了三个小时,而且现场就签了合同。 

    说实话这个客户让我们团队开心了好久。因为这些客户相当于放弃了很多巨头的产品转而选择和我们合作,说明我们的产品是有市场竞争力的,说明创业找对了方向。 

    创业将近半年的时间,距离我当初定的目标还有一些距离,但是整个公司还是逐渐在走向正轨。对于创业者来说,在整个大环境不好的情况下,寻找能够匹配你的能力和市场需求之间的平衡点是非常重要的。目前看来,我当初下海抄底的决策还是很正确的。

    PART4
    艰难中的憧憬与希望

    借钱、抵押
    在资金快耗尽时拿到融资
    Leon | 26岁 游戏公司创始人 

    我从去年开始创业,公司做游戏开发,一开始我们找了一个个人投资人,拿了100万的启动资金,我和合伙人又凑了100多万。当时我们的计划是,等游戏开发出来,我们再去外面找公司拉投资。 

    游戏圈是这样的:产品开发出来后,一些公司会根据经验判断这款游戏能不能火,如果觉得能赚钱,有意向的公司就会购买这款产品或购买部分公司股权。每一款产品都像一个独立的商品,游戏不上线,公司就没有任何收入。 

    从去年到现在,我们一直在开发一款手游,现在还没上线。疫情期间本来对在线游戏是利好,但我们产品没上线,错过了这波流量,而且因为在家办公,游戏开发进度耽误了2个月。 游戏开发非常烧钱。今年10月的时候,公司账上的资金就已经见底了。当时我跟合伙人两个人到处去借钱,我向家里借了20万,合伙人把新买的车抵押了,又通过其他渠道一共借了几十万。靠着凑来的这笔钱,我们公司撑到了现在。 

    这有一种破釜沉舟的感觉,我们对自己的产品有信心,所以一定要撑到把产品做出来,让那些发行公司看到我们的产品。我们前期已经烧了200万,要是中途放弃那这些钱就打水漂了。 

    这期间有一家公司一直在跟我们谈,但对方一直没说要投资,我们知道他们是故意在拖,因为我们这边资金越困难,他们手上的筹码就越多。最后我们拿到融资时,这款产品作价是非常廉价的,原本只用出让10%的股份,但我们出让了20%。没办法,公司缺钱,主导权在对方手上。 

    在拿到融资之前,我从大学开始谈了四年的女朋友也提出了分手,自从创业后,我跟她相处的时间就变少了,也没有太在乎她的感受,创业一年多公司一直烧钱,女朋友说她看不到未来。我挽留,但已经太晚了。我们本来养了两只猫,女朋友走的时候带走了一只,剩下的这只猫也孤独了。那段时间连续两周我每天凌晨四五点才能睡着,第二天7点多就要赶到公司。 

    游戏行业竞争很激烈,以前是十不存一,现在可能是百不存一。一开始选择创业,仅仅是因为喜欢游戏,年轻人比较容易冲动,对别人开发的游戏总是要去挑刺,然后就总想做一款自己的游戏,有点跟别人不一样的东西。

     熬过了2020,我们拿到了融资,产品明年初上线,终于要开始推向市场了。 

    曾担心家长批量退课
    后来一个学员都没流失
    柒月 | 40+岁 心理类教育机构创始人 

    不是所有的创业都仅仅是为了赚钱。 

    我们去年9月开业,11月步入正轨,12月有了扩张计划——打算把对面400平米的场地租下来,增加针对更低龄孩子的业务,寒假的冬令营也筹备好了。故事的开头,顺风顺水。  

    之后疫情就来了。从2月到6月,我和老师们就在机构里一起打磨课程、布置教室、做饭拍照,很长一段时间没有出门:一边“自娱自乐”,一边期待着开课的那天到来。

    直到6月,之前一个经营得很好、师资也很好的教育机构突然退租不做了。之后我和我的合伙人去街上走了一圈,发现时尚集团旗下的书店、一个很大的家具品牌店也倒闭了。身边优秀同行、周围线下店的倒下,都给我的冲击很大。 

    本来以为6月可以复课了,房东还把大家聚在一起谈论复课之后的房租,结果第二天北京又出现了新发地的疫情。直到7月中下旬,才真正复课。 

    我们这家机构的会员不多,只有20多个,在整个过程中,只有一个会员因为要离开北京才提出了退费,其他家长都是问什么时候能开课的,这给了我们很大的信心。 

    复课第一天,有一个孩子进门第一句话就是,“老师,我回来了”,我当时特别感动。之前退费的那个孩子,北京疫情好转之后就回北京了,正好他回北京的第一件事就是过生日,他妈妈问他想要什么生日礼物,他说的竟然是想回来上课,他妈妈就带着他来了。 

    在战疫自救的过程中,我们有了很多意外的收获,让我觉得坚持是对的:比如疫情期间,我们现金流吃紧,但还是出资送一名老师去培训了,后来她成为了我们这边的业务主力;因为家长的口口相传,我们的会员也从20多个发展到了80多个;之前为了过渡做的线上课,疫情之后从北京做到了省外…… 

    经历过这些之后,我想对创业者们说:遇到困难的时候,想想创业的初心,考虑好风险和成本之后,如果能坚持下来,就可能看到奇迹发生。 

    过去我在工厂车间摸爬滚打
    现在被迫拥抱互联网
    徐项飞 | 39岁 家居品牌创始人 

    我是做家居品牌商品的,有一家自己的工厂。前几年行业都很平静,每年几百万销售额,接近一百万的净利润,虽说不像很多大老板赚大钱,但生意总体还不错。 

    过去十年我都是做实体,没做过互联网,因为不太懂,也不知道怎么做。疫情期间,工厂停工,经销商关门,实体店倒闭,逼着我去拥抱互联网。上半年听说直播带货很火,人都在直播间买东西,不去实体店买了,于是我就在公司组建了一个直播小组,带着大家做直播带货。 

    但说实话我们都不懂怎么做直播,我们一帮在工厂车间摸爬滚打了十几年的人,站在镜头前根本不知道说什么,手都不知道往哪放,笑起来也觉得尴尬,镜头画面放多大,身体露出多少比例,完全没概念。我们店里那几个销售员,平时是销冠,跟顾客介绍起产品来头头是道,但直播的时候就站那不动,显得非常僵硬,感觉不是那个意思。 

    于是我带头让大家快速学习,我把大家关在会议室里,连续看了一周的直播带货,各种大小主播都看了,我让大家做笔记,每天总结心得、出策划,然后我们就对标觉得不错的主播来模仿。销售当主播、前台当主持、运营来拍摄,还有人串场,于是草台班子就这样搭起来了。 

    我们前后筹备了一个多月,做了三场直播,效果还不错,虽然销量不是很大,但来自经销商的反馈很好,有一些经销商还找过来向我们取经,想让我去给他们讲课,他们也想学直播带货。这次直播带货的尝试,算是在疫情这样的极端环境下,我们公司团队的一次大胆尝试,锻炼了我们探索新业务、拥抱互联网的信心,我打算把这项业务长期做下去。 

    而且我发现了一个新市场,实体行业的小老板们很多也想尝试直播带货,但完全摸不着头脑,他们急需要人指导,也愿意付费接受培训,所以我在考虑是不是可以做一个直播带货培训课程,专门针对实体小老板,就讲怎么实操,不玩虚的,帮他们解决实际问题。 

    这一年很多实体小老板都过得很艰难,在疫情面前、在互联网面前,很多人手足无措,过去的经验失效,新的技术又不知道怎么迎接,逼着我们去做一些改变,去学习新的技术手段和营销方式。所以危机中也是有机遇的,只有抓住大势,才能找到新的业务方向。 

    国庆档拉了影城一把
    现在期待春节档
    李柳 | 34岁 某私人影城店长 

    最近来武汉透透气,回去再面对局面。 

    2月份,影院全面停工,一熬就是六七个月。7月16号,正式宣布影院能复工后,朋友圈有了那几个月里唯一一次喜庆。之前各种小道消息满天飞,有一次有一张大地影院的海报流出,说7月20号复工,当天还上了微博热搜,后来大地影院出来辟谣,那时候大家都被折磨得不想问,不想说话了。 

    我做这行快10年,影城开了三年。停工这些天,14个基层员工都差不多离职了,有去做保险业务员的,有做微商代理的,有个卖二手车去了,还有自己创业开饮料店的,店长也转行去外地的食品企业了。我理解他,毕竟要养家糊口,走的时候特意请他喝了一顿,道个别。 

    我们当老板就属于苦熬着的。天天都感觉撑不住,但这也算重资产,投入了八百万,只能继续熬。 

    从2月停工起算,近8月复工,我们要负担人力和房租,和房东协商免除了3个月,剩下的房租和人力工资,保底亏了40万左右,直到现在,房租有小部分还是欠着的。 

    虽然8月复工了,跟房东商量降租金30%,那时政策要求上座率不得超过30%,不能卖零食,情况也很难。除了国庆节那个月收入和支出基本持平,剩下8、9、11、12月还是亏着的,虽然《八佰》看起来比较给力,但其实状况都差不多,一直没很出彩的片子来。我之前对《金刚川》抱了很大希望的,不过后面也没有特别好。复工后,加上房租和人力成本,又亏损了30多万。 

    现在也还是继续贴钱,这些钱都是我们自己七拼八凑的,近一半是我们的个人贷款。 

    本来12月初,《紧急救援》和《神奇女侠》上映,我还是挺期待的。结果两部A+级影片,上映一周了,两部加起来票房才5亿,远远不及预期。现在新片《晴雅集》、《送你一朵小红花》还只能观望。 

    我心里焦虑,但是从不对外显露,日子总得过。现在就期待着过年疫情不再反复,指望着春节档几部大片,能再收点钱补贴明年的,不然明年就没得熬了。 

    当地老板思维固化
    但我还是想帮云南品牌走出去
    思祺 | 30岁 新零售企业服务创始人 

    我们是一家提供新零售增值服务的企业,原本是想帮助云南本地的一些农副产品企业走出云南。 

    云南这边有很多纯天然绿色的产品,营养价值很高,相应的价格也很高,但这些产品的品牌很弱,就是土特产,放到市场里和其他产品比,产品价格又高,外包装又不行,品牌又不行,没有任何竞争力。 

    原本我们是看好国家对云南特产的扶持号召才来的这里,但这个项目做起来比想象中难得多。一开始我没想到,本地企业对品牌升级这件事这么抗拒,这个项目做了4年, 当地一些企业主的思维还是没有转变过来。


    只有那些大企业,像云南的嘉华、白药、褚橙,才会稍微做一些营销,中小企业只想看到实际的收益,根本不在意品牌的价值。尤其是今年受疫情影响,他们都在求生存求盈利,会觉得品牌营销都是很虚头巴脑的东西。他们愿意把人员和经费都投入在市场渠道上面,因为能预估出来自己的收益是多少,但就是没有人做品牌。 

    其实对于特产来说,产品有了品牌力,才能更好的在线上打开市场,同时,我们还会从产品的克数、包装形式、设计主题进行一套的梳理,最后是会增加收入的。 

    在跟客户的谈判过程中,也会有很多问题。比如最近我跟一个做刺梨果原液的客户聊完,建议他们换包装。我能感觉出来老板自己也知道包装不好,细问之下他才说了实话,印厂已经做了一大批包装,难道要全部扔了重来?我们还设计了一个套盒里面放12瓶小瓶装,类似小罐茶,搭配星座系列,但老板没法接受。 

    今年疫情期间,大家都在尝试直播,我们早就找过薇娅,选择头部主播销量有保障,但沟通几次,老板还是嫌贵。后来他们找了云南这边的直播基地,有一些几十万粉丝的小网红,坑位费只要一两万,但带货能力不行,企业参与完感觉很不好,钱白花了。 

    其实这边也来过上海的几家设计公司,最后都没办法开展业务,撤走了。我们的收入这些年也只能勉强活着,但我还是会坚持下去,一点一点啃,因为我真心觉得,这些产品值得出圈。 

    *题图及文中配图均来源于Pexels。应受访者要求,文中夏丽、海文、王勉、叶均、张谦、老王、Jack、Arkay、Leon、柒月、徐项飞、李柳、思祺为化名。

  • VMware问题:无法获得VMCI驱动程序的版本:句柄无效。驱动程序vmci.sys的版本不正确。请尝试重新安装VMware Workstation。

    VMware问题:无法获得VMCI驱动程序的版本:句柄无效。驱动程序vmci.sys的版本不正确。请尝试重新安装VMware Workstation。

    Visits: 13

    环境信息:VMware Workstation:V15.5.2

    问题现象:VMware报错信息:无法获得VMCI驱动程序的版本:句柄无效。驱动程序”vmci.sys”的版本不正确。请尝试重新安装VMware Workstation。模块”DevicePowerOn”启动失败。未能启动虚拟机。

    解决方案:1. 根据配置文件路径找到对应的.vmx文件,如下图示:

    2. 用文本编辑器打开,找到vmci0.present = “TRUE”这一项,并且将其修改为vmci0.present = “FALSE”

  • 我是如何解决使用Shadowsocks代理后,浏览器报“500 Internal Privoxy Error”的问题

    我是如何解决使用Shadowsocks代理后,浏览器报“500 Internal Privoxy Error”的问题

    Visits: 373

    起因:

    今天在搭建好shadowsocks后,进行客户端访问连接时,一直无法正常连接。浏览器报错如下:

    500 Internal Privoxy Error

    Privoxy encountered an error while processing your request:

    Could not load template file no-server-data or one of its included components.

    Please contact your proxy administrator.

    If you are the proxy administrator, please put the required file(s)in the (confdir)/templates directory. The location of the (confdir) directory is specified in the main Privoxy config file. (It’s typically the Privoxy install directory).


    解决过程:

    1. 排查客户端的ip,端口,密码,加密等各参数是否正确

    2. 服务端开启端口访问权限

    3. 服务器端禁用防火墙

    4. 完善C:\Windows\System32\drivers\etc\hosts文件信息所有能排查的,解决的都做了,但是问题依旧存在,所以就开始查看自己的环境信息。

    由于我的服务器是采用的阿里云的香港VPS,所以就登录到阿里云后台查看每一项,果不其然,发现有专门设置防火墙的地方,如下图:

    所以,在其中添加规则后,稍等几分钟后,重新连接shadowsocks客户端就正常了。大家可以单独增加自己tcp端口号,根据安装后的端口即可,也可以开通全部的tcp+udp端口,各人根据自己的情况添加规则即可,至此,该问题完美解决。

  • WordPress数据库经常报“Error establishing a database connection”错误

    WordPress数据库经常报“Error establishing a database connection”错误

    Visits: 8

    最近在个人站点上编写文章或者上传图片时,时不时的就处于宕机状态,网站访问不了,几分钟后就报“Error establishing a database connection”错误,遍寻整个网络,现将该问题的一些解决方案整理如下,至于哪个能解决自己的问题,碰到该问题的同学可以逐一排查,废话不多说了,总结如下:

    现象:

    可能原因及解决方案:

    1. 我自己首先是将几个无用的wordpress插件都禁用了,然后再留意是否有该问题现象,目前暂未出现过该问题

    2. 一般个人站点都是用的vps,此时可以登录控制面板,看能否远程连接到服务器,如果不能的话,那么可能是服务器挂了导致的,如果能登录到服务器,那么就检查一下mysql进程是否存在,不存在的话就启动mysql

    3. 检查磁盘空间是否满了。一般个人站点的vps各项配置都很少,所以经常会出现各种各样的问题

    4. 检查站点配置文件的用户名和密码是否与数据库中的信息一致,配置信息在wp-config.php这个文件当中

    5. 这个报错是数据库连接时的错误,如果以上步骤都排查过了,那么可以试下以下方法:这种问题现象一般由以下几种情况产生:

    1)数据库登录凭证错误或已更改,数据库服务器无响应,数据库已损坏。

    2)网站流量过大时,也会出现数据库连接错误。

    3)服务器多个服务影响,可以访问其他服务看看是否正常,判断是不是数据库服务器导致的。

    4)用户的权限是否足够。

    5)是否设置了拒绝远程连接。

  • 如何解决WordPress模板将双中横线“–”转义成了单中横线的问题“-”

    如何解决WordPress模板将双中横线“–”转义成了单中横线的问题“-”

    Visits: 2

    今天在浏览自己写的文档的时候,发现复制粘贴命令执行后报错,仔细一看,命令中的–在页面中显示为单横线-,结合网上的几个方法,找了一个最简单适合的方案,问题解决。

    现象:

    譬如WordPress后台编写的代码为:
    ./config shared –openssldir=/data/install/openssl –prefix=/data/install/openssl
    但是编写完发布后,在浏览器中显示为:
    ./config shared -openssldir=/data/install/openssl -prefix=/data/install/openssl
    莫名的少了一个横杠,就会产生问题

    原因:

    网上的说法,主要是WordPress的标题或者正文当中,如果带有横杠“-”的话,查看页面源代码title的时候就会发现横线会被转义为”–”,正文就会看到少了一个横杠。

    解决方案:

    方法一:禁用所有的 WP 转义

    wordpress 自带一个专一的钩子 wptexturize,很多地方都用到了这个钩子,具体可以看看 wp 的 wp-includes/formatting.php 中看看。我们可以通过以下代码(取自水煮鱼)来取消掉这个转义:

    add_filter( 'run_wptexturize', '__return_false' );

    我是增加在如下图示的位置:

    方法二:禁用部分的 WP 转义(推荐)

    为了解决本文标题描述的这个问题,可以只是禁止 wptexturize 对标题的转义:

    /** 
    * WordPress 标题中的横线“-”被转义成“–”的问题 - 龙笑天下 
    * https://www.ilxtx.com/wordpress-html-entity-decode-title.html 
    * 20181213 更新:wp_title、single_post_title、single_cat_title、get_the_title、single_tag_title 
    */ 
    remove_filter('the_title', 'wptexturize'); 
    remove_filter('wp_title', 'wptexturize'); 
    remove_filter('single_post_title', 'wptexturize');

    方法三:把下方代码复制放到 function 文档里:

    function HTML_entity_decode_title($title) 
    { 
        $title = str_replace("–", "-", $title); 
        $title = html_entity_decode($title); 
        return $title; 
    } 
    add_filter('the_title', 'html_entity_decode_title'); 
    add_filter('wp_title', 'html_entity_decode_title');
  • CentOS 8.x编译安装privoxy

    CentOS 8.x编译安装privoxy

    Visits: 80

    一、privoxy简介

    Privoxy是一款带过滤功能的代理服务器,针对HTTP、HTTPS协议,经常跟Tor组合使用。通过Privoxy的超级过滤功能,用户从而可以保护隐私、对网页内容进行过滤、管理cookies,以及拦阻各种广告等。

    privoxy可以用作单机,也可以应用到多用户的网络,privoxy可以把SOCKS5转换为HTTP代理,也就是俗称的APN。

    Privoxy 官网地址: https://www.privoxy.org/

    二、安装编译工具和依赖

    #  yum  -y install  make  gcc  

    # yum  -y intall autoconf 

    # yum -y install zlib  zlib-devel

    zlib指定版本的编译安装,请移步以下地址:详解CentOS 8.2 图文源码安装zlib 1.2.11

    三、下载

    Privoxy 3.0.29 stable源码下载: http://download.youceba.com/d/25806543-42162798-b24893

    四、编译安装

    useradd  privoxy  -r  -s /usr/sbin/nologin
    tar -zxvf privoxy-3.0.29-stable-src.tar.gz
    cd privoxy-3.0.29-stable
    autoheader
    autoconf
    ./configure --prefix=/data/install/privoxy
    make && make install
    

    查看编译后的生成文件

    ll /data/install
    ll /data/install/privoxy/
    ll /data/install/privoxy/sbin/
    ll /data/install/privoxy/etc/

    五、配置Privoxy

    vim /data/install/privoxy/etc/config

    找到以下两句,确保没有注释掉

    listen-address 127.0.0.1:8118   # 8118 是默认端口,不用改,下面会用到
    ,如果要给局域网其他代理用,需要修改为0.0.0.0:8118
    forward-socks5t / 127.0.0.1:0 . # 这里的端口写 shadowsocks 的本地端口(注意最后那个 . 不要漏了)

    六、启动Privoxy

    方式一

    启动privoxy

    #  /data/install/privoxy/sbin/privoxy  –user privoxy   /data/install/privoxy/etc/config

    设置开机自启

    # chmod +x /etc/rc.local

    # echo  “/data/install/privoxy/sbin/privoxy  –user privoxy   /data/install/privoxy/etc/config”  >>  /etc/rc.local

    # echo  “exit  0 ” >>  /etc/rc.local

    # ps aux | grep privoxy

    # ss -tan | grep 8118

    开启系统代理

    vim /etc/profile

    添加以下语句:

    export http_proxy=http://127.0.0.1:8118       #这里的端口和上面 privoxy 中的保持一致
    export https_proxy=http://127.0.0.1:8118

    执行以下命令,使配置文件生效:

    source /etc/profile

    方式二(推荐)

    编写privoxy的unit文件

    #   vim   /etc/systemd/system/privoxy.service

    ######################################################

    [Unit]

    Description=Privoxy Web Proxy With Advanced Filtering Capabilities

    Wants=network-online.target

    After=network-online.target

    [Service]

    Type=forking

    PIDFile=/run/privoxy.pid

    ExecStart=/data/install/privoxy/sbin/privoxy  –pidfile /run/privoxy.pid –user privoxy  /data/install/privoxy/etc/config

    [Install]

    WantedBy=multi-user.target

    ########################################################

    # systemctl daemon-reload
    
    # systemctl enable privoxy
    
    # systemctl start privoxy
    
    # systemctl status  privoxy

    七、放开相关端口

    如果要给局域网内其他机器做代理用,配置文件中 listen-address 设置为 0.0.0.0:8118,需要放行!

    # firewall-cmd  –permanent –add-port=8118/tcp

    #  firewall-cmd –reload

    八、测试生效方法

    curl -I www.google.com  #返回状态码为200,则表示成功
    curl www.google.com   #返回一大堆html,则表示成功

  • 详解CentOS 8.2 图文源码安装zlib 1.2.11

    详解CentOS 8.2 图文源码安装zlib 1.2.11

    Visits: 82

    简介:

    zlib is designed to be a free, general-purpose, legally unencumbered — that is, not covered by any patents — lossless data-compression library for use on virtually any computer hardware and operating system. The zlib data format is itself portable across platforms. Unlike the LZW compression method used in Unix compress(1) and in the GIF image format, the compression method currently used in zlib essentially never expands the data. (LZW can double or triple the file size in extreme cases.) zlib’s memory footprint is also independent of the input data and can be reduced, if necessary, at some cost in compression. A more precise, technical discussion of both points is available on another page.

    zlib was written by Jean-loup Gailly (compression) and Mark Adler (decompression). Jean-loup is also the primary author of gzip, the author of the comp.compression FAQ list and the former maintainer of Info-ZIP’s Zip; Mark is also the author of gzip’s and UnZip’s main decompression routines and was the original author of Zip. Not surprisingly, the compression algorithm used in zlib is essentially the same as that in gzip and Zip, namely, the `deflate’ method that originated in PKWARE’s PKZIP 2.x.

    zlib被设计成一个免费的、通用的、法律上不受阻碍(即没有被任何专利覆盖) 的无损数据压缩库。zlib几乎适用于任何计算器硬件和操作系统。zlib本身的数据格式可以进行跨平台的移植。 与在Unix上适用的LZW压缩方法 以及 GIF 图像压缩不同, zlib中适用的压缩方法从不对数据进行拓展。(LZW在极端情况下会导致文件大小变为原来的两倍、甚至三倍)。zlib的内存占用也是独立于输入数据的,并且在必要的情况下可以适当减少部分内存占用。

    zlib 适用于数据压缩的函式库,由Jean-loup Gailly (负责compression)和 Mark Adler (负责decompression)开发。Jean-loup也是gzip的主要作者,是comp.compression FAQ列表的作者,也是Info-ZIP 的zip前维护者;Mark也是gzip和UnZip的主解压例程的作者,也是Zip的原始作者。毫不奇怪,zlib中使用的压缩算法与gzip和Zip中的压缩算法本质上是相同的,即源自PKWARE的PKZIP 2.x的“deflate”方法。

    说明:

    zlib是系统的底层库,如没有必要,一定要在了解的基础上进行安装或者升级,以免出现问题,在进行操作之前,一定要了解其风险,如果操作不当,会导致很多命令无法使用,甚至系统无法重启


    由于需要安装nginx,并且nginx是使用zlib对http的内容进行gzip,而zlib库恰巧也提供很多的压缩和解压缩的方式,所以需要在centos上安装zlib库,前提是系统没有自带zlib,或者系统自带的版本不符合自己的需要

    方法一源码安装:

    1)获取zlib编译安装包,在http://www.zlib.net/上可以获取当前最新的版本

    wget http://www.zlib.net/zlib-1.2.11.tar.gz

    如果以上地址无法下载或者下载慢的话,可以从以下地址下载对应的zlib文件并且上传到个人服务器进行后续操作http://download.youceba.com/dir/25806543-41266780-396a33   

    2)解压缩zlib-1.2.11.tar.gz包

    tar -zxvf zlib-1.2.11.tar.gz

    cd zlib-1.2.11    

    3)进入解压缩目录,执行命令

    ./configure –prefix=/data/install/zlib //手动指定zlib的安装目录,具体参数可以查看–help

        4)编译

    make

    5)安装

    make install

    注意:从输出可以看出,make install 这一步实际上是对编译生成zlib相关文件的一个分发,也就是将编译生成文件拷贝到相关路径,我们在做离线升级安装包的时候,直接拷贝这些命令加到脚本就可以了!

    6)执行以下命令,使之生效

    echo “/data/install/zlib/lib” >> /etc/ld.so.conf

    ldconfig

    查看ld.so.conf文件内容如下:

    至此,zlib就已经完全安装完毕


    方法二安装:

    yum install -y zlib zlib-devel


    常用备查命令:

    1. 查看zlib版本

    yum info zlib

    2. 添加lib库自动搜索路径并使之生效

    echo “/data/install/zlib/lib” >> /etc/ld.so.conf

    ldconfig

  • CentOS 8安装Shadowsocks客户端

    CentOS 8安装Shadowsocks客户端

    Visits: 498

    前言

    本文介绍的是在 CentOS 上安装 shadowsocks 客户端的过程,最终实现的也就是当前 CentOS 通过其他服务器的 Shadowsocks 服务联网,非在 CentOS 上安装 shadowsocks 服务端的过程,因此你需要一个已经能翻墙的 shadowsocks 服务端。

    安装 pip

    Pip 是 Python 的包管理工具,这里我们用 pip 安装 shadowsocks。

    yum install python3-pip python3-setuptools
    pip install shadowsocks
    

    配置 shadowsocks

    新建配置文件:

    vi /etc/shadowsocks.json
    

    填写以下内容:

    {
        "server":"your_server_ip",      #ss服务器IP
        "server_port":your_server_port, #端口
        "local_address": "127.0.0.1",   #本地ip
        "local_port":1080,              #本地端口
        "password":"your_server_passwd",#连接ss密码
        "timeout":300,                  #等待超时
        "method":"rc4-md5",             #加密方式
        "fast_open": false,             # true 或 false。如果你的服务器 Linux 内核在3.7+,可以开启 fast_open 以降低延迟。开启方法: echo 3 > /proc/sys/net/ipv4/tcp_fastopen 开启之后,将 fast_open 的配置设置为 true 即可
        "workers": 1                    # 工作线程数
    }
    

    修改后的文件内容可以参考以下Demo,一定要去掉上文的注释内容:

    {
        "server":"8.210.167.71",
        "server_port":5800,
        "local_address": "127.0.0.1",
        "local_port":1080,
        "password":"*******",
        "timeout":300,
        "method":"aes-256-gcm",
        "fast_open": false,
        "workers": 1
    }
    

    启动shadowsocks服务

    sslocal -c /etc/shadowsocks.json
    

    如果系统报错如下:ERROR method aes-256-gcm not supported,说明SS客户端2.x系统不支持该种方式的加密,只有3.0及以上才有该加密方式。
    下载3.0可以通过

    pip3 install https://github.com/shadowsocks/shadowsocks/archive/master.zip -U

    设置shadowsocks开机自启

    sudo vim /etc/systemd/system/shadowsocks.service
    

    填写如下内容:

    [Unit]
    Description=Shadowsocks Client Service
    After=network.target
    
    [Service]
    Type=simple
    User=root
    ExecStart=/usr/bin/sslocal -c /etc/shadowsocks.json
    
    [Install]
    WantedBy=multi-user.target
    

    配置生效:

    systemctl enable /etc/systemd/system/shadowsocks.service
    

    测试

    运行curl --socks5 127.0.0.1:1080 http://httpbin.org/ip
    如果返回你的 ss 服务器 ip 则测试成功:

    {
      "origin": "8.210.167.71"   #你的Shadowsock服务器IP
    }
    

    安装 Privoxy

    Shadowsocks 是一个 socket5 服务,因此我们需要使用 Privoxy 把流量转到 http/https 上。

    方法一:

    参考以下文档:CentOS 8.x编译安装privoxy

    方法二:

    直接使用yum安装即可:
    yum install privoxy
    安装好后,修改一下配置:
    vim /etc/privoxy/config
    搜索forward-socks5t
    forward-socks5t / 127.0.0.1:9050 .
    取消注释并修改为:
    forward-socks5t / 127.0.0.1:1080 .

    保存文件退出

    启动 privoxy

    privoxy /etc/privoxy/config
    或以指定用户如www运行privoxy:
    privoxy --user www /etc/privoxy/config

    设置privoxy开机自启

    sudo vim /lib/systemd/system/privoxy.service
    

    填写如下内容:

    [Unit]
    Description=Privoxy Web Proxy With Advanced Filtering Capabilities
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=forking
    PIDFile=/run/privoxy.pid
    ExecStart=/usr/sbin/privoxy --pidfile /run/privoxy.pid /etc/privoxy/config
    

    配置生效:

    systemctl enable /lib/systemd/system/privoxy.service
    

    配置/etc/profile

    执行vim /etc/profile,添加如下代码:

    export http_proxy=http://127.0.0.1:8118
    export https_proxy=http://127.0.0.1:8118
    

    修改后使配置生效:

    source /etc/profile
    

    测试生效:

    curl www.google.com
    

    返回一大堆 HTML 则说明 shadowsocks 正常工作了。
    备注:如果不需要用代理了,把 /etc/profile 里的配置注释即可。