avatar

Coderek's blog

Loneliness is the gift of life

回顾一下我的职业路程

距离2011年大学毕业已经十年了。这十年间,我换了许多家公司,每家工作时间一年到两年。这之中有很多原因,我就不在此赘述。这篇文章主要想整理一下十年间我职业生涯的成长历程。

初出茅庐

第一家公司O是一家老式的小型软件作坊。当时的办公司在 Bugis,很小的一个房间,加上老板兄弟一共就五个人。我记得当时做的项目是给一家打印公司维护一个CRM的系统。这个系统用C++写的,只在windows上运行。除了做一些小的feature,偶尔我还会去客户那边当场解决问题。

我一直以为创业公司应该就是像O这样的吧,直到我三个月后跳槽了。

第二家S。这可以算是一家"创业"公司了吧,是所谓的joint venture。做的东西就是一个管理Royalty的手机应用。我在这里第一次接触到Ruby on Rails 和 Titanium。Rails在那时候已经火到不行了。我会经常去Rails cast 上面挑一些免费的教学视频看,时不时的也会去Rails China留言。那时候最常去的网站就是Rails Guide,Rails在文档这方面是业界典范。当时流行的RSS reader,我就用Rails + Backbonejs做了一遍。后来在Rails China上宣传了一下并收获了不少Star。可惜后来没有一直做Rails,可以说是跟它没什么缘分。

这里多说一下Rails,其实作为一个初出茅庐的Web developer,在那个时候学习Rails是很先进的一件事情。Rails给Web带来了很多颠覆性的东西,比如说html template (erb), preprocessor(less, scss, coffeescript),RESTful API, ORM等等。Rails使做网站这件事情变得很简单,自己带有各种命令行指令来完成各种繁琐的任务,比如创建数据库,生成migration,命令行的形式访问数据库等等,以及后来使用根据make演变过来的rake。可以说,学习Rails对我今后的发展打下了良好的基础。另外,在Rails社区,人们都流行使用Vim来作为程序编辑器,我的Vim也是在那时候学习起来的,一直用到现在。

另外,这里不得不提一下在S公司时认识一个叫Shaun的人。当时他有一个项目找到我们想跟我们合作。最后合没合作我不记得了,但后来我私下断断续续给Shaun做了好几个项目,这些项目有的是手机应用,有的是网站。总之,练手的同时也赚了不少零花钱。我们现在算是老朋友,偶尔也会出来吃吃饭。

后来这家“创业”公司运行了一年之后倒闭了。好在我的Team lead Som 把我介绍给了他在ST公司当VP的老朋友。

在ST的一年时间里,我们做了一个企业应用商店来服务公司内部众多的小应用。我负责 Android 端。这个应用是我第一个认真用Java写的项目。当时很嫩,完全就是照着教程写出来的。能用,但经常会出一些bug。这也是因为没怎么写test,没有用任何DI framework ,对Java也是处于新手水平。

不过写这个应用商店的时候我就发现,在应用内部来管理小应用的可行性。

特别是将应用商店作为Web app的入口包括鉴权等,技术上是完全可行的。甚至是可以做到安全的控制更加细颗粒度的操作。后来没过多久,微信就出来了。可见我对技术敏锐感还是可以的。

再后来我就暂时告别新加坡跟老婆一起去加拿大了。

摸爬滚打

去加拿大之前我还在面一家在硅谷的公司,职位是前端。当时面试题很难,涉及的前端知识很专业。结果当然是没有过,但是我意识到我必须多准备一下子才能找到工作。噢,我还在学长的介绍下去面了一家当时很火的创业公司 Zalora,但一开始就被各种基础知识问倒。比如什么是面向对象编程,什么是多态等等。自此之后我充分的意识到基础知识的重要性,并开始恶补。

加拿大的第一份工作是在A公司。

A公司是在招了4个月还没招到人的情况下找到我的。经过准备的我,很快就过了他们的面试,开启了我在加拿大的第一份工作。他们给我的起薪比新加坡高,我和我老婆都高兴极了。但这薪水在当地却并不算高,这也为我后来的离去埋下伏笔。

在A,我学到了很多Single Page Application的东西。当时用的是Backbone.js 和underscore.js。在这里我对前端MVC模式有了深入了解。在做公司网站的时候,我第一次把css,js 和 html归类在同一个子目录里,称之为Component。后来Vue 也用了相同的概念。不说是我原创吧,至少我的技术敏锐力再一次得到了确认。😄

A是做digital ad的,后来我跳槽到了同一个城市不远处的一家做程式化买卖广告的公司,C。C公司刚刚被评为加拿大最好的Startup之一,所以跳到同行业的翘楚也算是很不错的。最重要的是他们给我的薪资比在A高出很多。

