Posts tagged 程序员

世上没有“著名程序员”

我经常跟我的一个朋友一起吃午饭、闲聊。通常我会东一句西一句,说说音乐,说说正在开发的一些变态项目。 他会告诉我一些他工作上的事或者他的旅行计划,他出售了一个公司,可以悠闲好一阵了。 有一回吃完饭后,他对我说:“跟程序员聊天真是很轻松,不用谈论风险投资和协议报表之类的东西。”

风险投资和协议报表?废话,明天我要去处理一个x0xb0x,而今晚我正在修改一个新的和MulletDB集成的很酷的web服务器。 而这些人奇怪我为什么不谈谈风险投资。悲哀呀悲哀。

还是让我跟你讲讲这个很酷的新型web Server吧。 我研究出来如何将ZeroMQ事件投票系统和libtask协同例程库合并到一起,这样你可以在一个线程里使用 libtask来处理无数的TCP/UDP和ZeroMQ套接字通讯。 然后我就使用这个很酷的程序来开发了一个使用我的Mongrel HTTP解析器的web服务器,我修改了这个解析器,以让它使这个server能在同一个端口同时处理HTTP请求和XMLSockets服务。 下一步我将实现让这个server把HTTP和XMLSocket JSON信息转发到任意一个ZeroMQ后端。 这个软件让我很激动,我申请了utu.im域名来宣传它,希望能申请成功。

听起来很不错吧?完全不是这样。我可以编出像这样的程序,但没有人会因为我是个著名的程序员而注意到这些,世上根本没有著名程序员。就当我 不存在。我只是个传说。

我在公司工作,像其他人一样,也知道那些获得风险投资的创业公司创始人的情况。人们清楚他们是什么党派的,如何起步的,如何获得投资的,获 得了多少投资,资本总额是多少,他们是如何失败的,如何成为幸运儿的,他们卖了多少产品,他们为什么不愿卖掉公司,他们的下一个iPad app将会是什么样的,他们是同性恋还是异性恋,他们的女友是什么样的,他们的男友是如何甩掉她们的。

可人们对开发出这个他们自己正在使用的web框架的人却一无所知。他们从来没想过要见见这个家伙。人们从来不关心这个家伙是如何设计这个软 件的。人们从来不介意当软件开发出来了,这个家伙也就可以消失了。 研究这个家伙的生活是毫无意义的,因为他的全部生活都在软件里,人们愿意让他就这样静静的生活。

还有更出格的,人们甚至要求我们开发软件时不要使用BSD使用协议(或其他许可协议),他们不想在引用我们的程序时署上 这个软件是我们开发的。 还有些程序员根本不想在使用了我们的代码的应用程序的感谢名单里出现我们的名称。 对于人们来说你就是一个小程序。你就是一个螺丝钉,一个普通的螺丝钉。一幅画可以是著名的,螺丝钉不能。没有人愿意看见你,或把你挂在墙上。人们通常是把 你丢的沾满油污的工具箱里,直到有一天他们的橱柜松动时才会想起你。

让我们来做个实验。说出一个你每天都会用到的软件。也许这个软件是Rail的或Python的或其它语言开发的。现在,不要偷看,说出这个 软件的开发团队的四个主要成员的名称。我做不到,对任何一个我用过的软件都做不到。 那好吧,就当你能做到。你知道很多关于这个软件的开发者的资料,那你可否可以诚实的告诉我,你真的像了解这个软件一样了解给你开发这个软件的人吗。 扪心自问,当你使用这些软件时你对制作这些软件的幕后人物又知道多少?

所谓著名的程序员事实上并不是因为他的编程技术,而是因为他创建了什么公司或非营利组织。 他们的代码可不是像他们本人那样杰出,他们的杰出都是由非程序方面的荣誉构成的,这样才能让人们很容易的理解。

这就是我为什么坚信世上没有“著名程序员”的理由,而且出名对程序员的编程生涯没有任何好处。 我以前就这么说过,现在我担任的是系统负责人的工作,我还是这么说。 这样说,多少都有点让人丧气。 这个事情让我警醒,我所受雇的公司都需要我什么东西?他们唯一需要的就是我作为系统负责人的专长。

是的,我只是一个系统负责人。仍然是。

我跟其他人一样,仍要经过面试。无论我编写了多少代码,我仍然需要去解决那些愚蠢的低级错误。 不论你写了多少的web servers或email框架或数据库服务器或聊天通信服务器或汇编器,我仍然需要向人们证明我能 够编程。 不论我写的应用被人部署了多少份,我仍然需要向人们证明我还可以写出可信赖的软件。

成名对我这种职业没有任何的好处。实际上是让我更辛苦了,因为一些有古怪想法的人认为我出名了就不能再编程了。

