無標題文檔

使用多个版本交叉编译 Golang 项目

在编写内部项目中,往往不同的项目因为历史遗留问题,会有存在多个版本的 golang 编译器共存的情况。

同时,由于 golang 的包管理的短板(虽然在 golang 1.11 以后推出了 go mod),因此不可避免的安装 govendorgo dep 等多个包管理工具,非常的混乱。

本地使用多个 golang 的编译器版本其实更容易造成混乱,同时 env 满天飞也非常不方面维护。解决这块的问题很容易就想到了使用 Docker 去编译和检查本地项目, Docker 官方维护了多个版本的 golang 镜像

那么考虑的目标是:

  1. 使用同一个 Makefile 以及 Dockerfile 去维护项目的编译
  2. 因为 golang 1.11 以后官方推出了 go mod,所以尽量使用官方的包管理工具
  3. 接上条,老版本的依赖和本地编译使用 go mod vendor 去管理
  4. Makefile 不管 golang 编译器的版本问题,编译器版本让 Dockerfile 去管理
  5. 本地环境尽量使用最新版本的 golang 编译器,然后导入到 vendor 中

那么这样子,我们可以简单的使用 Dockerfile 去编译执行,例如下面使用编译器版本 golang 1.9.7 类似:

FROM golang:1.9.7 AS builder
# ...
RUN go build .
# ...

但需要注意的是,golang 1.11 之前必须代码在 $GOPATH 中,所以需要映射

ENV GOPATH /go
ENV GOROOT /usr/local/go
ENV PACKAGE ${YOUR_PACKAGE_NAME}
ENV BUILD_DIR ${GOPATH}/src/${PACKAGE}

# ...
COPY . ${BUILD_DIR}

然后在本地使用 go mod vendor 下载依赖包到项目的 /vendor 就可以在老版本中免去使用 dep、govendor 等依赖工具,统一使用官方的 go mod 去管理和下载依赖。

还有需要关注的是 Makefile 需要加个判断,为了增加通用性,建议根据路径判断 golang 的环境路径,而不是判断是否在 Docker 环境下:

# ...
ifneq ("$(wildcard /go)","")
    GOPATH=/go
    GOROOT=/usr/local/go
endif

GO=env $(GO_ENV) $(GOROOT)/bin/go

# ...

build:$(DIR_SRC)/main.go
    @$(GO) build $(GO_FLAGS) -o $(BIN) $(DIR_SRC)

这样子 Makefile 文件就可以同时同于本地高版本的环境以及 Docker 编译环境了。

详细的示例代码可以参看 这个简单的项目(作用只是用于生成随机密码),其中的 Makefile 以及 Dockerfile

最后,有个讨论 vendor 目录到底要不要纳入到版本控制中?我个人的看法是看情况,大部分情况下不会将这些第三方代码纳入版本控制中。主要的理由有:

  1. 这些代码是第三方库的代码,不会直接更改以及维护;
  2. go.mod 以及 go.sum 文件已经保存了第三方依赖的库信息(版本、hash 等等);
  3. 库文件通常会很多,纳入这些的文件会「污染」本地的 git history;
  4. 不同于开源项目,我们本地的开发环境是可控的。

所以,类似的 Consul 等比较大型的项目还是会将 vendor 目录纳入到版本控制中,个人认为这也是因为兼容方面的考虑更多些,而如果个本地项目往往环境是可控的。

- eof -

技术人员如何做好职级晋升答辩

三月即将过去四月份即将到来,很多公司年后的职级晋升安排即将结束。

同时,晋升的结果也将陆陆续续公布出来。几家欢喜几家愁,晋升成功的同事自然值得祝贺,没有过的同事也不要气馁再接再励。

对于技术人员而言,普遍有个很共通的现象,就是往往过于深入技术,忽略了平时对于沟通等所谓「软性素质」的培养和意识,造成可能无法表现出自己真正能力。下面,说说我对职级晋升的一些认知以及经验。

准备阶段

内容控制

