URL的设计

导读:URL的设计是一个很复杂的问题,不能说有什么“正确”的解决方案——其挺类似于其他方面的设计的,有好的URL设计,有糟糕的URL设计,在这两者之间的情况也不同——它是主观的。不过这并不意味着不存在用于创建出非常好的URL的最佳做法。原文作者kneath总结了这些年来学到的一些URL设计的最佳做法,希望能够给你留下深刻的印象。

以下是文章内容:

你应该花一些时间来设计一下你的URL地址结构。在读完本文之后,如果有一件事情是我希望你记住的话,那就是花一些时间来设计你的URL地址的结构。不要把它留给你的框架来决定,不要听天由命,依赖运气。要仔细地考虑,认真摸索出一种经验。

URL的设计是一个很复杂的问题,我不能说有什么“正确”的解决方案——其挺类似于其他方面的设计的,有好的URL设计,有糟糕的URL设计,在这两者之间的情况也个个不同——它是主观的。

不过这并不意味着不存在用于创建出非常好的URL的最佳做法。我希望我这些年来学到的一些URL设计的最佳做法能够给你留下深刻的印象,并且我会解释为什么我认为使用新的HTML5 javascript的history API来工作是一件很令人兴奋的事情。

为什么需要对你的URL进行一番设计

URL栏已经成为了现代浏览器的一个主要吸引人的地方了,且它再也不仅是一个URL栏那么简单——你可以输入部分的URL,然后浏览器就像是会使用黑魔法似的召唤出了你正要查找的确切的完整地址。当我在我的URL栏中输入了resque issues时,得到的第一个结果是https://github.com/defunkt/resque/issues。

URL是全球统一的,它们可用在Chrome、Safari、Internet Explorer、cURL、wget、你的iPhone、Android上,甚至会被写在便签上。它们就是web网络的一种全球通用的语法。但是不要把这看成是理所当然的。

任何一个定期访问你的网站的半技术化的用户都应该能够基于内存中的URL结构来浏览你的应用的90%部分。为了能够实现这一点,你的URL必需是要注重实用性的,就几乎仿佛它们就是数学方程式一样——许多简单的规则组合成一种策略性的方式,以此来获得他们想要的页面。

顶层的部分是最为重要的

URL最有价值的方面在于其顶层的部分。在我看来,在想法形成了之后,这就是接下来的任何启动都应该最先要讨论的事情,要远在任何的技术讨论之前,要远在任何的代码编写之前。这一顶层部分将会改变形成你的网站功能的基础。

我是不是有些夸张了?看起来可能会是这样——但是以后会有1,000,000 个用户,想想它会带来多大的影响。想一下Facebook推出用户名是多么重大的一件事。可用的URL就像是不动产,而顶层的部分就是体现在外面的最好的资产。

另一个快速提示——每当你构建一个新的站点时,考虑一下这一组不实用的URL的黑名单列表(或许可从Quora的URL中了解到一点糟糕的URL设计)

命名空间是一种很棒的扩展URL的工具

命名空间可以作为一种很棒的建立实用的URL结构的方式,这种结构在后续的使用中很容易被记住。我在这里说的命名空间指的是什么?我的意思是,URL中指明了不同内容的那部分。一个例子:

https://github.com/defunkt/resque/issues

在上面的URL中,defunkt/resque 就是命名空间。为什么这会有用?这是因为在这一个URL之后的任何部分都突然变成了一个新的顶层部分,因此你可以去到任何的一个《user》/《repo》 , 然后加上/issues或者可能是/wiki,取得相同的页面,但是是在不同的命名空间下。

保持命名空间的清晰,不要一开始就把一些内容放在/feature/《user》/《repo》下,一些放在/《user》/《repo》/feature下。对于命名空间来说,要发挥效用就必须是统一的。

查询串是很棒的过滤和排序的手段

关于查询串web有着一个混乱的过去,我见过各式各样的事情,从每个网页都使用同一个URL加上不同的查询参数的网站,到一个查询串参数都不用的网站,各种情况都有。

我喜欢把查询串想象成URL的旋钮——其调整你的当前视图,把它按照你的喜好来进行微调,这就是为什么它们用在排序和过滤这些行为上会如此之棒。坚持一种统一的模式(比如说sort=alpha&dir=desc ),你就会把通过URL栏进行的排序和过滤变得简单易记。

关于查询串还有最后一件事情:在没有附加查询串的情况下,页面应该是有效的,其可能给出的是一个不同的页面,但没有查询串的URL应该是要呈现出页面的。

