在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?
全面理解操作系统、网络、数据结构、算法、C语言(掺杂一些硬件知识)、数学在计算机中的应用、软件本质、软件工程本质。
但方面会上面知识,比较单一。就如某一段时期,我只会java,眼睛看到的也只是java。就如java网络编程,涉及底层网络编程。我自修过一本java网络编程方面的书。有一次用用底层网络组件调SGIP(联通短信网关协议),出现一个问题connection Reset,很长时间没想明白为什么?看过的java网络编程也找不到答案。如TCP消息流这概念该怎么理解,流无边界,无边界会怎样?所有种种引发的一序列问题,如果多TCP/IP理解不到位,不遵循一些规律,的确很难处理。再如java网络底层编程有一个选项,可以控制TCP层往应用层投递的数据阀值,好多小伙伴应该都不知道。网络理解清楚,对高并发系统的一些设计理念顺理成章能理解。当然,好处还有很多。很多TCP/IP仅仅是基础,了解一些就行。我对TCP/IP了解,包括它通讯的细节,各层协议,各层数据封装,都完整理解。写过底层网络编程方法技巧。TCP/IP来龙去脉络了解得相对清楚。
至于操作系统,很多小伙伴以为,会点会用,会敲几个命令,就了解操作系统?我了解更多的是UNIX/LINIX,不限于命令使用。了解理念,了解概念,了解使用方法。到这层仅仅是基础过关,有系统理念很了不起的事。自学的,很多概念搞不清,比如进程程序的论述。就找了一本UNIX环境高级编程。第一遍看的思路理解概念。看深入才知道POSIX,SUS这些规范。第二遍认真看,搞清楚GCC的用法,POSIX规范,SUS规范,C语言规范的异同与联系。我对C语言理解更进了一层。这里不得不提一下,系统编程中要理解的概念远比使用得概念要多。系统功能远比我们想的要强。实例多路复用(multi-plux),搞java的好多小伙伴理解不清楚,我能很好的理解。IO模型,操作系统中说了一部分,另外一部分在网络编程中。如阿里的某个工程师说过异步IO,同步IO模型那些图来源UNIX网络编程(美,Steven,写的书中),我的理解不差。
数据结构与算法,任何程序语言,都已经实现了大部分常用数据结构与算法。java普通容器类、并发容器类,Collections与Arrays工具类;js数组对象,对象;C 的STL模板等等,无不与数据结构与算法相关。不说去写算法,了解该只是块最低限度可以正确选择要使用容器。看容器源码至少也少一些障碍。当然精进,可以看看算法导论,程序设计艺术。如大数据分析,就需要自行设计算法。算法导论中讲的一个例子,最大子数组问题,刷新我对算法设计的认知(至少两个有效算法可以解决)。计算机程序设计艺术,难度稍高,有能力可以看。看完怎么设计一个操作系统可能都会有思路的一本书。
C语言,为什么重要?与硬件靠得更近,操作系统API,网络设备API均是C语言做的。更深入理解操作系统,TCP/IP离不开它。操作系统、TCP/IP理念搞清楚的时候,留了很多疑问,老师也没讲清楚过(听自学视屏,讲课的老师)。如程序究竟怎么跑起来的?TCP/IP究竟怎么封装数据并发送的?答案在UNIX系统高级编程与UNIX网络编程中,部分涉及通信原理(我学通信的,自学,老师讲课有讲过物理层,能听懂)。程序运行起来,尤其线程运行与编译器有关,再深也不理解,我类比main函数的运行机制(懂C应该知道C语言的main究竟是怎么被执行的)。
C语言涉及到对硬件理解(其实要结合操作系统理解较好)。对IO,多线程编程,并发编程的理解会上一个台阶。如java中说的并发理念,很多我觉得莫名其妙就出来了。如监视器锁那来的?java IO模型,不理解底层概念莫名其妙出来。事件通知模型,了解操作系统的同学,应该悟性得出事件/通知模型,借鉴了操作系统理念。还有java Exception实际上是通知模型。扯远了,这里硬件主要设计CPU,内存,外部存储的理解。其中CPU与内存与并发并发编程息息相关。
数学与算法息息相关,算法导论中提到的算法分析用到不少数学知识。我最震撼的是,傅立叶变化,积分等高数知识在计算机科学中有应用。以前傻傻认为计算机编程不会超过高中数学知识(浅薄)。数学与整个计算机体系设计也息息相关,见计算机程序设计艺术。更何况现在的人工智能,工业互联网,大数据数学应用会更广泛。我最大体会,算法分析与算法设计数学是真真切切有用。
软件本质是开发出来解决某些问题,重在使用,有些时候必要太在于怎么组织代码,实现功能优先。大道至简,同时也中和一下我们团队就是有人把代码组织不好,我想跟他们激辩的冲动。
软件工程,大多是方法论,主要目的解决软件快速开发,快速部署,快速交互,迭代交互提高软件质量,等一些问题。如设计模式、开发工具(比如maven)、部署工具(如docker)、代码质量扫描器、程序类、方法、变量命名规范,敏捷开发方法等等。我们团队没好的规范,也规范不我来,有时候没话说。
以上我说的仅仅是点,稍微带了点线。如果把以上知识穿成面,当然需要充分理解。会产生1 1>2的效果。
因为以前规划架构路线,举一些相关例子。
java虚拟机不好理解吧?用前面知识很泳衣理解。
微服务的协议,理念不好理解吧,用上面内容来理解也没那么难,尤其是分布式锁。
浏览器的实现原理,不好理解吧,基础好可以猜8/9不离10。
nginx高并发配置,上面的知识也可以很好解释。
站内很多架构师,我问单机单进程如何实现高并发,号称阿里PX、腾讯TX不理我。
我平时写程序从上面获益更多,都是小技巧不好说。
最牛的是,上面基础搞好,比能连城面(融汇贯通),学新技能速度超快。因为有本质的理解,能不快吗?看别人写的组件源码也有很大帮助。
我对比过清华计算机本科、硕士、博士教学计划中专业课程设置,后续提升离不开上面本质,清华作为我国最牛计算机教学机构,他的教学计划参考价值很高。
最后,我的工作以java,java script,html,css,Lotus这些东西为主。计算机知识几乎全是自学的,有不当或不足之处大家辩证看。