我是如何成为一个程序员的呢?
只能说是机缘巧合,命运捉弄,歪打正着,如果当年真的仅仅是因为自己高中物理比较好就报物理专业的话,如今可能还在读研或者已经是个老师了吧,如今后悔成为一枚程序员吗?只能说后悔过,我曾好多次以为自己不适合干这个,如今对于技术和编码这件事能做到有些乐在其中可以说是走了很多弯路才到了如今的境界的。怎么说呢?虽然我不信神,但是此时却想说,可能都是命运的安排吧。
事情的起因都是源自高三的一本志愿书,看到一个专业叫物联网,听起来就感觉很有逼格,很厉害的样子,于是没有多想就想一心报这个专业,学校呢?当时心心念念的学校是哈工大,将来成为创造物联网历史的人,结果呢高考考的感觉选择题用脚踩答题卡都估计比我想出来的好,语文12个选择题我选错了九个,最擅长的物理我选了3-5结果那题看似简单其实暗藏玄机15分直接没了,最终愿望缩水成为吉大,不过仍然作为村里数年难得一遇的985大学生,也不想顶着压力复读,而且吉大的大部分专业也是都有选择的余地的,最终还是欣然接受了,最终成功录取,当时只是感觉挺好一切尽在掌握,只是录取通知书的小字计算机学院我却完全没有注意,这将决定我未来十几年的人生轨迹。
进了大学,忽然发现一切和我想象的都是不一样的,用校ACM的一个人来说就是吉大的计算机有种农村包围城市的感觉,这话我是服气的,因为我就是那个农村,别说编程了,电脑我都没怎么碰过,我对输入法的认知还停留在,小学的智能abc那个时代呢,打字用二指禅,看着c语言编程的书,感觉没那么难,结果第一节实验课,卡在VC6.0不会创建工程,好不容易创建一个,发现才知道输入法标点符号是有中英文的,而VC60这种上古级ide是不会提醒你语法错误的,当时是真的连hello world都写不出来的,更要命的是老师当时推荐的书是谭浩强的,用如今的眼光来看那本书整本书充斥的只有“错误”二字,有人戏称c语言期末考试内容就是应该找谭浩强的书中的错误,找到多少个就考多少分。而且书中的绝大部分代码都是照着敲根本跑不起来的,比如a+++++b这种鬼代码,写更是严重打击初学者的信心。这是实验课,当时就想,与我在电视中看到的程序员不一样啊,程序员不应该是冲着屏幕一顿乱敲,一会问题就好了嘛?结果如今就是各种各样的error和烫烫烫烫烫烫,而且做出来的东西一点都不高大上不实用,开始怀疑人生。
再说课程,我想像的大学课程是教我们如何写网站,如何黑别人电脑,再不济也要来个office ps 视频剪辑什么的吧,结果呢?大学的课程每一门都给人一种十分魔幻的感觉。怎么说呢?就是刚开始老师讲的东西你几乎都不用思考就能懂,半个小时就开始陆续出现几个陌生点,三天过去老师讲的东西就连一个标点符号都听不懂了。你会怀疑甚至会连1+1都不敢回答等于二,讲的也都是一些与找工作无关的东西,什么高等数学啦,什么电路啦,甚至计组,什么c语言啦c艹啦,再往后是各种汇编,各种芯片的汇编,算法,数据结构啦,作为一个实用主义,面对这些我脑中有无数个问号,其中最大的疑问就是它们特么有什么用,我花一个星期,让一个电机转起来有什么用?迷茫×2
在迷茫彷徨中,我度过了人生最迷糊的三年,虽然大学的课程很多很杂,但是我从来不敢说我哪怕学会或者掌握一丁点东西,就是听个响,也不敢说自己做了一丁点让自己骄傲或者感觉有意义的事情,论文啥的都是百度百科复制粘贴,不知不觉就到了找工作的时候了,真的是感觉自己是虚度了四年,别说面试官了,我自己都找不到一个让对方要我的理由,这个不努力啥都没干,啥都不会,还没特长的我,好在最后被一家外包公司也就是我的上家收留了,虽然这也让我未来的两年很痛苦,这估计也是惩罚我吧,惩罚我无所作为无累积的三年,我无数次都在思考过,如果我报了自己更擅长的物理估计也不会这样度过四年了,一定是个学霸,哪怕是软件工程也比现在强很多,至少人家教的东西比我们更实用啊,我会什么?就一个c语言c艹,还只是连皮毛都不算的水平,不过不管怎样大学结束了,第一批小白鼠成功出狱了。
再然后就是毕业,在外包公司的两年,怎么说呢?钱少也就算了,最不能忍的是它带偏你,这家外包业务主要分两类国内和对日,我比较不幸被分到对日的部门了,这两年怎么过的?首先是公司地点,在深山之中一座大高楼,上下班门闸必须打卡且员工卡是绝对不能借用的,然后是穿:必须穿衬衫,不让穿牛仔裤,短裤,休闲裤,七分裤,不让穿运动鞋,凉鞋,球鞋,板鞋,休闲鞋,带鞋带的鞋,然后是午休时间一个小时,然后是室内到处都是的摄像头,手机不允许放到办公桌上,有的部门还会把手机锁在门口的一个柜子里,
如果说这还算可以理解的话那:
电脑人离开的时候必须锁屏
锁屏密码必须每个月换一次且几个月之内不能重复
电脑不许插U盘(这点我是能理解的),
电脑不许上外网,嗯只有局域网,不能百度
手机不可以拍摄屏幕,
需求是日语的,什么意思要靠第六感猜,没有百度翻译。
要求一行代码一行注释,日语注释,没有百度翻译,不会打日语自己去找复制粘贴。还要求每行代码都要同步文档。
文档有哪些呢?表结构字段设计书,基本设计书,详细设计书,单元测试设计书,结合测试设计书,checklist等等等等数都数不清,要全都同步,也就起说,代码改一处,这些东西全都要同步改,测试要重测,而设计开发测试全都是你一个人,如果不改还好,可惜客户一个星期能改八遍。
测试文档要求截图+日语说明的,截图工具也是上古级的,特别难用。截什么图呢?挨个打断点看每一个变量,加页面截图,加数据库的数据,加各个服务器的log日志,改动的位置要字体标红,而且红色啦字体啦要和其它的一致,仅仅看起来差不多还不行,因此最保险的手段还是复制粘贴,顺带一提中间那些内容少一点忘一点都是要重新测试的,覆盖率要求呢?100%!对你没听错就是百分百,甚至于跑到所有的if else以及所有可能和异常都不够,还有各种业务的边界条件比如时间你就要考虑,一号30号凌晨十二点凌晨零一秒等等等,有点常识都知道异常不是那么好测的,你要制造异常数据,为了造这条数据你要解析这个异常前面的所有代码,有的根本就不是很容易创造异常条件的比如系统时间相关的,有的要断网络的,只能debug打断点改值,给java改值还好,别忘了还有存储过程debug呢,反正都是干神仙的活,最后也都弄出来了。
如何测试呢?不是说没有外网嘛!公司给了一个虚拟机终端,终端里可以访问外网,然后有个类似网盘的东西从虚拟机传上去,再在本地下下来,那虚拟机多大内存呢?2g,公司电脑多大性能呢?4g i3,窗口超多且卡的不行,顺带一提,虚拟机是每天都会还原的,且没有截图软件,而且还不可以下外网的东西,因此要自己用那个网盘先传一份上去安装,更多麻烦的流程细则不多赘述,总之工作之前,需要重复的准备好多好多东西。这活才能开始,然后一重启电脑全都没了,要测什么呢?火狐 谷歌 ie对还有ie安卓3G没错就是那个非智能机时代的3G。所有的测试和点点点截图文档断点等,都要再重复五遍
总算聊到架构了,代码什么样呢?2000行一个文件,还不是java代码是而存储过程,存储过程还会调存储过程你不知道会调多少层,java会调存储过程,定时任务也会,shell也会调,java几百上千行调个几十层类和ifelse也是蛮常见的,如何配置呢?用表的字段来配置,一个表几十个字段,命名flag1 flag2一直flag20多每个都有其含义,什么含义自己去看文档去,多少个表呢?200多个,多少个存储过程呢?也200多个,但还不是一一对应的,之前不是要截数据嘛,测试的时候还要把关键数据字段标红,而且那个红也不是你选的,最保险还是复制粘贴,每个存储过程开始都是先来几个表的联合查询,这也是我为什么如此痛恨sql脚本的原因,有框架吗?很可惜这是一个十年前的日本框架,我离职之后根本说不清楚这究竟是什么框架,非常的非主流,继承用的满天飞,遗留累积了十年的垃圾代码,你想改?你想重构?不可能!你想用新技术?不行!就日本人胆小的样子,你写点新技术的东西他们根本看不懂,最重要的是日语文档注释我根本不会写,还没有外网下东西,而且我改了几十行的代码就要看好几千行代码,调查几十个文档,日本方式的测试还是亲自测重构是会死人的,最重要的是他们不敢,别说新技术了,三目运算符都不让用,代码风格创新一点都不行的,必须完全看不出来是你写的,而且日语的代码还有一个问题就是,他们是分全角半角的,全角的英文数字空格,我无数次被这个东西坑过。
就这样产出是什么样子呢?一个星期几十行代码也就差不多了,什么?少?getter setter是纯手敲的,那样的文档那样的架构,那样的测试和测试环境,还是日语的需求,而且客户说改就改哪怕只改一点全重干,还想要输出?如今我一个星期写几千行都是很平常的事情,你想快就先把那些破规矩都去掉。而且盘根错节的代码与业务写几十行要调查接近无限的代码是不可能快起来的。
期间我想过很多次离职的事情,可是我的技术在外边根本没有什么谈资,java基础还好,因为我测试的时候是挨个打断点debug的,java的内存模型,都用身体记住了并且疯狂java也看了很多遍了,并且我还抽空看过shell tomcat spring这些东西,我并没有完全按部就班的按照对日的那套走,然而即便这样没有项目经历是最伤的,人是受限于环境的,尽管我,承受着巨大的工作压力,干着神仙才能干的活,然而真走的话却毛线都说不出来,所以一直都不敢走,主要是不会什么主流的开源框架。就这点让我没有说走就走的勇气,也是很多干对日的人不敢走的根本原因。因为你的知识体系和主流严重脱节。
最终复制粘贴出鼠标手离职了,虽然还没有准备好,但是我已经彻底看透,即便在这里干十年,也不会改变什么,工资涨不上去,技术不会涨,跳槽还会越来越难,这就是外包的本质,钱给的少点可以,但是你不能带偏我,吐槽一下公司的领导,感觉我还是涂样啊。一边说让你搞技术,一边自己上线把服务器搞挂掉然后让你来擦屁股;一边要你全力开发,一边一天打断你个十几次让你写不了代码;一边说不搞传统公司一套,一边想事起来大半夜来你个电话;一边把说着自己看不起的公司,一边把自己看不起的一套全做一遍。我真的想不懂有些人天天想些什么。
终于开始了找工作的环节,其实面了不少家,主要是其实我的基础还行,主要坑在没什么项目经验上,没办法我写的东西根本丝毫没有我原创的空间啊,说白了就是复制粘贴,你可以不复制粘贴自己写,然而客户领导不让啊,有的公司面试官喜欢在你面前贬低你,跟你秀设计模式git等等等,最终到了如今这家,可能一般工作经历正常一点的人体会不到,没有门闸,不管穿什么,没有摄像头,没有信息安全的工作环境是多么爽,最主要的是没有日语。
其实工作一段时间会发现,互联网公司除了架构之外其他人的水平也没有高的神乎其神,相反,越是高级的技术使用起来反而越简单,然而正是因为简单了,你才能更进一步去做一些什么,在被大量细节束缚的时候你是无心也无力去做自己的原创的东西的,至少我是做不到的,并且设计模式也不是绝对的好东西,绝大部分人也是if else横飞的。框架也就会个皮毛,但是因为流程更正规,分工更明确,我由原来的“伪全栈”,成为真正的服务端开发了。至此我弯弯曲曲的程序员生涯才刚刚步入正轨。过去的六年只能用惨不忍睹来形容。
然后偶然的机遇,我遇到了函数式编程,并且尝试在实际项目中开始使用,起初只是简单的stream foreach 再然后会了map filter 收集器和reduce 然后会了Optional容器,再然后开始会高阶函数,重新理解闭包的概念,再然后理解了柯里化,结合泛型设计模式重新理解函数式编程和面向对象,到上个月的组合式异步编程,现在开始入坑Scala 让我的编程水平短短几个月上升了n个级别,根本停不下来,因为更简单更实用的东西这些年终于遇到了。如果大学学的不是c语言而是scala如今可能早已是另外一番景象了,如今的代码是什么水平呢?我只能说这东西无法用时间来衡量是需要一点天赋的,就和过去的六年我没有编程天赋一样,如果硬要衡量一下的话大概是,我高中的物理有多强,如今的敲代码能力就有多强,因为函数式编程的最基本思维方式就是映射,就是套公式,原理是如出一辙的,知道这点之后,以前的套公式技巧审题技巧就全都可以迁移到这里了,这也正是很多人感觉它很别扭的根本原因,在过程式编程浸淫的越久就越难习惯。越难理解。
至此回顾一下我所有的弯路和给新人的一些建议,首先,编程的学**要分三大门派,其一就是,先学各种数学和电路和算法数据结构操作系统,然后再去写程序的,另一种是先学如何写个网页,写个小游戏,等一些很amazing的东西,前者我们称之为魔幻派,后者我们称之为实用派,还有一种就是介于两者之间混合派,我更倾向于实用派,而不幸的是大学的教育方式绝大部分都是魔幻派的,这导致了我整个大学都处在迷茫的阶段,还有就是ide的选择最好选择新一些的工具和技术,机器能替你做好的事情,人就不要花精力去操心了,语法检查交给编译器就好了,其次就是教材的选择,谭浩强的书作为大学考试笔试应试还是不错的,然而真想学c建议还是c primer一本错的教材会让你怀疑人生的,然后就是大学教材包括业界主流都只强调面向对象和面向过程两种编程模式,再好一点的能来个面向切面编程,而函数式编程这种与图灵机并驾齐驱却生不逢时的编程模式却鲜有提及,就这么说吧函数式编程对于刚进大学入门的人来说绝对比面向对象更容易接受,也更符合未来的编程主流。还有就是不要选择外包和测试,但凡有一点回旋的空间都不要进外包,万劫不复啊,还有就是测试,虽然测试门槛不高,但是任何门槛不高的工作都要付出更惨重的门槛不高的代价的,如果是自动化测试还好,点点点是没有前途的,将来做产品吗?好想也行,最后就是离职这件事,我是工作两年才跳槽,有一方面一直顾及的是一个工作忠诚度的问题,这是不对的,工作前两年如果发现公司没什么前途或是价值观有问题就赶紧走,割肉止损,前两年HR是能够理解你跳槽次数多的,他会认为你在试错,但是两年之后再跳槽就不能那么冲动了。