以前写的了
想起《想象5年后的你》这篇文章,源于到现在正好工作五年了,不短也不长,最近一起工作的同事刚刚学校毕业,实战经验不足,上手工作稍显吃力,但是当被问及三年之后的目标时,无独有偶统一的回答都是:“三年之后希望能独立设计完成某个模块的功能,希望能独挡一面”,每个人都迫切地希望实现自己的价值。
如果你希望三年之后能独挡一面,独立完成某个功能模块的设计,编码,测试和维护,必须对从开始建立工程到程序的运行过程了如指掌。
独立完成功能模块,你需要知道的东西:
1. 代码工程的组织和配置
工程有exe,lib,dll等类型,需要的文件有头文件(.h),源文件(.cpp),静态库文件,静态库的头文件,动态库文件,动态库的头文件等。各种文件在不同的目录内,怎样配置工程去正确的目录寻找文件编译链接,工程寻找需要的文件时的路径查找顺序。工程的自动编译脚本,工程的输出文件路径是否设置正确。
2. 线程模型和线程通信
功能模块是否需要开启一直新的线程来完成工作?功能线程和主线程的关系是通信还是互斥访问?通信还有何种方式osp消息,windows消息,自定义的socket消息,管道,邮箱?如果是互斥,通过何种机制完成互斥的,关键区域,信号量还是事件?采用基本的API等待和释放事件还是采用C++的类方式完成信号的自动释放?有没有死锁?发生死锁怎么办?线程的优先级,操作系统怎么调度线程的?线程数量是不是越多越好?
3. 内存模型和数据存储
完成某个功能需要哪些数据,不同种类的数据分配的位置,是全局的,栈内的,还是堆上的?程序启动时数据的分配和初始化顺序,不同位置的数据其最大长度是否不同,栈内分配了一兆的数据是否会栈溢出?批量的数据怎么存储,使用数组,还是STL的array,list,map?批量数据是否需要查找,如何查找?数据是固定的长度,还是可变的长度?是否有内存的泄漏?频繁地在堆上分配释放的数据,是否有碎片,是否需要使用内存池?内存泄漏了怎么办?
4. 程序启动处理和退出的流程
有了线程和数据存储,还要过一遍数据的处理过程。程序启动时开启了哪些线程,线程的启动顺序是否会造成业务错误,用户的数据从哪里输入,网络,用户界面,文件还是数据库?数据如何处理的?输入数据错误怎么处理?同一段数据处理需不需要多线程互斥访问?数据结果如何输出?展示给用户界面,网络发送,还是写文件数据库?程序如何退出?线程的关闭顺序,如果某个线程阻塞,如何让其快速退出?请求的数据是否都已经正确释放?
5. 组件库
组件库的接口定义是初学者的一个难点。其实并不复杂,依照上面的4条原则分析,工程如何组织,lib还是dll?需不需要依赖其他的lib和dll?lib库内部需不需要再开启业务线程?业务线程和调用者线程怎么交互?两只线程如何互斥访问数据,或者如何通信?数据从哪里输入,怎么保存?数据的处理逻辑是怎么样的?处理完的数据如何输出?内部的全局数据和业务线程如何初始化和启动,分配的数据和业务线程如何释放退出?需不需要提供库的初始化和销毁函数?这一系列走下来基本上调用者和组件库的边界清晰明了,接口八九不离十。组件库需要额外考虑一个问题:库的API被重复调用或者错误调用时,怎么防错?
偶尔还会出现程序崩溃,死锁,死循环,堆栈溢出,内存覆盖等问题,你需要找到解决问题的手段。
三年之内要掌握的东西很多,但是这点东西对年轻人的冲劲来讲,真的是微不足道。