IT 专业人士口碑差的十大原因

IT从业人员常常日夜操劳,整体与机器和代码为伍,号称码农,可是为什么在某些人那里却得不到好口碑呢?TR的Alan Norton列举了十大缘由,请诸位给评评看,是不是这个道理。

1:报酬丰厚惹人嫌

IT属于高薪行业是普遍共识(在中国未必如此?)。在美国,其薪资水平仅次于管理和法律专业。但是对于其他职业中赚得少的人来说。有的也许就会认为这样对自己不公平。在往往以金钱衡量个人价值的社会里,这会给别的职业的自我意识造成打击。

2:问题响应不及时

办公系统或者秘书的电脑宕机时,肯定需要尽快能修好。但有时候IT工程师就像酷热夏日里的空调维修员一样,手上的单子太多,客户必须排队等。但是,对于关键系统来说,哪怕几分钟的宕机时间也是不能忍受的。

3:尝试不可能任务

医 生不可能通过电话对病人做出诊断,但这就是IT支持人员每天都在做的事情。对问题知之甚少的客户指望你通过电话就能远程诊断和修复问题。Alan拿自己的 老爹作为例子,说他曾花了4个多小时与IT支持人员通话来解决一个问题。这个过程令双方都沮丧不已,在无法直接接触到客户硬件的情况下,有时候问题的解决 就相当于一个不可能完成的任务—哪怕你的耐心和奉献精神再高 。如果你曾试过在电话上通话一个多小时来试图解决问题,你就会理解为什么技术支持人员常常被骂了。从短期看,这种情况仍难以得到改善,除非IT学会了如何 更简便地收集相关信息。

4:知其不可而为之

Alan 在CSC工作的时候曾遭遇过一些不可能完成的任务。CSC的客户范围很广,有的自家系统既陈旧又神秘。比方说,他曾经装过几次OS/2,然后就被奉为OS /2专家并被邀请去解决一个客户的OS/2问题。他只好硬着头皮顶上去,最后的确装好了网络打印机和一些硬件,但是也留下了一堆烂摊子。

5:有技术没有态度

IT专业人士通常技术能力都很高,但是其对待患者(客户)的态度还有待改进。IT与客户的技术鸿沟日渐拉大,但与客户沟通解决问题的单纯化、人性化更是充满挑战。如何提供真正的客户服务而不仅仅是修复问题,许多IT人员还需要深入学习。

6IT人员形象差

形 象很重要。但IT人的形象可不太好,不合群的极客在键盘上奋笔疾书,把自己的秘密作品捂得严严实实,远离愚蠢的大众。对于极客的刻板形象大众总是爱恨交 加。他们虽不认同,但的确享受作为极客及其怪异行为的看客。一提到极客,Chloe和Edgar(《反恐二十四小时》中的人物),Maurice和 Roy(《IT狂人》中的人物)、谢耳朵和伦纳德(《生活大爆炸》中的人物),Abigail和Timothy(《海军罪案调查处》中的人物)马上跃然脑 海中。如果极客只是出现在电视里,公众也许会表达出自己的热爱,但真的要是跟IT人打交道时,他们往往就会把对方归类为极客,避而远之。

7:被视为工作威胁

在经济不景气的时候谁都害怕失去工作。而IT往往会抢走某些传统岗位的饭碗,因此做IT的也被视为坏小子。实际上,剥夺工人工作的是技术,但“受害者”却不会这么认为。IT专业人员变成了敌人和替罪羊。

8:患上“金童”综合症

要什么给什么,IT已经享受这种待遇多年。任何能令公司提高效率的项目都能够得到充分的资金和资源支持。不过IT已经长大成人,逐渐失去了“不会做错任何事”的光环,但是金童的形象依旧萦绕。自己手头紧的经理看着IT预算还在见长自然会没有羡慕只有嫉妒恨。

9IT人不可或缺

主管对IT技术和维系IT的人变得越来越依赖。复杂系统需要数据库维护、技术支撑以及软件升级维护。但非IT专业人士不喜欢依赖别人。同时还害怕赋予IT太多的权力。

10IT太大手太长

极 客无孔不入,任何机构都无法幸免。在上世纪九十年代,个人计算机仿佛雨后春笋般在员工的办公桌上冒出。人力资源、财务、制造、法律—各行各业均被IT渗 透。这些PC收集信息并发送到极客总部的服务器上。此等水平的信息访问是空前的。信息就是力量,而IT控制着信息。IT的一手遮天令经理们担忧自己能在多 大程度上信任IT。

文章来自36氪

12 个很棒的 PHP 资源和工具

