能力不足的C++开发会欺辱能力不足C#开发
能力不足的C++开发会欺辱能力不足C#开发
我被C++开发欺辱的岁月
前言
人被压迫了,为什么不斗争?——鲁迅
作为一个C#开发者,我经历了,也见证了很多同行饱受C++开发的歧视和欺辱。
而且,这种行为,现在依然持续的发生在C#开发者的身上,就目前为止,绝大部分C#开发还都无法摆脱这样的命运。
能力不足的C++开发会欺辱能力不足C#开发
C++语言的基础是【语法+windows系统调用逻辑】,其他语言的基础是【语法+基础设计模式】。
事实上,就基础而言,需要学习的时间和学会后的技术等级,都是差不多的,两个都只有一年工作经验的新人,按理说,不存在谁比谁更厉害多少。
但在聊天和会议等语言沟通中,却是不一样的。
C++开发会占据极大的理论优势,因为windows系统调用逻辑和C++的语法中包含了一部分内存的管理,当然那不是性能,但C++开发会误认为那就是性能。而程序员这东西聊着聊着,就会聊到一些高级的东西,比如性能,所以,C++开发在这样的交流中,更能说的上话。因此,这种交流也容易让外行人产生,C++开发更厉害一些的错觉;而当你准备反击,想改变在别人心中的水平低的印象时,当你准备谈一些基础设计时,则会被轻松反杀。这也很好理解,因为设计这东西真不是你能在三言两语中给说出来的,你说出来的只能是一点点片段,因此你要么被对方抓住把柄反杀,要么被对方以没时间听你废话反杀。
实际上类型与其占有的内存及使用方式都是微软开放给大家的,并不能成为一个人傲慢的依据,但C++开发不懂这些,当然C#开发也不懂,所以很多C#开发,在即兴的聊天中,并不能及时的有效切中要害,有效的攻击对方。而据我个人经验,就算切中要害,也会轻松被对方诡辩回去。所以,结果就变成了,在外行人和技术水平不够高的人眼中,同样学习一两年的开发,C++开发远超其他语言开发的水平了。
其实,大部分C++开发是不懂性能的,这很好理解,因为他们没到那个水平,但似乎C++开发都有一种莫名的自信,以为学两年C++就有架构师的水平了。所以C#开发要保持平常心,心里要有数,不要真的认为他们如同他们自身所吹嘘的那样厉害,不要因为辩论失败而丧失信心,进而对自身的技术水平产生怀疑,要相信自己。
总结,能力不足的C++开发会欺辱能力不足C#开发,并会引发周围非技术人员的歧视。这对C#开发是一种极大的,无形的负担。但请不要因此丧失信心与追求。
多年前,我的一个小故事
人被压迫了,自然是要斗争的,但斗争也是要付出代价的。
很多年前,我经历过这样一件事。
在一次团队会议中,我提出了产品框架设计要加入AOP设计元素,结果当场被【所谓的】C++大神开发,以及其不客气的语气直怼:“你知道AOP是什么吗?”
我忍耐住怒火,以最平静的心态,详细的为他讲解了AOP的基础概念,结果又收到另一个直怼“你去查查百度去”。
彼时,年轻的我,还不擅长这种应对,愤怒的反问道“那你觉得AOP是什么”。
对方显然是斗争中的高手,经验丰富,留下一句“你去百度查查”,反身离开了会场。
会议草草结束,而我,恐怕是在部分与会人员心中留下了“装腔作势,触怒了大神”这样的印象。
那时,年轻的我,确确实实的感觉到了,自己被压迫了。但一次的压迫并没什么,这种事,成年人都可以忍耐,当时以为,忍耐过去了,就了事了。
但随后的事态发展,却并不是我想象的那样,忍耐并不可以收获安全,因为对方并是只想打击你一次,而是想一次次的打击你。(后来反思,对方其实也并不是针对我,因为对方是个假大神,所以他一定要把其他技术强点打压下去,而我只是他打击的其中一个对象而已)
忍无可忍,无需再忍,所以,当时的我,毅然决然的决定了,要斗争。
虽然斗争是一定要斗争的,但要如何斗争呢?
毕竟彼此之间,只是同事;又没有仇恨,矛盾也只是技术层面的交流。
既然如此,那斗争就要在技术层面展开。
首先,要证明自己的技术能力,因为,自身能力如果没有获得证明,那所有的斗争就都是扯淡了,因为没人相信弱者。
接下来,就是去了解对手的技术水平;如果发现对手是个装X的水货,那么,就要彻底撕开对手的假面具,让所有人都知道他是个假大神;如果对手是个真大神,那只有先敬而远之。
斗争
要了解一个人的技术水平高低,真的不难,稍微聊几句,调查一下,就可以知道了;所以,很短的时间内,我就发现了对手是个假冒的大神。不过,说实话,对手【装】高手的能力和手段真的很强。
自那以后,每一次会议被【所谓的】C++大神开发打断话语,都保持平和心态,绕开他,坚持把技术观点讲述完整,这样可以让与会人员了解到自己正确的观点。因为与会人员并不全了解技术,一旦你被打断讲述,与会人员认为你的描述错误,所以,当有人提出疑问,他们完全不会想到有人会因为其他因素而打断你的发言。在非技术人员面前,坚决回避技术讨论,一旦被迫发生,则留下一句含糊不清的话,尽早脱身。在技术人员面前,坚决讨论技术,一定要讨论出对错,如果对方执意回避,则尽量追回讨论,实在追不回,也要把正确的结果摆在参与讨论的技术人员面前。
斗争的过程是艰苦的,是不开心的。因为,一开始我并不适应这种对杀,技术层面的斗争说起来容易,当你真的在做的时候,总是会过多的把个人感情投入到里面,届时,对手就不在是对手,而是敌人了。那种感觉真的很不好。
虽然,最终我适应了那种对杀,但真的希望未来的职业生涯不在出现这样的局面,因为那真的不是理想的工作环境。
假大神的反击
这是一个很有趣的故事,当时我们有个项目在线上运行时有个bug,会不定期的软件崩溃,大约持续了两三年,也没人解决。
刚入职不久的我,奉命前往现场攻关调查这个问题。
在茫茫多的代码中,一点点追查,最终找到了问题所在,调查结果,是因为这样的一句,看上去很可笑的代码。
1
|
string.Format(变量); |
我想,稍微有点基础的人,应该都了解string.Format的用法吧。如果,如上面这样写代码,会出现什么样的结果?
当有人在这个变量中输入字符串【{ 】或 【}】的时候,系统会因为字符串格式不正确抛出异常。而我们那个项目不定期崩溃的原因正是在此,因为当有用户打字输入了【{ 】或 【}】时,才会引发系统崩溃,不过客户由于并不是天天都输入【{ 】或 【}】,所以也就造成了不定期的系统崩溃。。。
找到问题的所在,自然是回公司复命,当时,我还并不知道这段代码,是项目早期的最原始的代码,并且是出自那位假大神的手笔。
回公司后,自然是要向我的直属领导汇报,描述问题出在哪里,要如何修改,领导听了汇报后,很满意,并让我发邮件,向全体开发人员,说明修改方案,和以后要注意,不要这样写代码。
因为这样的代码,并不是只有一处,而且很多人都这样写,我猜想,大约是那位假大神写了初稿,然后再大肆宣扬,要别人也和他一样这么写,因为如果不是这样的原因,后续假大神的反应,似乎是不太合逻辑的。
我想,我的领导大约也是知道这代码是怎么回事,因为他是和假大神同期进入项目的,估计早期还被迫写过这样的代码。
假大神当然也收到了这邮件,于是乎,他恼羞成怒,开启了一轮大秀,他居然集体回复了一封邮件,【那你说该怎么写】。
每当想起此事,我都不禁发笑,我从来没想过他会如此自爆,哈哈。这么基础的语法,其实只要百度一下就会了解了,何必如此白痴的集体回复邮件秀智商呢?
之后,我并没有回复他,一是保留自己的人品,二是我真不知道该如何回复,难道要我回复他【你是白痴吗】,哈哈。
不过,现在,我仔细想了想,我没回复他,实在是错误的。看过琅琊榜的同学应该都知道,如果问题是因为太子和誉王的党争,则皇帝并不会太事件本身的对错。
所以,虽然项目组的开发人员都通过邮件知道了他的水平,但那些不懂技术的高层领导,恐怕只会认为这是一次普通的技术斗争,并不影响假大神的技术水平定位。
也就是说,假大神,并不在乎自己在同事心中的地位,他在乎的是,他在高层领导心中的地位。
而事实上,直到我离开那家公司时,假大神在高层领导心中的地位,也没有动摇,即便已经没有开发人员相信他的技术意见了。
说到底,还是我的斗争经验距离对方差距太大,视野和对方不在一个等级上,相信,多年以后的现在,那家公司的技术人员已经换了一批又一批,而假大神,依然屹立不摇。
反思
我曾经认为,在项目中做正确的技术选择和正确的技术判断,对项目是正向发展,在领导心中,这应该是我的加分项。
但事与愿违,人是有情绪的,尤其是高层领导在不能和你长期接触的情况下,是很容易被刻板印象和情绪所主导。
而且在长期的斗争中,我虽然撕碎了【假大神】的伪装,但在其他同事和高层心中,留下了喜欢争斗,不善于忍受的印象,这是非常不利于我的长期发展的。
撕碎【假大神】的伪装,是因为被压迫等等因素而引发的斗争之心;而证明自身技术能力,是职业需要;其实,对我自身而言,两者之间是没有直接关联的;但在他人眼中,却可能被联系到一起,会认为我是借由打击他人来抬高自己(因为他们根本不会去想,也没有时间去想,你打击的是个真大神还是个假大神),而这样的结果,显然是彼时的我始料未及的。
因此,真的不要轻易去选择斗争,因为斗争的代价,太昂贵了,即便打到敌人,自身也会是伤痕累累,而且敌人未必是你想象中,那么轻易可以被打倒的,说不定倒下是你自己,即便你有更高的技术优势。
这也是很多年长的开发,特别能忍的原因,我想,如果是今天的我,面对当年的情况,我也会选择忍耐,一直忍耐。
而这个故事的结论则是,能力不足的C++开发也会欺辱能力很高C#开发。也就是说,C++开发是无差别的欺辱C#开发。
部分C++开发更像工人
经过多年的经验和经历,我总结出来,部分C++开发更像工人,而不像程序员,也许是因为C++过早出现的原因。
很多C++开发,给别人提供DLL的时候,都不给文档,甚至连口头说明都没有。
因为,他们不习惯配合,不习惯共享,不习惯拥抱变化,当然,这也和工人很封闭的流水线思想很一致。
这部分C++开发在带新人的时候,也像工人一样,有【带会徒弟饿死师傅】的想法,所以,他们都吝啬的传教技术。
并且这种C++工人的特质,是会传递的,所以,即便是思想更开放,视野更优秀的90后的C++开发,也会因为遇到这样的师傅,而变的更像工人。
我们可以看到很多工人是任劳任怨的,这是优点,但优点伴随着缺点,那就是工人是习惯颐指气使的,他们不仅习惯别人的颐指气使,也习惯颐指气使别人。
而我的亲身经历是,我的一些同学,因为在工厂上班,原本青春飘扬的知识分子,在十几年后,变的和农民工一模一样,那说话的语气语调,对事物的认知态度,根本和当年判若两人。
对于C++工人,我还没见过,有变成跟农民工一样的气息的。但确实,气息是真的很接近,区别可能就是穿的更好一点,骂街这种事,对他们而言就是常规的语言输出。
这一点我在上一篇文章《一个C#开发者重温C++的心路历程》的评论里,再一次深刻的感受到了。
虽然有很多C++开发温文尔雅的回复,证明了C++开发的高素质,但也确实有更多的C++开发直接骂街。
也许是林子大了,真的什么鸟都有,而且成群结队。
经验分享:【当你听到C++开发需要更多思考,C++工作强度更大,C++开发是底层工作,C#做不了C++能做的事的时候】等等证明C++更高级的言论时,切记不要生气,不要反驳,因为对方一定是个菜鸟,他即不了解C++也不了解C#,而你能听到这样的言论,说明你的水平已经远远在对方之上了,因此,你的反驳,其实是在教导对方学习,这很吃亏。
能力不足的C++开发会欺辱能力不足C#开发的更多相关文章
- 无责任Windows Azure SDK .NET开发入门篇一[Windows Azure开发前准备工作]
一.Windows Azure开发前准备工作 首先我们需要了解什么是 Azure SDK for .NET?微软官方告诉我们:Azure SDK for .NET 是一套应用程序,其中包括 Visua ...
- [敏捷开发实践](2) 用于开发和维持复杂产品的敏捷开发框架Scrum
[敏捷开发实践](2) 用于开发和维持复杂产品的敏捷开发框架Scrum 1,Scrum概述 上篇中提到敏捷开发有两种主流的方法,一个是XP,另一个是Scrum,本篇简要介绍Scrum方法.Scrum是 ...
- 跨平台移动APP开发进阶(二)HTML5+、mui开发移动app教程
前端开发APP,从HBuilder开始~ 序 通过 HTML5 开发移动App 时,会发现HTML5 很多能力不具备.为弥补HTML5 能力的不足,在W3C 中国的指导下成立了www.HTML5Plu ...
- 微信小程序开发平台新功能「云开发」快速上手体验
微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...
- .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块
.Net Core ORM选择之路,哪个才适合你 因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...
- 深度剖析:最新云端开发工具如何实现敏捷+DevOps开发落地
相信很多软件开发人员们对今年国内新兴的云端开发工具——华为软件开发云都有耳闻,有些人可能还免费体验过,由于它5人以下的团队是免费使用的,很庆幸本人的这个项目正好5个人,就注册使用了.下面就自己的使用心 ...
- 在树莓派上开发SpringBoot 之使用VSCode远程开发
一些运行在ARM单板电脑上的IoT应用通常会提供RESTful风格的API接口.本次的文章记录如何在本地电脑上通过VS Code的远程开发功能,在树莓派端创建一个SpringBoot工程,并实现调试和 ...
- 《C#微信开发系列(Top)-微信开发完整学习路线》
年前就答应要将微信开发的学习路线整理给到大家,但是因为年后回来这段时间学校还有公司那边有很多事情需要兼顾,所以没能及时更新文章.今天特地花时间整理了下,话不多说,上图,希望对大家的学习有所帮助哈. 如 ...
- C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询
前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...
随机推荐
- nginx的access log按小时生成
1.在server或location段进行配置 if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})&q ...
- [Luogu P1658] 购物
题目链接 这道题的主要思想是贪心. 题目的要求用几个硬币将1~x的数都能够凑出的最少硬币个数.这里注意一下是都凑出而不是同时凑出. 先讨论什么时候无解.所有的自然数都可以用1堆砌而成.换而言之只要有1 ...
- numpy基础一
常用,常忘 1.随机矩阵 np.random.rand(4,3) array([[ 0.06679473, 0.71073515, 0.5694172 ], [ 0.95018143, 0.60161 ...
- Simple Problem with Integers(POJ 3486)
A Simple Problem with Integers Time Li ...
- mysql报错码code=exited,status=2的解决方案
由于电脑死机,导致MySQL无法重启. 解决方案看官方文档,设置完后重启失败,再把innodb_force_recovery = 1去掉就可以了 https://dev.mysql.com/doc/r ...
- 1617:转圈游戏 ybt
1617:转圈游戏 时间限制: 1000 ms 内存限制: 524288 KB提交数: 540 通过数: 326 [题目描述] nn 个小伙伴(编号从 00 到 n−1n−1 ...
- Mybatis 批量操作-删除、修改和查询
批量操作的核心就是一次传入多个数据然后进行相关操作,增删改查中掌握其中一个,其它的就可以举一反三,触类旁通.它之所以执行效率高,是因为合并后日志量(MySQL的binlog和InnoDB的 ...
- python3安装web.py
今天准备测试代理池IPProxyPool获取到ip的质量,在安装web.py的时候遇到了些问题,在此记录一下. 1.安装资料 web.py官网:http://webpy.org/ web.py的git ...
- H5的pushState与replaceState的用法
一.简介 HTML5引入了 history.pushState()和 history.replaceState()方法,它们分别可以添加和修改历史记录条目.这些方法通常与window.onpopsta ...
- oracle行转列和列转行(pivot 和 unpivot 函数,wm_concat函数 )
create table demo(id int,name varchar(20),nums int); ---- 创建表insert into demo values(1, '苹果', 1000); ...