Monday, August 31, 2015

这样挺好的 不想再多了! 我的人生路吗!

是的,生活并不是总是公平的,当我们拥有一样东西的时候上帝往往会让我们那另一东西去换取。

年轻的时候,有人没钱。现在的时候有钱没人陪你玩了。

当我们小得时候向往着 长大的时候拥有更多的物质上的生活,因为那个时候我们贫穷的只剩下时间了。是的,没有错,那个时候的我们可以为了一只蝴蝶 围着我们的村子跑上一圈; 去了去上个通宵,我们可以从墙头上 爬出去,甚至走上 十几里路,只为了 一晚上的通宵的时光,欣赏一下 黄色时光; 哪个时候我们的真的 很幸福  就连上课的时候, 我都可睡着的 哈哈,那个时候的我 真的醉了,现在回想一下真的幸福,因为那个时候的我,是真的有人管着我的,长大了才发现,并不是每一个人都会去得罪你,而去管你的;一旦有人会去发熊 请珍惜,他可能真的那你当做朋友了;  上初中时候的我似乎真的忘记了自己为了什么来上 睿文中学, 原因只有一个那就是因为赵千秋在这里上学,这就是我来的原因,可是去了时候呢?我似乎忘记了自己的所有的一切。生活一如既往的像往常一样的生活,但是我呢?我似乎忘记了自己的初中,只知道陶醉于黄色的文化,逃课通宵只是为了看一下簧片。呵呵,那个时候真的好青春,真的时候 “高中的时候很紧的,大学就松了”!自己就是这样一步一步的走到了现在的生活,并不是自己的想象的那样的美好的,生活也是非常的完美的,幸好 我有这么一帮的朋友们。嘿嘿。 现在的我是,都不知道自己的大学是如何度过的! 时光如梭,转眼间我们已经长大了,现在的我更在乎的是自己的内心的声音。
是的,我很爱你赵千秋真的很不错的,你是我见过的最优秀的孩子。是的,这一点不需要质疑的,你是我这一生的挚爱。为了你我可以付出很多的,有个哥们说如果你爱一个女人,你应该爱到可以为为了她去坐牢的,是的我可以为你去坐牢。我爱你的亲。么么哒。
今晚,跟你的通话发现你真的是很不错的女孩子,以后的路还有很长的,我觉得你过的好就可以了!如果他抛弃了你的话,我是愿意爱你的,这一点是的,我觉得跟我哥们对萌萌一样的感情。不论怎么样的我都会爱你的。
遮天下起了雨,我的内心无比的惆怅。自己的未来就在自己的手中,现在的自己似乎只是在乎自己的感觉,现在的我根本就不可能去爱一个女孩子,因为现在字啊我眼泪的女孩子,是的每一个我稍微能看得上的女孩子都已经有男友了。而我有不喜欢强别人的。这是是我内心不喜欢,因为那个女孩没有优秀到我可以位置等待,这样的女孩并不多的,总共没有几个!Miss 千秋算one ! I love her very much!以前的我喜欢淋雨是因为,自己独自一人思念你,喜欢独自骑车漫步在雨中,在思雨的低落在自己的心头,内心无比的开心,因为我的内心回想的是与你一起共舞,内一次骑车的时候我都会骑车多骑上几里路的只是为了看你们家房子的屋后一眼。希冀能够看到你的背影显然是我想太多了。每一的时候我从来没有见过你一次的生活的样子,只有一次去我还是没有勇气敲你家的门。因为我不知道谁在家里面,我害怕看到你们的家人,因为他们似乎只在乎你的想法。而卧是非常的害怕自己的内心的想法的,生活并不是我们想想的那么美好的。又一次,过年还是你的生日我忘记了。我只是为了给你买了一份礼物,是的一份生日礼物。我很喜欢的生日礼物。但是我不知道hi啊你喜不喜欢的,我走你家门前,想敲门,但是我又不敢自己的内心是非常的害怕的,以为我害怕你们的家人。我以为你们也同样的还不我,我不知道自己改如何面对你,你的家人,显然当时的我什么也没有的,现在的我就是一个穷屌丝的生活,是的这一点没有错的。我就是一个穷屌丝的生活,我不知道自己的未来在哪里。是指得过且过的生活,自己的生活似乎没有什么目标的活着,这样的生活就是自己的未来也无法的想象自己的未来的究竟在哪里呢?自己随心的笔记真的是完美的吗?这并不重要的,只要自己开心这才是我内心想要的生活,其他的我并不需要想太多的,那样也没有任何的意义。现在的自己的投资并不是简单的投资,还有很长的路需要走的。生活知识一个刚刚的起步而已的!以后的,要开上兰博基尼的跑车大概700 万左右吧。现在的自己还有很长的路要走的,我要靠自己的能力走下去的。如果,你去依赖 别人,是的你可以马上的拥有,但是很快你就会失去的,因为并不是你的能力会拥有的生活就是这样的无情,并不是你内心想怎么样就是怎么样的,显然并不是对饿,很多人都是苦逼的活着,是的他们也仅仅是活着而已,没有自己的追求知识混吃等一般的活着。




