惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Security @ Cisco Blogs
小众软件
小众软件
D
Docker
博客园_首页
A
About on SuperTechFans
P
Privacy International News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
Arctic Wolf
Spread Privacy
Spread Privacy
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Latest news
Latest news
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
大猫的无限游戏
大猫的无限游戏
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
V2EX - 技术
V2EX - 技术
SecWiki News
SecWiki News
U
Unit 42
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LINUX DO - 热门话题
S
Security Affairs
Y
Y Combinator Blog
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
T
Tenable Blog
W
WeLiveSecurity
Cloudbric
Cloudbric
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
Google Developers Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
N
News and Events Feed by Topic
D
DataBreaches.Net
P
Proofpoint News Feed
B
Blog RSS Feed
B
Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

Posts on WKLKEN THINKING

apisix 中的 lrucache apisix 中的服务发现机制 apisix 中的负载均衡 apisix etcd机制 聊聊框架 关于 k8s 的 zero downtime deployment 一些建议 apisix 遇到的一些问题 关于在除夕前一天换了一个洗衣机的故事 Django DRF 性能优化 DRF 的一些实践 Part1: Serializer DRF继承关系图 Better Code: 关于接口的灵活性 新的仓库: wklken/naming 缓存使用的一些经验 Better Code: 抽象: 可扩展性与可维护性的抉择 Better Code: 异常时, 该提示用户哪些信息? Better Code: 更好的异常日志打印 Go: some libs Go: go-redis/cache升级的坑 Go: logrus性能提升 Go: gin validation 远程办公的一点总结 Go: 开发过程中的一些bug 项目管理实践: 风险驱动开发 Go: 一种error wrap调用链处理方式 漫谈技术选型 Go: 基于 apitest 做handler层单元测试 Go: go-sql-driver interpolateparams参数优化 [分享]深度工作 你需要更多的思考时间 Django项目重构小结 工作七年小结: 学习,生活及其他 [分享]bash日常: bash-utils 极客时间推广海报 2017总结: 予时光以意义 k8s APIServer源码: api注册详细细节 k8s APIServer源码: api注册主体流程 k8s APIServer源码: 服务启动 k8s APIServer源码: go-restful框架 重构 - 读书笔记(Python示例) 写给新人的沟通建议 vim 杂谈 - 关于快速编辑 vim 杂谈 - 关于移动 读书笔记-重构: 章11 处理概括关系 读书笔记-重构: 章10 简化函数调用 读书笔记-重构: 章9 简化表达式 读书笔记-重构: 章8 重新组织数据 读书笔记-重构: 章7 在对象之间搬移特性 读书笔记-重构: 章6 重新组织函数 Python 代码规范小结 [分享]关于vim ElasticSearch集群部署文档 Logstash+ElasticSearch处理mysql慢查询日志 [分享]关于代码调试DE那些事 Logstash+ElasticSearch+Kibana- 实现相对通用的数据收集分析 ELK维护的一些点(二) [分享]Python源码剖析-数据结构 一些Centos Python生产环境的部署命令 摘录<<6个月学会任何一种外语>> ELK 维护的一些点 也许是一个新的开始 一些vim的个性化配置 读书笔记-调试九法 这段时间的一些想法 Python 源码阅读 - 垃圾回收机制 我为什么要写博客 APUE笔记-第一章 UNIX基础知识 Python源码阅读-闭包的实现 Python源码阅读-内存管理机制(二) Python源码阅读-内存管理机制(一) Python-基础-数据结构小结 '活动'设计的一些trick 一些简单的Python测试题 我的tmux配置及说明【k-tmux】 Review and Restart 工作四周年小结 vim插件: surround & repeat[成对符号编辑] vim插件: gundo[时光机] vim插件: expand-region[区域选中] vim插件: quickrun[快速执行] vim插件: trailing-whitespace[行尾空格处理] vim插件: closetag[成对标签补全] vim插件: ctrlp[文件搜索] vim插件: airline[状态栏增强] vim插件: theme[主题] vim插件: tagbar[大纲式导航] vim插件: nerdcommenter[快速注释] vim插件: rainbow_parentheses[括号高亮] vim插件: syntastic[语法检查] vim插件: delimitmate[符号自动补全] vim插件: matchit[成对标签跳转] vim插件: easy-align[快速对齐] vim插件: multiple-cursors[多光标操作] vim插件: vim-signature[快速标记跳转] vim插件: easymotion[快速跳转] vim插件: vundle[管理插件] Elasticsearch几个问题的解决 分享一份 Vim 简介PPT k-vim 更新9.0版本 关于知识管理工具的思考
简约之美 & 编写可读代码的艺术
2014-11-16 · via Posts on WKLKEN THINKING

