编程十七年心得与流水账

前言:

好些年没有写博客了。

最近公司很忙很忙,在从早到晚连轴转的情况下,感觉需要花点多思考思考自己的事情。从03年高一正式学习编程算起,已经经过了17年了。工作也十年了。回想起这17年,突然有种想记录一下流水账:一方面不希望有些东西之后忘记了,另一方面也希望自己的经历和教训能够帮助到别人。

高中三年 (2003-2006):

我03年上高一,高中是全国比较有名的搞计算机竞赛的学校,出了几位OI金牌和银牌。这点上是一个很好的机遇,之前对电脑是非常的爱好,那时候是比尔盖茨、乔布斯的年代,为了学习编程,刚上高中就开始了编程竞赛训练。当时高中时期就经常做ACM题库的训练,也做了美国的计算机竞赛的题目练习(USACO)。高一的那次竞赛准备时间很短,成绩很不理想,做到高二的时候已经对动态规划,各种搜索之类的非常熟悉了,差不多刷了PKU、USACO前前后后几百道题。写个堆啊快排啊BFS啥的也基本上可以闭着眼睛写完。高二的那次省赛也没什么包袱,还记得400分的总分拿了380分,扣掉的20分是有一个搜索剪枝没有写好。当时信心爆棚觉得自己应该半只脚踏进清华了。

后来没有想到自己在省队选拔赛里面做得非常不理想,现在都还记得当时有个Dijkstra需要用堆来优化的算法没有写好,所以与省队失之交臂,基本上是煮熟的鸭子都飞掉的感觉。然后后面的选择就是,要么靠着省赛一等奖的高考20分加分去高考,或者参加自主招生免掉高考。因为我对应试考试并不擅长,差不多也就能考600分出头,加上加分差不多能够上10名左右的大学。所以我就几乎无脑去参加自主招生了。

自主招生总体是个很愉快的过程,第一次独自一人,去跑了几个城市,最后拿到了华科的资格,专业选择了自动化,因为感觉自动化是一个跟机器人相关的专业,而机器人是一个未来的专业。华科的自动化的专业排名很高。然后就去了。

另外高中竞赛时期,在编程之外,很愉快地和小伙伴们在机房里面玩星际,极品飞车,并且在保送后的三四个月里面疯玩因为不需要再考虑高考的事情了。也算是一个很特别的高中回忆。

对我来说,省选失败的经历应该是远远超过了获奖,任何获得的奖都是过去的荣誉,而失败的教训却适用于之后的一生。这个经验一直到现在都无比的好用。

另外最近几年回学校去跟之前的老师聊天,这几年的小同学做OI比赛要更加有针对性了,为了加分和保送,并且计算机专业的大火也让很多高中同学更多的参与。不过看下来少了一些纯粹和个人的动力,有些时候觉得从长远来看未必最好。

大学的四年(2006-2010),武汉:

上了大学之后才发现自动化跟机器人确实有一些关系,不过博士的研究课题里面可能更多一些。控制理论那些东西看到就觉得没劲,也没兴趣学习傅里叶变换、拉普拉斯变换之类的。对于电路、芯片编程还有传感器也是兴趣寥寥,可以说自动化的专业课程直到毕业的时候一点都不会。

不过好在华科除了学习考试以外,有几个跟计算机相关的比赛可以搞一搞,比如说微软创新杯,ACM ICPC之类的。本来被拉去参加ACM集训,后来去了几天感觉做的事情跟高中刷题没差别,就没再去了。后来看到微软创新杯好像有些有趣的项目,我大学的前两年参加了两次,因为对游戏比较感兴趣,参加项目是给一个类似于RTS的游戏写AI,控制机器人采矿交战之类的。第一年没有做好,第二年进了全球第二轮,具体名次记不住了,大概能排到全球前20。

第三年的时候就觉得不想参加这个游戏AI的比赛了,后来想了一个架起来的自行车加传感器做输入设备,在3d的世界中骑行的一个项目。类似于 https://zwift.com/ 这种项目。当时整个暑假开始召集小伙伴,然后没日没夜的做这个项目。后来用这个项目去参加微软创新杯的软件设计比赛,进入了中国前八。不过很遗憾没有进去中国前三,错过了那年在埃及办的决赛。

创新杯回来后,萌生了用这个项目去创业的想法,跟一些天使投资人聊了一下,也写了一些创业计划书什么的。后来聊了一圈之后觉得这个市场并不好做,体育这个领域也并不是自己很喜欢的领域,我连环法都没有好好的看过。并且真的没有找到人愿意做天使,第一次创业未遂就这么草草结束了。

后来一转眼就到了大四,当时在考虑要不要去读个研,身边人都劝自己最好去读一个不然会碰到天花板之类的。我当时的想法是,如果能保研到一个还不错的学校那么就去读一下,考研的话就算了,本校我也兴趣不大。后来找好朋友推荐了一下一个清华的老师,过去跟这位老师聊了一下感觉比较好,他也非常希望我过去,做一做搜索引擎和AI相关的东西。但是需要我搞定一个华科外推保研的名额。但是华科的推研成绩要top 15%,我的成绩估计是bottom 10%,要推研需要特批。后来想办法找到同学要了校长李培根(根叔)的电话,在某个晚上打电话给他自我介绍了一下,看看是否能有办法特批。根叔当时答应说会帮忙找教务处问问,然后就再也没有消息了。

后来感觉自己去工业界混混也应该能够学到不少的东西,三年读研不是一个很短的时间,然后我很快就开始找工作了。现在回想起来,这个可能是最明智的决定之一:研究生学位在公司招聘的时候如果候选人专业水平类似的时候可能会看看,在水平差不多的情况下,反而本科优势更大。

因为自己之前对3D的东西比较喜欢也有一些积累,自己也用D3D来写了一些玩具级别的3D引擎,最初的想法是找一个游戏的公司。腾讯游戏和网易游戏面试后希望我能加入他们,不过我发现自己对腾讯和网易的游戏产品(当时主要是网游)毫无兴趣,总觉得是坑害无知青少年的工具。直到现在我都几乎没有玩过他们的游戏。后来听了阿里云王坚关于云的宣讲,突然一下感觉到眼前一亮,那是我第一次关注到云和企业市场,觉得会是一个非常有趣的市场。因为在解决复杂问题的同时还能给企业带来各种各样的帮助。后来顺利面试完,就加入阿里云(北京)了。

在阿里云(2009-2011),北京

阿里云在当时看起来应该是一个最有硅谷特质的中国公司,公司是满满的工程师文化,很新潮的感觉。加入的团队是阿里云的算法团队,实习的时候就开始做了一些机器学习算法的研发,主要跟文本分类还有聚类相关的一些东西。后来在实习完,正式入职的时候团队碰到Reorg(阿里就是Reorg多),之前我实习时候的团队就已经散伙了,几位同事去了淘宝。

加入之后做了一些跟数据处理平台相关的东西,也就大概一两个月,所以细节记不太清楚了,自己的兴趣也不是特别大。过了不多久碰到新老板品数入职,我就毛遂自荐加入内部叫做XLab的一个项目,之后是ODPS的前身。那段时间就天天拿着MPI去写矩阵运算的程序,和一位数学PHD搭档,他负责研究公式,我负责把公式实现成MPI并且做性能测试。也给MPI写了一个Adapter让MPI可以跑在飞天(阿里云内部自研类似于Hadoop的系统)上。另外就花了很多时间学习机器学习的知识,这个博客里面关于机器学习的文章基本上都是那个时期写出来的。

其中跟团队一起搞出的成就是超大规模的矩阵SVD分解等矩阵操作,晚上的时候就在东三环北路附近吃肯德基,还是非常快乐的时间。

入职的前半年(一直在2011年初)的阿里云也是路子很野的时期,一方面公司的士气高昂,希望自研所有的大数据系统,基本上把上古神仙如盘古女娲之类的名称都用了一个遍。另一方面自研系统缺少理性的思考和全局的架构,导致很多系统做了一半之后发现不可用。工程师陷入加班写码,重新推倒,再加班写码的循环之中。

