老码农谈技术人生的职场众生相
前言
我是个码农,在职场干了多年,在超过10个公司服务过,遇到过各种怪现状,拍案惊奇葩,不吐不快,太想写篇文章吐槽一下。
这篇文章汇集了我10多年来的工作中遇到的各种经历,总结的心得,分别讨论了团队与协作(同事/领导/客户的交流)、技术与质量(学习、技术选择、质量)、职业与事业(现实、追求、老油条、职业道德、典故、事业/经验)、找工作(猎头/中介、应聘、简历、面试别人)、辞职(原因/理由、信任)等,干货满满的,里面还夹带了我的很多秘密和典故,如果你认真看,会回来找我赞的!
如果你非要叫我跑龙套码农,请不要在前面加个死字,谢谢。
我在中国读的大学,工作了7年之后,移民到了澳洲,文中的经历,一部分是中国的,剩下的都是在澳洲遇到的。
下面的文章夹杂了不少英文,那是因为这些文字都是我在澳洲写的,习惯而已,不是你们想象中的所谓装逼,谢谢。
本文是我的个人经历和意见,请取滤网三钱,温水煎,和着服用,谢谢。
协作与交流(同事/领导)
林子大了,什么鸟都有,公司大了,什么人都有。有人的地方就有江湖,有利益的地方,就有冲突。
澳洲,跟美国一样,是移民国家,一般每家公司都有各色人种。文化的差异,语言的沟通,总会造成各种矛盾。
根据这些年来的观察,冲突一般有:1、邀功,当你辛苦干完活,别人把功劳拿走了;2、推卸责任,不是你造成的问题,别人强加于你身上;3、小圈子排挤外人。
公司S,心累,现在公司部门和部门之间有严重的斗争,各自为政,根本就不是想干活的,恶心的事情很多,譬如部门老大不干活,让小弟干,小弟工作繁忙压力大就爆脾气,说话不像人样,然后部门老大就各种推卸责任,还美化之,去它大爷的 。
公司B,三个印度码农在印度,一个大胡子孟加拉国的,一个刚来澳洲两天的伊朗人,一个来了澳洲很多年但口音极重的越南人,一个还在马来西亚下个月才来报道的码农,加上来自黎巴嫩的上司,还有我,真的是联合国。
公司K,精神分裂的部门女同事,菲律宾大妈,在公司呆了18年,在CTO背后联合她的两个马来西亚小弟直接跟CTO的上司说CTO各种坏话,在CTO面前老装很友好地狂笑,对待客户是一样的做法。
公司T,当年很纯真,但已经目睹了各种利益纠纷。公司和别的公司协作做的GSP系统,一个医药销售系统,产品做得差不多了,各种纠纷,后来产品就烂尾了。
公司T,我离职,老板请大家吃酱板鸭,味道特别棒,至今难忘,离职后还和老板保持了多年的联系,每年春节还发祝贺短信,很精短,都是手写的。
工欲善其事,必先利其器。开发工具,是开发中重要的资源,公司不应该在这块上有任何吝啬。
公司S,我入职后发现开发部的机器,最老的7年了,新的也有3年老了,没改一行代码,重新编译,需要5分钟以上。跟我一起入职的有4个新同事,公司给我买的电脑是给其它同事买的3倍价钱,IT部经理一脸正经地跟我说:你丫的应该觉得庆幸拿到这么贵的电脑。但我一脸无奈地跟他说:“虽然你买的是我要求的ThinkPad,我我希望是t4xx,你却买了exxx,我才不想要呢!”。新来的项目经理对公司安排给他的新手提电脑很不满意,一大早打开的时候就已经用力噼噼啪啪了,还吐槽连HDMI接口都没有什么的,下班快走的时候还吐槽这i3 CPU配置都8年老的了。首先,讲道理,每次i3换代都有新版本,不能刻舟求剑,但是,省这几百块不值得。
客户
客户是不讲理的上帝。
公司S,做IT的同事告诉我几个真实的故事,忒搞笑了,其中一个是:客户说电脑不正常,同事远程协助,很客户说:“close all the windows",然后客户说“done",同事说我这里看见还没有关闭啊,客户坚持已经关闭。争论半天,最后发现客户关闭了的不是“窗口”,是“窗户”。
公司S,有一个潜在客户发来合同,要求我们的系统一年365日,100%在线,如果服务down了,按分钟赔钱[允悲]。
客户的需求,没有明确目标的居多,需要逐步引导,按优先度和难度分期实现,否则很容易烂尾。
技术与质量学习
只为一家公司卖命一辈子的,少数。即便只为一家公司干活,始终会有产品改进甚至更新换代的一刻,不管是用户量上去了,还是用户需求变更了,那总要学习新技术。一些公司,系统多年不改进,员工就无欲无求了。等离开公司的一刻,才发现自己与社会脱节了,这种如温水煮蛙,所以早就了很多养老心态的老油条 。
公司C,一个资深码农,离职之前,考高级程序员证,恶补,拿到证之后,离职了。
我不是喜鹊码农(The Magpie Developer),不贪新厌旧,确实太多东西需要学,数据量太大了,每天太多东西可以学,时间不够。举个例子,基本的日常使用的工具,如开发工具,譬如Visual Studio,即便你每天用,很多有用的东西我就是没留意,举个栗子:你知道怎么快速复制、剪切、删除整行代码吗?删除一个词呢?再举个粒子,SSMS(SQL Server Management Studio)里面,怎么快速查看一个对象的相关信息,如一个表,显示所有字段、主键、索引、约束等等?
最近看越来越多的网络资源,一些要收费,如一个网站提供了专业面试国际大公司的一对一指导服务,全程真题,还有全球20多个著名Web2.0公司的系统设计详解,也就几十刀,值得买。
看过很多技术文章,一些网站追求一些非常入门的内容,譬如怎么做个多级菜单,动画效果,等等,放在首页,而一些干货文章却被忽视了,悲哀。
技术选择
前端、后台、数据存储,都有乱象。
前端尤其乱,对日新月异的那些前端技术无力吐槽,简单来说,就是脏乱差,可惜,技术负责人,没有把好关,选择了错误的技术。
技术选型,决定因素很多,譬如技术带头人,譬如技术储备,公司现有情况,等等。著名云程序日志记录提供商raygun,几个月之前扔掉node.js改用.net core,性能提升20倍。但就是有些公司的技术人为了反对而反对,选择一些不切实际的解决方案[摊手] 。
举个栗子,譬如SOA家的微服务的设计与使用。网上诸多最佳实践,在多数公司里面都没有、也不会实现 ,不管是决策者、财力资源、还是人力资源等限制 。大家审视一下现在公司的系统, 你连现有系统的的基本的模块化做到了吗?如果没有,凭啥你就觉连模块化就做不到就能把微服务做好? 甭想微服务了。微服务不大适合初创或小公司,Martin Fowler说过,上微服务需要现有的流程、监控、快速发布基础, 而且发布的成本和复杂度比单系统服务高,服务间的网络数据交换成本额外高,本地开发测试复杂度和成本也高。 放遇到异常,还是看业务,一些transactional的该怎么样就怎么样,一般流程化操作,如用sagas,容易导致死流程,这种怎么监控和解决具体问题具体分析。一般做法是有机制重试n次后还不行就escalate到IT,还有日志这块也是很多坑的。
继续这个栗子,微服务的基础,用公有云的话,论灵活性,那就azure function;论scalability,还是azure batch吊;论可控性,还是service fabric强;论简单易用陪流程,还是azure logicapps好;论业界认受度,还是Amazon家的AWS λ 吊。
MYOB是澳洲著名的老牌会计系统,直到几年前他们的解决方案还是Windows桌面程序,客户需要用citrix远程进去跑的。anyway,原来这公司的名字是Mind Your Own Business的缩写。
公司C,当年O/RM流行没多久,entity framework还没有出现,我们用的一个商业的,性能很烂,批量生成数据的时候整个界面无法响应(当年我们都不懂异步处理)。
公司C,微软推出了和macromedia(还没有被Adobe收购)的flash对抗的Silverlight,设计思路是好的,性能都比flash好,漏洞远没flash多,技术负责人说,我们下一版本要用Silverlight实现,当时他说:“我们要做银光版!”
质量
在编程的时候,我们一定要想象一下,以后维护我们自己的代码的那个人会成为一个暴力的精神病人,并且,他还知道我们住在哪里。
MVP,对体育运动来说,是most valuable player(最有价值运动员/球员);对开发人员来说,是most valuable professional (最有价值专家);对产品开发来说,是minimum viable product (最简可行产品)。一些公司开发系统,一开始就勾画宏大的愿景,几个月甚至几年之后,产品还是没有见踪影。相反,一些公司追求最小化的可行产品,每个版本只发布一个新功能。
产品质量、功能和时间这三者里是互斥的。要质量和功能,那么时间就得延长;追求质量和时间,那么功能就要砍;赶时间和功能,那么质量必然下降。
看了很多公司的系统,就像在吃苍蝇。
大家看过少林足球,吴孟达样子和口吻:“代码,不是这样写的!”
怎么给垃圾系统擦屁股:你被扔了一坨热气腾腾的烂代码,幸运的话只有几百万行,没有注释,仅可能有的就是早已过时的文档,写这些代码的烂码农早已去逍遥快活。
公司X,第一天,下班了,累瘫,腰酸背痛。首两周都是各个部门的不同人来介绍公司、各种业务、各个系统,找了几个机会跟开发团队聊了一下,顺手看了一下他们的开发,具体就不谈了。
公司业务成功,和开发不是正相关 。很特别是那些行业系统,只要销售人员足够强,不管多烂的系统都可以大卖,所以,很多公司的销售人员收入很高。
公司E,硬度公司,公司绝大部分是硬度菊苣,部门都是硬度码农,除了我。主系统登录页,老板要放一个配合公司LOGO的动画,硬度菊苣就设计了个gif动画,彩虹波浪线不断翻滚,但页面加载很慢,整个窗口响应也很差,鼠标挪动都有问题,我一查,原来那个gif大小是全屏幕的,超过5兆。
公司B,客户端用OLEDB从Visual FoxPro读到DataTable,序列化到JSON,压缩,存到Azure BLOB,然后写相关记录到Azure Service Bus Queue,服务器端Service Bus接收到信息,取相关BLOB,解压,反序列化,再Bulk Copy到Azure SQL Server的临时表,再转换格式化各字段读关联表,最终到达目标表。蛋疼的感觉?
公司B,巴西码农,为了格式化法国人名常见的组合名(就是名字中间有-、·、空格等符号后面第一个字母要大写),他洋洋洒洒写了80多行代码,逐个字母替换,而且为了应付空格,又重复了一遍。
公司B, 又优化另一报表,初步加了索引重构逻辑后,从原来超时到现在1分26秒,再分析,发现另外一个瓶颈是引用了这函数,报表先调用一个主的人名格式化函数,这函数再多次调用上述那函数,重构后,只需要6秒。
公司B,挺无语的,部门一码农,一个流量值(字节)要格式化显示成兆,他直接/(1024*1024),根本不明白那些小数就不能显示了,然后呢,还Round两位小数,问和尚借梳子啊。
公司B,数据库那块,简单地说,就是数据库规范里面的第1/2/3范式都完美地忽略了 。前端界面对一些字段没有做校验,所以系统跑的时候各种爆,譬如期望是数值但里面有各种诡异字符,期望是邮箱地址但是文字。日志那块,每个方法执行都做一下开始/结束日志,随便点几下界面,几百K的日志内容[摊手]
我发现,懒/烂码农,很喜欢复制粘贴。
公司S,部门一开发人员,擅长复制粘贴代码,原本几百行的代码,硬生生搞成1万多行。他说:“我写代码,疯起来,我自己都害怕!”某天,这个码农在看自己的代码的时候,迷茫了,看不懂了,代码逻辑流程太乱。所以,他只能打开Visio,逐步把逻辑画出来了。
公司S,系统是asp.net webform + vb.net + 大量第三方重量级UI控件,前端、后台和数据库性能都很烂,根本不是SaaS,也不支持多服务器,各种各样的错误。我踌躇满志地来到公司,第一天就跟大家说:“做开发这么多年,烂代码我看惯了,所以大家放心,不管多烂的代码我都可以重构改造的”,3个月后,我歇斯底里地指着屏幕上的烂代码,狂叫道:“你们这样写代码是不人道的!”
公司S,系统各种问题,性能表现差强人意。其中一个表现是,越越来越慢,譬如同一个功能,所以参数一样,今天跑5秒,后天6秒,大后天7秒这样。最后发现还是跟我之前优化的日志有关,虽然改成异步批处理,但是日志基于文件,每个最大2M,不断翻滚,日志文件名逻辑是扫描所有文件来取下一个文件名。
公司S,一天,分析了一下数据库,一个客户7天做了150万次数据库读操作,约读取了200G数据,加上前端那些Web Form冗余HTML,实际从服务器上走出的数据是很夸张的(按我司的规模),数据库请求延迟更厉害,一个客户每次请求都要等0.2秒。
公司S,存在多个业务逻辑错误问题。客户反映数据有问题,部门的同事分析数据和代码,最后发现关键逻辑是读的配置文件,而这个配置是应该按具体客户的设置来的,但变量写成了static。
公司S,系统运行时大量日志生成,同步写入日志文件,我改成了异步。还有,每个页面加载完成,都记录一下用户的IP、加载开始时间、加载结束时间等信息,也是同步的,加上其它业务逻辑写得不行,所以很忙,我也改成了异步,定时批量写入日志。
一些公司的码农,不把警告当警告,完全无视之。
公司S,主系统,编译的时候,显示254个警告,不能再显示更多了。
公司S,下班前,每周五全员工公司例会中,一个IT部的同事问我:“Wilson,你们部门是否会把机器学习应用起来”,我心想:“你们连数据仓库都没做,所谓商业智能这只是做了些基本报表,数据量也不是很大,我以前随便处理都是几十亿起跳的,还想机器学习?” 然而,我还是老实说:“大家知道Google alphago吗?就是最近打败了最牛的围棋手的人工智能系统?”。没人回答。我继续“我们写程序,是直接解决问题。机器学习,是我们写一个逻辑,让机器其去利用现有的数据进行分析找出最优方案,这是非直接解决问题,”
数据从用户在界面输入开始生命周期,经过传输到达网站,经过处理(譬如ETL),再存到数据库,后续还可能有数据仓库二次处理等,最后数据失效被删除。这中间很多事情需要做,但,最重要的第一步,是确保用户输入是校验过的合法数据,否则进入系统后造成连锁反应,修复成本太高。
我服务过的很多公司,界面输入缺乏基本的校验,譬如长度,用户输入长一点就爆了。邮件格式也不判断,系统发送邮件的时候各种爆。
公司S,系统设计有问题,实现有问题,运作有问题。拿各种通知客户的定期报表邮件,地址完全不校验,同一个客户出现几十种的邮箱域名,譬如正确的是foo.com.au,实际出现:foocoma.u, foo.com,foa.com.au, foo.com.....,一些明显是不合法的格式,一些是不存在的域名,等等,发送的时候也不校验
公司X,系统各种安全漏洞,SQL注入轻而易举。
遇到过各种奇葩软件/系统设计,譬如LinkedIn Android版,经常告诉你无法发送内容,不告诉你为什么,之前打的长长内容都丢了,根本草稿等临存功能。一些银行的app,允许你增加、减少每日转账额度,但根本不告诉你要增加到多少或者减少到多少[摊手]。
公司S,现有的系统10多年前开始写的,技术陈腐,其中一个功能是根据不同客户不同产品从可自定义模板那里动态生成表单,这个功能是用的第三方的,本来不复杂,但随着业务发展,现在单纯渲染界面的代码行超过10,000。我在用angular改造,目前代码行200,可以显示了,接下来就是做一些交互 。
公司S,Web系统性能差,有几个原因,其中一个,是HTTP压缩都没有启用,页面/资源加载都要用较长时间,我发现之后,顺手启用了
公司K,系统的数据库设计很多奇葩的事情,就命名这块就看不下,用户标识(UserId)这个,同一个数据库里有以下各种形式:UserId、UserID、user_id、userid、iduser、USERID、id_user等,而且大部分是同一个人搞的 。
公司E,隔三差五发现公司印度菊苣们写的代码好多坑,譬如前端js肯定就不判断对象是否null,直接取属性,然后后续的代码都无法跑了。后端的代码更奇葩,直接try/catch抑制错误(catch无任何逻辑),今天发现一功能无法跑,分析后发现,数据库表字段类型是nvarchar,代码里定义是int,菊苣不解决抑制错误就完了
这么多年来,各种平台,看见过各种软件的奇葩实现。
公司Z,现在的业务系统,一个复杂的申请流程,所有数据都暂时保存到cookies,今天终于爆了,客户的一个下单JSON后超过4k,boooom!
写烂代码的人多用旧版本的语言,这样他们就能名正言顺地不用新版本的语法糖来精简代码。譬如c?的自动属性,expression body、LINQ等,他们都不会用。更恶心的是重新发明更烂的轮子,数值TryParse、DayOfWeek等重搞,最恶心的是压制错误:一个对象几十个属性,不判断null,几十个try/catch逐个属性轮 。
公司A,数据库这块,因为某GIS产品Web服务的特点,把数据库分割为:每个客户3个数据库,然后呢。然后服务器就几十个数据库。其实做到一个数据库是没有什么难度的。可以预见以后各种血泪 。
公司A, 开发这块。之前弄过Windows Mobile,后来用Sharepoint + Silverlight加上某GIS产品+.NET插件(啊啊啊),现在在上马#WPF#,然后准备招聘iOS开发人员和Android开发人员(啊啊啊啊
公司A, 做的产品主要是基于GIS的产品,给服务人员提供地理任务标注/指示,然后开展工作。然后呢。没有自己写的服务器端#,#不直接存取数据库#,完全用某GIS产品提供的Web服务。然后性能各种爆。
公司A,是典型的传统使用微软产品的企业,IT/基础设施这块都是AD/exchange server/SCCM等,最近弄了个JSP写的helpdesk系统,所有东西都往那里扔,连新产品/新项目/改进都放那里,还包括bug管理。
公司B, 系统是Web应用,引用了大量的第三方Web前端代码,超过2500个JavaScript、CSS文件。每次发布要等好久好久。其实绝大部分都不需要用到,就是硬度码农买1送10地狂塞进去,而且grunt build那套也不用,打开首页的时间都够我去找菲律宾妹子了
公司B, 相比上一家公司,这公司的产品状况要好很多(尽管很多问题)。上一家公司的产品我接手之前只是基于第三方产品做扩展,完全不是自主知识产权,午饭商业化,我从头写,大半年完成,比第三方产品还好很多功能多很多。好歹现在的直接自主产权,技术较新,但坑多。
公司B, 这公司是和这行业的领先者之一合股搞的SaaS解决方案,软件+硬件结合,市场很大,不过,合股公司总部就是仓库,大家绕着会议桌开发,旁边的沙发坐了一堆五湖四海的合股公司员工吃各种风味的午饭。新公司的工作场所还在装修,隔壁,其实还是仓库改造。
公司B, 需要使用的第三方系统,其市场占有率超过50%,但用的Visual FoxPro开发。因为官方没提供API,我们的玩法是直接逆向工程数据结构然后自行山寨业务逻辑玩弄数据。
公司B, 8个硬度码农(已经炒掉5个)做出来的web系统,后台ASP.NET MVC+nhibernate。每个controller都automapper create一次map。还直接数据CRUD。前端angularjs,每个controller直接http req。各种null ref问题。
公司A, 我发现了,代码的质量很差,主要原因是:大量复制粘贴、反复操作(譬如反复的获取同一个值做而不是读一次做变量)、冗余的循环、没有使用较新的语法糖(譬如lambda)而自行弄10多行代码实现一行LINQ搞定的、很多情况都没考虑大小写敏感,强行catch异常而不是判断
公司A, 入职一个半月,发现前任挖了很多很大的坑,一些短期内无法填,一些长期也无法填,怎么办?逐步填,一天填一个呗。
公司A, 开发,是典型的四无:无设计、无文档、无规范、无流程,无法无天。数据库设计乱七八糟,性能极渣,处理几百万数据的ETL也要跑几个小时,还会内存耗尽(32G)。代码那个更无法吐槽。
公司A, 产品用的C#开发,Visual Studio做IDE,代码管理用的SVN,陈腐得很。产品开发还是waterfall,新版本发布用windows登录触发复制更新,无力吐槽。给CIO建议,改用Visual Studio Online,搭配scrum,项目管理/代码控制关联起来,这只是第一步,还有很多需要做。
公司A, 虽然不同州不同客户不同的业务需求,但绝大部分业务/逻辑是一样的,完全可以把基础部分标准化,但是呢,现在的做法是每个客户单独有3个数据库。每次基础功能/逻辑更新,就要更新几十个数据库。
公司A, 数据库的更新允许通过sharepoint修改任意记录,然后呢,没有后台逻辑封装,然后呢,一些表大量触发器,一些触发器几百行代码。
公司A,产品的日常数据查看/修改,除了专门的管理工具/客户端,还可以通过sharepoint来,有一个自定义的数据列表WebPart来绑定一个数据源,还有一个数据编辑WebPart,根据PK来更新数据,竟然允许直接修改任意记录。没有后台逻辑,没有存储过程。
公司A, 系统的部分数据导出和通知是用的python脚本,质量放一边(容错、复制/粘贴等),产品环境根本就没成功跑动过,一个月多月了,没有人去排错。今天开会,我一下子就找到问题了,print组合输出某数据库值null。
公司S,审查代码,发现多个地方都出现一个诡异的逻辑,文件输出的时候,定义编码是GB2312,我跟写代码的码农说:“可是,咱们不在中国啊,而且,那可是10多年前的做法啊 。
职业与事业现实
铁打的营盘流水的兵,大家都是可以被抛弃的卒子,不想成为边角料,就要不断提升自我。
职场如古代的欢场,上班族都是出来卖的小姐,区别是一些天生丽质技术过人的成了头牌、花魁,日子自然滋润,如果碰上要么色中恶鬼的土豪劣绅或一见钟情的傻情郎给之赎身(大量股票&公司上市),那就可以安稳过下半辈子。否则等到徐娘半老只能被抛弃。少数早早财务自由,转个身,还是做了老鸨(老板)
职场如古代的后宫,上班族都是佳丽,区别是一些天生丽质技术过人的成了各级妃嫔,日子自然滋润,如果碰上皇上宠幸,成为高人几等的贵妃(大量股票&公司上市),如果怀上龙种诞下皇子,那就可以成为宠妃甚至皇后(技术带头人)。否则等到徐娘半老只能被抛弃。少数早早财务自由,拿个封地自立为王(老板)。
追求
如果人没有理想,那和咸鱼有什么区别?
我不是普通码农,我是传说中的那种10x码农,效率是普通码农的10倍,但我的待遇是普通码农的10倍吗?不是。所以,我今天还得起床去搬砖。
出污泥而不染,濯清涟而不妖,用这个来形容我每日在烂代码的枪林弹雨中匍匐前进而幸存下来,挺适合的。
追求,除了代码质量,还有岗位,和待遇。
我那“离职公司就上市”段子大家都知道了,我经历过几次,2次错过,1次主动放弃。中午请公司Z的技术总监吃饭,他是老员工,整个系统主要是他搞起来的,公司最近拿了几亿刀的授信,市值是1.85亿刀,但公司只给了他价值6万的刀股票。另外一个所谓的CIO,来了没多久,没啥大贡献,但他要求不拿工资换股份,现在有4%,价值约740万刀 。
追求,就是不甘于只完成任务,而是要做得更多。
多年前,因为要监控不同公司的不同系统运行状态,写过多个针对性的监控程序。做过一个分布式计算,c井写的,RESTful API通信,cluster server发送计算模块(动态的c井代码)到所有tenants,每个tenant跑完代码结果送回server,就是map reduce的过程。这种模式,可以做很多事情,譬如以前做过分布式查询,任意客户端(台式电脑、手机等等)查找结果然后汇总 。做监控系统,遇到状况就触发条件然后通知相关人。后来改用第三方的,譬如Nagios,再后来,改用云服务。以前用过monitis.com ,还行,现在公司要这个功能,所以再做了比较,发现还monitis最适合 。
做公司S,我发现公司没有这种监控系统,我主动做了出来,效果很好,找出不少问题,damage control比以前好多了。刚才监控到物理内存突然占用多了600M,分析后发现一个业务逻辑把整个数据表取出来在内存出来,空间占用1.6G。这就是追求。
公司S,花了些时间,给公司的系统做了个高度可配置的数据归档功能,可以指定任意来源和目标服务器、数据库、业务表、数据记录条件等,自动创建目标数据库、表,完了自动备份压缩、迁移等等,这个,是之前没有人能做出来的。这就是追求。
公司S,主系统存在10多年了,当年没啥设计,功能逐步堆砌。存在各种问题,性能问题尤为突出。主业务是各种数据的ETL,大部分逻辑都是逐条记录写入、更新到数据库。譬如插入1万条记录,需要2分钟。我改成批量的,0.4秒。还是太慢了。这就是追求。
虽然我是爆栈,我偏好写后台逻辑代码,因为前端代码,好歹还得跑一下minify和uglify步骤,这样别人才看不清你写的代码有多烂。毕竟,系统慢,你可以说是硬件差不是你代码烂。其实,我还是都写得很好的。这就是追求。
公司S,生产环境有备份(第三方的备份SQL server的备份文件),但备份是一笔糊涂账,譬如随机抽查尝试还原,居然能告诉我那天的备份失败了知,然后给之前写的系统监控加了相关监控 。这就是追求。
现在上班每天还是坚持做些研发和写写代码,最近在做系统监控的功能,全套, 爆栈,从前端(angularjs等)到服务器(asp.net MVC+Web API等),从客户端(Windows service) 到数据库(SQL Server等),每个模块都尽量针对接下来做新产品要用到的技术的最佳实践进行演示,编程规范等等都尽量覆盖,给大家学习。这就是追求。
公司S,一天,所有网站服务全部停摆。查自己写的log没发现,查看IIS网站在跑,但应用程序池停,启动再打开网站,还是不行,池还是停,如此反复,排查系统日志,池停止是因为hips模块无法加载,追踪是外包的IT服务公司擅自在工作时间安装McAfee杀毒软件,给IIS加模块,IT卸载杀毒软件还不行,最后只能由我解决。这就是追求。
公司S,每周开个workshop,主要说现有代码的问题和怎么优化,还有各种场景的优化办法和高效算法,给出benchmark,一些快几倍,一些几十倍,一些上百倍。还在ASP.NET Web API的基础上搭了个Web服务框架,支持token,流量控制等,写得好爽 。这就是追求。
老油条
我对老油条爱恨交加。
公司S,我面试的时候,老板说公司要把现有老系统做成SaaS,队伍很成熟,看了一下该公司领英员工列表,初创员工从最开始到现在11年多了,没离开过。成熟,换言之,就是革新的阻力大,老员工舒舒服服的,不会关心什么新技术,更不喜欢空降一个上司来找他们麻烦。如果你是老员工,你怎么办?如果你是空降那个,怎么办 ?
公司S,几个老油条,经常请病假,曾经有人一个月请三次病假,完全是滥用。
有一家公司,做了20多年,积累了大量代码,超过2000万行,其中,大量重复发明的轮子,基础组件如譬如O/RM和XML序列化等,大模块如ERP等,无所不包,相当佩服,好处是,你有藉口入职后1年才开始了解系统,之后,也可以安心做老油条养老,因为你写的代码没多少人看得懂。
公司A,我接替的那个研发经理将于3周内离职,问他拿系统架构设计、流程图、数据库设计、技术规范等等所有文档,全无!那好,让他讲解一下,他让我直接看代码和用数据库diagram看表关系。我靠,系统设计仅仅就是表关系吗?相当的无语。
职业道德
这些年来听过不少朋友吐槽各种奇葩遭遇,我之前也遇到过不少。
公司X,用Java的,其是给南航做订票系统的,后来老板跑了,没发工资,大家都回公司抢电脑填工资。
公司H,一个从广州灵狐(还有人记得吗?)来的码农同事离职,破坏分区然后格式化磁盘了,还拆开机箱,拔了电源线和数据线。
一个公司雇用一个员工成本挺高的,找猎头就要给一个半月的工资,基本工资,养老金,各种保险,工作环境(租金),设备,培训,年假,病假,每年加薪、奖金,平均算下来是基本工资的150%甚至更多。所以,我干活都很努力,对得起这份工资。
时刻站好岗,不过不需要像之前带病工作了,也不需要第一个来上班,最后的那帮人走。早9晚5,把工作都做完就行了。该请病假就请病假,对自己好点。
公司S,部门会议,8个码农,30个任务,部门的码农狂塞任务给我,我要做10多个。我vs都没,代码访问权限都没,业务逻辑都没掌握,就让我做事情,一些任务还是有难度的,譬如很笼统的系统优化,我还是坚持去做了。
公司S,数据安全很严格,除了一般的过滤和监控等,每个员工都是从本机使用自己的账号远程桌面到服务器上做日常工作,譬如收发邮件、读写文档、使用公司的系统等,这种做法还真是第一次见 。公司这样做,无非就是想大家遵守职业道德,但如果不尊重的情况下,可以知道并且行动。
公司C,我离职的时候被部门经理冤枉我破坏服务器,一个多月的工资没发我,后来他们发现是部门经理搞鬼。这个部门经理还把源代码放自己的手提每天带回家,要挟老板给他股份。几年后,公司还发现这个部门经理偷偷卖公司的系统源代码,把他给炒了,但公司还厚颜无耻地找我回去主持开发部。
公司T,我离职了,几年后,跟我一起呆过的技术负责人,联系我,说他现在手上有当年的系统的源代码,问我有没有兴趣一起搞搞卖钱。
典故
公司A,IT经理,样子是典型的犹太人(就是那种大胡子),后来一问,人家说是英格兰+苏格兰裔的澳洲人。我代替的那个研发经理,是不丹人,祖母是广东人。部门的开发人员之一是日本人,英文名跟中文拼音一样。另外有一个开发人员是上海人。
公司K,我是刽子手。公司人员流动率高,新员工入职,老员工离职,都需要一系列的流程,我做的hr业务中有一个功能:自动化入职和离职流程。每当监控系统中显示今天要离职的人员,我就有深深的罪恶感。监控系统只是显示的人员不断变化(入职离职),但背后是有血有肉的人啊。
公司T,大学还没有毕业,就在这里混了,然后跟着公司去了深圳蛇口,公司就在女娲补天像旁边的大厦,当年那里是海边,现在那个地方都成市中心了吧?下班后,大家去楼下的大排档喝深圳土产的金威啤酒,晚上大家就在公司里的一个小房间里的挤着睡。
女码农,大家觉得又少又神奇,是吧?
公司T,遇到了两个女码农,一个在几年后成为了另外一个该公司的男同事的老婆。另外一个,成了我的女朋友,当年是很开心的,有共同语言,爱的死去活来,(这里省略大量儿童不宜的内容)。后来,与她纠缠不休的前男友来搅和,她让我走,我心有不甘,但尊重她的决定,多年之后,她读了大学,用上了C,去了银行搞大型机,再几年后,找了个同乡,回去组建家庭,生了孩子,没再从事码农事业,(这里省略大量各种哀怨)。
公司H,另外一个女码农,水平还行,但不大喜欢接受新技术,我推荐的新东西她都没有采用,不过,我还是在这家公司呆了我职业生涯最长的时间,超过5年,直到我要离开中国移民澳洲。
公司T,上述的同事夫妇,3年前带上全家来澳洲,他读硕士,说是曲线移民。毕业后,因为,他的原话:“我只是不想别人给我的时间定价”,愤而回深圳发展。对了,当年我们分别离职之后,我在广州买房,他在深圳买房,都才是50万左右的两房,现在他的房子快1000万了。
注意!前方高能!
职场,是泡妞的好地方。
公司A,前台真漂亮啊,目测很年轻,20岁左右的样子,貌似是混血的,哎呀。
公司H,我遇到了一个女神,真心漂亮,一见倾心那种,我就对她展开了追求。后来发现已婚了的部门经理对她也有兴趣,在各种电影中才会发生的经历之后,(这里省略大量儿童不宜的内容) ,她成了我的两个孩子的妈!
事业/经验
说起做技术的人事业演进路线,一般分三条。大家都是从初级码农开始,到中级码农,高级码农,然后开始分:1、tech lead / principle developer → architect → senior architect → chief architect → CTO;2、team lead → development manager → senior / technical manager → VP of engineering。如果还要细分architect的话,还可以这样:application architect → solution architect → enterprise architect ,每个都有junior/mid/senior/chief级别。
说起架构师,我觉得没有多年实际动手经验,毕业就上来做架构师的,真正做成功的属于凤毛麟角,大部分都是扯蛋。
为什么需要资深(老)码农?为什么需要架构师?一个误区:把现有系统扔到AWS/azure/GCP这样的公有云是简单的lift and shift,但实际上远远不是这样,譬如一个公司的业务要打印快递公司的那些标签,就不能完全在云里面跑了。
资深码农,经过多年的实战经历的锤炼,掌握的技术广度和深度都是新人无法比拟的。简单来说,老码农踩过的坑,都是血泪换回来的,你愿意让缺乏经验的人再去拿公司来玩笑吗?
找工作——猎头/中介
大部分猎头都很烂,大部分猎头都很烂,大部分猎头都很烂,#重要的事情要说三遍#。
猎头,就是把人力资源当牲口那样贩卖,他们所谓的Cherry picking,很烂,因为没有背景知识,他们乱来地强塞给你一个岗位,骚扰你,或者你投了很多份简历,就是不理睬你,尽管你非常符合甚至over qualified。更搞笑的是,我去找工作,他们倒过来给我推销码农。
猎头干的是买卖牲口的工作,澳洲的招聘工作,大部分是都是企业通过中介来发布的,但绝大部分中介很烂,根本不懂行业知识,不懂的分应聘者水平高低。我之前找工作,大部分中介都不理睬我,但知道我当上研发经理后,经常骚扰我,强力给我推荐他们手头上的应聘者。
很多时候,联系了猎头,然后,就没然后了。猎头不靠谱,猎头不靠谱,猎头不靠谱,重要的事情必须说三遍 。
猎头/中介真的不懂技术的,今天有个猎头,多次来回邮件,每次都问一个技术/工具。譬如微软的team foundation server,让我深入说明这个东西。要不要我说说怎么配置continuous integration啊,要不要我说说vs agent的参数啊 ?
试过面一个多月前面的一家公司,没潜力,推了。接下来这个故公司换了几家猎头来投放广告,我都发了简历(难以分辨是非同一家公司),猎头问技术问题的时候,总会问同一个问题,每当问这个问题,我就心里想:靠。又是这家公司。
曾经看见一份工作,投了简历,和猎头来几个来回邮件电话交流后,无疾而终(中介没回复)。大半年后同一个公司同一个职位(招聘广告不会列明公司),同样一个猎头,几个来回后没下文。之后,同一个猎头,主动找我,还是同一个公司同一个职位。
刚来澳洲的时候,找啥工作,猎头都会问你有没有本地经验(local experience)。找来找去没找到合适的,只能重新从低做起。最搞笑的一个真实故事:一个英国人,做了20年,来澳洲找工作,猎头还是说:你没有本地经验。
猎头,很多没知识不说,纯粹浪费时间,没有面试机会,还找你去面对面聊天 ,还为了不对口的技术骚扰你,还让你去做初级码农。
澳洲市场很小,猎头很傻B。刚才一猎头找我,职位是我上一家公司的首席架构师,她根本没看我的简历,如果看了,就不会找我了。
一些猎头真是厚颜无耻啊,群发垃圾邮件就算了,我回复:“你这职位我很多年前已经不找了,更新一下你的系统吧”,今天直接电话骚扰我,问了一串问题,我强调我刚找到perm工作,不会换,她还死缠烂打问我工作内容什么的,我说我在开会,她说:那么我明天再电话你吧。我说:邮件联系,别电话我了。
某公司要招一个全栈码农,最后在领英上找到了一个技术极度全面的,上班后才发现,原来他是个猎头。#一个猎头写什么狗屁掌握技术# 。
有一次,被猎头骚扰,LinkedIn上加了我,一看就知道是昨晚我忽略的一个工作机会,他打电话过来,工作需要常飞去越南搞外包团队,待遇还比我现在低,一听到我没兴趣,马上挂电话。基本礼貌啊 。
曾有一次,猎头骚扰,在招聘网站找到我的简历,花了半个小时,强推一个用Java、RoR的公司的岗位,待遇比我现在还低,然后呢,我竟然同意去面试了。
找到工作之后,经常有猎头直接打电话到我们公司的技术支持来找我,强推他们手上的码农,我上司接的电话,上司一脸诡异地看着我,以为我在找工作(虽然我实际上是。)我投简历,猎头不鸟我,现在倒过来给我找麻烦。
一次,公司的技术支持电话响起来了,女QA接电话,然后转过头来对着我诡异地笑了,说找我的,我纳闷谁会用这个号码找我,问是谁,女QA说是猎头,当时就惊出一身冷汗 。
还有一次,猎头来电,说:“喂,我们有一个很适合你的岗位!”,我说:“哦?说来听听。”,猎头:“你擅长.NET,对吧?”,我说:“嗯。”,她说:”那JAVA呢?“,我心里一咯噔。mmmmm,她继续:“还有PHP呢?”,我马上说:“负分滚粗!”
有一个猎头来电:"现在有一家大数据处理公司,需要SQL Server专家,你来不?",我:“好啊,我马上辞职。”,上班第一天,SQL Server正在Linux上欢快地跑着。
曾经有一次,猎头来电,上司在和我讨论容灾设计,我迅速拿起电话说我要接这个电话,以防Google又自动显示未知号码是哪个招聘公司。这已经不是第一次了,上司那么聪明,肯定知道我。
曾经有两个美国猎头找我去美国工作,用的是澳洲公民特有的E3签证,我说我希望是H1B签证,这样我可以留在美国,然后,就没然后了。
一猎头让我做一个ASP.NET的在线测试,IKM的,50来个问题,内容真是服,一大堆过时的ASP.NET Web Form技术细节,连web.config配置里某属性的名字都要搞几个typo来考,还包括SharePoint开发的,MVC的只有寥寥几个routing问题,越做越哭笑不得,完成那一刻仰天长叹:世界那么大,我还是。 做完后不爽,写了邮件给猎头,痛斥这个测试问题多,和现在的技术严重脱节,这些老技术没什么人用的了,还说测试太长,没多少人会愿意做完。发送之后,意识到这猎头不会再联系我了。
曾经有猎头打电话来,问我昨天面试怎么样了,知道我对那份工作不大感兴趣,就直接问我所有记得的面试题目,这样她就可以给下一个应聘者提高成功率。 猎头推荐的3个应聘者,两个挂了,我说对这职位不大满意,她说跟招聘公司联络一下看看结果先,然后呢,没跟我打招呼,刚才静悄悄地再发了一个新的招聘广告。
悉尼有大量猎头中介,大部分丢很烂,做垃圾的一间叫progressive,垃圾中的战斗机,各个员工轮流通过系统发送一样的邮件给你推送完全不合适的岗位,刚开始我都老实回复邮件说岗位不对口没兴趣,他们都不理睬照样发。还打电话骚扰你,一些是看中我做经理所以推荐他们手上的人,一些是推不合适岗位给我 。
最近几年,和猎头的交互,发生了可笑的变化。以前他们找我,基本上是推销比我现在岗位职称低、薪酬少的工作,现在呢,推销他们手头上的那些找工作的人给我,因为他们发现我是研发经理,除了电话骚扰,还在领英上私信骚扰。#我只想安静地找个工作#。
鸡蛋不能放到同一个篮子里。同理,公司招聘,通过猎头发广告,很多会找多个猎头,渔翁广撒网。不过招聘广告绝大部分不会透露公司名字,应聘者难以分别,所以会经常造成通过不同猎头投同一个岗位的情况,这过程常会出现不愉快的经历 。
曾经遇到过一个混血猎头,母亲台湾人,真心漂亮,模特级别的,美!后来去了澳洲最大的银行做人力资源,最近怀孕休产假去了。
总结一下这些年来面试心得:中介(猎头)大多不(就)靠(是)谱(猪),买卖双方多会避(造)重(假)就(注)轻(水),正常工作时间基(加)本(班)是(没)不(工)多(资),队友水平参(大)差(多)不(很)齐(烂),开发很(毫)有(无)规(章)范(法),产品质量有(别)保(逗)障(了)。
应聘
我是代码浪人,不在打靶路上,就在被打靶的面试中。我梦想有那么一天,终于不再需要打靶了,为自己工作,当老板。
在澳洲找工作,要金睛火眼,打的是perm职位,其实是合同工/临时工,打的是悉尼地区,其实可能是墨尔本、黄金海岸、新西兰、新加坡、英国,还看见一个奇葩的:曼谷。这还不算,最好玩的是看见一个是不丹 。
公司B,面试中,和公司领导之一聊了一个小时。原来年初才加入的那个穆斯林技术负责人要离职了,其余的开发人员也打算干掉或者已经离职,现在有个5人的海外硬度团队,产品严重拖延交付,公司允许把现有的系统推倒重来,我上任后先是重建团队,再考虑重写还是继续改现有的半成品。
应聘过程中,免不了要做各种测试。大家还记得那个反向二叉树的段子吧?写算法和实际问题解决能力,这个还是因人而异的。
曾经遇到过一面试官问我Sharding是啥。我没听过Sharding这个词,所以说不知道,后来才知道就是数据库的分库/partitioning。
一次,打靶,真的被爆了。那个在微软干过的,两鬓有白发了,架构师,问了我一大堆的设计/架构问题,简单的,复杂的,最后让我在白板马上设计同时支持几百万人在线的系统。结束之前问他在微软做得怎么样,visual studio还有你的代码吗?
每次打完靶,觉得都被掏空了,又要重新填充一下全新的计划,这种迭代,不肯定是螺旋式上升的,还是原地踏步 。
不过,我习惯了每次做完面试题目,回家就复盘,把所有问题都写下来,重新做一次,总结。
好几次面试过程中,遇到到了不懂的技术问题,别面试官质疑我的能力,当时是很无地自容的,但最关键的是,我知耻而后勇,把不懂的都学会了。
简历
被国内码农尊称为高司令的Java之父James Gosling,这些年来简历只有一行字:Father of Java。这种级别的简历,也只有10来个重量级语言的创造者才有这底气,当然,那些操作系统创造者们则是天外飞仙了。
悲哀的是,很多人简历作假。这些人造假,一些原因是因为自身水平/经验不行,一些是因为猎头只给一份简历3分钟时间,用的关键字自动扫描,大家无法突围而出。
但是,我强烈建议大家简历还是要短小精悍,最有价值的东西放首页突出位置,不要造假,不要动辄精通,用实际例子和数字来说话。
说到底,简历只是敲门砖,只能让你获取面试机会,面试中的表现,还是看过人的水平。
面试别人
公司C,当年毕业没多久,年少气盛,技术负责人不在,我代替他去面试一个新的开发人员,对方经验比我丰富,我问问题也不含糊,追根究底,他耐不住了,就直接说:“算了,就这样吧,我走了”
一公司招聘开发人员,在10多个应聘者中,我坚持并最终选华人。其实最后一轮有2个,第二个是印度人。这个面试的印度的开发人员跟我之前的见识的类似(只是说见识过,没说全部,以事论事)。
辞职原因/理由
辞职的原因可以很多,最主要的原因,其实就是:“老子做得不爽”。这个不爽,可以很多有很多原因:
待遇不满意
职位升迁不够快
猪队友
但是,很多时候,为了照顾老板/公司的面子,还是会给出一个好让双方都下台的体面的藉口,譬如:“邻居的大姨妈的小侄子的小学同学的家里的小狗生孩子了,我也想去生孩子了”。你想想,辞职都这样给东家面子,这样的员工去哪里找啊?
关于待遇,可能会出现老板对不鸟现在的老员工( 不管是尸位素餐的老油条还是功勋元老),觉得重金可以聘到更好的员工(不管是滥竽充数的,还是真牛逼的人),所以,新人进来待遇比老员工待遇还高。
一般情况下要给一个月的辞职通知,公司B,我说服了上司,只需要给2周的通知。还有一周就可以离开现在公司了。刚才家里领导还训话,说现在的公司不好吗?为什么要离职,真折腾啊!我一直没告诉她现在公司多操蛋。
公司B,辞职了,还有大半个月才走,公司越发明白我的重要性了,不管是技术攻关还是系统重大问题,团队没人能接班,解决不了,最终还是要我来解决。今天越南码农做了个功能,在chrome浏览器死活跑不过,他又着急着走,明天一大早驱车1000公里去墨尔本,所以没耐性解决,我分析排查是CORS问题,解决了,老板摊手 。
信任
信任是一种很奢侈的商品。
公司S,我来公司呆了一个月,在几个关键老臣子的劝说之后,老板才给作为技术负责人的我访问源代码的权限[摊手]我来了5个多月,老板还咨询那几个老臣子我是否值得信任。用人不疑,疑人不用。公司一个来了8年的老臣子,今天跟我讨论完产品后,跟我谈心,说老板的想法和做法都是,尽量让不同的人做不同的事情,不让一个人掌握所有东西,以确保知识产权。同时他也说,澳洲这地方,不大可能让华人做很高的位置,譬如他就做不了总经理,我也不大可能能坐CTO的位置 。
还是公司S,入职,听说我要访问源代码,老板马上提出要独立服务器虚拟桌面进去,但那个服务器来之前,就给我的手提安装上了Kensington锁,老板反复强调不是信任问题。上个星期专门请了一世界级大公司的CIO来咨询代码安全管理等相关问题,当然,老司机我自然能对答如流, 那个CIO对我也是刮目相看 。老板给权限,IT经理过来打开计算机管理器,我说把我加入管理员组就好,他说:“你大爷的,歇歇吧!我做IT当然懂这个!”,然而那当然不能直接加,他说要退出重新用他账号登录,我说可以直接打开cmd admin然后compmgmt.msc,他说这样输入密码不安全(不信任我),我离开一会回来一看,他用admin登录改了 。