通常来说,职级晋升是对去年整年的总结以及回顾,因此从时间的角度上考虑,答辩的内容应该尽量控制在这一年的区间范围内。当然,如果有项目的时间跨度比较长的,应该说明原因同时更需要说明自我在此项目中起到的作用。

往往,主管也答辩人都会犯一个错误,就是将「认为很厉害」的内容和技术点作为答辩的内容,这往往是有偏差的。答辩的内容选题应该从目标职级的角度出发,从目标职级考虑选送的答辩内容是否适合这个职位。

同时,需要根据答辩的时间(自述通常不会超过半小时)来确定选题的数量。因此,答辩的选题是非常重要的,往往选题错误就造成答辩方向的错误。

PPT 是门面

从 PPT 设计的角度上说,技术人员在这块的问题很有典型性,就是往往会将大段的代码(或者截图)贴到 PPT 上。

这会让评委对于内容方面会造成一定的困扰:首先,答辩过程中评委不可能对这块代码进行 Review;其次,从摘抄的这段代码来说也不能体现答辩者应有的水平。

所以,正确的做法应该是觉得需要感觉贴代码解释的地方,尽量贴流程图或者架构图或者 UML,如果还是感觉说不清楚那么建议考虑要不要简化和突出这块想要表述的内容。

技术人员的 PPT 还有个问题就是有太多的文字,这往往会造成表意不清晰。所以,个人的经验就是如果这个 PPT 超过了 200 个字,那么就应该考虑精简。

对 PPT 设计方面的技巧在这块不铺开讲述,网络上已经有更翔实的内容可以找到。

思路和角度很重要

同样的事情,去使用不同的角度去表述,往往返回的结果是不一样的。对于技术人员而言,很容易犯的错误就是将事物「描述得平淡无奇」。这让评委在答辩过程中感觉不到你在这个项目中起到的作用,以及你对这块事物的理解。

例如,有做业务的同学描述了很多对于整个系统的业务以及架构方面的设计,甚至业务的流程是如何流转。但是,根据评委的判断这是团队行为和输出,在答辩的描述中没有体现出其个人对于这个业务的思考和沉淀,以及起到的作用的影响。

所以,对于做业务的同学往往会觉得可能在技术的角度来看,光技术会觉得不够深入。但,换个角度考虑如果结合你对业务的理解,并融合到技术中输出技术的解决方案,那么高度就会不一样。

排练、排练、再排练

答辩的过程和时间是很紧凑的,因此在正式开始答辩前,进行自我排练是非常有必要的。如果条件允许,建议答辩人的主管都能把关一轮,往往在排练过程中就会发现各种问题:答辩人讲述 PPT 的时间、语速以及表达方式能力,等等。

答辩过程中

情绪控制

紧张的情绪能够毁掉所有,甚至让你说话都不利索,尤其作为「相对内向」的技术人员,这块是相对普遍存在的。因此,在答辩开始之前就应该控制和放松自己的情绪,不要过于紧张。

如果过于紧张,这里有个 Tips 可以考虑下:就是作为答辩人你可以认为这是一场技术交流,你尝试说明自己所做的工作以及出彩的地方,让对方觉得自己「很厉害」。

从评委侧也应该给予正向引导,例如答辩人进场的时候打个招呼寒暄一下,也会起到比较好的效果。

节奏控制

答辩开始需要自我介绍,建议两三句话讲重点,千万不要拖泥带水同时夹带不必要的信息。一个失败的自我介绍可能就会毁了整个答辩,毕竟这是你给评委的第一印象。

像上面说的,如果觉得很紧张,那么自我介绍的时候可以稍微刻意放慢下语速,可能会起到调节的作用。

从自我介绍转入到正题的转场口白要自然,如果控制不好演讲的技巧(也不知道应该说什么),那么万精油的一句「下面,我开始我的工作内容介绍」。

在表述 PPT 过程中语速尽量使用中速,前面说的如果排练过那根据内容以及语速,就能找到很好的平衡点。

其实还有个技巧,如果某个技术点很深入或者需要探讨,可以将这个点当作个包袱先抖出来,留给评委后面提问的时候解答。

评委的意图

