Fork me on GitHub

那些年,我们见过的Java服务端“问题”

原文地址: https://mp.weixin.qq.com/s/sxXVzB_t1qMAwqBCsGrVNg

写的非常棒,通俗易懂,而且讲的是java服务端开发过程中大概率会碰到的问题,非常值得看

小结:

分布式好处

多线程使用

合理定义流程

系统之间的交互

数据查询分页

导读

明代著名的心学集大成者王阳明先生在《传习录》中有云:“道无精粗,人之所见有精粗。如这一间房,人初进来,只见一个大规模如此。处久,便柱壁之类,一一看得明白。再久,如柱上有些文藻,细细都看出来。然只是一间房。”

是的,知识理论哪有什么精粗之分,只是人的认识程度不同而已。笔者在技术圈摸爬滚打数年,接触了各式各样的Java服务端架构,见得多了自然也就认识深了,就能分辨出各种方案的优劣了。这里总结了一些初创公司存在的Java服务端问题,并尝试性地给出了一些解决方案,供大家交流参考。

**1.**系统不是分布式

1.1.单机版系统抢单案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 抢取订单函数
public synchronized void grabOrder(Long orderId, Long userId) {
// 获取订单信息
OrderDO order = orderDAO.get(orderId);
if (Objects.isNull(order)) {
throw new BizRuntimeException(String.format("订单(%s)不存在", orderId));
}

// 检查订单状态
if (!Objects.equals(order.getStatus, OrderStatus.WAITING_TO_GRAB.getValue())) {
throw new BizRuntimeException(String.format("订单(%s)已被抢", orderId));
}

// 设置订单被抢
orderDAO.setGrabed(orderId, userId);
}

以上代码,在一台服务器上运行没有任何问题。进入函数grabOrder(抢取订单)时,利用synchronized关键字把整个函数锁定,要么进入函数前订单未被人抢取,从而抢单成功,要么进入函数前订单已被抢取导致抢单失败,绝对不会出现进入函数前订单未被抢取而进入函数后订单又被抢取的情况。

但是,如果上面的代码在两台服务器上同时运行,由于Java的synchronized关键字只在一个虚拟机内生效,所以就会导致两个人能够同时抢取一个订单,但会以最后一个写入数据库的数据为准。所以,大多数的单机版系统,是无法作为分布式系统运行的。

1.2.分布式系统抢单案例

添加分布式锁,进行代码优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

// 抢取订单函数
public void grabOrder(Long orderId, Long userId) {
Long lockId = orderDistributedLock.lock(orderId);
try {
grabOrderWithoutLock(orderId, userId);
} finally {
orderDistributedLock.unlock(orderId, lockId);
}
}

// 不带锁的抢取订单函数
private void grabOrderWithoutLock(Long orderId, Long userId) {
// 获取订单信息
OrderDO order = orderDAO.get(orderId);
if (Objects.isNull(order)) {
throw new BizRuntimeException(String.format("订单(%s)不存在", orderId));
}

// 检查订单状态
if (!Objects.equals(order.getStatus, OrderStatus.WAITING_TO_GRAB.getValue())) {
throw new BizRuntimeException(String.format("订单(%s)已被抢", orderId));
}

// 设置订单被抢
orderDAO.setGrabed(orderId, userId);
}

优化后的代码,在调用函数grabOrderWithoutLock(不带锁的抢取订单)前后,利用分布式锁orderDistributedLock(订单分布式锁)进行加锁和释放锁,跟单机版的synchronized关键字加锁效果基本一样。

1.3.分布式系统的优缺点

分布式系统(Distributed System)是支持分布式处理的软件系统,是由通信网络互联的多处理机体系结构上执行任务的系统,包括分布式操作系统、分布式程序设计语言及其编译系统、分布式文件系统分布式数据库系统等。

分布式系统的优点:

  • 可靠性、高容错性:

一台服务器的崩溃,不会影响其它服务器,其它服务器仍能提供服务。

  • 可扩展性:

如果系统服务能力不足,可以水平扩展更多服务器。

  • 灵活性:

