V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
angrylid
V2EX  ›  问与答

怎么才能找到适合自己学习的开源代码?

  •  
  •   angrylid · 2022-04-18 18:50:27 +08:00 · 2203 次点击
    这是一个创建于 948 天前的主题,其中的信息可能已经有所发展或是发生改变。

    尝试读过一些知名库的代码,感觉代码抽象程度很高或者层层封装,不知从何下手; 业务代码也试着读过一些,往往是个人风格过强,甚至往一个文件里装成千上万行代码,看得头皮发麻。

    请教一下 V 站的大家有什么这方面的经验?

    10 条回复    2022-04-19 16:05:51 +08:00
    cdd2zju
        1
    cdd2zju  
       2022-04-18 20:38:01 +08:00
    个人感觉。op 先尝试学会问一个好问题嘛。你这简短的描述,让人不知道怎么回答。多提供一些比如写多久代码了,技术栈是啥,读过哪些具体的知名库等等,让人更了解你,才能给出更中肯的建议。
    否则,等我洋洋洒洒地说完了自己如何从小白到小黑的开源成长之路。
    发现 op 其实是个工作时长和代码水平远超于我的超级大佬,只是喝咖啡的间隙来随便问问,那我岂不是很尴尬😂。
    angrylid
        2
    angrylid  
    OP
       2022-04-18 22:22:23 +08:00 via Android
    @cdd2zju 我本意是希望不同基础,不同部门的开发者都可以不吝赐教,后面点进来的人也可以有所收获,加太多限定条件就变成个人的咨询了。个人情况是刚入门,只会做简单增删改查。尝试读过前端的知名库,但都读不明白。
    Gldwolf
        3
    Gldwolf  
       2022-04-19 00:32:53 +08:00 via Android
    个人经验是从入口方法入手,硬着头皮往下读,实在搞不明白的部分暂且放过,后面哪个地方用到了再回过头来串连起来,一定要加自己的注释,一定是个人理解意义上的注释,读完再回头串一遍,融会贯通,酣畅淋漓。。。
    Bingchunmoli
        4
    Bingchunmoli  
       2022-04-19 00:50:20 +08:00 via Android
    我是 Java 。技术栈的,看 ruoyi 受益良多,开的懂,封装也不错
    ClericPy
        5
    ClericPy  
       2022-04-19 00:50:32 +08:00
    先别着急看代码, 不然学了也知其然不知其所以然


    按顺序推荐把以下基本功打牢一点(因为不知道你是什么语言, 所以不推荐书籍了)

    1. 面向对象程序设计. 了解一下面向对象的大致原理, 不求一次看懂, 以后还会再回来看一遍的

    2. 软件设计原则, SOLID 那些

    3. 常见的设计模式及使用场景, 其实也是围绕上面的原则的各种实践场景

    4. 实战相关的代码可以入手了, 因为不知道什么语言, 所以可以先看一些偏官方的代码, 不一定要看多知名的, 很多时候官方的代码也有不少经典代码(也不排除有些老代码挺难懂)

    5. 软件架构方面的知识积累, 最常见的场景就是根据业务需求统筹代码架构与各种选型, 将一些主流积木拼凑成一套能打仗的武器. 比如最近看领域驱动设计时候确实收获很大, 而且感觉要看很久

    6. 回头再走一遍查漏补缺. 很多书真的读每一遍收获都完全不同, 越读越发现自己差得很远

    以上几条不是标准答案, 只是这些年学习时候走了太多弯路得到的教训
    golangLover
        6
    golangLover  
       2022-04-19 01:01:42 +08:00 via Android
    什么知名库? spring ?那些看了也没用
    GeruzoniAnsasu
        7
    GeruzoniAnsasu  
       2022-04-19 06:20:53 +08:00   ❤️ 1
    说实话我不太建议学习阶段用开源项目作为学习材料

    一来很多开源项目架构真的太复杂没法入手
    二是学习阶段并没有能力分辨库质量好坏

    业务代码就更别看了,世界上没有几行业务代码是精炼过的

    我编程学得很早,但也是工作后才逐渐看得进开源大项目的代码的。因为写业务代码会有人告诉你整个系统的架构包含哪些部分和抽象层次,我们现在正要写的东西在哪一层什么功能;你可以从两三个文件入手逐渐摸到整个系统的其它部分。

    读代码有点像走迷宫,你得有一个起点然后摸着墙(沿着调用关系链)走,一个文件里包含的数十个函数像是迷宫里并排的几个通道,你看过去了好几个通道(函数),但很可能跟你要走的这条( API 的调用链)并没有什么关系,会晕是必然的。



    个人经验是如果真要评估一个库或者开源项目,就从它的 quick start 或者 bootstrap 看起,观察都有哪些 essential 步骤,每个步骤的目的是什么,然后你自然会考虑每个步骤能不能实现我要的更多需求或目标,逐渐翻阅官方文档和实现,就能慢慢理清楚一部分了。

    好的项目模块之间都是很松散的,你完全可以只理解你需要的一小部分然后马上开始针对这一部分做修改。

    我只看了一周 vue 的文档也能重写一遍 element plus 的组件——前端组件的组织单位是很小的,一个组件只有几个文件,尽管整个库非常大,但理论上来说我都已经能贡献新组件的代码了,无非是照着原样把文件布置好而已,库的规模并不影响你 **先认知一小部分** 。我想学到一个预期功能需要哪些界面元素、绑定怎样的数据结构、暴露哪些部分,那我其实只需要找到一个组件来看对不对

    我也看了很大一部分 gorm 的代码,gorm 充满了各种 interface{}接口和 function dispatch table ,要直接啃源码我敢说根本不可能有几个人能看下来。但如果你只跟着一个 Create 函数进去就会发现结构其实很清晰:一层链式 API 接口,里面一层通用数据结构处理过程(判断 session 、配置、寻找构建器、判断传入值类型等等),再里面一层 clause 构建器( create 的构建器),再里面是按数据库划分的「构建 driver 」,然后在比如 mysql 的「构建 driver 」里就能看到它怎么拼接 create 和值的字符串、它做了哪些判断和额外操作。这个过程如果我看到不科学的地方比如对关系字段的处理不够好,那我也能开始着手自己的修改。尽管我现在对 ALTER 都干了什么还一无所知,但我已经掌握这个库的一部分架构层次和设计概念了,无非是时间和取舍问题没有对库里所有的东西都摸全覆盖全而已

    还有那种更大型的微服务项目,尽管整个项目的体量看起来非常吓人,但你可以先研究脚手架都能干什么、它生成了什么东西,然后搞明白一个 service 单位包含哪些东西。再去寻找猜测可能实现你想找的东西的 service ,逐渐拨开抽象层和数据结构,怎样都是能看进去一部分的
    angrylid
        8
    angrylid  
    OP
       2022-04-19 09:59:46 +08:00 via Android
    @Gldwolf
    @Bingchunmoli
    @ClericPy
    @GeruzoniAnsasu 受益匪浅,感谢分享!
    sam384sp4
        9
    sam384sp4  
       2022-04-19 13:46:35 +08:00
    推荐一个项目 https://github.com/EsotericSoftware/kryo
    java 的序列化框架,代码量少,原理简单
    ffw5b7
        10
    ffw5b7  
       2022-04-19 16:05:51 +08:00 via Android
    当我一时间看不懂代码逻辑时候:
    功能入口看注释,debug 一步一步理解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:49 · PVG 11:49 · LAX 19:49 · JFK 22:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.