后来阿里云也有一些内部的危机,由于飞天的性能一直上不去,关键的业务也不敢跑在飞天上。所以阿里云在集团内部备受质疑。在工作之中也接触了一些开源项目,同事在讨论的时候也经常说哎呀这个东西Hadoop都有了,我们也实现一下吧等等。所以我当时的想法是,与其在飞天的基础上做,还不如做真正的开源Hadoop。后来收到了EMC Greenplum Hadoop团队的邀请,就去了上海。

如果要复盘的话,当年在阿里的技术选择还是比较正确的,云计算,机器学加上大数据。如果按我现在的心智可能当时跳槽的时候还会再稳一稳,至少不会因为内部或者的质疑而轻易换工作,因为每个工作不开心的地方其实都差不多,当时年幼的我可不懂这些,而这些也往往只有跳过几次槽之后才领悟得到。不过从另一个方向来看,出去走走也是很有意思的事情。

EMC Greenplum / Pivotal (2011-2014),上海

2011年是Hadoop刚开始在企业市场里面开始火起来,Hadoop的名字基本上是和大数据连在一起的,说起大数据,人们的第一反应就是Hadoop。那一年也是Hortonworks成立的时候。后来Greenplum,CloudFoundry从EMC和VMWare里面分出来,成立了Pivotal,所以我就把他们写在一起了。

在Pivotal里面花了大几个月做了跟Hadoop周边的一些数据ETL的工具,类似于Hadoop Distcp的++版本。不过后来真正一个有趣的项目是叫做Hamster (MPI on YARN),当时Pivotal挖来了年过半百的Ralph Castain (OpenMPI的创始人之一)。Hamster把OpenMPI跑在Hadoop上面(Hadoop And openMpi on the Same cluSTER)。当时Pivotal对Hadoop有源码有比较深入认知的工程师非常少(虽然惭愧说来我们是主打Hadoop的团队),后来跟Ralph联系了一下,Ralph也是很开心的跟我一起合作。

但是为了完成Hamster这个项目,YARN那边其实有很多跟资源调度的功能还不具备,比如说Gang Scheduling。另外一方面为了给用户提供一个完整的体验,我们希望mpirun后面的事情都是用户不会看见的,所以需要对OpenMPI做深度定制。后来跟Ralph一起参与了很多MPI社区的会议和讨论。这个其实算是我第一次融入进开源社区的沟通之中。

另外一个重要的经历是参与了Hadoop社区:记得最早使用YARN的时候,那时YARN还主要称为MRv2。那时YARN很多东西都不完善,当时针对做MPI on YARN需要的一些功能,在社区里面提出了好一些JIRA,其中花时间最多的是YARN Container的垂直扩缩容的功能。花了两周的时间写了设计文档、代码等等,结果没想到社区反响挺大,当时Spark社区在犹豫是否用Container的垂直扩缩容还是后来的动态申请新的Container的功能。如果能够有垂直扩缩容对Spark的帮助比较大。通过参与Hadoop也感觉到了Hadoop社区和MPI社区的不同,个人更喜欢Apache社区更开放的方式,也坚定了继续在Hadoop项目里面继续走下去的决心。

Hortonworks/Cloudera (2014-今天)

做Hadoop YARN哪家强呢?当然就是Hortonworks了,当时觉得Pivotal内部做开源还是限制太多,社区里面也几乎没人能够帮得到忙,另外自己也想去硅谷工作看看(12年的时候出差去过一次,印象还是挺不错的)。所以当时就想着找找Hortonworks试试看,结果几面下来很顺利就有了Offer,而且是最心仪的YARN团队。

后来四月入职Hortonworks,先在中国短暂的工作了几个月,十月份去了美国。身边都是都是各个Apache项目的committer,短暂的适应了之后就开始代码的贡献了。Hortonworks算是一个很诚心经营社区的公司,公司在开始的几年内对开源几乎是无保留的状态,很多项目从内部到开源几乎不需要什么批准,Hortonworks的贡献在很多时候也被大公司比如说AWS、Azure不费一分钱就可以拿去盈利,并且几乎不贡献回社区。由于这种吃免费午餐的公司太多,这几年开源的生态也变化很多。