可以很容易的安装、实施、扩容和升级系统。

  • 性能高:

拥有多台服务器的计算能力,比单台服务器处理速度更快。

  • 性价比高:

分布式系统对服务器硬件要求很低,可以选用廉价服务器搭建分布式集群,从而得到更好的性价比。

分布式系统的缺点:

  • 排查难度高:

由于系统分布在多台服务器上,故障排查和问题诊断难度较高。

  • 软件支持少:

分布式系统解决方案的软件支持较少。

  • 建设成本高:

需要多台服务器搭建分布式系统。

曾经有不少的朋友咨询我:”找外包做移动应用,需要注意哪些事项?”

首先,确定是否需要用分布式系统。软件预算有多少?预计用户量有多少?预计访问量有多少?是否只是业务前期试水版?单台服务器能否解决?是否接收短时间宕机?……如果综合考虑,单机版系统就可以解决的,那就不要采用分布式系统了。因为单机版系统和分布式系统的差别很大,相应的软件研发成本的差别也很大。

其次,确定是否真正的分布式系统。分布式系统最大的特点,就是当系统服务能力不足时,能够通过水平扩展的方式,通过增加服务器来增加服务能力。然而,单机版系统是不支持水平扩展的,强行扩展就会引起一系列数据问题。由于单机版系统和分布式系统的研发成本差别较大,市面上的外包团队大多用单机版系统代替分布式系统交付。

那么,如何确定你的系统是真正意义上的分布式系统呢?从软件上来说,是否采用了分布式软件解决方案;从硬件上来说,是否采用了分布式硬件部署方案。

1.4.分布式软件解决方案

作为一个合格的分布式系统,需要根据实际需求采用相应的分布式软件解决方案。

1.4.1.分布式锁

分布式锁是单机锁的一种扩展,主要是为了锁住分布式系统中的物理块或逻辑块,用以此保证不同服务之间的逻辑和数据的一致性。

目前,主流的分布式锁实现方式有3种:

  1. 基于数据库实现的分布式锁;
  2. 基于Redis实现的分布式锁;
  3. 基于Zookeeper实现的分布式锁。

1.4.2.分布式消息

分布式消息中间件是支持在分布式系统中发送和接受消息的软件基础设施。常见的分布式消息中间件有ActiveMQ、RabbitMQ、Kafka、MetaQ等。

MetaQ(全称Metamorphosis)是一个高性能、高可用、可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个拷贝。MetaQ具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景。

1.4.3.数据库分片分组

针对大数据量的数据库,一般会采用”分片分组”策略:

分片(shard):主要解决扩展性问题,属于水平拆分。引入分片,就引入了数据路由和分区键的概念。其中,分表解决的是数据量过大的问题,分库解决的是数据库性能瓶颈的问题。

分组(group):主要解决可用性问题,通过主从复制的方式实现,并提供读写分离策略用以提高数据库性能。

1.4.4.分布式计算

分布式计算( Distributed computing )是一种”把需要进行大量计算的工程数据分割成小块,由多台计算机分别计算;在上传运算结果后,将结果统一合并得出数据结论”的科学。

当前的高性能服务器在处理海量数据时,其计算能力、内存容量等指标都远远无法达到要求。在大数据时代,工程师采用廉价的服务器组成分布式服务集群,以集群协作的方式完成海量数据的处理,从而解决单台服务器在计算与存储上的瓶颈。Hadoop、Storm以及Spark是常用的分布式计算中间件,Hadoop是对非实时数据做批量处理的中间件,Storm和Spark是对实时数据做流式处理的中间件。

除此之外,还有更多的分布式软件解决方案,这里就不再一一介绍了。

1.5.分布式硬件部署方案

介绍完服务端的分布式软件解决方案,就不得不介绍一下服务端的分布式硬件部署方案。这里,只画出了服务端常见的接口服务器、MySQL数据库、Redis缓存,而忽略了其它的云存储服务、消息队列服务、日志系统服务……

1.5.1.一般单机版部署方案

架构说明:

只有1台接口服务器、1个MySQL数据库、1个可选Redis缓存,可能都部署在同一台服务器上。