本文介绍 12 款很棒的 PHP 资源和工具,包括开发框架、开发工具、调试器等。

1. CakePHP

CakePHP是一个运用了诸如ActiveRecord、Association Data Mapping、Front Controller和MVC等著名设计模式的快速开发框架。该项目主要目标是提供一个可以让各种层次的PHP开发人员快速地开发出健壮的Web应用,而 又不失灵活性。

2. Zend Studio

Zend Studio 是专业开发人员在使用PHP整个开发周期中唯一的集成开发环境 (IDE),它包括了PHP所有必须的开发部件。通过一整套编辑、调试、分析、优化和数据库工具,Zend Studio 加速开发周期,并简化复杂的应用方案。

3. PHP Object Generator

PHP Object Generator, (POG) 是一个开源的 PHP 代码生成器,可自动生成清晰、经过测试的面向对象代码,支持 PHP4/5.

4. Fire PHP

Fire PHP 是Firefox 的扩充套件,但它可以帮你debug 后端PHP 的程式,听起来很神奇是吧?其实用的技术跟某些IDE 一样,要求你在写程式时加入一些追踪用的代码。通过使用Firephp你可以在Firebug的Console栏中看到要调试的数据,而不影响php程序 的正常执行,所以说,这东西对于Ajax开发是很有帮助的!

5. PHP Open Biz

PHPOpenbiz是一个基于PHP语言的商业Web应用开发框架。其特点包括:

  • Metadata驱动的设计原则。开发人员用metadata来描述业务逻辑,而不是用代码。
  • 模型-视图-控制器(MVC) 对象/关系映射(ORM)
  • 浏览器端AJAX通信
  • 与Eclipse集成的开发工具

简单而功能强大

  • 编辑XML metadata而非代码
  • 丰富的功能 – AJAX, MVC, ORM, 安全机制 …
  • 建于Zend Framework之上, 更注重于应用层的逻辑

快速开发

  • 框架的核心模块提供了常用的功能和服务,节省了大量开发时间
  • 客户可以扩展核心类库来实现自己的逻辑
  • 管理metadata闭管理代码要容易得多

低维护成本

6. Zoop Framework

Zoop是一个面向对象,快速,高效,易于使用的PHP开发框架。它的特性包括:GuiControl(类似于.net中webcontrol),集成 AJAX支持,实现form的自动校验与创建(包括所需的db操作),使用Smarty做为模板引擎,此外还包括PDF创建,ession处理,基于模板 的email发送(利用SMTP协议)等功能。

7. PHP Debugger

DBG 是一个全功能的 PHP 调试器,提供一个交互工具帮助调试 PHP 脚本。

下面截图是基于商业PHP开发环境 PhpED

PHPEd PHP IDE, Main view

8. Blue Shoes

BlueShoes 是一个完整的应用框架和内容管理系统,后端数据库支持 MySQL、Oracle 和 MSSQL。

9. MODx

MODx 是一个开源的 PHP 应用框架,可以帮助使用者控制自己的网上内容。它是开发人员和高级用户理想的控制系统,任何人都可以使用 MODx 发布、更新、维护动态网站,或 html 静态页面的网站内容。

10. Qcodo

Qcodo是一个适用于敏捷开发基于PHP5采用MVC架构与CRUD代码生成功能的框架。完全面向对象,采用事件驱动处理方式。完全分离代码与HTML页面。QForms与QControl 包提供底层AJAX支持。

11. Seagull

Seagull是个纯OOP(面向对象程序设计)框架,可用于创建web,command line(命令行)和GUI的应用程序.它采用了BSD授权,让PHP开发者可以更容易地整合并管理代码源,更快速地建立复杂的应用程序。目前Seagull设计中已集成了许多比较受欢迎的PHP应用程序,例如:各式各样的模板引擎,测试工具,管理代码库工具等.如果您是个初学者,您可以将Seagull提供的许多样本应用程序自定义或扩展成适合您所需的.如果您是中高级开发者,您可以充分利用seagull中的best practices(最优方案),标准和模块的代码核心在有规定的时间内建立您的应用程序.

12. Xaraya

Xaraya是一个开源的内容管理解决方案与开发框架,它包含了创建一个动态的跨平台内容管理系统所需要的基础模块和工具。Xaraya具有易于安装,易 于使用,平台独立(可运行在所有支持PHP的平台上包括Linux,Windows,Mac OSX与多种数据库比如MySQL,PostgreSQL),模块化(利用身份验证与事件系统可以向系统的核心加入所需要的模块附着新的身份验证方法), 可扩展性(利用它自己的动态数据模型,可以让你轻松注册新模块的数据结构) ,多国语言支持,安全(基于角色权限控制),快速(利用一个可配置的输出缓存系统实现)。

