分类目录归档:评论转载

软件项目需要很多人一起完成可能是一个骗局

本文的标题只是一个猜想,并不是我坚信的观点。事实上,我这几年自觉学到的重要东西之一,就是如何在开发过程中分工,如何信任队友开发的组件,如何组织许多人做同一个项目。

可是,如果这是一个骗局呢?那也未尝不是一种可能。

这个世界上我们需要做的软件可能没有太多真正庞大到需要很多人合作才做的出来。需要配置产品经理,需要设计人员,需要前端开发,后端开发等等。

更多时候,你需要很多人一起来完成仅仅是因为别人都这样在做。或者是,你缺乏某方面的专业知识,需要属于这个领域的人。又或者是有些工作很枯燥,你需要一个只是打工的人来帮你完成这些枯燥的你不想干的部分。也可能是你的老板觉得你进度太慢,觉得必须想办法加快进度,他觉得增加人手或许可以……

如果你真的一个人做一个别人看起来了不起的大项目,结果要么就是被膜拜(几率很小),要么就是被嘲笑成小作坊思维。你可能也很累,觉得在做那些不得不自己做的体力活时,盼望有人帮你解脱一下。

实际上,如果你抱着己所不欲,勿施于人的思想,怎么能把自己不愿意干的活推给别人呢?当是一个团队开发的时候,这块工作不属于我就成了一个很好的借口。其实,如果一个工作过于枯燥繁琐,其实说明的是没有找到好的方法让机器代劳而已。

如果缺乏某些领域知识,对于程序员,更重要的是自己去学习,掌握它。

产品经理?如果你爱你做的软件,你就是他最忠实的用户,你比所有人都明白你需要这个软件有什么功能,怎样才好用。

如果打一开始,你就打定主义自己包干所有的活,就好象 google 当年,因为不懂 HTML ,就设计了那么一个阳春白雪的首页,用 GIMP 随便做一个 logo 一样。如果你给自己断了后路,任何活都没有人代劳,你自己就咬紧牙关自己去做了。其实整个项目的总体开发时间,未必比一个好的团队来开发长多少。当然,比一个糟糕团队花的时间肯定要少的多。

成功率也未必很低。软件质量你心里明白,它只取决于你自己的能力。

我知道,开发软件全部由一个人亲力亲为听起来很糟糕。只是,大多数人都不相信,团队开发或许更糟糕。把一个项目加到足够多的人手后,看起来就勉强可以运转了(我听说的谣言: IBM 开发维护一个软件就是用一个集团军的),不会有人会相信其实所有事情一个人来做就够了。

只是随便想想而已。

我觉得吧,如果你真打算一个人做点东西的话,最大的敌人不是你个人的精力不够;而是不够坚定,总想以后会有人进来一起干。

你获得的好处是,不会有人跟你争论设计方案,不会有人讨厌你的编码规范。如果你发现做错了,通宵改掉就行,不用担心其他人的开发受到影响。过程本身,无论是苦是乐,都是值得回忆的记忆,乐趣不在于最后的结果。而且,做完了,东西再烂,你也至少拥有一个用户。

原帖地址:http://blog.codingnow.com/2011/05/solo.html

软件工程师,你真的喜欢你的工作吗?

本文是从 As A Software Engineer, Do You Really Like Your Job? 这篇文章翻译而来。

我喜欢这种做事方式。首先,我在Facebook日志页面上寻求反馈,询问人们喜欢看什么样的文章。有人希望得到更多的从前辈那里来的关于个人事业上的忠告,而正好出现了两篇这方面的文章,让我轻松了一下。在这个行业里,如果你想找,你会找到很多从有经验的人哪里提供的人生事业上的忠告建议。今天,我的主要目的是要让你——一个软件工程师——弄清楚自己是否正走在正确的道路上。基本上,软件工程师是一个非常辛苦的工作,通常压力非常的大。所以,如果你并不是真正的喜欢你现在的工作,你需要采取行动,找到你真正喜欢甚至热爱的事情。问题就在于你如何知道现在是做这种改变的时机?

Erik Petterson有一篇非常有趣的文章,他把工作对工作的满意情况比作咖啡桌。这是一篇非常有趣的博客,对检测你是否喜欢你的工作做了一个非常好的总结:

对那些不能融入自己的工作的人的建议。列出对工作的满意情况的清单。问自己,“我获得的报酬合理吗?我是否喜欢我正在做的事情,我在跟什么人做这些事情,好时光看上去是否还会继续吗?”

有很多的网站都可以找到你当地的软件工程师的平均薪资水平。你需要确保你的薪资水平至少是在平均水平以上。

跟你共事的团队也是非常重要的一个方面,因为它可以让你的工作更加有乐趣。我曾经有过几份工作,在那里,我根本提不起任何兴趣在下班后和他们一大群人一起玩乐。然而,我也曾在一些团队里,我们就像一个大家庭,工作充满乐趣,即使在工作压力很大的时候也是如此。问问你自己,真的喜欢那些和你一起工作的人吗?你每周40小时都和他们在一起,很有可能你还要用去每周10小时的时间在家中想着他们。不喜欢他们,你的家庭生活也会不好过。

”工作稳定“这个词在当前我们这个行业有点被误用。即使是像IBMMicrosoft甚至Google这样的企业巨人里,在过去的两年也有人被辞退。如果是在一个小公司里工作,稳定性将会一直是个问题。问题就在于你有一大堆账单要支付,一个稳定的工作来源是必须的。你能做的是搞清楚公司自己是否稳定。公司里这方面是否有很多的人辞职去寻找其它的工作?公司的客户是否在增加?公司是否在削减像免费咖啡或瓶装水等小福利?同样,员工的幸福感水平如何?所有的这些事情都能反应一个公司的健康水平,能用来告诉你是否该寻找一份新的工作,保护自己的经济健康。

最后,可能也是对软件工程师来说最重要的一个,你真的喜欢你正在做的事情吗?对有些人来说,对工作的热爱可以克服任何其它方面的不足。这并不一定是件好事,除非你已经非常的富足,工资对你来说已不重要。在有些公司,工作可能会一直非常的有意思,干起来非常的有乐趣。然而,像这样的工作并不很多,但你的兴趣爱好会很广泛。你怎么知道你现在是否喜欢真正在做的工作呢?Merlin Mann写了一篇神奇的关于摇曲柄的帖子。他对摇曲柄的描述跟你们当中的一些人的工作很相似:

我没有时间去考虑家庭。现在没有时间。我必须一直工作…我不停的打字。我一遍遍摇动病床上的曲柄。我努力呀努力…我一直干到昏天暗地不知几点,我都不知道我打出的究竟是些什么狗屎文字,我摇动曲柄甚至不知道该往哪摇。即使是我笨重的小曲柄没有挂上任何的东西,我仍然一直摇着。老爸们就是这样干的。他们摇呀摇,摇呀摇,摇呀摇,摇呀摇。

你是否也曾经处在这样的情形中?不论你干的多少,都会有更多的事情等着你做。如果工作没有兴趣,那就跟不停的摇动病床上的曲柄一样。最终,你天天去工作,做任何他们需要你做的,争取一份工资。这种生活没有乐趣,享受你的工作对你的整个人生幸福来说是非常的重要。如果你发现自己害怕去工作,即使不知道有什么事情要去做的情况下也这样,那么,你很可能就在干摇曲柄的工作。Merlin在这篇文章里引用了一句非常精彩的话,是关于你该怎么做的:

这已经是无法回避的清楚了,我在痛苦的做着每件事情。工作上,做东西时,玩乐时,以及在家里时。我不能忍受再多一天这样的日子。我已经决定了我需要去做什么。

你必须要认识到你能改变很多东西。你可以改变工作的方式,你可以让你的工作变成一个更适合工作的地方。如果这些不可能的话,还有什么你能改变的?也许这正是你换一个工作的时候了,除非你真的喜欢摇曲柄。

 

