0%

最近经常连国外的服务器,出现了连不上、连上又经常断开的问题。

连不上1

发现卡在:debug1: expecting SSH2_MSG_KEX_ECDH_REPLY上,

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
$ ssh -v xxx@47.88.217.222
OpenSSH_7.9p1, LibreSSL 2.7.3
debug1: Reading configuration data /Users/shitaibin/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: Connecting to 47.88.217.222 [47.88.217.222] port 22.
debug1: Connection established.
debug1: identity file /Users/shitaibin/.ssh/id_rsa type 0
debug1: identity file /Users/shitaibin/.ssh/id_rsa-cert type -1
debug1: identity file /Users/shitaibin/.ssh/id_dsa type -1
debug1: identity file /Users/shitaibin/.ssh/id_dsa-cert type -1
debug1: identity file /Users/shitaibin/.ssh/id_ecdsa type -1
debug1: identity file /Users/shitaibin/.ssh/id_ecdsa-cert type -1
debug1: identity file /Users/shitaibin/.ssh/id_ed25519 type -1
debug1: identity file /Users/shitaibin/.ssh/id_ed25519-cert type -1
debug1: identity file /Users/shitaibin/.ssh/id_xmss type -1
debug1: identity file /Users/shitaibin/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.9
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.4 pat OpenSSH_7.0*,OpenSSH_7.1*,OpenSSH_7.2*,OpenSSH_7.3*,OpenSSH_7.4*,OpenSSH_7.5*,OpenSSH_7.6*,OpenSSH_7.7* compat 0x04000002
debug1: Authenticating to 47.88.217.222:22 as 'nameXXX'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY

Google一下,

  • 原因:MTU太大了,造成了丢包。
  • 方案:把MTU改小,服务器和本机最好都修改,因为无论哪一方的报文再大被丢包都会造成连接失败。
1
sudo ifconfig eth0 mtu 1200

1
echo "1460" > /sys/class/net/eth0/mtu

连不上2

使用iterm2保存了机器的Profile,连接的时候报错,在本机ssh命令连接正常,错误如下图:

出现: command not found

  • 原因:iterm的profile配置中,Command那项只显示一行,把它ctrl-a全部拷贝出来,发现不仅ssh vnt@47..123,后面还多了2行ip,启动的时候把ip当命令发给服务器,导致出现了此错误。
  • 方案:修改Command只包含ssh命令。

连接断开

都是国外服务器,通信延迟有点高,ping一下,延迟都在300ms以上,经常操作着就卡住了,然后一会报错:packet_write_wait: Broken pipe

  • 原因:通信不好造成连接断开。
  • 方案:加心跳配置。

服务器端或客户端其中一边加就行了,优先加客户端,因为我Mac经常连各种服务器:

文件:~/.ssh/config

1
ServerAliveInterval 60

如果服务器被多人连,服务器端也得设置:

文件: /etc/ssh/sshd_config

1
ClientAliveInterval 60

channel是大家在Go中用的最频繁的特性,也是Go最自豪的特性之一,你有没有思考过:

  • Why:为什么要设计channel?
  • What:channel是什么样的?
  • How:channel是如何实现的?

这篇文章,就来回答这3个问题。

channel解决什么问题?

在Golang诞生之前,各编程语言都使用多线程进行编程,但多线程复杂、混乱、难以管理,对开发者并不是多么友好。

Golang是Google为了解决高并发搜索而设计的,它们想使用简单的方式,高效解决并发问题,最后做成了,然后又把Golang开源了出来,以及到处推广,所以Golang自从诞生之初,就风风火火。

从Golang文档中,我们可以知道,为啥Golang设计了channel,以及channel解决了什么问题?

Go Concurrency Patterns:

Concurrency is the key to designing high performance network services. Go’s concurrency primitives (goroutines and channels) provide a simple and efficient means of expressing concurrent execution. In this talk we see how tricky concurrency problems can be solved gracefully with simple Go code.

Golang使用goroutinechannel简单、高效的解决并发问题,channel解决的是goroutine之间的通信

channel是怎么设计的?

我们以为channel是一个通道:

实际上,channel的内在是这样的:

