左耳听风_100_99_高效学习如何学习和阅读代码

你好,我是陈浩网名,做我个house.这节课呢我想来谈一谈如何学习和阅读代码。

杰夫阿特伍德啊说过这么一句话,code tell you how comments tell you why.那我把它扩展一下呢,就是代码会告诉你what how和details.而文档和书呢会告诉你what how和why可见啊,代码并不会告诉你,y看代码呢只能靠猜测或者推导来,估计y是揣测不准确,所以呢也会有很多的误解。

而且呢我们每个人都知道外啊是能让人一通百通的东西,也是能让人醍醐灌顶的东西。

但是呢代码它会告诉你细节,那这个呢是书和文档不能给你了,细节是魔鬼,细节决定成败。

这样的话我们不但听过很多啊,我们做技术的也应该体会过很多。

当然呢我们也要承认这些代码细节给人带来的快感,毕竟不如知道y以后的快感。

大书和文档呢是人对人说的话,而代码呢是人对机器说的话。

所以说如果你想知道人为什么要这么搞,那么应该参考资料:https://51gx.top/detail/254去看书看文档。

而如果你要知道机器它到底干了什么,那你呀就应该看代码。

因此啊我认为都比较重要。

那关键呢是看你的目的是什么。

那如果你想了解一种思想、一种方法、一种原理、一种思路、一种经验,那恐怕读书和读文档会更有效率一些。

因为其中呢会有作者的思路描述,像effective c加加之类的书啊,里面就有很多的对不同用法和设计的推敲。

Tcpip详解里面呢也会有对TCP算法好坏的比较。

那这些思维方式啊能让你对技术的把握力更强,而光看代码很难达到这种级别。

但是如果你想了解的就是具体的细节,比如说某一个协程的实现,某一个模块的性能,还有某个算法的实现。

那么你还是要去读代码的。

因为代码中呢会有更具体的处理细节啊,尤其是对于一些educase或者代码技巧方面的内容。

另外呢通过接下来这几个现象,你可以自己比较一下。

第一呢就是很多时候我们去读代码,是因为没有文档或者文档写的太差。

第二,很多时候啊在google stackorle flow还有github之后啊,你会发现你掌握的知识啊就是一块一块的碎片,既不系统也不结构化,更别说融会贯通了。

你会觉得自己需要好好的读一本书,系统的掌握知识。

你的这种感觉啊一定很强烈吧。

第三呢就是很多时候在读别人代码的时候啊,你会因为基础知识或者原理不懂,或者说你在不知道为什么的情况下,要么就完全读不懂代码,要么会误解代码。

比如说如果你没有c语言和TCP原理方面的基础知识啊,就根本读不懂linux下面TCP的相关代码。

我们因为误解代码用意而去修改代码所造成的故障还省吗?第四啊,在很多时候你看到一个算法或者一个设计的时候啊,比如说penxils,你是不是会想去看一下这个算法的实现代码是什么样的,思考一下如何才能实现的好呢?第五很多时候呢,当你写代码的时候,你能感觉得到自己写的代码有点别扭啊,怎么写都别扭。

那这个时候呢,你也会有想去看别人代码是怎么实现的冲动。

那类似的情况呢还有很多,但是到底从代码中收获大,还是从书里面收获到在不同的场景,不同的目的之下,会有不同的答案。

那这里啊我还是谈一谈人的学习过程吧。

从学习的过程中啊,我们来分析一下看代码和看书这两个活动。

那人对新事物的学习过程啊,基本上都是从感性认识到理性认识的那如果你是个新手啊,那应该多读代码,多动手写代码。

因为你需要的是感性认识,那这个时候理性认识呢,你体会不到,一是因为啊你没有切身的感受。

那即便告诉你why你也体会不到。

而另一方面呢这个阶段你要做的不是做漂亮,而是做出来。

所以说在新手阶段呢,你会喜欢get up这样的东西。

而如果你是个老手,你有多年的感性认识了,那么你的成长呢需要更多的理性认识。

因为到这个阶段,一方面你会不满足于做出来,你会想去做更牛更漂亮的东西。

而另一方面呢,你知道的越多,你的问题呢也越多,你迫切的需要知道why.这时呢你就需要大量的找牛人交流。

所以说这个阶段呢你会喜欢读好书和文章。