适用范围:

适用于演示环境、测试环境以及不怕宕机且日PV在5万以内的小型商业应用。

1.5.2.中小型分布式硬件部署方案

架构说明:

通过SLB/Nginx组成一个负载均衡的接口服务器集群,MySQL数据库和Redis缓存采用了一主一备(或多备)的部署方式。

适用范围:

适用于日PV在500万以内的中小型商业应用。

1.5.3.大型分布式硬件部署方案

架构说明:

通过SLB/Nginx组成一个负载均衡的接口服务器集群,利用分片分组策略组成一个MySQL数据库集群和Redis缓存集群。

适用范围:

适用于日PV在500万以上的大型商业应用。

2.多线程使用不正确

多线程最主要目的就是”最大限度地利用CPU资源”,可以把串行过程变成并行过程,从而提高了程序的执行效率。

2.1.一个慢接口案例

假设在用户登录时,如果是新用户,需要创建用户信息,并发放新用户优惠券。例子代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

// 登录函数(示意写法)
public UserVO login(String phoneNumber, String verifyCode) {
// 检查验证码
if (!checkVerifyCode(phoneNumber, verifyCode)) {
throw new ExampleException("验证码错误");
}

// 检查用户存在
UserDO user = userDAO.getByPhoneNumber(phoneNumber);
if (Objects.nonNull(user)) {
return transUser(user);
}

// 创建新用户
return createNewUser(user);
}

// 创建新用户函数
private UserVO createNewUser(String phoneNumber) {
// 创建新用户
UserDO user = new UserDO();
...
userDAO.insert(user);

// 绑定优惠券
couponService.bindCoupon(user.getId(), CouponType.NEW_USER);

// 返回新用户
return transUser(user);
}

其中,绑定优惠券(bindCoupon)是给用户绑定新用户优惠券,然后再给用户发送推送通知。如果随着优惠券数量越来越多,该函数也会变得越来越慢,执行时间甚至超过1秒,并且没有什么优化空间。现在,登录(login)函数就成了名副其实的慢接口,需要进行接口优化。

2.2.采用多线程优化

通过分析发现,绑定优惠券(bindCoupon)函数可以异步执行。首先想到的是采用多线程解决该问题,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 创建新用户函数
private UserVO createNewUser(String phoneNumber) {
// 创建新用户
UserDO user = new UserDO();
...
userDAO.insert(user);

// 绑定优惠券
executorService.execute(()->couponService.bindCoupon(user.getId(), CouponType.NEW_USER));

// 返回新用户
return transUser(user);
}

现在,在新线程中执行绑定优惠券(bindCoupon)函数,使用户登录(login)函数性能得到很大的提升。但是,如果在新线程执行绑定优惠券函数过程中,系统发生重启或崩溃导致线程执行失败,用户将永远获取不到新用户优惠券。除非提供用户手动领取优惠券页面,否则就需要程序员后台手工绑定优惠券。所以,用采用多线程优化慢接口,并不是一个完善的解决方案。

2.3.采用消息队列优化

如果要保证绑定优惠券函数执行失败后能够重启执行,可以采用数据库表、Redis队列、消息队列的等多种解决方案。由于篇幅优先,这里只介绍采用MetaQ消息队列解决方案,并省略了MetaQ相关配置仅给出了核心代码。

阅读更多...

Java 中的 T,E,K,V, 别傻傻分不清楚!

作者:glmapper

https://juejin.im/post/5d5789d26fb9a06ad0056bd9

前言

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

### 泛型带来的好处

在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。

对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个安全隐患。

那么泛型的好处就是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class GlmapperGeneric<T> {
private T t;

public T get() {
return t;
}

public void set(T t) {
this.t = t;
}

public static void main(String[] args) {
// do nothing
}
}


/**
* @Description 不指定类型
* @Author Gao Hang Hang
* @Date 2019-09-17 20:37
**/
public class noSpecifyType {
public static void main(String[] args) {
GlmapperGeneric glmapperGeneric = new GlmapperGeneric();
glmapperGeneric.set("test");
// 不指定类型,需要强制类型转换
String test = (String) glmapperGeneric.get();
System.out.println(test);
}

}