via zoomzum

传中移动5月17日开始在深圳TD-LTE放号测试

【搜狐IT消息】5月7日消息,知情人士表示,中国4G标准TD-LTE在国内的试商用将率先在深圳实现。据悉,最快深圳将在5月17日即世界电信日时启动TD-LTE试商用。

据了解,目前最终方案仍没确定,但总体原则是利用深圳此前规模技术试验的良好基础和雄厚的产业链配套尽快先行先试。

深圳2011年4月最先实现TD-LTE规模技术试验业务开通。第26届世界大学生夏季运动会上,深圳也面向全球人士展示了TD-LTE的典型业务和体验。

据了解,各试点中,深圳是唯一采用PTN L3技术承载的城市,并在全国首次成功实现不同厂商PTN L3对接,这对TD-LTE建设融合各厂商技术、增强产业链吸引力有不小作用。

据透露,深圳一家信息职业技术学院的10名学生已经被确定为首批友好用户。根据他们与深圳移动的合作条件可看出,测试期为3个月,流量费用都由中国移动买单,但这些友好用户需要定期交业务应用测试报告。

for 循环为何可恨?

Java的闭包(Closure)特征最近成为了一个热门话题。一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。

不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。尤其是他问道“ for 循环为何可恨?”:

我不知道,有些人这么着急的要把 for 循环消灭掉,他们反对的究竟是什么?这已经不是第一次或第二次计算机学界的理论家们起来反对 for 循环(或类似的东西)了。

如果只说Elliotte质疑不起眼的闭包的价值,这是不公平的。他主要抱怨是,在读了另一位著名人物、获得过Jolt 大奖并创造过最高销售记录的《Better, Faster, Lighter Java》的作者Bruce Tate的最近的关于此主题的专题后,他看不出闭包在Java中有什么价值。(Bruce用Ruby做的例证):

表 1. 最简单的闭包

3.times {puts "Inside the times method."}结果:Inside the times method.Inside the times method.Inside the times method.

times是3这个对象上的一个方法。它把闭包中的代码执行了3次。{puts "Inside the times method."}是闭包。它是一个匿名函数,把它传入times方法,打印出静态句子。相比起传统的for循环语句,这样的代码显得更紧凑,更简单,如表2中所示:

表 2: 非闭包的循环

for i in 1..3  puts "Inside the times method."end

由于这种毫无生气的对闭包的介绍,我也很难看出它的真正价值。这首个比较,充其量也就能体现出一种微妙的差别。Bruce在developerWorks上的文章里的其它的例子也大多是价值不大的,要么含糊不清,要么缺乏启发意义。

对于这种Ruby风格的闭包给Elliotte带来的困惑,我不打算进一步评论;对这种问题过于挑剔毫无意义。我也不想讨论目前的关于Java中的 闭包的语法的提议的争论,包括Java中是否应该有闭包这样的大问题。在这样的争论中我没有立场,说实话,我是不在乎这些问题如何或何时被解决。

虽然如此,Elliotte却提出了一个重要的问题:for 循环为什么可恨?

下面是一个常见的例子:

double sum = 0;for (int i = 0; i < array.length; i++) {  sum += array[i];}

这有什么问题?我编了很多年的程序,我对这种语法一眼扫过去很舒服;很显然,它是把一个数组里的值加到一起。但当去真正的阅读这段代码时,这四行代码里大概散布着30多个标记符号需要我去分析处理。不错,有些字符可以通过语法简写方式来缩减。但为了这样一个简单的加法,你需要写出一堆东西,还要保证写的正确。

凭什么这样说?下面是Elliotte的文章里另外一个例子,原文拷贝:

String s = "";for (int i = 0; i < args.length; i++) {  s += array[i];}

看见了里面的错误吗?如果这代码编译通过,并通过的代码审查,你可能需要数周才会发现这样的bug,再数周才能制作出补丁。这些只是简单的for循 环。想象一下,当for循环体变得越来越大,甚至有嵌套时,事情会变得多么的复杂。(如果你仍旧不担心这样的bug,认为这只是拼写错误,那么你就想想有 多少次在for循环里你是这样的。)

如果你能够把一个简单的for循环写成一行,带有更少的重复和更少的字符,这样不仅更容易阅读,也更容易书写。因为这样更简洁,引入bug的机会就更少,当bug出现时,也更容易被发现。

那闭包对此有何帮助?下面是第一个例子,用Haskell语言写成的:

total = sum array

