来源:大虫运营心经 作者 : 花大虫 ---- 职业生涯前几年一直在做C端互联网相关的工作,这两年突然转做B端了,感受有很大的差异,但是却又有很大的相似性,To C的运营经验对To B的运营有巨大的帮助...(NPS(Net Promoter Score),净推荐值,亦可称口碑,是一种计量某个客户将会向其他人推荐某个企业或服务可能性的指数), 将客户成功作为公司的战略支点,各个团队围绕NPS这个指标做目标分解...这就是为什么很多SaaS公司前期可以靠市场红利,靠销售规模去赢得市场,到后期,客户续费率低,销售成本越来越高,导致亏损严重,就是这个原因。 据我了解业内有几家公司都遇到类似这样的问题。...而单纯的将成本投入在销售上只能带来新增客户的增长和短期收入的增长,无法带来客户留存和LTV的提升,也没有资金杠杆效应,一个公司无法形成组织发展的复利和产品的复利。...再举一个链家的例子: 请问各位链家的模式重不重,买卖房产的交易流程复不复杂? 贵吧,复杂吧,但链家的服务费贵不贵,为什么好多人吐槽链家收费贵还有大把的人愿意在链家买房、卖房?
本文围绕团队在产品质量攻坚工作中做的一些质量检查手段,介绍如何让你团队的代码质量可以量化,并保留最珍贵、可维护、可持续、可传承的工程化代码。...整合目标 本文除了让大家了解这些工具如何使用以外,还会重点描述如何组织这些代码质量的周边工具链使其达到工程化程度,讨论什么该做,什么不该做,为什么这么做。...即便你提供了所谓每天的自动化测试报告,貌似可以量化,但真正的作用谁有知道呢?虽然覆盖率统计并不能代表代码就是 100% 可靠的。...但它可以通过量化的数据告诉我们代码的哪些分支、哪些逻辑我们还没有覆盖,至少能让你知道,你的测试是不是在做一些无意义的事情。...MR,并且在你有问题的代码中添加评论,效果如下: 图片 图片 Pre-commit 集成 如果你的团队启用了 pre-commit-hooks,您可以添加如下脚本,在每次提交时就检查一次变更的文件,这样在没有上传代码到
这种模式非常常用,所以写了一个工具类,简化了这个步骤 场景描述 问题中有分类信息,但是默认保存在库表中的只有分类Id(categoryId),但是接口返回给调用方的时候,需要补充完整的Category...class Category { private Integer id; private String name; } 默认情况下,从数据库中查询问题列表时,只有categoryId,没有....build(); supplement.supplementWithConverter(questions, categoryManager::getByList); 使用这种方式可以减少很多胶水代码...对象设置器 * @param objMap ID到对象的Map * @param requireExists 是否要求必须(如果是,但是没有存在,则会抛出异常...{@link IllegalArgumentException}) * @param defaultObj 如果没有匹配到则使用默认值 * @param
注解(Annotation)就是一种标签,可以插入到源代码中,我们的编译器可以对他们进行逻辑判断,或者我们可以自己写一个工具方法来读取我们源代码中的注解信息,从而实现某种操作。...我们的注解就是一种元数据,根据它所起到的作用,我们可以大致将它分为以下三类: 编写文档:通过代码中标识的元数据生成文档 代码分析:通过代码中的元数据获取其中信息内容 编译检查:通过标记注解可以完成对代码块的检查...文件中是不存在这一行注解代码的,CLASS范围表示编译器编译之后,注解代码存在于class文件中,但是jvm在加载此class文件的时候会自动忽略掉这一行注解代码。...粘贴到此处并没有显示)表示此类不推荐使用,但是我们可以看到在子类Student上是没有删除线的,也就是父类废弃了,子类依然是正常的。...以上我们定义的是一个没有注解体的一个注解,像这样的注解我们叫做标记注解,这是表示一种标记,编译器根据某个类或方法是否具有此标记来判断是否要添加一些代码或做一定的检测操作。
本文给大家介绍一个Java代码简化的神器 -- Lombok。...根据Lombok官网的描述可以看出: Project Lombok是一个java库,其可以自动插入到你的编辑器和构建工具中, 使java代码更加生动。...在这个时候,使用@AllArgsConstructor注解的BookLombok 类将不用再修改任何代码。...如果新的源码文件是注解处理的结果,那么编译循环回到解析和输入阶段,重复这个过程,直到没有新的源文件生产为止。...Lombok也可以在诸多互联网公司的开源代码中看到,大家可以根据自身的需要进行选择。 另外,友情提示一下:如果你的项目组是需要统计代码量,建议还是不要用了 你懂得
嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 ? 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。...,执行子组件的逻辑 但是,golang里没有的继承的概念,要复用成员属性ChildComponents、成员方法Mount、成员方法Remove怎么办呢?...----------------------- //我的代码没有`else`系列 //组合模式 //@auhtor TIGERB //-------...我的代码没有`else`,只是一个在代码合理设计的情况下自然而然无限接近或者达到的结果,并不是一个硬性的目标,务必较真。 2....---- 我的代码没有else系列 更多文章 代码模板 | 我的代码没有else 链式调用 | 我的代码没有else 点击https://github.com/TIGERB/easy-tips/tree
嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 ? 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。...比如抽奖系统的抽奖接口,为什么: 抽奖的步骤是稳定不变的 -> 不变的算法执行步骤 不同抽奖类型活动在某些逻辑处理方式可能不同 -> 变的某些算法 怎么用「模板模式」?...------------ //我的代码没有`else`系列 //模板模式 //@auhtor TIGERB //------------------...//------------------------------------------------------------ //我的代码没有`else`系列 //模板模式 //@auhtor TIGERB...我的代码没有`else`,只是一个在代码合理设计的情况下自然而然无限接近或者达到的结果,并不是一个硬性的目标,务必较真。 2.
说到使用命令行操作脚本,这种完全是个人的习惯而已,很多老程序员都喜欢在命令行下调试代码,主要是以命令行的方式效率比较高,但在梳理代码的阶段还是图形界面的比较方便,毕竟直接可以看到脉络的结构,命令行的操作方式需要建立在对于命令行使用的非常熟练...,其实大部分用命令行调试代码主要还是因为代码的基本功比较扎实直接可以敲代码,现在很多程序员离开了百度就不会写代码了,这种属于基本功不是很扎实,黑客按照技术范畴来讲属于安全领域,现在很多大学专门开设了计算机安全这门课程...不要把黑客想的那么神秘,黑客首先是一个能写代码的技术人员,并且对于网络安全有着特殊的兴趣爱好,凭着一股兴趣加入进来虽然在玩的过程中比较辛苦但感觉比较美,程序员写代码主要是完成工作任务,黑客完成一件事主要还是兴趣引导...,两种在性质上有比较大的差异,程序员更像是在企业完成强制任务拿工资,黑客做一些事件完全凭着一股热情没有薪资没有鼓励,无论是攻坚过程还是成功了都没有人知道,全部靠自己内心一种感受去做,所以黑客的自我消化能力也不是一般人能比得上的...回到正题黑客没有操作界面只是在影视剧中看到的,现实真实的情况只有黑客本人能够知道,而且还能本人的操作习惯有着直接的关系,你能说不在命令行下操作程序的程序员就不是优秀的程序员嘛,显然不是成正比的关系,本身就是萝卜青菜各有所爱的状态
不过,python比起其它解释性语言还是强很多的。因为它可以事先把文本代码编译成“字节码”(存储于扩展名为pyc的文件里),从而直接处理整型的“指令代码”,不再需要从头开始分析文本。...但是,从“字节码”翻译到实际CPU代码这步,仍然是省不下的。 这个消耗,可看作“利用虚拟机”执行异构CPU上的程序。有人证明过,哪怕优化到极致,这也需要10倍的性能消耗。 这个消耗也有办法缩减。...JIT说白了,就是在第一遍执行一段代码前,先执行编译动作,然后执行编译后的代码。 如果代码中没有循环,那么这将白白付出很多额外的时间代价;但若有一定规模以上的循环,就可能节省一点时间。...它甚至能根据上次运行结果实时profile,然后花大力气优化关键代码,从而得到比C更快的执行速度。 不过,理想很丰满,现实很骨感。...(笑~ 当然,如果不做这类较为复杂的处理,仅仅是一些流程性的东西的话,这类语言的处理速度还是够用的——至少与之交互的人感受不到丝毫延迟。 甚至,哪怕需要复杂的处理,这类语言也可以向其它语言求救啊。
前言 很早之前,就打算写这一篇文章了(其实有很多源码分析的文章打算写,但是自己太拖延了导致很多文章搁浅了)。我为什么要写这一文章呢?...事情的缘由是同事在SpringBoot项目中有一个A类继承HibernateDaoSupport,但是程序运行总是抛出没有成功注入SessionFactory的错误,后来我debug Spring源码解决了这个问题...这个错误的原因是A类的RootBeanDefinition中的autowireMode的值为0,在AbstractAutowireCapableBeanFactory类中的populateBean方法中没有执行到...autowireByName(beanName, mbd, bw, newPvs),导致SessionFactory的属性没有注入成功。...beanFactory)方法中不要使用beanFactory.getBean()会造成类性早熟,最终的后果就是类中的一些属性没有成功注入。
,各大软件评估工具,有的软件开发工具IDE也集成有MISRA,为了使软件更安全,MISRA组织花了大量时间和精力,MISRA标准的出版和推广是软件更加的安全和标准,尤其在汽车电子方面,MISRA规则似乎应用的很广...我们先来看看官方组织对MISRA的解释 ? MISRA规则有很多条,当然不是说你在设计的时候全部的规则都要遵守,MISRA允许可以背离有的原则,根据你的实际情况。...所有的规则分为建议规则和强制规则,通常强制规则建议都遵守,那么有的人说了,这么多规则,我怎么记得住,没关系,不用死记硬背,在使用使用中慢慢熟悉,也可以在设计时候就打开MISRA检查,例如如果我们用IAR在设计代码的时候...如果对MISRA完全没有一点概念,建议先浏览下MISRA的规则,选一两条来使能检查你的代码,如果一下全开的话,你的代码可能会检查出很多错误,你都傻了,例如可以先从简单的注释规则开始,例如MISRA的规则...将注释改为/* */在编译,就会消除这个错误, 好了快快行动起来,从这个简单的点开始,使你的代码越来越靠近MISRA。
我们互联网公司的生态不好,公司不怎么鼓励员工的创新,当然这个现状也有一些改变了,比开始的时候好多了,只是要真正从语言开始确实还有很长很长的路要走。...好不容易找个志同道合的可能开发个半年,发现食不果腹,还要奶孩子,真心没有办法玩呀,项目也就烂尾了。 一些项目放到网上,流言蜚语也一大堆,鼓励的少,BB 的多,生态不好。...在这个时候谁有心思去研究那些东西,哪怕是别人把源代码都公开了,我们都还没有读透。 别说语言了,哪怕是 Spring 这个框架,有多少公司和人能真正深入的研究过。...Spring 最早的来源就是大家对 EJB 的极度不满,臃肿的部署和开发,为什么我们没有想到再换个思维呢?...与其他所有东西都一样,我们奉行拿来主义,没有创新的土壤,没有狂躁和狂野的内心,我们公司需要的是听话的 Worker,我们公司不需要真正的 Builder。
PHP技巧和窍门来简化你的代码 技巧1 : (if and else) 技巧2 : (if blocks: less vs more) 技巧3 : (验证多个字符串) 技巧4: (??)...技巧5 :(递归优先于重复) 技巧6 : (PHP + HTML) 技巧7: (编写功能块) 技巧8: (使用类型) 技巧9 : (框架/库是没有坏处的) 提示10 : (不要只是为了写代码!)...,为什么不直接返回$ item是candy还是toy,因为那也只是一行,就像这样: return ($item == 'candy' || $item == 'toy'); 这将给我们相同的结果,但是假设我们正在检查...这是创建没有两个部分的内联条件的最简单方法。我什么意思 让我们看一个示例,该示例将为我做所有解释。...这里的危险之处在于,传递字符串不会破坏应用程序,它仍然可以完美运行。为什么? 如果将“ chair”传递到函数中,它将被评估为allItems()["c"],最终将导致错误,使您在12am起床。
# 装饰器语法 装饰器是 TypeScript(简称 TS)中的一个特性,它可以在不修改 原始代码的情况下,通过添加额外的功能来改进代码。装饰器通常以@符号紧跟着一个函数或者类来表示。...} } # 解决痛点和实战案例 装饰器在 TS 中的作用非常重要,它可以帮助我们简化代码、增加功能,提高代码重用性和可维护性。...hasPermission(permission)) { throw new Error(`没有权限进行操作:${permission}`); } return...} } 装饰器是 TS 中非常有用的特性,它可以帮助开发者在不修改原始代码的情况下,为代码添加功能和行为。...通过使用装饰器,我们可以简化代码、增加功能,解决一些常见的痛点,如性能监测、权限控制等。希望这些例子能帮助你理解装饰器的作用和使用场景。
今天给大家分享一位好朋友的六年量化程序开发历程,最后他的策略实现了很高的收益,身边有很多朋友也都是主业码农,副业量化,这种搭配是现在非常流行的,量化代码给大家放在了文章末尾,看完后希望对你有所启发与帮助...接下来一段时间主要是以优化代码为主,各种代码的重构,外围功能的增加和完善,比如和同花顺的交互,交易信号告警的优化等。...总结:这个过程其实蛮无聊的,整个量化策略没有任何实质性的进展,个人对此也没有任何信心,也没想过这个东西最后真能帮我赚钱,只是凭借着对写程序的兴趣,无聊时用于打发时间而已。...这也从另外一个角度证明我最初决定自己从头写量化程序是一个相当正确的选择,不然现在市场上的那些回测框架的那种性能,根本就没法用,但是到那个时候可能我已经没有勇气从头来过了。...六、持续改进 从2023年开始,我觉得自己的量化程序应该都做的差不多了,接下来可能没有太多的开发和策略调整的事情了。
来简化: if (!!toto.a?.b?.c) { ... } // toto.a.b.c exist // 如果键不存在,返回 `undefined`。...可以使用函数方式创建一个没有此属性的新对象,如下所示: const removeProperty = (target, propertyToRemove) => { const { [propertyToRemove...const toto = { a: 55, b: 66 } const totoWithoutB = removeProperty(toto, 'b') // { a: 55 } 7.仅当对象存在时才向其添加属性...condition is not important const condition = true if (condition) { other.name = toto.name } ❌不是很好的代码...i < 100000; i++) { // some code } console.timeEnd() // x ms ---- 代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行
强烈推荐一个大神的人工智能的教程:captainbed.net/zhanghan 【前言】 Lombok是一个十分不错的工程,项目中引入它后可以使用注解来简化代码,比如最为常见的get、set、tostring...等等; 【如何使用】 一、项目POM中引入相应的Jar包 org.projectlombok <artifactId...三、代码展示 package com.zhanghan.zhboot.controller.request; import lombok.Data; @Data public class LombokRequest...五、项目地址及代码版本 1、地址:github.com/dangnianchun 2、代码版本:1.0.0-Release 【总结】 简洁的代码让人感觉清爽,而且容易维护; 认真对待每一行代码。
有一个受众面很广的 twitter 讨论就是由 Ruby on Rails 的创建者所启动的。 ? 那么,为什么一开始会认为这种行径是不好的呢?...因为它有若干缺点: 会导致你复制到糟糕的设计决策或易受其他人攻击的代码 会形成一种依赖心态:要是我们不能google到内容,那么只能向人求助了 没有网就不能工作 但是,我不认为这些是大问题。...关于“学习如何编写没有bug的代码”的魔法书是不存在的。因为所有软件都有bug——除了这个框架之外。遇到bug我们就应该处理掉。 关键要点是:每个人编写的代码都不应该带有明显的错误。...05 应用程序部署后,我仍然不自信 终于,我的应用程序已经进入了产品阶段。它可以工作了。我可以休息休息,应该不会出什么问题了。等等,不!一切都崩溃了。是的,我没有说错:一切。...如果我们想编写出好的软件,那么我们需要不断地学习怎么做。没有捷径也没有魔法。每天进步一点点,就会越来越好。 总之,我们需要理解两件基本的事情: 每个人都会遇到问题。
就比如说这个:“为什么处理排序后的数组比没有排序的快?”...但本着“知其然知其所以然”的态度,我们确实需要去搞清楚到底是为什么?...未排序的时候,等待结果的时候让我有一种担心:什么时候结束啊?不会结束不了吧? 读者朋友们有没有玩过火炬之光啊?...那这个代码中的分支就好像火炬之光中的地图分支,如果处理器能够像我一样提前预判,那累加的操作就会快很多,对吧?...完全没有办法预测。 对比过后,就能发现,排序后的数据在遇到分支预测的时候,能够轻松地过滤掉 50% 的数据,对吧?是有规律可循的。 那假如说不想排序,又想节省时间,有没有办法呢?
小姐姐接着问我为什么,我说少个break,但凡再问一句:为什么少个break结果就不一样,我就回答不出来了。所以,为了将尴尬扼杀于摇篮,还是研究一下break在switch的作用。...,结果如下: *明明只匹配了case 0,为什么1和2也执行了?...从字节码可以看出:switch中的case条件和对应代码块是分开的。...其实这就涉及到了编译器优化技术,最后一个goto也是跳转到标号55的指令,但没有goto下一步也一样顺序执行此行指令,所以这个goto被编译器视为无用代码进行了消除。...结语 case中的break告诉前端编译器:「给每个case对应代码块的最后加上goto」。这样,执行完匹配上的代码之后,就可以略过后面的case代码块了。
领取专属 10元无门槛券
手把手带您无忧上云