完全编程哲学 | 原创,AI翻译
目录
- 编程
- 作为创造性活动的编程
- 个人项目开发
- 技术趋势与兴趣驱动学习
- 调试与问题解决哲学
- 以用户为中心的开发
- 代码质量与简洁性
- AI集成与自动化
- 成为无界工程师
- 在企业限制下工作
- 最大化内部资源利用
- AI时代的工具构建
- 思维模式转变
- 突破认知局限
- 积累日志的价值
- 企业环境中的日志管理
- 历史背景与问题解决
- 日志文件组织策略
- 长期项目维护
- 知识留存与共享
- 自动化日志收集方法
编程
-
只要对你有激励作用,参加编程竞赛并无不可。
-
编程如同写作,是一种创造性活动。
-
做自己的项目,写技术博客。编写那些你将维护多年的代码项目,就像经营一个持续十年的博客。
-
通常不必追逐当下技术热点,许多潮流几年后就会消失。
-
追随你的好奇心,为自己编程。
-
尝试为自己创造程序,它们不是工作任务。
-
如果编程时常感到不快,说明你的方法出了问题。
-
iOS、Android、后端、前端、AI都很好。至少可以尝试用它们做个小项目或学习几个月。
-
调试的本质是保持怀疑。不要信任每一行代码,总会有更好的实现方式。
-
编程中每个字符、每行日志都重要,它们传递着信息。
-
通过编程为他人创造产品,拥有用户是件有趣的事。
-
无需苛求完美。几百个真正热爱你产品的用户,胜过数万仅表示善意的用户。
-
牢记你开始编程的初衷,永远不要忘记。
-
将编程思维应用到生活各处。批量处理或逐个处理任务,如何拆分工作单元,每个应用背后的技术原理,网络请求的微妙细节——本质是相通的。
-
抽象与逻辑思维、细节导向思维、解决方案的穷举思维。
-
真理即真理。通常计算机不会出错,电路不会出错,编译器不会出错。遇到bug时不必沮丧。
-
追求优雅简洁的解决方案。”至繁归于至简”,需要深度思考保留精髓、剔除冗余。
-
编程语言选择能完成任务即可,个人推荐Java和Python。
-
推荐关注王垠的博客https://www.yinwang.org,他是编程界少有的天才,尽管他总说天才并不存在。
-
编程的思维原理可轻松应用于语言学习、硬件维修、生活优化和科学研究。
-
除高中数学外,多数编程任务不需复杂数学。
-
时隔多年回顾旧代码或长期维护项目,会带来深刻启示。
-
若暂时失去编程热情,不妨先做其他事情。
-
测试时机很重要。自然地进行即可,通常不必为项目写测试。比较明智地选择不写测试、单元测试、集成测试或API测试。
-
尝试AI代码编辑器,多使用ChatGPT等聊天机器人。如今AI工具易用,可专注更具创造性或重要的部分。
-
调试时检查是否使用库的最新版本。若库已无人维护,寻找活跃维护的克隆或分叉版本。
-
优化网络速度或程序运行时间时,必须有量化指标,否则无法确知是微小改进还是退步。
-
个人项目不写测试代码也可,但大量代码修改后最好本地测试。根据影响范围、云端流水线运行时长、潜在错误频率等因素,选择性编写测试代码。采用不影响用户体验的便捷测试方法。
-
编写简洁优雅的代码。减少重复(尽管有时重复反而更简洁),减少特例,便于测试。通过重构使用通用函数、循环/递归,寻找模式。
-
正确处理错误。思考根本原因、责任归属、是否可改变(外部错误考虑应急方案)。评估影响范围、处理位置、错误分类可能性、发生概率及最坏情况。
-
replace
与startWith
加slice
的区别在于前者忽略字符串位置。将这种思维应用到编程每个细节。 -
最小化单一项的可能取值,每种情况只用单一值。已有
false
时不使用null
。若使用翻译后的布尔标志,需确保不会将未翻译标志视为false
。 -
常用GitHub或Sourcetree审查代码变更,它们更便于阅读代码。
-
编程中无小事。每个字符、列表顺序、字符串、数字、变量名都重要,每段执行顺序和日志都有意义。
-
做最让你兴奋的事,不必担心偏离主流。
-
多使用命令,它们有助于自动化或辅助LLM。UI界面操作更难自动化。
-
将程序的本地、UAT、微服务、流水线日志保存至目录。这些日志蕴藏大量关联信息,通过搜索可以识别关联,收集相关数据或上下文。
-
有了积累的日志,遇到问题时更容易判断是否曾遇到过。从过往日志中可能找到解决方案。日志比代码更能展现程序运行状态和计算机执行过程,且调试时更轻量。
-
调试信息非常丰富,包括周边变量值、线程名、函数调用栈等。
-
自动化所有事务,例如代理更新和最佳代理服务器选择。多用Python编写脚本。
-
保持简单:函数短小、文件精简。便于测试、验证和样例检查。
-
这是AI时代,用AI工具进行彻底测试,追求完美。尽早抛出异常。为代码添加测试并每日在流水线运行。犯错无妨,但不要重复犯错,通过代码检查预防。
成为无界工程师
-
大公司执行严格数据安全政策,员工/承包商入职首周领取笔记本,离职时归还。
-
项目涉及大量细节,但员工常在工作中遗忘信息,尤其离职一年后。
-
记忆中的项目轮廓、团队互动和LinkedIn联系尚存,但因严格信息管控无书面记录保留。
-
在此类公司的首次合同工经历可能令人沮丧,使软件开发更具挑战性。
-
最近我找到通过最大化利用内部资源,在非真正无限制的环境中营造无界感的方法。
-
Windows上有数千软件可选,特别是编译器,能用于创建脚本和小工具。
-
尽可能多学习库和编程语言,充分挖掘内部可用资源。
-
对Go、Rust、C/C++构建工具、JavaScript(npm)、C#等的支持,增加了知识储备的灵活性。
-
在AI时代,可用Python脚本构建Postman等定制工具,或编写数据库脚本来补充工具功能缺陷。
-
用AI自动化任务,例如Selenium测试脚本或性能测试脚本。
-
大公司的局限感最初源于思维定式,其实政策并不妨碍有效构建和工作。
-
生活中许多所谓限制实因思考不深,多尝试会产生独特想法。
-
在大公司成为无界工程师,意味着成为无界的自己。
积累日志的价值
早年我在银行担任合同工时,使用多云应用平台支撑微服务,那时起开始积累工作日志。
多年过去,我仍认为这是助力工作和软件开发的最佳方式之一。随着时间推移,日志目录已有数百个日志文件。
我没有专门的子目录或规范命名。有时直接用JIRA任务名或功能名作前缀加数字后缀,如mutual-fund-1.log
,表示互助基金微服务运行时产生的日志。
多地区项目会添加国家后缀,如mutual-fund-cn-1.log
。日志文件名较随意,因当时需聚焦错误堆栈和函数调用链。
程序日志的重要性人尽皆知,但我想强调积累日志而非仅在控制台查看就让其消失的价值。项目进行中积累日志能带来诸多便利:追溯历史日志、判断存储过程调用是否重复发生、确认错误是否再现、回忆以往解决方案等。
大型项目或数十个微服务中存在海量细节,错误异常反复出现。日志如同程序的运行文档,由程序自动生成无需人工录入,对开发者可读。开始新任务或修复新bug时,手握数百条历史日志就不会孤立无援。
为何积累日志?因为知识与细节易被遗忘。
纸张发明推动人类文明进步,计算机诞生又将文明推向新高度。在计算机中积累日志,如同在纸上记录笔记。
不仅对人类,对AI聊天机器人、LLM工具而言,这些日志也日益重要。2022年成立的GreptimeDB——专注于可观测性数据(指标、日志、追踪)统一收集分析的数据库应运而生并非偶然。
为何之前没这样做?在为大银行工作前,我主要在初创公司或自己创业时单打独斗。后来进入更正规的企业环境,项目开发与个人/创业项目截然不同:存在SIT、UAT测试环境,生产环境通常只对小团队开放。获取日志和修复问题变得漫长繁琐,Jenkins流水线常需半小时运行。
无法像苍蝇般快速测试部署,只能通过积累日志获取更多上下文。最好一次性解决问题,用最少次数验证修复。由于难以及时获取云端/公司服务器日志,将其复制到本地笔记本分析更高效。
如今个人项目我也会积累日志,这已成习惯。在大公司工作数年后,我更有耐心和策略将项目做大做久,因此明白随时间推移需要这些日志。
或许有人认为只要有优雅代码和可运行项目即可,无需积累日志或错误堆栈。初见合理,但长期看,若未来重启项目、分享或移交他人,缺乏日志记录可能不利。
企业为何不鼓励开发者共享积累的日志?开源项目也应如此。我们觉得他人日志无趣是因缺乏上下文,且其中看似充满无关琐碎信息。
但积累日志的代价极小——每次看到日志(特别是错误日志)时复制粘贴即可。何不自动化?像Spring Boot项目那样每次运行时自动记录日志到目录是个好主意。
世界日益数字化,积累程序日志如同物理世界收藏书籍。