毕业两年的反思
到今年6月份,已经毕业两年了,在这两年中换过一家公司,从银行外包到安全行业,经历过加班,也经历过无所事事,心中有些感慨和想法与大家分享
时间真的是不等人,之前刚入行时我也是由一位老大哥带着做项目,那个时候我差不多是项目组年龄最小的,而如今在现在的公司中,我成了唯二的老员工,我从去年入职现在的公司到现在公司经历了一轮大的换血,老员工差不多都走了,而现在我也从当初的被别人带转换了角色变成了带新人,新员工都是刚毕业的大学生,有志向,有抱负,有的也有能力,跟他们一比,真的有种长江后浪推前浪的感觉。心中不免有些惆怅,原来一年一年的混日子,时间过的这么快。现在我真正理解了作为程序员必须的具备终身学习的能力。以及那种随时都有可能被新人给淘汰掉的危机感
第二个就是不能对技术太过于执着,现在很多程序员包括我在内总是唯技术,好像一些产品里面用了某种牛逼的技术那它就值钱,就牛逼。其实真的不是这样的,技术是为需求服务的,再好的技术也是为了解决现实中的问题,只要能解决现实问题就算你用最low的算法,它也是一个好的产品。从这个角度来说,一个程序员的薪资水平跟他自身的技术水平并不是正相关的关系,薪资水平高低在于他能够利用手中的技术为公司带来多大效益或者说它能为多少人产生多大的价值。技术就是这样没有最好的,也没有最坏的,没有什么所谓的最前言,也没有什么淘汰之说,只有最合适它的平台,就拿汇编来说,很多地方的确用不上汇编了,但是在某些场合,比如说做安全进行HOOK的时候可能会需要,或者在一些对性能有着变态需求的地方,有的实在不能再优化了,只有将C代码改为对应的汇编代码。没有最好的技术只有最合适的技术
既然说到终身学习,那么下面就来说说程序员学习的事。学习首先得找一个方向,也就是经常说的职业规划,一般来说刚入行的程序员可能并不知道自己该从事何种方向,就知道一心写代码,公司让干啥就干啥,公司有啥业务就学啥业务。确实一般刚入行的新人可能对整个行业没有一个整体的把握。我觉得入行后可以花1到2年的时间来关注业界相关新闻,不断跳槽以便接触更多方向,然后从中选择一个适合自己的或者自己真正喜欢的方向,随后自己的精力需要完全投入到这个方向上来,学习的路线也应该围绕着这个方向来进行。比如说我现在从事Web安全的开发,刚开始也是什么都不懂,XSS、SQL注入等等完全不了解,这些涉及到的是Web的相关知识,因此针对这点我自己给的学习路线是,首先学习HTML、CSS这些前端的相关知识,然后学习Web开发、了解常见的一些框架和开发语言,比如PHP、Java等等,公司主要做的是一款扫描器,而扫描器中很重要的一个部分是爬虫,现在爬虫一般流行用Python,因此我又顺便学习了Python的相关内容,而扫描器用来检测漏洞的一些POC都是用Python写的,这样也必须的学习Python。而Web又是基于HTTP协议的因此必须得学习HTTP协议,顺便可以学习TCP/IP协议的整个架构。因此这样很容易就能理出一条学习的线路来。所以说在后续学习的时候需要找出自己真正喜欢的方向(不一定是喜欢,但是必须是自己不讨厌的),了解一下这个方向的主要内容,从中找出自己的不足来进行针对性的学习。然后可以尝试着利用学到的知识写点小工具等等,比如我自己常常使用Python搜集一些网上的POC来集成到自己的程序中用来制作简单的漏洞探测工具。
我感觉现在整个IT行业存在一个浮夸、焦躁的环境。经常就是过段时间有一个新技术出来,然后大量的关于新技术的课程,文章,以及大量的招对应的开发人员,看着薪水好像挺高,似乎这个技术就是未来,其他的技术都过时了,而我们程序员很容易被这种风气给带歪了,他们会花时间去学习新技术,然后跳槽,然后从简历上看他似乎什么都做过,前端火的时候他是一个前端程序员,后来Python全栈火了,他又成了全栈,然后大数据火了,他又做大数据去了,而现在AI火了,然后他现在是一个AI的开发人员,似乎他什么都会,但是后来发现就一个调用框架然后复制粘贴。当然我不反对学习新技术,学习新技术应该与应用相结合或者说与现实中的问题相结合,比如做扫描器经常会有误报,怎么消除误报呢?AI是不是一个好方法,能不能用机器学习来减少误报?如果可行,那么就可以考虑去学习一下。还有我们如何从海量的日志信息中找出具有攻击行为的那些日志?这个可不可以利用大数据来进行检索?利用机器学习来准确识别?我觉得这才是学习新技术的真正原因,而不是光看重新行业的薪水。还是前面说的技术是为需求服务的,学习也是一样的,为现实中具体的需求来学习。归根到底,学习应该是为了用新技术来解决现实问题。
在这两年中,我越来越觉得基础知识的重要性,当初在学校时总觉得很多东西会用就行,不需要纠结它的细节,什么快速排序,二叉树等等这些都有现成的库函数,没必要去了解它们,所以没有好好学习这些内容。现在看来这种看法很有问题,学习基础就好像当时很多人嘲讽买菜不用微积分那样觉得生活中用不到它们。现在也有很多人跟我说过,学习那些算法没有用,这些都由老外在写,人家那么大的组织机构来维护,你自己写的肯定效果上没有别人的好,到时候会用就行。但是我想如果作为一个程序员如果只是把自己限制在使用别人的库,只会复制粘贴别人的代码,这样永远是一个底层的码农,而做不了真正的程序员,还是那句话让它服务于具体的应用,比如你学习了HTTP协议之后,能不能仿照它,做一个能在嵌入式设备中使用的微型的HTTP服务器而不是直接上Apache,或者我能不能利用它的设计思想来提供类似的功能。而不是说为了使用HTTP而使用,学习这些算法与基础的意义并不在于会用别人写的库,而在于根据具体的情形选择并设计编写出适当的代码。或者能更好的使用这些开源库,而不是仅仅把别人demo的东西照搬过来。
在当今互联网时代,学习东西比过去方便了许多,但是互联网也有许多问题,第一个就是互联网上资源太丰富了,以至于想学一个课程但是找不到合适的,比如说我想学下C语言,你会发现网上一大片C的内容,有视频有博客还有电子/实体书,但是各种资源的质量良莠不齐,很难抉择。经常听到有建议说自学能力强的选择看视频或者看书,但是对于初学者来说很难分辨一个资源的好坏,我当时自认为自学能力很强,在大学期间找了各种视频,看了各种书,吃过很多亏走过很多弯路,才学会了点C的皮毛,经常就是一个视频看完了,感觉基础学会了,想找一些实践的东西,然后发现很多都是前面一点快速把基础过一遍,然后开始做项目,最后发现跟着视频项目做出来了,但是并没有学到什么东西,反倒是丢了视频好像什么都不会,然后就会产生一定的挫败感。我自己当时也是被虐到怀疑人生也常常在思考我是不是适合这个行业。但是好在我从来没有在我应该学习C/C++这条路上产生过怀疑。说到这里,我想说说我对培训机构的看法,现在很多人说到培训机构总是一副喊打喊杀的语气,好像培训机构毁了整个IT行业。其实培训机构很不错的,他至少能带你入门,我们常说师傅领进门,修行在个人。跟着培训机构就好像有一个前辈一直在带你,给你分享他的见识,分享他的思路,而且培训机构能让你快速融入这个圈子,毕竟你的同学老师都是从事这个行业的。从这个角度来看好的培训结构能使你受用终身。每个行业都有好有坏,不要一杆子打倒一片。但是一般包就业,并承诺薪资的一般是坑。
互联网的另一个坏处就是造就了一批伸手党,他们混迹于各大论坛,QQ 群,经常就是甩出一段代码然后告诉你这个跟他想的不一样,该怎么改。最可恨的是有的还给的是截图,你想给他调都没办法,难道要别人一个一个的照着敲,拜托大家都很忙好吧。其实很多问题都是你自己单步调试一下就可以解决的,很多人就是不愿意,一句我是初学者,我不会,所以你帮我看看,一般像这种看了真的是让人火大;另外一种人就是自认为是大神的,经常有初学者提问说,我想学下XXX,请问该怎么学,这个时候总有那么几个大神会告诉人家,你学这个没用,还不如去学XXX,或者说这个不用学,有现成的代码,然后甩一个连接给段代码,这种人也是令人火大的,人家初学者想学一个东西,你没有系统的学过就不要回答了,我觉得这样完全是误人子弟。
所以你看:现在互联网虽然方便,但是学习的路并似乎没有变得轻松,它只是以另一种形式增加了你学习的成本而已,过去很多东西报个班或者找个老师花点钱就给你讲明白了,但是现在互联网时代很多人觉得资源应该共享,应该免费。但是从某种程度上学习成本其实基本没变,而且是以一种无形的成本来体现出来的,通常这种成本是最难发觉的,可能对你造成的误导是最深的。
以上都是本人的一些突发奇想,写这些的时候是跟以前的同学一起喝过酒的,很多地方都有点胡言乱语的意思。请各位见谅。。。。。