在刚开始学习编程的时候,其中有一个同学在寝室提了一个问题,比如我想实现一个延迟5秒再执行下一个操作,该怎么实现。当时有另一个同学说在高中就编程了,那时候是通过循环一万次来实现延时。但是这种实现方式是不是精准;还有实现不同的延时,怎么保证一致,大家都很疑惑,特别是处理时间问题。
其实,计算机有一套软硬件配套来实现的,硬件是一个晶振加相应的外围电路。DOS系统计算时、分和秒的时钟PC的实时时钟,由电池驱动,关机后它仍然正常运行。当PC启动后,DOS可从机器的实时时钟读取时间并把转换为BIOS日时钟读数。此后该值每秒自动增加18.2,当DOS需要了解时间时,它再把日历钟计数转换回到时/分/秒格式。PC微机通过每秒钟执行18.2次INT 08H中断,来完成对BIOS日时钟计时;而读取或修改这个计数器的值则是由日时钟I/O中断INT 1AH完成。如果INT 1AH中断修改了计数器值,则系统日时钟将按这个新值开始计时。此外,INT 1AH还可完成读取、设置系统的实时钟以及设置报警时钟等功能。
计算机编程在没有操作系统之前,编写程序时直接和硬件打交道,单纯的写一个硬件程序可能还是比较容易,不同的应用去调用这个硬件,又有多个硬件。而且硬件有不同的厂家,各个厂家的技术规范各不相同,同一个设备,不同厂家要重新写代码,而且上层的调用不同厂家都完全不一样,可以想象,那是多么麻烦。 还好,自从操作系统出来以后,所有的这些问题都得到统一,不管是写硬件的驱动程序,还是应用的调用,都统一成统一风格的代码,其中以Linux程序最多。
Linux操作系统让大多数的内核开发人员慢慢变成了驱动工程师,因为Linux有一套驱动框架,只需要实现Linux设备驱动的接口即可。
Linux把所有设备都抽象成文件,驱动工程师的工作就是把驱动文件功能实现即实现了驱动的功能,而应用开发者调用设备,只需要处理对应设备文件即可,打开文件设备,进行相应的读写。应用开发者操作硬件设备就只是对文件进行读写就行。至于Linux上的应用开发,就是Unix环境编程什么fork,pthread,管道,socket,文件读写,C库调用这些。
Unix环境编程是有点散乱,特别是C语言的指针,劝退了一大批的程序员。
还好,Java又出现了,没有指针,智能管理内存,语言非常的简单明了,很容易就上手,吸引了一大批人加入到Java的阵营,Java有简洁得语言,没有指针,内存自动管理,Java有丰富的集合,库等。程序员不用重复造轮子,Java的开发变得容易了很多。
到互联网时代到来,各种框架层出不穷,其中最为经典的就算Spring了,Spring的核心设计思想就是控制反转,依赖注入,控制反转,依赖注入是什么呢,简单点,就是不要让代码控制住代码,这样的代码相互控制绑定,在修改,移植代码的时候就需要相应的修改,导致关联的代码收到污染。控制反转就是把实体都抽象化,再需要的时候相互绑定,最终控制的地方只有依赖注入的时候,就是需要绑定的时候才注入。这样代码的相互依赖就只有一处,在代码需要移植,修改时受污染的代码就很少,移植,修改就会变得比较轻松。Spring编程就是主要定义各种Bean,通过注解定义他们的关系,Spring框架完成Bean的加载,解析,以及交互,生命周期等。应用开发者只需要集中精力关注具体的业务逻辑即可,简化了编程。
在智能手机到来,Android把Linux,Java进行整合,很快就做出了一个很好的框架,由于Java开发人员群体庞大,吸引了大量的Java开发人员很快转型到Android平台,很快Android迅速占领了整个手机市场。真的是得开发者得天下。
Android设计了四大组件,Binder实现进程间通信,四大组件,Activity就是界面组件,专门用于实现界面;Service,Provider用于实现数据共享,Service用于实现内存数据得共享,而Provider用于实现文件数据得共享;而Broadcast是一套异步机制。
技术会不断更新,新得技术层出不穷,很多程序员说得不停地学习,稍有不慎就会跟不上,确实是这样,从整个技术的发展来看,变化是一直的,唯一不变的就是各种框架,语言,新技术的出现,让编程越来越简单,程序员的入门变低。所以,一定要了解这种变化的趋势。去学习,了解框架,知道底层的设计机制,它的设计思想才是根本,抓住了这些根本,我们无惧变化。
得开发者得天下,所以,一流的公司都去搞平台,搞编程语言,编译器,做系统,做框架。如苹果,有自己的操作系统内核Darwin,以此衍生出macOS,iOS,watchOS,tvOS,有自己的编程语言object-c,swift,还有编译器LLVM,构建了自己完备封闭的生态,据统计,苹果已有超过2000万的开发者,给苹果带来了源源不断的巨额收入,同时,庞大的应用生态形成巨大粘性,无法抢占苹果的市场,无法撼动苹果的地位。
Android得益于有庞大的Java开发群体,Android以Linux为内核,以Java作为开发平台,构建自己的开发生态,Java虚拟机是一套标准,只需要实现这套标准即可实现自己的虚拟机,所以,Android诞生了自己的Dalvik,Java程序员直接就可以无缝地转行到Android平台。只需要配置一下四大组件,会使用Binder就基本掌握了Android开发。很快,Android也构建了自己庞大的应用生态,巨大的粘性也形成了Android无法撼动的地位。由于有生态的优势,Windows,鸿蒙都需要去兼容Android。
技术不是有多牛就好,而是在于有多简洁,越简洁,越好使用,使用的人越多,技术就越成功。 技术是有分层的,最初级的就是为使用者提供应用的开发者,另外就是为开发者提供技术的系统框架,系统框架除了保证本身的稳定高效外,还要让技术更加简洁,让开发者非常容易使用,而且使用了很少出问题,即使有问题,也能够有技术手段去优化解决。
现在是连应用也推出自己的平台,如微信出了自己的小程序,此后,字节跳动,淘宝,百度也相继出了自己的小程序,小程序是基于JavaScript和WebView,简单易用,也确实吸引了一大批开发者,但是,这一切需要有庞大的应用用户群来做支撑,一旦应用的用户流失,这也失去了意义,而且小程序是在应用基础上做的,很容易受到平台的限制,不可能做得很大,很丰富,只能做写简单的功能。
越有最底层的技术,技术越复杂的,拥有越多的用户的脚跟站得越稳。这样看来,也只有苹果是最强大的,从芯片设计,操作系统,编程语言,应用框架,生态都很完整,随时可以定义产品,随时都可以颠覆,iPhone,iPad,iPad Pro,M1芯片,还有很多黑科技,颠覆性产品即将出世。
作为一个技术程序员的成长之路,首先,会使用,熟练使用别人提供的框架,会使用Java,会写Android app,会用Spring做开发; 其次,到一定程度,应该要理解这些框架系统的原理,如Java虚拟机,android四大组件设计,Spring的控制反转; 再次,要问问为什么会这样设计,提供了哪些方便,给哪类开发者准备,多思考; 最后,有了这些设计思想,加上熟练的代码能力,自己要尝试为业务程序员提供简洁的代码。积累越多,代码能力越强,以后有代码可以去审阅别人的代码,可以去做测评,一个程序是好还是不好,性能是否良好,是否稳定,移植,扩展是否轻松方便。应该很容易就看出来,即使技术再怎么变化,但是思想不会变,就是给应用开发更简洁的代码。反正框架就是让应用开发者傻瓜式的编程,但是不能这样一直傻瓜式编程,久了就废了。