但是呢对于计算机行业这个技术创新能力超强,技术种类繁多的行业来说啊,我们每个人啊都既是新手,也是老手。

那接下来呢我想来和你聊一聊如何阅读源代码。

很多人呢都问过我如何读代码,因为我在外企里工作的时间啊比较长,所以呢我经常接手一些国外团队写的代码。

我发现啊虽然老外写的代码比国人好一点,但是呢依然有文档缺失、代码注释不清、代码风格混乱等等一些问题。

那这些呢都是阅读代码的障碍。

在这里啊,我把我的一些阅读源代码的经验分享给你,希望能对你有用。

首先呢在阅读代码之前啊,我建议你需要有以下的这些前提再去阅读代码。

那这样呢你读起代码来啊会更顺畅。

那第一个呢就是相关的语言和基础技术的知识。

第二个呢是软件功能。

你先要知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项,你需要先读一遍用户手册,然后呢让软件跑起来,自己先用一下,感受一下。

第三呢是相关的文档,读一下相关的内部文档啊。

Read me也好,release notes也好,design也好,ricky也好。

那这些文档呢可以让你明白整个软件的方方面面。

那如果你的软件没有文档,那么你只能指望这个软件的原作者还在,而且他还乐于交流。

那第四呢就是代码的组织结构,也就是代码目录中啊,每个目录是什么样的功能,每个文档是干什么的那如果你要读的程序啊,是在某种标准的框架之下组织的,比如说java spring框架,那么恭喜你,这些代码不难读了。

那接下来呢你要了解这个软件的代码是由哪些部分构成的。

我在这里呢给你一个列表供你参考。

第一呢是接口抽象定义,任何代码呢都会有很多的接口和抽象定义。

他描述的代码需要处理的数据结构或者业务实体,还有他们之间的关系。

那理清楚这些关系呢是非常重要的。

第二呢是模块粘合槽,我们的代码呢有很多都是用来联合代码的。

比如说中间件、promise模式回调,代理委托,还有依赖注入啊等等,这些代码模块间的粘合技术啊是非常重要的。

因为他们会把本来平铺之数的代码给分裂开来,让你不容易看明白它们之间的关系。

那第三呢就是业务流程,这是代码运行的过程。

一开始呢我们不需要进入细节,但是需要在高层搞清楚整个业务的流程是什么样的那在这个流程当中啊,数据是怎么被传递和处理的那一般来说呢我们需要画程序流程图或者时序处理图。

第四呢就是具体的实现。

当你了解了前面这三个方面的内容之后啊,相信你对整个代码的框架和逻辑啊已经有了总体的认识。

那这个时候呢,你就可以深入细节,开始阅读具体实现的代码。

那对于代码的具体实现呢,一般来说啊你需要知道下面一些事实。

那这样呢有助于你在阅读代码时啊找到重点。

第一就是代码逻辑,代码呢有两种逻辑,一种是业务逻辑。

那这种逻辑呢是真正的业务处理逻辑。

而另一种呢是控制逻辑。

这种逻辑呢只是用来控制程序流转的,而不是业务逻辑。

比如说flag之类的控制变量,多线程处理的代码,异步控制的代码,远程通讯的代码,还有对象序列化、反序列化的代码等等。

那这两种逻辑呢要分开很多代码之所以混乱,就是把这两种逻辑啊混在一起了。

第二呢是出错处理,根据二八原则,百分之二十的代码是正常的逻辑,而百分之八十的代码是在处理各种错误。

所以说你在读代码的时候呢,完全可以把处理错误的代码全部删除掉。

那这样呢就会留下比较干净和简单的正常逻辑的代码,排除的干扰因素呢就会更高效的读代码。

第三呢是数据处理。

只要你认真观察,你就会发现我们好多代码呢就是在那里倒腾数据。

比如说DAODTO,比如说jason、 XML这些代码呢冗长无聊啊,不是主要逻辑可以不理。

第四呢就是重要的算法。

一般来说呢我们的代码里啊会有很多重要的算法。

那我这里说的并不不一定是什么排序啊,或者搜索算法啊,可能是一些其他的核心算法。

比如说一些索引表的算法,全局为一ID的算法,信息推荐的算法、统计算法通度算法等等。

那这些比较核心的算法可能会非常难读,但它们往往是最有技术含量的部分。

第五呢是底层交互,有一些代码是和底层系统的交互。