/**
* @Description 指定类型
* @Author Gao Hang Hang
* @Date 2019-09-17 20:39
**/
public class specifyType {
public static void main(String[] args) {
GlmapperGeneric<String> glmapperGeneric = new GlmapperGeneric<>();
glmapperGeneric.set("test");
// 不需要强制类型转换
String test = glmapperGeneric.get();
System.out.println(test);
}
}

上面这段代码中的 specifyType 方法中 省去了强制转换,可以在编译时候检查类型安全,可以用在类,方法,接口上。

泛型中通配符

我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢?

常用的 T,E,K,V,?

本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,?是这样约定的:

  • ?表示不确定的 java 类型
  • T (type) 表示具体的一个java类型
  • K V (key value) 分别代表java键值中的Key Value
  • E (element) 代表Element
阅读更多...

《MyBatis-Plus入门和进阶》视频笔记

视频地址: https://www.imooc.com/video/19491

第1章 课程简介及快速入门

1-1 课程介绍及学习前须知

1-2 MyBatis与JPA对比

1-3 MP简介

1-4 lombook简介及安装

1-5 快速入门小例子

第2章 基本使用

2-1 通用传统模式简介及通用mapper新增方法

2-2 常用注解

2-3 排除非表字段的三种方式

第3章 MyBatis-Plus查询方法

3-1 普通查询

3-2 条件构造器查询(1)

3-3 条件构造器查询(1)

3-4 条件构造器查询(3)

3-5 条件构造器查询(4)

###3-6 select不列出全部字段

3-7 condition作用

3实体作为条件构造器构造方法的参数

3-9 AllEq用法

3-10 其他使用条件构造器的方法

3-11 lambad条件构造器

第4章 自定义sql及分页查询

4-1 自定义sql

4-2 分页查询

第5章 更新及删除

5-1 更新方法

5-2 删除方法

第6章 AR模式、主键策略和基本配置

6-1 AR模式

6-2 主键策略

6-3 基本配置

第7章 通用service

7-1 通用service

一个程序员的成长之路

原作者: 张云龙

原文地址: 一个程序员的成长之路

读后感:

好团队很重要,尽量去大公司

FDCon2018大会上的演讲整理

1
2
3
4
主题:主会场 - 一个程序员的成长之路
时间:2018年5月19日 10:40
地点:中国 上海
演讲嘉宾:张云龙-全民直播-CTO

大家好,我是云龙,从2016年3月份开始,我参与到全民直播这个创业项目中,这两年一直在上海。关于我自己的成长历程,一直都很想找个时间跟前端的开发者们分享一下。通过剖析别人,也可以总结自己。我很害怕把这个主题讲的跟成功学一样,其实CTO这个职位现在多少有点“烂大街”,不算是什么成功,仅供参考。

我是2010年毕业的,刚毕业即加入百度,当年我毕业的时候同一批入职的人后来成立一个微信群,那个群在8年后的今天,我们还会一起扯皮闲聊,分享彼此的际遇。我发现它可以作为参考——8年前一群有着相同能力,相同起点的人,在8年之间因为做出不同的选择,最后达成了不同的人生。有的创业,有的在大公司做高管,有的炒比特币财富自由。参考他们的选择会让你有一些感悟: “如果当初我选择了那样,我现在会怎么样”。我现在经历了职业生涯8年的时间,也想把自己的经历作为一个案例,分享给大家。

在讲之前,先问一下在座的同学工作3年以下的举手。。。。emmm,剩下的都是三年以上的咯?我看了一下,比例差不多一半一半。

我面试过许多前端工程师,发现大家在工作了3-4年的时候会遇到一个迷茫期,我问他们你们接下来想做什么,大多数人回答说想做一个开源项目,并且推广开来,成为前端“网红”,更长远的职业发展规划往往考虑的很少。

今天,我希望把自己的工作经历完全拆解开呈现在大家面前,作为一个案例解答有关职业发展的困扰。

第一章: 程序员的中年危机。

