问题

怎样阅读 Chromium 源码?

回答
阅读 Chromium 源码是一项充满挑战但也收获颇丰的任务。它就像进入一个庞大而精密的机械工厂,你需要理解每个齿轮、每个传动装置是如何协同工作的。下面我将从几个方面,尽量详尽地描述如何入门和深入理解 Chromium 源码,并且尽量让你感觉这是由一位有经验的开发者分享的实际经验。

1. 心态准备:拥抱复杂,保持耐心

首先,最重要的一点是: Chromium 源码是巨大的,也是复杂的。 你不可能一夜之间就全部读懂。把它想象成学习一门新的编程语言,只不过这门语言的语法规则非常多,而且它的“库”极其庞大。

不要试图一次性理解一切: 找到你感兴趣或者需要解决的具体问题,然后围绕这个问题去探索。比如,你对网络请求如何处理感兴趣,就从网络相关的模块开始。
保持好奇心和解决问题的动力: 遇到不懂的地方是常态。搜索引擎、Chromium 官方文档、社区论坛是你最好的朋友。
接受“我不懂”的状态: 很多时候,你会发现自己在一个函数里打转,或者完全不理解某个类在做什么。这是正常的。把它作为一个学习的机会,而不是挫败感的来源。

2. 工具准备:工欲善其事,必先利其器

在开始阅读代码之前,你需要搭建好开发环境,并准备好一些趁手的工具。

下载和编译 Chromium:
下载源码: 这是第一步,也是最耗时的一步。你需要使用 `depot_tools` 工具链来获取源码。
安装 `depot_tools`: 这是 Google 为 Chromium 开发提供的官方工具集,用于管理代码仓库、下载依赖等。你需要根据你的操作系统按照官方文档(搜索 "Chromium build instructions")来安装。这通常涉及到下载 `depot_tools` 的压缩包并将其添加到你的 PATH 环境变量中。
初始化仓库: 运行 `fetch chromium` 命令。这个命令会为你创建一个包含 Chromium 核心代码以及大量子项目的目录。请注意: 这个过程会下载几 GB 甚至几十 GB 的代码,并且需要一个稳定快速的网络连接。
同步代码: 当你发现代码更新时,可以使用 `gclient sync` 来同步最新的代码。
编译源码:
GN (Generate Ninja): Chromium 使用 GN 来生成构建文件,而不是 Autotools 或 CMake。你需要先运行 `gn gen out/Default` 来生成 `out/Default` 目录下的构建文件。
Ninja: 实际的编译过程是由 Ninja 来完成的,它非常快速高效。你可以通过运行 `autoninja C out/Default` 来进行编译。
编译选项: 你可以在 `gn args out/Default` 中配置很多编译选项,比如目标平台、是否开启调试信息、是否优化等等。对于初学者,建议先使用默认选项编译。
时间投入: 第一次编译可能需要数小时甚至更长,具体取决于你的硬件配置。后续的增量编译会快很多。
代码编辑器/IDE:
VS Code (推荐): 配合 C/C++ 插件,提供了很好的代码补全、跳转、定义查找等功能。你也可以安装一些 Chromium 相关的 VS Code 扩展(虽然不多,但有),或者利用其强大的搜索功能。
CLion (付费,但功能强大): 如果你预算允许,CLion 对 C++ 的支持非常出色,能够更智能地解析大型项目。
Emacs/Vim: 如果你习惯这些编辑器,也可以通过配置来达到不错的阅读体验。关键是你能高效地跳转和搜索。
调试工具:
GDB/LLDB: 当你需要调试运行时,这些是标准的 C/C++ 调试器。你可以通过 `gdb out/Default/chrome` 来启动一个调试会话。
Chrome DevTools: 对于前端(JavaScript、CSS、HTML)相关的部分,Chrome 自带的开发者工具是必不可少的。你甚至可以附加调试器到正在运行的 Chromium 实例上。
代码搜索工具:
grep/ack/ripgrep: 任何命令行下的代码搜索工具都很有用。`ripgrep` 通常是性能最好的选择。
IDE 内置搜索: 大多数 IDE 都提供了强大的项目范围内的搜索功能。

3. 理解 Chromium 的架构:搭好骨架

在深入代码细节之前,对 Chromium 的整体架构有一个基本的了解至关重要。把它比作理解一栋大楼的结构图,而不是直接钻进某个房间里。

