程序员的修行之路-保持良好的心态

保持良好的心态

其实,在不同的领域或行业,都会面临来自各方面的压力,那些能保持良好心态的人,总是能够走的最远。但是,如何能够保持良好的心态呢?面对物欲横流,充满着各种诱惑的世界,你是否能够保持清醒的头脑?马云抛起的互联网创业浪潮,让无数IT程序员们蠢蠢欲动,你是否能够保持冷静?IT和互联网总是不断有新的技术涌现,你是能否保持开放,不断的学习和探索新的技术?还有,有些公司虽然给你良好的福利,但是加班加到吐血,你是否愿意付出并坚持呢?

刚跳槽到华为工作的时候,遇到的是全新的领域,感觉工作步态上总是必别人慢半拍,那时候技术视野还不宽,看到的总是自己工作上的点东西,工作上没有得到领导的认可,心里未免有些急躁,再加上加班,感觉工作非常枯燥,也想过放弃。在计算机领域,我不是科班出身,所以在技术上总是保持着虚心学习的心态,每次PL找我沟通的时候,聊起我这方面要提升,那方面要提升,我总是虚心接受的,但是不免让人很有挫折感,我做的好的一面,总没有被看到。曾经看到过一篇文章,讲到了人生如行路,如果你走弯路,你就会看到更多的风景,相反你选择走直路,虽然更快的到达了终点,却错过了沿途的美景。因此我明白一点,不管你成长的快慢,只要你认真做一件事情,不管你遇到多少挫折,都会从中学到很多,自己认可自己非常重要。

其实良好心态最大的敌人就是你的功利心,一定程度的功利心是需要的,这可以不断的鞭策自己进步提升和完善,但是人如果过度的陷入到比较和追逐,就会丧失平衡,从而变的浮躁。要注重自己点滴的积累,看到进步,才能进一步清醒的认识自己。另外,我觉得保持身心健康非常重要,现在整个IT及互联网领域都是急功近利的,日夜的加班损耗了太多人工作热情,所以不断有人抑郁。这个是大的环境,很难一时间改变,但是作为个人,需要清醒的了解,不要迫于压力,就无限制的消耗自己,做到最大的平衡工作和生活,我个人觉得,人的一生不能只是工作和奔波,要适当的慢下来,读读书,听听音乐,参与聚会或者和家人看看电视,喝喝茶,这些都是生活的一部分,毕竟生命是短暂的。程序员要整天对这电脑,是非常不健康的,要多运动,保持健康的身心。

程序员的修行之路-培养工作兴趣

培养工作兴趣

你是为钱而工作还是为理想而工作?看中国好声音的时候,里面导师问的最多的问题就是“你的理想是什么?”,歌手们千篇一律的回答,无非就是坚持音乐,拥有更大的舞台,拥有更多的粉丝。可是我想问,我们真的能为理想而活。考大学的时候,我的理想是学物理,可偏偏被数学录取,考研的时候,觉得自己还有点天赋,希望在数学方面继续深造,可阴差阳错被分到了算法(模式识别图形处理)方向,到了毕业找工作,觉得我这个方向以后会有不错的发展,而且自己刚刚上手,结果大失所望,这个领域很难找到饭吃,最终做个普普通通的程序员。是不是觉得相当的苦逼,其实这不只是我的经历,也许有很多人跟我一样,有着相似的命运,这就是现实和理想的冲突,面对现实我们其实没有多余的选择而已。但是,反过来想,理想总是太高远,有时候飘忽不定,很多时候人很难对自己有准确的定位,随着不断的成长,你会对生活又有了新的想法,最初的理想早已被抛在九霄云外,所以,回到我最初的问题,你是为钱而工作还是为理想而工作?我想大多数人会选择最务实的答案,经济社会本来就是务实的。但是我如果将问题稍微修改一下,你是想为钱而工作还是想为兴趣而工作?你会有什么样的答案呢。

社会太务实,我们谈不了理想,只能退而求其次,谈谈兴趣咯。想想看,如果没有找到自己理想的工作,工作中又没有自己的兴趣点,那这样的工作会变的何等的乏味枯燥。因此在工作中,要注意培养自己的兴趣,带着兴趣工作,你会发现工作不再枯燥乏味,反而会增加你工作的动力,同时也会拓展你的视野,学习到新的东西。IT领域日新月异,更新换代很快,不断有新的技术涌现,程序员只有不断的学习,补充新知识,才能紧跟科技潮流的步伐。因此,程序员必须培养自己对技术的热衷和好奇心,学会不断的探索,才能不断的完善自己,增强技能和战斗力。