哈哈,我是在说谎。sum函数并没有使用闭包。它是按照fold的方式定义的,而fold是接受闭包的:

下面是第二个例子,很常见,而且使用了闭包:

s = concat arrays = foldr (++) [] array

我承认,使用这些叫做foldlfoldr 样子古怪的函数来解释闭包的作用,这对那些更熟悉for循环的程序员来说没有多大意义。但是,这几个函数却能突出for循环的关键弊端:它把三种独立不同的操作合并到一起了——过滤,归纳和转换。

上面的这两种for循环,它们的目标是接收一个数值列表,把它们归纳成一个值。函数式编程的程序员称这些操作为“folds(合并)”。一个 fold运算的过程是,首先要有一个操作(一个闭包)和一个种子值,还有使用list里的第一个元素。这个操作被施加到种子值和list里的第一个元素 上,产生出一个新的种子值。fold运算然后把这个操作运用到新种子值和list里的下一个元素上,一直这样,直到最后一个值,最后一次操作的结果成为 fold运算的结果。

下面是一个演示:

s = foldl (+) 0       [1, 2, 3]  = foldl (+) (0 + 1) [2, 3]  = foldl (+) 1       [2, 3]  = foldl (+) (1 + 2) [3]  = foldl (+) 3       [3]  = foldl (+) (3 + 3) []  = foldl (+) 6       []  = 6

Haskell语言里提供了很多fold函数;foldl函数从list的第一位开始运算,依次反复到最后一个,而foldr函数,它从list的最后一个函数开始运算,从后往前。还有很多其它相似的函数,但这两个是最基本的。

当然,folds是一些非常基本的运算,如果抛弃for循环而以各种形式的foldlfoldr 咒符来替换,你会很困惑。事实上,更高级的操作,例如sum, prodconcat都是以各种folds定义的。当你的代码以这种高级的归纳操作运算来编写时,代码会变得更简洁,更易读,更易写,更易懂。

当然,并不是所有的for循环都是归纳操作。看看下面这个:

for (int i = 0; i < array.length; i++) {  array[i] *= 2;}

这是一个转换操作,函数式编程的程序员称之为map操作:

new_array = map (*2) array

map函数的工作方式是,它会检查list里的每个元素,将一个函数应用到每个元素上,形成一个新的list,里面是新的元素。(有些语言里的这种操作是原位替换)。这是一个很容易理解的操作。sort函数的功能相似,它接受一个list,返回(或修改)一个list。

第三种类型的for循环是过滤。下面是个例子。

int tmp[] = new int[nums.length];int j = 0;for (int i = 0; i < nums.length; i++) {  if ((nums[i] % 2) == 1) {    tmp[j] = nums[i];    j++;  }}

这是一个非常简单的操作,但使用了for循环和两个独立的计数器后,毫无必要的复杂表现把事实真相完全掩盖了。如果过滤是一种基本的操作,它应该像一个fold或一个map那样,而事实上,它是的:

odds = filter (\i => (i `mod` 2) == 1) numsodds = filter isOdd nums -- 更常用的形式

从核心上讲,这就是为什么for循环有问题:它把(至少)三种独立的操作合并到了一起,但重点却关注了一个次要细节问题:遍历一系列的值。而事实上,foldmapfilter是处理一个数据list的三种不同的操作,它们应该被分别处理。采用把闭包传入循环内的方式,我们能更容易的把what 从 how 中分离出来。每次遍历一个list时我都会使用一个匿名函数,或复用通用的函数(例如 isOdd, (+)sqrt)。

虽然闭包并不是一个很深奥的概念,但当它深深的烙进了一种语言和它的标准库中时,我们不需要使用这些低级的操作搞的代码混乱不堪。相反,我们可以创建更高级的运算,做我们想要的事,比如sum and prod

更重要的,以这些概念思考问题会使我们更容易思考更复杂的操作,比如变换一个tree,过滤一个vector,或把一个list合并成一个hash。

在最后,Elliotte还提到了一些关于在多核处理器上并行执行的问题,说像3.times {...}这样的代码会比 for 循环效率“差”。不幸的是,我想他没说到点上。不错,有一些运算需要序列化,有一些可以并行。但是如果你只基于一个for循环,很难判断出哪些归为哪类,这是一个复杂的编译器优化问题。如果你把一个可能进行并行运算的操作(例如mapfilter)分解成连续的运算(例如foldlfoldr),编译器更容易从中做出判断。不仅如此,如果你比编译器更了解你的数据,你可以显式的要求一个map操作被顺序执行或并行执行。

[本文英文原文链接:What’s Wrong with the For Loop ]