论程序员的自我修炼

摘要:软件开发是个挑战,尤其是对于那些完美主义的程序员。为了想要成为更好的程序员,总会开发出一些特别的功能,在软件设计上想要做到零瑕疵,但事实上,完美的软件设计是根本不存在的,试着让你的软件“足够好”就好!

软件开发是个挑战,尤其是对于那些完美主义的程序员。他们需要制定大量的决策以及许多问题的解决方案,这对于有些人来说会感到很难。当然,你可以在线搜索到最佳实践方案或在StackOverflow上提问。但即便你找到了想要的答案,也未必能让你感到满意。你怀疑这个设计是否完美,事实上,真正完美的设计几乎为零。

设计难题接踵而来

想彻底解决设计难题是不可能的。这是因为每个需求都会浮现在你的脑海里,你会遇到设计领域里最大的挑战,比如选择数据还是表示层。我是使用MVC还是MVVM?哪种OPM工具适合我?我该如何处理多个数据库?等等。每个问题都会让你不知所措,并且所遇到的设计问题也在日益增长。每走一步都会使你觉得像是有座大山摆在你的面前。不堪负重的感觉让你想要逃避或者拖延解决问题的时间。但拖延并不能解决问题。

解决类似这样的问题最好的办法就是(Divide & Conquer)拆分 & 克服。你必须暂停思考脑海中的所有系统问题,试着将设计拆分成细小的模块,并且一个一个的查看可以做哪些简单的模块。如果可能的话,选择迭代开发方法。这样你就可以将思维专注在设计障碍上 ,那么你就能看到多个小山丘而不是整座大山浮现在你的脑海中。

此外,不要花费太多的时间来选择工具或者API或者规则引擎。这些工具仅仅是为了让我们工作起来更加轻松。相反地,把更多的 时间放在设计原理上,比如关注分离(Separation of Concerns)。SoC(系统芯片)会允许你改变任意软件层或者不影响其他系统的软件工具。

TDD(软件测试驱动开发)会让你鼓足勇气,让你在软件行业发生质的改变。不要忘了,在设计上花费的时间是远远不够的,正如Steve McConnell 在Code Complete这本书中所说:

“When areyou done [designing]? Since design is open-ended, the most common answer tothat question is “When you’re out of time.”


需求变更

为了生存,你的客户或者公司必须适应变化。而这就意味着需求将发生变化。你不可能只编写一款软件就能满足未来所有的需求。总会有些新的需求时不时的跳出脑海中。所以,不要试图掩盖未来的需求,尝试去编写满足目前需求的软件。

不要过量设计

如果你花费数天时间来开发某个特别的功能,而这个功能一年里为你的客户只减少五分钟,那么实际上你的工作是无用的。我能理解,有时我们无法阻止自己做出一些特别的改变,因为它似乎使我们觉得像是一个更好的程序员或者只是为了好玩而已,但是考虑到成本/效益,时间是宝贵的,把时间花费在其他方面或许会更好。


简洁原则

简化,当你需要存储某个对象到系统文件时,没有密集型的工作或者特别需求,编写一个自定义对象序列化是毫无意义的。我看到有些设计从工程学角度来看,它们像是杰作,但它们过于复杂。你不应该让你的设计过于复杂。有时,最好的解决方法就是简单。因此,请保持 KISS原则。

相信自己,鼓足勇气

设计其实是为了检验程序员成果的好坏。不同的程序员可拿出不同的设计思路。因为没有单一的解决方案,这可能会导致你为某个特性搜索所有的最佳方案, 但这并不意味着你应该停止学习或聆听他人的想法。在设计过程中,不是学习所有最佳实践就能适合你的问题。相信自己,做最好的设计,实施自己的设计思路。

重构是个非常好的做法。当出现坏代码时,试着用重构的方式来解决。从错误中学习,它将有助于你未来设计。


没有完美的设计

无论你做什么,最终都会以一款无法令你满意的软件而告终。正如 Hunt and Thomas在《The Pragmatic Programmer》中写道的:

“完美的软件是不存在的。在计算机历史上,没人设计出完美的软件。这是不可能的,也许你是第一个,除非你不接受这个事实,而浪费时间或者精力去追逐一个不可能实现的梦想。”

我很抱歉,但他们是对的。不要去追逐一个不可能实现的梦想,试着让你的软件“足够好”就好!

英文出自: Thingstocode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 Charles Proxy 下载旧版本 iOS App

一、软件准备 1、旧版本 iTunes1.IPSW Downloads:https://ipsw.me/2.百度网盘链接:https://pan.baidu.com/s/1PO9Z12o-rqZ_JG68zRqEnA 提取码:fe1v 2、抓包工具 Charles Proxy1.Charles官网链接:https://www.charlesproxy.com/2.百…

禅道8.2-9.2.1注入GetShell

漏洞分析附上某老哥的漏洞分析,来了解下原理。 漏洞利用查看版本:访问Url:http://127.0.0.1/zentao/index.php?modegetconfig即可获取禅道的版本号以及一些其他的信息,目前漏洞存在于v8.2~v9.2确定版本号之后,我们就…

Maven 依赖-镜像仓库替换为 -- 阿里云镜像仓库(飞快实现 pom 引入)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在本地 maven 的 setting 配置文件中加上阿里云镜像地址就行了&#xff1a; 新增配置内容&#xff1a; <!-- 阿里镜像仓库 --><…

清洗肾脏的绝好秘方(图)