多进程架构: Chromium 的核心是多进程架构。浏览器主进程(Browser Process)负责 UI、标签页管理、用户配置文件等。渲染进程(Renderer Process)负责渲染网页内容,每个标签页(或同源组)通常拥有独立的渲染进程。GPU 进程负责 GPU 加速渲染。插件进程(Plugin Process)负责运行各种插件(如 Flash,虽然现在很少用了)。
IPC (InterProcess Communication): 各个进程之间通过 IPC 进行通信。理解 IPC 的机制(特别是 Mojo)非常重要。
关键模块:
`//base`: 这是 Chromium 的基础库,包含了许多通用的工具类、内存管理、线程管理、日志、字符串处理、时间处理等。几乎所有 Chromium 的模块都会依赖它。
`//content`: 这是 Chromium 内容模块的核心,包含了渲染进程的管理、网页加载、内容渲染、安全策略等逻辑。
`//chrome`: 这是 Chrome 浏览器特有的功能和 UI 实现,包括标签页栏、地址栏、设置、书签、历史记录等。
`//url`: URL 解析和管理的模块。
`//net`: 网络相关的模块,包括 HTTP、HTTPS、DNS、Socket 等。
`//blink`: 这是 Blink 渲染引擎的核心代码,负责解析 HTML、CSS,并将其渲染成像素。它是一个独立的子项目,但在 Chromium 源码树中。
`//v8`: Google 的高性能 JavaScript 引擎,也是 Blink 的一部分(用于执行 JavaScript)。
`//ui`: UI 相关的通用库,比如 Skia 图形库接口、窗口管理等。
`//gpu`: GPU 加速相关的代码,包括 OpenGL、DirectX、Vulkan 等接口。
官方文档: Chromium 官方网站有相当多的文档,虽然有时候更新不够及时,但仍然是很好的起点。特别是:
"Chromium Design Docs": 搜索这个关键词,可以找到很多关于架构设计的文档。
`docs/design/` 目录: 在 Chromium 源码树的 `docs/design/` 目录下也有很多设计文档。
`README.md` 文件: 很多目录都有 `README.md` 文件,简要说明了该目录的功能。

4. 阅读代码的策略:如何下嘴

理解了宏观架构后,就可以开始钻进细节了。

从一个你熟悉的功能入手: 比如,当你按下 Ctrl+T 打开新标签页时,这背后发生了什么?或者你输入一个网址并按下回车,网络请求是如何发生的?从这些熟悉的交互开始,追踪代码的流程。
使用 `git blame` 和 `git log`: 当你看到一段代码不理解时,使用 `git blame` 可以知道这段代码是谁、在什么时候、因为什么原因(commit message)提交的。这往往能提供重要的上下文信息。`git log` 则可以帮助你追踪一个文件的修改历史。
利用代码搜索:
搜索类名、函数名: 如果你知道一个关键的类名(例如 `RenderWidgetHostImpl`),直接搜索它。
搜索关键词: 如果你不确定具体名称,可以搜索相关的关键词,比如“network request”、“render page”、“IPC message”等。
搜索错误信息或日志: 如果你在调试时看到特定的错误信息或日志输出,可以直接搜索这些字符串,定位到产生它的代码。
理解依赖关系: Chromium 的模块之间存在复杂的依赖关系。当你进入一个新模块时,先看看它依赖了哪些其他模块,以及哪些其他模块又依赖它。`gn` 的构建文件(`.gn` 文件)和 `BUILD.gn` 文件可以帮助你了解这些依赖。
关注核心类和数据流: 找到负责某个核心功能的类,例如网络请求的处理类、渲染器的核心类等。然后跟踪这些类中的数据是如何流转的,方法是如何调用的。
阅读测试代码: Chromium 有大量的单元测试和集成测试。测试代码往往是理解某个功能或者某个类具体用法最直接的方式之一。找到相关模块下的 `_unittest.cc` 文件。
理解 `mojo`: Mojo 是 Chromium 用于进程间通信(IPC)和构建服务的新一代框架。熟悉 Mojo 的概念(特别是 `Interface`、`Binding`、`Handle`)对于理解 Chromium 的多进程通信至关重要。

5. 深入细节的技巧:抽丝剥茧

