研究生毕业7年了,虽然最近两年开发做的少了,但还时不时做一点,手还没生,写一点个人经验,希望各位大拿能交流指导一下。
打算写几个方面:
如何做好软件开发,如何学习,职业规划
一直做的是嵌入式上的C开发,所以只说C编程,以下的经验都是基于C的,其他java的,C++的都先不说了。
也没有什么系统,想到什么说什么吧。
(一) 编码经验
文件结构:
我的文件结构非常死板,假定编一个Player 模块,那么,大概会分这么几个文件。
intfPlayer.h //接口头文件,intf 是interface的意思,该文件提供给上层应用调用。
playerCommon.h //内部通用头文件,给Player模块内部各个.c 文件调用,提供公共的数据结构。
playerPlay1.c //功能实现文件1
playerPlay2.c //功能实现文件2
……………………………………..
playerPlayn.c //功能实现文件n
intfPlayer.h中通常会定义这样一些东西:
/* 基本的头文件,根据情况添加 */
#include
#include
#include
#include
#include
/**************************************************************************
* 常 量 *
**************************************************************************/
………………..
/**************************************************************************
* 宏定义 *
**************************************************************************/
…………………
/* 个人习惯,只是为了使用EXTERN时比extern更醒目 */
#define EXTERNextern
#define STATICstatic
#defineCONST const
………………………..
/**************************************************************************
* 数据类型 *
**************************************************************************/
/* 为了适应不同平台,也为了更醒目和方便使用,对基本数据类型重新做了定义 */
typedef char INT8;
typedef char CHAR;
typedefshort INT16;
typedef int INT32;
typedefdouble INT64;
typedef unsignedchar UINT8;
typedef unsignedshort UINT16;
typedef unsignedint UINT32;
typedef int BOOL;
typedef voidVOID;
typedef VOID* PLAYER_HANDLE;
/* 返回值 */
typedef enum
{
E_PLAYER_RTN_OK,
E_ PLAYER _RTN_NOK,
E_ PLAYER _RTN_BUTT
}E_ PLAYER _RTN;
/**************************************************************************
* 模板 *
**************************************************************************/
/**************************************************************************
* 全局变量 *
**************************************************************************/
/**************************************************************************
* 全局函数原型 *
**************************************************************************/
/* 不管什么类型的程序,我基本都这样写,创建,删除,功能执行
创建函数中会分配多块内存并初始化,删除中则释放内存。
决不会用使用一个全局性的大结构体。
*/
EXTERN E_PLAYER_RTNplCreatePlayer(PLAYER_HANDLE *hPlayHandle,...);
EXTERNE_PLAYER_RTN plPlay(PLAYER_HANDLE hPlayHandle,...);
EXTERNE_PLAYER_RTN plDeletePlayer(PLAYER_HANDLE hPlayerHandle);
playerCommon.h中通常会这样:
#include “intfPlayer.h”
/* 模块内部公共数据定义 */
playerPlay1.c等功能文件,实现各自的功能。
另外,还要写一个playerTestDriver.c,该文件中会调用各个接口函数,示范PLAYER模块的各个接口。该文件一般连同intfPlayer.h提供给应用层人员。
还有一个文件playerUnitTest.c,顾名思义,该文件完成单元测试,供开发人员自己使用,不提供给其他人。
这种文件结构很死板,但也很合理。通常各个功能文件中只引用playerCommon.h就可以了,不会再出现每个文件中都include 一堆头文件的情况,代码简洁清晰。
功能文件中多少会有些该文件才用的数据定义,我一般直接将这些定义写在该文件头部,以便减少文件个数,不再单独定义自己的专有头文件,如playerPlay1.h。除非该功能文件需要大量的数据定义,才会定义playerPlay1.h,该文件中会include playerCommon.h。
这种写法是我从之前的公司学来的,本来以为大家都这样写的,但在现在的公司,发现不同人的写法真的是丰富多彩,很多文件里include了一堆,而且往往找了半天也不知道某个模块的对外接口头文件到底是哪个,有哪些接口数据,有哪些接口函数。