最近陆续收到一些donation, 非常感谢哈, blog的文章说多不多说少不少, 大部分是笔记性质的, 主要目的还是积累以及方便自己查询回顾, 分享出来, 希望有所帮助:)

ps: 昨天将国内ip切到gitcafe了, 加载速度应该快了很多, 在此特别感谢下gitcafe. (关于如何国内国外切分访问, google大法)

今天要提的是«简约之美—软件设计之道>> 以及 «编写可读代码的艺术>>, 主要原因是, 经典, 更重要的是, 足够薄:), 建议买了珍藏, 也是属于那种不同时期反复读会有不同感受的书

———————————

简约之美

这本书, 用一百页来说明, 软件开发设计中, 一些十分简单的道理.

封面

好的程序员和差的程序员的区别在于理解能力. 差劲的程序员不理解自己做的事情, 优秀的程序员则相反.

理解能力, 看起来蛮虚的一个词, 但是在工作中真正进行沟通时, 你会发现区别非常大, 决定了是一次沟通 还是 反复沟通; 是直达目标, 还是不断曲折; 是一次搞定, 还是改改改; 是反馈有效问题, 还是反馈不是你的问题的问题空耗你的时间. 所以花费时间去理解需求, 想明白之后再开始写代码, 这个很重要! (真正团队干活你会有直观感受的)

问题的根源通常在于编程……这一切都与复杂性有关……编程就成了把复杂问题化解为简单问题的劳动……”好程序员”应当竭尽全力, 把程序写得让其他程序员容易理解.

bug的本质, 归根结底在于编程本身.

我们往往容易把问题复杂化(大而全, 追求完美, 过早优化, 过早关注细节), 而过度复杂的后果导致后期代码的难以维护.(所谓的到时候再改/重构, 都是虚妄的), 程序员遇到一坨代码(别人写的或者之前写的), 有优化的冲动, 但是迫于需求或者时间或者系统稳定性, 往往惧怕变化, 这段代码能工作就行.

但是为什么要复杂化呢? 最简单的, 莫过于在最初就做到最好, 不要给自己到时候再重构的念头. 写好每行代码.

这里的其他程序员, 也可能是一个月后的自己. 如果经常发现回头看自己的代码都看不懂, 那么说明进步的余地还是很大的:).

到这里, 我们的目标转向: 寻找提高代码质量的科学方法.

每个写代码的人都是设计师

小到一个变量名, 一个判断逻辑, 大到一个函数, 一个类, 一个算法, 从代码里可以感受到很多东西. 拿建筑设计师对比, 写代码, 如同构筑一栋建筑, 不管是小屋/公寓还是摩天大厦, 好的设计永远美好, 而糟糕的设计, 无论大小, 永远丑陋. 很多概念, 意识和技巧在里面.(建议阅读编写可读代码的艺术, 然后是代码大全)

全部软件都有一个相同的目标: 帮助其他人……不能理解帮助其他人的程序员, 只能写出糟糕的程序, 也就是说, 他们的程序提供不了什么帮助……在做与软件有关的决策时, 指导法则就是判断能够提供什么样的帮助

同样, 这里的其他人, 可能是你自己.

需求的优先级, 取决于这个需求对于用户帮助的大小.

你这样做/这个功能/这么处理, 对于目标, 对于团队, 对于个人, 有何帮助? 如果没有, 为什么要这么做?

