“另类” 设计模式
下面这篇文章来自这里:http://www.lsd.ic.unicamp.br/~oliva/fun/prog/resign-patterns,这篇文章有点意思了,山寨了我们著名的Design Pattern。这篇文章并不是很容易翻译,也许我翻译的不好,大家多指正。另外,这篇文章将失去原有的趣味在于其使用了经典设计模式的单词很相似的单词,一走眼你还以为是正二八经的设计模式。呵呵。所以,我在下文中,我会保留原有的英文单词,并把真正的23个经典设计模式的英文名放在旁边(灰色)。这篇文章和之前的如何写出无法维护的代码有异曲同工,个人感觉都是比较欢乐的。
辞职模式Resign PatternsDesign Patterns
不合式的非面向项目软件开发病症
Ailments of Unsuitable Project-Disoriented Software
Elements of Reusable Object-Oriented Software
作者:Michael Duell
目录
概要
1. Cremation ...
软件真的好难做啊
还记得以前本站的那一篇“编程好难啊”吗,那是一篇众程序员调侃程序新手的文章,有恶搞的成分在里面。今天要和大家说的这个事没有一些恶搞和调侃的意思,是比较严肃的话题,你一定可以从中收获一些东西。这个话题来自StackOverflow上的一个问题——Cycle in Family Tree Software,这个程序员问了下面这个问题:
我是一个写家族族谱软件的程序员(我用的是C++和Qt),这个软件基本上没有什么问题,直到有一天有个用户报告了一个bug。这个问题是这样的——我这个用户和他女儿生了两个孩子。
于是,我程序员的一些断言和硬性条件导致程序报错,因为我的程序在处理这个关系的时候,其发现X即是Y的爸爸,又是Y的爷爷,所以只能报错。
请问,在不需要移除我的断言和数据验证的情况下,我怎么才能解决这个问题?
看到这里,请重点阅读一下下面的两点:
如果你看到这里开始兴奋了,请你为你阴暗的心理去面壁反省10分钟,因为这是一个很技术的问题。
如果你开始陷入了深深的思考如何解决这个问题,那么你绝对是一个合格的程序员,因为你已陷入技术已经很深了,有点呆了。
我在前面说过,“这个是 ...
如何写出无法维护的代码
酷壳里有很多我觉得很不错的文章,但是访问量最大的却是那篇《6个变态的Hello World》,和它能在本站右边栏“全站热门”中出现的还有“如何加密源代码”,以及编程真难啊等这样的文章。可见本站的读者们的偏好,我也相信你们都是“身怀绝技”的程序员。所以,今天给大家推荐这篇文章,相信一定能触动大家的兴奋点。
这篇文章的原文在这里(http://mindprod.com/jgloss/unmain.html),我看完后我想说——
什么叫“创造力”,创造力就是——就算是要干一件烂事都能干得那么漂亮那么有创意的能力。
什么叫“抓狂”,抓狂就是——以一种沉着老练的不屈不挠的一本正经的精神一点一点把你推向崩溃的边缘。
我把文章节选了一些,也并没有完全翻译,简译一下,也加入了一些自己的调侃。对于有下面这些编程习惯的朋友,请大家对号入座。另外,维护程序的朋友们,你们死定了!!
If builders built buildings the way programmers write programs, then the first woodpecker that came along wo ...
读书笔记:对线程模型的批评
——感谢Ian.Sian投递本文——
多线程模型是主流的并发编程模型。在过去几十年来,多线程模型一直是开发并发程序的有力工具。然而,它的历史并非总那么美好。1997年,NASA 的“火星探路者”号在执行任务的途中遭遇了严重的时序异常(参见 “What really happend on Mars“,注目 follow-up 中的现身说法),无法发回探测数据。如果不是 NASA 远程刷新了程序,它的结局就只能是报废在火星上。这一切都是由程序中潜藏的一个优先级反转 bug 造成的。更早的例子还有80年代的一系列 Therac-25 型医用粒子加速器事故。在这些加速器释放出的过量辐射照射之下,数位病人死亡。事后调查显示,至少有一次发生事故的原因,是加速器的控制软件中,存在一个只能由特定操作序列引发的竞争条件 bug。你也许认为这些只是陈年往事,但是直到现在,即便是世界500强公司们高价买来的信息系统,也同样避免不了这些问题。这导致许多程序员认为线程是个潘多拉魔盒,对它采取能躲就躲的态度。然而近来计算机的发展使得躲猫猫的空间越来越小:随便从市场上淘一个CPU,它里面也有不止一个核心。未来的程 ...
如何学好C语言
有人在酷壳的留言版上询问下面的问题
keep_walker :
今天晚上我看到这篇文章。http://programmers.stackexchange.com/questions/62502/small-c-projects
我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!
我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:
虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。
大量的封装好的类库也屏蔽了很多实现细节。
一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(上,下,续)》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。
下面是我给这位朋友的一些 ...
Error handling in Egypt
以前发布过《C语言的错误处理》一文,不过今天想说的是Egypt的“错误处理”。埃及的事闹得挺大的,国外和中文twitter上更是炸了锅。不要以为程序员就只会写程序——看看程序员举出来的标语吧。呵呵。
Error handling in Egypt
当然,作为程序员来说,这段代码显然还需要重构:
try{
elections(free,fare);
} catch(DemocracyNotFoundException){
System.err.println("Time for Mubarak to leave");
}
也有的程序员说,System.err.println不是处理错误的最好方法,正确的方法应该是:
try {
elections(free,fair);
} catch (DemocracyNotFoundException e) {
throw new MubarakDepartureParty(e);
}
最后,我们希望Egypt不要出现:
...
finally {
Security.shootProte ...
那些炒作过度的技术和概念
StackExchange.com上有一个贴子在评论着最近20年来被炒作过度的技术,对于出现的结果,大多数赞同,也有一些不赞同。下面我从前15名挑了10个(Java的WORE我去掉了,TDD我也去掉了,因为我觉得他们应该没有炒作过度,而且都不错),按原贴的顺序罗列如下:(后面的一些评论是我加的,欢迎大家讨论)
Top 10 过度炒作的技术和概念
Unified Modeling Language (UML) – UML是一个程序员交流想法的不错的工具,但是他离程序员真正需要的设计工具还差得很远,比如:设计是否符合需求、架构设计、数据流等等。只有为数不多的程序员使用这个工具交流想法,而没有用在具体工作中。
Sharepoint – 现在N多的公司都在用微软的这个东西做公司内部的Intranet。不过安装和维护起来,代价相当的大。但是其市场做的很成功,不对技术上来说对技术人员来说,相当的蹩脚。Sharepoint的设计没有认真地分析过业务流程,仅仅是一个文档存储地。看上去我们似乎可以做任何的事,但是如果你要用其来管理你的项目和track你的项目问题,你会发现其是无比的难用。
...
一些有意思的网站和贴子
各位朋友,又到了介绍各种杂项的时候了,正如以前的这篇和这篇文章一样,本篇文章也给你介绍一些最近出现的一些有趣的东西。希望你能喜欢。
首先是华尔街的一篇报道,2011年最好和最不好的工作,其引用了CareerCast.com的数据,其列出了100个工作种类,并根据薪资、工作环境、工作鸭梨、体力消耗和就业前景做了一个排序。结果排第一位的是“软件工程师”,其理由是:高科技产品的需求呈爆炸式增长,以及人们对iPod、平板电脑、和其它科技产品应用软件的喜好,软件工程师被评为最佳职业。软件工程师有弹性工作时间,可以在家办公,而且每个月都有猎头找来。而最差是的则是码头工人。
接下来是一个叫“Java pass by value”的长贴,楼主说有一天在LinkedIn.com上看到了Java Group里有人讨论Java是pass by value的,长达240+贴子。贴子里说,如果你使用Java的原始类型如int, long,就是传值,如果你用object, array,其实传的是一个引用的拷贝,所以,Java是传值的。呵呵,你觉得有道理吗?于是,成就了这个大讨论战。r ...
偷了世界的程序员
本文译自美国时代(time.com)的《The Men Who Stole the World》,原作者:Lev Grossman。相当有传奇色彩,读起来很爽,翻译过来。译得不好,还请大家指正。本中的四个程序员可能并不是那么声名显赫,而且也很不老实,或许算不上成功,不过他们的确改变了世界。而本文有分析了互联网上P2P的那些事,相当的有参考价值。
2010年12月17日更新:修改了一些错误,理顺了一些语句。
2010年12月19日更新:增加了一些插图。
————————正文————————
十年前,有四个年轻人改变了这个世界的运作方式。他们使用的并不是法律或是武器或是金钱,而是使用软件来改变世界。他们当时有着激进和极具破坏性的想法,并把这些想法付诸于代码,在Internet上以免费自由方式发布。这四个人,没有一个完成了大学学业,却奠定了今天我们习惯的数字媒体环境的基础。然后,因为各种原因,他们也迅速地消失在公众视野中。
1999年,美国东北大学的一个叫Shawn Fanning的一年级新生开发Napster,从此,成为了P2P文件共享和不需要大型机构或零售商就可以获得音乐的先 ...
140个Google的面试题
来源:http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html(墙)
某猎头收集了140多个Google的面试题,都张到他的Blog中了,主要是下面这些职位的,因为被墙,且无任何敏感信息,所以,我原文搬过来了。
Product Marketing Manager
Product Manager
Software Engineer
Software Engineer in Test
Quantitative Compensation Analyst
Engineering Manager
AdWords Associate
这篇Blog例举了Google用来面试下面这几个职位的面试题。很多不是很容易回答,不过都比较经典与变态,是Google,Microsoft,Amazon之类的公司的风格。对于本文,我没有翻译,因为我相信,英文问题是最好的。不过对于有些问题,我做了一些注释,不一定对,但希望对你有帮助启发。对于一些问题,如果你百思不得其 ...
你和你的工作
源文:http://youtheuser.com/2010/10/04/you-and-your-job/,有人说下面的这个文章太过Crazy,有人说下面的这个文章是猎头的软文,你换工作换得越多,他们才能越挣钱。我的观点的,先别否定他的观点,试着去理解一下为什么他要这么说,你会发现还有一些道理的。然后,想一想,自己需要的是什么?一份工作?还是一份经历?还是不断的自我挑战?相信你会有知道该怎么去做的。当然,“离职”是最后一步棋,在此前,我更希望你能尝试地在你现在工作环境下去改变去影响。
“The role of a manager should be to ensure that those that work for him/her eventually leave and go onto bigger and better things” — Mark Plant
如果你对你的工作不高兴——离开,如果每天早上你对你的工作没有激情——无论你在干什么你都要停下来。
因为这就是我们赖以生存的东西。
如果你的工作没有挑战性 – leave.
如果你在混你的工作 – ...
开发时间估计
项目管理中,项目任务时间估计是其中一个重要的环节。各种管理员人都觉得时间估计很重要,都希望时间估计能准确一些,但是,事实却并不如此。事实上,会下面这样的结果。
目前状态
完成进展
剩余任务估计
任务刚被分配,还没有做调查
完成0%
大约2周
完成需求分析和调查,攻克了难点
完成50%
大约2周多一点
我几乎做完了。只有出了点我事先没有想到的岔子。
不过,我已找到解决方法了。只是还需要一些时间
完成90%
大约2周多一点
我全部做完了,只是还要写文档,做Code Review,
单元测试和错误处理
完成99%
还需要2周
呵呵,这是怪我们的项目管理的方法论呢?还是怪我们太过草率的程序员呢?
代码重构的一个示例
还记得以前和大家提到过的《各种流行的编程风格》吗?有一些人问我那些编程风格具体是什么样子的。下面是一个代码重构的实例,让我们看看那个流行的编程风格是实践是什么样的。下面的这个实践不是虚构,如有雷同,请对号入座。
首先,我们有一个表达式如下所示:
s = 7;
很明显,这个表达式的变量名太没意义了,很不利于程序的可读性,所以,我们需要取一个有意义的变量名:
slots = 7;
很好,不过,那个常量7是hard-code或是一个Magic number,而且,这常量没有名字也不利于代码的可读性啊。再改:
SEVEN = 7;
...
slots = SEVEN;
靠!上面,是这是哪门子的改法?(不过,我保证这是真实发生的),常量名也要有意义一点嘛,再改:
SLOTS_PER_WIDGET = 7;
...
slots = SLOTS_PER_WIDGET;
这还差不多,不过,名字可能会重名啊,最好放到一个类中:
import widgetConstants;
...
slots = widgetConstants.SLOTS_PER_WIDGET;
现在看起来好很多了,不过,即然面向 ...
编程时间分配图
下面是一个程序员coding的时间分配图,原图在这里。
编程时间分配图
思考会是一个很重要的过程,当然耽搁拖沓也有可能也是因为没有想好,抽烟/喝咖啡应该也是一种思考,吃点东西是为了让脑子转得更快一点,上网搜索一下灵感可以借鉴一下其它人的想法,抱怨写注释只是一个例子,更多的应该是抱怨加班或是公司的老板。
如果需要加上点什么的话,我觉得应该加点“重构”,“编译”,“调试”,当然,他们都可以算在coding里。不过,我觉得更应该还有:“开会”,“争吵/解释”,“打断”,这些比重也是很大的。
所以,下面是我个人认为比较实际的版本:
编程时间图(酷壳版)
你的编程时间分配图是怎么样的?
最佳编程语录
以前本站发布过《22条经典的编程引言》、《编程引言补充》、《Linus Torvalds 语录》还有《十条不错的编程观点》。今天向大家介绍“最佳编程语录”,条条都是很不错的语录,如同我们的太阳,照亮了我们的方向(所以我们选用了一个红色的图片,希望能够通过五毛们的网络审查)。其中只有一两条在以前本站发布过的文章中出现过。这篇文章的出处在这里,下面是“Neo”和“陈皓”的翻译,我们的翻译水平有限,所以,我们提供了中英文对照,有不当之处,还请各位指正。
A good programmer is someone who looks both ways before crossing a one-way street. — Doug Linder, systems administrator
好的程序员这样一类人,这类人在横穿一条单行道前都要先看一下路两边。– Doug Linder, 系统管理员
A most important, but also most elusive, aspect of any tool is its influence on the habits of ...
黑客的价值观
黑客,可能在大家的眼里是那些入侵别人计算机搞破坏的人,其实并不是那样的。如果你这样认为了,只能说明你对计算机文化并不了解,真正的黑客是一种自由的象征,他们挑战权威,追求自由,并和很多非人类的行为作斗争。如果你想了解黑客文化,你一定要去看看我写的《Unix传奇,上篇,下篇》。你会对正宗的计算机文化以及黑客文化有所了解的。而那些只懂得入侵别人计算机搞破坏活动的“黑客”只能称为是街头的小混混,他们根本就不配称黑客。
下面有四篇关于“Hacker’s Code”文章,我觉得相当的不错,可以让你明白什么是黑客的行为规范,道德准则,以及黑客的历史使命,希望能对你有启发。但是翻译水平有限,所以我请Mailper同学帮忙翻译了一下,但还是觉得原文更为传神,尤其是原文中的押韵,双意以及朗朗上口,所以,下面提供了中英文对照。如果有翻译得不好的还请大家指正。
The Hacker’s Code
http://muq.org/~cynbe/hackers-code.html
“A hacker of the Old Code.”
Hackers come and go, but a great ha ...
C++ 程序员自信心曲线图
学习C++很长时间了,也看过很多程序员学习C++的历程。总体来说,C++是一个“双刃剑”式的语言,只有那些熟悉他的人才能把C++这门语言用好。Linus曾说过:“C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它”。是的,C++并不是一门速成的语言,其是一门需要长时间磨练和学习的语言,那些说自己熟悉C++语言的程序只能算是轻浮的。详见“21天教你学会C++ ”。
下面是一个C++程序员在学习过程序中的一个自信心曲线图:
程序员在一开始学习C++的时候,用C++的语法写C觉得很牛,也会觉得自己很快掌握了C++语言,对一切都充满了信心。他们告诉你他们懂C++,其它他们错误,但我们不能说他们在撒谎,因为人总是不知道自己不知道什么。此后,当他们在C++的学习历程中,发现了很多很多稀奇古怪的东西,还有很多相当底层和复杂的东西,他们的将会变得很受挫,很沮丧,还始变得怀疑起,自信心开始下降,甚至有时候他们靠人品来编程。只到有一天,开始开窃,觉得C++的世界不能乱来,需要一定的规则,一定的方法,于是通过大量的错误不停地总结和反省,最终自信心又会被建立起来,经历多年的 ...
“21天教你学会C++”
下面是一个《Teach Yourself C++ in 21 Days》的流程图,请各位程序员同仁认真领会。如果有必要,你可以查看这个图书以作参照:http://www.china-pub.com/27043
看完上面这个图片,我在想,我学习C++有12年了,好像C++也没有学得特别懂,看到STL和泛型,还是很头大。不过,我应该去考虑研究量子物理和生物化学,这样,我才能重返98年杀掉还在大学的我,然后达到21天搞定C++的目标。另外,得要特别提醒刚刚开始学习C++的朋友,第21天的时候,小心被人杀害。呵呵。
当然,上面只是一个恶搞此类图片,学习一门技术,需要你很长的时间,正如图片中的第三图和第四图所示,你需要用十年的时间去不断在尝试,并在错误中总结经验教训,以及在项目开发中通过与别人相互沟通互相学习来历练自己。你才能算得上是真正学会。
这里有篇文章叫《Teach Yourself Programming in Ten Years》,网上有人翻译了一下,不过原文已被更新了,我把网上的译文转载并更新如下:
用十年来学编程
Peter Norvig
为什么每个人都急 ...
各种流行的编程风格
在过去的N年中,我遇到了很多使用囧然不同风格的开发者,下面是我所知道的一些,你还知道其它的吗?
目录
散弹枪编程
撞大运编程
Cargo-Cult 编程
刻舟求剑编程
设计模式驱动型编程
侦探型编程
屠宰式编程
散弹枪编程
这种编程风格是一种开发者使用非常随意的方式对待代码。“嗯,这个方法调用出错了……那么我会试着把传出的参数从 false 变成 true!”,当然依然出错,于是我们的程序员会这样:“好吧,那我就注释掉整个方法吧”,或是其它更为随意的处理方式,直到最后让这个调用成功。或是被旁边的某个程序员指出一个正确的方法。
如果我们把一个正规的程序员和一个撞大运的程序员放在一起做结地,那么,那个正规的程序可以马上变得发疯起来,并且,可以把正规的程序员的智商降到最低。两个撞大运的程序员不应该在一起做结对编程,这是因为他们破坏性的才能会造成的伤害会比只有一个还差。
撞大运编程
这是一种比散弹枪编程要温和一些的编程方式,我相信这种方式可能会是大多数程序员都会使用的方式。这种编程方式经常出现于程序员并不确切知道 ...
程序员眼中的编程语言
下图是一个搞笑的图片——程序员眼中的编程语言。
图片的横轴是编程语言。
纵轴是各语言的程序员、粉丝、信徒。
中间的各个小图片则是,粉丝眼中的编程语言的形象。
比如说,
第一行第一列,是Java程序员看Java语言的样子,一幢现代化的大厦。
第一行第二列,是Java程序员看C语言,一个年老过时的骨灰级老头。
当然,C程序员看Java语言也比较搞,见第二行第一列。呵呵。
其它的大家自己看吧。还有另外一个关于操作系统的《粉丝眼中的操作系统》