如果时光能够重来,我真不愿意因为编程而成为名人。 但是,我实际上再也抹不掉任何我获得的名声,所以我明白现在应该尽量的把这些名声当成儿戏为好。 我应该多教育一些人去热爱编程,就像我当年那样。这样不错。去鼓励更多的怪才去成为书呆子。

也许只是我这种怪人的一种怪想法。十年或二十年之后,我想,程序员将会成为另外一种车间工人。程序员将不再关心其他程序员的作品,人们将会 热衷于这种自闭,完全失去了创新和共享的动机。

所以现在你要满足于现在的社会地位,因为以后,程序员将永远的成为二 等公民。

from:http://g.tugus.com/bbs_content:83445

中国为什么缺少优秀项目经理?

看到一段印度软件开发人员whyjava写的感慨,51CTO翻译如下:

1、在印度,任何一个人,无论他的资格如何,都可以成为软件开发 人员。这个过程没有经过任何筛选,而纯粹是偶然的。我本人本来应该从事机械行业的,但是在校园招聘过程中,被一家软件公司选中,最终成为一个软件开发人 员。同样,我也有很多朋友也是因为偶然的机会成为软件开发人员的。大部分大学生在进入软件开发企业的时候,并不懂得软件开发和编程知识。
2、大学 教育没有对人起到任何帮助。我可以很明确的告诉大家,我本人毕业于印度一所很好的大学,但是印度所有的大学教育质量都非常差。很多学生只能通过各种补习班 获得知识,但是到底在这些补习班学习的如何,也没有人知道。最近我面试了一个有6年工作经验,并且从一个很好的大学计算机专业毕业的人。但是我发现他连一 个斐波纳契数列程序都写不出来。

3、开发人员不注重自己的知识更新。如果你问一个开发人员,他最后所读的书,或者是如何保证自己的知识更 新。往往无法得到确切的回答。没有人想提升自己或者多做点事情。很多人甚至都没有听说过《代码大全》这本书。

4、每个人都想当经理。在印 度,工作到5年左右,就有机会成为项目组长。一旦成为项目组长,你的下一个目标就是希望成为经理,但是想成为经理就需要处理很多人际关系、做肮脏的政治交 易,导致无法做其他重要的事情。因为多数人工作5年左右就开始整天琢磨怎么当经理,结果就是很少有人能够在编程领域有所造诣。

5、没有参 与到开源社区。在我的朋友,或者朋友的朋友里面,也包括我自己。我没有发现任何人对开源社区做出过贡献。对于开源项目,我们只能使用,一旦发现什么 bug,没有任何办法解决,只能抱怨开发人员写的代码有问题。

也许有人会说,我就是想当经理,我就是不想当资深软件开发人员,不也挺好的 吗?在这,shaou.org想仿照他写一段中国为什么缺少优秀项目经理的原因:

1、在中国,任何一个人,无论他的资格如何,都可以成为 项目经理。这个过程没有经过严格筛选,只要你本职工作做得还算好、人际关系处理的也还算好,就有机会成为项目经理。在我身边就出现过很多这样的例子:一个 团队里技术最好的人被提为项目经理,虽然他在管理方面经验很少,而且在领导力和沟通技巧方面的修为还很初步,但公司愿意相信他的学习能力,即使他其实更适 合于做技术专家而不是管理。
2、大学教育没有对人起到任何帮助。我可以很明确的告诉大家,我本人毕业于中国一所很好的大学,但是中国所有的大学教 育都缺乏领导力和管理能力的训练。很多学生只能通过各种课外实习获得锻炼,但是到底在这些课外实习效果如何,也没有人知道。最近我面试了一个有10年工作 经验,并且从一个很好的大学计算机专业毕业的人。但是我发现他连一个完整的BUG管理方案都写不出来。

3、开发人员不注重自己的知识更 新。如果你问一个项目经理,他最后所读的书,或者是如何保证自己的知识更新。往往无法得到确切的回答。没有人想提升自己或者多做点事情。很多人甚至都没有 听说过《一页纸项目管理》这本书。

4、每个人都想当CTO。在中国,工作到8年左右,就有机会成为项目经理。一旦成为项目经理,你的下一 个目标就是希望成为CTO,但是想成为CTO就需要更多的了解行业、了解市场、同时参与更多的办公室政治斗争,导致无法做其他重要的事情。因为多数人工作 8年左右就开始整天琢磨怎么当CTO,结果就是很少有人能够在项目管理领域有所造诣。

5、没有参与到网络社区。在我的朋友,或者朋友的朋 友里面,也包括我自己。我没有发现任何人能列出几个优秀的项目管理方面的交流社区,对网络社区贡献的贡献更是没有。对于网络社区,我们只能通过 google从它们身上收罗资料,对于一些从技术人员的角度不好理解的观念,有时还会私下嗤之以鼻。

成为跨平台的C++程序员【转】