如何培养自己在技术方面的兴趣?我可以结合我自己的经历来讲述。记得读研的时候,我一个纯数学方向的本科生转到了模式识别图像处理算法方向读研,对于编程,除了考计算机二级时的那点皮毛,真的是一点基础都没有,虽然因为有比较好的数学背景,对于理论的学习相对比较容易,但是对于算法实现,感觉自己非常吃力。为了补计算机及编程基础,除了自学C及C++编程基础的书来读以外,就是每周都会选几节本科生的计算机课去听,一学期下来,总算有一些收获,感触最深的是,对C++的学习,C还是一知半解的情况下,学C++真的是非常吃力,c++primer我至少读了两三遍。学了这么多,最重要的其实还是实践,一直觉得自己对理论的理解是比较快的,但是动手编程的能力比较差,后来在学习机器学习的时候,专门选了几个典型的算法,在网络上找了很多参考的例子,自己动手实现了,影响最深的是使用前馈神经网络识别阿拉伯数字,最终识别率只能达到89%左右(我那个时候好的算法能达到95%左右),虽然不算高,但是对我来说已经算非常兴奋的事情了,就这件事情本身来说,让我对编写程序,产生了极大的兴趣,这就是成就感所产生的化学作用。

刚工作的一年多,感觉自己在工作上的压力非常大,不断有新的东西要学习,同时又经常被项目经理劈头盖脸的批评搞的很受挫,那段时间曾经怀疑过自己,是否真的不适合这个行业。不过还是坚持了下来,一年多的时间,不断的在项目上得到认可,同时在软件的分析和设计上有了很快的成长,最终我在离开我第一家公司之前,从设计到开发,由我单独负责一个子系统。有时候人需要在压力下,不断挖掘自己的潜力,你才能对自己有新的发现。后来跳槽进了华为,原因当然是为了钱啊,当初给我开的工资是当初的两三倍,不来才傻缺呢,不过还有个根本的原因就是,我在第一家公司能够学到的东西感觉已经就那么多了,再呆下去,我能看到自己还是干着类似的活,做类似的产品,进步的空间太有限。来华为后,我从windows 界面开发,转向了linux云计算,对我来说完全是全新的领域,而且也颠覆了我对软件开发的认识,在华为的几年时间里,我做过很多项目,从开发到维护,同时也拿到过专利,抛开工作的艰辛外,我想我的收获是满满的,尤其是逐渐培养了我高效的工作方法,和分析问题的能力,同时让我接触到了开源软件,可以在开源软件里找到自己感兴趣的项目进行学习。从我个人的经历来说,如果你想进步,首先需要得到自己的认可,并且能够从自己工作的项目中找到成就感,同时拓展自己的兴趣视野,这样才能不断的激发自己的工作热情。因此我觉得如果你要热爱程序员这个行业,最重要的就是不断培养自己的兴趣和好奇心。

目录 上一节 下一节

质量在于充分完备的测试,尽早发现问题

