作为一个程序员,无论是入职新公司,还是接手新项目,阅读别人写的代码是必须要做且必须要做好的事情,否则,轻则干不好工作、得不到重用,重则在公司里站不稳脚跟、迟早被淘汰。
对于一个大型程序,如果代码没有注释,要搞清楚它的架构和算法,是一件非常不容易的事情。由于工作需要,先后使用过 uCOS、Linux、Android 开源操作系统、MiniGUI 开源窗口系统和 MPlayer 开源多媒体播放器等,也阅读了其中的大量代码。
关于代码注释,以 Linux 为例谈三点认识:
一、Linux 子系统的接口函数一般都写注释来说明函数的功能和参数,比如 ALSA 音频子系统的 snd_soc_register_codec() 函数:
/**
* snd_soc_register_codec - Register a codec with the ASoC core
*
* @dev: The parent device for this codec
* @codec_drv: Codec driver
* @dai_drv: The associated DAI driver
* @num_dai: Number of DAIs
*/
int snd_soc_register_codec(struct device *dev,
const struct snd_soc_codec_driver *codec_drv,
struct snd_soc_dai_driver *dai_drv,
int num_dai)
{
struct snd_soc_dapm_context *dapm;
struct snd_soc_codec *codec;
struct snd_soc_dai *dai;
int ret, i;
dev_dbg(dev, "codec register %s\n", dev_name(dev));
codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
if (codec == NULL)
return -ENOMEM;
codec->component.codec = codec;
... // 省略部分代码
mutex_lock(&client_mutex);
snd_soc_component_add_unlocked(&codec->component);
list_add(&codec->list, &codec_list);
mutex_unlock(&client_mutex);
dev_dbg(codec->dev, "ASoC: Registered codec '%s'\n",
codec->component.name);
return 0;
err_cleanup:
snd_soc_component_cleanup(&codec->component);
err_free:
kfree(codec);
return ret;
}
EXPORT_SYMBOL_GPL(snd_soc_register_codec);
二、关于阅读优秀的代码,有一句挺给力的英文:Read the fucking source code。我们要读懂代码,除了借助良好的代码注释,还有一个重要的手段就是:修改它,运行它,观察运行日志,直到搞懂为止。
三、大量的代码注释都是用英文写的,而且很多高质量计算机书籍原版都是用英文写的,因此学好英文对于程序员来说还是相当重要的。