channel设计涉及的数据结构很简单,这就是channel的本质

  • 基于数组的循环队列,有缓冲的channel用它暂存数据
  • 基于链表的单向队列,用于保存阻塞在此channel上的goroutine
  • 锁,用于实现goroutine对channel并发安全,保证某一时刻只有1个goroutine操作channel,

我本来想自己码一篇channel的设计文章,但已经有大牛:Kavya深入分析了Channel的设计,我也相信自己写的肯定不如他好,所以我把Kavya在Gopher Con上的PPT推荐给你,如果你希望成为Go大牛,你一定要读一下,现在请收藏好

Kavya在Gopher Con上的演讲主题是:理解channel,他并不是教你如何使用channel,而是把channel的设计和goroutine的调度结合起来,从内在方式向你介绍。这份PPT足足有80页,包含了大量的动画,非常容易理解,你会了解到:

  • channel的创建
  • 各种场景的发送和接收
  • goroutine的调度
  • goroutine的阻塞和唤醒
  • channel和goroutine在select操作下

Kavya的PPT应该包含了channel的80%的设计思想,但也有一些缺失,需要你阅读源码:

  • channel关闭时,gorontine的处理
  • 创建channel时,不同的创建方法
  • 读channel时的非阻塞操作

PPT在此:Understanding Channels,如果你有心,还可以在这个网站看到Kavya关于goroutine调度的PPT,福利哦😝。(访问不了请翻墙,或阅读原文从博客文章最下面看Github备份)

微信二维码跳转:

channel是怎么实现的?

chan.go是channel的主要实现文件,只有700行,十分佩服Go团队,实现的如此精简,却发挥如此大的作用!!!

看完Kavya的PPT,你已经可以直接看channel的源码了,如果有任何问题,思考一下你也可以想通,如果有任何问题可博客文章留言或公众号私信进行讨论。

另外,推荐一篇在Medium(国外高质量文章社区)上获得500+赞的源码分析文章,非常详细。

文章链接:Diving deep into the golang channels

微信二维码跳转:

我学到了什么?

阅读channel源码我学到了一些东西,分享给大家。

channel的4个特性的实现:

  • channel的goroutine安全,是通过mutex实现的。
  • channel的FIFO,是通过循环队列实现的。
  • channel的通信:在goroutine间传递数据,是通过仅共享hchan+数据拷贝实现的。
  • channel的阻塞是通过goroutine自己挂起,唤醒goroutine是通过对方goroutine唤醒实现的。

channel的其他实现:

  • 发送goroutine是可以访问接收goroutine的内存空间的,接收goroutine也是可以直接访问发送goroutine的内存空间的,看sendDirectrecvDirect函数。
  • 无缓冲的channel始终都是直接访问对方goroutine内存的方式,把手伸到别人的内存,把数据放到接收变量的内存,或者从发送goroutine的内存拷贝到自己内存。省掉了对方再加锁获取数据的过程。
  • 有缓冲的channel在缓冲区空时,接收数据的goroutine无法读数据,会把自己阻塞放到接收链表,当发送goroutine到来时,发送goroutine直接使用sendDirect把数据放到第一个阻塞的接收goroutine,然后把它唤醒。recvDirect在有缓冲区通道的情况,反过来。
  • 接收goroutine读不到数据和发送goroutine无法写入数据时,是把自己挂起的(创建一个节点,插入到双向链表的尾部),这就是channel的阻塞操作。阻塞的接收goroutine是由发送goroutine唤醒的,阻塞的发送goroutine是由接收goroutine唤醒的,看goparkgoready函数在chan.go中的调用。
  • 接收goroutine当channel关闭时,读channel会得到0值,并不是channel保存了0值,而是它发现channel关闭了,把接收数据的变量的值设置为0值。
  • channel的操作/调用,是通过reflect实现的,可以看reflect包的makechan, chansend, chanrecv函数。
  • channel关闭时,所有在channel上读数据的g都会收到通知。其实并非关闭channel的g给每个接收的g发送信号,而是关闭channel的g,把channel关闭后,会唤醒每一个读取channel的g,它们发现channel关闭了,把待读的数据设置为零值并返回,所以这并非一次性的事件通知,。看到这种本质,你应当理解下面这种奇淫巧计:这种“通知”效果并不一定需要接收数据的g先启动,先把channel关闭了,然后启动读取channel的g依然是可行的,代码无需任何改变,任何逻辑也都无需改变,它会发现channel关闭了,然后走原来的逻辑。