需要意识到的一个点就是,评委问的所有的问题都有其含义的。如果你的回答让他抓不到他想要的点,那么你的得分会不一定很高的。

例如,当评委问你「这个系统设计的时候,你当时考虑了哪些方面」?这个问题其实反映出两个点:其一,就是你刚才答辩描述的时候没有讲透彻,或者说深度还不够;其二,评委需要个抓手需要了解你对这块的个人理解。

所以,当你回答这个问题的时候,无论从什么角度出发,千万千万不要再介绍业务和系统本身的内容了!应该从自己对这个系统的理解和沉淀出发去阐述自己的理解,如果能表达有一定的输出以及对同事和团队的影响就更好。

答辩后

关注结果、Review 自己

评委对于答辩者的评价是主观的,但是相对答辩的过程其实是客观的。这话说起来可能会有点矛盾,但从「师以质疑,友以折疑」的角度出发, 评委的评价是需要去深入理解的。

对于个人而言,晋升答辩是对过去工作的总结和评价,而不是代表对于未来工作的期待和展望。无论是自我表达的原因,也可能是评委理解不同的原因,评委对答辩者的评价都是不同的,这块需要个人辩证得去理解。

换个角度上考虑,如果你当晋升答辩是一场面试,那么这将是很好理解的一场过程了,而且这场面试的还能看到「面试官」对于自己的评价,何乐而不为呢?

资源和环境

当我们上升个高度去考虑职级晋升的时候,往往就不可避免得聊到职业规划和发展这个老生常谈的问题。

无论答辩的结果怎么样,我们更应该考虑以后的发展。首先,考虑的是个人对于自我提升这块,满足了自我的期望和要求没有;然后,再考虑公司能够提供的环境,能否有个上升的正向上升空间?

能够回答这两个问题,那么自然而然,对于职级这块的理解和态度也就是水到渠成的事情了。

-- eof --

再见,丁香园

已经正式从丁香园离开两个月,时间过得很快。

说起来离职的过程并不算是十分得愉快,然而两个月过去了心态也平静了很多,应该可以从初心上去写点文字回忆在丁香园的这段时期。

初心

2010 年的时候,@Fenng 来找我问有个项目你或许可以试试,这家公司的名字叫做丁香园。那时候个人个人在阿里的时候正处在转型期(瓶颈期?),所以抱着聊聊看的心态和创始人 李天天 一起吃了个吃饭。

印象很深,这顿饭吃完了以后,我自己就有感觉是应该为自己的理想和初心去实践些什么。后面的一来二回持续沟通了以后,就做下了这个决定:离开阿里去当时这个没任何名气的小公司见证团队从小到大的过程。

我当时在博客里说明了我离开阿里的想法,私底下很多朋友和同事很不解我的决定。毕竟,在阿里(淘宝)四年的时间不算短,无论个人发展方面还是待遇方面,当时的丁香园是没有任何优势的。

然而,时至今日我还是坚持我这个决定,并不后悔。

技术

在淘宝做了四年的前端,来到丁香园的时候整个公司的技术团队不足十人。技术方面,由于丁香园在前端方面是没有任何的框架以及代码规范可言,业务的高速发展对于优化和重构这块是势在必行的。

现在回过头来想,开始我可能过于理想化以及出于技术方面的思维惯性(说白了就是没经验),还是沿用了淘宝的技术架构。

在前端框架的选型上,使用了淘宝前端团队自己编写的 KISSY,这个后来是个大坑。KISSY 无论在框架的接受程度上还是可维护性、扩展性方面,相比当时业内的通用知名框架没有任何的优势可言。

甚至在一段时间内,我还在和团队的其他前端逐个在说明 KISSY 框架如何使用,乃至至一段时间内都影响到了业务的发展。

悬崖勒马,经过考虑团队还是重新选择到了 jQuery 框架。好在当时的业务高速发展,冗余代码迅速被迭代才没有被后来的绝大多数前端们发现竟然还有这段黑历史 :^)

然而由此带来的影响,再后来 node.js 等推出和成熟,在技术方面的由于前一次的“吃亏”,团队并没有坚持选择非常新的技术。

