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

2019-11-25 11:30:13 +08:00
 xiaotianhu

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

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

有什么好的书介绍吗?

4350 次点击
所在节点    程序员
41 条回复
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
2019-11-25 14:07:46 +08:00
@enaxm 虽然 LZ 的看法不怎么上道,但你也不要盲目拔高科班的水平。
为了妥协学生对知识接受能力不足的现状,科班的基础课普遍偏向通识教育,说白了就是水货——甚至有的基本课程一大坨(比如说,C 语言)就是错的或者聊胜于无(比如说,组成原理)。不但科班的象牙塔指望的靠谱的科研水准根本就没法靠科班堆砌出来,搞工程也不能指望。
更进一步地,系统性地理解上的不靠谱,这不仅是隔行隔山的问题。即便是相关专业方向的教育,不少也是挺水的。例如,像专门上过 PL 课的学生,在 referential transparency 这种基础概念的理解来讲相比真正搞相关方向科研的专业人士也是弟中弟,因为教科书上根本就不会全面概括,导致除了最相关的方向以外这些人以外的理解普遍上都稀里糊涂的:
http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf
注意我特别举这个例子,是因为这个概念早就不只是科研上过气没显著性,而工程界像什么 dssq 一样各种瞎扯;然而能凭自己的本事知道这里有 misconception/inconsistency,并找到靠谱来源的,又有几个?恐怕 99%的科班出身的童鞋都达不到“有能力注意到问题在哪”的资质,更别说解决问题避免不靠谱的结论扩散了。
zhuangzhuang1988
2019-11-25 14:14:01 +08:00
好好学算法,学玄学干嘛.
GentleSadness
2019-11-25 14:20:44 +08:00
@FrankHB 地球地球,我听说你福报了,是真的吗
Rwing
2019-11-25 14:21:30 +08:00
Clean Code / Clean Architecture
zhazi
2019-11-25 14:24:38 +08:00
推荐一本正在看的代码大全
FrankHB
2019-11-25 14:38:49 +08:00
@GentleSadness 在家福报咋地,,,
dioxide
2019-11-25 14:46:34 +08:00
最近在看《代码中的世界观》
fengfuliu
2019-11-25 15:08:35 +08:00
设计模式吧
cedoo22
2019-11-25 15:18:01 +08:00
工程学 多学习 最佳实践,能读懂别人的理论研究成果,然后实现理论。学什么玄学~~。个人推荐《大教堂与集市》
vwym
2019-11-25 15:20:34 +08:00
写代码和写代码有天壤之别,前后端之分,后端又可以细分成写内部框架包(切面日志等拓展)、业务等。你不可能一套逻辑能够解决所有问题的。
连规范都没有的前提下,写不好是正常的,写得好是准备跳槽的。
xiaotianhu
2019-11-25 15:24:17 +08:00
@FrankHB 明白了,感谢.科班的问题,我也接触过清华计算机本科的一些人,感觉也无法写出工程上靠谱的东西.就是看到了表面现象,不太懂实质.
zunceng
2019-11-25 16:00:29 +08:00
code complete 2
heart4lor
2019-11-25 17:08:58 +08:00
正在看《 UNIX 编程艺术》,墙裂推荐!
enaxm
2019-11-25 17:33:37 +08:00
@FrankHB #22 你这又聊到科班跟非科班上去了

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/622838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX