程序员

一,概述

本章的大部分内容着眼于软件构建,也就是程序的编写。在本章中,我们将介绍学习程序设计过程中些需要关注的一些问题以及大多数程序语言都具有的一些共有元素。

如果你只希望学习一门特定的语言的话,你可以跳过本章直接阅读你希望学习的那门语言的相关教程,但是我们推荐初学者快速浏览一下本章以获得一个总体的印象。

软件编程:舒叶开花

二,选择编程语言

很多人在下定决心要从事程序编写工作的时候会想“我要学哪种语言?”,或者“哪种语言比起其他语言更好?”。实际上,他们更应该想的是“我如何才能成为一个好的程序员?”,或者换种说法,“一个好的程序员需要哪方面的知识和素质?”。

在编程语言的选择上,如果仅是泛泛而谈的话,一种语言对于另外一种语言,一般不会有绝对的优势。但是各种编程语言最初都是为了特定的目的而设计的,这也就是说,你如果要判断一门编程语言优劣的话,一定要根据你所要进行的开发的种类而定。举个例子来讲,如果你的程序工作在dos环境下并且要很多地和硬件交互的话,那么C语言可能会是一种不错的选择,但是假如你现在只想写一个网页,那么你就必须学习HTML了。

对于初学者来讲,一般都希望可以选择一种容易理解的,或者是比较流行的语言进行入门。下面我们从几个方面来对目前的语言作一个大略的比较。

三,入门问题

一个初学者应该如何入门呢?

在这里,我们所说的“初学者”是指那些以前从来没有接触过程序开发或者很少接触程序开发的人。对于一个初学者来讲,可能他们对于编程语言的理解仍然处于非常懵懂的阶段。在这种情况下,如果有人向你推荐从汇编语言开始入门,那么一定不要相信他的话。

虽然目前有各种类型的语言,比如结构化的语言,面向对象的语言,等等。但是如果没有特定的目的而只是想学习程序设计基本理论的话,我们推荐你从一门结构化的高级语言开始入门,比如Pascal或者BASIC。

为什么不从更为流行的Java或者功能更为强大的C语言开始入门学习呢?

首先,我们知道,各个语言之间都存在一些相通的元素,比如都有变量和常量的定义,都有一定的程序控制流,大部分的语言都有函数定义,等等。如果你能够熟悉一门语言的这些要素,再去学习其他的语言时候就会事半功倍。

其次,越是功能强大的语言,也就意味着它的复杂度越高。对于一个头脑中只有很少程序开发概念的人来讲,在这些复杂的特性面前,他们往往会感到不知所措:哪里才是应该重点理解的内容呢?看起来仿佛每个特性都很重要,结果很可能是什么都难以深入理解。而且过早的学习一些特性比较多的语言容易使学者者产生挫折感,从而丧失掉继续学习的动力。

所以我们推荐初学者从一些简单的语言开始学习。在能够把握住一些语言中的要素之後,再循序渐进地学习那些功能更强大,复杂度也更高的语言。

当然,世界上没有绝对的事情,并不是每个人都需要从最简单的学起。只要你有足够的智慧和决心,你就可以按照你自己的想法去学习。

四,如何成为一名好的程序员

这是一个很多人关心的问题。实际上并没有标准的答案。

这个问题的关键是,什么样的程序员才是足够“好”?在现实中,我们接触到各种各样的人。什么样的人是一个“好”人呢?可能1000个人会有1000种不同的回答。在程序员的问题上,也是同样的情况。

通常来讲,一个“好”的程序员首先要掌握一门或者很多门的编程语言(否则他可能并不是一个程序员)。并且在开发中,他能够运用所掌握的语言灵活地解决各种问题。

好的程序员应该是善于思考的人,很多人在脑子里想象程序员时会认为他们是编程的机器,但是实际上,写程序并不是一个机械性地活动,而是需要思考,创造的。

好的程序员还应该是一个善于交流,能够融入到开发团队中的一个人。现代软件的开发,已经不再是过去那样仅仅凭借一两个人就可以做到的事情了。在现实中,十几人,几十人甚至上百人的软件开发团队随处可见,所以在衡量一个人是否适合程序开发工作时,往往把“团队协作精神”放在很重要的位置。

好的程序员应该是一个勇于实践,探索和学习,并且能够勇敢地进行自我否定的人。在信息行业,技术更新的脚步越来越快。也许在一夜之间,一场新的技术浪潮就会扑面而来,带来的效应是大量的旧技术被淘汰,这就要求处于这个行业中的人要不断的学习,充实自己。同时不能够守旧,因为技术始终是在向前发展的,它不会停下脚步来等待你,如果你不紧随它的脚步,就只能被时代所抛弃。