如果阅读chan_test.go还会学到一些骚操作,比如:

1
2
3
if <-stopCh {
// do stop
}

而不是写成:

1
2
3
if stop := <-stopCh; stop {
// do stop
}

这就是关于channel的设计和实现的分享,希望你通过Kavya的PPT和代码阅读能深入了解channel。

链接

  1. 如果这篇文章对你有帮助,不妨关注下我的Github,有文章会收到通知。
  2. 本文作者:大彬
  3. 如果喜欢本文,随意转载,但请保留此原文链接:http://www.lessisbetter.site/2019/03/03/golang-channel-design-and-source/
关注公众号,获取最新Golang文章

通过ps及top命令查看进程信息时,看不到进程的绝对路径,可以使用:sudo ls -l /proc/PID查看。

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有该进程的信息,其中包括一个名为exe的文件即记录了绝对路径。

解决的问题

发现服务器上并没有运行耗CPU的服务,但top查看时,总存在占用CPU 60%的进程,kill一段时间后,又会出现新进程,名字变化而已,并且名字类似系统服务的名字,怀疑是恶意程序(挖矿木马)。

找到创建该进程的父进程,杀死父进程后,再杀死此恶意程序,最后从磁盘删除。

在top中,按f选择要显示的列,通过向下箭头找到PPID,按空格选中,按q退出,看到恶意进程的父进程。

或使用ps -ef | grep 进程号/程序名,第3列为父进程。

这是一个收藏夹,收藏每一篇都仔细阅读过的好文章。

语言

Go

  1. 曹大:Go 系列文章5 : 定时器,相当深刻,学完还讨论了一下

分布式

并发

  1. 当我们在谈论高并发的时候究竟在谈什么?

分布式一致性

  1. 分布式系统中的网络模型和故障模型
  2. 分布式系统一致性的发展历史 (一)
  3. 分布式系统一致性的发展历史 (二)
  4. etcd Raft库解析
  5. etcd raft 设计与实现《一》
  6. etcd raft 设计与实现《二》
  7. Raft在etcd中的实现

网络

P2P

  1. DHT 分布式哈希表

工具

Git

Linux

云原生

Docker

  • kubelet之cri演变史,介绍了docker的演变,同时也就能清楚为何现在containerd和docker(engine)能平起平坐了,k8s这是要把docker(engine)直接踢出去了。

Kubernetes

K8s Operator

各位学习Go语言的朋友,周末好,这次跟大家聊一聊Go语言的一个高级话题:反射。

这篇文章是从我过去的学习笔记修改来的,内容主要来自Go Blog的一篇文章《The law of reflection》。

这篇文章主要介绍反射和接口的关系,解释内在的关系和原理

反射来自元编程,指通过类型检查变量本身数据结构的方式,只有部分编程语言支持反射。

类型

反射构建在类型系统之上,Go是静态类型语言,每一个变量都有静态类型,在编译时就确定下来了。

比如:

1
2
3
4
type MyInt int

var i int
var j MyInt

i和j的底层类型都是int,但i的静态类型是int,j的静态类型是MyInt,这两个是不同类型,是不能直接赋值的,需要类型强制转换。

接口类型比较特殊,接口类型的变量被多种对象类型赋值,看起来像动态语言的特性,但变量类型始终是接口类型,Go是静态的。举例:

1
2
3
4
5
var r io.Reader
r = os.Stdin
r = bufio.NewReader(r)
r = new(bytes.Buffer)
// and so on

虽然r被3种类型的变量赋值,但r的类型始终是io.Reader

最特别:空接口interface{}的变量可以被任何类型的值赋值,但类型一直都是interface{}

接口的表示

Russ Cox(Go语言创始人)在他的博客详细介绍了Go语言接口,结论是:

接口类型的变量存储的是一对数据

  1. 变量实际的值
  2. 变量的静态类型

例子:

1
2
3
4
5
6
var r io.Reader
tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
if err != nil {
return nil, err
}
r = tty

r是接口类型变量,保存了值tty和tty的类型*os.File,所以才能使用类型断言判断r保存的值的静态类型:

1
2
var w io.Writer
w = r.(io.Writer)