打断点调试: 这是最直接有效的方式。在你认为关键的代码行设置断点,然后运行程序,一步一步地观察变量的值、函数调用栈、程序流程。
日志输出: 在关键的地方打印日志信息。Chromium 有自己的日志系统 (`logging.h`),你可以通过 `LOG(INFO)`、`LOG(WARNING)`、`LOG(ERROR)` 等来输出信息。
理解设计模式和惯用法: Chromium 中使用了许多 C++ 的设计模式,例如观察者模式、工厂模式、单例模式等。熟悉这些模式有助于你理解代码的意图。此外,Chromium 也有自己的一些惯用法,比如使用 `base::Owned`、`base::WrapUnique` 来管理对象生命周期,使用 `raw_ptr`、`WeakPtr` 来处理指针的安全性。
关注 `protos` 文件 (`.proto`): Protocol Buffers 在 Chromium 中被广泛用于序列化数据和定义 IPC 消息。理解 `.proto` 文件的语法以及 `proto` 文件如何生成 C++ 代码是理解数据交换的关键。
了解 `base::SequenceBound` 和 `base::Thread`: Chromium 有一套自己的线程模型。理解 `base::SequenceBound`(将对象的生命周期和方法绑定到特定序列)和 `base::Thread`(创建和管理线程)对于理解 Chromium 的异步和并发非常重要。
关注 `blink::WebContents` 和 `content::WebContents`: `blink::WebContents` 是 Blink 渲染引擎用来表示一个渲染页面的对象,而 `content::WebContents` 是浏览器进程中用来管理渲染页面的对象。理解它们之间的关系和交互是理解页面渲染流程的关键。

6. 社区与资源:借助外力

Chromium 官方开发者文档: 如前所述,这是基础。
Chromium 项目的邮件列表: 参与到 Chromium 的邮件列表中,可以学习到其他开发者正在讨论的问题和解决方案。
Stack Overflow: 虽然 Chromium 相关的问题不一定非常多,但仍然有很多开发者在那里寻求帮助和分享经验。
Chromium 开发者博客: 有些 Chromium 的核心开发者会写博客分享他们的开发经验和对 Chromium 的理解。
阅读相关的书籍: 虽然没有专门“如何阅读 Chromium 源码”的书籍,但一些关于 C++ 高级编程、操作系统原理、网络编程的书籍会非常有帮助。

总结:持续学习,不断探索

阅读 Chromium 源码是一个持续的过程。你可能需要花费大量的时间来理解它的方方面面。但是,每一次你解决了一个疑问,或者理解了一个模块的运作方式,都会带来巨大的成就感和知识的增长。

记住,没有人能完全“精通” Chromium 的所有代码。 大多数开发者都是专注于 Chromium 的某个或某几个特定领域。所以,找到你感兴趣的那个“点”,然后深入下去。

祝你在 Chromium 源码的探索之旅中一切顺利!

网友意见

user avatar

第一次看见了Google Chromium开源代码,真是始惊、次醉、终狂。

工作第三年的时候,我就觉得自己编程水平天下无敌,完爆大多数人。

2010年加入创业时期的360,担任高级工程师,负责一个远控软件,同时要跟操作系统底层打交道,入职不久直属Leader就被调整,我开始带团队。

带团队不久之后,开始狂妄自大、目中无人,自以为老子天下第一,谁都看不上。

幸好,这时候遇到了一位在论坛上结识的C++高手,彼时他在百度担任某部门技术Leader。我和他聊天过程中,他感受到了我的自大和浅薄。

到今天还记得和他的对话:你是不是以为自己已经很牛逼了?去看看全世界最牛的代码吧,别在你的小圈子里和其他人比。

我回复:看什么??

他说:去看看Google Chromium吧。

我还真就开始学习Google Chromium了,初看时,真是有一种始惊、次醉、终狂的感觉。

Chromium的每一个子系统拿出来都无比复杂,你想真正看懂就需要大量的计算机体系基础知识。

这张架构图基本展现了以上模块的关联关系:

想看懂如chromium这样的顶尖开源代码,多看计算机经典书籍是必须的,不然一旦陷入到一个不明白的知识点,整个学习的过程全部卡死,另外读计算机经典书籍不光能让你快速提升知识和能力,更会让你在开开源代码之际如虎添翼。

这里顺便送大家一套计算机经典书籍资源,这套资源可不是一般那种网上找的资源,是伴随我从学生一路成长为腾讯高级开发工程师,360技术经理、360技术总监、中小公司CTO的打包全套!非常宝贵。

