前段时间,与几位友人小聚,大家互道工作顺利、平安健康云云,期间一位驰骋商界多年的老友问:”你现在在华为做什么工作呀?”我很骄傲地说:”系统架构师“,可是他却愣了很久,但当我老婆在旁边补上一句“码农“时,老友瞬间秒懂,却把我受伤的心孤独地留在风中凌乱。
作为与UNIX同年代的人,我当初选择计算机专业仅仅是因为抓到什么就学什么罢了。本科毕业遇到互联网危机,便没有想法地去读了研,研究生毕业找工作,面试官问为什么要做软件开发,答曰“不给钱都喜欢做的事情,何况还给钱”,便从此踏入了编码这一行,只是从来没想到一做就是十几年。
但凡一件事情做久了,无论成功与否,都会有一些真切的体验和心得。以前也读过一些工作中如何成功、快乐,诸如马洛斯理论之类的文章,也许是因为自己领悟能力比较差,唯一的收获是庆幸自己当初选择了编码作为自己的工作,因为编码天生就具有让人愉悦的工作内容和工作氛围,快乐如影随从。

编码世界:规则简单有效,粗暴却完美
从事编码,可以锻炼逻辑思维能力,教会你如何思考。就像学习法律一样,学法律的人未必都是为了成为律师,但法律教会了你一种思维方式。同样的,通过编码可以学习到这个世界上最严谨的思维方法。因为在编码的世界里,对错是简单甚至绝对的,只要敲下键盘,计算机就会判定孰是孰非,0或1,规则简单有效,粗暴却完美。
从事编码,可以获得持续的创造力。跟写作、绘画、作曲一样,编码也是一种创造性的工作。只要有一台计算机,掌握了基本技能后,你便拥有了无限的超能,便能随心所欲地创造出新的东西,丰富和美好这个世界,是不是很棒?
更酷的是,编码可以品味孤独。除了跟别人交流、学习,程序员大部分时间都是独自在工作,只要双手触摸到键盘,内心顷刻便会变的宁静,多酷呀!伴随着键盘清脆的低吟,沉浸在一个人的世界里,跟烟雨蒙蒙天,一杯茶,一个人听着淅淅沥沥的雨声品味孤独,简直有异曲同工之妙,多感性呀!
能够选择编码作为工作的人,大部分都是喜欢为人处世简简单单的人:这群人有着天真烂漫的好奇心,虽不苟言笑,但却内心火热,善于分享,乐于助人,甚至有时为了解决问题、宁愿不眠不休,却深以为乐……跟这样一群简单纯粹的人在一起,我觉得世界上最好的工作氛围,也不过如此。
程序员的三个境界
但IT时代的膨胀已经让编码工作如同文艺复兴时的印刷匠一样,编码门槛越来越低,遍地《一周XX速成》、《20天XX精通》,仿佛会写代码就成了程序员,这让很多人认为从事编码工作就是码农。其实,印刷匠很多,成为大师的不多;码农很多,但程序员并不多。程序员不是码农,码农也不是真正的程序员。