在Hortonworks的四年多里面,经历了Hadoop与大数据从鼎盛到被人唱衰的完整周期。最开始的时候只要是Hadoop相关的东西都会得到极大的关注,Apache Mahout这种粗制滥造的项目都可以火确实从另一方面证实了泡沫也多大。

后来Hortonworks与Cloudera合并,我也转行做了管理, 现在编程不是义务而是爱好,更多的时间也是花在项目管理、团队设计和架构设计方面。这两年还是投入了很多时间到开源社区和mentoring新人和现有的项目。也有机会把几个项目比如说Submarine, YuniKorn 推进到Apache里面,建立社区、让更多的公司能够使用,也能够让自己的公司有机会从这几个项目中取得商业的价值。

因为开源的缘故,可以接触到非常多的公司,从最开始的Yahoo是社区中流砥柱,到后来Microsoft大举进入,然后Yahoo的从如日中天到被Verizon Media贱价买入。到后面的Linkedin、Uber进入,这几年国内的公司也在开源领域发力。在过去的六年最有意思的事情是在开源的世界里面认识了很多的朋友,也尽力的帮助各个公司参与开源。这几年几乎走遍了硅谷所有的大公司(不只是蹭饭 ??),这个经历很独特也很有趣。

开源也是一个复杂的小世界,有各种真心无私的、帮助社区的人,也有盯着功名利禄、用开源作为跳板的人。有真心开源、无私奉献技术的公司、项目,也有只是用开源作为幌子,挂羊头卖狗肉的商业公司。

虽然 “Business is business”,不过从做技术的角度来说,真心开源的公司和人比开源为跳板要可爱很多。

总结一下这几年最重要的经验吧:

  • 失败永远是无所谓的,不多尝试多失败不可能成功。
  • 这很多年观察下来,从工作的成就而言,个人的动力的正面影响往往会超过物质的回报。而在强烈的个人动力驱动下,物质的回报只是一个副产品而已。
  • 真心帮助别人是很重要的(而不求回报),虽然现在开源社区的一些同学发的邮件和问题我很难一一回复,不过我也会尽量的帮助别人找到需要的信息。虽然商业社会提倡互惠而非单方向的帮助,不过个人的观察下来,在能力相当的情况下,抱着理想主义的giver会走的比taker更远。

好吧流水账先写到这里。

原文地址:https://www.cnblogs.com/LeftNotEasy/p/12630308.html

时间: 2024-10-28 09:58:58

编程十七年心得与流水账的相关文章

《UNIX环境高级编程》学习心得 一

本文内容大部分摘自<UNIX环境高级编程>,附有部分个人心得. 1.unix体系结构 从严格意义上来说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们通常将这种软件称为内核(kernel),因为它相对较小,而且位于环境核心.如图显示unix体系结构. 内核接口被称为系统调用(system call).公用函数库构建在系统调用接口之上,应用程序既可食用公用函数库,也可以使用系统调用.shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口. 从广义上来讲,操作系

服务器编程的一点心得

由于水平有限,以下仅仅是个人的一些心得,希望对新人有一点参考作用.另外由于时间关系,写得有点杂,有些点可能并不是跟服务器编程强相关的. 性能相关 1.     应用各种pool. a)       Mempool 比如为了提高内存分配效率,可以使用Mem pool.当对应的场景简单时,可以自己定制私有的内存池管理.当内存池设计相对复杂的时候,可以考虑直接使用jemalloc.tcmalloc. b)      Socket pool 比如dns解析一般是基于udp协议,为了提高性能,避免反复创建

关于java 的编程思想与心得