虽然r中包含了tty和它的类型,包含了tty的所有函数,但r是接口类型,决定了r只能调用接口io.Reader中包含的函数。

记住:接口变量保存的不是接口类型的值,还是英语说起来更方便:Interfaces do not hold interface values.

反射的3条定律

定律1:从接口值到反射对象

反射是一种检测存储在接口变量中值和类型的机制。通过reflect包的一些函数,可以把接口转换为反射定义的对象。

掌握reflect包的以下函数:

  1. reflect.ValueOf({}interface) reflect.Value:获取某个变量的值,但值是通过reflect.Value对象描述的。
  2. reflect.TypeOf({}interface) reflect.Type:获取某个变量的静态类型,但值是通过reflect.Type对象描述的,是可以直接使用Println打印的。
  3. reflect.Value.Kind() Kind:获取变量值的底层类型(类别),注意不是类型,是Int、Float,还是Struct,还是Slice,具体见此
  4. reflect.Value.Type() reflect.Type:获取变量值的类型,效果等同于reflect.TypeOf

再解释下Kind和Type的区别,比如:

1
2
3
type MyInt int
var x MyInt = 7
v := reflect.ValueOf(x)

v.Kind()得到的是Int,而Type得到是MyInt

定律2:从反射对象到接口值

定律2是定律1的逆向过程,上面我们学了:普通变量 -> 接口变量 -> 反射对象的过程,这是从反射对象 -> 接口变量的过程,使用的是ValueInterface函数,是把实际的值赋值给空接口变量,它的声明如下:

1
func (v Value) Interface() (i interface{})

回忆一下:接口变量存储了实际的值和值的类型,Println可以根据接口变量实际存储的类型自动识别其值并打印。

注意事项:如果Value是结构体的非导出字段,调用该函数会导致panic。

定律3:当反射对象所存的值是可设置时,反射对象才可修改

从定律1入手理解,定律3就不再那么难懂。

Settability is a property of a reflection Value, and not all reflection Values have it.

可设置指的是,可以通过Value设置原始变量的值。

通过函数的例子思考一下可设置:

1
func f(x int)

在调用f的时候,传入了参数x,从函数内部修改x的值,外部的变量的值并不会发生改变,因为这种是传值,是拷贝的传递方式。

1
func f(p *int)

函数f的入参是指针类型,在函数内部的修改变量的值,函数外部变量的值也会跟着变化。

使用反射也是这个原理,如果创建Value时传递的是变量,则Value是不可设置的。如果创建Value时传递的是变量地址,则Value是可设置的。

可以使用Value.CanSet()检测是否可以通过此Value修改原始变量的值。

1
2
3
4
5
6
7
x := 10
v1 := reflect.ValueOf(x)
fmt.Println("setable:", v1.CanSet())
p := reflect.ValueOf(&x)
fmt.Println("setable:", p.CanSet())
v2 := p.Elem()
fmt.Println("setable:", v2.CanSet())

如何通过Value设置原始对象值呢?

Value.SetXXX()系列函数可设置Value中原始对象的值。

系列函数有:

  • Value.SetInt()
  • Value.SetUint()
  • Value.SetBool()
  • Value.SetBytes()
  • Value.SetFloat()
  • Value.SetString()

设置函数这么多,到底该选用哪个Set函数?
根据Value.Kind()的结果去获得变量的底层类型,然后选用该类别的Set函数。

参考资料

  1. https://blog.golang.org/laws-of-reflection
  1. 如果这篇文章对你有帮助,不妨关注下我的Github,有文章会收到通知。
  2. 本文作者:大彬
  3. 如果喜欢本文,随意转载,但请保留此原文链接:http://lessisbetter.site/2019/02/24/go-law-of-reflect/
关注公众号,获取最新Golang文章

Hi,各位老朋友、新朋友,好久不见,按照之前的规划,本次专题是书籍推荐,主要包含3类:

  1. Go语言技术书籍和资料
  2. 开发人员综合技能书籍
  3. 团队协作书籍

Go语言技术书籍和资料

Effective Go

每一个Golang开发人员都应当把Effective Go多读几篇,它能帮助你理解Go、掌握Go,培养Go思维,用Go的思维去解决问题,而不是利用你已有的编程(C/C++/Java/Python)思维去写Go代码,防止写出蹩脚、笨拙的Go代码。