PHP 作为前端和后台的“粘合剂”,在丁香园的服务器中存在了很久一段时间(至今历史代码还在)。

疲于应付业务和需求技术方面在很长的一段时期是没有任何的规范可言,这可能是小团队的通病。

客户端的兴起,业务驱动个人逐渐技术方面转向了客户端这边。因此,比较遗憾的是前端这边并没有推动太多新的技术和流程,然后又要去挖移动端这个“坑”。

在丁香园的六年多,可以说有 70% 的时间都给了移动端这边:团队、技术、架构、甚至采购。这一切的内容对于我而言都是从零开始,而我也是乐在其中。

期间产品两个 iOS 和 Android 平台的版本分别获得了 App Store 以及豌豆荚的推荐和奖励,这在我个人职业生涯中也是莫大的鼓舞很肯定。

产品的迭代用户数量的攀升,带来了团队的壮大以及需求的不断增长,移动团队在公司十分被重视,各种资源都能够得到满足,有段时间内移动端团队相对于其他技术团队独立,这是好事也是坏事就不详细说。

说回到了技术方面,由于没有 QA 团队,所以在质量保证方面产品团员、开发、甚至运营都需要承担一部分的测试和质量保证工作。

“吃自己的狗粮”

这是团队的传统也是为什么不设 QA 这个职位的初衷。现在看来,这个话题还是颇有争议的,或许可以单独开一篇文章去讨论的。

业务的洗礼、QA 角色的“平均”,所以丁香园在技术方面的选型以及步进是偏向于保守的。

不过期间也做出过尝试,令人感到自豪和欣慰的是 iOS 端(2015年)开始逐渐的迁移到 Swift2,在一段时间内由于这块新技术调整造成产品迭代缓慢,产品和需求方都表示理解。

再后面,Android 也想考虑尝试下例如 Kotlin 等技术,比较遗憾我无法参与其中了,这是后话。

业务

写了一半,可能会招惹非议,略过吧。

团队

回到团队本身,如果说总分有十分,我完全毫无保留得给我们的团队打分九分,留一分让我剩下用岁月慢慢给到你们。

我爱这个团队,我爱团队的每个成员,我爱你们。

很多人崇尚的扁平化、足够的自由度,以及“漠视 KPI”,等看起来很美好的关键词,都或许在这个团队都得以实现。

同时,管理层面的 Sense 就是十分关注组员的成长,无论是技术还是个人方面。团队的信息透明也是我所推崇的,所有的信息都不会被二次咀嚼以后,再分别给到团队分别不同的人。

技术方面,能够给予足够的自由度以及尽可能的尝试,这里回过头来思考可能会抛出好几个问题。例如,如何保证团队的自我驱动能力?新技术的尝试如何保证项目本身的质量和进度?等等。

这些我问题坦白讲,我至今也在继续摸索和求证。

很是感谢在丁香园的几年,在管理方面的很多想法都能得到实践以及总结,团队从小到大的过程并不是所有管理者所能亲身经历。

Fenng 曾经和我说或许如果当时留在阿里待遇方面可能会更加可观,我可以很如实的回答,丁香园给予我的这些经历可能留在阿里这些年都无法换回,感谢这六年。

--

2016 年丁香园发生了些不愉快的事情,管理层的变更、团队的调动以及后续管理者的价值观、技术均无法认同,这是我离开团队的根本原因。

从丁香园离职了以后,我也有过抱着巨大的怨念去回忆以及诉说我的离职过程,现在回过头来想其实十分没必要以及幼稚。然而时至今日,还能听到很多或许有关于我以及团队的刺耳言论,个人有时还是无法控制自己的情感。

爱的深,可能就会更在乎它的每个细节。我现在已经可以自我调节和理智面对,对于那些信息的源头的始作俑者,我只想对你们说,你们是永远都不会 GET 和理解我对这个团队的情感以及初心。它对于我而言不仅仅是我一份工作的证明,怎么可能去伤害。

夏虫不可语冰

再见丁香园,曾经和现在都爱过的。

-- EOF --

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章