注册
环信即时通讯云

环信即时通讯云

单聊、群聊、聊天室...
环信开发文档

环信开发文档

Demo体验

Demo体验

场景Demo,开箱即用
RTE开发者社区

RTE开发者社区

汇聚音视频领域技术干货,分享行业资讯
技术讨论区

技术讨论区

技术交流、答疑
资源下载

资源下载

收集了海量宝藏开发资源
iOS Library

iOS Library

不需要辛辛苦苦的去找轮子, 这里都有
Android Library

Android Library

不需要辛辛苦苦的去找轮子, 这里都有

《程序员职场工具库》从行动开始 —— MORS 法则

你是否曾经有过类似的疑惑?我尝试过好几次健身,但都坚持不下来,我是不是一个没有耐心,没有毅力的人?领导反馈说我需要提升沟通能力(开发效率、主动性),可是我要怎么提升呢?我知道该怎么做,但就是做不到呀。在我们的个人成长中,出现这些疑惑是很正常的,它们可以归纳为以...
继续阅读 »

你是否曾经有过类似的疑惑?

  • 我尝试过好几次健身,但都坚持不下来,我是不是一个没有耐心,没有毅力的人?
  • 领导反馈说我需要提升沟通能力(开发效率、主动性),可是我要怎么提升呢?
  • 我知道该怎么做,但就是做不到呀。

在我们的个人成长中,出现这些疑惑是很正常的,它们可以归纳为以下两个原因:

  • 不知道方法
  • 知道方法但不知道该怎样坚持

如果你经常被这两个问题困扰,长此以往,就会陷入自我怀疑的状态。这时,MORS 法则可以帮到你。

MORS 法则,又叫做具体性原则。MORS 法则认为,我们的行为只有符合Measured(可测评)、Observable(可观察)、Reliable(可信赖)、Specific(明确化) 这 4 个要素,才是一个具体的、可执行的行为。

针对上面说到的问题,我们不要光喊口号,而需要给出具体的、可执行的方案,然后行动起来!

也就是说,当你碰到一个很复杂的目标时,要尽量拆解目标,制定一系列符合 MORS 法则的行动计划,然后开始行动,这样就能达成目标

让我用一个栗子来解释 MORS 法则,假想一下,你今年给自己立了一个 flag:“今年要跑半马(21公里)”。要是只有这样一个目标,你能做到吗?大概率是不能的,即使你知道要每天坚持跑步,也很难坚持下来。你有可能会被临时的一些事情耽搁了几天就放弃了;你有可能在坚持了一段时间之后发现自己“根本做不到”就放弃了。

想要达成这个大目标,你可以尝试先拆解目标。假设第一次开始跑步,你可以跑 1 公里,希望 10 个月后能跑 21 公里,那就是每个月要多跑 2 公里;然后再拆到每周要多跑 0.5 公里;然后再拆解到每 2 天多跑 0.07 公里左右。这样分拆之后,就可以罗列出每天的跑步行动计划,比如:xx月xx日,跑 1.14 公里;xx月xx+1日,跑 1.21 公里... 这些行动是符合 MORS 法则的:

  • Measured:这些行动是可以被测量和评估的,你可以明确知道今天计划跑多少公里,最终有没有完成这个行动也可以很清楚地衡量和评估。
  • Observable:这些行动是可见的,你要跑起来,可能需要一些跑步装备和资源(比如准备水),这些都是实实在在的行动,不是 YY。
  • Reliable:这些行动是可以完成的,它不会太难,每天多跑 0.07 公里远远比多跑 20 公里要简单太多了,肯定能做到吧?
  • Specific:这些行动是非常明确的,就是跑步,不会有什么歧义。

当然,肯定有更好的、更加符合运动理论的跑步计划,比如是不是每天跑,还是一周休息 2 天、是应该每天突破,还是隔一天突破等等。这里只是举例,就简单一点了。不过不管是什么跑步计划,原理是不变的。

当你制定了符合 MORS 法则的行动计划之后,就能够更加容易地达成目标,也更加容易坚持下来了。因为:

  • 行动计划是具体的,明确的,可行的。相比原来的假大空的目标,它更容易做到!而且,按照这个行动计划来行动,就能达成目标。
  • 能够不断地感受到成果,这会帮助你更容易坚持下来。在这个栗子中,就是每天都多跑了一些,感受到自己每天都在进步,这是强大的正反馈,会给予你力量。

注意不要跟 SMART 原则搞混了哈。SMART 原则是制定目标时使用的,MORS 法则是制定行动计划的时候使用的。它们有一些相同的点,比如 Measured 和 Specific,那是因为每一个行动本身也是带有目的性的,所以 MORS 法则和 SMART 原则会有重叠的地方。

好了,MORS 法则的介绍就到这里了,它的内容非常简单,但是 MORS 法则对于我们的个人成长来说,作用是非常大的,希望你们可以多加实践啦。

除了在个人成长上面有帮助之外,MORS 法则对于管理者指导下属也非常有用,后面有机会我再介绍吧。

加油,让我们从行动开始!


作者:潜龙在渊灬
链接:https://juejin.cn/post/7259567288143020090
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

我的日常开发收获

passive event listenerspassive event listeners 是一种新兴的web标准,Chrome 51中提供的新功能为滚动性能提供了巨大的潜在提升。Chrome Release Notes.背景:所有的现代浏览器都有一个滚动功...
继续阅读 »
  1. passive event listeners

passive event listeners 是一种新兴的web标准,Chrome 51中提供的新功能为滚动性能提供了巨大的潜在提升。Chrome Release Notes.

背景:所有的现代浏览器都有一个滚动功能的线程,可以保证即使在运行耗时的js代码时滚动也能够平滑进行,但这种优化部分因需要等待任何touchstart 和 touchmove处理程序的结果而失败,因为这些交互可能会通过调用preventDefault() 事件来完全阻止滚动。

于是有了 {passive: true}

通过将touchwheel事件监听标记为 passive,开发人员承诺处理程序不会调用 preventDefault来禁用滚动。这使浏览器可以立即响应滚动,而无需等待js的执行,从而确保为用户提供可靠流畅的滚动体验。

  1. 关于系统设计

    • 关于分层

分层一般是基于模块功能来分层,有时候分层不清晰可能是有哪些模块,各模块间的功能,整个功能流程不是很清楚。

有时候两个模块间的交互复杂度增加,可以考虑构建一个中间层。 这样可以保持两个模块不会杂糅相关度不是很高的处理逻辑,功能逻辑更纯粹,保持边界清晰,降低模块本身的复杂度。

  1. 关于编程思维

仔细想来,虽然从事开发工作很久了,但是编程上还是很没有章法,架构设计能力较弱,多年来都是凭借以前热血和几分小聪明存活。

今日份反思:

拿到一个需求,分析该需求需要支持那些场景,为了支持这些场景它需要具备哪些功能,思考怎样实现这些功能,根据功能做模块划分,对这些模块进行分析,做逻辑抽象(也就是分层),然后整个需求实现的大致框架就心中有数了,开始产出技术方案。 技术方案产出后,按照技术方案的设想去实施,实施过程中可能会遇到没考虑到的场景,或者发现之前的设计不能很好的cover,调整设计,增加分层或者调整已有的分层,然后修改技术方案。 不断的经历上述过程,会慢慢的沉淀出一些业务通用的设计思路,这样下次再做技术方案的时候就不会很迷茫。脑子理清楚,而后出设计,实践后总结。

  1. ShadowRealm API

一个进入 statge3 的新的 JavaScript 提案,用于创建一个独立的JavaScript运行环境,里面有独立的变量作用域。

数据结构:

declare class ShadowRealm {
  constructor();
// 同步执行字符串,类似eval()
  evaluate(sourceText: string): PrimitiveValueOrCallable;
// 返回一个Promise对象,异步执行代码字符串
  importValue(specifier: string, bindingName: string): Promise<PrimitiveValueOrCallable>;
}

使用场景:

  • 在Web IDE 或 Web绘图应用程序中运行插件等第三方代码; 这种方式比iframe的实现更简单、灵活度更高,占用内存更少、代码的安全性更高。
  • 用 ShadowRealms 中创建编程环境,运行用户代码,如codepen,codesandbox;
  • 服务器可以在 ShadowRealms 运行第三方代码,防止第三方代码出错打挂主环境;
  • 网页抓取和网页应用测试可以在ShadowRealms中运行;

补充:Node.jsvm模块与ShadowRealm API类似,但具有更多功能,缓存Javascript 引擎,拦截import() 等等。

  1. 关于状态管理

做状态管理的核心就是监听数据的变化,监听数据的变化有两种方式:

  • 提供api来修改,内部做联动处理(React的setState)
  • 对对象做一层代理,set的时候做联动处理,同时get时收集所有依赖。(vue,mobx的响应式数据)
  1. 需求/调研

关于需求调研,我还是很急躁,急急忙忙开始技术方案评审、开发、排期的话,就会导致整个开发过程很被动。

比较好的方式,前期对于自己做的需求,以及需求的各个功能依赖有比较充分的了解(不过这在很多功能依赖方都没有文档的情况下很难做到),然后写一个符合需求的简版的demo,对可能出现的阻塞点和解决方案心里有一个预期,把图纸画好,照着图纸开发,从而更好的掌控整个开发进度。

  1. 功能/需求拆解

对功能需求的有效拆解,功能模块详细具体,粒度合适,不会太过细化,也不会忽略一些关键点,才能够更好的把控整个开发进度,评估可能出现的风险点。

  1. 工具方法收敛思路

收敛-内部集中分发给各个具体的util处理,保证对外暴露的接口的统一,降低该方法使用的心智负担。

  1. 关于「自顶向下」和「自底向上」

自顶向下:

程序设计时,先考虑整体,后考虑细节。先考虑全局目标,后考虑局部目标。不要一开始就过多追求总多的细节,先从最上层总目标开始设计,逐步使问题具体化。

模块化设计:一个复杂的问题,肯定是有若干稍简单的问题构成。模块化是把程序要解决的总目标拆解为子目标,再进一步细化分解为具体的小目标,把每一个小目标称为一个模块。

自底向上:

自底向上的设计简单来说就是先完成细节功能,每个细节功能抽象成一个运算符,然后将这些完成的细节功能组装到整体的架构中。

自动化的设计是不是就应该采用自底向上的设计思路,把每个需要的细节功能做抽象,使得配置规则的人可以任意组装,对于不支持的功能制造新的抽象?

  1. eval 和 new Function的区别

eval 和 new Function都可以解析执行一段传入的字符串。但有以下不同的地方:

  • eval中的代码是当前作用域,它可以访问当前函数中的局部变量和全局变量。new Function中的代码执行的作用域是全局作用域,不论它在哪个地方被调用,可访问的都是全局变量;
  • eval接收函数作为字符串时需要“(”和“)”作为前缀和后缀,new Function不需要,new Function可以接收N个参数,最后一个参数作为函数体;
  • eval不容易调试,用chromeDev等调试工具无法打断点调试;
  • 性能问题,eval通常比其他替代方法更慢,因为他必须调用js解释器,而其他结构则可被现代js引擎优化;
  • eval存在安全问题,因为可访问局部作用域的变量,其内部逻辑不可预测性很强,可能导致XSS攻击;
  1. 乐观更新与保守更新
  • 乐观更新(Optimistic Update): 乐观更新:如果有编辑等改动,先更新前端页面,再像服务端发送请求,如果请求成功则结束操作,无需额外处理,若请求失败,则页面回滚到先前状态; 这样更新方式的优点是响应及时,缺点就是低概率的请求失败回滚的体验不太好。
  • 保守更新(Perssimistic Update): 保守更新:如果有编辑等改动,向服务端发送请求,等收到回复请求后再响应用户操作,在此之前用户都需要处于等待状态。 这样做的缺点是会使页面有比较大的延时感,优点是最终呈现的结果是可信赖、稳定可靠的。
  1. 正交的概念

编程上的正交,从数学上引进这个词,用于表示相互独立,相互间不可替代,并且可以组合起来实现其他功能。比如if和for语言是正交的,但for和while与句的功能是有重叠的。逻辑运算not、and也是正交的,其他复杂的逻辑运算都可以用这三种基本运算叠加起来。 编程语言经常定义一组正交语法特性,相互间不可替代,组合起来可以实现其他功能。为了更方便使用,在基础特性之上,再添加一些额外特性。这些非基本的额外特性,成为语法糖。语法糖对语言的功能没有太大影响,只是有了,代码写起来更方便些。

  1. 引入外部字体,因等待字体文件的加载而产生文字不可见问题的一些解决方案
  • 临时显示系统字体:添加font-display: swap;到自定义字体的style中,在自定义字体加载好之前显示系统字体;
  • 预加载网页字体:用<link rel="preload" as="font" >更早的获取字体文件。
  1. 总结写技术文章的几个步骤,引导自己学习并践行:
  • 学习优秀的人写的东西,看看他们的理解;
  • 带着自己的疑问,和目前接收到的理解去读源码;
  • 读完之后,按照自己最终的理解绘制相关逻辑的流程图;
  • 针对关键功能模块做拆解和源码解读;
  • 总结相关功能的实现机制,以及给我带来的启发和思考;
  1. 关于团队中被高频讨论的去底座;

去底座不是完全失去对底座(数据)的访问能力,而是设计一个标准化的API来支持按需访问底座(数据)的能力。


作者:前端古力士
链接:https://juejin.cn/post/7260411184179675193
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

该怎么放弃你,我的内卷

各位,两个月没写文章了,这两个月发生了很多事,也让我产生了很多不一样的感悟。从上次发完《阅阿里大裁员有感》,我的手机里就推了越来越多的“裁员”、“经济下行”、“焦虑”等信息。我这边现在这家公司,虽然不裁员,但是执行了“SABC”绩效分布考核,什么内容大家应该也...
继续阅读 »

各位,两个月没写文章了,这两个月发生了很多事,也让我产生了很多不一样的感悟。从上次发完《阅阿里大裁员有感》,我的手机里就推了越来越多的“裁员”、“经济下行”、“焦虑”等信息。我这边现在这家公司,虽然不裁员,但是执行了“SABC”绩效分布考核,什么内容大家应该也都清楚,最后给我打了个 B-。呵呵,扣工资 20%,变成所谓的绩效工资,下次考核看情况发放。

很多兄弟看到这可能会替我打抱不平,狗资本家,快去发起劳动仲裁。可是他们马上又下上另一剂猛药,那就是不停的 PUA 你,告诉你现在有家庭,要多努力,要一心扑在工作上,放心,下次一定给你打回来。

我承认,他们这些话术我都看过,基本相当于明牌。可依然我还是被影响到了,情绪十分低落,也没心思去劳动局跟他们 PK。对未来的预期瞬间变得很悲观,人要是一悲观了,真的干什么也提不起兴趣。我一门心思都扑在以后能干什么上,其它的啥也不想管,疯狂的在国内外门户上刷信息,希望能找到一条“赚钱之路”。我研究了 Web3、AI 绘画、搞自媒体、网赚攻略(什么视频搬运、抄书、小说转漫画等等),基本上信息流推给我的,我都研究了一遍。这些玩意越研究越让人焦虑,因为那些标题都起的特别的有煽动性,动不动就日入几万,而我发的那些,浏览量都破不了百。于是我就想研究更多的路子去赚钱,老实说,东南亚那边的情况,我也了解过一些。

后面我对家人的态度也越来越坏,经常不耐烦,看着我小孩我经常叹气,我想这他妈可能就是中年危机提前爆发了,总之那段时间人会越来越焦虑。

后来还是我一兄弟,邀请我一家人去平潭自驾游,我们其实也没玩几天,属于特种兵式旅游,两天两晚(晚上熬夜开车去)。回来之后心情就好多了,也没那么焦虑了。其实本来也没什么,君子不立于危墙之下,这里不行那就走。找不到就先干自己的项目(我有开源项目)。我其实对干这行还是蛮有兴趣的,应该持续坚持的干下去,半途而废干别的是下策。

回想下我那时候焦虑的经历,我以前根本看都不看那种赚钱文章的,因为我知道这些大部分是在卖课,可为什么那时候我着了魔一样呢?其实很大部分与网络有关系,你着急干什么,你就愿意看点什么,你看点什么,网络就给你推什么。这种消极循环人一旦深陷其中,光凭自己是很难走出来的。其实这种时候应该主动去接收一些积极乐观的情绪,有助于自己调整心态,网络给不了你,只有身边人能给你。

更深一步的想,所谓内卷是不是也是通过网络在传播着,深刻的影响到每一个人。所谓的“智能推荐算法”,真的智能吗?大家想看的一定就是适合每个人的吗?你不停的点击去看的信息,真的能帮助到你吗?网络是我们的工具,还是我们是网络的工具?

我想我们真的应该停下来,想想我们到底在多大程度上需要抖音、需要 BiliBili、需要知乎,也许它们真的没这么重要。

人生在世,我们到底应该追逐什么?或者说,追逐什么其实不重要,重要的是我们去追逐的过程。在这个过程中,没有内卷,没有与别人的竞争,只有对自我的审视和成长。

换句话说,我有多久没有好好了解自己了,那些独属于自己的东西,永远不会背叛的资源。我们常说的:能力、人脉、技术、视野。其实除此之外还有很多很多,我刷视频看到的有趣视频点的赞,我 Chrome 里收藏的网页,我百度网盘里躺着的分享资料等等等等,还有最重要的一项,就是我的身体和组成我身体的每一个部分:大脑、心脏、肺...... 有多久没有关注和了解它们了?在这个内卷的时代,每个人都在比拼都在竞争,都怕落于人后,都想快点挣更多的钱,这些,时常让我们忽视了对我们最重要的东西。

有趣的是,每个平台都在疯狂的更新自己的算法,期望能更精准的描述一个人,给人打上各种各样的标签。但在这场竞赛中,没有平台能竞争的过你自己,在这个世界上,只有自己更了解自己。所以我真的感觉它们在做无用功,浪费资源,最好的平台,不是给打各种标签,而是引导每个人发现自己的标签是什么。

这里我想分享给各位几个我思考的点,以供探讨。

原则一:相比与到处去找信息差,更重要的是建立自己的“资源池”

我那时候不停的刷信息,不停的找信息,本质上,我是在幻想着找到一个信息差,从而获利。这也是网上铺天盖地的文章所推崇的,所谓在风口上猪都能飞。但它们总是在掩盖一个逻辑错误,那就是找到信息差和获利之间的因果关系。实际上,找到信息差只是获利的条件之一,你有多大的能力利用这个信息差,这个信息差的时效性,方方面面的因素都会互相交织和影响。

更进一步的想,信息差就像风一样,它存在于冷热空气的交换之时,它存在于各行各业、每时每刻。让我们去追逐风,这现实吗?

我们更应该静下来,好好数数自己手头的东西,整理自己的大脑。找到自己“资源池”有哪些资源,哪些可以为我们所用,哪些可以继续扩充。思路可以打开一点,任何在当前时刻属于你的东西,都是你“资源池”的一部分。

原则二:出卖自己时间和体力的不做

这个不做,不是指不去做,而是指不长期的做。一般入门一个行业或者技术,肯定要付出时间和体力的。但你要说十年如一日的付出相同的东西,那所谓“35 岁”危机就只能找到你了。这点其实各行各业都一样,只是互联网行业处在发声的前沿罢了。

包括所谓网赚、搬运都是一个道理,毫无技术含量的事做几年就好。要时常审视自己现在在干什么,手头有哪些资源,未来的目标是什么。这跟程序运行是一个道理,运行了一段时间,停下来让自己 GC 一下。不然很容易 StackOverflow。

原则三:自己抓住的资源,千万不要轻易放手

如果不经常审视自己的“资源池”,给所有资源估估价值,就很容易被人带坑里。

原先我就做过一个项目,这是个跨部门项目,我那个领导一直告诉我说这个项目没前途、没卵用,绩效也给我打的不好,问我还要不要继续做。我说那就算了吧,做的我都不想做了。

我一放弃,马上就有新人接手,连交接也不用做,代码直接拿走,吃相可见一斑。

也就是从这里我才理解到,我其实没有了解自己,没了解过我手里的项目,被人潜移默化的影响了。影响一个人的思想真的不难,不停的重复就好了。所以还是那句话,多把自己手里的“资源池”拿出来晒一晒,整理一下。

其实 996 也是一样,拿出了你最重要的资源---身体,到底换来了什么,值得好好评估一下。

原则四:做自己喜欢的赛道,更要积累自己的资源

这几个月的经历给我的最大感觉是,这世界上真的有太多太多的行业,也有很多人赚到了钱(至少网络上宣传他们赚了钱)。网络能让这些信息病毒式的传播,导致很多人错觉的以为自己照着做也能挣到钱。但他们忽视的是,网络能把世界各地的人汇聚起来,让信息流通。其实也提供了一个更大的平台,在这个平台里,只有更卷的人才能挣到钱。

有时候真的应该抛开网络。比如,你会写代码,这是你“资源池”里的一项技能,你把这个技能公开到网络售卖。只有两种情况,要么你非常的卷,打拼出一番事业;要么你根本竞争不过别人,这是普遍情况,这世界那么大,比你优秀的人有太多太多了。

但是抛开网络,回到你身边的小小社交圈子,你的技能可能就没那么普遍了。可能你会说,那我做程序员,我身边朋友认识的大部分也是做程序员啊。那么可以这么想,假如你会做菜,你身边的程序员朋友都会做菜吗?假如你会画画,你身边的程序员朋友都会画画吗?人和人总有差异点,你觉得找不到优势,那是因为你尚未建立自己的“资源库”。

先认识自己,再让身边的人认识自己,当他们会给你打标签时,他们就成了你“资源库”中的一员,这就是人脉。这才是是独属于你自己的标签,而不是抖音、B 站为你打的冷冰冷的标签。

总结

以上我感悟的四个原则,我称之为“资源池思维”,一个比较程序员化的名词。

这篇文章发完后,我后续可能就继续更新一下具体的技术文章了,继续深耕技术。

最后,推荐看到最后的各位看一部冷门电影:《神迹》,讲述的是医生维维安托马斯的故事。看完可以来一起交流交流感悟。


作者:FengY_HYY
链接:https://juejin.cn/post/7259210874447151163
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

摸鱼时间打造一款产品

辞职我辞职了拿上水杯,挎起背包,工位被我丢在了身后,一阵清风过后,我便离开了这度过一年半载的地方辞职的原因很简单,公司快没钱了,要么同公司共进退,要么离开,于是我选择了离开公司的待遇不算好也不算差,工资不算满意,但至少双休不加班。平时开发阶段末尾还比较闲,大把...
继续阅读 »

辞职

我辞职了

拿上水杯,挎起背包,工位被我丢在了身后,一阵清风过后,我便离开了这度过一年半载的地方

辞职的原因很简单,公司快没钱了,要么同公司共进退,要么离开,于是我选择了离开

公司的待遇不算好也不算差,工资不算满意,但至少双休不加班。平时开发阶段末尾还比较闲,大把摸鱼时间,逛逛各种论坛,掘金、知乎、github不亦乐乎,现在看来公司倒闭和我不无关系

久而久之,不免有些无聊。论坛里充斥着灌水文章,看多了属实是食之无味。于是为了打发时间,只能写一写自己的项目。一想到老板在为我打工,敲打键盘的双手便愈发轻盈了

未曾设想的道路

大半年前为了记录学习一项技能到底要花多少时间,我开了个新坑,做一款计时软件,记录某个时间段发生的事情

和以往一样,最初只是打算随便写写,写个基础功能完事。但在使用的过程中,越来越多的需求在脑海中构建。编程最有趣的便是创造感,你能感受到自己在创建一个新的世界,在创造的过程中时间飞速流逝,一转眼便度过了无聊的一天

激情是短暂的,生活是漫长的。和往常一样,功能在逐步完成,但我的兴趣在逐渐减少。没有添加柴薪,火便只能渐渐势弱

此时两个选择摆在面前,一个便是不再更新下去,毕竟要做的已经完成了,再去寻找下一个打发时间的事情就好了。另一个则是保持兴趣继续做下去

兴趣?利益?

做一个开源软件,如果能收获社区的掌声想必是件自豪的事情。但如果只有掌声,久而久之开源作者可能会陷入自己到底为了什么才做这件事的思维泥潭。有的人失去了兴趣便离开了,有的人发出了声音希望得到一些回馈

兴趣可以支撑人前行,但又有多少人能不求回报去做一件事?不可否认,曾经幻想过做出爆红的软件,然后不用打工,财富自由这样的白日梦。虽然不能一步登天,但我想借助它向前一步

审视一下目前的状况,如果要供用户使用,一个简单的计时功能加上记录,未免太过单薄。这么简单的功能实在谈不上什么竞争力,实现成本过低,而且我相信人们更愿意使用移动app,而不是在pc上去使用这个功能。我需要一个特定于pc且有实在价值的功能,很快我便找到了,它既满足前面的要求,又契合软件的主题

广告恐怕是最理想的获利方式,不会影响用户使用,也不用去考虑升级版之类的的东西。虽然不知道具体能有多少收入,但希望起码能够抵消掉域名的费用

有了继续前进的目标,这艘小船便能扬帆远航

但眼下的问题很严重,我在技术选型上摔了个大跟头

重头再来

好的开始是成功的一半,但没有人能预料到未来会发生什么

使用vue3为前端,我直接选择了webview方向的跨端框架

在以go为后端的wails和rust为后端tauri中,我选择了go。之前学习过一段时间的rust,深知学习的难度。而且在最初的预想中,我只是打算做个简单的计时软件,使用go也只是做一下数据库操作。不久后就完成了最初的一版,但在后续的尝试中,发现wails的生态还是太小了,很多基础的功能都需要自己实现。这时再看看tauri就显得很香了,各种插件和前端的绑定,再加上go并没有用得多么称手,于是只能长痛不如短痛了

ui框架的选择上我也犯了同样的问题。开始是偏向于material design这种风格,选择了vuetify,这个框架当时我看了很久,做的时候已经要到v3正式版本了。本来以为没问题,但后续使用时过于难受,此时文档基本没怎么更新,issue也被各种bug塞满了。只能快刀斩乱麻,换了习惯的ant-design-vue,风格区别很大,但改改样式也能用。quasar同样在我的考虑范围内,但更加小众,目前是不打算换了,在tauri v2移动端正式版后,再做尝试

为什么最开始没有选择做移动端?功能契合,使用起来也更方便。一方面是我的主要技能栈是js,另一方面重新学移动端过于不切实际,为一个八字没一撇的项目去学实在没有必要。flutter我之前也学过,试着写了一点,但还是不如js来得舒服

回过头来,发现走了很多弯路,但不去尝试只站在远处观望,永远也不会有结果。颠颠撞撞重头再来

编程之外

我一直把时间花在了代码之上,但想要做一款产品还远远不够,它迫使我不得不将视角转向那些我不曾关注的角落

UI可谓是产品的脸面,用户的第一印象便停留在了logo和界面上,虽然使用了风格统一的组件库,但将他们组合在一起的时候未必能将它们严丝合缝。目前只能说是勉强能看,日后再做修改

说明文档带领用户快速理解程序的运作,由于用户没有设计者的前提条件,很多理所当然也就需要一一记录

想要完善功能,bug和feature的反馈也要做指引,方便接收用户意见,确定前进路线

说明文档

参考vite的官网,使用vitepress,写markdown就可以了,还可以配上vue组件,还算方便

部署上选择了netlify,可以换自己的域名,还可以自动更新ssl证书

本来以为部署很麻烦的,结果一个小时左右就全部搞定,包括在namesilo上买域名,然后在netlify部署、配置

拥抱AI

在完成这些工作的过程中,有不少地方借助了AI,可以说很大程度加快了进程

编码上,由于我完全不懂windows编程和勉强会点rust语法,想要完成监听系统上的应用状态这项功能,根本就无从谈起。要花大量时间去学习的话,反而和我利用碎片时间进行编程相冲突了。况且在new bing的帮助下,我完成一个简单的函数就要花费数个小时的尝试。new bing根据我的需求返回了相关的api参考,但很多时候返回的代码并不能直接运行,有着这样那样的问题,需要去修正。很难想象仅凭我一人去翻找资料何时才能完成这冰山一角

在这个过程中,new bing最大的帮助就是提供了关键词。很多时候,你知道一个事物,想用自己的语言需要一长串词语去描述,但过去的搜索引擎并不能理解这些,而且就算把描述输入进去,也会因为过多的关键字导致答案被淹没在茫茫的网页之中。这就造成了一个困境,我不知道它叫什么,所以我要去搜索,但搜索的时候要知道它叫什么

在netlify配置域名,我输入了如何去配置,new bing给出了关键的name servers,省去了花时间去到处去找教程

为应用绘制一个logo,很显然我并没有这个能力,使用Bing Image Creator,一段描述就能生成

这些都是一些无关紧要,琐碎的事情,我只想获取结果,把精力留在我擅长的事情上。试想一下,我一个人去实现要花掉多少时间?最终能实现吗?部分功能交给其他人,又要用什么去换取?

计划

讲到这里如果有兴趣了解一下的话,可以移步仓库地址,但目前的功能我只能说很少,而且还可能出现问题,我提前声明一下。说明文档见此处,需要看清警告提示

为什么这个时候来写这篇文章来介绍呢,主要是辞职了也没事干,已经做了大半年就整理了一下。原本是半年后再辞职的,但计划赶不上变化,只能提前放出来看看情况

还有一项没能赶上的便是广告,使用的是google adsense,但提交申请后便石沉大海。尽管提前做了申请,但已经过去了几个星期。可能是开始建站时随意申请被驳回的缘故,久久没有反应

最后

辞职其实还有一个原因,就是累了,光是待在公司什么都不干,也能感觉到劳累。工作小憩之余,在过道眺望远方时,我一直想问自己究竟在干些什么。我想做出改变,想去尝试新的东西,体验另外一种生活

想过很多次,以后也许不会从事编程的工作,但又有什么选择呢。我希望是创作,而不是枯燥的重复劳作,但我很清楚这不是换一个职业就能改变的问题,终究是实力的问题。编程很有趣,但在公司并不是如此

现在我已经度过了一周的悠闲时光了,白天在家看看书,傍晚下楼走走,看着面向我驶过的匆忙下班的人流,感叹这也是自己前不久的模样。我背朝着喧闹,走上凉爽的林荫道,晚风吹过,天边挂着一轮淡淡的月牙


作者:hanaTsuk1
链接:https://juejin.cn/post/7256879435340890172
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

工作三年后的胡思乱想

一眨眼工作已经三年了,前两年的总结 工作第一年、工作第二年 基本上把在公司做的事情都介绍了,今年站在「前端已死」、互联网大裁员的环境下,想想未来的路可能更为应景。经常说这是最好的时代,也是最坏的时代,互联网便是如此。通过互联网将人与人之间的...
继续阅读 »

一眨眼工作已经三年了,前两年的总结 工作第一年工作第二年 基本上把在公司做的事情都介绍了,今年站在「前端已死」、互联网大裁员的环境下,想想未来的路可能更为应景。

经常说这是最好的时代,也是最坏的时代,互联网便是如此。通过互联网将人与人之间的各种链接都成为了可能,在互联网诞生之前,人与人之间的交流就是现实生活中的圈子,而现在本来这一辈子都不会在现实中产生交集的人在互联网却会相遇。

各种写书的大佬、开源的大佬,以往可能只是从文字、代码中了解他们,但现在通过社交媒体、微信竟然就产生了互动。当然不好一面就是也会遇到和自己不相投的人,也许会影响自己的心情。

通过互联网极大的扩宽了我们的视野,看到了别人在怎么生活,也放大了自己的焦虑和欲望。我们需要认清自己的边界,知道自己想要什么,自己能做什么,不需要对本来不可能发生在自己身上的事情而焦虑。

当迷茫焦虑时,看看宇宙的纪录片,从宇宙的视角去看自己,无论从空间大小还是时间维度,其实自己什么都不是,想那么多干啥。

再想想其他动物,吃饭睡觉喵喵叫,也挺好的。

前端已死

互联网已经结束了快速扩张的时期,这是个客观事实,因此招聘的人数相对于之前减少了很多,但远没到一个已死的状态,相对于其他行业,选择互联网依旧是一个不错的选择。

前端会不会死不知道,互联网肯定会一直存在下去,现在整个社会都是基于互联网,已经变成了像电、水一样的基础设施,没有人可以离开它。因此互联网的相关的岗位一定会一直一直存在。

至于互联网中具体的职业划分,前端、后端、算法、数据库等,它们各自使用的语言、技术一定会发生变化的,当选择互联网技术行业的时候,就应该抱有持续学习的态度。

塞班操作系统被安卓、iOS 取代、.Net 岗位的减少、客户端大量岗位转前端,这些也就发生在近十几二十年。当某一个岗位减少的时候,一定又会出现新的岗位,保持开放的心态去学就可以,变化再多肯定也有不变的东西。当掌握一门技术再学习另一门技术的时候,肯定会比小白学习一门新技术快很多很多,很多经验也会迁移过去。

去年 12 月出来的 chatGPT 为代表的大模型,到现在也就半年多的时间,很多以前完全不敢想的事情就这样发生了。可以预见的是一部分岗位数量肯定也会减少,目前影响最大的应该是 UI 岗,其次一定程度上可以提高程序员的开发以及学习效率,但还没有到取代的程度,但未来会再怎么发展就不得而知了。

相对于其他行业,虽然互联网相关技术迭代确实很快,但如果是因为热爱而选择这个行业,我觉得去做一辈子是没问题的。

技术

底层技术服务于上层技术,上层技术服务于应用,真正赚钱的是应用,它可能提升了用户的效率、也可能提升了用户的生活体验,这样用户才愿意付费。上层技术的人收到了钱,进一步也愿意为底层技术的人付费。

但对于一个应用,技术并不是最重要的,更多需要的是产品和运营,一个应用在 chatGPT 和各种框架、云服务的加持下做出来变得太简单了,更多的是我们需要思考如何设计产品和如何推广运营产品,和用户产生更亲密的连接,用户才愿意付费。

极端一点,即使现在所有的应用都停止更新了,其实也并不会产生多大的影响。

在公司中亦是如此,对于技术开发,没有谁是不可取代的,公司更期望的是那些可以发现问题、分析问题、定义问题的人,至于怎么解决,问题定义清楚以后,解决方案自然可以出来,谁去解决并不重要了。

但也不用太过悲观,虽然技术不是最重要的,但一定是不可或缺的,在解决问题的过程中也会区分出能力强和能力差的:方案的设定、代码编写的好坏、线上的 bug 数、代码的扩展性等。

赚钱

赚钱很大程度又是需要运气的,比如同一个人十年前进入互联网和现在进入互联网差别就会很大,再比如开发一个应用突然爆火,例如「羊了个羊」,这些我们是很难控制的,我们只能「尽人事,听天命」。

最近几年,除了在公司工作,对于有技术的同学赚钱有下边的方式:

  • 付费课程、出书

    最近几年越来越多的人在极客时间、掘金小册写课程或者直接出书。

    对于写课的人赚到了钱,对于买课的人只要跟着看完了,多多少少都会有很多收获。付费课程会比较系统, 如果没有这些课程,去学东西肯定也是可以学的,但需要花很多时间去网上搜一些零碎的资料,由于没有经验甚至可能走很多弯路。

  • 付费社群

    市面上也会有一些付费训练的社群或者知识星球

    对于组织付费社群的人会花费很大的精力,需要持续运营并且照顾到每一个人,不然就等着挨骂吧。因此这类收益也会很高,一些人会辞去工作专职来搞。

  • 开源

    大部分开源基本上是用爱发电,更多是收获一些朋友、流量、提升技术。

    比如 core-js 作者的经历,一个 22.6k star 的项目,几乎各个网站都在用的一个项目,作者却因为钱的问题被很多人谩骂。因此如果是个人专职开源一个项目靠 GitHub Sponsor 会很难很难。

    当然,开源也是能赚到钱的,比如 Vue 开源就赚到了很多钱,但毕竟是很少很少数了。

    依赖纯开源项目赚到钱,还是需要背靠公司。比如阿里云谦的 Umi、通过开源加入 NuxtLab 的 Anthony Fu、在 AFFiNE 的雪碧等等。

  • 应用

    身为一个程序员,尤其是前端程序员,当然可以自己维护一个应用来赚钱。

    做得很成功的比如 Livid 的 V2ex 社区,Abner Lee 的 Typora(后来知道作者竟然是国内开发者)。

    也有一些没有那么出名的,比如大鹏的 mdnice,秋风的 木及简历

    当然如果要做一个很大的项目,背靠公司也是一个很好的选择,比如之前阿里玉伯的语雀、之前极客邦池建强的极客时间。

    还有一些小的创业公司会做的,冯大辉的「抽奖助手」、吴鲁加的「知识星球」等。

    做出这些应用不需要很多时间,需要我们善于发现生活中的痛点以及强大的执行力,当然想成功的话需要再加一点运气,在成功前需要不断尝试不同的东西。

  • 流量变现

    有流量就会赚钱,不管是接广告、还是带货。互联网上也会有部分人专注于怎么搞流量,知乎怎么获得更多曝光、视频号怎么获得更多流量、怎么批量注册号,各个平台规则可能是什么,怎么对抗规则,这类有技术加持也会更加顺利,很多人也在专职做。

赚钱的方式有很多,对于我来说,我会尽量选择复利的事情,这样才能产生更大的价值。比如一对一咨询,一份时间换一份收入。但如果把东西写成课程,只需要花一份的时间就能获得 N 份的收入。

另外就是需要保持分享,分享除了能帮助其他人,对自己也会有很大的帮助,写文章的过程中也会不断的有新的认知得到。虽然当下可能没有金钱方面的收入,但时间放宽到几十年,相信一定会有很大的回报。

人的欲望是无穷的,也不能陷入赚钱的极端,目标应该是关注此刻,体验生活,享受生活,而不是不停的赚钱。之前听播客,有一个恰当的比喻,钱就好比汽油,不停的赚钱相当于不停的加油,但如果汽车停着一直不动,再多的汽油也是无意义的。

健康

最近几年总是爆出程序员突然离世的新闻,前段时间耗子叔突然离世的消息听到之后真的很震惊。twitter 经常刷到耗子叔的动态,然后突然一天竟然就戛然而止了,毫无征兆。

意外是无法避免的,只能尽可能的从饮食、作息、锻炼三方面降低生病的风险。

饮食

我是工作第一年体检的时候检查出了中度脂肪肝、尿酸高,当时因为是刚毕业,体重是我的巅峰,140 多斤,脂肪都堆在了肚子上。那段时间就开始跑步加吃沙拉,少吃米饭、面条。降的也快,几个月就回到了 130 斤以下,甚至到 120 多点。

第二年体检的时候,脂肪肝基本没有了,尿酸也降了许多。

image-20230702141922024

后来就保持少吃米饭,多吃蛋白质、蔬菜的饮食了。

作息

有一次得了带状疱疹,那种非常痛的类似于痘痘的东西,后来了解了一下是因为免疫力低导致病毒入侵的。猜测因为晚上坐在电脑前,气温降低了没注意,从而导致了生病。

病好之后就决心养成早睡早起的习惯。

之前作息基本上是 1 点到 2 点睡觉,9 点前后起床。现在基本上保持在 11 点前后睡觉,6 点到 7 点间起床了。

早起的好处就是早上会有大把的时间,而且这段时间是专属于自己的,并且因为大脑刚苏醒,效率也会很高。但如果是工作一天,晚上回家再做自己的事情,此时大脑已经很疲惫了,效率会比较低。

运动

最开始是跑步,但确实很难坚持下去,跑步需要换衣服、出门,还依赖于外边的天气,成本很高。后来陆续尝试过 keep、一些付费课程,都做了但没有完全养成习惯。

后来知道了 switch 的健身环大冒险,然后就一路坚持到了现在,前段时间已经通关了。

目前也一直在坚持,基本上一周会运动三到四次,一次大概花费 50 分钟左右。

投资

大学的时候开始接触到理财,知道了基金的概念,看了银行螺丝钉的「指数基金定投指南」,也看了「穷爸爸富爸爸」、「小狗钱钱」这类理财入门的书。当时赚到的一些钱,就跟着银行螺丝钉投了,主要是一些宽基和中概、医疗。

一直到工作的第一年,基金收入确实不错,甚至赚了百分之四五十。当时想着原来股市这么简单,这咋还能亏钱了。

接着疫情不断发展,还有外部经济的变化,中概、医疗都大跌,当时发了年终奖还不停的补仓中概,到现在亏损也有百分之三四十了。

但我心态是可以的,一切都是浮亏和浮盈,只要不卖一切都是浮云。

经历了大起大落后吸取了一些教训,那就是一定要严格执行计划,现金流多不一定要立刻全部投入,而是按计划定投,因为没人知道会跌多久,只有有充足的现金流,才能够把亏损逐步拉平。

现在国家规定互联网基金这些必须走「投顾」,也就是主理人帮我们买入、卖出,我们只需要交一定的投顾费即可。目前我都是在雪球上投,跟投的有孟岩的「长钱账户」、alex 的「全球精选」、螺丝钉的指数增强和主动优选。

能设置自动跟投的就自动跟投了,我相信专业的事交给专业的人肯定是没问题的。

投资肯定是财富自由不了的,但一定比把钱放余额宝强一些,只要耐心持有,尤其是目前这样的熊市投入,相信到下一个牛市会有不错的回报。

(以上仅个人看法,股市有风险,入市需谨慎)

保险

如果开始接触理财,除了投资,一个绕不过去的点就是保险。

对于保险是什么的比喻,之前听薛兆丰的课时候印象深刻。

我现在还年轻力壮,将来年纪大了可能会生病,为了防止以后生病要花一大笔医药费,今天就开始存钱,每个月拿出 10% 的收入存起来,未雨绸缪。这是一种做法。

另外一种做法,是我每个月也拿出 10% 的收入去买保险。

这两种做法有什么区别呢?

区别在于,如果我是用储蓄来未雨绸缪,那么未来可能就会发生两种不同的情形。

如果我将来年纪大了也没生病,我存的钱就还是我的钱,我不需要花出去,这时候我还是很幸运的,能够保有我原来的收入,这份储蓄没有被花掉,我赚了。

但是如果我运气不好,生病了,这份储蓄就会被用掉,甚至需要借很多钱去治病,生活会发生巨大的变化。

所以通过储蓄来未雨绸缪,它的特点是未来的结局是可变的,是变动的、是带有风险的。要么高、要么低,要么能够保有原来的这份储蓄,要么这份储蓄就被用掉了甚至借更多的钱。

而对于保险来说,如果你没病,那你的生活该怎么样还是怎么样。如果你病了,那会有保险公司给你支付一大笔钱,你也不用和别人借钱,病好后继续该干啥干啥。

因此存钱去防止生病就有赌的成分了,如果没病就白赚了很多钱,如果病了生活质量可能会发生很大的变化。

而保险就可以降低风险,未来即使生病了,由于看病不需要花钱了,病好后生活质量也尽可能的维持在原来轨道 。

我期望未来肯定是尽量稳定的,所以在不影响当前生活质量的条件下我愿意拿出一部分钱来买保险。原计划我可能会 30 岁以后开始买重疾险,之前女朋友的朋友有推荐保险的,然后就跟女朋友一起配置了重疾险。

选保险一定要慎重,一些看起来很划算的保险, 到理赔的时候可能会推三阻四,甚至理赔前公司破产了,尽量要选择大公司。

当然生活没有标准答案,每个人看到世界也都是不同的,我也一直在成长,一直在认识新的东西,上边的所想的也不能保证说未来不会再变。

未来能做的就是多看看书,不限制自己,看看经济学的、哲学的、心理学的、人文的,多出去走走看看,尽可能多的增加人生体验,去认识世界,认识自己,做自己想做的事,爱自己所爱的人,走下去就好了。


作者:windliang
链接:https://juejin.cn/post/7250875810793881660
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

谈软件项目中的外行管理内行

掘友的一个评论,让我又想跟大家唠会儿嗑了。我之前写过一篇文章叫《该写好代码吗?我也迷茫了》。于是,这位掘友评论说,他在上家公司的时候,他们组代码质量要求高,前期设计考虑全面,所以上线后问题少。但是在领导眼里就像没事做一样。其他组经常出事故,反而很忙,像是一直在...
继续阅读 »

掘友的一个评论,让我又想跟大家唠会儿嗑了。

我之前写过一篇文章叫《该写好代码吗?我也迷茫了》。于是,这位掘友评论说,他在上家公司的时候,他们组代码质量要求高,前期设计考虑全面,所以上线后问题少。但是在领导眼里就像没事做一样。其他组经常出事故,反而很忙,像是一直在攻克难题。

我回复说:那可能是领导不够专业,没有深入到项目里

回复完了,我仍然意犹未尽。于是,才有了这篇文章。

正常情况下,对于一个软件项目或者一次版本迭代,负责人应该是心中有数的。这个项目的难度如何?手里的人员能力如何?大约做多长时间?最终会达到什么效果?这些应该是负责人的基本功。我不自夸,反正我带项目时,我们几个负责人都是能做到的。

据此,你才能更好地把握一个项目的始终。有时,项目中间出现难题,要干预。有时,大家超额完成,要嘉奖。有时,很简单的功能,他开发出了很多bug,要扣奖金。甚至有时候,一个月的工期,老板硬要半个月完成,这时对结果不能要求太高,你不能又要做完又要做好,那是找打的节奏,最终会两败俱伤。

但是,存在一种叫“外行管理内行”的情况。这类领导呢,他不知道你干了啥,也不知道对你来说这活好不好干,甚至你干没干完他也分辨不出,全靠读你的周报和计划。但他却是你的分管领导

我原本以为,在技术领域不会存在这类情况。后来发现,不但有,居然还很普遍。而且在国内,这还是一道别致的景观。

听过一个报道,说国内有一位教授,他从国外买来高端芯片,先把标志磨掉,再印上自己的Logo。然后,他对外宣传是自主研发的。出人意料的是,他还开发布会,还拿到了上亿的科研资金。随后几年,他甚至还推出了第二代、第三代、第四代,都是通过自己印标签的手段完成的。

整个过程,但凡有内行审一下图纸,看一下生产车间,都会很容易识破骗局

当然,咱们普通人一般到不了研究芯片,那么高精尖的层次。但是,我觉得作为一个普通企业的小领导,参与到项目中,这总是可以的吧。

从实际情况来看,其实很少有领导能躬身入局。哪怕这个领导只管六、七个人,他也会再分成三四个组。遇到一项任务,领导会安排给员工,让它们去协商完成。而他,要去规划团队未来的发展。

我有种很明显的感觉,但现在还找不到一个合适的名词来描述它。只能从一些例子上去体会其中的差异。

我有一个任领导,开周会是他做总结。他说这一周,后端完成了什么,前端没有完成什么。前端还反驳他,说自己完成了。领导说,别糊弄我,你只是把接口地址敲上了,根本没调用过,你跑跑试试,数据结构对不上。他是最了解整个项目开发进度的人

还有些领导与他形成鲜明的对比。他们了解事情靠开会听汇报,就算只有三个下属,也要他们说说这周干了啥。他做一下汇总,然后再上报给他的领导。功能交付后,项目出现了问题,他会说是下属欺骗他,居然谎报工期,没测说测了,没做说做了。

至于形成这种区别的原因,可能跟文化和制度有关。不能说哪种绝对好或者不好。

前面那种“严管型”领导所在的公司,企业文化中,负责人制,不讲理由。出了问题不要推脱是张三、李四没做好,他们担不起这个责任,就是你负责人的问题。所以,这才导致了领导会落实每一项流程。

后者那类“汇报型”的企业,从上到下都注重文书的格式、措辞,讲究高瞻远瞩,着眼未来,允许试错,探索创新。因此,他们便将更多的精力投入到了汇报上。

作为一名老程序员,我感觉,软件开发是一种很工程化的工作,一层层拆分好,安排到基层人员手里,告诉他们如何执行就可以了。但是新一代领导说,管理的最高境界是让团队具备自驱力,硅谷就是这样的。自驱力就是你不用安排,他们自己就能主动克服困难去完成。即便领导不在,团队也能照常运转,这才是健康的团队。

抱歉,有点儿跑题了。

本文的初衷是“外行管理内行”与“躬身入局”。

我觉得“外行管理内行”在国内是必然现象,尤其在技术领域

在国内的中小企业,作为团队的领导,“行政类”的事情要比“专业类”多。你看看你的领导,他经常开会和写材料。这不是它自己要干的,也不是老板要求的,是受行业和环境的影响。你想要申报科技企业,申请政策扶持,参加高新评级,你就得去准备。

除此之外,团队的日常管理,年计划、月计划,人员流动、评优、优化等等,都会耗费日常的精力。而这些活,专业的程序员并不想干。

另外,就算一个内行被推上管理岗位,程序员工种复杂,知识更新也快,那他干上几年,也会慢慢被磨成“外行”。

因此,内行外行只是相对的,并不重要。我则更强调“躬身入局”

躬身入局,就是参与到项目中。就算不写代码,起码也了解下大家遇到的问题。在这个过程中,作为管理者,可以制定一些规则和标准,来保证良性运作。好的流程制度,是可以实现员工自驱动的。

举一个身边的例子。现在夏天了,天气很热,办公室都会开一天的空调,温度调到23度。

这天下过大暴雨,空气清爽,气温很低。这时,23度的空调就很冷了。正对着空调口的瘦同事,就想去关掉空调。结果被一个静止都会喘粗气的大胖子给制止了。

胖子问:为啥关空调?

瘦子说:外面下雨,不热了!我冷。

胖子说:你冷你穿衣服。你关了我热。

瘦子说:你热,你打开小风扇。

说完,瘦子关了空调。 随后,胖子又打开了空调。

这类事情就是公说公有理,婆说婆有理。搞不好还需要领导出面调停,或者搞一个群体性的投票。如果没人理你,那就看谁的底线更低,或者说谁更狠。

但是,如果说团队制定这么一个小规则,就是室温超过26度可以开空调制冷,制冷底线是23度。那么,即便没有领导在场,大家也能很好处理此类事情。甚至,这类情况根本都不会发生。

这只是为了体现规则重要性的例子。到软件开发中,可能就是比如这类情形:一个接口如果多个端都调用,那么就由后端组织特定的数据格式。

如果你躬身入局,你就会经历类似的事情。否则的话,你可能会说,吵什么吵,大家要以大局为重(只是要求停止争吵,没有决定开不开空调)。

可能说这么多,有人朝我笑了:你以为我傻?我这么做,老板给我涨工资,多拿钱!

抱歉,抱歉!我只想着如何提高项目质量了。关于挣钱方面,我外行了!

唉,大家一定要重视环境的重要性。


作者:TF男孩
链接:https://juejin.cn/post/7260431848928165925
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

假如互联网人都很懂冒犯

大家好,我是老三,最近沉迷于听脱口秀,并且疯狂安利同事。脱口秀演员常常说的一句话是:“脱口秀是冒犯的艺术”。最近我发现,同事们好像有点不一样了。阳光灿烂的早上,趿拉着我的宝马拖鞋,跨上包浆的小黄车,屁股感受着阳光积累的炙热,往公司飞驰而去。一步跨进电梯间,我擦...
继续阅读 »

大家好,我是老三,最近沉迷于听脱口秀,并且疯狂安利同事。

脱口秀演员常常说的一句话是:“脱口秀是冒犯的艺术”。最近我发现,同事们好像有点不一样了。


阳光灿烂的早上,趿拉着我的宝马拖鞋,跨上包浆的小黄车,屁股感受着阳光积累的炙热,往公司飞驰而去。

一步跨进电梯间,我擦汗的动作凝固住了,挂上了矜持的微笑:“老板,早上好。”

老板:“早,你还在呢?又来带薪划水了?”

我:“嗨,我这再努力,最后不也就让你给我们多换几个嫂子嘛。”

老板:“没有哈哈,我开玩笑。”

我:“我也是,哈哈哈。”

今天的电梯似乎比往常慢了很多。

我:“老板最近在忙什么?”

老板:“昨天参加了一个峰会,马xx知道吧?他就坐我前边。”

我:“卧槽,真能装。没有,哈哈。”

老板:“哈哈哈”。

电梯到了,我俩都步履匆匆地进了公司。

小组内每天早上都有一个晨会,汇报工作进度和计划。

开了一会,转着椅子,划着朋友圈的我停了下来——到我了。

我:“昨天主要……今天计划……”

Leader:“你这不能说没有一点产出,也可以说一点产出都没有。其实,我对你是有一些失望的,原本今年绩效考评给你一个……”

我:“影响你合周报了是吗?不是哈哈。”

Leader、小组同事:“哈哈哈“。

Leader:“好了,我们这次顺便来对齐一下双月OKR,你们OKR都写的太保守了,一看就是能完成的,往大里吹啊。开玩笑哈哈。”。

我:”我以前就耕一亩田,现在把整个河北平原都给犁了。不是,哈哈。”

同事:“我要带公司打上月球,把你踢下来,我来当话事人。唉,哈哈”

Leader、同事、我:“哈哈哈“。

晨会开完,开始工作,产品经理拉我和和前端对需求。

产品经理:“你们程序员懂Java语言、Python语言、Go语言,就是不懂汉语言,真不想跟你们对需求。开个玩笑,哈哈。”

我:“没啥,你吹牛皮像狼,催进度像狗,做需求像羊,就这需求文档,还没擦屁股纸字多,没啥好对的。不是哈哈。”

产品经理、前端、我:“哈哈哈”。

产品经理:“那我们就对到这了,你们接着聊技术实现。”

前端:“没啥好聊的,后端大哥看着写吧,反正你们那破接口,套的比裹脚布还厚,没事还老出BUG。没有哈哈。”

我:“还不是为了兼容你们,一点动脑子的逻辑都不写,天天切图当然不出错。不是哈哈。”

前端、我:“哈哈哈”。

经过一番拉扯之后,我终于开始写代码了。

看到一段代码,我皱起了眉头,同事写的,我顺手写下了这样一段注释:

/**
* 写这段代码的人,建议在脑袋开个口,把水倒掉。不是哈哈,开个玩笑。
**/

代码写完了,准备上线,找同事给我Review,同事看了一会,给出了评论。

又在背着我们偷偷写烂代码了,建议改行。没有哈哈。

同事、我:“哈哈哈”。

终于下班了,路过门口,HR小姐姐还在加班。

我:“小姐姐怎么还没下班?别装了,老板都走了。开玩笑哈哈。”

HR小姐姐:“这不是看看怎么优化你们嘛,任务比较重。不是,哈哈。”

HR小姐姐、我:“哈哈哈”。

我感觉到一种不一样的氛围在公司慢慢弥散开来,我不知道怎么形容,但我想到了一句话——

“既分高下,也决生死”。


写这篇的时候,想到两年前,有个叫码农小说家的作者横空出世,写了一些生动活泼、灵气十足的段子,我也跟风写了两篇,这就是“荒腔走板”系列的来源。

后来,他结婚了。

看(抄)不到的我只能自己想,想破头也写不不来像样的段子,这个系列就不了了之,今天又偶尔来了灵感,写下一篇,也顺带缅怀一下光哥带来的快乐。


作者:三分恶
链接:https://juejin.cn/post/7259036373579350077
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

人性的弱点之如何让别人信服你

前言 早些年花时间拜读了《人性的弱点》一书,不可否认其中的一些观点和方法确实很有用,在后来的工作与生活中我有意无意的使用其中的一些语言上的技巧,确实化解了一些无意义的争端,在生活中与人相处也顺利、平和了许多。 当然了,里面的一些观点与方法并不适合所有人,也...
继续阅读 »

前言


早些年花时间拜读了《人性的弱点》一书,不可否认其中的一些观点和方法确实很有用,在后来的工作与生活中我有意无意的使用其中的一些语言上的技巧,确实化解了一些无意义的争端,在生活中与人相处也顺利、平和了许多。


当然了,里面的一些观点与方法并不适合所有人,也许有人会觉得这样很累,也会有人觉得大可不必,因人而异吧, 如果有些朋友明显感觉到在生活、工作中因为说话频频损失了一些机会,那么我建议可以阅读一下这本书。


本文是我对其中一部分章节的提炼与总结,也是后来时长翻阅警醒自己的摘要。


一、避免陷入争论

  1. 丢掉先入为主的观念
  2. 控制好自己的情绪
  3. 耐心听对方说完
  4. 努力找认同点
  5. (语言上)能让步就让步
  6. 真心感谢别人对你的重视

二、永远别说:“你错了。”


永远不要对别人说:“让我来告诉你,你哪里错了!”


这是一种挑衅,会造成对方的反感,会让聆听者想要和你争论,即使你是好心提醒,并没有想要引起争端。


如果你直接了当的告诉他:你错了。人们的第一反应是会反击你,但不会让他们改变主意。


因为你的直接否定了对方的判断力、智商、打击了他们的自尊和骄傲。


三、学会认错

  • 靠争夺,你永远都不能让自己满足;
  • 懂得谦让,你才会收获出乎意料的受益。

四、温柔友爱比狂躁和武力更强大

  1. 一滴蜂蜜比一加仑胆汁更吸引苍蝇
  2. 如果你是充满物理倾向的来谈论问题,别人也会气势汹汹的和你争论
  3. 你用温和友好的态度,别人也会不由自主的认同你的观点
  4. 善良友好的交谈方式更容易让别人接受

五、让对方说“是”

  1. 再开始与别人交流的时候,先认可对方,在刚开始得到“是”也多,越容易被接受
  2. 不要着急把自己的见解说出来,先强调你认同对方的那些观点
  3. 如果一开始就让对方说“是”,那么就会忘记争议,听从我的建议
  4. 温和提出问题,一个可以让对方说“是”的问题
  5. 轻履者行远

六、对待抱怨的安全方式

  1. 人们通常会不停的谈论自己的观点,借此获得他人的信服
  2. 不要打断别人的讲话,即便是你不认同的观点
  3. 耐心听完对方的话,一定要诚恳,还要鼓励他们说完想法和意见
  4. 让对方成为你们交谈的主要人物
  5. 如果想交友,就让你的朋友胜过你

七、让对方觉得自己聪明

  1. 和别人的叙述相比,人们更愿意相信自己努力的出来的结论
  2. 让他人觉得这是依照他的想法所为
  3. 我们不喜欢别人强行把东西卖给我们,也不喜欢别人逼迫我们做某事
  4. 我们希望可以购买自己喜欢的东西,可以做自己喜欢的事
  5. 我们希望别人关心我们的想法和愿望

八、学会换位思考

  1. 一定要站在对方的立场想问题
  2. 一个人即使真的错了,也不会认为自己有错
  3. 人们的一切想法和行为都是有依据的
  4. 想要他人和你倾心交谈,请像重视你自己的感受一向重视他人
  5. 出于自愿的改过,不会有不满的情绪
  6. 想让对方认可你钱,先问问自己:“他为什么想做这种事?”

九、与他人充分共情

  1. 你的观点我一点都不否认,如果换做是我,我也会和你有相同的感受
  2. 你所遇到的人中,百分之九十的人都渴望得到怜悯
  3. 对于那些不愉快的情绪,同情能起到关键性的调节作用
  4. 所有人都希望得到同情

十、激发他人高尚的情操

  1. 人们做一件事的原因有两个,一个是高尚的借口,另一个才是真正的理由
  2. 人们总是把自己理想化,更愿意去相信那些高尚的借口
  3. 当你想让他们是发生改变的时候,就需要把他的高尚动机激发出法
  4. 大部分人都是诚实的, 他们一旦认为自己行为是正确的,就会非常想维护这种正确性。
  5. 我相信即是一个村新欺骗的人,当你嘉定他是真诚正直的时候,他也不想辜负你的信任。

十一、戏剧化表达你的想法

  1. 单凭陈述事实不能解决问题,需要以生动有趣的方式展现出来
  2. 在任何常场所,都可以把你想的想法戏剧化的展现出来
  3. 戏剧化表达方式就是利用某件东西,环境来衬托下面要说的事

十二、发起挑战的激励性

  1. 竞争可以产生效率,所以要激发他的竞争意识
  2. 所有人的心中都有恐惧,只有勇士会忘记恐惧,勇往直前。他们可能一败涂地,但通常都会取得胜利
  3. 战胜恐惧是人世间最大的挑战
  4. 每个成功人士都热爱竞争
  5. 激发人对胜利的渴望,对“被重视的感觉”的渴望


作者:子洋
来源:mdnice.com/writing/2b351a9007a249e19c9d3757876c19e5
收起阅读 »

图解项目管理抓手,如何轻松管理项目?

项目管理抓手.png 一、项目进度控制 1.  制定周报、月报、季报等进度报告,实时监控项目进度,及时跟进。 2. 设置里程碑,定期审核各项任务的完成情况和项目整体进度。 3. 使用项目管理软件或工具,制作项目进度计划,动态分配资源和任...
继续阅读 »
项目管理抓手.png

项目管理抓手.png


一、项目进度控制


1.  制定周报、月报、季报等进度报告,实时监控项目进度,及时跟进。


2. 设置里程碑,定期审核各项任务的完成情况和项目整体进度。


3. 使用项目管理软件或工具,制作项目进度计划,动态分配资源和任务。


4. 加强对关键任务的跟踪和监督,确保按时完成。


5. 积极处理进度偏差,采取调整计划、增加资源等措施弥补延误。


二、项目成本控制


1. 制定具体的项目预算,并下达到每个任务和人员。


2. 实施成本监控,分析阶段成本与实际情况间的差异。


3. 评估项目影响要素,制定成本风险预案。


4. 优化资源配置,最大程度提高投入产出比。


5. 严格审核支出,防范不必要的支出。


三、项目变更管理


1. 根据明确的变更标准和流程管理项目变更事项。


2. 通过项目变更委员会或会议,审议和批准变更。


3. 评估变更对其他事项的影响,并做出相应调整。


4. 详细记录变更内容及其历史,方便查询和参考。


5. 定期分析项目变更趋势,降低未来变更的可能性。


四、质量控制


1. 对项目产出物在功能、性能、兼容性和可靠性等方面进行测试和复核。


2. 设置质量标准和控制措施,并对团队成员进行培训和监督。


3. 针对测试或使用过程中发现的问题进行跟踪处理和改进。


4. 详细记录质量数据和信息,分析质量事件的影响因素。


5. 不断完善质量管理流程和标准 ,以提高整体质量水平。


六、风险管理


1. 开展项目风险识别,穷尽可能出现的风险因素。


2. 对风险因素进行定量分析,评估影响程度和可能性。


3. 制定风险应对计划并统筹资源,积极化解风险。


4. 持续监测项目进展中的不确定性,及时更新风险分析与应对。


5. 分析风险事件的教训与启示。为今后提供借鉴。


七、项目团队管理


1.  明确团队各成员的工作任务和职责。


2. 建立沟通机制和交流渠道。


3. 通过奖励机制来激励团队工作积极性。


4. 建立团队协同工作能力,提高效率和效果。


5. 不断完善团队组建和管理流程与机制。


四、其他方面


1. 统筹资源配置,有效考核绩效,激励执行。


2. 保存项目相关文件,创建项目知识库。


3. 分析项目经验教训,为今后提供借鉴。


4. 加强项目状态信息和数据的共享。


5. 不断优化项目管理流程,以提高效率。


作者:极客技术之路
来源:mdnice.com/writing/a3b44581c0f5475a9def01b2c762b3fa
收起阅读 »

8个方面快速提高项目交付速度

项目完成和项目成功地完成是两个不同的概念。作为一个专业的项目管理人员,需要确保项目尽可能地输出好的成果,这个成果要满足以下两个基本要求,才能算是真正成功的项目交付,其中 达到内外部客户满意的要求 是最重要的。 达到基本的质量要求 ...
继续阅读 »

项目完成和项目成功地完成是两个不同的概念。作为一个专业的项目管理人员,需要确保项目尽可能地输出好的成果,这个成果要满足以下两个基本要求,才能算是真正成功的项目交付,其中 达到内外部客户满意的要求 是最重要的。





  • 达到基本的质量要求



  • 达到内外部客户满意的要求


以下是整理的8个方面提高项目交付速度,供大家参考。





  • 提前开始



  • 停止多任务



  • 设定预期



  • 并行增加工作量



  • 减少需求



  • 优化依赖关系



  • 尝试增加风险



  • 优先排序


一、提前开始



如果在项目还没有正式开始之前,项目经理就已经知道项目的时间限制,那么可以提前做好项目的准备工作。特别是对于项目需要交付的内容做好提前规划,对于确定性的工作形成合适的规划,对于不确定的部分提前做好变化应对。一旦不确定性的工作确定下来,可以节省项目前期规划的时间,加快整个项目的交付进度。






  1. 提前组建项目团队,尽早进入工作状态





  2. 与客户进行需求交流,尽早确定需求范围和优先级





  3. 对确定的需求提前进行设计和规划





  4. 将确定的设计转换为项目任务和工作包,形成初步的项目计划。





  5. 对不确定需求,提前制定假设和方案,待确定后快速推进





  6. 提前准备技术方案,评估不同方案的可行性。





  7. 预先确定供应商,签订合同,准备材料





  8. 制定项目进度表、资源计划,确定项目范围。





  9. 提前测试相关工具、环境,确保可用性。





  10. 制定风险管理策略,识别可能的风险因素。




二、停止多任务



许多报告和研究表明,在项目中不断从一个任务转向另一个任务是一种不切实际的工作方式,而且这种方式反而会让工作效率变得更低。项目经理需要确保项目团队成员每天留出专用的时间专注于某一个任务,这样他们才能更好地完成工作,更少地分心,更有可能在截止期限前完成任务。






  1. 制定项目工作规范,建立不间断工作时间段,减少随机任务切换





  2. 对团队成员的工作时间进行合理规划,留出至少2-3小时的专注工作区间。





  3. 在专注区间内,关闭通讯工具,减少外部干扰。





  4. 制定个人工作计划表,按优先级专注于一项任务,避免跳跃作业。





  5. 优化工作环境,减少外界干扰源。





  6. 建立时间管理意识,记录每个工作区间的产出。





  7. 跟踪工作进度,衡量多专注工作的效果提升。





  8. 培养团队自律习惯,鼓励单项任务深度完成。





  9. 合理安排休息,保证工作效率。





  10. 不断优化多任务问题,提升团队效率。




三、设定预期


> 不要总是以为项目的发起人对项目的进度、成本和质量都关注,他们可能只会关注其中的某一个方面。项目经理要管理项目关键利益相关者的期望,一定要找出对方最为关注的点。这是非常重要的一件事,这样一旦项目中出现冲突的时候,项目经理可以做出一定的取舍。如果重点关注质量,并想要提前交付完成,那就可以在保证质量的前提下要求增加资源。





  1. 与项目发起人和关键利益相关方进行充分沟通,理解各方的需求和期望。





  2. 制定项目三角管理框架,评估客户对成本、进度、质量、范围各方面的关注点。





  3. 对客户进行需求调研和访谈,确认关键的期望指标。





  4. 构建项目目标体系,确定客户的主要关注点,如质量或交付时间。





  5. 根据主要关注点设定项目进度和质量目标,形成项目章程。





  6. 进行风险分析,识别可能影响关键关注点的风险因素。





  7. 制定风险缓解策略,保证达成客户关键预期。





  8. 与客户持续沟通,明确范围变更对预期的影响。





  9. 在项目执行中优先保证客户关键关注点,做出必要权衡和取舍。





  10. 不断确认客户的关注点,及时调整项目目标。




四、并行增加工作量



项目经理可以对项目中的各项任务进行审核和分析,看看哪些工作可以早点启动,哪些工作需要和其他任务一并执行。项目经理需要同时注意资源管理,因为你无法安排同一个人同时执行两项任务,如果确实增加了工作量,那就需要引进更多的人来帮助你进行任务管理。






  1. 分析任务依赖关系,识别可以并行执行的任务





  2. 对独立任务进行资源评估,确定可以增加的并行工作量。





  3. 根据关键路径,优先使关键任务尽早开始





  4. 对冗余资源较充裕的任务适当提前启动。





  5. 重新制定资源计划,扩充项目团队,提供并行任务所需资源。





  6. 制定多团队协作机制,加强沟通和协调。





  7. 监控各并行任务的进展,必要时进行资源调配。





  8. 合理安排任务优先级,平衡资源使用。





  9. 加强项目整体计划和风险管理。





  10. 避免过度并行增加项目管理复杂度。




五、减少需求



项目经理可以与项目发起人一起商量这个项目究竟能砍掉些什么,哪些可选的要求能够取消,将范围缩小到实际可以实现的交付工作量。通过这种方式可以去掉不能为实现项目主要目标增值的任务,也就是意味着缩小项目的范围,从而减少交付工时,加快项目完成进度。






  1. 与客户沟通确定核心需求和次要需求。





  2. 对次要需求进行价值分析,评估其实施的优先级。





  3. 制定不同的交付方案,包含次要需求的全量和简化版本。





  4. 估算各方案的交付进度,与客户讨论不同方案的业务影响。





  5. 根据客户的意见,确定移除或简化的次要需求。





  6. 更新需求文档,移除或标记出简化处理的需求。





  7. 重新评估工作量和交付时间表,更新项目计划。





  8. 调整资源分配,将精力集中在核心需求的交付上。





  9. 加强对范围变更的管理,避免需求不断膨胀





  10. 提高客户沟通频率,及时获取客户反馈




六、优化依赖关系



项目中各项任务之间的依赖关系在调度中非常重要,而且往往是项目计划中的关键组成部分,也意味着项目任务必须按照顺序进行。但是,实际的项目交付并非一成不变地按照项目经理制订的计划来进行。这个时候,项目经理要检查所有的依赖关系,看看哪些是必需的,哪些是需要去除的。大多数情况下都能发现一些可以改变和优化的地方。






  1. 清理任务之间不必要的依赖关系,识别可以同时进行的任务。





  2. 对依赖关系进行质疑和验证,确定必须依赖的关键任务链。





  3. 采用方法设计、敏捷开发等,使任务模块更加独立。





  4. 明确依赖关系中的关键路径任务,缩短其时长。





  5. 对冗余依赖任务进行重构、优化或外包。





  6. 增加资源投入,使依赖任务可以并行推进。





  7. 引入新的技术或方法,简化任务流程,减少依赖。





  8. 加强沟通协作,使信息流通,及时消除依赖。





  9. 监控依赖关系变化,及时更新项目计划。





  10. 继续寻找简化依赖的新思路。




七、尝试增加风险


很多时候,过于保守地执行计划会导致项目进度缓慢。如果出现这种情况,为了更快地交付,项目经理可以尝试做出一些改变而不是墨守成规。项目本身的存在即是一种风险,项目经理不应该简单地避免风险,而是要学会管理风险,需要查看项目规划阶段时的假设,看看能否通过一些假设来推动项目进度。





  1. 识别项目进展缓慢的领域,寻找可采取的风险。





  2. 对增加进行成本效益分析,评估收益和代价。





  3. 优先选择对项目进度影响显著、风险较可控的方案。





  4. 制定风险缓解和应急策略,做好风险管理。





  5. 留出时间和资源增加风险缓冲。





  6. 与团队和利益相关方沟通,获取支持。





  7. 监控风险状况,根据需要及时调整策略。





  8. 加强数据统计分析,衡量风险的成效。





  9. 记录风险管理过程,总结经验教训。





  10. 不断提高风险意识和管理能力。




八、优先排序


项目经理可以对工作量和要求进行优先级排序,将低优先级的工作或项目延后,提前完成项目中的高优先级部分。





  1. 明确项目关键路径和里程碑节点





  2. 根据客户需求与项目目标,确定各项任务的优先级。





  3. 制定优先级评估矩阵,评分确定任务顺序。





  4. 优先安排关键路径和高优先级任务所需资源。





  5. 优化资源计划,将非关键任务适当推迟。





  6. 对低优先任务简化要求,减少工作量。





  7. 提前完成高优先级任务,为后续任务创造缓冲。





  8. 与客户沟通,获取对优先级的确认。





  9. 监控进展情况,必要时调整任务优先级。





  10. 持续总结和改进优先排序的决策机制。




作者:极客技术之路
来源:mdnice.com/writing/42e1d4e8e00843e7a5dcdfa6d5db9781
收起阅读 »

【镜·映】《烂》:没有反转的生活

增村保造的这部《烂》(Tadare,1962,tt0310199),改编自日本自然主义大家德田秋声的同名小说。 益子(Masuko,若尾文子)在东京与汽车销售员浅井(Asai,田宫二郎)同居一段时间之后,才发现这个男人原有妻子。益子不情愿破坏浅井的婚姻,提议...
继续阅读 »


增村保造的这部《烂》(Tadare,1962,tt0310199),改编自日本自然主义大家德田秋声的同名小说。


益子(Masuko,若尾文子)在东京与汽车销售员浅井(Asai,田宫二郎)同居一段时间之后,才发现这个男人原有妻子。益子不情愿破坏浅井的婚姻,提议分手,但浅井早已经不能忍受神经质的妻子了,只是因为早年接受过妻家的资助,一直未能下决心离婚。被益子发现后,浅井终于离了婚,而前妻也因承受不住打击而精神崩溃。此时益子的侄女英子(Eiko,水谷八重子)不愿与家里安排的对象相亲,从乡下跑到东京,寄宿在姑姑家中。英子向往大城市的生活,却又看不起给人做情妇的姑姑,结果却是自己与浅井勾搭在一起,被益子捉奸在床,怒不可遏的益子将英子逐出家门。而后则强行安排英子与她原本的相亲对象——一个西装革履的农民结了婚。


小三上位,然后又被自己的侄女绿了,好在她“奋起反击”,终于捍卫了所谓“爱情”——看起来,这是一段有些夸张却俗套的故事,然而,故事的结尾,却拍得令人震撼。


一切依传统进行。姑姑拉扯着身着新娘盛装的侄女来到一众亲友面前,“看,她是个好新娘!”





浅井站起来,走到英子面前,面对着这个前两天还和自己享受着最后疯狂的性爱的女子,他挤出一些不多的笑容:“你真美,你太棒了!”,然后转头离开。





在众人面带微笑的审视中,一脸漠然的新人被送上花车,她的姑姑益子就坐在她身边,紧盯着她,像极了押送犯人走向牢笼。





镜头切换,开往名古屋的列车就要出发了。





已经换了便装的英子坐在车厢中,带着幽怨凝视着窗外的浅井——他和益子站在窗外,眉头微蹙,益子则面无表情。





英子的丈夫在模糊的前景中微笑着和他人告别。车站的广播,正一遍遍播放着:“请站在白线以外,请站在白线以外......”





列车徐徐开动,浅井缓缓抬起右手,犹犹豫豫地做了一个告别的手势,似乎还未完成,就缓缓放下了。





益子抬眼凝视着他,轻叹一口气,默然转头,独自离开,送行人群纷纷挥动手臂,背景渐渐模糊,益子面色苍白疲惫,仿佛仍旧难以释怀,而明明一切已然结束,除了当事人,没有人知道姑侄两人曾是情敌,为了争夺一个男人,到了以死相拼的地步。





本来,电影到这里其实可以结束了。然而,接下来的3分多钟,才是见证一位大导演真实功力的时刻。


送走英子,益子和浅井 “像往常一样” 回到“家”,开始了 “像往常一样”“日常时刻”


益子问:“要吃点东西吗?”“要我给你准备洗澡水吗?”“要睡觉了吗?”“我给你泡点热茶吧?”浅井一概说不。





然而他回到卧室,看着曾经和两个女人翻滚过的床,却又觉得空虚。





回到客厅,益子已经泡好了茶。两人开始 “像往常一样”“日常闲谈”





益子说,“她会是一位好妻子”,浅井说,“也许吧”;益子说,“举办婚礼真好”“我们要不要也举办一场婚礼?”,浅井笑笑说,“那也挺好,我们准备一下吧”。然后,就独自回房了。





益子漠然坐着,低下头将茶杯顶在额头。自己的提议并未遭到拒绝,然而,浅井那种怎么都无所谓的回答,却比拒绝还令人难受。





尽管如此,当听到浅井那一句“你怎么还不来?”,她还是反射般地应道 “哈依” 。不想表达内心的苦楚,因为表达了也无意义。她开始一件一件脱去衣服,像往常一样搭在椅子背上,只留下半透的薄纱内衣。





然后,益子慢慢踱向内室,带上了门,屏幕转暗,左下角显示出一个 “终” 字。





还记得《毕业生》(The Graduate,1967)最后的反转吗?曾被女友母亲诱惑的男主最后的时刻鼓起勇气冲入婚礼现场,劫走了即将成为别人新娘的女友,宣告一切错误终结与新生活的开始。


然而,《烂》的结尾,没有反转


一切如常。


一切都过去了,一切都被无形的力量压制在生活的 “日常和谐” 之下,再无声息,只有三个当事人吞咽下那些无法言说的苦楚,不出意外的话,他们将会把这些意难平带进坟墓。而那些不明缘由的关系人与看客,只会知道这是一场完美的婚礼,并为此或真情或假意地抚掌相庆。错误已被终结,但新的生活并未开始。


村上春树说:“我不想找一个搭伙过日子的人,我要找一个一见我就笑,我一见就笑,喝了酒满眼光给我讲浪漫和爱的人。”也许,这是个讽刺。


也许,浅井和益子也曾期待过那样的生活。但经过这小小的插曲,他们的生活似乎又回到了常态,并且很可能那就是他们可能期待的、唯一的生活。


益子看似是这场“宫斗”戏中的胜利者,她挤走了浅井的原配,又逼退了自家的侄女,然而,除了肉体,她不知道还有什么可以留住这个男人——现在连这一点,她都不那么确定了。更为悲哀的是,她似乎只能接受这种生活的“安排”,她可以战胜情敌,却无力摆脱一个社会系统将她锁定的位置。某种程度上,她甚至不如英子这个“失败者”,至少英子曾经痛快地享受过Stolen Pleasure(这是影片的另一个名字)。


如果仅从女性主义的角度解读这部电影,就会忽略一个事实:浅井也不是胜利者。这个男人因为接受过前妻家的资助,娶了他并不爱的女人,觉得自己处处受制于神经质的妻子,好不容易摆脱了,却发现益子的善妒与疯狂,比前妻更甚。在这场荒唐的情爱纠缠中,的确女性受到的损害更甚,但浅井也没办法为所欲为,当益子和英子两位女性疯狂地撕打在一起时,他的惶恐无措说明了一切。他依靠益子摆脱了前妻,现在他必须接受这个可以为了保住自己的位置而试图掐死自己侄女的疯狂的女人。这里没有胜利者,也没有自由人。


并非是男人操纵女人,或者女人操纵男人那么简单,所有人都在被一只看不见的手操弄着。


人一般很难超越对于自己身处其中的社会的既定秩序的理解。 一般人所能做的,就是无意识地压抑,然后再无意识地合理化这种压抑:事实如此,历来如此,所有人都如此。


故事中所有的当事人,都不是脸谱化的坏人,浅井可以为情妇的兄弟慷慨解囊(当时英子还没出现);益子曾经不愿拆散浅井的婚姻,在愤怒地将英子逐出家门之后,又不忍她流落街头。


普通人的普通,也许正在于此,无法摆脱甚至完全意识不到自己就生活在社会话语的规训中,不能知行合一地依照本心行事,却又无法让良知彻底沉默。


这当然不是说人就应当违背公序良俗、像野蛮人一样生活,而是说每个人都应该意识到这些话语权力与生存困境,这种问题意识的觉醒也许会带来痛苦,但却是通向自由意志选择的必经之路。像《烂》中的男男女女一样,本能的情欲化反抗,彼此扯着头发的撕打,保卫虚假爱情的算计,始终都不可能在没有反转的生活里掀起一点点波澜。


作者:wingsay
来源:mdnice.com/writing/df16952233da49c1816ddf3746d1fa84
收起阅读 »

构建写作世界的元素:概念库、词汇库与风格感觉的塑造

对于那些渴望在文字的广袤世界中留下个人思想和观点的人来说,写作无疑是一项必备的技能。噢,老板曾言我写的文字仿若小学生。或许,老板高估了我,我自觉可能还不及个别小孩儿的水平。 为了能够写出简单、清晰、真实的文章,我构想了一个写作工具箱,从下到上约4层内容,从基...
继续阅读 »


对于那些渴望在文字的广袤世界中留下个人思想和观点的人来说,写作无疑是一项必备的技能。噢,老板曾言我写的文字仿若小学生。或许,老板高估了我,我自觉可能还不及个别小孩儿的水平。


为了能够写出简单、清晰、真实的文章,我构想了一个写作工具箱,从下到上约4层内容,从基本素材到风格感觉,从写作方法到写作SOP(Standard Operating Procedure),力求全方位地提升我的写作能力。目前只完成了第1层基本素材,其他层次怎在探索中,哈哈。



第1层 基本素材

第1层 基本素材


第1层,基本素材,正如Stephen King所说,包括概念、词汇和语法,它们是文章的基石,是构建文字世界的灵感火花。这些元素将成为写作中常常使用的工具。


1、概念库


什么是概念呢?概念是对一个事物的清晰定义。我的理解就是概念在说清楚什么是什么。概念之所以重要,就好比你修房子时所用的砖块,虽然微小不起眼,却是构成了我们构建知识和认知大厦的基本单位。


为什么要掌握清晰的、准确的、必要的概念?它们为我们的思考提供了基本框架。明辨式思维,理性决策,都依赖于对概念的准确掌握。


最近学到了一个有趣的例子,让我费曼一下,哈哈。你是否知道「给予」和「付出」之间的区别?


在亲密关系中,「给予」意味着我愿意给你这些东西,做这件事情本身让我很快乐。例如你有喜欢的东西,而我正好能送你,我会因为你的喜欢而高兴;而「付出」则不同,它带有一种期望回报的心态。就是说我给你这个东西,是希望你下一次也要回报给我,并不是因为这个行为本身让我快乐。例如我请你吃顿饭,下次你得回请我才行。


这两个概念反应的是爱的动力机制问题。弗洛姆说:爱是给予,这种给予是抛开计算的,不存在我送你一份东西,你就欠我们一份人情之说。


掌握清晰而准确的概念,可以帮助我们在行动决策时,做出符合自己价值观的事情,认清什么重要,什么更重要。


概念库的构建并不是独自进行的,就像人是社会性动物一样,我们需要与他人互动、交流,形成社区、小团体,与同频的小伙伴一起搭伴前行,才能走的更好一样。


当建立起概念库之后,这些概念与概念之间,有多少清晰的、必要的联系?是接下里要做的事情。不要让它们孤立存在,而是相互联系、相互补充,形成一个有机的整体。


2.词汇库


什么是词汇?词汇≠单词,它是由单词与短语组成的丰富集合体。在构建词汇库时,我们可以放入各种素材,不仅仅局限于单个词汇,也可以是短语、句子甚至一段话。


词汇库是文章的基石,它决定了文章的架构与内涵。虽然名言金句能为文章增色不少,但并不能形成文章的骨架和血肉。因此,在词汇库中,应该注重收集更多事实性知识、概念性知识、作者的重要理论、对话、案例以及那些支持批判性思考的素材。这些资料能够确保你的论证有据可依,避免将个人轶事或经历当作普遍规律,从而在写作时避免陷入无病呻吟和猛灌鸡汤的误区。


如何扩大词汇库?仅仅拿个本子摘抄是不够的。还记得小时候死命摘抄的「金句本」吗?我现在还有一大摞,抄的时候激情澎湃,都是名言佳句;用的时候抓耳挠腮,为啥?不是书到用时方恨少,而是书到用时找不到!这就是纸质版的缺点,无法实现快速检索和有效提取内容,翻半天都找不到想用的那句话写在哪里,气哭自己系列。


因此,扩大词汇库时,不仅要考虑放在在哪里,还要要考虑怎么提取方便。怎么放?放的目的是为了将来能够快速的提取。要实现这个目标,需要做到2点。


首先,将工具电子化,如Obsidian、 iA writer,它们的优势在于能够实现关键词检索、概念互链、工具之间互相转换(例如Obsidian->Anki)。将收集的素材打上标签或拟定标题,这样一键搜索即可轻松找到需要的内容。同时,电子工具的容量也较大,方便随时收藏和携带,让词汇库始终伴随你左右。


其次,建立一个素材收集体系并定期整理。虽然关键词检索能够实现快速查找,但随着时间推移,收集的词汇会不断增多,简单地收集已经无法满足我们的需求。因此,根据主题或兴趣进行分类整理,有助于进行更有系统性的提取。



词汇库-写作主题

词汇库-写作主题


3. 语法库


写作是一门既关乎内容又关乎表达的艺术。语法作为语言的基本规则,通过简洁精炼的表达方式,赋予文字更强大的力量和自信。虽然英文和中文的语法略有不同,但本质上有许多共通之处。


真正的写作应当摒弃造作和恐惧。只有放下恐惧和造作才能写出好东西。要使表达简洁精炼,通常使用「名词+动词」形式,减少不必要的副词修饰和被动语态,这是掌握语言节奏好的方法。过多的副词会使文章显得啰嗦,而被动语态则会让表达显得不够自信。


我写文章老板常说像个小学生写的。有段时间写着写着就不想写了,后来一琢磨吧。嗨,有啥不敢写的呀,遇到问题了就琢磨琢磨。我的问题在于,输入的太少、概念太少、词汇太少,嗯嗯啊啊咿咿呀呀,来来回回就是那几句,而且就那几句还写的非常稚嫩、生涩。怎么办呢?那就继续写吧,不写怎么积累,怎么改进呀,哈哈。


4. 好作品库


史蒂芬·平克在《风格感觉》中说过,成为一个好作者的起点是成为一个好读者。好作者都酷爱阅读,就像Savage一样,他们家没有电视,而满眼都是书,客厅有一排长长的书架、卧室也有一排长长的书架,书很多大概有几千本。王小波也是喜欢读书,文学、哲学、历史、科学什么都有。一个好的读者能够阅读中能够发现、欣赏,并逆向解构好作品,从而获得自己写作所需的技巧。通过阅读好作品,他们逐渐掌握了丰富的概念、词汇和语法,培养出自己独特的风格感觉。分辨和欣赏优秀作品有时比单纯遵循写作技巧更加有效,能从根本上提升写作能力。


什么样的作品是好作品?大师经典。举个例子,如果你想了解关于霸道总裁小说的套路和框架,直接阅读《呼啸山庄》就可以,因为它是该类型小说的原型和经典之作。通过阅读这本书,你可以获取第一手的信息和资料,不需要去翻阅其他杂乱的书籍。这种方式可以让你更加深入地理解和把握这一类型的小说。


有时候,一说到阅读经典,脑子里反射性的就是晦涩、难懂、冗长......我小时候也被“经典”二字吓到了,觉得玩意儿是我能读的,不想读!后来,我的写作水平一直停留在,嗯,小学。翻开几页,多翻几页,会发现阅读⼤师经典能让人更清楚地认识到什么是好,感受到什么是好。以后遇到好的作品,尝试流连不去,沉思它好在哪⾥吧。


如何阅读好作品?对于我们这些基础知识相对欠缺的人来说(没有读过1000本书很难有太多基础知识,参考我老板,读完1000本之后,无论是阅读速度还是阅读质量远远超过我们),如果自己不懂如何阅读经典,最好的方式就是找个老师带着读。你不懂如何提问,那就看好老师如何提问;你不懂如何欣赏,那就看好老师如何解读好作品;你不懂如何提炼技巧,那就看好老师如何拆解作品。跟随老师的步伐,模仿老师,学习老师的方法,你会不断进步,完善自己的技艺是终⽣的事情,将错误看作是进步过程中的一部分,把它们当作游戏的一部分。




小狐狸专区





“本质的东西眼睛是看不见的”,需要用心去感受和理解。小王子喜欢玫瑰,我爱狐狸。


你相信永恒吗?我相信它是存在的,它需要两件法宝才能得以存在:信任和时间。不是一时的,也不是长期如此,而是终生如是。

  • 标题:《小狐狸在讲话》
  • 作者:陈小羊
  • AI copilot:Midjourney
  • Prompt:A cute white fox giving a speech, sunrise, wide view, full body, side view, wearing a blue dressin,the style of riso printing --style raw --ar 137:58
  • 话说:有人说Midjourney生成的图没有灵魂,我咂摸了一下,Prompt是为图注入灵魂的关键呐。


作者:happy_logos
来源:mdnice.com/writing/31230914cb804a91897c3ce3b8bf98cb
收起阅读 »

该写好代码吗?我也迷茫了

我在抖音上看到当当网创始人李国庆发了一条视频,感觉他说的挺有意思。 他说,作为企业中层管理者,该不该有自己的山头,用于自我保护,这让人很迷茫。 其实我也迷茫过。我猜测,我们迷茫的可能是同一件事。 程序员内部,曾经流传着这样几句圣经: 代码写的好,写得快,会像...
继续阅读 »

2023-04-21_172756.png


我在抖音上看到当当网创始人李国庆发了一条视频,感觉他说的挺有意思。


他说,作为企业中层管理者,该不该有自己的山头,用于自我保护,这让人很迷茫。


其实我也迷茫过。我猜测,我们迷茫的可能是同一件事。


程序员内部,曾经流传着这样几句圣经:



代码写的好,写得快,会像个闲人。代码有注释,逻辑清晰,任何人都能轻松取代你。


代码写的烂,只有自己能看懂,一次次救火,你反而会成为团队不可缺少的人才。



那么,问题来了:到底该把事情干好呢,还是不要干好呢?


这是一个问题吗?当然是往多快好省了做呀!


我以前的想法就是这样。


我做底层员工时,代码写的清晰简洁,高效严谨。有时候我会因为计算循环次数而费心设计。如果循环层数太多,我会先把关键数据放到Map里,后续可以直接取用。我也会关注代码的可读性,尽量少套几层循环,命名兼顾字符长度和表意指向,如果代码太多就抽离成一个方法函数,并且要在代码里注释清楚。而这些操作,在形成习惯之后,是不会影响开发效率的。反而在某些情况下,还会提高效率。因为不管逻辑多复杂,不管过去多久,一看就能懂,很容易排查问题和他人接手。


我做中层管理时,除了培养团队内每个员工都能做到上述标准外,让我投入很大精力的事情就是“去我化”。也就是通过手段、流程、文化做到团队自治。我在团队时,大家能很高效地完成工作。当我短时间内离开时,大家依然能依靠惯性维持高效的状态。


我的想法很单纯:不管我是一线开发,还是中层管理,我修炼的都是自己。当你具备一定的职场能力时,你就是值钱的。作为员工你能把手头的活干得又快又好,作为管理你能把团队管理得积极健康。这就是亮点。不要在意别人的看法,你只需要修炼自己。当你具备了这个能力,这里不适合你,好多地方都会求此类贤人若渴。


其实,后面慢慢发现,这种想法可能还值得商榷。


因为创业和打工的区别还是挺大的。


创业是给自己干,想干好是肯定的,谁都不愿意面对一团糟。


我看明朝的历史,建文帝朱允炆刚登基时,就想削弱其他藩王的势力,加强自己的权力。当建文帝打算办燕王朱棣时,朱棣就起兵造反,自己做了皇帝。我感觉朱棣其实是自卫。后来,感情朱棣当上皇帝的第一件事,也是继续削弱藩王的势力。其实,大家都一样。


打工就不一样了,干得好不好,不是你说了算,是你的上级领导说了算,周围同事说了算,规章制度说了算。


因此,扁鹊三兄弟的现象就出现了。


扁鹊大哥,医术最高,能预防病人生病。扁鹊二哥,医术很高,能消灭病症在萌芽阶段。到扁鹊这里,只能到人快死了,开刀扎针,救人于生死之间。但是,世人都称扁鹊为神医。


如果你的领导是一个技术型的,同时他还能对你的工作质量做一些审查,那么他对你的评价,可能还具有些客观性。


但是,如果你碰到的是一个行政型的领导,他不是很懂医术,那他就只能像看医生治病一样,觉得救治好了快要死的人,才是高人。而对于预防重症这类防患于未然的事情,他会觉得你在愚弄他。


事实上,不少中小企业的领导,多是行政型领导。他们常常以忠心于老板而被提拔。


因此,为了自己获得一些利益。有些人常常是先把大病整出来,然后再治好,以此来体现自己的价值。


老维修工建设管道,水管里流的是燃气,燃气管的作用是排废水。出了问题,来一批一批的新师傅,都解决不了,越弄越乱。结果老维修工一出手,就把问题解决了。老板觉得,哎呀,看,还得是我的老师傅管用。


相反,如果你把事情打理的井井有条,没有一丝风浪,就像扁鹊大哥一样,我都不得病,还养你干啥,随便换谁都可以。这样的话,往往你的结局就多是被领导忽视。


我有好几个大领导都在大会上说过:你请假一周,你的部门连给你打一个电话的都没有,这说明你平时疏于管理,对于团队没有一丝作用!


从业这么多年,见过各种现实,很讽刺,就像是笑话。有一个同事,给程序加了一个30秒后延时执行。后来,领导让他优化速度,他分4次,将30秒调到5秒。最后领导大喜,速度提高6倍,他被授予“超级工匠”的荣誉称号。


一个是领导的评价。还有一个是同事的评价。


我有一次,在自己的项目组里搞了个考核。考核的核心就是,干好了可以奖,干差了便会罚。我觉得这样挺好,避免伤了好人心,杜绝隧了闲人的意。结果因为其他项目组没有搞,所以我成了众矢之的。他为什么要搞?人家项目组都没有,就他多事,咱们不在他这里干了!


我想,国内的管理可能不是一种客观的结果制。而是另一种客观的”平衡制“。


就像是古代的科举,按照才学,按照成绩来说,状元每届多是江南的。但是,皇帝需要平衡,山西好久没有出个状元了,点一个吧。河南今年学子闹事,罢考,为了稳一稳人心,给一个吧。江南都这么多了,少一个没什么关系的。


他更多是要让各方都满意。一个”平衡“贯穿了整个古今现代的价值观。


有人遵循自己的内心做事,也有人遵循别人的内心做事。不管遵循哪一方,坚持就好,不要去轻易比较,各自有各自的付出和收获。


当路上都在逆行时,你会发

作者:TF男孩
来源:juejin.cn/post/7224764099187966010
现,其实是你在逆行。

收起阅读 »

做个清醒的程序员之努力工作为哪般

阅读时长约10分钟,共计2268个字如果要问自己这样一个问题:“我们工作的意义到底是什么?”会得到怎样的答案?是为了安身立命?是为了满足别人的期待?是为了得到社会的认同?抑或是索性认为工作是无意义的?如果我说:工作的意义在于自我实现,你会同意吗?你会觉得这样的...
继续阅读 »

阅读时长约10分钟,共计2268个字

如果要问自己这样一个问题:“我们工作的意义到底是什么?”会得到怎样的答案?

是为了安身立命?是为了满足别人的期待?是为了得到社会的认同?抑或是索性认为工作是无意义的?

如果我说:工作的意义在于自我实现,你会同意吗?你会觉得这样的观点很片面吗?你会觉得这很理想化吗?

其实,依我的工作经验来看,上面列举出的常见答案其实都有道理。人在不同的阶段,不同状态,工作的意义便会发生变化。

坦率地讲,我从开始工作之后,就下定决心不再啃老。简单地说,就是不再向父母伸手要钱。于是,如何保障自己的温饱就是我工作的最首要和最基本目的。也就是说,我刚开始的时候,工作就是为了挣钱。

刚起步的时候我一个月有多少工资呢?很少,2500块。即便是毕业后转正,拿到手也只有三四千块。

但是,这些钱已经可以很好地满足我的温饱需要。即使我出去租房,不在家吃饭,这些钱其实也是够的,只不过很可能剩不下分文。很感谢我的父母,在我事业刚刚开始的时候,照顾了我的起居生活。

一开始,我眼中工作的意义就是为了能养活我自己,就是为了那三两碎银。所以,为了养活自己而选择工作,挣钱,然后达到目的,我至今也不觉得有什么丢人的。

后来呢?因为我一直在家吃饭,午饭的话公司也有食堂,所以基本没什么开销。唯一生活上的花销就是衣服和鞋,可偏偏我穿衣穿鞋算是比较省的,一件衣服基本上少说穿个四五年,鞋的话就更久了,我现在还经常穿七八年前买回来的经典款。我认为穿衣方面,买经典款总是不会错,而且很难因为流行趋势而过时。

话说回来,随着我的小金库慢慢积累变多,我就不愁“安身立命”的目标了。因为我是家族后代中唯一的男性,所以心中总会有一种使命感,虽然没有人给我这方面的压力。我感受到的最大的责任感其实是想让家人生活得更美好的目标,虽然我父母在这方面依然没有表现出很大的期待。

于是凭着这个我自认为的“责任感”,一直努力工作了很多年。其实我的想法很简单,就是想让爱自己和自己爱的人过得好一点。我觉得凭本事挣更多的钱,然后达到这个目标,更是无可厚非的事情,也没什么错。

后来呢?我其实很早就有写博客的习惯,随着读者对我的文章产生认同,更重要的是有出版社编辑的认同,我就产生了要获得社会认同感的目标。虽说是“社会认同感”,其实它所包括的内容很广泛。比如读者的、家人的、老同学的、(前)同事的等等。这种“社会认同感”还会顺便带来他人的尊重甚至是敬重。至少我这次的工作和上次的工作,在面试的时候基本上技术方面是被认可的,免去了“八股文”的考验。不过老实讲,如果考验我面试“八股文”,大概率我还真得吃败仗。

再到现在,金钱对我的诱惑依然存在,但已经大幅降低了。更多的是考虑如何实现自己的价值,真正地释放自己的潜力,对这个社会,对这个世界发挥光和热。也就是我在一开始说的“工作的意义在于自我实现”。

好了,这就是我的故事。一开始为了满足温饱,我去工作,去挣钱;后来,为了得到别人的认可,获得社会认同感而努力工作,顺便把钱给挣了,引一句读者的评论:“挣钱是重要的事情中最不重要的”;再到现在,自我实现对我是最重要的。

所以,在不同阶段,不同状态,对工作意义产生不同的观点,我觉得都是正常的,也都是正确的。

但是,你知道吗?在我刚刚工作的时候,我就立下目标,要在这个世界上留下点什么,留下自己活过的印记,不想虚度此生。但当时无论如何也想不到,自己会成为作者,通过文字和图片把枯燥的编程知识教授给需要的人。

不知道你有没有听说过“马斯洛需求层次”,莫名其妙地,从一开始我就攀登这个需求金字塔,直到现在,已过去十余年。

有读者说我是“长期主义者”,以现在的认知,我愿意做一个“长期主义者”。但当初的我,哪懂什么“长期主义”。我更偏向于用“轴”、“固执”或是“不见棺材不落泪,不撞南墙不死心”这类的修饰词来形容自己。所幸的是,在我“固执”的一路上,受到了很多人的帮助与支持,还有上天的眷顾。“运气”、“机遇”占了很大的比重。

回到最初的问题:“我们工作的意义到底是什么”?如果我们对一个疲于奔命的人说:“你要实现自我”。很遗憾,“实现自我”在这个人眼中,也许就只是保障温饱,他甚至会转过头来和别人说我们是神经病。因为阶段不同,状态不同,追求的东西自然也会不同。也许这很无情,很冷血。但它很真实,也很正常。

但即便我们处在最开始的温饱阶段,着眼于生计,但目光一定要看到那个“未来”,坚定不移地坚持走“长期主义”的道路。

另一方面,在学校里,往往努力就会有结果,这是具有极大的确定性的。踏入社会之后,这种确定性消失了,我们往往努力了,却并没有得到想要的结果。很多人在鼓吹“选择大于努力”,选择固然重要。选错了,越努力,走得越偏。但这种话听多了,就要当心它是否成为了不努力的借口。努力是为了在机会到来的时候,我们有能力抓住他。这就好像不慎跌落坑里的人,有人扔绳子救他,他得努力抓住绳子,才有被救的可能。如果一味求救,却不选一种力所能及的方法去做,无论有多少次生还的机会,也会错过。

所以,任何时候也不要轻视努力与坚持的重要性。这看上去很笨很傻,但它却是每一个平凡人实现“自我价值”的可行之路。就像歌中唱的那样:“老天爱笨小孩”。在这个充满不确定性的时代,更应如此。不确定性就像基因突变,可能会变糟,也可能会变好。当有好事到来时,便是好运来临之际。和“选择大于努力”相比,我更倾向于相信“机会总是留给有准备的人”。这句话出自法国著名的微生物学家、化学家路易斯·巴斯德,告诫人们:机遇往往不易察觉,可遇不可求,容易稍纵即逝。作为普通人,若要抓住机遇,就要把功夫用在平时,甚至是有点傻的、偏执的努力。


作者:萧文翰
链接:https://juejin.cn/post/7218731620723638333
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

思考:如何做一名合格的面试官?

背景关于招聘,在最近一段时间有幸又参与到了面试工作。这次面试也包含一些相对高级一点的岗位,如何招到合适的人成为了最近一段时间一直在思考的一个点。整体上感觉自己还是没有章法,没有清晰的思路(做不到因人而异),这种情况对自己对他人都是不负责任的。因此,简单做一些总...
继续阅读 »

背景

关于招聘,在最近一段时间有幸又参与到了面试工作。这次面试也包含一些相对高级一点的岗位,如何招到合适的人成为了最近一段时间一直在思考的一个点。

整体上感觉自己还是没有章法,没有清晰的思路(做不到因人而异),这种情况对自己对他人都是不负责任的。

因此,简单做一些总结思考,边面边想边改进吧。

招聘者的目标

首先,作为招聘者,都希望能找到一些厉害的人,成本不应该是他要考虑的问题。但现实总是相反。

面试官:这是我这次招聘的需求,要这个...... 那个...... 总之,能力越强越好。

公司:这次招聘成本范围已发给你了,注意查收。

面试官:......

所以,在成本有限的情况下,面试官要做的就是找到那些会发光的人。对面试官来说,招到一个即战力(不亏),招到一个高潜力(赚翻了)。

因此,招聘者的目标都是希望能够招到 能力 > 成本 的人。

梳理招聘需求

招聘的需求是需要面试官提前梳理好的,面试官作为团队的组建者,一定要提前规划好招聘需求。比如:

  1. 我要找技术强的。(我不懂的他来)
  2. 我要找态度好的。(我说啥都听)
  3. 我要找有责任心的。(不用我说就把活干得很漂亮)
  4. 我要找学习能力强的。(自我提升,啥需求都能接的住)
  5. 最好还能带团队。(这样我就轻松了)
  6. 最后一定要稳定。(这样我就一直轻松了)

哈哈,先开个玩笑。虽然我真的想......

现实就像上边提到的,招聘者希望的求职者模样。虽然知道不可能,但还是忍不住想要(我控制不住我几己呀!),所以在有限的面试时间内,问了很多方方面面的问题......

面试结束后:我问了那么多才答上来那么几个问题,不行,下一个......

面了几天后:人怎么这么难招呢?

所以真正的招聘需求应该是下边这样的:

  1. 我要招一个领导者还是执行者:这个一定要想清楚,两者考察维度完全不一样。
  2. 我要技术强的:想好哪方面技术强,不要妄图面面俱到。
  3. 我要找有责任心的,学习能力强的,稳定的:想好怎么提问,如何判断。

如果能够做到上边的三点,相信招进来的人应该都是OK得。PS:先做到不亏。

领导者Or执行者

为什么把这个作为第一点,上边也提到过,两者考察维度完全不一样。一场面试,时间就那么点,所以要有针对性。

先说领导者

如果招聘领导者。试想一下领导者有哪些特点,什么样的人你愿意让他成为领导者。

  1. 业务理解程度深,不仅限于产品规划的业务需求,还要有自己的理解和看法。
  2. 技术能力强,通常一个技术方案便能提现出来,方案好不好,考虑全面不全面。
  3. 抗压能力强,能够承担工作压力,这里不是指加班(当然加班也算),更多的是来自于技术,业务的困难和挑战。

以上三点并不代表全部,仅做参考。那么如何在面试中确认呢?

  1. 业务理解程度主要通过追问细节的方式来确认。在你不了解的情况下,依然能够给你讲明白,这个业务是做什么的,关键核心点是什么,核心点有什么难度和挑战,最后是怎么解决的,解决的是否完美,不完美的原因。如果能够回答的不错那就基本合格了。最后可以再多问一下: 有没有哪些产品提出的需求,你认为不合理或者不适合当前产品现状的?这个问题只要回答的有一定高度,那就完美了。

    ps: 如果面试者认为没有什么难度和挑战,只能证明他自己没有深度参与或主导该业务。再简单的系统,也不可能一点问题都没有,如果真的没有,那么完全没有必要安排团队去专门负责。没有简单的系统,只有简单的思考。

    举个栗子,用户管理(用户CRUD)系统我们一听可能都觉得很简单,早期,用户注册要填一堆的东西,现在都是各种登录渠道,非常的方便。站在现在的角度,对于早期的用户管理来说,如何提升用户注册效率,增加用户量就是一个有难度有挑战的事情。

  2. 技术能力,我简单分为有效技术能力和无效技术能力。无效技术能力代指无用且无聊的八股,当然也不是所有的八股都无用。有效技术能力我理解就是解决问题的能力,而解决问题不在于使用的技术手段与否高明,是否先进,只要贴合业务场景,我都会认为有技术能力。反而那些八股回答的头头是道,解决实际项目问题无一用到的会严重减分。

  3. 抗压能力,项目经验是能反应出来一些信息的:有难度,有挑战的事情你不会交给一个不合适的人来做的,所以如果简历的项目经验中有类似的经验那么就证明别人已经帮你筛选过了。PS:别忘了鉴别一下。

再说执行者

还是试想一下,好的执行者有哪些特质:

  1. 注重细节,考虑问题全面。
  2. 责任心强,不会随便应付了事。
  3. 技术OK,至少基础没有问题。

同样,上述三点仅做参考。

  1. 注重细节,直接体现其实跟方案的完善程度有关,所以问问技术方案的异常情况是如何考虑的。另外,直接体现其实就是BUG比较少,当然这个一般人肯定不会说自己BUG多,所以可以问问,对于如何减少BUG量,有没有心得。(这个问题目前来看基本没啥用,哈哈)

  2. 责任心强。责任心如何体现的我也说不太清楚,思考以后认为加班算一方面,有加薪、晋升算一方面,面试中很难直接体现,只能凭感觉。和第一条注重细节一样,我面试全凭聊完之后的直觉,这种大家都会有,而且一般来说准确率也不错。

    PS: 其实在面试沟通过程中,一问一答,很多事情靠直觉、面向也能猜个七七八八,玄学的东西这里不多说。说一点有科学依据的,人的性格简单分为外向、内向,两者都有其各自的特质,通常来说,内向者的特质更多时候适合于执行者。感兴趣的可以去了解一下两种性格特质,有益于团队管理。

  3. 技术OK。这个不做多说了,一定要多问实际使用的,不用的就不要问了,可能用的适当问一下,实际使用的也可以拔高一下往深了问问。比如:mysql都在用,mysql的八股可以多问几个。JVM这种开发基本不用的,简单问一下得了(我一般是不问的)。


这一篇先到这里把,关于技术强、责任心其实也简单提了一下。关于这两点,后续结合实际情况再更新吧。


作者:FishBones
链接:https://juejin.cn/post/7219943233799323704
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

程序员接外包的三个原则以及有意思的讨论

文章来源网络 原则一:乙方来做决策 最终拍板人是谁?是甲方,如果你非要抢板子,那你以后就没有甲方了 但是,如果甲方也觉得“我花钱了,当然要听我的(那些只对上级负责又不能拍板的底层打工人,总是这样认为)”,那这种甲方的项目你就不要接 因为在这种甲方眼里,你只是...
继续阅读 »

文章来源网络


原则一:乙方来做决策



  • 最终拍板人是谁?是甲方,如果你非要抢板子,那你以后就没有甲方了

  • 但是,如果甲方也觉得“我花钱了,当然要听我的(那些只对上级负责又不能拍板的底层打工人,总是这样认为)”,那这种甲方的项目你就不要接

  • 因为在这种甲方眼里,你只是“施工方”,他们即不需要你的经验价值,更不会为你的经验买单。所以这种甲方你会做得很累,当他们觉得“你的工作强度不足以匹配付给你的费用时(他们总这样觉得)”,他们就会不停地向你提出新的开发需求

  • 所以,你要尽量找那种尊重你经验价值,总是向你请教,请你帮他做决策的甲方


原则二:为甲方护航



  • 甲方未来会遇到什么问题,你们双方其实都不知道,所以你需要一边开发一边解决甲方实际遇到的问题。

  • 因此,不要为了完成合同上的工作内容而工作,要为甲方遇到的实际问题,为了甲方的利益而开发,要提前做好变通的准备。

  • 永远不要觉得你把合同上的功能列表做完,你就能休息了。你要解决的真正问题是,为甲方护航,直至甲方可以自己航行。


原则三:不做没有用户的项目



  • 如果甲方的项目没有太多用户使用,这种项目就不要接。

  • 除了代码的累计经验,还有一种经验也很重要,那就是“了解用户的市场经验”

  • 只有真正面对有实际用户的项目,你才能有“解决市场提出的问题”的经验,而不是停留在“解决甲方提出的问题”

  • 拥有市场经验,你就会有更高的附加价值,再配上尊重你经验价值的甲方,你就会有更高的收入

  • 永远记住:真正愿意在你身上花钱的甲方,他的目的一定是为了让你帮他赚钱!


以上只是我根据自己经验的一家之言,可能对我有用,不一定对别人也有用。肯定还有很多有价值的原则,希望大家根据自己的经验一起来分享。


下面是一些有意思的讨论


原则 2 、3 都是虚的,就不讨论了。

只说原则一:


一般而言,甲方跟你对接的,一定不是老板。

所以他的核心目的一定是项目实施成功。

但项目是不是真的能给企业带来效益,其实是优先级特别低的一个选项。


拿日常生活举个例子。夫妻、情侣之间,你媳妇儿托你办个事,比如让你买个西瓜。

你明知道冬天的西瓜又贵又不好吃,你会怎么办?


A ,买西瓜,回去一边吃西瓜一起骂水果摊老板没良心。

B ,给你媳妇儿上农业课。然后媳妇儿让你跪搓衣板。

C ,水果摊老板训你一顿,以冬天吃白菜豆腐好为由,非卖你一颗大白菜。你家都不敢回。


这里面,你就是那个甲方对接人。你怎么选?


所以乙方一定不能做决策。乙方做决策的结果,就是甲方对接人被利益集团踹开或者得罪甲方对接人,最终导致项目失败




我也来说三个原则

1.要签合同,合同越细越好;

2.要给订金,订金越多越好;

3.尾款不结不给全部源码。




原则一:外包大部分就是苦力活,核心有价值的部分有自己公司的人干轮不到外包,你不干有的是人干,不会有人尊重你经验价值,甲方说怎么干就怎么干,写到合同里,按合同来,没甲方懂自家业务,别替甲方做决策,万一瞎建议导致项目出现大问题,黄了,外包钱都拿不回来


原则二:给多少钱办多少事,如果甲方给钱痛快,事少,可以看自己良心对甲方多上点心,否则别给自己加戏,不然很可能把自己感动了,甲方却想着好不容易碰上这么个人,白嫖


原则三:不做没有用户的项目,太片面,不是所有外包项目都是面对海量用户,但是做所有外包项目都是为了赚钱,假如有个富二代两三万找你做个毕设,简单钱多不用后续维护,这种接不接?假如某工厂几十万定制内部系统,可能只有几个人用,这种接不接


总之外包就是赚个辛苦钱,别指望这个来提升自己技术和自我价值,外包行业水太深,你这几个原则都太理想化




某富豪要盖一栋私人别墅,招建筑工人,现在缺一名搅拌水泥的工人,

找到了张三,张三说我去过很多工地,啥活儿都干过,经验极其丰富,我可以指导一切事物,我再给你兼职当个总设计师吧,一切事物听我的决策没错。

我每天做完我的本职工作搅拌水泥砂浆,我还能熬夜给建筑设计布局,风水,房间规划,材料采购等等,我啥都会,直接干到建筑完工

富豪很感兴趣,说那你来吧,我盖的是自己住的别墅,张三一听连连摆手:你是盖私人别墅啊?不行不行,我不去了,我以前盖的都是高楼大厦,住户多对我技术水平有严峻的考验,做成了对我有很大提高,私人别墅才几个人用,对我职业生涯一点帮助都没




永远不要接外包

这才是正确的答案

做私活的时间

不如自己休息休息,陪陪家人




屁事真多,有钱就行了,管他项目有没有人,人家产品低能你还得兜底,接外包考虑的是能不能满足需求。啥条件啊还能挑三拣四,给多少钱干多少活。 招投标接的 30 万以上的项目才有可能考虑你说的这些东西。





呵呵 我的意见是:



  1. 给钱就做(前提是合规,不是合理),先给定金,拿到定金开工。

  2. 遇到扯皮,就停止开发。

  3. 要有空闲的时间,偶尔做做(上面说的对:永远不要做外包)。


展开来说,做外包的长期收益很低。就当临时玩一下,所以给钱就做,不管你的需求合理不合理,比如甲方想给智障人士开发一款数独小游戏,好,给钱,签合同,支付定金,开工。


开工了3天,甲方突然说,那个我想加个魔方游戏。不好意思,不行,立即停止开发,开始和甲方掰扯,如果掰扯不明白,就终止合同,如果掰扯明白就继续。


不说了,我要和甲甲甲甲甲方掰扯去了。

作者:Data_Adventure
来源:juejin.cn/post/7256590619412676663

收起阅读 »

项目开发过程中,成员提离职,怎么办?

之前写过一篇《如何应对核心员工提离职》反响特别好,今天做个延展篇,在项目过程中,员工突然提离职,我们有什么办法让项目按时按质的上线。项目做多了,总会碰到这种情况。这里给大家介绍一个解决项目问题的分析方法:从问题本身、环境、问题的主体三个方面去思考解决方案。通常...
继续阅读 »

之前写过一篇《如何应对核心员工提离职》反响特别好,今天做个延展篇,在项目过程中,员工突然提离职,我们有什么办法让项目按时按质的上线。

项目做多了,总会碰到这种情况。这里给大家介绍一个解决项目问题的分析方法:从问题本身、环境、问题的主体三个方面去思考解决方案。

通常情况下,一个员工向上级提出离职,那意味着他已经下决心走了,你留得住人,留不住心。而且这段时间,最好别派太多活,他只想早点交接完早点离开。

我们试着从环境、问题本身、问题主体三个方面来思考解决方案。

环境

  • 从问题发生的环境看,如果我们有一个好的氛围,好的企业文化。员工会不会突然突出离职?或者哪怕提出离职,会不会给我们更多一点时间,在离职期间仍然把事情做好?如果答案是肯定的,那么管理者可以尝试从问题发生的上游解决问题。
  • 提前安排更多的资源来做项目,预防资源不足的情况发生。比如整体预留了20%的开发时间做缓冲,或者整体安排的工作量比规划的多20%。

问题本身

从问题本身思考,员工离职导致的问题是资源不够用。

  • 新增资源,能不能快速找到替代离职员工的人?或者我们能不能使用外包方式完成需求?跟团队商量增加一些工作时间或提高工作效率?
  • 减少需求,少做一些不是很重要的需求,把离职员工的需求分给其他人。

这2个解决方案其实都有一个前提,那就是离职人员的代码是遵循编码规范的,这样接手的人才看得懂。否则,需要增加的资源会比原来规划的多很多。这种问题不能靠员工自觉,而应该要有一套制度来规范编码。

问题的主体

我们不一定能解决问题,但可以解决让问题发生的人。这样问题就不存在了。比如,既然问题出现在张三面前,那就想办法搞定张三,让他愿意按计划把项目完成。如果公司里没人能搞定这个事,这里还有另一个思路,就是想想谁能解决这个问题,找那个能解决问题的人。

从环境、问题本身、问题的主体三个维度来分析,我们得到了好几个解决方案。我们接着分析哪种方案更靠谱。

解决方案分析

方案一,从环境角度分析,让问题不发生。这种成本是最小的。但如果问题已经发生,那这个方案就没用了。

方案二,在项目规划的时候,提前安排更多资源。这招好是好,但前提是你公司有那么多资源。大部分公司都是资源不足。

方案三,新增资源,这个招人不会那么快,就算招进来了,一时半会还发挥不出多大的价值。请外包的话,其实跟招人一样,一时半会还发挥不出多大的价值,成本还更高,也不适合。至于跟团队成员商量提高工作效率或者大家加个班赶上进度,这也是一个解决方案。不过前提是团队还有精力承担这些工作。

方案四,减少需求。这个成本最小,对大部分公司其实也适用。关键是需求管理要做好,对需求的优先级有共识。

方案五,解决让问题发生的人。这个如果不是有大的积怨,也是一个比较好的方案。对整个项目来说,成本也不会很大,项目时间和质量都有保证。

项目管理里有一个生命周期概念,越是在早期发生问题,成本越小。越到后期成本越大。所以,如果让我选,我会选择方案一。但如果已经发生,那只能在四和五里选一个。

实战经验

离职是一场危机管理

让问题不发生,那么解决之道就是不让员工离职。尤其是不让核心骨干员工提离职。离职就是一场危机管理。

这里的本质的是人才是资产,我们在市场上看到很多案例,很多企业的倒闭并不是因为经营问题,而是管理层的大批量流失,资本市场也不看好管理层流失的企业。了解这点,你就能理解为什么人才是资产了。所以对企业来说,核心员工离职不亚于一场危机。

下面分享一个危机管理矩阵,这样有助于我们对危机进行分类。

横轴是一件事情发生之后,危害性有多大,我们分为大、中、小。纵轴就是这件事发生的概率,也可以分为大、中、小。然后就形成了九种不同的类型。

我自己的理解是,有精力的话,上图红色区域是需要重点关注的。如果精力有限,就关注最右边那三种离职后,危害性特别大的员工(不管概率发生的大小)。要知道给企业造成大影响的往往是那些发生概率小的,因为概率大的,你肯定有预防动作,而那些你认为不会离职的员工,突然一天找到你提离职,你连什么准备都没,这种伤害是最大的。

理论上所有岗位都应该准备好”接班人“计划,但实际上很多公司没办法做到。在一些小公司是一个萝卜一个坑,这个岗位人员离职,还得现招。这不合理,但这就是现状。

公司如何管理危机?

好,回到公司身上,公司如何管理危机?

第一,稳住关键性员工,让员工利益和公司利益进行深入绑定。

那些创造利润最大的前10~20%的员工,就应该获得50%甚至更高的收益。当然除了金钱上的激励外,还要有精神上的激励,给他目标,让他有成就感等等。

第二,有意识地培养关键岗位的接班人或者助理。

比如通过激励鼓励他们带新人、轮岗等等

第三,人员的危机管理是动态变化的,要时不时地明确团队各成员的位置。

比如大公司每年都会做人才盘点。

第四,当危机真的出现后,要有应对方案。

也就是把危机控制在可承受的范围内。比如,项目管理中的planB方案,真遇到资源不够,时间不够的情况下,我们能不能放弃一些不重要的需求?亦或者能不能先用相对简单但可用的方案?

离职管理的核心是:降低离职发生的概率和降低离职造成危害的大小。

离职沟通

如果事情已经发生了,管理者应该先通过离职沟通,释放自己的善意。我会按照如下情况跟离职员工沟通

第一,先做离职沟通,了解对方为什么离职?还有没有留下来的可能,作为管理者有什么能帮他做的?

第二,确定走的话,确认下对方期望的离职时间,然后根据公司情况,协商一个双方都能接受的离职时间点。不要因为没有交接人,就不给明确时间。

第三,征求对方意见,是否需要公布离职。然后一起商量这段时间的工作安排。比如,你会坦诚告知会减少工作量,但哪些工作是需要他继续支持的。希望他能一如既往地高效完成工作。

第四,如果还没有交接人到岗,最好在一周内安排人员到岗,可以考虑内部换岗,内招、猎聘等手段尽快让人员到岗。

第五,如果已经到离职时间,但还没有交接人,作为公司管理者,你就是最好的交接人。在正式交接工作之前,要理清楚需要哪些相关的资料,做好文档分类。如果实在对离职员工的工作不了解,可以让离职人员写一封日常工作的总结。

如果做完这些,离职员工还是消极怠工。作为管理者能做得就比较有限,可以尝试以下几个方法

1、再进行一次沟通。表明现在公司的情况,希望他给予支持。

2、看看自己能给予对方哪些帮助,先把这些落实好。比如写推荐信。另外有些公司入职的时候会做背景调查,这也是你能够帮助到他的。

3、如果你有权利,可以跟离职员工商量是否可以以兼职的方式来完成后续工作。这种方式对大家都好,他可以早点离职,你也不用担心因为时间仓促招错人。

如果做完以上这些还不行,那么就考虑减少一些需求,用更简单的方案先用着,后期做迭代。至于说让团队加班加点赶进度,这个要根据项目实际情况来定。

总结:今天给大家分享了一个简单分析问题的方法。然后重点聊了一下项目成员突然要离职,项目负责人有哪些应对方案。如果你看完有收获,欢迎留言讨论。


作者:石云升
链接:https://juejin.cn/post/7147319129542770702
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

程序员提高效率的办法

最重要的-利用好工具 🔧工欲善其事必先利其器,利用好的知识外脑来帮助自己,学会使用AI大模型 比如Chagpt等;http://www.dooocs.com/chatgpt/REA…1. 早上不要开会 📅每个人一天是 24 小时,时间是均等的,但是时...
继续阅读 »

最重要的-利用好工具 🔧

工欲善其事必先利其器,利用好的知识外脑来帮助自己,学会使用AI大模型 比如Chagpt等;http://www.dooocs.com/chatgpt/REA…

1. 早上不要开会 📅

每个人一天是 24 小时,时间是均等的,但是时间的价值却不是均等的,早上 1 小时的价值是晚上的 4 倍。为什么这么说?

因为早晨是大脑的黄金时间,经过一晚上的睡眠,大脑经过整理、记录、休息,此时的状态是最饱满的,适合专注度高的工作,比如编程、学习外语等,如果把时间浪费在开会、刷手机等低专注度的事情上,那么就会白白浪费早上的价值。

2. 不要使用番茄钟 🍅

有时候在专心编程的时候,会产生“心流”,心流是一种高度专注的状态,当我们专注的状态被打破的时候,需要 15 分钟的时候才能重新进入状态。

有很多人推荐番茄钟工作法,设定 25 分钟倒计时,强制休息 5 分钟,之后再进入下一个番茄钟。本人在使用实际使用这种方法的时候,经常遇到的问题就是刚刚进入“心流”的专注状态,但番茄钟却响了,打破了专注,再次进入这种专注状态需要花费 15 分钟的时间。

好的替换方法是使用秒表,它跟番茄钟一样,把时间可视化,但却是正向计时,不会打破我们的“心流”,当我们编程专注度下降的时候中去查看秒表,确定自己的休息时间。

3. 休息时间不要玩手机 📱

大脑处理视觉信息需要动用 90% 的机能,并且闪烁的屏幕也会让大脑兴奋,这就是为什么明明休息了,但是重新回到工作的时候却还是感觉很疲惫的原因。

那么对于休息时间内,我们应该阻断视觉信息的输入,推荐:

  • 闭目养神 😪
  • 听音乐 🎶
  • 在办公室走动走动 🏃‍♂️
  • 和同事聊会天 💑
  • 扭扭脖子活动活动 💁‍♂️
  • 冥想 or 正念 🧘

4. 不要在工位上吃午饭 🥣

大脑经过一早上的编程劳累运转之后,此时的专注度已经下降 40%~50%,这个时候我们需要去重启我们的专注度,一个好的方法是外出就餐,外出就餐的好处有:

  • 促进血清素分泌:我们体内有一种叫做血清素的神经递质,它控制着我们的睡眠和清醒,外出就餐可以恢复我们的血清素,让我们整个人神经气爽:

    • 日光浴:外出的时候晒太阳可以促进血清素的分泌
    • 有节奏的运动:走路是一种有节奏的运动,同样可以促进血清素分泌
  • 激发场所神经元活性:场所神经元是掌控场所、空间的神经细胞,它存在于海马体中,外出就餐时场所的变化可以激发场所神经元的活性,进而促进海马体活跃,提高我们的记忆力

  • 激活乙酰胆碱:如果外出就餐去到新的餐馆、街道,尝试新的事物的话,可以激活我们体内的乙酰胆碱,它对于我们的“创作”和“灵感”起到非常大的作用。

5. 睡午觉 😴

现在科学已经研究表现,睡午觉是非常重要的一件事情,它可以:

  • 恢复我们的身体状态:26 分钟的午睡,可以让下午的工作效率提升 34%,专注力提升 54%。
  • 延长寿命:中午不睡午觉的人比中午睡午觉的人更容易扑街
  • 预防疾病:降低老年痴呆、癌症、心血管疾病、肥胖症、糖尿病、抑郁症等

睡午觉好处多多,但也要适当,15 分钟到 30 分钟的睡眠最佳,超过的话反而有害。

6. 下午上班前运动一下 🚴

下午 2 点到 4 点是人清醒度最低的时候,10 分钟的运动可以让我们的身体重新清醒,提高专注度,程序员的工作岗位和场所如果有限,推荐:

  • 1️⃣ 深蹲
  • 2️⃣ 俯卧撑
  • 3️⃣ 胯下击掌
  • 4️⃣ 爬楼梯(不要下楼梯,下楼梯比较伤膝盖,可以向上爬到顶楼,再坐电梯下来)

7. 2 分钟解决和 30 秒决断 🖖

⚒️ 2 分钟解决是指遇到在 2 分钟内可以完成的事情,我们趁热打铁把它完成。这是一个解决拖延的小技巧,作为一个程序员,经常会遇到各种各样的突发问题,对于一些问题,我们没办法很好的决策要不要立即完成,2 分钟解决就是一个很好的辅助决策的办法。

💣 30 秒决断是指对于日常的事情,我们只需要用 30 秒去做决策就好了,这源于一个“快棋理论”,研究人员让一个著名棋手去观察一盘棋局,然后分别给他 30 秒和 1 小时去决定下一步,最后发现 30 秒和 1 小时做出的决定中,有 90% 都是一致的。

8. 不要加班,充足睡眠 💤

作为程序员,我们可能经常加班到 9 点,到了宿舍就 10 点半,洗漱上床就 12 点了,再玩会儿手机就可以到凌晨 2 、3 点。

压缩睡眠时间,大脑就得不到有效的休息,第二天的专注度就会降低,工作效率也会降低,这就是一个恶性循环。

想想我们在白天工作的时候,其实有很多时间都是被无效浪费的,如果我们给自己强制设定下班时间,创新、改变工作方式,高效率、高质量、高密度的完成工作,那是否就可以减少加班,让我们有更多的自由时间去学习新的知识技术,进而又提高我们的工作效率,形成一个正向循环。

9. 睡前 2 小时 🛌

  1. 睡前两小时不能做的事情:

    • 🍲 吃东西:空腹的时候会促进生长激素,生长激素可以提高血糖,消除疲劳,但如果吃东西把血糖提高了,这时候生长激素就停止分泌了
    • 🥃 喝酒
    • ⛹️ 剧烈运动
    • 💦 洗澡水过高
    • 🎮 视觉娱乐(打游戏,看电影等)
    • 📺 闪亮的东西(看手机,看电脑,看电视)
    • 💡 在灯光过于明亮的地方
  2. 适合做的事情

    • 📖 读书
    • 🎶 听音乐
    • 🎨 非视觉娱乐
    • 🧘‍♂️ 使身体放松的轻微运动

10. 周末不用刻意补觉 🚫

很多人以周为单位进行休息,周一到周五压缩睡眠,周末再补觉,周六日一觉睡到下午 12 点,但这与工作日的睡眠节奏相冲突,造成的后果就是星期一的早上起床感的特别的厌倦、焦躁。

其实周末并不需要补觉,人体有一个以天为单位的生物钟,打破当前的生物钟周期,就会影响到下一个生物钟周期,要调节回来也需要花费一定时间。

我们应该要以天为单位进行休息,早睡早起,保持每天的专注度。

参考

以上大部分来源于书籍 《为什么精英都是时间控》,作者桦泽紫苑;


作者:dooocs
链接:https://juejin.cn/post/7255189463747543095
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

从零开始搭建个人网站

伴随着颈椎疼痛的困扰,此时的我不敢轻易扭动脖子,宛如一只梗着脖子的傻猫。好在个人博客网站基本搭建完毕,尽管下一个任务紧迫,但它没有任何盈利点。现在,只需简单总结一下,就能稍微松口气了。个人博客网站功能设计炫酷展示:独特页面展示博客列表,包括标题和发布日期,可通...
继续阅读 »

伴随着颈椎疼痛的困扰,此时的我不敢轻易扭动脖子,宛如一只梗着脖子的傻猫。好在个人博客网站基本搭建完毕,尽管下一个任务紧迫,但它没有任何盈利点。现在,只需简单总结一下,就能稍微松口气了。

个人博客网站功能设计

炫酷展示:独特页面展示博客列表,包括标题和发布日期,可通过点击链接阅读完整内容。

分类与标签:文章分类和标签,助力读者按主题或关键词快速筛选和浏览感兴趣的内容。

神奇搜索:强大而快捷的模糊搜索功能,让读者迅速找到心仪文章,关键词轻松搜。

探秘联系:Github的联系方式隐藏在神秘角落,前往解锁更多关于开发者的信息。

响应式布局:兼容各设备,个人主页灵活展示在桌面、平板和手机,畅享极致用户体验。

数据剖析:揭示访问统计与分析报告,文章点击、来源追踪,读者行为一览无余。数据助力个人优化内容、领略读者趣味。

主题风格:提供浅色模式和暗黑模式,页面可一键换装或跟随系统。

为什么是Next.js和vercel?

首先是这样最简单,从基友的劳动成果中扒拉了整个技术架构。在此基础上,我又做了一些页面的功能的扩展,比如全文模糊搜索、继续阅读、文章目录等。【叉腰】

服务器渲染(SSR)可以给博客带来超棒的性能和超棒的SEO优化。它会让页面加载速度变得超快,还能让搜索引擎更好地抓取和索引博客内容。(但现在还不能搜到我的文章ε=(´ο`*))))

Vercel作为部署平台。它简单易用,超快速而且靠谱。最重要的是,它能跟Next.js完美结合,让我轻轻松松地将我的应用程序部署到全球分布式网络上。它还提供自动化的CI/CD流程,让我可以专注于撰写博客内容,而不用花费太多时间和精力在繁琐的部署和服务器配置上。

赞美基友!

UI设计的灵感来源

页面布局

首页的布局模仿nextjs框架的样本页,它本身拥有响应式布局。

首页的内容并不需要太多,所以保留了样本页的单屏设计,页面不需要滚动就能展示完整的内容。页面分为三个模块:顶部为面包屑按钮区,中间区域面积最大,突出博主猫奴本色,底部则包含了三个菜单,分别作为专栏文章和其他项目的链接入口。

对于专栏文章列表页的布局,首先需要考虑两个主要模块:专栏标题和描述,文章列表的标题和发布时间。在PC端,按2:3比例左右分栏,移动端按2:8比例上下分栏。顶部和首页类似有漂亮的手绘按钮点缀页面,还有一只正在认真工作的猫猫作为背景,增添趣味。

文章内容页的布局设计采用主流的设计,基本上在每个教程文档都能看见这样的布局方式。布局是类似的,但怎样才能做得好看点呢?如何用颜色+透明度、字号+行高的奇妙组合创造美的魔术?对于个人网站,这很大程度依赖于个人的审美喜好,以及最重要的、很容易被个人开发者忽略的一点:考虑读者的阅读体验。

关于颜色

浅色模式的颜色来源于我的=月白色的瓷碗,和瓷碗里的黄米汤圆。降低一点饱和度,调成目前主流的莫兰迪色系,给人一种温柔的感觉。我喜欢性格温和的人,希望自己也变得温柔一些。

深色模式中,很多网站都呈现出超棒的视觉效果,我个人最喜欢tailwind的配色。这种模式下的背景傻猫露出了其暗黑的一面,似乎正在谋划消灭人类,重建一个有吃不完的小鱼干和虾虾的新世界。

图标和图片

小图标采用阿里iconfont的手绘风格系列,给页面增添了一抹生动与活泼。

背景图由网图和两个手绘Icon图标巧妙拼合而成,似乎在讲述一个工作猫的故事。在图中,你可以看到一只憨憨的小猫专注地盯着电脑屏幕,右爪按住鼠标,而鼠标线的末端却连接着一个毛线团,给人一种不太聪明的印象。

问题和解决方案

  1. 浅色和深色模式转换的解决方案,哪个最方便快捷?

项目使用的组件库mantine提供了MantineProvider组件,可用于更改主题。

import { MantineProvider } from '@mantine/core';

function Demo() {
return (
<MantineProvider theme={{ fontFamily: 'Open Sans' }} withGlobalStyles>
<App />
</MantineProvider>
);
}

theme属性可用来传递其它任意风格属性。withGlobalStyles 这个属性可以增加几个样式,其中一个就是深色模式的颜色和浅色模式的颜色。

但我并没有使用这个方案,原因有三:

杀鸡用牛刀既视感,theme提供了很多选项默认值,但除了颜色,其它用不上。
主题色色彩不够多,如果想要更多颜色,需要修改它的css变量。而tailwind的颜色选择范围更多,添加透明度也很方便。
相比于在js中修改样式,我更喜欢在css中完成同样的功能。

比如,使用tailwind,仅需在某个className加上前缀 dark:,比如dark:bg-slate-900, 表示bg-slate-900在深色模式下生效。具体如何使用可以参考tailwind官网,这里不做赘述。

  1. 老大难useEffect。

当需要使用useEffect监听事件时,有时候只想在组件 mounted 前执行某些操作,而不希望随着状态的变化而不停地更新。对于那个状态,我会创建一个ref值,就像是一块“不会变形的金属”。这样,我可以在useEffect中使用这个ref值作为判断依据,而不会受到状态的干扰。

然而,还有一种情况无法绕开。由Context上下文提供的value值 和 updateValue方法,updateValue需要在某个子组件的useEffect中监听事件而触发。

  1. Tailwind SVG 样式未生效

tailwind支持处理SVG图标的样式,比如你可以这样写一个svg的颜色:

<svg class="fill-blue-500 ..."> <!-- ... --> </svg>

<svg class="stroke-blue-500 ..."> <!-- ... --> </svg>

可是,对于我下载的那些手绘图标,上述方法却不起作用,包括stroke属性也无效。我猜测可能与图标的path路径有关。脑海中浮现出一个解决方案:使用全局provider来传递主题色作为参数,并将其赋值给fill属性。但是,我实在太懒了,不想采用那么繁琐的方式,也不想依赖市面上已有的状态管理方案。

fill属性接受的值是颜色,同样可以使用currentColor,它会继承最近祖先元素的颜色,类似于inherit的效果。当fill属性不存在或为空字符串时,默认会被填充为黑色。然而,这些手绘图标似乎并不理会tailwind针对svg的className属性,反而继承了更上一级的颜色。既然如此,那解决方案就是在引用这些图标的组件中指定颜色。

  1. sticky不粘了。 通常,我们知道,英文文档的中文翻译总有一些令人困惑的小问题。但这一次,是mdn的中文文档略胜一筹。例如,在stick相关文档中:

This value always creates a new stacking context. Note that a sticky element "sticks" to its nearest ancestor that has a "scrolling mechanism" (created when overflow is hiddenscrollauto, or overlay), even if that ancestor isn't the nearest actually scrolling ancestor.

注意,一个 sticky 元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的 overflow 是 hiddenscrollauto 或 overlay 时),即便这个祖先不是最近的真实可滚动祖先。

中文文档明确多了这一句话:

这有效地抑制了任何“sticky”行为(详情见 Github issue on W3C CSSWG)。

如果不看这句话,中英文文档都会让人以为是要在overflow有这些值的时候才生效。然而事实却完全相反。在我去掉藏在 body 中的overflow-x:hidden后, sticky终于能按预期触发了。

  1. 模糊查询算法和匹配文本标记

前文提到,贴心而又温柔的笔者为网站提供了搜索功能。搜索功能的界面和常见开发文档的Spotlight看起来基本上一样,不同的是细节的模糊查询功能。

一个具备模糊查询的Spotlight看起来像这样:

(好吧,截图的时候又发现自己漏了个细节,搜索文章内容节选的前后省略号。烦)

关于模糊查询算法,可以看这里探秘Fuse.js:模糊查询算法的学习笔记,这里不做赘述。

而匹配文本颜色标记,这个功能需要自己来实现,大致需求是,找出最佳匹配的文章内容节选展示在Spotlight的搜索结果列表里。解析md文档,去掉那些不想要的md文档标记符号,再循环找出最佳匹配区间作为节选内容,节选内容不超过30个字。

以上。


作者:Kiera
链接:https://juejin.cn/post/7247024731442479163
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

什么是设计思维?

你有没有想过事情是否可以采取不同的方式, 但又不确定如何做?那么,不要爱上解决方案,而是爱上问题!这是一篇深入探讨设计思维如何做到这一点的文章。在快节奏的行动和反应的世界中,高质量的结果是我们所有人的目标。但是你怎样才能做得更好呢?无论是产品、服务还是流程,我...
继续阅读 »

你有没有想过事情是否可以采取不同的方式, 但又不确定如何做?那么,不要爱上解决方案,而是爱上问题!这是一篇深入探讨设计思维如何做到这一点的文章。

在快节奏的行动和反应的世界中,高质量的结果是我们所有人的目标。但是你怎样才能做得更好呢?无论是产品、服务还是流程,我们的目标都是让事情变得更好。它让我们想知道我们将如何设计一个漫长而公平的世界以达到一定程度的卓越。

当我们谈论让“事情变得更好”时,我们不能否认看板系统在丰田实施 TQM(全面质量管理)中的作用。如果TQM为制造业做到了这一点,那么设计思维就有可能为创新带来以人为本的解决方案。

设计思维采用以人为本的方法,以便在我们跳入所有可能的解决方案之前了解如何处理问题。我们可以看到它在各个地方的使用。嗡嗡声无处不在,从社会部门到政策制定,从医疗保健到商业。那么什么是设计思维呢?

设计思维的意义 

设计思维促进以创造性的方式解决复杂问题,这种方式优先考虑人类的需求,并着重于寻找技术上可行的创造性解决方案。

虽然很难用几个词来定义“设计思维”,但我宁愿将设计思维视为一种哲学或一种思维方式,以解决难以用传统和标准方法解决的复杂问题解决问题的实践。设计思维采取的途径是提供以下解决方案:可行的、可行的和可取的。

一般来说,问题的解决方案有时会被传统的解决方法所忽视,而有些方法是高度理性和分析性的,而另一些则是情绪化的。设计思维可能只是增加人类问题的理性、情感和功能需求的第三种方式。设计思维不仅限于建筑产品;任何促进创新的新举措都可以利用解决问题的设计思维原则。

起源 

虽然没有确凿的证据表明设计思维的起源,但设计思维作为一种思维方式可以追溯到John E. Arnold,他是斯坦福大学“创意工程”研究的先驱,机械工程教授。他是最早撰写有关设计思维的少数人之一,并将设计思维的种子视为一种运动。他的讲座激发了更多的想象力和创新性。他的问题解决理论通过将问题的个人、科学和实践方面联系起来,着重于人类需求。

他强调了像艺术家一样处理问题并将人类作为想要构建的解决方案的基石的重要性。“创意问题”没有一个正确答案。

“工程师可以承担艺术家的某些方面,并通过美化或改善产品或机器的外观,或者通过对市场以及人们想要或不想要的东西的种类具有更敏锐的敏感性来尝试改善或增加产品或机器的适销性'想要。— 约翰·E·阿诺德*

设计思维过程 

在对设计思维进行情境化和应用的努力中,它通常被认为是一个过程,该过程可以指导价值观来控制如何处理问题。这个过程可能不一定是线性的或顺序的,而是一个对特定问题或用例有意义的循环。

设计思维过程

EMPATHIZE - 移情 

为人类设计可能很棘手。有时,需求或愿望未被发现,可能无法完全反映真正的问题。传统的市场研究过程是根据事实进行的,而设计思维方法是通过同理心来解决问题。同理心试图理解潜在需求并转化环境的当前现实。这有助于解决方案设计人员了解可以解释问题的人员、他们的行为和上下文,从而构建更好的解决方案。

因此,从问题中获得灵感的第一步是了解设计的对象以及他们寻求解决方案的动机。这对于企业了解可用的机会空间尤其有用。就像苹果所做的那样。虽然 MP3 播放器已经成为一种东西,但iPod 改变了人们消费音乐的方式。当索尼凭借随身听和 CD 统治消费电子市场时,苹果公司凭借 iPod彻底改变了音乐世界。Apple 对人们随身携带盒式磁带的问题深表同情,而 iPod 改变了游戏规则!

为了识别和理解问题的脉搏并结合这一步的背景,收集信息是关键。这是与问题空间中的人交谈以了解他们关心什么以及他们目前如何处理问题的地方。用户访谈和他们的反馈可以帮助了解他们的情况。

DEFINE - 定义 

这是形成问题的最重要步骤之一。

在设计思维中,构思不当的问题陈述为构建“问题”而非“问题”的解决方案铺平了道路。

例如,与某人谈论一个问题。记录下观察结果,并以合理的解决方案来解决该问题。用户对解决方案可能会解决该问题感到兴奋。但这里真正发生的是你和那个人一直在讨论他们许多其他问题中的一个问题。因此,他们是否决定采用你的解决方案取决于此人对你承诺解决的问题的重视程度。

在这里,定义问题的脉搏变得非常重要。 通常,事后看来,焦点会落在你试图解决的问题上,而不是这个人可能实际遇到的许多其他问题。

因此,定义问题对引导如何着手构建以人为本的解决方案大有帮助。

IDEATE - 构思 

在此阶段,观察结果会找到归宿,加以综合以创造改变的机会。集思广益来定义和重新定义潜在的解决方案,以创建解决问题的竞争想法。理想情况下,这一步可以帮助找到问题的核心。

如前所述,这不会是一个线性过程,可能经常会发现自己在共同努力挑战想法或问题本身时会回到之前的步骤。因此,可以挑选出好的想法来实施。

PROTOTYPE - 原型 

下一阶段是原型,可以通过创建最终解决方案的模型来验证想法。解决方案采用有形的形式来展示原型实施阶段的证据。它还展示了在构思阶段未说明的想法的限制和局限性。

Uber 是成功构建出色原型的经典公司之一。Uber 在最初发布时专注于解决“找出租车”的核心问题。该产品的第一个测试版是一个非常简约的应用程序,所有订单都是手动管理的,CEO 可以联系司机预订行程。而且它没有付费功能。目标是测试和验证叫车问题,这是该应用程序的核心优势。最终,当他们了解了目标市场和痛点后,他们开始改进其他功能。

TEST - 测试 

然后将最终原型与目标群体进行测试,并反复进行以适应学习方式。验证在这里采用最终形式,并且可能再次要求重新访问之前的一些步骤以大规模实施该计划。

行动中的设计思维 - 案例研究 

  1. 社会部门的设计思维 

疟疾是非洲最令人不安的问题之一,也是5 岁以下儿童死亡的前 5 大原因之一。这是一个本质上非常复杂的社会问题,分发蚊帐的设计思维方法有助于有效地对抗这种疾病。世界卫生组织报告称,埃塞俄比亚和卢旺达等国家的死亡率下降了 50%-60% ,加纳下降了 34%。

结果发现,蚊帐的设计对加纳的一些人没有吸引力。一组研究人员确定了一个潜在的解决方案来解决让人们使用网络的问题。他们提出了一种以人为本的蚊帐设计,为长期解决这一社会问题铺平了道路。

以人为本的蚊帐设计方法。( 大预览 

  1. 爱彼迎 

设计思维在改造一家几近失败的公司——Airbnb 方面也发挥了巨大的作用。他们的业务正在瘫痪,当他们遇到问题时,他们发现广告中的图片效果不佳。展出的照片是用劣质手机拍摄的。当看到网站上的照片时,想租房的人觉得他们没有看到他们实际支付的是什么。创始人一意识到这一点,就租了一台相机,为客户的财产拍下好照片。创始人之一杰比亚 (Gebbia)继续解释设计学校的经历如何帮助他们重塑自我,更好地为客户服务。

  1. 网飞 

另一个家喻户晓的品牌 Netflix 已经取得了长足的进步,设计思维在他们做出的决策中发挥了重要作用。Netflix 推出了直接送货上门的 DVD 租赁服务,而其他竞争对手则让人们开车穿过商店挑选电影。

后来当有线电视开始提供点播电影时,Netflix 了解了客户的痛点,开始按月提供在线流媒体服务,而无需为每张 DVD 付费。他们建立了一个订阅模式的在线目录,让客户在家中舒适地观看他们最喜欢的电影的便利性使他们感到高兴。

当选择要观看的内容比实际观看要花费更长的时间时,Netflix 想出了“预览”来帮助人们选择要观看的内容。听起来很简单,但 Netflix推荐系统背后的想法有助于减少人们花在决定观看内容上的时间。虽然变化是不可避免的,但 Netflix 不断通过设计思维方法重塑自己,以发现以最终用户为中心的创新解决方案。

从租用 DVD 到在线流媒体,Netflix 一直致力于了解最终用户,以以人为本的方式设计解决方案。

不仅如此。清单不胜枚举。

最后的想法 

设计思维一直在不断发展。人们一直在为使其在各个领域的使用情境化更有用做出贡献。根据问题的大小和复杂性,应用设计思维框架并着手创建以人为本的解决方案具有不同的形式。

考虑到它的灵活性,设计思维可以帮助熟悉并适应歧义。该方法可以在各种规模上动态地进行游戏,使其成为一项有价值的追求。

从想要解决的任何问题开始尝试,并在下面的评论中告诉我它是如何工作的。如果你愿意,我很乐意倾听并提供帮助。

相关资源 


作者:aeasy
链接:https://juejin.cn/post/7248453787215626301
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

技术人创业是怎么被自己短板KO的

这几天搜索我的聊天记录,无意中看到了一个两年前的聊天消息。那是和我讨论出海业务的独立开发网友,后来又去创业的业界精英。顺手一搜,当初他在我的一个开发者群也是高度活跃的人群之一,还经常私下给我提建议,人能力很强,做出海矩阵方向的项目做的很拿手。但是在后来忽然就没...
继续阅读 »

这几天搜索我的聊天记录,无意中看到了一个两年前的聊天消息。那是和我讨论出海业务的独立开发网友,后来又去创业的业界精英。顺手一搜,当初他在我的一个开发者群也是高度活跃的人群之一,还经常私下给我提建议,人能力很强,做出海矩阵方向的项目做的很拿手。但是在后来忽然就没消息了,虽然人还留在群里。

我好奇点开了他的朋友圈,才知道他已经不做独立开发了,而且也(暂时)不在 IT 圈里玩了,去帮亲戚家的服装批发业务打打下手,说是下手,应该也是二当家级别了,钱不少,也相对安稳。朋友圈的画风以前是IT行业动态,出海资讯现在是销售文案和二维码。

和他私下聊了几句,他跟我说他现在过的也还好,人生路还长着呢,谈起了自己在现在这行做事情的经历,碎碎念说了不少有趣的事情,最后还和我感慨说:“转行后感觉脑子灵活了很多”,我说那你写程序的时候脑子不灵活吗,他发了个尴尬而不失礼貌的表情,“我以前技术搞多了,有时候死脑筋。”

这种话我没少听过,但是从一个认识(虽然是网友)而且大跨度转行的朋友这里说出来,就显得特别有说服力。尤其了解了他的经历后,想写篇文章唠叨下关于程序员短板的问题,还有这种短板不去补强,会怎么一步步让路越走越窄的。

现在离职(或者被离职)的程序员越来越多了,程序员群体,尤其是客户端程序员这个群体,只要能力过得去,都有全栈化和业务全面化的潜力。尤其是客户端程序员,就算是在公司上班时,业余时间写写个人项目,发到网上,每个月赚个四到五位数的副业收入也是可以的。

再加上在公司里遇到的各种各样的窝囊事,受了无数次“煞笔领导”的窝囊气,这会让一些程序员产生一种想法,我要不是业余时间不够,不然全职做个项目不就起飞了?

知道缺陷在哪儿,才能扬长避短,所以我想复盘一下,程序员创业,在主观问题上存在哪些短板。(因为说的是总体情况,也请别对号入座)

第一,认死理。

和代码,协议,文档打交道多了,不管自己情愿不情愿,人多多少少就有很强的“契约概念”,代码的世界条理清晰,因果分明,1就是1,0就是0,在这样的世界里呆多了,你要说思维方式不被改变,那是不可能的 --- 而且总的来说,这种塑造其实是好事情。要不然也不会有那么多家长想孩子从小学编程了。(当然了,家长只是想孩子学编程,不是做程序员。)

常年埋头程序的结果,很容易让技术人对于社会上很多问题的复杂性本质认识不到位,恐惧,轻视,或者视而不见,总之,喜欢用自己常年打磨的逻辑能力做一个推理,然后下一个简单的结论。用毛爷爷的话说,是犯了形而上的毛病。

例如,在处理iOS产品上架合规性一类问题时,这种毛病暴露的就特别明显。

比如说相信一个功能别的产品也是这么做的,也能通过审核,那自己照着做也能通过。但是他忽略了这种判断背后的条件是,你的账号和别的账号在苹果眼里分量也许不同的,而苹果是不会把这件事写在文档上的。

如果只是说一说不要紧,最怕的是“倔”,要不怎么说是“认死理”呢。

第二,喜欢拿技术套市场。

这个怎么理解呢,就是有追求的技术人喜欢研究一些很强的技术,但是研究出来后怎么用,也就是落实到具体的应用场景,就很缺点想象力了。

举个身边有意思的例子,有个技术朋友花了三年时间业余时间断断续续的写,用 OpenGL 写了一套动画效果很棒的 UI 引擎,可以套一个 View 进去后定制各种酷炫的动画效果。做出来后也不知道用来干嘛好,后来认识了一个创业老板,老板一看你这个效果真不错啊,你这引擎多少钱我买了,朋友也没什么概念,说那要不五万卖你。老板直接钱就打过去了。后来老板拿给手下的程序员维护,用这套东西做了好几个“小而美”定位的效率工具,简单配置下就有酷炫的按钮动画效果,配合高级的视觉设计逼格拉满,收入怎么样我没问,但是苹果在好几个国家都上过推荐。

可能有人要说,那这个程序员哥哥没有UI帮忙啊,对,是这个理,但是最根本的问题是,做小而美工具这条路线,他想都没想到,连意识都意识不到的赚钱机会,怎么可能把握呢?有没有UI帮忙那是实现层的门槛而已。

第三,不擅长合作。

为什么很多创业赚到小钱(马化腾,李彦宏这些赚大钱就不说了,对我们大部分人没有参考价值)而且稳定活下来的都是跑商务,做营销出身的老板。

他们会搞钱。

他们会搞钱,是因为他们会搞定人,投资人,合伙人,还有各种七七八八的资源渠道。

大部分人,在创业路上直接卡死在这条路线上了。

投资人需要跑,合作渠道需要拉,包括当地的税务减免优惠,创业公司激励奖金,都需要和各种人打交道才能拿下来。

那我出海总行了吧,出海就不用那么麻烦了吧。不好意思,出海的合作优势也是领先的,找海外的自媒体渠道合作,给产品提曝光。坚持给苹果写推荐信,让自家产品多上推荐。你要擅长做这些,就不说比同行强一大截,起码做出好产品后创业活下来的希望要高出不少,还有很多信息差方法论,需要进圈子才知道。

--- 

我说的这些,不是贬损也不是中伤,说白了,任何职业都有自己的短板,也就是我们说的职业病,本来也不是什么大不了的事情。只是我们在大公司拧螺丝的时候,被保护的太好了。

只是创业会让一个人的短处不断放大,那是因为你必须为自己的选择负责了,没人帮你擦屁股了背锅了。所以短板才显得那么刺眼。

最后说一下,不是说有短板就会失败,谁没点短处呢。写出来只是让自己和朋友有更好的自我认知,明白自己的长处在哪,短处在哪。

最后补一个,左耳朵耗子的事情告诉我们,程序员真的要保养身子,拼到最后其实还是拼身体,活下来才有输出。


作者:风海铜锣
链接:https://juejin.cn/post/7238443713873199159
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

工作 7 年的老程序员,现在怎么样了

犹记得高中班主任说:“大家努力考上大学,大学没人管,到时候随便玩”。我估计很多老师都这么说过。我考上大学(2010年)之前也是这么过的。第一年哥哥给买了个一台华硕笔记本电脑。那个年代买华硕的应该不少,我周边就好几个。有了电脑之后,室友就拉着我一起 cs,四个人...
继续阅读 »

犹记得高中班主任说:“大家努力考上大学,大学没人管,到时候随便玩”。我估计很多老师都这么说过。

我考上大学(2010年)之前也是这么过的。第一年哥哥给买了个一台华硕笔记本电脑。那个年代买华硕的应该不少,我周边就好几个。有了电脑之后,室友就拉着我一起 cs,四个人组队玩,那会觉得很嗨,上头。

后来看室友在玩魔兽世界,那会不知道是什么游戏,就感觉很好玩,再后来就入坑了。还记得刚开始玩,完全不会,玩个防骑,但是打副本排DPS,结果还被人教育,教育之后还不听(因为别的职业不会玩),就经常被 T 出组。之后,上课天天看游戏攻略和玩法,或者干脆看小说。前两年就这么过去了

1 跟风考研

大三开始,觉得这么混下去不行了。在豆瓣上找了一些书,平时不上课的时候找个自习室学习。那会家里打电话说有哪个亲戚家的孩子考研了,那是我第一次知道“考研”这个词。那会在上宏微观经济学的课,刚好在豆瓣上看到一本手《牛奶面包经济学》,就在自习室里看。刚好有个同院系的同学在里面准备考研,在找小伙伴一起战斗(毕竟,考研是一场长跑,没有同行者,会很艰难)。我一合计,就加入了他们的小团队。从此成为“中国合伙人”(刚好四个人)中的一员。

我那会也不知道毕业了之后能去哪些公司,能找哪些岗位,对于社会完全不了解,对于考研也是完全不了解。小团队中的三个人都是考金融学,我在网上查,知道了学硕和专硕的区别,也知道专硕学费贵。我家里没钱,大学时期的生活费都是自己去沃尔玛、麦当劳、发传单挣得,大学四年,我在沃尔玛工作超过了 2 年、麦当劳半年,食堂倒盘子半年,中途还去发过传单,暑假还去实习。没钱,他们考金融学专硕,那我就靠经济学学硕吧,学硕学费便宜。

从此开始了考研之路。

2 三次考研

大三的时候,报名不是那么严格,混进去报了名,那会还没开始看书,算是体验了一把考研流程;

还记得那次政治考了 48 分,基本都过了很多学校的单科线,那会就感觉政治最好考(最后发现,还是太年轻)。

大四毕业那年,把所有考研科目的参数书都过了 2 遍,最后上考场,最后成绩也就刚过国家线。

毕业了,也不知道干啥,就听小伙伴的准备再考一次,之前和小伙伴一起来了北京,租了个阳台,又开始准备考研。结果依然是刚过国家线。这一年也多亏了一起来北京的几个同学资助我,否则可能都抗不过考试就饿死街头了。

总结这几次考研经历,失败的最大原因是,我根本不知道考研是为了什么。只是不知道如果工作的话,找什么工作。刚好别人提供了这样一个逃避工作的路,我麻木的跟着走而已。这也是为什么后面两次准备的过程中,一有空就看小说的原因。

但是,现在来看,我会感谢那会没有考上,不然就错过了现在喜欢的技术工作。因为如果真的考上了经济学研究生,我毕业之后也不知道能干啥,而且金融行业的工作我也不喜欢,性格上也不合适,几个小伙伴都是考的金融,去的券商,还是比较了解的。

3 入坑 JAVA 培训

考完之后,大概估了分,知道自己大概率上不了就开始找工作了。那会在前程无忧上各种投简历。开始看到一个做外汇的小公司,因为我在本科在一个工作室做过外汇交易相关的工作,还用程序写了一段量化交易的小程序。

所以去培训了几天,跟我哥借了几千块钱,注册了一个账号,开始买卖外汇。同时在网上找其他工作。

后面看介绍去西二旗的一家公司面试,说我的技术不行,他们提供 Java 培训(以前的套路),没钱可以贷款。

我自己也清楚本科一行 Java 代码没写过,直接工作也找不到工作。就贷款培训了,那会还提供住宿,跟学校宿舍似的,上下铺。

4 三年新手&非全研究生

培训四个月之后,开始找工作。那会 Java 还没这么卷,而且自己还有个 211 学历,一般公司的面试还是不少的。但是因为培训的时候学习不够刻苦(也是没有基础)。最后进了一个小公司,面试要 8000,最后给了 7000。这也是我给自己的最底线工资,少于这个工资就离开北京了,这一年是 2015 年。

这家公司是给政府单位做内部系统的,包括中石油、气象局等。我被分配其中一个组做气象相关系统。第二年末的时候,组内的活对我来说已经没什么难度了,就偷偷在外面找工作,H3C 面试前 3 面都通过了,结果最后大领导面气场不符,没通过。最后被另外一家公司的面试官劝退了。然后公司团建的时候,大领导也极力挽留我,最后没走成。

这次经历的经验教训有 2 个,第 1 个是没有拿到 offer 之前,尽量不要被领导知道。第 2 个是,只要领导知道你要离职,就一定要离职。这次就是年终团建的时候,被领导留下来了。但是第二年以各种理由不给工资。

之前自己就一直在想出路,但是小公司,技术成长有限,看书也对工作没有太大作用,没有太大成长。之后了解到研究生改革,有高中同学考了人大非全。自己也就开始准备非全的考试。最后拿到录取通知书,就开始准备离职了。PS:考研准备

在这家公司马上满 3 年重新签合同的时候,偷偷面试了几家,拿到了 2 个还不错的 offer。第二天就跟直属领导提离职了。这次不管直属领导以及大领导如何劝说,还是果断离职了。

这个公司有两个收获。一个是,了解了一般 Java Web 项目的全流程,掌握了基本开发技能,了解了一些大数据开发技术,如Hadoop套件。另外一个是,通过准备考研的过程,也整理出了一套开发过程中应该先思而后行。只有先整理出

5 五年开发经历

第二家公司是一家央企控股上市公司,市场规模中等。主要给政府提供集成项目。到这家公司第二年就开始带小团队做项目,但是工资很低,可能跟公司性质有关。还好公司有宿舍,有食堂。能省下一些钱。

到这家公司的时候,非全刚好开始上课,还好我们 5 点半就下班,所以我天天卡点下班,大领导天天给开发经理说让我加班。但是第一学期要上课,领导对我不爽,也只能这样了。

后来公司来了一个奇葩的产品经理,但是大领导很挺他,大领导下面有 60 号人,研发、产品、测试都有。需求天天改,还不写在文档上。研发都开发完了,后面发现有问题,要改回去,产品还问,谁让这么改的。

是否按照文档开发,也是大领导说的算,最后你按照文档开发也不对,因为他们更新不及时;不按照文档开发也不对,写了你不用。

最后,研发和产品出差,只能同时去一波人,要是同时去用户现场,会打架。最后没干出成绩,产品和大领导一起被干走了。

后面我们整体调整了部门,部门领导是研发出身。干了几个月之后,领导也比较认可我的能力,让我带团队做一个中型项目,下面大概有 10 号人,包括前后端和算法。也被提升为开发经理。

最后因为工资、工作距离(老婆怀孕,离家太远)以及工作内容等原因,跳槽到了下一家互联网公司。

6 入行互联网

凭借着 5 年的工作经历,还算可以的技术广度(毕竟之前啥都干),985 学校的非全研究生学历,以及还过得去的技术能力。找到了一家知名度还可以的互联网公司做商城开发。

这个部门是公司新成立的部门,领导是有好几家一线互联网经验的老程序员,技术过硬,管理能力强,会做人。组内成员都年轻有干劲。本打算在公司大干一场,涨涨技术深度(之前都是传统企业,技术深度不够,但是广度可以)。

结果因为政策调整,整个部门被裁,只剩下直属领导以及领导的领导。这一年是 2020 年。这个时候,我在这个公司还不到 1 年。

7 再前行

拿着上家公司的大礼包,马上开始改简历,投简历,面试,毕竟还有房贷要还(找了个好老婆,她们家出了大头,付了首付),马上还有娃要养,一天也不敢歇息。

经过一个半月的面试,虽然挂的多,通过的少。最终还是拿了 3 个不错的offer,一个滴滴(滴滴面经)、一个XXX网络(最终入职,薪资跟滴滴基本差不多,技术在市场上认可度也还不错。)以及一个建信金科的offer。

因为大厂部门也和上家公司一样,是新组建的部门,心有余悸。然后也还年轻,不想去银行躺平,也怕银行也不靠谱,毕竟现在都是银行科技公司,干几年被裁,更没有出路。最终入职XXX网络。

8 寒冬

入职XXX网络之后,开始接入公司的各种技术组件,以及看到比较成熟的需求提出、评估、开发、测试、发布规范。也看到公司各个业务中心、支撑中心的访问量,感叹还是大公司好,流程规范,流量大且有挑战性。

正要开心的进入节奏,还没转正呢(3 个月转正),组内一个刚转正的同事被裁,瞬间慌得一批。

刚半年呢,听说组内又有 4 个裁员指标,已经开始准备简历了。幸运的是,这次逃过一劫。

现在已经 1 年多了,在这样一个裁员消息满天飞的年代,还有一份不错的工作,很幸运、也很忐忑,也在慢慢寻找自己未来的路,共勉~

9 总结

整体来看,我对自己的现状还算满意,从一个高中每个月 300 块钱生活费家里都拿不出来;高考志愿填报,填学校看心情想去哪,填专业看专业名字的的村里娃,走到现在在北京有个不错的工作,组建了幸福的家庭,买了个不大不小的房子的城里娃。不管怎么样,也算给自己立足打下了基础,留在了这个有更多机会的城市;也给后代一个更高的起点。

但是,我也知道,现在的状态并不稳固,互联网工作随时可能会丢,家庭成员的一场大病可能就会导致整个家庭回到解放前。

所以,主业上,我的规划就是,尽力提升自己的技术能力和管理能力,争取能在中型公司当上管理层,延迟自己的下岗年龄;副业上,提升自己的写作能力,尝试各种不同的主题,尝试给各个自媒体投稿,增加副业收入。

希望自己永远少年,不要下岗~


作者:六七十三
链接:https://juejin.cn/post/7173506418506072101
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

北宋 赵普:成事法则

前言 老规矩,唠唠嗑~ 1、历史才是真正值得我们去学习、去研究的 我们处于21世纪,相对于比以前更加先进,经济也更加发达了,但是你也会发现信息碎片化了,然后我们每天接收各种各样的海量的数据,真正对我们成长没有一丁点的好处。 我觉得原因有几个:第一还是信息碎片...
继续阅读 »

8e0dc884457ed5fb795606f4a251441e.jpg


前言




老规矩,唠唠嗑~


1、历史才是真正值得我们去学习、去研究的


我们处于21世纪,相对于比以前更加先进,经济也更加发达了,但是你也会发现信息碎片化了,然后我们每天接收各种各样的海量的数据,真正对我们成长没有一丁点的好处。


我觉得原因有几个:第一还是信息碎片化,东一块西一块,你无法吃透某个领域,形成自己的知识体系;第二你接收到的信息大部分是别人想让你知道的,你被人当“枪”使了,第三个知识是别人嚼过一次的半成品,我们习惯性的搬运,没有经过自己的思考,那么这些信息也是没有多大价值的。


比如抖音有个“不提倡苦难让我们成长的一种说法”,我的思考是这样的:苦难是环境+个人因果里面一种情况,就像一瓶水,里面有水、塑料瓶、包装构造成的一种东西。我们学过王阳明在龙场悟道,曾国藩在经历贬官、人生挫折之后,换了个人。里面最重要一点,是人在挫折面前存活了下来,然后是做事方式、思考方式变了,这才是最为关键的。


如果你没有变化,苦难还是那个苦难,不提倡感恩苦难还是那么一句话,没有一点营养。经过我们这番思考之后,如何改变做事方式,如何改变思考方式才是我们要提高的,才是有营养的东西!



我们虽然处于一个现代化的时代,但是做事方式、思考方式甚至智慧,不一定超越古人。



所以冯唐老师:“历史是一块磨刀石,在不同人眼中,增长智慧”


2、成长需要老师


在我人生成长路上,我都会选某些优秀的人作为榜样去学习,这使得我成长飞快。最重要的原因是,人容易以自己常用的方法来处理事情,那么就会固守踏步不前,正是因为有这些优秀的老师,我们才能一直前进学习。


我有这么一个亲戚,我老叔,他儿子都很厉害,厅级,我老叔为人处事比较强,家教里面有这么一段话:就是跟别人有矛盾不要到处讲,甚至反其道帮助别人。当然啦,这个一般人达不到的境界,我们来看看历史上韩信,当他贫穷的时候受到了胯下之辱,从别人胯下爬过去,当他功成名就的时候没有去记仇,所以有这等气概之人一般都会有所作为。


当然我们今天想聊的另一个角色:北宋 赵普,就不是这样有气概的一个人,我们不能以一个很高的标准去要求其他人这样做,气概会分为好几等,曾国藩讲看一个人未来的成就,就看他有多少气概。


我们今天这位是北宋 赵普,我是在《百家讲坛》王立群老师讲述北宋历史中认识的,三次为相,最吸引我的点是做事犀利,眼光同样犀利,这正是我们成事所追求的。


北宋-赵普 生平




他辅佐了两代皇帝,三次拜相,跟历史上很著名的事件都有关联,陈桥兵变,黄袍加身,将赵匡胤扶上了皇帝,然后在治理方针上也有独到的见解,先治理南方再北方,整顿内政,做事相当犀利,当然缺点也是有的,这里我们略过,因为我们主要学习里面的成事法则。


有人讲他没有什么业绩,或者重大的贡献,我们来看看他做了哪些事情


他所做突出事件


1、陈桥兵变,黄袍加身 关键参与者


赵普不仅是宰相,还是谋士。960年,在赵光义和赵普等人的策划下,太祖在陈桥驿发动兵变,随即成功登基,赵普因拥立之功升任右谏议大夫。


我们跟现实对比,就像你能否帮你老板提升一个level,甚至好几个level,做的东西能够提升整个团队影响力,产出可以影响其他团队的价值的事情,这个非常有难度的。


2、治理方针


赵匡胤经常登门找赵普,有一次问他你的治理想法是什么,他说先南方后北方,南方相对比较肥沃,资源比较多,其次北方有契丹,让另一个敌对势力去抵挡,这样不会消耗精力,可以看出他在平时是有研究的,不会在这种突发的检查中慌乱。


杯酒释兵权,也是在他的劝说下,赵匡胤实施了,对于稳定的局势是有帮助的。


3、二次拜相给出有价值的东西


太宗赵光义即位的时候,位置不太符合常规,赵普给出当年的“金匮之盟”,让太宗的位置合理了,然后让他儿子继位也搞定了,赵普给了很有价值的东西。


4、治理内政


打掉了“五人帮”,还有另一个“大师集团”,这是非常厉害的两件事,比如说让你打掉你们公司某些团体哈哈哈,可想而知很难的,第一个没有背景,第二个很容易翻车,特别是“大师集团”,那是太宗赵光义专门去保的,最后还是被赵普办成铁案,翻不了盘,在我眼中看到了做事的犀利。


5、为老板解围


前几任老板打契丹,都无功而返,很多人站出来指责,最后是赵普承担了所有,然后在晚年也极力推荐人才,标准是人靠谱,不耍聪明。


成事法则




1、有眼界、有经验


我们做一件事的时候,需要去研究,别人有没有比较好的方案,而不是瞎折腾,比如apm方案、全链路灰度,其实业界早有成熟的方案让我们来借鉴,这样我们再结合自己团队的特点特殊化,让整个技术方案更加稳健。


其次是不会慌乱,如果你对问题平时有研究,就不会自乱阵脚,看到一个段子:泰森面对重拳也会晕过去,正是因为实力够强,练习够多,才能轻松应对。


2、干对事、干好事


赵普虽然说没有做出什么杰出贡献,所以他每次对这个岗位都很有动力,给他一个空间他能干出很大的事业出来,但是你仔细去看他干过的事情,非常细致,也很有价值。


比如说我们日常工作中也有一些重要的工作,也有一些修修补补的工作,当然那些重要的工作价值会更大,不一定是你能拿到的,你懂的,我们尽可能眼光要犀利点,比如说将一个功能做成一个系统,这样它的价值是辐射性向其他项目、其他团队产出价值。


做事计划周密,让我想起一个朋友跟我讲他们架构师推ddd,最后没推成被辞退。当我们在做计划前,需要调研,明白ddd解决的问题是什么,团队推不下去的原因可能是什么,团队的特点是怎样的,我们的计划应该怎么调整,这是非常关键,最后跟主要干系人沟通,让他们参与进来,而不是自己yy一套不适合方案然后直接推,你都没有沟通过别人的意见,还有没有获得别人的支持,所以在推的过程会很多问题。


说直白点,ddd是为了解决系统庞大之后错综复杂的关系,提高扩展能力,同时你也要意识到业务团队的特点,业绩为大,时间紧迫,不可能全套搬迁到应用到,只能针对性的改造!


3、职场角色扮演


小兵角色,就是博主这个角色啦,哈哈。我认为很重要的一点:主动性,只有你主动参与事件的一员,你才能改变点什么,做出点什么贡献,其次整个团队、项目也是在这种主动性基础推进更快,更稳健。因为规则只能保证基本的流程,而且它也需要优化的,也没有创造性的能力。第二个:有眼力,能够发现有价值的闪光点,第三个:做事计划周密,第四个;行动力,跟第一个有所重叠。


领导的角色,因为我这方面经验比较少,所以只能大概聊聊。第一个有主见,有原则,你对某些问题有研究,有自己的判断,赵普正是因为这个被百官推崇,不会说你老板一会改一个需求,你的团队跟着变,这样做不好事情的,团队劳累,所以需要一个比较强势的领导。第二个,有背景、有支持度,在公司做事还是在其他地方做事都一样,需要点人脉、资源,不然你的方案比较难推进的,没有主要干系人的支持,你怎么获得大多数人的支持呢对吧。第三个:同样是有眼光,这个不分等级,就跟我们高考一样,只不过题型变了,解题思路不变的,什么事情价值更大一些。


最后引用孙子一段话“知己知彼,百战不殆”,这句话非常简单,但是你真正去做会发现很多的细节,所以我们上面总结很多的要点,关键还是在事上去练我们这种成事的技能。


作者:大鸡腿同学
来源:juejin.cn/post/7259372449833254969
收起阅读 »

10年程序员,想对新人说什么?

前言 最近知乎上,有一位大佬邀请我回答下面这个问题,看到这个问题我百感交集,感触颇多。在我是新人时,如果有前辈能够指导方向一下,分享一些踩坑经历,或许会让我少走很多弯路,节省更多的学习的成本。 这篇文章根据我多年的工作经验,给新人总结了25条建议,希望对你会有...
继续阅读 »

前言


最近知乎上,有一位大佬邀请我回答下面这个问题,看到这个问题我百感交集,感触颇多。图片在我是新人时,如果有前辈能够指导方向一下,分享一些踩坑经历,或许会让我少走很多弯路,节省更多的学习的成本。


这篇文章根据我多年的工作经验,给新人总结了25条建议,希望对你会有所帮助。


1.写好注释


很多小伙伴不愿意给代码写注释,主要有以下两个原因:



  1. 开发时间太短了,没时间写注释。

  2. 《重构》那本书说代码即注释。


我在开发的前面几年也不喜欢写注释,觉得这是一件很酷的事情。


但后来发现,有些两年之前的代码,业务逻辑都忘了,有些代码自己都看不懂。特别是有部分非常复杂的逻辑和算法,需要重新花很多时间才能看明白,可以说自己把自己坑了。


没有注释的代码,不便于维护。


因此强烈建议大家给代码写注释。


但注释也不是越多越好,注释多了增加了代码的复杂度,增加了维护成本,给自己增加工作量。


我们要写好注释,但不能太啰嗦,要给关键或者核心的代码增加注释。我们可以写某个方法是做什么的,主要步骤是什么,给算法写个demo示例等。


这样以后过了很长时间,再去看这段代码的时候,也会比较容易上手。


2.多写单元测试


我看过身边很多大佬写代码有个好习惯,比如新写了某个Util工具类,他们会同时在test目录下,给该工具类编写一些单元测试代码。


很多小伙伴觉得写单元测试是浪费时间,没有这个必要。


假如你想重构某个工具类,但由于这个工具类有很多逻辑,要把这些逻辑重新测试一遍,要花费不少时间。


于是,你产生了放弃重构的想法。


但如果你之前给该工具类编写了完整的单元测试,重构完成之后,重新执行一下之前的单元测试,就知道重构的结果是否满足预期,这样能够减少很多的测试时间。


多写单元测试对开发来说,是一个非常好的习惯,有助于提升代码质量。


即使因为当初开发时间比较紧,没时间写单元测试,也建议在后面空闲的时间内,把单元测试补上。


3.主动重构自己的烂代码


好的代码不是一下子就能写成的,需要不断地重构,修复发现的bug。


不知道你有没有这种体会,看自己1年之前写的代码,简直不忍直视。


这说明你对业务或者技术的理解,比之前更深入了,认知水平有一定的提升。


如果有机会,建议你主动重构一下自己的烂代码。把重复的代码,抽取成公共方法。有些参数名称,或者方法名称当时没有取好的,可以及时修改一下。对于逻辑不清晰的代码,重新梳理一下业务逻辑。看看代码中能不能引入一些设计模式,让代码变得更优雅等等。


通过代码重构的过程,以自我为驱动,能够不断提升我们编写代码的水平。


4.代码review很重要


有些公司在系统上线之前,会组织一次代码评审,一起review一下这个迭代要上线的一些代码。


通过相互的代码review,可以发现一些代码的漏洞,不好的写法,发现自己写代码的坏毛病,让自己能够快速提升。


当然如果你们公司没有建立代码的相互review机制,也没关系。


可以后面可以多自己review自己的代码。


5.多用explain查看执行计划


我们在写完查询SQL语句之后,有个好习惯是用explain关键字查看一下该SQL语句有没有走索引


对于数据量比较大的表,走了索引和没有走索引,SQL语句的执行时间可能会相差上百倍。


我之前亲身经历过这种差距。


因此建议大家多用explain查看SQL语句的执行计划。


关于explain关键字的用法,如果你想进一步了解,可以看看我的另外一篇文章《explain | 索引优化的这把绝世好剑,你真的会用吗?》,里面有详细的介绍。


6.上线前整理checklist


在系统上线之前,一定要整理上线的清单,即我们说的:checklist


系统上线有可能是一件很复杂的事情,涉及的东西可能会比较多。


假如服务A依赖服务B,服务B又依赖服务C。这样的话,服务发版的顺序是:CBA,如果顺序不对,可能会出现问题。


有时候新功能上线时,需要提前执行sql脚本初始化数据,否则新功能有问题。


要先配置定时任务。


上线之前,要在apollo中增加一些配置。


上线完成之后,需要增加相应的菜单,给指定用户或者角色分配权限。


等等。


系统上线,整个过程中,可能会涉及多方面的事情,我们需要将这些事情记录到checklist当中,避免踩坑。


7.写好接口文档


接口文档对接口提供者,和接口调用者来说,都非常重要。


如果你没有接口文档,别人咋知道你接口的地址是什么,接口参数是什么,请求方式时什么,接口多个参数分别代码什么含义,返回值有哪些字段等等。


他们不知道,必定会多次问你,无形当中,增加了很多沟通的成本。


如果你的接口文档写的不好,写得别人看不懂,接口文档有很多错误,比如:输入参数的枚举值,跟实际情况不一样。


这样不光把自己坑了,也会把别人坑惨。


因此,写接口文档一定要写好,尽量不要马马虎虎应付差事。


如果对写接口文档比较感兴趣,可以看看我的另一篇文章《瞧瞧别人家的API接口,那叫一个优雅》,里面有详细的介绍。


8.接口要提前评估请求量


我们在设计接口的时候,要跟业务方或者产品经理确认一下请求量。


假如你的接口只能承受100qps,但实际上产生了1000qps。


这样你的接口,很有可能会承受不住这么大的压力,而直接挂掉。


我们需要对接口做压力测试,预估接口的请求量,需要部署多少个服务器节点。


压力测试的话,可以用jmeter、loadRunner等工具。


此外,还需要对接口做限流,防止别人恶意调用你的接口,导致服务器压力过大。


限流的话,可以基于用户id、ip地址、接口地址等多个维度同时做限制。


可以在nginx层,或者网关层做限流。


9.接口要做幂等性设计


我们在设计接口时,一定要考虑并发调用的情况。


比如:用户在前端页面,非常快的点击了两次保存按钮,这样就会在极短的时间内调用你两次接口。


如果不做幂等性设计,在数据库中可能会产生两条重复的数据。


还有一种情况时,业务方调用你这边的接口,该接口发生了超时,它有自动重试机制,也可能会让你这边产生重复的数据。


因此,在做接口设计时,要做幂等设计。


当然幂等设计的方案有很多,感兴趣的小伙伴可以看看我的另一篇文章《高并发下如何保证接口的幂等性?》。


如果接口并发量不太大,推荐大家使用在表中加唯一索引的方案,更加简单。


10.接口参数有调整一定要慎重


有时候我们提供的接口,需要调整参数。


比如:新增加了一个参数,或者参数类型从int改成String,或者参数名称有status改成auditStatus,参数由单个id改成批量的idList等等。


建议涉及到接口参数修改一定要慎重。


修改接口参数之前,一定要先评估调用端和影响范围,不要自己偷偷修改。如果出问题了,调用方后面肯定要骂娘。


我们在做接口参数调整时,要做一些兼容性的考虑。


其实删除参数和修改参数名称是一个问题,都会导致那个参数接收不到数据。


因此,尽量避免删除参数和修改参数名。


对于修改参数名称的情况,我们可以增加一个新参数,来接收数据,老的数据还是保留,代码中做兼容处理。


11.调用第三方接口要加失败重试


我们在调用第三方接口时,由于存在远程调用,可能会出现接口超时的问题。


如果接口超时了,你不知道是执行成功,还是执行失败了。


这时你可以增加自动重试机制


接口超时会抛一个connection_timeout或者read_timeout的异常,你可以捕获这个异常,用一个while循环自动重试3次。


这样就能尽可能减少调用第三方接口失败的情况。


当然调用第三方接口还有很多其他的坑,感兴趣的小伙伴可以看看我的另一篇文章《我调用第三方接口遇到的13大坑》,里面有详细的介绍。


12.处理线上数据前,要先备份数据


有时候,线上数据出现了问题,我们需要修复数据,但涉及的数据有点多。


这时建议在处理线上数据前,一定要先备份数据


备份数据非常简单,可以执行以下sql:


create table order_2022121819 like `order`;
insert into order_2022121819 select * from `order`;

数据备份之后,万一后面哪天数据处理错了,我们可以直接从备份表中还原数据,防止悲剧的产生。


13.不要轻易删除线上字段


不要轻易删除线上字段,至少我们公司是这样规定的。


如果你删除了某个线上字段,但是该字段引用的代码没有删除干净,可能会导致代码出现异常。


假设开发人员已经把程序改成不使用删除字段了,接下来如何部署呢?


如果先把程序部署好了,还没来得及删除数据库相关表字段。


当有insert请求时,由于数据库中该字段是必填的,会报必填字段不能为空的异常。


如果先把数据库中相关表字段删了,程序还没来得及发。这时所有涉及该删除字段的增删改查,都会报字段不存在的异常。


所以,线上环境字段不要轻易删除。


14.要合理设置字段类型和长度


我们在设计表的时候,要给相关字段设置合理的字段类型和长度。


如果字段类型和长度不够,有些数据可能会保存失败。


如果字段类型和长度太大了,又会浪费存储空间。


我们在工作中,要根据实际情况而定。


以下原则可以参考一下:



  • 尽可能选择占用存储空间小的字段类型,在满足正常业务需求的情况下,从小到大,往上选。

  • 如果字符串长度固定,或者差别不大,可以选择char类型。如果字符串长度差别较大,可以选择varchar类型。

  • 是否字段,可以选择bit类型。

  • 枚举字段,可以选择tinyint类型。

  • 主键字段,可以选择bigint类型。

  • 金额字段,可以选择decimal类型。

  • 时间字段,可以选择timestamp或datetime类型。


15.避免一次性查询太多数据


我们在设计接口,或者调用别人接口的时候,都要避免一次性查询太多数据。


一次性查询太多的数据,可能会导致查询耗时很长,更加严重的情况会导致系统出现OOM的问题。


我们之前调用第三方,查询一天的指标数据,该接口经常出现超时问题。


在做excel导出时,如果一次性查询出所有的数据,导出到excel文件中,可能会导致系统出现OOM问题。


因此我们的接口要做分页设计


如果是调用第三方的接口批量查询接口,尽量分批调用,不要一次性根据id集合查询所有数据。


如果调用第三方批量查询接口,对性能有一定的要求,我们可以分批之后,用多线程调用接口,最后汇总返回数据。


16.多线程不一定比单线程快


很多小伙伴有一个误解,认为使用了多线程一定比使用单线程快。


其实要看使用场景。


如果你的业务逻辑是一个耗时的操作,比如:远程调用接口,或者磁盘IO操作,这种使用多线程比单线程要快一些。


但如果你的业务逻辑非常简单,在一个循环中打印数据,这时候,使用单线程可能会更快一些。


因为使用多线程,会引入额外的消耗,比如:创建新线程的耗时,抢占CPU资源时线程上下文需要不断切换,这个切换过程是有一定的时间损耗的。


因此,多线程不一定比单线程快。我们要根据实际业务场景,决定是使用单线程,还是使用多线程。


17.注意事务问题


很多时候,我们的代码为了保证数据库多张表保存数据的完整性和一致性,需要使用@Transactional注解的声明式事务,或者使用TransactionTemplate的编程式事务。


加入事务之后,如果A,B,C三张表同时保存数据,要么一起成功,要么一起失败。


不会出现数据保存一半的情况,比如:表A保存成功了,但表B和C保存失败了。


这种情况数据会直接回滚,A,B,C三张表的数据都会同时保存失败。


如果使用@Transactional注解的声明式事务,可能会出现事务失效的问题,感兴趣的小伙伴可以看看我的另一篇文章《聊聊spring事务失效的12种场景,太坑了》。


建议优先使用TransactionTemplate的编程式事务的方式创建事务。


此外,引入事务还会带来大事务问题,可能会导致接口超时,或者出现数据库死锁的问题。


因此,我们需要优化代码,尽量避免大事务的问题,因为它有许多危害。关于大事务问题,感兴趣的小伙伴,可以看看我的另一篇文章《让人头痛的大事务问题到底要如何解决?》,里面有详情介绍。


18.小数容易丢失精度


不知道你在使用小数时,有没有踩过坑,一些运算导致小数丢失了精度。


如果你在项目中使用了float或者double类型的数据,用他们参与计算,极可能会出现精度丢失问题。


使用Double时可能会有这种场景:


double amount1 = 0.02;
double amount2 = 0.03;
System.out.println(amount2 - amount1);

正常情况下预计amount2 - amount1应该等于0.01


但是执行结果,却为:


0.009999999999999998

实际结果小于预计结果。


Double类型的两个参数相减会转换成二进制,因为Double有效位数为16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差。


因此,在做小数运算时,更推荐大家使用BigDecimal,避免精度的丢失。


但如果在使用BigDecimal时,使用不当,也会丢失精度。



BigDecimal amount1 = new BigDecimal(0.02);
BigDecimal amount2 = new BigDecimal(0.03);
System.out.println(amount2.subtract(amount1));

这个例子中定义了两个BigDecimal类型参数,使用构造函数初始化数据,然后打印两个参数相减后的值。


结果:


0.0099999999999999984734433411404097569175064563751220703125

使用BigDecimal的构造函数创建BigDecimal,也会导致精度丢失。


如果如何避免精度丢失呢?


BigDecimal amount1 = BigDecimal.valueOf(0.02);
BigDecimal amount2 = BigDecimal.valueOf(0.03);
System.out.println(amount2.subtract(amount1));

使用BigDecimal.valueOf方法初始化BigDecimal类型参数,能保证精度不丢失。


19.优先使用批量操作


有些小伙伴可能写过这样的代码,在一个for循环中,一个个调用远程接口,或者执行数据库的update操作。


其实,这样是比较消耗性能的。


我们尽可能将在一个循环中多次的单个操作,改成一次的批量操作,这样会将代码的性能提升不少。


例如:


for(User user : userList) {
   userMapper.update(user);
}

改成:


userMapper.updateForBatch(userList);

20.synchronized其实用的不多


我们在面试中当中,经常会被面试官问到synchronized加锁的考题。


说实话,synchronized的锁升级过程,还是有点复杂的。


但在实际工作中,使用synchronized加锁的机会不多。


synchronized更适合于单机环境,可以保证一个服务器节点上,多个线程访问公共资源时,只有一个线程能够拿到那把锁,其他的线程都需要等待。


但实际上我们的系统,大部分是处于分布式环境当中的。


为了保证服务的稳定性,我们一般会把系统部署到两个以上的服务器节点上。


后面哪一天有个服务器节点挂了,系统也能在另外一个服务器节点上正常运行。


当然也能会出现,一个服务器节点扛不住用户请求压力,也挂掉的情况。


这种情况,应该提前部署3个服务节点。


此外,即使只有一个服务器节点,但如果你有api和job两个服务,都会修改某张表的数据。


这时使用synchronized加锁也会有问题。


因此,在工作中更多的是使用分布式锁


目前比较主流的分布式锁有:



  1. 数据库悲观锁。

  2. 基于时间戳或者版本号的乐观锁。

  3. 使用redis的分布式锁。

  4. 使用zookeeper的分布式锁。


其实这些方案都有一些使用场景。


目前使用更多的是redis分布式锁。


当然使用redis分布式锁也很容易踩坑,感兴趣的小伙伴可以看看我的另一篇文章《聊聊redis分布式锁的8大坑》,里面有详细介绍。


21.异步思想很重要


不知道你有没有做过接口的性能优化,其中有一个非常重要的优化手段是:异步


如果我们的某个保存数据的API接口中的业务逻辑非常复杂,经常出现超时问题。


现在让你优化该怎么优化呢?


先从索引,sql语句优化。


这些优化之后,效果不太明显。


这时该怎么办呢?


这就可以使用异步思想来优化了。


如果该接口的实时性要求不高,我们可以用一张表保存用户数据,然后使用job或者mq,这种异步的方式,读取该表的数据,做业务逻辑处理。


如果该接口对实效性要求有点高,我们可以梳理一下接口的业务逻辑,看看哪些是核心逻辑,哪些是非核心逻辑。


对于核心逻辑,可以在接口中同步执行。


对于非核心逻辑,可以使用job或者mq这种异步的方式处理。


22.Git提交代码要有好习惯


有些小伙伴,不太习惯在Git上提交代码。


非常勤劳的使用idea,写了一天的代码,最后下班前,准备提交代码的时候,电脑突然死机了。


会让你欲哭无泪。


用Git提交代码有个好习惯是:多次提交。


避免一次性提交太多代码的情况。


这样可以减少代码丢失的风险。


更重要的是,如果多个人协同开发,别人能够尽早获取你最新的代码,可以尽可能减少代码的冲突。


假如你开发一天的代码准备去提交的时候,发现你的部分代码,别人也改过了,产生了大量的冲突。


解决冲突这个过程是很痛苦的。


如果你能够多次提交代码,可能会及时获取别人最新的代码,减少代码冲突的发生。因为每次push代码之前,Git会先检查一下,代码有没有更新,如果有更新,需要你先pull一下最新的代码。


此外,使用Git提交代码的时候,一定要写好注释,提交的代码实现了什么功能,或者修复了什么bug。


如果有条件的话,每次提交时在注释中可以带上jira任务的id,这样后面方便统计工作量。


23.善用开源的工具类


我们一定要多熟悉一下开源的工具类,真的可以帮我们提升开发效率,避免在工作中重复造轮子。


目前业界使用比较多的工具包有:apache的common,google的guava和国内几个大佬些hutool。


比如将一个大集合的数据,按每500条数据,分成多个小集合。


这个需求如果要你自己实现,需要巴拉巴拉写一堆代码。


但如果使用google的guava包,可以非常轻松的使用:


List<Integer> list = Lists.newArrayList(12345);
List<List<Integer>> partitionList = Lists.partition(list, 2);
System.out.println(partitionList);

如果你对更多的第三方工具类比较感兴趣,可以看看我的另一篇文章《吐血推荐17个提升开发效率的“轮子”》。


24.培养写技术博客的好习惯


我们在学习新知识点的时候,学完了之后,非常容易忘记。


往往学到后面,把前面的忘记了。


回头温习前面的,又把后面的忘记了。


因此,建议大家培养做笔记的习惯。


我们可以通过写技术博客的方式,来记笔记,不仅可以给学到的知识点加深印象,还能锻炼自己的表达能力。


此外,工作中遇到的一些问题,以及解决方案,都可以沉淀到技术博客中。


一方面是为了避免下次犯相同的错误。


另一方面也可以帮助别人少走弯路。


而且,在面试中如果你的简历中写了技术博客地址,是有一定的加分的。


因此建议大家培养些技术博客的习惯。


25.多阅读优秀源码


建议大家利用空闲时间,多阅读JDK、Spring、Mybatis的源码。


通过阅读源码,可以真正的了解某个技术的底层原理是什么,这些开源项目有哪些好的设计思想,有哪些巧妙的编码技巧,使用了哪些优秀的设计模式,可能会出现什么问题等等。


当然阅读源码是一个很枯燥的过程。


有时候我们会发现,有些源码代码量很多,继承关系很复杂,使用了很多设计模式,一眼根本看不明白。


对于这类不太容易读懂的源码,我们不要一口吃一个胖子。


要先找一个切入点,不断深入,由点及面的阅读。


我们可以通过debug的方式阅读源码。


在阅读的过程中,可以通过idea工具,自动生成类的继承关系,辅助我们更好的理解代码逻辑。


我们可以一边读源码,一边画流程图,可以更好的加深印象。


当然还有很多建议,由于篇幅有限,后面有机会再跟大家分享。


当然还有很多建议,由于篇幅有限,后面有机会再跟大家分享。


最后欢迎大家加入苏三的知识星球【Java突击队】,一起学习。


星球中有很多独家的干货内容,比如:Java后端学习路线,分享实战项目,源码分析,百万级系统设计,系统上线的一些坑,MQ专题,真实面试题,每天都会回答大家提出的问题。


星球目前开通了6个优质专栏:技术选型、系统设计、Spring源码解读、痛点问题、高频面试题 和 性能优化。


作者:苏三说技术
来源:juejin.cn/post/7259341632700235832
收起阅读 »

有些程序员表面老实,背地里不知道玩得有多花

作者:CODING来源:juejin.cn/post/7259258539164205115


















作者:CODING

来源:juejin.cn/post/7259258539164205115

该怎么放弃你,我的内卷

各位,两个月没写文章了,这两个月发生了很多事,也让我产生了很多不一样的感悟。从上次发完《阅阿里大裁员有感》,我的手机里就推了越来越多的“裁员”、“经济下行”、“焦虑”等信息。我这边现在这家公司,虽然不裁员,但是执行了“SABC”绩效分布考核,什么内容大家应该也...
继续阅读 »

各位,两个月没写文章了,这两个月发生了很多事,也让我产生了很多不一样的感悟。从上次发完《阅阿里大裁员有感》,我的手机里就推了越来越多的“裁员”、“经济下行”、“焦虑”等信息。我这边现在这家公司,虽然不裁员,但是执行了“SABC”绩效分布考核,什么内容大家应该也都清楚,最后给我打了个 B-。呵呵,扣工资 20%,变成所谓的绩效工资,下次考核看情况发放。


很多兄弟看到这可能会替我打抱不平,狗资本家,快去发起劳动仲裁。可是他们马上又下上另一剂猛药,那就是不停的 PUA 你,告诉你现在有家庭,要多努力,要一心扑在工作上,放心,下次一定给你打回来。


我承认,他们这些话术我都看过,基本相当于明牌。可依然我还是被影响到了,情绪十分低落,也没心思去劳动局跟他们 PK。对未来的预期瞬间变得很悲观,人要是一悲观了,真的干什么也提不起兴趣。我一门心思都扑在以后能干什么上,其它的啥也不想管,疯狂的在国内外门户上刷信息,希望能找到一条“赚钱之路”。我研究了 Web3、AI 绘画、搞自媒体、网赚攻略(什么视频搬运、抄书、小说转漫画等等),基本上信息流推给我的,我都研究了一遍。这些玩意越研究越让人焦虑,因为那些标题都起的特别的有煽动性,动不动就日入几万,而我发的那些,浏览量都破不了百。于是我就想研究更多的路子去赚钱,老实说,东南亚那边的情况,我也了解过一些。


后面我对家人的态度也越来越坏,经常不耐烦,看着我小孩我经常叹气,我想这他妈可能就是中年危机提前爆发了,总之那段时间人会越来越焦虑。


后来还是我一兄弟,邀请我一家人去平潭自驾游,我们其实也没玩几天,属于特种兵式旅游,两天两晚(晚上熬夜开车去)。回来之后心情就好多了,也没那么焦虑了。其实本来也没什么,君子不立于危墙之下,这里不行那就走。找不到就先干自己的项目(我有开源项目)。我其实对干这行还是蛮有兴趣的,应该持续坚持的干下去,半途而废干别的是下策。


回想下我那时候焦虑的经历,我以前根本看都不看那种赚钱文章的,因为我知道这些大部分是在卖课,可为什么那时候我着了魔一样呢?其实很大部分与网络有关系,你着急干什么,你就愿意看点什么,你看点什么,网络就给你推什么。这种消极循环人一旦深陷其中,光凭自己是很难走出来的。其实这种时候应该主动去接收一些积极乐观的情绪,有助于自己调整心态,网络给不了你,只有身边人能给你。


更深一步的想,所谓内卷是不是也是通过网络在传播着,深刻的影响到每一个人。所谓的“智能推荐算法”,真的智能吗?大家想看的一定就是适合每个人的吗?你不停的点击去看的信息,真的能帮助到你吗?网络是我们的工具,还是我们是网络的工具?


我想我们真的应该停下来,想想我们到底在多大程度上需要抖音、需要 BiliBili、需要知乎,也许它们真的没这么重要。


人生在世,我们到底应该追逐什么?或者说,追逐什么其实不重要,重要的是我们去追逐的过程。在这个过程中,没有内卷,没有与别人的竞争,只有对自我的审视和成长。


换句话说,我有多久没有好好了解自己了,那些独属于自己的东西,永远不会背叛的资源。我们常说的:能力、人脉、技术、视野。其实除此之外还有很多很多,我刷视频看到的有趣视频点的赞,我 Chrome 里收藏的网页,我百度网盘里躺着的分享资料等等等等,还有最重要的一项,就是我的身体和组成我身体的每一个部分:大脑、心脏、肺...... 有多久没有关注和了解它们了?在这个内卷的时代,每个人都在比拼都在竞争,都怕落于人后,都想快点挣更多的钱,这些,时常让我们忽视了对我们最重要的东西。


有趣的是,每个平台都在疯狂的更新自己的算法,期望能更精准的描述一个人,给人打上各种各样的标签。但在这场竞赛中,没有平台能竞争的过你自己,在这个世界上,只有自己更了解自己。所以我真的感觉它们在做无用功,浪费资源,最好的平台,不是给打各种标签,而是引导每个人发现自己的标签是什么。


这里我想分享给各位几个我思考的点,以供探讨。


原则一:相比与到处去找信息差,更重要的是建立自己的“资源池”


我那时候不停的刷信息,不停的找信息,本质上,我是在幻想着找到一个信息差,从而获利。这也是网上铺天盖地的文章所推崇的,所谓在风口上猪都能飞。但它们总是在掩盖一个逻辑错误,那就是找到信息差和获利之间的因果关系。实际上,找到信息差只是获利的条件之一,你有多大的能力利用这个信息差,这个信息差的时效性,方方面面的因素都会互相交织和影响。


更进一步的想,信息差就像风一样,它存在于冷热空气的交换之时,它存在于各行各业、每时每刻。让我们去追逐风,这现实吗?


我们更应该静下来,好好数数自己手头的东西,整理自己的大脑。找到自己“资源池”有哪些资源,哪些可以为我们所用,哪些可以继续扩充。思路可以打开一点,任何在当前时刻属于你的东西,都是你“资源池”的一部分。


原则二:出卖自己时间和体力的不做


这个不做,不是指不去做,而是指不长期的做。一般入门一个行业或者技术,肯定要付出时间和体力的。但你要说十年如一日的付出相同的东西,那所谓“35 岁”危机就只能找到你了。这点其实各行各业都一样,只是互联网行业处在发声的前沿罢了。


包括所谓网赚、搬运都是一个道理,毫无技术含量的事做几年就好。要时常审视自己现在在干什么,手头有哪些资源,未来的目标是什么。这跟程序运行是一个道理,运行了一段时间,停下来让自己 GC 一下。不然很容易 StackOverflow。


原则三:自己抓住的资源,千万不要轻易放手


如果不经常审视自己的“资源池”,给所有资源估估价值,就很容易被人带坑里。


原先我就做过一个项目,这是个跨部门项目,我那个领导一直告诉我说这个项目没前途、没卵用,绩效也给我打的不好,问我还要不要继续做。我说那就算了吧,做的我都不想做了。


我一放弃,马上就有新人接手,连交接也不用做,代码直接拿走,吃相可见一斑。


也就是从这里我才理解到,我其实没有了解自己,没了解过我手里的项目,被人潜移默化的影响了。影响一个人的思想真的不难,不停的重复就好了。所以还是那句话,多把自己手里的“资源池”拿出来晒一晒,整理一下。


其实 996 也是一样,拿出了你最重要的资源---身体,到底换来了什么,值得好好评估一下。


原则四:做自己喜欢的赛道,更要积累自己的资源


这几个月的经历给我的最大感觉是,这世界上真的有太多太多的行业,也有很多人赚到了钱(至少网络上宣传他们赚了钱)。网络能让这些信息病毒式的传播,导致很多人错觉的以为自己照着做也能挣到钱。但他们忽视的是,网络能把世界各地的人汇聚起来,让信息流通。其实也提供了一个更大的平台,在这个平台里,只有更卷的人才能挣到钱。


有时候真的应该抛开网络。比如,你会写代码,这是你“资源池”里的一项技能,你把这个技能公开到网络售卖。只有两种情况,要么你非常的卷,打拼出一番事业;要么你根本竞争不过别人,这是普遍情况,这世界那么大,比你优秀的人有太多太多了。


但是抛开网络,回到你身边的小小社交圈子,你的技能可能就没那么普遍了。可能你会说,那我做程序员,我身边朋友认识的大部分也是做程序员啊。那么可以这么想,假如你会做菜,你身边的程序员朋友都会做菜吗?假如你会画画,你身边的程序员朋友都会画画吗?人和人总有差异点,你觉得找不到优势,那是因为你尚未建立自己的“资源库”。


先认识自己,再让身边的人认识自己,当他们会给你打标签时,他们就成了你“资源库”中的一员,这就是人脉。这才是是独属于你自己的标签,而不是抖音、B 站为你打的冷冰冷的标签。


总结


以上我感悟的四个原则,我称之为“资源池思维”,一个比较程序员化的名词。


这篇文章发完后,我后续可能就继续更新一下具体的技术文章了,继续深耕技术。


最后,推荐看到最后的各位看一部冷门电影:《神迹》,讲述的是医生维维安托马斯的故事。看完可以来一起交流交流感悟。



本文仅发于掘金平台,禁止未经作者同意转载、复制。


作者:FengY_HYY
来源:juejin.cn/post/7259210874447151163

收起阅读 »

独立开发前100天真正重要的事

我从4月开始离职开始全职做独立开发,算是真正踏进入了这条河流。在过去半年多了我也观察了很多独立开发者。自己目前算是过了新手村(有正常的开发节奏,有3万用户)。看到很多刚起步的独立开发者还是有很多疑问,所以分享一下我在独立开发最初期的一些经验。因为我也不是很成功...
继续阅读 »

我从4月开始离职开始全职做独立开发,算是真正踏进入了这条河流。在过去半年多了我也观察了很多独立开发者。自己目前算是过了新手村(有正常的开发节奏,有3万用户)。看到很多刚起步的独立开发者还是有很多疑问,所以分享一下我在独立开发最初期的一些经验。因为我也不是很成功(没有走的很远),所以只能分享独立开发前100天的经验。


先说一下我认为独立开发起步阶段面临的主要困难:


第一:没有公司的孤独感。如果是一个人全职开发就更寂寞了。即使有一两个合作伙伴,但是大概率也是异地,因此也算是网友性质的社交。人说到底是群居的,所以需要找到一种社交平衡。我想可能这也是很多独立开发白天要在外面地方待着的原因,也许一个人一直在家待着有点闷。


第二:无法建立产品的健康开发节奏。以前在公司的时候自己是流程里的一环,只关心自己分工的完成情况。做了独立开发以后,所有事情都需要自己决策。太多自由的结果就是没了方向。什么都想做,好像什么都可以做,又感觉什么都不好做。


第三:没有收入。产品从开始建造到有足够健康收入中间有一段过程。这还有一个前提要是一个真正有用户价值的产品。如果你起步的时候自己没有一个优势产品方向,又没有个人社区号召力,就算你的产品是好的,也需要一段时间(可长可短)才能获得有效收入。一上线就火的概率太小了。高强度投入一件事情,如果长期没有收入,家人会有很多质疑,可能最后自己也很怀疑自己。


我把这三点结合起来,编一个故事大家可能比较有画面了:



一个人做独立开发已经半年多了,产品设计都是自己做,也没有什么人可以讨论,不知道下一步该做什么。目前每天只有零星的新增。做了这么久,总共只有两三千的收入。看来做产品还得会营销**,打算最近开始学习一下运营**。最近也打算做一下AI产品,感觉这个赛道很火。老婆说如果不行就早点回去上班好了,总不能一直这样。家人们,你们说我应该坚持吗。




家人们会说你的产品很棒,会说你做的比他们强,会说下次一定,会说你未来会成功。但是家人们不会为你掏一分钱。



也许我们不知道如何成功,但是我们可以知道什么是失败。你知道的失败方式越多,你成功的概率就越大。总的来说,产品的成功就两个要点:有用户价值,能赚钱。注意,这两点是或的关系,不是且的关系。一个产品可以能赚钱,但是没有用。一个产品也可以有用,但是不赚钱。失败就是你做的产品:既没用,又不赚钱


基于前面提到的三个困难,我得出的前100天最重要的事是:找到一个可行的产品迭代方向。和团队经过磨合,互相能有有效、信任的协作。找到一百个种子用户。你越早解决这三个困难,你越快走上轨道


确认产品方向


如果你真的做过产品,你就知道最终正确的产品路径不是通过脑中的某刻灵光乍现得到的。所以不是那种大脑飞速运算解题的方式。这里有两件事情需要确认:大的产品方向,产品的路径。


比如阿里巴巴,马云不是一开始就做的淘宝网。他只是觉得互联网普及以后,电子商务会有需求。最开始做的是黄页,并不是淘宝网。但是他没有在第一个项目失败以后,去做门户网站。产品路径的例子是特斯拉。特斯拉很早就确定了先出高性能的跑车,高性能轿车(model s),有了前面的技术积累以后,最后通过推出平价的轿车赢得市场(model 3)。特斯拉在 model 3 大规模量产前都是亏损的。


所以最重要的是确认产品方向。这个方向要结合自身的情况进行设定,就是我在前面帖子里提到的要是你想做的,能做的。也许想达到的产品方向有很多工作量,这个时候就要有同步的产品路径。比如小米手机的创业,他们一开始就想造手机。但是直接启动手机的制造市场、技术都有很大的困难。于是他们先通过做 MIUI 入局。


这里面首先要有个大的方向判断,对于独立开发来说,我觉得张宁在《创作者》里提到的两个维度的方向挺有意思:大众、小众;高频、低频。这里面两两结合各有什么特点我这里就不展开了,大家可以自行体会。


但是可以明确的是,独立开发者做不了又大众又高频的应用。大众又高频,就不可能小而美。大众又高频,最后赢家除了产品能力,要有运营优势,要有资源优势。独立开发者通常没有运营优势和资源优势。另外一点,如果是小众低频,就一定要高忠诚,高付费转化。可以往大众低频或者小众高频的方向多想想


产品方向选择还有一个建议就是要有秘密。成功的业务后面一定有秘密。秘密也回答了一个问题:如果这个需求真的存在,为什么用户选择了你的产品。


最初级的秘密就是信息差,你知道别人不知道,所以你可以,更早做,可以更低的成本,更高效,有更高的获客率。


更高级的秘密就是大家都能看到,但是大家知道了,但是大家不信(脑中想到了拼多多的砍一刀)。


最高级的秘密就是所有人都知道,但是他们做不到。


总结起来,你应该找到一个你有优势的细分方向。信息优势,洞察优势也是优势。


没有一发即中的银弹,最平凡的方式想很多方向,用最低成本进行最快速的验证。在反馈中渐渐明晰产品路径。如果你三个月不管反馈闷头做,只做出了一个产品方向。你失败的概率是很大的。所以我看到很多产品1.0 的时候就做会员,做社区,做跨平台我是很不理解的。其实这些功能在早期性价比很低。


我的方式是脑海中有10个想法,挑出3个想法做初步设计,选出一个或者两个想法做产品验证。可能是原型,数据是模拟的,没有设计,如果产品真的解决了痛点的话,用户会愿意用,然后他会给你反馈他想要更好的体验,他愿意付钱得到这些改进。这里的效率优势是,你能在更短的时间验证产品方向是不是对的。总比走了3个月才发现是一条死胡同要好。


开发者很容易因为想到一个想法很兴奋,觉得这个很有用,就闷头做了一个月。有可能的问题是,这个想法虽然是个痛点,但是这个痛点频次很低,场景很少,所以虽然有用,但是没人会愿意买单。所以尽量跳出自己的思维,从用户的角度来进行验证是很必要的。


团队协作


独立开发的开发方式和传统公司不同。需要建立一个全新的工作流程。在初期大家都是空白,所以需要通过产品迭代中,形成高效的开发默契。大家松散做东西,工作习惯,工作职责都需要有共识才行。


比如我合作的设计师早期喜欢一次做一大板块的整体设计,大概一周的工作量。初期我觉得我们对产品有激情,大家都应该有自由的发挥空间。但是做了一周的设计图和产品脑海中的产品行进方向不一致怎么办。在工作时间上,我合作的设计师因为目前还是兼职,他只能在下班后设计。然而我全职只在6点前工作。这又是一个要协调的地方。


如果你是一个产品,需要协调研发和设计,三个人协调就又更复杂了。要找到一个大家都舒服,高效的协作方式。


100个种子用户


独立开发最核心的一环就是找到一个健康的商业模式。产品方向和团队协作的目标都是为了未来可以达成一个健康的商业模式。我觉得太多独立开发者上来就把目标(野心)定的太高。一口吃不成胖子。独立开发早期的商业目标只有一个:尽快达成团队最低维持标准。一鸟在手胜过二鸟在林。不要在团队只有几个人的时候用几十个人的方式管理。


初期就要估算出产品(团队)能够持续运转的最低收入。这个成本越低,团队就越容易跑起来。当收入足够覆盖团队的成本后,你的心态就会得到极大的自由,可以尝试很多奇奇怪怪有趣的想法。所以早期不要想有多高的天花板,如何建立壁垒,就关心如何达成产品的及格生命线。谁会想做一个注定失败的产品呢。


早期在没有运营优势的情况下,最重要的指标就是用户满意度了。用户满意度,就暗示了这个产品有没有解决切实的用户问题,用户愿不愿意为你宣传。其实很多人都搞错了重点,在产品没有让100个种子用户满意前,新增的流量是没有意义的。因为再多的用户都会流失。竹篮打水一场空。如果你把产品的用户目标定在100个种子用户,你也就没了运营压力,可以关注在如何打造正确的产品上。在产品基本盘没有问题后,再思考后面的才有意义。


总结


总结起来三点就是:做什么(产品方向),怎么做(团队协作),为谁做(验证用户)。以上就是我全职独立开发3个多月以来肤浅的经验分享,希望对你有帮助。



PS:目前我的 App 是:打工人小组件(只在 AppStore),有兴趣的欢迎下载体验。


作者:没故事的卓同学
来源:juejin.cn/post/7259210748801663031

收起阅读 »

你的代码不堪一击!太烂了!

前言 小王,你的页面白屏了,赶快修复一下。小王排查后发现是服务端传回来的数据格式不对导致,无数据时传回来不是 [] 而是 null, 从而导致 forEach 方法报错导致白屏,于是告诉测试,这是服务端的错误导致,要让服务端来修改,结果测试来了一句:“服务端返...
继续阅读 »

前言


小王,你的页面白屏了,赶快修复一下。小王排查后发现是服务端传回来的数据格式不对导致,无数据时传回来不是 [] 而是 null, 从而导致 forEach 方法报错导致白屏,于是告诉测试,这是服务端的错误导致,要让服务端来修改,结果测试来了一句:“服务端返回数据格式错误也不能白屏!!” “好吧,千错万错都是前端的错。” 小王抱怨着把白屏修复了。


刚过不久,老李喊道:“小王,你的组件又渲染不出来了。” 小王不耐烦地过来去看了一下,“你这个属性data 格式不对,要数组,你传个对象干嘛呢。”老李反驳: “ 就算 data 格式传错,也不应该整个组件渲染不出来,至少展示暂无数据吧!” “行,你说什么就是什么吧。” 小王又抱怨着把问题修复了。


类似场景,小王时不时都要经历一次,久而久之,大家都觉得小王的技术太菜了。小王听到后,倍感委屈:“这都是别人的错误,反倒成为我的错了!”


等到小王离职后,我去看了一下他的代码,的确够烂的,不堪一击!太烂了!下面来吐槽一下。


一、变量解构一解就报错


优化前


const App = (props) => {
const { data } = props;
const { name, age } = data
}

如果你觉得以上代码没问题,我只能说你对你变量的解构赋值掌握的不扎实。



解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于 undefinednull 无法转为对象,所以对它们进行解构赋值时都会报错。



所以当 dataundefinednull 时候,上述代码就会报错。


优化后


const App = (props) => {
const { data } = props || {};
const { name, age } = data || {};
}

二、不靠谱的默认值


估计有些同学,看到上小节的代码,感觉还可以再优化一下。


再优化一下


const App = (props = {}) => {
const { data = {} } = props;
const { name, age } = data ;
}

我看了摇摇头,只能说你对ES6默认值的掌握不扎实。



ES6 内部使用严格相等运算符(===)判断一个变量是否有值。所以,如果一个对象的属性值不严格等于 undefined ,默认值是不会生效的。



所以当 props.datanull,那么 const { name, age } = null 就会报错!


三、数组的方法只能用真数组调用


优化前:


const App = (props) => {
const { data } = props || {};
const nameList = (data || []).map(item => item.name);
}

那么问题来了,当 data123 , data || [] 的结果是 123123 作为一个 number 是没有 map 方法的,就会报错。


数组的方法只能用真数组调用,哪怕是类数组也不行。如何判断 data 是真数组,Array.isArray 是最靠谱的。


优化后:


const App = (props) => {
const { data } = props || {};
let nameList = [];
if (Array.isArray(data)) {
nameList = data.map(item => item.name);
}
}

四、数组中每项不一定都是对象


优化前:


const App = (props) => {
const { data } = props || {};
let infoList = [];
if (Array.isArray(data)) {
infoList = data.map(item => `我的名字是${item.name},今年${item.age}岁了`);
}
}

一旦 data 数组中某项值是 undefinednull,那么 item.name 必定报错,可能又白屏了。


优化后:


const App = (props) => {
const { data } = props || {};
let infoList = [];
if (Array.isArray(data)) {
infoList = data.map(item => `我的名字是${item?.name},今年${item?.age}岁了`);
}
}

? 可选链操作符,虽然好用,但也不能滥用。item?.name 会被编译成 item === null || item === void 0 ? void 0 : item.name,滥用会导致编辑后的代码大小增大。


二次优化后:


const App = (props) => {
const { data } = props || {};
let infoList = [];
if (Array.isArray(data)) {
infoList = data.map(item => {
const { name, age } = item || {};
return `我的名字是${name},今年${age}岁了`;
});
}
}

五、对象的方法谁能调用


优化前:


const App = (props) => {
const { data } = props || {};
const nameList = Object.keys(data || {});
}

只要变量能被转成对象,就可以使用对象的方法,但是 undefinednull 无法转换成对象。对其使用对象方法时就会报错。


优化后:


const _toString = Object.prototype.toString;
const isPlainObject = (obj) => {
return _toString.call(obj) === '[object Object]';
}
const App = (props) => {
const { data } = props || {};
const nameList = [];
if (isPlainObject(data)) {
nameList = Object.keys(data);
}
}

六、async/await 错误捕获


优化前:


import React, { useState } from 'react';

const App = () => {
const [loading, setLoading] = useState(false);
const getData = async () => {
setLoading(true);
const res = await queryData();
setLoading(false);
}
}

如果 queryData() 执行报错,那是不是页面一直在转圈圈。


优化后:


import React, { useState } from 'react';

const App = () => {
const [loading, setLoading] = useState(false);
const getData = async () => {
setLoading(true);
try {
const res = await queryData();
setLoading(false);
} catch (error) {
setLoading(false);
}
}
}

如果使用 trycatch 来捕获 await 的错误感觉不太优雅,可以使用 await-to-js 来优雅地捕获。


二次优化后:


import React, { useState } from 'react';
import to from 'await-to-js';

const App = () => {
const [loading, setLoading] = useState(false);
const getData = async () => {
setLoading(true);
const [err, res] = await to(queryData());
setLoading(false);
}
}

七、不是什么都能用来JSON.parse


优化前:


const App = (props) => {
const { data } = props || {};
const dataObj = JSON.parse(data);
}

JSON.parse() 方法将一个有效的 JSON 字符串转换为 JavaScript 对象。这里没必要去判断一个字符串是否为有效的 JSON 字符串。只要利用 trycatch 来捕获错误即可。


优化后:


const App = (props) => {
const { data } = props || {};
let dataObj = {};
try {
dataObj = JSON.parse(data);
} catch (error) {
console.error('data不是一个有效的JSON字符串')
}
}

八、被修改的引用类型数据


优化前:


const App = (props) => {
const { data } = props || {};
if (Array.isArray(data)) {
data.forEach(item => {
if (item) item.age = 12;
})
}
}

如果谁用 App 这个函数后,他会搞不懂为啥 dataage 的值为啥一直为 12,在他的代码中找不到任何修改 dataage 值的地方。只因为 data 是引用类型数据。在公共函数中为了防止处理引用类型数据时不小心修改了数据,建议先使用 lodash.clonedeep 克隆一下。


优化后:


import cloneDeep from 'lodash.clonedeep';

const App = (props) => {
const { data } = props || {};
const dataCopy = cloneDeep(data);
if (Array.isArray(dataCopy)) {
dataCopy.forEach(item => {
if (item) item.age = 12;
})
}
}

九、并发异步执行赋值操作


优化前:


const App = (props) => {
const { data } = props || {};
let urlList = [];
if (Array.isArray(data)) {
data.forEach(item => {
const { id = '' } = item || {};
getUrl(id).then(res => {
if (res) urlList.push(res);
});
});
console.log(urlList);
}
}

上述代码中 console.log(urlList) 是无法打印出 urlList 的最终结果。因为 getUrl 是异步函数,执行完才给 urlList 添加一个值,而 data.forEach 循环是同步执行的,当 data.forEach 执行完成后,getUrl 可能还没执行完成,从而会导致 console.log(urlList) 打印出来的 urlList 不是最终结果。


所以我们要使用队列形式让异步函数并发执行,再用 Promise.all 监听所有异步函数执行完毕后,再打印 urlList 的值。


优化后:


const App = async (props) => {
const { data } = props || {};
let urlList = [];
if (Array.isArray(data)) {
const jobs = data.map(async item => {
const { id = '' } = item || {};
const res = await getUrl(id);
if (res) urlList.push(res);
return res;
});
await Promise.all(jobs);
console.log(urlList);
}
}

十、过度防御


优化前:


const App = (props) => {
const { data } = props || {};
let infoList = [];
if (Array.isArray(data)) {
infoList = data.map(item => {
const { name, age } = item || {};
return `我的名字是${name},今年${age}岁了`;
});
}
const info = infoList?.join(',');
}

infoList 后面为什么要跟 ?,数组的 map 方法返回的一定是个数组。


优化后:


const App = (props) => {
const { data } = props || {};
let infoList = [];
if (Array.isArray(data)) {
infoList = data.map(item => {
const { name, age } = item || {};
return `我的名字是${name},今年${age}岁了`;
});
}
const info = infoList.join(',');
}

后续


以上对小王代码的吐槽,最后我只想说一下,以上的错误都是一些 JS 基础知识,跟任何框架没有任何关系。如果你工作了几年还是犯这些错误

作者:红尘炼心
来源:juejin.cn/post/7259007674520158268
,真的可以考虑转行。

收起阅读 »

假如互联网人都很懂冒犯

大家好,我是老三,最近沉迷于听脱口秀,并且疯狂安利同事。 脱口秀演员常常说的一句话是:“脱口秀是冒犯的艺术”。最近我发现,同事们好像有点不一样了。 阳光灿烂的早上,趿拉着我的宝马拖鞋,跨上包浆的小黄车,屁股感受着阳光积累的炙热,往公司飞驰而去。 一步跨进电梯...
继续阅读 »

大家好,我是老三,最近沉迷于听脱口秀,并且疯狂安利同事。


脱口秀演员常常说的一句话是:“脱口秀是冒犯的艺术”。最近我发现,同事们好像有点不一样了。




阳光灿烂的早上,趿拉着我的宝马拖鞋,跨上包浆的小黄车,屁股感受着阳光积累的炙热,往公司飞驰而去。


一步跨进电梯间,我擦汗的动作凝固住了,挂上了矜持的微笑:“老板,早上好。”


老板:“早,你还在呢?又来带薪划水了?”


我:“嗨,我这再努力,最后不也就让你给我们多换几个嫂子嘛。”


老板:“没有哈哈,我开玩笑。”


我:“我也是,哈哈哈。”


今天的电梯似乎比往常慢了很多。


我:“老板最近在忙什么?”


老板:“昨天参加了一个峰会,马xx知道吧?他就坐我前边。”


我:“卧槽,真能装。没有,哈哈。”


老板:“哈哈哈”。


电梯到了,我俩都步履匆匆地进了公司。


小组内每天早上都有一个晨会,汇报工作进度和计划。


开了一会,转着椅子,划着朋友圈的我停了下来——到我了。


我:“昨天主要……今天计划……”


Leader:“你这不能说没有一点产出,也可以说一点产出都没有。其实,我对你是有一些失望的,原本今年绩效考评给你一个……”


我:“影响你合周报了是吗?不是哈哈。”


Leader、小组同事:“哈哈哈“。


Leader:“好了,我们这次顺便来对齐一下双月OKR,你们OKR都写的太保守了,一看就是能完成的,往大里吹啊。开玩笑哈哈。”。


我:”我以前就耕一亩田,现在把整个河北平原都给犁了。不是,哈哈。”


同事:“我要带公司打上月球,把你踢下来,我来当话事人。唉,哈哈”


Leader、同事、我:“哈哈哈“。


晨会开完,开始工作,产品经理拉我和和前端对需求。


产品经理:“你们程序员懂Java语言、Python语言、Go语言,就是不懂汉语言,真不想跟你们对需求。开个玩笑,哈哈。”


我:“没啥,你吹牛皮像狼,催进度像狗,做需求像羊,就这需求文档,还没擦屁股纸字多,没啥好对的。不是哈哈。”


产品经理、前端、我:“哈哈哈”。


产品经理:“那我们就对到这了,你们接着聊技术实现。”


前端:“没啥好聊的,后端大哥看着写吧,反正你们那破接口,套的比裹脚布还厚,没事还老出BUG。没有哈哈。”


我:“还不是为了兼容你们,一点动脑子的逻辑都不写,天天切图当然不出错。不是哈哈。”


前端、我:“哈哈哈”。


经过一番拉扯之后,我终于开始写代码了。


看到一段代码,我皱起了眉头,同事写的,我顺手写下了这样一段注释:


/**
* 写这段代码的人,建议在脑袋开个口,把水倒掉。不是哈哈,开个玩笑。
**/


代码写完了,准备上线,找同事给我Review,同事看了一会,给出了评论。



又在背着我们偷偷写烂代码了,建议改行。没有哈哈。



同事、我:“哈哈哈”。


终于下班了,路过门口,HR小姐姐还在加班。


我:“小姐姐怎么还没下班?别装了,老板都走了。开玩笑哈哈。”


HR小姐姐:“这不是看看怎么优化你们嘛,任务比较重。不是,哈哈。”


HR小姐姐、我:“哈哈哈”。


我感觉到一种不一样的氛围在公司慢慢弥散开来,我不知道怎么形容,但我想到了一句话——


“既分高下,也决生死”。




写这篇的时候,想到两年前,有个叫码农小说家的作者横空出世,写了一些生动活泼、灵气十足的段子,我也跟风写了两篇,这就是“荒腔走板”系列的来源。


后来,他结婚了。


看(抄)不到的我只能自己想,想破头也写不不来像样的段子,这个系列就不了了之,今天又偶尔来了灵感,写下一篇,也顺带缅怀

作者:三分恶
来源:juejin.cn/post/7259036373579350077
一下光哥带来的快乐。

收起阅读 »

应届毕业生关于五险一金你知道多少?很多人找工作都吃了亏

“明明说好月薪1w,结果最后到手才7k” 最近,不少上了工作岗位的小伙伴跟作者吐槽 为什么面试的时候说好的薪资跟与实际到手的差别这么大呢? 所以五险一金究竟有什么作用? 薪资都是如何被它扣掉的? 很多同学在面试或者刚刚入职时 怕HR觉得自己问题多 就不敢多问...
继续阅读 »

“明明说好月薪1w,结果最后到手才7k”


最近,不少上了工作岗位的小伙伴跟作者吐槽


为什么面试的时候说好的薪资跟与实际到手的差别这么大呢?


所以五险一金究竟有什么作用?


薪资都是如何被它扣掉的?


img


很多同学在面试或者刚刚入职时


怕HR觉得自己问题多


就不敢多问什么


但是,这和你的薪资福利息息相关


如果没问清,你一年可能要少拿上万元!


跟着作者一起来看看五险一金的具体细则吧。


1. 什么是五险一金?


五险是指养老保险、医疗保险、失业保险、工伤保险和生育保险,这五险可以统称为社会保险,也就是我们常说的“社保”。而“一金”则是住房公积金。


在这五险中,个人需要承担养老保险、医疗保险和失业保险这三项的缴费,而单位则需要为员工交齐五险的全部费用。


对于应届生来说,五险一金的重要性可能并不清楚,但它与日后的购房、生育、医疗和退休等方面息息相关。


img


举个例子,如果你打算在上海或北京买房,那你一定要连续缴纳5年社保才可以。


2. 五险一金的具体内容:


养老保险:


养老保险是为了解决劳动者在达到国家规定的解除劳动义务的劳动年龄界限,或因年老丧失劳动能力退出劳动岗位后的基本生活而建立的一种社会保险制度。个人缴纳养老保险累计满15年后才能领取退休金。养老保险的缴纳标准各地有所不同,以2018年北京市为例,单位缴费比例为19%,个人缴费比例为8%。也就是说,如果你的月入为10000元,你每个月需要交800元的养老保险金。


医疗保险:


医疗保险是为了补偿劳动者因疾病风险造成的经济损失而建立的一项社会保险制度。个人需要缴纳医疗保险费用,以获取医疗方面的一定报销和救助。各地医疗保险的缴纳标准也有所不同,以2018年北京市为例,单位缴费比例为10%,个人缴费比例为2%。也就是说,如果你在北京月入10000元,你每个月需要交203元的医疗保险金。


失业保险:


失业保险是为了对因失业而暂时中断生活来源的劳动者提供物质帮助,以保障其基本生活。单位和个人共同按照缴费基数进行缴纳。以2018年北京市为例,单位缴费比例为1%,个人缴费比例为0.2%。失业保险的领取条件包括按规定参加失业保险,所在单位和本人已按照规定履行缴费义务满1年,非因本人意愿中断就业等情况。


工伤保险:


工伤保险是为在工作期间或上下班途中因意外受伤的劳动者提供报销的一项社会保险制度。工伤保险费由公司全额缴纳。工伤保险的认定比较复杂,一旦发生意外,建议第一时间报警或联系公司存留证据,同时需要在一个月内办理工伤鉴定。


生育保险:


生育保险是针对怀孕生育的劳动者,缴纳一定时间后可以享受产假,并在产假期间领取生育津贴。单位全额缴纳生育保险费用。产假期间的生育津贴额度为本人或妻子生育当月本单位人均缴费工资除以30(天)再乘以产假/陪产假天数。


注意:男性职工也是有生育保险的哦~如果你的妻子没有工作,是可以使用你的生育保险的;如果你的工作性质决定了你不能休14天的陪产假(陪产假天数各地有差异),你在正常拿工资的同时是可以申请生育津贴的。


所以,不要再说,我是男生,为什么还要缴生育保险。


产假期间的生育津贴额度:


本人或妻子生育当月本单位人平缴费工资÷30(天)×产假/陪产假天数。


值得注意的是,大家通常理解的产假是有工资的,这个工资其实是生育津贴,是你在休完产假后国家支付给你的,并不是单位支付给。根据法律规定,单位也没有必要支付给你。个别福利较好的单位,才会同时支付生育津贴+产假工资。


【缴纳标准】


按照保险基数进行缴纳,由公司全额缴纳。以2018年北京市为例,缴纳比例为0.8%。


关于“五险一金”的缴纳费用,一张图更清楚


以2018年北京市为例,如果月薪一万,那么个人所要缴纳的五险一金为2223元。具体计算方法如下图所示,


img


住房公积金:


住房公积金是一项强制性的储蓄制度,员工每月交纳公积金,单位也会给员工交纳相同金额的公积金,存入员工的公积金账户。这笔钱可以用于购房、还房贷、自己盖房或租房等住房相关支出。不同地区的公积金缴纳比例和政策也不尽相同。


关于公积金,你需要注意以下问题:


不买房子,住房公积金可以取出来吗?


公积金大家最关心的,就是能不能不买房子可以把这笔钱取出来?基本上现在都是可以取出来的,主要看当地的满足条件。


公积金存的越多购房贷款就越多吗?


是的。连续缴满半年就可以公积金贷款,能贷款多少也跟你的公积金余额和缴存比例有很大的关系。但是无论你薪资多高,公积金的缴存比例不得超过 12%。


试用期不缴五险一金?


《中华人民共和国劳动合同法》、《住房公积金管理条例》清楚表明,确定劳动关系后,用人单位就要为职工缴纳社保和公积金。


企业不缴五险一金或者强迫你签订不缴社保的协议都是违反劳动法的!


如果你遇到这样的公司,可以考虑拿起法律武器保护自己的权益,收集好相关证据(合同、工资条、考勤记录等)去当地的人力资源和社会保障局申请劳动仲裁


五险一金中断怎么办?


如果你找到了新工作:那么养老保险、医疗保险、失业保险、工伤保险、生育保险五险都可以转移到新公司。


如果你辞职了,没有新的接收公司,也都可以找代缴公司给你代缴上述保险。


但是注意!医疗保险要及时补缴,因为**一断医保就会停,当连续中断时间超过三个月,你的连续缴费年限就会清零!**会影响到以后生大病的门诊报销比例及各项额度。


住房公积金中断后可以补缴,但自己补缴不了。只能在找到新公司后,填写好补缴材料给公司的人事部门,再让公司的人去办理补缴手续。


那么你能贷多少?


第一次办理。如果夫妻二人共同贷款,贷款最高限额 70 万,如果只有单人贷款,最高限额 45 万。


第二次办理。如果夫妻二人共同贷款,贷款最高限额 50 万,如果只有单人贷款,最高限额 30 万


应届生找工作的例子:


假设小明是一名应届大学毕业生,他找到了一家公司,并在面试时商定了月薪1万。然而,当他拿到第一个月的工资时,发现实际到手只有7000元。为什么会出现这种情况呢?


经过了解,小明发现差额是因为公司依法为他缴纳了五险一金,而这部分费用被从他的薪资中扣除了。具体来说,他需要缴纳养老保险、医疗保险和失业保险,而单位为他缴纳了五险的全部费用。


养老保险缴纳比例为8%,医疗保险缴纳比例为2%,失业保险缴纳比例为0.2%,这些费用按照小明的月薪进行扣除,导致他实际到手的薪资较少。


尽管初时看起来差额较大,但五险一金对员工未来的福利和保障有着重要作用。养老保险可以为他的退休生活提供保障,医疗保险可以在生病时获得一定程度的报销和救助,失业保险可以在意外失业时提供一定的经济支持。


因此,尽管五险一金会让员工的实际到手薪资较少,但从长远来看,这些社会保险和公积金将为员工的未来提供重要的帮助和保障。所以,在面试或入职时,了解清楚五险一金的具体细则是非常重要的,而不仅仅关注月薪本身。


总之,五险一金是员工福利的重要组成部分,也是雇主合法义务,而对于应届生来说,了解这些内容对于未来的职业生涯和生活规划至关重要。在求职过程中,应该了解和询问相关的薪资和福利细则,确保自己的权益得到保障。



本文由博客一文多发平台 OpenWrite 发布!


作者:不败顽童
来源:juejin.cn/post/7258207459357933605

收起阅读 »

前端同事最讨厌的后端行为,看看你中了没有

前端吐槽:后端从不自测接口,等到前后端联调时,这个接口获取不到,那个接口提交不了,把前端当成自己的接口测试员,耽误前端的开发进度。听到这个吐槽,仿佛看到曾经羞愧的自己。这个毛病以前我也有啊,有些接口,尤其是大表单提交接口,表单特别大,字段很多,有时候就偷懒了,...
继续阅读 »

前端吐槽:后端从不自测接口,等到前后端联调时,这个接口获取不到,那个接口提交不了,把前端当成自己的接口测试员,耽误前端的开发进度。

听到这个吐槽,仿佛看到曾经羞愧的自己。这个毛病以前我也有啊,有些接口,尤其是大表单提交接口,表单特别大,字段很多,有时候就偷懒了,直接编译过了,就发到测试环境了。前端同时联调的时候一调接口,异常了。

好在后来改了,毕竟让人发现自己接口写的有问题,也是一件丢脸的事儿。

但是我还真见过后端的同学,写完接口一个都不测,直接发测试环境的。

我就碰到过厉害的,编译都不过,就直接提代码。以前,有个新来的同事,分了任务就默默的干着,啥也不问,然后他做的功能测试就各种发现问题。说过之后,就改一下,但是基本上还是不测试,本想再给他机会的,所以后来他每次提代码,我都review一下。直到有一天,我发现忍不了了,他把一段全局配置给注释了,然后把代码提了,我过去问他是不是本地调试,忘了取消注释了。他的回答直接让我震惊了,他说:不是的,是因为不注释那段代码,我本地跑步起来,所以肯定是那段代码有问题,所以就注释了。

然后,当晚,他就离职了。

解决方式

对于这种大表单类似的问题,应该怎么处理呢?

好像没有别的方法,只能克服自己的懒惰,为自己写的代码负责。就想着,万一接口有问题,别人可能会怀疑你水平不行,你水平不行,就是你不行啊,程序员怎么能不行呢。

你可以找那么在线 Java Bean转 JSON的功能,直接帮你生成请求参数,或者现在更可以借助 ChatGPT ,帮你生成请求参数,而且生成的参数可能比你自己瞎填的看上去更合理。

或者,如果是小团队,不拘一格的话,可以让前端的同事把代码提了,你本地跑着自测一下,让前端同事先做别的功能,穿插进行也可以。

前端吐槽:后端修改了字段或返回结构不通知前端

这个就有点不讲武德了。

正常情况下,返回结构和字段都是事先约定好的,一般都是先写接口,做一些 Mock 数据,然后再实现真实的逻辑。

除了约定好返回字段和结构外,还包括接口地址、请求方法、头信息等等,而且一个项目都会有项目接口规范,同一类接口的返回字段可能有很多相同的部分。

后端如果改接口,必须要及时通知前端,这其实应该是正常的开发流程。后端改了接口,不告诉前端,到时候测试出问题了,一般都会先找前端,这不相当于让前端背锅了吗,确实不地道啊。

后端的同学们,谨记啊。

前端吐槽:为了获取一个信息,要先调用好几个接口,可能参数还是相同的

假设在一个详情页面,以前端的角度就是,我获取详情信息,就调用详情接口好了,为什么调用详情接口之前,要调用3、4个其他的接口,你详情里需要啥参数,我直接给你传过去不就好了吗。

在后端看来可能是这样的,我这几个接口之前就写好了,前端拿过去就能用,只不过就是多调几次罢了,没什么大不了的吧。

有些时候,可能确实是必须这么做的,比如页面内容太多,有的部分查询逻辑复杂,比较耗时,这时候需要异步加载,这样搞确实比较好。

但是更多时候其实就是后端犯懒了,不想再写个新接口。除了涉及到性能的问题,大多数逻辑都应该在后端处理,能用一个接口处理完,就不应该让前端多调用第二个接口。

有前端的朋友曾经问过我,他说,他们现在做的系统中有些接口是根据用户身份来展示数据的,但是前端调用登录接口登录系统后,在调用其他接口的时候,除了在 Header 中加入 token 外,还有传很多关于用户信息的很多参数,这样做是不是不合理的。

这肯定不合理,token 本来就是根据用户身份产生的,后端拿到 token 就能获取用户信息,这是常识问题,让前端在接口中再传一遍,既不合理也不安全。

类似的问题还有,比如后端接口返回一堆数据,然后有的部分有用、有的部分没有,有的部分还涉及到逻辑,不借助文档根本就看不明白怎么用,这其实并不合理。

接口应该尽量只包含有用的部分,并且尽可能结构清晰,配合简单的字段说明就能让人明白是怎么回事,是最好的效果。

如果前后端都感觉形势不对了,后端一个接口处理性能跟不上了,前端处理又太麻烦了。这时候就要向上看了,产品设计上可能需要改一改了。

后端的同学可以学一点前端,前端的同学也可以学一点后端,当你都懂一些的时候,就能两方面考虑了,这样做出来的东西可能会更好用一点。总之,前后端相互理解,毕竟都是为了生活嘛。


作者:古时的风筝
链接:https://juejin.cn/post/7254927062425829413
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

如果写劣质代码是犯罪,那我该判无期

导读程序员痛恨遇到质量低劣的代码,但在高压环境下,我们常为了最快解决当下需求而忽略代码规范,在无意识中堆积大量债务。我们还观察到许多开发者被迫加班的罪魁祸首便是写低效代码、不重视代码优化。编程路上,欲速则不达。 接下来,我将为各位列举9种我个人工作中高频遇到的...
继续阅读 »

导读

程序员痛恨遇到质量低劣的代码,但在高压环境下,我们常为了最快解决当下需求而忽略代码规范,在无意识中堆积大量债务。我们还观察到许多开发者被迫加班的罪魁祸首便是写低效代码、不重视代码优化。编程路上,欲速则不达。 接下来,我将为各位列举9种我个人工作中高频遇到的不整洁代码行为,并提出针对性优化建议。继续阅读~

目录

1 代码风格和可读性

2 注释

3 错误处理和异常处理

4 代码复用和模块化

5 硬编码

6 测试和调试

7 性能优化

8 代码安全性

9 版本控制和协作

10 总结

01、代码风格和可读性

  • 错误习惯
不一致的命名规则:使用多种命名规则,如 camelCase、snake_case 和 PascalCase 等。过长的函数和方法:编写过长的函数和方法,导致代码难以阅读和理解。 过长的行:编写超过50字符的代码行,导致代码难以阅读。

1.1 变量命名不规范

在编程中,变量命名是非常重要的,良好的变量命名能够提高代码的可读性和可维护性。不规范的命名会增加理解难度,以下是一个不规范命名的例子:

int a, b, c; // 不具有描述性的变量名
float f; // 不清楚变量表示的含义

这样的变量命名不仅会降低代码的可读性,还可能会导致变量混淆,增加代码维护的难度。正确的做法应该使用有意义的名称来命名变量。例如:

int num1, num2, result; // 具有描述性的变量名
float price; // 清晰明了的变量名

1.2 长函数和复杂逻辑

长函数和复杂逻辑是另一个常见的错误和坏习惯。长函数难以理解和维护,而复杂逻辑可能导致错误和难以调试。以下是一个长函数和复杂逻辑的案例:

def count_grade(score):
if score >= 90:
grade = 'A'
elif score >= 80:
grade = 'B'
elif score >= 70:
grade = 'C'
elif score >= 60:
grade = 'D'
else:
grade = 'F'

if grade == 'A' or grade == 'B':
result = 'Pass'
else:
result = 'Fail'
return result

在这个例子中,函数 count_grade 包含了较长的逻辑和多个嵌套的条件语句,使得代码难以理解和维护。正确的做法是将逻辑拆分为多个小函数,每个函数只负责一个简单的任务,例如:

def count_grade(score):
grade = get_grade(score)
result = pass_or_fail(grade)
return result
def get_grade(score):
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
else:
return 'F'
def pass_or_fail(grade):
if grade == 'A' or grade == 'B':
return 'Pass'
else:
return 'Fail'

通过拆分函数,我们使得代码更加可读和可维护。

1.3 过长的行

代码行过长,会导致代码难以阅读和理解,增加了维护和调试的难度。例如:

def f(x):
if x>0:return 'positive' elif x<0:return 'negative'else:return 'zero'

这段代码的问题在于,它没有正确地使用空格和换行,使得代码看起来混乱,难以阅读。正确的方法是,我们应该遵循一定的代码规范和风格,使得代码清晰、易读。下面是按照 PEP 8规范改写的代码

def check_number(x):
if x > 0:
return 'positive'
elif x < 0:
return 'negative'
else:
return 'zero'

这段代码使用了正确的空格和换行,使得代码清晰、易读。

02、注释

  • 错误习惯
缺少注释:没有为代码编写注释,导致其他人难以理解代码的功能和逻辑。 过时的注释:未及时更新注释,使注释与实际代码不一致。 错误注释:注释上并不规范,常常使用一些不合理的注释。
  • 错误的注释

注释是非常重要的,良好的注释可以提高代码的可读性和可维护性。以下是一个不规范的例子:

int num1, num2; // 定义两个变量

上述代码中,注释并没有提供有用的信息,反而增加了代码的复杂度。

03、错误处理和异常处理

  • 错误的习惯
忽略错误:未对可能出现的错误进行处理。 过度使用异常处理:滥用 try...except 结构,导致代码逻辑混乱。 捕获过于宽泛的异常:捕获过于宽泛的异常,如 except Exception,导致难以定位问题。

3.1 忽略错误

我们往往会遇到各种错误和异常。如果我们忽视了错误处理,那么当错误发生时,程序可能会崩溃,或者出现不可预知的行为。例如:

def divide(x, y):
return x / y

这段代码的问题在于,当 y 为0时,它会抛出 ZeroDivisionError 异常,但是这段代码没有处理这个异常。下面是改进的代码:

def divide(x, y):
try:
return x / y
except ZeroDivisionError:
return 'Cannot divide by zero!'

3.2 过度使用异常处理

我们可能会使用异常处理来替代条件判断,这是不合适的。异常处理应该用于处理异常情况,而不是正常的控制流程。例如:

def divide(a, b):
try:
result = a / b
except ZeroDivisionError:
result = float('inf')
return result

在这个示例中,我们使用异常处理来处理除以零的情况。正确做法:

def divide(a, b):
if b == 0:
result = float('inf')
else:
result = a / b
return result

在这个示例中,我们使用条件判断来处理除以零的情况,而不是使用异常处理。

3.3 捕获过于宽泛的异常

捕获过于宽泛的异常可能导致程序崩溃或隐藏潜在的问题。以下是一个案例:

try {
// 执行一些可能抛出异常的代码
} catch (Exception e) {
// 捕获所有异常,并忽略错误}

在这个例子中,异常被捕获后,没有进行任何处理或记录,导致程序无法正确处理异常情况。正确的做法是根据具体情况,选择合适的异常处理方式,例如:

try {
// 执行一些可能抛出异常的代码
} catch (FileNotFoundException e) {
// 处理文件未找到异常
logger.error("File not found", e);
} catch (IOException e) {
// 处理IO异常
logger.error("IO error", e);
} catch (Exception e) {
// 处理其他异常
logger.error("Unexpected error", e);}

通过合理的异常处理,我们可以更好地处理异常情况,增加程序的稳定性和可靠性。

04、错误处理和异常处理

  • 错误的习惯
缺乏复用性:代码冗余,维护困难,增加 bug 出现的可能性。 缺乏模块化:代码耦合度高,难以重构和测试。

4.1 缺乏复用性

代码重复是一种非常常见的错误。当我们需要实现某个功能时,可能会复制粘贴之前的代码来实现,这样可能会导致代码重复,增加代码维护的难度。例如:

   def calculate_area_of_rectangle(length, width):
return length * width

def calculate_volume_of_cuboid(length, width, height):
return length * width * height

def calculate_area_of_triangle(base, height):
return 0.5 * base * height

def calculate_volume_of_cone(radius, height):
return (1/3) * 3.14 * radius * radius * height

上述代码中,计算逻辑存在重复,这样的代码重复会影响代码的可维护性。为了避免代码重复,我们可以将相同的代码复用,封装成一个函数或者方法。例如:

   def calculate_area_of_rectangle(length, width):
return length * width

def calculate_volume(length, width, height):
return calculate_area_of_rectangle(length, width) * height

def calculate_area_of_triangle(base, height):
return 0.5 * base * height

def calculate_volume_of_cone(radius, height):
return (1/3) * 3.14 * radius * radius * height

这样,我们就可以避免代码重复,提高代码的可维护性。

4.2 缺乏模块化

缺乏模块化是一种常见的错误,这样容易造成冗余,降低代码的可维护性,例如:

   class User:
def __init__(self, name):
self.name = name

def save(self):
# 保存用户到数据库的逻辑

def send_email(self, content):
# 发送邮件的逻辑

class Order:
def __init__(self, user, product):
self.user = user
self.product = product

def save(self):
# 保存订单到数据库的逻辑

def send_email(self, content):
# 发送邮件的逻辑
```

此例中,User 和 Order 类都包含了保存和发送邮件的逻辑,导致代码重复,耦合度高。我们可以通过将发送邮件的逻辑提取为一个独立的类,例如:

   class User:
def __init__(self, name):
self.name = name

def save(self):
# 保存用户到数据库的逻辑

class Order:
def __init__(self, user, product):
self.user = user
self.product = product

def save(self):
# 保存订单到数据库的逻辑

class EmailSender:
def send_email(self, content):
# 发送邮件的逻辑

通过把发送邮件单独提取出来,实现了模块化。现在 User 和 Order 类只负责自己的核心功能,而发送邮件的逻辑由 EmailSender 类负责。这样一来,代码更加清晰,耦合度降低,易于重构和测试。

05、硬编码

  • 错误的习惯
常量:设置固定常量,导致维护困难。 全局变量:过度使用全局变量,导致程序的状态难以跟踪。

5.1 常量

在编程中,我们经常需要使用一些常量,如数字、字符串等。然而,直接在代码中硬编码这些常量是一个不好的习惯,因为它们可能会在未来发生变化,导致维护困难。例如:

def calculate_score(score):
if (score > 60) {
// do something}

这里的60就是一个硬编码的常量,导致后续维护困难,正确的做法应该使用常量或者枚举来表示。例如:

PASS_SCORE = 60;
def calculate_score(score):
if (score > PASS_SCORE) {
// do something }

这样,我们就可以避免硬编码,提高代码的可维护性。

5.2 全局变量

过度使用全局变量在全局范围内都可以访问和修改。因此,过度使用全局变量可能会导致程序的状态难以跟踪,增加了程序出错的可能性。例如:

counter = 0
def increment():
global counter
counter += 1

这段代码的问题在于,它使用了全局变量 counter,使得程序的状态难以跟踪。我们应该尽量减少全局变量的使用,而是使用函数参数和返回值来传递数据。例如:

def increment(counter):
return counter + 1

这段代码没有使用全局变量,而是使用函数参数和返回值来传递数据,使得程序的状态更易于跟踪。

06、测试和调试

  • 错误的习惯
单元测试:不进行单元测试会导致无法及时发现和修复代码中的错误,增加代码的不稳定性和可维护性。 边界测试:不进行边界测试可能导致代码在边界情况下出现错误或异常。 代码的可测试性:有些情况依赖于当前条件,使测试变得很难。

6.1 单元测试

单元测试是验证代码中最小可测试单元的方法,下面是不添加单元测试的案例:

def add_number(a, b):
return a + b

在这个示例中,我们没有进行单元测试来验证函数 add_number 的正确性。正确示例:

import unittest

def add_number(a, b):
return a + b

class TestAdd(unittest.TestCase):
def add_number(self):
self.assertEqual(add(2, 3), 5)

if __name__ == '__main__': unittest.main()

在这个示例中,我们使用了 unittest 模块进行单元测试,确保函数 add 的正确性。

6.2 边界测试

边界测试是针对输入的边界条件进行测试,以验证代码在边界情况下的行为下面是错误示例:

def is_even(n):
return n % 2 == 0

在这个示例中,我们没有进行边界测试来验证函数 is_even 在边界情况下的行为。正确示例:

import unittest

def is_even(n):
return n % 2 == 0

class TestIsEven(unittest.TestCase):
def test_even(self):
self.assertTrue(is_even(2))
self.assertFalse(is_even(3))

if __name__ == '__main__': unittest.main()

在这个示例中,我们使用了 unittest 模块进行边界测试,验证函数 is_even 在边界情况下的行为。

6.3 可测试性

代码的可测试性我们需要编写测试来验证代码的正确性。如果我们忽视了代码的可测试性,那么编写测试将会变得困难,甚至无法编写测试。例如:

def get_current_time():
return datetime.datetime.now()

这段代码的问题在于,它依赖于当前的时间,这使得我们无法编写确定性的测试。我们应该尽量减少代码的依赖,使得代码更易于测试。例如:

def get_time(now):
return now

这段代码不再依赖于当前的时间,而是通过参数传入时间,这使得我们可以编写确定性的测试。

07、性能优化

  • 错误的习惯
过度优化:过度优化可能会导致代码难以理解和维护,甚至可能会引入新的错误。 合适的数据结构:选择合适的数据结构可以提高代码的性能。

7.1 过度优化

我们往往会试图优化代码,使其运行得更快。然而,过度优化可能会导致代码难以理解和维护,甚至可能会引入新的错误。例如:

def sum(numbers):
return functools.reduce(operator.add, numbers)

这段代码的问题在于,它使用了 functools.reduce 和 operator.add 来计算列表的和,虽然这样做可以提高一点点性能,但是这使得代码难以理解。我们应该在保持代码清晰和易读的前提下,进行适度的优化。例如:

def sum(numbers):
return sum(numbers)

这段代码使用了内置的 sum 函数来计算列表的和,虽然它可能比上面的代码慢一点,但是它更清晰、易读。

7.2 没有使用合适的数据结构

选择合适的数据结构可以提高代码的性能。使用不合适的数据结构可能导致代码执行缓慢或占用过多的内存。例如:

def find_duplicate(numbers):
duplicates = []
for i in range(len(numbers)):
if numbers[i] in numbers[i+1:]:
duplicates.append(numbers[i])
return duplicates

在这个示例中,我们使用了列表来查找重复元素,但这种方法的时间复杂度较高。我们可以使用集合来查找元素。例如:

def find_duplicate(numbers):
duplicates = set()
seen = set()
for num in numbers:
if num in seen:
duplicates.add(num)
else:
seen.add(num)
return list(duplicates)

我们使用了集合来查找重复元素,这种方法的时间复杂度较低。

08、代码安全性

  • 错误的习惯
输入验证:不正确的输入验证可能导致安全漏洞,如 SQL 注入、跨站脚本攻击等。 密码存储:不正确的密码存储可能导致用户密码泄露。 权限控制:不正确的权限控制可能导致未经授权的用户访问敏感信息或执行特权操作。

8.1 输入验证

没有对用户输入进行充分验证和过滤可能导致恶意用户执行恶意代码或获取敏感信息。例如:

import sqlite3
def get_user(username):
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
query = f"SELECT * FROM users WHERE username = '{username}'"
cursor.execute(query)
user = cursor.fetchone()
conn.close()
return user

在这个示例中,我们没有对用户输入的 username 参数进行验证和过滤,可能导致 SQL 注入攻击。正确示例:

import sqlite3

def get_user(username):
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
query = "SELECT * FROM users WHERE username = ?"
cursor.execute(query, (username,))
user = cursor.fetchone()
conn.close()
return user

在这个示例中,我们使用参数化查询来过滤用户输入,避免了 SQL 注入攻击。

8.2 不正确的密码存储

将明文密码存储在数据库或文件中,或使用不安全的哈希算法存储密码都是不安全的做法。错误示例:

import hashlib

def store_password(password):
hashed_password = hashlib.md5(password.encode()).hexdigest()
# 存储 hashed_password 到数据库或文件中

在这个示例中,我们使用了不安全的哈希算法 MD5 来存储密码。正确示例:

import hashlib
import bcrypt

def store_password(password):
hashed_password = bcrypt.hashpw(password.encode(), bcrypt.gensalt())
# 存储 hashed_password 到数据库或文件中

在这个示例中,我们使用了更安全的哈希算法 bcrypt 来存储密码。

8.3 不正确的权限控制

没有正确验证用户的身份和权限可能导致安全漏洞。错误示例:

def delete_user(user_id):
if current_user.is_admin:
# 执行删除用户的操作
else:
raise PermissionError("You don't have permission to delete users.")

在这个示例中,我们只检查了当前用户是否为管理员,但没有进行足够的身份验证和权限验证。正确示例:

def delete_user(user_id):
if current_user.is_authenticated and current_user.is_admin:
# 执行删除用户的操作
else:
raise PermissionError("You don't have permission to delete users.")

在这个示例中,我们不仅检查了当前用户是否为管理员,还检查了当前用户是否已经通过身份验证。

09、版本控制和协作

  • 错误的习惯
版本提交信息:不合理的版本提交信息会造成开发人员难以理解和追踪代码的变化。 忽略版本控制和备份:没有备份代码和版本控制的文件可能导致丢失代码、难以追溯错误来源和无法回滚等问题。

9.1 版本提交信息

不合理的版本提交信息可能导致代码丢失、开发人员难以理解等问题。错误示例:

git commit -m "Fixed a bug"

在这个例子中,提交信息没有提供足够的上下文和详细信息,导致其他开发人员难以理解和追踪代码的变化。正确的做法是提供有意义的提交信息,例如:

$ git commit -m "Fixed a bug in calculate function, which caused grade calculation for scores below 60"

通过提供有意义的提交信息,我们可以更好地追踪代码的变化,帮助其他开发人员理解和维护代码。

9.2 忽略版本控制和备份

忽略使用版本控制工具进行代码管理和备份是一个常见的错误。错误示例:

$ mv important_code.py important_code_backup.py
$ rm important_code.py

在这个示例中,开发者没有使用版本控制工具,只是简单地对文件进行重命名和删除,没有进行适当的备份和记录。正确示例:

$ git clone project.git
$ cp important_code.py important_code_backup.py
$ git add .
$ git commit -m "Created backup of important code"
$ git push origin master
$ rm important_code.py

在这个示例中,开发者使用了版本控制工具进行代码管理,并在删除之前创建了备份,确保了代码的安全性和可追溯性。

10、总结

好的代码应该如同一首好文,让人爱不释手。优雅的代码,不仅是功能完善,更要做好每一个细节。

最后,引用韩磊老师在《代码整洁之道》写到的一句话送给大家:

细节之中自有天地,整洁成就卓越代码。

以上是本文全部内容,欢迎分享。

-End-


作者:腾讯云开发者
链接:https://juejin.cn/post/7257894053902565433
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

年中总结、再品苏轼、怀古望今、胡思漫谈

-- 迟到年终总结/虽迟但到 -- 现在是公元2023年7月22日,不知觉,2023年已过一半有余。 在整 1000 年前,1023 年,北宋宋仁宗开启“天圣”元年,仁宗在位四十二年,搜揽天下豪杰,不可胜数,其中就包括文坛 T1 阵容 —— 苏轼。 仁宗可以说...
继续阅读 »

-- 迟到年终总结/虽迟但到 --


现在是公元2023年7月22日,不知觉,2023年已过一半有余。


在整 1000 年前,1023 年,北宋宋仁宗开启“天圣”元年,仁宗在位四十二年,搜揽天下豪杰,不可胜数,其中就包括文坛 T1 阵容 —— 苏轼。


仁宗可以说是苏轼最大的伯乐,认苏轼有宰相之才,为他的诗词/才华直连拍手叫好。


而仁宗之后,苏轼便逐渐踏上了他的一生被贬之路。


怀古


step1


苏轼先是和王安石政见不一,自请至杭州做通判,苏堤春晓、三潭印月,欲把西湖比西子,淡妆浓抹总相宜。


现实中与人气场不合、难以互存,而又不得不共事的时候,确实是一件不幸之事。


王安石改革激进、求快,苏轼体恤民情,当宋神宗选择王安石的时候,苏轼就知道了:道不同不相谋。


从杭州再到湖州,远离庙堂、过足山水之瘾,有道是:“待君诗百首,来写浙西春”。


step2


苏杭山水之后,再是乌台诗案,被文字狱、坐牢 100 多天,被贬黄州;


在黄州的四年多时间,从“寂寞沙洲冷”转变为“一蓑烟雨任平生”,他天生是乐观的,能够快速的整理、修复情绪;


最后,黄州成就了苏轼,写出了千古流传的《赤壁赋》,“天地之间,物各有主”,不是我等能占有的,假若想要有无限的时光、享用无尽的自然美景,只得是把自己交给自然,“耳得之而为声,目遇之而成色,取之无禁,用之不竭”。


我认为,这种豁达,可以解忧,现代人的忙碌、焦虑、急切心态等。


事物兴衰、时间流转,不是我等能掌控的,占有欲再强,最后也是赤条条来去无牵挂。


不如就是“适之”,你我“共适”当下,便就是永久的享受了。


step3


虽然,不多久,苏轼又被高太后启用,但随着这位迷妹去世,哲宗启用新派、打击旧派,苏轼又被贬到惠州;“日啖荔枝三百颗,不辞长作岭南人”,即使离皇帝/权利/显贵越来越远,但并不妨碍他这样快活的心态;


step4


一贬再贬,晚年苏轼被贬到海南儋州,可谓是:天涯海角。有一首《西江月》:



世事一场大梦,人生几度秋凉?夜来风叶已鸣廊。看取眉头鬓上。


酒贱常愁客少,月明多被云妨。中秋谁与共孤光。把盏凄然北望。



有人分析说这是在儋州所作,有人分析说在黄州所作;


个人感觉,前者说法可能性更大,人生之短促,壮志之难酬,确实悲凉,难有青壮年的狂放、通达。


望今


p1


现在年轻人也是很艰难的,虽绝大部分人都没有苏轼这样有才华的诗词表达,但对于这种人生变迁的体味肯定是闷在心头,千滋百味、无法言说的。


时间转眼就没,就像李白所说:朝如青丝、暮成雪;


没有什么是永恒的,可能在一家公司日复一日、勤勤恳恳工作两、三年,转眼间,因为某一天来了一个擅长 PUA 的小领导,愤懑之下就裸辞;或者某一天,突然就不想起早八了,不想麻木/盲目了,毅然离开,像是重启、代谢更新,又像是一种惋惜,恨不得志;


当然没时间啦。


早八到晚八,或者早十到晚十,都一样,最普通的,基本工作时间8小时,还要提前准备、通勤;晚归后还要休息调整思路;就算是一点不加班,工作也要消耗掉一天二分之一的时间。正常的,还要有睡眠时间,7个、8个小时左右,剩下的,也就3、4小时;再除去内务整理、社交交友、家人长谈,还有几个属于自己的时间,可以用来思考:文学、艺术、哲学、宗教、政治、科学等等?


只要是随着这个时间流去走,不去挣扎的话,真的时间一晃而过。就像有人所说的,普通人能忙于物质生活都已经足够累了,还有几个能在此之外,建设/丰富精神世界?


这是给自己找理由吗?时间就像海绵里的水,挤一挤还是有的?怎么挤?不是人人都能凿壁借光、或闻鸡起舞,不然这故事也没什么好值得人敬佩的了。


有一说是:中国人把吃做到了极致,而欧洲人把闲做到了极致。


我辈当负大任,这也是时代的洪流所决定,不是个人的决定;长达三年的疫情的洪流,其实也就在今年才结束,相信还有许多人被影响、没走出来,但没谁会在乎,时间就是如水、如刀,不谈感情,继续往前,即使青丝变成白发。


2023 年,不一样的是什么,听到了许多,比如常谈的公众号已死、前端已死、B站收益已死、xxx已死,whatever,几乎没人会收集自己表皮更新而产生的死皮吧,落在满地,灰尘皆是,该怎样,还是怎样。


还是想到 2018 我说的一句话,每当年中,每当盛夏:“常言道:韶光易逝、寸暑难留、然其虚无、何以擒之”。夏天很好,夏夜更好,但没人能无穷尽的享用。或许,也只有想到,苏轼所说:共适此时,才得宝藏。


故:怎样都好。


p2


具体一点,2023 年上半年有什么不一样,自己敲定了人生大事之一,当然无非几件其一:出生、上学、考学升学、大学、就业、结婚、生子、循环往复,外乎还有买房、买车等等,就像大你十岁的人,聊天时,一定会问类似这些大事上的问题。


其次,工作转型,之前是前端,现在是项目经理;写文方向转型,之前写具体的前端技术文章,现在写 AIGC 的专栏;偶尔,用 AIGC 发一发想要翻译的潮流前线技术文章,但囿于自己时间、囿于自己执行力、囿于其它事情的权重取舍,所以现状就是这么个现状。


另外:发了很多知乎、但有起伏,马上7级;做了AIGC抖音号,获赞1k+;还有在同花顺论股,发声就是在生产观点、观点即内容,有冲突,也有价值,也会带来认知变化,以及有可能生产产生财富。


还有,改书一事,来回修订好几次,有种有心无力的感觉,给到的压力不小,但是怀疑自己究竟能否COVER;工作上事情很多,KPI 的压力也是直接到项目,薪酬结构调整、增量激励等等,没有人会在之前问你:你准备好了吗?你对这件事怎么看?要不等等你?


能留一个下午,去回看这些事,都是一种“偷窃”之举,得之所幸。


p3


再到,重点看看“起伏”这个事。红楼梦的经典在于此,“训有方、保不定日后作强梁;择膏梁,谁承望流落烟花巷”;


苏轼的几次被召、几次被贬也在于此,哀吾生之须臾、羡长江之无穷;


长安三万里高适、李白也如此,十年寒窗、十年还乡、十年扬州、十年边塞、十年朝堂、十年流亡;人生又几个十年,少小十年、老弱十年、睡梦十年又十年、乱哄哄,你方唱罢我登场。


说回股市,上半年关注很多,我是在想:财富的本质在于生产力,现在觉得也在于流动性;打工人是无产者,唯一能有产的就是,把微薄的薪水几成放到股市,同市场共振,让钱成为一种资产,成为一种员工,为自己所用。所以投资是开公司,我们打工,被当做资产来估价、人是一种资产、钱更应该是一种资产,怎样选对方向,是一直需要去专研的,虽然看不太明白,股市是最复杂的混沌系统,不能预测,但也只能尽全力在无序中找有序。


找规律、模仿、是我们一直在做的,将信息整合、同步各方,也是我们一直在做的,殊途同归、并无新鲜。


p4


再看以后,无复多言。做好工作,做好精神建设,做好“负熵”。


1、坚持输出、生产内容,输出倒逼输入,生产带来财富、流动带来财富;


2、做好身体锻炼,25 岁以后,身体代谢下降,真的是一个客观现实;如果每天手表的三个圆环都难合拢,身体只会走下坡路吧;


3、正能量/乐观,待人待事,在随波逐流和坚守原则之间权衡、适之。


最后用苏轼最经典之一的词总结:“回首向来萧瑟处,归去,也无风雨”。


所以,2023 年中,I`m fine,Thanks all,And you

作者:掘金安东尼
来源:juejin.cn/post/7258445326914076733
?

收起阅读 »

放假了,讲个真实的转岗故事

大家好啊,我是董董灿。 难得周中放了一天假,过了明天后天,又要过礼拜了,这周是真的幸福。 前天给自己立了个实战项目——《从零手写Resnet50》,这两天抽时间把Resnet50的模型,利用 torchvision 下载下来,并且写了个简单地 python 脚...
继续阅读 »

大家好啊,我是董董灿。


难得周中放了一天假,过了明天后天,又要过礼拜了,这周是真的幸福。


前天给自己立了个实战项目——《从零手写Resnet50》,这两天抽时间把Resnet50的模型,利用 torchvision 下载下来,并且写了个简单地 python 脚本,将参数保存成 txt 文件了。


方便后面验证算法进行整网推理。



最近考研结束了,有一些拟录取了新研一小朋友,私信我,希望给一些选专业方面的建议。


很多小伙伴是跨专业考研,对未来甚是迷茫。


这种情况,我有一个观点就是——


研一最宝贵的就是有大量的时间,现在喜欢做什么方向,就大胆去学、去做,在毕业前几年的时间,都可以不断试错,不断寻找最适合自己的职业道路。


 

今天不写技术了,讲一个真实的攻城狮转岗的故事,以下是正文——


回想硕士毕业,离开北京的那天早上,是阴天。


起了个大早,舍友们还在睡觉,我拎起已经收拾好的行李,慢慢的打开门,慢慢的关上门,从工大的宿舍走到工大西门坐地铁去南站,一路上,寥寥无几的行人。


从实验室到宿舍的路,走了3年,边上的校园,待了7年,离开前看了最后一眼,有点不舍。


人生处处是十字路口:北京上学,去青岛工作,是我毕业之后做的第一个抉择


机械专业的我,为了找到一份看起来还不错的工作,毅然决然地选择了换专业就业。


现在看来,感谢当初自己的选择,让自己做着自己喜欢的事——程序的世界是最简单的,它会按照你写的代码的自然法则来运行,一旦世界出了bug,你可以化身上帝,大手一挥,bug解除,世界归于平静。
没错,研究生毕业,我从机械跨专业去做了程序开发。


在青岛工作了一年,发现青岛的环境离我的预期相差甚远,机会少发展有限,熟悉北京节奏的我,又一次决然从青岛辞职,回北京闯荡。


和当初离开北京去青岛一样,没有一点犹豫,因为年轻,因为觉得,前方是一片大海,那里会有属于我的一个小岛。


于是刷题投简历面试,很幸运的是,进入了一家不错的公司,在那里,得到了长足的成长。


从初级攻城狮,到中高级攻城狮,从小白,到面试官,从只会做事写代码,到做方案讨论可行性,可以说,我经历了所有攻城狮都会经历的成长路径。


期间不断地学习,搞嵌入式,看电路图,学C++,学算法,学人工智能,搞AI芯片,一路走来,收获满满。我喜欢周星驰的《功夫》电影。电影中的星爷是一个万中无一的练武奇才,而我仅仅是平平无奇的一个开发者。


一个攻城狮,在无数个白天黑夜,游走于属于自己的小岛上,沉浸在代码的世界,一边开疆扩土(新特性开发),一边修路(优化)铺桥(bug修复),一边练着属于自己的如来神掌。


几年下来,让我变得和离开北京的那个清晨截然不同。


工作教会了我很多,除了技术,还收获了友谊,学到了职场的处事技巧。


现在的我,很庆幸,当初的两次选择,北京到青岛,青岛到北京——兜兜转转,逐渐看清了自己。


如果说选择比努力更重要,那么我觉得,只有选择了愿意为之努力的方向,选择才会变得重要。


现在的我,在一家创业公司工作,一边做着自己喜欢的事情,一边整理着自己几年来的收获,一边关注着行业的发展,一边重温星爷的电影。


有很多个瞬间,感觉自己又回到了研究生的宿舍:右边坐着龙哥,鼠标操作着盖伦,大喊着德玛西亚万岁;左边坐着畅哥,因为之前一直玩游戏,正在为明天的作业准备熬夜。


那时的我们,都做着自己喜欢的事情,对未来充满着憧憬。而现在的我们,也依然做着自己喜欢的事情,对未来充满的希望,相信舍友肯定也是这样。


兜兜转转,北京到青岛,青岛到北京,画了一个圈,从现在开始,坚持学习,坚持锻炼,坚持做自己喜欢的事。


"远行是为憧憬,归来仍是少年。"

作者:董董灿是个攻城狮
来源:juejin.cn/post/7218554163050758201

收起阅读 »

技术主管是否需要什么段位的技术

今天来跟大家讨论一下技术主管需要什么样段位的技术? 首先我要说明的一点,技术主管前提一定是技术出身。对于那些完全不懂技术,但是又身兼技术主管或者总监的同学,我这里就不再赘述,毕竟这个已经超出我目前理解力的范围。比如阿里云的王坚博士,基本上不懂技术细节,但是依然...
继续阅读 »

今天来跟大家讨论一下技术主管需要什么样段位的技术?


首先我要说明的一点,技术主管前提一定是技术出身。对于那些完全不懂技术,但是又身兼技术主管或者总监的同学,我这里就不再赘述,毕竟这个已经超出我目前理解力的范围。比如阿里云的王坚博士,基本上不懂技术细节,但是依然是阿里云的CTO,一手缔造了阿里云。


那我们这里再详细讨论一下,作为一名技术主管,到底应该有什么样的一个技术的段位?或者换句话来说,你的主管的技术水平需要到达什么样的一个水位?


先说结论,作为一名技术主管,一定是整个团队的技术架构师。像其他的一些大家所讨论的条件我觉得都是次要的,比如说写代码的多少,对于技术深度的钻研多少,带的团队人数多少等等,最核心的是技术主管一定要把控整个团队整个业务技术发展的骨架。


为什么说掌控团队技术架构是最重要的?因为对于一个团队来说无非就两点,第一点就是业务价值,第二点就是技术价值。


对于业务价值来说,有各种各样的同学都可以去负责业务上面的一些导向和推进,比如说产品经理,比如说运营同学。技术主管可以在一定程度上去帮助业务成功,甚至是助力业务成功,但是一定要明白技术同学一定要有自己的主轴,就是你对于整个技术的把握。因为业务上的决策说到底技术主管是只能去影响而非去决策,否则就是你们整体业务同学太过拉胯,无法形成战术合力的目的。


对于一线开发同学来说,你只要完成一个接一个的技术项目即可。但是对于技术主管来说,你就要把握整体的技术发展脉络。要清晰的明白什么样的技术架构是和当前的业务匹配的,同时又具备未来业务发展的可扩展性。


那为什么不能把整个技术架构的设计交给某一个核心的骨干研发同学呢?


所以这里就要明白,对于名技术主管来说,未必一定要深刻的钻研技术本身,一定要把技术在业务上的价值发挥到最大。所以在一定程度上来说,可以让适当的同学参与或者主导整个技术架构的设计,但是作为主管必须要了解到所谓的技术投入的产出比是什么。但是如果不对技术架构有一个彻底的理解,如何能决定ROI?



也就是在技术方案的选型里面一定要有一个平衡,能够用最小的技术投入获取到最大的技术利益,而非深究于技术本身的实习方式。如果一名技术主管不了解技术的框架或者某一些主干流程,那么就根本谈不上怎么样去评估这投入的技术产出比。一旦一名技术主管无法衡量整个技术团队的投入产出比,那就意味着整个团队的管理都是在抓虾和浑水摸鱼的状态,这时候就看你团队同学是否自觉了。


出现了这种情况下的团队,可能换一头猪在主管的位置上,业务依然运行良好。如果在业务发展好的时候,可能一直能够顺利推动,你只要坐享其成就可以了,但是一旦到了要突破困难的时期,或者在业务走下行的时候,这个时候你技术上面的优势就一点就没有了。而且在这种情况下,如果你跳槽到其他公司,作为一名技术主管,对方的公司对你的要求也是非常高的,所以这个时候你如果都说不出来你的技术价值对于业务上面的贡献是什么那想当然,你可能大概率就凉凉了。


那问题又回到了什么样的水平才能到达架构师这个话题,可以出来另一篇文章来描述,但是整体上来说,架构的本质首先一定要明白,为的就是业务的增长。


其次,架构的设计其实就是建造一个软件体系的结构,使得具备清晰度,可维护性和可扩展性。另外要想做好架构,基本的基础知识也必不可少,比如说数据库选型、分布式缓存、分库分表、幂等、分布式锁、消息架构、异步架构等等。所以本身来说做好架构师本身难度就非常大,需要长期的积累,实现厚积而薄发。如何成为一名优秀的架构师可以看我的公众号的其他文章,这里就不再详细的介绍了。



第二点是技术主管需要对于技术细节有敏感度。很多人在问一名主管到底应该具备什么样的综合能力,能不能用一种更加形象的方式来概括,我认为就有一句话就可以概括了。技术主管应该是向战略轰炸机在平常的时候一直遨游在大气的最上层能够掌控整个全局,当到了必须要战斗的时候,可以快速的补充下去,定点打击。


我参加过一次TL培训课程,讲师是阿里云智能交付技术部总经理张瑞,他说他最喜欢的一句管理概括,就是“心有猛虎,细嗅蔷薇”,也就是技术主管在平常的时候会关注于更大的宏观战略或策略,也就是注重思考全局,但是在关键的时候一定要关注和落地实际的细节。


换句更加通俗的话来说,就是管理要像战略轰炸机,平常的时候飞在万丈高空巡视,当发生了战斗的时候,立即能够实现定点轰炸。



所以如果说架构上面的设计就是对于整个团队业务和技术骨架的把握,那么对于细节的敏感度就是对于解决问题的落地能力。


那怎么样能够保证你自己有一个技术细节的敏感度?


我认为必要的代码量是需要的,也就是说对于一个主管来说,不必要写太多低代码,但一定要保证一定的代码量,让自己能够最好的,最快的,最贴近实际的理解实际的业务项目。自己写一些代码,其实好处非常多,一方面能够去巩固和加深自己对技术的理解,另外一方面也能够通过代码去更加理解业务。


当然贴近技术的方式有很多种,不一定要全部靠写代码来完成,比如说做code review的方式来完成,做技术方案的评审来完成,这都是可以的。对我来说,我就会强迫自己在每一个迭代会写上一个需求,需求会涉及到各方各面的业务点。有前端的,有后端的,也有数据库设计的。


自己亲自参与写代码或者code review,会让自己更加贴近同学,能够感知到同学的痛点,而不至于只是在空谈说教。


总结


所以对于一个技术主管来说,我认为首要的就是具备架构设计的能力,其次就是要有代码细节的敏感度,对全局和对细节都要有很强大的把控能力。


当然再总结一下,这一套理论只是适用于基础的管理者,而非高层的CTO等,毕竟不同的层级要求的能力和影响力都是不一样的。


作者:ali老蒋
来源:juejin.cn/post/7257784425044705340

收起阅读 »

在字节的程序员的 2023 年中总结

2023 年已经过去了,回顾这一年,作为字节的程序员,我想分享一下我的总结。 首先,2023 年是一个非常特殊的一年。全球疫情已经得到有效控制,人们的生活逐渐恢复正常。在这个背景下,科技行业得到了更多的关注和投资。作为一名程序员,我感到非常幸运能够在这个行业中...
继续阅读 »

2023 年已经过去了,回顾这一年,作为字节的程序员,我想分享一下我的总结。


首先,2023 年是一个非常特殊的一年。全球疫情已经得到有效控制,人们的生活逐渐恢复正常。在这个背景下,科技行业得到了更多的关注和投资。作为一名程序员,我感到非常幸运能够在这个行业中工作。


在这一年中,我参与了很多有趣的项目。其中最令我印象深刻的是我们团队开发的一款智能家居系统。这个系统可以通过语音控制来控制家里的各种设备,比如灯光、温度、音响等等。用户可以通过手机 App 或者智能音箱来控制家居设备。这个项目不仅让我学习了很多新技术,还让我感受到了科技带来的便利和乐趣。


除了技术方面的学习和成长,我也意识到了作为一名程序员的责任和使命。在这个信息时代,程序员们不仅仅是技术人员,更是社会的建设者和推动者。我们所开发的软件和系统,不仅仅是为了满足商业需求,更应该为社会带来更多的价值和福利。比如,在疫情期间,我们团队开发了一款在线医疗咨询系统,让患者可以在线上咨询医生,减少了人员聚集和传染的风险。这种为社会做贡献的感觉真的很棒。


当然,在这一年中也遇到了很多挑战和困难。比如,我们团队在开发一个大型项目时遇到了很多技术难题和进度压力。但是,通过团队合作和不断努力,最终我们成功地完成了项目,并得到了客户的高度评价。这也让我更加深刻地认识到团队合作和自我提升的重要性。


总之,2023 年对我来说是一个非常充实和有意义的一年。在未来的日子里,我会继续努力学习和提升自己,为社会做出更多的贡献。同时也祝愿所有的程序员们都能在自己的岗位上取

作者:韩淼燃
来源:juejin.cn/post/7257733186158805052
得更好的成绩和发展。

收起阅读 »

如何写出一手好代码(上篇 - 理论储备)?

无论是刚入行的新手还是已经工作多年的老司机,都希望自己可以写一手好代码,这样在代码 CR 的时候就可以悄悄惊艳所有人。特别是对于刚入职的新同学来说,代码写得好可以帮助自己在新环境快速建立技术影响力。因为对于从事 IT 互联网研发工作的同学来说,技术能力是研发同...
继续阅读 »

无论是刚入行的新手还是已经工作多年的老司机,都希望自己可以写一手好代码,这样在代码 CR 的时候就可以悄悄惊艳所有人。特别是对于刚入职的新同学来说,代码写得好可以帮助自己在新环境快速建立技术影响力。因为对于从事 IT 互联网研发工作的同学来说,技术能力是研发同学的立身之本,而写代码的能力又是技术能力的重要体现。但可惜的是理想很丰满,现实很骨感。结合慕枫自己的经验来看,我们在工作中其实没那么容易可以看到写得很好的代码。造成这种情况的原因也许很多,但是无论什么原因都不应该妨碍我们对于写好代码的追求。今天慕枫就和大家探讨下到底怎样做才能写出一手大家都认为好的代码?


哪些因素制约好代码的产生?


我们首先来分析下到底哪些因素造成了现实工作中好代码难以产出。因为只有搞清楚了这个问题才能对症下药,这样在我们自己写代码的时候才能尽量避免这些问题影响我们写好代码。


假如让我们说出哪些是烂代码,我们也许会罗列出来代码不易理解、没有注释、方法或者类词不达意、分层不合理、不够抽象、单个方法过长、单个类过长、代码难以维护每次改动都牵一发动全身、重复代码过多等等,这些都是我们在实际项目开发过长中经常遇到的代码问题。那么到底是什么原因造成了现实项目中有这么多的代码问题呢?慕枫认为主要存在以下三方面的原因。



1、项目倒排时间不够


项目需求倒排导致没有时间在写代码前好好进行设计,所以只能先快速满足需求等后面有时间再优化(大概率是没有时间的)。这就造成技术同学在写代码的时候怎么快怎么写,优先把功能实现了再说,很多该考虑的细节就不会考虑那么多,该处理的异常没有进行处理,所以可能写出来的代码可以说是一次性代码,只针对当前的业务场景,基本没什么扩展性可言。


2、团队技术氛围不足


团队内技术氛围不是很浓厚,本来你是想好好把代码写好的,但是发现大家都在短平快的写代码,而且没有太多人关心代码写的好不好,只关心需求有没有按时完成。在这样的团队氛围影响之下,自己写出来的代码也在慢慢地妥协。像在阿里这样的一线互联网公司,团队中的代码文化还是很强的,很多技术团队在需求上线前必须要进行代码 CR,CR 不过的代码不允许上线。因此好的团队技术氛围会促使你不得不把代码写好,否则在代码 CR 的时候就等着接受暴风雨般的吐槽吧。


3、自身技术水平有限


第三个原因就是自身的技术水平有限,设计模式不知道该在什么样的业务场景下使用,框架的高级用法没有掌握,经验不足导致异常情况经常考虑不到。自己本身没有把代码写好的追求,总想着能满足需求代码能跑就行。


以上大概是我们实际工作中导致我们不能产出好代码最主要的三大原因,第一个原因我们基本无法改变,因为在互联网行业竞争本身就非常激烈,谁能先推出新业务优化用户体验,谁就能占得市场先机。因此项目倒排必定是常有的事情,也是无法避免的事情。第二个原因,如果你自己是团队的 TL,那么尽量在团队中去营造代码 CR 的文化,提升团队中的技术氛围。因为代码是技术团队的根本,所有的业务效果落地都需要通过代码来实现,因此好的代码可以帮助团队减少 Bug 出现的概率、提升大家的代码效率从而达到降低人力物力成本的目的。如果你不是团队的 TL,同时团队中的技术氛围也没那么足,那么我们也不要放弃治疗,先把自己负责的模块的代码写好,一点点影响团队,逐渐唤起大家对于好代码的重视。


前两个因素都属于环境因素,也许我们不好改变,但是对于第三个因素,我觉得我们可以通过理论知识的学习,不断的代码实践以及思考总结是可以改变的,因此本文主要还是讨论如何通过改变自己来把代码写好。


到底什么是好代码?


要想写出好的代码,首先我们得知道什么样的代码才是好代码。但是好这个字本身就具有较强的主观性,正所谓一千个读者心中就有一千个哈姆雷特。因此我们需要先统一一下好代码的标准,有了标准之后我们再来探讨到底怎么做才能写出好代码。


我相信大家肯定听说过代码可读性、代码扩展性、可维护性等词汇来描述好代码的特点,实际上这些形容词都是从不同方面对代码进行了阐述。但是在慕枫看来,在实际的项目开发中,可维护性以及高鲁棒性是好代码的两个比较核心的衡量标准。因为无论是开发新需求还是修复 Bug,都是在原有的平台代码中进行修改,如果原来代码的扩展性比较强,那么我们编码的时候就就可以做到最小化修改,降低引入问题的风险。而鲁棒性高的代码在线上出现 Bug 的概率相对来说就第一点,对于维护线上服务的稳定性具有重要意义。


可维护性


我们都知道代码开发并不是一个人的工作,通常涉及到很多人团队合作。因此慕枫认为代码的可维护性是好代码的第一要义。而可维护性主要体现在代码可读容易理解以及修改方便容易扩展这两方面,下面分别进行阐述说明。


代码可读


我们写出来的代码不仅仅要自己能看得懂自己写的代码,别人也应该可以轻松看得懂你的代码。在一线的互联网大厂中工作内容发生变化是常有的事情,如果别人接手我们的代码或者我们接手别人的代码时,可读性强的代码无疑可以减少大家理解业务的时间成本。因为代码是最直接的业务表现,那些所谓的设计文档要么过时要么写的非常粗略,基本不太能指导我们熟悉业务。那么什么样的代码称得上可读性强呢?


命名准确


无论是包的命名、类的命名、方法的命名还是变量的命名都能很准确地表达业务含义,让人可以看其名知其义。命名应该和实际的代码逻辑相匹配,否则不合适的命名只会让人丈二和尚摸不着脑袋误导看代码的同学。以前看代码的时候我看过以 main 作为类中的方法名称,所以得看完这个方法的实现逻辑才能明白它到底干什么的,这对于后期维护的同学来说非常不友好。


代码注释


另外就是必要的注释,有些同学非常自信觉得自己写的代码很好懂,根本不需要写什么注释。结果自己过了一两个月再回头看自己的代码的时候,死活想不起来某段代码为什么要这么写。当然我们不必每一行代码都写注释,但是该注释的地方就要写注释,特别是一些逻辑比较复杂,业务性比较强的地方,既方便自己以后排查问题也方便后面维护的同学理解业务。因此不要对自己写的代码过于自信,间隔时间一长也许连你自己都未必记得代码为什么这么写。


结构清晰


无论是服务的包结构还是代码结构都体现了技术同学对于技术的理解,因此即便是不深入看代码逻辑,通过包结构的划分、模块的划分类结构的设计已经基本可以判断出来项目的代码质量了。我们在进行包结构设计的时候可以遵循依赖倒置的原则,让非核心层依赖核心层。



可扩展性


随着业务需求的不断变化,技术同学免不了在原有的代码逻辑中进行修改。因此项目代码的可扩展性直接影响着后期维护的成本。如果改一个小需求就需要对原有的代码大动干戈,修改的地方越多引入 Bug 的风险就会越大。我们都知道线上的故障有七八成都是由于变更引起的,因此可扩展性强的代码可以有效控制变更的范围。


高鲁棒性


当我们说到代码鲁棒性高的时候,实际就是说代码比较健壮,能够应对各种输入,即便出现异常也会有对应的异常处理机制进行响应而不至于直接崩溃。而项目开发不是一个人的工作,通常都是团队合作,因此我们写的代码无时无刻不在和别人的代码进行交互,所以我们负责的代码模块总是在处理可能正常可能异常的输入。如果不能对可能出现的异常输入进行妥善的防御性处理,那么可能就会造成 Bug 的产生,严重情况下甚至会影响系统正常运行。因此好的代码除了方便扩展方便维护之外,它必定也是高鲁棒性的,否则如果每天 Bug 满天飞,哪有时间和精力去琢磨代码的可扩展性,大部分精力都用来修复 Bug,长此以往自己也会感觉身心俱疲,总是感觉自己没什么成长。


如何写出好代码?


强烈内在驱动


为什么我把强烈的内在驱动摆在首要位置,主要是因为我觉得程序员只有有了想把代码写好的愿望,才能真正驱动自己写出来好代码。否则即便掌握了各种设计原则以及优化技巧,但是自己没有写好代码的内在驱动,总是觉得程序又不是不能用,或者觉得代码和自己有一个能跑就行,亦或是抱着后面有时间再优化的态度(基本是没时间)是不可能写好代码的。因此首先我们得有写好代码的内在驱动和愿望,我们才能有把代码写好的可能。不过话又说回来,内在驱动是基础,全是感情没有技巧肯定也不行。


沉淀业务模型


谈完了内在驱动这个感情,我们就要来看看要掌握哪些技巧才能帮助我们写出来好代码,首当其冲的就是业务领域模型,因为它是领域业务在工程代码中的落地也是整个服务的核心,不过遗憾的是很多同学并没有意识到它的重要性,甚至经常会把数据模型和业务模型相混淆。而我自己在在团队中落地 DDD 领域驱动设计的时候,被技术同学问过比较多的问题就是数据库表对应的数据实体满足不了业务需要吗?为什么还需要业务领域模型?那么想要回答这些问题,我们得先搞清楚到底什么是领域模型,它到底能给技术团队带来什么。


从本质上来说领域模型就是我们对于本行业业务领域的认知,体现了你对行业认知的沉淀以及外化表现。那么怎么体现你对行业领域业务认知的深度呢?领域模型就是很好的验证手段,对行业认知越深刻的同学构建的领域模型越能够刻画现实中的业务场景,我们也可以认为领域模型是现实世界业务场景到代码世界的映射,同时它也是公司重要的业务资产。那么每个行业的业务认知又是从哪里来的呢?实际上就从实际的业务场景中抽象出来的。所以领域模型的建立通常都是伴随着业务需求的出现。因此领域模型是核心,包含了业务概念以及概念之间的关系,它可以帮助团队统一认识以及指导设计。



但是领域建模具有一定的门槛,其中包含了很多难以理解的概念,这也造成了在很多技术团队中难以落地。但是在阿里等国内一线互联网公司却有着广泛的应用,因为 DDD 领域驱动设计可以指导我们应对复杂系统的设计开发,控制系统复杂度,帮助我们划分业务域,将业务模型域实现细节相分离。所以慕枫觉得让大家认识到 DDD 领域驱动设计以及领域模型的的重要性比如何玩转 DDD 本身更加重要。



另外在这里不得不提一下数据模型和领域模型的区别,在实际的工作中我发现很多同学都容易将这两者混淆。领域模型关注的是业务场景下的领域知识,是业务需求中概念以及概念之间的关系,它的存在就是显示的精确的表达业务语义。而数据模型关注的是业务数据如何存储,如何扩展以及如何操作性能更高。因此他们关注的层面不同,领域模型关注业务,数据模型关心实现。


这里可以举个例子给大家说明一下,假设有这样的业务场景,告警规则中存在一个规则范围的概念,主要可以给出不同的告警取值判断的范围,比如某个接口调用次数失败的最大值,或者设备在线数量不能低于某个最小值等等,因此有了如下简化版本的领域模型。



那么在实际实现落地的时候,就很自然想到将 AlarmRule 以及 RuleRange 分别用一个表进行进行存储。这其实就是把领域模型和数据模型混淆的典型例子,实际上我们没有必要搞两张表来存储,一张表其实就够了,主要有以下两个原因:


1、写代码的时候我们维护一张表肯定比维护两张表操作起来更加方便;


2、另外万一后面 ruleRange 有新的变化,增减了新的判断条件,我们还得要修改 rule_ranged 字段,不利于后期的扩展。



因此我们用一张表来就进行存储就好了,多一个 json 类型的字段,专门存储阈值判断范围。只不过在领域模型中我们需要把 c_rule_range 定义为一个对象,这样在代码层面操作起来比较方便。



牢记设计原则


无论设计原则还是设计模式,都是先驱们在以往大量软件设计开发实践中总结出来的宝贵经验,因此我们在项目开发中完全可以站在巨人的肩膀上利用这些设计原则指导我们进行编码。当然如果我们想熟练使用这些设计原则,就必须先要理解他们,搞清楚这些设计原则到底是为了解决什么问题而产生的。


我们不妨仔细想一想,平日时间里技术同学的开发工作基本上都是在已有的服务中进行新需求开发或者在原有的逻辑中修修改改。因此如果因为一个需求需要修改原有代码逻辑,我们总是希望修改的地方越少越好,否则如果修改的地方多了,那么引入的 Bug 风险就会越大。即便是项目需要进行重构的情况,那我们也希望重构后的服务或者组件可以满足高内聚低耦合的大要求,这样在未来进行需求开发的时候可以更加方便的进行修改。这也是我们希望我们开发的代码高内聚低耦合的原因。可以看得出来,设计原则的核心思想就是帮助技术人员开发的软件平台能够更好地应对各种各样的需求变化,从而最终达到降低维护成本,提高工作效率的目的。


当我们说到设计原则的时候,通常都会想到 SOLID 五大原则,这里所说的设计原则主要包括 SOLID 原则、迪米特法则。


单一职责原则


对于一个方法、类或者模块来说,它的职责应该是单一的,方法、类或者模块应该只负责处理一个业务。这个原则应该很好理解,当我们在写代码的时候,无论是方法、类以及模块都应该从功能或者业务的角度考虑将无关的逻辑抽离出去。为什么这么做呢?主要还是为了能够实现代码业务功能的原子化操作,这样即便未来进行修改的时候影响的范围也会变得有限。如果我们不遵守单一职责原则,那么在修改代码逻辑的时候很可能影响了其他业务的逻辑,造成修改影响范围不可控的情况。



You want to isolate your modules from the complexities of the organization as a whole, and design your systems such that each module is responsible (responds to) the needs of just that one business function.



不过需要说明的是,这里的所说的单一职责是针对当前的业务场景来说的,也许随着业务的发展和场景的扩充,原来满足单一职责的方法、类或者模块可能现在就不满足了需要进一步的拆分细化。


开闭原则


慕枫认为开闭原则与其说它是一种设计原则,不如说它是一种软件设计指导思想。无论我们编写框架代码还是业务代码都可以在开闭原则这样的核心思想指导下进行设计。



Software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification。



所谓开闭原则指的就是我们开发的框架、模块以及类等软件实体应该对扩展开放,对修改关闭。这个原则看上去很容易理解,但是在进行项目实际落地的时候却不是一件容易的事情。因为对于扩展以及修改并没有明确的定义,到底什么样的代码才是扩展,什么样的代码才是修改?这些问题不搞清楚的话,我们很难把开闭原则落地到实际的项目开发中。


结合自己的开发经验可以这么理解,假设我们在项目中开发一个功能的时候,如果能做到不修改已有代码逻辑,而是在原有代码结构中扩展新的模块、类或者方法的话,那么我们认为代码是䄦开闭原则的。当然这也不是绝对的,比如假设你修改一个原有逻辑中的判断条件的阈值,那只能在原有代码逻辑中进行修改。总不能因为要满足这个原则非要搞出来。所以我觉得我们不必要教条的去追求满足开闭原则,而是从大方向上以及整体上考虑满足开闭原则。


里氏替换原则


在面向对象思想构建的程序中,子类对象可以替换程序中任何地方出现的父类对象,同时还能保证程序的逻辑不变以及正确性不变,这就是里氏替换原则的字面理解。不知道大家有没有发现,这个里氏替换原则看上去和 Java 中的多态一样一样的。实际上他们还是有区别的,多态是面向对象编程的特性,是重要的代码实现思路。而里氏替换原则是一种设计原则,约定子类不能破坏父类定义好的逻辑以及异常处理。


比如在仓储业务域中,父类中有对拣货任务进行排序的 sortPickingTaskByTime()方法,它是按照任务创建的时间对到来的拣货任务进行排序,那么我们在子类实现的时候如果在 sortPickingTaskByTime()方法内部按照拣货任务涉及的商品品类进行排序,那么明显是不符合里氏替换原则的,但是从多态的角度来说或者从语法的角度来说却没有问题。


里氏替换原则的核心思想就是按照约定办事,父类约定好了的行为,子类实现需要严格遵守。那么里氏替换原则对于实际编码有什么指导意义呢?比如上文所说的 sortPickingTaskByTime()排序方法,如果父类中的算法实现效率不高,我们可以在子类中进行优化,有了里氏替换原则就可以通过子类改进当前已有的实现。另外父类中的方法定义就是契约,可以指导我们后面的编码。


接口隔离原则


所谓接口隔离说的是接口调用方不应该被迫依赖它不需要的接口。怎么理解这句话呢?按照慕枫自己的理解,接口调用方只关心和自己业务相关的接口,其他不相关的接口应该隔离到其他接口中。



Clients should not be forced to depend upon interfaces that they do not use。



从扩展能力层面来看,我们定义接口的时候按照原子能力进行定义,避免了定义一个大而全的接口,这样在进行扩展的时候就可以按照具体的原子能力来进行,这样无论是灵活性还是通用性上面都会更加满足需求。


从实现上来说,如果实现方仅仅需要实现它以来的接口功能就好,它不需要的接口功能就不需要实现,这样也会大大降低代码实现量。当我们扩展或者修改代码的时候能够做到最小化的修改。


依赖倒置原则                                                                                      依赖倒置原则不太容易理解,但是我们在实际的项目开发中却每一天都在使用,只是我们可能没太在意罢了。                  



High-level modules shouldn't depend on low-level modules. Both modules shoud depend on abstractions.In addition,abstractions shouldn't depend on details.Details depend on abstractions.



按照字面意思理解,高层级模块不应该依赖低层级模块,同时两者都应该依赖于抽象。另外抽象不应该依赖于细节,细节应该依赖于抽象。用大白话来说主要是两个核心点,一是面向接口编程,另一个是基础层依赖核心层。


面向接口编程这个应该很好理解,因为接口定义了清晰的协议规范,研发同学可以基于接口进行开发。



                                                                     


迪米特法则                                                                                         


迪米特法则看名字是一点不知道它是干什么的,简单来说就是类和类之间能不要有关系就不要有关系,实在没办法必须要有关系的那也尽量只依赖必要的接口。这样说起来感觉还是比较抽象。看下面的图就明白了,左边的各个模块拆分比较独立,符合单一职责原则,同时模块间只依赖它所需要的模块,而下图右边的模块拆分不够独立,A 模块本来只需要依赖 F 模块,但是 FG 模块颗粒度较大,导致不得不依赖 G 模块的接口,显然这是不符合迪米特法则的。                                                                                            



当我们有了写出来的代码能够实现高内聚低耦合、易扩展以及易维护愿景之后,那就要好好学习一些代码实现的设计原则,这些设计原则在战略层面可以指导我们扩展性强的代码应该往哪些方向进行设计考虑。而有了指导思想之后,结合不同场景下的设计模式就自然催生出来我们想要的结果。



运用设计模式


设计模式是先驱们在实践的基础上总结出来可以落地的代码实现模板,针对一些业务场景提供代码级解决方案。我们根据各个设计模式的能力特点可以将 23 种设计模式分类为创建型模式、结构型模式以及行为型模式。这里不再对设计模式进行展开说明,后面有时间可以写系列文章专门进行介绍。不过我们需要清楚的是这 23 种设计模式就是程序员写代码打天下的招式,而提升代码扩展性才是最终目的。



面向失败编码


代码中的异常处理往往最能体现技术同学的编码功力。完成一个需求并不难,但是能够考虑到各种异常情况,在异常发生的时候依然可以得到预想输出的代码,却不是每个程序员都能写出来的。  因此无论是写代码还是系统设计,都要有面向失败进行设计的意识,每一个业务流程都要考虑如果失败了应该怎么办,尽可能考虑周全可能会出现的意外情况,同时针对这些意外情况设计相应的兜底措施,以实现防御性编码。


这里假设有这样的业务场景,当我们的业务中有调用外部服务接口的逻辑,那么我们在编写这部分代码的时候就需要考虑面向失败进行编码。因为调用外部接口有可能成功,有可能失败。如果接口调用成功自然没什么好说的,继续执行后续的业务逻辑就好。但是如果调用失败了怎么办,是直接将调用异常返回还是进行重试,如果重试还是失败应该怎么办,需不需要设计下重试的策略,比如连续重试三次都失败的话,后续间隔固定时间再进行重试等等。当然我们并不需要在每个这样的业务流程中这么做,在一些比较核心的业务链路中不能出错的流程中要有兜底措施。



总结


本文主要从理论层面为大家介绍写好代码的需要哪些知识储备,下一篇会从具体业务场景出发,具体实操怎么结合这些理论知识来把代码写好。不过我们必须认识到好代码是需要不断打磨的,并非一朝一夕就能练就,总是需要在不断的实践,不断的思考,不断的体会以及不断的沉淀中实现代码能力的提升。左手设计原则,右手设计模式,心中领域模型再加上强烈的内在驱动,我相信我们有信心一定可以写出一手好代码。


作者:慕枫技术笔记
来源:juejin.cn/post/7257518360099405883
收起阅读 »

技术人如何快速融入团队?

写在前面:文末「拓展阅读」的两篇文章写得很好,提纲挈领,推荐阅读。本文偏个人感悟,教学不敢说,日后若有更深刻的感悟会再重新整理。 很多人在进入新团队时会焦虑,害怕做不好,害怕才不配位,不知道如何开展工作。这是一种正常现象,因为针对「融入团队」这件事,我们没有...
继续阅读 »

写在前面:文末「拓展阅读」的两篇文章写得很好,提纲挈领,推荐阅读。本文偏个人感悟,教学不敢说,日后若有更深刻的感悟会再重新整理。



很多人在进入新团队时会焦虑,害怕做不好,害怕才不配位,不知道如何开展工作。这是一种正常现象,因为针对「融入团队」这件事,我们没有刻意练习,没有找到一套行之有效的方法。


下面,我将结合《程序员的底层思维》 这本书介绍的方法,以及个人实践经验,来聊聊如何快速融入团队。


本文适合有 3 年以上的技术工作者阅读,低年限或者非技术同学也有一定的参考意义。


工作拆解


对于一个企业而言,核心组成要素无非就是人、业务、技术、文化。因此工作的开展可以从这四个角度出发,并逐层拆解,力争从陌生变熟悉。





目标:熟悉组织结构、人员分工,并与未来可能有合作关系的人建立关系。


行动:



  1. 了解组织结构

  2. 了解人员分工

  3. 建立关系




业务


目标:熟悉业务,对产品定位、用户人群、行业现状有一定了解。


行动:



  1. 了解业务现状

  2. 梳理业务流程

  3. 理解用户




技术


目标:熟悉团队技术现状,方便后续开展工作



切勿一上来就高谈阔论、方法论,推翻重构,对过往保持敬畏。



行动:



  1. 熟悉架构,包括系统架构、领域模型、代码结构

  2. 了解研发流程,从一个小需求入手,掌握相关的流程和权限

  3. 先小后大,以点破面。从小点突破,比如性能优化,先拿到业绩,再准备大的规划。




文化


目标:熟悉企业文化


行动:



  1. 理解公司使命

  2. 理解业务愿景

  3. 理解公司价值观,并做到知行合一




心态调整



不着急,不害怕,不要脸 — 冯唐《冯唐成事心法》



上一章讲的是「术」,是方法论,但光会「术」有可能会碰壁,因为心态问题。



  • 不着急:每个人到一个新团队,总想着快速理解业务、快速出成绩,来证明自己的价值。可以理解,但是不必着急,多给自己和他人一些时间,做好规划,安排好时间尽力而为即可,切勿急功近利。

  • 不害怕:不害怕事情失败,培养成长性思维,相信明天的自己比今天更优秀。记住一句话:成功是一时的,成长是一辈子的;还有一句老话:失败是成功之母。大不了,重头再来。

  • 不要脸:不怕丢脸、不怕打脸。很多人进入新团队,不敢发言不敢提问,殊不知这是露脸的好机会,可以让更多人更快地认识自己。还有一种是怕向年龄或资历更小的人提问,觉得丢人,选择自己研究导致浪费时间。孔子有云 “不耻下问”,改变心态,对方对某块事物的理解就是比自己熟,不害怕提问,帮助自己更快地获取知识并融入团队。


以上,不着急、不害怕、不要脸,改变心态,方能更好的融入。


总结


融入团队是需要刻意练习的。


先调整心态,不着急、不害怕、不要脸。


再逐步拆解工作,按人、业务、技术、文化四个方向开展。


最后会发现,「融入团队」这件事,其实和做题一样简单,唯一的变量,也就是人而已。



作者:francecil
来源:juejin.cn/post/7257774805431877689

收起阅读 »

前端:需要掌握哪些技能才能找到满意的工作?

如果你在找前端工作,你一定求助过不少大佬传授找工作和面试经验,而你得到的答案肯定很多时候就是简单的一句话:把 html、css、 js 基础学扎实,再掌握vue或react前端框架之一就可以了。 真的是这样吗?技术上看似乎没问题,但是找工作不只要从技术上下手,...
继续阅读 »

如果你在找前端工作,你一定求助过不少大佬传授找工作和面试经验,而你得到的答案肯定很多时候就是简单的一句话:

把 html、css、 js 基础学扎实,再掌握vue或react前端框架之一就可以了。

真的是这样吗?技术上看似乎没问题,但是找工作不只要从技术上下手,还要从个人目标和公司的招人标准综合进行考量,然后你还需要掌握一套有逻辑、有结构的面试回答技巧。接下来我们逐一分析一下,相信你看完之后就有了方向和方法,一定能找到满意的工作。

个人目标

现在我们的教育并没有太着重于个人目标和职业规划的设定,但找工作与其关系特别大。如果你想找一个大厂,那么准备方向就跟创业公司完全不一样。我们分别来看一下这两种情况。

大厂

大厂可能更看重你的 htmlcss 和 JavaScript 基础,以及数据结构、算法和计算机网络。你的准备方向就应该是这些基础方面的东西。另外还有一些原理方面的知道,比如你要做 vue 或者 react 开发,那就要知道 virtual dom 和 diff 算法的原理。

创业公司

如果你的目标是创业公司(这种公司的发展前景不可预测,可能大展宏图,也可能半途而废),你需要有大量的实战经验,因为创业公司为了抢占市场,产品的开发进度一般都会特别紧张,你需要去了就能够立刻干活;而理论方面的东西则会关注的少一些。针对面试,你需要去准备相关技术(比如 React 或 Vue) 的实战项目经验。

所以要想知道学到什么程度才能去找工作,首先得明确一下你的目标,是想去大厂,还是去创业公司,然后分别进行准备和突破。

公司要求

接下来再看一下公司的招聘要求,好多公司都写的特别专业、全面,除了基本语法、框架外,还要求有兼容性调整、性能优化、可视化经验,或者是掌握一些小众框架。这些招聘信息其实描述的是最佳人选,几乎在100个里面才能挑出1个来,而这种大牛级别的人自己也向往更好的工作机会,所以可能根本不会跟你有竞争关系。公司这么写招聘要求目的只有一个,就是找一个技能越全的人越好。

事实上,你只需满足要求的百分之80%,70%,甚至 50% 都有可能获得这份工作机会,因为面试不光看技术,还要看眼缘、人缘:如果面试官觉得你们投缘的话,你即使有不会的问题,他也会主动引导你帮你回答上来;要是不投缘(有些比较250的面试官),那就算你会的再多,他也会觉得你很菜(你不懂他懂的)。所以说那些招聘要求就只作为参考就好了,可以作为你以后的学习路线。不过这些技能还是掌握的越多越好,技多不压身,你可以一边面试一边准备,这样也不会互相影响。

技术能力

分析完外界的因素之后,来看一下咱们需要具体掌握哪些技术。

基础

作为一名前端工程师,htmlcssJavaScript 基础是一定要掌握牢固的,所有的语法点都必须要掌握,然后还要熟识面试必考的题,比如 ES6 及后面的新特性原型链Event Loop 等等。这些不是从学校学来的,而是为了面试专门突击准备的,需要反复的去看,去研究,最后把它们理解并记住。

框架

掌握这些基础之后,就需要看一下前端比较火爆的框架,react 和 vue。大厂用 React 的比较多,中小型公司用 vue 的比较多,当然这也不是绝对的。据我目前的经验来看,React 的薪水还是比较高的,不过看你自己喜好,喜欢做什么就做什么,从这两个框架中选一个深入去学,后面有时间再去研究另外一个。具体学习和准备方法可以

  • 先学基础用法,再学高级用法,最后掌握框架原理,比如:React / Vue,Redux / Vuex ,因为面试官通常喜欢问这方面的问题。针对这些一定要去看看别人的总结,然后自己研究一下,会更容易理解并记住。了解原理后,有时间再去研究一下源码,对于面试会更有帮助。
  • 理论准备完之后,实战肯定也少不了,无论是校招还是社招,无论是面大厂还是面小厂,都需要应聘者有实战经验。因为光会纸上谈兵,编码能力不够也不会有公司愿意去培养。实战就建议大家自己去网上找一些项目的灵感,然后动手去做一下。刚开始可能会觉得自己技术不够,也没有一个全局的概念,这些都是正常的过程,可以跟一些课程或者书籍,或者是网上的一些资源,学习一下,免费或收费的都可以。收费的好处就是它有一个完整的体系,让你从全局上有一条路径顺着走下去,就能完成一个目标。而免费资源需要你有充裕的时间,因为在遇到问题的时候,需要你一点一点去研究。不过在完成之后,回顾一下你的项目开发过程,也会在脑子里形成体系,再把之前看过的所有资料整理一下,也就学会了,只是时间上会比较长。
  • 有些公司的实战经验要求的比较丰富,比如兼容性调整和性能优化。这种经验就需要你在开发项目中,刻意去创造问题的场景,然后解决它。比如说兼容性调整,你就得在项目中体验一下不同浏览器对于JS和CSS 特性的支持程度,然后按需调整。而性能优化则就需要从网络请求、图片加载、动画和代码执行效率下手。

这些你搞懂了之后,基本上百分之七八十的公司都可以面过去。

软技能

上面说的是必备的硬性技术技能,还有一些必要的软技能,用以展示个人性格和工作能力。最重要的一项软技能是沟通能力。

沟通能力

沟通能力,对于面试或是汇报工作都是必须的。它跟你的自信程度是完全挂钩的,你只有自信之后才能有更好的沟通和表达能力,如果唯唯诺诺,低三下四,那么在面试或汇报工作的时候就会支支吾吾,颠三倒四。

举个例子:好多人,包括我本人,在面试的时候都会紧张,而我又属于那种特别紧张的,有些技术可能本来是熟悉的,但面试的时候人家换一个问法、或者气氛比较紧张的话,大脑就会一片空白,想说也说不出来,特别吃亏。要解决这个问题,**就要相信自己就是什么都会,面试官也不见得比自己会的多,然后面试前事先准备好常见面试题的答案,以及过往的工作经验,可以极大的增加自信。**当准备面试题的时候,可以采用框架的形式进行组织,下边介绍两个常用框架用来回答工作经验类和原理类的问题。

STAR 框架

对于工作经验相关的问题,可以使用框架组织回答,比如亚马逊北美那边面试会提前会告诉你,用一个叫STAR的框架回答问题:

  • S 是说 situation,事件/问题发生的场景。
  • T 指的是 task,在这个场景下你要解决的问题或者要完成的任务。
  • A 是 action,行动,要解决上边那些 tasks,你需要付出哪些行动?比如说第1步先去调试代码,然后第2步再去检查一下哪个变量出问题了,描述清楚每一步行动。
  • R 是 result,结果,这些行动有了什么样的结果,是成功了还是失败了,对你来说有什么帮助或者增长了什么教训。又或者往大里了说,给公司带来了什么效益。
    这样一整套就比较有逻辑。

原理回答框架

再说原理概念类的问题的回答,也是要有一套逻辑的,就比如说解释一下某某技术的工作原理,那么你要:

  • 解释一下这个技术是干什么的(What)。
  • 它有什么好处(Why)。
  • 分析一下这个技术内部用了哪些核心算法或机制,从外到里,或者由浅入深的给它剖析出来。如果是能拆解的技术,那就把每个部分或者组件的作用简单的描述一下(How)。
  • 最后再给他总结一下这个技术的核心部分。
    例如,你要回答 react 工作原理的问题:
  • 可以先说一下 React 是做什么的它是一个构建用户界面的库。
  • 然后它使用了(从浅一点的方面) virtual dom 把组件结构放在了内存中,用于提升性能。
  • 组件刷新的时候又使用了 diff 算法,根据状态的变化去寻找并更新受影响的组件(然后继续深入 diff 算法…)。
  • 再底层一些, React 分为了 React 核心和 React-dom,核心负责维护组件结构,React-dom 负责组件渲染,而 React 核心又使用了 Fiber 架构等等等等。
  • 如果你深入阅读过它的源代码也可以再结合源码给面试官详细介绍一下,最后再总结一下 react 加载组件、渲染组件和更新组件的过程,这个就是它的工作原理。

总结

这些就是前端工程师要学到什么程度才能去找工作、以及怎么找工作的一些个人看法。你需要:

设定个人目标。
辩证看待公司的招聘要求。
掌握硬技能和软技能(沟通能力)。
使用 STAR 框架和 WWH 框架组织面试回答。
按照这些方向去准备的话,一定可以会找到满意的工作。如果找到了还请记得回来炫耀一下,如果觉得文章有帮助请点个赞吧~感谢!


作者:江咏之
链接:https://juejin.cn/post/7234028496087056445
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

我又听到有人说:主要原因是人不行

在工作中,我们经常把很多问题的原因都归结为三个字:人不行。曾经有UI同事指着我的鼻子说,你们没有把设计稿百分百还原,是因为你们人不行。昨天,我又听到一个研发经理朋友说,唉呀,项目干不好,主要是人不行。哦,我听到这里,有种似曾相识的感觉,于是我详细问了一下,你的...
继续阅读 »

在工作中,我们经常把很多问题的原因都归结为三个字:人不行。

曾经有UI同事指着我的鼻子说,你们没有把设计稿百分百还原,是因为你们人不行

昨天,我又听到一个研发经理朋友说,唉呀,项目干不好,主要是人不行

哦,我听到这里,有种似曾相识的感觉,于是我详细问了一下,你的人哪个地方不行。

朋友说,项目上线那天晚上,他们居然不主动留下来值班,下班就走了,自觉意识太差。代码写的很乱,不自测就发到生产环境,一点行业规范都没有。他们……还……反正就是,能不干就不干,能偷懒就偷懒,人不行!

这个朋友,代码写的很好,人品也很好,刚刚当上管理岗,我也没有劝他,因为我知道,劝他没用,反而会激怒他。

当一个人,代码写得好,人品好,他就会以为别人也和他一样。他的管理方式就会是:大家一定要像我这样自觉,不自觉我就生闷气了!

反而,当一个人代码写得差,自觉性不那么强,如果凑巧还有点自知之明,那么因为他很清楚自己是如何糊弄的,因此他才会考虑如何通过管理的方法去促成目标。

我的这些认知,满是血泪史。因为我就经历过了“好人”变“差人”的过程。

因为代码写得好,几乎在每一个公司,干上一段时间,领导都会让我做管理,这在IT行业,叫:码而优则仕

做管理以后,我就发现,并不是所有人都像我一样,也并不是各个部门都各司其职,所谓课程上学的项目流程,只存在于理想状态下。当然,其中原因非常复杂,并不一定就是人不行,也可能是流程制度有问题。比如我上面的朋友,他就没有安排上线必须留人,留什么人,留到几点,什么时候开始,什么标准算是上线完成,完成之后有什么小奖励,这些他都没有强调和干预。

但是,我们无法活在理想中。不能说产品经理的原型逻辑性差,UI的设计稿歪七扭八,我们就建议老板把公司解散吧,你这个公司不适合做软件产品,那样我们就失业了。

你只能是就目前遇到的问题,结合目前手头的仅有的仨瓜俩枣,想办法去解决。可能有些方案不符合常规的思路,但都是解决实际问题特意设置的。

比如我在项目实践中,经常遇到的一点:

产品经理没有把原型梳理明白,就拿出来给开发人员看,导致浪费大家的时间,同时也打击大家的积极性:这样就开始了,这项目能好的了吗?我们也做不完就交给测试!

这种情况,一般我都会提前和产品经理沟通,我先预审,我这关过了,再交给开发看,起码保证不会离大谱。这里面有一个点,产品没有干好自己的活,人不行?他也只有3天时间设计原型。

还有一个问题也经常出现:

即便是产品原型还算可以,评审也过了。让开发人员看原型,他们没有看的。一直到开发了,自己的模块发现了问题,然后开始吐槽产品经理设计的太烂,流程走不通。

这是开发人不行?他们不仔细看,光想着糊弄。其实是他们没有看的重点,你让我看啥,我就是一个小前端,让我看整个平台吗?让我看整个技术架构?Java该用什么技术栈?看前端,你告诉我前端我做哪一模块的功能?此时,我一般都是先分配任务,然后再进行原型评审。如果先把任务分下去,他知道要做这一块,因为涉及自己的利益,会考虑自己好不好实现,就会认真审视原型,多发现问题。这样会避免做的过程中,再返过头来,说产品经理没设计好。已经进入开发了,再回头说产品问题,其实是开发人员不负责,更确切说是开发领导的责任。

一旦听到“人不行”的时候,我就会想到一位老领导。

他在我心中的是神一般的存在,在我看来,他有着化腐朽为神奇的力量。

有一次,我们给市场人员做了一个开通业务的APP:上面是表单输入,下面是俩按钮,左边是立即开通,右边是暂时保存。后来,市场同事经常找我们:能不能把我已开通的业务,改为暂时保存,我点错了。这点小事还闹到公司大会上讨论,众人把原因归为市场推广的同事人不行:没有上过学?不认识字?开不开通自己分不清吗?

此事持续了很久,闹得不愉快。甚至市场部和研发部出现了对立的局面,市场部说研发部不支持销售,研发部说市场部销售不利乱甩锅。

我老领导知道后,他就去了解,不可能啊,成年人了,按钮老按错,肯定有问题。原来,客户即便是有合作意向,也很少有立即开通的,他们都会调查一下这个公司的背景,然后再联系市场人员开通。两个按钮虽然是左右平分,但是距离很近。于是,他把软件改了,立即开通按钮挪到上边,填完信息后,顺势点击暂时保存,想开通得滑到上面才能点击。此后,出错的人就少了。

后来,行政部又有人抱怨员工人不行。发给员工的表格填的乱七八糟,根本不认真。有一项叫:请确认是否没有错误_____。明明没有错误,但是很多人都填了“否”。尽管反复强调,一天说三遍,依然有人填错,没有基本的职场素质。

老领导,他又去了解。他把表格改了,“是否没有错误”改为“全对”,空格改为打钩。后来,填错的现象明显少了。

很多事情,我们都想以说教来控制形势。比如反复强调,多次要求,我嗓子都喊哑了。因为不管是区分按钮,还是填写表格,你不是个傻子,你的能力是可以做到的,不应该出错,出了错你就是人不行。而老领导总是以人性来控制,知道你是懒散的,肯定不愿意认真付出,因此设置一个流水线,让你随着预设的轨迹被迫走一圈。下线后,居然发现自己合格了,甚至自己都变成人才了。用他的话说就是:流程弥补能力不足。

当归因为人不行时,其实分两种情况:别人不行自己不行


作者:TF男孩
链接:https://juejin.cn/post/7146055238741393415
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

设计模式漫谈

开门见山一句话,我认为设计模式的核心就是“封装变化点”,用古早软件工程的话语体系说就是“低耦合,高内聚”,用糙一点的话说就是既不要重复代码,又要好扩展。比如:工厂模式的核心是解除了对象创建导致的具体依赖,因为在对象的传递过程中可以使用父类型,但是在对象创建时一...
继续阅读 »

开门见山一句话,我认为设计模式的核心就是“封装变化点”,用古早软件工程的话语体系说就是“低耦合,高内聚”,用糙一点的话说就是既不要重复代码,又要好扩展。

比如:

  • 工厂模式的核心是解除了对象创建导致的具体依赖,因为在对象的传递过程中可以使用父类型,但是在对象创建时一定是要依赖到特定类型的;
  • 桥接模式的核心是避免多维度造成的子类数量指数级的膨胀;
  • 单例模式就是避免创建重复对象并使其方便分享;
  • Builder模式的核心是避免初始化是构造函数参数过多;
  • 常说组合优于继承,其实是因为继承其实也是一种耦合,子类与父类的耦合。而组合可以解除这种耦合
  • ...

这些东西吧,就是理解的人不用多说,不理解的人多说也没用。我是一个极度不擅长记忆的人,尤其年龄大了,n 年前看过的设计模式,早忘的一干二净了。所以基本当别人扯到设计模式的时候,我一般都敬而远之,因为很多时候别人说一个设计模式的时候,我都不记得这个设计模式到底是干嘛用的了。这里还刚妄言设计模式,纯粹是想表述一下我对设计的理解与实践,话不多说,直接 show code。

举例

以 Android 中的列表举例,我们可以先把元素列出,看看哪些属于模版代码

  1. url
  2. 返回的数据结构
  3. 网络请求框架
  4. 列表展示的 UI
  5. 分页逻辑
  6. 下拉刷新
  7. 网络请求失败展示错误提示
  8. 列表条目点击事件处理

暂时只列这几个比较公共的逻辑,我们可以挨个分析一下这些元素哪些是“公共”的,哪些是独有的

url

以 restful api 为例,格式为 ${domain}/${version}/${targetObj}?offset=${offsetNum}&limit=${limitNum} 我们可以看到其实其中的五个参数,只有 ${targetObj} 是与本次业务相关,其他都是公共代码

  • 推荐使用 restful api
  • 客户端与服务器端在定 api 时一定要慎之又慎,可以简单理解为客户端与服务器端交互就是通过 api 的,api 设计的合理则前后端解藕。后续不论是前端重构还是后端重构就会互不影响。如果业务耦合,那前后端动代码都要互相同步,这样的后果不用多说,就是大家深陷泥潭,动身不得。

返回的数据结构

返回的数据如下:

{
"errorCode": "",
"errorMsg": "",
"results": [
{
"id": "xxxxxx1",
...
},
{
"id": "xxxxxx2",
...
}
]
}

其中 errorCode、errorMsg、results 也都是样式代码,都可以通过 json 解析一次性解决问题,只有 results 中的数据是不同的

在 kotlin 中基本都是一行代码解决问题:

data class DataAItem(val id: String, val others: String, ...)

网络请求框架

这个不多说,Android 端现在的最佳实践就是 retrofit + okhttp

列表展示的 UI

在 Android 中,可以简单理解为单条目的 UI 对应的其实就是 holder

class DataAItemHolder(context: Context, root: ViewGroup) : BaseViewHolder<DataAItem>(context, root, R.layout.layout_data_a_item) {

override fun bindData(item: DataItem) {
binding.idView.text = item.id
binding.othersView.setContent(item.others)

binding.idView.setOnClickListener {
context.startActivity(...)
}
}
}

为了篇幅,这里就不列 R.layout.layout_data_a_item 了,相信 Androider 都明白

分页逻辑、下拉刷新、网络请求失败展示错误提示

与 url 结合,只要当时约定的 api 是格式化的,那么这里的分页逻辑与下拉刷新其实也都是公共的,因为所有类似列表页面的形式都是相同的 至于错误展示,基本逻辑也都是公共的

不同点:

  • 部分页面不需要分页和下拉刷新
  • 下拉刷新根据内容不同动画效果不同
  • 网络请求失败根据内容不同展示提示不同

我们最后说这些问题的处理

列表条目点击事件处理

这个是根据内容不同事件是不同的,但是这部分的逻辑是可以些在 DataItemAHolder 中的,见上文中定义的 DataItemAHolder

理想完整形态

所以一个单独的列表页面理论上的所有代码便如下:

data class DataAItem(val id: String, val others: String, ...)

class DataAItemHolder(context: Context, root: ViewGroup) : BaseViewHolder<DataAItem>(context, root, R.layout.layout_data_a_item) { ... }

class DataAListFragment : BaseListFragment<CommonListBinding>() {

init {
setPageUrlTarget("${targetObj}");
registerHolder(DataAItemHolder::class.java)
}
}

// 如果用注解形式,则更简洁
@Endpoint("targetObj")
@Holder(DataAItemHolder::class.java)
class DataAListFragment : BaseListFragment<CommonListBinding>() {}

还有一个 layout_data_a_item.xml

所有变化点都在代码里了,以这种形式去实现一个列表,就只有 layout_data_a_item.xml 会稍微费点时间,总共加起来也不会超过 1 小时,而且逻辑清晰、代码简洁、便于维护。

不需要 adapter,不需要 LayoutManager,不需要 ItemDecoration,甚至,这个 DataAListFragment.kt 都是模版代码,既然是模版代码,那就可以动态生成。 哪怕上述代码只能够替代 50% 的真实列表需求,其实都是极大的劳动力的解放。

至于为什么是理想完整形态,是因为我也没有完全实现上述逻辑,主要是以往写 sdk 居多,少写 UI,以上逻辑都是在我大概五六年前写过的一个框架的基础上优化而来。

问题

上边看着舒服,但是其实问题还是很多的。如果所有逻辑都往 base 或者 common 中塞,不用我多说,大家也知道是垃圾设计
我们做到了不要重复代码,那好扩展怎么办呢?
像上边 分页逻辑、下拉刷新、网络请求失败展示错误提示 中所述的不同点,还有其他的:

  • 部分页面不需要分页和下拉刷新
  • 下拉刷新根据内容不同动画效果不同
  • 网络请求失败根据内容不同展示提示不同
  • 自定义 LayoutManager
  • 自定义 ItemDecoration
  • 自定义 adapter
  • DataAItemHolder 如何创建,即 registerHolder 到底如何实现(在一个模版代码中创建具体类)
  • 支持数据缓存
  • ...

我们拿其中的几个举例:

分页开关

在 BaseBindingFragment 中:

fun enablePaging(): Boolean {
return true
}

这就是简单的模版模式。如果 DataAListFragment 是动态生成的,那可以使用 Builder 模式。

Holder 如何创建

这里其实出现了反向依赖。正常来讲,如果要创建具体的 DataAItemHolder,那么模版代码一定要依赖 DataAItemHolder,不然没法调用构造函数。 这里解决方案是固定构造函数:

  class DataAItemHolder(context: Context, root: ViewGroup) : BaseViewHolder<DataAItem>(context, root, R.layout.layout_data_a_item) {}

即所有 holder 的构造函数都是固定的 context: Context, root: ViewGroup,那可以在 Adapter 中

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CommonViewHolder<T> {
holderTypeMap[viewType]?.let {
val holder = it.getConstructor(Context::class.java, ViewGroup::class.java).newInstance(parent.context, parent)
holder.setOnClickListener(viewHolderClickListener)
return holder
}
throw IllegalArgumentException("The type :$viewType create exception")
}

通过这种形式创建,这里的 holderTypeMap 可以理解成 DataAItem 的缓存,即去看一下是否已经注册过该 Holder 了,因为 DataAItem 与 DataAItemHolder 是 1v1 绑定的关系。

当然还有其他解决方案,不过我个人目前感觉这应该算是比较好的。

其他

其他问题怎么解决大家可以自己想办法,这里不做赘述。

大总结

以上使用了哪些设计模式?我也不知道。其实只要知道了 理想完整形态,那剩下的就是想办法去解决具体细节问题了,这些细节工作量占 80%,但是从设计角度讲大概只占 20%。不管怎么搞,只要能完成既不要重复代码,又要好扩展的目标,其实就不用管啥设计模式了。重意不重形。

番外篇

我这些年大多是做 sdk 开发,呆过的公司不少,亲眼见证了不少公司从 native -> h5 -> RN -> native -> flutter(or kmm) 的技术路线修改,五味杂陈。变得只是技术路线,写代码的依然还是3年+ 初级工程师
再一个例子,前公司为了增效专门聘请了一个敏捷教练,这其实与换技术路线如出一辙。这就像是拿着设计模式往里套,套不进去再换一个。

大部分人不是尽力去解决问题,而是把时光和精力花在绕过问题上。换技术路线并不能解决产品逻辑问题,也不能解决3年+ 初级工程师的问题。这两个问题才是核心。 产品逻辑问题由人去解决,3年+ 初级工程师的问题也是人的问题。而人的问题要从解决,而不应该从外部下手。所谓的无非也是两个,一是能力,二是责任心

责任心问题

正常开发中,一定是前后端协同、rd pm 协同、产研与运营销售等部门协同,我一直认为好的业务(产品的理想完整形态)一定可以引导出代码上的合理架构。如果代码架构乱七八糟,原因无非两个,一是产品逻辑问题,二是程序员能力问题。这种通过代码设计过程中体现出的问题,绝大多数都可以追溯到产品逻辑上。这是产品优化的及其重要的一条渠道,但是遗憾的大多数时候,这条渠道名存实亡。原因无非也是两个,一是程序员的责任心问题、二是 pm 的责任心问题,大多数人本着能少一事就少一事的原则混饭吃,放任不合理的产品设计,自己也写不负责任的代码。当然万方有罪,罪在朕躬

我是亲眼见过运维的同学在月度总结会上把影响公司营收10%以上的事故当成笑话讲,我也亲眼见过只做营销活动而一点不关心产品的事业部总监。其实我想说,程式化对应员工的公司,一定也会收获程式化应对的员工,这就是你糊弄我,我糊弄你,最终双输的局面,这其实是我离职这么多家公司的最核心原因。

能力问题

程序员更应该增加的对产品和业务的感知能力,产品、迭代流程、管理,其实都是可重构的,核心从来都不是设计模式,而是找到理想完整形态并落实。只有锻炼审美能力,才能知道代码的丑、产品的丑以及管理的丑。

关于二者的解决方案其实很简单,就是人为本。公司中其实是员工占主体,但管理层是大脑。管理层建立正向循环机制,逐步剔除混日子员工。你要是还问我怎么建立正向循环机制,那你是没理解人为本

闲庭随笔,大话漫谈,鄙俚浅陋,诸君勿怪。


作者:印第安疯马
链接:https://juejin.cn/post/7257316809389310008
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

Java与Go到底差别在哪,谁要被时代抛弃?

在当今软件开发行业中,Java和Go是两个备受瞩目的编程语言。Java作为一门成熟的编程语言,已经被广泛应用于企业级应用开发、云计算、大数据处理等领域。而Go则是近年来崭露头角的新兴编程语言,以其高效、简洁的特性受到了越来越多开发者的青睐。那么,这两种编程语言...
继续阅读 »

在当今软件开发行业中,Java和Go是两个备受瞩目的编程语言。Java作为一门成熟的编程语言,已经被广泛应用于企业级应用开发、云计算、大数据处理等领域。而Go则是近年来崭露头角的新兴编程语言,以其高效、简洁的特性受到了越来越多开发者的青睐。那么,这两种编程语言到底有哪些不同之处呢?它们各自的优势和劣势是什么?又有哪些因素可能导致它们被时代抛弃呢?本文将从多个方面对Java和Go进行比较,为读者提供参考。


一、语法特性


Java是一门面向对象的编程语言,采用强类型、静态类型的语言特性。它的语法结构相对复杂,需要开发者花费较多的时间和精力去学习和掌握。而Go则是一门以并发编程为主要特点的编程语言,采用强类型、静态类型的语言特性。相较于Java,Go的语法更加简洁明了,容易上手。


二、并发编程


在当今互联网时代,应用程序的并发能力越来越受到重视。Java作为一门历史悠久的编程语言,在并发编程方面有着丰富的经验和成熟的技术栈。Java提供了多线程、线程池、锁等机制,可以很好地支持并发编程。而Go则是一门专门为并发编程而设计的编程语言,其内置了goroutine、channel等机制,可以轻松实现高效的并发编程。相比之下,Go在并发编程方面更加优秀。


三、性能表现


性能是衡量一门编程语言优劣的重要指标之一。Java作为一门成熟的编程语言,在性能方面表现出色。Java虚拟机(JVM)具有良好的优化机制,可以实现高效的垃圾回收和内存管理。而Go则是一门以高性能为目标而设计的编程语言,其在内存管理和垃圾回收方面也做出了很多优化。相比之下,Go在性能方面略胜一筹。


四、生态支持


生态支持是衡量一门编程语言是否成熟和受欢迎的重要指标之一。Java作为一门历史悠久的编程语言,在生态支持方面非常强大。Java拥有丰富的类库和框架,可以轻松实现各种功能需求。而Go则是一门相对年轻的编程语言,在生态支持方面还不如Java成熟。但随着Go的不断发展和壮大,相信它的生态支持也会越来越强大。


五、社区活跃度


社区活跃度也是衡量一门编程语言是否具有前途和生命力的重要指标之一。Java作为一门历史悠久的编程语言,在全球范围内有着庞大的开发者社区和广泛的应用场景。而Go则是一门新兴编程语言,在全球范围内的社区规模还不如Java成熟。但随着Go的不断壮大和应用场景的扩大,相信它的社区活跃度也会逐渐提升。


六、未来发展趋势


未来发展趋势也是考虑一门编程语言是否具有前途和生命力的重要因素之一。Java作为一门历史悠久的编程语言,在未来仍然会继续保持其广泛应用和强大生态支持的优势。而Go则是一门新兴编程语言,在未来也有着广阔的发展前景。随着互联网时代的不断深入和技术创新的不断涌现,相信Go在未来会越来越受到开发者们的青睐。


综上所述,Java和Go都是优秀的编程语言,各自具有其独特的优势和劣势。在选择使用哪种编程语言时,需要根据具体需求和场景来进行权衡和选择。无论是Java还是Go,只要我们能够深入学习和掌握它们,并将其运用到实际开发中,都能够取

作者:韩淼燃
来源:juejin.cn/post/7257410685118595128
得良好的效果和成果。

收起阅读 »

来字节的第一年,我都做了些啥?有后悔过吗?

选择字节是一股脑的冲动。 和大多数热血沸腾的应届生一样,在众多offer中被字节高薪资、大平台和各种优厚福利所吸引,加上迫切摆脱学校桎梏到社会闯一闯的豪迈心态作祟。吭哧吭哧就背着行李箱赴京开始漫长的北漂生活。 各种不舒适 初到字节举手投足都是仓皇无措的。 时...
继续阅读 »

选择字节是一股脑的冲动。


和大多数热血沸腾的应届生一样,在众多offer中被字节高薪资、大平台和各种优厚福利所吸引,加上迫切摆脱学校桎梏到社会闯一闯的豪迈心态作祟。吭哧吭哧就背着行李箱赴京开始漫长的北漂生活。


在这里插入图片描述


各种不舒适


初到字节举手投足都是仓皇无措的。


时不时的拉群沟通让社交恐惧的我几近崩溃,短短两周后的技术分享让零基础的我一脸懵逼。启程的第一步还没有迈出去,就被大公司高速运转的节奏吓得连连败退。


字节跳动带给我的第一感受就是:各种不舒适。但我也清楚,这些所谓的不舒适,也只是长期处于安逸学生期留下的诟病,与其选择每天上班如同上刑场般痛不欲生,不妨换个心态,


把工作作为最好的练习场所


边学边干,在工作中抓住一切可以练习的机会, 哪怕是只是会议上的每一次主动发言,所解决的每一个小bug,都去用心做好,并仔细复盘。


我开始在拉群沟通前把每一次讨论的context理清,并把自己的疑问与希望了解到的点一一列出,并拟写草稿,会议后会去听自己发言录像,听听看自己的表达是否足够清晰,并整理出精简的语言框架,形成一套属于自己的高效沟通方式;我开始在日常工作结束后熬到深夜阅读工程源码,整理学习脑图,沉淀技术文档,保持技术高强度输入……


在这里插入图片描述

(左图是整理的学习笔记,右图是技术分享时写的文档,写了整整1w+字,比写论文还刻苦)


两周后,我圆满完成了组内技术分享,有条有理地回答了同事们提出的问题。当我走出会议室后,一股暖流充满了整个胸腔,眼眶也略带酸涩。


那一刻我是多么自豪。


开始去思考自己的角色…


经历初次考验,我开始被安排做组内一些项目。刚开始做的都是边边角角的事情,基本哪里有砖哪里搬。至于搬这块砖的意义是什么,为什么要去做这件事,我却从来没有想过。


“只见冰川一角,不见冰川全貌”成为我入职初期一段时间以来保持的状态。不过这种状态没有持续太久,我mentor就跟我说,


“要多去思考事情背后的本质是什么,并且要去主动成为一件事的Owner。”


Owner,这是我第一次听说这个词,就像一个衡量的标尺,硬生生地扎在心底。于是,我开始思考,怎么样才算得上一个Owner?老实说,做一个默默搬砖的码农未尝不可,按部就班完成任务,亦步亦趋跟着团队节奏前进。然而比起这样的角色,我更倾向于去推动,甚至去发起一件事。多一份全身心的投入与责任感。


在做完事情的时候,再多想一些,做完就可以了吗?我还能做些什么来给团队带来一些帮助呢?


这些问题刚开始可能很难得出答案,但是我可以去模仿和请教,因为在字节最不缺的就是人才。这种思考事情的方式也给了我一些启发,当你不知道自己应该做到什么程度或者不知道自己还有哪些提升空间的时候,就去看那些比你更厉害的人,观察别人怎么做事,倾听别人的观点,多给自己一些外部视角的比较与启发,就能够弥补自己思维上的不足并慢慢拥有自己的一套方法论。


成为一名Owner


重新定位自己角色后,我开始主动去留意团队内的声音。因为我所在的部门是视频通话业务,常常注意到研发同学在查bug时会去抱怨在一次通话结束后,通话过程中所有信息就丢失了,对于一些偶现的问题,很难去复现错误的现场。于是我开始思考,我是不是能够去开发一个小助手,能够做到将通话中产生的即时信息沉淀下来,就像打印出一张快照,使研发通过这张快照能够清晰还原现场所有数据和信息。


说干就干,结果真的捣鼓出了一个通话小助手,并主动组织了一个技术分享会介绍它的使用方式和技术方案。


分享会结束后,mentor对小助手的思想和前景颇为赞许,给我提了很多宝贵建议和持续迭代的方向;并且夸我这件事做的不错,鼓励我去cover更多的事情。


“你现在就是小助手的Owner啦” ,mentor笑着拍了拍我的肩膀。


相隔于第一次听说这个词,我现在已经慢慢理解了Owner这个词背后所包含的分量。我也开始知道,一件事情能做成什么样,并不是一个固定值,别人对你的预期也并不是一开始就设定好的,你的身份决定了预期的下限,但天花板是你自己去争取。因为工作/职场并不是做客观题,总会有标准答案,而更像是在去创作,可能性是由你去探索的,你愿意花更多的心思去雕刻去打磨,那你的作品会越来越出色;如果你甘愿写平淡乏味的文字,那这个作品也仅仅只能达到完成的程度而已。


最后回答一下,有后悔过这个决定吗?


没有。相反,来字节可能是我目前二十多年来做出过最正确的选择之一。


字节实在是一个可以快速成长的绝佳平台,扁平化管理和数不清的机会让作为实习生的我实现了“做一番大事”的梦想,身边无数优秀的同事让刚步入职场的我不断向前不断拔高。我发自内心热爱并全身心投入自己想要做的事,并在一件件事中塑造自己。


这篇文章,其实只是我入职一年来的思考和探索。我并不是什么职场达人,技术高管,能够给年少有为的大家指明正道之光;只能将刚刚步入职场从懵懂到适应到热爱的自己真实地展示给大家,文章里可能还有一些不成熟的观点,也请大家包涵与指正。


当然,如果这篇文章能够给刚入职或即将入职的你带来一些共鸣或帮助,那更是再好不过了。




最后,我想在文末和各位刚刚入职的小白们说一句,


可能初入社会会让你们感受到茫然与无助,因为小学到高校的教育是系统性地输入一些知识给我们,会有老师带着我们去吃透课本,吸收知识,即使你不想学习,也会有考试的压力倒逼你去学习。但离开校园这边土壤,并没有人规定了一个人的成长路径是如何,没有人给你方向,也没有人规定你成长的方向。读书、沟通、工作等等,都是你成长的机会;当然,你什么都不做也没关系。


因为成长并不是别人给予自己的任务,而是自发性的行为。


我们在每一天的得失中不断塑造自己,可能是最初理想中光鲜亮丽的自己,也可能是被现实打磨摧残不堪的自己。


时间和未来会告诉你,你现在的拼搏和努力值不值得。


感谢字节跳动,感谢在这里遇到的所有人,也感谢屏幕后的你认真看完这篇文章,希望我们能在下一个高处相遇。加油。


在这里插入图片描述

收起阅读 »

一个小公司的技术开发心酸事

背景 长话短说,就是在2022年6月的时候加入了一家很小创业公司。老板不太懂技术,也不太懂管理,靠着一腔热血加上对实体运输行业的了解,加上盲目的自信,贸然开始创业,后期经营困难,最终散伙。 自己当时也是不察,贸然加入,后边公司经营困难,连最后几个月的工资都没给...
继续阅读 »

背景


长话短说,就是在2022年6月的时候加入了一家很小创业公司。老板不太懂技术,也不太懂管理,靠着一腔热血加上对实体运输行业的了解,加上盲目的自信,贸然开始创业,后期经营困难,最终散伙。


自己当时也是不察,贸然加入,后边公司经营困难,连最后几个月的工资都没给发。


当时老板的要求就是尽力降低人力成本,尽快的开发出来App(Android+IOS),老板需要尽快的运营起来。


初期的技术选型


当时就自己加上一个刚毕业的纯前端开发以及一个前面招聘的ui,连个人事、测试都没有。


结合公司的需求与自己的技术经验(主要是前端和nodejs的经验),选择使用如下的方案:



  1. 使用uni-app进行App的开发,兼容多端,也可以为以后开发小程序什么的做方案预留,主要考虑到的点是比较快,先要解决有和无的问题;

  2. 使用egg.js + MySQL来开发后端,开发速度会快一点,行业比较小众,不太可能会遇到一些较大的性能问题,暂时看也是够用了的,后期过渡到midway.js也方便;

  3. 使用antd-vue开发运营后台,主要考虑到与uni-app技术栈的统一,节省转换成本;


也就是初期选择使用egg.js + MySQL + uni-app + antd-vue,来开发两个App和一个运营后台,快速解决0到1的问题。


关于App开发技术方案的选择


App的开发方案有很多,比如纯原生、flutter、uniapp、react-native/taro等,这里就当是的情况做一下选择。



  1. IOS与Android纯原生开发方案,需要新招人,两端同时开发,两端分别测试,这个资金及时间成本老板是不能接受的;

  2. flutter,这个要么自己从头开始学习,要么招人,相对于纯原生的方案好一点,但是也不是最好的选择;

  3. react-native/taro与uni-app是比较类似的选择,不过考虑到熟练程度、难易程度以及开发效率,最终还是选择了uni-app。


为什么选择egg.js做后端


很多时候方案的选择并不能只从技术方面考虑,当是只能选择成本最低的,当时的情况是egg.js完全能满足。



  1. 使用一些成熟的后端开发方案,如Java、、php、go之类的应该是比较好的技术方案,但对于老板来说不是好的经济方案;

  2. egg.js开发比较简单、快捷,个人也比较熟悉,对于新成员的学习成本也很低,对于JS有一定水平的也能很快掌握egg.js后端的开发


中间的各种折腾


前期开发还算顺利,在规定的时间内,完成了开发、测试、上线。但是,老板并没有如前面说的,很快运营,很快就盈利,运营的开展非常缓慢。中间还经历了各种折腾的事情。



  1. 老板运营遇到困难,就到处找一些专家(基本跟我们这事情没半毛钱关系的专家),不断的提一些业务和ui上的意见,不断的修改;

  2. 期间新来的产品还要全部推翻原有设计,重新开发;

  3. 还有个兼职的领导非要说要招聘原生开发和Java开发重新进行开发,问为什么,也说不出什么所以然,也是道听途说。


反正就是不断提出要修改产品、设计、和代码。中间经过不断的讨论,摆出自己的意见,好在最终技术方案没修改,前期的工作成果还在。后边加了一些新的需求:系统升级1.1、ui升级2.0、开发小程序版本、开发新的配套系统(小程序版本)以及开发相关的后台、添加即时通信服务、以及各种小的功能开发与升级;


中间老板要加快进度了就让招人,然后又无缘无故的要开人,就让人很无奈。最大的运营问题,始终没什么进展,明显的问题并不在产品这块,但是在这里不断的折腾这群开发,也真是难受。


明明你已经很努力的协调各种事情、站在公司的角度考虑、努力写代码,却仍然无济于事。


后期技术方案的调整



  1. 后期调整了App的打包方案;

  2. 在新的配套系统中,使用midway.js来开发新的业务,这都是基于前面的egg.js的团队掌握程度,为了后续的开发规范,做此升级;

  3. 内网管理公用npm包,开发业务组件库;

  4. 规范代码、规范开发流程;


人员招聘,团队的管理


人员招聘


如下是对于当时的人员招聘的一些感受:



  1. 小公司的人员招聘是相对比较难的,特别是还给不了多少钱的;

  2. 好在我们选择的技术方案,只要对于JS掌握的比较好就可以了,前后端都要开发一点,也方便人员工作调整,避免开发资源的浪费。


团队管理


对于小团队的管理的一些个人理解:



  1. 小公司刚起步,就应该实事求是,以业务为导向;

  2. 小公司最好采取全栈的开发方式,避免任务的不协调,造成开发资源的浪费;

  3. 设置推荐的代码规范,参照大家日常的代码习惯来制定,目标就是让大家的代码相对规范;

  4. 要求按照规范的流程设计与开发、避免一些流程的问题造成管理的混乱和公司的损失;

    1. 如按照常规的业务开发流程,产品评估 => 任务分配 => 技术评估 => 开发 => 测试 => cr => 上线 => 线上问题跟踪处理;



  5. 行之有效可量化的考核规范,如开发任务的截止日期完成、核心流程开发文档的书写、是否有线上bug、严谨手动修改数据库等;

  6. 鼓励分享,相互学习,一段工作经历总要有所提升,有所收获才是有意义的;

  7. 及时沟通反馈、团队成员的个人想法、掌握开发进度、工作难点等;


最后总结及选择创业公司避坑建议!important



  1. 选择创业公司,一定要确认老板是一个靠谱的人,别是一个总是画饼的油腻老司机,或者一个优柔寡断,没有主见的人,这样的情况下,大概率事情是干不成的;

    1. 老板靠谱,即使当前的项目搞不成,也可能未来在别的地方做出一番事情;



  2. 初了上边这个,最核心的就是,怎么样赚钱,现在这种融资环境,如果自己不能赚钱,大概率是活不下去的@自己;

  3. 抓住核心矛盾,解决主要问题,业务永远是最重要的。至于说选择的开发技术、代码规范等等这些都可以往后放;

  4. 对上要及时反馈自己的工作进度,保持好沟通,老板总是站在更高一层考虑问题,肯定会有一些不一样的想法,别总自以为什么什么的;

  5. 每段经历最好都能有所收获,人生的每一步都有意义。


以上只是个人见解,请指教

作者:qiuwww
来源:juejin.cn/post/7257085326471512119

收起阅读 »

在创业公司做前端一年,这些经验到底值不值?

之前公司调整洗牌,裁掉了一大波人,像我这样做了快一年的,也竟是研发老员工了...最近领导安排我开始面试,拿到第一份简历是一位10年经验的前端大佬,看完简历后突然蒙圈,我该问什么问题,用过什么框架? 项目遇到过什么问题?困难是怎么解决的?webpack做过哪些性...
继续阅读 »

之前公司调整洗牌,裁掉了一大波人,像我这样做了快一年的,也竟是研发老员工了...最近领导安排我开始面试,拿到第一份简历是一位10年经验的前端大佬,看完简历后突然蒙圈,我该问什么问题,用过什么框架? 项目遇到过什么问题?困难是怎么解决的?webpack做过哪些性能优化?



诶,想到这,突然觉得哪天我也去投递简历了,很有可能会同样被问到这些问题,看看自己在现在公司干了快一年了,似乎也没有做过太多总结,瞬间感觉不寒而栗。



既然这些都迟早是要总结的,今天那就来回顾一下, 创业公司工作一年, 到底收获了什么?同时也希望我的经历能给大家带来一丝启发。


后台管理web阶段


坐标一线城市北京,前面刚来两三个月一直在做公司后台系统,使用技术栈主要是vue2+elementUI,因为刚来,很多业务逻辑要熟悉,没有时间去做优化,而且入职第三天就开始写代码了。


Tailwind


为了提高写代码的效率,正好当时看到tailwind,觉得很新奇,就给引入到项目里来了。可以用类名来直接书写css样式:



tailwind可以节省很多编写类名的脑力, 同时开发的时候不再需要在style和template来回切换,直接在类名里写属性,用起来是真香!而且据官网介绍,全部使用tailwind编码之后,css的文件最后打包编译出来,基本都小于10KB?!因为引入了elementUI组件库,也没法验证,但节省心智是实实在在的。



Drone CI


CI工具,配置之后本地npm run build后会自动提交到drone,它会帮忙完成测试,代码缓存,cdn刷新等操作,并且可以设置在自动化部署完成后,出现飞书提醒,整体界面看上去也比较舒服



Sentry


线上日志监控,用户在使用过程中产生了报错,sentry会实时发送提醒,咱们就可以通过日志回放可以分析出错原因,相当于飞机的黑盒子, 甚至可以回放用户的操作过程,挺强大的。


官网服务端渲染


第三个月的时候我们部门接下了公司官网的活,但开发周期只有半个月,而且当时都没经验,领导为了保险起见,就直接让把vue2的后台项目让我们拷了一份,所以官网做的没有什么新花样。其实现在想想,更好的办法应该是使用nuxt.js服务端渲染首屏加载快,还方便做SEO,奈何实在太菜~


开放图谱协议


开放图谱协议,全称叫Open Graph Protocol,可以让分享的链接在社交媒体上以图文的形式展示出来,比如没有填写就是下面这个样子:



填过之后就是这样子:



填写过开放图谱协议的话,将网站分享在社交媒体上,链接的内容更生动,算是一个小优化点。


Vue3


做完官网之后,公司又有一个后台系统,这次需要从0到1搭建,我果断申请了使用Vue3。只要效果能实现,老板不会在意用什么方法,那咱就去尝试尝试新东西,毕竟也是提升公司的技术储备~



这个项目说是从0到1,但实际开发为了追求效率,避免踩坑,还是让调研了市面上主流的前端集成框架,这次使用的是一个基于Vue3-element-admin的框架。


本来想使用ts进行开发,但考虑到我们团队成员ts都很弱,最后还是放弃了避免踩坑,主要技术栈是Vue3 + Vite2 + Vue Router + Pinia + Element Plus,还有Volar插件代替了原来Vue2的Vetur。


说下vue3的使用感受吧~



  1. vite启动速度极快,启动项目只需要3秒,vue2的项目怎么也得十几秒吧,热更新也极快,开发体验好

  2. 另外一个是vue3的setup语法糖,可以少写很多没有用的重复代码,比如让组件自动注册,属性及方法无需return等等,好用!节省心智!

  3. Volar插件配合vscode保存代码卡顿,不知道是配置问题还是做的优化不太好,没有之前vetur舒服,查阅资料发现很多人都有这问题,可能是保存代码时和eslint有冲突。


H5阶段


做完Vue3的项目后,也差不多小半年过年了,回来之后公司做了人员调整,我被调到公司自研App部门,开始做H5。相对来说我们公司H5的内容就很核心了,而且因为toC,产品对于细节的要求更高,甚至有一个排期就是专门给技术去做优化的。



webpack打包、热更新优化


刚接手H5的项目就遇到一个头疼的问题,项目文件很大,每次编写代码保存,热更新时间能有8、90秒,热更新之后如果在手机上运行,H5还需要进行打包发版,也就是将打包的文件更新至cdn,打包发版更夸张,打包有时候能花费十几分钟,再加上上传cdn,更新一段代码要等小20分钟!



毋庸置疑,接手第一件事就是一通抄作业...不,是做webpack的优化。



  1. cache-loader, 在rules中给加载速度久的文件,如js文件加上cache-loader之后,可以让打包速度有所提升,缩减到5分钟,但还是不够快,而且这个loader本身开启也需要花费时间。

  2. 持久化缓存,继续寻找 webpack打包缓存的问题,再一通抄作业后,发现加入持久化缓存的配置,能达到比较好的效果,打包明显加快! 如果不更改webpack配置,第二次打包只有10秒, 是10min变从10秒,就是这么强大!而且热更新也会加快!配置贴出来,webpack中cache的type类型换成filesystem,并指定路径即可。



  3. 发版上传优化,也就是发布文件到cdn,这块做了两个优化,一是静态文件抽离,资源较大且更改频率低的文件,如assets下的图片,动画等,单纯拆出来写脚本上传,那么每次打包上传只需要更新变化较多的js和css文件,二是开发环境更换国内云服务器存储桶(这个因“司”而异,因为我们公司业务是海外),也可以加速上传。

  4. externals,将需要引用的比较大的第三方库抽离,不要直接打进包里,加快首屏加载速度,等到需要的时候再去请求。


算法状态机


这是使用动画时需要用到的一种解决方案,后端返回的动画数据,前端会用它处理成多个帧,每一帧包含了一段动画、语音和字幕,将这些帧按照顺序播放,就变成了一个动画。是从算法迁移过来的项目,逻辑会比较复杂,从名字也能看得出来。


Fetch流式输出


使用fetch请求返回二进制流的形式,通过TextDecoder解码,逐渐push到展示的数组中,实现逐步渲染文本内容,类似gpt实时渲染。


stripe第三方支付平台


stripe是方便海外用户的第三方支付平台,类似于国内的收钱吧这种?功能很强大,可以看看我的另一篇文章,使用Stripe做类似于gpt的支付跳转(checkout方式)。后面还会出一篇,自定义搭建stripe的完整流程(elements方式)。


微前端框架--qiankun


有一个需求是,公司里的项目框架各不相同,有的是vue2,vue3,react,还有jquery,如果要在一个项目里把这些项目的功能都实现,重写一遍代码显然效率太低,这个时候就需要一个解决方案,也就是微前端,能融合不同框架项目,通过路由的切换显示,这里我们采用了qiankun,并且恰好我负责qiankun的基座搭建。这是qiankun官网。我参阅了这两篇文章,qiankun搭建, qiankun保姆级攻略,以及一个很棒github的qiankun例子,github.com/fengxianqi/


总结


到这就是我这一年的工作中遇到所有技术经验啦!不知相比大厂的经历算是怎样,了解的小伙伴可以评论下,分享出来也是期望我的经历能给大家带来一些启发,同时能知道自己的局限,欢迎多多指导和交流~


后面会根据情况继续完善,逐渐更新技术帖,还会分享在工作中心态上的成长变化,毕竟有人的地方就有江湖~

作者:大白萝卜
来源:juejin.cn/post/7257076605570646076
码字不易,望多点赞!

收起阅读 »

一个小公司的技术开发心酸事

背景长话短说,就是在2022年6月的时候加入了一家很小创业公司。老板不太懂技术,也不太懂管理,靠着一腔热血加上对实体运输行业的了解,加上盲目的自信,贸然开始创业,后期经营困难,最终散伙。自己当时也是不察,贸然加入,后边公司经营困难,连最后几个月的工资都没给发。...
继续阅读 »

背景

长话短说,就是在2022年6月的时候加入了一家很小创业公司。老板不太懂技术,也不太懂管理,靠着一腔热血加上对实体运输行业的了解,加上盲目的自信,贸然开始创业,后期经营困难,最终散伙。

自己当时也是不察,贸然加入,后边公司经营困难,连最后几个月的工资都没给发。

当时老板的要求就是尽力降低人力成本,尽快的开发出来App(Android+IOS),老板需要尽快的运营起来。

初期的技术选型

当时就自己加上一个刚毕业的纯前端开发以及一个前面招聘的ui,连个人事、测试都没有。

结合公司的需求与自己的技术经验(主要是前端和nodejs的经验),选择使用如下的方案:

  1. 使用uni-app进行App的开发,兼容多端,也可以为以后开发小程序什么的做方案预留,主要考虑到的点是比较快,先要解决有和无的问题;
  2. 使用egg.js + MySQL来开发后端,开发速度会快一点,行业比较小众,不太可能会遇到一些较大的性能问题,暂时看也是够用了的,后期过渡到midway.js也方便;
  3. 使用antd-vue开发运营后台,主要考虑到与uni-app技术栈的统一,节省转换成本;

也就是初期选择使用egg.js + MySQL + uni-app + antd-vue,来开发两个App和一个运营后台,快速解决0到1的问题。

关于App开发技术方案的选择

App的开发方案有很多,比如纯原生、flutter、uniapp、react-native/taro等,这里就当是的情况做一下选择。

  1. IOS与Android纯原生开发方案,需要新招人,两端同时开发,两端分别测试,这个资金及时间成本老板是不能接受的;
  2. flutter,这个要么自己从头开始学习,要么招人,相对于纯原生的方案好一点,但是也不是最好的选择;
  3. react-native/taro与uni-app是比较类似的选择,不过考虑到熟练程度、难易程度以及开发效率,最终还是选择了uni-app。

为什么选择egg.js做后端

很多时候方案的选择并不能只从技术方面考虑,当是只能选择成本最低的,当时的情况是egg.js完全能满足。

  1. 使用一些成熟的后端开发方案,如Java、、php、go之类的应该是比较好的技术方案,但对于老板来说不是好的经济方案;
  2. egg.js开发比较简单、快捷,个人也比较熟悉,对于新成员的学习成本也很低,对于JS有一定水平的也能很快掌握egg.js后端的开发

中间的各种折腾

前期开发还算顺利,在规定的时间内,完成了开发、测试、上线。但是,老板并没有如前面说的,很快运营,很快就盈利,运营的开展非常缓慢。中间还经历了各种折腾的事情。

  1. 老板运营遇到困难,就到处找一些专家(基本跟我们这事情没半毛钱关系的专家),不断的提一些业务和ui上的意见,不断的修改;
  2. 期间新来的产品还要全部推翻原有设计,重新开发;
  3. 还有个兼职的领导非要说要招聘原生开发和Java开发重新进行开发,问为什么,也说不出什么所以然,也是道听途说。

反正就是不断提出要修改产品、设计、和代码。中间经过不断的讨论,摆出自己的意见,好在最终技术方案没修改,前期的工作成果还在。后边加了一些新的需求:系统升级1.1、ui升级2.0、开发小程序版本、开发新的配套系统(小程序版本)以及开发相关的后台、添加即时通信服务、以及各种小的功能开发与升级;

中间老板要加快进度了就让招人,然后又无缘无故的要开人,就让人很无奈。最大的运营问题,始终没什么进展,明显的问题并不在产品这块,但是在这里不断的折腾这群开发,也真是难受。

明明你已经很努力的协调各种事情、站在公司的角度考虑、努力写代码,却仍然无济于事。

后期技术方案的调整

  1. 后期调整了App的打包方案;
  2. 在新的配套系统中,使用midway.js来开发新的业务,这都是基于前面的egg.js的团队掌握程度,为了后续的开发规范,做此升级;
  3. 内网管理公用npm包,开发业务组件库;
  4. 规范代码、规范开发流程;

人员招聘,团队的管理

人员招聘

如下是对于当时的人员招聘的一些感受:

  1. 小公司的人员招聘是相对比较难的,特别是还给不了多少钱的;
  2. 好在我们选择的技术方案,只要对于JS掌握的比较好就可以了,前后端都要开发一点,也方便人员工作调整,避免开发资源的浪费。

团队管理

对于小团队的管理的一些个人理解:

  1. 小公司刚起步,就应该实事求是,以业务为导向;
  2. 小公司最好采取全栈的开发方式,避免任务的不协调,造成开发资源的浪费;
  3. 设置推荐的代码规范,参照大家日常的代码习惯来制定,目标就是让大家的代码相对规范;
  4. 要求按照规范的流程设计与开发、避免一些流程的问题造成管理的混乱和公司的损失;
    1. 如按照常规的业务开发流程,产品评估 => 任务分配 => 技术评估 => 开发 => 测试 => cr => 上线 => 线上问题跟踪处理;
  5. 行之有效可量化的考核规范,如开发任务的截止日期完成、核心流程开发文档的书写、是否有线上bug、严谨手动修改数据库等;
  6. 鼓励分享,相互学习,一段工作经历总要有所提升,有所收获才是有意义的;
  7. 及时沟通反馈、团队成员的个人想法、掌握开发进度、工作难点等;

最后总结及选择创业公司避坑建议!important

  1. 选择创业公司,一定要确认老板是一个靠谱的人,别是一个总是画饼的油腻老司机,或者一个优柔寡断,没有主见的人,这样的情况下,大概率事情是干不成的;
    1. 老板靠谱,即使当前的项目搞不成,也可能未来在别的地方做出一番事情;
  2. 初了上边这个,最核心的就是,怎么样赚钱,现在这种融资环境,如果自己不能赚钱,大概率是活不下去的@自己;
  3. 抓住核心矛盾,解决主要问题,业务永远是最重要的。至于说选择的开发技术、代码规范等等这些都可以往后放;
  4. 对上要及时反馈自己的工作进度,保持好沟通,老板总是站在更高一层考虑问题,肯定会有一些不一样的想法,别总自以为什么什么的;
  5. 每段经历最好都能有所收获,人生的每一步都有意义。

作者:qiuwww
链接:https://juejin.cn/post/7257085326471512119
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

最强实习生!什么?答辩刚结束,领导就通知她转正成功了?

写在前面 熟知我的人应该都知道我是实习转正上岸字节的。 那是一个平平淡淡的下午,leader突然神神秘秘凑到我身边:“一恩,快秋招了。我给你预留了一个HC,快准备准备转正答辩吧。” 于是乎,伴随着leader自以为充满关怀的安排下,我开始轰轰烈烈筹备起自己的转...
继续阅读 »

写在前面


熟知我的人应该都知道我是实习转正上岸字节的。


那是一个平平淡淡的下午,leader突然神神秘秘凑到我身边:“一恩,快秋招了。我给你预留了一个HC,快准备准备转正答辩吧。”

于是乎,伴随着leader自以为充满关怀的安排下,我开始轰轰烈烈筹备起自己的转正大业。


和很多小伙伴一样,我刚刚准备转正时非常茫然无措。因为转正并没有明确的大纲,且不同业务、不同部门考核的形式都是不确定的,在网上搜索经验资料也少得可怜。


别急,转正的内容和形式虽然具有不确定性,但其固有流程又决定了他存在着一定的“潜规则”。下面一恩姐姐就带你发出灵魂三问,深度剖析转正那些不得不说的套路。


灵魂三问


第一问,你了解转正流程吗?


转正流程对于各个公司大同小异。


以字节为例,需要当年毕业的同学,在出勤满40个工作日(技术和测试序列)且经过部门Leader和HR同意后,即有资格发起转正流程。此时HR会根据评估人和候选人的时间,约一个时间组织进行转正答辩。这个短短1个小时的转正答辩,决定了你的去留。

在这里插入图片描述


转正答辩上,一般包含你的HR,部门领导和跨部门的领导。除了跨部门的领导外,其他人都是你在实习过程中可能一起干过饭喝过酒,讨论过诗和远方的伙伴。只要在实习过程中没有发生过什么反目成仇的惨剧,他们都是偏向你的,甚至私下有过“兄弟情义”,“生死之交”还会去引导你去把控答辩的节奏。


比如我就听过自己的同事说过,当时他的导师还在答辩时争着抢着帮他解答领导的问题……

在这里插入图片描述


所以你所需要的做的基本只有一件事:


就是保证转正答辩的过程是顺利的。


整个答辩过程基本分为三块,其中属于你的有效时间仅有两块。第一块为个人展示,你需要以PPT的形式去描述一下实习期间工作,这一块大约有40min;第二块为问答环节,评估人会去根据你的工作与业务询问一些项目及基础知识,这一块大约有20min;第三块为审判环节,评估人会根据转正答辩过程中对你的了解决定你最终的去留。


因此,只有利用好有效的两块时间,才能Hold住整个答辩过程,让评估人被你的魅力闪瞎双眼!


第二问,实习期间的我为团队做了什么?


日常有随时记录工作进度的好习惯,因此我非常迅速地将自己实习阶段的工作按照优先级总结总结写了一下答辩PPT。导师在看了我的草稿后,一个劲儿吐槽:“比起你在这里学的东西,老板们更关心的是你给团队和业务带来的产出,你跟别人做这件事的区别在哪里?你在团队的定位是什么?拿出让他们去选择你的理由吧!


这与我一开始想的完全不一样。我本以为答辩就是汇报自己学了什么,做了什么。但其实不是,公司看中的是你的个人想法和价值实现,以及你身上是否有可输出的内容。


你的一言一行都要表达出:你是完全能胜任这个职位的。


想明白这点,我重新组织了自己的PPT和答辩的内容:


首先,我用了一页画了一个时间轴,分别用关键词总结每一part工作主要内容,核心,和工作亮点项目。这一部分重在简洁清晰。目的是让评审人清晰的了解我的工作内容重点和核心。


接下来,我选择2~3个核心项目详细地介绍工作内容并量化自己的产出。如果大家不清楚如何介绍的话,可以参考金字塔原理中 先总后分的表达方式——先给你的听众一个核心结论,在后面逐层展开。



比如我去介绍自己做多人视频通话这个需求时,首先需求的背景是需要支持多个人一起视频通话,我的主要工作是技术方案的设计与开发,具体工作是通过获取多路视频流,并将视频流分给对应的成员,因此我需要去维护所有成员的视图窗口以及流的稳定性与正确性。为了实现这个功能,我去了解了视频流编码,推拉流的逻辑,并且与多媒体业务同学进行了沟通,保证整体形成一条稳定的通路。


(截图取自我的PPT答辩文档,针对强化通话感知的需求,我列出了需求的目标,以及技术方案,并采用流程图方便说明,以及最后写上了需求的收益)



第三部分我会去对自己的价值角色进行提炼,即向评估人去证明自己的独特价值以及在团队中的定位。如果你不知道如何去证明,那就将这个问题回答好:凭什么别人要选择你而不选择别人?


最后一部分可以向评估人讲述一下自己的期望和未来的规划,我当时是舒情并茂地表达了自己对团队的热爱和对前景的向往,并表达了自己对未来的无限期盼。说的导师当场差点“热泪盈眶”。


以及提供给大家一个小妙招,作为一名研发,如果拥有产品思维,无疑是非常加分的。因此大家可以对自己所在的业务从产品本身进行思考,比如能做些什么才能让产品吸引更多用户,以及在产品上有什么意见和规划。


第三问,基础知识还记得吗?


在40分钟ShowTime之后,剩余20分钟评估人可能会针对你的某个具体项目询问一些实现上的细节,也有可能会询问一些技术方案设计上的问题。因此需要保证你所介绍的每一个项目都是你切身参与且明确其中实现的技术方案与细节,而且你应该提前去准备一些代码或技术上可扩展或优化的思考,来体现出你对项目的一种全局的视角。


同时评估人也会针对你目前所处团队的业务特性去询问一些基础问题,这一点和面试比较像,虽然难度比较于面试会简单很多。但也需要去多少刻意准备一些基础知识。比如我做视频通话业务,当时评估人就问我,你觉得通话传输的音视频流信息是通过udp还是tcp传输的,以及他们的区别。


这些问题是不是对于现在的你实在太简单了?


一个日常实习阶段小tip


不清楚大家在日常工作的过程中有没有对自己工作进行总结的习惯。如果没有,请从现在开始,立!刻!记!录!


“记录”这个行为听起来难度很高,其实真正实施起来你会发现它就像一种“陪伴”,非常潜移默化地融入你的生活中。


我会在日常工作过程中我会将自己的每一份思考和产出都落地文档并定时整理与复盘,每周五下班前会抽出15分钟将本周的工作以及下周需要做的事情整理成一个TODO列表。且会以月为纬度进行一次工作量和心态的反思,并与导师进行一次整体沟通,这种定期的总结和复盘能够让我永远对自己保持清醒。


当我整理自己实习工作时,这些文字更是我的宝藏,我能很清楚地看到自己日积月累的自我升级,并非常轻松地以时间线的角度看出自己各个阶段的产出。


写在最后


希望大家在实习期间一直保持一个谦卑学习的态度,正式阶段繁重的工作压力会让你没有过多心思去进行一些软硬实力的提高。


因此实习是一个非常好的机会去适应、去成长,一定要耐心地倾听、观察,向身边优秀的同事学习。


相信在以后的工作中,你一定也能如鱼得水,熠熠生辉。




FAQ时间


Q1:工作上犯了个常识性错误,感觉转正无望,该不该及时止损?

首先,要明白,作为实习生,犯错是一件正常的事。错误才能让你意识到不足,才能成长。转正评估的不是你的过去,而是你的价值和你可以塑造的可能性。如果你能对自己过去的工作上的错误进行复盘与总结,并且能够对未来进行合理的规划。相信你也能给出一份完美的转正答卷。


Q2:秋招无望走实习转正是否可行?

这个选择是完全没有问题的。实习不仅能够提高转正的几率,也是给你一定机会提前感受一下社会环境,在体验过真实互联网工作环境后,有些人会明白自己是否合适,才会有更精确的职业规划。


新增一个小栏目,收集着目前为止小伙伴们私信一恩的一些关于实习转正问题的答复。如果大家还有其他问题欢迎继续在评论区回复,一恩会一一回答的~


作者:李一恩
链接:https://juejin.cn/post/7257434794900832312
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

如何提升团队代码质量

目标提升代码质量统一编码规范和风格知识分享防止代码腐烂降低bug数量,提前检查出线上隐患一、接入SonarQube,SonarQube关于js部分的规则rules.sonarsource.com/javascript/sonar的主要作用CR大部分情况只会关注...
继续阅读 »

目标

  1. 提升代码质量
  2. 统一编码规范和风格
  3. 知识分享
  4. 防止代码腐烂
  5. 降低bug数量,提前检查出线上隐患

一、接入SonarQube,

  1. SonarQube关于js部分的规则
  2. sonar的主要作用
    • CR大部分情况只会关注提交部分代码,所以需要一个工具可以从全局检查潜在的代码缺陷,这其中SonarQube是一个不错的选择
    • sonar可以展示源码中重复严重的地方,人肉CR很难做到,除非对这个项目代码深入了解
    • sonar可以当做辅助CR工具,仅用于记录问题,不阻塞发布流程
    • 由于CR只针对于新增代码,所以不会照顾到老代码的质量。sonar可以辅助修复老项目代码的潜在缺陷,提高老项目的代码质量
  3. 如何使用
    • SonarQube看板
    • 定时记录sonar的问题统计信息

二、增加CR环节

CR 本身的收益

  1. 统一编码风格
  2. 增加代码规范的主动性(⼼理暗示别⼈会review,所以会注意规范)
  3. 代码复查,提升质量(尽早发现bug和设计中存在的问题)
  4. 代码分享,知识共享(例如一些好用的库或者解决方案能通过CR在组内快速广播开)
  5. 新人培养(CR流程可以作为新人培训的一部分,让新人能够迅速接入项目)

CR 规范

  1. 所有需要发布⽣产的代码提交都要得到CR,至少需要指定一个人appove
  2. 所有的comment都需要解决之后才可以合并到master
  3. 应用可以设置 Review 建议需全部解决,对于非必需修改的建议可以进行打标或说明
  4. MR的备注信息要详细说明本次MR的功能点,让reviewer能容易理解作者意图
  5. reviewer不能指定自己
  6. 优先指定熟悉项目的相关人员

CR 过程

  1. 冒烟测试通过之后,提交MR到develop分支,并把MR链接发到群里并艾特reviewer,简要说明此次提交/修改的内容(也可通过机器人
  2. 鼓励大胆comment,有不理解的地方,或者觉得不合适的地方都直接表达出来
  3. 作者对每个comment也要做出反馈,无论是展开讨论还是简单的给个 OK 都是有效的反馈
  4. 复杂的、大量的代码提交可以采用线下开会集体cr以提高效率
  5. 作者处理完所有comment,代码也进行修改之后,要在群里艾特通知一下reviewer
  6. reviewer确认没问题,点approve, 然后由作者来点merge

CR Gitlab配置

  1. webhook配置
  2. approvals设置

CR 准则

  1. 如果变更达到可以提升系统整体代码质量的程度,就可以让它们通过,即使它们可能还不完美
  2. 没有完美的代码,只有更好的代码。不要求代码实现每个细节都完美,应该做好修改时间和重要性之间的权衡
  3. 遵循基础的代码规范指南,任何与规范不一致的地方都属于个人偏好,比如变量命名规范是驼峰,代码实现是下划线命名。但如果某项代码样式在指南中未提及,那就接受作者的样式

关于Comment

  1. 一般预期挑的越多越好,但代码是人写的,很多情况下会让作者感到不适,所以在comment的时候也尽量注意一下措辞,有一些在规范之外的偏个人主观的东西,一般以建议的方式给出
  2. 对于原则性的问题,还是要坚守质量标准的
  3. 发现了一些好的代码好的设计,也请给予对方以肯定和赞美,这样有助于Review有效的进行

reviewer需要注意的点

  1. 逻辑上

    • 代码设计
    • 功能实现
    • 边界条件
    • 性能隐患
  2. 代码质量

    • 编码规范
    • 可读性:逻辑清晰、易理解,避免使用奇淫巧技、过度拆分
    • 复杂度:是否有重复可简化的复杂逻辑,代码复杂度是否过高,功能实现尽量要简洁
  3. 参考 CR常见问题

  4. 准则:代码是写给人看的,除非这份代码仅使用一次,不再需要维护。基于此准则review,只要作者提交的代码让你感觉到接手后维护困难,那都应该comment提出自己的想法

CR 心态

  1. Author
    • 自己对代码的质量负责,因此应当怀着感恩的心去看待坚持认真帮你 Review 代码的同事,因为并不是所有人都有时间和精力来帮着提高代码质量
    • 不要依赖于reviewer,不要说什么"review的时候你怎么没看出来"这种话,就好像出了线上bug不要怪测试没有测出来,reviewer只是提供了一些建议,不是做质量把关的
    • 对comment不要有抵触情绪,有自己觉得不合理的地方,可以恰当的回复拒绝,或者说明一下自己这么做的原因
    • 代码好坏这件事情上本身就带有很大的个人偏好色彩在里面,每个commont都看做是一次思想交流就好了
  2. Reviewer
    • 保持学习者的心态,review既是帮助他人提高代码质量的过程,也是学习他人,提高自己代码能力和沟通能力的过程,既要发现潜在质量问题,也要努力发现一些值得学习的亮点,这样对自己也是一个很大的帮助
    • 代码review的时候不用有什么心里负担,有什么疑惑的、不清楚的地方或者有什么自己的想法,可以直接提出来。有不少人 在写Comment的时候会犹豫,担心自己提出的问题或建议比较“蠢”

CR 疑问

  1. 组员参与度和积极性不够高,无法有效对比小A和小B和小C在CR上的贡献
    • 激励措施,鼓励全员积极CR
    • 定期统计comment数量,挑选好的comment,和一些坏的代码展示并讨论
  2. 对于一些重要且复杂的功能代码是否需要定期开会宣讲,多人review
  3. 发布前发现问题多,改动太大,影响项目计划

三、CR常见问题(包含规范/风格指南)

  1. CR常见问题 文档
  2. CR常见问题仅供reviewer做参考, 分严重/中等/建议三个等级
    • 严重: 可能会造成bug
    • 中等: 造成后续维护困难
    • 建议: 代码有优化空间或者代码风格、格式问题,但是不影响使用和迭代
  3. 根据项目紧急程度和对质量的要求,不同等级的问题可酌情处理
  4. 规范要轻量,先抛出严重问题,不过分追求细枝末节,根据后续CR的情况持续增加

作者:今天的我吃饱了吗
链接:https://juejin.cn/post/7256306281538699325
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

思维模型:打破996工作制下的僵局,让打工人更具竞争力

你身边有没有这样的人:面对堆积如山的工作、随时弹出的任务,接二连三的群@也能游刃有余地处理。回看自己,旧的任务还在做,新的任务已经从天而降,日程表上满是任务却无从下手……明明忙个不停却成果甚微,这怎么跟想象的不一样!说好的,一分耕耘一分收获呢?说好的,世上无难...
继续阅读 »

你身边有没有这样的人:面对堆积如山的工作、随时弹出的任务,接二连三的群@也能游刃有余地处理。回看自己,旧的任务还在做,新的任务已经从天而降,日程表上满是任务却无从下手……

明明忙个不停却成果甚微,这怎么跟想象的不一样!

  • 说好的,一分耕耘一分收获呢?
  • 说好的,世上无难事,只怕有心人呢?
  • 说好的,只要功夫深,铁杵磨成针呢?

在一切讲究高效率的现代职场,职场人常常被要求高效率完成工作,但缺乏方法的大多数人选择了低效的加班加点。

《论语》中提到:“工欲善其事,必先利其器”。对于想要“逃离苦海”、提高效率的职场人来说,思维模型就是职场人最好的工具。掌握高效率的思维模型,不仅能快速看透工作的本质,不盲目地开展工作,还能让工作效率翻倍,逃离996、007的悲惨生活。

话说思维模型这么多,给点实际的行不行?要想成为精英打工人,我们可以从以下四方面出发,提高效率、解决问题不是梦!

问题1:摆烂现场

职场生存法则第一招:战略规划

要想为自己制定清晰的发展方向,首先要做的就是“认清自我”。SWOT模型、PEST模型、商业模式画布等思维方法能够帮助我们更客观、理性地认识自我或自己的产品。

以SWOT模型为例,它不仅能够帮助我们分析自身的优劣势以及外部的机会与威胁,还能通过几个象限的两两结合产生四个具有行为导向的问题:

  • SO:利用哪些优势,抓住外部机会;
  • ST:利用哪些优势,减少威胁;
  • OW:利用哪些机会,改善自身的哪些劣势;
  • WT:在哪些威胁中,需要改善自身的哪些劣势。

SWOT分析模型不会直接告诉你答案,但通过罗列分析后,答案早已浮出水面。同样,PEST、商业模式画布等模型都能够达到类似的效果。在了解了自己之后,我们就能依据这些因素,做出长远的个人规划。

问题2:混乱现场

职场生存法则第二招:目标管理

面对突如其来的各种需求,SMART原则、5W2H原则、MECE原则、黄金圈法则等目标管理模型,都可以实现任务、计划的稳步前进。再也不用担心面对目标无从下手了!

**如何正确制定目标?如何不让目标成为摆设?**用SMART原则举个例子:

SMART原则强调目标是具体的、可衡量的、可实现的、要与计划有相关性,还要有具体时限的。仅这些还不够,在设定目标时,还有需要注意的维度。

  • 如何能让目标具体:用具体语言清楚说明要达成的行为标准,不能模棱两可、不能笼统模糊;
  • 如何让目标可衡量:目标要数量化、行为化;
  • 目标怎么定才能实现:在付出努力的情况下可以实现目标,禁止目标过高、他人强加 ;
  • 目标如何相关:该目标与本职工作、其他目标是相关联的,不能漫无目的、胡乱跑题 ;
  • 目标如何定时限:目标要有一定的时间限制,不能毫无期限、不设约束。

但目标如何拆分?目标如何管理?还需要借助 MECE原则、 5W2H原则、OKR等模型管理。

问题3:社恐现场

职场生存法则第三招:行为管理

想做又不敢做?这时候,福格行为模型的作用就凸显出来了 !突破自己,再也不用担心自己做不了了!

福格行为模型简单来说可以总结如下,人的行为有三个触发因素:动机、能力、提示。满足这三个因素,人们才会做出行动。

福格行为模型有一个经典公式:

  • M是动机,是想做某件事的欲望;
  • A是能力,也就是能完成某件事的能力;
  • P是触发条件,也就是提示你做某件事的信号。
  • B就是行为,当三个条件同时起到作用时,才能使行为发生,从而完成一件事。

再次回看阿道的社恐现场:

这件事情的M动机(Motivation)是阿道在讲完课后专业技能会得到了巩固,不仅会克服社恐,说不定还会得到其他女同事的青睐,A能力(Ability)是阿道有很好的专业能力,而P触发条件(Prompt)则是老板让阿道给大家讲课。

由此看来,当M动机、A能力、P触发条件同时发生作用时,阿道最终会突破自己,做成自己曾经不敢的事情。

所以,在日常生活工作中,想做一件事,为什么没做呢?无非就是想而不能、能而不想、又能又想但缺乏触发条件而已。当遇到这些情况时,我们可以提高动机、提高能力、设置触发条件。这样我们就能“动起来”了。

问题4:挨批现场

职场生存法则第四招:总结复盘

复盘最大的好处就是能够帮助我们摆脱“低水平的重复”,避免365天过成一天的情况,停下来去反思,到底哪里做得好,哪里做得不好,这样才能够真正高效地提升我们某方面的水平。 因此,复盘是一个打工精英不可忽视的一项思维能力。

复盘相关的思维模型也有很多:PDCA循环模型、5W2H模型、KISS模型等。比如PDCA循环,能让我们用同样的时间做更多的事情,不断螺旋上升地循环起来。

以上这些场景是不是似曾相识?以前百思不得其解的问题好像一下子迎刃而解,就像点外卖时某团推来了大额优惠券、购物时打开了某宝。这些思维模型像存在于人们脑中的APP,遇到问题时能够帮助自己快速获取解决办法。

正如巴菲特的合伙人查理·芒格所说:“思维模型会给你提供—种视角或思维框架,从而决定你观察事物和看待世界的视角。顶级的思维模型能提高你成功的可能性,并帮你避免失败。 ”

其实在能力上,人与人并没有太大的区别,真正的区别在于思维的不同。对大多数职场人来说,只要能掌握其中的一部分的思维模型就足以解决日常职场生活中的各种问题。


作者:禅道程序猿
链接:https://juejin.cn/post/7231821116909125688
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »

2023年中总结,全栈工程师在深圳工作6年后的一些杂谈

今天是2023上半年的最后一天,刚好也是我在深圳一家公司的第6年,2017年6月我入职现在这家公司,到如今整好是6年。世事变迁,在这个6月回想6年前的6月,是怎样一番情愫呢。6年前不同如今,那是一个很好找工作的年份,没有什么L型增长的经济,大环境滋润着众多中小...
继续阅读 »

今天是2023上半年的最后一天,刚好也是我在深圳一家公司的第6年,2017年6月我入职现在这家公司,到如今整好是6年。世事变迁,在这个6月回想6年前的6月,是怎样一番情愫呢。

6年前不同如今,那是一个很好找工作的年份,没有什么L型增长的经济,大环境滋润着众多中小企业如雨后春笋一般冒头,行业内大多数人都充满希望。但我在那时候找起工作来依然是十分困苦,四处奔走,因为我,遇到了各种各样的小公司。不过我发现一个特别之处,我与医疗行业十分有缘分,2016年3月就在北京朝阳三间房乡入职的一家企业也为医疗单位服务,虽然是我不大感兴趣的医疗咨询,并非医疗系统,但也引发了我对从事医疗系统服务的向往,没想到一年多之后来到深圳,真的如愿以偿了,在如今这家公司做了整整6年的HIS。

当然了即便是6年前,我也不可能根据自己的偏好去寻找工作,能找一份工作就心满意足,能找到匹配自己喜爱的业务场景,实在是一种幸运。当时我想的是,无论是什么行业只要是做erp类型的软件,都适配于我当时所掌握的一些技能。简单描述就是这类系统注重模块之间复杂的关系,并不需要担心什么高并发场景,笼统的说这也就是b2b的特性(与这些年网络上流行的技术路线b2c截然相反),我一直认为这种方式才比较锻炼复杂而抽象、又要能够连续下去的思维能力,这符合我长期对复杂系统的想象。当然了,面对这些模块比较多也比较杂乱的系统,很难快速响应其中一点,有时候定位一个问题都比较困难,这需要消耗不停的消耗耐心。即便是很有耐心的人,心力也会逐渐被消磨掉,就如同深圳的夏天,即便绿化很好,路上常常有树荫,但真要走一走,仍然是热到冒汗。

对版本控制的一些简言

6年前刚进现在的公司,最让我惊讶的是完全没有版本控制?!只通过sshscp文件拷贝来合并,好在我进入公司之后不久,由于开发进度的深入,就开始使用gitgithub private了。但通过这一短暂的时光,我深刻的体会到版本控制的重要性,表面上看,版本控制只是解决团队协作文件合并的问题,在模块高度分离,负责明确的前期阶段,确实很难感受到版本控制的作用,只会感觉到多了一层麻烦。但他有很多的隐藏的好处,是很多人没有说明的,下面简单概括几点:

  • 标记与溯源,很多时候只要通过提交信息,就能知道一块老代码的前世今生,即便信息粗糙,只要有提交的时间,就能对应上很多其他的信息,例如项目管理面板的bug列表、任务列表,亦或是聊天记录、邮件、保存的图片,通过这样的方式对应上,就能回答这样几个问题,何时新增的模块? 新增模块的初衷可能是什么? 修改的目的是什么?
  • 上下文,一个提交除了一个代码段,还可能包括其他的文件,以及他前后的一些提交内容,这些信息是很丰富的,它们可以回答这样的问题,这段代码修改的前后都在做什么? 这段修改是否可能是因为类似全局替换的批量处理,或是错误的格式化等意外导致的错误?
  • 还原,或许你经常能听到这种抱怨,这个功能花费了好大精力快做完了,用户却要把整个功能设计推倒重来,这无疑是需要撤回一整个提交的,但你可能会想在项目的早期阶段很难发生这种事情,所以拖一段时间再加入版本控制也无所谓。但可能还有一种情况,没有外界的任何干预,一个功能卡在了最终阶段,在这个功能尚未结束的情况下,项目其他很多地方都没办法运行,此时急需进行一个阶段性的演示,这时你就不得不看看这个功能到底牵扯了哪些部分,没有版本控制的帮助,很难快速的只通过代码本身的上下文找到这些需要中止的部分。

这些虽然都是不多见的场景,但我都曾遇到过,如果没有版本控制几乎无从下手解决这些事项,版本控制是需要长期的使用才能感受到它的好处,它甚至不一定需要在有团队合作的场景下使用,即便是你一个人做的玩具项目,或是独立开发的小插件,都能避免这样的问题。但它们不是一时能体验到的,千万不要因为一些小麻烦而错过这么多解决小问题的预防性措施,用git并不一定要提交到一个centre,即便是全程都在本地使用,都能感受到许多益处,所以一个项目应该尽快从速的加入版本控制,不要等到有合并的需求才加入。

版本控制就像道路,不要觉得他只是为拼合一个集体而生,只有人多了才需要修路,其实只要是需要车辆通过,哪怕是一天只会通过一辆车,有条道路也比没有强一些。

多解决棘手问题了解一些极为罕见的意外情况

曾经看过这样的科普,硬盘会被环境噪声影响,速度会降低,寿命会减少,我想如果我遇到这样的问题一定不会想到是噪声的问题,因为环境噪声能严重到干扰硬盘设备,可能像因为吃香蕉而辐射超标一样不现实,但我却真实的遇到了一次极为罕见的意外情况:

Chrome语法检查插件Grammarly曾备受推崇,我在油管见过好多次他的广告,但我并没有尝试,没想到它却依然走入了我的视野,众所周知面对单词或语法错误的输入框,他会显示出一个类似于tooltip的悬浮块来提醒用户,但它却很神奇的影响了kendo前端框架的富文本输入框,会导致其高度发生变化,甚至遮盖下方的元素,用户完全无法正常使用,我百思不得其解,最终通过用户的截图发现这个插件,自己安装了一试,发现了问题,原来Chrome插件是真的会影响页面功能的。

遇到这样的情况当然是运气不好,但不能不有一些大胆的假象,如果完全不敢设想极端情况,只去寻找自身的常规的问题,那是很难解决问题的。

也不要害怕棘手的问题,如果能解决,自然可以向所有人分享自己的经验获得分享的快乐。就算最终解决不了,也可以成为一桩值得回味的悬案,就像一个开放式结局的小故事值得他人解读。

持续跟进社群的走向

这一点是毋容置疑的,最直接的影响就是技术路线的更新迭代,如果自己用于开发的语言、平台、框架本身已经没落,官方停止支持,那自然是要学习其他代替品的,但这个没落也分等级,像FlashVisual Basic&VBScriptWindows Phone.NET Framework&WinFormAngular.js 1.x、属于已经宣告死亡的产品,是绝对要抽身的。而像PHPCoffeeScriptDelphiMemcached,是很多年前就被替代品取代但仍然被一些坚持的人维护着,这还是有些区别的,前者就算真的很热爱也无力挽救了,后者还可以倔强下去。但无论是哪种,都要面对下面几个问题:

  • 即便是大多数人都不用了,也总会有维护性的需求在吧?
    • 并不可取,说不定某一天就要换新系统,维护性需求消失,不学点新的怎么能行呢,而且很多新技术变化并非翻天覆地,只要慢慢的接触,消除掉陌生感,就会自然的对新技术越来越感兴趣。
  • 所处的公司业务体系庞大,短时间内很难更新技术,即便是要更新,到时候再学就是了。
    • 任务到面前了才开始学,时间够吗,现在很多产品开发周期越来越快,仓促之间错误一定不会少,后面还能改善这些错误呢?会不会需要很大的代价,并且引出更多的错误?技术栈一定要提前布局
  • 新技术虽然用的人很多,但占用大、而且看上去只能做些简单的东西,恐怕做不了太复杂的需求,卡在替代过程中的某个位置就白费力气了。
    • 很多框架占用内存确实较大,但现在用户的设备越来越好,完全是有条件的,而且底层设计完善,占用的增加可能并非线性的,而是随着开发进度趋于平缓。如果认为做不了复杂需求,就应该看一下用例,甚至是我们所使用的工具,像掘金本身是VueElement-UI做的,如果你关注AI,你就会发现OpenAI官网也用了Vue,这就很给人信心。

即便许多年后也许离开了软件开发的行业,十余年后回顾这段历程,都找不到有人聊自己用过的技术,成为了一个完全的死话题,也无从向后来者介绍从前的开发经历与故事,是否会像一个孤寡老人一样无助呢,所以说为了自己的历程与故事,也要不断了解和学习新的技术,新技术的发展也并非需要天天了解,如今很多流行的技术其实也已经存在了七八年了,如果真的热爱,就值得持续的关注,并不占用多少时间,向后来者讲述技术演化的细节,每个人都会有自己独特的故事,这是其他媒体无法讲述的。

未完待续


作者:lyrieek
链接:https://juejin.cn/post/7250404077712752677
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
收起阅读 »