包含数据结构、操作系统、汇编、大数据、Python、go语言、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展、面试找工作的资料汇总都打包放在这了,点击下方链接可以直接获取:

我已经打包整理好了,直接点击获取:

作者:龙泉寺扫地僧 链接zhihu.com/question/2907
来源:知乎

从代码目录结构上来看,chromium包含这些东西:

  • base,通用代码集,基础组件,包含字符串、文件、线程、消息队列等工具类集合。
  • cc,Chromium compositor 的缩写,负责渲染合成。
  • chrome,Chromium 浏览器外壳实现。
  • content,多进程沙盒浏览器的核心代码,管理进程架构和线程架构。
  • gpu,OpenGL 封装代码,包含 CommandBuffer 和 OpenGL 兼容性支持等。
  • net,网络实现。
  • ipc,进程间消息通信实现。
  • media,多媒体封装代码,包含了媒体内容捕获和播放的组件集合。
  • mojo,类似于 Android 的 AIDL,提供了跨语言(C++ / Java / JavaScript)跨平台的进程间对象(Object)通信机制;。
  • skia,图形库,这里存放的是 Chromium 对 skia 的 配置和扩展代码,另有 third_party/skia 目录存放原生的 skia 代码。
  • third_party,网页排版引擎。第三方库
  • ui,UI 框架。
  • v8,V8 JavaScript 引擎库。

    看起来还好吧?但实际上,这里面每一个展开来讲,都是一本厚厚的工具书的容量。
    比如net,看起来只是个网络库,然而里面包含主机解析,cookies,网络改变探测,SSL,资源缓存,ftp,HTTP, OCSP实现,代理 (SOCKS和HTTP) 配置,解析,脚本获取(包括各种不同系统下实现),QUIC,socket池,SPDY,WebSockets……里面每一项展开来讲,就是一本书。
    v8层,看起来功能很单一,只是实现一下js嘛,但里面包括字节码解析器,JIT 编译器,多代GC,inspector (调试支持),内存和 CPU 的 profiler(性能统计),WebAssembly 支持,两种 post-mortem diagnostics 的支持,启动快照,代码缓存、代码热点分析……里面每一项展开来讲,又是一本书,还是难坑的编译原理和优化方向。

Skia,看起来只是个图形库嘛,用点画出各种图。然而里面包括十几种矢量的绘制,文字绘制、GPU加速、矢量的指令录制以及回放(还要能支持线程安全)、各种图像格式的编解码、PDF的生成(这个是个隐藏的很深的功能,但很有趣。Skia支持把矢量图绘制成pdf)、GPU渲染优化(既以上部分功能需要用gpu来渲染)……里面每项展开来讲,又是一本书。另外值得一提的是,skia是谷歌收购的。不知道谷歌是觉得自己没实力做,还是太费功夫。总之谷歌选择了直接买别人的代码来完成这些功能。

ui,看起来只是一套UI 框架嘛。然而chromium需要一套全平台适配的ui库,还要能支持gpu加速。不过可惜的是里面没实现richedit。ui库的设计,深入来做,其实可以说又是个浏览器了。

等一下,以上这些,看起来只是浏览器的外层。我们最关心的网页排版呢?这个难道不是浏览器的核心嘛。是的,神奇的是,chromium把排版引擎blink放到了third_party下,而且架构上真的当成了一个第三方库一样对待。据谷歌的员工说,这是历史原因……好吧姑且信了。然而这个第三方库,成了当之无愧的最复杂,功能最重要的第三方库。
blink的工作包括:

  • 实现web平台的规范(例如,HTML标准),包括DOM,CSS和Web IDL
  • 配合V8运行JavaScript
  • 从底层网络堆栈请求资源
  • 构建DOM树
  • 计算样式和布局
  • 请求chrome compositor(上文提到的cc层)并绘制图形。

说起来简单。看一下现在的HTML、CSS规范,各种细节加起来……有快上万页。除了chromium layout组、firefox的开发人员等,我想没几个人会去仔细阅读并一个个的实现这些规范吧。光是看目录和文字描述,就头大了,更别说要完整的实现出来。往往一个简单的display:girdflex背后就是庞大复杂的计算,而且还要充分考虑性能上如何优化,滚动时如何更快的展示…
另外排版还需要支持世界各国的奇奇怪怪的文字。例如从右往左写、规则复杂无比阿拉伯文。相比之下,汉字这种方块字的排版简直就是弟弟。还有各种奇怪的unicode字符。
【转】奇怪的unicode字符

