`

出色的软件工程师善用设计模式,勤于代码重构,编写单元测试,并对简单有宗教般的追求。除了这些,优秀的软

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

接口 (Interfaces )
惯例与模板 (Conventions and Templates)
分层 (Layering )
算法的复杂性 (Algorithmic Complexity)
散列法 (Hashing )
缓存 (Caching )
并发 (Concurrency )
云计算(Cloud Computing )
安全(Security )
关系数据库 (Relational Databases )
10. 关系数据库 (Relational Databases)
关系数据库因为在大规模 Web 服务上缺乏可扩充性而颇受微词,然而,关系数据库仍然是近20年来计算机技术中最伟大的成就。关系数据库对处理订单,公司数据方面有着出色的表现。

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

数据库的标准化技术(normalization)讲的是使用正确的方式对数据进行分存以降低冗余,并加快存取速度。

9. 安全 (Security)
随着黑客的崛起与数据敏感性的上升,安全变得非常重要。安全是个广义的概念,涉及验证,授权与信息传输。

验证是对用户的身份进行检查,如要求用户输入密码。验证通常需要结合 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 写的《敏捷编程》值得一读。

关于模型化,以下方法对你会有帮助。首先,去掉那些只有在将来才可能用得着的方法,代码越精练越好。第二,不要总认为以前的东西是对的,要善于改变。第三,要有耐心并享受过程。

我做了部分修改。

本文国际来源:http://www.readwriteweb.com/archives/top_10_concepts_that_every_software_engineer_should_know.php
分享到:
评论
1 楼 zhaozhongwei 2008-07-28  
System.out.println("有时间看看");

相关推荐

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

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

    明星软件工程师的十种特质

    优秀的工程师知道何时该使用设计模式,而不是为了使用设计模式而使用设计模式。 5. 编写测试 编写测试是明星软件工程师的第五个特质。他们知道测试的目的就是创建一个能正常运作的系统。优秀的工程师通常会确保...

    明星软件工程师的十种特质.docx编程资料

    掌握并适当应用这些模式可以使软件设计更加优雅,同时也提高了代码的可复用性和扩展性。明星工程师能够灵活运用设计模式,而不是盲目地套用,他们会根据项目的实际情况选择最合适的设计方案,使系统结构更加合理化。...

    PowerMock是一个Java框架能够允许你单元测试通常被视为不可测试的代码

    PowerMock是一个强大的Java框架,它的主要目标是使得那些在传统单元测试中难以或者无法测试的代码变得可测试。这个框架扩展了诸如Mockito等其他流行的模拟库的功能,使其能够处理更复杂的模拟场景。在传统的单元测试...

    <转>SourceMonitor: 代码重构的小工具,大用场

    5. **代码覆盖率**:虽然SourceMonitor本身不直接提供单元测试集成,但它可以与单元测试工具结合,通过统计未被测试覆盖的代码,辅助开发者提高测试覆盖率。 6. **自定义报告**:用户可以根据需求定制报告,包括...

    自动化测试工程师模板.docx

    首先,该工程师【熟练掌握软件测试理论知识和测试流程】,具备独立编写测试用例、执行测试、追踪缺陷的能力,并能撰写测试报告。这表明其具有扎实的测试基础和良好的问题解决能力。 其次,工程师【精通Python编程】...

    程序设计基本原则1

    程序设计基本原则是软件开发中非常重要的一部分,它可以帮助开发者编写高质量的代码,提高代码的可读性、可维护性和可扩展性。以下是程序设计基本原则的详细说明: 1. Do not repeat yourself (强调后期代码重构,...

    Java代码编写的30条建议

    23. **使用单元测试**:编写测试用例,确保代码的正确性。 24. **代码复用**:尽量避免复制粘贴代码,提倡高内聚、低耦合。 25. **理解并使用Lambda表达式**:Java 8引入的Lambda让代码更加简洁。 26. **避免不必...

    软件著作权代码整理工具

    《软件著作权代码整理工具详解与应用》 在IT行业中,软件著作权是保护开发者创新成果的重要法律武器,它确保了软件作者对其创作的原创性代码享有权利。为了成功申请软件著作权,通常需要提交一份详尽的代码文档,...

    用来管理代码片段的软件

    除了基本的分类和搜索,一款优秀的代码片段管理软件还可能包含以下特性: 1. **版本控制**:对于重要的代码片段,软件可能支持版本控制,这样你就可以跟踪代码的变化,回滚到早期版本,或者对比不同版本的差异。 2...

    Clean-Code-Study:TDD,重构,有效的Java,设计模式,框架

    TDD遵循“红-绿-重构”三步法则:首先编写失败的测试(红色),然后写代码使测试通过(绿色),最后对代码进行重构以优化和保持整洁(重构)。 **重构** 重构是改进代码结构而不改变其外在行为的过程。它有助于提高...

    常见设计模式的解析和实现(C++版)

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板或蓝图,可以被反复使用,以提高代码的可读性、可维护性和可复用性。本资料“常见设计模式的解析和实现(C++版)”深入探讨了在C++环境中...

    一种高效的写代码方法,亲测可用

    总结起来,高效的Java编程不仅要求我们熟练掌握语言本身,还需要理解并应用面向对象设计原则、设计模式,善用IDE和版本控制工具,以及持续学习和更新知识。通过实践这些方法,我们不仅可以编写出高质量的代码,还能...

    有经验的Java开发者和架构师容易犯的10个错误(上)Ja

    在Java开发领域,即使是经验丰富的开发者和架构师也可能会陷入一些常见的...以上就是有经验的Java开发者和架构师容易犯的十个错误,了解并避免这些错误,将有助于提升个人和团队的开发效率,打造出更高质量的软件产品。

    善用佳软:高效能人士的软件之道

    《善用佳软:高效能人士的软件之道》是一本专为提高个人生产力而撰写的指南,它深入探讨了如何通过正确使用软件工具提升工作效率,从而成为高效能人士。本书的核心理念是,软件不仅是工具,更是提升个人效能、管理...

    java多线程_设计模式_各种技术(我的书架)

    在IT行业中,多线程和设计模式是两个关键的话题...通过阅读和实践这些资源,你将能够更好地应对多线程编程中的挑战,灵活地运用设计模式解决问题,并善用注解和工具如Hibernate来简化数据库管理和增强代码的可维护性。

    应用 C++技术 构建优质软件

    总之,应用C++技术构建优质软件需要扎实的语言基础,熟练掌握面向对象编程和模板机制,善用C++标准库,理解异常处理和现代C++特性,并遵循良好的编程实践和设计模式。只有这样,才能编写出高效、稳定且易于维护的...

    go编程软件

    这个插件可能包含了对Go语言语法高亮、代码智能提示、重构工具、调试器等功能的实现,帮助开发者在IDEA平台上更好地编写和调试Go代码。 总之,Go编程软件和Web可视化编程结合,为Web开发提供了一种高效且易上手的...

Global site tag (gtag.js) - Google Analytics