质量在于充分完备的测试,尽早发现问题

  任何软件产品,在交付给客户或者用户之前,必须经过严格并且充分的测试,由此才能保证软件产品功能可用,易用,并且能够可靠持续的提供服务。道理很简单,只有稳定可靠的软件服务才能在用户或者客户群里赢得良好的声誉,从而赚取更多的利润。相反随时崩溃的程序带给用户的只有极其差劲的体验,我想说只有傻瓜才愿意为这样的软件服务买单。如果你的软件面对的不是直接用户,而是中间的供应商,那么你就更应该保证软件的质量,在这种情况下,任何软件的bug都可能给你的客户带来极大的损失,你的公司也会因此丢失这样的客户,同时使你在同样的客户群中失去信誉,因此作为软件提供商,必须清醒的知道,应该用高质量的软件来成就客户才能赢得双赢的局面。

  软件测试如果按照测试阶段分类的话,主要分为单元测试、集成测试、系统测试和验收测试。其中单元测试按照测试方式的话,属于白盒测试,是程序员在写代码的过程中必须完成的测试,距离编码最近,是能够最早发现程序问题的一种测试手段。由于单元测试能够帮助程序员在编码的早期阶段发现问题,程序员可以快速定位到问题的根因,因此解决问题的成本几乎可以忽略不记。

  单元测试是保证程序质量的第一步,因此程序员对此必须要有清醒的认知,业务代码和单元测试的代码具有相同的重要性。

  在这里,我想用我的个人职业生涯的经历来说明,怎么做才是提高软件质量的正确做法。

  我硕士毕业后的第一份工作是在A公司,正是在A公司,奠定了我十多年软件职业的基础,但是在A公司工作的三年里,我甚至没有听过关于单元测试的任何讨论,我个人甚至没有接触单元测试的概念,在A公司,程序员们按照需求编写相应的软件功能,然后直接交给测试同事,由于编写的软件是windows界面,测试的同事们也不了解什么是自动化测试,以我现在的目光来看,在A公司,测试同事们使用最原始的方式进行测试,不借助任何工具。而程序员们只关注编码,测试并不是自己的责任。当你看到这里,也许你很好奇,以这样的方式开发的软件是否真的可靠?我的直观感受是,我们整个团队,其实对软件的质量并没有十足的自信,因为每次客户在使用我们的软件系统时,都要求我们有足够的技术团队的现场支持,我甚至好几次碰到过在客户现场,团队惊慌失措的解决临时问题,也许这问题就是个低级错误。

  我刚进A公司的时候,我曾经作为技术支持接手过一套软硬件系统,原作者在我进公司的不久前离职了,他是大家公认的牛人,写这套软件的时候据说是起早贪黑在很短的时间内快速完成了需求任务。提到这位同事的时候,公司的领导和其他同事都会眼前一亮,说他在写程序方面非常厉害,佩服的五体投地。而我一个新手可就没那么容易了,当我阅读他写的代码时,满篇的代码都是简写,简短的命名,没有任何注释,深度的嵌套,以及错综的分支,这样的代码很难说具有可读性。为了读懂和理解代码逻辑,我不得不找到硬件的开发文档,同时找了一台设备,自己手动测试加单步调试。我不得不说,这是一套复杂而脆弱的系统,因为几乎没有任何测试就交付给客户使用了。很多次我都是在现场解决一些奇怪的问题同时被一些客户破口大骂。对这样的程序员,我曾有过一丝的崇拜,可是当我在软件工程这条道路上逐渐成熟的时候,我意识到应该对聪明的程序员和专业的程序员加以区分,我觉得我的这位前辈只能归为聪明的程序员,而我更喜欢后者,坚持让自己逐渐成长为专业的程序员。

  当我意识到在A公司成长有限时,我毅然决定离开,选择了远在其他城市的B公司,B公司是国内比较大通信及软件供应商,具有完整的质量管理体系,领导层也具有远见卓识,是国内数一数二的技术型企业,正是在B公司工作的很多年里,让我深入接触了Linux 平台,在软件开发领域打开新的眼界,我的技术能力也得到了快速的发展。正是在B公司,我开始接触到单元测试和TDD的概念,同时我也开始听到了周围一些同事对单元测试的讨论。可是遗憾的是,我现在看来,我们当时的团队X在采用TDD开发模式上是失败的。团队在一开始软件开发时,就设定了单元测试覆盖率需要达到95%以上,但是由于团队成员资历尚浅,缺乏资深专家的正确引导,并没有严格的按照TDD 所谓的先写测试,后写业务代码的流程做开发,大部分的人还是先写业务逻辑的代码,然后再考虑UT覆盖,甚至很多人只是为了满足覆盖率,让用例蒙混过关。我身边所有的同事都认为,单元测试的代码是用来测试的,所以单元测试的代码质量并不重要,这导致团队开发人员对于如何写好测试用例根本没有认知。最后导致的结果是,单元测试没有帮助程序员有效的发现问题,反而成了项目维护的累赘。最典型的问题是当后期代码有任何变动的时候,导致很多用例失败,程序员在维护测试用例上花了很多成本。

  有趣的是,X团队里,起初大家认可单元测试的有效性,可是到后期就开始蔓延单元测试无用论。

  当我从B公司的X团队转到Y团队时,由于Y团队基于开源软件做开发,因为开源软件本身没有引入单元测试框架,因此大家写代码的时候索性都裸奔了,只是在程序员交付之前必须有手动的验收测试报告,程序员在设计软件过程中,需要设计自己的验收测试用例,然后手动执行,交付功能给测试人员时,需要保证验收测试用例全部通过。测试人员会再此基础上再做更加完备的测试。这套流程看似是严谨的,可是常常出现的情况是,程序员的验收测试用例时常设计的比较简单,为了应付交付的压力,验收测试用例基本上只保证了功能的可用,对于异常,性能和稳定性上缺乏足够的测试。同时还存在一个巨大漏洞是,当软件发生维护和变动时,因为缺乏单元测试的覆盖,对于那些解决老问题,引入的新问题很难快速发现,常常漏到集成测试,或者产品验证阶段才发现,这样导致的结果是问题不能尽早发现,因此解决问题的成本会非常高。

  B公司的一大特点是崇尚加班文化,996几乎成了程序员职业的代名词,我当时所在的Y团队成员几乎每天晚上要工作到10点,想想看,高强度的工作再加代码裸奔,软件的质量该如何保证?在我看来,这其实导致一种恶性循环,程序员在疲惫的情况下交付不可靠的软件->测试不充分->疲惫的测试人员漏测->下游或者客户发现问题->程序员加班解决问题。虽然在B公司,我在技术能力上有了很大的突破,可是在我看来,程序员几乎被绑在了公司运转的车轮上,生活空间被工作挤压,同时没有业余的时间研究新技术,学习新的软件工程方法,日复一日使用老旧的技术开发。团队里所谓的技术大牛,在我看来其实都是些聪明的程序员,他们在如何提高软件质量方面,眼界永远越不过自己的鼻尖。因此基层的程序员缺乏专业程序员的引导,他们的知识体系很难得到更新,很多人其实在如何保证软件质量方面没有任何思考,日复一日的拷贝粘贴,或者写出那些看似高明的复杂代码。为什么国内把程序员叫码农,是因为程序员几乎成了一种体力劳动者。

  我所经历的这种情况几乎成了国内技术公司普遍存在的现象。