怎么能处理好这些字符和语言,并配合几千页的html、css排版规则正确显示出来……这是个极度烧脑的事情。
我们再从排版这个大泥坑里跳出来看看外面别的东西。这时候你会发现……外面的泥坑好像更大。

随便说几个,比如:

  • 多进程框架。嗯,你需要更多的进程来渲染更多的网页,这样才能崩溃了也不影响其他网页。注意,chromium把渲染排版放在渲染进程,但绘制到窗口又是主进程。这里面少不了各种跨进程通信、同步。对于代码的编写以及调试,是个很考验编程功底的事情。
  • webrtc。网络视频相关。又是一个被收购的库。关于webrtc,你需要知道它能实现多人实时语音、降噪、网络传输视频、摄像头的捕获,音频算法实现(比如 fft),视频算法实现(比如 h264 协议格式), Socket、线程、锁等基础库(是的,webrtc也造了套自己的轮子)。又是个庞大的组件。
  • 密码管理、下载管理、扩展管理。
  • 一套调度整个多进程框架以及blink的核心层。在chromium被称之为content层,负责处理一切繁琐的细节。例如各种系统、平台的鼠标键盘消息派发,历史栈(前进后退),页面缓存。
  • 沙箱机制。负责隔离以及降低子进程的权限。沙箱的实现上,在不同系统做了诸多hook操作。
  • chrome相关的外壳及应用。例如我们常见的标题栏、url栏,webui如设置页、历史记录页。对,其实chrome单词的原意就是这个。
  • Clound_Print,谷歌云打印相关,提供谷歌浏览器页面预览打印清单。
  • Courgetter,谷歌提供的二进制文件对比核心算法,用于比较不同版本的二进制差异。谷歌为了方便升级,搞了套升级策略和算法。
  • 神奇的syzygy优化。是的,谷歌也嫌chrome太大了、加载太慢了。于是他们开发了一套工具链,优化重排布PE二进制文件的算法来达到优化程序。Chrome浏览器应用了Syzygy优化之后,程序冷启动的页面调度(paging traffic)优化了80%,加载的Image的Working Set优化了40%。简单的说,谷歌为了优化启动性能,从编译器上对exe、dll开始做手脚了。
  • Media,Chrome的多媒体模块,支持音频播放和录音等功能。这里用到了ffmpeg。但在ffmpeg外,为了和blink配合,又是包裹了厚厚的一层,用来处理好渲染管线。另外MSE API也花了不少功夫。
  • swiftshader。很有趣的一个模块,用纯软件的代码,完整实现了opengl的接口。可以在没有硬件加速的机器上跑起opengl。也是个庞大的库,而且也是被收购的。看起来谷歌对图形学方面的很多工程似乎不擅长?还是不想觉得应该交给更专业的团队去做。
  • gn、gyp、ninja。chromium为了更方便的管理编译,自己撸了三套轮子。类似makefile、cmake,然后底层调用ninja再到vs或者clang负责具体编译

其他的点还有很多很多,以后想到了再补充。总之,以上随意一个点,要正确的实现,都是一个团队的工作量,都可以写成一本书。然而chromium把他们全部实现了,而且还在不停的加入新的功能。

说一个学习Chrome源代码的诀窍:Chrome的源码不要只看不上手,编译起来运行起来,多改改看看会发生什么。这个过程即好玩又能加深你对源码的理解。

真是不比不知道,一比吓一跳,有的时候,我们真的是处于愚昧山峰。

对于程序员来说,算法也非常重要,再送大家一份资料,要看懂顶尖开源代码,学好算法很重要,并且算法厉害的人进大厂非常容易,这里送一本阿里P8撰写的算法刷题笔记,身边不少朋友通过它加入大厂:Github 疯传!史上最强悍!阿里大佬「LeetCode刷题手册」开放下载了!​mp.

除了Google Chrome的源码,还可以多看看Google的其他开源代码,你会被震撼、被打击、被陶醉!同时,你也会知道,自己写代码究竟是个什么水平!

Google的所有开源代码在这,感兴趣的朋友可以看看:

