软件工程师必须知道的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个概念超越了编程语言与设计模式,软件工程师应当从更广的范围内明白这些道理。
以下是对20个软件工程师必须知道的常识的详细说明: 1. **面向对象的设计与分析**:面向对象设计(OOD)和分析(OOA)是软件开发的核心,强调封装、继承和多态等概念。SOLID原则(单一职责原则、开闭原则、里氏替换...
### 日志:每个软件工程师都应该知道的有关实时数据的统一抽象 #### 一、日志的概念与重要性 日志(Log)是计算机科学中的一个重要概念,尤其在分布式系统和实时数据处理领域扮演着核心角色。文章《日志:每个软件...
这份文件内容涉及到了软件工程师在工作中可能需要了解和掌握的多个重要技术概念和知识点。下面我将对这些概念进行详细解释: 1. 关系型数据库 (Relational Databases) 关系型数据库是基于关系模型的数据库管理系统...
计算机四级考试是针对软件工程师的一项专业能力评估,旨在测试考生在计算机科学与技术领域的理论知识、编程能力以及软件工程实践。对于准备参加此类考试的考生来说,了解并掌握相关知识点至关重要。以下是一些核心的...
在讨论《软件工程师不可不知的10个概念》时,我们必须将重点放在几个核心的IT和软件工程领域,以及它们对软件开发的深远影响。 1. 关系型数据库(Relational Databases): 关系型数据库是数据存储和管理的基石。...
在IT行业中,软件工程师和网络工程师是两个至关重要的角色,他们分别负责软件的开发与维护以及网络系统的构建和管理。为了提升自己的专业技能并获得相关认证,从业者常常需要通过一系列的考试来验证自己的知识水平。...
标题所指的“硬件工程师的十个软件技巧介绍”,其核心在于传递从硬件领域进入软件开发领域时,硬件工程师应当掌握和注意的关键软件开发技巧。因为嵌入式系统的设计不仅仅是硬件的事情,还需要理解软件如何工作以及...
《软件工程师认证与软件工程师考试大纲》 软件工程师认证是对个人在软件开发领域专业技能的权威认可,旨在确保合格人员能够根据软件开发项目管理和软件工程的规范,编写出高质量的程序,同时配合详尽的程序文档,以...
理解这些概念并能灵活应用是合格软件工程师的基本素养。 三、设计与实现 在设计与实现部分,考生需要掌握常用的算法和数据结构,如排序算法、查找算法、树结构、图结构等,并能根据实际问题选择合适的设计模式。...
本文档记录了一位软件工程师在XX公司为期五个月的工作经历,从八月份入职到十二月份结束,这位工程师不仅完成了从熟悉环境到参与实际项目的过程,还在此期间积累了丰富的经验和技能。 **入职初期阶段:** - **环境...
【标题】"软件工程师面试英语大全"所涵盖的知识点涵盖了软件工程领域中常见的面试问题、技术概念以及专业英语表达。这个资源是为那些寻求在外企工作的软件工程师准备的,旨在帮助他们提升在英文面试中的沟通能力和...
数据库是软件工程师需要掌握的另一个重要技术。学习数据库需要掌握数据库的原理和工具,如 MySQL、SQL Server 和 Oracle 等。学习数据库需要结合实际开发中的应用,学习 JDBC 或 ADO 等技术来将 Java、C#等语言的...
"se.rar_se 软件工程师_软件工程师"这个标题暗示了这是一个与软件工程师相关的资源压缩包,可能包含了丰富的学习资料。描述中的“非常不错的软件工程师需要学习的知识点多学多健康”强调了软件工程师需要广泛学习,...
作为高级软件工程师,理解这些基本概念至关重要。学习过程中,你需要深入理解如何进行有效的需求收集和管理,以及如何利用各种工具和技术进行系统设计,如UML(统一建模语言)。 二、编程语言与框架 掌握至少一种或...
Java软件工程师是IT行业中一个非常重要的角色,他们主要负责设计、开发、测试和维护使用Java编程语言编写的应用程序。在达内的培训课程中,学员们会接触到一系列全面且深入的Java技术,旨在培养出能够应对各种项目...