JavaRush /Java 博客 /Random-ZH /谁是软件工程师?软件工程 VS “仅仅”编程

谁是软件工程师?软件工程 VS “仅仅”编程

已在 Random-ZH 群组中发布
我们提请您注意Samer Buna 的一篇文章的改编版,该文章涉及软件工程和编程之间的差异,或者开发软件概念与“只是编码”有何不同。
谁是软件工程师? 软件工程VS
所有软件工程师都会编码,但并非所有程序员都可以开发软件概念。有些人不喜欢“软件工程师”(又名软件工程师)这个词,因为我们在谈论更物理的东西(例如建筑)时通常使用“工程师”这个词。当然,我们的文章不是关于这个术语本身。如果它突然引起你的拒绝,它很容易被与创造力相关的东西所取代。“软件创建者”、“软件作者”...甚至“软件创建者”!
当我们谈论“软件工程师”时,我们指的是一个主要任务不仅仅是编写代码,而是创建高质量应用程序的人。在此,他看到了自己的使命,将科学方法和统计方法应用于他的工作。对他来说,编程不仅仅是一种赚钱买食物的方式。
编程能力并不自动使一个人成为软件工程师。任何人都可以学习编码,而且比看起来容易得多。任何人都可以创建一个简单的程序供自己使用,但这并不能保证相同的程序也适用于其他人。我最喜欢的例子是这样的:我们很多人在淋浴时唱歌,但是,可惜的是,这种表演并不总是值得在专业舞台上表演。当然,为了获得高品质的音乐体验,您很可能会求助于专业人士。 你需要更多例子吗?
  • 我们都在学校学习数学和写作,但这并不能让我们成为数学家和作家。
  • 我们大多数人都有能力准备一道还过得去、有时甚至非常美味的菜肴,但并不是每个人都敢为大使馆晚宴准备一桌100人的菜肴。在这种情况下,我们聘请了一名厨师。
  • 您现在准备好将新房子的建造完全委托给邻居的孩子,他用乐高创造了令人印象深刻的杰作吗?
我在本文中试图传达的主要观点是,简单的程序与工程师设计的程序有很大不同。 编程过程的最简单定义:为计算机制定有序的操作序列,以便在给定给定的输入参数的情况下获得特定的输出。 软件工程的过程是设计、编写、测试和策划计算机程序来为许多用户解决问题。这是关于创建可靠且安全的解决方案,这些解决方案将经受时间的考验,并能够应对一些可能未知的挑战。
谁是软件工程师? 软件工程VS
软件工程师了解他们解决的问题、他们提出的解决方案、这些解决方案的局限性、他们的隐私和安全的一切。在我看来,如果一个人不理解问题的本质,他甚至不应该开始编写解决方案。

工程思维——寻找应用解决方案

软件工程师并不认为编写软件本身是他们的主要目标。他们从满足需求和解决问题的角度思考。这很重要,因为并非每个问题都需要软件解决方案。其中一些可以使用现有程序来处理。有些问题的发生有时可以提前预测,并且借助优秀的程序设计,可以在将来避免这些问题的发生。

“知识分子解决问题,天才预防问题”

- 艾尔伯特爱因斯坦

谁是软件工程师? 软件工程VS
复杂的问题往往需要编写大量的程序。有些任务需要并行运行应用程序,而另一些任务则需要顺序执行多个程序。只需培训用户即可解决许多问题。在开始创建程序之前,软件工程师会问自己一些问题:
  • 我应该解决什么问题?
  • 除了编写代码来解决这些问题之外,你还能做什么?
  • 我可以做什么来让应用程序更轻松地完成这些任务?

程序质量和代码质量

好的程序是清晰易读的。它们很容易扩展,可以与其他程序很好地配合,而且使用起来不会是一场噩梦。代码质量是不容谈判的。应该很高,仅此而已。在考虑时,诸如程序员心情不好或期限太紧(哦,那些期限!)之类的借口是不可接受的。软件开发最重要的方面之一是以一种易于将来维护和修改的方式设计程序(你好,OOP!)。如今,几乎所有软件都是可修改的,通常这个过程即使没有用户参与也会发生,或者不需要用户做任何事情,除了“您的程序已更新,单击“确定”或“推迟”。当然,用户有权要求应用程序提供新功能(特别是如果我们谈论的是用 Java 编写的长期运行的企业软件,或者可以玩多年的在线游戏)。
想了解更多关于 Java 编程的知识吗?加入Java 开发者小组!
一段代码本身很难说是有用的。软件的有用功能始于不同的应用程序相互通信、交换数据并共同执行向用户呈现数据和界面的任务。
谁是软件工程师? 软件工程VS
设计程序时应牢记这几点!他们收到什么消息?监控哪些事件?身份验证和授权是如何发生的?好程序的另一个同样重要的标志是代码的清晰度,而不是应用程序已通过的测试数量,甚至不是良好的测试覆盖率。看似简单的问题:“除了我之外,其他人能理解我的代码吗?”、“我今天能编写这段代码并在几周后理解它吗?” 关于编程中最困难的两件事的流行名言是这样的:

