V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xloger
V2EX  ›  程序员

请教一下有没有比较好的软件工程实践,比如如何梳理流程图、拆分架构之类的

  •  1
     
  •   xloger · 2023-11-23 13:52:44 +08:00 · 2345 次点击
    这是一个创建于 400 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这一年来我养成了开发功能前先梳理思路的习惯,比如新需求来了,我会先梳理清楚逻辑是啥样的,我大概要拆成几个模块,然后每个模块的职责是什么样的,写好对应的接口或者类图。
    然后对于某个业务逻辑,也习惯先画个流程图方便沟通和避免跑偏。都是在 Markdown 里用 mermaid 画的,很方便。

    这种习惯对我的帮助是比较大的,但是比较野路子(大学学的软件工程早忘了,而且实用度也不高)。我比较想系统地学习一下,对我们程序员来说,一个新功能的开发,怎么样的步骤可以辅助我们写出高质量的代码,效率也更高。
    比如我目前的流程是:
    根据需求,确定有哪些能力才能实现,并且考虑到将来的拓展;
    将这些能力,拆分成不同的模块,大致定好接口和数据结构;
    在接口和数据结构写得差不多的情况下,根据心情把想写的模块先写了,逐个实现。
    然后在优化某个功能时,也会考虑让优化前后的逻辑是“可回滚、可比较”的,这样可以量化,也可以更方便检查 Bug 。

    上述流程中可能会画一些流程图、类图、状态图来辅助我梳理思路。
    但是既然是我自己琢磨和学一些零散知识的(比如“可监控、可回滚、可灰度”、TDD 之类的思路对我挺有帮助的),我相信市面上肯定有很多资深的大佬有这方面的经验分享(比如陈皓...),学习他们的经验意识是进步最快的方式。
    希望有 V 友可以分享一些类似方面的资料或者书籍或者博客。(我怀疑我的用词不准确,搜到的资料不是很有用)
    15 条回复    2023-11-24 11:02:06 +08:00
    MyComputer
        1
    MyComputer  
       2023-11-23 13:56:21 +08:00
    问问 chat gpt 4.0
    tool2d
        2
    tool2d  
       2023-11-23 14:36:05 +08:00
    感觉挺难的,不同软件项目差异巨大。

    因为开发需求不同,别人项目的痛点,对你来说可能并不是。

    对我自己来说,能做好模块分层和解耦已经很不错了,代码量一旦堆到某个程度,想做点什么都会复杂化。
    jones2000
        3
    jones2000  
       2023-11-23 14:40:58 +08:00
    来需求, 先跟提需求的业务人员沟通,了解为什么要加这个需求,用户的痛点在哪里, 然后找竞品,看其他家是怎么做的, 然后在开始动手设计。
    sordidclown
        4
    sordidclown  
       2023-11-23 15:00:40 +08:00
    取之于 V ,用之于 V:《面向对象分析与设计》
    xuanbg
        5
    xuanbg  
       2023-11-23 15:19:51 +08:00
    理不清思路,画思维导图。遇事不决,也能画思维导图。总之,画思维导图就对了。
    sleepm
        6
    sleepm  
       2023-11-23 15:24:09 +08:00
    《大象:Thinking in UML 》 不是特别推荐,因为太多了,而且现在还有函数式编程,面向切片编程,但是感兴趣可以看看
    《你的灯亮着吗? : 发现问题的真正所在》
    没有捷径,看书,看代码,敲出来,实验,理解
    模拟一个需求,拆分,先实现个 MVP 最小可行产品
    完善/加功能,优化,继续搭积木
    再复盘,理解本质,优化的时候也会思考,哪些可以复用,有哪些实现方式,优缺点是什么
    测试,灰度,架构,高可用,链路,那些可以像打怪样的一级一级来
    sleepm
        7
    sleepm  
       2023-11-23 15:24:36 +08:00
    工欲善其事必先利其器
    xloger
        8
    xloger  
    OP
       2023-11-23 16:13:20 +08:00
    @MyComputer 嗯我问了一下,它的回答是:

    《代码大全》:这是一本非常经典的软件开发书籍。从需求分析、设计到编码实现,再到测试和维护,书中都有深入的讨论。书中还强调了代码质量的重要性,给出了很多实用的代码优化技巧。

    《重构:改善既有代码的设计》:这本书主要讲解如何通过重构技术改善已有代码的设计,使其更易于理解和维护。书中提供了很多重构的实例,可以帮助你进一步理解和掌握重构技术。

    《敏捷软件开发:原则、模式与实践》:这本书从原则和模式两个角度介绍了敏捷软件开发方法。书中讲解了很多设计模式和编程原则,可以帮助你更好地设计和实现代码。

    《软技能:代码之外的生存指南》:这本书讲解了很多软件开发之外的知识,包括职业发展、学习方法、人际交往等。这些知识对于提升你的软件开发水平也非常有帮助。

    阮一峰的网络日志:阮一峰是国内知名的程序员,他的博客中有很多关于软件开发的文章,包括编程技巧、设计模式、前沿技术等,都非常值得一读。

    陈皓的博客:陈皓是 CSDN 的创始人,他的博客中有很多关于软件开发的文章,从软件开发的基本原则到设计模式,再到软件开发的最佳实践,都有涉及。你可以从他的博客中学到很多实用的知识。

    这几本书我觉得不太适合我的地方在于:
    前两个,我这其实不是代码层面的技巧了,而是靠一些“工程意识”去辅助写代码。而敏捷开发的问题在于,我改变不了整个项目的开发流程,我只能也只打算管好我自己,那这些需要配合的策略不适合我。
    那本软技能就是一些面试之类的其他技巧,有点偏了。
    xloger
        9
    xloger  
    OP
       2023-11-23 16:37:35 +08:00
    @tool2d 是啊,我也觉得很难,不同项目、岗位的差异都是很大的。所以我的思路是学习后取其对我有用的,比如“可监控、可回滚、可灰度”,这里面我身为 Android 客户端开发,是完全没有回滚灰度需求的(靠版本控制而不是代码控制了)。
    但是我觉得这种意识对我的平常开发帮助还是很大的。如正文所说,我会在开发时有意识让我的代码是“可回滚”,可以方便地切换新旧逻辑供调试(而不是频繁切换 Git ),“可监控”就是让我有意识地让代码的逻辑完整,比如对一些不可能的逻辑不直接 if xxx return ,而是会加个埋点,如果真的发生不该走的逻辑能及时发现。

    模块分层确实是永远的难点,这个我就确实不指望能学到啥就能一劳永逸了,只能靠经验分析,成长。这个我当初看到过一个文章对我的帮助还是挺大的:<https://www.maguangguang.xyz/layered-architecture>



    @jones2000 嗯是的,这些目前是有的,不过侧重点在产品那边。我司现在的产品他们需求分析做的挺好,竞品对比也很完整,不用我太操心这些。我现在困扰的地方在于需求到代码之间的这个桥梁,如何用更好的工具和文档辅助。


    @sordidclown 谢谢,大概扫了一眼,很全面很理论。书应该是好书,我努力看看能不能看下去吧


    @xuanbg 我个人(个人观点)一直不太习惯思维导图,因为我感觉思维导图承载的信息量有点小,我个人更习惯 h1 、h2 、h3 这样的一个一个列下来,然后顺着目录看也挺方便。当然我们的思路是一致的,靠工具来辅助自己梳理思路,工具适合自己习惯就行。
    xloger
        10
    xloger  
    OP
       2023-11-23 17:13:08 +08:00
    @sleepm #6 好的,谢谢,那本 UML 我看了下目录,有部分章节应该对我有帮助,我到时候挑着看看。
    《发现问题的真正所在》这本不错,对日常分析问题估计也有帮助,我仔细看看。
    是的,您说的这些是实在的锻炼方式,我也在这样努力。然后就感觉自己分析的时候如果没有更优质的经验学习,那往哪个方向就不太明了了。就像我刚毕业那几年自己会琢磨怎么写代码比较好,直到某次阅读了 Effective Java 惊为天人,很多我苦苦思索也不知道哪样更好的东西,它清晰完整地解释出来了。
    路肯定是要自己一步一步走的,但有前人的经验肯定能走得更好。
    当然,对我来说如果有这么一个理想的能让我受益匪浅的资料是惊喜,没有那我也还是慢慢锻炼总结吧。
    niceyuri
        11
    niceyuri  
       2023-11-23 17:55:44 +08:00   ❤️ 1
    强烈安利《 the Object Primer 》,作者 Scott W.Ambler 就是 UML 的发明者。这本书应该能解决你所有疑问。、
    py2ex
        12
    py2ex  
       2023-11-23 21:21:44 +08:00
    "大学学的软件工程早忘了,而且实用度也不高"
    翻来翻去你会发现大学大部分讲过的,直接找国外大学软件工程的公开课来看吧
    johnhuangemc2
        13
    johnhuangemc2  
       2023-11-23 21:38:42 +08:00
    LBLK
        14
    LBLK  
       2023-11-24 01:20:35 +08:00
    架构整洁之道 ddd
    xloger
        15
    xloger  
    OP
       2023-11-24 11:02:06 +08:00
    @niceyuri 好的,我昨晚搜了一下这本书,看着确实很适合。不过完全没啥电子版不能先预览一下,不过我看当当京东有卖,到时候买来看看,但又要考虑凑单好烦...


    @py2ex 虽然软件工程的内容我忘得差不多了,但是当初我上课的回忆还在脑海:
    教我们各种图怎么画,继承用这种箭头,组合用这种箭头,实现用这种箭头。然后论文这里写啥那里写啥,每个类你要写个表格把属性返回值全列上。
    甚至整个流程都是在我写完了代码后对着代码画出来的。我觉得是完全起不到辅助我改善代码质量的作用。
    当然,我知道这更可能是我这个辣鸡学校的问题,国外的公开课应该会好一些。但是我个人担心这类又太基础(面向的都是学生),不能针对我的痛点“程序员自身希望能靠学习些工程知识辅助我更好地编写高质量代码”。
    相比之下我觉得楼上推荐的那些书籍的部分章节应该会对我有帮助,因为面向的本身就是程序员。
    当然也谢谢你的建议,等我先看看那几本书,之后再找点公开课查漏补缺。


    @johnhuangemc2 谢谢,目前简单看了一下,似乎对模块拆分之类的很有帮助,我之后仔细了解一下。


    @LBLK 谢谢,这确实是一本知名的但是我还没看的书。刚刚瞄了几眼面向对象和函数式相关的阐述,确实很透彻,加深了我对一些做法的理解。比如可变性的隔离和事件溯源。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 11:06 · PVG 19:06 · LAX 03:06 · JFK 06:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.