如果我们把上述几点作为“好”的程序员的特征的话,那么我们知道,想要成为一名好的程序员,就要善于思考,要具备团队协作精神,同时要不断地学习和进步。此外,还需要敬业,勤奋,等等。

五,简介:目前比较流行的几种语言

在这一小节中,我们将会介绍几种目前比较流行的编程语言。

目前来讲,被使用最多的几种语言应该包括C语言,C++,Java,以及微软平台下基于.NET的几种语言。

和很多的结构化语言相比,C语言更加接近于硬件底层。除了汇编语言外,C是最接近系统底层的语言,因此它是大部分程序的编程语言。C语言的这种特性使得它在很长一段时间内被认为是功能最强大,也是使用最多的高级语言。这种特性也使得C语言比其他的结构化语言,比如BASIC或者Pascal更加难于学习。C的缺点是没有统一的函数库,标准不统一,因此,同样是C程序员,相互看不懂代码是很平常的事。现在由于软件项目中大量使用面向对象的语言,C语言作为一种结构化的语言使用范围也越来越小,但是在一些特定的领域内,C语言仍然是很好的选择。

在很多人看起来,C语言和C++很相似,而且,C++支持C语言语法。所以如果你会使用C语言,那么用一个C++的编译器编译你所写的ANSI C语言程序,一般都可以顺利通过。但是C++并不只是一个C语言的扩展版本。实际上,在C++和C语言之间存在着一个很大的区别就是面向对象和结构化的思想之间的区别。C++具有几乎全部的面向对象的特征,而C语言则是一种标准的结构化语言。C++在标准化之後迅速成为了程序开发的主流语言。

另外一种非常流行的程序语言是Java。Java的优点之一是它的跨平台特性,即借助于运行于不同平台上的Java虚拟机(JVM),用Java编写的程序可以在多种不同的操作系统甚至硬件平台上运行。这是由于Java编译器并不把程序编译成为可以直接在机器上运行的二进制程序文件,而是编译成“字节码”,在执行Java程序的时候,系统利用Java虚拟机将这种“字节码”翻译成本地机器可以识别运行的可执行代码。这也使得Java程序比起C++或者其他语言编写的程序执行相对要比较慢一点,而且Java程序更容易被反编译。Java的语法和C++具有很多相似的地方,因此,如果你在学习Java之前就已经对C++比较了解,可能会感觉比较容易一些。不过C++有一些特性却是java没有的。java 是对c 的大大的改进。有统一的标准,丰富的库,完全的面向对象。也继承了c 的一些特点,无所不包的全功能,深入系统底层的编程的灵活性。但因为java 学习了c 的深入系统底层的特点,它的语言就严格、呆板、罗索。另外,java 要跨平台,它的速度就非常令人不满意,只能局限在高级应用方面。在速度上,可以选择微软的.net 和苹果的coco(可能拼写有错误)。他们也同样是底层的面向对象语言。

BASIC(比如Visual Basic或者QBasic)的使用也很广泛。由于Visual Basic的易用性,直到今天,它仍然被非常普遍地使用着。Visual Basic.Net是Microsoft为了让Basic能利用.Net的各种特性,对传统的Basic进行改造而产生的,它和传统的Basic却已经有了很大的区别。由于Basic是最容易学习的语言之一,它常被用来当成学习程序设计的入门语言。

汇编语言在今天已经不再像过去一样被普遍地使用了,但是学习汇编语言会帮助你明白计算机是如何工作的,在你使用高级语言编程时,使用汇编语言的经验也可以让你明白什么样的代码在机器上运行更加高效。尽管如此,如果你不是确实有需要或者有兴趣,我们不推荐你从汇编语言开始学习程序设计。关于计算机体系结构以及如何编写高质量代码的知识你完全可以从相关的书本上得到。

C#. 为了适应.Net的各种特性,Microsoft为它量身定做了一门全新的程序设计语言C#。C#语法同样继承于C, C++, 以及Java,吸收了它们的很多优点,完全面向对象,良好的内存管理,能够充分利用.Net提供的各种特性。C#的标准化工作进行得很好,提交给ECMA,标准号为ECMA-334。C# 在很多地方都学习了Java,语法简洁,而在很多细节上设计得很体贴程序员,比如delegate, 继承中类方法的重写,out, ref等关键字。通过非托管的代码,甚至可以直接使用指针等底层特性,直接进行内存操作等。但由于这些细节的设计,也增加了一定的语言复杂度。与Java 相比,在跨平台方面也有一定能力,目前开源的Mono项目正努力使.Net能够在不同的操作系统平台上运行,取得了相当的成功。总而言之,C#简单易学,易于使用,而又功能强大,是一门值得学习的新型语言。(小插曲:C#的创始人是Anders Hejlsberg,他也是Delphi的创始人,可能是这个原因,Delphi和C#有很多相似的地方。)

作为高级的应用程序,如果没有保密要求,脚本语言是最合适的。脚本语言因为不用编译,因此开发速度会比编译语言快很多。

六,编程语言

程序设计语言根据执行方式的不同,分为三大类:编译型语言、解释型语言、半编译型语言。 [编辑]

编译型语言

编译型语言是指将源文件编译成本地执行的二进制文件,执行的就是本地二进制代码,效率非常高,但平台可移植性比较差。比如传统的汇编、C语言等。

  • ASM汇编

  • C语言

  • C++

[编辑]

解释型语言

解释型语言通常称为脚本语言,用这种语言编写的程序不需要进行编译,通过它的解释器就可以直接执行,这种语言往往语法不是非常严格,在不同平台中易于移植,使用灵活,但执行效率较低。比如Java Script、Perl、TCL/TK等。

[编辑]

半编译型语言

半编译型语言则介于二者之间,需要经过编译,但不编译成本地二进制码,而是一种中间代码,独立于CPU,因此具有一定的平台独立性,使用近年来快速发展的JIT技术,执行效率也比较高。比如Java、.Net下的各种语言。由于半编译型语言依靠JIT技术获得巨大成功,很多解释性语言正考虑或者已经开始向半编译型语言转型。

  • Java

  • C#

  • Many other languages

七,应用模式

  • 结构化程序设计

  • 面向对象的程序设计

八,不同平台上的开发

  • DOS

  • Linux/Unix**?**

  • Windows

  • Mac OS

九,程序开发架构

  • J2EE

  • .NET

参见

代码之美

程序员感悟----路该怎么走

cjavaphpperlpython的程序代码美化工具

软件开发学习路线

开发者版本:你属于哪个版本的程序员? Developer Versioning: Which Version are You?

商业软件编程很无聊?【转载】

无(代)码胜有(代)码

软件开发人员的能力模型

代码生成工具STGenerator Released

代码生成工具的分类及比较

Macrobject CodeAuto一个基于模板的代码生成工具

C#解惑:陷阱和缺陷

编程语言介绍 http:zh.wikibooks.org/wiki/编程语言介绍 [原创]为什么我们还不抛弃c语言?http://www.gamewx.com/bbs/simple/index.php?t3144.html 看看编程高手是怎么说的 一,程序员招聘广告的范例 1,有计算机科学、信息技术或与信息技术相关的学科的背景知识 2,有多年使用PHP进行网站或网络软件开发的经验 3,有使用MVC, PHP框架, , XHTML+CSS的经验 4,有SQL数据库的实际经验,并有很强的SQL的技术能力 5,有使用/Dreamweaver/Zend Studio 或Photoshop开发工具的经验更佳 6, CET6或同等能力以上,能进行流利的听、读、写 7, 良好的团队合作精神和沟通能力,能承受工作压力, 准备在一个国际公司工作 8, 良好的学习能力,分析能力,和活跃的思维能力,并愿意接受新挑战 二,程序员的WEB世界地图

这张手绘地图的名字应该是 “和谐web,和谐世界”(The Web is Agreement) 地 图从左到右是作者心目中的善良阵营和邪恶阵营……开源社区、创作共用协议、web2.0里的blog圈,tag,mashup技术,RDF, RSS之类的开放架构都在左边……而微软的FUD,DRM技术,病毒,垃圾邮件,SOA之类的企业架构被放在右边……出人意料的是“google的全知全 能之眼”也在邪恶一边,是因为google的平台不够开放还是因为用户隐私问题?中间的圣山顶端是W3C组织和IETF,很多人在下面争吵和游说…… 地图从下到上的象征意义比较复杂,有点像web技术从简单到复杂,也像是从前端到后端的关系……最下面是最简单的URL地址和REST/HTTP架构的设 计者Fielding博士……往上是各种前端技术,javascript/ajax是一座跨越“富用户体验”的桥梁……最上面的终点是一片混沌,叫做“不 兼容的大漩涡”,右边的魔多软件(微软)往里面排入ie,activex之类的私有技术,左边的开源社区往里面排入更多的技术,产品和代码……从 perl, php,java到linux…… 还有很多很多细节……总之这张地图告诉我们的是:web技术这个世界很危险……好孩子不要来玩…… Flickr上的注释版WebisAgreement.PDF