你可以从这篇文章中理解:

  • 代码格式化
  • 注释
  • 命名
  • Go语法

链接:https://golang.org/doc/effective_go.html

Go语言圣经

这是一本很好的Go语言书籍,有中文版并且开源,可以网上阅读或下载PDF。如果你的英文不是特别好,这本书可以帮助你快速入门Go语言。

链接:https://legacy.gitbook.com/book/yar999/gopl-zh/details

Google

Google即不是书籍也不是资料,但是在查找Golang资料中最有用的工具,并且能找到很好、很有用的Go英文资料。搜索的正确姿势是:“golang topic”,优先看Golang官方(*.golang.org)的资料。比如我要学习reflect相关的知识,我会先看Golang博客的文章:

综合技能

软技能 代码之外的生存指南

技术之外必读的一本书,在理财文章推荐提到的,我们作为一个人,需要注重的是全面的发展,不能只关注技术能力的建设。《软技能》从职业篇、自我营销篇、学习篇、生产力篇、理财篇、健身篇、精神篇等7个方面,介绍软件行业从业人员所需的代码之外的技能,以及如何培养。

高效能人士的7个习惯

如果你想在职业发展走的顺利,你必须注重工作效率。这本书的帮助其实不仅仅是工作,而是个人的方方面面都可以得到效率的提升。

团队协作书籍

除了个人开发者除外,我们大多数技术人都在团队之中,团队合作和生产效率是至关重要的话题。

很多公司的研发流程都采用敏捷,尤其是科技巨头,如果你们已经采用了敏捷,或者即将采用敏捷,我建议好好读下下面这2本书。对于团队,带来的不仅仅是团队效率的提升,还有更高的软件质量、更高的生产力等等,对于个人,你的综合能力能不断提升,在团队中出类拔萃。

学习敏捷 构建高效团队

非常好的敏捷入门书籍,带你理解敏捷思维和实践,以及介绍多种敏捷方法,比如Scrum、XP(极限编程)、看板、精益,这些思维,绝对能帮助你成为更出色的工程师,为你如何搭建一支高效的研发团队提供一些思路。

敏捷革命

Scrum是使用最多的敏捷方法,这本书由Scrum敏捷之父编写,这个老头人生经历很牛,西点军校 -> 越战飞行员 -> 学术界 -> 工业界,他从他的经历介绍了Scrum是如何建立起来的, 这本书能帮你更好的理解和运用Scrum。

人生

人生的智慧

这是叔本华的封笔之作,这本书的价值就如它的副标题《如何幸福度过一生》,读完之后,你的人生观必有新的认知。

长寿的代价

作者:约翰·利兰(John Leland),副标题:我和六位老人共处的一年,我更喜欢这本书的英文标题《Happiness Is A Choice You Make》,它的主题是幸福,中文标题实在是议残了,看起来主题是长寿所要承担的问题。

这本书讲的6个80岁以上老人的真实生活,非常的朴素与真实,书的内容是长寿老人所遭遇的痛苦,以及更重要的是为什么他们认为比年轻时更幸福、更快乐。

《人生的智慧》是幸福论,是如何幸福的方法论,而《长寿的代价》是真实有力的故事,它不像《人生的智慧》那么全面,但它更加丰满和真实,它和《人生的智慧》相辅相成。

  1. 如果这篇文章对你有帮助,不妨关注下我的Github,有文章会收到通知。
  2. 本文作者:大彬
  3. 如果喜欢本文,随意转载,但请保留此原文链接:http://lessisbetter.site/2019/02/16/book-recommend-1
关注公众号,获取最新Golang文章

--debug:日志显示文件和行数

1
2
3
geth --debug --datadir node0 [其他参数]

INFO [02-01|14:59:47|miner/worker.go:539] Commit new mining work number=1 txs=0 elapsed=628.966µs

--pprof:节点开启http服务用来显示prof信息,网址和端口可以通过--pprofaddr, --pprofport指定,默认是127.0.0.1:6060

1
geth --pprof --datadir node0 [其他参数]

打开网址:http://127.0.0.1:6060/debug/pprof/

春节就要到了,每到年末就非常适合总结、反思,思考过去一年的成长(就),过去一年的收获,过去一年的改变,所以接下来两三周的时间,我想给大家分享一些技术以外的思考。

