我为什么从腾讯离职

现在是2019年7月29日,三天后我将离开工作近七年的腾讯,此时我的内心是平静的。

唯物辩证法中,事物的发展的主要动力来自内因。而我离职的内部因素是:自己在腾讯已工作七载,急切需要走出去看看,寻找一些新的机会,体验不一样的职场人生。七载光阴,白驹过隙,就像我上周发给同事的告别信中所说,入职时青涩的小伙伴两鬓已生华发。这七年来,收获不菲:

  1. 享受了很多平和静谧的编程时光。人生的意义无非是愉悦的渡过一生,对于程序员来说,安心的写代码即是最大的愉悦,是最大的满足。

  2. 可观的经济回报,虽不足以使我大富大贵,财富自由;但亦使我可以立足异乡,赡养双亲。

  3. 职业认同感,在这七年中,自己的能力得到了同事和领导的认可,连续多次的优秀员工是值得自豪的。

  4. 结识了很多志同道合的朋友。

但梁园虽好, 不是久恋之家。世界变化太快,内心已躁动,急切要走出去。留下来的生活是死的,只有走出去才有变活的希望。

唯物辩证法中,事物的发展也受外因的影响。而我离职的外部因素是:

  • 办公环境的恶化。腾讯传统的作风是正直友爱的,但所在部门因为某些空降人员的原因,变了味道,勾心斗角,党同伐异,令人无法安心工作,也是促使我离开的一个原因。

写到这里突然有些伤悲,希望这种不好的作风可以尽快纠正,不要传到整个腾讯。

读《长安十二时辰》

近来一直加班,每日晚归几近凌晨,阅读的书籍越发少了。《长安十二时辰》这部小说是在端午休假之时读的,从晨光熹微读至夜深人静才读完。马伯庸这个作家我是今年才听说的,是看了电视剧《三国机密》之后,一查作者是马伯庸,此人脑洞挺大,名气亦不小,他的作品大多是我感兴趣的历史题材,遂买了这部《长安十二时辰》一读。

整个故事情节较引人入胜,描写了唐代天宝年间一个名不见经传的刑侦人员张小敬拯救长安城,免于一次毁灭的恐怖袭击。恐怖分子分成两波人,第一波在明面上是突厥卫士,第二波是被煽动起来的对唐统治阶层不满的退伍老兵团伙。背后的终极boss还是统治阶层。

突厥卫士只是退伍老兵团伙的炮灰,他们的行动从一开始就注定是飞蛾扑火,他们抱着必死之心来毁灭长安城,对于长安城的唐人来说,或者对于今天的汉人来说,这些突厥卫士是魔鬼,罪有应得。但对于突厥人来说,突厥卫士是为了保卫自己的家人妻儿,因为即将被灭国的是突厥,最终突厥卫士全军覆灭。

退伍老兵曾经也戍守边疆、浴血杀敌,曾经梦想御敌于国门之外,马革裹尸。可他们退伍后发现,他们用自己的鲜血抵挡了外族对他们家人的杀戮,可他们的家人却惨遭同族的贪官污吏、流氓劣绅荼毒。他们投诉无门,只能拿起曾经杀敌的陌刀砍向统治阶层,他们几乎成功了,但最终还是全军覆灭。

统治阶级朱门酒肉臭,内部矛盾激化,其中太子党帝师精心策划了突厥卫士和退伍老兵的恐怖活动,试图火并玄宗、抢班夺权,虽失败,但依然可以告老归家,最终正义缺席。

关于招聘和面试的个人感悟

最近半年部门业务扩展求贤若渴,所以不停的在收集简历和面试,从面试的情况来看,大约有下列三求职者:

  • 第一类:技术娴熟,沟通流畅,基础知识和业务知识都对答如流,并且和部门业务的契合度很高。

  • 第二类:基础知识淡漠,业务知识可以侃侃而谈,中规中矩,没有亮点,也挑不出毛病。

  • 第三类:一些奇葩。或是工作10余年,简历光鲜,但能力甚是平庸者。或是不实诚,不懂装懂,故弄玄虚之徒。等等。

三类人数比例符合正态分布,大部分是第二类人。面试通过的也大多是第二类人中,挑选和团队比较契合的。当今IT行业岗位对人的要求,技术上要求并不高,大多可以做的: “无它,唯手熟耳”。 除了技术以外,软实力也很重要,学习的能力,团队合作能力,沟通和倾听的能力,等等也是招聘中比较看中的。

在面试一些工作10余年的老程序员时,我总是心怀敬意,但可惜的是到目前我遇到为数不少的老程序员并没有展示出应有的技术风采,他们也大多做着平庸的项目,淡忘了技术的根基,望着井口的天叹气,没有办法跳出来。 每到此时,我总是心生悲凉,依稀看到了自己的影子。

我心中理想的面试种子选手应该是:工作2到3年,熟练掌握一门语言C++/Java, 有产品思维,使用google英文,linux玩的6,关心新技术动向。

最后为了回馈大家阅读本文,经总部特批,部门(腾讯杭州: 智能语音&QQ物联)扩大招聘: 安卓客户端开发,C++后台开发,AI实施工程师。名额有限,先到先得,本招聘截至时间到2018年7月1日。

联系方式

Bjarne Stroustrup Previews C++ 17

本文是infoWorld关于C++17对C++之父进行的采访,原文见这里


InfoWorld:C++17什么时候可用?

Stroustrup:C++17将会在2017年的某个时间正式发布,可能是在秋季。主要特性的实现会准时或提前完成。其实有些部分现在已经实现了。

InfoWorld:你认为C++17有哪些重大的新特性?

Stroustrup:如何定义重大呢,假如一个语言特性或者库会影响你对这门语言的看法并且影响你的代码结构,那我认为它就是重要的。按照这个定义,很遗憾,我的答案是: 对于绝大多数人来说,C++17并没有重大的特性。请不要把”C++17并无重大改进”这样的文字加粗或者作为文章的标题,因为这是不准确的、是不必要的煽动。我很看好文件库(file system library)和 并行算法(parallel algorithms)。它们特别有用,会使有些任务变简单,但对于大部分人来说,这并不是重大的特性。

然而,我认为重大的特性以其它的方式存在。一些重大的特性会出现在TS(Technical Specifications)中。比如:concepts, networking, more concurrency stuff, ranges (Standard Template Library 2), modules, coroutines. 它们肯定不会被包含在C++17中,但它们确实存在着。

InfoWorld:C++17的哪些改进对开发者影响最大呢?

  • (parts of) Library Fundamentals TS v1
  • Parallelism TS v1 * File System TS v1
  • Special math functions
  • hardware*interference_size * .is_always_lockfree() * clamp()
  • non-const .data() for string

Stroustrup:这因人而异,因你做的事情而异。对我来说,我认为并行算法是最重要的,文件系统库也是很方便的特性. optional, anystring_view这些基础库中的东西也很重要. 另外STL中其它小的改进也很多. 如果你是搞数学的,那么数学库对你是不可或缺的,现在也都在标准库中了。

InfoWorld:7月份能知道C++17所有的特性(facets)吗?

Stroustrup:我希望可以,2016年6月下旬,我们会在芬兰奥卢确定一些小的提议,比如:

  • Dynamic memory allocation for overaligned data (for better vectorization)
  • Template parameter deduction for constructors (make many”make functions” redundant)
  • constexpr_if (a compile-time if)
  • Refining Expression Evaluation Order for Idiomatic C++ (finally, we can eliminate bugs from people accidentally relying on undefined order of evaluation)
  • Default comparisons (==, !=, <, <=, >, and >=)
  • Operator Dot (smart references)
  • Generalizing the Range-Based For Loop (for sentinel-based and counted ranges)
  • Structured bindings (simple use of multiple return types)

只要不是运气太差,这些都可以确定下来的。当然,投票统计之前所有事情都是无法确定的。标准委员会会争取共识,一张否决票顶五张赞成票。和16年3月份通过的决议比较,假如本次通过了大部分决议那C++17将变得更加有趣。