Sunday, August 30, 2015

Android studio 如何关联Subversion?

之前一直被一个问题困扰: 我的Android studio 打开 SVN CheckOut 的项目 一开始的时候是没有问题的!

 But  when i close the svn project, to open the other Project.  A day later I reopen the last project.but I can't see subverion  update and  commit!  How to reslove the porplem?

fowlling this way;
1  you can choose "Enable Version Control Integration"


2  you just  choose the subverion!  that is all right!




thinking in problem?

Why is occer?  I think maybe is you use Android studio , But Android studio subverion Manager  didn't control the file, When you quit the android studio or quit cmputer but not person do it !



Saturday, August 29, 2015

优秀程序员是如何处理糟糕代码的

可能你一行不好的代码也从来没有写过。这是有可能的,但在现实中又不太可能。
现实情况是,和这个星球上的其他所有程序员一样,你会产出安全漏洞、UI元素偏移,等等等等的代码。这并不能说明你是一个不好的开发人员。只是因为你是人类而已——一种不可避免会犯错的生物。
正是这种每个开发人员都有的“人性”缺陷,驱使那些优秀的开发人员敢于承担代码和底层基础架构的不足,有准备有计划地行动。下面是他们将做的事情。

假设

几年前,Netflix开源了Chaos Monkey和Simian Army的其他部分(Simian Army是一套工具,用来管理基于云的软件)。从本质上说,Chaos Monkey的范围贯穿亚马逊Web服务的基础设施,能够随意终止实例。从根本上说,它是一种通过创建最坏的可能方案来做最坏打算的方法。
正如Netflix的Cory Bennett和Ariel Tseitlin于发行之时在博客上这样写道,“代码会失败,并且你越不希望失败或一点也没有准备的时候,反而更加不可避免会出现故障。如果你的应用程序不能容忍实例故障,那么你是愿意凌晨3点被召唤呢还是在办公室里通宵?”
使用不可预测的方式来模拟故障,Netflix强迫注重基础设施的弹性。与其假设最佳的情形,还不如做一个最坏的打算。这样我们就能愉快地进入下一个进程了。

测试

上面我们说了一个提高基础设施的伟大方法,那么代码呢?
Jeff Atwood,一个程序员的答案是:“你需要折腾你的代码。”他写道:
我相信,每个专业程序员职业生涯的一个关键转折点,就在当你意识到你才是自己最大的敌人,以及减轻这种威胁的唯一办法就是接受它的时候。将自己当作最大的敌人。打破你的用户界面。打破你的代码。折腾你的软件。
在实践中,这意味着“程序员至少需要对常见错误有一定的了解,然而,很多程序员往往不会这么去做,甚至是反着来。”这意味着你作为“编程之神”的责任也包括成为“测试之神”,通过“折腾”代码积极地来消除里面的错误。
Andre Medeiros补充认为我们应该对调试“精益求精”,因为开发人员需要对他们的代码做更多的事情。
“为了防止bug,你写出来的代码得让任何程序员都觉得简单。为了修复bug,你得理解你的代码。为了精密地了解代码,你需要列举和验证你的假设,如果有必要,你还需要构建调试工具。”

