怎样才算是一个合格的程序员?如何成为一个优秀的程序员?

本文稍长,目录如下

  1. 论一论表单提交按钮背后发生的故事
  2. 批判性思维的魔力
  3. 熵增定律
  4. 程序员的知识体系构建

作为一个本科毕业一年多,加入职场两三年的“老”程序员此刻坐回学校的图书馆里,想记录一下此时的想法;一个仅毕业一年多的小后辈,作为当前认知体系下的思考。我想一年后回来阅读这篇随笔,一定有着不一样的观点;苟日新,日日新。

怎样才算是一个合格的程序员?如何成为一个优秀的程序员?
可能是在学生时代接触编程时就开始思考这个问题了吧。记得当时也在网上,在书本,与前辈沟通中求索答案,可惜时过境迁,很多具体化的东西或许都随风而去了;但某些意识却深深的烙在我的灵魂里。

突然想到一个很古老的问题:
当你按下浏览器的表单提交按钮时,你知道这个button的背后发生了什么吗?

首先假设这个button需要请求远程服务器响应,那在数据发送之前,基本简单的前端数据验证还是要的吧!你的请求方式是post还是get呢?如果当前操作涉及账户权限,那账户信息有采用缓存吗,如果有那存在哪里呢,采用Cookie还是Session或有其他更好的解决方案吗?当前这个请求是异步还是同步的呢?转发和重定向的区别是什么?你的后台采用哪种技术架构呢?若是Java架构,那你可说说请求转发到后台到获取返回结果要经历哪些组件的处理吗?说说你对MVC的看法?你会在什么场景下使用AOP?你觉得这个网站的背后至少使用了哪些设计模式?为什么?

以上仅是部分表层的东西,根据三年前在校那会给学校开发网站时的记忆里硬生生挤出来的,时过境迁,看官且当娱乐。

若进一步从计算机组成原理、操作系统以及计算机网络层面去考虑。你觉得浏览器缓存数据可能会放在哪个硬件组件下呢?计算机硬件层面的缓存模型是什么样的,为什么要有缓存,为什么cpu会有多级缓存,了解线程工作空间与进程工作空间吗?了解DMA吗?若当前内存资源紧张,你觉得缓存读取可能会经过哪些操作呢或者需要经过哪些组件呢,其中可能会运用到哪些调度算法,来聊聊LRU与电梯算法?你觉得CPU针脚个数与内存大小直接有什么联系呢?此外,请求数据的传输在各个网络逻辑层上分别采取了哪些协议呢?在数据请求发送出去之前计算机需要完成哪些操作呢?在TCP/IP模型下,你觉得每一层会做怎么样的封装呢,每一层的封装增加了哪些信息,为什么要增加这些信息?可以说说路由表的更新策略吗?了解TTL吗,它是做什么的?为什么TCP建立连接是三次握手而不是四次也不是两次?在上述操作中,那些会涉及到内核态与用户态的切换,为什么?

我想以上思考至少从技术层面针对第一个问题抛出了我的“砖”。接下来的“玉”,是否在你脑海浮现? 你觉得你是一个合格的程序员吗?

先来聊聊如何成为一个优秀的程序员。
工欲善其事必先利其器,从思维开始。

批判性思维的魔力
我想这是一个战略上的问题,绝对不限于要去学习什么技术。引用李笑来老师的定义叫“元认知”,都知道元数据叫定义数据的数据,那元认知是否可以简单理解为定义认知的认知?你对你的认知有着什么样的认知?在此暂时简单理解为自我洞察反省的能力。若把一个人的思维体系比喻为操作系统,那人的知识就像是安装在操作系统上的运用软件,若抛开硬件资源的差异性,软件的运行流畅与否,很大程度上取决于你系统的好坏。你若能够时刻洞察自己的思维方式处在一个什么样的状态,并且能够积极进行自我调整,那恭喜你,你的个人专属操作系统大概率一直处在升级中。操作系统总是有被病毒入侵的风险,及时判断那些是病毒就显得极为重要,我们知道病毒的入侵不仅会导致计算机存储与计算资源的浪费,甚至会篡改原有的文件,影响系统正常运行,进而造成更大的损失。以此类比到人身上可想而知。那如何避免你的思维系统中毒呢?那你首先要识别出病毒在哪里,对吗?你要学习如何去辨别哪些知识、思维是对你有益的,哪些是无益甚至是有害的。电脑有病毒查杀软件,我们人有什么?我想我们至少得有“批判性思维”。在生活中我们要批判性洞察别人言行,不管你表里如何随意,你的内心一定要一个清醒的认知,如此才能避免成为“傀儡”。个体的批判性思维有多重要,且看勒庞著作《乌合之众》作为对比参阅或从自己身边的人事物进行观察,即使书中存在大量断言,但这毕竟是一本超越作者时代认知的结晶。

