V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaotianhu
V2EX  ›  程序员

如何写出更好的代码,一些哲学与原则问题,应该看什么书?

  •  
  •   xiaotianhu · 2019-11-25 11:30:13 +08:00 · 4330 次点击
    这是一个创建于 1817 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rt,一些编码的原则,哲学思想层面的

    比如单一职责啊,一些最佳实践,防御性编程之类的

    有什么好的书介绍吗?

    41 条回复    2019-11-27 01:31:11 +08:00
    czjxy881
        1
    czjxy881  
       2019-11-25 11:33:35 +08:00
    如果想看编码细节可以看看 设计模式之禅,如果想看整体架构,微服务之类的可以看看 Release it
    enaxm
        2
    enaxm  
       2019-11-25 11:38:27 +08:00
    《 a philosophy of software design 》
    冯诺依曼传
    dafaflow model paper
    软件工程教科书的 reference
    enaxm
        3
    enaxm  
       2019-11-25 11:42:58 +08:00   ❤️ 2
    更直白的来说,你自己去构建 学科的知识体系结构

    比如数据结构 上层用到集合论代数形式化方法 在上层是逻辑学演绎法和归纳法
    结构化方法可以看做是一种 事件驱动的认知域模型

    建构你的知识体系结构,或者时髦一点—知识图谱

    最简单路线:wiki 知识树
    xuanbg
        4
    xuanbg  
       2019-11-25 11:43:31 +08:00
    哲学是思考的学问,思考的基础是逻辑。
    Mistwave
        5
    Mistwave  
       2019-11-25 11:43:49 +08:00 via iPhone   ❤️ 1
    code complete
    the pragmatic programmer
    the practice of programming
    xiaotianhu
        6
    xiaotianhu  
    OP
       2019-11-25 11:59:44 +08:00
    @czjxy881
    不是这种.可能更接近于"unix 设计哲学"之类的.关注点就在"写代码"这件事本身.

    不是什么架构啊领域啊模式啊什么的.
    xiaotianhu
        7
    xiaotianhu  
    OP
       2019-11-25 12:01:19 +08:00
    @enaxm

    很多科班出身的人,知识体系完整 数据结构 /算法 说起来头头是道

    写出来的东西就是狗屁不通

    想解决的是这种问题.
    icylogic
        8
    icylogic  
       2019-11-25 12:26:35 +08:00   ❤️ 1
    Clean Architecture 不就讲了单一职责,开闭这些吗,这不是架构是啥?更原始一点的可以看 SICP
    eclipselu
        9
    eclipselu  
       2019-11-25 12:27:52 +08:00   ❤️ 1
    Clean Code / Clean Architecture
    luoway
        10
    luoway  
       2019-11-25 12:55:02 +08:00   ❤️ 3
    https://github.com/nusr/hacker-laws-zh
    对开发人员有用的定律、理论、原则和模式
    wangkun025
        11
    wangkun025  
       2019-11-25 12:56:15 +08:00   ❤️ 1
    有用即真理。
    其他的都是扯淡。
    路是走出来的,不是规划出来的。
    enaxm
        12
    enaxm  
       2019-11-25 13:08:14 +08:00
    @xiaotianhu #7。。。扯淡,那是科班出身的垃圾
    科班比较好的都是做 OJ 的,他们非常擅长刷题解决问题能力非常强。然后理论不行。

    不要对科班有什么误解,就资源丰富度和专业素养上,科班基本吊打野生程序员。

    或者你说的另一种狗屁不通要去怪你们的 PPT 架构师或者 Shit Mounty
    你的提问和内容已经完全不是一个话题了。
    enaxm
        13
    enaxm  
       2019-11-25 13:09:51 +08:00
    fix: mountain
    dreamerlv3ex
        14
    dreamerlv3ex  
       2019-11-25 13:13:13 +08:00   ❤️ 1
    云程序员码农在此,别跟我说××,一把梭.jpg
    littlewing
        15
    littlewing  
       2019-11-25 13:16:10 +08:00
    还不如多写写
    andrewjames
        16
    andrewjames  
       2019-11-25 13:32:29 +08:00   ❤️ 1
    《大教堂与集市》
    xiaotianhu
        17
    xiaotianhu  
    OP
       2019-11-25 13:34:27 +08:00   ❤️ 1
    @dreamerlv3ex 真心喜欢 coding,是需要避免这种功利主义的思想的.

    要不然会越写越怀疑人生.
    xiaotianhu
        18
    xiaotianhu  
    OP
       2019-11-25 13:36:17 +08:00
    @luoway 感谢,学习一下.
    sheny
        19
    sheny  
       2019-11-25 13:44:10 +08:00
    面试:说一下你对 xxx 的理解。我:“哈?那是 what ?”。一看代码,“哦,这个啊,我知道。”
    --一枚可能与众不同的科班程序员
    imn1
        20
    imn1  
       2019-11-25 13:49:40 +08:00
    虽然我也看哲学,但把哲学和编程放在一起,我还是觉得高深了
    我个人觉得不必这样吧,基础应该还是业务逻辑和业务流程,跳过这个研究行为和哲学的话,我只想到一个:熟习抽象类
    FrankHB
        21
    FrankHB  
       2019-11-25 13:52:58 +08:00
    @xiaotianhu 如果你真只是纠结写代码,那么到最后就是自己撸语言——设计怎么写代码的根本方案,没有别的出路。2L 所谓的形式化方法到最后也就是撸一坨知道得人稍微多一点的 DSL 的套路而已,哲学上跟着 Hilbert 之流早就破产了。
    UNIX 设计哲学跟写代码的问题差远了,而且跟怎么写代码相比完全是下游的位置,而不是指导或决定怎么把代码写好的。强行搅在一起就不可避免会扯到一大坨烂摊子。某种意义 UNIX 为代表的玩意儿整体上为什么不得不设计成这样,也是因为没法一次搞干净“(让用户)怎么写代码”的问题:
    https://github.com/FrankHB/pl-docs/blob/master/zh-CN/about-operating-systems.md
    FrankHB
        22
    FrankHB  
       2019-11-25 14:07:46 +08:00   ❤️ 2
    @enaxm 虽然 LZ 的看法不怎么上道,但你也不要盲目拔高科班的水平。
    为了妥协学生对知识接受能力不足的现状,科班的基础课普遍偏向通识教育,说白了就是水货——甚至有的基本课程一大坨(比如说,C 语言)就是错的或者聊胜于无(比如说,组成原理)。不但科班的象牙塔指望的靠谱的科研水准根本就没法靠科班堆砌出来,搞工程也不能指望。
    更进一步地,系统性地理解上的不靠谱,这不仅是隔行隔山的问题。即便是相关专业方向的教育,不少也是挺水的。例如,像专门上过 PL 课的学生,在 referential transparency 这种基础概念的理解来讲相比真正搞相关方向科研的专业人士也是弟中弟,因为教科书上根本就不会全面概括,导致除了最相关的方向以外这些人以外的理解普遍上都稀里糊涂的:
    http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf
    注意我特别举这个例子,是因为这个概念早就不只是科研上过气没显著性,而工程界像什么 dssq 一样各种瞎扯;然而能凭自己的本事知道这里有 misconception/inconsistency,并找到靠谱来源的,又有几个?恐怕 99%的科班出身的童鞋都达不到“有能力注意到问题在哪”的资质,更别说解决问题避免不靠谱的结论扩散了。
    zhuangzhuang1988
        23
    zhuangzhuang1988  
       2019-11-25 14:14:01 +08:00   ❤️ 1
    好好学算法,学玄学干嘛.
    GentleSadness
        24
    GentleSadness  
       2019-11-25 14:20:44 +08:00
    @FrankHB 地球地球,我听说你福报了,是真的吗
    Rwing
        25
    Rwing  
       2019-11-25 14:21:30 +08:00
    Clean Code / Clean Architecture
    zhazi
        26
    zhazi  
       2019-11-25 14:24:38 +08:00 via Android
    推荐一本正在看的代码大全
    FrankHB
        27
    FrankHB  
       2019-11-25 14:38:49 +08:00
    @GentleSadness 在家福报咋地,,,
    dioxide
        28
    dioxide  
       2019-11-25 14:46:34 +08:00
    最近在看《代码中的世界观》
    fengfuliu
        29
    fengfuliu  
       2019-11-25 15:08:35 +08:00
    设计模式吧
    cedoo22
        30
    cedoo22  
       2019-11-25 15:18:01 +08:00
    工程学 多学习 最佳实践,能读懂别人的理论研究成果,然后实现理论。学什么玄学~~。个人推荐《大教堂与集市》
    vwym
        31
    vwym  
       2019-11-25 15:20:34 +08:00
    写代码和写代码有天壤之别,前后端之分,后端又可以细分成写内部框架包(切面日志等拓展)、业务等。你不可能一套逻辑能够解决所有问题的。
    连规范都没有的前提下,写不好是正常的,写得好是准备跳槽的。
    xiaotianhu
        32
    xiaotianhu  
    OP
       2019-11-25 15:24:17 +08:00
    @FrankHB 明白了,感谢.科班的问题,我也接触过清华计算机本科的一些人,感觉也无法写出工程上靠谱的东西.就是看到了表面现象,不太懂实质.
    zunceng
        33
    zunceng  
       2019-11-25 16:00:29 +08:00
    code complete 2
    heart4lor
        34
    heart4lor  
       2019-11-25 17:08:58 +08:00
    正在看《 UNIX 编程艺术》,墙裂推荐!
    enaxm
        35
    enaxm  
       2019-11-25 17:33:37 +08:00
    @FrankHB #22 你这又聊到科班跟非科班上去了

    本来楼主想问的问题就没什么好讨论的,就是在说不会数据结构跟算法怎么写出好代码,这都月经了。答案当然是——写不出来啊!所以我说科班吊打,数据结构跟算法这是基础不能再基础的东西了,哪怕就只是当成工具来用会用比不会用的人当然要强,这有什么好讨论的么?

    v2 的月经贴,还有学历重不重要、数据结构重不重要、211985 为什么这么水、大厂面试那么水为什么我进不了这种,真的够了。

    首先你说的科班教学限定范围也要是本科,本科阶段无论是国内国外都是通识教育,无外乎是教材是基于演绎法还是归纳法,象牙塔这种词有意思么?

    你说形式化方法只是一种 DSL,我都说了形式化方法只是事件域模型的一种具体实现,本质就是 why what how do,
    你在知识图谱里还可以把它实现为事理图谱,在 Consulting 行业还叫它金字塔原理,你要说过时了那我也不知道怎么吐槽。

    知识这玩意是拿来用的,不是炫学或者充点门面,你不用它当然没有用了。
    跨学科不是不可能,远一点查理芒格,近一点斯科特扬,实例就在那摆着呢。你好好思考你学习的目的到底是什么,为了接触最前沿的理论不被当弟弟?认知的目的是什么?难道不是为了改造世界?谁给你说一定要拿来搞科研?

    说清华的没法写出工程上靠谱的东西,那当然很大可能是名校压根就不愿意碰 dirty work,因为一直有更好的选择。因为这种事沾沾自喜那真的是不知道怎么吐槽。
    GentleSadness
        36
    GentleSadness  
       2019-11-25 17:37:40 +08:00
    @FrankHB 我意思是听说你病了,多喝热水
    zhouwei520
        37
    zhouwei520  
       2019-11-25 17:53:35 +08:00
    缠论,康波周期,易学
    FrankHB
        38
    FrankHB  
       2019-11-26 02:48:25 +08:00
    @enaxm 所以说是你先跑的题……
    问题虽然是经,然而必要性上……恰恰相反,也许大多数人都需要反省——比如说,为什么会觉得算法和数据结构对写好代码重要?
    倒不是说数据结构跟算法不重要,但是大部分现实情况下更重要的显然有很多,比如对要首先解决的问题本身的清晰理解,比如你所谓的“学科的知识体系结构”;反过来,上来就讲算法和数据结构如何关键的,基本就是外行。
    实际上,对数据结构跟算法一窍不通的情况下,许多人已经有很多机会足够写出能合理解决问题的“好”的代码了。需要做的无非就是自己发明一遍当前需要的具体数据结构跟算法罢了。这比发明整个知识体系可是容易得多;能写“好”代码的,大概人人都有自己造出过没学过的算法和数据结构轮子的经历。(反倒是见得多了就没那么容易造新的了。)
    另一方面,只会解决点书本题目而实际工作中用不大会的(不管科班不科班)到处都是一大把,还真没法指望“哪怕就只是当成工具来用会用比不会用的人当然要强”。
    按你思路理解的科班在系统的学科知识积累上应该有明显优势,基于一般人对高等教育的认识来讲,看似是顺理成章地没问题;可惜现实就是这行的科班的专业整体教学质量从根本上就特别不咋地,观感落差巨大。我之前主要就是提醒这点事实罢了。
    我说的科班还真不止是本科教育。像我拿来当例子的 PL 课一般本科阶段根本就不会开。(要算上跨专业什么的,本科教学质量其实还算是比较好的了。)
    当然,本科教育是批判的重点:因为“写好代码”现实根本不会被作为专业和研究方向,之后的课程撑死能教的是“写怎么样的代码”,却不会再继续教“怎么写好代码”,没在本科阶段教好或者至少能让学生找到方向养成习惯,那基本就完犊子了。所以这里再怎么水也不应该流于通识教育。
    而我说的质量差,主要也不是出自教学方法的问题(否则也不只是个别专业的问题),而是从材料质量开始的低劣——基础都别指望能教清楚。
    你讲的另一方面则是显得叶公好龙,实在没法让人参考。
    ——形式化方法?和写好代码的关系是什么?你真的了解你在讲什么吗?你有应用过这样的方法解决过你遇到的“写好代码”相关的问题过吗?
    我得说你明显发散过头了。形式化方法在“写好代码”相关的领域中专指建立特定的模型实现几个很具体的目的(现在能以代码体现的,基本只有规格化和验证)手段,知识工程的模型都很难算得上多少形式化,啥时候还和 consulting 行业能攀亲带故了?
    LZ 另一个关心的话题是“哲学问题”。超过这个范畴,形式化方法和正经的哲学相关的部分还真有点关系,但这里都没提到,也都是陈年旧帐了,还没提什么前沿理论的必要。
    FrankHB
        39
    FrankHB  
       2019-11-26 03:19:55 +08:00
    好吧,其实是 LZ 在 7L 先跑题……
    那就多说两句好了。
    我说科班里在象牙塔的,指的是专门以学术研究讨生活的从业者。这些人大部分是和“写好代码”无缘的,因为衡量他们工作的绩效主要是看水了多少能发挥影响的 paper,普遍缺少适合他们解决的、需要把代码写好来体现完成度的问题。(因为工业界胡搅蛮缠的需求,研究怎么替人的烂代码擦屁股的倒是有不少,比如 pointer analysis……)这些人中很多比大部分其他人都有资质写好代码,但真能写好代码的又很少有兴趣呆的住。
    OJ 玩家是另一个群落。OJ 选手最重要的素质是现场应变,知识积累和代码干净程度相对次要。好的 OJ 选手应该能避免“特么我一个小时前写的代码真傻×”“特么我一个小时前没想出这种解法拖了那么久真傻×”的情况,这和一般意义上写“好”代码解决更长效问题的人(实际上短时间得写好代码的运维或者安全操作人员你一般不会叫他们“写代码的”)不一样,后者不见得会在乎这类临场问题,但“特么那个谁(可能是自己)一年以前写的代码真傻×”的问题对这些“写代码的”可能就是灾难性的。这两方面的素质需要很不同的能力,同时具备两者能转型成功的很少,所以整体上没法比较。但一般来说,好汉不提当年勇,社招不是储备人员就不大待见只会刷题的本事了——出来混几年都没别的更能拿的出手的经验,你当你来应聘 OI 教练?这部分科班出身的落差就比较明显。
    剩下的大多人……其实不太有机会能让你分辨出到底是不是科班出来的。因为基础教学上科班质量普遍不咋地,所以跟培训班出来的相比,未必能有直接的胜算。(当然,敢在简历造假的,正常来讲一段时间都会被刷掉。)
    cjh1095358798
        40
    cjh1095358798  
       2019-11-26 19:03:39 +08:00 via Android
    @enaxm 赞同老哥看法
    enaxm
        41
    enaxm  
       2019-11-27 01:31:11 +08:00
    @FrankHB #39

    emm 简单回一下吧,

    语言这种东西非常不准确,需要依赖语境。我感觉我们就不在一个语境上,虽然用的词都是一样的,但不是指的相同的事物。

    我明确一下我说的一些概念的定义:
    哲学——指的是“方法论”,不包括“本体论” “认知论”etc.
    科班——985 本科 CS 专业

    你说的主要两点:1phD.2 工程

    先说跨学科吧,
    我的定义就是 建立知识(实体)之间的关联,说白了就是图结构。而你好像是用树结构来表示知识间的联系。

    然后我建立联系的具体方式就是对知识进行抽象,然后根据抽象去其他领域找多态。
    至于形式化方法,天哪,这只是一个例子。我不具体解释了,具体看一下上一行,你一直跟我扣这个干嘛?
    我不想讲的再直白了。。。

    另一个问题就是 检验标准。你的检验标准是 phD.,你这个要求不觉得太苛刻了么?
    拿芒格来举个例子,他没有正式接触过建筑的教育,但是他在 LA 的住宅是他亲自设计的,这个不能算他掌握了住宅设计知识了么?
    想要证明我掌握了一个知识,有必要我在伸纵领域都熟知么?我只要会运用就好了。

    然后说工程,

    我说一下 以应用开发为目的 系统搭建的 CS 学习 层次

    //0 目的
    1 本质
    2 工具
    3 具体实践

    你指的基础又是什么?我指它是一个非常重要的东西,系统必不可少的东西。这里的重要是指占比非常高的意思。这样够 precision 了么?
    而你指的基础是,按照顺序最先讲述的东西,root,而你在纠结是不是应该是 DS。因为按你的树状结构体系其他的知识要依据 root 展开。

    谁规定的?

    DS 跟 Algorithm 本质是一种工具,高校的路线其实是从 2 使用工具 开始。
    从使用工具开始有问题么?它的占比不高么?不重要么?
    那么下一步,既然是通识教育,由 2—>1 有什么问题么?谁规定最后就一定要搞工程??

    你的意思无外乎就是高校不注重 2—>3 工程完全不讲呗,而我说的科班辗轧有两点,我回复里有明确的提到过
    a 是资源丰富 b 是基础能力

    b 我说了,a 资源

    事实就是科班都会去实习,而且长的还会一年以上。
    你要说高校不教工程,生产环境不会学么??

    除此之外科班还有导师、同学这种资源。
    无论是求职、职业生涯培训班完全比。

    你本来所有话题都会引导到 phD.上,结果你这个又冒出来一个培训班,拜托你在说什么?

    你倒是告诉我培训班几个月的成果怎么跟科班比???真正有实习经验的反而比不过培训班玩虚拟机的,哦我信了。


    真的太无聊了,你关心大学教育是不是有问题么?你的目标是什么?教育改革么? literally ??
    我当然不关心,我回复就是在说 不掌握基础原理,完全靠方法来搭系统就是在搞笑啊。哪里难理解了?
    把注意力放在有价值的事情上不行么???
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2474 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:06 · PVG 00:06 · LAX 08:06 · JFK 11:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.