注:此文较长,有六千余字。其中第一部分是生活相关,程序猿可以跳着看;第二部分专业内容较多,普通读者可以跳着看。第三部分老少咸宜。
初识
在我小学的时候,我爸自己买配件,组装了我们家第一台电脑。至今我仍然记得它的核心配置:奔腾的CPU,256M内存,一两百G(具体的忘了,只记得不是很大)的硬盘,没有独立显卡。普通的主机配置,配上了个当时挺先进的液晶显示器,5000大洋就这样花出去了,显示器和主机对半分——在当时那个主流是CRT显示器的年代,据说液晶显示器对眼睛好,于是我爸就买了。就是这台现在看来Low到不行的台式机,完成了我的计算机以及互联网启蒙,也让我萌生了以后从事IT行业的念头。
那时的电脑虽说已经开始普及了,但也不算很多。我对电脑知之甚少,除了看我爸操作之外,也没有老师。于是,刚开始那几天我就喜欢拿着鼠标在那瞎点:这个是什么?这里有什么?这个类型是“应用程序”,好像可以打开,打开试试。这个好像是游戏耶,玩玩看?进程是什么?好像没啥用,结束试试?居然不让结束……通过各种瞎操作,我慢慢熟悉了怎么玩电脑,哪里有什么功能,哪里有游戏玩,哪些东西是重要的文件不能删除。而学习代价是,家里的电脑重装过好几次。不过因祸得福,我从中学会了怎么重装系统,以及在使用中需要注意的一些小技巧,比如说,桌面不要放东西,C盘不要放重要的文档(当然,现在不需要注意这些事情了,只要硬盘没坏文件都能恢复)。喜欢折腾,敢于折腾,直到现在我都是这样。
除了折腾系统,我还折腾过各种应用,首当其冲的就是office。Word和Excel简单玩了下就弃了,觉得没意思,用不着。PPT玩了比较长的一段时间,各种动画配上音效,感觉十分有趣,所以多玩了会。还记得我曾经花了一天的时间做了个PPT,配上我自己用画图画的简笔画,加上了超链接、图标、声效和动画效果,介绍了我自己和我的小伙伴们。当我把PPT放给我爸妈看时,我爸妈全程保持微笑,最后给了个“做得不错”的评价(因为确实太简陋了,缺乏内容,而为了追求“炫酷”加了很多乱七八糟的音效和动画效果,反而让整体表达很凌乱)。在当时我的眼里,这就是我的得意之作了,而这个叫做PowerPoint的软件有点意思。等到了初中,我们老师开始用PPT辅助教学,我才意识到:原来我小时候玩的那个PowerPoint,居然可以玩得这么好!
电脑不仅仅可以用来折腾,还能用来玩。熟悉了电脑之后,我会经常和伙伴们一起玩游戏,沉迷于“三维弹球”(打上过300W分,傲视“群雄”)和4399,玩各种Flash游戏,也会下各种小游戏。当时最喜欢的,是和隔壁的小伙伴一起玩格斗游戏,玩累了就一起玩下炸弹人,人多了就一起玩三维弹球,不亦乐乎。而后,见识到了《红色警戒》和《帝国时代》,当时就让我震惊了:居然还有这种游戏?!相对当时简陋的flash游戏,还有一些几M的小游戏,这种经典RTS游戏不管是从画面还是游戏性都不是一个量级的,这对我造成了很大的冲击。虽然我不会也没有机会玩(家里不让,自己太小也玩不动),但是我会围观啊!和小伙伴们玩累了,就跑去看别人打红警打帝国。于是后来,老妈在楼下找不着我,就会去楼上抓我注1,一抓一个准,一度让我爸妈觉得我是个网瘾少年,不过还好没有送我去杨教授那里(虽然说当时还没有出现杨教授)。
就现在看来,这段经历对我影响很大。首先,扩大了我的视野,让我知道游戏其实是可以做得很丰富的。“曾经沧海难为水,除却巫山不是云”,见识过优秀的游戏之后,就不会再执着于普通的游戏了。在未来的人生中,除了中间踩了下MMORPG的坑,对所有游戏都能保持一颗平常心,以娱乐的心态去玩。“我在玩游戏,而不是游戏玩我。”当然,这样也会引起一个问题:在对抗性比较强的游戏,比如MOBA游戏(类dota游戏,LOL这样的),没有很强的求胜欲就很难玩,或者说,显得太菜了。其次,让我产生了“我不仅要玩游戏,还要做这样的游戏给别人玩!”这样的想法。当时就有很强的欲望去学习编程学习做游戏,然而因为年少无知,只是听说写程序要会各种各样的“函数”,就想着“哎呀自己现在太小了,函数(数学上的)要等到初中才会接触,我现在学起来太早了学不会”,于是就将这个想法暂时搁置了。等我高中真正开始接触编程的时候,才发现,虽然都是function,虽然都翻译成函数,但是在计算机领域和数学领域两者的含义完全不同啊摔!就算是小学的知识水平也是可以玩的啊!即使完全不懂数据结构和算法,做一些简单的东西也还是可以的。只可惜当时自己并不知道这些,等到7年后才明白过来。
踏上征途
高中的时候,被我们计算机老师推荐去参加NOIP注2,由此踏上了编程之路。当时入门学的是Pascal语言,它非常适合入门,因为,你写的有一点不规范它都会报错给你看……Pascal语法简单,写法固定,内置的函数不多但是够用,对新手来说非常好上手。新手可以很快学会语法,然后开始专注于算法,十分适合我当时的需求。虽然说自己水平太渣,最后没能拿到一等奖获得保送资格,但对此我也只是稍微有点遗憾而已。我在大学遇到了很多不错的小伙伴,大学生活虽不完美但也算满意,足够了。而且,在这一年多的学习中,我学到了非常重要的能力:解决问题的能力,即算法。语法其实并不重要,虽说每种语言都有其不同的语法,但一通百通,顶多是对语法糖不够熟悉,需要多写几行代码而已;而算法是灵魂,是程序的核心。寻求解决问题最佳算法的能力,对程序猿而言尤为重要。用恰当的数据结构和算法去解决问题,事半功倍。只知道复制粘贴的码农还在加班搬砖的时候,优秀的程序猿已经造好轮子把砖搬完了。
数据结构和算法在高中的时候已经打好基础了,我在高中毕业之后,就开始横向扩展学习了。在高中毕业的那个暑假,我买了一本C的学习教程开始学习。我在这个过程中,C和C++傻傻分不清楚,后来C学了一点点就直接转投C++怀抱了,只是因为我更喜欢用cin
和cout
,喜欢用各种好用的库。更重要的是,我写了接近两年的面向过程编程,想知道下什么是面向对象编程。暑假结束了,我也成功专职为一名C++新手程序猿。
在大学,大一的时候选修了Visual C++
,老师讲的核心内容是MFC,主要靠自学,踩坑无数……但踩的坑都是有价值的,这些坑让我知道了Windows界面程序的大概机制,以及基于事件的编码模式。课程的期末作业,我做了个可以自定义配置的扫雷游戏,拿了90+。
大二的时候选修了安卓开发,见识到了安卓这个大坑。还好之前修了Visual C++
,对于安卓的一些概念理解起来非常轻松,但是坑踩起来还是比较艰难。在这个过程中,学会了基本的Java用法(只敢说基本用法),更加深入地了解了各种设计模式,学会了不少东西。结业之后,写了个有联系人导入导出功能的短信群发器,春节的时候用过两次,十分好用(但是后面安卓更新了就不能用了)。在这得说一句,安卓水太深了。咋一看好像安卓谁都能做,按照教程来很容易就可以做一个简单的APP。君不见移动端火的适合,安卓培训机构一大堆,如今还有几何?想要做一个稍微大一点的商业用APP……在没有大牛的情况下就是异想天开。
大二下学期加入了一个实验室,从此踏上了Web后端的不归路。大二末的那个暑假,整个暑假都在学校,从零开始做一个网站。真的是从零开始,我们选了个PHP框架,所有的资料就只有W3C手册和PHP框架文档,我们就这样艰难地把这个网站做出来了,而且还上线使用了!缓存?不存在的,用了大半年之后才知道有缓存这个东西,后面才加的。模板引擎?那是什么?还是后面老师给我们找了个大牛,我们才了解到原来还有这样一个好用的工具,然而已经没有机会去改了。原始的Windows+apache+php+mysql技术栈,除了一个简单的PHP框架外,干干净净。前端就只有jquery,依赖原生PHP渲染页面。现在想想,真的是初生牛犊不怕虎,一共12个人花了2个月的时间就把一个网站基本怼完了,还是挺厉害的。而我在其中扮演的角色是PHP工程师,但我做的最有意思的工作,却是给前端写的两个模块:一个路由模块,另一个是分页模块。其中分页模块在使用中不断地优化,被我推荐给了所有与我合作的前端,用起来还不错,直到前端框架的出现,它才寿终正寝。说起来,在我当前公司,还是在我的推动下才用起了前端框架……
大三的时候,凭借开发经验,和朋友小林一起尝试了下CTF注3。三人队,我们两个人去参加,肝了一整天,做了几个题,拿了二等奖。奖品是200元京东卡,刚好被我们平分了,还是挺不错的。我对安全略有兴趣,因为本身做网站开发,身边也有做安全的,对安全比较重视。但对CTF只是浅尝辄止,深入下去就是走安全方向了,安全的坑太深太深……但在玩CTF的过程中,接触到了Python,才知道,Python大法是真的好。
大学的尾巴尝试了一下和朋友一起创业,发现自己除了写写代码,一无是处,并不适合创业。毕业后开始工作,依靠PHP和Python两门语言,做各种项目都算得心应手。中间花了一个春节加上约半年的空余时间,用TypeScript给VScode写了个插件,适用于自己用的PHP框架,极大地提高了自己的工作效率,至今已经有98K的下载量了。嗯,没错,就是这么骚:用前端语言给自己后端框架写专用插件。感觉很有意思:)
感悟
兴趣是最好的老师。
有兴趣,才会有热情,学习起来会更有效率。即使没有兴趣,很多人从事这个行业只是为了生存,为生活所迫才去学习,这也是可以理解的——有时候生活的压力反而让人更有学习的动力。但,不管哪行哪业,持续学习都是必不可少的。单纯因为生存压力下的学习,很难主动、持续。
有一些人,只是呆在自己的舒适区里,麻木度日。早期辛苦学习之后,通过面试拿到工作了,于是暂缓甚至停止学习,工作中遇到新东西才去被动学习一下。搬砖也仅仅只是搬砖,不会考虑、抑或没有能力去考虑怎么更快更好地去搬砖。大牛写的工具,只知其然不知其所以然,会用就好。在广大普通的公司里面,这样的人很常见。事实上,这样的人其实也有其价值:成本低,可替代性高。一群码农用大牛写的工具开发应用,一块块砖堆上去,一个应用就成了。做的过程中大牛时不时监督下,核心功能自己来做,做好了测试一下,最后丢给甲方——很多外包公司就是这样的套路。甚至在一些换皮的游戏公司,这样的事情会更极端更多。
只是,对于个体来说,其职业天花板会非常低。
其实解决的方法即简单又复杂,就是多学、多做。简单是因为这两点大家都知道,复杂也是因为大家都知道,但是能做到的不多。是要多学,但是到底要学什么?是要多做,但是多做就是多加班多搬砖吗?
多学的背后,其实隐藏的是个人的职业规划。以前端为例,能找到工作一般代表你会jquey,会用前端框架,css也比较熟悉了。那么,你会用css预处理器吗?你真的懂vue的组件吗(本人只玩过VUE,所以只能以此举例)?你会自己封装组件吗?vue数据驱动模型你了解吗?webpack你玩过吗?nodejs做中间层做过没有?……广泛使用的Echarts
是前端项目,bilibili的H5播放器也是前端项目,VScode和Atom也是基于nodejs来做的,前端们了解一下?当然,这个例子极端了,我只是想说明,根据个人的职业规划,可以走的路有很多,可以学习的也有很多。根据个人基础知识的不同,其职业天花板也会有所不同,但,肯定比盲目搬砖好多了。最不济,根据所学自己造两个合用的轮子,可以节约很多搬砖的时间!多点时间留给自己,岂不美哉?
多做,不是指重复搬砖。同样的砖搬十年,就代表有十年的工作经验?并不是这样。多做会涉及重复,但是重复不是目的,在重复中找到共同点才是目的。找到共同点,想办法提取出来,实现复用,这才有价值。类似的代码,遇到一次两次还能直接复制粘贴。如果再遇到,还是选择复制粘贴吗?还是做成库,以后一行代码解决问题?甚至更进一步,能不能用代码去生成代码?类似脚手架一样,类似的东西一行命令就生成出来,自己只需要再小小修改下就行。在做的过程中思考这些问题,才算是真正的“多做”。像远古时期的WEB端,哪里有什么框架,都是乱七八糟的。随着项目的发展,有识之士发现自己重复做的东西有点多,于是开始建立库。再后来,库变得越来越大,框架的雏形就出来了。这样的历史进程,代表了“多做”的意义(这段没有史实依据,只是基于合理推测,有异议可以留言讨论)。
然后聊聊“全栈工程师”这个话题。在很久以前,“全栈工程师”是个很高大上的词,一般只有知识面很广的大牛才敢这么说。而后,随着这个行业的发展,越来越多只是粗泛了解其他语言的人都在宣传自己是“全栈工程师”。于是,有人感叹“世风日下,人心不古啊”。但其实大可不必,随着行业的发展,知识面能横跨多端会变得越来越难,而宣传自己“全栈”不代表大家会认同,真正有才能的人也不会被埋没。会php+js+html+css就自以为是全栈从而沾沾自喜,“从前端到后台我一个人可以包了耶!我是全站工程师,我好厉害!”,但老程序猿只会微微一笑,然后各个方向问两个问题,这个人是有真才实学还是只会泛泛而谈,就一目了然了。“全栈”其实是一个努力的方向,指的是一个人需要一专多能,对行业涉及的各个范畴能多去了解。懂得多了,可供选择的余地也会更大,而且也能减少很多矛盾。
就以维持长链接为例,如果这个人只会PHP,那么他要去找个合适的框架,去学习怎么用,然后踩坑实践。如果遇到涉及多线程多进程的需求,就会比较麻烦,因为PHP在设计之初就不是为了解决这样的问题而存在的。当然,没有什么需求是解决不了的,只是时间等代价问题而已。然而,如果他涉及的面广一点,会一点Python,或者JAVA,那么这个问题就非常好处理了,解决这样的问题会非常轻松。所以说,懂得多了,可供选择的余地也会更大,解决问题也能更轻松。
在这里要吐槽一下“PHP是世界上最好的语言”这句话。不知道这句话是脑残粉还是黑子说出来的,流传甚广,但因此而疯狂崇拜抑或贬低PHP都是很愚蠢的行为。没有什么“最好”之说,C运行效率那么快,能说“最好”吗?JAVA用的人那么多,能说“最好”吗?Python库那么多,能说“最好”吗?都不能。那么PHP是最愚蠢的语言?它在网站上的使用率还是挺高的,用它的人都愚蠢?虽然因为一些历史原因,PHP确实有些问题,但瑕不掩瑜,在开发网站上有其一席之地。就语言的灵活度、开发效率和运行效率,PHP有其价值。任何语言都有其独到之处,扬长避短,用合适的语言做合适的事情,这样可以节约很多时间。
而涉猎广泛也有助于沟通和解决问题。就说前段时间爆火的“让APP的颜色和手机壳颜色一样”这个需求,真正做事的人都知道这是搞笑的需求,也无怪乎程序猿和产品真人PK了。知乎上有关于这个事情的提问,众答主纷纷吐槽产品经理的不靠谱。很多时候都是这样,程序猿和产品的矛盾,在于对对方的不理解。程序猿不理解产品为什么会想出这样一个需求,因为产品一般是从用户的角度来思考问题,合理的想法与需求有利于用户体验,虽然有时候确实实现难度大,但是当产品觉得这样做有价值的时候,程序猿应该去实现。而对于产品经理来说,他们不懂编码,不知道什么需求实现起来方便,什么需求实现起来麻烦,甚至是不太可能。他们觉得这个用户体验好,就不管实现,直接丢给程序猿去做。在产品主导的公司,如果产品强势但水平不够,程序猿的生存环境会非常糟糕。但如果,产品懂一点代码,或者双方都善于沟通,产品能理解需求实现的代价,程序猿能理解需求对于用户的重要性,那么事情会好很多。
同样的,即使都是程序猿,不同方向的人沟通时也会有矛盾。我见过后端和移动端吵架:“我直接把数据从数据库读出来给你就行,为什么还要我处理数据变成这样奇怪的格式?”后端不懂移动端解析数据的方式,对于移动端来说,整理好了的数据格式,处理起来会方便很多很多,这点处理的代价由相对方便的后端来做比较划算。从整体来说,这样是最佳的实践。可如果是在移动端没有话语权的公司,可能就只能让移动端默默地去改代码,花更多的功夫去做同样的事情。但,如果移动端懂后端知识呢?他可以写一个demo,怼到后端眼前:这样做,你加一点就够了,我要加这么多,你改起来方便,以后你来!Talk is cheap, show you my code.
最后,以这句话结束此文:
PHP工程师?我早已不是了。
注1:小时候在爸妈工作的厂区住,职工房。一般我会和小伙伴一起在一楼做游戏,在楼上的职工宿舍围观别人玩游戏。
注2:NOIP全称是National Olympiad in informatics in Provinces,全国青少年信息学奥林匹克竞赛,考的核心是数据结构与算法。有初中组和高中组,高中组在2010年前拿到国家一等奖可以去申请保送资格,2010年后就只有加分资格了。大学有ACM,相对知名度更高,更有含金量。
注3:CTF,夺旗赛,是一种流行的信息安全竞赛形式。我们在学校参加的是最基础的比赛,内容都很简单,所以我们才能拿奖。
网友评论