贫民窟上的摩天大楼

当然,对于我们的代码,其最大的问题之一是,它继承了如此多其他的代码。特别是在已建立的企业中,我们常常构建在旧代码上,从而导致了各种后续延伸问题。
以下是Zeynep Tufekci的精彩描述:
将它比喻成造房子的话——也就说你将要在已经造好的底层基础上造二楼。但房子一开始造的时候并没有造好,没有打好地基,你也不知道哪面是承重墙。你只能尽可能地去猜,然后造好了一个楼层——用你的手指。然后你接着这样做。很多旧但控制着基础设施关键部分的软件系统就是这样运行的。在某一段时间内它也的确是可以工作,但每一个新楼层的建造意味着增加了更多的漏洞。我们正在代码中建设贫民窟上的摩天大楼——而且,还在地震区。
很显然,我们对于改善这种情况束手无策,除非我们能够致力于去除技术债务。
但也许,只是也许,在心甘情愿折腾代码的过程中,你会发现消除技术债务是如此之重要。

Thursday, August 27, 2015

Java 枚举7常见种用法

JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。

用法一:常量

JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

Java代码  收藏代码
  1. public enum Color {  
  2.   RED, GREEN, BLANK, YELLOW  
  3. }  

用法二:switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

Java代码  收藏代码
  1. enum Signal {  
  2.     GREEN, YELLOW, RED  
  3. }  
  4. public class TrafficLight {  
  5.     Signal color = Signal.RED;  
  6.     public void change() {  
  7.         switch (color) {  
  8.         case RED:  
  9.             color = Signal.GREEN;  
  10.             break;  
  11.         case YELLOW:  
  12.             color = Signal.RED;  
  13.             break;  
  14.         case GREEN:  
  15.             color = Signal.YELLOW;  
  16.             break;  
  17.         }  
  18.     }  
  19. }  

用法三:向枚举中添加新方法

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum实例。

Java代码  收藏代码
  1. public enum Color {  
  2.     RED("红色"1), GREEN("绿色"2), BLANK("白色"3), YELLO("黄色"4);  
  3.     // 成员变量  
  4.     private String name;  
  5.     private int index;  
  6.     // 构造方法  
  7.     private Color(String name, int index) {  
  8.         this.name = name;  
  9.         this.index = index;  
  10.     }  
  11.     // 普通方法  
  12.     public static String getName(int index) {  
  13.         for (Color c : Color.values()) {  
  14.             if (c.getIndex() == index) {  
  15.                 return c.name;  
  16.             }  
  17.         }  
  18.         return null;  
  19.     }  
  20.     // get set 方法  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.     public int getIndex() {  
  28.         return index;  
  29.     }  
  30.     public void setIndex(int index) {  
  31.         this.index = index;  
  32.     }  
  33. }  

用法四:覆盖枚举的方法

下面给出一个toString()方法覆盖的例子。

Java代码  收藏代码
  1. public enum Color {  
  2.     RED("红色"1), GREEN("绿色"2), BLANK("白色"3), YELLO("黄色"4);  
  3.     // 成员变量  
  4.     private String name;  
  5.     private int index;  
  6.     // 构造方法  
  7.     private Color(String name, int index) {  
  8.         this.name = name;  
  9.         this.index = index;  
  10.     }  
  11.     //覆盖方法  
  12.     @Override  
  13.     public String toString() {  
  14.         return this.index+"_"+this.name;  
  15.     }  
  16. }  

用法五:实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