清洗肾脏的绝好秘方&#xff1a;只用香菜&#xff0c;可以在家里尝试。不用花多少钱就可清洗你的肾脏。经过多年来&#xff0c;我们的肾脏过滤血液&#xff0c;排除盐&#xff0c;毒素及所有不需要的物质进入我们的身体。随着时日&#xff0c;盐毒积累&#xff0c;这需要进行清…

【案例】数据量猛增,BI分析效率太低怎么破?

2019独角兽企业重金招聘Python工程师标准>>> 近日&#xff0c;Apache Kylin Innovation Meetup 在上海成功举办&#xff0c;有近200位小伙伴来到了现场。此次会议特别邀请到了金融、互联网等行业的技术伙伴分享了 Kylin 在行业中的实操应用 。今天将首先与大家分享演…

您收到一封 2019 阿里云峰会 (北京) 邀请函

为什么80%的码农都做不了架构师&#xff1f;>>> 摘要&#xff1a; 阿里云峰会&#xff08;北京&#xff09;开发者专场以“云原生和可见的云未来”为主题&#xff0c;不仅涵盖 2 场重大发布&#xff0c;更设置人工智能、机器学习、实时计算、云原生实践等国内外最热…

解决Based on configured schedule, the given trigger ‘triggerGroupName_FREEZE_JOB.triggerName_FREEZE...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题、如下&#xff1a; Caused by: org.quartz.SchedulerException: Based on configured schedule, the given trigger triggerG…

2020-3-26

题目一&#xff1a; JavaScript 获取第n个li元素 下面有两种方法 <!DOCTYPE html> <html> <head> <meta charset" utf-8"> <style type"text/css"> ul{list-style:none} </style> <script> window.onloadfunct…

高性能、高可靠分布式文件系统 go-fastdfs v1.2.0 发布

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; go-fastdfs是一个基于http协议的分布式文件系统&#xff0c;它基于大道至简的设计理念&#xff0c;一切从简设计&#xff0c;使得它的运维及扩展变得更加简单&#xff0c;它具有高性能、高可靠、…

zookeeper安装教程

1 安装环境 centos 7.4 jdk 1.8 zookeeper是java开发的&#xff0c;可以运行再windows,linux环境。 安装之前需要先安装号jdk. jdk的安装可以参见博文&#xff1a;http://www.cnblogs.com/jepson6669/p/8374699.html 2 安装过程 1 上传文件到Linux上 2 安装 1 解压到/usr/local…

需求规格说明书1.0

1.引言 1.1目的 该文档是关于我们组的记事本安卓APP和网页版本的功能和性能的描述&#xff0c;重点描述了系统的功能需求&#xff0c;并作为系统设计的主要输入。 本文档的预期读者包括&#xff1a;需求分析人员&#xff0c;设计人员&#xff0c;开发人员&#xff0c;项目管理人…

2020-3-30

题目一&#xff1a; JavaScript 将数组原有的顺序打乱 function le(){ //创建一个函数作为sort()函数的参数。return 0.5-Math.random(); //返回一个数字可能大于零也可能小于零&#xff0c;这样就可以实现随机排序功能&#xff0c; } var arr[]; //声明一个空数组。for(var i…

CC-BY-NC-SA (创作共用许可协议)

创作共用许可协议 &#xff08;英语&#xff1a;Creative Commons license&#xff0c;简称CC许可&#xff09; 是一种公共版权许可协议&#xff0c;其允许分发受版权保护的作品。一个创作共用许可&#xff0c;用于一个作者想给他人分享、使用、甚至创作派生作品的权利。创作共…

2020-3-31

题目一&#xff1a; 评论敏感词过滤代码&#xff0c;很多时候需要对一些评论或者文章中的敏感词进行过滤。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> </head> <script type"text/javascript"> window.o…

Java 对象的序列化和反序列化

一.序列化和反序列化的概念 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列…

家长必看 父母须知孩子社交圈九要点(组图)

孩子在慢慢的长大&#xff0c;总要接触外面的环境、接触到更多的人&#xff0c;也需要自己的社交圈。那么孩子的社交圈父母要知道9点。 1、妈妈是第一个“好朋友” 孩子社交的第一步从出生就开始了。虽然小小的他躺在那里还不能说话&#xff0c;但是通过哭、目光接触、笑等表…

2020-4-1

题目一 页面加载图片的时候&#xff0c;可能由于各种原因导致加载失败。 为了页面的人性化&#xff0c;在失败的时候通常会使用一张给定的图片替代。 <img src"logo.gif" onerror"javascript:this.srcdefault.gif" > //上面代码本来要加载logo.gif…

kettle变量(param命名参数)

1、定义&#xff1a; 编辑-设置-命名参数 在当前界面下定义参数名称和缺省值。 2、引用&#xff1a;原始数据 通过${var}引用变量 输出 注&#xff1a;1、字符串在命名参数引用是需要添加单引号的&#xff0c;但位置参数是不需要进行转译&#xff1b; 2、引用变量时需要勾选替换…

Excel操作

区间范围计算 方法一:用IF函数 方法二:构建一个辅助区域&#xff0c;用VLOOKUP函数 方法一:用IF函数 在F3中输入:IF(E3>90%,5%,IF(E3>80%,4%,IF(E3>70%,3%,IF(E3>60%,2%,1%)))) 向下拖动,搞定。 示例&#xff1a; IF(BB2<0.5,"50及以下",IF(AND(BB2&g…

2020-4-2

题目一 利用事件冒泡原理实现了获取td单元格内容的功能。 <!DOCTYPE html> <html> <head> <meta charset" utf-8"> <style type"text/css"> #table{ width:300px; height:100px; border:1px solid #ccc; border-c…