
写代码是我的工作,我也乐在其中,你可以想象一下在某个风轻云淡的炎热夏日,我在面对屏幕在宿舍不停的敲打键盘,间歇时便啜口白开水,然后继续… 一个web应用,从数据库设计,业务逻辑代码,很酷的特性,前端页面和样式一手包办,老实说如果让别人帮我作,我都不放心,我担心他写出东西不符合我的期望,又难以启齿说他写得不好。这样,我发现一直以来都是一个人在写代码,我可以写出一个别人都喜欢用的应用程序,但是却没有人会在看完你写了一段很酷的代码而大声称好,也没有人乐意指出我的不足,跟你说这块代码写的有问题。我觉得很沮丧,就像你写的书无人问津。而即使现在在公司里也不例外——团队之间的合作似乎并不体现在共同参与同一个项目,更多的是一种依赖关系。项目里你负责的部分写好了代码,只要它工作正常,在项目计划好的时间内完成,那就成,没有人在意你写成什么样。我想结对编程可能会是个好主意,但是结对编程绝对是幻想,公司不大可能付出这样的成本,但是我觉得可以尝试,就像Thoughts on two months of pairing说的那样,结对编程真的会解决一些问题,”Get Shit Done”,而且对现在的我来说可以解决我的问题。结对编程的好处是:
- 两个人之间可以互相督促,把工作完成,提升效率。
- review对方的代码,减少bug。就像Thoughts on two months of pairing说的那样,有时你写另了一段代码觉得ok,但是经过别人的review就很容易发现问题,然后自己再看时就发现自己写的有多么荒谬。
- 互相学习和提升。每个人都是在这技术领域唯一的冒险者,有着不同的理解和技巧,大家可以取长补短。
另外,我并不想把结对编程和敏捷开发联系起来,虽然更多时候,结对编程就是一种敏捷开发的方式,因为我想强调的是结对编码要优于独自编码。
Jeff Atwood的On Working Remotely也谈到他曾经一个人编码的经历,现在他在家中和他的code partner一起“甜蜜”地工作,在“野外”寻找一个这样的code partner我觉得比找gf还要困难,因为两个人需要在编码水平差不多的情况下,对编程的理解需要一致,有共同的想法和目标,但最重要的是两人需要既是code partner也是朋友。
施能毅推荐的书。
关于编写代码,我越来越感到乏味,重复性的工作,其实我并不喜欢编程,以前学Java是有原因的,后来呢,会了一种语言,我就去作些好玩的东西,纯粹出于追求一种有为青年的满足感,可是现在情况变了,我开始厌倦,于是呢,我开始学会去想编程语言本身,开始琢磨追求一种极致,上次给我们的team作一次PPT知识分享,我发觉对于代码本身已没有任何谈资,我得找出一些噱头,于是我拖出设计模式和一些Unix编程艺术中谈及的一些编程哲学和原则,不过我是第一次写PPT并由自己演说。在最近,我在alibaba实习接到第一个项目,我负责开发,虽然很简单,但我似乎已经开始极力注重代码编写的优美以及绞尽脑汁使得我的代码不去侵入既有代码,我希望抽象的层次更高一些,这样才有些挑战性不致于感到枯燥,你得明白程序设计之所以与艺术设计、建筑设计带有同样的“设计”二字,这说明程序的编写以及设计不是盖的。
程序员都是艺术家。
你可以去阅读《Hackers and Painters》。
我将这本书的英文版放到了网络上:http://www.live-share.com/files/362650/____Beautiful_Code.pdf.html
下面是这本书的介绍:
原文链接:http://books.solidot.org/article.pl?sid=08/10/31/083254
《Beautiful Code》是由Greg Wilson在2006年构思的,2007年6月出版,现在中文版已经推出。 本书的初衷是希望从优秀的软件开发人员和计算机科学家中提炼出一些有价值的思想。他与助理编辑Andy Oram一起走访了世界各地不同技术背景的专家。33位作者,33个来自不同开发领域的专业经验,33种不同的意见。你想知道牛人们对代码之美是怎么想的 吗?其实,这本书最奇妙的地方还不在于这一点,而在于,如果你知道这些作者的名字,你肯定会忍不住去看一看。如果你不知道这些作者的名字,你更加会忍不住 去看一看。因为你知道这些人的观点肯定不会让你失望!《代码之美》的精选本可以从网站上免费下载(但需要注册)。
海龙问我,有没有一本书能够使自己对编程感兴趣,我当时说我不知道,好像没有,事实是许多人在学了C/C++之后,就失去了对编程的兴趣,觉得编程既枯燥又难学,我得承认C/C++语言绝对是一流的程序设计语言,它经历整整三十年依然为广大厂商和程序员采纳,可问题是是否C/C++是最好的入门语言。C/C++固然是其他C体系语言的基础,比如Java,我也是在学习了C/C++之后学的Java,这时学习难度并不是很大,至少是在语法方面,可是呢,你知道,许多人在C语言的指针问题上出了问题,它很难学(至少是对初学者来说),所以它绝对是个不折不扣的瓶颈,而C++的面向对象实在是可怕(与其他面向对像语言相比),一堆需要花许多时间来理解的概念(至少我不明白,我认为这是蹩脚翻译惹的祸,辞不达意),友元、虚函数、纯虚函数、模板等。另一方面,学校只教会你一门语言的语法,却不会告诉你编程的本质以及如何设计出好的程序来,什么才是真正的面向对象?什么是设计模式?这暂且不说,再回到C/C++是否是最好的入门语言问题上来,很显然,你知道我要说什么:我想说不。那么谁才是最好的入门语言呢?我很想说是Java,因为许多其他大学都将Java作为首选,而且我自己用起来最流畅的就是Java。可是我仍然认为Java也不是最佳的,因为我觉得最好的入门语言首先应该具有一下几个特点:
0.简单易学
1.语言本身和自然语言(英语)相似度高,代码对人类可读性高。
2.可交互的
3.面向对象
4.通用性高
5.自由灵活
6.平台独立
7.开发效率高(见效快)
Java只具有0,3,4,6,7,而0也要看条件,1 马马虎虎也算是。而这里我想说的是Python语言。我不想过多谈论Python有多么好,那没有任何用处。可是如果你若问我如何对编程感兴趣,那么我会说:去学习Python吧。你看,Linux操作系统自带Python不是没有道理,而Googel、豆瓣使用它作为开发语言也不是心血来潮。我觉得初学者如果能够迅速用一门语言解决掉一个有趣的或是是挑战性的问题,那么这会在很大程度提高自己对编程的兴趣,成就感也很重要不是?不需要编译也不要链接,也没有莫名其妙笨拙的编译链接错误,只需几行代码,执行并给出结果,那该多好。看看下面最简单的例子:
C++版
#include
void main()
{
cout << “Hello, world.” << endl;
}
Python、Groovy版本
print “Hello,world.”
试想一下你从来没有学过C/C++…
你得明白,编程语言这玩意只是个工具,如果花在学习工具上的时间占用了大量时间或者很难学,很有可能使大家望而却步,根本就没有机会去解决那些有趣的问题,是吧?
可是我仍然没有回答最初的问题,怎样使你对编写程序发生兴趣?因为即使是选择Python也不能使我对编程感兴趣啊,其实我觉得这得问你自己除了编程外对什么事情特别的感兴趣,拿我自己作例子,大一时我对骇客技术十分好奇,我想黑掉一个网站,可是我不懂那些骇客技术使用的编程语言,我想大干一票,怎么办?没办法,学习一个语言吧,于是我开始学VBScript(一种Windows上嫡系脚本语言),而且上了瘾,虽然这个语言现在我已经忘光了。可是如果你对对Linux感兴趣、对好玩的硬件、对网络感兴趣,那么你就得去学C/C++,对不对?如果你是一名艺术爱好者,那么你可以去学Processing、CSound,我可以双手按在圣经上发誓,这两种语言绝对能够让你痴迷,并沉醉于其中,只要你真的是热爱艺术,或者你发现游戏里那些带着智能的行为实在是很迷人,那么你可能会去寻找一种你可以控制这种智能行为的方式,那是什么呢?编程,Java、C/C++或其他语言(Inform),又或者你对开发网站很感兴趣,想写出想豆瓣那样的网站来,那么,啥都别做了,开始学习Python(ruby on rails,groovy on grails)吧…
最近看了迪斯尼出品皮克斯制作的动画电影《料理鼠王》,说的是一只会说一口流利英语的老鼠有着灵敏嗅觉而且对厨艺这方面有着不可思议的天赋,在通过与人类的交往中展现了自己的天才厨艺,而且深刻地反映了贯穿影片始终的主题:Eeverone can cook. 可是并非人人都能成为优秀的厨师,这就是苏大后庄小吃一条街那些炒菜的师傅以及我们的老爸老妈与汉庭坊里的厨师之间的差别。其实这句话与Martin Flower在《重构》中一句经典的话:”任何一个傻瓜都能写出计算机可以理解的程序”(相当于Everyone can code)如出一辙,但他的后半句是“只有写出人类容易理解的程序才是优秀的程序员。”而这句话与我高中时代的化学老师兼班主任说的话又十分相似:要把你写的化学方程式和计算过程写得能够让学校门外买早饭的老太婆都能看懂。(如果你是江浦高级中学的学生,并且是王宏明老师教的化学,或许你会熟悉这句话)最近我还看到了IBM网站上的一篇文章叫《Everyone can refactor》http://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/index.html
可是怎样才能写出人类容易理解的程序呢?举个例子吧:
反例:
一个方法调用:w44();你知道什么意思吗?w代表with,44是逗号“,”的ACII码值,它是用来将字符串以逗号隔开的格式化。如果不去看方法里面的代码,鬼知道它是什么意思。
而下面的:
november(20, 2005);你可能一眼就看出它是什么意思。
它的原型是public void Date november(int day, int year);
而同样
java.util.Calendar c = java.util.Calendar.getInstance();
c.set(2005, java.util.Calendar.NOVEMBER, 20);
c.getTime();
也能实现上面的功能,但是两者谁更容易使得学校门外买早饭的老太婆理解呢?
question = ( to ) ? be : ! be;
— Wm. Shakespeare