编程不容易

1,525 阅读9分钟

编程不是...

编程不是操作键盘快速敲打。编程不是牢记键盘的快捷键并使用退化了的鼠标工作。如果首要考虑,编程并不是要学习每种编程语言。不能通过电脑的品牌、价格、性能和操作系统来决定一个程序员是否优秀,也不能通过他们对代码编辑器和IDEs--VS-CodeAtomIntelliJ IDEAVimNotepad++等的偏爱来决定。与许多好莱坞电影潮流的观念相反,编程绝不等同黑客攻击

此外,编程不仅仅是要记忆编程语言的语法和内置功能。逻辑、条件、if语句和算法不能描绘出编程的蓝图。数学、递归、计算机科学和设计模式也不能。虽然它们是编程的重要组成部分,但是它们也仅仅是编程的一部分。

设计和规划

在编写代码之前,我们要对项目的设计和体系结构进行了全面的规划,以确保一个平稳的开发周期或者增加平稳开发周期的可能性。这时候,软件设计就派上用场了。工具链、pipelines、公共和内部API的抽象层、模块化、对象关系和数据库结构都在这个开发阶段进行了规划。

我们与调试器共存

编程艺术要求我们跳出条条框框的限制来思考,用最实用,有效且可行的解决方案解决问题。这可能就是为什么我们被说是宅家的"I.T.guy"或"客户支持"的原因了。实际上,我们的工作是查漏补缺。这好像说“编程”对“解决问题”的一种美化方式。

换言之,计算机内外都有方便我们的调节器,因此,我们意识到如何阅读和编写文档很重要。正确的文档-它以详细文档的实际页面的形式出现,或者像在代码库中散布有价值的评论一样简单-这作为程序员最重要的生命线之一。没有它,我们会在黑暗中迷失,无法履行我们作为调试器的职责。很少甚至没有进展,因为我们大部分时间都花在实验和调查框架或者了解遗留代码库如何工作。总之,这将导致非常糟糕的开发人员体验

考虑到所有可能的场景

调试已经够困难了。更糟糕的是,代码的执行通常不是线性的。由于具有if语句的程序逻辑,大型项目意味着可能执行路径的多个“分支”。我们必须考虑每种可能的场景和错误,特别是涉及用户输入。跟踪每个可执行路径所需的认知负荷使编程变得更加困难。

用户体验

走出开发的世界,我们进入一个普通用户的角色。除了提供功能,添加新功能,修补错误和记录我们的代码库之外,我们还关注普通用户如何与我们的应用或软件进行交互。我们思考能带来良好用户体验的多种因素,例如(但不限于)可访问性,可用性,用户友好性和可发现性,UI设计,颜色主题,功能动画和性能。

性能和优化

说到这点,性能本身就是编程的一个很重要的方面。我们,特别是那些具有计算机科学背景的人,努力使用和编写最节省时间和空间的算法。我们着迷于微不足道的微妙时间尺度,以便充分利用我们可用的内存,CPU和GPU。

在web开发的背景下,网络优化是一个需要掌握的重要概念。我们很努力地来减少和压缩我们的HTML,CSS和JavaScript,以减轻来自服务器响应的有效负载。图像和其它杂项资源也被压缩和延迟下载,以最小化用户在页面可用之前需要下载的数据量。

但是,有时我们会过于沉迷于性能。当我们不必要地专注优化代码库的某些部分而不是关注实际(项目)进度和生产中需要做什么时,过早优化就成了问题。这种情况下,我们必须明智地判断代码库的哪些部分确实需要优化。

安全性

除了软件的UI和逻辑之外,作为程序员,我们还要对用户的安全负责。在我们这个时代,数据是非常令人垂涎且货币化程度很高的(资源),确保用户个人的信息安全是比以往任何时候都更重要。我们采取额外的措施保护私人数据,因为用户信任我们的软件。如果我们不坚持履行这一责任,我们肯定不是真正的程序员,甚至不是长期的。

在接近安全的时候,我们永远不会太安全。普遍的经验法则告诉我们,“永远不要信任用户输入”。这甚至可以被视为“最佳经验”,竭尽全力去净化数据和用户输入。如果我们不够谨慎,我们不仅会使我们的软件和基础设施面临巨大的风险,而且还会冒着损害用户敏感数据的风险,这些用户数据是我们作为程序员承诺保护的。

但是,安全性并不仅限于用户数据和输入。病毒,蠕虫,特洛伊木马,广告软件,键盘记录器,勒索软件和其它形式的计算机恶意软件继续在全球数百万的计算机和其它设备上传播和肆虐。即使经过数十年的硬、软件技术的改进,也不存在无懈可击的系统。安全性是一种不断被磨练的工艺,但永远不会完美,因为总会有好奇的少数人探究并寻找各种可能的方法来破解系统。

因此,不管面向的怎样的用户群,如果我们还没将安全性纳入优先考虑范围的话,那么我们应谨记要将安全性设计作为最重要的优先级之一。这样做是为了保护我们的用户免受上述威胁的影响,这些威胁可能会造成诸如数据丢失,文件损坏和系统奔溃等不便之处。

团队协作让梦想成真

即使它不一定和编程相关,团队协作在软件开发中也起着不可或缺的作用。由于任何大型项目的所有复杂性和活动部分,一个人不可能以常规迭代的快速节奏或者在客户或任何监督人的严格期限和时间限制下开发出高质量的软件。

这就是为什么我们有各种各样的团队,他们专注于编程的诸多方面的其中之一。一个人永远不会拥有所有技能和知识,并将每个方面的点有效的粘合在一起。一个团队可能负责UI设计和保证可访问,而另一个团队可能负责软件本身的功能开发。如果将各个专业团队的所有能力结合起来,最终的软件将具有最佳功能,用户体验,性能和安全性,(软件)它将会在财务和实际限制范围内使用。

对于时间管理和会议期限,工作流程组织和自动化至关重要。我们花时间正确配置我们的构建工具和管道,因为这样做将为我们节省大量时间。一般而言,投资回报随着时间的推移而增加。

与他人愉快地工作

为了阐述团队合作的理念,我们与同行建立良好的关系,因为最终项目的成功在很大程度上取决于团队人员良好的相处。我们努力营造一个鼓励性的工作环境,在这环境下,经验丰富的人要经常引导新人。

由于我们是以团队形式开发软件,因此我们必须留意其他人是否能读懂我们的代码。为了保证开发周期的长期可持续性,代码可读性和可维护性被认为与项目的逻辑和功能同样重要。我们始终要编写良好,可读的代码,同时提供信息化的GIT提交信息和文档说明,因为这些肯定会帮助我们和其它人更好地理解我们写的代码。

说到其他人阅读我们的代码,代码审查是一个很好的机会,可以更多地了解编程中的最佳实践。这也是熟悉代码库以及其底层设计和架构的另一种方法。虽然建设性的批评对接收方是令人不愉快和难以处理的,但重要的是将其作为合理的建议,以便作为程序员的我们进行改进。

编程很难

编程囊括许多方面,包括用户体验,性能,安全性和团队协作等功能。仅仅关注一个方面而忽略其它方面是不够的。对于复杂和重要性的项目,它并不是键入几行代码就能取得成功。它需要大量精心规划,设计,考虑和团队协作才能取得成功。事实上,在编程时花费的时间比在打字时花费的时间多,特别是在长时间的调试过程中。

最后,编程实际上是连续的,不间断的学习。适应性和不间断的学习是这个行业生存的关键。如果我们不努力继续学习,我们就不能期望能跟上潮流。在这种指数级的科技改进的动荡行业中,我们必须跟上它的快速节奏,以免陷入困境。

全世界的开发人员都是辛勤的工作者,我想通过认识到这点来结束本文。写这篇文章,我不得不反思一个开发团队的日常工作流程。我不得不探究常常被我们忽略的编程和软件开发的许多方面。从那时起,我对计算机中安装的所有软件都有了更多的了解。为此,今天,我提倡大家要感谢下程序员,无论其经验如何。没有他们,我们会在哪里呢?

永远不要把他们的努力看做理所当然。

原文 dev.to/somedood/pr…

文章首发 github.com/reng99/blog…

更多内容 github.com/reng99/blog…