那一般来说呢是和操作系统或者GVM的交互。

因此读这些代码通常需要一定的底层技术知识,不然呢很难读懂。

最后阅读代码的第五个前提呢是运行时的调试。

很多时候啊代码只有运行起来了,才能知道具体发生了什么事儿。

所以呢我们让代码运行起来,然后呢用日志也好,debug设置断点跟踪也好,实际看一下代码的运行过程,是了解代码的一种很好的方式。

那这里呢我总结一下阅读代码的方法。

首先呢一般采用自顶向下,从总体到细节的剥洋葱皮的读法。

其次呢画图是必要的程序流程图,调用时序图模块、组织图啊等等。

然后呢代码逻辑归一下类排出的杂音啊,主要逻辑才会更清楚。

另外呢一帮要跟踪一下代码,是了解代码在执行中发生了什么的最好的方式。

对了,阅读代码你需要一个很好的IDE.我记得以前读c和c加加代码的时候呢,有一个叫source inside的工具,就大大提高了我的代码阅读效率。

那说白了就是可以查看代码,相互间调用reference的工具。

那这方面呢,visual studio做的是非常好的。

好了,我总结一下今天的内容,我先跟你探讨的是读文档还是读代码分析对比了从文档和代码中啊各自能收获到哪些东西,然后呢给出建议。

如果你想了解思想方法和原理啊,读书和文档会更有效率。

而如果你想知道具体的细节啊,那还是应该读代码。

随后呢我分享了一些我阅读源代码的方法和技巧,希望能对你有启发。

下节课呢是高校学习系列的最后一篇,我将分享一下面对枯燥和量大的知识的时候啊,我们该怎么做?。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/757904.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]围栏破损检测数据集VOC+YOLO格式1196张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1196 标注数量(xml文件个数):1196 标注数量(txt文件个数):1196 标注…

【操作系统期末速成】EP05 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️2.1 考点十一:死锁的概念与预防2.2 考点十二:死锁的避免一银行间算法2.1 考点十三:死锁的检测与解除 一、前言🚀🚀&#x…

【小沐学AI】Python实现语音识别(faster-whisper-webui)

文章目录 1、简介1.1 whisper1.2 faster-whisper 2、安装3、测试结语 1、简介 1.1 whisper https://github.com/openai/whisper Whisper 是一种通用语音识别模型。它是在各种音频的大型数据集上训练的,也是一个多任务模型,可以执行多语言语音识别、语音…

