作为一个从双非本科非计算机专业转行当软工的码农,迄今工作逾4年,我想在这里谈谈对于我这种”野生“程序员的些许想法,包括说大部分的出路、技术水平和最重要的,技术上”进阶“的一些想法。
最低层次
首先一个很残酷的事实是,大部分程序员都是既没有学历也没有很好的“机会”的,这也意味着,大部分的人在刚开始工作时往往是在不大的公司甚至说只有个位数开发人员的公司工作,能进入大公司、外企始终只有很小一部分。这也符合正态分布。能够在毕业就进入很好的公司在今天愈加困难,所以,大部分程序员,都是“挣扎”在无数的小公司。
而小公司,百分之九十九的几率意味着用户量不大,业务也不会复杂到哪里去。在J2EE的世界里,很多时候,jQuery+BootStrap/SpringMVC+MyBatis+MySQL一把梭就可以解决几乎所有的开发任务,不会遇到所谓的并发性能问题,也不会遇到现有框架无法满足业务需,或者需要定制开发自己的某个组件的机会。这是处于这个层级的开发人员几乎无法解决的“硬性条件”。
但上述其实还好,我们可以说它仅仅是“环境不好”,毕竟,谁都知道技术这东西看个人。但更为可怕的是,大部分天天做这些业务逻辑的不知道自己不知道什么。一个黑培训机构的笑话是:
某天,面试一个培训机构出来的php,问他们使用php哪个版本(想着问点版本特性),结果人家回的”我们不用php,用的是ThinkPHP“
这个问题肯定不能反应所有的培训机构出来的开发人员,但是大部分的也的却相差无几。而拿到以Java为开发语言的程序员来说,存在同样的”困境“。我列几个我真实遇到的例子:
Action
(或者叫Controller
)就是服务器。前端传入的东西就是这里直接收到的- 框架就是方案。要写数据库只需要定义一个~Mapper~和相应的~XML~就可以,它们直接操作数据库
- 部署项目就是把war包放到tomcat下,然后启动就可以
- 写任何逻辑,只需要先定义一个类,然后里面添加对应的方法完成逻辑就可以,这是唯一的方法
- Java代码直接跑在硬件上,与PHP这些就是不同语言的区别
等等,类似的观点不一而足。当然,不是说上述看法有什么大问题,而是很多时候,很多开发人员真的就是”眼前展示是咋样认为软件就完全是这样“。对于任意一个有过科班训练或者较多学习经验的都会觉得类似的问题完全是怡笑大方。但对于转行或者培训出来的开发人员,在刚工作时得得却却就完全是这样的状态。
较为普遍的一部分
而大部分情况下,工作经历不会对这种情况有很大的改变,工作经验的增加仅仅是复制的代码越来越多而已,在最根本的“技术认知”上不会有什么变动,所以,两三年过后,可以很悲观的说,技术之路就几乎已经废弃了,因为已经形成一个固定的“思维定式”,再想矫正就非易事了。更何况说,某种程度上,还自认为“写代码就这么回事”不会做出什么改变。
这是我见到的“野生”程序员中很典型或者说悲观的一些情况。这种,就完完全全是个人既缺乏思考也不会主动学习。
更大比例的“野生”程序员还是多少有些要求的,无论说是对于技术本身还是薪酬要求,都想更近一步的学习。毕竟说,选择转行总还是需要有某种想法的。
这一类程序员最大的问题是,只看到了框架层面,对原理层面所知甚少甚至说还有很多错误的观点。比如说对于SpringMVC与Netty的关系混淆不清,JUC里面的东西都是Java自身的“黑科技”而没有其他的来源,编程语言都是通过定义类来完成逻辑等等,以及一个很常见的意识 - 架构师只需要对常见的框架像很多公众号所描述的那样了解这个的实现原理了解那个的实现原理(这里指的就是了解这个层次),而不会对为什么这么实现、实现的优缺点和它内在的原理有更多的思考。
上面的例子或许不是很恰当,但是可以很直观的反应问题:
- 对软件工程的理解局限于
J2EE
构建的工具之上,没有更低层次的了解或者说思考
更为通俗的说法是,“基础知识”几乎为0:
- 操作系统。 不清楚在硬件的基础,哪些东西是操作系统为我们提供的抽象哪些是硬件支持的东西
- 网络。 常见的TCP/IP协议簇在J2EE里的具体关系或者应用场景
- 应用服务器/JVM抽象层次。 他们与操作系统之间的关系、与上层应用之间的关系和提供的能力差别
- 编译原理/数据库原理。 哪些东西是Java在做哪些东西是JVM在做,数据库哪些是自身实现哪些是OS实现
- 分布式架构下基础设施、算法和上层框架的关系。 比如
CAP
,Paxos
与ZooKeeper
/Eureka
之间的区别等等 - 软件工程思维。 代码组织结构,怎样的代码才是“好”的代码(这个较为抽象),任何逻辑都是
Copy-Paste
一溜。对于重构、软件工程分层思维等缺乏一个整体上的认知 J2EE
的世界与软件工程世界的比对。 这个不用多说
学习途径
其实,这些点,几乎都可以在计算机专业本科培养计划中找到所有的答案,可惜的是,很多”科班“出身的都是一脸懵逼更何况说半路转行的”野生“程序员。在工作的前面几年,如果没有对这些基础知识不断的补充和学习的话,一个开发人员的”技术视野/技术思维”几乎肯定在某些方面是有问题的。或许说在短时间内看不出什么,但长远来看必定是很不好的。
一个题外话就是,最近一两年各自公众号或者说学习平台都不间断的再推类似“架构师课程”、”学会这些必进BAT年薪xx万”之类的教程,无一例外,都是“框架”层次的东西,教的也几乎是“某某东西是咋样的”,而对于为什么是这样以及如何学习写出这些东西则是少之又少。因为,要学这些,必然涉及到基础知识,而学习基础知识则是很困难和无趣的。
而对于学习这些东西,扩展技术视野,作为一个既进不了“大厂”也不是什么技术负责人的码农来说,我觉得有这几种途径:
- 最为简单的,刷计算机专业考研课,可以是普通高校的数据库C语言等,最为推荐的系统的学习考研408
- 阅读《程序员必读书单》,从里面优先选择底层的东西,暂时忽略高屋建瓴的各种软工理论和方法论。我读过的是:
- 《深入理解计算机系统》
- 《现代操作系统》
- 《TCP/IP详解》
- 《unix网络编程》
- 《编程语言实现模式》
等等。 当然,每一本都是“大部头”,很难完全吸收,需要不断的温习。我觉得在学习这些东西的时候,要注意一个非常非常重要的原则是
- 关注底层而不是框架实现,例如
JUC
里各种工具类,Java线程,不应该孤立的学习他们,而应该把它们与JVM/OS的相关内容放在一起学,再比如,Redis/MySQL/MongoDB等数据库,应该关注磁盘文件存储、日志系统和OS里的页表等
而在J2EE
里,Spring
从传统的XML
配置到Spring Boot
的注解配置到Spring Cloud
和Spring Cloud2
的各种自动装配,应该关注它里面的设计模式和在“提升开发效率与增加实现复杂度”上的一系列取舍等等,纠结于Spring
里各种纷繁复杂的实现多少有点南辕北辙。
最后,这些想法我一直是这么认为的并且在坚持做到,遗憾的是由于懒惰技术上成就有限。但是,陈硕在酷壳里也有同样的观点,所以我认为这条路应该是对的。