Java代码  收藏代码
  1. public interface Behaviour {  
  2.     void print();  
  3.     String getInfo();  
  4. }  
  5. public enum Color implements Behaviour{  
  6.     RED("红色"1), GREEN("绿色"2), BLANK("白色"3), YELLO("黄色"4);  
  7.     // 成员变量  
  8.     private String name;  
  9.     private int index;  
  10.     // 构造方法  
  11.     private Color(String name, int index) {  
  12.         this.name = name;  
  13.         this.index = index;  
  14.     }  
  15. //接口方法  
  16.     @Override  
  17.     public String getInfo() {  
  18.         return this.name;  
  19.     }  
  20.     //接口方法  
  21.     @Override  
  22.     public void print() {  
  23.         System.out.println(this.index+":"+this.name);  
  24.     }  
  25. }  

用法六:使用接口组织枚举


Java代码  收藏代码
  1. public interface Food {  
  2.     enum Coffee implements Food{  
  3.         BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
  4.     }  
  5.     enum Dessert implements Food{  
  6.         FRUIT, CAKE, GELATO  
  7.     }  
  8. }  

用法七:关于枚举集合的使用

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
关于枚举的实现细节和原理请参考:

屌丝级别的程序员 一天中该做的事情



1  到公司 打开自己的电脑


2  查看自己的邮箱  的邮件


3  更新自己的代码和需求文档


4  浏览喜欢过的技术博客 

5  思考今天该做些什么呢?

6 想好了。揩干!

程序员常去的14个顶级开发社区

作为程序员,选择好合适的开发社区对提高自己的编程能力会有很大的帮助,我也说不出为什么,但是一些优秀的实时开发社区确实能帮你积累不少开发经验。
下面这张图列出了14个程序员经常逛的顶级开发社区,作为程序员,你应该要了解其中一个或者最好是多个,并且学会使用它们,利用里面的资源提高自己的编程能力。
我们期望在开发者社区中获得什么?
我们希望能得到切实的帮助,而不是获取一些唠叨的废话或者一些水文。我们希望能根据自己提出的问题来获得其他开发者的回答帮助或者讨论一些学习资源的问题。下图是一些开发者在社区中最关注的一些问题。
下面我们来看一下程序员经常去的14个顶级开发者社区,如果你还不知道它们,那么赶紧去看看,也许会有意想不到的收获。

Stack Overflow

9月份,Stack Overflow也将迎来其6岁的生日,毫无疑问,Stack Overflow是全球最受程序员欢迎的开发社区,而且也是内容最丰富的社区之一。
官方网站:http://stackoverflow.com/

Reddit

reddit也是一个非常富有个性的社区,你可以在reddit上提交一些感兴趣的话题,也可以和其他程序员讨论一些编程开发的问题和当前的IT热点资讯,reddit是一个用户粘性比较强的开放社区,编程开发板块只是其中的一小部分。
官方网站:http://www.reddit.com/r/programming

Google+ Communities

加入Google+社区只需要一个Google账户即可,你可以完全免费的获取里面的资源。
官方网站:https://plus.google.com/communities

SitePoint

SitePoint社区论坛也是我最喜欢的在线开发社区和程序员设计师家园之一,SitePoint主要目标是帮助初学者了解其选择的编程语言和技术,并且得到相应的提高,网站内容包括web开发、Web设计、技术写作以及用户体验等。
官方网站:http://www.sitepoint.com/forums/

CodeProject

截止2013年8月,已经有100多万用户入驻codeproject,并且分享了约100多万个代码演示,在codeproject里,你可以将代码分享给你的朋友们。和其他社区不同的是,codeproject更加侧重软件开发,比如C, C#, C++, Java, Lisp等开发。
官方网站:http://www.codeproject.com/

Treehouse

在寻找一个实惠的编程学习途径吗?你可以试试加入treehouse,它并不昂贵,年度会员还可以打折优惠。treehouse非常简单,你可以在上面找到各种等级的问题答案。
官方网站:https://teamtreehouse.com/forum

Hacker News