在C的两年,我先是用Swift做出了一个iOS app,后来又加入到他们的django开发团队中去做后台的网页。这里我学到了很多Python和django的东西,我会拿Rail来做对比,久而久之就发现,django的设计是多么的科学合理,以至于我现在的博客很久之前就建立在django之上。而Rails还是太魔性,做程序员越久就越难理解。

在C公司我也接触到了很好了开发团队,我们用的开发流程相当合理。每个feature都会有一个自己的QA server,我们只需要将自己的代码push到feature server QA 团队就可以很容易的验证。这里每个人都用git flow,这里的code review process 也是让人学习的机会。大家都很踊跃分享自己的知识,一切都以事实为基础。

C公司里,我学会了一种先进的权限实现方式。这个我在how to design a proper permission system 里有详细的 讲解。另外,我也学到了,SPA也不是万能的。比如大型表格,用服务器渲染加上JS 做前端UX的强化和提交都也是很好的做法。这样的一大好处是可以很好的利用到django强大的form + ORM能力。最后提交的表格也能很容易的使用后端的校验功能,这个我觉得是在我们现在B公司里最欠缺的。

我在加拿大的最后一家公司是D公司。老实说这家在滑铁卢的老牌教育软件公司比C公司还要有名。里面的企业文化很浓厚。这里也是程序员藏龙卧虎的地方。我所在的团队就有一个。他叫Sebastian。他估计也快四十岁了,但可以感觉他明显的就像一个老顽童。他对什么都很感兴趣,他最喜欢玩公司游戏室里的Mortal Combat。他有时候会把自制的发声器带到公司搞恶作剧。有时候会因为公司清洁工把他在工作桌上保留很久的发霉的面包清理走而牢骚大发。最神奇的是,他竟然用业余时间写了一个自己的OS,有点像DoS。直接从bootloader读取,有自己的文件系统,还可以跑自己写的游戏。噢,在A公司的时候也有一个程序员喜欢自己写游戏,还向我们展示他写的网页版格斗游戏。我大学也算是学习游戏开发的,最后虽然没继续做,但也是怀有一颗游戏之心的。其实平时我也是做过诸如贪食蛇这样的游戏的。不过怎么说,这些我遇到的对编程有热情的人们是深深的影响着我的,告诉我不忘初心。

D公司没做多久我就回新加坡了。

升华

我很幸运,一回到新加坡就在N公司找到了一个薪水相当的工作。

N公司是一家初创公司。创始人团队好几个都是我前一届RI毕业的新加坡本地人。这里Engineering culture的也都是我见过最好的。

我的第一个任务是改造公司的后台网站,让他重获新生。具体说就是把Angular 1.5做的网站,用一种兼容的方式把它平移到React。今后公司所有的前端都会使用React。我们寻找的是一种微前端的方案。最后我实施时用的是iframe,最简单也是最合适的方案。这个做成之后,我也陆续做了许多后端的东西,特别是Java。我们用的是Play Framework。通过这个我研究清楚了依赖注入究竟是怎么工作。我还研究清楚了OOP的各种用法,Entity, DAO的用法,Java Concurrent Programming的语法以及为什么会有thread saftey issue和解决方法。

另外,公司的微服务架构也让我学到了怎样用Kafka消息流来解决高流量,异步处理等问题。后来我也写了一下Go的服务,对Go语言也有所了解。值得一提的是我在实施Shopify x Ninja Van接入的时候,完成了整个Oauth的提供者实现,实现了Java后端验证HMac的流程。我还负责了公司官网包裹搜索中用Recaptcha的实现的工作,帮公司节省了一大笔钱。最后在前端领域,我用业余时间钻研Vue和React源代码,小有所成,并积极跟公司同事分享。

在N公司的两年我真的学到了很多,实现了之前几年知识的一个总结与升华。如果不是因为看到了天花板,我也许还会愉快的在那里多呆几年。

2020年底,我来到了B公司。因为疫情的关系,我近一年去公司上班的天数屈指可数。一直都是在家办公。在B我迎来了职业生涯的挑战。我们做的企业级应用有最繁琐的需求和最高的前端要求。在这里一年,我更多的去学习前端的一些更深入的知识,比如npm,微前端,webpack,用React各种造轮子。很多之前积累的知识现在都派上用场。接下来我们会有一个更重要的前端项目,需要实现各种图型结构的表格操作。

更频繁的技术总结

接下来我会慢慢改造我的博客网站,尝试用一些新的前端技术让写作体验变得更好,这样我就可以更愉快的写文章了。

(End of article)
Hello {{user.name}} ({{user.email}})

Comments ({{comments.length}})

Comments


From {{comment.name}} {{comment.published_at}}
{{comment.body}}
No comment yet