安身立命

三,学习 l 学习靠自己,不要期望别人教你什么,学习要主动;

虽然国内很多公司的技术层次不同和文化也有差 异,但是在大多数的时候公司或别人能教给你的东西很少,要学东西还是要靠自己主动。有的人一直觉得在公司学不到东西,想换一个环境,往往他换了一个环境之 后发现还是学不到什么东西。国内的项目大多还是急功近利的,不要期望有这么多微软研究院,空闲的时间踏踏实实学一些东西比到处找工作强很多,做项目的时候 多分享一下自己的心得给团队成员比抱怨团队技术实力差强很多。

l 不管水平高低,不要看不起自己,也不能看不起别人,学习要心态好; 不管做什么,学什么,一要心态好,二要态度好。所谓心态好就是不要着急、不用担心;有些人又在羡慕别人的技术NB,崇拜高手,为自己的技术差感到烦恼,如果你对自己信心又有什么技术是花时间学不到的那?

l 如果别人能从你这里学到知识的话,那么你自己也一定学到了知识,请坚持分享; 所谓态度好是多分享、多讨论、学出自己的心得。分享的意义是很大的,在分享之后的认知水平往往比分享之前的高,而且在很多时候分享给别人1点,别人能回报给你2点。有些人在团队中不愿意分享,怕团队中的其它人水平提升了影响到自己的地位,其实这种想法是没有什么道理的,也是对自己不利的。

l 不能不思进取,也不用让自己为技术所累,给自己多一点技术之外的时间;

不要过于专著于技术,这里的技术指工作中用于开发的技术。在几年之后,当你只有.NET可以和你的孩子分享的话,是不是太可悲了。在软件行业,技术虽然一定程度决定了薪水、决定了职位,但是我们的生活并不是100%是工作,有时间为技术而发愁,为何不综合提升自己的其它能力呢?并且随着职位的上升,往往沟通能力、经济知识以及文学艺术修养比技术显得更重要,这个时候叹息自己过于专著技术往往为时过晚。

在 工作中,要始终提醒自己“谦恭”、“真诚”和“规矩”,谦恭真诚对别人,把规矩留给自己。技术再强也要“谦恭”,离开了“谦恭”的技术就会失去光芒,社会 再险恶也要“真诚”,一切虚伪会在“真”诚面前低头,职位再高也要“规矩”(不迟到,不早退,以身作则),否则再大的权力也只能变成人员的流失。如果能做 到这六个子,那么无论你的技术怎么样,无论你到哪里都会得到领导的重用,在事业上有所发展。

l 如果时间不充裕,优先考虑学习基础的内容,同时也可以多关注一些新的思想;

从学习的内容上来说,要坚持两个原则,如果你没有时间的话,那么学新技术不如学基础、学应用不如学思想。举例来说,如果你只熟悉C#的基本语法的话,那么学好C#这个语言比学会编写留言本更有意义,如果你关注MVC、ORM的话,那么学习它们的思想比学会使用MONORAIL以及NHIBERNMATE更好。技术虽然一直在变,但是越是基础和越是抽象的技术变化越慢,越是偏向应用越是具体的技术变化越是快,从性价比上说,学习基础知识性价比更高。再举一个直白的例子,DIY电脑的时候,在显示器上多花费500元的意义一定比在显卡上多花费500元的意义大,而就是有些人宁可在显卡上多花费500元。在很多大型软件公司,招聘的时候只看人(看人品、看聪明程度、看态度)不看技术的,因为它们需要的是能快速发展,适应企业文化的人,而不需要你那些所谓的精通和熟悉。

或许你现在: l 在为面试而去搜索接口和抽象类的区别; l 在为新技术来不及学习而烦恼; l 在为看不懂高深的技术文章而烦恼; l 在为项目不能提高自己的编码水平而发愁; l ………… 我觉得:

