春节长假中的学习小结

  今天没有像往年一样做一个年终总结贴出来,主要是技术方面在之前的文章中都慢慢透露出来了,而且年底也公司也填了各种绩效考评,总结性的东西都写的想吐了,所以也不再流水账了。今年放假没回老家,老爸老妈都来深圳照顾我们了,虽然过年少了些热闹和气氛,但是家人围绕一起的感觉也没显孤单,而且少了拜年胡吃海喝那些形式,倒是七天长假有了些许空闲的事件。
  这几天读了几本书:《Rust 程序设计语言(第一版)》、《Go语言实战》、《RabbitMQ实战指南》、《TCP/IP高效编程:改善网络程序的44个技巧》、《MySQL技术内幕 : SQL编程》,有些想说的,就码成一文吧。
dog-year
  前面两个是编程语言类的图书,读他们倒不是想折腾新开发语言的意思:首先C++已经很复杂了,新标准刷存在感似的层出不穷,足够自己喝几壶慢慢折腾的了,虽然C++使用经验也挺多的了,但自己还不敢冒言“精通”之;而且随着年龄增大,对自己的方向和目标也更显的清晰,集中精力在重要、感兴趣、本质性的领域,不爱折腾这么多现象层面的东西了。了解Rust主要是最近区块链越来越热了,据说绝大多数的区块链框架使用Rust开发,所以这个语言是不是很独特?Go作为含着金汤匙出生的幸运儿,在中国搞的风生水起,各种资料、框架、Repo排山倒海般的袭来,所以也想看看这个语言为啥这么快风靡世界!
  看完翻译后的《Rust 程序设计语言(第一版)》,感觉这个语言还是挺有个性的,语法格式标新立异,而不想大多数的语言都承袭了C风格的语法,自然在学习的过程少了那份陈乏感。Rust的特点或者说着力点在于:(a). 讲求安全,编译器执行者很严格的语言规则,把在执行期可能出现的问题都及早的暴露在编译器,以减少运行期的各种隐患,所以对Rust没有个较深入的理解,你的代码根本就编译不过,杜绝半瓢水程序员上阵挖坑的机会;(b). 不带GC(垃圾回收),虽然现代GC语言都优化的很好了,但是底层基础性服务、高频交易等领域还是会诟病GC带来的延迟和执行不确定性,之前这部分都是C和C++的天下,Rust找准自己的定位抢夺这一部分领域还是挺有希望的,还有就是作为一门系统性的语言,Rust可以编写设备驱动、操作系统!(c). 因为没有GC,而又要实现内存安全,Rust引入了所有权的概念,其实本质上和C++的RAII、引用、移动语义、引用计数、生命周期的概念差不多,Drop机制不就是析构函数的活嘛,只不过做了写强化安全机制,基本来说只要你的程序编译通过后面发生问题的概率就会很小,因此Rust开发的话应该很有安全感。
  如果说上面的内容是C++以及其他类似语言所共同面对的问题,稍加适应就可以解决,那么Rust学些真正较抖的曲线来自于泛型、trait、impl这类东西语言高级特性了,而且他们常常会上升到设计、哲学方面的层次。《Effective C++》中描述到C++可以归纳为四个次语言:C、Object-Oriented C++、Templated C++、STL,其中模板元编程至今自己未做过多涉及,实为遗憾,主要是和业务脱钩而且机制确实非常的复杂,而Rust这方面也不简单。Rust没有将成员和方法罗列在一个struct里面,而是通过impl Trait for Item的方式给指定类型增加特性,这个时候再将泛型机制加进来,就需要对T实例化的类型进行功能的约定,称之为trait bounds,然后再慢慢折腾下去吧……(经验有限,编不下去了)。Rust的宏也很复杂了,那部分直接跳过没有看了。不过Rust的cargo项目管理工具确实好用!

  《Go语言实战》看完后没什么感觉,大家说他简单也的确是挺简单的,对数组、切片这些小特性区别之后基本和C是一脉相承的,而且如果Python速度能快点、支持真正并行计算的话估计也Go没什么事情了。Go的优势来自于语言标准自带网络和HTTP库,而且通过goroutine和channel实现底层的高并发、并行就算,所以特别适合现在互联网时代的服务端开发。其实Modern C++也有个future组件,也是把特定计算包装成一个个的task,然后由语言机制内部决定调度和执行的方式,并且规定了task传递消息的方式,基本就是让程序员多干活少操心的思路。
  后面看了几个例子,感觉Go的开发对channel的依赖性很大,所以要使用Go必须对channel深入理解灵活使用才行。

  这两个语言说句实话,如果没个环境认证折腾一番,还真不敢上生产。现在用C++都自带迫害妄想症了,创建个对象、申请个资源都会条件反射性的下意识思考这个对象什么时候被释放、这个资源什么时候被回收。虽然Rust和Go作为后起之秀就是要将程序员从这些琐碎中解救出来,但是没有搞清楚他们内部机制之前,还是不敢冒然行事的!

  至于《RabbitMQ实战指南》这本书,还是比较推荐的,作者朱忠华看似工作经验也不是很靓丽,但是短短时间在工作中对RabbitMQ和Kafka有比较深入的理解和剖析,其学习能力和工作能力还是值得钦佩的,由此可见走上社会之后人与人差距的加速度将会越来越大!之前对RabbitMQ有过生产使用经验,不过之前都是摸索官方的开发文档一步一步走出来的,这次通过这本书,对自己之前的概念又有了一个清晰的梳理和更全面的认识,这种感觉真好!

  后面看的计算机网络和数据库这两本书,实在是因为我觉得这两个组件是很多开发者使用最多的、但同时也是绝大多数开发者没有认真学习和钻研过的东西,至少我没有像一个新开发语言一样认真、系统的学习和钻研过他们,作为一个4年+工作经验的程序员来说,实感惭愧。
  《TCP/IP高效编程:改善网络程序的44个技巧》是本不错的书,跟《Effective C++》是同一种风格的不可多得的经验总结,虽然这本书出版有些时间了,但是里面关于TCP/IP的很多要点都没有引起大家的重视,程序员还在不断的踩着相同的坑。虽然现在大家可能都不会基于裸socket开发了,各种高并发、高性能的网络库简单易用,可以让程序员以很低的门槛就可以hold住高并发网络服务端开发,但是万一不小心遇到诡异的网络问题的时候,开发者有较为夯实、完备的网络知识就可以快速跟踪排查问题了。笔者之前做程序端口转发程序的时候没有关闭Delay ACK就导致程序基本不可用,如果你的程序测试性能出现比较严重的问题也可以考虑是否Nagle算法和Delay ACK相互作用导致的,在程序开发中也要避免多次写的坏习惯!
  当然只靠这本书是不够的,有时间可以看下《TCP/IP详解 卷1》,时间不够也不用全看,把大家平常用的最多的TCP那些章节好好研究一下就差不多了。
  数据库也是常常被很多人忽略的组件,而且现在服务的主要瓶颈都在数据库,所以用好数据库会对服务整体高可用带来巨大的收益。对于没有专业数据库开发者的小公司来说,各位服务开发者就要勇敢肩担起这个重则,在设计库表的时候就应该事先规划好合理的字段类型和长度,根据业务需求设计好索引字段,并且让运维经常推送慢查询邮件进行持续化的关注和优化。数据库滥用导致服务反应迟钝、死锁、数据库服务器CPU使用率暴增的问题在我司发生过很多次了,本人都无力吐槽了。
  还有,SQL不仅仅是SELECT、UPDATE、DELETE这些简单操作,SQL作为TIOBE排行前20的语言远远没有这么简单,相反通过合理的子查询、联结操作可以实现一些复杂的查询需求,如果这方面功力不够的话很可能你就得把数据都抓下来在应用程序端实现类似的功能了。要沉下心来好好学习一下SQL,才能像《MySQL技术内幕 : SQL编程》说的那样不盲从于权威,做到真正的“无招胜有招”,争取早日炼成“扫地僧”!

  计算机人文方面也看了一些其他的数据,在此不表了。

本文完!