英文网站的非ASCII URL是很糟糕的

这个世界是一个复杂的地方,充满着¿ümlåts?, ¡êñyés!和各种令人畏惧的字符☄。这些字符在任何英文网站的URL中都是不会有一席之地的。使用英文的键盘输入这些字符很复杂,很多时候延展成浏览器中的一些混乱的字符(有在url中见过xn--n3h吗?这是一个☃)。

URL是为人设计的——而非为搜索引擎设计的

我是在这一行业中成长起来,学会了如何玩搜索引擎(好吧,就是Google)的把戏,以此来从我的联盟营销中赚钱。因此关键词堆砌URL的做法对我来说并不陌生。像下面这样来来结束一个URL的情况相当常见:

http://guitars.example.com/best-guitars/cheap-guitars/popular-guitar

就SEO的目的来说,使用这种URL的效果会很好,幸运的是,2003年Google的飓风式的更新消除了这类URL的任何排名优势。遗憾的是,专业的SEO行业被强取豪夺给围绕着,因此其可能还会建议你使用许多你尽可能想得到的关键字来堆砌你的URL

记住另外的一些要点:

  • 1. 下划线只有一个糟字可言,坚持使用破折号。
  • 2. 使用短的、完整的并且是大家都知道的单词。如果某个部分中有一个破折号或是一个特殊的字符的话,这个词就有可能太长。

URL是提供给人用的,为使用的人设计它们。

URL是一种协议

URL是一种协议,在一个可预见的位置尽可能长久地供应某些东西。一旦你的首个访问者点击了URL,那么你就隐式地进入了这样的一种协议中,即如果他们记住了来过该页面或是点击了刷新按钮话,那么他要看到相同的东西。

在已经向公众推出之后就不要再改变你的URL,如果你绝对有必要改变你的URL的话,加上重定向——这不那么会引起惊慌。

任何事物都应该有一个URL

在一个理想的环境中,你的网站上的任何一个单独的屏幕显示都应该得出一个URL,这一URL可被拷贝和粘贴来在另一个选项卡或是浏览器中再次产生相同的屏幕内容。公平地说,这并不是完全有可能的。除非是新近使用了一些新的HTML5浏览器的history Javascript API。值得注意的是,有两个新的方法:

onReplaceState—该方法代替了浏览器历史中的当前URL,并让后退(back)按钮不受影响。

onPushState–该方法把一个新的URL压入到浏览器的历史中,代替URL栏中的URL,并把它加入到浏览器的历史栈中(影响到后退按钮)。

何时使用onReplaceState 以及何时使用onPushState

这些新方法允许我们改变URL栏中的整个路径,而不仅是锚元素。随着这一新的强大功能而来的是一种新的设计责任——我们需要摸索出后退按钮的使用经验。

为了确定使用哪一个方法,问你自己这样的一个问题:这一行为产生了新的内容呢?抑或是相同内容的不同显示?

1.产生了新的内容——你应该使用onPushState(例如:分页链接)

2.产生了相同内容的不同显示——你应该使用onReplaceState(例如:排序和过滤)

使用你自己的判断,不过这两个规则应该会符合你80%的情况。考虑一下,当你点击后退按钮时,你希望看见什么,然后做到你所希望的。

链接的行为就应该像一个链接

诸如《a》和《button》之类的链接元素有着许多很棒的内建功能。如果你中键点击或是命令点击它们的话,它们会打开一个新的窗口。当你悬停在其之上时,你的浏览器会在状态栏中告诉你它的URL地址。在用到onReplaceState和onPushState时,不要破坏了这一行为。

1.把AJAX请求的位置嵌放在锚元素的href属性中。

2.在人们中键点击或是命令点击它们时,从Javascript的点击处理程序中返回true值。

这是一个相当简单的做法,在你的单击处理程序内部使用一个快速的条件判断。下面是一个jQuery兼容的例子片段:

代码:

  1. 		$(‘a.ajaxylink’).click(function(e){  
  2. // API 浏览器不支持history API的后备  
  3. if (!(‘replaceState’ in window.history)) return true  
  4.  
  5. // 确保是中键的、控制的和命令的正常点击行为  
  6. if (e.which == 2 || e.metaKey || e.ctrlKey){  
  7. return true  
  8. }  
  9.  
  10. // 做一些很棒的事情,然后改变URL  
  11. window.history.replaceState(null, “New Title”, ‘/some/cool/url’)  
  12. return false  
  13. }) 

特定于POST行为的URL需要废除

