半工半读的实习生活到今天为止暂时告一段落,算下来整整四年有余。
这四年来,我从一个只学过C和翻阅过Python老鼠书的准小白,慢慢变成一个程序员熟练工,至少有一半的功劳来自于实习过的这家公司。
从一开始学着写PHP爬虫,然后学了一下JavaScript开始写网页前端,Node刚兴起的时候用来写爬虫运行网页脚本,移动应用热闹起来的时候,没学过一天Java直接从官方文档开始学写Android,写了两个App之后又回来写网站,时遇前端和全栈崛起,各种框架满天飞,研究一番之后写了两个前后端分离的网站。这期间,曲折的弯路走了不少,做到一半烂尾的也有不少,学过之后弃之不用的更是不少。把这些全部抛开,剩下的,才算是真正学到的东西。
这篇**算是对过去四年的小结,往之不谏,来者可追。
非技术向新人养成计划伟大的程序员哈利波特曾经说过,所有伟大的程序员都是从菜鸟进化而来的。“菜鸟”和“老鸟”之间的差距,除了天赋之外,大部分是经验上的差距。而大部分人的努力程度之低,根本还轮不到拼天赋(**汤)。可是为何许多新人养成如此艰难,或是自学太难成才?发展心理学告诉我们,人们习得新知识是打破旧的知识框架、建立新的知识框架的过程,而这个过程不但需要足够的耐心,往往还需要忍受否定自我的痛苦(谁说学心理学没有用?)。太祖曰:与自己斗其乐无穷。这才是正确的姿势。
新人很容易在学习过程中由于缺乏实战经验而沦为过目就忘的知识点复读机,联结主义心理学的观念认为知识的表征是通过知识点相互联结、相互作用完成的,翻译成汉语叫做“融会贯通”。就好比学会了C和Python并不意味着已经学会了JavaScript,但如果学了C和Python还看不懂JavaScript,那说明你没有心(谁说学心理学没有用?X2)。
当然,我最近研究函数式编程并选择了Haskell来学,瞬间又被打回原形变成小白,亟需回炉重练。对于新人养成计划,还有得展开。
团队团队自然不用说,沟通永远是最重要的,人多的时候上情下达甚至比技术问题重要,否则误会和怨气积累到一定程度,势必会爆炸。小团队自然需要扁平化的结构,一共三个人,一个组长,一个经理,这谁受得了。管理团队当然也是一门学问,并不是说技术牛一定带的了队,万一智商高但情商低那也是要命。权力下放也需要技巧,大包大揽自己累死不说,下面的人还觉得不被重视、不被信任。况且没人做的了百事通事事通,强行涉足非专业领域很可能事倍功半。像是技术Leader把全司员工工资表和裁员计划提前打印出来放在打印机上供员工观赏,这事儿我能笑一年。大家再扁平也不带这么搞吧,难道是提前实现**了?村委会没通知啊:D。
技术向前端之争广义来说前端包括Web、Mobile。从开发的角度来看,Android开发给我的感觉就像是戴着镣铐舞蹈,要命的是还要适配不同型号的镣铐。加之Java的缘故,可能由于没有系统学习过,我对其最深刻的印象只有一个词:“啰嗦”,因此如非逼不得已,我是不会想要再次尝试了。况且,凭什么要比iOS工资低!
最近比较百家争鸣、异彩纷呈的还是JavaScript,一直以来争论不休的一劳永逸型Web App和效能优先型的Native App,似乎随着混血王子React Native的到来销声匿迹了。当然我们知道唯有适者才能生存,在用户体验至上的产品狗眼中,如果用户被卡到不想用,你开发再快、更新再自动也并没什么卵用。而在老板眼中一个JavaScript程序员如果能兼容iOS、Android、Web,拿一个人的钱干三个的活,自然是美滴很!
在所有这些技术和编程语言中,我似乎在JavaScript上花的时间最多。虽然伴随着前端热潮的掀起,新的语言规范似乎想要摆脱“toy language”的头衔,然而至今为止我对它最深的印象仍然是:“随意”。就好像她在对你说,“大爷您随便玩儿,咱们基本不会错!(可是真要出了错,您可未必找得着!)”。究其原因,可能是由于入门太简单,而且可以在界面上做出的花样太多,很容易忽略了其背后真正的原理,我试着写过几篇探究背后实现机制的**,看反响确实是很多前端新人亟需补充的知识。
JavaScript与Web能否实现大一统我不清楚,但是隐约觉得可能硬件的升级速度终将使得性能可以不再受限。然而,虽然JavaScript简单,并不意味着前端也很容易。且不说各种框架满天飞,新手直接上容易有种踩着高跷绣花的感觉,其实对于很多死理性的程序员来说,审美和交互可能是一种相对较为缺乏的素养。当然这部分可能理应由设计师负责,但在小公司并不总是有这样的待遇,所以我常觉得调试和适配某些界面,并不比乔算法来得轻松。以最近做了两次前后端分离的尝试来看,React框架用起来确实比以前jQuery时代方便了许多,但是当页面结构和逻辑变得复杂起来之后,我会突然有种错觉,觉得自己不是在写网页,这分明就是Android!后来通过反省我发现,无论是Android、React还是前后端分离,他们真正的用武之地是团队协作,通过松耦合的设计实现各个模块的独立开发和重复利用,自己跟自己搞前后端分离,要不是学过变态心理学,都容易搞出精神分裂(谁说学心理学没有用?X3)。
后端之苦不愧是跟JavaScript一前一后的两个好兄弟,宇宙第一语言PHP最大的包容性不在语法而是体现在“只要您能想得到的功能,咱库里基本都有”。我用过的两个框架:CI和Phalcon,自然是觉得Phalcon更优雅(虽然它标榜的优势是“快”),缺点就是(当时)文档较少,遇到问题比较难处理。Phalcon是基于PHP扩展的框架,我也研究过一段时间的PHP扩展,后来尝试去写一个基于PHP扩展的模板引擎,比较尴尬的是写出来结果在有些时候比smarty还慢;还有一个嵌入人脸识别功能的扩展,其实想法是很不错,只可惜没有深入优化,现在代码也不知道哪里去了。我觉得脚本语言中某些性能瓶颈通过嵌入C语言模块的方法来优化是一个很值得深究的领域,而且大部分成熟的语言像Node、Python都有公开的接口可以调用,后面有时间我会继续研究一下。
相比前端一家独大,后端除了PHP以外可供选择的套餐非常丰富,例如Python/Node/Go。我分别做过Python(flask)和Go(gin)与PHP的性能比较,结果是不涉及DB访问时Python是要比PHP好,但加上DB读取之后PHP可以甩开Python几条街,PHP数据库驱动部分还是更专业一些。当然,Go还是可以全面压制PHP的:D。前两年有兴起一股“敏捷开发”热潮,主要是以RoR为代表,公司也有尝试过,但似乎并没有很大成效。小团队无论是出于成本还是技术层面的考虑选择“敏捷开发”并没有什么错,但很容易忽略的一点是,如果对于产品的设计和思路不够清晰,技术手段再快也只能是快点“做死”一个产品。
这个小标题“后端之苦”,并不是说写后端的程序员更辛苦,一方面是指后端开发没有可视化成果即时展现,相比前端会更枯燥乏味一些;另一方面也是指后端服务运维方面的辛苦。前几天有人分享了一篇**:如何写出不可维护的服务端程序,引起很多共鸣。不光是在接手别人配置的服务,即使自己亲手写出来的配置,几个月过去再回来看可能都已忘记。以我的经验来看这其中最痛苦的并不是遇到什么新问题,而是遇到问题之后发现这个问题如此熟悉以前一定遇到过甚至能够回忆起如何一步一步Google得到线索的情景,但就是没办法想起如何解决,然后只好再一次重复一步一步Google的路线,就像西西弗斯推着巨石上山一样,一次又一次。到这时,你才会发现记笔记和写Blog的优越性。
开源之美好吧我承认这个小标题是为了对称。git现在应该已经是程序员版控的标配了吧,自从加入了全球最大同性**站以后,虽然并没有太多时间花在参与开源项目上,但还是非常喜欢这里的氛围。每天逛一逛,关注一下有趣的项目。除此之外,GitHub也成为继stackoverflow之后第二个寻求技术问题答案的地方。
之前做了一张图学JavaScript竟然有4k+关注,受宠若惊。同一系列的一张图学Python 3虽然一直处于未完成状态也有500关注,希望后面有时间可以补完。接下来也会尝试从一些小型开源项目开始,参与开发维护。
总结现在别人问我专业方向,我都说是“工程心理学”,省去被要求算命的麻烦。因为科研方向是场景识别,接下来图像处理和机器学习自然是研究学习的重点,之前上完了吴恩达老师在Coursera的课程,感觉像是又学了一遍高级心理统计,现在越来越多机器学习的框架正在变得系统化、工程化,而且对计算量的需求也提高了对并行计算以及计算性能的要求,虽然现在数据挖掘领域争得不可开交的是Python和R,但是关键时刻还得上C/C++啊(说来惭愧,C++我也是一天都没学过啊,我真是非主流啊哈哈);然后是函数式编程(Haskell),也许并不会实际应用到生产项目,但确实可以感觉到能够带来许多新的思维方式,彻底改变对于很多问题的看法;最后闲暇之余,很想以做一些(尽量可以小而美)的OS X App,目前看来Electron + JavaScript会是很不错的选择。
我非常喜欢《三体》里的一句话“给时光以生命,而不是给生命以时光”(虽然这句话并不是帕斯卡所说,但我还是喜欢:D),许多人觉得程序员不过只是“码代码的”,但我觉得我们只是在借用代码创造这个世界上还不存在的美好事物,我们是画家,是艺术家,哈哈。
Make good things.
|