“只有两件真正困难的事情:缓存失效和实体命名”

——菲尔·卡尔顿。

代码可读性比通常认为的重要得多。不幸的是,为了代码的清晰性,不可能定义精确的度量或参数。记住普遍接受的语言规范、良好的软件模型和开发方法会有一定帮助。但通常这还不够。可以说,随着时间和经验的积累,真正的专业人士会发展出一种“清晰感”,类似于直觉。写作比喻在这里很有效:知道很多单词并不能帮助你写出简洁明了的东西。

“我本来可以写得短一些,但我没有时间。”

——马克·吐温。

快速、轻松地修复错误的能力是优秀软件的一个关键特征。程序中的错误应发送明确的消息并集中记录以供跟踪。当报告新错误时,修复它的人必须具有调试它的能力。他需要轻松连接到系统,随时访问执行信息,还能够轻松检查系统任何部分的功能。

环境和测试

当软件工程师开发应用程序时,他们会尽力确保它们可以在不同架构和不同操作系统的计算机上运行。重要的是,该软件可以在不同的分辨率和屏幕方向下运行,并且不会“消耗”超出所需的内存和处理能力。
谁是软件工程师? 软件工程VS
当涉及到 Web 应用程序时,它们必须能够在所有主流浏览器中运行。创建桌面应用程序时,您需要确保它可以在 Mac、Windows 和 Linux 上启动并正常运行。好吧,程序依赖于数据,那么即使在数据连接速度慢或没有数据连接的情况下,应用程序也应该可以工作。为了编写一个软件,工程师会考虑各种场景选项并计划对其进行测试。这一切都始于选择理想的选项,一切正常,不会出现错误。然后他们记录任何潜在的问题并将其写入测试计划。一些工程师首先编写代码,他们称之为测试用例,它模拟所有可能出现的问题和错误的场景。然后编写一个可以与所考虑的任何选项一起工作的程序。才华横溢的软件工程师的独特能力不是知道如何编写代码,而是了解应用程序作为输出到底应该做什么以及如何实现它。当客户的软件需求不完整并且可能不明确时,工程师需要正确评估并“理解”它们。

成本与效率

在大多数情况下,软件工程师可以快速解决问题。如果您认为雇用一名“昂贵”的经验丰富的程序员会增加您的成本,请再想一想。雇用的程序员越有经验,他就能越快地提供简单、整洁、可靠且易于使用的解决方案。从长远来看,这肯定会降低软件开发成本。
谁是软件工程师? 软件工程VS
还需要考虑执行程序的成本。任何程序都会消耗计算资源,而且它们都不是免费的。
软件工程师的工作是编写不会不必要地使用计算资源的高效代码。
例如,缓存经常访问的数据是用于实现所需结果的可能策略之一。但这只是可能有数百种可以使程序更快、更高效的工具和解决方案之一。新手程序员可能会为您提供廉价的解决方案,但使用这样的解决方案最终将使您和您的客户付出的代价比与首先创建有效解决方案的经验丰富的开发人员合作要高得多。

注重用户体验

优秀的程序员在开发时会牢记用户体验 (UX)。人机交互是一个研究和解决方案无穷无尽的话题。应用的解决方案越多,程序的结果就应该越好。以下是一些示例,只是为了让您了解这个方向是什么:
  • 在设计电子邮件等数据输入表单时,好的程序应该忽略电子邮件地址的大小写。如果按下 CAPSLOCK 键,则不会引发错误,因为电子邮件地址的小写形式是唯一的。如果程序接受新的电子邮件地址作为输入,请在输入过程中尽早进行检查,以提醒用户他们使用了错误的地址格式。该解决方案既包括明显的检查,例如缺少“@”符号,也包括不那么明显的检查,例如检查字符顺序是否错误,例如“gmail.ocm”

  • 当用户被重定向去执行某些操作时,一个好的程序应该记住他当前的位置,并在完成后将他返回。一个好的程序还应该记住用户已经传输的数据,这对于与他进一步交互非常重要。

    假设您正在以访客身份在 Expedia 上搜索航空旅行。后来您决定创建一个帐户。该应用程序应将您之前的所有搜索保存在新帐户中,并且您应该能够从其他设备访问它们。


  • 谁是软件工程师? 软件工程VS
  • 一个好的程序是在设计时考虑到用户行为场景的。您不需要只在“马马虎虎”的基础上添加新功能;要设身处地为用户着想。有一天,我在预订机票时忘记提供我的飞行常客号码。收到确认后,我决定去航空公司的网站添加以获得折扣。为了弄清楚如何做到这一点,我在网站上闲逛了整整 10 分钟。该应用程序是如此不明显,以至于我只是漫无目的地浏览网站的不同页面,以找到我需要的东西。后来,我发现我已经登陆了几次正确的页面,但我什至不明白它,因为我需要的字段在其他类似的巨大表格字段中丢失了。

    原来,为了编辑行程信息,我需要滚动大约二十行表格,输入会员卡号和电话号码,否则表格无法发送进行验证。这是一个在开发时没有考虑用户使用起来有多舒服的程序的示例。