在过去,开发社区很爱创建一些不能被再次使用的URL,我喜欢把它们称为特定于POST行为(POST-specific)的URL——这是一些会在你提交了一个表单之后出现在你的地址栏中的URL,但是当你尝试着拷贝和粘贴这些url到新的选项卡中时,你就会得到一个错误的地址。

这类UR完全没有存在的借口,特定于Post行为的URL是用于重定向和API的——而非给最终用户的。

一个很棒的例子

1.用户生成的URL部分只用ASCII字符(defunkt、resque)。

2.“pull”是“pull request”的简短版本——单个单词,很容易关联到来源词。

3.拉请求(pull request)号局限的范围为defunkt/resque (此处是从1开始)。

4.锚指向一个滚动位置,内容不会被挡住。

知识点精萃:URL还有许多不同的格式——找出patch和diff的版本看看。

一个时代的开始

我希望随着新的Javascript API的使用的增多,设计者和开发者会花一些时间来设计一下URL。这对于任何网站的可用性来说都是一个很重要的部分,但我却见到太多忽略了这一点的 URL了。尽管重新设计网站的外观和感觉很容易,但重新设计URL的结构却要难得多。

但我也很激动,这些年来我有观察到URL的改变。有时是硬链接被牺牲在了AJAX这一祭坛上,有时是牺牲性能来为用户生成真实的URL。最终我们会来到这样的一个时间点上,到那时,我们既可以得到部分页面渲染的性能和可用性优势,同时又获得设计有条理的和精炼的URL的经验。

译文出自:译言网

原文出自:URL Design

为你的网站介绍10个非常有用的jQuery插件

本文介绍的插件涉及图像、paypal支付、分页、导航等方面的内容。

1.AJAX-ZOOM

图像缩放 & Pan Gallery, 360° 对象旋转 (Spin), 全屏视图. 在线演示 here.

2.(mb) verticalSlider

显示长列表的绝佳方式,在线演示 here.

3.More plugin

该插件主要用于评论,当然也可以用于其他,在线演示 here.

4.HTML5 drag & drop image file uploader

实现图像的拖拽上传,在线演示:here.

5.jpaging

jQuery AJAX 分页插件,在线演示 here.

6.jsLink

jQuery 的无效链接检查插件,在线演示 here.

7.AJAX PayPal Cart

贝宝支付的插件,好吧,我承认这个东西对国内用户用户不大,在线演示 here.

8.jNavigate

该插件用来动态加载网页内容,在线演示 here.

9.Ajax Login Form

Ajax 方式的登录框,在线演示 here.

10.Transform

哦,这是跨浏览器支持的使用 XSL 对 XML 进行转换,在线演示 here.

原文出自:开源中国社区

在Web上运行Linux

一个叫Fabrice Bellard的程序员写了一段Javascript在Web浏览器中启动Linux(原网页,我把这个网页iframe在了下面),目前,你只能使用Firefox 4和Chrome 11运行这个Linux。这不是什么假的模仿Linux的东西,这是实实在在的运行一个Linux。这一举动还引起了很多很牛人的关注,包括Javascript的创建者Brendan Eich

 

 