我今年33岁,虽然有技术傍身,但是难免会有一些焦虑,这种焦虑来自对自己的能力质疑。在大公司的那些年,背靠大平台,做出的成绩80%是平台赋予我的,它有健全的体系,有优秀的同事,有完善的职级制度,还有优厚的薪资待遇。你在这样舒适的环境下做那么一小块事情,如果有一天你发现你这20%可以被替代的时候,这家公司会怎么思考?你有很多股票,开很高的工资,对于公司来说,你的成本很高,在新人的推动下,你会产生一种可被替代的压力,我大概在28岁,29岁技术水平还在上升期的时候就有这种焦虑。

在大公司那些年,我感觉自己还像一个没毕业的学生,始终没有脱离“学生气”,无论说话做事都有这种感觉。其次技术的更新迭代速度特别快,尤其是前端领域,你会发现很少有能真正沉淀下来的东西。第三个焦虑点就是关于企业如何对待35岁以上员工,我当时在百度的时候团队有一个非常厉害的工程师,他在2010年技术职级很高,但技术思维还停留在上一个时代,随着技术的发展,渐渐不能指引团队进步,那个过程比较艰难,对我触动很大。最后一点,就是随着年龄的增长,选择的成本会越来越高,你会有家庭,即便公司觉得你没有价值,你也不能走了,走不动了。这些触动了我,开始要去思考。

我们做技术,尤其是前端,很多时候我们做出的产品,看到的都是UI设计,交互设计 ,产品设计,即便我们做的产品非常成功,成功点在哪儿?可能是UI设计得漂亮,也可能是推荐算法精确,而前端的产出给产品带来了什么?还有前端技术深要深到什么程度?做久了技术就必须要转型管理吗?这些问题我当年没有答案,我可以坚持不懈得写页面,但是这个事情做5年,6年,10年不还是一样吗?现在我能做什么?未来我想做什么?

带着这些疑问,用8年时间我走了3个城市,从北京、到广州,在到上海,在职业道路上寻求答案。

最开始的3年我在北京,那个时候刚毕业,还不能决定自己的未来,加入百度算是比较运气。当时花了些精力准备一份漂亮的简历,这件事对我找工作帮助很大。在学校的时候,基本上对前端这块已经非常熟悉了,我的简历非常漂亮。最开始刚毕业的时候选择工作,简历会成为一个好门面。我把当时自己在前端的方向、学习深入的点,都花精力体现在简历上,当时在大公司招聘的时候已经占了一些优势,很荣幸的是被百度接收了。

在百度三年时间里面,主要深入的在做技术。当时百度有一个很大的前端团队,一百多人,包括百度新闻,百度视频,百度知道,百度百科等等,整个团队为了解决开发效率问题,决定成立一个横向支撑的小组,做一款构建工具,就是fis,我当时还在CMS部门(一个内部的内容管理系统),主动提出参与到fis项目中。做fis的过程让我学到了很多服务端技术,包括运维知识。在百度工作3年后,开始想着开始去脱离这个平台80%的支撑,我当时认为UC是一个中型的创业公司,我过去待了两年多,那个时候开始关注前端团队建设。把我在百度学习到的技术理念在UC结合nodejs重新实践一遍,其次是指导前端团队提高他们整体的技术水平。

在广州UC工作2年后,来到了上海,参与全民直播这个项目。做全民直播的整个过程经历了比较多的坎坷,我最开始接手全民的时候,仅有两个全民自己招聘的研发同学,经过2年多的时间,组建了将近一百人的团队,包括服务端,前端,客户端,测试,运维,编解码,大数据等部门,感觉在上海这两年的成长,比前面在大公司所有5年的加起来还多。

过去走过了一个这样的路线: 大型公司→中型公司→创业公司。专注的事情从技术到团队再到业务。今天我重点跟大家分享我总结的成长历程,当你后面工作到一定年限,碰到困惑的时候,可以拿这个模型参考一下,也算是一个方向。当然,这不是唯一的成长路线。