Hacker News这个名字已经刻在很多开发者心里了,在这里,可以实时看到编程界中发生的任何事情,包括一些学习的资源和教程。你可以从用户提交的数据中找到适合你的学习资源,比如文章、图像视频以及一些问题的讨论。
官方网站:https://news.ycombinator.com/news

DZone

DZone是一个允许用户分享最新IT新闻和编程资源的社区,这是一个文章内容驱动的社区,所以需要许多内容管理员来把关文章的质量,从某种意义上说,它与HN和其他的编程社区类似,但是这个平台时间最长,里面的用户数量也是最多的。
官方网站:http://www.dzone.com/links/index.html

Bytes

Bytes是一个传统的开发社区,新手和专家都可以在里面讨论一些关于软件开发、数据库开发以及网络和系统管理的问题。数据库、网络以及系统是编程的基础,我们需要关注这方面的问题,从而能更好的帮助我们提高编程能力。
官方网站:http://bytes.com/

DaniWeb

DaniWeb以前是专为市场营销业务分析人员设计的,但是现在主要为各个年龄段的Web开发者和程序员服务。
官方网站:http://www.daniweb.com/

Dream In Code

这几年,它的更新比较缓慢了,这有好的一面也有坏的一面,60w的用户以及百万及的文章,内容涵盖 Java, C++, VB.NET等,学习资源相当丰富。
官方网站:http://www.dreamincode.net/forums/

Tech.Pro

Tech.pro是一个关注科技领域发展的相关资讯的社区,Tech.pro是一个获取资源和教程的入门网站,包含一些技术教程、讨论、博客已经链接等。
官方网站:http://tech.pro/

Pineapple

也许这还算不上活跃的优秀开发社区,但是这里也包含很多有用的工具、教程以及类库资源等。我在几个月前开始使用Pineapple,现在已经比较依赖它了。
官方网站:http://pineapple.io/

Lobsters

这是一个用户邀请制的开发社区,是一个真正“面向社交”的社区,你可以在里面找到大量的关于编程的任何讨论,很多信息都至少有20多条回帖,这些信息或许对你会有很大帮助。

这年头逛吧的人

这个念头逛贴吧的人 似乎更喜欢看一些搞笑的人,  并不是换看技术贴。除非是真的非常的不从。很多的时候自己感觉没有意思,就没有深入下去。 思考一下,如果一年之后还是这样的话,这样真的好啊?  

广一些 技术性的网站的时候,不要只看一些经验型的东西,还要多关注技术,因为技术才是自己的硬件,没有自己的硬需求  怎么才能在这个社会生存呢?

程序员真的是吃青春饭的吗? 你愿意作甚呢?

在国内,很多人说程序员是吃青春饭的,一开始说过了30岁就得转行,后来又有人35岁是一道坎……看起来好像程序员真的和风尘女子一样,注定有朝一日会年老色衰不再受人青睐。
No!我要说,不是这样的!
所有的道路都通向天堂
只是要度过路上的痛苦时光
那一天我正走在路上
两边的荒草,比人还高
——海子,《月全食》
真的程序员,敢于直面惨淡的人生和淋漓的鲜血,一定能够在荒草满布的岁月荒原里踏出一条自己的路来。
其实别人说的话,听一听就算了,决定还得自己来做。面对别人的怀疑、否定、讥讽,我们只需要坚定地前行,做给他看。行动是最好的证明,多坚持一秒,未来就会不同。
现在就实打实的来看看程序员的价值之路在何方。

应用技术

相当大一部分的程序员都在做应用层面的开发,所做的软件用来解决特定场景的问题,给用户的工作和生活带来方便。
开发一个应用,经常会用到高级语言和框架,比如 C# 和 .NET ,比如 C++ 和 Qt ,比如 J2EE ,比如 Ruby on Rails ,比如 Python 和 Django ,比如 Java 和 Android ,比如 Objective-C 和 Cocoa Touch ,比如 JavaScript, PHP……太多了,数不胜数。
应用层面的开发技术,很多人觉得门槛低,小年轻和富有经验的老资格差别不大,后浪会把前浪拍死在沙滩上,所以当新一茬韭菜长成时,老一茬就得玩完了。
其实不是的,即便从纯技术的角度来讲,你对一个语言和框架的理解与把握程度,也会严重的影响开发效率和产品质量。
什么样的人会被轻易替代?不求甚解,似懂非懂,干了多少年还看不透所用技术的本质,遇到问题仍然懵懂不解茫然无措,这样的程序员,注定很快被一大波正在赶来的小鲜肉挤下工作岗位。
假如你对一门语言的各种特性都体察入微了悟于心,假如你对一个框架的机理和各种应用场景都有独特的理解和丰富的实践经验,那你几乎是不可替代的,你已经成了这个语言和框架方面的专家,价值不可估量。你的一句话就可能为一个项目节省几个月的时间,别人一筹莫展的问题到了你这里分分钟就搞定。
所以,不要理会“能 Run 就行”、“完成任务就可以了”、“用不到学那么深干什么”之类的话,在你用完一项技术解决了一个实际问题满足了某个需求之后,继续钻进去吧,多学一点,深入一点,日积月累,你必然会与众不同。上班时没时间,那就下班了继续投入。记住,你的学习和研究都是为了自己,不是为了老板,不是为了项目,你唯一的产品就是你自己,而这个产品值得一辈子打磨。

高难技术

有一些技术,门槛是相对较高的,比如汇编语言,比如操作系统内核,比如驱动……正因为门槛高,回报也高。比如你熟悉 Windows 内核或 Android 内核,能够熟练撰写各种驱动,那找个月薪五六十K的工作不成问题,百八十K都不在话下。惟其稀缺,所以保值

算法

大部分程序员其实不懂算法,都是用框架里的模块拼积木。如果你妙悟算法真谛,那你就超越了90%的程序员了,你的重要性和价值将不可估量。
比如你精通图像处理算法,比如你精通视频编解码算法,比如你精通搜索推荐相关的算法,比如你在模式识别领域有建树……试看谁能挡得住你前进的脚步!

业务

在一个行业内持续积累,对业务的理解到位,积累深厚,你的价值是巨大的。不信你去浏览招聘网站上的岗位需求,99%都要求相关行业背景。所以,选择一个靠谱的、前景好的行业非常重要,只要这个行业能够不断发展、前进,你的积累就是有价值的,你自己就是不断增值的。
特定领域的业务有一定门槛,比如金融,比如电力,比如电商,比如彩票,比如考古,比如医疗……在这些行业里,你是个业务门儿清的程序员,即便技术不是特别优秀,那也是价值无限的。

产品意识与思维

究竟什么是产品意识呢?我认为产品意识一般包含商业意识、用户意识、创新意识和团队意识。
——《人人都是产品经理》
互联网时代,产品为王。有产品意识,懂产品思维的程序员,是最受欢迎的人群,也是最能做出好产品的程序员。
商业意识通俗地讲,就是要思考这个产品能不能卖出去,好不好卖。这个一定是要有的,程序员虽然很少直接接触市场,但是一个产品成功与否,多数时候就是看市场表现,如果你能关注市场,从市场的角度来看待技术实现,接纳“技术为市场服务”的理念,那你更容易把产品做好。
用户意识是最容易理解的,它是说我们要从用户的角度来思考这个产品该如何设计,因为产品好不好用最终由用户说了算。如果你在实现产品时也能站在用户的角度来思考,斤斤计较一个功能是否符合应用场景、是否与用户的行为特点吻合、是否贴合用户的使用习惯,那恭喜你,你超越了90%的程序员——大部分程序员是按产品经理和UI设计师的要求来实现产品。
创新是人类发展的源泉,是社会进步的动力,同样也是产品的核心竞争力。但这里所说的创新不一定是那种颠覆性的创新,也许是把众多不被重视的细节做到更好,也许只是把另外一种理念引入到这个产品中去,也许是像海底捞的员工一样给用户不一样的感受,这些都是创新。创新意识是产品经理必须有的,否则,他永远不会有进步,产品永远也做不好。创新意识也是优秀的程序员必须要有的,否则他就不能把一个产品实现得很好,不能把产品的核心竞争力演绎到极致。
当下已不再是孤胆英雄单兵作战的年代,我们要想做好一个产品,多数时候都需要一个团队。团队意识是必不可少的,你是和一帮程序员在一起,你还和产品经理、UI设计师、业务分析师、项目经理等等在一起,如果你能融入团队,并且能影响、促进其他人为共同的目标做出有效的努力,那么,你这样的程序员,是无敌的,是国之瑰宝!
说了这么多,究竟你适合在哪个方向下功夫,还需要你自己来做决断。你可能一看便知自己适合做什么,那无需赘言。也可能你有些茫然,不要担心,我们都还有大把的时间,你可以去试着去做,发现不合适了换个方向再来,直到踏上适合你的路。