现在的你不再: l 为面试而去搜索接口和抽象类的区别,而是在面试的时候告诉考官你并不知道它们之间的区别,但是愿意在一个月内系统学习面向对象的知识; l 为新技术来不及学习而烦恼,而是明确了自己最需要学习的技术,一边学习一边分享; l 为看不懂高深的技术文章而烦恼,而是拿起《C#高级编程》踏踏实实从头到底边阅读边做试验; l 为项目不能提高自己的编码水平而发愁,而是在进度允许的情况下尽可能让项目变得可扩展、可维护以及高效; l …………

1.1 架构设计涉及范围图

如图所示架构设计说涉及到的范围,首先是对架构支撑的底层平台选择,目前业界流行和通用的就是.Net平台和Java平台(J2EE);然后在平台支持之上做技术相关架构设计(主要会采用面向对象OO,面向方面编程AOP以及面向服务架构设计SOA等思想),在SOA推广上IBM和SUN两家公司尤为突出;在业务不断的变化中、架构的更新中,找到变化中不变的东西,并针对服务、架构制定一系列规范对架构进行有效的管理和成为架构设计的原则;当然,最上层就是善变的业务架构层。

1.2 一个优秀的架构师需要了解的知识

  1. 操作系统OS:能对操作系统内核有很好的了解和认识,从中吸取设计理念;推荐可以找一个小的linux版本代码阅读内核的实现,去理解“简单”的代码怎样去完成不简单的事情

  2. 虚拟机技术:去了解虚拟机的实行原理和它所做的工作,如Java的JVM、和.Net的CLR, CLR提交到欧洲标志组织可以阅读文档ECMA-335-CLI

  3. 计算机语言:一个好的架构师对计算机语言应该有深刻的认识,建议熟悉过程路径:C -> C++ → C# ,Java

  4. 开源资源:当然多研究开源架构是提高的必要途径,理解开源架构中设计的思想以什么样的设计思想为出发点,比较它们每个版本升级中的设计变化;资源:JBoss、Spring等Java开源框架,.net方面有5大实用案例架构、以及ASP.NET Starter Kit等,和MS:Enterprise library;

JBOSS 4.0:包括web服务器(servlet/JSP容器,HTML服务器)、EJB2.0容器。完整的纯Java的数据库引擎,(Java消息服务)JMS,JavaMail,和Java事务处理API/Java事务处理服务(JTA/JTS)支持,但是他的面向方面设计(AOP)是它真正突出的部分。JBOSS的AOP架构负责处理AOP,使用了一组命名概念,比如”interceptor,” “pointcut,” 和 “introduction”。一个interceptors编码“拦截器”(intercepts),它把一个对象放到一个被拦截的类中等。

Spring是一个轻量级容器,非侵入式,ioc容器,它所带的包装器使许多不同的服务和框架更易于使用。轻量级容器接受任何JavaBean,而不是只接受特定类型的组件。要了解Spring同时就应该了解Eclipse、Struts、Hibernate之间的衔接应用 Spring: A Developer's Notebook

ASP.NET Starter Kit: 是ASP.NET官方网站推出的一整套ASP.NET解决方案的Demo;是提供给ASP.NET初学入门者的教材!包括了门户、商业站点、社区站点、报表、时间跟踪排程、问题跟踪这6套系统。 在这里,随便也提一下WSS/SPS,具有微软官方支持,是成熟的产品,是通过Web Part扩展的,Web Part将会是ASP.NET发展的一个领域,使用Web Part进行页面的定制是更加人性化的,拖拉的所见即所得效果是Portal Start Kit无法达到了。WSS

SPS是扩展性非常好的系统平台,WSS

SPS的工作区可以无限向下添加,集成Office 2003、Exchange、Biztalk、Content Manager Server……而Portal Starter Kit仅仅是一个单纯的网站演示,虽然也能够布局定制,但仅此而已。

二. 还是需求

万水千山始于脚下,需求始终是一切的第一步!

从两种软件类型入手分别谈一谈,其中采集需求的方法和注意点

2.1 企业信息化软件

企业信息化软件,及软件的最终用户是一个企业,企业希望通过软件项目的采购来达到企业内部管理等流程的信息化;采集这类需求通常有两种情况,其一:

2.1.1 甲方驱动

如ERP,甲方非常了解要他们需要一个什么样的软件,或者通过软件来达到一个什么样的效果。其中从甲方采集需求的采集点注意一下不能遗漏:

  • 中层领导:--> 从他们这采集业务的流程,因为他们是对甲方公司业务流程最熟练的

  • 现场人员:--> 从他们这采集业务规则

  • 高层领导:--> 这个很重要,从他们这采取决策规则,及可以让软件实现知识发现,即以后可成为软件的一个亮点即对公司决策的支持

  • 信息人员:--> 操作规范,可以提供易用性