我把整个职业生涯分三个阶段:

  • 第一阶段,一技之长。就是深耕你的专业技能,你的专业技术。
  • 第二阶段,独立做事。当你的一技之长达到一定深度的时候,需要开始思考如何独立做事。
  • 第三阶段,拥有事业。选择一份使命,带领团队实现它。

大致是这样的三个阶段,接下来我逐一拆解一下:

阅读更多...

时间焦虑:为时已晚?

写书为时已晚,创业为时已晚,学习新语言为时已晚,这称为时间焦虑。

时间焦虑是害怕自己浪费时间。

如果你也有时间焦虑,我会鼓励你停下来问问自己,你是否真的对你的生活意味着什么更加焦虑。关于你正在做什么。如果事实证明你担心你所做的事情不够有意义,那么找出足够有意义的东西并开始这样做。或者,如果你决定用你的生活做出的贡献已经确实感觉像你可以做出的最有意义的贡献,就像我一样,你很焦虑,因为你并不总是花时间去做,所以提醒自己,就像我一样,你不需要把生活中的每一分钟都集中在价值创造上,让创造价值,成为你生活的全部。

解决时间焦虑,第一步是要意识到,时间一直都存在,我们不能改变它。时间会继续前进,我们也将如此。

  1. 找到喜欢的做的事情
  2. 在喜欢的事情上花费时间
  3. 减少无意义输入的时间,花费时间输出一些东西

原文地址: Time anxiety: is it too late?

我一直都在苦苦思索。这种反复出现的想法从未真正离开过你:“为时已晚,”出版书籍为时已晚,创办公司为时已晚,学习新语言为时已晚。这被称为时间焦虑。坦率地说,我没有获得的技能数量和我没有采取的机会是令人愤怒的。直到最近我才设法克服了这个想法,而在我的情况下,它仍然是一个日常的斗争,我想分享我的一些策略。

“男人不是命运的囚徒,而只是自己心中的囚犯。”

—- 富兰克林D.罗斯福。

虽然死亡焦虑是对时间不足的恐惧,但时间焦虑是害怕浪费你自己的时间。以最有意义的方式度过你的时间是一种痴迷。当社会告诉我们 - 或者当我们解释社会的迹象说 - 实现某一特定目标为时已晚时,我们并不认为它足够有意义。我们需要 - 我们要求 - 我们对生活所做的事情确实很重要。

时间焦虑可以有几种形式:

  • 当前时间的焦虑:每天被匆忙的感觉让我们感到不堪重负和恐慌。由于这种时间焦虑导致的日常压力,有些人也会经历焦虑症。
  • 未来的时间焦虑:关于未来可能发生或可能不发生的事情的想法,这些是引起担忧的原因和“如果”类型的内部问题。
  • 存在时间的焦虑:失去时间的感觉会滑落而永不回归,许多人在思考死亡时会以更敏锐的方式体验。

“不败之心:构建坚不可摧的自我科学”一书的作者亚历克斯莱克曼博士说,时间焦虑源于以下一些问题:“我能用自己的生命创造最大的价值吗?当我死的时候,我会觉得自己花太多时间蹉跎了吗?“

时间焦虑并不一定意味着你相信一种为你的生活指定了目标的外在力量,而你还没有发现。这只意味着你的幸福在很大程度上取决于你认为自己在生活中创造的价值的重要性。

但是,矛盾的是,这种过度优化可能会阻止我们在生活中创造最大的价值。我们总是通过个人对可能的看法来计算最佳潜在结果,从而限制自己。打击时间焦虑意味着将注意力从结果转移到输出,这样我们就可以将精力投入到我们实际可控的事物上。

时间焦虑

打击时间焦虑:从结果到产出

根据The Mindfulness Journal for Anxiety的作者Tanya J. Peterson的说法,重要的是要接受一些真理,以便能够控制你的日常生活和你的一生。首先,时间一直都存在,我们不能改变它。时间会继续前进,我们也将如此。接受这些简单但令人生畏的事实是减少时间焦虑的第一步。接下来,您可以开始实施一些策略。

“如果我们继续问为什么,就像我们曾经的孩子一样,试图挖掘我们最基本的抱负 - 一个耗时的运动 - 我们最终会发现所有的原因导致同一个地方,一个核心原因是生活中我们一直在追求,这是衡量我们所做一切的价值的核心原因:要快乐。“

临床心理学家Alex Lickerman博士。

虽然生活中的目的是幸福心理学中的一个重要因素,但是花费太多的精神能量来寻找幸福,而不是做一些使用快乐的事情可能会导致焦虑。您可以采取以下三个步骤来减少时间焦虑,同时在日常生活中找到意义:

  1. 定义“花费的时间”对你意味着什么:坐下来,思考一下真正让你快乐的事情并让你顺其自然,而不要过度思考最终结果的可行性。只需考虑一下您的输出以及它如何让您感觉自己在制作它。例如,不要认为它会让你出版一本书。问问自己,你是否真的喜欢写作。不要想想你参加马拉松会有多自豪。问你是否喜欢跑步。创建一个您真正喜欢的活动的简短列表,为您自己或世界带来价值。
  2. 为这些时刻腾出空间:这并不意味着为他们腾出时间。相反,想想你将这些时刻融入生活的哪个方面。也许在你上班的路上。在孩子们睡着之后,也许在家里。或者也许与孩子共度时光就是您想要腾出空间的活动。如果你的时间比预期的少,那就完全没问题了。它更多的是设计一个专门用于“花费时间”活动的空间。正如多产作家玛丽亚·埃奇沃思所说,“如果我们照顾好这些时刻,那么这些年将照顾好自己。”
  3. 减少分心的耗时:我们盲目地在社交媒体上滚动或观看随机视频的时刻确实会导致时间焦虑。快速审核您的内容消费模式,并尝试减少你在输入而不是输出模式中花费的时间。

时间焦虑

正如我所说,时间焦虑是我仍在想要努力解决的事情,并可能继续与我的余生纠缠。如果这也是你正在努力的事情,我希望这些策略对你有用。

5G在2019年这个时间点被过分夸大了

对新事物的过度贬低和赞扬都是不对的

我觉得5G技术的作用在2019年被过分夸大了,5G的全面普及应该会是在2020年-2021年

5G现在的概念普及其实是国家推广的作用,国家想要通过5G这个新引擎提振国家经济发展

但是事物发展过程是缓慢的,见效还是需要时间的,不可能一口吃个胖子

当然不可否认5G将会是下一个发展的新动力,但不是现在

《码农翻身》读书笔记

今天读了下刘欣的《码农翻身》一书,非常棒👍

他用讲故事的方式把技术讲的非常透彻且通俗易懂,正如这本书的副标题所说的,用故事给技术加点料

作者用三年微信公众号文章积淀出了这本书

第6章 老司机的精进

凡事必先骑上虎背

不要害怕失败,不要等到完全准备好再去做

勇敢卖迈出去,努力地争取一下

15年编程生涯,一名架构师的总结

好奇心 315

对技术的好奇心 / 兴趣是一切的基础

养成计算机的思维方式 315

养成计算机的思维方式,流畅的把人类语言的需求转换成计算机语言,这是程序员的基本功

这个基本功的训练就是数据结构和算法,我的经验是多做习题,让这种思维在脑子里固话,以后编程就可以信手拈来

扎实基础,融会贯通 317

要透彻地理解一门技术的本质 317

只是学会使用是不行的,不但要知道How,还要知道Why

停下来,思考,才是进步的本质

能写漂亮的代码 318

所谓漂亮代码不仅仅要实现功能,更要清晰、易懂、优雅,没有 Bug 或者只有极少 Bug

抽象的能力 319

技术领导力 319

要用技术的影响力来领导人,而不是威权和职位

对自己狠一点,开始写作吧 320

写下来,可以做到深度思考。写作会逼着你去思考,梳理知识体系,防止自己被碎片所填满。

学习编程的四兄弟 322

摇摆不定的老大 322

不要什么都去学,要有所精通

“小仓鼠”老二 322

不要只收集而不看

不看书的老三 323

不要不看书,书里的知识更加系统,完整和有深度

半途而废的老四 323

不要半途而废

