计算机是个神奇的行业,转行跨行成为程序员多如牛毛。
程序员真的适合那么多人吗?
程序员真的轻松胜任吗?
如何对项目有全局的理解?
如何摆脱CRUD的低级境界?
如何减少低效的无价值的忙碌?
在我看来,
不只很多本专业的毕业生,
甚至很多老员工都不合格。
工作多年,见的人做的事也不少,简单自我总结下。
>>>挖好坑慢慢填,由于个人是后端工程师,本文更偏向于服务器+数据库+分布式。
1.计算机思维
程序员最重要的特征是计算机思维。
什么意思?我们需要知道自己所工作的直接间接终端,final endpoint,是计算机。
计算机是如何工作的?
冯诺依曼结构,指令集+存储器系统,接收输入,进行计算并输出,这是最基本的工作模式。
更具体的,是基于操作系统和底层协议支撑起来的整个计算机世界。
不管什么语言实现的框架,中间件,服务,细究起来或者分析几步,必然是
进程,IO,序列化,通信,CPU、内存资源这些东西,
理解这些东西哪些是重要的,哪些是次要的,有助于我们快速定位问题所在,提升性能。
学会观察自己的进程的情况,学会debug,能对一个请求的整个生命周期进行追踪溯源,
也就对项目全局有了基本的理解。
很多底层技术面试官会问:浏览器输入网址后发生了什么?
问题很简单,但是答案甚至可以写成一本书。因为要详细回答这个问题,基本上囊括了
应用层协议、底层协议、WEB服务器框架、
代理、缓存、负载均衡、容错、数据库、通信、编码、序列化、等等各种东西。
因此不同层次的人会有不同程度的回答。很容易就知道你的真实水平所在。
计算机的哲学与人的哲学是一样的,
从哪里来,到哪里去?
弄明白每个字节的流转,你就是大神。
没有这种好奇心与思维方式,很可能多年都在外围API层面打转,
对了既不知道为什么对,错了更不知道为什么错。
2.思路清晰
程序员尤其讨厌工作思路不清晰的人,
表现在说话无重点或者不知道重点,颠三倒四,自相矛盾,问A答B。
交流的时候如果两个人水平相近,会非常舒服,简单高效。
因为很明白对方的思路,清楚对方在说什么。这里主要是指技术问题。
而如果水平相差太远,就会觉得非常累。
因为根本没有共识。
这种共识,来自于大量工作经验或者学习涉猎后的沉淀,
一个程序员并不需要也不可能对所有技术都了如指掌,
但是,他却能快速知道某个技术所属领域以及服务的内容,听词辨义。
例如,我不懂深度学习,但是我知道深度学习基本思想,以及能做什么。
有了这种积累后,
遇到问题才能快速定位可能的原因,与解决方案。
3.数值敏感
我最不能接受的是,对程序运行状况一无所知的开发人员。
处理速度?不知道。QPS?不知道。处理了多少个请求?不知道。还需要多少时间?不知道。
这种就是典型的不关心,不负责,不求进取。
数值敏感是后端程序员的基本素养。
关键日志不打,对代码想当然,也不写测试代码块,能跑就行,
不关心有无优化空间,不关心是否使用合理,这样的也就写个一辈子CRUD,
说实话,别人还不一定乐意用你。
学会关心数字,对所用的中间件,框架,对服务器吞吐的各种数据耳熟能详,
在关键地方,加个计数,加个时间统计,了解进程状态是否符合预期。每次交互是否能提升。
最终达到使用最少的资源,最高效地完成任务。
4.代码阅读量
先不谈各种花里胡哨的设计模式,编程思想,
只说基本的语法使用,代码技巧,类库,很多人根本不合格。
工作几年甚至只会用HashMap与ArrayList,只知道if else,命名各种tmp,aaa,123,
水平简直惨不忍睹。
虽然他们写的代码最终结果似乎对了,但是代码根本没法维护,就像一坨垃圾。
找一个热门的开源组件,通过大量的优秀代码阅读,了解高手都怎么写代码,
思考别人的层次结构,扩展性,可移植性,鲁棒性。
记录一些好用的类库与语法糖,自己学会模仿。
不阅读,就不知道自己有多菜。
阅读代码也是解决异常的重要方式,很多人遇到Exception要么只会百度,
要么发给别人一张报错异常的图片,张口就问怎么回事?
你自己分析过了吗?堆栈调用链看过源码了吗?你只会看自己写的代码吗?
找到出错的类,翻翻上下文的注释,结合出错信息,大部分情况可以推测报错原因。
由此反推自己是否调用不合理?参数是否不合理?依赖服务是否正常?进程是否正常?
知道去下载你工程依赖的库的源码。
每一个专业的程序员,工作电脑的mvn本地库可能都有10G+。
阅读也是最直接的学习手段,尤其是官方文档。很多人习惯于国内一些入门性质博客去学习安装,搭建,简单API使用,但是对该组件的核心概念,架构,全貌并无了解,遇到博客上没有说的bug束手无策。其实答案与思路通常都在官网中。。。
5.工作技巧
我见过很多编程人员,连IDE都玩不转,不懂调忽略拼写检查,不懂调颜色字体,
不懂自动补全,不懂快捷键,不会正向反向分析调用链。。。
写起代码速度与效率感人。
也见过很多人,从来不记笔记,每次调试慢吞吞的找一堆东西,敲一堆东西,
不会加速重复的无意义的工作。
学会自我总结与提炼,
对我而言,txt就是最优雅的格式。
每学一个东西,我会新建一个txt文档,记录各种命令、总结,测试记录,问题与答案。
到下次使用或者遇到问题需要调试需要处理,只是复制粘贴而已。
节省了大量时间。
程序员不要以加班为荣,如果你一直加班,一定是因为你太菜或者方式不对。
另外需要一提的是调试技术,包括IDE调试,远程调试,dump分析。
这里主要指JVM相关。因为大数据领域Java是最主要的语言。
曾经有个合作厂商的一线JAVA开发,工作多年,北大计算机博士毕业,居然不知道jstack,
真是无语。
6.抽象与概括
读书不仅要从薄到厚,还要从厚到薄。
知识也是。
前面也说到,没人能做到所有技术细节了然于胸,因为也不需要关心太多细节。
有段子说
一流的程序员靠数学,
二流的程序员靠逻辑,
三流的程序员靠框架,
四流程序员靠谷歌和stackoverflow,
五流程序员靠百度和github,
不入流的程序员靠自己琢磨。
可以看到,越核心的东西越不具体,而是抽象的,概括性的东西。
没有概括能力,不可能做到对全局性的把握。
这个类是做RPC发送的,那个包是定义数据结构的,等等。
对我自己的经验来说,很多大型系统源码,如spark/elasticsearch,
只看类名 + 方法名基本就知道是做什么的。
因为已经充分理解这个组件核心原理,如何起作用,
自然也对其实现心中有数。
达到这种水平后,才能集中精力处理核心问题,
而次要的,知道它的存在即可。
7.开阔眼界与不断学习
最后要说的是,一个人如何提升自己的总体水平?
只有向更高的山峰爬去,才能看到更远的风景。
世界那么大,比你厉害的人多的是。
不懂的别一直自己研究,如果有机会就去问。
永远对技术保持敬畏,
keep learning。
学会并主动去找自己工作领域的峰会,论坛,去下载PPT,
看看业界一流的公司和团队在干什么,
他们用了什么技术,能做到什么程度。
自己的差距在哪,思考原因何在。
技术迭代更新的速度无比飞快,
停止学习就会被抛弃。
当然,如果并不想看,也自不必爬。
end,近几十年,世界变化飞快。然而说起来,
真正变化的核心驱动力,只是IT工业。
如数学物理等基础学科的发展,远远没有达到影响我们生活的程度。
学术界甚至有科技大停滞的说法。
一切的基础已经在上个世纪之初垫定,如今只是修修补补。
相对论,量子力学我们人类100年都还没消化。
因此,说一句程序员改变世界也不为过。
程序员越来越多的今天,我们如何自处?
计算机技术永无止境,饱和的是那些凑数的,混日子的人。
多少小公司苦于招不到优秀的以一当十的技术核心,全栈工程师。
浮躁的社会,搞技术的还有多少人静心磨炼底层,提升自己的竞争力呢。
网友评论