这次先跟大家分享关于未来的思考,职业目标和规划决定了你以后的职业高度、职业角色,你本来想成架构师、技术VP、CTO,结果就是没有了结果。

后面可能分享理财和读书等方面的思考,因为技术人,首先是一个人,那必然就有生活,生活就需要money,你不理财,最后只能一穷二白,辛辛苦苦一年的劳动,可能所剩无几,甚至负数了,几年后别人过着舒服的生活了,而你还在苦逼的挤公交、地铁。

读书是获取知识最廉价的方式,知识改变命运不是闹着玩的,读大学没用这些言论是扯淡的,你看那些CEO、CTO,或者你身边的非常牛的人,哪个不读书?如果你不喜欢读书,大概是心里没有目标,没有找到自己喜欢的书。

预告到此打住,如果希望读到理财和读书的文章的话,在春节期间,记得关注文章推送,不妨给一起学Golang加星标

技术人有哪些角色/岗位?

技术人常说自己是靠手艺、靠技术吃饭的,最初只是开发/测试/运维工程师,后面一路打怪升级,经历高级、资深工程师到达首席架构师、技术总监、技术VP、CTO,这些顶级的技术角色,哪些才是你的未来?

如果你热爱技术,愿意靠技术生活,或者立志使用技术改变世界,你可能就会走到上面列出的技术岗位,你是否想过你的未来在哪?

如果你想到了,你是否了解这些不同岗位的区别,以及需要的能力?

架构师

架构师是一个公司的核心技术人员,是公司技术团队中的技术佼佼者,对架构师主要要求是技术能力。

如果你喜欢深入研究技术,架构师就是你很好的目标。

首席架构师

首席架构师应当是公司技术最牛的人,但同时是公司所有架构师的管理人,需要有一定的人员管理能力,所以首席架构师的主要能力栈是:

  1. 技术能力
  2. 人员管理能力

如果你深入研究技术,能用技术解决公司遇到的业务难题,还具备一些人员管理能力,不妨在成为架构师后,将目标再提升1个level,成为公司首席架构师。

技术总监

技术总监这个岗位,一般在大、中公司才有,它是技术和管理能力比较均衡的1个岗位,技术上不如某些架构师、首席架构师,但管理能力要比架构师高,它的主要能力栈和架构师相同:

  1. 技术能力
  2. 人员管理能力

如果在技术圈摸爬滚打了一段时间,发现自己擅长沟通、上下级管理、员工心理、决策能力强,也许你的目标可以设定为技术经理或技术总监。

技术VP

技术VP(副总裁)更是公司规模比较大时才有的技术岗位,技术VP是CTO的副手,公司只有1个CTO,但通常有多个技术VP,负责公司不同业务的技术,技术VP管着多个技术总监。技术VP也是技术出身,但比技术总监高一个level,除了技术能力和人员管理能力外,还要求技术VP有很强的体系搭建能力,体系搭建是一个很复杂的能力,总结来讲就是要管事的能力,比如要管理研发质量、进度、节奏、人员等等。

技术总监的主要能力栈:

  1. 技术能力
  2. 人员管理能力
  3. 体系搭建能力

如果你发现自己技术够牛,也能带人,还能管事,技术VP绝对会是一个非常好的目标,但是你估计头都大了,怎么要管这么多🙂。

CTO

只要带O的都很了不起,想想CEO、COO、CFO等等,CTO是一个公司的直接技术负责人,出了问题CEO可是要拿CTO是问的,而不是那群技术VP,CTO要和各种O沟通,要让整个技术团队,用技术把产品做出来,跟上业务的脚步。

CTO是个多面手,他的主要能力栈:

  1. 很强的技术能力,尤其在创业早起,必须撸起袖子带所有人一起干,但是CTO的技术不能是最牛的,公司稳定后,他需要分配更多的精力负责技术团队的各项事务,如果CTO技术是最牛的,他必然是整个技术团队的瓶颈。
  2. 很强的体系建设能力,虽然hold的事情没有技术VP细,但各种都抓。
  3. 很强的人员管理能力,然每一个技术人员,尤其是技术管理人员发挥十倍、百倍的能力,建设强大的团队。
  4. 很强的文化建设能力,公司大了,公司的技术文化,决定了员工在没有管理时的状态,是游手好闲,还是聚焦工作。
  5. 很强的领导力,易观CTO郭炜给领导力一个通俗易懂的解释,把事办成的能力,就是从0到1的能力,公司需要的是完整可用的产品,最后只做到了0.99都不是完整的产品。