在C++委员会会议上我所能找到的,是C++社区里最聪明的一群人,群英荟萃,为我答疑解惑.我很快意识到,这种方式之好,远超我在任何一门研究生课程中之所得.如果考虑到研究生的机会成本,这还是一笔在财务上要划算得多的生意. 我被深深吸引住了,坚持出席了有大约8年的时间.在我走后,委员会仍继续前行:虽标准仍未制定完成,但彼时Java已经出现了,还有一些其他(语言)的草案也问世了(这是技术刺激成瘾者的毛病——我的确钻研某一门语言,但我也一直在寻找更有生产力的手段:那些前景看起来很光明的语言特性可以毫不费力

《UNIX环境高级编程》学习心得 二

窝萌来看我们看到这本书里的第一个程序 1 #include "apue.h" 2 #include <dirent.h> 3 4 int 5 main(int argc, char *argv[]) 6 { 7 DIR *dp; 8 struct dirent *dirp; 9 10 if (argc != 2) 11 err_quit("usage: ls directory_name"); 12 13 if ((dp = opendir(argv[1

python核心编程____学习心得____part2

Python基础 注释: # 继续: \          或者(){} []''' ''' 都可以 模块的概念: 每一个python的脚本文件都可以当成是一个模块.模块以磁盘文件的形式存在.模块里的代码可以是一段可以直接执行的脚本也可以是一堆类似库函数的代码,从而可以被别的模块导入调用. 赋值操作符: 在python中对象是通过引用传递的,且赋值语句不会有返回值 形如 y = (x = x + 1)是非法的         但是链式赋值却是合法的 y = x = x + 1 增量赋值: m *

python核心编程____学习心得____part4

第五章 数字 数字: 标量存储,随机访问,不可更改(数字变更后会生成新的对象) 注:不可变类型改变的是指针的指向而不是内容本身 python支持8进制:0开头 16进制:0x开头 双精度浮点型:可以用直接的十进制或者科学计数法表示.浮点型值通常都有一个小数点和一个可选的后缀e.在e和指数之间可以用正(+)或(-)表示指数的正负 复数: num.real                     #复数的实部 num.imag                 #复数的虚部 num.conjugate

大道至简第一章心得体会

大道至简——编程的精义  心得体会      谨以此用于苦恼编程序不得入门的人,不对之处敬请指出 “虽我之死,有子存焉:子又生孙,孙又生子:子又有子,子又有孙.子子孙孙,无穷匮也.而山不加增,何苦而不平?” ——<愚公移山>,<列子-汤问篇> 编程究其本身对大数人而言是一件很苦恼而又无法避免的事情,但是有点可笑的是编程本身实在是一件简单的事,因为“程序=算法+结构”,所谓的编程就是把一件事情交给计算机去做,然后把你的想法“告诉”计算机就行了.但是编程又是一件很“无语”的事情——因为

《机器学习算法原理与编程实践》学习笔记(一)

第一章 机器学习的基础 1.1编程语言与开发环境 1.1.1 Python 安装(略) 1.2.2 Python安装包的安装:可以选选择安装集成包anaconda(略) 1.1.3 IDE配置及安装测试 IDE选择UltraEdit高级文本编辑器,配置步骤如下: (1)选择"高级"-->"用户工具"命令,如图1.4所示. 图1.5 配置UltraEdit步骤1 (2)在如图1.5所示输入各项参数,然后单击"应用按钮" 图1.5 配置Ultr

新手程序员必读:推进编程工作的七条箴言

如果大家属于刚刚涉足专业软件开发世界的新人,各位可能会以为自己完全能够凭借着多年来在计算机科学及编程领域获得的教育及/或培训顺利玩转一切.不过在这一行业沉浸多年的老鸟开发者则希望提醒大家,单凭科班灌输的知识还远远不够,我们还需要从实践当中了解到更多极具指导性的宝贵财富. 为了掌握这些真知灼见,我与多位经验丰富的资深开发人员进行了沟通--他们至少在软件技术领域拥有十年乃至更长的从业经历(有几位甚至已经从业数十年).提到他们希望自己在刚刚毕业并初次涉足编程行业时能够了解到哪些箴言,他们都有着自己的答