3409与Swift转码
突然想,和Ric的故事应该专门再单独写一篇来讲。因为我从物理系学生,到Swift程序员的转变,完全是和Ric强相关的。
转码
2017年3月15日,是脑中转码念头诞生的日子。在那天,见到了项目主管Drew。他在项目安利的宣讲会上,长篇大论介绍ECE的软件方向优势。彼时,我仍以为写写MATLAB和LabVIEW也算写代码。直到2018年,一切才迎来转变。
三年秋招分成了三个不同的部分。第一年秋招,拿着申请硕士的简历便去投,上面满是光电子和半导体所的经验。在2017年的TechConnect上真是胡言乱语,一门心思把光电子学往信号处理上靠。最后也只是记下了几个网申链接和二维码照片。完全没有概念自己能做什么,况且还找了宫老师的实验室,抱着大不了读博的想法耽误了许久。
第二年秋招,简历自然丰富了许多,尤其是学了第一门正经编程语言C++后对编程世界有了基本的了解。虽然MSVC++并不好用,但依旧靠它编了不少程序。于是,第二年变成了带有信号处理背景的C++程序员。可到了招聘会我就傻眼了——企业都在用C++做的事情,为什么我一点儿都看不懂呢?在那时,我甚至还未完全理解线程和进程的概念,甚至没写过一行socket相关代码,对Linux的了解仅限于ls -ahl。以这种水平,我竟然也大言不惭地侃侃而谈起来。可以想见,回复依旧寥寥。唯一有希望的就是Xilinx的赵大爷。或许还是我学历不够,最后没能成行,也断了我继续读博搞信号处理的念想。
第三年秋招,目标一下就变得极为明确。而这一年的转变就是我和Ric故事的戏核。终于,在TechConnect上联系的公司不再杳无音信。有好几家公司都跟进了,但最后依旧只有两家和我契合度很高的公司走到了最后。好在,最终上岸了。
初识
初识Ric是在2018年8月。我的第二份I20表格直到6月初才姗姗来迟寄到我的手里,而面签距离机票日期仅有不到两周。抱着侥幸心理,我想,总不能连续两次签证被check吧。想什么来什么,怕什么来什么,还真就被check了。幸亏提前有点儿预感,买的机票只损失一千块的改签费,还是比直接买八月底热门时间的便宜。于是,返回美国继续学业的日期被推迟到了八月下旬。
本来我都计划的好好的,七月初到了加拿大找孙辰玩儿一周,然后到独自一人的公寓闭门刷一个月题,为找工作做准备。这一下子计划全乱了,刷题的节奏也飘忽不定。接下来的几周里,自己确实做了几道题,但距离当初设定的一周30题左右的数量相去甚远。怀着侥幸心理,还是心安理得地放空自己玩儿了个够后,便回到了学校。
由于I20拿到时,选课系统已经开了一个月,所有秋季的热门课程早已爆满。我面临着没课可上的局面。最后大致选定了几个备选方案:NLP、iOS、算法、并行计算、还有另外一个信号的课,记不清了。我想着,60人以上的大课,总还是有机会走后门,通过Tony或者任课老师特事特办给个code挤进去的;冷门小课排waitlist或许也能有戏?事实证明,这两个推断都还靠谱。
夏天有一段时间,学院规定算法课只允许硕士一年级的学生选,其它学生需要向Drew解释为什么上这门课。于是我第一件事就是向Drew寻求帮助,让他把我塞进去。Drew7月份让小秘发给我一个code,当时还以为这就妥了,就没放在心上,想着到了学校听两节再选这课呗。结果8月23号一看,我靠!permission code还带过期的!选不进去了!😭赶忙求爷爷告奶奶让系里帮帮忙,小秘装聋作哑没理我😤。直到开课后第一周作业都布置了,我还没选进去,当晚老师发邮件给wl的学生说你们不要选了,坐不下了。心灰意冷差点就选了并行计算课之时,小秘极为高冷地给我发了一封不到10个单词和一个code的邮件。最后一秒侥幸上车!我也能学算法了!
事实证明,这个极限操作也极大地左右了找工作这件事。如果没上算法课,我可能还对几大常考算法没有任何概念。上了算法课,既让我学了很多算法基础的诸如渐进复杂度分析法、有限状态机、大欧米伽表示法等等内容,也让我接触到经典背包问题、NP问题、Bellman Ford arbitrage等等内容。这些基础算法开阔了我的视野,也大致摸清了自己哪方面算法能力还有待提升。
NLP课则是直接和Patrick说情,他强行扩充课容量把我塞进去的。就凭这点,我就不能怨他给我两个B。Patrick是个好朋友,年轻有为,但不是这篇文章的重点,暂时略过。
最后则是iOS。当时的打算是2018年秋天,上一门信号,一门编程,一门综合;一个难,一个中等,一个水课。如果不选iOS,那么“恰好”符合这个计划——并行难,算法中,NLP水。事实证明NLP并不水,而Patrick讲课方式有待商榷。后来变为iOS后,“难”课的位子自然留给了它,我也以对待一门难课的思想准备来聚精会神地钻研它的内容。
第一次见到Ric是在ECE564的课上。之前没听说过这个老师,也不知道他讲得怎么样。据上过他春季ECE651软件工程课的同学反馈说课堂效果极差,差点被投诉到学院取消这门课。没抱太大希望,却获得意外之喜——我发现,这个老师说话节奏慢,发音吐字清晰,也比较幽默,不像工程师那样硬核,更像是大爷给你讲故事。这门课另外吸引我的点:能够从学校借苹果电脑和苹果手机用来写程序和测试;上课能够学一门正经的、现代的面向对象的编程语言。仅从前两节课上对于Swift的了解,我便大致断定它比C++要好写多了。事实证明,这个判断再正确不过了。
可是,当时他课上人数众多,30的课容量报了35个人。因为教室只能坐36人,他让我等等看有没有人退课。到了第二周末,最后退到32人,他也大笔一挥地让我留在了课里。于是乎,2018年秋天的三门课,都是以阴差阳错却有惊无险的方式选上的。
留下印象
564这门课只讲iOS,iOS里主讲iPhone应用设计,只用Swift编APP。局限在一个特定的点有些好处:能够深究这个特定领域的内容,精力不用分散到学习其他不相干的库和工具上。
前几周都是编程基础,留的作业也只是手动画frame来编写简易的图形化界面程序。前三次作业我甚至都有一次没拿到满分50分。整个课的安排是这样的:前六次个人作业,完成一个类似于团队人员名单管理的应用;后面一个半月3至5人组成团队,做自己想做的应用。每次个人作业满分50分,分为45分基础分和5分加分。考虑到自己把564当做“难”课,我对自己的要求便是每次作业尽量拿到满分,期末看是否能够争取达到A+的分数。
作业说难不难,简单却也并不简单。尤其是三门课同时进行,时间安排不好就会顾此失彼。由此想到本科生都是一学期五门课左右,压力之大可想而知。第三次作业就因为时间没安排好,只完成了规定的内容,拿到了45分基础分。当时的助教Nirah是个不错的小伙子,本科是Rutgers学CS的,当时已经拿到了苹果MLE的return offer。羡慕之余也总想着和他套近乎,毕竟苹果是家不错的公司!
和他套近乎,自然也就和Ric熟络起来。尤其是第四次,设计一个矢量动画页面的作业上,我搞了个骚操作、至今被后人奉为“太骚了”的作品。那次课Ric在当场展示作业时候选了我的,大家看到我的动画后都哄堂大笑,气氛其乐融融。我想,那一刻或许是将我踢向Swift开发职业道路的一脚助攻。
我所喜爱的工程师岗位,我做编程的原因,是为大众铺路、提高别人工作的效率、解决别人的问题,以至于为朋友带来快乐。第一次,我发现自己写的程序能够让现场的三十人心情愉悦一阵子,这种满足感是写多少C++命令行程序都换不来的。Ric的笑容很温暖,也很具有感染力,典型的美国南方大爷,不像新英格兰人那种高冷的、皮笑肉不笑的笑容。
自此之后,我知道Ric认识我了。Ting不再是一个随机的中国学生的名字,而是那个“特别”的、满脑子都是点子的学生。同样地,圆圆也给Ric留下了深刻印象,同样也给我留下印象。我们或许是一类人,我们写程序是为了讲述故事、传递情感,而不是让计算机命令式地告诉你一个问题的精确解。那时我也发现,写程序不一定非得如何天赋溢出、与生俱来;写好自己的程序,总会有些价值。
加深印象
个人作业收尾部分,作为做的比较好的代表,我的作业在课上被展示给大家。那时有了一点信心,因为我发现,如果大家都是零基础开始学同一个内容的话,我用“难课”的心态去应对时,能超出常人许多。况且,我的OOP经验远比在场的其他人少很多,可反倒是我的程序表现得最好。或许他们算法能力比我强、计算机基础知识比我扎实、代码风格和习惯比我好,但至少在某些方面,我也有优势。这让我的信心死灰复燃。
转码这条路看来能走通,但依旧需要大量的投入。首先就是上面提到的计算机基础。没有接受过系统的CS教育,很多东西都是两眼一抹黑,写一个类的时候怎么写更优雅、更易维护,完全没概念。一千行的VC写了不知多少个,只要有东西全往类里塞。这边是C++“百尺竿头更进一步”的心态遗老。
作业做得好,得到Ric赏识。可小组项目的另外两个队员有些不给力。彭大哥虽然在IBM干了多年,可净是CRUD的重复劳动。尽管system design有着充足的经验,但真到真刀真枪写起来的时候总是掉链子。况且,外企多年的温水煮青蛙让他连Git都用不熟练,做不到agile development。最后没法子,只好让他们各自在不同的文件里操作,根源上避免合并时的冲突。Ryan则是典型的江南区阔少,明显不差钱,读杜克CS纯粹为了有个好名头,以后回家接班。他号称喜欢前端设计,我便放心地把界面部分交由他来负责。结果两周后他表示没做完。好在我又有备用方案,探讨一番后决定将我俩的成果糅合起来,作为最终项目的界面设计。
队友拖油瓶并不妨碍我的一人一城。一个人扛起一支队,老詹做了太多次,我为啥不能干一次呢?还有涛兄NLP带飞和Monica算法作业的异性鼓励100%加成,那时我的代码无论数量还是质量都在突飞猛进。
也别管是熬夜还是单干吧,总之在Ric放羊式项目进度管理的背景下,我硬是扛起了大旗,爱上了GitLab的使用逻辑。开了40个issue,直到结题时完成了三十多个。绿块(灰块)几乎填满了历史图的每一个日子。期末展示那天,当我演示“文字表情包”功能时,终于看到了冬日大家脸上久违的笑容。男生是“呵呵草”的笑容😈,女生是“捂嘴笑”的笑容😏。我知道,这些努力没有白费。
Ric表示下学期愿意收几个学生继续帮他写APP,做项目,说的时候眼睛盯着我。心领神会,下课便鼓起勇气跟他表明意愿。于是在2018年底,终于拿了SSN,开始了正经写码营生的活计。
临门一脚
还得感谢彭大哥。看他辛辛苦苦的用Java刷题时痛苦的模样,我逃也似的避之不及,决心永远不写Java项目。曾多次提到他对我至关重要的帮助,这里干脆补足细节。
有一天,上课前我们闲聊面试和投递情况。他表示有过去IBM经历加持,收面试比较容易,但由于走上管理岗的后遗症,写码水平有些退化。便聊到写码,他的主业是Java Web/J2EE,接着写码还打算做这个方向。于是便是那个至关重要的问题:
“你打算做什么方向?”
“我……”支支吾吾答不出来。
“你这不行呀,没主意的话咋准备呢?”当头一棒。“我觉得你iOS就写得不错,你考虑考虑做iOS?”
彭大哥的湖南口音说到iOS时抑扬顿挫,爱欧埃思。我的思绪却飞到了远方。
写Swift做iOS不是不行,而且我也很喜欢做这件事情。但是就像邓以诚、白可、邹邹、于博,无数同学朋友说的一样,读了半天研究生出来干高中生就能干的事情,不觉得亏吗?学了那么多年的知识都喂了狗吗?
沉没成本无法割舍的心态非常常见。读博要不要quit要不要转码;温水煮青蛙要不要创业、回国、挑战自我;一泡污工厂混吃等死要不要考个公务员。问题的答案反映了一个人的未来规划与人生观。对我而言,从最初认为转码低贱,到后来发现转码具有可行性,转变的发生是艰难而曲折的。
写代码,尤其是写自己喜欢的语言和喜欢的代码,是一种不错的营生手段:薪资合理、具有发展性、挑战性无上限、既不会因为把热爱的兴趣变成职业而折损热情,又不会因为不喜欢而缺乏上进心。对软件代码有点兴趣,但并非生活的全部。这就像上班工作于人生中的定位一样。
上班远非生活的全部,但人需要工作才能保持和社会不脱节。富有的人无需从事折损精气神的工作,也可以随性安排工作强度、工作内容,这是最佳;暖饱的人无需担忧基本生存,但仍需要收入可观的工作支持更高的追求,写代码在这个层面是件还行的活计;生存线上挣扎的人急需面包,不得不耗费一定气力与热情来换取更多的金钱,稍稍不妙但仍可怀有希望。目前自己处在生存之上,暖饱未满的阶级,选择写码是可行的、有益的。
于是我决心,在之后的为Ric工作的阶段,慢慢体会Swift和苹果领导的软件开发是否符合上面的要求,是不是一个较好的编程领域。如今事实证明,它还是比较适合我的。
寂静的春天
来到中心后接手的第一件任务就是FitnessFinder,一个为医学院客户开发的业余活动推荐APP。客户之一Tori是个漂亮的小姐姐,在读MD;另一个负责人是Kim,曾是美国奥运预备役选手,退役下来在杜克继续搞体育。和她们交流,让我更多地看到了学校其他部分在发生着什么。
最初的设计图非常草率,原型版本APP也十分简陋。给客户展示后她们比较不满意,提出了很多的意见。将意见一条一条具体化后开发变得好办起来。选型三方库,发现了许多合适的轮子。组装起来的第二版原型就比较令人满意了。当然,这个过程绝非说起来这么简单。2019年2月底,纽约回来后绝望地发现自己还没实习,而学弟学妹纷纷亚麻上岸了。选型又没选好,根本不知道项目下一步该走向何方。采用“穷夯”调研和“头脑风暴”的策略后,我和圆圆终于敲定了一款合适的轮子,决定无论如何也以这个轮子为基础,不再改变方案了。后面的事情便顺利起来。
3月和4月是埋头3409写代码的日子。Ric时不常过来看看,更多时候是我们及时将进展汇报给他。第三个开发周期结束时,APP给客户展示后她们表示基本满意了,准备开始小范围测试,并录入真实活动和地点数据。于是又当起“全干”工程师,以仅有的一点点Django经验,用默认模板搭起了一个数据库录入界面。其间还遭受字节跳动大哥的“dequeueReusableCell”的疯狂鄙视和Philip Lam的温暖鼓励。总之,一个春天过去,从前到后从数据库到UI全程走了一遍,现代软件开发的流程算是有了个大致的印象。时间便来到了毕业季。
毕业季与暑假
除了日常伤春悲秋、自怨自艾、顾影自怜等矫揉造作的矫情外,代码还是照样写。FF的工作进入收尾阶段,这个项目居然成了中心并行的四五个项目中,唯一一个按时交付的!Ric最初给客户的承诺都是一学期结束交付样品,结果25Live、HHC、Sakai都存在着各种各样的问题。这让我信心倍增——看来我还不算差!
到这时,我的简历终于能够单独靠Swift项目撑满了。可在这个时间点找实习实在是不现实。然而我真的不好意思开口让Ric帮忙,而且明知道这时候多数企业都没实习名额了,谁也帮不上忙。最后谈起实习这件事时场面一度非常尴尬,Ric明白我能做很多,但事实就是这样。他最后承诺帮我想办法在暑假在学校搞个全职的坑位,在学院会计走个过场,假装当做“实习”来做。
不得不再次感谢Ric。如果没有他搭的这把手,可能我的暑假又要荒废过去了。回国,耽误耽误签证,水水刷题,啥都没干一暑假后再后悔已经是家常便饭了。好在,学校的环境督促我专注于继续写代码这件事。独自一人使用3409的MacPro,加上两个月整的独自占用2B2B,让我的暑假生活变得十分自律而充满节奏。
我知道,要求Ric在学校放假期间常来学校是不太现实的,也就没抱太大希望他能帮我多少。没曾想,Ric还挺上心,一周至少来看我一次,让我每周都能和活人说上话儿,聊聊工作和生活。真的非常感激!他完全不必这么做。
暑假最初,Ric为难地表示他手里只有3000刀的funding,让我省着点报时间。接着安排的几个任务是重构清理25Live、清理上课例程、编写登录模块。估摸着他觉得这几个项目就能写俩月时间,没曾想我花了一个月左右就全搞定了,还是悠着点儿每周只工作20小时左右完成的。总共开了不到1000刀薪水就把任务全完成了,连我自己都感到惊讶。
6月中旬的一天Ric突然跑到3409,撸起袖子加油干,花了一个上午我们一起把屋内设备进行了精简和重构。除了空间变大了、变得整洁了,我还得到了几个意外之喜——翻出一台Echo,之后的每天我都可以Alexa start my day和机器人聊天儿了;翻出一台Linux主机,开启了Server-side Swift的大业;翻出了12个iPod,开了另一个项目iPodClustr。这样,Ric又给我额外安排了几个开放结局的项目:564课程服务器用Swift来写;写个APP把一群iPod无线组网;看看Swift还能做些什么,到时候讲次课。可以说,这些“命主题‘作文’”使我如虎添翼,废寝忘食地走向自学成才的道路。
秋季
硕果累累的暑假后,该找工作了。
先是去罗德岛,然后是父母来东岸玩儿,刷题真的就一点都不靠谱。只能硬着头皮找纯Swift的入门级别工作。真是难啊!
在Search Work Team上我不止一次在Carey和Scarlett面前提到Ric,说到她们耳朵都起茧子了。也不知道是冥冥中的暗示还是Carey背后帮我了一把,Ric竟然特地来找我聊找工作的事情。他表示会尽可能帮助在IBM和苹果方面找找关系,但也别奢求太多。
没想到,IBM的HR居然真的找上门来,还是通过很直接的由上至下的关系找来。结果跟Ric一说他还不知情,还以为他的电话石沉大海了呢。可知IBM的管理层级有多么复杂……
当时挺想去IBM的,直到现在都还在想这件事。原因在于苹果把一些服务“外包”给了IBM,比如CoreML的后台。Kitura也算个明星项目,而IBM研究院更是组织了Swift@IBM的组,专门给苹果当靠山廉价劳动力。另外,IBM在分布式和运维等领域也颇有建树。在之前的文章也提到过。
除了时不常的关切,Ric还大手一挥把许多更加细枝末节的事情交给我们自己处理。7月时候他曾经想让我插手一些Swift和Python的医疗器械程序混编,但被我用“时间不一定够”不好提钱的理由搪塞过去。后来,便有些零七八碎的小事,填满了整个秋季学期几乎每一周的20小时限额。这小半年比暑假前的大半年挣得多多了!Ric心里有数,知道之前有些亏待,便任由我赖在3409混工时。当然我也没闲着,所有事情基本都妥帖地处理掉了,让2019年秋季的564成为了近期质量最好的一节课。
最后一学期,代码不再像暑假时那么枝繁叶茂地野蛮生长。更多的学习到了项目管理、如何安排分配任务、如何与人沟通。和Ric的交流不再是掰扯代码实现细节,而更多的是对于设计的理解。对我来说,这样的补足是很重要的,甚至在后来的现场表演中也受益于这些漫无目的的交流。
尾声
和Ric认识后的一整年,我从一个信号处理爱好者、预计的光电甚至超材料入坑博,变成了全校iOS界家喻户晓的专业户。当然,Trevor让我见识到了牛的美国本科生有多牛,但我们之间的差距也不再是一条鸿沟。花了一年时间学习编程,我居然能看到顶尖美国CS专业本科生的尾灯了!让我深感荣幸。
想起过去青年文摘上的一句话:“我比你只笨四年”。虽然我不聪明也不笨,但转码前真的隔行如隔山,肯定是看不到任嘉毅的尾灯的。如今,虽然和他们还有距离,但至少我们都在一个时区了。假以时日,我们或许能够重新站到同一条起跑线上来。
“一步错步步错”的魔咒,笼罩了我7年。直到前两天,我还感慨“这么多年过去了,还是觉得没考上清华真是sb[大哭]”。或许我永远无法与过去握手言和,但“笃信命运,从不服输”的心态正在让我的生活一点点走上正轨。
Ric作为这个转变过程的经历者、见证者、参与者,真的帮助了我太多太多。我只能不计成本地回报他,以感谢这份久旱逢甘霖、他乡遇故知的恩情。
补遗 - 赵浩鸿
如何看待我自己,不要骗自己,你会开心吗?
帮家人规划计划能力;教同学讲解能力;
和赵浩鸿的一些午饭。科比与NBA、走了真不适应、人际关系与代码实力。
有些赵浩鸿参与的片段,但记得不甚清晰。等什么时候被浪花带到岸边,再一一拾起吧。
Leave a Comment