您现在的位置是:主页 > 技术杂谈 >

【如云阁小说网】十大概念: 每个软件工程师的必备

admin 2020-01-05 09:31 【技术杂谈】 0次人已围观

简介软件开发的未来与优秀的工匠密不可分。 如今,几个知道自己在做什么的工程师可以提供完整的系统。在这篇文章中,我们讨论了软件工程师实现这一点应了解的十大概念。 一个成功的软件工...

软件开发的未来与优秀的工匠密不可分。

如今,几个知道自己在做什么的工程师可以提供完整的系统。在这篇文章中,我们讨论了软件工程师实现这一点应了解的十大概念。

一个成功的软件工程师知道并使用设计模式,积极地重构代码,编写单元测试,并虔诚地追求简单。除了基本方法之外,还有一些优秀的软件工程师都知道的概念。这些超越编程语言和项目的东西–它们不是设计模式,而是您需要熟悉的广阔领域。

十大概念是:

1.介面

2.约定和模板

3.分层

4.算法复杂度

5.散列

6.快取

7.并发

8.云计算

9.安全

10.关系数据库

10.关系数据库

关系型数据库已经最近得到一个不好的名字,因为他们不能很好地扩展,以支持大规模的Web服务。但是,这是计算领域最基本的成就之一,已经使我们进行了二十年,并将持续很长时间。关系数据库非常适合订单管理系统,公司数据库和损益数据。

9.安全性

随着黑客攻击和数据敏感性的提高,安全性至关重要。安全是一个广泛的主题,包括身份验证,授权和信息传输。

身份验证是关于验证用户身份的。一个典型的网站会提示您输入密码。身份验证通常通过SSL(安全套接字层)进行,SSL是通过HTTP传输加密信息的一种方式。授权与权限有关,在公司系统中尤其是定义工作流程的系统中很重要。最近开发的OAuth协议帮助Web服务使用户能够打开对其私人信息的访问。这就是Flickr允许访问单个照片或数据集的方式。

另一个安全领域是网络保护。这关系到阻止黑客的操作系统,配置和监视。不仅网络易受攻击,任何软件都易受攻击。

市场上最安全的Firefox浏览器必须不断地修补代码。要为您的系统编写安全代码,需要了解细节和潜在问题。

8.云计算

在我们最近的职位深远的天空通过计算云,我们谈到了如何小商品云计算正在改变我们交付大型Web应用程序的方式。大规模并行,廉价的云计算可降低成本并缩短上市时间。

云计算源于并行计算,而并行计算是可以并行运行许多问题的解决方案。

并行算法问世之后,网格计算就在空闲桌面上进行了并行计算。第一个示例之一是Berkley的SETI @ home项目,该项目使用了备用CPU周期来处理来自空间的数据。网格计算已被金融公司广泛采用,这些公司进行大量的风险计算。资源利用不足的概念以及J2EE平台的兴起,催生了云计算的先驱:应用程序服务器虚拟化。想法是按需运行应用程序,并根据一天中的时间和用户活动来更改可用的应用程序。

当今最生动的云计算示例是Amazon Web Services,它是可通过API获得的软件包。亚马逊的产品包括云服务(EC2),用于存储和服务大型媒体文件的数据库(S3),索引服务(SimpleDB)和队列服务(SQS)。这些最初的模块已经为进行大规模计算提供了前所未有的方式,而且肯定会出现最好的结果。

7.并发

并发是工程师臭名昭著的一个问题,并且可以理解的是,并发问题是可以理解的,因为并发大脑同时处理很多事情,并且在学校中强调线性思维。然而,并发在任何现代系统中都很重要。

并发是关于并行性的,但是在应用程序内部。大多数现代语言都有内置的并发概念。在Java中,它是使用线程实现的。

一个典型的并发示例是生产者/消费者,生产者在其中生成数据或任务,并将其放置以供工作线程使用和执行。并发编程的复杂性源于以下事实:线程经常需要对公共数据进行操作。每个线程都有其自己的执行顺序,但是访问公共数据。一个最复杂的并发库的已开发由Doug Lea的,现在的一部分核心Java。

6.缓存

没有缓存就无法运行现代Web系统,缓存是一种内存中存储,其中存储着通常存储在数据库中的信息的子集。

对缓存的需求来自这样一个事实,即基于数据库生成结果的成本很高。例如,如果您有一个列出上周流行书籍的网站,则希望一次计算此信息并将其放入缓存。用户请求从缓存中获取数据,而不是访问数据库并重新生成相同的信息。

缓存是有代价的。信息的某些子集只能存储在内存中。最常见的数据修剪策略是逐出最近最少使用的项目(LRU)。修剪需要高效,而不是减慢应用程序的速度。

许多现代Web应用程序(包括Facebook)都依赖于Brad Firzpatrick在开发LiveJournal时开发的名为Memcached的分布式缓存系统。想法是创建一个利用网络上备用内存容量的缓存系统。如今,已经有 适用于许多流行语言(包括Java和PHP)的Memcached库。

5.散列

背后的思想是快速访问 数据。如果数据是顺序存储的,则找到项目的时间与列表的大小成正比。对于每个元素,哈希函数都会计算一个数字,该数字用作表的索引。 给定一个良好的哈希函数,该函数沿表均匀分布数据,查找时间是恒定的。完善散列是困难的,并且要处理散列表实现支持冲突解决。

除了基本的数据存储,散列在分布式系统中也很重要。所谓的统一哈希用于在云数据库中的计算机之间平均分配数据。这项技术的一种特色是Google索引服务的一部分;每个URL都哈希到特定的计算机。Memcached同样使用哈希函数。哈希函数既复杂又复杂,但是现代库具有良好的默认值。重要的是哈希如何工作以及如何对其进行调整以实现最大的性能收益。

4.算法复杂度

工程师必须了解的算法复杂性很少。首先是大O符号。如果某物取O(n),则它的数据大小是线性的。O(n ^ 2)是二次的。使用这种表示法,您应该知道通过列表进行的搜索为O(n),通过二进制搜索(通过排序的列表)为log(n)。对n个项目进行排序将花费n * log(n)时间。

您的代码应该(几乎)永远不要有多个嵌套循环(循环内的循环在循环内)。今天编写的大多数代码都应使用哈希表,简单列表和单个嵌套循环。

由于大量优秀的库,这些天我们不再关注效率。很好,因为在您正确设计之后,以后可能会进行调整。

精致的算法和性能是您不容忽视的。编写紧凑且易读的代码有助于确保您的算法简洁明了。

3.分层

分层可能是讨论软件体系结构的最简单方法。

当约翰·拉科斯(John Lakos)出版有关大规模C ++系统的书时,它首先受到了严重的关注。Lakos认为软件由层组成。该书介绍了分层的概念。方法是这样的。对于每个软件组件,计算其依赖的其他组件的数量。这是组件的复杂程度的度量。

Lakos认为,好的软件遵循金字塔的形状。也就是说,每个组件的累积复杂度在逐渐增加,但直接复杂度却没有。换句话说,一个好的软件系统由小的,可重复使用的构件组成,每个构件都有自己的责任。在一个好的系统中,组件之间不存在循环依赖性,整个系统是功能层次的堆栈,形成金字塔。

Lakos的工作是软件工程(尤其是重构)许多发展的先驱。重构背后的想法是不断地对软件进行雕刻,以确保其结构合理且灵活。另一个主要贡献是来自Object Mentor的Robert Martin博士,他撰写了有关依赖和非循环架构的文章。

由Headway软件开发的Structure 101和由我以前的公司Information Laboratory开发的SA4J( 可以从IBM购买)可以帮助工程师处理系统架构。

2.约定和模板

命名约定和基本模板是最容易被忽视的软件模式,但可能是最强大的。

命名约定可实现软件自动化。例如,Java Beans框架基于针对getter和setter的简单命名约定。并且del.icio.us中的规范URL:http://del.icio.us/tag/software会将用户带到具有所有标记为software的页面。

许多社交软件以类似的方式利用命名约定。

例如,如果您的用户名为johnsmith,则头像可能为johnsmith.jpg,而rss feed为johnsmith.xml。

命名约定也用于测试中,例如JUnit自动识别类中所有以prefixtest开头的方法。

模板不是C ++或Java语言构造。我们正在谈论的模板文件包含变量,然后允许对象的绑定,分辨率和为客户端呈现结果。

Cold Fusion是最早普及Web应用程序模板的公司之一。Java跟着JSP,最近,Apache 为Java 开发了方便的通用模板,称为Velocity。由于PHP 支持eval函数(请注意安全性),因此可以用作自己的模板引擎。对于XML编程,通常使用XSL语言来做模板。

从生成HTML页面到发送标准化的支持电子邮件,模板是任何现代软件系统中必不可少的帮助者。

1.接口

软件中最重要的概念是界面。任何好的软件都是真实(或虚构)系统的模型。了解如何根据正确和简单的界面对问题建模是至关重要的。许多系统都受到极端的影响:拥挤,冗长的代码,几乎没有抽象,或者设计过度的系统具有不必要的复杂性和未使用的代码。

在众多书籍中,Robert Martin博士撰写的《敏捷编程》之所以脱颖而出,是因为它专注于对正确的接口进行建模。

在建模中,有几种方法可以迭代到正确的解决方案。首先,永远不要添加将来可能有用的方法。保持简约,尽可能少走远。其次,不要害怕今天认识到您昨天所做的事情是不对的。乐于改变。第三,要有耐心,享受过程。

最终,您将获得一个感觉不错的系统。在此之前,请不断迭代,不要安顿下来。

结论

现代软件工程功能强大,功能强大,拥有数十年的经验,数百万行支持代码以及对云计算的意外访问。

如今,只有几个聪明的人可以创建以前需要数十个人努力的软件。但是,优秀的工匠仍然需要知道使用什么工具,何时以及为什么使用。

孟文鹏博客版权所有丨如未注明 , 均为原创丨 转载请注明【如云阁小说网】十大概念: 每个软件工程师的必备