热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

谈谈一个优秀的程序员是如何炼成的

一个优秀的程序员是如何炼成的?问一下自己这个问题会很有意思。这能让你好好思考一下软件开发的过程。拿它来问一下同事也不错,这能引起一些关于如何一起协作的很有意思的讨论。下面是我认为成为一名优秀的程序员所必需的5个技能。

     一个优秀的程序员是如何炼成的?他们关注什么?问一下自己这个问题会很有意思。这能让你好好思考一下软件开发的过程。拿它来问一下同事也不错,这能引起一些关于如何一起协作的很有意思的讨论。下面是我认为成为一名优秀的程序员所必需的5个技能。

问题分解

       编程讲的是如何解决问题。但在你开始写代码之前,你需要清楚如何解决问题。一个好的程序员应该得拥有这样的技能,他能将问题分解成子问题,直到每个子问题都可以很轻松地进行解决。不过要找到一个解决问题的方式可不是件简单的事。好的程序员能够很好的对问题进行建模,这样写出来的程序很容易能看懂,很容易实现及测试。

       我所见识过的一些复杂的程序,它们之所以这么复杂,部分原因是由于它的实现并不适合对应的问题。这导致代码很难理解。我很同意Bernie Cosell关于问题建模方面的看法:

       “很少有程序天生就是复杂的。如果你看到一段非常晦涩的代码——你无法理解它到底要做什么——这通常就意味着它的实现非常糟糕。这个时候不要撸起衣袖就开始修改代码,而是应该退一步,好好地重新思考一下 。当你把整个问题都想透了,你会发现问题其实很简单。“


场景分析

       好的开发人员应当能够考虑到程序的不同场景。这不仅是指程序的逻辑,同样还有的是可能会发生的内外部的事件。要想考虑到业务逻辑的不同路径,你可能会提出这样的问题:如果这个参数为空的话会怎样?如果这些条件都不为真的话呢 ?这个方法是线程安全的吗?为了弄清楚程序到底需要解决哪类的问题,你可能会问自己:如果队列为空的话怎么办?或者这个请求没有响应?如果这个服务器重启的时候,别的服务器也在重启该怎么办?

       好的程序员应该会问自己:什么情况下它会出现问题?也就是说,他们能够像测试人员一样看待问题。反过来 ,没有经验的程序员通常只考虑程序主逻辑——也就是当所有事情都如预期时的正常的控制流程。不过一旦发生了异常情况,程序必须得能够应对它。


命名

       程序编写涉及到许多命名的问题:类,方法以及变量。如果做得好的话,程序应当是自文档型的,也就是说通过读源码就能很清晰地理解程序的意图。自文档型代码的一个结果就是方法通常会更短,而不是使用很长的方法,这是因为小的方法,你才可以有更多的地方来赋予一些有意义的名字。

       好的名字可比想像中的要困难得多。我喜欢Phil Karlton说的这段话:”计算机科学里只有两件难事:缓存失效以及命名“。命名之所以这么难是由于你得清楚每个名字都代表着什么。有的时候事情并不会那么明朗 ,只有开发到达一定程度的时候才会清楚。也就是说,重命名和命名一样非常重要。

       好的命名同样也包括你所提出的概念以及这些概念到底叫什么。如果仔细地思考过这点的话,不同名字的概念应当是始终一致的(在程序中,不管是和程序员还是非程序员讨论业务领域时都用的是相同的概念),这样写程序就会非常容易。


一致性

       或许写程序里面最大的挑战就是管理的复杂性了。一致性是对抗复杂性的一种方式。它让我们看到了问题的固有模式,让我们可以推论出东西该如何命名,使用以及处理,这在一定程度上减少了复杂性。达到一致性之后, 我们不用再费精力去记住异常情况以及随机的变动。我们可以聚焦于问题的本质复杂度,而不是偶然复杂度。

       一致性是非常重要的。它包括变量名及分组,方法命名,模块的划分,目录结构,GUI,错误处理,日志,文档,等等。比如说,如果有一些变量是关联的并且出现在一起,那么就应当始终按照同样的顺序来使用它们。这样的话,如果漏掉了一个或者将它们搞混了就能够很容易发现。对于某个操作而言,如果它在某个地方是叫做delete,那么就不要在另一个地方把它称为remove——要坚持使用同样的名字。 Steve McConnell在代码大全中关于准确地使用反义词有一些不错的建议。比如说,begin和end是反义词,同样的还有start和stop。不要混合不同分组的词语(比如begin和stop)。

       修改程序可能会导致不一致。草率的程序员是不会注意到他们添加的代码是不是与现有的代码一致的。好的程序员会确保每一个细节都是正确的。他们知道一致性对于减少复杂性有多么重要。


学习

       作为一名软件开发人员,你需要不停地学习。在增加一个新特性之前,你必须知道它是要做什么。在往一个现有的程序中增加代码之前,你通常都要学习现有的代码是做什么的,这样才能正确地实现新功能。你还得了解周边的系统 ,这样才能正确地和它们进行交互。快速的学习能力可以让你成为一名高效的开发人员。

       更有甚者,由于软件工程领域的发展速度实在是太快了,会不断地涌现出许多 新的语言,工具,技术以及框架。这是把双刃剑。Fred Brooks把学习看作是一种娱乐。学习新东西,乐在其中矣。这也意味着程序员的生活永远不会枯燥。

结论

       上面讲的都是一些比较通用的技能——它们并不特定于某个语言,框架或者技术。如果你具备了这些技能,你可以快速地学习一门新语言或者一个新工具,并用它们编写出优秀的软件。更重要的是,由于它们具备通用性的本质,即使多年过后也仍不会过时。


推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
云中之锦书
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有