程序员的修行之路

程序员的修行之路

目录

img微信公众号

程序员的修行之路-人生是一场修行

程序员的修行之路-人生是一场修行

人生是一场修行

工作接近10年的时间,不得不感叹时间的飞快,还没来得及回味人生,已经接近中年。这10年来的程序员生涯,感受到过生活的现实和无奈,感受到过孤独和无助,感受到过工作的激情和兴奋,也感受到了辛勤耕耘后收获的喜悦。就这么忙忙碌碌的10年,回想起来,每个片段都历历在目,又觉得是如此恍惚。

在程序员的人生道路上,我承认自己既不是大牛,也不是天才,但是我觉得自己应该是一个勤勤恳恳的耕耘者,这个行业里普普通通的大多数而已。但是不管怎么说,这些年职业的积累,回想并总结一下,也许会帮助那些后来者,少走些弯路。

我想写的,并不是想讲些光鲜亮丽的大道理,而是个人实实在在的人生经历所总结的经验,我本来就是个普普通通的人,所以我将这些经验分享给那些奋斗在一线的普通程序员们。

讲到修行,很容易联想到佛教的僧人,过着与世无争,简单朴素的生活,南无阿弥陀佛,当一天和尚撞一天钟。其实这只是我们看到的表面,佛教最重要的就是修心,六根不净的人,即使剃度,穿上袈裟,心中都很难有佛,别说是成佛了,因此,这跟我们所看到的生活方式没太大关系。佛教的“修行”两个字,讲的真的妙,我读过一行禅师的几本书,很通俗的将佛教思想应用到世俗生活上,成为一种朴素的生活和工作哲学,而这些也正是现代经济社会所缺乏的。

我为什么在这里用修行来描述呢,因为所有的行业,都不可能一步登天,我们这个行业也是一样,需要一点一滴的积累,因此修行的第一层含义就是要沉住气,一步一个脚印,慢慢积累。同时这个行业也有它的特殊性,随时都有可能更新或者颠覆,随时都要学习新的知识,你多年来的工作积累很有可能瞬间就被淘汰了,这时候,修行又有了它的第二层含义,那就是方法论,佛教有三宝,其中之一就是佛法,法就是方法,知识有可能被淘汰,但是经验和方法却是通用的,因此注重知识积累的过程,同时也要兼修方法和经验的总结,这就是我用修行的两层含义。

我将从以下这些角度分别来阐述如何成为优秀程序员需要培养的要素和特质,这些不一定需要你拥有特别的天赋,只需要个人的勤奋和努力再加随时总结和沉淀而已。

目录 下一节

本文系本站原创文章,著作版权属于作者,未经允许不得转载,如需转载或引用请注明出处或者联系作者。