原文链接:http://www.aqee.net/2011/05/17/as-a-software-engineer-do-you-really-like-your-job/

线程、线程句柄、线程ID

什么是句柄:

句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?
为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象
线程与线程句柄的关系:

句柄可以认为是系统对资源(如线程)的分配的一个编号。关闭这个编号,对于不同的资源,效果不尽相同。对于线程来说,关闭这个编号并不意味着终止线程,只是之后很难再操纵这个线程。
线程句柄与线程ID的区别:
CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。
●ID是在Windows系统范围内唯一标示Thread的。
●Handle是用来操作Thread的,可以有多个,每个HANDLE可以有不同的操作权限,在不同进程OpenThread得到的值不一样。
●线程的ID是系统全局的,其HANDLE是进程局部的.

●此ID只在线程的生存期内有效。

●HANDLE是os和client之间用来操作进程和线程一个桥梁,os有一张维护HANDLE的表单,里面大概放置了  HANDLE的引用计数和有关的属性,HANDLE是os标识进程和线程的东西,但是用户也可以用这个来标识进程和线程,对其操作;而ID是os用来标识进程和线程的,并且是全局唯一的,  但用户可以通过这个ID获得进程线程的HANDLE,多次得到的HANDLE并不一定是一样的.HANDLE是内核对象,而ID好像不是,并没有专门创建ID的函数.

●ID是CreateThread时操作系统自动生成的。

●线程的句柄和id是不同的。
在windows系统中,线程的id是唯一对应的,也就是说,如果两个线程返回相同的id,则他们必然是同一线程,反之一定是不同的线程。而线程的句柄并不是线程的唯一标识,线程的句柄只是用来访问该线程的的一个32位值,尽管相同的句柄一定标识同一线程,但同一线程可能拥有两个打开的句柄,因此,不能用句柄来区分两个线程是否是同一线程。
线程终止运行时发生的操作
  当线程终止运行时,会发生下列操作:
• 线程拥有的所有用户对象均被释放。在 Windows 中,大多数对象是由包含创建这些对象的线程的进程拥有的。但是一个线程拥有两个用户对象,即窗口和挂钩。当线程终止运行时,系统会自动撤消任何窗口,并且卸载线程创建的或安装的任何挂钩。其他对象只有在拥有线程的进程终止运行时才被撤消。
• 线程的退出代码从 STILL_ACTIVE 改为传递给 ExitThread 或 TerminateThread 的代码。
• 线程内核对象的状态变为已通知。
• 如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行。
• 线程内核对象的使用计数递减 1。
当一个线程终止运行时,在与它相关联的线程内核对象的所有未结束的引用关闭之前,该内核对象不会自动被释放。
一旦线程不再运行,系统中就没有别的线程能够处理该线程的句柄。然而别的线程可以调用 GetExitcodeThread 来检查由 hThread 标识的线程是否已经终止运行。如果它已经终止运行,则确定它的退出代码:
BOOL GetExitCodeThread(HANDLE hThread, PDOWRD pdwExitCode);
退出代码的值在 pdwExitCode 指向的 DWORD 中返回。如果调用 GetExitCodeThread 时线程尚未终止运行,该函数就用 STILL_ACTIVE 标识符(定义为 0x103)填入 DWORD。如果该函数运行成功,便返回 TRUE。

    线程退出的时候内核对象就会被激发, WaitForSingleObject()为堵塞函数,等待线程的内核对象被激发。所以终止线程并释放句柄对象的顺序是:TerminateThread()–>WaitForSingleObject()–>CloseHandle().

线程、线程句柄、线程ID的生成和消失

hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwId);

//至此,新线程,线程句柄,线程ID产生

TerminateThread(hThread, 0);
//至此,线程ID,线程句柄都依然存在

WaitForSingleObject(hThread, INFINITE);

//至此,线程本身和线程ID消失

CloseHandle(hThread);
//至此,线程句柄消失

 

转自:http://blog.sina.com.cn/s/blog_4e0494e00100jig5.html