乙方需要参加的人员:

架构师(实力所服,让对方放心),需求分析师,开放人员(实现需求的原型化),

UI原型需求化:有三个好处, 需求固化、设计规则明确、开放复用

2.1.2 乙方强势论

由于甲方需求不明确,而乙方在此行业中资历深厚,了解行业标准,这种非常好做事就不多说了。

2.2 需要采集中注意项

1.需求采集的起点:

  • 找到所有执行者

  • 找到组织机构

  • 业务流程

2.需求管理, 这个是必不可少的;

需求稳定化,乙方提供需求详细规格说明书

同时,制定词汇表,如图

3.掌握中间语言,及快速得了解行业规范

2.3 商业化软件

需求采集为行业商用软件,要做到:

收集行业中所有企业得需求

行业规范,最好就是成为行业的领头人成为标准的制定者--> 业务原型

同时要考虑到市场因素,以及竞争对手、市场亮点(有必要时可能采用保存亮点的方式)

也要考虑环境因素,硬件、社会等

三. 领域分析

通过领域分析,获得领域模型;这节内容涉及到UML建模、建模流程、用例切片归包、DSL规范定义领域语言等等一些比较晕的内容!!

领域模型: 切词(名词实体)

实体关系 -->类图 、E-R

实体约束规则(要求精确度)

其中涉及到工作流分析, 以及工作流所涉及到的技术,建议研究工作流: 其一,Vista平台的WWF,其二,开源框架OsWorkflow; 其下图有利于我们理解工作流设计:visual studio 2005中插件DSL支持

3.1 最小建模技术

对于大多数问题而言,只需要20%的UML就可以完成80%的建模工作,所以只需要以下建模中的关键三个元素:

www.cnblogs.com_images_cnblogs_com_witluo_jiagou4.jpg

具体的这个就不多说了,应该是不是的对设计模式进行温习、多阅读一些设计模式论文及应用场景实践。使用时注意考虑以下重要几点:

4.1 设计模式应用场景

既是处理变化 --> 原构件基础上增加变化

--> 替代构件

4.2 设计模式的弱点

增加复杂度、 性能有损耗、 模式有可能选择不当、 装配不当、 增加测试难度

4.3 面向对象开放技术今天的核心基础

核心基础: 组件技术、 UML建模技术

组件技术: 大型项目和系统的必经之路

-》需要支持多平台:SOA、 ESB-连接组件

-》拥有大量组件:重用、MDA(模型驱动开发)-快速、廉价组件

-》响应日益复杂的业务操作

-》框架: .net, Java

在架构设计中也要引用AOP设计思想,在整个架构设计过程中横切关注点来达到面向方面编程,现实框架某些功能的统一处理,减少重复。AOP强调通过面向方面的思维方式来进行有效的架构设计,所以AOP设计 ≠ AOP技术, AOP技术是面向方面设计AOP的最佳实现。开源AOP架构研究推荐: JBoss4.0

架构师进行架构设计,要心中有此轴向图从而做到不同纬度对架构进行充分的设计考虑。

六. 架构设计

6.1 主要架构模式

流程处理模式: 以算法和数据结构为中心,由一系列处理步骤、相邻步骤用数据流管道连接。主要用于批处理系统软件

、C/S模式、MVC模式、分层模式

SOA(Service Oriented Architecture 服务导向架构),是一种应用程式架构的概念,将应用程式及资源以重复使用的服务方式呈现,使用标准化的借变相互沟通,借此提供更高弹性、更高效率、及资讯整合的IT环境。SOA是一种用于建构分散式系统的方法,它可以将应用程序以服务的方式提供给终端使用者,也能建构成其他的服务。透过SOA,我们可以将单一的软件开发成为可提供其他应用系统使用的基本元件。

要理解SOA,更重要的得研究ESB(Enterprise Service Bus)企业服务总线,请看另一篇文档的详细介:SOA-ESB企业服务总线概念; 这里就不熬述了

作为开发者,在站队和选择中什么才是我们的根本?

从产生高级语言以后,我们就不断地需要站队选择,从选择高级语言,到选择IDE平台,从选择Java还是.Net,到选择何种中间件平台。现在又出现了RIA和SOA的队列,无穷无尽。。。。。

