软件工程师不可不知的10个概念

出色的软件工程师善用设计模式,勤于代码重构,编写单元测试,并对简单有宗教般的追求。除了这些,优秀的软件工程师还要通晓10个概念,这10个概念超越了编程语言与设计模式,软件工程师应当从更广的范围内明白这些道理php

  1. 界面 (Interfaces )html

  2. 惯例与模板 (Conventions and Templates)java

  3. 分层 (Layering )web

  4. 算法的复杂性 (Algorithmic Complexity)算法

  5. 散列法 (Hashing )数据库

  6. 缓存 (Caching )编程

  7. 并发 (Concurrency )设计模式

  8. 云计算(Cloud Computing )api

  9. 安全(Security )数组

  10. 关系数据库 (Relational Databases )

10. 关系数据库 (Relational Databases) 
关系数据库由于在大规模 Web 服务上缺少可扩充性而颇受微词,然而,关系数据库仍然是近20年来计算机技术中最伟大的成就。关系数据库对处理订单,公司数据方面有着出色的表现。

关系数据库的核心是以记录表示数据,记录存放在数据库表,数据库使用查询语言(SQL)对数据进行搜索与查询,同时,数据库对各个数据表进行关联。

数据库的标准化技术(normalization)讲的是使用正确的方式对数据进行分存以下降冗余,并加快存取速度。
 
9. 安全 (Security) 
随着黑客的崛起与数据敏感性的上升,安全http://www.ijiami.cn/treg变得很是重要。安全是个广义的概念,涉及验证,受权与信息传输。

验证是对用户的身份进行检查,如要求用户输入密码。验证一般须要结合 SSL (secure socket layer)进行;受权在公司业务系统中很是重要,尤为是一些工做流系统。最近开发的 OAuth 协议能够帮助 Web 服务将相应信息向相应用户开放。Flickr 便使用这种方式管理私人照片和数据的访问权限。

另一个安全领域是网络设防,这关系到操做系统,配置与监控。不只网络危险重重,任何软件都是。Firefox 被称为最安全的浏览器,仍然须要频频发布安全补丁。要为你的系统编写安全代码就须要明白各类潜在的问题。
 
8. 云计算 (Cloud Computing) 
RWW 最近的关于云计算的文章 Reaching For The Sky Through Compute Clouds 讲到了云计算如何改变大规模 Web 应用的发布。大规模的并行,低成本,与快速投入市场。

并 行算法发明以来,首先迎来的是网格计算,网格计算是借助空闲的桌面计算机资源进行并行计算。最著名的例子是 Berkley 大学的 SETI@home 计划,该计划使用空闲的 CPU 资源分析太空数据。金融机构也大规模实施网格计算进行风险分析。空闲的资源,加上 J2EE 平台的崛起,迎来了云计算的概念:应用服务虚拟化。就是应用按需运行,并能够随着时间和用户规模而实时改变。

云计算最生动的例子是 Amazon 的 Web 服务,一组能够经过 API 进行调用的应用,如云服务(EC2),一个用来存储大型媒体文件的数据库(S3),索引服务(SimpleDB),序列服务(SQS)。

7. 并发 (Concurrency) 
并发是软件工程师最容易犯错的地方,这能够理解,由于咱们一直听从线形思惟,然而并发在现代系统中很是重要。

并 发是程序中的并行处理,多数现代编程语言包含内置的并发能力,在 Java,指的是线程。关于并发,最经典的例子是“生产/消费”模式,生产方生产数据和任务,并放入工做线程消费或执行。并发的复杂性在于,线程须要常常 访问共同数据,每一个线程都有本身的执行顺序,但须要访问共同数据。Doug Lea 曾写过一个最复杂的并发类,如今是 core Java 的一部分。

6. 缓存(Caching) 
缓 存对现代 Web 程序不可或缺,缓存是从数据库取回,并存放在内存中的数据。由于数据库直接存取的代价很是高,将数据从数据库取回并放在缓存中访问就变得十分必要。好比, 你有一个网站,要显示上周的畅销书,你能够从数据将畅销书榜一次性取回放在缓存中,而没必要在每次访问时都去数据库读数据。