思考自己的程序员之路

第1个一点点:专注眼下

见过太多心猿意马的程序员,我不得不把「专注眼下」作为天字第一条。他们往往有各式各样的小梦想,比如做个小茶农、做个小鹅贩、做产品、做销售、做投资,却被程序员的高薪或是没有转行的魄力「耽误」了,而因为不专注,他们不在意做好自己的本分,不在意锤炼自己的技能,不在意学习新兴的技术。不可否认,这世界上存在着伟大的产品(像乔老爷)、伟大的销售(像埃里森)、伟大的投资客(像彼得菲),而他们毫无例外都是程序员出身。可你听说过巴菲特评价盖茨的话么,比尔盖茨如果转行去卖狗,那他一定是全世界最大的狗贩。我坚信除了少数的天才外,冥冥众生均可以在多个领域取得成功,只要保持足够的专注。而哪怕你下一年就想卖狗去,程序员的经验仍然能训练你强大的逻辑、谨慎和耐心,放在哪个行业都是相当可观的竞争力。

第2个一点点:思考力与推动力

我认为处理bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。当面对一个未知的问题时,如何定位复杂条件下的核心问题、如何抽丝剥茧地分析问题的潜在原因、如何排除干扰还原一个最小的可验证场景、如何抓住关键数据验证自己的猜测与实验,都是体现程序员思考力的最好场景。是的,在衡量理想程序员的标准上,思考力比经验更加重要。

有时候小伙伴跑过来,问我「提交了一个任务被卡住了,怎么办」的时候,我总觉得他可以做得更好。比如,可以检查试验别的任务,以排除代码自身的原因;可以通过Web UI检查异常(如果没有账号,可以让我提供);可以排查主机日志或删除缓存,再不济,总应该提供任务ID和控制台日志给我。理想的程序员永远不会等事情前进,他们会用尽一切方法让事情前进。

第3个一点点:Never Say No

记得从前厂离职之前,找老板谈话,他说我最大的优点就是从来不和他说这个做不到。后来我发现在很多团队里,都存在一种技术和产品的对立,程序员往往以「技术上无法实现」来挡产品的需求,而产品也往往以「Facebook可以为什么我们做不到」来奚落程序员。这两句话应该属于禁语,从根本上都不利于程序猿和产品狗的相亲相爱。

一句「技术上无法实现」是容易出口,可有多少人在说出这句话的时候,心里是100%肯定的?如果不肯定,为什么不能回去谷歌一下再回答?原本我以为程序员是充满想象力,在因为有想象力,才能诞生那么多改变我们生活的软件和互联网产品。见识多了,才了解大部分程序员已经在与bug的对抗中变得保守而不愿担当风险,与此同时许多团队也不愿意宽容失败。于是「Say No」变成一种习惯性的抵触,还记得曾国藩为什么解散湘军么?他说那支军队已「暮气渐深」,不能打仗了。要做理想的程序员,就不能给自己滋生暮气的机会,如果面对不合理的需求,可以把时间成本摆出来,把曲线救国方案亮出来,简单粗暴「Say No」是不可取的。