正因为有了这些才会有语言之争、使用不同语言不同IDE平台程序员的对立,JAVA VS .NET PHP VS RUBY ON RAILS。在站队和选择中,很多很多程序员迷失了,也许框架、语言确实给我们带来了便利,也许我们有选择或无选择的使用着软件提供商开发的IDE拖拉着 控件开发程序也感觉没有什么不好,也许你认为这样是天经地义的也是大势所趋的,但是 BUT 你在站队 选择中失去了自我。

我承认ruby on rails的确很酷,Ajax实现的效果也确实很棒,GOOGLE MAP 开放出来的API让我们实现了很多很多以前无法做到的效果,当你和朋友说我又买了一本诸如《C#3.5 FrameWrok揭秘》的经典书籍时略显满足的表情也许会让朋友暗叹你真上进。

我们总是在何种技术何种平台上去选择着,去努力研究着规则、标准,去祈祷着她的长久,因为她是你的饭碗。

是的!作为开发者,我们总要去选择去排队,即便精通诸多语言诸多开发工具,也要去选择现在用什么。

世界上最可悲的是永远都在梦里而自始至终不知道真相的人,很不幸我们也许就是梦中人。

写了这么多,您可能也不知道我要说什么,那么我通过几个问题来表述我要说什么。

1、您买的书中是否有诸如 图论、概率论、统计学、数据挖掘、TCP/IP协议详解、现代数学手册、等等底层并且基础的书?这些书占您所有书的多少比例?

2、有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法中您掌握了哪些?

3、线性表、栈/队列、串、多维数组、广义表、树、图、排序、查找、文件 这些数据结构的基本概念您是否都了解和明白?

在站队、选择时这些才是我们的根本,而往往真正缺失又不在意的却是它们……..

假如我们连这些真正该掌握的都缺失了,那么我们自以为拥有的就不叫拥有,我们也只能盲目或自认为的在选择中选择、在站队中站队,直到有一天因为年纪的增长跟不上技术的革新而被淘汰掉。

软件营销

参见:

为什么新人不会编程 |

编程的单纯心|

伟大的程序员是怎样炼成的?|

程序员为什么不谈政治|:许许多多的人选择编程,首要的原因就是,他们宁愿将自己的时间花在一个公平有序的地方,一个严格的能者上庸者下的地方,一个只要你是对的就能赢得任何争论的地方。

程序员职业发展流程图|

程序员's todo list|

架构师09年书单|08年的读书计划|

08已过了一季,马上就要三十的人了,总有些脱不开烟火气的惫懒。为了那些”将来”,今年要读的书:

一、架构模式

模式,就仿佛一个代号。一个大的架构,总能分拆成一个个代号与符号来演绎。 SOA、ESB、SCA,注定了还是这一两年内纠缠着业界和客户的名词,大型架构内应用间的集成交互、性能、伸缩性、可靠性、可管理性、可扩展性、安全性,永远都是设计人员的心头好。

  • 《Pattern-Oriented Software Architecture, Volume 4 – A Pattern Language forDistributed Computing》架构模式的超级集大成目录。愿出版社快点翻出中文版造福市民。

  • 《企业集成模式:设计、构建及部署消息传递解决方案》,重读之,Mule、Apache Camel、Spring Intergration都是它最实际的解释者。

  • 《Remoting Patterns- Foundations of Enterprise, Internet and Realtime Distributed Object Middleware》,旧书但有点声名不响,前半卷应该可读。

  • 《SOA Approach to Intergration》,粗看目录还行,不打包票。

下半年国外还会有些关于SOA与ESB的书要出来,如《SOA Design Patterns》,《Implementing SOA : Total Architecture in Practice》,《Open-Source ESBs in Action》,《Service-Oriented Architecture and Event-Driven Architecture: J2EE Integrated Solutions》,静待。 而关于X性的书,下半年会有本《Patterns for Fault Tolerant Software》。

二、BI

越是Web2.0,越需要BI,比如豆瓣起家的法宝。 而且,离什么算法高数都好遥远了,忽然间看回一排排数字,心里很意动,感觉又成为了《世界尽头与冷酷仙境》里的计算士。

  • 《Programming Collective Intelligence – Building Smart Web 2.0 Applications》 Web2.0里的群体智慧。愿出版社的动作更快一点。

  • 《数据挖掘–实用机器学习技术 2nd》 Weka作者的书。

还有一本《Collective Intelligence in Action》国外下半年会出版,这次是for Java程序员的,有weka,有java data mining api。

三、基础