最近看到javaeye 上的坛友,想达到 “有勇气说自己会c++,标准c++,而且能跨平台” 这样的目标。身边有不少想学习C++的朋友,就这个问题,说说我的理解

跨平台的C++程序员也曾是我的目标,不过多年来,我只有在windows和 unix 下的开发经验,所我的经验来自于这两大平台。

带具体任务进行学习
如果没有具体的任务做为目标,你的学习将没有效率可言,并且知识都本都停留在书面上,过段时间,你又基本上都忘记。因此在学习C++过程要不断给自己设定任务。 并且将这个任务不断非富,不断重构。 以下我举例来说明:

编写双人对弈的五子棋 ver 1.0
在unix下使用GCC + MAKE + VIM (跨平台的编辑器) 来完成这个任务,熟悉C++的基本语法,学习使有类或者结构来表达领域的概念。在这个期间尽可能的少用库(除非不得已),界面显示是次要问题,在控制台上显示即可。

达到标准: 五子棋可以双人对弈,源代码有信心给人看, 基本符合代码大全的标准 : )

目的: GNU下的开发环境, C++ 程序对 类、指针、基本算法、内存管理问题 的学习。

五子棋 ver 2.0 (重构 ver 1.0)
自己学习模版、STL 以及 Boost 然后来重构之前的 ver 1.0 版本。 尽可能的使用STL, 使用boost 的 smarty 智能支持来管理内存。

达到标准: 程序代码行数要减少至原来的 50% 以下。

目的: 对泛型抽象及模板技术的初步学习以及熟悉 STL 库和 BOOST 库

五子棋 ver 3.0 (增加对弈结果保存以及复盘的功能)
加上以上两个功能,需要做不少的工作。要考虑各种外部资源不满足的情况。

达到标准: 功能上满足要求, 并且能实现破坏性测试( 存盘文件不存大, 棋局文件内容错误)

目的: 数据保存、对象序列化、 异常、异常安全、外部资源管理的学习

五子棋 ver 4.0 (支持网络对战)
学习网络编译,基于TCP来实现

五子棋 ver 5.0 (支持与电脑对战)
进行算法的学习,提供人工智能能力,并有难度级别

五子棋 ver 6.0 (提供可操作的界面)
可操作的界面,可以是windows 下的, 也可以是linux 还可以考虑与python 结合 学习混合编程。

达到以上6个版本,你已经是一个跨平台的标准C++的程序员,以后完全可以自己来解决C++领域的大部份问题。 另外你的这个作品,对于找工作来说,已是利器,无往而不胜

在学习过程注意几点:
除了版本1.0 和 6.0 外,程序要尽可能的使用标准库,跨平台的库
放弃使用便捷的IDE, 在unix 下 vim + gcc + gdb + make 才是C++开发的主流.
有选择的阅读
C++ 书藉非常之多, 其它如设计领域、网络编程、多线程多进程编程、界面开发 等资料十在是太多。你无法全部读完,还是有选择的来阅读。 书一定要区分这书是手册类型的,还是系统理论型的。前者在需要时查就可以,后者则需要精读,有了实战后再读。

推荐几本需要精读的书

《深入理解计算机系统》
《C++ 程序设计语言》
《代码大全》
《C++ 语言的设计和演化》
《C++ Templates 中文版》
《unix环境高级编程》

关于程序员的幽默

一个程序出错信息
Keyboard not found … press F1 to continue

为什么程序员喜欢UNIX
unzip, strip, touch, finger, grep, mount, fsck, more, yes, fsck, fsck, fsck, umount, sleep

(说明:unzip:拉开拉链;strip:脱掉衣服;touch:抚摸;finger:手指;grep:摸索;mount:骑上去;fsck:fxxk;more:更多;yes:爽;umount:下来;sleep:睡觉)

程序员进阶的建议:多看、多写、多交流

很多初学者都说入门之后不知道该如何提高,我都是告诉他们多实践。最近在我们的团队中建立了一个学生的实习小组,我在和他们讲授程序设计分析的时候,我也给他们了个小建议写代码就是多看、多写,后来又补上一点:多交流。
我认为不管是做什么行业或工作,只要专注都可以有自己不同的成就。因此我觉得做任何事必需要有热情,而且是持续的热情,有一句话说“好的开始是成功的一半,持之以恒是成功的另一半”我很认同,所以自己的认定的事情就应该坚持的去做。我提出了三多:多看、多写、多交流,来将热情付出行动。
这里谈到的是当你入门后怎么使自己不段的提高的一些方法,可能只是一些片面之词,但我相信只要你去做了都会有一些收获。
在 我们开始学习程序,都必须对一些基础知识进行学习,例如语法、常用的内置函数,就PHP来说内置函数有成百上千个(没有统计过),就常用的也有上百个。怎 么才可以对这些逐个掌握?死记硬背?这是一个常人都无法做到的,即使是记住了,通常能否灵活的应用还要打个问号。那该怎么做呢?
首先是多看,看技术文章,看开源代码。
技 术文章应该不必多说,这是学习新技术和积累技术的必备渠道。这里我谈谈该怎么看,很多人包括我自已有时候,只是看一遍就算了,这样的结果一般都是知其然不 知所以然。我认为要把别人的东西变成自己的必须实践。把文章所说的技术通过自己理解的写出来并改进,并在合适的时候尽快应用的你的实际工作中。
再 说看代码,一是一些网友的代码,这里就要有一个观念,就是不能迷信别人的代码,应该客观的去看,学习别人的方法的时候,应该去考虑它是否有问题,应该是辩 证的态度对对待,如果有问题自己试着去解决,并和他们交流。二是看开源项目中的代码,这类就不仅仅是看代码了还有框架、设计思想等。我建议每个人至少看到 1到2套开源代码,因为我认为开源代码对自己的提高比一般的技术文章要快的很多。首先它们都是一些较为成功的项目,在成功项目中其实包含了原作者的经验和 其项目不断改进中产生的非富经验。对于开源项目,我的方法是先从它的入口文件看起一般是index.php看它的整体文件结构,再看它的公共文件里的内 容,具体的一些常用的工具类,这样会对整个项目的结构有一个了解,然后就是你所兴趣的功能的具体实现代码,并详细搞懂他的实现方式和原理。在看的过程中你 肯定可以学到很多有价值的东西。我个人的经验是:看的最多的是DZ的代码,其它项目也很多,但比较全面的还是dz的代码。个人认为看代码还是比较速成的一 种方式,因为别人的走过的路你就不需要再走了,站在巨人的肩膀上总是可以走的更快更远。
关于多写其实 上面也提到了,学习后的东西应该要马上实践,并尽快在合适的时候应用到自己的工作中,这样才能收获的更多更快。另一方面是自己尝试着去写一些小项目,只有 去做一完整性的项目才是最有价值的实践,但在做这些实践中我认为应该严格的要求自己,既然是为了学习,就不是应该敷衍了事,尽可能把所有细节都处理的最 好。还有就是时间一定要要求自己,不能拖,一方面是要给自己压力,二是如果时间拖的太久思路和激情没法持续的话,那你的计划很可能最终会失败并不了了之。
开 篇我提到很多初学者都说入门之后不知道该如何提高,我都告诉他们要多写,为什么会无法提高,我认为是没有目标,只要你给自己定一个目标,然后去实现,完成 后其实也达到自己提高的目的了。例如你去写一个简单的博客程序,在实现的过程中会遇到很多问题,再逐一去解决,这样你就有了学习的方向了,解决问题就是积 累经验和学习的过程。总的来说要给自己设置一个需要完成的目标,这个目标是什么有什么内容,什么时候完成都很清楚。
其实说到这里就可以回答上面该如何去掌握那么多的函数呢,当你看过和写过很多代码后你会发现你所掌握的函数和方法已经很多了,这就是在实践的过程中无形产生的结果。所以什么语法之类的基础的东西是不需要去死亡硬背的,在运用的时候自然就可以对它驾轻就熟。
最 后我认为做技术的交流很重要,因为做技术是个永无止境的学习过程,而交流是一种更有效的学习方式。因为每个人的知识系统都是不同的,每个人掌握的东西不 同,思维方式各异。所以交流就是一个互相学习和促进的过程,当你把自己的想法与别人交流你就会收获更多新的想法。交流是一咱倍速增长的过程,前一段我写了 一篇《当你开启一扇门的时候,很多扇门将为你开启》给我们的团队就是想表达这个想法。
交流有很多的, 有线上的有线下的,大家都有上论坛的习惯,这是一种交流方式,但我认为线下交流更有效,语言的交流比文字的交流方式更直接和全面。因为我是PEA福州的常 委之一,很多线下活动是由我组织的,从参加人数来看并不是很理想,所以我认为做技术的应该更开放一些,多参加类似PEA的这种交流。
交流一定要是开放的,所以在交流中应该是一种包容的心态去面对。也就是说我们是持有自己想法的时候也应该耐心倾听他人的意见,不能认死理。只有站在客观的角度去看问题才能把问题看的更透彻,只有不抵触才能让自己学到更多的东西。
在我们的技术团队中有定期的技术分享会,目的就是为了建立交流的平台,让大家都尝试表达自己的意见,锻炼自己的能力,并可以和更多的人去交流。
最后总结一下,多看,吸收别人的经验转化为自己所用,多写,全面性的锻炼自己的能力,多交流,利用众人的智慧。三多更多的就是去做。
本文投稿在《PHPer》http://www.phpchina.com/phper/25/06.html