程序员的灯下黑:如果你想考研究生或是研究生
程序员的灯下黑:能认识自己吗?
还是一个Simon的故事。
有一次,Simon和一个程序员G谈为什么要离开上一个公司。
G说,“我原来在一个小组做struts;后来项目做完了,公司调我到另一个组去。那个组用国内某公司开发的集成开发系统,用工具拖拖拽拽就做完了。我觉得学不到东西,所以就走了。”
Simon问:“为什么学不到东西?”
他说:“拖拖拽拽不是把程序员变成傻瓜了吗?”
Simon问:“Visual C++开发工具也可以用拖拖拽拽完成很多工作,很久以前都得手写的;为什么没有人觉得那是把程序员变成傻瓜呢?”
他想了想说,那很多Java代码都在组件内,看不到。没有办法学到底层。
Simon问:“是吗?你觉得你struts掌握得怎么样?”
他说很熟。
Simon又问:“那你看过struts的源码吗?”
他愣住了,说没有。
于是Simon问G,那你用struts和用那个集成开发工具生成的库有什么不一样?
G没有办法回答Simon的问题。
抱着G一样的认识的程序员是很多的。这是个认识自己的问题。我们从各种信息渠道,不知道积累了多少先入为主的谬论而不自知。
认识自己是最困难的。造物主创造人类的时候,所给予的感知器官:眼、鼻、耳、肤,全部都是一致对外的。这是一个适合认识世界,但不适合认识自己的机制。萦绕在大脑中的,始终是自己的“一厢情愿”。我也和那位G一样,经常随时会自己或被别人发现思想中的自相矛盾,有时羞愧得想要蜷成一团。
要认识自己,所需要的是勇气和智慧。随着年龄的增长,最大的益处就是能够开始有勇气反省自己,有时用一点自嘲,让自己变得轻松一点。
希望和大家共勉:慎独而三省其身。
程序员的灯下黑:Hands-on,Hands-on,Hands-on!
- 每天Review一个系统的设计。Review的时候记住几个关键字:Compatibility,Performance,Fail-over,Load Balance,Redundency,Deployment,Backup/Restor,i18n。
- 每天Review一个Bug。
- 每天Review一个程序文件。
- 每天下载一个开源产品,做一次安装。
C# 关闭显示器的函数
最近在学C#,写个保护眼睛的程序(就是过一段时间关下显示器,锁下屏幕之类的)做为练习。以下是关闭显示器的代码,网上好像还没有,在这贴上来,希望对大家有帮助。
多线程 C#解决方案小结
与多线程相关的两个常见的需要解决的问题是:临界资源保护和线程间的同步依赖,每一种语言都提供了自己的一套设施(有的语言可能需要借助OS的API)来解决这两个问题,C#提供了更方便灵活的解决方案,首先C#可以允许我们在不同的级别上加锁,也就是说我们可以控制加锁的粒度。其次,C#提供了一套内置的线程安全的容器,方便我们的使用。
一.不同级别(Level)上的同步: 1.object level 同步 对应的class必须从ContextBoundObject继承(同步上下文context,使所有的方法调用能被截获),并且在 class上运用SynchronizationAttribute 。
2.Method level 同步 System.Runtime.CompilerService空间包含的一些属性将影响CLR在运行期间的行为。特性MethodImplAttribute可以用于需要进行同步控制的方法上。
3.code segment level 同步 (1)Monitor类(主要是静态方法) Monitor.Enter(obj)//获得加在对象obj上的锁 ... Monitor.Exit(obj)//释放锁 //上面两句之间的代码相当于lock(obj){...}
Monitor.TryEnter(obj)//该方法立即返回,如果返回值为false,则接下来不需要Monitor.Exit(obj)。
//以下几个方法用于线程间的交互 ==》 解决同步依赖 Monitor.Wait(obj)//等待脉冲消息。释放对象上的锁并阻塞当前线程,以后只有其它线程调用Pulse或PulseAll时才会给它再次获得锁的机会 Monitor.Pulse(obj)//发射脉冲消息( 只有得到锁后才能发射,而且发射不会自动释放锁) Monitor.PulseAll(obj)
注意: (1)Monitor 锁定对象,只能在Enter()和Exit()之间的代码块中调用Wait和Pulse
(2)不能在一个线程中获得锁,而在另一个线程中释放锁。这样会产生锁丢失。 获得锁和释放锁应该在同一个线程中完成。
(3)lock语句 lock(obj) { 需要进行同步的代码 }
(4)ReaderWriterLock类 实现单写多读程序的锁。 AcquireReaderLock()//当没有写程序线程占用锁时,就可获得锁 AcquireWriterLock()//当没有任何读写程序线程占用锁时,才可获得锁 ReleaseReaderLock() ReleaseWriterLock()
(5)ManualResetEvent Set()方法将状态设置为有信号 Reset()将其设置为无信号 WaitOne()将阻塞到其有信号为止,若调用WaitOne的时刻就是有信号的,将不会阻塞
(6)AutoResetEvent 与ManualResetEvent的区别是,AutoResetEvent.WaitOne()会自动改变事件对象的状态,即AutoResetEvent.WaitOne()每执行一次,事件的状态就改变一次。有信号-->无信号;无信号-->有信号
说明: (1)无论是Monitor还是lock、ReaderWriterLock都只对引用类型的对象有效,因为引用类型的对象有一个隐藏的sync#字段,该字段的作用就是作为加锁的标记。 (2)上述的各种设施中,只有Monitor 和ManualResetEvent/AutoResetEvent 能解决线程间的同步依赖问题,而其它的设施主要用于解决临界资源共享。
4.member level同步 (1)Interlocked类(主要是静态方法) 同步一个由许多线程共享的变量。 Decrement(ref int);//使变量减1 Increment(ref int);//使变量加1 //以上两个方法仅针对类int变量 Exchange(ref object, object);
(2)ThreadStaticAttribute 该特性用于修饰静态变量,被该特性修饰的静态变量在每个线程中都有自己的副本。
二.创建线程安全的对象 Hashtable h = Hashtable.Synchronized(new Hashtable()) ; ArrayList等容器也提供类似操作。
Sleep(0)
以前在同一个进程里,特别钟爱用Sleep(0)来做一些情况下的线程同步。譬如当线城池工作时,主线程使用Sleep(0)来等待线程池里所有的线程都完成运行。当线程池线程非常多的时候,这种方法确实是一种非常有效的节省cpu的方式,因为它节省了在线程里使用内核来进行同步的开销。而且很重要的,它运作的很好,可以说完全在我的控制之内。
程序员的灯下黑:管理还是技术?兴趣优先
Simon是一个软件公司技术总监。有一天,有一位程序员小A提出想要和Simon谈谈。小A工作5年了,程序写得很不错。他进到Simon的办公室,坐下,在Simon的对面。
Simon的桌子有点弧度,于是Simon挪动椅子,和他斜对面。Simon问他有什么事?
“我现在很困惑。我不知道是不是应该转行去做管理。”小A说。
“为什么?”Simon问。
“我看到一些媒体,还有一些认识的Leader都说只有做管理才有前途。”
Simon想了想。小A人很踏实,同时也很聪明,所参加的项目很有挑战性,但他一直做的不错,因此,薪水比同时进公司的员工已经高了20%。
“这样吧,我问你一个问题:现在公司开始执行10%淘汰制。你是一个10个人的组长,因此,你必须淘汰一个。这10个兄弟干得都不错,至少没有吊儿郎当的,跟你的关系都不错。现在的问题是:你准备淘汰那个?”
小A觉得这个问题很难回答。
Simon说:“这样吧,我换一个问题。你喜欢不希望成为作决定的那个人?”
这次小A回答得很快:“不喜欢。”
Simon说:“好,其实你自己已经回答了,你不应该去做管理,因为你根本不喜欢。做一件你不喜欢的事情,你会很不开心。”
和小A一样,其实几乎每个程序员几乎都会面临,或面临过这个问题。
管理是一个很好听好看的词,似乎只要和管理沾了边,就是高薪,荣誉,更广阔的出路。也许对,可我也看到过曾经的技术强人,做了所谓的经理多年后,居然找不到一份满意的工作。因为实际动手能力已经消退了。
所有想要做管理的程序员可以想一想:
管理是什么?管人吗?如果抱着这样的想法去做管理,一定头破血流。现在的时代,没有人愿意被看管的。即使是经理人,也是和人相处,并非凌驾于他人之上。想一想陆纯初,因为一封电邮就被秘书PK下马。
管理有什么用?其实如果大家都好好工作,所有的经理人都是多余的。现代的管理理论是经理人作为协调人,进而是教练。好的管理者应该低调,把荣誉让给干活的人。
管理者也未必比干活的人工资高。存这样想法的人是官本位。我和很多国外公司接触,他们的很多经理告诉我,他手下的高级工程师很多薪水远比他这个boss高,地位也稳固。而经理往往随着公司政局变化而动荡。而高级工程师往往稳得很。
当然,管理者也有很多乐趣,最主要的乐趣在于通过管理的技巧和有效的执行改变团队。但这些往往是隔山打牛的功夫,不是每个人都喜欢这样的工作。
我在包括CSDN内的很多技术论坛看到很多关于是要做管理还是技术的争执,所谓不能做一辈子技术的论调是我不屑于反驳的。但对于走向管理,大部分人是从是不是能挣更多钱(包括所谓前途,爽等),但很少见到有人考虑过是不是喜欢的问题。
实际上程序员们不妨问问自己:
你是希欢智商上的挑战呢,还是情商逆商上的挑战?
如果是前者,请把做技术作为终生追求。
如果是后者,可以试试走向管理。
如果都不喜欢……
程序员的灯下黑:坚持和良好心态近乎道
过去有一位年轻和尚,一心求道,希望有日成佛。但是,多年苦修参禅,似乎没有进步。
有一天,他打听到深山中有一破旧古寺,住持某老和尚修炼圆通,是得道高僧。
于是,年轻和尚打点行装,跋山涉水,千辛万苦来到老和尚面前。
两人打起了机锋。
年轻和尚:请问老和尚,你得道之前,做什么?
老和尚:砍柴担水做饭。
年轻和尚:那得道之后,又做什么?
老和尚:还是砍柴担水做饭。
年轻和尚于是哂笑:那何谓得道?
老和尚:我得道之前,砍柴时惦念着挑水,挑水时惦念着做饭,做饭时有想着砍柴;得道之后,砍柴即砍柴,担水即担水,做饭即做饭。这就是得道。
翻译成程序员,编一个故事:
过去有一位程序员,一心想追求技术,希望有一天能成为顶级高手。但是,多年学习,似乎没有进步。
有一天,他打听到某高手,到了首都北京,其水平享誉业界,是公认的权威。
于是,程序员打点行装,从牙缝里挤出差旅费,坐火车来到北京,迷了几次路后,咬牙打的找到了高手。
两人开始探讨程序员应该怎么个人发展的问题。
程序员:请问高手,你在名声大震之前,干什么?
高手:在公司写程序。
程序员:成名之后呢?
高手:还是在公司写程序。
程序员于是哂笑:那有什么不一样?
高手:没什么不一样,不过我近来进步,做事情更专心了,不再老是想着写程序发不了财了。这样我就成了高手。
其实,写程序就是写程序。这本身就和前途啊,财富啊不直接关联。只不过时代使然,使它成为刚好是个待遇较好,也是较有机会的行业。因此,年轻一代涌向这个行业,只有一小部分人是兴趣使然。这样,我们所见到的,有毅力,沉得下心的人颇为难得。很多人,坐在电脑屏幕前,要么视为苦差事,要么东张西望,不能定心。如此哪能成功。
每一行都有自己的道,和尚想成佛,俗人想成功。但是不管是谁那行,都只有定心苦修,克服心魔才能有所建树。
也效仿古人写一偈:
一年两年刚入行,三年四年不值讲。
五六七年识门道,八九十年算登堂。
编程修养
什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是。对于一些技术细节来说和底层的技术,只要看帮助,查资料就能找到,对于速度快,只要编得多也就熟能生巧了。