InfoWorld:随着constexpr lambdas进入C++17,C++是不是朝着函数式编程语言更进了一步。这对开发者有什么影响呢?

Stroustrup:自从1994年STL起,C++平稳而谨慎的增加着函数式编程技术的使用。constexpr lambdas只是编译时特性的一个简单扩展。如果structured bindings的决议C++17通过了的话, 多返回值将被支持,就像一些函数式编程语言的函数一样。

InfoWorld:Concepts这个可以改善编译时诊断的技术,没有被加入C++17是不是一件遗憾的事情?

Stroustrup:对我来说是的,这是个巨大的遗憾。从2004年,我就和Gabriel Dos Reis及其他几个人一起,在这个问题上研究了好几年,并且用Andrew Sutton的实现测试了三年的时间。我觉得可以 正式发布这个特性了,但标准委员会的大多数人因为各种原因不同意。一个Concept是对类型和值的集合的编译时断言(predicate)。我认为“更好的错误提示”是Concept最基础且重要的一个优势:我们可以对 我们泛型函数(模板)的参数设定要求。这样可以促成更好的设计、更好的接口、更高效的代码。

InfoWorld:你能不能回答下,为什么modulesco-routines也不会放到c++17.

Stroustrup:我很乐意看到modules可以更好的防范某些单元上下文中的改变(比如宏)和更好的编译速度,但是提议还没有为C++17准备好,所以只能加进TS了。我想最终modules会变成一个重要的特性。 它解决了C/C++里面长期存在的问题。MS C++(vs2015)和clang的某些版本已经有类似modules的支持。对于co-routines没有直接放到c++17而是放到TS中我很失望。我认为它在一些特殊的场景下很重要(pipelines and generators)。 MS Vc++(vs2015)也集成了这个特性。

InfoWorld:为什么你不延期发布一年,以使conceptsmodulesco-routines等特性可以一起发布呢?

Stroustrup:我以前也被问过这个问题,我回答了no, 我们要保证c++17可以按期发布。一次延期会是一次很不好的先例,会导致后面更多的延期。假如c++17变成c++18, 我想c++20会变成c++22或者c++23。

Android 6.0 Openssl Crash

Android 6.0发布将近半年,预计本月推出正式版本。所以开发者们要重视起APP在Android 6.0下的兼容性问题。最近我们的App就遭遇到因6.0更换了OpenSSL库而导致的一个Crash。

Crash的原因:

异常

1
java.lang.unsatisfiedlinkerror dlopen failed cannot locate symbol "openssl_add_all_algorithms_noconf"

你的产品依赖了openssl,而google在Android 6.0中使用了google自己的一个基于openssl分支boringssl,而这个分支在API和ABI上都不兼容openssl。

Google为什么切换openssl

  1. 众所周知openssl存在着很多的问题,包括去年爆出的Heartbleed。目前依然有大量补丁没有被合入openssl主干,而google觉得其中很多补丁非常重要,所以google创建新的分支合入这些补丁。
  2. google以为这个改动很小,绝大多数开发者是不会受影响的。(但据说google自己的youtube一样受影响,可见google想当然了).
  3. google只对NDK标准接口负责,第三方库的接口,google是不保证的。

你的APK中招了吗?

是不是你还在窃喜自己没有基于NDK开发的so,所以没有依赖openSSL。但你可能使用了第三方的so库,而这些库可能用到了openSSL。所以你的产品可能直接或间接依赖openssl. 这里有一个在线检测工具,可以测试自己是否中招。Find apps with the OpenSSL / Android M crash flaw;

解决方案

  1. 静态链接openssl。优点是一劳永逸的解决问题,缺点是APK的增大size。
  2. APK中打包libssl.so、libcrypto.so。如果你依赖的第三方库依赖了openssl, 而你没有权限去改它的代码,这是你唯一的解决方法。同样有size的问题。
  3. NDK中使用jni调用java层的加密相关代码,缺点是复杂。

参考:

  1. Sygic and Waze navigation apps not working on Android M
  2. Finding a Hidden Flaw that Will Crash Apps on Android M