随后,Fabrice Bellard发布了相关的技术说明:http://bellard.org/jslinux/tech.html,从这份文档中我们可以看到:

  • 这个模似器完全由Javascript写成
  • CPU仿真器使用的是QEMU(接近于原古的486),为了装上Linux,其做了一些改动。
  • Javascript的终端本来可以使用termlib,但他还是自己写了一个,因为OS的按键和Web浏览器不一样(here
  • Linux  使用了2.6.20内核,编译配置在这里,并做了一些小改动
  • 磁盘用的是Ram Disk,在启动的时候装载。其文件系统由Buildroot 和BusyBox产生。
  • 在Home目录下有一个hello.c的程序,你可以使用TinyCC编译(tcc,参看酷壳的这篇文章

从这个事我有这些感触,

  1. 在Web上运行一个Linux的操作系统不是问题。那么在Web上还有什么不能做的吗?
  2. Linux真是性能很高,在Javascript下运行感觉也不慢啊。
  3. 真是Techno-Geek。

标签云完成

花了一个小时的时间,终于把标签云做好了,Flash版的,直接调用的WordPress的Cumulus插件,经过修改之后成功整合进来了,呵呵

Coderun.com 在线开发IDE

相信大家都还记得我以前向大家推荐的《在线代码编译服务Codepad.org》吧。这回的这个更猛——在线的代码开发的IDE,可以编译,执行,调试。不过,主要针对Web方面的,主要是C#,ASP.NET,Javascript(JQuery)和PHP,很强大哦。那句话是怎么说来的——“如果一个软件可以用Javascript来写,那么这个软件的最终版本会是Javascript”。这个在线的IDE是:

http://www.coderun.com/ide/

Coderun.com 在线开发IDE(点击看大图)

有朋友在留言中说,这个项目可能不实用,没什么意思,而我想说,Google的Chrome OS项目可能非常喜欢这个东西。顺便说一下,这个Online的IDE是开源的,源码在这里:http://coderun.codeplex.com/。 

一个Windows 3.1的Web网站

啥也不说了,请大家围观下面这个网站吧。http://www.michaelv.org/

打开这个网站,你会看到N年前DOS时代的Windows 3.1的界面,居然还可以扫雷,呵呵。真应了那句话——“只要是可以被Javascript实现的应用或程序,最终都会被Javascript所实现”。另,关于其它Web上更为疯狂的程序,可以查看本站的这篇文章。还有这个在线的IDE。下面是win3.1的截图:

一些非常有意思的杂项资源

下面是一些最近在互联网上看到的一些各式各样的资源和文章,当然,都是英文社区的,本来想每一个写一篇文章,但是觉得一篇文章一句话真没劲,所以,把这些东西合并写成一篇文章,这样有利于减轻本站的负载,也有利于节省网络带宽,同样,也就节省了能力和电力,因此也就很环保,很低碳。呵呵。

  • 说到这些很酷很炫的东西,大家一定会想到使用Flash,不过,目前的Flash正在受到HTML5的强力挑战,目前,对于HTML5的展示网站很多,让我们看到了HTML5完全可以做出Flash的样子,比如前些天本站说到的这个演示,还有给大家展示的纯HTML5的小游戏,不过,那些都是一些演示和展示罢了。今天在网上看到一个更强大的HTML5游戏,相当有可玩性,大家不妨一去试玩:http://www.phoboslab.org/biolab/

  • HTML5 可以应用的还不只是游戏,这不,有文章指出,用VexFlow还可以很轻松地在网页上发布乐谱。而这个网页还可以让你制作Hi-PoP音乐。

Rendered music

 

  • 说起在线服务,就不得不说说在线代码编译的服务,我觉得这种服务相当好,不需要你在本机安装编译器或IDE,想试试某个语言的语法,真接上网就OK,很方便。以前本站向大家介绍过《在线代码编译服务Codepad.org》其支持:C,C++,D,Haskell,Lua,OCaml,PHP,Perl,Plain Text,Python,Ruby,Scheme,Tcl。当然,在这里,向你介绍一个可以运行Go语言的:http://golang.org/doc/play/

  • 说起Web的界面,最让各位WEB开发者痛苦的就是网页兼容性问题,IE是一个恶梦,因为其自己和自己都不兼容,在MSDN上,有这样的一个网页说明了从IE5一直到IE9的CSS的兼容性问题,很多很多的表格,头都看大了。当然,以前本站的《检查网页浏览器的兼容性》的文章向你介绍过如何查看网站在不同浏览器中和操作系统下的效果(其也是一个在线服务)。

  • 当然,Web上的开发,问题最大的还是安全问题,我们的Ruby on Rails给出了一个Web安全的开发教程,相当不错哦。谈到了几乎所有最有威胁和最常用的网上攻击,这个文档应该是所有Web开发者都需要注意的。

  • 最后,给大家介绍一个关于文件格式方面东西,我们知道,很多文件的开头表明着这个文件的类型,所以,有这样的一个网站了维护了这么一个信息列表,其把几乎所有常见的文件头的那段和文件类型相关的Magic Number列了出来,而且还保持更新,非常不错哦,这个网站是:http://www.garykessler.net/library/file_sigs.html,希望能对你有用哦。

  • 最最后,给大家介绍一个开源项目,叫Structure Synth,这个东西可以用来画出一些很酷的图,相当不错,使用起来非常简单,我试用了一下,的确很强大。用一些简单的脚本就可以作出很不错的3D图,下面是他的一个示例,只需要写那么不到10行的代码,很简单。

想看看,大家用这个东西做什么酷图了吗?上 http://www.flickr.com/groups/structuresynth/ 看看吧。

structure 作者 Supreet Kumar architecture x-ray 2 作者 Supreet Kumar perspective 作者 Supreet Kumar snake shade 作者 Supreet Kumar thatched beauty 作者 Supreet Kumaraircraft 作者 Supreet Kumar
 aircraft 作者 Supreet Kumar  作者 FracturedPixel splash1 作者 Supreet Kumar joy 作者 Supreet Kumar

(全文完)

UI的恶梦

UI可能是编程中最令人头痛的事了。设计UI通常对于程序员来说是一件很痛苦的事情。下面,让我们来看一看一些可怕的UI设计吧,前面几个UI都是出于咱们程序员自己之手,把他们放在这里,希望能引起大家的注意。(国内软件的UI嘛的我就不说了,省得得罪人)下面这个例子不知道你是否让你似曾相识,呵呵,记得我上大学时,用delphi,PB经常开发这样的界面,当时觉得自己特牛!现在看上去嘛,简直就是一个垃圾。(关于UI设计,你可以查看本站的《35个强大的UI设计教程》)

UI的恶梦

首先,我们先来看一个叫wGetGUI的小工具软件,这是一个100%由程序员设计的UI,如下所示:

 

wgetgui-screenshot

看到这样的界面,你会觉得怎么样?“高科技”还是“头晕”?相比起命令行的那个wget,真不知道这个图形界面的工具是怎么被设计出来。哎。这里是这个工具的网页:http://www.jensroesner.de/wgetgui/,网页上还有几张图,也是一样的。

不过,比起下面这个来,wGetGUI算不上什么了。下面这个软件叫做:FileMatrix,这个界面是前所未有的经典,那叫一个相当强大啊。估计可以节省很多对话框和tab页了,把软件的所有功能全部一次性陈列出来。这也是程序员的杰作。(点击图片,你可以慢慢欣赏下面这个UI的细节)

UI

当然,FileMatrix今天还在,其主页在这里。今天的FileMatrix的UI界面已经变得很简洁了,其还支持一些皮肤,不过它们还是很糟糕。如下所示:(更多的图片

marble

让我们再来看看历史上Windows 3.2的某个配色方案:hotdog(如下图所示),真不知道这是谁配的,真是——“红配黄,喜洋洋”啊。

windows-311-hotdog-stand-scheme

不要以为,以简洁著称的Google就没有问题,最近的Google Wave大家用过没有?那个滚动条啊,我实在是没有搞懂为什么设计成那个样子。可谓史上最无厘头的滚动条了。下面,左边是Mac的,右边是Google Wave的,他们俩干的都是一样的事,但Google Wave的太令人摸不着头脑了。

google-wave-scrollbars

对于Google Wave的滚动条,我只想说的是,根据《Don’t make me Think》的原则,这个滚动条和其它例子一样只站在了程序员的角度,而并没有考虑用户体验。下面这些文章,你都可以看看那大家的看法。

  1. http://www.flickr.com/photos/yaili/3990023684/
  2. http://ignorethecode.net/blog/2009/11/15/google_waves_scrollbars/
  3. http://squawk.blogs.starnewsonline.com/10194/is-google-wave-ugly/
  4. http://allentan.posterous.com/google-waves-scrollbar-details
  5. http://technmarketing.com/web/eight-google-wave-annoyances/

你以Google wave scrollbar作为关键词到Google里搜索吧,你可以看到大量的讨论和抱怨。以至于Google自己都要写个说明了。

好了,最后两个图片和设计者无关,设计者在开始的时候可能并没有想到UI能变成这样。下面是关于IE7浏览器的,这张图你可能并不陌生,这是一张当我们的IE被安装了各种工具条后(很多是流氓软件)后的样子。(点击大图细细欣赏)

    iemess2

不要以为Firefox不会像IE一样,那是因为你的Firefox没有装插件,当安装上各种插件后,也是一样的。如下所示(点击图片,慢慢欣赏)。

ffToolbars

最后,让我们看一个现实生活中的UI吧,好像是一个飞机驾驶舱。

Blackhawk-Cockpit

你有什么UI恐怖的经历吗?欢迎与我们分享。

图解SQL的Join

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。

假设我们有两张表。

  • Table A 是左边的表。
  • Table B 是右边的表。

其各有四条记录,其中有两条记录是相同的,如下所示:

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

下面让我们来看看不同的Join会产生什么样的结果。

 

				SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

Inner join
产生的结果集中,是A和B的交集。

Venn diagram of SQL inner join
				SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

Venn diagram of SQL cartesian join
				SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

Venn diagram of SQL left join
				SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

id  name       id     name
--  ----       --     ----
2   Monkey     null   null
4   Spaghetti  null   null

产生在A表中有而在B表中没有的集合。

join-left-outer.png
				SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

id    name       id    name
--    ----       --    ----
2     Monkey     null  null
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

产生A表和B表都没有出现的数据集。

join-outer.png

还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

SELECT * FROM TableA
CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

(全文完)

程序员需要具备的基本技能

软件开发是一个跨度很大的技术工作,在语言方面,有C,C++,Java,Ruby等等等等,在环境方面,又分嵌入式,桌面系统,企业级,WEB,基础系统,或是科学研究。但是,不管是什么的情况,总是有一些通用的基本职业技能。

这些最基本的职业技能通常决定了一个程序员的级别,能否用好这些技能,直接关系到了程序员的职业生涯。很多程序新手也是因为缺少、达不到或是不熟悉在这些基本技能,所以,他们需要有老手带,需要努力补齐这些技能。而高级程序员应该非常熟悉这些基本技能,而且有能力胜任并带领其他经验不足的程序员。

下面这些基本职业技术可以用来做为对一个程序员的评估,很明显,下面的这些技能都可以用来做面试。虽然,还有很多非技术的因素,但对于评估一个程序员的技术能力来说,其应该是足够的了。

下面是程序员所应该具备的基本职业技能:

 

基本技能 技能描述
阅读代码 这个技能需要程序员能够具备读懂已经存在的代码的能力,这样的能力可以让程序员分析程序的行为,了解程序,这样才能和开发团队一起工作,继承维护或是改进现有的程序。
编写程序 编写程序并不包括程序设计。不要以为编程是一件很简单的事情,很多程序员都认为编程只需要懂得程序语言的语法,并把设计实现就可以了。但是这离编写程序还远远不够,使用什么样的编码风格成为编写程序员最需要具备的基本技能。能否使用非常良好的编程风格直接决写了程序员的级别。
软件设计 这一能力直接决定了需要吏用什么样的代码技术达到怎么样的功能,而系统架构设计直接决定了软件的质量、性能和可维护性。并不是所有的程序在这一方面都非常优秀,但每个程序员都需要或多或少的明白和掌握这一基本技能。
熟悉软件工程 每个程序员都应该明白软件工程是什么东西,都应该知道,需求分析,设计,编码,测试,Release和维护这几个阶段。当然,几乎所有的人都知道这些东西,但并不是每个人都很清楚这些东西。现在很多高级程序员都会混淆“需求规格说明书FS”和“概要设计HLD”。另外,程序员还需要知道一些软件开发的方法论,比如:敏捷开发或瀑布模型。
使用程序库或框架 一个程序员需要学会使用已有的代码,无论是标论的程序库,或是第三方的,还是自己公司内部的,都需要学会做。比如:C++中,需要学会使用STL,MFC,ATL,BOOST,ACE,CPPUNIT等等。使用这些东西,可以让你的工作事半功倍。
程序调试 程序调试是分析BUG和解决问题最直接的能力。没有人能够保证程序写出来不用调试就可以运行正常,也没有人可以保证程序永远不会出BUG。所以,熟练使用调试器是一个程序员需要具备的基本技能。
使用IDE 学会使用IDE工具也会让你的工作事半功倍。比如,VC++,Emacs,Eclipse等等,并要知道这些IDE的长处和短处。
使用版本控制 一定要学会使用版本控制工具,什么叫mainline/trunk,什么叫tag,什么叫branch,怎么做patch,怎么merge代码,怎么reverse,怎么利用版本控制工具维护不同版本的软件。这是程序员需要明的的软件配置管理中最重要的一块。
单元测试 单元测试是每个程序都需要做的。很多单元测试也是需要编码的。一定要学会在xUnit框架下进行单元测试。比如JUnit, NUnit, CppUnit等等。
重构代码 每个程序员都需要有最基本的能力去重构目前已有的代码,使代码达到最优但却不能影响任何的已有的功能。有一本书叫《软件的重构》,每个程序员都应该读一下。
自动化编译 程序员需要使用一个脚本,其能自动化编程所有的工程和代码,这样,整个开发团队可以不停地集成代码,自动化测试,自动化部署,以及使用一些工具进行静态代码分析或是自动化测试。

当然,还有很多的基本技术也是非常重要的,比如,与人的沟通能力,语言的表达能力,写作能力,团队协作能力,适应变化的能力,时间管理能力,多任务处理能力,自我学习能力,故障处理能力,等等,等等,这里只是列举了和技术相关的能力,这些是程序最最最基本的能力,只要是程序员就必需要有的能力。