Coders @ Work

PC时代初期犹如拓荒小说里的南非。拓荒者们没有精巧的工具,没有丰厚的财力,没有经验,甚至没有足够的食物。一人一镐一簸箕,和百折不挠的狂热而已。然而风云际会,不定一镐下去,就是非洲之星。二、三十年前的黑客们就是PC时代的拓荒者。技术原始,无损他们奔放的想象力。工具粗陋,却激起他们征服的雄心。那时没有铺天盖地的类库,所以他们钻研P.J. Plauger的雄文。那时没有巨无霸一样的操作系统,所以他们细读Lion的经典。那时没有趁手的软件,所以他们创造奇迹。作为程序员,想来多少对这段动人往事好奇。Dan Bricklin怎么就做出了spreadsheet?Ray Ozzie从哪里得到关于群件的灵感?Jef Raskin如何让Machintosh成为PC的不朽经典?Butler Lampson发明所见即所得编辑器和Ethernet时,经历了怎样的顿悟?正如Peter Norvig在书评里所说,理解编程,除了学习黑客们铿锵的代码外,也许还要了解他们丰富的内心。虽说高手不可模仿,因为“学问跟他整个的性情陶融为一片,不仅有丰富的数量,还添上个别的性质;每一个琐细的事实,都在他的心血里沉浸滋养,长了神经和脉络,是你所学不会,学不到的”,但我们无疑可以受到不小的启发。如果能被他们打动,分享同样的激情,也算一庄美事。好在20年前Susan Lammers采访了书写历史的19名程序员。她把这些访谈集结出版,于是有了让众多程序员心潮澎湃的经典:Programmers at Work。记得是等公共汽车,为了排遣无聊翻看这本书。结果一看入神,错过了最后一班车。干脆走两小时路回家。一边走一边把书看完。当时我还几乎不懂编程。好比连烟都没抽过的人突然静脉注射高纯度海洛因,被刺激得死去活来。:-P 有兴趣的老大可以到这里读第一版的存档
 
当然,19人,400页怎么能写尽前辈风范呢?何况IT业是古龙书中高手辈出的天下,而不是金庸笔下老人无敌的江湖。20年时移势易,早有新人名动五洲。不知别人如何,反正俺盼着有人再出类似的书。还好,Apress在Founders at Work(也是好书,顺便推荐一下)上尝到了甜头,于是趁热打铁,请Practical Common Lisp(Lisp的书居然能得Jolt奖,还是值得翻一下的哈)的作者Peter Seibel写Coders At Work。Peter能把Common Lisp的宏编程写得通俗易懂,能让铁杆儿C++/Java程序员对Common Lisp动心,笔头自是没话说。他的采访对象也是俺这种小喽喽仰望的对象。这里汇总了他采访的候选对象,凡284人。有意思的是大家心目中的超级高手大体一致。按投票数排序,前25位都是大家耳熟能详并且深刻改变我们生活的牛程。后面的就见仁见智了。比如说Google的Jeff Dean居然排在121位。而近几年光说不练Paul Graham排在第23位。下面是已经答应接受采访的程序员名单,让人神往:
  • Joe Armstrong — Erlang作者
  • Bernie Cosell — ARPANET的IMP主要作者之一
  • Simon Peyton Jones — Haskell的发明人之一
  • Alan Kay — Smalltalk的发明人
  • Donald Knuth — 《编程的艺术》和Tex的作者.
  • Peter Norvig — AI: A Modern Approach和Paradigms of Artificial Intelligence Programming的作者
  • Ken Thompson — Unix的发明人
  • Jamie Zawinski — XEmacs和Netscape的主程
 
展开阅读全文

work!work!work!

02-09

hi,各位英雄!一句话,温食姐!五讲甘多啦如下:rnrn毕业院校:广东省水利电力职业技术学院,专业:工业与民用建筑3年(应届毕业生)rnrn工作经验:rn2000年6月:在市广州市金茂电脑城任电脑技术员,负责金融服务系统维护,电脑硬件维护与排障。rn2001年5月:参加中国平安保险公司广州市分公司寿险部营业部第二十九分部的社会交流与心理培训,并通过过关考试。rn2002年10月:有化州建筑公司驻广州市分公司任电脑技术员负责计算机维护与排障。rn2003年3月:有广州市纳和数字网络工程有限公司任程序员,其中参与项目:rnrn客户关系管理系统:rn安迅(广州)科技有限公司 2003.02--2003.05rn台安科技有限公司 2003.06--2003.09rn广东粤灏文化传播有限公司 2003.05--2003.08rnrn备件备品管理系统:rn安迅(广州)科技有限公司 2003.03--2003.09rnrn编程技术:rn熟悉JAVA/C#,对OOP理解比较好,2003年9月通过SUN认证JAVA程序员(面向对象通过率83%)。rn了解C/C++/OBJECT PASUALrn熟悉.net平台下开发应用程序,熟悉.net的一些特有的技术:ADO.net ,delegate ,attribute等rn理解windows应用程序开发的基本原理(消息循环,回调等)rn熟练使用Microsoft SQL Server和Microsoft Access,熟悉使用T-SQL编写存储过程。熟练使用C#和JAVA开发数据库应用程序 rn熟悉UML(类图,序列图,用例图等),能使用ROSE,VISIO进行简单设计。rn了解XML,能使用XML作.NET的配置文件。rn有良好的编程习惯和风格,习惯使用注释去维护自己代码。rn熟悉使用Visual Source SafernrnIf i meet the need of your requirement, please contact me on bobo520th@hotmail.com ;rnQQ:183393647rnrn 论坛

Work, work

06-27

Problem Descriptionn锄禾日当午,汗滴禾下土。n谁念盘中餐,粒粒皆辛苦。n —— 李绅nnWiskey终于回到学校了,听说实验室来了一位领导-阿柯,是lcy手下的一名得力干将,专门管教那些不爱干净的ACMer。最重要的是lcy亲授于她一把传说中的实验室钥匙,江湖上传言“武林至尊,实验室钥匙,号令天下,谁敢不从,扫帚不出,谁与争锋?”。看来Wiskey这次难逃一劫了。nn今天,阿柯命令Wiskey打扫,不仅得实验室清理干净,还得把一教整幢楼都要打扫一遍!!假设一教是一个N*N*N立方体,每个空间是1*1*1的单位立方。Wiskey的体力是有限的,一开始的体力是0,每个单位立方有一个整数,正数表示需要花费的体力数,负数表示偷懒所得到的体力数,但是当花费的体力数>=M时,说明Wiskey的体力到极限了,不能再继续扫下去了。Wiskey可以从任意一个单位立方开始。Wiskey扫地有个习惯,他所打扫的区域是一个由完整单位立方所组成的长方体空间。他不知道一教是否有那么一个区域他没有办法清理,那就请好心的你帮Wiskey算一算。n nnInputn多个CASE,第一行输入两个正数N和M,(N<=50)表示空间长度,M表示体力极限值。n接下来就有N个矩阵,每个矩阵表示立方体的一个层面。每个层面都是N*N的平面面积。n每个单位立方体力数T(-1000< T <1000)n nnOutputn如果有那么一个长方体区域是Wiskey不能打扫的,那输出what a pity.n其余的输出no problem.n一个答案一行。n nnSample Inputn2 5n1 -1n0 3nn-1 -1n3 -1nn2 6n1 -1n0 3nn-1 -1n3 -1n nnSample Outputnwhat a pity.nno problem. 问答

WORK

06-15

