软件工程师必须知道的10个概念|读写网
原文作者:Alex Iskold
原文链接:Top 10 Concepts That Every Software Engineer Should Know - ReadW
翻译:薄荷脑
《软件开发的未来
》介绍了一些编程时所用到的技术。有了诸如Amazon网络服务之类的基础构件及丰富的基础库,开发一个好的软件就不需要像一个村落那么多的人了。
最近,有些工程师称他们可以独立开发一个完整的系统。在本文中,我们将介绍10个概念以帮助软件工程师们实现这一点。
一个成功的软件工程师
知道并会使用一定的设计模式、分解代码、撰写单元测试并从意识上追求简单化。除了这些基本方法外,还有一些优秀的程序员知晓的概念。这些概念超越了编程语言和不同的项目——它们不是设计模式,而是你需要掌握的更宏观的东西。这10个概念是:
- 接口
- 协议和模板
- 分层
- 算法复杂度
- 哈希
- 缓存
- 并发
- 云计算
- 安全
- 关系数据库
10、关系数据库
近年来,关系数据库
的名声越来越臭
,因为它不能很好地适应庞大的网络服务。但是,这项技术仍是最基础的计算机技术之一,陪伴我们度过了20个年头,并将继续存在很长一段时间。关系数据库很适合对直线式的系统、公司数据库和损益数据的处理。
关系数据库的核心是将信息以“记录”的方式表现出来。每一条记录都被添加到了一张表里,该表定义了信息的类型。该数据库提供了一种查询语言来搜索这些数据,目前最流行的是SQL语言。该数据库还允许从多个表中提取数据。
数据正规化技术是为将数据正确地保存再各个标准,从而使数据冗余达到最小,存取速度达到最高。
9、安全
随着黑客技术和数据敏感度的日益上升,安全
问题也被提到了至高无上的地位。安全是一个涉及面很广的话题,如认证、授权及信息传输等。
认证主要是用来验证用户的身份,典型的方法是在网站中弹出一个密码输入对话框。认证主要使用在SSL(安全套接字层)连接中,它可以在HTTP
协议之上传输加密后的数据。授权是关于权限管理方面的,也是交互系统中非常重要的一项功能,特别是定义了工作流的项目。最近开发出来的OAuth
原型帮助网络服务系使用户可以访问自己的私密信息,这也是Flickr所使用的工具。
另一个安全领域是网络保护,这牵涉到操作系统配置、监视黑客的行动等。不仅网络是脆弱的,任何一个软件都是脆弱的。火狐浏览器,宣称是最安全的浏览器,也需要持续地打补丁。所以,要为你的项目写安全保护代码就需要了解这一领域的知识并识别出潜在的问题。
8、云计算
在我们最近发表的一篇文章《用云计算接触天空
》中提到了商业化的云计算
是怎样改变大规模网络应用程序的。通过超大量的并行运算,廉价的云计算减少了成本和时间。
云计算诞生于并行计算,即多个问题可以通过同时在多台计算机上运行来加快速度。
在并行算法之后出现了方格算法,这项技术在空闲的计算机上进行并行运算。第一个用例是Berkley的SETI@home
项目,它使用了空闲的CPU周期来处理来自各方的数据。方格计算被金融公司广泛用来进行风险计算。但是,对这些资源的低估及J2EE平台的迅速发展,成为了云计算诞生的前兆:应用程序服务器虚拟化。其理念是:根据计算机用户的使用情况来决定要不要其参与计算。
如今最鲜活的云计算用例是使用应用程序接口(API)来连接的Amazon网络服务包。Amazon提供云服务(EC2)、用来储存大媒体文件
的数据库(S3)、索引服务器(SimpleDB)、队列服务器(SQS)。这些最初的模块已经产生了前所未有的大规模计算了,而更棒的即将到来。
7、并发
并发是程序员经常犯的错误之一,其实这也可以理解,因为我们在学校强调的是线性思维,而实际操作中则是多个事件一起发生。但是,并发在现代任何一个系统总都是非常重要的。
并发也就是平行,只不过是在程序内部进行的。大多数现代编程语言都原生支持了并发,如在Java中可以使用线程来实现这个功能。
一个经典的并发用例是生产/消费模型。当生产者在进行数据和任务处理时,消费者也在进行消费和执行。并发编程的复杂度取决于线程通常是需要对共有数据进行操作的。每个线程都有自己的执行流程,但都需要操作共有数据。目前一个最为复杂的并发程序是由Douq Lea
开发的,目前作为Java核心
的一部分。
6、缓存
现在所有的系统有在使用缓存,即在内存中开辟一块区域来存放数据。使用缓存是因为直接在数据库中进行操作是非常耗时的。例如,你在一个网站上要列出上一
周流行排行榜,你就可以将这个列表计算出来存放在缓存中,这样当用户再次请求时就不需要重新生成这些数据而是直接从缓存中读取就可以了
使用缓存也是有代价的。只有一小部分数据可以被存放在内存中。比较通用的数据剔除手段是通过算法选出最不常使用的数据(LRU)。这种算法必须是有效率的,而不是减慢程序的运行。
现在许多网络应用程序,包括Facebook,都在使用一种由Brad Firzpatrick
开发的分布式的缓存系统Memcached
。其理念使使用网络中空闲的空间来储存缓存。如今,这项技术已在包括Java和PHP中有了相应的实现。
5、哈希
哈希的理念是更快地存取数据。如果数据是线性存储的,那么搜索数据的时间取决于线性表的长度。对每一个数据,哈希函数计算出一个数值用以作为该表的索
引。有了一个好的哈希函数,搜索每一个数据的时候都将是固定的。要写出一个完美的哈希函数是很困难的,特别是要处理哈希表中的冲突。
除了在数据储存中的应用外,哈希表在分布式系统中的应用也是非常重要的。所谓的正规哈希指的是用来在云数据库中定位数据的。谷歌的索引服务就是这项技术的一个很好的应用:每个网络地址都被定位到了特定的计算机上。Memcached也使用了类似的哈希函数。
哈希函数可以非常复杂,但现在已经有类库提供了很好的缺省支持。所以最关键的是哈希函数是如何运行的,并怎样才能使其发挥最大的效用。
4、算法复杂度
软件工程师要知道许多关于算法复杂度的知识。首先是大写的字母“O”标记。如果某些算法的复杂度为O(n),那它就是一个线性结构。O(n^2)是二次
结构。看到这个标记你就应该知道搜索链表的复杂度为O(n),进行二进制搜索时(已排序)的空间复杂度为log(n)。而对n个元素进行排序的空间复杂度
为n*log(n)。
在编写代码时应尽量避免嵌套循环,目前大多数代码都是使用了哈希表、简单链表和单循环。
由于有许多优秀的类库,我们很少在程序的效率上花功夫。这样是可以的,因为优化可以之后在进行。
一流的算法和表现不能被忽略,写出规整可读的代码可以保证算法的简洁明了。
3、分层
用来讨论软件架构好坏的最简单的方法要属分层了。分层第一被关注是当John Lakos出版了一本关于大规模C++系统
的书。Lakos说软件是由层构成的。这本书介绍了分层的概念,方法是这样的:计算每一个软件构件所依赖的其他构件的数量,从而衡量该构件的复杂度。
Lakos说一个好的软件应该是金字塔形状的,也就是说,随着构件的增加,软件的复杂度也在增加,但不是急剧地增加。换言之,一个好的软件系统
是有多个小型的可重复使用的构件搭建起来的,每个构件都有自己的任务。在一个好的系统中,不存在循环依赖,从而系统由能独立完成作业的层构成,这样就形成
了金字塔的结构。
Lokos的想法启迪了软件工程师们,最著名的就是重构
的广泛应用,其理念就是通过对软件的分析来保证系统的稳定性和灵活性。另外一个主要贡献者是Object Mentor的Robert Martin博士
,他写了一本关于依赖和非循环架构的书。
2、协议和模板
制定协议和模板可以算是最宏观的软件设计模式了,而且也是最强大的。
协议的制定可以使软件开发自动化。如,Java Beans框架是建立在获取者和设置者的协议之上的。del.icio.us中的http://del.icio.us/tag/software
是将所有的用户引导到被标记为software的页面中。
许多社会化的软件以类似的方式使用协议。如,你的名字是jonsmith,那你的图片被命名为johnsmith.jpg,你的RSS订阅被命名为johnsmith.xml。
这里讨论的模板并不是C++和Java的一个结构,而是一个包含变量的文件可以被绑定到对象、解决方案上,从而显示出用户的结果。
Cold Fusion是第一个在网络应用程序中广泛应用模板的语言。Java的JSP紧跟其后,然后是最近Apache开发出的Velocity。PHP本身可以用作模板,因为它有eval函数。对XML编程来说,使用XSL语言来写模板是最标准的。
从生成HTML页面到发送标准化的支持邮件,模板在所有的现代软件系统中都是十分重要的。
1、接口
软件开发中最重要的一个概念就是接口。所有的软件都是一个真实系统的模型,理解怎样使用正确而简单的接口去将问题模型化是非常重要的。很多系统的设计会走向极端:缺乏抽象的冗长的代码,或是充斥着复杂的从不使用的代码。
在众多书籍中,Robert Martin博士写的《灵敏编程》脱颖而出,因为它着重强调了如何写出正确的接口。
在建模的过程中,有许多方式可以开发出正确的解决方法。首先,不要添加仅仅是将来可能使用到的方法,要使接口最小化,祛除不需要的部分。其次,
不要害怕承认昨天所做的成果在今天看来是错误的,要有改进事物的决心。再次,要耐心,并学会享受过程。最终你就能开发出自我感觉良好的系统了。在这之前都
要把握好方向,不要停滞。
结论:
现代软件工程是复杂和强大的,经过了几是年的积累,几百万行的代码和前所未有的云计算。如今,只需要一些聪明的程序员就可以开发出之前需要相当多人力的软件。当一个开发能手仍要知道何时因为何种原因要使用某种工具。
分享到:
相关推荐
一个介绍软件工程师不可不知道的10 个概念的文档
出色的软件工程师善用设计模式,勤于代码重构,编写单元测试,并对简单有宗教般的...除了这些,优秀的软件工程师还要通晓10个概念,这10个概念超越了编程语言与设计模式,软件工程师应当从更广的范围内明白这些道理。
软件工程师必知的十个概念.pdf
软件工程师不可不知的10个概念.pdf
日志:每个软件工程师都应该知道的有关实时数据的统一抽象
软件工程师认证考试大纲考试要求: (1)理解软件工程管理的概念和任务; (2)理解软件生存期过程; (3)理解软件工程标准; (4)掌握需求分析、测试、维护基本技术; (5)掌握软件度量、软件配置管理...
软件工程-软件设计概述 如何将分析模型转换成软件设计? 作为软件工程师在软件设计方面应使用哪些基本原则和概念?
软件工程师操作系统基础知识 长握操作系统的类型、功能、层次结构和进程概念,以及作业、处理机、存储、文件和设备等管理的原理和方法。
软件测试基本概念 软件测试技术 软件测试方法 软件测试流程 软件测试过程 微软软件测试简介
·软件质量及软件质量管理概念 ·软件质量管理体系 ·软件质量管理的目标、内容、方法和技术 5.4 软件过程管理 ·软件过程管理概念 ·软件过程改进 ·软件能力成熟度模型 5.5 软件配置管理...
软件测试的一些基本概念的介绍,自己收集的
伊恩·萨默维尔著的《软件工程(原书第10版)》是系统介绍软件工程理论的经典教材,共包含四个部分:第一部分(第1~9章)是对软件工程的一般性介绍,介绍了软件工程的一些重要概念(如软件过程和敏捷方法),描述了...
软件设计师高级考试是中国计算机技术与软件专业技术资格(水平)考试中的一种,主要考察软件设计师对于软件设计的核心概念、原理和技术的掌握程度,以及对于实际项目的设计能力和经验。下面就软件设计师高级考试的...
2.1 软件工程师不可不知的10个概念 ........................................................................................................... 9 2.2 素质要求 ...............................................
嵌入式软件工程师C语言面试题汇总,包括一些C语言的基础概念、内存管理、指针、结构体、文件操作、数据结构算法、一些容易出错的小细节等等
为了开发满足用户原始需求的高质量软件,有必要执行需求工程,以便正确识别,检查和指定要开发的软件环境。 但是,这个问题正在引起... 这样,软件工程师将能够更好地开发软件,从而更好地满足最终用户和赞助商的需求。
这本书由ad9361的设计者adi公司编写,目的是提供一个实际的学习经验使用软件定义无线电工程感兴趣的学生和行业从业人员掌握的设计、实现和通信系统的实验。这本书提供了一个新的视角理解和从头创建新的通信系统。...
软件工程之顺序图:从概念到实例的交互建模教程 软件工程之顺序图:从概念到实例的交互建模教程 软件工程之顺序图:从概念到实例的交互建模教程 软件工程之顺序图:从概念到实例的交互建模教程 软件工程之顺序图:从...