缓存须要代价,只有最经常使用的内容才能够放入缓存。不少现代程序,包括 Facebook,依靠一种叫作 Memcached 的分布式缓存系统,该系统是 Brad Firzpatrick 在工做于 LiveJournal 项目时开发的,Memcached 使用网络中空闲的内存资源创建缓存机制,Memcached 类库在不少流行编程语言,包括 Java 和 PHP 中都有。

5. 散列法(Hashing)
Hashing 的目的是加速访问速度。若是数据是序列存储的,从中查询一个项的时间取决于数据列的大小。而散列法对每个项计算一个数字做为索引,在一个好的 Hashing 算法下,数据查找的速度是同样的。

除了存储数据,散列法对分布式系统也很重要。统一散列法(uniform hash )用来在云数据库环境下,在不一样计算机之间分存数据。Google 的索引服务就是这种方法的体现,每个 URL 都被散列分布到特定计算机。

散列函数很是复杂,但现代类库中都有现成的类,重要的是,如何对散列法进行细调以得到最好的性能。

4. 算法的复杂性 (Algorithmic Complexity) 
关于算法的复杂性,软件工程师须要理解这样几件事。第一,大O标记法(big O notation); 第二,你永远都不该该使用嵌套式循环(循环里面套循环),你应该使用 Hash 表,数组或单一循环;第三,现在优秀类库比比皆是,咱们没必要过度纠缠于这些库的效能的差异,咱们之后还有机会进行细调;最后,不要忽视算法的优雅及性能, 编写紧凑的,可读的代码可让你的算法更简单,更干净。

3. 分层 (Layering) 
用分层来讨论软件架构是最容易的。John Lakos 曾出版过一本关于大型 C++ 系统的书。Lakos 认为软件包含了层,书中介绍了层的概念,方法是,对每一个软件组件,数一下它所依赖的组件数目就能够知道它的复杂程度。

Lakos 认为,一个好的软件拥有金字塔结构,就是说,软件组件拥有层层积累的复杂度,但每一个组件自己必须简单,一个优秀的软件包含不少小的,可重复使用的模块,每 个模块有本身的职责。一个好的系统中,组件之间的依赖性不可交叉,整个系统是各类各样的组件堆积起来,造成一个金字塔。

Lakos 在软件工程的不少方面都是先驱,最著名的是 Refactoring (代码重构)。代码重构指的是,在编程过程当中须要不断地对代码进行改造以保证其结构的健壮与灵活。

2. 惯例与模板 (Conventions and Templates) 
命 名惯例和基础模板在编程模式中常被忽视,然而它多是最强大的方法。命名惯例使软件自动化成为可能,如,Java Beans 框架在 getter 和 setter 方法中,使用简单的命名惯例。del.icio.us 网站的 URL 命名也使用统一的格式,如http://del.icio.us/tag/software 会将用户带到全部标签为 software 的页。

不少社会网络均使用简单命名,如,你的名字是 johnsmith ,那你的头像可能命名为 johnsmith.jpg,而你的 rss 聚合文件的命名极可能是 johnsmith.xml 。命名惯例还用于单元测试,如,JUnit 单元测试工具会辨认全部以 test 开头的类。咱们这里说的模板(templates )指的并非  C++ 或 Java 语言中的 constructs,咱们说的是一些包含变量的模板文件,用户能够替换变量并输出最终结果。Cold Fusion 是最早使用模板的程序之一,后来,Java 使用 JSP 实现模板功能。Apache 近来为 Java 开发了很是好用的通用模板, Velocity。PHP 自己就是基于模板的,由于它支持 eval 函数。1. 界面(Interfaces) 软件工程中最重要的概念是界面。任何软件都是一个真实系统的模型。如何使用简单的用户界面进行模型化相当重要。不少软件系统走这样的极端,缺少抽象的冗长代码,或者过度设计而致使无谓的复杂。在众多软件工程书籍中,Robert Martin 写的《敏捷编程》值得一读。关于模型化,如下方法对你会有帮助。首先,去掉那些只有在未来才可能用得着的方法,代码越精练越好。第二,不要总认为之前的东西是对的,要善于改变。第三,要有耐心并享受过程。

相关文章
相关标签/搜索