在国内,我们从小被教育在学校要听老师的话,在家要听父母的话。不知道其他孩子有没有思考过哪些话该听,什么话不该听。时代的变迁越来越快,可能一个知识昨天还是适用的,今天就不适用了。在不同的个体成长环境下,那怕是普适性的法则,我们也得具体情况具体分析。

在互联网背景下,我们获取知识变得越来越容易。如何在万千信息洪流中汲取准确的信息,去伪存真,避免自己成为随流浮木?成为了一个关键问题。而学习训练自己的批判性思维会让你对这个世界有着全新的感知与思考。

人的“熵”
在软件开发领域,每隔一段时间都会有一个新的版本进行发布;修复已知的Bug,增加新的功能。以此来跟进时代的变迁,或说是抵抗“熵增”;熵在统计物理学的定义下为“一个系统的内在混乱程度”。软件也是有熵增的,因为使用环境的变化,代码会随着时间的流逝而“腐烂”。你无法面向所有的未来进行编程;实际上能够面向当前所需进行编程,按时完成客户当下对产品的预期就已经很优秀了。

熵增无处不在,其体现在人身上就是人在稳态下趋于自我无序的过程;如当人们处在一个安逸稳定的环境中时,容易因为缺少外界的刺激或自我驱动而逐渐丧失斗志,整个人的自律性、意志力趋于流失。有些熵增趋势无法阻挡,如人在出生之时就向着死亡靠近,其可以通过与外界的能量交流去降低这种这种趋势的速度,如人体摄入能量以维持日常的损耗,以此在一定程度上减缓死亡熵增。若是无法保持持续的学习,很容易就陷入熵增陷阱,如此很容易进入自我成长的停摆期。学习的方式有很多,比如与拥有独特见解的人交流,比如阅读;从学生时代开始,阅读在我们的成长里扮演了举足轻重的位置。而在进入职场后,除了工作期间,阅读成为多数人在业余时间自我成长的主要方式。学习新的知识,获取精神的养料,可以很大程度上阻止人精神的熵增。

时代的每一次大变迁,都意味着大环境的洗牌。生如逆旅,不进则退。熵增,无处不在。

对于沟通的思考
论高效的沟通有多重要,你去问问因为没有向领导沟通清楚自己工作而被其他团队截胡,或干好了其他人没干好的工作却被老板质疑工作能力的程序员。

作为一个程序员,可能很多时候不太愿意把时间花费在与别人“说”上面,而在平时工作中也是更多面对着冷冰冰的屏幕与电脑沟通。这种背景下使得程序员本身所拥有的表达机会就少于其他职业。“我说的这么明白,为什么你还是不理解?”,“你在说什么?”;这可能会是程序员与PM的日常对话了。在强技术背景下,描述清楚自己的工作似乎本身就比其他行业更难,特别是在不同的专业背景下。把自己的工作向没有对应专业背景的人以简练的语言描述清楚,显的如此的重要。很多时候,将自己作为讲师并对自身传达的知识赋予使命感,或许就会有着不一样心态了。记得哪位前辈说过,最好的讲解是把复杂的事情以简单的大白话讲清楚,并让没有任何专业背景的人听明白。这至少考验了说者的专业理解程度、耐心以及高效的自我表达能力。

有一个很重要的沟通法则是了解对方想听什么,你知道什么。并且,你怎么说比你说什么更加重要!一个普遍的场景是:程序员娓娓道来,而听者因为听不懂或者迟迟没听到自己想要的点而频频打断对方,致使双方不欢而散;又或者因为双方缺少耐心而导致了沟通的不愉快。写程序的时候都知道先构建顶层架构而后下钻细化,为什么沟通上却把握不好直接了当与层层递进呢?

对于知识体系的构建
身在职场,本质上是把自己的时间打包出售,换取的除了微薄的薪资,更重要的还有你在职场上搭建起来的人际与知识体系。而在现代经济体系的分工细化下,若想单单凭借职场所赋予的学习机会去构建完善的知识体系,个人认为大多数人并不具备这个条件。一般情况下在职场前期可以获取较快的个人成长,而后因为日趋重复的工作,在达到一定的熟练度且没有新的个人职责延伸拓展后进入瓶颈期。这个时候利用业余时间构建自己的知识体系就显得至关重要;如此就将个人成长从公司业务驱动变成了自我驱动。这个转变在初期或是一小步,但长期坚持下来,对于个人成长而言,是改天换地的一大步;这意味着你开始有了自主可控的对抗熵增的“道”。当然,做到这一步的时候,其本身认知就已经具备了抗熵增的雏形。记得自己常常在和小伙伴聊天时沟通对方最近阅读的书籍,获得的新知识、新感想,看看有没有可以学习改进的地方。少数小伙伴告诉我很少有可用于看书的业余时间了,特别是已成家的“大叔”们,这不知道算不算是一种遗憾。

知识体系的构建,这本身就是一个大工程,没个三五年是很难成熟透彻的。

记得在大学那会,给自己定了一个书单,就想着一下子把上面的东西都学到手,同时开启好几门课程的自学,追求短时间内的突破。结果是贪多嚼不烂,还把自己搞得身心疲惫,狼狈不堪。记得那时参加讲座,某位前辈深刻的剖析了“丁”字型人才结构,先有一专,而后带动多博。联想到现实生活中也确是如此;在初期,你总得先依靠你的专项技能让自己生存下来,在本专业有一定的积累站稳脚跟后,才有机会去思考知识领域拓展的问题,这一模型适用大多数人。那多博包括哪些呢?个人认为,首先这里可以分类为专业内与专业外的“多博”;假如你从事大数据开发工作,那你应该除了要对大数据技术生态体系有着深刻的理解与熟练的运用经验,以及持续学习新出现的且经你判断为有发展潜力的技术标准外。还要专注领域相关的专业前沿技术,比如自然语言处理(NLP)、数据挖掘(DM)、自动驾驶等。专业外多博可包含的范围就更广了,比如心理学、哲学、经济学等。个人觉得职场前期发展关键点会倾向于技术,而后期还得看专业外软实力的积累,特别是沟通表达能力这一贯穿整个职场发展进程的关键因素;职场的博弈越到后期,越是考验专业外的“多博”。

总结
实际上作为一个程序员,所涉及到了编程能力、工程建模、算法与数据结构、沟通表达等等一系列重要的软硬相关能力因素。而这一切的基础都在于底层的思维认知能力;在腐朽的架构上,再如何添砖加瓦都事倍功半。

本文以一个技术问题开头,联系到当今互联网信息泛滥的背景下,强行引出批判性思维的重要性。在今年上半年读到的马丁福勒《Refactoring》中提到软件代码随时间“腐烂”的现象,想到最近看过的几篇文章以及校长的开学典礼演讲上都提到上这个概念-熵,本人也是非常认可这一多学科适用的底层逻辑现象。而后想到最近在工作中与国外同事的沟通问题,以及职场上的随想,进而又想起商学院的知识体系构建问题。整体行文似乎并没有太大的相关性,或许又有着内在联系。不知道一年、两年、多年后看到这篇文章,还能不能想起当年为什么为如此行文。

值此中秋佳节,喜迎国庆。漫谈随笔,有感而发。

你可能感兴趣的:(Recorder,程序人生)