首页 编程语言 关于软件开发你真正需要知道的几个事情

关于软件开发你真正需要知道的几个事情

我之所以写这篇文章是因为有一个朋友最近决定跻身软件工程行业。我的这位朋友聪明,精力充沛,品貌兼优,又善于学习:每个人都认为这样的人才必将有一番作为。但是,在踏出第一步时,他依然有很多东西需要学习。

我和很多人一样一开始学习的是工具系列:语法和数据结构,调试器和编辑器。但实际上如何使用这些工具来编写好的软件——那种可以工作的,能够解决问题的,很长一段时间不用维护的软件——却从来没有正式教给我们。学习这门手艺需要历经长时间的挫折和痛苦。

下面我要讲述一些在尝试这门手艺之前你需要学习的东西。

关于软件你需要记住的最重要的事情是

没有魔法

软件100%和魔法无关(虽然我们说它有很多创造性的手段!)。你看到的每一个行为,你运行的每一个效果,它之所以发生只是因为一些代码使之发生的缘故,而且总是能够跟踪那些代码。

当然,这并不意味着跟踪总是有用的。有时候你需要知道,有事情发生和它为什么发生并不真的相关。这导致我们陷入了下面的困境:

松鼠综合症

在你深入研究的时候,你会发现软件充满了无穷级数的干扰和如同鼠穴一般错综复杂的走向。如果你放纵内心想像松鼠一样囤货的欲望,你固然可以学到很多东西,但如果你能退一步,每隔一段时间问问自己是否真的需要探索这条特殊的鼠洞,那么你能收获更多。尝试停留在一个小的范围内可以帮助你达到

领域

软件是极其复杂的,复杂到足以让我们定期创建出没有人能一次性明白的代码。我们通过更小和更独立的部分,通过定义各部分之间的接口来构建软件,实现其复杂。这样一来,如果你能在你的脑中适应更小的一部分,那工作于那个块和相信其他部分正常的时候多少更安全一点(至少当一切顺利的时候)。

完全获取哪怕更小的块中的一个到你的头脑中也可以是很难的,但与此同时,你可以做到一些诸如只知道你正在看的代码行是错误的,以及如何修复这样的事情。那就是软件的领域了。这非常重要,并非因为你全力以赴,而是因为如果你没有身处那个领域,那么想要做对一切事情几乎是不可能的。而这给我们带来的是

中断

中断使得你脑中丢弃了一些来之不易的内容,从而阻碍你完成任何事情。十分钟的中断当然杀不光所有:但是它需要45分钟才能让你的脑子回到你中断的地方。

这可能是有关软件工作最难向人们解释的事情——尽管大多数领域都有这样的事情,但没有我们这么悲剧。发生差异的部分原因是

直觉失败

许多我们认为的“直觉”的确有效利用了我们大脑中的结构——历经超过百万年进化,已经变得高度优化——来帮助我们管理我们周围物理世界的复杂性。但是,从事电脑工作并不是我们周围物理世界的一部分:我的笔记本电脑创建了她自己的世界延伸,而我必须去这个延伸的世界工作。

软件工程的力量在于那个世界的扩展是非常非常具有可塑性的——这力量是惊人的。不过,诅咒之一就是由于我们不再工作于物理世界,我们的直觉就不再有用,这让一切都变得很难理解,除非我们做一些额外的工作来确保我们的直觉可以帮助我们。

打破我们直觉的主要事情之一是

时间是不可思议的

现在的时代计算机的运行是极其快速的。即使你手机运行的时间尺度比我们的大脑快十亿倍:一秒时间传递给我们就像过了31年,不论是给予还是获取,仅仅一个传递过程。这意味着我们不能实时观看计算机正在做什么。

相反,我们不得不发明方法强制机器来匹配我们极其缓慢的步伐,通常为要求计算机等我们,或记住它正在做的一切事情且留下日志可供我们稍后读取。当然,这些技术是如此地拖累事情的发展,以致于任何与时间相关的问题通常都会消失,或者至少看起来不同。

极端的话,我们最终还是盲人摸象,一点也不知道为什么代码之所以脱离轨道。为了避免出现这种情况,我们不得不做一些真正的事情来安排代码向我们解释其决定。这工作往往很难且没有吸引力——但它至关重要,因为受到了以下定律的重大影响

墨菲定律

在计算机运算中,墨菲定律可以重新表述为“如果你不能证明它是不可能的,那么它一定会发生——而且往往很快。”还记得十亿分之一的加速吗?如果你一秒内做十亿次操作,且每次99.99999%%可靠,那么你会发现每秒出现了100个故障。

我们对于概率和机会的认知已经根深蒂固:“不太可能”真正的含义是“在我思考的时间里可能不一定“。彻底地改变时间尺度,那么所有都将改变。

即使没有改变,然而,故障仍然是一个问题,因为

原罪

每次你写代码,你就会写bug。这是一个真理。不管你多么高级,不管你多么优秀,不管什么,不管怎么样,你无法写出完美的代码。这是人性的一个特点。

所以你不能避免写出bug。

但是你可以明智地减少bug:

1.注释

在代码中注释的目的不是为了解释代码做什么——可以读取代码!注释目的是为了解释当你写代码的时候是如何思考的。

为什么你认为代码做到这一点很重要?其它地方发生了什么事使之变得有必要?在这种情况发生后其他人要小心什么后效?代码有没有按照你喜欢的方式做事情,亦或是用一种让你担心的方式?你为什么选择这种方式?还有什么其他的方法可供你选择?也许其他方法中有更好的?当时你在想什么?

在写完代码的半年后,你可能已经不记得上述任何问题的答案,哪怕是你自己的代码。所以,要写下来。这是无价的,当你试图弄清楚有些事情为什么坏了的时候。

2.测试优先

你可以编写测试的代码以确保其他代码可正常工作。这样做出人意料的重要,但我们大多数人往往在这方面做得很糟糕,因为我们总会去做其他的事情。所以先要写测试。这是知道确保写测试的唯一途径。

3.生活更轻松

计算机速度很快,没错吧?并且正在变得越来越快。你的大脑却没有越来越快。所以不要挑选那些使计算机更轻松的优化工具——挑选为人类而制造的工具。

C语言就是一个很好的例子。它被设计得不易用来工作,它被设计成更适合实现在40年前的机器上。因此,用C语言写代码意味着你要将所有的时间用于思考执行机制,而不是针对于你需要解决的问题:how,而不是what或why。停止使用C语言的日子好像已经过去了10年。这些天,我大多用的是Python,这更能帮助你去好好思考what和why,而不是how。

有些纯粹主义者会跳出来说“但是Python比C语言慢!”——他们一点也没错——但在2016年,95%的世界已经对此不在意了。电脑是如此之快以致于可以弥补Python的低效率,并且在大部分时间中做到足够快。像Python这样的面向优化开发性能,而不是处理器性能的语言,才是正确的权衡。

4.解决方案而不是写代码

写代码比解决问题更容易。

代码往往具有良好定义的输入和输出,一种可预测如何使用的方式,以及一个你可以说你已经完成了写代码这一任务的时间。问题就混乱得多,会涉及到个人和组织,并且有真实世界的约束,例如让人们实际使用你已经建立的东西。

解决问题比编写代码更重要。人们很容易忘记这一点,所以要谨记这一点。

最后,还有一件可能比其他剩下没有谈论的东西更重要的事情:

5.不要放弃

软件正在日新月异地变化和发展。你永远不可能掌握所有。事实上,直到你准备放弃的那一刻,你依然没有资格说你已经懂得够多。不断学习,不断拓宽你的视野,保持睁大你的眼睛。

这个世界上总有一个地方,会让人们低下头来专注于一个小小的领域,但在我的经验中,有更多的地方值得人们去贪婪地学习并致力于解决碰到的任何问题。

总而言之,移动你的手指来改变世界意味着严肃的大脑延伸和新信息的不停涌入。但是尽管如此,它是如此致命的酷。

欢迎加入!


2

站心网

我之所以写这篇文章是因为有一个朋友最近决定跻身软件工程行业。我的这位朋友聪明,精力充沛,品貌兼优,又..

为您推荐

软件的复杂性正在杀死我们

现在有一个常见现象:企业想要更快更便宜地构建软件。这当然是一个可以理解和值得称赞的目标。且每个工程师都应该全心全意支持这个目标。然而事与愿违。虽然并非是故意的,但是随着时间的推移,我们会因为软件构建中..

薪酬谈判误区:你知道几个?

01想像你接到企业HR负责招聘员工的电话,因为你出色的表现,企业打算给你一个合作的机会。这个时候,除了开心,你是否也有点担心,到底应该如何为自己协商到一份更好的薪资福利。这一刻也许你和企业是“对立的”,企..

助力程序员成功的几个好习惯

老实说,如果你google搜索“程序员的好习惯”这方面的内容,那么就会有很多大同小异的文章映入你的眼帘。但是今天我想从一个略有不同的角度来探讨这个主题。不是关于如何更擅长编程,而是如何使程序员更有市场竞争力..

回顾我的软件开发经历:我与代码生成器的涅槃之路

前言这是我《回顾我的开发经历》系列的第二篇,聚焦于我与代码生成器的故事。从最初的简单工具到最终演变成一个功能强大的ORM框架,这段经历不仅让我在技术上得到了极大的提升,也让我深刻理解了重构、设计模式和系..

回顾我的软件开发经历(1)

二十多年前,刚从大学毕业,对软件开发认识非常有限,掌握的技能也不多。第一份工作第一份工作是搭建一个BBS论坛,模仿当时流行的三夫户外论坛。那时,对知识如饥似渴。由于买不起书,我常常去书店找到相关的ASP书籍..

软件开发的七条原则

原则#1:存在的原因软件系统存在的原因:为用户提供价值。所有的决定都应该考虑到这一点。在指定系统需求之前,在关注系统的各个功能之前,在确定硬件平台或开发过程之前,问问自己以下问题:这是否能为系统真正增加..

几个超级实用但很少人知道的 VS 技巧

大家好,今天分享一些实用的 VS 技巧,而这些技巧我发现很多人都不知道。因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS “骚”操作,他们会好奇地问:你是怎么做到的?..

从事软件开发工作的一些感悟

随着科技的飞速发展,计算机领域成为了一个充满机遇和挑战的领域。对于计算机这个行业,我一直有着浓厚的兴趣,这份兴趣驱使我不断学习,不断成长。在这篇文章中,我将分享我的编程经历以及一些建议,希望能够给那些..

4款功能强大桌面虚拟机软件推荐

虚拟机软件是现代计算机中必不可少的工具之一,它可以让我们在一台计算机上运行多个操作系统,这为开发人员、测试人员以及研究人员带来了很多便利。在这里,我们将探讨四款最强大的桌面虚拟机软件:VMware Workstati..

开源软件:释放创新的力量,改变数字世界的游戏规则

在充满活力的技术领域,创新是至高无上的,有一种方法已获得显著的吸引力——开源软件。开源软件凭借其透明、协作和无限可能性的精神,彻底改变了我们开发、共享和定制应用程序的方式。从操作系统到数据分析工具,其..

免费开源的远程桌面软件RustDesk官网下载

RustDesk是一款轻量级且易于使用的远程桌面控制软件,与ToDesk、TeamViewer、AnyDesk等类似软件一样简单易用。它无需任何配置,使用方便,特别适合远程办公、远程教学或演示以及远程协助和技术支持等情况。RustDesk..

开源远程支持软件RustDesk官网下载

RustDesk 是一个用 Rust 编程语言开发的开源远程支持软件。它允许用户在 Windows、Linux 和 macOS 等操作系统上建立远程连接,以进行技术支持或协助。RustDesk官网:https://rustdesk.com/RustDesk下载地址:https:/..

好用的桌面虚拟软件推荐

好用的桌面虚拟软件有以下几个:VMware WorkstationVMware Workstation官网:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.htmlVMware Workstation 是 VMware 公司推出的一款桌面虚..

2024年程序员最值得考的几个证书

2024年程序员最值得考的几个证书包括:AWS Certified Solutions Architect - Associate:该证书证明您具有设计、部署和管理 Amazon Web Services (AWS) 解决方案的能力。它是云计算领域的入门级证书,对任何希望在云..

C#获取Windows系统中所有已安装软件的名称和版本号

需求在Windows中使用C#做软件开发,有时候需要获取当前系统中已安装的软件及其版本号,接下来就简单介绍一下,如何通过C#获取来实现。示例代码已安装的软件,在注册表中都会有软件信息和卸载信息,我们只需要扫描注..

修复 Ubuntu 上“E: 无法找到软件包”错误的 5 种方法

如果您在 Ubuntu 上安装软件包时遇到“E:无法找到软件包”错误,请不要担心,因为修复它很容易。要点定期更新软件包列表,以维护安全且最新的 Ubuntu 系统,确保访问最新的软件包、安全补丁、错误修复和改进的依赖..

软件开发生命周期(SDLC)有哪些?

软件开发生命周期(SDLC)是指从需求分析到软件部署、运维及更新的全过程。它通常包括以下阶段:1、需求分析开发团队与客户合作,明确软件的功能和需求。通过收集、分析和确认需求,确保开发团队对软件的目标有清晰的..

Linux中dpkg --remove时提示:该软件包现在的状态极为不妥 error

问题描述在Linux使用dpkg安装软件包出现错误,但使用dpkg -l命令,可以看到软件包已经被安装了,此时,如果想要卸载掉这个软件包,使用dpkg --remove命令就会提示“该软件包现在的状态极为不妥”的错误信息。dpkg: ..

Tasksel - 在 Debian 和 Ubuntu 中轻松安装软件组

Linux 用户必须处理的多项任务之一是软件安装。可能有两种方法可以用来安装软件,特别是在基于 Debian 的发行版上,例如 Ubuntu 和 Linux Mint。第一种是使用包管理工具(例如 apt-get、apt、aptitude 和 synaptic)..

apt-fast:加快 Ubuntu 上的 APT 软件包下载速度

在这篇社论中,我们将介绍一个名为 apt-fast 的强大实用程序,您可以使用它来加速 apt、apt-get 或 aptitude 下载软件包的速度。apt-fast 是流行的 apt、apt-get 和 aptitude 的开源 shell 脚本包装器包管理工具有助..

发表回复

返回顶部