《码农翻身》读书笔记之技术之路
这是我的后端读书笔记系列文章的第四三篇,选取的是最近刚刚圈粉的知名博主刘欣创作的《码农翻身》。这篇文章只是最后一部分内容。
本文内容主要根据知名博主刘欣一作《码农翻身》的内容总结而来,本书的内容风趣幽默,讲解计算机理论原理也是十分透彻,由于书中常常以小故事的形式出现,为了方便学习和回顾,我把它们进行了一些改编和整理,便于自己和跟多人阅读。
本篇文章主要讲述的书中的第四章,第五章,第六章。
本文首发于我的个人博客:https://h2pl.github.io/
同时发表在csdn技术博客上:https://blog.csdn.net/a724888
也欢迎来我的GitHub中交流学习:https://github.com/h2pl/
代码管理那些事
版本控制工具
很早以前代码还在使用人肉管理,比如一个毕业论文可以有几十个名称和副本。
后来出现了代码管理工具,最早是使用文件锁避免文件互相覆盖,每次只能有一个程序访问文件,效率低下。
后来的VSS开始允许代码冲突,要求用户到代码仓库下载最新版本,并且在更新代码时如果有冲突则需要手动处理。
为了支持一个项目的多版本同时开发和发布,开始出现了分支的概念,分支可以从一个版本开始继续后续开发,不影响主干分支。必要的时候再进行分支合并即可。
集中式代码库比如svn,需要用户每次进行版本管理时都进行联网操作,比较低效。
分布式管理工具git出现了,它允许用户有一个本地仓库,现在本地进行修改和版本发布,然后必要的时候再和远程仓库进行同步,开发效率更高,并且可以在发布前就进行代码评估。
项目构建工具
手动构建和部署
项目构建可能分为很多步,先拉代码,再编译源码,然后修改配置文件,导出war包,上传服务器,进行测试。。等等
自动化代码或脚本
手动完成这些操作显然是低效睿智的,所以我们可以写一些自动化代码来完成这一步骤。
xml配置
如果直接用Java代码开发自动化API,固然也可以,但是使用xml这样的描述性语言更能够支持多种语言,而且达到自解释性。
ant就是这么做的。
约定大于配置
由于构建的步骤大多大同小异,主要的区别在于每个项目的路径不同,依赖不同等等。
为了求同存异,我们可以约定编译路径,测试类路径,以及web文件路径等等。然后再灵活地使用xml配置依赖包,项目名称等等。
这样的话大量的重复配置可以被约定所取代,只需要少量的配置就可以解决。
maven使用了这样的方式,于是马上超越了ant。使用pom.xml文件进行少量配置就可以完成自动化地编译,打包,单元测试以及部署等等功能。
代码重构
略
单元测试
略
我的编程语言简史
JavaScript
HTML会在浏览器被解析为DOM树。
而JavaScript可以在不改动html代码的情况下改变DOM树的节点,以实现动态更改页面的效果。
除此之外js还可以控制浏览器,打开窗口,等等。
由于js没办法访问网络,所以后来推出了xmlhttprequest实现了向服务器发送异步请求的功能,并且使用回调函数接收数据,并且只需要局部刷新就可以完成数据获取。后来被叫做ajax。
为了优化数据传输速度,xml渐渐被json取代
node js
nodejs的出现使得js不仅可以运行在浏览器,还可以运行在服务端,他也采用了js的异步编程模型,并且使用单线程处理请求,同时是基于事件驱动的,不会阻塞在耗时操作上。
nodejs的出现使得js全栈工程师成为可能。
c和Java
1 c实在是一门很古老的语言,他很贴近底层,代码可以跨平台编译运行,如果有和操作系统强耦合的api,则可以使用条件编译来支持跨平台。
2 c语言非常贴近硬件,可以直接操作内存,使用指针。
而Java则不行。
3 c语言一旦编译连接后就是一个独立运行的进程,拥有独立的地址空间,cpu独立调度。而Java的class类只是字节码,没有jvm就无法运行,jvm本质上是java.exe进程,而每个类则必须让进程中的一个线程来执行。可谓是天差地别。
4 c语言编译过程有一个步骤是链接,比如一个c程序中调用了另一个程序的方法,在编译过程中两个c程序都会变成中间代码,第一个程序必须把方法的实际地址改成第二个程序的地址,这样才能真的执行到其方法。这个过程叫做静态连接,在编译期完成。
而Java的class类也有连接的过程,只不过一般是动态连接,只有用到某个类的方法时,才会把链接真正进行链接。
当然c也可以使用dll动态链接库,原理是把共享代码预先编译好,需要用到的时候才进行连接,而不是一开始就写在源程序里进行静态链接。
c++学习之路
c和c++
c很接近硬件,适合做系统编程,却不适合新手入门去做一些简单的应用,因为它没有gui。
vb是个简单gui编程工具。但是由于是单机的语言,很快就被互联网时代淘汰了。
c++的学习门槛很高,要真正掌握c++技术实在是非常困难。要么是c++专家,要么是一窍不通。
Java和后起之秀
Java比起c++来说实在简单多了,没有指针,只有简单的api,以及易懂的语法,不用担心内存方面的事。
Java适合作为后端语言,除了作为框架填充员以外,后端还有很多有意思的技术,负载均衡,灾备,缓存,消息,分布式,数据备份,搜索等,大后端技术栈深不可测。
Java适合做大型项目,并且也深入到移动端以及大数据方面,相信还能保持年轻很长一段时间。
Ruby和Python的出现大大滴改变了web应用开发的效率,简直是颠覆性地塑造了web应用的快速开发流程。虽然动态语言有一些问题,但是快速开发的效率赢得了很多的青睐。
命令式编程与声明式编程的区别:
命令式就是根据计算机的编程方式进行代码编写。
声明式就是类似sql这种更符合语言习惯的操作描述。
声明性的一个体现来自于函数式编程,简单的语法可以表达很多的意思。
老司机的精进
凡事必先骑上虎背
计算机世界的大道理
局部性原理
局部性原理用于缓存,页面缓存,以及JNI预编译等需要预先加载数据,方便后续访问的场景。
缓存
缓存也利用了局部性原理,加快热点数据的读写,加快系统速度。
抽象
抽象是计算机最重要的概念之一,很多东西都被我们抽象成某个名词。
1 比如指令集,实际上是对cpu的抽象,我们只要根据指令集来编写机器码,然后cpu的实际的电路运行情况我们一无所知。
2 文件则是对输入输出设备的抽象,磁盘和磁盘里的文件都是计算机定义的抽象,本质上他们只是磁盘的一个小小的区域,我们不需要知道磁盘的构造是怎么样的。
3 进程是对一个正在运行程序的抽象,我们知道与进程相关的数据结构,pcb等,而不必知道这些数据在内存上是怎样的一种存在形式。
4 虚拟存储器是对程序存储的抽象,可能是物理硬盘上的一个页,也可能是内存中的一个实际页。
5 虚拟机则是对整个计算机的抽象,包括操作系统,处理器和程序等。
分层
比如网络7层模型,MVC模型。
每层只与相邻层有关系,不至于牵一发动全身
异步调用
同步的调用往往需要线程或进程的阻塞等待返回,而异步的调用则一般提供一个回调函数,等待对方执行完调用时通过执行该函数返回结果。
比如JavaScript,nodejs都喜欢使用异步回调。
nginx,netty等服务端技术也喜欢使用异步回调
架构师
写作
编程学习
微信公众号
个人公众号:程序员黄小斜
微信公众号【程序员黄小斜】新生代青年聚集地,程序员成长充电站。作者黄小斜,职业是阿里程序员,身份是斜杠青年,希望和更多的程序员交朋友,一起进步和成长!专注于分享技术、面试、职场等成长干货,这一次,我们一起出发。
关注公众号后回复“2019”领取我这两年整理的学习资料,涵盖自学编程、求职面试、算法刷题、Java技术学习、计算机基础和考研等8000G资料合集。
技术公众号:Java技术江湖
微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,专注于 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
关注公众号后回复“PDF”即可领取200+页的《Java工程师面试指南》强烈推荐,几乎涵盖所有Java工程师必知必会的知识点。