如果你立志要成为一个CTO,那你要充分利用时间,跟时间赛跑,不断的学习/迭代各种能力。

关于领导力,我根据郭炜的描述,做了一个导图,把一个大的、复杂的能力拆解,感觉目标就清晰了。


根据领导力300讲文章《技术领导力就是“成事”的能力》制作

也许我上面的文章不一定准确,甚至有些地方不一定对,但这不重要,重要的是你如果还没有职业目标和职业规划,反思一下你是否喜欢技术,是否希望在技术上长期发展?如果答案是肯定的,你应当为自己负责,设定一个目标和一个实现目标的计划。

附录

如何找到自己的兴趣和能力

兴趣、能力和我们的职业目标有什么关系?关系大了去了。你不喜欢coding,就写不出高质量的代码,你不喜欢钻研技术,就成不了架构师,你不喜欢业务,就无法成为技术管理者,你不喜欢“事多”就成不了技术VP、CTO。

基于自己的兴趣和能力,设定最适合自己的目标,这样才能让目标实现

But很多人都有一个特(问)点(题),不了解自己。你问他“你喜欢做什么?”,通常哑口无言,啥也说出来。那我教你,如何发现自己的兴趣或者能力。

把下面这几个问题问自己,每个思考5分钟,如果第一个没有答案,就看下一个:

  1. 我擅长做什么?
  2. 我得到表扬的工作是什么?
  3. 我最经常做的是什么?
  4. 在你过去1年的工作中,我做的最好的3件事是什么?

如果第4个还没有答案,我建议你给自己一段时间,了解自己,从今天开始写成功日记,每天写一个,记录自己今天做的好的事情,不论工作还是生活。

每月回顾过去的成功日记,其中写的最多的就是你的特长,也许你一两个月就发现自己擅长的事情,也许要半年,也许要1年,但终究你能发现自己的能力,那时你会更加自信。

文章不精,希望你有所收获。

写在最后

其实,我对自己的了解还不够深入,这是我必须坦诚的。但我们对自己的了解程度,和对世界的认知,这种“内在”的认知,会通过我们日常的行为映射出来,体现在我们的待人接物,同样也会决定着我们人生的高度、工作的高度。

想让自己的思想和视野站上一个更高的高度,我购买了极客时间《技术领导力300讲》这个课程,听、读了很多CEO、CTO等的观点后,想输出下,这篇文章的主要内容是我读郭炜的《你的能力模型决定你的职位》这篇文章“贩卖”出来的,不如原文好,为了避免广告嫌疑,我不在此放分享链接了。真心想读的朋友,可以后台私信,我发给你。极客时间分享的文章最多能被10个人阅读,所以只发给前10个留言的朋友。

  1. 如果这篇文章对你有帮助,不妨关注下我的Github,有文章会收到通知。
  2. 本文作者:大彬
  3. 如果喜欢本文,随意转载,但请保留此原文链接:http://lessisbetter.site/2019/01/27/choose-your-career/
关注公众号,获取最新Golang文章

我专注区块链技术,让技术为业务服务,在业务应用知识方面还不是行家里手,所以这里只做文字的搬运工,具体讲解就得和我们云象合作业务的VNT Chain了,它们把复杂的商业原理,用一篇文章做了通俗易懂的解释,解释了行业痛点,以及如何使用区块链解决痛点,在某些应用场景上,云象已经走在了行业前列,所以文章中也包含云象的案例。

陆续会有很多期,请阅读自己感兴趣的文章:

  1. 区块链+数字版权
  2. 区块链+跨境支付
  3. 区块链+供应链金融
  4. 区块链+信用证
  5. 区块链+福费廷,福费廷业务历史久远,银行在国际贸易买卖双方的中间,诸多的不透明因素增加银行的风险,国内多家银行使用区块链重塑了福费廷业务,只有当买卖双方都参与进来,才能更好的塑造基于区块链的福费廷业务