第4个一点点:投资未来

程序员是一个非常残忍的职业。你所学所用的语言、框架、模式,很可能在数年内就成昨日黄花了;你现在嘲笑的另一群程序员,可能马上就能转身来嘲笑你了。所以理想的程序员除了做好自己的本分,还要花费时间来投资未来。什么是「投资」?投资就是你现在投入的时间,在未来会以更多的时间或者金钱(看看早几年学习iOS的程序员现在的薪酬!)回报你。举我自己的领域 — 数据挖掘为例,08年左右Hadoop开始兴起,一时「大数据」概念火热,Hadoop工程师万金难求,各互联网公司纷纷把数据统计、数据分析和数据挖掘的业务切换到分布式平台上。这几年眼看Hadoop还在不断迭代,Spark又异军突起,一举刷新了Hadoop保持的排序记录,以内存存储中间数据带来的性能优势和丰富的数据结构让人爱个不停,各种奇异的小bug和陡峭的学习曲线又让人打退堂鼓。那么,明眼人都知道Spark是未来的趋势(内存会越来越便宜),在主业务放在Hadoop的条件下,就可以适当把一些小模块切换到Spark上,同时留意Spark社区的发展。很快从Spark获得的性能收益就能把之前投入的学习时间挣回来。

第5个一点点:善用工具

善用工具可以分为4个层面:

搜索引擎
不相信重复
代码片段
自动化
我刚入行那会,一个计算机专业却当了公务员的朋友问我,你一点都没学过编程,平时怎么写代码?我说,谷歌,于是遭到无情的耻笑,以至于我在哪里的账号都叫2shou,告诫自己是一个无耻的二手程序员。这是一个笑话,但如果现在问我,我还是要回答谷歌。程序员的成长就像膨胀的圆饼,外面是无边无际的大海,圆饼越大,与大海接触的面也越大,懂的越多,不懂的越多,而计算机科学又是一门更新换代异常迅速的学科,同时也是知识互联网化最好的学科,很难利用传统的科班式有教有学的方法,相反通过搜索引擎则很容易获取到最新的知识。

不相信重复,大师的话叫DRY原则(Dont repeat yourself),代码写多了,会有人为的直觉判断好的和烂的代码,我的标准是简洁和规范,简洁并不是美感上的标准,重复越少,给自己出错的机会也越少,后期维护的成本也越少。

如果你不幸丢了三周前的代码,也许你能凭着过人的记忆力把脑子里残余的片段复写出来,但如果丢的是三个月前的代码,恐怕就没有那么好的运气了。理想的程序员会着力找寻有效的资料保存方式,把工作里灵光闪现写下的代码、脚本、配置、经验等短的片段保存起来,以便任何时候都能复查。

理想的程序员必须懒惰。对他们来说,重复的步骤和重复的代码一样丑陋,如果意识到一项工作有可能长期要重复,那么自动化的时间总是越早越好。

第6个一点点:管理时间

之所以管理时间会对程序员这个行当特别重要,是因为在完成任务时你必须像荒野里的狼一样,「独行」。没有外界约束的情况下还能稳定控制自己,保证能高效率地工作和学习,那么日积月累你肯定会变得比一般人厉害。

程序员干的是高强度的脑力活,一般每天集中4-5个小时应对本职工作就足够了,但工作之外,一定要安排时间用于学习。除了学习,留点时间放空自己也是必要的,利用泡茶或者喝咖啡的间隙,把弥足珍贵的时间留给自己,往前想往后想,事半功倍。

说了这么多,想必有人会问,费劲心思成为一个理想的程序员,又有什么用处?会有高薪吗?不。能升职吗?也不见得。迎娶白富美呢?不如去卖狗。

稻盛和夫曾经说过一个故事,明治时期的手艺人被天皇召见,虽然都是不读书的乡下人,但一辈子兢兢业业地做一件事情,自然有一股高贵的气质。理想的程序员,应该就是循着这种高贵的气质而去的吧。