步入职场
我上面写了那么多,可能会给很多人留下这个人不误正业的印象:“这家伙肯定天天上班摸鱼,接单赚外快!”这里我还是要给自己辩解一下,在工作中,我完全可以称得上劳模级别的,绝对对得起历任东家的每一分薪水。
我从大三实习开始,正儿八经的在6家单位上过班,瀚川和瀚码(2017至今)算一家、其中大三暑假实习一家、大四下班学期实习一家,剩下就是甲骨文(2012~2015)和YoMail(2015~2016)。
大三暑假实习的公司是用ASP.NET的,工作内容是维护一套OA系统和一套武装车辆押运管理系统。实习月薪是500块,当时觉得能够学以致用非常满意。我还记得有一次第二天系统要上线,我干到凌晨3,4点终于干完下班。出门才知道,夏季台风来了,下了瓢泼大雨,路上的积水漫到了小腿而我又没带雨衣雨伞。年轻的劲头再加上处理完问题的轻松感让我毅然决定要冒雨骑回学校。于是乎在瓢泼的大雨中,在清晨的街道上,一个快乐的编程少年一边奋力的蹬着自行车,一边放声歌唱,那一刻我像是《雨中舞》里面的吉恩凯利一样轻松自由快乐,那种感觉仿佛整个狮山大街都是我的一样,真是段美好的回忆。
大四的实习的是一家大型芯片行业的台资企业,公司做的是安卓系统,类似于MIUI和ColorOS那种系统级开发。那个时候我认认真真的学了一段时间的Android系统内核,从Dalvik 虚拟机背到HAL层等等。后来收到甲骨文的Offer之后,我其实犹豫了一阵子。一来是台湾主管对我还挺好,同事关系也融洽,二来是做的东西也挺喜欢,有技术挑战性。不过,思虑再三还是跟主管说了要去甲骨文的决定,我印象比较深刻的是,当时主管讲到:“去那边不就是做些数据库的增删改查么,有什么意思?”时至今日,实际上依然还有很多人对信息化管理系统的开发抱有如上的偏见,觉得搞系统内核研究、算法研究就是高级,搞数据库增删改查就是低级,其实我是不太赞同这种观点的。搞算法也有scientist和engineer之分,搞增删改查也有架构、性能调优、大数据等课题,只是岗位的方向不同而已。带有色眼镜去看一个岗位,本身就是不合理的,因为岗位本身并没有贵贱之分。唯一不可取的是,身在其位却每天都要忍受那些重复机械的工作内容而不思改进,这本身可以说是对生命的一种浪费。
我是作为应届生加入的甲骨文,前后经过了5轮面试,从C++岗面试到Java岗,过程也算是曲折。不得不说,选择甲骨文作为职业生涯的第一站,至少在工作上很舒服的:外企的福利待遇好,工作强度也不大;早九晚五,基本不加班;有非常多的公司社团,羽毛球、保龄球、游泳、桌游各种social club可以参加,工作第一年的时候,我非常享受那里的时光。
但它有两个问题1. 薪水问题 2. 技术提升问题。
第一个问题,其实也谈不上什么大问题,实际上甲骨文支付的薪水相对于它的工作量而言,算得上是良心的。只是那几年是互联网行业爆发期,外面各种高薪传言纷纷扰扰,让人心神不宁。第二点其实就是我重点想说的,关于技术提升的问题。我所在的组做的产品是Fusion HCM(人力资源管理系统),具体的模块是Payroll工资单结算这块的,分为Costing(成本核算),Deduction(薪资扣减),Payroll Payment(工资单支付方式),Report(工资单报表)几个部分。我被分配到的是Costing部分,人员配置方面,由两名开发和一名QA共同负责这部分的测试工作。
Fusion HCM是一套应用了ORACLE最新ADF开发框架的web程序,当时的ADF框架可以说就有点类似于现状的低代码开发平台了,只不过这套框架是集成在JDeveloper里面的。在ADF框架中,前端WEB页面全部由拖拉拽方式自动生成,基本上不需要写代码;后端的代码很大一部分也会自动生成(CRUD),只有当有特殊业务逻辑的时候才需要手动做一点修改;数据库设计有内置集成在JDeveloper内的UML工具,可以直接生成对应的表;系统还自带一套后台执行引擎,方便做定时任务和流程设计之类的。
我因为有比较好的编程底子,再配合着这套十分方便的ADF框架,所以对于我来讲,分配的那5、6个web页面是小菜一碟,维护起来十分简单。时间长了,就感觉这种日子就如同温水煮青蛙一般,觉得在这种不太需要写代码的环境下,自己得不到所谓的提升,没有安全感,觉得自己很容易被替代。于是从第二年开始,我的屁股开始坐不住了,到了第三年,基本上每天都如坐针毡。于是我开始各种背Java面经,什么虚拟机的构造啊、垃圾回收机制啊、Spring框架啊,该背的都背下来,进入一轮一轮的“面试造火箭”的折磨。
但是今天再回头来看,当时的自己确实有点画地为牢的意思,把自己禁锢在技术的圈子里面不能自拔。像ADF这种便利的技术框架把我解放出来,但是我却没有珍惜这样的机会,去更多的学习Fusion HCM系统业务知识,着实是浪费了不少机会。事实证明,我们的很多同事在熟悉完系统的业务知识之后,有的跳槽到了IBM做了面向欧美的顾问,有的跳槽到了特斯拉以IT的背景做了HR经理(拿了大把特斯拉股票),我们当时同组的QA老师后来也去了菊厂做了甲方的项目经理,年薪80万以上。反倒是我,这个当时自诩技术好的开发,没有好好利用相对宽松的环境去提升自己的业务知识水平,反而丧失了一种职业发展的可能。做技术的快乐是能在较短时间内获得解决问题带来的成就感,但是副作用是往往技术世界里面陷入太深,眼中除了技术,什么也装不下,可惜这个道理我要在两年之后才能彻底醒悟。
2015年,在朋友的邀请下,我加入了YoMail团队。YoMai团队旨在打造以邮件为中心的新的办公生态,我们提供邮件客户端产品。单就首期推出的无缝连接GMail这一个功能点,就为我们吸纳20万用户,是当时继FoxMail之后第二受欢迎的国产邮件客户端。在YoMail的岁月满足了我的技术幻想,那是段技术狂欢的日子:YoMail采用跨平台C++进行实现,如果Java程序员的格言是“不要重复造轮子”,那么C++程序员的理念就是:“能自己实现就不要用别人的。”我去Yomail的第一个开发任务就是实现一个WarpLinearLayout(跟这个类似),实现一个可以根据新拖入元素尺寸大小而自动变换布局的一个布局元素,第一个任务就非常具有技术挑战性。整个YoMail的界面部分,除了邮件内容部分的渲染选用了cef之外,都是基于自己实现的一套XML描述语言来进行桌面UI绘制的,类似于duilib,当时,我负责维护这个UiLib渲染引擎。
我举一个例子,来讲讲做的功能有多细节:有一次,我去修复一个功能,要实现一个输入框input的鼠标选中功能,如下图:
这个算法是这样的:先拿到光标起始位置,再拿到光标结束位置,取绝对值,得出选中的区域是哪一块、区域里面有什么内容,调用GDI绘图函数,把这一块屏幕的背景色绘制成蓝色、区域内的文字内容绘制成白色;同时要注意,配套的键盘如果按下了CTRL或者SHIFT键那么配套的算法还不一样,SHIFT要考虑是延长原来的蓝色区域(还有左右顺序的差别),CTRL在有些情况下要支持间隔选中状态。
凭心来讲自主实现UiLIb有它的好处:道理上来讲因为最底层的绘图函数(就是画点线面的那些最基本的绘图函数)是剥离的,所以到一个新得桌面平台上,只要替换这一部分绘图API就好,这样就是可以方便快速的移植到的MacOS、IOS、Android等系统上,一套代码到处运行。但是实际情况是,在真正移植时,因为不同桌面的坐标系规则不一样(Windows左上方坐标原点、MacOS左下方...),绘图库和对应的API用法不一样等问题,移植后的UI界面还是需要经过大量调整。
这段经历使我开始跳出技术的范畴进行思考软件技术选型问题:市场竞争,唯快不破,很多优秀的产品都是在快速迭代中前进的。精雕细琢的工匠精神固然可贵,但是能快速响应市场和客户的需求,才是企业能存活的关键。在各种工具和技术琳琅满目的今天,是否我们还需要从头去打磨我们自己产品的每一个零部件,这个问题有待商榷。善用工具,能提高产品的迭代速度和开发效率,更能帮助消除团队内无意义的加班内耗,让团队有更多的时间和精力去打磨产品的亮点功能,突出产品的核心优势。
下一篇《我的程序员生涯--瀚码时光(四)》
全部 0条评论