毕业就要满6年,前1年半全职上班,然后自由职业一年多,再后来在一家公司远程工作到现在(刚辞职)。
走上自由职业的路完全是一个巧合,当时我并没有一个明确目标,只是在某个地方看到了这么个名词,颠覆了我的观念。因为业余时我刚好写了个CMS系统作为平常练手用,所以当时想,要不我就用这CMS来接网站的单,只要一个月能接一单,赚3K左右让我活下去,我就继续走这条路,否则就找工作。
网站项目是没接到,倒是接到一同学介绍的一个企业项目,借着这个项目我开始了自由职业。项目本来预估一个月,结果做了一年,一个人从Web前端做到C#后端,还有工厂扫描枪上的程序 (扫描枪装的是Windows Mobile,所以其实也就是一个WinForm程序,倒也没什么新东西),还从厦门跑到沈阳深入工厂做项目实施 (这是一个企业信息化项目,Web端接受经销商订单,然后和工厂中的设备对接,完成订单到生厂这个流程的信息化,工厂设备有相应接口,所以主要还是做Web部分)。这个项目两期最后收了大概3W左右,自由是自由,但是穷得一塌糊涂。
这期间因老师介绍也到另一家做教育方面的企业系统的公司以兼职形式客串了两个月,后来老板想留我在那,给我画了不小的饼,年少的我当时也纠结了半天,还好后来想清楚了,当时他们公司大多数员工薪水只有两三千,虽然老板画的饼里暗示我的薪水会比他们高得多,但低薪环境意味着这不会是一家尊重程序员价值的公司,给我再多也不敢拿,更重要的是,公司发通告要求员工上班不能上网看网页,这种通告让我感觉很无语。
自由职业时工作时间很灵活,但极缺在项目估时和商务谈判上的经验,每次都亏本,我也比较好说话,中间加了N多需求我一分钱都没要,工厂那个项目的老板可能也感觉有点对不住我,后来主动给我打了几千块的补偿。不过不管怎样,这个自由职业是继续不下去了。
说来也巧,在我快活不下去时,第一家公司联系我,表明不想全职以后,对方表示有一个客户的项目可以接受在家兼职工作,计时薪,这意味着有干活就确定有收入,不用冒着低估工作量的风险,只要每天记录一下工作内容,月底发他们即可。我很感谢他们对我的信任,事实上,他们应该没有看我的工作记录,只有财务算钱时才会看一下里面的工时统计。有朋友感觉不可思议,说要是我乱写怎么办?但我相信人与人之间基本的信任是会存在的,而且正直一定是成功的基础,我没有必要这样自毁前程。
然后,我就开始了兼职远程工作的生涯。当时找我去是因为项目人手极缺,但接触项目后,我感觉根本原因是技术债务太重。代码里太多的 Copy-Paste,不使用的代码也不删除。所以当时我想改变这种状况,一方面开始重构部分业务变化最频繁的模块,另一方面制定一些 Code Review 规则,鼓励写单元测试,但似乎总是缺了点什么。这是一个客户的项目,项目组的成员相当于是人员外包给这个客户,客户没有技术团队建设的概念,我的计划还没实施多久,因为客户另一个项目的负责人走了,我就被调过去填上了,之前的计划自然也就停住了。
但新接手的这个项目更糟糕,项目业务逻辑相当复杂,是一个B2B的电商项目,B2B项目里的计价方式和B2C有很大差别,算一个订单价格时要从零件价格算起,不同零件还有不同的规则,但这些代码全都是用 IF-ELSE 加硬编码加到处 Copy-Paste 写的好吗!!此外还有,4千多行的JS文件到处都是(4K行最后被重构到三四百行,重复得有多严重)。但既然接手了,就决定把它做好,和一个产品经理一起(他设计功能和用户体验),两个人,一年多,至少从我的角度,这个项目后来算是比较可控了,包括计价规则,原本是客户经常发邮件过来说帮忙改下某产品的计价规则,后来我改成让客户自己在后台通过公式来配置了。我对重构、单元测试这种事热情比较大,倒不是我闲得蛋疼,主要是想让客户少烦我一点。
后来公司想把我拉到研发部,但这个B2B项目的客户不肯,这个客户带来的收益应该不大,所以公司干脆就和这个客户中止了合作,于是就进了研发部,做框架型产品,所以这时的主要任务是设计扩展点和API。
研发部的项目就更自由了,因为这种项目根本就没有明确的需求,只有老板的一些基础想法,你要做的就是和团队成员一起设计更好的需求,然后实现它,你可以尽情发挥你的想法,这也挺合我味口,说实话我不喜欢那种“项目经理分解任务(这在软件工程里好像还有个什么术语,三个字母的),再分配给程序员”的团队,每个人按部就班地完成工作,你要做的就是完成任务,没有一点意思。
但这毕竟是一个老板直接领导的项目组,说实话和老板一起工作多少有那么点不自在。但更多的是,在研发部呆了两年后,我发现我开始有一股很强的冲动,想找一个至少一半以上的人都比我厉害的团队,做一些我没做过、做不来的事情。
突然发现已经离题八万里了,哎,每到深夜时情感就会泛滥...切回正题。近期打算开始找工作了(项目交接中)。
我当前的技术栈
ASP.NET/C#/JavaScript,主要做后端,MongoDB, RavenDB 这些也都用过,但因为公司项目用不到,所以只在业余项目用一些,用得不深,不过我对文档型数据库模型设计特点应该也还算比较熟悉。
前端偶尔也做,但没太花心思去研究,了解得不是太深。用过两次 SPA (DurandalJS),偶尔也写一些简单的JS库项目内用 (主要是封装一些项目相关的UI组件,或对第三方JS库做一些扩展,不重复造轮子)。因为产品类型的原因,所以现在大部分工作内容都是设计框架、扩展点等。
期望的团队
- 希望有接触.NET之外的技术的机会 (但前提是得要我,并相信我的学习能力呀);
- 希望有学习处理高并发的机会,虽然也关心性能,但因项目原因,工作中没有处理高并发的机会;
- 有(全职)远程工作文化,不加班,也不以加班为荣;
- 靠谱,认真做事,不自吹自擂;
- 不做外包项目;
- 合适的薪酬 (不想白天认真工作晚上还要想着怎么过活);
为什么远程?
我真觉得每天花两小时挤公交是浪费生命,两小时干什么不好,非要在路上颠簸,通常晚上挤完公交回来,人也很累;其次,我看到太多的同事中午趴在桌子上午休,这么艰苦的午休,怎么保证下午的工作效率?再者,我工作中间休息时,会想要看看书,或练练吉他,这在办公室是做不到的;
前段时间看到一网文,说是某著名团队创始人讲,我们一起工作基本靠吼,我不太认可这种观念,“吼”是方便了你,但这是以打断另一位(或多位)同事的工作为代价的。你“吼”一声可以迅速解决你的问题,但别人要花十几分钟甚至更多时间来“接”上刚才被打断的工作。
为什么不做外包
外包是一次性项目,即使我写再好的代码,这个项目数月后也会终止。而我希望我写的代码能对项目产生长远影响,今天重构一段代码,意味着以后踩坑的机率可以小一点,多写一个单元测试,被紧急电话吵醒的机会就少一些。文艺一点说,就是我希望我能对项目产生感情,这在外包项目上是不可能做到的。
自我评价
- 工作不会太拼命,事实上我经常一天只工作6小时,但我自认为工作认真靠谱,产出也不低。工作对我来说,除了钱以外,成就感和自豪感也一样重要。如果是一个我不认可的产品,每个月扑在其中22天,对我来说极其痛苦。我曾让别人把UI中的全角逗号修改成半角(产品面向英文用户),要求图标后一定要加个空格,对方感觉很不耐烦,觉得这种细节没关系,他是全职,我是远程,我觉得我是对的;
- 学习能力还不错;
- 态度随和。我经常发现一些新人,刚进来对项目还不熟悉,就开始抱怨这个设计太差那个太复杂,我打心底BS这种人。对我来说,接手项目,第一件事就是熟悉它,熟悉历史原因,有些感觉写得不好的地方可能是有特殊原因的,然后才再考虑是不是要重构改进。
- 和热爱编程的人应该都会比较好相处。看到写得太差的代码时会吐槽,但从来对事不对人,因为我相信有些代码没写好可能是有其它原因;
和我相关的链接
- 博 客: http://blog.mouhong.me
- 微 博: http://weibo.com/linmouhong
- 简 历: http://careers.stackoverflow.com/mouhong
- GitHub: https://github.com/mouhong
- 栈溢出: http://stackoverflow.com/users/290617/mouhong-lin
我想知道的
- 我真正的找工作只有过一次,就是毕业时。后来的工作机会都是朋友介绍的,近三年也都是在同一家公司工作,所以我现在连自己是什么水平都看不清了。能否根据我上面的链接帮我估个大致的价格范围?
- 有没有知道国内和国外哪些远程团队比较靠谱?团队文化要比较开放,要不然就没有办法理解为什么工作交流要尽可能用协同工具而不是用QQ来闪,也会把我喜欢在山清水秀的地方一边玩一边码代码的想法当作是工作态度有问题。
- 如果是国外的远程工作,大家知道个税怎么算吗?
- 如果刚好有团队对我感兴趣,也请发个邮件给我(请附上大致的薪资福利空间^^),但我可能过一两周才开始正式找工作,有可能到时才确认要不要接受面试;
谢谢大家。