无锡宏腾网站建设,wordpress文章大纲插件,做网站一年的维护费用是多少,自助建站免费建站平台文章目录 前言七、代码工具7.1 在意工具7.2 了解工具7.3 选择工具 八、代码测试8.1 Why/Who/What/When/How8.2 测试类型8.3 测试原则 九、代码bug调试9.1 bug种类9.2 调试解决bug9.3 搜寻bug9.4 修正bug 十、代码构建10.1 编程语言10.2 构建系统 十一、代码优化11.1 优化是什么… 文章目录 前言七、代码工具7.1 在意工具7.2 了解工具7.3 选择工具 八、代码测试8.1 Why/Who/What/When/How8.2 测试类型8.3 测试原则 九、代码bug调试9.1 bug种类9.2 调试解决bug9.3 搜寻bug9.4 修正bug 十、代码构建10.1 编程语言10.2 构建系统 十一、代码优化11.1 优化是什么11.2 什么导致优化11.3 为什么不进行优化11.4 为什么进行优化11.5 优化的技术 十二、代码安全12.1 危险12.2 敌人12.3 脆弱的代码12.4 防范 参考 前言
最近读了《编程匠艺》这本书它是由美国作者 Pete Goodliffe 编写的它不仅是一本学习指南更是一本激发编程激情的读物展示了一种追求卓越的编程态度。
在我看来它带来不仅仅是技术上的提升更好地掌握编程技巧、提高自己的开发效率和质量更重要的是对编程的思考和理解。
书中一共分24个章节下面是读书笔记个人理解一共分4篇博文发布每篇6章当前是 07章-12章。
七、代码工具
7.1 在意工具
没有一套核心的软件工具就不可能创建程序没有编辑器或者编译器将寸步难行尽可能全面了解常用工具使用工具可以提高效率但是可能需要花费时间来学习它取舍在自己当且仅当让自己生活更轻松的时候使用它们
7.2 了解工具
首先需要了解手头有哪些工具知道在哪可以获得工具即使你现在不需要它们匀出一段时间来磨炼使用工具的技巧这一点很重要将合适的工具放在合适的任务上不要杀鸡用牛刀
7.3 选择工具
现代工具有很多IDE 将很多工具都整合在一起 源代码编辑器VS Code, Sublime, 记事本, vim, Emacs, Jetbrains全家桶 文本处理工具linux 上 文本三剑客grep/awk/sed 版本控制工具git和svn最常见 源代码生成yacc/bison 编译原理相关语法分析器生成合适的c/c语言 源代码美化工具现代 IDE 一般都会有这个功能 编译器注意版本选择合适的 链接器针对 c/c 构建工具c和c最常用makejava可以使用maven和gradle 测试工具链java常用的测试工具就是Junit 调试器一般IDE都会有调试功能c/c有gdb命令行调试器 分析器java有jconsole,Arthas 代码校验器lint, java中IDEA也有插件有此功能 度量工具java Designite 反汇编程序Java IDEA有Jad 缺陷跟踪/项目管理gitlab禅道等项目管理程序
八、代码测试
编写的代码越多编写的越快bug也会越多对此采取的方法就是测试发布任何未经测试的代码注定失败。研究表明即使经过最细致测试的软件每1000行代码也会包含0.5-3个错误
8.1 Why/Who/What/When/How
测试帮助找出bug并修复它。测试只能证明有bug而不能证明没有bug。程序员有责任为自己编写的代码进行测试不要指望其他人来完成测试给代码中的函数数据结构类进行测试在编写代码的同时进行测试越早越好甚至可以在写代码前就编写好测试(面向测试编程)为每个发现的bug都编写一个测试尽可能多的进行测试
8.2 测试类型
单元测试java中一般是对单个函数进行测试组件测试单元测试的下一步测试多个单元组成后的行为集成测试系统多个组件之间组合测试回归测试当发现bug修复后就要进行回归测试防止引入新的bug负载测试确保代码如预期处理大量的输入数据可以发觉与系统效率相关问题压力测试很短时间代码处理大量输入数据适用于高可用系统用于确定软件的容量疲劳测试在较高的负载下长时间运行,观测性能变化可以检测出其他测试发现不了的bug如内存泄露可用性测试将软件放在现实世界环境中看看用户觉得怎么样黑盒测试又称为功能测试测试者看不到代码是如何执行的像个黑盒子只执行前置预期操作监督输出数据或者操作是否预期白盒测试白盒测试者能看到每行代码知道所有逻辑需要清楚每个分支作用工作量比黑盒测试多多了需要一些工具来计算测试覆盖率否则白盒测试让人发疯
8.3 测试原则
尽可能让代码测试自动进行Java使用maven 的过程中就有自动进行测试的流程尽量设计代码便于测试限制代码复杂度不要写死与系统其它部分的连接不要依赖全局变量结构化单元测试由三部分组成given(准备数据)- when(执行)-then(验证结果)
九、代码bug调试
bug 是软件构建的黑暗面代码都是由人编写的而人是会犯错的我们都应该为错误承担责任。
如果问心有愧有两种方法处理它一种是推诿责任这也是一种方便的编程工具你可以不管它认定这不是bug而是feature另一种就是找出来源并修复好。
9.1 bug种类 从远处看 编译失败 编译器能够告诉你哪错了老鸟程序员能够轻松解决这种问题而菜鸟则需要时间的沉淀运行时崩溃非预期行为 这个是最难的程序展现错误的行为可能是代码缺陷或者模块集成错误出现的 从近处看 句法错误 虽然可以通过编译但是不是预期的例如下面代码例子语法是完全没问题的但是多了个分号导致永远会执行{}内的语句 if (a); {return 1;
}构建错误 c/c项目使用makefile 构建软件java可以用maven注意版本和依赖 语义bug 段错误 c/c 指针访问那些未分配的内存内存溢出内存泄漏 忘记释放内存内存耗尽数学错误程序暂停 代码存在无限循环或死锁等待等等
9.2 调试解决bug
黄金法则多动脑筋了解准备调试的代码不能指望在不了解的代码中找到bug难易程度取决于对环境的掌控能力。不可能在线上调试代码但是在测试环境复现取决于专业程度不要信任任何人的代码从排除最不可能的原因开始
9.3 搜寻bug
编译时错误 这种比较好处理可能有很多条错误报出你需要找到最先报告的那条这是最有用的运行时错误 这种很可能是代码中某个你认为的条件并不成立你需要一步步找到这个地方 确定bug 在bug追踪系统中记录这个 bug ( gitlab 中可以提个 issue )写明错误的特征全面地描述下问题还可以在 git 上找到最近可以正常运行的版本比较代码方便更快找出错误使 bug 再现记录哪些步骤可以复现 bug定位 bug 通过修改部分代码再运行看看 bug 是否消失这是很不成熟的做法二分查找假设故障出现在1个20行代码的函数中先在第10行位置打断点判断预期如果有则接着找前10行二分否则后10行二分重复如此 理解问题找到bug原因时需要彻底研究并证明你是正确的创建测试编写测试证明故障已修复修正bug掌握了前两个步骤修复就很容易了证明确实修改好了bug只有证明解决好bug才算完成如果没修好向他人求助叙述下整个过程也许会发现隐藏的某些关键点他人的意见也许对你有帮助
9.4 修正bug
修复bug时要十分小心不要冒修改时破坏其它带代码的风险减少CV不了解的代码会不经意间复制过来bug修复bug后要检查其它地方是否出现同样的问题
十、代码构建
代码构建很常见在IDE中自带build功能很多开发人员都依赖于IDE自带的构建体系这样的构建过程往往只需要一个按钮就好没有真正地掌握构建过程作为老鸟程序员需要了解幕后发生的事情。
10.1 编程语言
解释性语言javascript,python等通过解释器执行一般速度比编译型慢编译型语言c/c等将源代码转化为目标平台执行的机器指令需要经过编译、链接等操作字节编译型语言Java/C#等先 生成字节码再在虚拟机中执行
10.2 构建系统
单个文件的编译和运行很简单多个模块编译链接需要脚本来控制顺序更改了代码需要重新编译c语言可以通过make来实现构建系统这是c/c开发者必须掌握的java 构建系统老牌是maven现在gradle也如日中天推荐两者都要学习掌握构建系统很重要否则别人的代码或者发布在github上的源码你都不知道怎么编译
十一、代码优化
11.1 优化是什么
软件优化可能在实际中表现下面含义
程序执行速度加快减少可执行文件大小提高代码质量提高计算结果准确性减少启动时间增加数据的吞吐量减少存储开销
不优化就是最好的优化但那需要你从一开始就要考虑程序的性能而优化的前提就是不要破坏代码的正确性
11.2 什么导致优化
复杂性导致代码运行越来越慢间接设计一个中间层可以解决很多问题但是也会导致大量缓慢的代码重复重复计算浪费宝贵的时间糟糕的设计可能导致最基本、最细微、和最难解决的性能问题I/O总是等待输入输出的程序性能总是糟糕的
11.3 为什么不进行优化
历史上早期的计算机性能不高需要优化才能在合理时间内完成任务现在算力暴涨优化看起来不重要为了得到更快的代码肯定在其他方面有所损害如可读性、复杂性增加、维护/扩展、引入冲突、时间精力可选择备选方案更快的机器、寻找合适硬件、重新配置目标后台异步运行缓慢的代码、处理会影响用户感知的接口、试用新版本编译器
11.4 为什么进行优化
游戏领域需要逼真的图形更快的反馈需要良好优化的代码DSP对大量的数据执行快速数字滤波对效率有很高要求需要优化代码嵌入式设备往往没有充足的硬件让你获取合理的性能需要对代码精雕细琢实时系统金融计算、科学研究的数值计算需要较高的性能如无必要避免优化
11.5 优化的技术 设计更改 添加缓存或缓冲层运用池化思想类似线程池、数据库连接池为速度牺牲精确度只要你不被抓到减少浮点数的精度是个例子更改数据的存储模式或在磁盘表示例如JDK9中String用byte[]而之前用char[]并行和线程是优化的主站前线如果能节省代码空间。可以放弃特定的语言功能移除不必要的代码为了获得更快的速度牺牲一些设计质量。例如减少中间层增加耦合选择合适的数据结构和算法 代码更改 循环展开代码内嵌 inline常量叠算移到编译时强度折减 使用等价速度更快的操作如x/4 x2子表达式 公共子表达式可避免重复计算无用代码删除 容易接受的优化 重复调用一个较慢的函数不要频繁调用它缓存结果可能会导致不清晰但更快将函数在另一种语言实现。如Java中可通过JNI调用C/C代码将工作推迟到必须做时在做对函数检查以避免多余的工作将不变的计算移到循环体外为复杂的计算使用查找表用空间换时间利用异或中的短路不要重复进行相同的工作生成在运算之前才解压缩其代码的压缩的可执行文件尽量减少在远程计算机执行函数或访问网络的函数依赖了解目标部署和程序预期的运行方式编写模块化的代码
十二、代码安全
12.1 危险 攻击你的系统的人一般想要从系统中得到些什么针对这些资源需要保护好它们 如果黑客通过社工获取到系统的权限这是代码所不能防御的 有缺陷的输入会被利用获取整个机器的访问权限 在公网上运行不安全的系统会向整个世界打开 通过特定漏洞获取root权限 信息未加密会被截获以明码存储数据甚至内存中 忘记注销简单的密码社工过时软件 任意的权限 病毒
12.2 敌人
攻击者可能是 普通的窃贼、能干的骇客、脚本小子、欺骗公司不忠诚的员工、被不公平解雇愤怒的离职员工无处不在的互联网攻击可能来自各个时间各个地方动机各有不同也许是恶意的或者好奇投机取巧
12.3 脆弱的代码
不安全的设计及体系结构缓冲溢出嵌入查询字符串竞争状态整数溢出
12.4 防范
系统安装技术 即使你的代码再安全但是所在系统不安全也会受到攻击。 在计算机只运行授信的软件运用防火墙等技术记录所有操作减少进入系统途径正确设置系统如果可以安装“蜜罐” 软件设计技术 限制设计中的输入数量尽可能低权限运行程序避免开发不需要的功能不要依赖不可靠的库代码适应可以管理安全的环境避免存储敏感数据从用户获取机密数据要小心不要显示密码 代码实现技术 防御性编程执行安全审核产生子进程要非常谨慎严格执行测试和调试所有操作都打包到原子事务中
参考
编程匠艺
相关文章: