50 万行代码喂出来的一些编程经验

更新日期: 2022-06-07阅读: 1.1k标签: 经验

踏入职场后写代码已经有 14 个年头,保守估计应该垒了有 50 万行的代码。尤其最近 1 年多从 0 开始写起 Bytebase,日常也会 review 同事的代码。趁着端午也总结了一些经验,这些经验聚焦在写代码的 具体 细节上,在道,法,术,技中更多归之于技。首先声明这些技是用来帮助写出更可维护的代码,而不是更快地写出代码,Enjoy。

命名篇

字母使用小写。有些系统对大小写不敏感。

名词使用单数。英文的复数规则比较复杂,尤其对于英语非母语程序员来说,用复数容易造成代码命名不一致。如果是表示数组的话,可以加上 List 后缀。

动词使用一般时态。同样英文的动词被动时态规则也有好多种,使用被动时态容易造成命名不一致。

使用 Reversed domain name notation (reverse-DNS) 来命名。比如在 Bytebase 里定义 issue 创建这个活动,我们可以用 bb.issue.create。而成员的创建可以用 bb.member.create。名字定义本身包含了结构,具备更好的可读性,同时搜索的时候也可以使用 bb.member 这样的前缀搜索。

范式篇

使用 Command Pattern,把每一个变更的行为都包装成一个 Command,具体 Command 的名字定义使用前面提到的 reversed domain name notation。这样的好处是我们能提取出一个中央的组件来处理这些命令,像 undo/redo, logging 这些就变得相当容易。绝大多数应用框架其实都有 Command Pattern 的身影。

考虑使用 Soft Delete 而不是 Hard Delete,通常在数据库表结构里加上一列 status, 其中一个值是 PENDING_DELETE,可以有效防止误操作,让 undo 的实现也变得简单。

除非有必须的理由,尽量避免持久化状态。持久化状态会大大增加将来迁移和升级的复杂度。

架构设计篇

先设计 Schema / 领域建模,再设计 api,再其他。

Schema / 领域建模设计的 4 个要点,对象本身, 对象 的行为, 对象 的约束以及 对象 间的关系。

培养使用 namespace 的意识。namespace 能帮助更好地做模块设计,前面提到的  reversed domain name notation 就是 namespace 的一种运用。

大型项目需要尽早采用 Plugin 架构,区分 Core 和 Plugin 部分。Linux 的 Core 其实不大,绝大多数都是 Driver 代码 (Plugin 的一种类型)。Bytebase 的代码也做了类似的拆分。


技术选型篇

使用 Restful 而不是 GraphQL。

RESTful 是更成熟的技术,有成熟的生态。

RESTful 帮助团队更早关注领域建模,因为需要识别出对象以及对象上的行为。

RESTful 帮助架构做更好的分层。RESTful 定义了更加克制的接口,界定了前后端的边界。而 GraphQL 很容易穿透界定的边界和抽象。

使用关系型数据库而不是 NoSQL。

想走得快用 MySQL,要走得远用 PostgreSQL。

除非业务本身需要对接多种数据库,否则谨慎考虑使用 ORM。ORM 通常只支持所有数据库功能的最大公约数,一些特色功能要么不支持,要么要用晦涩的语法。而且你无法精确控制生成的 SQL,影响代码可读性。

新的后端项目优先考虑使用 Go。

最后

写代码,正确性是第一位的,可读性是第二位的,性能是最末位的。糟糕的程序员也能写出机器能执行的代码,合格的程序员要写别人能理解的代码。

代码写得好用处本身并不大。技术总是服务于业务的,要结合业务理解写代码。最好的解法是不加任何额外的代码就能解决业务问题,而能胜过这个解法的则是通过减少代码来解决问题。

Deleted code is debugged code.

上面提到的观点在 Bytebase 中也有不少实践,感兴趣可以翻阅我们的代码 https://github.com/bytebase/bytebase

原文 https://mp.weixin.qq.com/s/SMxcxWZt4atct0bUHPMO0g

链接: https://fly63.com/article/detial/11667

跳槽经验教训整理

战线切勿拖太长,除非练手,否则不是真心想去的公司就别试了。对公司信息的了解要放在平时,多与同事朋友了解沟通,偶尔逛逛blind一亩三分地一类,这样才能确定下次跳槽的目标,有的放矢。选公司不是买菜!别见一个爱一个

项目中前端开发问题经验总结

ie下websocket的安全限制问题:数据看板中的数据大部分都是实时数据或前一天统计的历史数据,因此这边后端考虑采用websocket来实时和定时推送数据来保证数据的实时性和有效性。而前端开发这边为了提高前端开发的复用性,采用了在各个组件中开发成一个个的小部件

20年程序员分享编程经验

从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友

CSS开发中的10个易错点

我发现前端开发人员一直在努力征服CSS。理由也很充分,开发人员是用逻辑思考的生物。添加一个DIV元素导致所有代码都不得不往下移一行,而另一个DIV“浮”到左侧,感觉没有任何意义

优秀程序员的代码经验总结

这是一篇值得收藏起来,隔三差五就拿来重读的文章!因为作者向你保证,他“遇到的所有糟糕的代码,都是因为没采纳这些实践经验。而任何一段优秀的代码,都采纳了至少部分实践经验。”

摆脱JS框架,5年web组件开发经验总结

别再用 JS 框架了,转向可复用、可正交组合的 HTML+CSS+JS 单元吧。这几年我零零碎碎写过一些进展,现在既然 Jon 问到了,我觉得有必要把这些总结成一篇文章概括一下。我和我的团队一直在用 Web 组件来构建我们的 Web UI。

从业 20 年的程序员,“盘”出来的 5 种编程经验

一个拥有 20 年编程经验的“熟手”,编程干货有多少?本文的作者是一名从业 20 年的程序员,在本文中,他分享了自己这 20 年来学到的 5 种编程经验:重复的知识最糟糕、把代码当成一种债务、对高级开发人员信任但去验证、使用 TDD

来自10位成功IT人士的23条经验教训

我们是从一个只有3个人其他啥都没有的创业公司逐步成长为一家大型的具备可扩展性,业务操作能力,数据库和产品开发的企业。如果你真心醉心于做企业,那么这就应该成为你的目标

提升前端开发质量的十点经验沉淀

特别是网络请求或者其他异步操作中,await 记得包裹 try catch,可以给用户一个友好提示,同时可以考虑 catch 中需要做什么兜底处理,必要时进行上传日志。

一位老程序员38年经验总结:不要有年龄危机,直接去做

能把一件事坚持 40 年的人并不多,我们今天要介绍的这位就是其中一员。他叫 Noah Gibbs,从事编程工作快满 40 年了,最近他用博客的形式分享了自己总结的一些经验。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!