优秀和平庸的差别可能就是那一点点坚持吧!坚持不懈地做一件事,每天前进一点点,最后量变会发生质变

每个季度定一个小目标,努力达成,获得成就感,就能刺激自己更进一步。

为什么大多数人永远不会得到他们想要的

原文地址: Why Most People Never Get What They Want

生活很混乱。

如果你不知道自己是谁,你代表什么,想要什么,它就会误导你。实现梦想几乎是不可能的。

知道你真正想要的是第一步。大多数人从不做内部工作来确定第一步。但是一旦你开始瞥见你想要的东西,那么你需要弄清楚如何获得它。

这并不容易。

有一些严重的力量 - 内部和外部 - 会让你无法实现自己的梦想。例如,需要720 磅的推力才能使火箭离开地球大气层。逃逸速度是逃避巨大物体(如地球)引力影响的科学术语。

在本文中,我将简要介绍一下最初摆脱平庸生活所需的条件。然后,我将详细说明在绝对最高水平上取得成功所需的条件。

重力永远不会消失。

走出地球的轨道将使你的生活变得更轻松。你可以在任何你想去的地方旅行得更快。但最终,你将降落在另一个星球上。

过了一段时间,你需要离开那个星球。你可能会被困在那里。你的“梦想”的引力可能会使你无法进化到一个新的水平。什么让你在这里不会让你到那里。

这是一个简单的过程细分:


逃逸速度! - 如何实现你的梦想

实现你的梦想取得成功这些日子里,很多模糊的术语被抛出。

但他们真正的意思是什么?

他们真正的意思是过着你真正想要的生活。你相信自己应该过的生活。这比看起来要困难得多。垂死之人最常见的遗憾是:

“我希望我有勇气过自己的生活,而不是别人对我的期望。”

实现自己的梦想并“成功”就是按照自己的指南针生活。这是关于做你真正想要,重视和相信的事情。在接受Tim Ferriss采访时,受欢迎的电影制片人Casey Neistat将成功定义如下:

“成功的最终量化是什么?对我来说,这并不是你花多少时间去做自己喜欢的事情。这是你花费多少时间去做你讨厌的事情。“

成功不是关于你赚多少钱。这不是你驾驶的汽车类型。这不是你住的地方。这不是你的样子。

从根本上说,成功就是要对自己忠诚 - 包括你的信仰和价值。圣雄甘地曾说过

“相信一些东西,而不是生活,是不诚实的。”

对自己不诚实就是你如何在生活中失败。

但是有一个问题。

研究表明,人们几乎每次谈话都在谈论。这不是公然说谎,而是仅仅是,没有完全提供真相。

尽管人们欺骗别人,但我们对自己说谎最多。我们每天都骗自己。

我们告诉自己“今天是一天!”然后对此无动于衷。

我们设置闹钟,然后按下贪睡。

如果我们对待我们的朋友,就像我们对待自己,我们就没有朋友。

所以,实现你的梦想的第一步是对自己变得非常诚实。


实现梦想的第一步:诚实守信

你必须回答以下问题:

  • 我真正想要的是什么?
  • 我真的相信什么?
  • 对我来说,“成功”是什么样的?
  • 对我来说,“成功”是什么感觉?
  • 无论其他人怎么想,对我来说重要的是什么?
  • 我相信自己应该过的生活是什么样的?

回答这些问题并不像看起来那么难。你是一个有意识的存在。你有天生的直觉能力。

然而,回答这些问题是一个情感过程,而不是一个理性的过程。要诚实地回答这些问题,你必须与你更深层次的情感自我联系。

诚实是情绪化的 - 这就是我们撒谎的原因。我们躲避情绪。我们不想变得脆弱。我们不想被拒绝。我们不想失败。我们不想错。相反,我们把我们的情绪压低并忽视它们 - 这是我们的危险。

要开始你的情感发展之旅,你必须开始对自己更加诚实。

你爱什么?

你想要什么?

你可能已经忘记了追求别人的期望,但它就在那里。如果你不追求你真正想要的东西,你永远不会感到成功。

阅读更多...
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信