云象在区块链上的解决方案有:

  • 数字存证
  • 贸易金融
  • 股权交易
  • 发审监管
  • 供应链金融
  • 资产证券化

更多内容,请查看云象区块链网站

区块链诞生之初就和金融有着某种“天然”的联系,今天就聊一下区块链的一个应用场景:区块链在资产证券化中的利用。

什么是资产证券化?

资产证券化是指以基础资产未来所产生的现金流为偿付支持,通过结构化设计进行信用增级,在此基础上发行资产支持证券(Asset-backed Securities, ABS)的过程。

不了解金融的朋友可能对资产证券化不熟悉,甚至根本没听说过。我就用我的粗浅理解为技术朋友介绍下,先看证券,大家多少对股票、债券多少有些了解,它们都属于证券,是证券中的某一个类别。那什么又是资产呢?通俗的来讲能拿来做抵押的就是资产。用大白话讲资产证券化就是:贷款人把能产生未来现金流的资产转变为证券换取贷款的融资方式

ABS和普通人的关系

18年这么火的P2P你参与了么?这里也有资产证券化,如果你在P2P平台投了钱,你则是投资人,你在P2P平台借了钱,则是债券人。

还有就是,你租商场的商铺、车位了么?商场把商铺、车位这些作为基础资产,这些资产通过出租等能有稳定的未来收益,然后卖给你,从你手里拿钱,继续去运营,每年给分红,到期买回之类的,虽然没有进行证券化,但总体的原理是一致的,你清楚里面的流程么?你想想你的身边有没有人买了商铺,最后商场跑路了?

资产证券化的流程

我把资产证券化的流程进行了抽象和简化,实际比这复杂的多,整个过程有:

  • 债权人,拥有基础资产,期望获得资金
  • 受托人,不一定是银行,比如P2P公司
  • 投资者,任何手里有闲钱进行投资的人
  • 基础资产,能够产生未来现金流的资产

一图胜前言,看下图:

债权人把基础资产拿出来,向受托人(机构)证明资产是可以产生未来现金流的,受托人也要辨认这个基础资产到底好不好,然后用你好的基础资产发行证券(债券),把证券卖给投资人,说这个资产很好,贷款企业可以按时产生现金流,非常稳定,吹了不少,然后你感觉不错就投资了,资金进了受托人口袋,然后,受托人把钱再带给债权人,从中赚取利息。

资产证券化的问题

如果投过P2P,相信大家一定不会忘记2018年P2P的炸雷,这其中暗藏着许多风险,根本就不是普通投资者能看到的:

  1. 贷款企业信用是否良好?怎么证明?基础资产是否真实?能否产生稳定的现金流?
  2. 担保企业信用等级如何,如果贷款企业不能还款,担保企业能不能还款?
  3. 受托机构信用等级好不好?资产的评级是否准确、合理?这其中有没有猫腻?
  4. ……

问题再归类:

  1. 信用问题
  2. 透明问题
  3. 真实性问题
  4. ……

不易监管,问题积累,增加风险,导致暴雷,所以政府说了,我们要稳金融,稳金融就得控制风险

资产证券化牵手区块链

作为一个技术人,我们虽然无力直接参与稳金融,但是,我们可以从技术角度思考下,是不是又解决、优化的办法呢?

区块链有去中心化、去信任、不可篡改、可靠的特性,可以解决当前ABS的一些问题,比如:

  1. 使用区块链放篡改和溯源的能力,解决信任问题、基础资产虚假有效的问题
  2. 使用使用区块链可以连接参与ABS的多方主体,提高信息共享,提升业务效率
  3. 区块链的透明对于国家监管也特别有利
  4. 资金流动的地方就有清算,各ABS参与方很容易通过区块链进行清算

云象区块链资产证券化解决方案

云象区块链作为区块链行业的领先者,依托多年的区块链技术积累,推出了云象区块链ABS解决方案,目标是通过价值互联网盘活基础资产,基于区块链技术建立标准的数据流转体系、协同方式和披露办法,提高资产端与资金端对接效率,帮助投资者穿透基础资产和回款状态,对盘活基础资产具有十分重要的意义。

想了解云象区块链ABS解决方案?戳这里!

技术人讲业务,难免有不准确的地方,如果不对请重喷!

扩展阅读

如何用“区块链+稳定币”技术来提升资产证券化市场运作效率