C语言 | Leetcode C语言题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; struct HashTable {char key;char val;UT_hash_handle hh; };bool isIsomorphic(char* s, char* t) {struct HashTable* s2t NULL;struct HashTable* t2s NULL;int len strlen(s);for (int i 0; i < len; i) {char x s[i], y t[i]…

51单片机第11步_在C语言中插入汇编语言

本章重点介绍如何在C语言中插入汇编语言。要不是有记录&#xff0c;真不知道怎么搞。 /* 你在 Project Workspace窗口中,将光标移到DELAY.c处,点下鼠标右键,选择"Options for file DELAY.c", 点击右边的"Generate Assembler SRC File"和“Assemble SRC …

【VMware】VMware 开启的虚拟机无法联网的解决方案

目录 &#x1f30a;1. 问题说明 &#x1f30a;2. 解决方案 &#x1f30d;2.1 查看虚拟网络编辑器 &#x1f30d;2.2 设置 vmnet &#x1f30d;2.3 设置虚拟机网络 &#x1f30d;2.4 Xshell连接虚拟机 &#x1f30a;1. 问题说明 虚拟机 ping 其他网页显示失败,比如&#…

Python逻辑控制语句 之 判断语句--石头剪刀布案例

需求&#xff1a; 1. 从控制台输入要出的拳 —— 石头&#xff08;1&#xff09;&#xff0f;剪刀&#xff08;2&#xff09;&#xff0f;布&#xff08;3&#xff09; 2. 电脑随机出拳 —— 先假定电脑只会出石头&#xff0c;完成整体代码功能 3. 比较胜负 胜负规则&#x…

【PL理论深化】(12) Ocaml 语言:高阶函数 | map 函数 | filter 函数 | fold 函数

&#x1f4ac; 写在前面&#xff1a;在函数式编程中&#xff0c;除了递归函数外&#xff0c;还经常使用高阶函数。高阶函数是指接收其他函数作为参数或返回另一个函数的函数。高阶函数通过抽象编程模式以实现重用&#xff0c;使程序可以在更高层次上进行编写。让我们重点看看常…

Webpack: 核心配置结构

概述 Webpack 是一种 「配置」 驱动的构建工具&#xff0c;所以站在应用的角度&#xff0c;必须深入学习 Webpack 的各项配置规则&#xff0c;才能灵活应对各种构建需求。本文将作为小册应用系列的一个总结&#xff0c;汇总与应用配置相关的各项知识点&#xff0c;包括&#x…

酒店客房管理系统(Java+MySQL)

技术栈 Java: 作为主要编程语言。Swing GUI: 用于开发图形用户界面。MySQL: 作为数据库管理系统。JDBC: 用于连接和操作MySQL数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份&#xff0c;确保只有授权的用户可以访问和管理酒店客房信…

数据结构复习指南

数据结构复习指南 本文中列举了数据结构期末考试可能存在的考点 绪论 数据的基本单位 数据元素是数据的基本单位 数据项 数据项是组成数据的、有独立含义的、不可分割的最小单位。 数据对象 数据对象是性质相同的数据元素的集合&#xff0c;是数据的一个子集。 数据结…

KBL410-ASEMI智能AI专用整流桥KBL410

编辑&#xff1a;ll KBL410-ASEMI智能AI专用整流桥KBL410 型号&#xff1a;KBL410 品牌&#xff1a;ASEMI 封装&#xff1a;KBL-4 正向电流&#xff08;Id&#xff09;&#xff1a;4A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;2…

系统运维面试总结(系统权限)

系统运维面试总结&#xff08;系统权限&#xff09; 一、权限优化简述Linux权限划分原则二、备份策略三、Raid四、资源查看五、Linux启动流程 一、权限优化简述Linux权限划分原则 ckhunter也是一款常用的Linux杀毒软件 不可修改但可删除 二、备份策略 供参考较为全面的备份方案…

【操作系统】进程管理——进程的概念、组成和特征(个人笔记)

学习日期&#xff1a;2024.6.29 内容摘要&#xff1a;进程的基本概念和特征、状态和转换 进程的概念 程序与进程 程序&#xff1a;是静态的&#xff0c;是存放在磁盘里的可执行文件&#xff0c;就是一系列的指令集合 进程&#xff08;Process&#xff09;&#xff1a;是动态…

基于STM32的智能家用电力管理系统

目录 引言环境准备智能家用电力管理系统基础代码实现&#xff1a;实现智能家用电力管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家用电力管理系统通…

6.优化算法之模拟

1.替换所有的问号 . - 力扣&#xff08;LeetCode&#xff09; class Solution {public String modifyString(String s) {char[] sss.toCharArray();int nss.length;for(int i0;i<n;i){if(ss[i]?){for(char cha;ch<z;ch){if((i0||ss[i-1]!ch)&&(in-1||ss[i1]!c…

湖南(市场调研)源点咨询 市场研究中定性调研的优势与局限性

定性调研指的是调研的结果不经量化或数量分析。 它通常用于分析态度、感觉和动机。定性调研特别是焦点小组访谈法还在继续普及&#xff0c;原因有以下三个&#xff1a; 第一&#xff0c;定性调研通常比定量调研成本低&#xff1b; 第二&#xff0c;定性调研在了解消费者内心…

滑动窗口2

1. 水果成篮&#xff08;904&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 根据题目意思&#xff0c;friuts表示第i棵树上的水果种类&#xff0c;然后我们有两个篮子去在这些树上去采水果&#xff0c;但是有限制就是一个篮子里就只能装一种水果&#xff0c;也就是…

【简单讲解下OneFlow深度学习框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

SM2258XT量产工具,SM2258XT开卡三星SSV4颗粒成功分享,SM2259XT量产参考教程,威刚ADATA SP580开卡记录

前两天拆了笔记本上的威刚ADATA SP580 240GB&#xff0c;准备做移动硬盘用&#xff0c;装入移动硬盘盒之后接入电脑&#xff0c;发现系统可认盘&#xff0c;SMART显示正常&#xff0c;Windows的磁盘管理能显示正确容量&#xff0c;但处于未初始化状态&#xff0c;且始终无法初始…