越来越远离补充基础的年龄,赶紧多看点书了。

  • 《代码大全2nd》,细读之,书是好书,尤其是对于刚毕业两三年的人。对于一把年纪的,看了总比不看好。

  • 《编程珠玑2nd》,闲得没事时可以看看,补充一下某些我们这些惯写应用程序的人早已失去的能力。

  • 《Beautiful Code》,也是闲得没事看的,继续盼望出版社赶快译快校。

程序员:时日无多:经济不景气的年代,交流技能而不是编程技能才是程序员最大的资产,而最要紧的语言其实是英语。他说:多数软件开发团队的成员干的活类似打字的秘书,创意来自上头,然后经过总经理、产品经理、技术负责人、团队负责人,目标被一步步分解,最后传达到海外的程序员。此种结构可以是可持续的,但是在目前私营部门大规模裁员的情况下,则是愚蠢的。企业应付效仿开源的开发模式,将决策权交给少数对架构和代码有最深入了解的开发者,这种转变意味着管理人员需要越过简历和技术列表,寻找到程序员中交流能力最佳的开发者去指导开发,而不是简单的代码编写能力。

http://blog.csdn.net/wayne92/archive/2005/09/07/473722.aspx 软件开发入门学习的个人看法

http://www.cnblogs.com/cj723/archive/2008/03/27/1124849.html 关于阅读技术类图书的思考

如何成为一个现代程序员: 使用你的CPU, 而不是内存

Demoscene的首次亮相是 在计算机的8位时代(如Commodore 64和ZX Spectrum),在16/32位个人计算机时代(如Atari ST和Amiga)快速成长,至今已过去20年了。早期的程序员依靠自己的能力冲击的Ataris和Amigas等电脑的性能限制,创造出惊人的场景,全 光、绘图、动作捕捉,Demo爱好者完成这一切所使用的代码大小低于100K,虽然场景也可以在3D Studio Max之类的程序中复制,但决不可能复制出这种紧凑高效的代码。为了庆祝这种艺术形式,I heart Chaos挑选出13个最棒的demo程序,提供在线视频和代码下载,你可以在自己电脑上渲染这些只有几M大小的3D程序,其中还有不少低于100K的。

如何“识别”优秀的程序员,Daniel总结了几条关键要素。他写道,“并不是和听起来那么容易。在这儿工作经验的作用是很有限的,因为伟大的程序员不一定要‘正式’的工作经历来证明他们的伟大。许多的工作经历可能会被误导。”以下摘自每日阅读: 1.激情—写代码是你的日常生活,而非工作;

2.自学好学—不会等着公司给你培训; 3.聪明—好的程序员通常可能是你认识的人里最聪明的那个,而且出乎意料的,好的程序员可能不是我们通常想像的那样不善言辞; 4.不在纸面表现的"隐藏" 经验—好的程序员通常有自己的私人的一些研究、爱好、项目,而这些是他们不写在简历上 (通常觉得不值得写),但表现出来却可能恰恰是他的潜能、深度和后劲所在; 5.技术多样性、先锋性—在多种技术方向 (只知道java、Ant、j2ee、xml,只能算一个技术方向) 都有涉猎,而且对多种技术的长短有 “强烈”的个人意见/见解,喜好尝试新鲜技术; 6.证书说明不了问题—MCSE、SCJP、红旗认证... 这些说明不了这个人是不是好的程序员,可以忽略不计。

技术领域的疯狂崇拜|

论木匠和程序员的异同[转]

http://topic.csdn.net/u/20080123/09/9a094747-1355-4417-8f38-3b1790baf0ed.html 计算机过来人对菜鸟的一些建议(转贴)

写给想当程序员的朋友—一个还不太老的普通程序员的体会

周刊头条:程序员江湖闯荡录(热点专题)

  一行行代码就能创造出五彩缤纷的世界,在常人眼中程序员是个令人羡慕的职业,程序员的生活也因此蒙上了一层神秘的色彩。本期专题将从“面试、加班、加薪、跳槽、转型、创业”六大关键词全程点播程序员的程序人生,一起体会程序员身在职场江湖的酸甜苦辣。

我们到底该怎么学技术?如何成为一个优秀的技术人员?

架构师要了解那些??

http://www.cnblogs.com/lovecherry/archive/2007/10/28/940555.html 不要迷失在技术的海洋中

http://www.mylinux.com.cn/HTML/1172743276705.html 该学什么程序语言?(据蔡学镛先生同名文章精简)

多核环境下的内存屏障指令 讨论单核多核下指令执行次序对程序判断标志的影响

WebisAgreement.PDF 3555k