热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

随想录(怎么阅读代码)

【声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing163.com】作为程序员来说,

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


    作为程序员来说,看代码是我们的必修课。记得以前《Linux内核修炼之道》的作者说过,学习linux最好的途径就是看代码。《深入浅出MFC》的作者侯捷也说过,代码面前没有秘密可言。但是,代码真的是那么容易读的吗?其实就我个人的经验而言,代码里面有的不仅仅是知识,更多的是对业务的一种提炼和理解。换句话说,我们在代码中看到的不仅仅是业务的处理,看得更多的可能是对异常和突发情况的处理。这在某种情况下很有可能会左右我们对代码的认识。不熟悉语言、不熟悉编译环境、不熟悉业务、不熟悉测试场景、不熟悉别人的开发思路,这些都会成为我们学习的障碍。那么,有什么办法可以提高自己看代码的能力呢?


(1)熟悉编程语言

    不同的项目有不同的编程语言,这一点在sourceforge、google code上面可以看得很清楚。现在开源的项目很多,小的代码库比如说有linux 0.11,前后大约有两万行左右,大的代码就不胜枚举了,什么linux 3.0、open office、mplayer、gimp、android,基本上每一个项目的代码行数都是在百万行以上。所以,如果你想对开源项目有一个基本的了解,那么你就需要对它的基本编程语言有一个透彻、详尽的了解。很难想象一个对C语言、汇编语言都不是很了记得人怎么能够看懂linux kernel的代码?当然了,这些还只是基础。它是你进一步提高的必要条件,却不是充分条件。


(2)学会使用开源项目的基本功能

    很多朋友在接触开源的时候都有一个很不好的习惯。那就是,不管是什么项目的代码,他都会不管三七二十一,下载下来立马解压,接着就看起代码来。至于说,这个代码有哪些功能,这个开源软件是怎么使用的,他全然不管。举个例子来说,很多朋友都喜欢notepad++这个工具,它也是一个很有名的开源项目。如果我们对notepad++的相关功能没有一个清晰的认识,那么我们就会把自己陷入到代码当中去,没有一个突破点。开源项目大多经过多年的发展,整个代码量远不是几千行那么简单。所以说,如果剥开软件的基本功能,只注重代码本身,你学到的东西其实是很少的。


(3)学会编译代码

    编译代码是我们学习软件的基本功课。在widnows上面,你要学会利用visual studio编译软件;在linux上面,你要学会gcc、ld、makefile等工具,同时还要学会自己搭建编译环境,不同的编译环境还要注意在版本上是否相互匹配。即使是Windows上面,由于版本的差别,有的软件代码只能使用高版本的visual studio才能编译,有的软件需要directx库、ddk才能参与编译。所以编译代码本身并不是那么简单的一件事情。就拿ucos嵌入式操作系统来说,相信很多人都看过它的代码。但是我想问的是,真正把ucos编译成可执行文件的朋友究竟有多少?


(4)学会看懂、修改代码

    在代码编译之后,我们常常就可以得到执行文件了。但是,这些工作只是一些基本工作,我们还有很多其他的工作要做。比如说,你要知道这个软件的入口点有哪些?实现了那些功能?基本机制是什么?模块和模块之间究竟是怎么衔接的?协议栈或者软件是怎么分层的?在真正看懂代码之前,你需要

a)分清代码的结构,这些一般可以从readme文件可以看出来;

b)弄清代码本身有多少线程,每个线程的功能是什么;

c)分清数据和代码的走向,理清楚代码的执行流程;

d)善于利用软件的基本功能点来看代码;

e)编译代码的时候添加-g选项,这样可以实现单步调试,查看每一步数据的变化情况;

f)给原来的开源模块添加新的功能,但是不能破坏原来的基本构架和机制,验证和深化自己的认识。


(5)学会仿真代码、重构代码

    如果我们看代码的目的只是为了利用某一些lib函数的使用方法,那么做到上面4点就已经很不错了。但是,我们常常有更高的要求。通过学习,我们可以发现原来的开源软件有哪些设计的闪光点?自己是不是可以对它的基本功能用相同的编程语言尽快仿真出来?甚至于,我们可以自己编写一个类似的开源软件,实现更多的功能,而在资源的利用和数据的访问速度上有一个质的提高。等到我们可以仿真代码、重构代码的时候,那个时候我们才能说对这个代码真正掌握了。


    不同的人看代码的目的是不一样的。但是,既然我们看了这些代码,那么至少需要掌握一些东西、学习一些东西,否则那不是在浪费时间吗?不管什么方法,有几个原则是我们必须牢记的,否则看代码的效果就会大打折扣的,

1】代码必须完全编译出来,不能编译的代码基本是没有什么用的;

2】代码必须单步调试,慢工才能出细活;

3】修改代码必须建立在对软件深刻理解的程度上,否则bug会越改越多的;

4】代码是需要反复看、反复验证的,通常每一次看都会有新的收获;

5】看代码的时候注意相互交流彼此的看法,这样会受益良多。




推荐阅读
  • 手机上编写和运行PHP代码的最佳软件推荐 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
  • 在编写数据库应用程序时,常常需要用户自己在控制面板中配置ODBC数据源。然而对一般用户而言,配置ODBC数据源的工作是有一定困难的。因此, ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 探索 PHP 8.0 的重大更新:轻松获取年度月份数据
    PHP 8.0 引入了多项重要更新,包括增强的类型系统、全新的 JIT 编译器以及联合类型等特性。这些改进不仅提升了性能,还简化了开发流程。本文将重点介绍如何利用 PHP 8.0 的新功能轻松获取年度和月份数据,为开发者提供更高效、更简洁的解决方案。 ... [详细]
  • 欢迎来到Netgen新时代:探索网络生成技术的无限可能
    欢迎进入Netgen的新时代:探索网络生成技术的无限潜力。本文将详细介绍如何编译下载的Netgen源代码,生成Netgen程序,并提供开发所需的库nglib。此外,还将探讨Netgen在现代网络设计与仿真中的应用前景,以及其在提高网络性能和可靠性方面的关键作用。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • C/C++利用栈和队列实现停车场管理系统【C++教程】
    数据结构的课程设计一般都不是很好理解,今天小编为大家总结了一下c和c++版本的常见栈和队列的的停车场管理程序,需要 ... [详细]
  • 在无网络环境下于CentOS 7系统中离线部署Nginx服务器
    nginx背景俄罗斯程序员IgorSysoev创建,于2004年NGINX首次发布,来解决C10K问题(10000并发客户端连接到单个服务器,导致服务器连接数过多崩溃的问题),是一 ... [详细]
author-avatar
最低调的鹌鹑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有