杭州网站建设很 棒,wordpress wp posts,淘宝客需要自己做网站吗,网站建设有什么岗位职责大家好#xff0c;
这一个月时间#xff0c;阿里巴巴、滴滴、腾讯都发生过应用线上故障的事情#xff0c;很多同学说是降本增“笑”的后果然后圈内流传一个新想法#xff0c;为了避免“开源节流” 的事情#xff0c;工作中要写一些防御性的代码。 什么意思#xff1f;就…大家好
这一个月时间阿里巴巴、滴滴、腾讯都发生过应用线上故障的事情很多同学说是降本增“笑”的后果然后圈内流传一个新想法为了避免“开源节流” 的事情工作中要写一些防御性的代码。 什么意思就是写一下难以让其他同事的维护的代码这个项目没你就搞不了防止自己被裁。
看过一篇专门讲 “防御性编程” 的好文章是一位国外大佬写的由 coderLMN 翻译。讲了很多 “写出无法维护的代码” 的方法。我将原文翻译版的部分内容分享给各位。 原文https://coderlmn.github.io/frontEndCourse/unmaintainable.html 大家看个乐就好最好还是别轻易实践起码别说是看了我的文章。
如何编写无法维护的代码 让自己稳拿铁饭碗 – Roedy Green 永远不要把自己遇到的问题归因于他人的恶意这恰恰说明了你自己的无能。 – 拿破仑 为了造福大众在Java编程领域创造就业机会兄弟我在此传授大师们的秘籍。
这些大师写的代码极其难以维护后继者就是想对它做最简单的修改都需要花上数年时间。
而且如果你能对照秘籍潜心修炼你甚至可以给自己弄个铁饭碗因为除了你之外没人能维护你写的代码。
再而且如果你能练就秘籍中的 全部 招式那么连你自己都无法维护你的代码了
你不想练功过度走火入魔吧。那就不要让你的代码 一眼看去 就完全无法维护只要它 实质上是 那样就行了。否则你的代码就有被重写或重构的风险
总体原则
想挫败维护代码的程序员你必须先明白他的思维方式。他接手了你的庞大程序没有时间把它全部读一遍更别说理解它了。他无非是想快速找到修改代码的位置、改代码、编译然后就能交差并希望他的修改不会出现意外的副作用。
他查看你的代码不过是管中窥豹一次只能看到一小段而已。你要确保他永远看不到全貌。要尽量和让他难以找到他想找的代码。但更重要的是要让他不能有把握 忽略 任何东西。
程序员都被编程惯例洗脑了还为此自鸣得意。每一次你处心积虑地违背编程惯例都会迫使他必须用放大镜去仔细阅读你的每一行代码。
你可能会觉得每个语言特性都可以用来让代码难以维护其实不然。你必须精心地误用它们才行。
命名
编写无法维护代码的技巧的重中之重是变量和方法命名的艺术。如何命名是和编译器无关的。这就让你有巨大的自由度去利用它们迷惑维护代码的程序员。
妙用宝宝起名大全
买本宝宝起名大全你就永远不缺变量名了。比如 Fred 就是个好名字而且键盘输入它也省事。如果你就想找一些容易输入的变量名可以试试 adsf 或者 aoeu 之类。
单字母变量名
如果你给变量起名为 a, b, c用简单的文本编辑器就没法搜索它们的引用。而且没人能猜到它们的含义。
首字母大写的缩写
用首字母大写缩写比如 GNU 代表 GNU’s Not Unix) 使代码简洁难懂。真正的汉子 (无论男女) 从来不说明这种缩写的含义他们生下来就懂。
重用命名
在语言规则允许的地方尽量把类、构造器、方法、成员变量、参数和局部变量都命名成一样。更高级的技巧是在 {} 块中重用局部变量。这样做的目的是迫使维护代码的程序员认真检查每个示例的范围。特别是在 Java 代码中可以把普通方法伪装成构造器。
使用非英语字母
在命名中偷偷使用不易察觉的非英语字母例如 typedef struct { int i; } ínt; 。
看上去没啥不对是吧嘿嘿嘿…这里的第二个 ínt 的 í 实际上是东北欧字母并不是英语中的 i 。在简单的文本编辑器里想看出这一点点区别几乎是不可能的。
下划线一位真正的朋友
可以拿 _ 和 __ 作为标示符。
扩展 ASCII 字符
扩展 ASCII 字符用于变量命名是完全合法的包括 ß, Ð, 和 ñ 等。在简单的文本编辑器里除了拷贝/粘贴基本上没法输入。
其他语言的命名
使用外语字典作为变量名的来源。例如可以用德语单词 punkt 代替 point。除非维护代码的程序员也像你一样熟练掌握了德语. 不然他就只能尽情地在代码中享受异域风情了。
伪装 当一个bug需要越长的时间才会暴露它就越难被发现。 – Roedy Green本文作者 编写无法维护代码的另一大秘诀就是伪装的艺术即隐藏它或者让它看起来像其他东西。很多招式有赖于这样一个事实编译器比肉眼或文本编辑器更有分辨能力。下面是一些伪装的最佳招式。
把代码伪装成注释反之亦然
下面包括了一些被注释掉的代码但是一眼看去却像是正常代码。
图片
如果不是用绿色标出来你能注意到这三行代码被注释掉了么
用连接符隐藏变量
对于下面的定义
#define local_var xy_z可以把 “xy_z” 打散到两行里
#define local_var xy\
_z // local_var OK这样全局搜索 xy_z 的操作在这个文件里就一无所获了。对于 C 预处理器来说第一行最后的 “” 表示继续拼接下一行的内容。
文档 任何傻瓜都能说真话而要把谎编圆则需要相当的智慧。-- Samuel Butler (1835 - 1902) 不正确的文档往往比没有文档还糟糕。-- Bertrand Meyer 既然计算机是忽略注释和文档的你就可以在里边堂而皇之地编织弥天大谎让可怜的维护代码的程序员彻底迷失。
在注释中撒谎
实际上你不需要主动地撒谎只要没有及时保持注释和代码更新的一致性就可以了。
只记录显而易见的东西
往代码里掺进去类似于 /* 给 i 加 1 */ 这样的注释但是永远不要记录包或者方法的整体设计这样的干货。
记录 How 而不是 Why
只解释一个程序功能的细节而不是它要完成的任务是什么。
这样的话如果出现了一个bug修复者就搞不清这里的代码应有的功能。
该写的别写
比如你在开发一套航班预定系统那就要精心设计让它在增加另一个航空公司的时候至少有25处代码需要修改。
永远不要在文档里说明要修改的位置。后来的开发人员要想修改你的代码门都没有除非他们能把每一行代码都读懂。
计量单位
永远不要在文档中说明任何变量、输入、输出或参数的计量单位如英尺、米、加仑等。
计量单位对数豆子不是太重要但在工程领域就相当重要了。同理永远不要说明任何转换常量的计量单位或者是它的取值如何获得。
要想让代码更乱的话你还可以在注释里写上错误的计量单位这是赤裸裸的欺骗但是非常有效。
如果你想做一个恶贯满盈的人不妨自己发明一套计量单位用自己或某个小人物的名字命名这套计量单位但不要给出定义。万一有人挑刺儿你就告诉他们你这么做是为了把浮点数运算凑成整数运算而进行的转换。
坑
永远不要记录代码中的坑。如果你怀疑某个类里可能有bug天知地知你知就好。如果你想到了重构或重写代码的思路看在老天爷的份上千万别写出来。
切记电影《小鹿斑比》里那句台词 “如果你不能说好听的话那就什么也不要说。”。万一这段代码的原作者看到你的注释怎么办万一老板看到了怎么办万一客户看到了怎么办搞不好最后你自己被解雇了。
一句”这里需要修改“的匿名注释就好多了尤其是当看不清这句注释指的是哪里需要修改的情况下。
切记难得糊涂四个字这样大家都不会感觉受到了批评。
说明变量
永远不要 对变量声明加注释。有关变量使用的方式、边界值、合法值、小数点后的位数、计量单位、显示格式、数据录入规则等等后继者完全可以自己从程序代码中去理解和整理嘛。
如果老板强迫你写注释就把方法体代码混进去但绝对不要对变量声明写注释即使是临时变量
在注释里挑拨离间
为了阻挠任何雇佣外部维护承包商的倾向可以在代码中散布针对其他同行软件公司的攻击和抹黑特别是可能接替你工作的其中任何一家。例如
图片
可能的话除了注释之外这些攻击抹黑的内容也要掺到代码里的重要部分这样如果管理层想清理掉这些攻击性的言论然后发给外部承包商去维护就会破坏代码结构。
程序设计 编写无法维护代码的基本规则就是在尽可能多的地方以尽可能多的方式表述每一个事实。 – Roedy Green 编写可维护代码的关键因素是只在一个地方表述应用里的一个事实。
如果你的想法变了你也只在一个地方修改这样就能保证整个程序正常工作。所以编写无法维护代码的关键因素就是反复地表述同一个事实在尽可能多的地方以尽可能多的方式进行。
令人高兴的是像Java这样的语言让编写这种无法维护代码变得非常容易。
例如改变一个被引用很多的变量的类型几乎是不可能的因为所有造型和转换功能都会出错而且关联的临时变量的类型也不合适了。
而且如果变量值要在屏幕上显示那么所有相关的显示和数据录入代码都必须一一找到并手工进行修改。类似的还有很多比如由 C 和 Java 组成的 Algol 语言系列Abundance甚至Smalltalk对于数组等结构的处理都是大有可为的。
永远不做校验
永远不要对输入数据做任何的正确性或差异性检查。
这样能表现你对公司设备的绝对信任以及你是一位信任所有项目伙伴和系统管理员的团队合作者。
总是返回合理的值即使数据输入有问题或者错误。
有礼貌无断言
避免使用 assert() 机制因为它可能把三天的debug盛宴变成10分钟的快餐。
避免封装
为了提高效率不要使用封装。
方法的调用者需要所有能得到的外部信息以便了解方法的内部是如何工作的。
复制粘贴修改
以效率的名义使用 复制粘贴修改。
这样比写成小型可复用模块效率高得多。在用代码行数衡量你的进度的小作坊里这招尤其管用。
使用静态数组
如果一个库里的模块需要一个数组来存放图片就定义一个静态数组。
没人会有比512 X 512 更大的图片所以固定大小的数组就可以了。为了最佳精度就把它定义成 double 类型的数组。
傻瓜接口
编写一个名为 “WrittenByMe” 之类的空接口然后让你的所有类都实现它。然后给所有你用到的Java 内置类编写包装类。
这里的思想是确保你程序里的每个对象都实现这个接口。最后编写所有的方法让它们的参数和返回类型都是这个 WrittenByMe。这样就几乎不可能搞清楚某个方法的功能是什么并且所有类型都需要好玩的造型方法。
更出格的玩法是让每个团队成员编写它们自己的接口(例如 WrittenByJoe)程序员用到的任何类都要实现他自己的接口。这样你就可以在大量无意义接口中随便找一个来引用对象了。
好事成堆TM
狂野地使用封装和OO思想。例如 这段很可能看起来不怎么好笑。别担心只是时候未到而已。 就分享到这里了。
很难想象作者是被同事折磨了多久才能写出这份教程。。
你学废了么
关于Python学习指南
学好 Python 不论是就业还是做副业赚钱都不错但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料给那些想学习 Python 的小伙伴们一点帮助
包括Python激活码安装包、Python web开发Python爬虫Python数据分析人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python
Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理形成各个领域的知识点汇总它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。全套教程文末领取 Python学习视频600合集
观看零基础学习视频看视频学习是最快捷也是最有效果的方式跟着视频中老师的思路从基础到深入还是很容易入门的。 温馨提示篇幅有限已打包文件夹获取方式在文末
Python70个实战练手案例源码
光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。 Python大厂面试资料
我们学习Python必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有阿里大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。 Python副业兼职路线方法
学好 Python 不论是就业还是做副业赚钱都不错但要学会兼职接单还是要有一个学习规划。 这份完整版的Python全套学习资料已经上传朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费】