可靠性、安全性、安全性

在我看来,专业软件开发人员和业余爱好者之间最重要的区别是在创建应用程序时考虑应用程序的可靠性、安全性和安全性等参数。
真正的专业人士知道他对其解决方案的安全负责。
程序的某些部分必须能够容忍不正确的输入、不正确的状态和不正确的交互。这确实很难执行,也是我们听到人们因软件错误而死亡的主要原因。用户已经输入、正在输入并将继续在程序中输入不正确的数据。这必须被接受为事实。此外,有些人会故意这样做,目的是破坏应用程序并获取可用的资源。
谁是软件工程师? 软件工程VS
这是一个现实生活中的例子:据称对最近 Equifax 数据泄露事件负责的人被指控未能履行其工作职责,即开发解决方案以抵制向公众提供的所有软件产品中的不良和恶意输入。信息安全相关事件不仅涉及错误、恶意输入,还涉及错误输入的数据。如果用户忘记了密码,他可以尝试输入多少次?以后你会屏蔽他吗?如果其他人试图阻止他的帐户怎么办?用户可以通过未加密的数据通道传输其凭据吗?如果登录请求来自异常位置怎么办?如果登录尝试似乎是自动的,您会怎么做?您采取了哪些措施来保护您的用户免受跨站点脚本、跨站点请求伪造和常见网络钓鱼的侵害?如果您的服务器遭受 DDoS 攻击,您是否有备份策略?这些问题仅突出了一些需要考虑的问题。受保护的程序不会以文本形式保存重要信息。它使用复杂的单向密码(一种很容易加密但没有密钥几乎不可能解密的密码)来保护它。这些是程序被黑客攻击时的备份措施。黑客会发现对他们无用的加密数据。即使在最好的程序中也会出现意想不到的问题。一个没有为它们的发生做好准备的程序员很难被称为专业人士。在他预料到意外行为之前,他不是一名工程师。他是“不安全程序的作者”。程序中的错误并不总是显而易见的。我们预测和预防已知错误的智力能力是有限的。这就是为什么软件工程师了解良好工具的重要性,使他们能够编写正确且安全的软件。

所需工具

毫无疑问,我们需要不同的、好的开发工具。他们的作用经常被低估,但事实上他们节省了大量的时间和精力,将一些任务简化了一个数量级。想象一下,如果您仍然需要通过 FTP 上传文件进行部署,可以说是老式的方式。想象一下在没有 Chrome DevTools 的情况下调试网络和性能问题!如今,如果没有 ESlit 和 Prettier,编写 JavaScript 代码的效率将是多么低下!
谁是软件工程师? 软件工程VS
任何可以减少编写代码时反馈时间的工具都应该受到欢迎。当我发现一个以前不熟悉但真正有用且有效的工具时,我只能后悔没有在那个快乐的时刻之前使用它。
更好、更现代的工具将帮助您成为更好的程序员。找到它们、使用它们、欣赏它们,如果可以的话,改进它们。并且不要沉迷于同一件事:谁知道呢,也许使用一个新工具,你会花时间安装和学习一次,然后你解决问题的速度会快很多倍?

软件工程的演变

没有人可以在两个月、六个月甚至一年内学会软件工程。课程、大学或训练营不会教你如何成为一名软件工程师。我已经学习了二十多年,现在仍在继续学习。经过十年的学习和开发、创建和维护成千上万用户使用的应用程序后,我才能轻松地称自己为经验丰富的程序员。软件工程并不适合所有人,但每个人都应该学会使用计算机解决他们的问题。如果您可以学习编写简单的程序,那么您应该学习。如果您可以学习使用公开软件,您就应该学习。如果您可以学习使用开源软件并为自己定制它,那么您就拥有了超能力!每天都会给开发人员带来新的挑战、新的问题,这就是为什么需要软件工程。这个职业的主要任务是创建软件,使普通人不必多年处理它。这样就不需要长时间的学习来与程序交互。然而,软件工程师不断思考创建更好的工具来解决更复杂的已知问题,并尽一切可能确保新问题尽可能少地出现。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION