News Hacker|极客洞察

130 183 天前 jmeiners.com
🤔先数学思考再编码?实战工程与数学抽象之争
先想数学再写代码,是要做研究还是交付产品?

🎯 讨论背景

原文标题“Think in Math. Write in Code”提出在写代码前先用数学抽象思考的建议,引发评论围绕数学优先(抽象、证明、结构)与实现优先(写出可运行算法、处理边界和工程细节)之间的争论。讨论触及 Test-Driven Development(TDD)实践差异、编程语言是否是“思维工具”而非仅实现工具、以及现实工程中的痛点(如在 C 中实现数值积分的低层工作)和验证手段(如回测交易策略)。评论中引用了具体例子包括用 TDD 解数独的失败案例、Minix(教学用简约 Unix)与 Linux 的工程权衡,以及 OSI 与 TCP/IP(理论模型与工程实践差异)等,辩论基于对抽象、可读性、可交付性与团队协作目标的不同假设。

📌 讨论焦点

实践导向:先实现再抽象(Bottom-up)

许多评论者主张先从可运行的计算方案入手:先写出算法、让它能工作,然后通过实现过程理解机制并在需要时抽象与优化。他们强调自下而上的方法能够强制思考边界条件、终止条件和实际细节,避免把闭式解当成没有代价的万能答案。实务例子包括用数值方法或“暴力”算法快速解决问题,再用性能分析(profiler)或剖析重构出更优的解法;支持者认为优雅留到重构阶段更切合工程交付。反对者将这种做法贬为“粗暴”或“不优雅”,但支持者认为这是解决真实问题的更可靠路径。

[来源1] [来源2] [来源3] [来源4] [来源5]

数学先行:抽象与结构导向(Top-down)

另一批评论者认为数学思维擅长刻画关系与对称性,能在设计阶段提供清晰约束和可复用的抽象,从而减少后续返工。他们指出数学常常不是凭空显现的优雅,而是经过清理和精炼后的产物,数学训练能在设计时潜移默化地帮助识别核心结构与证明正确性。评论中引用了 Poincaré 的观点、数学创作书籍与可视化教学(如 3Blue1Brown)作为支持,并强调用定义和公理化思考能避免把不合适的抽象强加到问题上。支持数学先行的人并不排斥实现,而是认为在很多情形下先建立结构性理解更高效。

[来源1] [来源2] [来源3] [来源4] [来源5]

TDD 与先写测试的实践争议

关于 Test-Driven Development(TDD)或先写测试的做法,评论出现明显分歧:有人认为严格的 TDD 会阻碍系统性思考,举例说在用 TDD 解数独时导致策略失败;另一些人反驳写测试是为了在实现前定义期望行为,从而避免在细节中迷失大局。也有人把 Test/Implement 看作探索性问题的权宜之计——当你不理解问题时先磨个可运行的解法,随着理解加深再整理和简化。整体讨论凸显出测试优先对规范明确的问题更有用,而对高度探索性或需要先发现结构的问题效果有限。

[来源1] [来源2] [来源3] [来源4]

编程语言作为“思维工具”的正反争论

有评论强烈反对将编程语言仅视为机器实现工具,认为优秀语言和 DSL(领域特定语言)能成为思维扩展,便于在更高抽象层次上表达问题并快速检验想法;举例包括用 Ruby 风格语言进行快速原型和在语言层面引导设计。反方指出数学记号追求最小描述长度,这与工程实践强调的可读性、可扩展性与团队沟通目标常冲突,实际工程更看重可维护性而非极致简洁。评论还提到把数学公式直接翻译为代码的痛点(如在 C 中实现数值积分),以及过度数学化可能造成的 analysis paralysis(过度分析瘫痪)。因此讨论把语言的“思维性”与交付与维护的现实需求进行了权衡。

[来源1] [来源2] [来源3] [来源4]

元讨论:软件圈写随笔与社群心态

另一条讨论偏向元话题,质疑为什么软件工程师频繁发表意见文,有人讽刺这是行业自我膨胀的表现,但也有人指出各行各业都有个人与行业刊物表达观点。评论延伸到谁可称为“数学家/计算机科学家”的界定,以及计算机科学与数学的历史联系,提醒忽视已有的理论会导致重复发明。此处争论反映了社区对权威、发表渠道与职业身份认同的分歧,同时也表明争论并非纯技术,而包含文化和职业心态层面。

[来源1] [来源2] [来源3] [来源4]

📚 术语解释

TDD (Test-Driven Development): 先写测试再写实现的开发流程,目的在于在实现前明确期望行为;优点是作为规范帮助避免实现时丢失大局,缺点是在探索性或难以事先制定规范的问题上可能受限或导致反复。

OOP (Object-Oriented Programming): 面向对象编程范式,强调对象、状态与方法的封装与交互;评论中被引用为在某些问题(例如把不适合的问题强行用 OOP 建模)会产生设计不匹配的反面教材。

top-down / bottom-up(自上而下 / 自下而上): 两种问题解决与设计算法策略:top-down 从抽象和结构出发推导解法,bottom-up 从具体实现和实验出发构建并逐步抽象;评论认为不同问题适合不同策略。

closed-form solution(闭式解/解析解): 用数学表达式直接给出问题解的形式;评论指明如果只是记忆解析解而不理解其机制,可能不如可迭代或数值算法在实际工程中更可解释和可靠。