关于攻城狮技术能力提升的一点看法

今天听到有同事说起,网上有技能培训的网课,视频教学,讲解一些’高级’技术,例如从头构建一个tomcat,实时演示。网课价格数千块,对于搞毕业没多久的同学,是一笔不小的开支。

对于这个事情,我是这么看的:

  1. 网课不一定和你的学习能力同步,教学嘛,总是要照顾大多数人,有些人会觉得太快,有些人却嫌慢。所以最好还是可以有针对性,系统性的自学。
  2. 高大上的技术不一定像表面看的那么好。说自己有搞hadoop,却MapReduce都不知道的我也见过。基础说白了,打好扎实的基础才是关键,高大上的技术按需分配。
  3. 实用软件通常都很复杂,有很多corner case需要处理,架构很大可能是比较清晰的,但是代码绝对不是复杂度小于5的。细节是魔鬼,还好大多数情况只要了解关键设计即可,这块通过一些设计文档,讲座就可以了解到。
  4. 知行合一才是理想的做法,我认为有些同学可能实践太多了,知识积累不够,’自己做的东西不够高大上’这种感觉非常突出,迫切需要掌握高大上的技术。或许我们做的东西是有点low,但也不是毫无价值可言,重要还是平时有没有注意积累。

说到知行合一,的确是攻城狮技术能力进阶的关键,一方面可以在项目中挖掘,一方面可以业余时间造轮子,即使非常简陋。

在项目中挖掘,以一个普通的web工程为例,用了servlet,那么这个规范说了些什么,有没有规范文档可以看看?用到了spring,那么它是怎么生成对象的,会用到哪个反射相关的api?一个web因为是基于http的,那么这个协议细节是怎样的?这些都是比较大的,还有很多小的,例如有些地方用了线程本地变量,这个东西有什么缺点?为什么有些地方用encodrURI,有些又是getBytes,还用不同的字符编码?有人用了ConcurrentHashMap,它是怎么实现的?还有哪些线程安全的工具类?看到很多代码用StringBuffer,为什么不是用StringBuilder?在finally里边直接关闭两个流,为什么findbugs会警告?

如果觉得上面的内容脱离实际,那么就造个轮子吧,挑个简单点的,就静态服务器吧,概念自己脑补,那需要怎么做呢?

既然是个服务器,那么得给人访问吧,需要支持个http协议,怎么破?噢,可以用socket编程,然后实现http协议,静态服务器嘛,先支持最简单的Get吧。 现在有个服务了,从Get请求路径中获取要访问的文件路径,然后拼接上指定的根目录,就知道文件地址了,在用文件读取后返回就可以了。

大功告成。如果上2步都可以顺利完成,的确是接近一个玩具的样子了。接下来补充一些功能。

  • 如果你是用阻塞io的话,那么总会涉及多线程,那么是否需要考虑线程池?
  • http请求的连接什么时候关闭?一请求一关闭虽然符合规范,但是keepalive是不是更好点?
  • 请求有可能超时,应该怎么处理?
  • 根目录总是不能写死吧,端口不能写死吧,应该搞成配置,是否考虑一下hot reload?
  • 每次请求都读取文件,看上去比较low,是不是要加个缓存,又要考虑内存占用,是不是考虑LRU?
  • 考虑一下安全吧,避免目录遍历?
  • http得考虑一下客户端缓存吧,例如expired,last_modified,tag等特性吧

看上去是有个玩具的样子了,如果都能搞定,说明对静态服务器的特性,http协议,浏览器行为,jdk的使用,设计模式的运用有更加深入的理解了。成熟的软件只是做的更加精细,考虑了更多的corner case而已。没有足够的基础,只能是在数十万代码中迷失方向什么也无所得。

祝好运。