包括了:Android、Angular、Chromium、Dart、DeepMind Lab、Flutter、Gerrit、Go、Istio、gRPC、Kubernetes、Polymer、Ptotobuf、TensorFlow、V8、WebRTC。

跟这个世界最顶尖的高手过招,你才能知道自己究竟有几斤几两~

类似的话题

  • 回答
    阅读 Chromium 源码是一项充满挑战但也收获颇丰的任务。它就像进入一个庞大而精密的机械工厂,你需要理解每个齿轮、每个传动装置是如何协同工作的。下面我将从几个方面,尽量详尽地描述如何入门和深入理解 Chromium 源码,并且尽量让你感觉这是由一位有经验的开发者分享的实际经验。 1. 心态准备:.............
  • 回答
    阅读英文文章,特别是内容偏向学术或者主题比较生疏时,遇到不少生词是很正常的。关于“要不要遇到不会的词马上就查”,这是一个需要灵活处理的问题,答案并非绝对的“是”或“否”,而是要看具体情况和你的阅读目标。下面我来详细聊聊这个话题,并分享一些我自己的经验和方法,希望能帮助你更顺畅地阅读英文文章。核心原则.............
  • 回答
    《红楼梦》的阅读体验,绝非仅仅是扫过字面意思那么简单。它是一本越品越有滋味的陈年老酒,一本需要你投入时间和心力去慢慢打磨的书。想要真正读懂它,不妨试试以下几点,我会尽量说得细致些,让你感觉这是个过来人的经验之谈:一、 放下功利心,以一颗好奇的心去“逛”:很多人一开始读《红楼梦》,总抱着“我要读懂它,.............
  • 回答
    《时间简史》这本书,说实话,初次接触很多人都会觉得“劝退”。它里面涉及的物理概念,比如量子力学、广义相对论,还有黑洞、宇宙大爆炸这些,光是听名字就让人觉得门槛很高。但霍金老爷子写这本书,目的就是希望让更多普通人也能理解宇宙的奥秘,所以他用了很多类比和通俗的语言。那么,我们普通人要怎么才能“啃”下这本.............
  • 回答
    这阵子,感觉自己像一块海绵,总想往脑子里塞点东西,什么都想看点,什么都想了解点。书架上堆着的书一本比一本厚,手机里保存的文章链接也越来越长。这感觉挺好的,但问题也来了:看是很快,可真正吸收进去、能用得上的时候却少得可怜。这就好像吃了很多东西,却消化不良,肚子胀胀的,反而没了力气。所以,怎么让这股求知.............
  • 回答
    让孩子爱上阅读,并且能独立沉浸其中,这是许多家长的心愿。这可不是一蹴而就的事,更像是精心培育一株小树苗,需要耐心、理解和一些巧妙的方法。今天,我就来跟你聊聊,怎么把这件“大事”办妥。一、 播下兴趣的种子:让阅读成为一种享受,而不是任务我们得明白,孩子不是天生就对书本充满热情。他们的世界里有太多好玩的.............
  • 回答
    说实话,年轻的时候,我真没觉得“多读书”这事有多神乎其神。那时候,大概是受了点“万般皆下品,唯有读书高”的传统观念影响,总觉得读书就该是为了考个好大学,找个好工作,过上“稳定”的日子。书架上堆满了参考资料和名著,但很多时候,它们更像是摆设,是证明我“好学”的道具,而不是我真正的精神食粮。改变,是悄无.............
  • 回答
    .......
  • 回答
    新时代阅读:一场全方位的变革新时代的阅读,早已不是静坐在书桌前,一页页翻阅纸质书的单一模式。它是一场深刻而全面的变革,涉及阅读的每一个维度——方式、内容、设备,乃至阅读者的心态和习惯。以下我将从不同角度详细阐述新时代阅读的新变化: 一、 阅读方式的多元化与互动化 从单向接收到多向互动: .............
  • 回答
    多看阅读被小米收购后的变化,可以说是一场“凤凰涅槃”与“水土不服”并存的经历,究竟是好事还是坏事,恐怕不同用户群体的感受会截然不同。曾经的多看阅读:有过辉煌,也有其独特的魅力在被小米收购之前,多看阅读以其精美的排版、高质量的内容以及相对纯粹的阅读体验赢得了不少书友的喜爱。它尤其在扫描版图书的优化方面.............
  • 回答
    您这个问题非常好,也特别实际。很多家长都会有类似的困惑:小学阶段重阅读、轻“题海”的操作,到了中学会不会吃亏?咱们就来掰开了揉碎了聊聊。首先,得明确一点:小学大量阅读,绝对是为未来打下坚实基础的金钥匙,它带来的好处远不止于“成绩”二字,而是“能力”的全面提升。 那些只盯着作业做的孩子,可能在短期内分.............
  • 回答
    《资治通鉴》这本巨著,想要读透,确实需要点方法和耐心。不是那种一口气读完的小说,它更像是一部需要细嚼慢咽的史书,里面蕴含的东西太丰富了。要说怎么读最有效,我这里倒是有一些心得体会,希望能帮到你。一、明确你的阅读目的,找到切入点《资治通鉴》是一部通史,时间跨度从战国到五代,内容包罗万象。你不能一开始就.............
  • 回答
    你好!很高兴能和你聊聊如何啃下《资治通鉴》这块硬骨头。确实,《资治通鉴》作为一部史学巨著,文言文功底要求不低,但只要方法得当,即便是初学者也并非不可逾越。下面我就给你详细说说,希望能帮到你。一、打好基础:文言文的“内功”修炼在直接挑战《资治通鉴》之前,就像练武要先扎马步一样,我们需要先把文言文的基础.............
  • 回答
    想要深入理解 Android 系统源码,对于大多数开发者来说,这就像是踏入一片广袤而又神秘的森林。我们看到的那些“大牛”们,并非天生就能在这片森林里畅通无阻,他们也是一步步摸索、构建自己的阅读路径的。今天就跟大家聊聊,他们是怎么在这片森林里行走,甚至可以说是在其中“筑巢安家”的。一、明确目标,带着问.............
  • 回答
    好,你即将踏上研究生求学之路,准备在科研的海洋里遨游,这真是个令人兴奋的开始!面对浩如烟海的文献,感到一丝茫然是再正常不过的事了。别担心,阅读文献这事儿,就像学游泳,一开始可能呛水,但找到对的姿势,很快就能游刃有余。首先,得明确你为什么要去读文献。它不是为了炫技,也不是简单地把所有字都塞进脑子里。文.............
  • 回答
    冯梦龙的《智囊全集》,捧在手里,初看之下,确实如你所说,像一本汇集了千百个小故事的宝库。起初,你可能会觉得它零散,缺乏一以贯之的主线,仿佛只是东拼西凑的片段。但请别急着下结论,这恰恰是它最巧妙的地方。要把这些故事化为己用,给自己带来启发,我觉得重点在于“活读”,而不是“死记”。你想啊,这些故事,很多.............
  • 回答
    想把阅读能力往上提一个台阶?这事儿可不能急,得循序渐进,也得找对方法。很多人觉得阅读就是把字儿认出来,意思懂了就完事儿了,但其实,真正的阅读能力,那是能把文字背后的东西都挖出来,而且还消化得特别好。一、打好基础:认字、词汇、语法,一样都不能少这就像盖房子,地基不牢,上面怎么盖都摇摇欲坠。 认字:.............
  • 回答
    想让读书这件事,从“我应该读”变成“我想读”,这中间的距离,可不是一蹴而就的。培养一个习惯,尤其是像阅读这样需要投入时间和精力的习惯,就像种一棵小树,需要耐心呵护,循序渐进。别急,咱们一步一步来,把这棵“阅读树”种在心里。第一步:从“为什么”开始,点燃内在的火花很多人知道读书好,但“为什么”好,却说.............
  • 回答
    阅文集团起诉知识产权局,这件事儿说起来挺有意思的,得从几个层面来看。首先,咱们得弄清楚,阅文集团是什么样的公司。简单来说,它在中国网络文学领域是绝对的巨头,拥有大量的版权,比如咱们熟知的《斗破苍穹》、《琅琊榜》这些,很多都是阅文旗下的 IP。作为内容产业的核心,IP的保护和价值实现,对阅文来说是天大.............
  • 回答
    创作小说如何弥补阅历的不足?作为一名作家,尤其是新手作家,缺乏丰富的个人阅历是许多人都会面临的挑战。然而,阅历的匮乏并非创作的终点,而是通往更广阔想象空间和深刻洞察力的起点。通过一些行之有效的方法,你可以巧妙地弥补个人阅历的不足,创作出引人入胜、触动人心的故事。一、 深入研究与资料收集:构建坚实的知.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有