软件设计科学的目标: 1.确保软件能够提供尽可能多的帮助. 2.确保软件能够持续提供尽可能多的帮助 3.设计程序员能尽可能简单地开发和维护的软件系统. 才能实现1/2

1代表软件本身的价值, 2代表软件的可维护性可扩展性, 3代表, 好的/简单的设计, 决定了可维护性和可扩展性, 是万丈高楼的地基. 不过1和3, 在有限资源的情况下(资源永远是不够的), 是互相冲突的, 所以要思考如何保持平衡.

这里提到, 软件的开发和维护都应当简单, 要避免困难和复杂.

软件设计方程式 可取程度=价值/成本 => 可行性=(当前价值+未来价值)/(实现成本+维护成本)

当前价值和实现成本往往是可评估的, 人们会关注于这一点, 带来的问题就是忽略了未来价值和维护成本, 这两个和时间相关, 不易评估, 但是却更为重要. 人很容易只着眼于现在而忽略了未来. 所以写代码时需要注意, 存在着未来.

相比降低实现成本, 降低维护成本更为重要. 很直观的感觉, 一个设计良好的接口, 在需求变更的时候, 只需要动个参数或者动几行代码或者压根不需要改. 而一个糟糕的设计里, 每次需求变更, 会发现需要改动很多代码, 甚至是重写, 连带测试等时间, 你会发现很多时间耗费在里面. 所以应该一开始就理解, 往未来看一眼(预测短期未来是可行的, 预测长期未来是不靠谱的), 再进行设计, 再进行代码.

变化定律: 程序存在的时间越久, 它的某个部分需要变化的可能性就越高.

一切都是变化的, 你自己, 还有这个世界.

所以需求变更是必然的:)

之前学到一个很重要的观点: 拥抱变化.

软件设计三大误区: 1.编写不必要的代码 2.代码难以修改 3.过分追求通用

YAGIN, 不要编写不是必须的代码, 并且要删除没有用到的代码. 版本库干嘛用的? 提交, 然后删除那些没用的, 然后再提交:)

僵化设计的原因: 1.对未来做了太多假设(……) 2.不仔细设计就编写代码(新手需注意). 设计程序时, 应当根据你现在确切知道的需求, 而不是你认为未来会出现的需求

避免过度设计: 仅仅根据目前确知的需求来考虑通用.

缺陷概率定律: 在程序中新增缺陷的可能性与代码修改量成正比

好的设计, 代码少(很大可能), 代码变更少, 而糟糕的设计, 反之. 从而, bug出现的概率显而易见

最好的设计, 就是能够适应外界尽可能多的变化. 而软件自身的变化要尽可能少.

不变应万变, 追求之

永远不要修正 任何东西, 除非它真的可能有问题, 而且有证据表明问题确实存在.

例如: “过早优化”!

当问题成为问题的时候, 才是问题, 才需要去处理!

理想情况下, 任何系统里的任何信息, 都应当只存在一次.

避免重复. 变更时代价最小.

简洁定律: 软件任何一部分的维护难度, 反比于该部分的简洁程度.

简洁是相对的.

保持一致/可读性(代码被阅读的次数远远多于编写和修改的次数)/命名/注释(代码的意图通常不应该用注释来说明, 直接阅读代码就应当能够理解)

复杂性是会叠加的, 而不是简单的线性叠加

问题复杂, 解法不一定复杂.

解决复杂性: 把它分解成独立的小部分, 并进行重新设计.

测试法则: 你对软件行为的了解程度, 等于你真正测试它的程度……除非亲自测试过, 否则你不知道软件是否能正常运行.

about test.

编写可读代码的艺术

关于如何编写高质量可读的代码的方法论:)

封面

«The Art of Readable Code>>, 这本书就不细写了, 因为不到两百页, 几乎每一页都是干货.

强烈推荐.

代码大全太厚, «Clean Code>>太晦涩, 建议来读这本. 每次总能得到一些感悟.