程序员做业余项目、记笔记和写博客的重要性【经典】
编程是一种创造过程,业余项目允许程序员在没有截止日期或各种限制的条件下,以探索形式编程。业余项目之所以重要,有以下几个原因。
探索新技术
每天都会不断有新技术出现,而业余项目则是最佳的试验场。作为业余项目,你不必为bug或者性能问题担心,即使网站崩溃也没有问题,因为你不靠它来领薪水。
从头创造
我所从事的大多数都是为现有的产品做一些维护,增加一些新特性,修复bug,解决性能问题,重构现有代码。虽然我也从头编写过一些软件,但这些基础工作只需要一两个月,接下来我又进入维护模式了。
业余项目经常需要从头构建。我喜欢这个步骤,因为我不但复习了已经掌握的所有东西而且把它们应用到创建一个新的(更好的)项目中。
易于启动
进行业余项目也是一项避免分析瘫痪(analysis paralysis)的练习。如果你从头开始会有各种各样的可能性。避免的方法是给出一个短列表上面列出所有必须具有特性,接下来启动一个beta版本实现那些特性,即所谓的最小可行性产品。
编注1:分析瘫痪:对某个问题由于过度分析或过度思考某种情况,以至于没有作出决定或者采取行动。在不同的领域,分析瘫痪有具体的解释,详见维基百科Analysis paralysis词条。
编注2:最小可行性产品:指发布所必须的最小功能集合,通常作为产品原型发布给乐于尝试并提供反馈的客户。
避免精疲力尽
为你的热情工作,为乐趣而工作。如果你是一个开发人员,但由于不喜欢现在所从事的工作而感到精疲力尽,试着去做一个属于自己的业余项目吧。它会让你回味为什么编程是如此的有趣。
保持你的技能不会落伍
也许你日常工作使用的是过时的技术。也许你对自己目前掌握的技能感到厌倦,想要去学一些新技术。业余项目是跟踪软件最新潮流的最佳办法。没有尝试过node.js?太好了,用它去做一个小的项目。突然之间,你会发现你有新学会的技术可以炫耀了。
完成你的业余项目
对于业余项目,一个问题是它们可能始终没有完成。刚开始的时候你充满热情,但是2个月之后你甚至不记得上一次做项目是什么时候了。尽管如此,还是应当将项目向前推进并完成它。写完这些,我要去完成自己业余项目了。
最近在整理2011年学习笔记的时候,发现很多以前接触过的东西,了解的知识、逻辑,写过的代码,到现在去看的时候,有些居然看不懂,都忘得差不多了;
所以养成勤记笔记,多写写,多记记应该是程序员必不可少的习惯吧!
不要想一辈子埋头搞技术混饭吃,但技术创业会成为将来创业的主流的
我个人不赞成下面人的看法,觉的搞技术完全没前途, 我身边就有很多靠技术起步,做老板做老总的。世事无绝对,自己要多注意培养自己各方面的能力,同时技术其实也很重要,因为中国正在大转变,不能只看眼前,创新有眼光有能力的技术人员也会越来越吃香,如果各方面能力和条件比较成熟,也可以自己干,技术创业会成为将来创业的主流的。
别人的看法:
我现在是自己做,但我此前有多年在从事软件开发工作,当回过头来想一想自己,觉得特别想对那些初学JAVA/DOT .NET技术的朋友说点心里话,希望你们能从我们的体会中,多少受点启发(也许我说的不好,你不赞同但看在我真心的份上别扔砖头啊)。
一、在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事市场开发,跑腿的人,没有前途。
不知道你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态). 更可怕的是,会让你接触的人际关系非常单一,除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人,你的朋友圈子小且单一,甚至破坏你原有的爱情(想象一下,你在外地做现场开发2个月以上,却从没跟女友见过一面的话,你的女友是不是会对你呲牙裂嘴)。
也许你拿到了所谓的白领的工资,但你却从此失去享受生活的自由,如果你想做技术人员尤其是开发人员,我想你很快就会理解,你多么想在一个地方长期待一段时间,认识一些朋友,多一些生活时间的愿望。
比之于我们的生活和人际关系及工作,那些从事售前和市场开发的朋友,却有比我们多的多的工作之外的时间,甚至他们工作的时间有的时候是和生活的时间是可以兼顾的,他们可以通过市场开发,认识各个行业的人士,可以认识各种各样的朋友,他们比我们坦率说更有发财和发展的机会,只要他们跟我们一样勤奋。(有一种勤奋的普通人,如果给他换个地方,他马上会成为一个勤奋且出众的人。)
二、在学习技术的时候千万不要认为如果做到技术最强,就可以成为100%受尊重的人。
有一次一个人在面试项目经理的时候说了这么一段话:我只用最听话的人,按照我的要求做只要是听话就要,如果不听话不管他技术再好也不要。随后这个人得到了试用机会,如果没意外的话,他一定会是下一个项目经理的继任者。
朋友们你知道吗?不管你技术有多强,你也不可能自由的腾出时间象别人那样研究一下LINUX源码,甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码,写代码的含义就是都规定好,你按照规定写,你很快就会发现你昨天写的代码,跟今天写的代码有很多类似,等你写过一段时间的代码,你将领略:复制,拷贝,粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。
如果你幸运的能够听到市场人员的谈话,或是领导们的谈话,你会隐约觉得他们都在把技术人员当作编码的机器来看,你的价值并没有你想象的那么重要。而在你所在的团队内部,你可能正在为一个技术问题的讨论再跟同事搞内耗,因为他不服你,你也不服他,你们都认为自己的对,其实你们两个都对,而争论的目的就是为了在关键场合证明一下自己比对方技术好,比对方强。(在一个项目开发中,没有人愿意长期听别人的,总想换个位置领导别人。)
三、你更不要认为,如果我技术够好,我就自己创业,自己有创业的资本,因为自己是搞技术的。
如果你那样认为,真的是大错特错了,你可以做个调查在非技术人群中,没有几个人知道C#与JAVA的,更谈不上来欣赏你的技术是好还是不好。一句话,技术仅仅是一个工具,善于运用这个工具为别人干活的人,却往往不太擅长用这个工具来为自己创业,因为这是两个概念,训练的技能也是完全不同的。
创业最开始的时候,你的人际关系,你处理人际关系的能力,你对社会潜规则的认识,还有你明白不明白别人的心,你会不会说让人喜欢的话,还有你对自己所提供的服务的策划和推销等等,也许有一万,一百万个值得我们重视的问题,但你会发现技术却很少有可能包含在这一万或一百万之内,如果你创业到了一个快成功的阶段,你会这样告诉自己:我干吗要亲自做技术,我聘一个人不就行了,这时候你才真正会理解技术的作用,和你以前做技术人员的作用。
小结
基于上面的讨论,我奉劝那些学习技术的朋友,千万不要拿科举考试样的心态去学习技术,对技术的学习几近的痴迷,想掌握所有所有的技术,以让自己成为技术领域的权威和专家,以在必要的时候或是心里不畅快的时候到网上对着菜鸟说自己是前辈。
技术仅仅是一个工具,是你在人生一个阶段生存的工具,你可以一辈子喜欢他,但最好不要一辈子靠它生存。
掌握技术的唯一目的就是拿它找工作(如果你不想把技术当作你第二生命的话),就是干活。所以你在学习的时候千万不要去做那些所谓的技术习题或是研究那些帽泡算法,最大数算法了,什么叫干活?
就是做一个东西让别人用,别人用了,可以提高他们的工作效率,想象吧,你做1万道技术习题有什么用?只会让人觉得酸腐,还是在学习的时候,多培养些自己务实的态度吧,比如研究一下当地市场目前有哪些软件公司用人,自己离他们的要求到底有多远,自己具体应该怎么做才可以达到他们的要求。等你分析完这些,你就会发现,找工作成功,技术的贡献率其实并没有你原来想象的那么高。
不管你是学习技术为了找工作还是创业,你都要对技术本身有个清醒的 认识,在中国不会出现BILL GATES,因为,中国目前还不是十分的尊重技术人才,还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。(如果你不理解,一种可能是你目前仅仅从事过技术工作,你的朋友圈子里技术类的朋友占了大多数,一种可能是你还没有工作,但喜欢读比尔。盖茨的传记)。
分析为什么中国的大多程序员技术偏低--都是被逼的
首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的,我更关注于低层的环境,也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量,而非其它。所以我想说的是,中国的软件公司的性质直接导致程序员的水平的高低。而我所说的软件公司,不是指某个或者某几个,而是指主流的软件公司,大众型的软件公司。所以我希望那些已经步入一个理想的公司的程序员理解我这篇文章的定位。
软件公司的无偿加班对程序员的影响:
国内的软件公司中程序员是常常加班的,每日加,周未也常加。基于这种性质,出现了一种很莫名其妙的现象:每天程序员的实际下班时间总是要晚于规定下班时间,至于晚一个小时还是两个小时还是更多这就另说,总之,程序员这份工作,如果按时下班反而自己感觉自己像是做贼似的。表面上公司并没有强迫谁加班,但实际上在潜移默化中有一种威慑力,要求你要多为公司工作几个小时,而且表面上你所工作的这几个小时还是你自己愿意的。正因为是“自己愿意的”,所以公司更有理由认为是无偿的。
还有就是周未加班,一般周未加班是因为“忙”(关于这个带引号的“忙”,见“软件公司的‘忙’对程序员的影响”)。但周未加班一般是无偿的,至于法律所规定的那种“偿”就更尝不上了。不过一般公司是这样规定的:周未加班可以倒休。关于倒休,一般是周未的班真的加了,倒休却遥遥无期,原因很简单,公司“忙” 嘛!
这种情况对程序员的影响:消极、软弱无主见、虚伪、对前途渺茫。
软件公司的“忙”对程序员的影响:
软件公司的“忙”其实有时也是真忙,从原因来说,软件公司认为是程序员(其实也有其他员工,但本文不涉及讨论)造成的,程序员认为公司造成的。而根据“一个巴掌拍不响”原则来看,应该是公司与程序员合作不协调出现的恶性循环造成的。深层原因大家自己研究去吧。不过从我这里的表象来看,这种“忙”有这么几点,这几点如果不代表大家的意见,大家可以补充:
**项目开发与计划脱节,表现为项目开发慢于计划。
**突如其来的事件。
**为某种说不清道不明的原因,像是作秀。
**假忙。
**真忙。
上面说的第一种情况最常见,这涉及到软件工程的话题,其实也是软件公司做不大,程序员水平提不高的核心。而“软件公司做不大”已有前辈文章《浅谈:国内软件公司为何无法做大做强?》中说过了,而“程序员水平提不高”本文所言即是,所以这个原因大家读完这两篇自己体会吧。
上面说的第二种情况也常有,比如偶尔赶个标书,比如客户那里突然出现了BUG,急着去改等等。
第三种情况就很让人晕菜了,有点无病呻吟的感觉,比如不知道从哪里冒出一个会议,开到个七八点;
第四种情况很特别,也比较常见,大家同室坐、彼此各自心。一片共同耕作的美好景象,但果实见不到两颗豆呢。这可是大家齐心虚度时光。程序员可以拿出这个时间提高自己吗?当然不可以了,你表面上还是得干活呢。
第五种情况就不说了,因为这是正根。
总之软件公司是“忙”的,一般是以上三种“忙”,偶尔这三种都没有了,第四种就马上出来的。
这种情况对程序员的影响:混乱无序、怨由心生、虚伪做作、学习时间少。
软件公司的流程不规范对程序员的影响:
无像样的需求、无像样的设计、没有测试、没有文档、没有维护(所谓维护也大都是客户测试出BUG来改一改)。
其实说到需求这一块也并非完全是软件公司的问题,大多数情况下,客户也是根据程序员直接上来编码后暴露出来的问题才渐渐明白自己的需求是什么的。
“什么都没有”的问题在于,什么也不清楚,如果写一堆以不变应万变的代码,第一,时间不允许,第二,难度太大。要是稀里糊涂去实现,扩展与维护性又差,整个一堆豆腐渣工程,总之是没法下手。长了一堆“打铁”技巧,神不像神,程序员不像程序员的。
这种情况对程序员的影响:无规划性、代码质量低、手忙脚乱、技术永远停留在“打铁”水平。
软件公司对程序员员工的“全能型”要求对程序的影响:
装系统、修打印机、写文档、编代码、见客户、扫地搬桌子、接网线,在国内软件公司中程序员做什么事都有可能。单单说技术方面,也是要求事事能做,看一下招聘要求就知道了。
这种情况对程序员影响:术业无专攻
软件公司的工资拖欠对程序员的影响:
很悲哀,这是存在的。我向来认为一个员工与公司合作的最底线应该是按时按量发工资。但很多公司打破了这个底线。一个朋友开玩笑地说过:“家庭有钱,谁干程序员呀!”这话虽只可信一半,但是从国内情况来看,程序员的生活质量还是不高的,工资的拖欠直接影响到程序员的心态,甚至影响到程序员的生活。
这种情况对程序员影响:低调、迷茫、心态不稳、思想徘徊、生活困难。
软件公司对软件开发的要求对程序员的影响:
软件公司对软件开发的要求一般是实现即可。如果说写一个和记事本一样的程序,公司感觉程序员应该在一天内搞定;如果写一个WPS,公司也就感觉程序员应该在两到三个月搞定。这不是浮夸,事实就是这样的。公司所着眼的点在于“就这么一点功能”,而非在于“怎么实现这‘一点’功能。
这种情况对程序员的影响:开发难度大、维护难度大、压力大、难沟通。
软件公司的承诺对程序员的影响:
国内软件公司一般实际行动能力差,但没理难说话,他们也知道自己没理,所以比较爱承诺,把实际问题抛向以后解决。然而承诺也只是口头的,有一点“我以人格担保”的意思。不过一般情况下,国内的程序员还是比较有忍耐能力的(从上文来看不忍耐还能混吗),但公司层面的“人格”却是不可信,多承诺少兑现,员工面试时听到的说话到干了两年走了都没做到的事根本不少见。然而路遥马乏力,日久人变心,这样的结果往往是使公司与员工走入恶性循环。
这种情况对程序员的影响:不满、被动、拿不起放不下、进退两难。
结论:
消极、软弱无主见、虚伪、对前途渺茫、混乱无序、怨由心生、虚伪做作、学习时间少、无规划性、代码质量低、手忙脚乱、技术永远停留在“打铁”水平、术业无专攻、低调、迷茫、心态不稳、思想徘徊、生活困难、开发难度大、维护难度大、压力大、难沟通、不满、被动、拿不起放不下、进退两难。
上面这些短语概括了程序员的性格、心态、生活环境、工作环境等方面,它们就像毒素一样,日久能把一个健康的程序员毁掉。在这样的环境下,还问为什么你的技术这么低?太搞笑了。
写给程序员--程序员每年要做的10件事
还剩不到一周的时间,我们将迎来2012年。我知道这是老生常谈,但今年你曾经有过什么样重要的经历?很自然的,我们现在正处于为新年许下目标的时候。也许你可能有“真实”生活中的一些目标,但是你的程序员生涯呢?
1、学习一种新语言,框架或方法
我们必须保持学习最新的技术。
Web开发唯一不变的是变化。以NodeJS为例:两三年前它并不存在,只有很少(如果有的话)的JavaScript代码运行于服务器之上。现在,你离不开它。每个Web开发人员都希望留在自己的作品里。要做到这一点,我们必须不停学习最新的技术。如果你是一个后端开发,这可能代表着学习 JavaScript和Node.js,类似于Ruby和Rails。对于前端开发,则可能意味着真正理解CSS3或掌握HTML5新的API。当然,这并不意味着你必须经常使用它,只需要保持自己不断学习。
按照同样的思路,对于重新评估你的工作流程、学习更好的和不同的工具以更快速地完成工作来说,现在是一个很好的时间。
2、让你掌握的内容更精深
程序员新年要做的10个决定
也要预留一段时间来关注现有的语言和软件。
当然,保持锋利比学习新的内容有更大意义。它也包括改善你使用日常工具的方式。我知道自己一直坚持使用熟悉的的模式和方法而不是学习在某个特定情形下更佳的方案是不对的。你知道关于JavaScript设计模式的那些事吗?你对PHP的面向对象和面向功能编程是否有扎实的理解?你是否曾经使用过 SQL连接?你使用的文本编辑器里是否有没有用过的功能?这些都不是新技术,但是如果你不使用它们,它们对你来说就是全新的!也要在关注现有的语言和软件上预留一段时间。
3、探索一个新的领域
这项内容与第一项并不相同。学习一种新的语言、框架,或自己领域里的方法是重要的,甚至对你的日常实践来说可能会有用。但如果你像我一样,你会迷上网络上的每一部分。要尝试探索新的领域。对后台开发来说是深入研究前端开发,而对前端来说是探索可用性或用户体验。如果你喜欢写作,你可能会对内容策略或培养设计灵感感兴趣。在网络上有几十个不同的领域,继续探索!
4、参与社区
把它叫做参与,把它叫做结网,把它叫做任何你想要的。
该网站极度令人不可思议:我想不出有任何其他的现象,人与人之间相隔那么远,却结下如此深厚的友谊。2012年,你为什么不更多的尝试参与到这个令人惊讶的团体中呢?在Twitter上与他们交谈,阅读他们博客的文章和评论,或者通过自己写文章来作为回应;通过Github或其他代码共享网站贡献自己的代码。或者加入自由讨论会,用户组和各种会议。把它叫做参与,把它叫做结网,把它叫做任何你想要的,但有一点是肯定的:它会在大多数情况下让你和其他人受益。此外,建设新的重要人际关系,你可能会获得新的转机!
5、教导他人
最有益的评论是伤害你感情的那些。
你应该认同我们之前的观点,在2012年更多的教导他人。为什么呢?它将会带来些什么呢?“教导是最好的学习”?我已经为Nettuts +写作了近三年,我可以证明,这种说法是完全正确的。写下一个原理是如何工作的能够迫使你完全理解它,当你尝试教导别人时,你会惊讶对这个话题更了解了多少。最重要的是,当你知道曾经帮助别人学习新的技能时你会有不可思议的感觉。毫无疑问,你将遇到几个反对的声音,例如指出你语法的错误(或只是一些害群之马的评论)。不用有太多的担心;教学是一个学习的过程,你这样做会提高你自己。最有益的评论是伤害你感情的那些。
6、更好地照顾自己
我们是网络的受害者。
我们作为Web开发似乎非常自豪,因为我们献出自己的劳动。我们工作时间超长,弓着腰在黑暗中使用计算机,我们忘记了洗澡或吃饭。我们是网络的受害者,忍受着痛苦来让互联网更加美好。
听起来很勇敢,但确实不是这样。
为你的风险考虑,我建议你在2012年照顾好自己。除了睡得好,吃得好,确保你的工作场所符合人体工学。按理说,如果你花了生命中的三分之一在办公室,使其尽可能舒适是很有道理的!
7、更好的管理自己的时间(以及其他资源)
也许我并不是指这和Web开发人员有很大关系,但尽管如此,几乎每一个“知识工作者”可以做得更好。对于我们里的很多人,尤其是自由职业者来说,你要用你的时间来做的事可能是灯红酒绿和饥肠辘辘之间的差异。记住所有的这些乐趣,以及我向你推荐学习的Web新技术了吗?好了,不要让它们的引诱限制你的学习时间。当然互联网越大越会有更多诱惑。我敢肯定,你最近看到了下面的内容,当我这么做时它给了一个暂停。
在过去的一年里,超过1万亿美元的视频在Youtube上被观看。
假设平均YouTube视频是2 – 3分钟之久,我们正在寻找的东西可以花上一整天的时间。在知识方面我还没有足够精深。
当然,“只是工作,不要娱乐”,完全按此行事是正确的吗?我不建议你成为客户的一个奴隶或者是不能忍受沉闷的工作狂。我只是说,我们需要更明智的来明确了解我们每小时是如何度过的,并努力的更好利用时间。
8、采用更好的编程实践
过度的文档永远不会是坏事。
不,我不是在用两个不同的词汇重复同一个决定。这一次,我谈论的做法围绕编码本身的实践。我不能告诉你我有多少次热切地开始了新的项目,然后一个半小时后说,“嗯。。。我要为尝试这个功能创建一个分支。噢,等一下,我忘了开始时初始化Git。。“确保我记得从一开始就使用代码版本是我在2012年还要去面对的工作,它能使你的项目历史更清晰。
另一个我经常忽略的基本编码实践是注释。我可以变出许多行巧妙的代码,然后在剩下的时间里为其他事情分心。第二周我回到工作里时花了20分钟试图弄清楚它。这会困扰你吗?请你给自己帮个忙,为自己和其他人留下有用的注释。文档和注释是同样正确的事情。我最近在学习Dojo,我发现它的代码文档是无价的。当然,文件的水平将取决于你的项目的公开程度,但是我认为过度的文档永远不会是坏事。
9、产生被动收入
我猜Nettuts +的绝大多数读者做客户端的工作,无论是作为一个自由职业者或以其他方式。那么为什么不另外获取一些被动收入呢?Envato(译者注:自由职业者创建的著名公司,旗下有销售类、教程类和博客类的网站)有十个市场,在这里任何具有合适技能的人都可以获利。为ThemeForest(译者注:国外知名设计网站)构建一个主题,为CodeCanyon写一个脚本,其潜在价值永无止境。当然,如果你的技能不适合Envato市场,或者即便可以,还有其他许多方法可以产生被动收入。例如如果你是一个作家,可以试试Tuts+ Premium(译者注:一个学习设计、Web开发技术的网站)。他们一直在寻找充满激情的新教师。
在市场或个人网站上销售项目是一个聪明的方式,可以被动地获取一些额外的现金,同时你还能做自己享受的事情。
10、给自己放个假
戴上一顶完全不同的帽子…在有些时候
到目前为止,前面的每一个决定是你可以做的一些事情来改善你作为开发者的技能。我会密切指出,你要成为一个优秀开发者可以做的最好的事情之一就是不要成为一个开发者。。。在有些时候。有时候需要戴上一顶完全不同的帽子。保持甚至和开发毫不相关的一项爱好,而且最好不要涉及电脑。玩某种乐器,阅读,写作,开拓厨艺。不管你做什么,留下一些放松的时间。当你这样做时会发现,编程问题的解决方案往往出现在休息时间。
我曾经用在开车回家路上的思考解决了许多代码问题。
当然,定时休息是很重要的,还有那些一年几次更长时间的休假。此外扔了那些年度计划!
你的决定?
好了,这就是Web开发者应做的十项决定的清单。你觉得有哪些不在我的名单上?让我们在评论中来听听这些意见!