程序员在英文里对应有三个单词:Coder、Programmer和Software Engineer,我觉得这三个词,生动形象地描述了程序员所需要经历的三个阶段,或者说三个境界——
Coder:只要求能够熟练使用编程环境,精通几种编程语言、开发框架和开发库,擅长写代码就可以了。这个阶段的程序员能够按照既定的设计完成编码。
Programmer:要求在coder的基础之上,精通设计模式、算法实现和编码技巧,并具备熟练应用的能力,这个阶段的程序员能够独立编码解决现实问题。
Software Engineer:要求在掌握业务知识的前提下,理解为什么这么实现,在综合考虑架构实现,权衡开发成本后,为解决业务问题提出最优方案,并能与业务人员顺畅沟通,让业务人员理解方案。编码工作达到这个阶段,才能称得上是真正的程序员,才真正实现了从工作到职业的转变。
不可否认,这个世界上有一些天才的程序员,他们喝着咖啡,哼着歌,便完成了上面三个阶段的修炼。但绝大部分人,都需要为此付出巨大的时间和精力。能否成为职业的程序员,影响因素和方法论很多,各种学习类、技术类的总结遍地都是:主动思考、及时总结、制定规划等。但我认为其中最重要的是能否做到专注。
许多没有达到第三个阶段的程序员,就是因为受到各种因素诱惑,变得心猿意马,不够专注。因为不够专注,他们不在意做好自己本职工作,不在意锤炼自己的技能,不在意学习新兴的技术。慢慢的,他们会认为从事编码没有出路,进而毫无例外地把编程看成是体力劳动,只会粘贴拷贝代码,知其然而不知其所以然,导致技术停滞不前。在这样的状态下工作5年、10年,对于他们来说,没什么区别,程序员真的就是吃青春饭的码农。
程序员VS码农:我们不一样
要避免程序员变成码农,必须对编码保持热情,并持续学习;必须保持好奇心,乐于探求事物本质;必须对所做的工作及时总结,主动优化代码,让系统变得更加有机;必须主动尝试更好的开发方式、更先进的工具,来提升开发效率,并想办法避免重复性的工作;必须不断改进设计,将编程变成创造性的工作。只要通过这样逐步地积累经验和长时间锤炼,知识体系才能构建完备和丰富,才能避免沦落为码农。
几年前,我曾经重构过一个模块,从外部看模块的所在的系统,都是类似这样的,简洁而漂亮:

但从程序员编码实现的层面看,它实际上是这样的:

这个设计在最初的版本没有任何问题,使用继承扩展管理对象的接口能力,但仅仅过了两个版本,项目组PL说实在撑不下去了:增加一个接口,需要修改200多个地方,如果再过一个版本,估计要修改400多个地方了。
后来我把它改成这个样子,使用聚合消除了耦合:

从代码实现层面看,在功能刚开始开发时,这两个设计区别不是很大,但随着系统演进、越来越多的功能加入,继承关系带来的耦合会导致模块之间关系越来越复杂,牵一发而动全身,终究有一天哪怕只做很小的改动,也将成为压死骆驼的最后一根稻草。
这次重构的成果是代码量由43K减少到15K,扩展新的接口能力不再需要修改已有代码。我想,这或许就体现了码农和程序员的区别吧。

CT是一个业务复杂度极高的行业,要想从码农成长为程序员,需要经历更多的煎熬,需要发挥更多的创造力,同时也意味着,我们比以往任何时候都需要越来越多的码农成长为程序员。
既然我们选择了编码作为职业,注定会经历各种心劫:枯燥、沮丧、迷茫,甚至浮躁……然而无论处于哪种心境当中,我相信,只要想起自己曾经满怀惊奇、兴奋与真诚敲下的那个程序——“Hello,World!”我们就会充满了渴望和力量,因为那是程序员最初的梦想:改变世界。

华为大佬:做一个快乐的程序员,而不是码农相关推荐

  1. 华为大佬:做一个快乐的程序员

    春节假期,与几位友人小聚,大家互道工作顺利.平安健康云云,期间一位驰骋商界多年的老友问:"你现在在华为做什么工作呀?"我很骄傲地说:"系统架构师",可是他却愣了 ...

  2. 为什么中国的程序员被称为码农?

    为什么中国的程序员被称为码农?  实际上IT行业在中国并不是特别差的行业,而程序员的工资也并不低,但为什么中国的程序员总被称作码农或者说是苦逼的程序员?中国的程序员生活和欧美的有什么不一样?      ...

  3. 为什么中国程序员被称为“码农”

    编程活动和机械电子一样可以视为一种工艺(craftsmanship),从事此类工艺活动的人可以叫做工匠或者工程师.经历过工业革命的欧美国家,有深厚的工程根底,从机械到电子再到软件,都是国家产业的支柱, ...

  4. 传播正能量——做一个快乐的程序员

    文章出处:http://www.cnblogs.com/hbccdf/p/to_be_a_happy_monkey.html 阅读目录 引子我们的累为什么会累别人累吗别人累吗--换个思路如何不累--保 ...

  5. AI程序员,所有码农的梦想

    https://www.toutiao.com/a6641804001950040590/ 2019-01-02 15:51:40 目前为止,人工智能还不算成熟,还没有特别优秀的人工智能产品进入百姓生 ...

  6. 第七十九期:阿里程序员感慨:码农们过去暴富有多轻松,现在赚钱就有多辛苦

    互联网的世界也是一座围城.有人挤破脑袋想要进去.而有人又觉得是被互联网的光鲜表象欺骗了忙着要出来,但最终,这些人都会离开. 作者:职场八卦 互联网的世界也是一座围城.有人挤破脑袋想要进去.而有人又觉得 ...

  7. Java程序员如何从码农晋升为架构师,你跟架构师的差别在哪里?

    一.如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理.jvm虚拟机原理.调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并发量. ...

  8. 程序员感慨:码农太苦,互联网更是穷人聚集地,劣根性一览无余!

    如果说,现在什么行业工资高,首选就是程序员.在旁人眼里,程序员一个月工资随意赶超普通文职半年甚至一年薪水.每天坐在电脑前,敲敲代码,轻轻松松年入百万.但是近日,一位程序员的言论让人大吃一惊. 要不是因 ...

  9. “码农”一词是怎么来的?为什么中国程序员会被码农?程序员和农民有什么关联?

    原创: 思齐大神 来源:蚁开源社区 很多同学会问,IT行业在中国并不是特别差的行业,而程序员的工资也并不低,但为什么中国的程序员总被称作码农或者说是苦逼的程序员?中国的程序员生活和欧美的有什么不一样? ...

最新文章

  1. arXiv论文如何一键链接解读视频,这个浏览器扩展帮你实现
  2. .exe已停止工作_这几天我遇到了前所未有的问题windows10 1809 explorer.exe资源管理器频繁崩溃...
  3. AIX 访问Linux NFS共享错误案例
  4. 浅入深出Vue:发布项目
  5. SpringBoot整合分布式消息平台Pulsar
  6. ceph学习之pool
  7. Android后台强制结束进程,Application入口或者activity回调的是哪个方法?
  8. flask 部署_只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型
  9. 在chrome里查询修改html代码,我需要在网页中直接编辑CSS?打开Web代码检查器
  10. 宇宙中的最大天体有多大
  11. 【LeetCode】【字符串】题号:242. 有效的字母异位词
  12. 我敢打赌,你对ConcurrentHashMap不了解?
  13. Linux禁用文件可执行权限
  14. 解压版mysql使用
  15. 炼石:栉风沐雨七载路,不负韶华再出发
  16. BZOJ4715 囚人的旋律
  17. sprintf左右对齐
  18. html如何设置自动点击事件,使用javascript给html元素添加click事件
  19. PHP多进程 - opcode缓存与用户缓存(APC, XCache, eAcclerator,Zend Opcache,Yac)
  20. 使用DNS来屏蔽广告

热门文章

  1. Spring Boot学习总结(10)——SpringBoot打包成Docker镜像
  2. 互联网推送服务原理:长连接+心跳机制(MQTT协议)
  3. Java基础学习总结(21)——常用正则表达式列表
  4. mysql alter atafter_MySQL 常用操作
  5. c语言主函数如何获得子函数的值,子函数中的数组值怎么带回主函数中?
  6. Android基础View回顾
  7. 2016值得关注的5大IT趋势
  8. STM32 寄存器库和固件库
  9. OPENSSL编程 第二十章 椭圆曲线
  10. 《编程之美》1.9:高效率的安排见面会的一个解法