A. 为什么程序员的思维很难理解
1、程序员的思维比普通人要严谨。
对编程有一定了解的人都能理解这一点,一是一二是二,电脑不认模棱两可的回答,因为“模棱两可意味着更多的可能答案”,所以你跟程序员交谈的时候,如果你问他“为什么要这样问”或“你为什么听不懂”,你就会知道你自己的描述有多么的不严谨了。
最简单的例子,你妈妈让你去市场买水果,如果看到有苹果就买一个苹果,看到梨就买两个。你看到市场有苹果和梨,你会买什么回家?
首先给出一个大前提,在程序上不存在“潜台词”或者“潜规则”这种东西,唯一起作用的只有“字面意思”。
一般人肯定是买一个苹果和两个梨。当然程序员也不是脑子有坑,以一个正常人的思维考虑也会买一个苹果和两个梨,但是看到这问题的第一个瞬间的直觉反应,却是“如果看到梨就买两个苹果”。这个问题不存在潜台词,所以所有人都会直接从字面理解老妈的意图。
按照程序的逻辑分析,这句话共分为两个部分,代表两个程序任务。“如果看到有苹果就买两个苹果”为任务一,条件是“看到有苹果”,目标对象“买苹果”,数量“一个”;“如果看到有梨就买两个”为任务二,条件是“看到有梨”,数量“两个”,没有给出新的目标对象。
因此按照程序逻辑来讲,第二句话将继承上一个目标对象,也就是“买苹果”,所以这句话被看起来像职业病一样的思维直接翻译成了“如果看到有苹果就买一个苹果,如果看到有梨就买两个苹果。”
————————————————————
2、程序员看问题比一般人透彻。
这是职业特性导致的,因为电脑编程的严谨性,因此程序员面对一个问题、一个需要实现的目标或者一个bug时,他会思考更底层的问题,并且会习惯性采用归纳法来尽量避免以后可能遇到同样的问题。
比如用输入法输入中文的词句,有的时候打出了一串拼音,然后按下数字2选取发现不是自己想要的词,然后发觉数字1对应的才是自己想要的,删掉,重新输入拼音,这次按下数字1的瞬间却发现两个词的位置调换了,于是又删掉重新键入,这次认真地看了看,终于选对了想要的词的序号。
这个时候你会说,啊,我下次应该更小心一点,不要马虎大意想当然,看清楚了再点。
程序员不这么想,他会想,导致这个问题的看来是输入法的“词语顺序自动调整”功能,他会自动监测使用者输入的各种词语的频率,来自动调整词语的顺序,底层代码实现的逻辑很简单,每个不同的词对应一个从输入法安装到现在的输入次数的计数器,直接按计数器排列顺序就好了;也有的输入法会监测你输入后是否会将其删掉,那么这时候会被智能识别为打错字,计数器不会加一。
然后再一思考,这种功能一般都是可以开关的,如果我想要靠记忆记住顺序使用而不用输入法自动调整的话,比如对汉字输入的速度有一定要求需要考记忆记住汉字序号,我只需要进入输入法设置将其关掉即可;如果我想要它帮助我调整词句位置,但是又不需要频繁地调整,那么在我有工作需要的时候我会提前关掉,平时开启即可;而如果我想单纯依赖这一功能,那就不用管它,下次看清楚再选就好了。
B. 如何成为架构师 7个关键的思考 习惯和经验
工作了挺久,发现有个挺有意思的现象,从程序员、高级程序员,到现在挂着架构师、专家之类的头衔,伴随着技术和能力的提高,想不明白的事情反而越来越多了。这些疑问有些来自于跟小伙伴交流,有些是我的自问自答,有些到现在也想不清楚,这篇文章就来写一写这些问题。
如何更高效的学习?
很多新人程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来。
但是没过多久,能了解到的资料就开始超过每天学习的能力,像是买了没看的书、收藏没读的贴、mark了之后再也没有关注过的文章越积越多,更别提每天面对各种技术分享或者微博里的新鲜玩意了。
大多数人每天能留给自己学习的时间有限,这个阶段如何提升学习效率就成了要解决的重点。
说说自己提升学习效率的心得,其实非常简单:体系化的学习。
我曾经很喜欢看一些博客或者是一些“看起来”比较通俗易懂的文章,每天在微博微信里刷到什么技术文章就mark下来,基本上几分钟就能读完。可一段时间下来,虽然读了不少东西,但是还是有种在原地打转的状态,并没有感受到有什么实际的提高。
最后实在忍不住,抱着厚书硬啃了一遍,突然有种豁然开朗的感觉:读书时自己学到的是一张完整的知识网络,每个知识点和其它内容相互联系和区别。这种全方位的理解比起一篇篇独立的文章,不知要高到哪里去了。
而读了一段时间书之后,渐渐原本不在一个体系之内的知识也会慢慢联系起来,比如说后端服务的开发,简单梳理一下,就成了这样:
在重复了几次痛苦的学习-梳理过程后,再去看一些独立的文章或者资料往往会事半功倍,因为能在体系内找到相对应的知识,甚至有时候一本书里一页只需要看一句话,点破那层窗户纸,就可以掌握新的知识。
你是怎么知道这些的?
工作中总是会遇到各种各样的问题,有几次把问题处理过程总结了一下,发了出来,之后就像滚雪球一样,有越来越多的小伙伴来咨询问题,比如说:
前一阵帮忙排查一个性能问题,系统压力稍微一大就会频繁Full GC,压力降低之后又恢复了。
某个小伙伴接入代码质量检查系统之后发现每次构建会报一个莫名其妙的错误,打不了包。
某次代码有bug,小伙伴跑来来问我git怎么才能回滚代码。
每次查完这种问题的时候,一些刚毕业没多久小伙伴们就会用一种崇拜的眼神看着我,然后大多会问:“你是怎么知道这些的?”
实际上,虽然我一直在不断的学习,但是面对工作中无穷无尽的新问题,大部分问题还是会命中我没有掌握的那部分区域。每次有人问到我不了解的知识时我都会非常开心:还有什么比带着问题学习更有效率的学习方法呢?
而且幸运的是,在建立了自己的知识体系的基础上,学习新的知识通常都能很快的上手,解决一个问题往往只需要多了解一个知识点而已。
举个例子,频繁Full GC的问题,以前查过很多次GC的问题,大多数是Java程序或JVM内存泄露问题,而这次内存没有泄露,GC吞吐量也正常,那么我只需要查一下如何查看一段时间内创建的最多的对象的方法就可以了。
回到刚才的问题,小伙伴们问我:“你是怎么学到这些的知识的?”
答案是:在你问我问题之后现学的。
架构师应不应该写代码?
似乎隔三差五就能看到一些关于架构师应不应该写代码的文章。我是属于写代码派,因为我本身就喜欢写代码。但是,当工作职责发生变化之后,如何保持写代码和其它工作之间的平衡就成了问题。
从个体效率上来看,我自己亲自写代码,和很多人相比没有什么绝对优势,甚至有些人码代码的速度比我还快一些。
但作为架构师,参与写代码还是会有一些不大不小的收益。
一般来说合格的程序员对于明确分配的任务会完成的很好,但是大部分情况下“架构”这个词意味着架构师并不会涉及太多细节,架构图和代码实现之间总还是有些距离,你无法保证所有人都会正确的理解你的设计,或者是程序员写代码时遇到障碍时会立刻想出足够优雅的解决方案。
之前写过一篇关于烂代码的文章 ,大部分烂代码并不是架构师的设计问题,如果程序员没能很好的理解设计或者是经验不足,往往会做出一些非常匪夷所思的东西。比如我见过刚毕业的程序员为了防止模块耦合而将耦合的代码又拷贝了一份,或者为了“优化性能”而尽量把所有逻辑写在一个函数里。
如果不能及时发现并改正这些问题,那么这些地方就会变成“正确的错误代码”,或者”不是我写的“代码,或者”我靠我也看过那段代码“之类足以被挂上耻辱柱的玩意。这种问题算是架构师的责任吗?作为一个视名声如命的架构师,我认为是的。
在我看来,写代码的架构师更像是在做后勤保障的工作:在代码中第一时间发现可能存在的问题,向其他人提出警告,或是给予其他人改进的意见,必要的时候或是给其他人演示一下正确的姿势。
大部分情况下我作为架构师并不需要揽下“核心模块”开发这种工作,毕竟我能调配的时间太零散了,效率难以保证,很多人在专注的情况下比我做的好很多,我只需要保持大局观需要适度参与就可以了。
总的来说,架构师和程序员在某些方面上有点像产品经理和用户的关系,大部分程序员并不会主动告诉你他们想要什么、哪里需要优化,甚至自己也不知道这些。想要做出好的产品,捷径之一就是跟用户做同样的事情。
实践:开会是个技术活吗?
我觉得应该没有人喜欢开会,身为一个程序员,没有几个人的志向是当什么职场交际花。
但是会议邀请就这么一个个的跳了出来:开发需求要跟产品开会、项目方案要跟技术开会、新人转正要去开评审会、别的公司来了几个大牛正在开分享会、出了故障要开总结会、小组有周会、部门有周会,大项目每周开两次碰头会不过分吧?小项目启动的时候开个会不过分吧?调试的时候发现有个坑大家赶紧讨论讨论吧?
有时候参加的会议整场下来跟我毛关系都没有,全程神游俩钟头,最后突然有人一拍桌子:”还有问题没?好,散了!“
也有可能有个什么会没叫你,过了俩礼拜突然收到封邮件催开发进度,”当时那个会你没参加,大家都说应该是你们做……你没看会议纪要吗?“
吐槽了这么多,但我还是认为开会是个技术活,对于架构师来说尤其如此。
大多数技术人员开会并不是那种新闻里的工作汇报或者长者们的会议,他们真的需要通过开会讨论一个具体方案,或者解决什么具体问题。可惜的是我参加过很多会议,大多数的会议都是在毫无意义的交流中浪费时间:几方人坐在一个屋里互相说一些对方理解不了的话,最后得出一个”我们会后再捋一捋“之类的结论。
这并不是会议才有的问题,在程序员日常的沟通中,也有很多人并不懂得如何交流,比如偶尔会收到一些写的非常认真的邮件,打开之后是密密麻麻的一屏幕文字,但是从第一句开始就不知道他在说什么,后面的东西连看的动力都没有了。
大多数时候,沟通的核心不是你说了什么,而是你想要让对方了解什么、让他做什么。良好的沟通能在工作中显着提升效率,但很多人忽略了这个事情。
想要恰到好处的进行沟通是一件不那么轻松的事情,但是简单来说有几条原则:
确保各方对背景的理解一致,比如开会之前先简单通过邮件交流一下,对新加入会议的人花个30秒钟做个前情提要,或者在讨论过程中让对方说一下他的理解。
去掉对方不能/不需要理解的内容,比如跟产品说“这个队列在高并发下因为锁的实现有问题导致CPU性能瓶颈”不如改成“我们发现了性能问题,持续10分钟了,10万用户收不到运营发的无节操广告,大概5分钟后扩容解决”。
确保在对方失去注意力前尽快说出重点,比如排查问题的总结邮件,如果第一段是这样:“某某框架内部使用的是xxx技术,这个技术的架构是这样:blabla”,那么对方可能完全不知道你在讲什么。可以换成这样:“我发现了某某框架的bug,需要尽快升级,否则在xxx情况下有可能会出现yyy问题,具体排查过程如下:blabla”。
不要说没有意义的内容浪费其他人的时间,比如”这需求做不了“或者”这里不可能出bug“,没有人想听到这些废话。
为什么别人的系统总是那么烂?
很多程序员解决问题的能力很强,说要解决一个什么问题,下午就能写出几百行代码把功能实现了。但是做出来的东西有种少考虑了什么东西的感觉,我花了挺久去想一个词去形容“这个东西”,最后想出了个勉强可以表达的词:程序的生命力。
大部分程序都能实现功能,但是如果把“时间”这个也作为一个考虑的维度的话,就会意识到一个合格的项目需要考虑更多的东西:更通用的使用方式、易于理解的文档、简单而易于扩展的设计,等等。而想要毁掉程序的生命力也很简单:做的更复杂,更定制化,让更少的人参与。
我跟很多程序员提过程序的生命力,比如说要让自己写的工具的操作方式跟其它Linux命令类似,或者要用一些更容易理解但不是性能最优的设计方式,又或者要他去参考现在业界主流的做法,很多人认为提这种需求的意义不大,我觉得这里还是举个例子吧。
很多公司应该都会有一些遗留系统,它们庞大、笨重、难用、几乎无法维护,所有人都在抱怨这些系统,并且每天都在想方设法换掉那些遗留系统。但是一段时间过去之后,又会发现身边的新人又开始吐槽当时替代遗留系统的那个系统了。
“大多数系统当初都很好使,功能当时够用,扩展性看起来也可以,但是这些系统都是开发的人离职之后变坏的。”
还有更好的办法吗?
成为技术专家之后的工作可以说是痛并快乐着,会有很多人找你咨询问题,另一方面,会有太多人找你咨询问题。
甚至有一段时间我每天的工作就是解答问题,小到工具使用中到疑难bug,大到架构设计,从早上到晚上基本都是在给各种各样的小伙伴提供咨询服务。
我很快发现有些地方不对头:有些问题实在是太简单了,以至于我甚至都不用思考就可以给出答案,为什么会有这种问题?
后来我在每次回答之前先问一句:
“你还有更好的办法吗?”
一小部分人立刻能给出优化后的版本,甚至我连续问几次之后,他能给出好几个优化后的版本;另小一部分人会斩钉截铁的说优化不了了,就这样了。但是大部分人会犹犹豫豫的说出一些完全不着调的回答。
后来我改成在每次回答之前先问两句:
“你要解决什么问题?”
“还有更好的办法吗?”
效果好了很多,很多小伙伴发现要解决的问题并不复杂,只是做法跑偏了。
再后来我改成了在每次回答之前先问三句:
“他们要你解决什么问题?”
“你解决的是什么问题?“
”还有更好的办法吗?“
现在第三句已经很少问到了。
成为架构师最困难的门槛是什么?
跟一些程序员交流的过程中,有不少人问我要怎么成为一名牛逼的架构师。
我最近几年面试的人挺多,发现一个有意思的现象:很多人自称架构师的人跟你讲一个架构时简直滔滔不绝,各种技术名词像是说相声一样从他嘴里说出来,三句话不离高并发大数据,但是稍微追问一下,就会发现很多基本概念的缺失,例如自称精通高并发的人说不清楚他所谓的高并发系统的瓶颈在哪里,自称精通架构设计的人说不明白他的系统怎么保证高可用,自称超大数据量的系统实际上只有不到100万条数据,等等。
架构师虽然听起来很高大上,但本质上仍然是工程师,不是科学家,也不是忽悠人的江湖骗子。学习再多,也需要实践落地。设计架构方案更多的是在做一些抽象和权衡:把复杂的需求抽象成简单的模型,从功能、性能、可用性、研发成本等等方面规划如何构建一个系统,这些内容需要更多的实践练习。
很多人没有工作在类似微博平台这种天天需要接触架构设计的地方,而很多公司没有架构方面的工作可供他们练级,于是就想办法从理论上下功夫,这类人的特征非常明显:在信息不足,甚至不了解实际场景的情况下就开始做架构设计,这种所谓的架构往往理解比较肤浅,经不住推敲。
每年招人之后我们都会做一些针对新人的架构方面的培训,课程材料基本上包括了高可用架构相关的主要方面,但是学完这些材料之后就能成为独当一面的架构师了吗?并没有。相反,这仅仅是开始,新人真正做了几个并发量上万的系统之后才算是正式入门:面对压力时才会懂得权衡,走过弯路之后才会寻找捷径。
所以我认为在架构师(和其它很多)的工作中最重要的部分是实践,夸夸其谈很容易,与其拽一些技术名词,不如把你正在做的系统真正的做好。
我和大牛之间有多少距离?
跟很多人一样,刚毕业时我觉得作为程序员,只要努力,加上少许天赋便可以获得一些成绩。
工作一段时间后,对自己和其他人的认识也越来越清晰,逐渐的发现程序员之间的差距或许比人和猴子之间的差距还大,接受这个事实这让我郁闷了很久。
再过一段时间,发现自己已经能够客观的评价自己的能力,也意识到了距离并不是那么重要,只要想办法跑的更快,就足够了。
C. 程序员发现 Bug 的时候是怎样一种心境
我觉得程序员发现bug,应该就有一种学霸发现做错了一道题的感觉,根据这张题出现在自己试卷上还是出现在别人试卷上应该是有不同的心情的,下面就程序猿的心情来简单聊一聊。
有时候觉得程序员真的是很牛逼,那么一大串外星文字写出来,真是完全看不懂,人家还能一心二用,一边写程序,一边看小说。
D. 知乎热议:程序员的悲哀是什么
最近在知乎看到一个很意思的问题,“ 程序员的悲哀是什么? ”
很多人会以为程序员“ 脱发、加班、压力大、上班摸鱼 ”等标签是悲哀,而实际上这只是大众对此的刻板映像,并不是程序员真正的悲哀
毕竟这些标签在其他行业也都是普遍存在的,只是对于程序员群体来说,这些标签被互联网放大了所以显得格外的悲哀
但实际上的程序员的悲哀却来自我们程序员这个群体的内在通病
只关注技术的实现,不关注业务逻辑
大部分程序员在学习技术的时候,只会在乎技术的实现,而不去考虑更多的业务逻辑
经常出现的画面就是:
也正因为如此有了产品经理这个冤家,国外的产品经理更多的是对于商业业务的推进,而国内的产品经理更多的是对于产品细节的把控
因此,程序员的发挥能力进一步被局限,工作日常就是等着产品和设计给出流程图,按照图纸去步步执行
这样不仅禁锢了自己对业务的思考和成长,而且等项目做砸了,第一个背锅的可能就是程序员
只关注技术的分享,不关注商业逻辑
开源精神是程序员所推崇的,各个项目托管网站、学习资料、视频的分享造就了一大帮跨行进入互联网的程序员
要是没有现在那么多开源的技术,估计市场上有一大半的程序员得下岗
但是也正因为程序员的开源精神,造成了大量的人才涌入,毕竟环化材生只需要拿出发一篇SCI的精力,就能成为个初级程序员,加入程序员的面试大军
造成的结果就是初级人才越来越多,越来越内卷,最后35岁提前退休,卷王脱颖而出
让一个看起来高技术的职业人才通通成为了前期英雄,只要到第二年校招,就会发现自己很大概率被倒挂了
以为职业发展都是线性增长
温水煮青蛙在各个行业可能都有,但是别的行业可能是温水慢慢的蒸,但对于程序员这个行业水温还没上去来着,就有人拿着网兜把带走了
一行曾经见过,做项目前老板发奖金鼓励你把技术完成,但是项目完成上线后,为了节约成本就开了大部分程序员,留下少量的员工来进行维护
作为前期英雄的程序员,年轻点还好,赶紧去找下一份工作,但是年纪大了一点就难受了
这就是因为很多人按照惯性认为程序员的职业发展是线性模型,以后会越来越好,但很大情况下对于程序员来说职业发展是抛物线的,先增长后下降
如果没有预案准备,未来将会非常难受,当然做到一半提前转岗的不在此列
与其温水煮青蛙,不如主动的规划未来,那具体怎么做呢?
就算说程序员35岁退休,那也是针对初级程序员,技术专家的生命周期要长的多
毕竟工资增长靠工龄是不可持续的,能持续支撑工资增长的就是技术的不断精进了
不仅懂技术,而且还得更深层次的底层逻辑,才能再日常核心问题上发挥出自己的价值,这样就算优化也很难优化到自己身上
一直在技术圈子里很容易形成信息茧房,就像现在的各类算法推荐的流媒体,只推荐你感兴趣的内容,对你有帮助但不感兴趣的内容却离你越来越远了
同时跟电脑打交道久了,就更不想跟人进行交流了,越陷在信息茧房之中
所以还得多离开你的电脑桌,与人交流
只有不断的迈开腿,张开嘴,你将会发现,未来很多机会都是在与人交流中的碰撞摩擦出来的
为什么转行做程序员?那还不是因为工资高嘛
如果要提前规划未来的话,最好还是多尝试去了解兼职和副业,知道钱除了从工资里来,还能怎么来
至少赚1块钱也是好的,因为很多个项目都是从1块钱开始,然后不断滚雪球变大
只有副业开始不断有收益,那什么35岁危机、提前退休等危机全都不用考虑
程序员悲哀也都将会烟消云散了
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
安装 Python 环境 !
工欲善其事必先利其器。学习Python常用的开发软件也都整理在这了,给大家节省了很多时间。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去。如果你不知道你该做什么,可以查看下面的实战案例。
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
需要资料的小伙伴请私信我哦!
每个行业都有悲哀,虽然程序员的悲哀被放大了,但仍然是最有潜力的岗位
无论未来转岗、还是创业,技术能力都会成为buff为自己服务
加油,打工人~
E. 我是干了八个月的程序员,干了十几年的同事给我说我脑子不灵活,思维严谨,我是不是该转换一下做事思路
既然他这么说,而且他有十多年的工作经验,那肯定只看出了你工作上的一些弊端,那你可以虚心的请教他,你也应该转换一下工作思路,因为程序员这工作比较枯燥,但是也不能太死板。能尽量写短一些的代码就完成工作比绕个大圈写一堆代码完成工作要好得多呀,效率也高。