工作以后,主要是看一些与工作相关的书,比如Android相关:Android开发艺术探索、深入理解Android内核设计思想、Android系统源代码情景分析、精通Android多媒体开发、Android C++高级编程。音视频相关:FFmpeg从入门到精通、WebRTC Native开发实战、OpenGL ES3.0编程指南、音视频开发进阶指南。语言相关:C++ Primer Plus、Java编程思想。操作系统/虚拟机相关:深入理解Java虚拟机、深入理解计算机系统。计算机网络相关:计算机网络自顶向下方法。数据结构与算法相关:算法导论。其他书籍:雷军传、硅谷之火、程序员自我修养、卓有成效的管理者、给年轻人的忠告等。
第一行代码作者是郭霖,国内非常资深的Android开发专家,博客名《郭霖的专栏》。第一版主要是介绍Android发展历史,手把手教大家搭建开发环境,Android常用的布局,四大组件介绍,使用Intent打电话、发短信,使用WebView加载网页,使用MapView加载地图以及定位应用,数据库的创建与增删查改操作,还有一些方向传感器、加速度传感器的数据获取与使用。第二版基于Android7进行升级发布,Android Studio替代Eclipse作为开发环境,gradle的常用配置,Material Design漂亮界面布局,运行时权限动态申请,RecyclerView代替ListView实现水平布局、垂直布局、瀑布流布局。第三版基于Android10再次升级发布,共享内存与私有内存访问的限制,引入kotlin作为Android开发语言首选,讲解Jetpack开发加速包的全新特性,还有协程的概念与使用。
Android开发艺术探索作者是任玉刚,博客名《singwhatiwanna》,座右铭是有创新精神的Android技术分享者,在插件化方面造诣非常高超,曾经发起DynamicLoadApk开源项目,在滴滴又主导研发VirtualApk开源项目。书中主要介绍IPC跨进程通信、Binder的底层实现原理(把Binder描述得非常生动贴切),View的事件分发、滑动冲突与解决方法,View的绘制流程:测量、布局、绘制,常见的属性动画,Bitmap的高效加载、压缩与缓存,动态加载与插件化技术,性能优化常见手段。
Android群英传作者是徐宜生,博客名《eclipse_xu》,主要讲解开发相关工具使用,比如协同开发工具Git常用命令,Android Studio新特性,Gradle自动编译打包,各种性能优化工具:TraceView、HierarchyViewer 、Systrace 、GPUProfiler 、Memory Monitor、Allocation Tracker,用于内存分析、布局分析、函数执行耗时分析、分配堆栈追踪、电量分析。
深入理解Android内核设计思想作者是林学森,以前在Google任职,应该是从事Android内核设计开发工作,博客名《林学森的Android专栏》。书中主要介绍Android系统发展历程,Android系统框架,Android源码分析与各层次结构讲解,ROM烧录与定制,源码编译脚本makefile剖析,Linux操作系统基础介绍,操作系统内存管理:虚拟内存、匿名共享内存、内存分配与回收,VSync产生与帧同步,音频管理系统,Android虚拟机Dalvik与ART介绍,Android系统安全机制SELinux与SEAndroid。
Android系统源代码情景分析作者是罗升阳,博客名《老罗的Android之旅》,博客写的非常详细深入,给我的感觉是与雷霄骅雷神的博客风格类似。本书涉及Android系统框架全貌,自底向上包括内核驱动、运行库、硬件抽象层、系统框架层、应用程序层,结合源码去分析探讨,如何修改脚本编译源码,介绍Android专用的驱动程序:Logger日志驱动、Binder跨进程驱动、匿名共享内存驱动,深入分析Zygote和SystemServer进行启动过程。
精通Android多媒体开发作者是王石磊,主要基于Android5.0源码,讲解Android多媒体框架、音频管理框架、视频管理框架,照相机驱动框架,Android专有的Skia图像渲染引擎,跨平台的OpenGL ES图形引擎与应用。
深入解析Android虚拟机作者是钟世礼,书中首先介绍JVM安全模型、JVM内存模型以及JVM垃圾回收器,然后再引入Android的两个虚拟机:Dalvik和ART。Android5.0以前使用Dalvik,基于JIT即时编译,安装速度相对快,冷启动慢(每次都要加载dex);Android5.0后全面使用ART,基于AOT预先编译,安装速度相对慢,把dex转换为oat文件存储在本地,冷启动相对快。接着介绍JNI接口以及Native开发,DEX文件格式,Android虚拟机性能优化。
Android C++高级编程作者是Onur Cinar,书中首先介绍NDK目录结构,然后是Android.mk与Application.mk脚本的编写,JNI的数据类型,异常捕获与处理,局部与全局引用,Posix线程开发,底层堆栈跟踪分析,Posix Socket网络通信,JNI操作Bitmap渲染,使用OpenSL ES播放音频。最后,简略介绍ARM NEON指令加速。
FFmpeg从入门到精通作者是刘歧、赵文杰,其中刘岐是FFmpeg官方源码维护者。书中首先介绍FFmpeg结构:封装模块AVFormat、编解码模块AVCodec、工具模块AVUtil、滤镜模块AVFilter、设备模块AVDevice、缩放模块SWScale、重采用模块SWResample。然后介绍FFmpeg常用命令,MP4视频格式、FLV格式、M3U8格式,H264协议与x264编码,MP3音频格式。接着介绍RTMP、RTSP、HLS推流协议,使用AVFilter进行滤镜:添加水印、字幕、抠图。最后介绍FFmpeg常用的方法函数,编解码实现流程。
WebRTC Native开发实战作者是许建林,个人博客:Piasy的博客,对WebRTC有非常深入研究与实战经验。书中首先介绍WebRTC开发环境搭建,部署AppRTC Server服务器;然后介绍SDP协议以及Offer、Answer的实现,ICE(Interactive Connectivity Establishment)交互连接建立,TURN与STUN协议实现内网穿透,NAT防火墙打洞协议;接着是视频数据采集、编解码、渲染流程,音频数据采集、编解码、播放流程;创建DataChannel,结合SDP实现消息的发送与接收;RTCStatsReport状态报告:音视频发送状态、接收状态;Android与iOS的屏幕共享,AppRTC Server的信令协议,创建房间、加入房间、离开房间。
OpenGL ES3.0编程指南作者是Dan Ginsburg、Budirijanto Purnomo。首先介绍EGL作为OpenGL的渲染上下文,EGL是独立与OpenGL的API,目前版本为EGL1.4,重要参数包括:EGLContext、EGLSurface、EGLConfig。然后介绍着色器Shader、程序Program,Shader如何关联到Program。着色语言:统一变量、数组、vec向量、mat矩阵、输入输出变量、布局、精度限定符等等。接着介绍顶点属性、顶点数组对象VAO、顶点缓冲对象VBO,顶点着色器与片段着色器。纹理的创建、加载、渲染、过滤,片段操作:剪裁测试、模板测试、深度测试、混合与抖动。帧缓存对象的创建与使用,离屏渲染。最后是介绍各种状态查询,包括着色器编译状态、程序链接状态。
由晓成编著,主要介绍在线视频行业、音视频技术框架、主流编码器、流媒体传输、视频播放、前沿技术。具体如下:
由展晓凯和魏晓红编著,主要介绍音视频基础概念、搭建Android与iOS音视频项目、FFmpeg开源库、音视频解码播放、音视频采集编码、音频特效、视频滤镜。博客:影音开发者联盟。具体如下:
由卢官明和宗昉编著,以“音频信号数字化、压缩编码、数字存储、广播传输、指标测量”为核心,系统介绍声学基础知识、AD与DA转换、音频压缩编码、信道编码与调制、音频文件格式、音频设备工作原理。具体如下:
深入理解Java虚拟机作者是周志明,非常全面介绍了Java虚拟机体系架构,包括Java内存模型、GC垃圾回收器、类加载机制与类加载生命周期、双亲委派模型、栈帧结构。
Java内存模型:方法区、Java堆、虚拟机栈、本地方法栈、PC程序计数器。其中线程共享的是:方法区和Java堆;线程私有的是:虚拟机栈、本地方法栈、PC程序计数器。我记得大学老师给我们上操作系统的课时,有提到过PC,他说这个PC不是那个PC,这个是Program Counter,现在还记忆犹新。
GC垃圾回收器:标记-清除法、复制法、标记-整理法。标记-清除法时间效率低,而且产生内存碎片;复制法把内存空间分为均等的两块,空间利用率低;标记-整理法,在标记-清除法基础上进行优化,解决内存碎片问题,把存活的对象移动到一端。目前流行的是分代回收法,包括新生代、老年代和永久代,结合复制法和标记-整理法的优势,新生代存活率低采用复制法,老年代存活率高采用标记-整理法。其中新生代有一个Eden区和两个Survivor区,Eden与Survivor比例默认为8:1。
类加载机制与生命周期:加载、验证、准备、解析、初始化、使用、卸载。加载是根据类的全限定名加载二进制字节流,存储到方法区的运行时数据结构,并且生成该类的java.lang.Class对象。验证包括:文件格式验证、元数据验证、字节码验证、符号引用验证。准备过程主要是分配内存。解析是把符号引用解析为直接引用。
双向委派模型:当一个类加载器收到加载类的任务时,会委派其父类加载器去加载,这样有优先级的层级关系,可以避免重复去加载同一个类。自底向上的类加载器有:自定义类加载器、应用类加载器、扩展类加载器、启动类加载器。
栈帧结构:栈帧包含局部变量、操作数栈、动态链接、返回地址。执行一个方法时,会产生一个栈帧入栈;方法执行完毕后,从虚拟机出栈。
由布莱恩特和哈尼拉伦编著,主要讲解编译系统工作原理、程序机器级表示、处理器体系结构、链接、异常控制流、虚拟内存、并发编程。具体如下:
由库罗斯和罗斯编著,主要讲解OSI网络模型,包括应用层、传输层、网络层、链路层等,另外是无线网络与移动网络,网络安全传输,多媒体网络。具体如下:
硅谷之火作者是保罗·弗赖伯格、迈克尔·斯韦因,主要讲述比尔·盖茨、乔布斯等人在硅谷发起技术革命的传奇历史、最能激发人们创业激情的经典之作。晶体管的问世:巴丁、布拉顿、肖克利三人发明晶体管,共同获得诺贝尔物理学奖,为集成电路、电子革命奠定坚实的基础。接着,诺伊斯和摩尔创立Intel因特尔,没错这个摩尔就是提出摩尔定律的那位,把晶体管发展为集成电路、CPU中央处理器。后来,比尔·盖茨和好友保罗·艾伦创立Microsoft微软公司,推出Windows电脑操作系统;斯蒂芬·乔布斯和好友沃尔兹尼亚克在车库创立Apple苹果公司,相继推出Mac操电脑作系统、iOS手机操作系统。
雷军传作者是陈润,主要是介绍雷军从一代著名程序员到一代出色企业家的成功之路。雷军说做一句名言:“站在风口上,猪也能飞上天”,寓意是选择对的行业市场更容易取得成功。他在读大学已经出类拔萃,写的PASCAL语言程序,被编进教材作为教学典范。在大学时光,偶然机会看到《硅谷之火》这本书,瞬间热血沸腾,希望有朝一日像乔布斯那样“创立一家世界一流的企业”。时常提醒自己“人因梦想而伟大”,他也跟随自己内心,为此不懈努力去奋斗,这与马丁路德金"I have a dream"和乔布斯"Follow your heart"有着惊人的共鸣。毕业后,进入金山,与第一代程序员求伯君共事,后来担任总经理,直至求总退休,他接任董事长。从金山退休后,做起天使投资人,但是这远远不是他内心所渴望的。后来,与林斌、黎万强、刘德、洪峰、周光平等人创立小米MI,至今发展为最年轻的世界500百强。
代码整洁之道作者是罗伯特·马丁,被亲切地称为“Bob大叔”。这本书强调代码整洁、简洁、通俗易懂,遵循Kiss程序设计原则(Keep it simple and stupid)。命名需要规范,注释需要清晰,最好别人看函数、变量命令,就能读懂你的代码。模块需要解耦,功能需要独立,一个函数方法只做一件事,模块也是如此。减少重复代码,抽取公用代码来实现复用。模块架构可扩展性,不能牵一发而动全身。做好单元测试和异常处理,保证稳定性。
程序员的自我修养作者是俞甲子、石凡、潘爱民,主要介绍链接、装载、库。编译源代码的过程:预编译、编译、汇编、链接。预编译:把源码和头文件预编译成.i文件,如果是C++源码,源文件扩展名可能为cpp、cc、cxx,对应的预编译后扩展名为.ii。预编译主要处理以#开头的预编译指令,包括#include、#define、#ifdef、#ifndef等。编译:把预编译后的文件进行词法分析、语法分析、语义分析生成汇编代码文件,使用gcc -S命令。汇编:汇编器把汇编代码转换为机器可执行的指令(机器码),使用gcc -o命令,生成.o目标文件。链接:把所有.o文件链接成库。而链接又分为动态链接和静态链接,动态链接成动态库(在Linux对应是.so,在Windows对应是.dll),静态链接成静态库(在Linux对应是.a,在Windows对应是.lib)。装载:创建虚拟空间,建立虚拟空间与可执行文件的映射关系,将CPU指令寄存器设置为可执行文件入口并启动运行。运行库:C语言标准运行库包括标准输入输出(stdio.h)、字符串操作(string.h)、数学函数(math.h)、资源管理(stdlib.h)等等。
给年轻人的忠告是稻盛和夫结合自身经历,总结出来的宝贵经验。分为人生篇和职业篇。
5.1 人生篇
5.2 职业篇
卓有成效的管理者,作者是彼得德鲁克,被誉为现代管理学之父、大师中的大师。做到卓有成效总结为以下几点: