-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathperfect_code.html
1 lines (1 loc) · 46.8 KB
/
perfect_code.html
1
<!doctype html><html lang="zh-CN" class="night"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1,maximum-scale=4,user-scalable=0" name="viewport"><title>Ede's Blog</title><meta name="description" content="Try to be a qualified programmer"><meta property="og:type" content="website"><meta property="og:description" content="Try to be a qualified programmer"><meta property="og:title" content="Ede's Blog"><meta property="og:site_name" content="Ede's Blog"><meta property="og:url" content="https://ede.ink"><meta property="og:image" content="https://edeity.oss-cn-shenzhen.aliyuncs.com/public/edeity_o.png"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"><link rel="mainfest" href="/mainfest.json"><link rel="stylesheet" href="/public/css/common.css"><link rel="stylesheet" href="//at.alicdn.com/t/font_707055_4b9og9sc5lx.css"><script>!function(){var e=-1!==window.location.search.indexOf("theme=night")||"night"===window.localStorage.getItem("edeity-theme_theme"),t=-1!==window.location.search.indexOf("theme=light")||"light"===window.localStorage.getItem("edeity-theme_theme");(new Date).getHours();var n=document.querySelector("html");e?n.classList.add("night"):t?n.classList.remove("night"):n.classList.add("night")}(),document.addEventListener("DOMContentLoaded",function(){null!==document.querySelector("ol.toc")&&(document.querySelector("#nav-bar").style.cssText="display: block")})</script><script async src="https://www.googletagmanager.com/gtag/js?id=G-M3J9QSEE2Z"></script><script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-M3J9QSEE2Z")</script><meta name="generator" content="Hexo 5.0.0"></head><body><div class="loading"></div><div id="switch" data-switch="{"toc":true,"use_pwa":false}"></div><header class="fullscreen"><div class="toolbar"><i class="iconfont icon-menu"></i></div><h1><a href="/">Ede's Blog</a></h1><div class="head-link"><a class="btn waves" href="/"><span><i class="iconfont icon-home">Home </i></span></a><a class="btn waves" href="/about/index.html"><span><i class="iconfont icon-me">About </i></span></a><a class="btn waves" target="_blank" rel="noopener" href="https://github.com/edeink"><span><i class="iconfont icon-github">Github</i></span></a></div></header><div class="some-link"><a class="btn" id="light-or-not"><i class="iconfont icon-light"></i> </a><a style="display:none" class="btn" id="up-to-top"><i class="iconfont icon-up"></i></a></div><div id="nav-bar" style="display:none"><div class="toc"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%89%8D%E8%A8%80"><span class="toc-number">1.</span> <span class="toc-text">前言</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%85%B3%E5%BF%83%E4%BD%A0%E7%9A%84%E6%8A%80%E8%89%BA"><span class="toc-number">2.</span> <span class="toc-text">关心你的技艺</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%80%9D%E8%80%83-%E4%BD%A0%E7%9A%84%E5%B7%A5%E4%BD%9C"><span class="toc-number">3.</span> <span class="toc-text">思考!你的工作</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%8F%90%E4%BE%9B%E5%90%84%E7%A7%8D%E9%80%89%E6%8B%A9-%E4%B8%8D%E8%A6%81%E6%89%BE%E8%B9%A9%E8%84%9A%E7%9A%84%E5%80%9F%E5%8F%A3"><span class="toc-number">4.</span> <span class="toc-text">提供各种选择,不要找蹩脚的借口</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E5%AE%B9%E5%BF%8D%E7%A0%B4%E7%AA%97%E6%88%B7"><span class="toc-number">5.</span> <span class="toc-text">不要容忍破窗户</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%81%9A%E5%8F%98%E5%8C%96%E7%9A%84%E5%82%AC%E5%8C%96%E5%89%82"><span class="toc-number">6.</span> <span class="toc-text">做变化的催化剂</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%AE%B0%E4%BD%8F%E5%A4%A7%E5%9B%BE%E6%99%AF"><span class="toc-number">7.</span> <span class="toc-text">记住大图景</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BD%BF%E8%B4%A8%E9%87%8F%E6%88%90%E4%B8%BA%E9%9C%80%E6%B1%82%E9%97%AE%E9%A2%98"><span class="toc-number">8.</span> <span class="toc-text">使质量成为需求问题</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%AE%9A%E6%9C%9F%E4%B8%BA%E4%BD%A0%E7%9A%84%E7%9F%A5%E8%AF%86%E6%8A%95%E8%B5%84"><span class="toc-number">9.</span> <span class="toc-text">定期为你的知识投资</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%89%B9%E5%88%A4%E5%9C%B0%E5%88%86%E6%9E%90%E4%BD%A0%E8%AF%BB%E5%88%B0%E7%9A%84%E5%92%8C%E5%90%AC%E5%88%B0%E7%9A%84"><span class="toc-number">10.</span> <span class="toc-text">批判地分析你读到的和听到的</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BD%A0%E8%AF%B4%E4%BB%80%E4%B9%88%E5%92%8C%E4%BD%A0%E6%80%8E%E4%B9%88%E8%AF%B4%E5%90%8C%E6%A0%B7%E9%87%8D%E8%A6%81"><span class="toc-number">11.</span> <span class="toc-text">你说什么和你怎么说同样重要</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E9%87%8D%E5%A4%8D%E4%BD%A0%E8%87%AA%E5%B7%B1"><span class="toc-number">12.</span> <span class="toc-text">不要重复你自己</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%AE%A9%E5%A4%8D%E7%94%A8%E5%8F%98%E5%BE%97%E5%AE%B9%E6%98%93"><span class="toc-number">13.</span> <span class="toc-text">让复用变得容易</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%B6%88%E9%99%A4%E6%97%A0%E5%85%B3%E4%BA%8B%E6%83%85%E9%97%B4%E7%9A%84%E5%BD%B1%E5%93%8D"><span class="toc-number">14.</span> <span class="toc-text">消除无关事情间的影响</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E5%AD%98%E5%9C%A8%E6%9C%80%E7%BB%88%E5%86%B3%E7%AD%96"><span class="toc-number">15.</span> <span class="toc-text">不存在最终决策</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%94%A8%E6%9B%B3%E5%85%89%E5%BC%B9%E6%89%BE%E5%88%B0%E7%9B%AE%E6%A0%87"><span class="toc-number">16.</span> <span class="toc-text">用曳光弹找到目标</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%BA%E4%BA%86%E5%AD%A6%E4%B9%A0%E8%80%8C%E5%88%B6%E4%BD%9C%E5%8E%9F%E5%9E%8B"><span class="toc-number">17.</span> <span class="toc-text">为了学习而制作原型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%A0%E8%BF%91%E9%97%AE%E9%A2%98%E9%A2%86%E5%9F%9F%E7%BC%96%E7%A8%8B"><span class="toc-number">18.</span> <span class="toc-text">靠近问题领域编程</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BC%B0%E7%AE%97-%E4%BB%A5%E9%81%BF%E5%85%8D%E5%8F%91%E7%94%9F%E6%84%8F%E5%A4%96"><span class="toc-number">19.</span> <span class="toc-text">估算, 以避免发生意外</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%80%9A%E8%BF%87%E4%BB%A3%E7%A0%81%E5%AF%B9%E6%AF%94%E8%BF%9B%E8%A1%8C%E8%BF%AD%E4%BB%A3"><span class="toc-number">20.</span> <span class="toc-text">通过代码对比进行迭代</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%94%A8%E7%BA%AF%E6%96%87%E6%9C%AC%E4%BF%9D%E5%AD%98%E7%9F%A5%E8%AF%86"><span class="toc-number">21.</span> <span class="toc-text">用纯文本保存知识</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%88%A9%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8CShell%E7%9A%84%E5%8A%9B%E9%87%8F"><span class="toc-number">22.</span> <span class="toc-text">利用命令行Shell的力量</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%94%A8%E5%A5%BD%E4%B8%80%E7%A7%8D%E7%BC%96%E8%BE%91%E5%99%A8"><span class="toc-number">23.</span> <span class="toc-text">用好一种编辑器</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%80%BB%E6%98%AF%E4%BD%BF%E7%94%A8%E6%BA%90%E7%A0%81%E6%8E%A7%E5%88%B6"><span class="toc-number">24.</span> <span class="toc-text">总是使用源码控制</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%A6%81%E4%BF%AE%E6%AD%A3%E9%97%AE%E9%A2%98-%E8%80%8C%E4%B8%8D%E6%98%AF%E5%8F%91%E5%87%BA%E6%8C%87%E8%B4%A3"><span class="toc-number">25.</span> <span class="toc-text">要修正问题, 而不是发出指责</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E6%81%90%E6%85%8C"><span class="toc-number">26.</span> <span class="toc-text">不要恐慌</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E2%80%9CSelect%E2%80%9D-%E6%B2%A1%E6%9C%89%E9%97%AE%E9%A2%98"><span class="toc-number">27.</span> <span class="toc-text">“Select” 没有问题</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E5%81%87%E5%AE%9A-%E8%A6%81%E8%AF%81%E6%98%8E"><span class="toc-number">28.</span> <span class="toc-text">不要假定, 要证明</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%AD%A6%E4%B9%A0%E4%B8%80%E7%A7%8D%E6%96%87%E6%9C%AC%E6%93%8D%E7%BA%B5%E8%AF%AD%E8%A8%80"><span class="toc-number">29.</span> <span class="toc-text">学习一种文本操纵语言</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%BC%96%E5%86%99%E8%83%BD%E7%BC%96%E5%86%99%E4%BB%A3%E7%A0%81%E7%9A%84%E4%BB%A3%E7%A0%81"><span class="toc-number">30.</span> <span class="toc-text">编写能编写代码的代码</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BD%A0%E4%B8%8D%E5%8F%AF%E8%83%BD%E5%86%99%E5%87%BA%E5%AE%8C%E7%BE%8E%E7%9A%84%E8%BD%AF%E4%BB%B6"><span class="toc-number">31.</span> <span class="toc-text">你不可能写出完美的软件</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%80%9A%E8%BF%87%E5%90%88%E7%BA%A6%E8%BF%9B%E8%A1%8C%E8%AE%BE%E8%AE%A1"><span class="toc-number">32.</span> <span class="toc-text">通过合约进行设计</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%97%A9%E5%B4%A9%E6%BA%83"><span class="toc-number">33.</span> <span class="toc-text">早崩溃</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%94%A8%E6%96%AD%E8%A8%80%E9%81%BF%E5%85%8D%E4%B8%8D%E5%8F%AF%E8%83%BD%E5%8F%91%E7%94%9F%E7%9A%84%E4%BA%8B%E6%83%85"><span class="toc-number">34.</span> <span class="toc-text">用断言避免不可能发生的事情</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%B0%86%E5%BC%82%E5%B8%B8%E7%94%A8%E4%BA%8E%E5%BC%82%E5%B8%B8%E7%9A%84%E9%97%AE%E9%A2%98"><span class="toc-number">35.</span> <span class="toc-text">将异常用于异常的问题</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%A6%81%E6%9C%89%E5%A7%8B%E6%9C%89%E7%BB%88"><span class="toc-number">36.</span> <span class="toc-text">要有始有终</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BD%BF%E6%A8%A1%E5%9D%97%E4%B9%8B%E9%97%B4%E7%9A%84%E8%80%A6%E5%90%88%E5%87%8F%E5%B0%91%E8%87%B3%E6%9C%80%E5%B0%91"><span class="toc-number">37.</span> <span class="toc-text">使模块之间的耦合减少至最少</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%A6%81%E9%85%8D%E7%BD%AE-%E4%B8%8D%E8%A6%81%E9%9B%86%E6%88%90"><span class="toc-number">38.</span> <span class="toc-text">要配置, 不要集成</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%B0%86%E6%8A%BD%E8%B1%A1%E6%94%BE%E8%BF%9B%E4%BB%A3%E7%A0%81-%E7%BB%86%E8%8A%82%E6%94%BE%E8%BF%9B%E5%85%83%E6%95%B0%E6%8D%AE"><span class="toc-number">39.</span> <span class="toc-text">将抽象放进代码, 细节放进元数据</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%88%86%E6%9E%90%E5%B7%A5%E4%BD%9C%E6%B5%81-%E4%BB%A5%E6%94%B9%E5%96%84%E5%B9%B6%E5%8F%91%E6%80%A7"><span class="toc-number">40.</span> <span class="toc-text">分析工作流, 以改善并发性</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%94%A8%E6%9C%8D%E5%8A%A1%E8%BF%9B%E8%A1%8C%E8%AE%BE%E8%AE%A1"><span class="toc-number">41.</span> <span class="toc-text">用服务进行设计</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%80%BB%E6%98%AF%E4%B8%BA%E5%B9%B6%E5%8F%91%E8%BF%9B%E8%A1%8C%E8%AE%BE%E8%AE%A1"><span class="toc-number">42.</span> <span class="toc-text">总是为并发进行设计</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BD%BF%E8%A7%86%E5%9B%BE%E4%B8%8E%E6%A8%A1%E5%9E%8B%E5%88%86%E7%A6%BB"><span class="toc-number">43.</span> <span class="toc-text">使视图与模型分离</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%94%A8%E9%BB%91%E6%9D%BF%E5%8D%8F%E8%B0%83%E5%B7%A5%E4%BD%9C%E6%B5%81"><span class="toc-number">44.</span> <span class="toc-text">用黑板协调工作流</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E9%9D%A0%E5%B7%A7%E5%90%88%E7%BC%96%E7%A8%8B"><span class="toc-number">45.</span> <span class="toc-text">不要靠巧合编程</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BC%B0%E7%AE%97%E4%BD%A0%E7%9A%84%E7%AE%97%E6%B3%95%E7%9A%84%E9%98%B6"><span class="toc-number">46.</span> <span class="toc-text">估算你的算法的阶</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%B5%8B%E8%AF%95%E4%BD%A0%E7%9A%84%E4%BC%B0%E7%AE%97"><span class="toc-number">47.</span> <span class="toc-text">测试你的估算</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%97%A9%E9%87%8D%E6%9E%84-%E5%B8%B8%E9%87%8D%E6%9E%84"><span class="toc-number">48.</span> <span class="toc-text">早重构, 常重构</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%BA%E6%B5%8B%E8%AF%95%E8%80%8C%E8%AE%BE%E8%AE%A1"><span class="toc-number">49.</span> <span class="toc-text">为测试而设计</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%B5%8B%E8%AF%95%E4%BD%A0%E7%9A%84%E8%BD%AF%E4%BB%B6-%E5%90%A6%E5%88%99%E4%BD%A0%E7%9A%84%E7%94%A8%E6%88%B7%E5%B0%B1%E5%BE%97%E6%B5%8B%E8%AF%95"><span class="toc-number">50.</span> <span class="toc-text">测试你的软件, 否则你的用户就得测试</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8%E4%BD%A0%E4%B8%8D%E7%90%86%E8%A7%A3%E7%9A%84%E5%AF%BC%E5%90%91%E4%BB%A3%E7%A0%81"><span class="toc-number">51.</span> <span class="toc-text">不要使用你不理解的导向代码</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E6%90%9C%E7%B4%A2%E9%9C%80%E6%B1%82-%E2%80%94-%E6%8C%96%E6%8E%98%E5%AE%83%E4%BB%AC"><span class="toc-number">52.</span> <span class="toc-text">不要搜索需求 — 挖掘它们</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8E%E7%94%A8%E6%88%B7%E4%B8%80%E5%90%8C%E5%B7%A5%E4%BD%9C-%E4%BB%A5%E5%83%8F%E7%94%A8%E6%88%B7%E4%B8%80%E6%A0%B7%E6%80%9D%E8%80%83"><span class="toc-number">53.</span> <span class="toc-text">与用户一同工作, 以像用户一样思考</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%8A%BD%E8%B1%A1%E6%AF%94%E7%BB%86%E8%8A%82%E8%8E%B7%E5%BE%97%E6%9B%B4%E9%95%BF%E4%B9%85"><span class="toc-number">54.</span> <span class="toc-text">抽象比细节获得更长久</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BD%BF%E7%94%A8%E9%A1%B9%E7%9B%AE%E8%AF%8D%E6%B1%87%E8%A1%A8"><span class="toc-number">55.</span> <span class="toc-text">使用项目词汇表</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E5%9C%A8%E7%9B%92%E5%AD%90%E5%A4%96%E9%9D%A2%E6%80%9D%E8%80%83-%E2%80%94-%E8%A6%81%E6%89%BE%E5%88%B0%E7%9B%92%E5%AD%90"><span class="toc-number">56.</span> <span class="toc-text">不要在盒子外面思考 — 要找到盒子</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%AD%89%E4%BD%A0%E5%87%86%E5%A4%87%E5%A5%BD%E5%86%8D%E5%BC%80%E5%A7%8B"><span class="toc-number">57.</span> <span class="toc-text">等你准备好再开始</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%AF%B9%E6%9C%89%E4%BA%9B%E4%BA%8B%E6%83%85%E2%80%9D%E5%81%9A%E2%80%9D%E8%83%9C%E4%BA%8E%E2%80%9D%E6%8F%8F%E8%BF%B0"><span class="toc-number">58.</span> <span class="toc-text">对有些事情”做”胜于”描述</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E5%BD%A2%E5%BC%8F%E6%96%B9%E6%B3%95%E7%9A%84%E5%A5%B4%E9%9A%B6"><span class="toc-number">59.</span> <span class="toc-text">不要形式方法的奴隶</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%98%82%E8%B4%B5%E7%9A%84%E5%B7%A5%E5%85%B7%E4%B8%8D%E4%B8%80%E5%AE%9A%E8%83%BD%E5%88%B6%E4%BD%9C%E5%87%BA%E6%9B%B4%E5%A5%BD%E7%9A%84%E8%AE%BE%E8%AE%A1"><span class="toc-number">60.</span> <span class="toc-text">昂贵的工具不一定能制作出更好的设计</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%B4%E7%BB%95%E5%8A%9F%E8%83%BD%E7%BB%84%E7%BB%87%E5%9B%A2%E9%98%9F"><span class="toc-number">61.</span> <span class="toc-text">围绕功能组织团队</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8%E6%89%8B%E5%B7%A5%E6%B5%81%E7%A8%8B"><span class="toc-number">62.</span> <span class="toc-text">不要使用手工流程</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%97%A9%E6%B5%8B%E8%AF%95-%E5%B8%B8%E6%B5%8B%E8%AF%95-%E8%87%AA%E5%8A%A8%E6%B5%8B%E8%AF%95"><span class="toc-number">63.</span> <span class="toc-text">早测试, 常测试, 自动测试</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%A6%81%E5%88%B0%E9%80%9A%E8%BF%87%E5%85%A8%E9%83%A8%E6%B5%8B%E8%AF%95-%E7%BC%96%E7%A0%81%E6%89%8D%E7%AE%97%E5%AE%8C%E6%88%90"><span class="toc-number">64.</span> <span class="toc-text">要到通过全部测试, 编码才算完成</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%80%9A%E8%BF%87%E2%80%9D%E8%93%84%E6%84%8F%E7%A0%B4%E5%9D%8F%E2%80%9D%E6%B5%8B%E8%AF%95%E4%BD%A0%E7%9A%84%E6%B5%8B%E8%AF%95"><span class="toc-number">65.</span> <span class="toc-text">通过”蓄意破坏”测试你的测试</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%B5%8B%E8%AF%95%E7%8A%B6%E6%80%81%E8%A6%86%E7%9B%96-%E8%80%8C%E4%B8%8D%E6%98%AF%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96"><span class="toc-number">66.</span> <span class="toc-text">测试状态覆盖, 而不是代码覆盖</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%80%E4%B8%AAbug%E5%8F%AA%E6%8A%93%E4%B8%80%E6%AC%A1"><span class="toc-number">67.</span> <span class="toc-text">一个bug只抓一次</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%8B%B1%E8%AF%AD%E5%B0%B1%E6%98%AF%E4%B8%80%E7%A7%8D%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80"><span class="toc-number">68.</span> <span class="toc-text">英语就是一种编程语言</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%8A%8A%E6%96%87%E6%A1%A3%E5%BB%BA%E5%9C%A8%E9%87%8C%E9%9D%A2-%E4%B8%8D%E8%A6%81%E5%9C%A8%E5%A4%96%E9%9D%A2"><span class="toc-number">69.</span> <span class="toc-text">把文档建在里面, 不要在外面</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%B8%A9%E5%92%8C%E5%9C%B0%E8%B6%85%E5%87%BA%E7%94%A8%E6%88%B7%E7%9A%84%E6%9C%9F%E6%9C%9B"><span class="toc-number">70.</span> <span class="toc-text">温和地超出用户的期望</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9C%A8%E4%BD%A0%E7%9A%84%E4%BD%9C%E5%93%81%E4%B8%8A%E7%AD%BE%E5%90%8D"><span class="toc-number">71.</span> <span class="toc-text">在你的作品上签名</span></a></li></ol></div></div><main id="content-main" class="section"><div class="list-item"><h1 class="post-title"><a id="《程序员修炼之道》读后感" class="article-link" href="">《程序员修炼之道》读后感</a></h1><div class="post-meta"><time class="meta published">Jan 2, 2014</time></div><div class="article"><div class="post-excerpt markdown-body"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这篇是<a target="_blank" rel="noopener" href="https://book.douban.com/subject/1152111/">《程序猿修炼之道——从小工到专家》</a>的摘要。初读此书,是在大三。再读此书,是工作后三年。期间有不少观点发生了变化,或有了深入的了解,故将这些小牢骚记录与此,一是作为此书的实践有感,二是记录自己的成长,三是越发感到此书虽薄,然而字字珠玑,愿自己能常回归,常思考,在否定否定中进步。</p><h2 id="关心你的技艺"><a href="#关心你的技艺" class="headerlink" title="关心你的技艺"></a>关心你的技艺</h2><blockquote><p>Care About Your Craft</p><p>如果你不在乎能否漂亮地开发软件,你又为何要浪费生命去开发软件呢?</p></blockquote><h2 id="思考-你的工作"><a href="#思考-你的工作" class="headerlink" title="思考!你的工作"></a>思考!你的工作</h2><blockquote><p>Think! About Your Work</p><p>关掉自动驾驶仪,接管操作.不断地批评和评估你的工作</p></blockquote><p>我思,故我在。假若不思考,便如流水线上的机器。常呆在舒适区,会固化人的思维,使人不思进取。若遇到了不可估计的突发事件,如公司倒闭,部门调整,便会不知所措。保持适度的警惕,尝试接受更多来自外界的反馈(如定期接受外界面试)。完成一项需求,尝试优化它的性能,完善它的功能,健壮它的逻辑,寻求更好的实现。即使是重复的工作,只要思考,都有可能发现自己的不足。生活何尝不如此呢?</p><h2 id="提供各种选择-不要找蹩脚的借口"><a href="#提供各种选择-不要找蹩脚的借口" class="headerlink" title="提供各种选择,不要找蹩脚的借口"></a>提供各种选择,不要找蹩脚的借口</h2><blockquote><p>Provide Options, Don’t Make Lame Excuses</p><p>要提供各种选择, 而不是找借口. 不要说事情做不到; 说明能够做什么</p></blockquote><h2 id="不要容忍破窗户"><a href="#不要容忍破窗户" class="headerlink" title="不要容忍破窗户"></a>不要容忍破窗户</h2><blockquote><p>Don’t Live with Broken Windows</p><p>当你看到糟糕的设计, 错误的抉择和糟糕的代码时, 修正它们</p></blockquote><p>发现糟糕的设计,记录下来,不要贸然修正它们。先去了解全局的逻辑,前因后果,其次,设计你的代码,验证你的代码,最好能配套对应的测试用例。从发现,到设计,到实践,可能跨越几个月的时间,越是复杂的逻辑,越应保持应有的谨慎。当然,回归主题,面对需要长期维护的代码,在条件运行的情况,想方设法修正它,若暂时没有空闲的时间,用工具记录下来,加入你的TODO!</p><h2 id="做变化的催化剂"><a href="#做变化的催化剂" class="headerlink" title="做变化的催化剂"></a>做变化的催化剂</h2><blockquote><p>Be a Catalyst for Change</p><p>你不能强迫人们改变. 相反, 要向他们展示未来可能会怎样, 并帮助他们参与对未来的创造</p></blockquote><h2 id="记住大图景"><a href="#记住大图景" class="headerlink" title="记住大图景"></a>记住大图景</h2><blockquote><p>Remember the Big Picture</p><p>不要太过专注于细节, 以致忘了查看你周围正在发生什么</p></blockquote><h2 id="使质量成为需求问题"><a href="#使质量成为需求问题" class="headerlink" title="使质量成为需求问题"></a>使质量成为需求问题</h2><blockquote><p>Make Quality a Requirements Issue</p><p>让你的用户参与确定项目真正的质量需求</p></blockquote><h2 id="定期为你的知识投资"><a href="#定期为你的知识投资" class="headerlink" title="定期为你的知识投资"></a>定期为你的知识投资</h2><blockquote><p>Invest Regularly in Your Knowledge Porfolio</p><p>让学习成为习惯</p></blockquote><h2 id="批判地分析你读到的和听到的"><a href="#批判地分析你读到的和听到的" class="headerlink" title="批判地分析你读到的和听到的"></a>批判地分析你读到的和听到的</h2><blockquote><p>Critically Analyze What You Read and Hear</p><p>不要被供应商, 媒体炒作, 或教条左右. 要依照你自己的看法和你的项目的情况去对信息进行分析</p></blockquote><h2 id="你说什么和你怎么说同样重要"><a href="#你说什么和你怎么说同样重要" class="headerlink" title="你说什么和你怎么说同样重要"></a>你说什么和你怎么说同样重要</h2><blockquote><p>It’s Both What You Say and the Way You Say It</p><p>如果你不能有效地向他人传达你的了不起的想法, 这些想法就毫无用处</p></blockquote><h2 id="不要重复你自己"><a href="#不要重复你自己" class="headerlink" title="不要重复你自己"></a>不要重复你自己</h2><blockquote><p>DRY- Don’t Repeat Yourself</p><p>系统中的每一项知识都必须具有单一, 无歧义, 权威的表示</p></blockquote><h2 id="让复用变得容易"><a href="#让复用变得容易" class="headerlink" title="让复用变得容易"></a>让复用变得容易</h2><blockquote><p>Make It Easy to Reuse</p><p>如果复用很容易, 人们就会去复用. 创造一个支持复用的环境</p></blockquote><h2 id="消除无关事情间的影响"><a href="#消除无关事情间的影响" class="headerlink" title="消除无关事情间的影响"></a>消除无关事情间的影响</h2><blockquote><p>Eliminate Effects Between Unrelated Things</p><p>设计自足, 独立, 并具有单一, 良好定义的目的的组件</p></blockquote><h2 id="不存在最终决策"><a href="#不存在最终决策" class="headerlink" title="不存在最终决策"></a>不存在最终决策</h2><blockquote><p>There Are No Final Decisions</p><p>没有决策是浇铸在石头上的. 相反, 要把每项决策都视为是写在海滩上的, 并为变化做好计划</p></blockquote><h2 id="用曳光弹找到目标"><a href="#用曳光弹找到目标" class="headerlink" title="用曳光弹找到目标"></a>用曳光弹找到目标</h2><blockquote><p>Use Tracer Bullets to Find the Target</p><p>曳光弹能通过实验各种事物并检查他们距离目标有多远来让你追踪目标</p></blockquote><h2 id="为了学习而制作原型"><a href="#为了学习而制作原型" class="headerlink" title="为了学习而制作原型"></a>为了学习而制作原型</h2><blockquote><p>Prototype to Learn</p><p>原型制作是一种学习经验. 其价值并不在于产生的代码, 而在于所学到的经验教训</p></blockquote><h2 id="靠近问题领域编程"><a href="#靠近问题领域编程" class="headerlink" title="靠近问题领域编程"></a>靠近问题领域编程</h2><blockquote><p>Program Close to the Program domain</p><p>用你的用户的语言进行设计和编码</p></blockquote><h2 id="估算-以避免发生意外"><a href="#估算-以避免发生意外" class="headerlink" title="估算, 以避免发生意外"></a>估算, 以避免发生意外</h2><blockquote><p>Estimate to Avoid Surprises</p><p>在着手之前进行估算. 你将提前发现潜在的问题</p></blockquote><h2 id="通过代码对比进行迭代"><a href="#通过代码对比进行迭代" class="headerlink" title="通过代码对比进行迭代"></a>通过代码对比进行迭代</h2><blockquote><p>Iterate the Schedule with the code</p><p>用你在进行实现时获得的经验提炼项目的时间标度</p></blockquote><h2 id="用纯文本保存知识"><a href="#用纯文本保存知识" class="headerlink" title="用纯文本保存知识"></a>用纯文本保存知识</h2><blockquote><p>Keep Knowledge in Plain Text</p><p>纯文本不会过时. 它能够帮助你有效利用你的工作, 并简化调试和测试</p></blockquote><p>恩,这就是我一直维护我博客的原因。</p><h2 id="利用命令行Shell的力量"><a href="#利用命令行Shell的力量" class="headerlink" title="利用命令行Shell的力量"></a>利用命令行Shell的力量</h2><blockquote><p>Use the Power of Command Shells</p><p>当图形用户界面无能为力时使用Shell</p></blockquote><h2 id="用好一种编辑器"><a href="#用好一种编辑器" class="headerlink" title="用好一种编辑器"></a>用好一种编辑器</h2><blockquote><p>Use a Single Editor Well</p><p>编辑器应该是你的手的延伸; 确保你的编辑器是可配置, 可拓展和可编程的</p></blockquote><h2 id="总是使用源码控制"><a href="#总是使用源码控制" class="headerlink" title="总是使用源码控制"></a>总是使用源码控制</h2><blockquote><p>Always Use Source Code Control</p><p>源码控制是你的工作时间机器——你能够回到过去</p></blockquote><p>了解Git的原理,熟悉基本的命令,适应不同的工作流。然后,选择一项跨平台的图形工具,eg:<a target="_blank" rel="noopener" href="https://www.sourcetreeapp.com/">sourcetree</a>。当开展个人项目,<code>git init</code>和<code>npm init</code>同样重要。</p><h2 id="要修正问题-而不是发出指责"><a href="#要修正问题-而不是发出指责" class="headerlink" title="要修正问题, 而不是发出指责"></a>要修正问题, 而不是发出指责</h2><blockquote><p>Fix the Problem, Not the Blame</p><p>bug是你的过错还是别人的过错, 并不是真的很有关系, 它仍旧是你的问题, 它仍然需要修正</p></blockquote><p>分析问题,寻找原因,尝试在工作流的方式避免它。允许他人犯错,健壮自己的代码。越是没有经验的人越容易从别人身上寻找原因。学会抗压,总结原因。当然,避免和那些多次反馈问题而又不愿意改正的人合作。假若不得不,那么,健壮自己的代码。</p><h2 id="不要恐慌"><a href="#不要恐慌" class="headerlink" title="不要恐慌"></a>不要恐慌</h2><blockquote><p>Don’t Panic When Debuging</p><p>做一次深呼吸, 思考什么可能是bug的原因</p></blockquote><p>绝大部分时候,恐慌不会让你更快修正代码,反而更容易让你得到错误的代码。恐慌会使你的神经敏感,脾气变差,进而降低团队的工作效率。</p><h2 id="“Select”-没有问题"><a href="#“Select”-没有问题" class="headerlink" title="“Select” 没有问题"></a>“Select” 没有问题</h2><blockquote><p>“Select” Isn’t Broken</p><p>在OS或编辑器, 甚至是第三方产品或库中很少发现bug. bug很可能在应用中</p></blockquote><h2 id="不要假定-要证明"><a href="#不要假定-要证明" class="headerlink" title="不要假定, 要证明"></a>不要假定, 要证明</h2><blockquote><p>Don’t Assume It - Prove It</p><p>在实际环境中——使用真正的数据和边界条件——证明你的假定</p></blockquote><h2 id="学习一种文本操纵语言"><a href="#学习一种文本操纵语言" class="headerlink" title="学习一种文本操纵语言"></a>学习一种文本操纵语言</h2><blockquote><p>Learn a Text Manipulation Language</p><p>你用每天的很大一部分时间处理文本, 为什么不让计算机替你完成部分工作呢?</p></blockquote><h2 id="编写能编写代码的代码"><a href="#编写能编写代码的代码" class="headerlink" title="编写能编写代码的代码"></a>编写能编写代码的代码</h2><blockquote><p>Write Code That Write Code</p><p>代码生成器能提高你的生产率, 并有助于避免重复</p></blockquote><h2 id="你不可能写出完美的软件"><a href="#你不可能写出完美的软件" class="headerlink" title="你不可能写出完美的软件"></a>你不可能写出完美的软件</h2><blockquote><p>You Can’t Write Perfect Software</p><p>软件不可能完美. 保护你的代码和用户, 使它(他)们免于能够预见的错误</p></blockquote><h2 id="通过合约进行设计"><a href="#通过合约进行设计" class="headerlink" title="通过合约进行设计"></a>通过合约进行设计</h2><blockquote><p>Design With Contracts</p><p>使用合约建立文档, 并检验代码所做的事情正好是它声明要做的</p></blockquote><h2 id="早崩溃"><a href="#早崩溃" class="headerlink" title="早崩溃"></a>早崩溃</h2><blockquote><p>Crash Early</p><p>死程序造成的危害通常比有问题的程序要小得多</p></blockquote><h2 id="用断言避免不可能发生的事情"><a href="#用断言避免不可能发生的事情" class="headerlink" title="用断言避免不可能发生的事情"></a>用断言避免不可能发生的事情</h2><blockquote><p>Use Assertions to Prevent the Impossible</p><p>断言验证你的各种假定. 在一个不确定的世界里, 用断言保护你的代码</p></blockquote><h2 id="将异常用于异常的问题"><a href="#将异常用于异常的问题" class="headerlink" title="将异常用于异常的问题"></a>将异常用于异常的问题</h2><blockquote><p>Use Exceptions for Exceptional Problems</p><p>异常可能会遭受经典的意大利面条式代码的所有可读性和可维护性问题的折磨. 将异常保留给异常的事物</p></blockquote><h2 id="要有始有终"><a href="#要有始有终" class="headerlink" title="要有始有终"></a>要有始有终</h2><blockquote><p>Finish What You Start</p><p>只要可能, 分配某资源的例程或对象也应该负责解除其分配</p></blockquote><h2 id="使模块之间的耦合减少至最少"><a href="#使模块之间的耦合减少至最少" class="headerlink" title="使模块之间的耦合减少至最少"></a>使模块之间的耦合减少至最少</h2><blockquote><p>Minimize Coupling Between Modules</p><p>通过编写”羞涩的”代码并应用莫忒儿法则来避免耦合</p></blockquote><h2 id="要配置-不要集成"><a href="#要配置-不要集成" class="headerlink" title="要配置, 不要集成"></a>要配置, 不要集成</h2><blockquote><p>Configure, Don’t Integrate</p></blockquote><h2 id="将抽象放进代码-细节放进元数据"><a href="#将抽象放进代码-细节放进元数据" class="headerlink" title="将抽象放进代码, 细节放进元数据"></a>将抽象放进代码, 细节放进元数据</h2><blockquote><p>Put Abstractions in Code, Details in Metadata</p><p>为一般情况编程, 将细节放在被编辑的代码库之外</p></blockquote><h2 id="分析工作流-以改善并发性"><a href="#分析工作流-以改善并发性" class="headerlink" title="分析工作流, 以改善并发性"></a>分析工作流, 以改善并发性</h2><blockquote><p>Analyze Workflow to Improve Concurrenc</p><p>利用你的用户的工作流的并发性</p></blockquote><h2 id="用服务进行设计"><a href="#用服务进行设计" class="headerlink" title="用服务进行设计"></a>用服务进行设计</h2><blockquote><p>Design Using Services</p><p>根据服务——独立的, 在良好定义, 一致的接口之后的并发对象——进行设计</p></blockquote><h2 id="总是为并发进行设计"><a href="#总是为并发进行设计" class="headerlink" title="总是为并发进行设计"></a>总是为并发进行设计</h2><blockquote><p>Alaways Design for Concurrency</p><p>容许并发, 你将会设计出更整洁, 具有更少假定的接口</p></blockquote><h2 id="使视图与模型分离"><a href="#使视图与模型分离" class="headerlink" title="使视图与模型分离"></a>使视图与模型分离</h2><blockquote><p>Separate Views from Models</p><p>要根据模型和视图设计你的应用, 从而以低廉的代码获取灵活性</p></blockquote><h2 id="用黑板协调工作流"><a href="#用黑板协调工作流" class="headerlink" title="用黑板协调工作流"></a>用黑板协调工作流</h2><blockquote><p>Use Blackboards to Coordinate Workflow</p><p>用黑板协调完全不同的事实和因素, 同时又使各参与方保持独立和隔离</p></blockquote><h2 id="不要靠巧合编程"><a href="#不要靠巧合编程" class="headerlink" title="不要靠巧合编程"></a>不要靠巧合编程</h2><blockquote><p>Don’t Porgram By Coincidencs</p><p>只依靠可靠的事物. 注意偶发的复杂性, 不要把幸运的巧合与有目的的计划混为一谈</p></blockquote><h2 id="估算你的算法的阶"><a href="#估算你的算法的阶" class="headerlink" title="估算你的算法的阶"></a>估算你的算法的阶</h2><blockquote><p>Estimate the Order of Your Algorithms</p><p>在你编写代码之前, 先大致估算事物需要多长时间</p></blockquote><h2 id="测试你的估算"><a href="#测试你的估算" class="headerlink" title="测试你的估算"></a>测试你的估算</h2><blockquote><p>Test Your Estimates</p><p>对算法的数学分析并不会告诉你每一件事情. 在你的代码的目标环境中测试它的速度</p></blockquote><h2 id="早重构-常重构"><a href="#早重构-常重构" class="headerlink" title="早重构, 常重构"></a>早重构, 常重构</h2><blockquote><p>Refactor Early, Refactor Often</p><p>就和你会在花园里除草, 并重新布置一样, 在需要时对代码进行重写, 重做和重新架构. 要铲除问题的根源</p></blockquote><p>过多的重构反而容易导致无法追赶需求的进度。掌握合适的重构时机,必不可少,代码改动频繁,或BUG频出,或灵感迸发,想到了绝妙的实现手段,在理解了前因后果后,重构吧。</p><p>不及时重构的后果,可能是下次重构的难度比多次“除草”的难度总和还要大,因为可能你已经在杂草上盖上了狗窝,除草会让狗窝坍塌,导致了进退两难的地步。</p><h2 id="为测试而设计"><a href="#为测试而设计" class="headerlink" title="为测试而设计"></a>为测试而设计</h2><blockquote><p>Design to Test</p><p>在你还没有编写代码时就开始思考测试问题</p></blockquote><h2 id="测试你的软件-否则你的用户就得测试"><a href="#测试你的软件-否则你的用户就得测试" class="headerlink" title="测试你的软件, 否则你的用户就得测试"></a>测试你的软件, 否则你的用户就得测试</h2><blockquote><p>Test Your Software, or Your Users Will</p><p>无情地测试. 不要让你的用户为你查找bug</p></blockquote><h2 id="不要使用你不理解的导向代码"><a href="#不要使用你不理解的导向代码" class="headerlink" title="不要使用你不理解的导向代码"></a>不要使用你不理解的导向代码</h2><blockquote><p>Don’t Use Wizard Code You Don’t Understand</p><p>向导可以生成大量代码. 在你把它们合并进你的项目之前, 确保你理解全部这些代码</p></blockquote><h2 id="不要搜索需求-—-挖掘它们"><a href="#不要搜索需求-—-挖掘它们" class="headerlink" title="不要搜索需求 — 挖掘它们"></a>不要搜索需求 — 挖掘它们</h2><blockquote><p>Don’t Gather Requirements - Dig for Them</p><p>需求很少存在于表面上. 它们深深地埋藏在层层假定, 误解和政治手段的下面</p></blockquote><h2 id="与用户一同工作-以像用户一样思考"><a href="#与用户一同工作-以像用户一样思考" class="headerlink" title="与用户一同工作, 以像用户一样思考"></a>与用户一同工作, 以像用户一样思考</h2><blockquote><p>Work with a User to Thing Like a User</p><p>要了解系统实际上将如何被使用, 这是最好的方法</p></blockquote><h2 id="抽象比细节获得更长久"><a href="#抽象比细节获得更长久" class="headerlink" title="抽象比细节获得更长久"></a>抽象比细节获得更长久</h2><blockquote><p>Abstractions Live Longer than Details</p><p>“投资”于抽象, 而不是实现. 抽象能在来自不同的实现和新技术的变化的”攻击”之下存活下去</p></blockquote><h2 id="使用项目词汇表"><a href="#使用项目词汇表" class="headerlink" title="使用项目词汇表"></a>使用项目词汇表</h2><blockquote><p>Use a Project Glossary</p><p>创建并维护项目中使用的专业术语和词汇的单一信息源</p></blockquote><h2 id="不要在盒子外面思考-—-要找到盒子"><a href="#不要在盒子外面思考-—-要找到盒子" class="headerlink" title="不要在盒子外面思考 — 要找到盒子"></a>不要在盒子外面思考 — 要找到盒子</h2><blockquote><p>Don’t Think Outside the Box - Find the Box</p><p>在遇到不可能解决的问题时, 要确定真正的约束. 问问你自己: “它必须以这种方式完成吗?它真的必须完成吗?</p></blockquote><h2 id="等你准备好再开始"><a href="#等你准备好再开始" class="headerlink" title="等你准备好再开始"></a>等你准备好再开始</h2><blockquote><p>Start When You’re Ready</p><p>你的一生都在积累经验. 不要忽视反复出现的疑虑</p></blockquote><h2 id="对有些事情”做”胜于”描述"><a href="#对有些事情”做”胜于”描述" class="headerlink" title="对有些事情”做”胜于”描述"></a>对有些事情”做”胜于”描述</h2><blockquote><p>Some Things Are Better Done than Described</p><p>不要掉进规范的螺旋——在某个时刻, 你需要开始编码</p></blockquote><h2 id="不要形式方法的奴隶"><a href="#不要形式方法的奴隶" class="headerlink" title="不要形式方法的奴隶"></a>不要形式方法的奴隶</h2><blockquote><p>Don’t Be a Slave to Formal Methods</p><p>如果你没有把某项技术放进你的开发实践和能力的语境中, 不要盲目地采用它</p></blockquote><h2 id="昂贵的工具不一定能制作出更好的设计"><a href="#昂贵的工具不一定能制作出更好的设计" class="headerlink" title="昂贵的工具不一定能制作出更好的设计"></a>昂贵的工具不一定能制作出更好的设计</h2><blockquote><p>Costly Tools Don’t Produce Better Designs</p><p>小心供应商的炒作, 行业教条, 以及价格标签的诱惑. 要根据工具的价值判断它们</p></blockquote><h2 id="围绕功能组织团队"><a href="#围绕功能组织团队" class="headerlink" title="围绕功能组织团队"></a>围绕功能组织团队</h2><blockquote><p>Organize Teams Around Functionality</p><p>不要把设计师和编码员分开, 也不要把测试员与数据建模员分开. 按照你构建代码的方式构建团队</p></blockquote><h2 id="不要使用手工流程"><a href="#不要使用手工流程" class="headerlink" title="不要使用手工流程"></a>不要使用手工流程</h2><blockquote><p>Don’t Use Manual Procedures</p><p>shell 脚本或批文件会一次次地以同一顺序执行同样的指令</p></blockquote><h2 id="早测试-常测试-自动测试"><a href="#早测试-常测试-自动测试" class="headerlink" title="早测试, 常测试, 自动测试"></a>早测试, 常测试, 自动测试</h2><blockquote><p>Test Early. Test Often. Test Automatically</p><p>与呆在书架上的测试计划相比, 每次构建时运行的测试要有效得多</p></blockquote><h2 id="要到通过全部测试-编码才算完成"><a href="#要到通过全部测试-编码才算完成" class="headerlink" title="要到通过全部测试, 编码才算完成"></a>要到通过全部测试, 编码才算完成</h2><blockquote><p>Coding Ain’t Done, ‘Til All the Test Run’</p><p>就是这样</p></blockquote><h2 id="通过”蓄意破坏”测试你的测试"><a href="#通过”蓄意破坏”测试你的测试" class="headerlink" title="通过”蓄意破坏”测试你的测试"></a>通过”蓄意破坏”测试你的测试</h2><blockquote><p>Use Saboteurs to Your Testing</p><p>在单独的软件副本上故意引入bug, 以检验测试能够抓住它们</p></blockquote><h2 id="测试状态覆盖-而不是代码覆盖"><a href="#测试状态覆盖-而不是代码覆盖" class="headerlink" title="测试状态覆盖, 而不是代码覆盖"></a>测试状态覆盖, 而不是代码覆盖</h2><blockquote><p>Test State Coverage, Not Code Coverage</p><p>确定并测试重要的程序状态</p></blockquote><h2 id="一个bug只抓一次"><a href="#一个bug只抓一次" class="headerlink" title="一个bug只抓一次"></a>一个bug只抓一次</h2><blockquote><p>Find Bugs Once</p><p>一旦测试人员找到一个bug, 这应该是测试员最后一次找到它. 此后自动测试应该对其进行检查</p></blockquote><p>视图的BUG,很难只抓一次,因为变动太频繁了!!</p><p>开发者在测试人员发现了三次类似的BUG后,将这个BUG加入自测的用例中。</p><p>越早发现BUG,需要更正的耗费越少。</p><p>公共函数或组件,在条件允许的情况下,用自动测试对其进行检查。多次出现非视图的BUG,那么无论如何,该写自动化测试用例了。</p><h2 id="英语就是一种编程语言"><a href="#英语就是一种编程语言" class="headerlink" title="英语就是一种编程语言"></a>英语就是一种编程语言</h2><blockquote><p>English is Just a Programming Language</p><p>像你编写代码一样编写文档: 遵守DRY原则, 使用元数据, MVC, 自动生成, 等等</p></blockquote><h2 id="把文档建在里面-不要在外面"><a href="#把文档建在里面-不要在外面" class="headerlink" title="把文档建在里面, 不要在外面"></a>把文档建在里面, 不要在外面</h2><blockquote><p>Build Documentation In, Don’t Bolt It On</p><p>与代码分离的文档不太可能被修正和更新</p></blockquote><h2 id="温和地超出用户的期望"><a href="#温和地超出用户的期望" class="headerlink" title="温和地超出用户的期望"></a>温和地超出用户的期望</h2><blockquote><p>Gently Exceed Your Users’ Expectations</p><p>要理解你的用户的期望, 然后给他们的东西要多那么一点</p></blockquote><h2 id="在你的作品上签名"><a href="#在你的作品上签名" class="headerlink" title="在你的作品上签名"></a>在你的作品上签名</h2><blockquote><p>Sign Your Work</p><p>过去时代的手艺人能为他们的作品签名而自豪. 你也应该如此</p></blockquote><p>就代码而言,已经不需要在顶部写上你的名字了。这除了多一行尴尬无用的注释外,我没发现额外的作用。版本工具会帮你签名的,当然,你首先得用版本工具,如Git。</p><p>在团队工作中,除非有团队文化,或保密要求,最好用你真实的完整的名字,不要用那些乱七八糟的名字,没人关心你的外文名是jack还是joker。</p><p>就作品而言,恩,你当然要自豪地告诉别人,这是我的作品了。</p></div></div></div><div class="more section"><div class="pre"><a class="article-link" href="/learn_ycsb.html"><i class="iconfont icon-right"></i> <span>Yahoo! Cloud Serving Benchmark</span></a></div><div class="next"><a class="article-link" href="/article.html">前端文章不定期收录 <i class="iconfont icon-right"></i></a></div></div></main></body><footer class="section fullscreen"><div class="footer-desc">Edeink © 2015-2022 · Powered by Hexo</div></footer><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script><script src="/public/js/init.js"></script></html>