package admin;rnrnimport java.util.*;rnrn/**rn * @作者 李敏强rn * Struts分页显示逻辑Beanrn */rnpublic class PageBean rnrn int currentPage = 1; //当前页rn public int totalPages = 0; //总页数rn int pageRecorders = 6; //每页5条数据rn int totalRows = 0; //总数据数rn int pageStartRow = 0; //每页的起始数rn int pageEndRow = 0; //每页显示数据的终止数rn boolean hasNextPage = false; //是否有下一页rn boolean hasPreviousPage = false; //是否有前一页rn ArrayList arrayList;rn Iterator it;rn public PageBean() rnrn public PageBean(ArrayList arrayList) rn this.arrayList = arrayList;rn totalRows = arrayList.size();rn it = arrayList.iterator();rn hasPreviousPage = false;rn currentPage = 1;rn if ((totalRows % pageRecorders) == 0) rn totalPages = totalRows / pageRecorders;rn else rn totalPages = totalRows / pageRecorders + 1;rn rnrn if (currentPage >= totalPages) rn hasNextPage = false;rn else rn hasNextPage = true;rn rnrn if (totalRows < pageRecorders) rn this.pageStartRow = 0;rn this.pageEndRow = totalRows;rn else rn this.pageStartRow = 0;rn this.pageEndRow = pageRecorders;rn rnrn rnrn /**rn * @return Returns the currentPage.rn */rn public String getCurrentPage() rn return this.toString(currentPage);rn rnrn /**rn * @param currentPage The currentPage to set.rn */rn public void setCurrentPage(int currentPage) rn this.currentPage = currentPage;rn rnrn /**rn * @return Returns the pageRecorders.rn */rn public int getPageRecorders() rn return pageRecorders;rn rnrn /**rn * @param pageRecorders The pageRecorders to set.rn */rn public void setPageRecorders(int pageRecorders) rn this.pageRecorders = pageRecorders;rn rnrn /**rn * @return Returns the pageEndRow.rn */rn public int getPageEndRow() rn return pageEndRow;rn rnrn /**rn * @return Returns the pageStartRow.rn */rn public int getPageStartRow() rn return pageStartRow;rn rnrn /**rn * @return Returns the totalPages.rn */rn public String getTotalPages() rnrn return this.toString(totalPages);rn rnrn /**rn * @return Returns the totalRows.rn */rn public String getTotalRows() rn return this.toString(totalRows);rn rnrn /**rn * @return Returns the hasNextPage.rn */rn public boolean isHasNextPage() rn return hasNextPage;rn rnrn /**rn * @param hasNextPage The hasNextPage to set.rn */rn public void setHasNextPage(boolean hasNextPage) rn this.hasNextPage = hasNextPage;rn rnrn /**rn * @return Returns the hasPreviousPage.rn */rn public boolean isHasPreviousPage() rn return hasPreviousPage;rn rnrn /**rn * @param hasPreviousPage The hasPreviousPage to set.rn */rn public void setHasPreviousPage(boolean hasPreviousPage) rn this.hasPreviousPage = hasPreviousPage;rn rnrn public B_UpLoadForm[] getNextPage() rnrn currentPage = currentPage + 1;rn System.out.println("PageBean.getNextPage()正在执行;");rn System.out.println("参数currentPage=" + currentPage);rnrn if ((currentPage - 1) > 0) rn hasPreviousPage = true;rn else rn hasPreviousPage = false;rn rnrn if (currentPage >= totalPages) rn hasNextPage = false;rn else rn hasNextPage = true;rn rn System.out.println("参数hasNextPage=" + hasNextPage);rn System.out.println("准备执行PageBean.getBooks()");rn B_UpLoadForm[] books = getBooks();rn this.description();rnrn return books;rn rnrn public B_UpLoadForm[] getPreviouspage() rnrn currentPage = currentPage - 1;rnrn if (currentPage == 0) rn currentPage = 1;rn rnrn if (currentPage >= totalPages) rn hasNextPage = false;rn else rn hasNextPage = true;rn rn if ((currentPage - 1) > 0) rn hasPreviousPage = true;rn else rn hasPreviousPage = false;rn rn B_UpLoadForm[] books = getBooks();rn this.description();rn return books;rn rnrn public B_UpLoadForm[] getBooks() rn System.out.println("pageBean.getBooks()开始执行;");rnrn if (currentPage * pageRecorders < totalRows) //判断是否为最后一页rn pageEndRow = currentPage * pageRecorders;rn pageStartRow = pageEndRow - pageRecorders;rn else rn pageEndRow = totalRows;rn pageStartRow = pageRecorders * (totalPages - 1);rn rn B_UpLoadForm[] books = new B_UpLoadForm[pageEndRow - pageStartRow + 1];rnrn System.out.println("pageStartRow=" + pageStartRow);rn System.out.println("pageEndRow=" + pageEndRow);rn int j = 0;rn for (int i = pageStartRow; i < pageEndRow; i++) rnrn B_UpLoadForm book = (B_UpLoadForm) arrayList.get(i);rn books[j++] = book;rnrn rn System.out.println("要显示的页面数据已经封装,具体信息如下:");rn this.description();rn return books;rn rnrn public String toString(int temp) rn String str = Integer.toString(temp);rn return str;rn rnrn public void description() rnrn String description = "共有数据数:" + this.getTotalRows() +rnrn "共有页数: " + this.getTotalPages() +rnrn "当前页数为:" + this.getCurrentPage() +rnrn " 是否有前一页: " + this.isHasPreviousPage() +rnrn " 是否有下一页:" + this.isHasNextPage() +rnrn " 开始行数:" + this.getPageStartRow() +rnrn " 终止行数:" + this.getPageEndRow();rnrn // System.out.println(description);rnrn rnrn================================================= 论坛

没有更多推荐了,返回首页