计算机基础知识对程序员来说有多重要_-invalid s
大约08年,我在一家公司写了大约800行代码。这800行代码可以一劳永逸的替代他们已有的二三十万行满是缺陷的垃圾。
事情是这样的:他们搞了个很复杂的系统,我不想讨论这个系统设计的有多烂了;总之,他们需要搞几百个不同的报文,在网络上传来传去。每个报文长短不一,有的可能只需三五个字段,有的得有三五十个甚至更多。由于设计水平问题,绝大多数报文字段数量都很大(换句话说就是没有什么上下文,一切一切都要放网络封包里)。
C数据结构是不能直接在网络上传输的;尤其这个系统有C写的部分,也有java写的部分。因此必须先转换成网络报文,然后才能提交给网卡传输;等对方收到报文后,必须解析这个报文、识别它的数据结构、然后在把它转换回来。
报文类型太多,他们的程序员能力又……嗯嗯,稀烂;所以他们决定,所有这些数据结构都要转换成XML传输,对端收到后,再解析XML、还原数据。
总之,一来一回,他们这每个报文往往需要少则两三百行、多则三四千行代码,这才能完成数据收发工作。几百个数据结构综合起来,代码量轻松破几十万。
总之,因为程序员能力问题,他们这个系统的水平啊……真是一言难尽。
只说一点吧:他们居然把debug版的assert重新定义为空,因为……他们害怕崩溃。
可是,掩耳盗铃就真能治崩溃吗?
有一次,一位同事愣是跨越不知多少层逻辑,把自己的XML灌进了我的执行栈。
程序崩了,找我;打开core一看,我的程序栈被灌了一个一塌糊涂,内容是一个八竿子打不着的XML。我就问这个表格是谁负责的,这才找到他。
然后,这位找到一个一千多行的函数,前面几十行拷到末尾,末尾几十行拷到前面,中间再呼啦删掉几十行……折腾大半个小时,告诉我“好了”。
一运行,程序崩了。崩在他的代码里面。
当时一位和我关系很好的、华为出来的同事实在看不下去了:“你写程序都碰运气的吗?来,看这字符串内容,看它和哪个变量有关……排错是需要逻辑的!哎呀你怎么不用循环?算了算了先排错……”
这位还一脸不忿:“看看!编译错误!我的起码能编译!”
没理他。五分钟后,问题解决。
和另一个组同时接的一个任务,我们一周完成,然后找经理要第二个、第三个任务,等做到第四个甚至第五个任务了,这个组终于姗姗来迟,完成了自己的任务——然后装的很努力的样子,星期天到公司加班联调。
然后,他们十万火急的喊我去公司,说我程序有bug;问是什么bug,不答。过去一看,需求没写清楚,只说某个字段是一个字符串;我按C惯例,后面留了个\0;他们认为这里不应该有\0,五六个人就干等我过去……
删掉\0,数据传输正确,对方的模块立刻崩溃。检查再三,数据没问题,他们自己写出bug了——这个谁负责的?他来了没?出差了?那调不了,大家先玩吧。
就这么个工作态度。
可想而知,这个系统会是什么水平。
总之,不吐槽他们了。先解决问题。
这个问题我是这么分析的:
1、基本数据类型有限
事实上,每种不同的数据类型,打包/解包流程全都一样。因此不应该每个报文从头敲代码,重复劳动太多了。
如果把它们写成诸如int2xml/xml2int、str2xml/xml2str,那么代码量就会大幅降低。或许不到十万行就能解决问题——等于代码量下降到原来的1/3甚至1/4。
事实上,C++支持泛型。完全可以统一搞成个var2xml/xml2var,类型推导系统会自动推导出正确类型、生成正确的代码——至多针对特殊数据类型做一点特化。
这样基础数据的打包/解包操作会更简单,代码量可以进一步降低——因为无需判断数据类型了,对每个字段调用var2xml(s.item, str_buf, buf_len)就行了,泛型系统会自动选择正确实现。
用这种方法写,或许三五万行代码就能解决问题。
2、所谓数据结构,其实不过是基本数据类型的组合
因此,如果可以让程序“知道”某个数据结构里面的每个字段的偏移位置以及数据类型,那么完全可以统一处理所有报文。
比如说吧:
struct login {
char username[20];
int ID;
}
如果程序能从login这个类型,知道它的开头是20个字节的char数组、然后第21个字节开始是一个int的话,自动从login转换成xml报文或者从xml报文重建login,就是很简单的一件事了。
(用size_of就可以知道int的大小,这也方便不同平台之间迁移。如果需要固定字节数,可以声明为int_16/int_32等。)
但是,C++本身是支持不了这个的。怎么办呢?
学MFC,玩宏:
DECLARE_TABLE(login)
DECLARE_TABLE_ITEM(login, username, char, 20)
DECLARE_TABLE_ITEM(login, ID, int)
END_TABLE_DECLARE(login)
用这个方式接管struct声明过程,我们就可以在宏里面玩猫腻了。
我的做法是,DECLARE_TABLE里面其实没有生成login这个struct,而是声明了一个login_details的数组;然后DECLARE_TABLE_ITEM其实是在初始化这个数组,把不同偏移位置的数据类型记录下来。
直到END_TABLE_DECLARE这行,login这个struct才真正建立。
然后就简单了。写一对模板函数struct2xml/xml2struct,利用模板推导,自动查找typename##_details数组(这个##是gcc的扩展,用来拼接字符串),关于typename的细节就到手了。然后逐项处理这个数组,自然就完成了打包/解包工作。
这个东西类似于后来名声显赫的protobuf;只是我那时技术视野还不够宽广,仿效对象是不够优雅的MFC。因此缺陷颇多,看起来诘屈聱牙,还用了gcc的关于宏的一些非标扩展,较难维护。等后来见了ORM和protobuf的实现思路之后,我才知道自己的笨拙。
它一共花了我两三周时间,写了800多行代码。照例,一次编译通过,测了一周,完美支持各种报表数据;而且在设计之初就选用了效率最高的方案,0额外内存占用,也没有额外的读写负担。
现在,只要把原始的结构体声明替换成这么一组DECLARE宏(可以写一个小程序转换),然后需要xml时调用struct2xml,需要从xml还原时先识别报文类型再调用xml2struct——还是那句话,无需区分,无需记忆,类型推导系统会自动帮你选择。
现在,让我们对比一下。
过去,为了打包/解包这些报表,按共200个报表(其实还不止这么多……人家的设计就是信手画个蜘蛛网,一个心跳处理都能画十几个方块、几十条线路,包含若干种不同报文)、每个报表有二十个字段、每个报表打包解包一两千行算(因为每个字段都要复制,要在xml中记录和校验长度,要写日志方便追查执行流程;而且网上收到的每个xml报文都需要先解析xml、确认每个字段名称;加上他们很多人不用循环,写的又臭又长,每个字段用五十到一百行代码完成打包/解包并不算多。注意注释也算代码行数),共需20到40万行代码。
四年共1460天,208周;那么按三十行代码算,一个人必须每周开发1400多行代码,才能写完这些代码。
然后,这每周1400行代码,又得多少测试,才能堪堪够用呢?
要知道,很多名校毕业生,写一两千行代码就得两三个月;然后为了测这个代码,又得来来回回反反复复折腾两三个月甚至大半年的,就这样都还bug不断。
哪怕这1400行代码因为太过平铺直叙所以成了熟练工的体力活,起码也得另外的一周测吧?
要按之前那个拷来拷去排错流搞法,那可不是另外一周。那是一周测出N个bug,每个bug都要花一两周定位到人、然后再花个把月修复……然后再修出新的bug,在解决新的bug的过程中,旧的bug又莫名其妙的回来了……
别笑。这些人就是这么工作的。所以这个项目在我加入时已经被200多人开发了一年半——但里面毛病太多了。因此直到我离职,仍然没有半点眉目。
而我这800行代码,写完再不用动。想找出所有bug,是不是容易太多?
然后,随便你想个什么报文,用DECLARE宏一声明,struct2xml然后发送,或者先接收、识别报文类型然后xml2struct解包……搞定。回家爱干嘛干嘛吧。
你看,这只是编程语言基础知识的一点小小应用。会了,你就可以955、然后用三周时间的800来行代码,碾压别人007连轴转、每周1400行代码忙碌四年的成果。
而且,800行代码可以一次写出0bug;每周1400行代码写四年,又岂是另外一个四年能抓尽bug的。
你省心省事,老板得了实惠——别人上千万都搞不定的,到你手里一个月不到搞定,帮他一下子省了99.9%的支出,又帮他抢在潜在竞争对手之前搞定上市:你觉得这东西应该值多少钱?一个能带着整个团队、以最有效率的方式直线达到目标的技术专家,相比于那些“一将无能,累死千军”之徒,哪个用起来更合算?
当然,这只是个简单案例。因此一个基础知识掌握较好的“仅仅”以5、60倍的效率碾压了那些基础知识没有很好掌握的。稍微复杂一些的情况下,好程序员效率百倍于差程序员的情形,都是业内人士司空见惯的。
2020-9-3补充:
玩过的都知道,XML封装起来很方便,但解析嘛……
要么,解析库会先跑一遍,把它整成一棵“树”,然后用户按需读取每个分支、每个节点(但有时存在一些数量不定的数据,比如携带的某种数据可能是0条、1条或者N条,因此必须按一定顺序读取)。
这个做法直观,方便什么都不懂的初学者使用 ,但效率较低。 因为要先开辟内存、解析XML填充树结构,然后再访问这棵树,访问完了再删除树;等于多了至少一次内存分配/归还操作、多了一遍为了建立解析树的读写操作、也多用了一些内存。
要么,库识别tag,你在回调里按顺序边读边解析边填充到C结构里。
这种效率更高,因为只需访问一次;但必须自己注意嵌套结构何时出现、到了第几层、遇到结束符如何返回,等等。它需要你熟知各种基本算法,对技术不高的初学者来说难度较高甚至无法理解;对学艺不精的工程师来说较为复杂,一不留神就会出错。
顺便的,我看到这个回答下有人认为这和“计算机基础知识”无关。嗯……我不知道他是业界大佬呢,还是单纯的看不懂……
可为什么之前我回答这个问题,又引的一票子人跳出来说我理想说我低端呢?
如何看待阿里 P8 加面 coding 环节,而 P7 却做不出头条算法题?
为什么他们暴跳如雷呢?
因为他们觉得leetcode的这种题目钻牛角尖、过难、无聊:
恐怕任何懂点编程技术的都不会觉得这种题目配叫hard吧 ?
这不是想都不用想的基本操作吗?我平常用太多以至于都忘了这居然也配叫算法了 。
别说这种题目太简单以至于我不觉得它配叫算法;其实我搞这个东西,自己都没觉得它用了什么算法。对我来说太简单太不值一提了。
倒是很多人做不到、只会出苦力,这反而令我惊讶。
可是,这种难度的leetcode题目你都搞不定的话,我这随随便便的、一边解析XML文本树、一边借助另外一套数据结构从XML重建C struct的混合操作(而且这套数据结构还是借助简单的宏入口自动产生和填充的、可以自动适配任意网络封包),你怎么可能看懂?
实实在在的、简单纯粹的树你都搞不懂;它可是针对尚不存在的、用户自定义数据结构而编写的、自动把用户数据结构序列化成树以及自动从序列化状态的树中解析重建用户数据结构的一套东西啊。
你起码得先能想象它如何处理某个特定的数据结构,这才可能看懂它的序列化/反序列化思路;然后你还得能搞明白遇到不同的数据结构它会有什么不同表现,这才能真正读懂它。
这东西,对我的确不难。容易到我在回复中都认为它仅仅是“玩转了语言基本概念”而已,根本不觉得它涉及任何算法问题。
但是没想到,它居然包含不少leetcode上足以称为hard++的算法——那些比它容易得多的算法居然都会被很多人称为“钻牛角尖”。
如果那居然都能吓倒你、让你觉得那是“屠龙技”;那么这种被我当成不值一提的“杀狗术”、随随便便拿出来就用了的东西,你该如何对待?
我在会议室侃侃而谈时,你怎么可能不打瞌睡?
别说通常开会时,我谈的都是还没写出来的、自己认为可行的思路了;对着写出来的这800行代码一行一行讲给你听,你能听懂?浪费彼此时间而已。
这种情况下,你怎么可能不遭遇中年危机?
出苦力你一身职业病,比得过精力充沛的小年轻?
出巧力……你摸得到门槛吗?要知道这东西我可真没觉得存在一丝技术含量在里面,全都是自然而然想到就写的东西;结果比这个容易得多的leetcode链表题,在你们眼里居然是钻牛角尖的、不事先背题就没人能搞定的屠龙技?那当我们讨论我们眼中的难题时,你站哪儿合适?哦不,你适合进会议室吗?那你转的哪门子管理?你想管谁?你有资格管谁?
因此,他们在的地方,我不会去。丢不起那人,也憋屈。
而我去的地方,他们去不了。别说跟上节奏了,打个下手做个测试都不够格。
连我都跟不上……须知比我强的人,可谓车载斗量。
你看,这就是计算机基础知识的重要性。这就是为什么我敢说“不懂基本算法的根本就是滥竽充数的南郭先生”的原因。
评论区
松直: 何止是没有基础知识,纯粹就是懒得动脑。一个程序员在写出多次以上的重复代码的时候就应该想着怎么去优化。 👍🏽985 💭N/A IP 🕐2020-05-27 22:05:50
│ └── invalid s: DRY原则——Do Not Repeat Yourself。 👍🏽155 💭N/A IP 🕐2020-05-27 22:06:24
│ │ └── 狄利克雷: 为什么不是DNRY 👍🏽1 💭N/A IP 🕐2020-05-28 08:04:55
│ │ └── 浅薄: 可是我们不能一次就写出这样的代码呀,我们应该先把主要任务完成,然后再进行逐步优化吧 👍🏽0 💭N/A IP 🕐2020-05-29 22:45:49
│ │ │ └── invalid s: 架构设计是在编码之前就要做好的。这是常识。逐步优化=不优化。 👍🏽23 💭N/A IP 🕐2020-05-29 22:52:42
│ │ │ └── invalid s: 随便的,你的确可以花4年编码,再花4年测试,然后“逐步优化”。但是,8年后,我3周完成的那个系统都已经升到8.0版了。你再做个比我1.0版都差的破烂出来,是想笑死你的竞争对手吗? 👍🏽48 💭N/A IP 🕐2020-05-29 22:54:31
│ │ │ └── invalid s: 别总以为你有试错机会。你没有。公司更没有。哪怕按月薪10k算,200个人干一年,你知道是多少钱吗?2400万!这就是试错成本。 👍🏽24 💭N/A IP 🕐2020-05-29 23:11:31
│ │ │ └── 浅薄: 好的,受教了 👍🏽0 💭N/A IP 🕐2020-05-31 10:16:28
│ │ └── 贾晓鹏·元智珠算: 很多时候,宏替换与正则替换,即可。真的! 👍🏽0 💭N/A IP 🕐2021-01-19 16:15:30
│ └── 松直: 当然,他们可能不是不会,而是觉得每天复制粘贴一下代码就可以领到工资,为何还要“多此一举” 👍🏽253 💭N/A IP 🕐2020-05-27 22:07:51
│ │ └── invalid s: 这个公司我吐槽过。人家按代码行数算KPI。也就我这种格格不入的傻冒才会想办法彻底解决问题…… 👍🏽950 💭N/A IP 🕐2020-05-27 22:09:45
│ │ │ └── 博得: 哇。。。按代码行数算kpi那可以考虑写一个自动生成废话代码的代码了。。。 👍🏽226 💭N/A IP 🕐2020-05-28 05:44:56
│ │ │ │ └── calm: 还真有这种公司存在。。。。 👍🏽11 💭N/A IP 🕐2020-05-28 07:35:38
│ │ │ │ └── 叶梓翎: 自己写段精简代码自己留着,然后跑自己的代码扩展器把代码扩展成等效的垃圾代码,以此提高KPI[惊喜] 👍🏽15 💭N/A IP 🕐2020-06-15 20:29:24
│ │ │ │ └── W.D: 可以写一个自动生成自动生成废话代码的代码的代码 👍🏽1 💭N/A IP 🕐2020-09-22 13:02:24
│ │ │ │ └── 光辉岁月: 多写几个没用的函数 越长越好[飙泪笑] 👍🏽1 💭N/A IP 🕐2021-01-04 13:00:05
│ │ │ │ └── momo: 想起以前阿里就是[捂脸] 👍🏽0 💭N/A IP 🕐2025-02-13 15:53:47
│ │ │ └── 绳床瓦灶: 跟我们公司一样 👍🏽6 💭N/A IP 🕐2020-05-28 07:10:22
│ │ │ └── 张伟: 你这是砸人饭碗啊 👍🏽27 💭N/A IP 🕐2020-05-28 07:19:52
│ │ │ └── 一口箱子: 那就是管理上的问题了,用代码行数考量业绩,这工农公司老板怕是从车间来的吧? 👍🏽64 💭N/A IP 🕐2020-05-28 08:19:41
│ │ │ └── 志民: 恭喜你成为“工贼”。 👍🏽24 💭N/A IP 🕐2020-05-28 08:44:51
│ │ │ └── Spliendid: 还有这样的公司,牛逼 👍🏽5 💭N/A IP 🕐2020-05-28 10:45:58
│ │ │ └── 尚武精神下午困: 震惊了,这样的话写一堆没用而又不影响运行的代码岂不是美滋滋 👍🏽20 💭N/A IP 🕐2020-05-28 11:07:41
│ │ │ └── 云天明: 还有按照代码行数算kpi的?真是大开眼界 👍🏽14 💭N/A IP 🕐2020-05-28 12:04:02
│ │ │ └── 包子: …写得行数越多,收入越多?…我惊了 👍🏽8 💭N/A IP 🕐2020-05-28 12:24:09
│ │ │ │ └── 星罗泽: 这就不用纠结大括号写法的问题了[捂脸] 👍🏽0 💭N/A IP 🕐2020-05-30 08:46:45
│ │ │ │ └── 躁君: emm,如果写个自动重复生成代码的代码,还不放在主代码的逻辑内,不影响运行……[惊喜] 👍🏽0 💭N/A IP 🕐2021-10-14 10:43:22
│ │ │ └── 流浪在网上: 卧槽,卧槽,原来按代码行数算KPI不是段子,是真有这回事[捂脸] 👍🏽22 💭N/A IP 🕐2020-05-28 14:14:21
│ │ │ └── 半山獾郎: 王小波的老板就是这样的,所以他猛拍回车 👍🏽15 💭N/A IP 🕐2020-05-28 16:36:50
│ │ │ │ └── 什么七七w: 没想到在这里看到黄金时代的读者。 👍🏽0 💭N/A IP 🕐2021-09-09 21:23:05
│ │ │ └── 超次元复合加强型路灯: 行数算KPI… 我不写循环了!全摊开! 👍🏽24 💭N/A IP 🕐2020-05-29 06:48:35
│ │ │ │ └── 夜影: 这还有个伏笔呢 答主同事提到"…哎呀你这里怎么不用循环?…" 就是因为这个啊233333 👍🏽31 💭N/A IP 🕐2020-05-29 09:17:05
│ │ │ │ └── invalid s: 那位是不会用循环……但是公司环境合适,对他来说那是如鱼得水。 👍🏽11 💭N/A IP 🕐2020-05-29 10:18:38
│ │ │ └── 我将带头提桶: 我一个helloworld能写一万行。[机智] 👍🏽13 💭N/A IP 🕐2020-05-29 08:26:57
│ │ │ └── 知乎用户L3G2pk: [捂脸]这样的公司,是怎么生存下来的? 👍🏽4 💭N/A IP 🕐2020-05-30 19:40:42
│ │ │ │ └── invalid s: 吃偏食。上面有人。 👍🏽14 💭N/A IP 🕐2020-05-31 00:29:22
│ │ │ └── 智商余额测不准: 我就说么,这个\0bug怎么这么眼熟。你在另一个答案里也提到过了 👍🏽0 💭N/A IP 🕐2020-06-01 09:20:05
│ │ │ └── 罗小笨: 你用你的聪明才智,成功的少赚了好多钱 👍🏽13 💭N/A IP 🕐2020-06-02 08:35:43
│ │ │ │ └── invalid s: 哈哈哈 👍🏽7 💭N/A IP 🕐2020-06-02 13:21:20
│ │ │ └── 黄裳: [飙泪笑]按行数算kpi是这一切的根源。 👍🏽6 💭N/A IP 🕐2020-06-10 05:37:14
│ │ │ └── Arcret: 就因为有这种公司才会出现if elseif elseif… 写的奇数判定函数 👍🏽2 💭N/A IP 🕐2020-09-27 14:00:01
│ │ │ └── 陆离: 哈哈哈哈哈哈哈哈想起了那个知乎问题 👍🏽0 💭N/A IP 🕐2020-11-25 13:58:10
│ │ │ │ └── 贾晓鹏·元智珠算: 哪一个啊?讲讲无妨 👍🏽0 💭N/A IP 🕐2021-01-19 17:24:04
│ │ │ └── 三爷: 如果对自己未来有追求有信心没必要迎合这些制度,会把掉 👍🏽0 💭N/A IP 🕐2021-09-09 15:58:38
│ │ │ └── 尘星八级: 要是有人穿越回到那一年,用现在的自动生成代码工具来搞这些几千行代码的KPI,生活不要太滋润 👍🏽0 💭N/A IP 🕐2021-10-11 02:00:23
│ │ │ └── nightwonwon: 这样算KPI的,这老板作死啊,要么就是行政傻子 👍🏽0 💭N/A IP 🕐2021-10-13 11:15:26
│ │ │ └── 黑白键: 真的假的?那这样我写的东西以后保证看不一个循环语句,标点符号我都另起一行[语塞] 👍🏽0 💭N/A IP 🕐2021-12-13 17:22:02
│ │ │ └── 蚊子: 按代码量算kpi,不写成这样才怪,要我我也写成这样 👍🏽0 💭N/A IP 🕐2022-07-21 08:30:07
│ │ │ └── 沧海桑田: 按行数就很业余 👍🏽0 💭N/A IP 🕐2025-02-03 15:37:21
│ │ │ └── 雨镜: 合理起来了[赞] 👍🏽0 💭N/A IP 🕐2025-02-12 14:13:59
│ │ └── invalid s: 但是,怎么说呢,着重于眼前利益,的确是复制粘贴好,省力又能拿奖金;但为咱本人的前途着想,还是勇猛精进点好。起码不怕离开它没饭吃。 👍🏽344 💭N/A IP 🕐2020-05-27 22:11:13
│ │ │ └── 鄂英明: 办事讲方法,干活有脑瓜儿,答主善于动脑思考,提高效率,节约时间,同样难度的一个案子,可能别人还在排错阶段,你都在旁边喝茶水了,当然也是开玩笑,但是善于动脑节约时间,省脑筋,出发点还是值得学习的。 👍🏽3 💭N/A IP 🕐2020-05-29 10:09:08
│ │ │ └── 洪荒太初: 用破办法省事的人是没有未来的 👍🏽0 💭N/A IP 🕐2020-07-21 16:05:12
│ │ │ └── 南十字星: 居然还有这种傻缺公司?按行算钱我能把代码堆到他公司倒闭。 👍🏽5 💭N/A IP 🕐2020-09-06 16:51:24
│ │ │ └── 黑洋葱: [赞]做自己就好。没有价值观的人,长期是坑自己 👍🏽1 💭N/A IP 🕐2020-11-25 08:04:17
│ │ │ └── 身后城已旧: 程序大佬[思考] 👍🏽0 💭N/A IP 🕐2022-09-13 19:48:42
│ │ │ └── 西风烈: 人家可能写出来你的优化方案,能力得到了锻炼,只是为了兼顾眼前利益,没上线。[大笑] 👍🏽0 💭N/A IP 🕐2025-02-13 00:15:24
│ │ └── musaly: 还有一个原因,代码多显得在干事,有些不懂的领导是这样的[捂脸][捂脸][捂脸] 👍🏽126 💭N/A IP 🕐2020-05-27 22:54:47
│ │ └── tq13: ttt 👍🏽0 💭N/A IP 🕐2020-05-28 11:07:25
│ │ └── 残酷月光: 我们只有在不公平的环境中奋斗,在与不公平的斗争中完善,才能升华我们的人生价值,成就不凡的生命 👍🏽0 💭N/A IP 🕐2020-06-01 16:11:57
│ └── 松鼠: 核心写法重复超过三个地方 我就开始考虑怎么偷懒不想再写那么长何况这种纯粹的机械堆代码 那完全是对程序员一种侮辱 👍🏽94 💭N/A IP 🕐2020-05-28 02:40:37
│ │ └── 土木逃兵: 我觉得还不是因为钱。。。 👍🏽1 💭N/A IP 🕐2020-05-28 08:45:55
│ └── 葉潵湫湖: 对,当我遇到这种情况的时候,我会有本能排斥 👍🏽3 💭N/A IP 🕐2020-05-28 10:17:30
│ │ └── invalid s: 哦……前些天我在知乎上说,正常公司在code review时,哪怕三行结构重复的代码都会引起注意,都要考虑一下是否应该复用……然后某个牛X烘烘的带程序员说,你们神经病。 👍🏽21 💭N/A IP 🕐2020-05-29 10:17:24
│ └── Eugene: 我觉得锅主要还是architect,到程序员这个层级大家一个ticket 一个ticket做过去很难在宏观上优化。比如我的task 就是写一个数据的解包我不会知道别人也写了。然后peer code review 也很重要 👍🏽7 💭N/A IP 🕐2020-05-28 13:58:27
│ └── 你信我不信: 确实,现在好多公司考核绩效居然按代码量计算。。。这点真的是 👍🏽11 💭N/A IP 🕐2020-05-29 12:57:42
│ └── 芸草hthzkjh: 不要说程序猿了,我一个学生编译十来个.cpp三次以上就疯了……makefile不香吗…… 👍🏽6 💭N/A IP 🕐2020-05-29 15:51:29
│ └── 喵喵: 赞同 👍🏽0 💭N/A IP 🕐2020-06-11 07:49:45
│ └── 海韭: 封装和继承的乐趣,对于CV型程序员真的夏虫不可语冰。 👍🏽2 💭N/A IP 🕐2020-09-06 20:20:12
│ └── 越来越无语: 你优化完代码之后,没什么bug了,老板把你优化掉了[思考] 👍🏽7 💭N/A IP 🕐2020-09-28 18:59:50
│ └── Flow: 感觉是Programming Language/Compiler方面的知识…本质上是需要实现一个compiler把不同报文格式统一到同一种中间表示(通常是in memory的,用vector, map之类的实现),然后根据需要再加相应的serializing adaptor… 该公司以前的做法应该算一种蹩脚的 “Test Driven Development” 👍🏽2 💭N/A IP 🕐2020-10-28 23:40:49
│ └── 知乎用户Mbm08p: 有些性能敏感场景徒手展开循环也正是一种优化…吧?[思考] 👍🏽0 💭N/A IP 🕐2021-03-14 09:22:28
│ │ └── 松直: 编译器会做的(如果有必要且有编译器的话) 👍🏽0 💭N/A IP 🕐2021-03-14 09:31:18
│ └── CoderV: 核心要素还是懒[惊喜][惊喜]优秀的程序员对自动化都是有追求的 👍🏽0 💭N/A IP 🕐2021-09-18 16:16:52
省身: 哈哈,读到一半就觉得应该用protobuf, N年前在鹅厂也做过一个类似protobuf的东西,后来google开源出protobuf, 发现别人做得的确比我的好。 👍🏽299 💭N/A IP 🕐2020-05-28 00:49:04
│ └── Raynor: tdr还是不错的,比如refer约束就是pb没有的。当然也有些缺点,比如不支持optional,造成协议复用困难等问题。 👍🏽5 💭N/A IP 🕐2020-05-28 01:13:13
│ └── invalid s: 嗯嗯,入门程序员的标准做法…… 👍🏽24 💭N/A IP 🕐2020-05-28 01:24:34
│ └── 饼叔: 嗯,我也想说,开了个开头就知道,用protobuf之类就能解决问题,不过08年也的确是xml当道的时候 👍🏽0 💭N/A IP 🕐2020-05-28 03:19:03
│ └── 么吱吱: 跟我想到一块去了,哈哈哈 👍🏽0 💭N/A IP 🕐2020-05-28 08:25:45
│ └── 悲笑百年: Tdr很好用啊,尤其在游戏开发上,主要是pb不支持共享内存 👍🏽0 💭N/A IP 🕐2020-05-28 09:14:00
│ └── 纷飞: 现在的我第一个脑海中复现的就是protobuf[吃瓜] 👍🏽0 💭N/A IP 🕐2020-05-29 18:51:23
│ └── 霜之小刀: protobuf+grpc 👍🏽1 💭N/A IP 🕐2020-05-30 10:23:44
│ └── 代睿: 不会是jce吧… 👍🏽0 💭N/A IP 🕐2021-09-10 12:50:02
│ └── 左马介: 思考,时刻思考 👍🏽0 💭N/A IP 🕐2021-11-29 18:11:23
│ └── HumpHub: [捂脸]我刚毕业做的第一个项目就用到这个,以前听到没听说过,学了一周grpc,最后先写proto文件,再写服务端,最后写客户端拿来测试 👍🏽0 💭N/A IP 🕐2023-05-13 13:15:23
│ └── 糖与不糖: 谢谢,学到了。。[飙泪笑] 👍🏽0 💭N/A IP 🕐2024-02-07 23:49:33
│ └── 人格独立: protobuf很精巧 👍🏽0 💭N/A IP 🕐2024-02-26 14:39:42
hakase: 搞过类似系统,直接写了一个全能python生成器,自动生成报文类型传输网络的C++代码,一劳永逸。 👍🏽156 💭N/A IP 🕐2020-05-27 23:41:28
│ └── 风之帆: 这种得看工资。如果工资本身就不高,就别怪他们了,人家本来就没想赚那个钱。这主要是领导的问题,又想省钱又想干大项目。 👍🏽7 💭N/A IP 🕐2024-06-28 20:32:12
invalid s: 其实日常工作中,类似这样“通过动脑子,用少量代码完成大量功能”,从而得到比机械编码的程序员几倍效率的案例无处不在。甚至,同是机械编码,文中提到的我那位华为的同事就明显比另一位同事效率高的多得多——后者一个函数写1000行、靠大段大段的调换代码位置甚至删除代码来“排错”;而前者呢,哪怕是他人写的、他不熟悉的代码,他都能5分钟不到完成错误定位,一口气修复了五六个错误,把对方的代码修改正确。那么,同样的功能,让这两个人比赛编码,会如何呢?恐怕1000行那位敲不完200行,这位已经写完、编译、0 warning 0 error通过了。而1000行那位想要通过随机删除、调换次序把那隐藏在1000行代码里的五六个错误修改掉……这恐怕是复杂度堪比“一只猴子敲键盘敲出欧亨利短篇”的困难任务了。两者效率,说相差千倍,不算夸张吧?当然,那位是特例。我们压根就不应该承认那位1000行码农会编程。但是,在“1000行”和“5分钟从初学者乱七八糟的1000行代码中定位所有五六个错误、把它彻底改正确”之间,显然存在一个极为辽阔的空间。你,在这个空间之内吗?站在哪个位置?还是已经突破了上下限? 👍🏽102 💭N/A IP 🕐2020-05-29 10:51:33
│ └── 光辉岁月: 在校大学生一枚 我想问一下 身边很多人都说 0 error就行 warning不用管。请问是这样吗 👍🏽2 💭N/A IP 🕐2021-01-04 13:01:53
│ │ └── invalid s: 按软件工程师的标准,就应该把所有warning当error对待;不光要warning free,还要上lint类工具、用最严苛的lint类规则,做到整个项目lint free。lint是一个深度分析代码逻辑、自动警告疑似逻辑错误或者易错写法的程序。现在lint警告已经被很多新的编译器集成了。诸如“无符号数转有符号有可能溢出”就是lint警告。 👍🏽42 💭N/A IP 🕐2021-01-04 13:14:07
│ │ └── momo: 感觉 lint 适合新项目,没有 lint 过的旧项目开个 lint 会出现成千上万个警告[捂脸] 👍🏽3 💭N/A IP 🕐2021-05-23 11:56:57
│ │ │ └── invalid s: 那就是隐患。。。lint其实非常适合用作入门学习工具。代码中每一个lint警告都搞清楚来龙去脉,搞明白为什么会有警告、为什么要警告,而不是简单的搜一下绕过去就算,可以尽快帮初学者走出撞大运编程的低水平状态。正常来说,业界中等水平公司的代码就应该lint free了。反过来说也对:如果一家公司的代码满是lint警告,哪怕它的程序能够正常工作,这家公司的前景也不会特别好。 👍🏽28 💭N/A IP 🕐2021-05-23 16:44:37
│ │ └── 叶星辰: 部分warning还是不适合当error,比如声明一个忘了用,报unused 👍🏽1 💭N/A IP 🕐2021-05-29 23:21:10
│ │ │ └── 吃剩的鲷鱼烧: 参考一下golang的语法 unused 变量是编译错误的 👍🏽0 💭N/A IP 🕐2021-06-03 08:23:26
│ │ │ │ └── 叶星辰: 感觉这个没意义 👍🏽3 💭N/A IP 🕐2021-06-03 08:30:28
│ │ │ │ └── 雨辰: 如果有很多个声明没用到,甚至函数定义出来没用到呢?这代码你觉得好维护吗? 👍🏽0 💭N/A IP 🕐2022-05-10 04:28:28
│ │ │ └── invalid s: 我这个答案提到的bug,其实有一个unused警告就能直接暴露出来:https://www.zhihu.com/question/352626424/answer/877007574很多时候,声明一个变量却不用、或者声明变量、赋值、然后再也没下文了——这都意味着严重的逻辑bug。哪怕最终并没有bug,只是声明这个变量时没考虑周全、后面改主意了;那么删掉这个变量、去掉无用的赋值,起码也能节约一点点内存、减少一点点消耗。 👍🏽6 💭N/A IP 🕐2022-05-30 00:45:26
│ │ └── LJS80: lint是非常有必要的,从现在来看,把它从编译器里分离出来可能就是个错误[捂脸] 👍🏽0 💭N/A IP 🕐2025-03-28 22:51:43
│ └── 明末Top1: 老哥,现在ai时代来了,用chatgpt写代码,调试代码,这是不是意味着那些高级程序员的编程壁垒被打破了,现在还有没有必要钻研代码怎么写吗[思考] 👍🏽0 💭N/A IP 🕐2024-07-14 02:42:39
│ │ └── 周太昊: 你要不看看自己在说什么?一点逻辑都没有啊你是高级程序员牛逼的是数十年如一日的 原理积累 问题解决能力的积累你指望靠AI?计算机发明出来你就能比得上数学家? 👍🏽3 💭N/A IP 🕐2024-09-10 08:21:22
│ └── 试题调研数学物理: 我家里六台电脑不见了 👍🏽0 💭N/A IP 🕐2025-05-09 12:42:20
知乎用户YspBdH: 你用三个星期证明了你所有的前辈都是傻逼…基本上这家公司你也就不用呆了[捂脸][捂脸] 👍🏽111 💭N/A IP 🕐2020-05-28 08:57:27
│ └── invalid s: 哈哈哈 👍🏽13 💭N/A IP 🕐2020-05-28 10:17:12
黎潘达: 一个稍稍聪明的程序员比平庸的程序员效率高1000倍,但这一千倍的收益却几乎全由资本家获得。看来比起这些聪明才智,淘汰资本主义才是更重要的。 👍🏽109 💭N/A IP 🕐2020-12-19 07:57:08
│ └── 贾晓鹏·元智珠算: 小管家警告! 👍🏽2 💭N/A IP 🕐2021-01-19 17:19:49
│ └── 来喝温暖的鲜牛奶: 对头[捂脸] 👍🏽1 💭N/A IP 🕐2021-12-30 03:16:41
│ └── 诸神的煌魂: [调皮]一针见血,为什么这么混也能干下去?因为这样也能赚到钱。为什么他们工资大差不差?都取了百分之九十九了当然没差别 👍🏽2 💭N/A IP 🕐2023-07-06 08:46:10
│ └── know634: [惊喜]程序员选择单干 👍🏽0 💭N/A IP 🕐2024-03-15 01:31:32
杨晖: 然而碾压了那些程序员的工作量后,薪资却不能直接加上他们所有人的几年薪资,程序员的悲哀莫过于此。。。[飙泪笑] 👍🏽64 💭N/A IP 🕐2020-05-28 03:31:38
│ └── 幻想时间: 那些人被淘汰了 👍🏽7 💭N/A IP 🕐2020-05-28 12:24:38
│ │ └── 金色海洋: 但是答者离职了 👍🏽13 💭N/A IP 🕐2020-10-30 23:20:54
│ └── 沐沐: 反而普通程序员的普通代码却是面向工位编程[滑稽] 👍🏽1 💭N/A IP 🕐2021-10-31 23:07:51
慕容狐: 我总觉得这是发生在华为的事[捂脸] 👍🏽58 💭N/A IP 🕐2020-05-27 22:09:58
│ └── 从来如此: 华为以自己几百G代码为荣的 👍🏽72 💭N/A IP 🕐2020-05-27 22:17:27
│ └── 知乎用户mu37U2: 哈哈,太真实了 👍🏽4 💭N/A IP 🕐2020-05-27 23:28:58
│ └── 咩呀 咩: 我觉得不是→_→, 👍🏽2 💭N/A IP 🕐2020-05-28 00:36:44
│ └── nowhere: 对接过海思和其他模块芯片厂商,还有他们到开发维护人员,海思无论是芯片手册还是代码水平都不要高太多,代码命名规范、逻辑清晰、一目了然,开发人员个个感觉打鸡血一样,执行力很强,反正我接触到的是这样。 👍🏽56 💭N/A IP 🕐2020-05-28 11:11:32
│ │ └── 慕容狐: 华为太大了 👍🏽2 💭N/A IP 🕐2020-05-28 11:45:01
│ │ │ └── nowhere: 华为那种末位淘汰机制,混技术的是这种水平,应该早被ko了。 👍🏽16 💭N/A IP 🕐2020-05-28 12:37:36
│ │ │ └── 慕容狐: 你错了 👍🏽1 💭N/A IP 🕐2020-05-28 13:04:53
│ │ │ └── 慕容狐: 答主说了,是华为程序员[惊喜] 👍🏽1 💭N/A IP 🕐2020-05-29 12:23:19
│ │ │ └── invalid s: 那个帮人5分钟从1000行代码里找出五六个错误解决掉的,是曾经在华为工作过的程序员。 👍🏽33 💭N/A IP 🕐2020-05-29 15:58:18
│ │ │ └── 慕容狐: 😂😂😂好吧,我错了 👍🏽0 💭N/A IP 🕐2020-05-29 16:02:29
│ │ └── 三箭之誓: 海思的开发维护人员打鸡血的是哪个?总觉得我好像认识···田MJ? 👍🏽2 💭N/A IP 🕐2020-09-24 13:07:11
│ └── 勇哥: 华为不可能的,本身技术人员大部分就是牛逼学校的,代码写完以后,还要拿出来评审,进行代码走查,一两个人是有可能的,但是在代码走查的时候,参与的都是大佬,不可能每个人都看不出代码烂的! 👍🏽19 💭N/A IP 🕐2020-09-03 15:15:23
│ └── 熊猫拍板砖: 了解一下华为C语言开发规范手册 👍🏽2 💭N/A IP 🕐2021-12-23 17:49:31
赖嗒咕咕叮: 同感,之前有家公司的业务涉及大量SQL,代码里面各种组SQL的语句,某个人要是修改了数据结构或者是表结构,那么完了,上午还能跑的系统下午就各种问题,得改N条的SQL语句,测试还得重新覆盖,在没有自动化测试的系统中,这就是灾难一样。ORM这种好东西,居然没有人懂。关于XML的吐槽数不胜数,除了可供阅读之外想不出有啥过人之处,冗余之多、可扩展之差、读写速度之慢令人发指,一份数据在不同语言、不同平台之间需要反复序列化和反序列化的操作,遇到大文件系统直接歇菜。protobuf这种佳作居然没人想到,不可思议。 👍🏽51 💭N/A IP 🕐2020-05-31 11:45:52
│ └── invalid s: 嗯,其实XML/json用到传输协议里都不太好。偏移位置不定,数据类型含糊,往往必须同时传字段名,不然没法解析——而这反过来就导致解析过程的复杂化,反而更容易出错。想好用,要么学html,干脆别整那么多格式,就一换行符,简单清晰易解析;要么就走传统的二进制,无需解析,按照偏移直接提取相应字段,足矣。而且二进制报文,由于格式固定的缘故,特别容易分层:这是传输层协议,到了上层直接剥掉,让上层只看到属于自己的信息(至于上层是什么协议我不管,只解析我懂的那一部分就行);这是会话层协议,识别出是哪个会话就知道往哪里提交信息;这是表示层协议,照样展示出来即可……文本协议太过灵活,难以分层。很容易被它带着把程序做的一团糟,眉毛胡子一把抓。 👍🏽13 💭N/A IP 🕐2020-05-31 12:16:34
│ │ └── 陈笨笨: 这就要说我们自动化的工程师了,因为硬件限制太多,传大规模数据的文本那是不可能的事情,底层硬件只有几百k的内存,只能2进制自己封包解包 👍🏽0 💭N/A IP 🕐2025-02-11 16:52:14
│ └── 米酒: 改了表结构用orm一样崩 👍🏽0 💭N/A IP 🕐2020-07-01 07:37:36
│ └── invalid s: 显然没用过ORM。好的ORM能够帮你记录表结构的版本号、自动生成表结构修改维护代码。 👍🏽4 💭N/A IP 🕐2020-07-14 17:12:46
│ └── 知乎用户BBiKu9: 比如ef core code first的迁移能力[滑稽] 👍🏽0 💭N/A IP 🕐2021-07-03 15:18:42
sjskjsksmsnne: 看起来是你赢了,其实是输了。你之前的同事每天复制粘贴水了几十万行代码几个人一起领了3年工资,而你完成同样的功能却只拿到1星期的钱 👍🏽47 💭N/A IP 🕐2022-01-20 17:44:24
Herbert HH: 这种一般就是接政府外包的吧,很多政府项目的源码都烂到令人发指……顺便我以外行的角度十分怀疑有些政府招标的时候,代码量多的可以多要价 👍🏽36 💭N/A IP 🕐2020-09-24 08:24:57
│ └── invalid s: 差不多,电信项目。 👍🏽13 💭N/A IP 🕐2020-09-24 09:25:33
│ └── 学点知识: 这不是sb行为吗?就不能招点技术人员把关吗。。。 👍🏽1 💭N/A IP 🕐2022-07-03 12:57:41
│ │ └── 一桶冷水: [doge]招个厉害的取代自己?别人才不傻呢。 👍🏽2 💭N/A IP 🕐2024-05-26 09:48:07
│ └── Alixey: 没有统一的代码规范与审核,浑水摸鱼赚KPI可太多了[思考] 👍🏽0 💭N/A IP 🕐2025-03-24 00:03:47
大裁缝: 不用循环。。可能按代码行数发工资吧 👍🏽34 💭N/A IP 🕐2020-05-27 23:21:27
│ └── 就死亡吧: 哈哈哈哈哈哈 👍🏽2 💭N/A IP 🕐2020-05-28 19:46:45
夏季: 说了半天,也只是在变花样玩C++,没看出基础体现在哪儿?另外,这么大一个项目,一个团队的人都像个无头苍蝇,难道没有技术总负责的架构师吗. 👍🏽32 💭N/A IP 🕐2020-05-28 05:55:36
│ └── 没头没脑没心思: 看到了有人说出了我想说的[小情绪][小情绪][小情绪] 👍🏽8 💭N/A IP 🕐2020-05-28 07:17:08
│ │ └── know634: [蹲]基础不扎实,是没办法玩转C的,[捂脸]比如高考数学就变来变去的。 👍🏽1 💭N/A IP 🕐2024-03-15 01:35:57
│ └── 小郑: 计算机概论一般是软件工程专业第一课,然后这本书开篇讲的是解决问题的方法,答主的回答中生动的诠释了这些完全不是以解决问题为目的做事情的程序员是怎么写出垃圾代码的,我觉得这种理念其实更重要。 👍🏽66 💭N/A IP 🕐2020-05-28 13:25:37
│ └── Blunt: 无非就是在2020年变着花样评判2008年的程序员如何不思进取😂 👍🏽13 💭N/A IP 🕐2020-05-30 12:41:09
│ └── 胡霏: 我也这个感觉。 👍🏽2 💭N/A IP 🕐2020-05-31 09:57:28
│ └── 猪鼻蛇: 这不基础?我还以为现在正常的操作系统课或者类似课程的实验一定要涉及类似内容呢 👍🏽3 💭N/A IP 🕐2020-12-05 09:19:17
│ └── know634: [蹲]基础不扎实,是没办法玩转C的,[捂脸]比如高考数学就变来变去的。 👍🏽1 💭N/A IP 🕐2024-03-15 01:35:50
月咏: 可是就是那些天天加班,天天改bug的受到好评,你工作做的好,什么问题也不出,一点存在感都没有。 👍🏽22 💭N/A IP 🕐2020-05-28 05:45:09
飞翔的蜗牛: 我是游戏行业的,实际上游戏行业非常多地方需要这种技巧,一个优秀的程序员顶二十个 👍🏽19 💭N/A IP 🕐2020-05-28 07:28:57
│ └── 认不认识李美盈: 游戏需要高效率,网站可不一定[飙泪笑] 👍🏽0 💭N/A IP 🕐2023-01-13 00:00:57
逸之: 然后老板觉得写二三十万行代码的人好辛苦,而你的工作量太少了甚至有点想扣钱[看看你] 👍🏽19 💭N/A IP 🕐2020-05-28 07:42:01
None: 目前做了5年开发,待过很多公司,感觉这种事情挺普遍的,写bug加班改bug,写bug然后忙得团团转救火,这样的人往往绩效很高,年终奖多,老板喜欢。 👍🏽18 💭N/A IP 🕐2020-05-28 15:35:29
│ └── 汉星云: 对 👍🏽3 💭N/A IP 🕐2020-09-09 07:14:38
Capricorn: 很多公司是看你写了多少代码,来决定你干了多少活的,所以很多厉害的人宁愿划水划到加班也要划,这样才能轻松些。就像你文中说的,你们都干了好几个任务了,人家天天加班才干完一个任务。没办法,老板认可他们的努力啊😄 👍🏽14 💭N/A IP 🕐2020-05-28 07:34:03
知乎用户Gisn7h: 看见这种错误很有意义,不过号称能写C++程序能搞成这样,不服不行,我说写程序烂的那团队。一个函数写1000行代码谁教的?代码出现大量重用,不重构代码,谁教的?会点皮毛的程序员不懂重构,团队leader也不会?烂团队还很多!如果这些人在我收下,全部重招人。当然我不是领导! 👍🏽13 💭N/A IP 🕐2020-05-28 07:47:25
嘎嘎: 每个人都认为自己有多牛逼,实际在别人眼里你也就一般,800行顶人家几十万行代码那是不可能的,我让你去看20万行代码你估计整一年你都考虑懂到底在做什么,有什么细节需要控制,别在这吹牛逼了 👍🏽12 💭N/A IP 🕐2020-06-04 12:21:04
│ └── invalid s: 没错没错。俺村有个孩子,30多了,屁股都不会擦,每天得他妈帮忙。后来总算有了纸尿裤,一拉一兜子。您真的会擦屁股?我认识个人,有便宜纸尿裤你要不要?这么大了也该让你妈歇歇了。别在这吹牛逼。你拉裤子上还歪着头拍手笑我都见过。 👍🏽6 💭N/A IP 🕐2020-06-04 12:35:01
│ └── invalid s: 真的。在我眼里你就这份儿。你要不买纸尿裤我拉黑了。这年头,带点货真难。 👍🏽10 💭N/A IP 🕐2020-06-04 12:38:08
相柳: 作者的满文全是贬低和满满的的优越感,代码烂不全是技术的问题,你都说了有c++和java结合体,说明各司其职干好自己的就行了,预期吐槽技术,不如说管理的问题 👍🏽11 💭N/A IP 🕐2020-09-25 09:08:56
│ └── 藏玉岩: 尤雨溪:老实说,我并没有太多感觉,我个人认为一般来说Vue或前端框架不是一个特别需要数学/算法的领域(例如,与数据库相比)。我不觉得自己在算法或数据结构方面很强。我觉得他技术好,但是有点看不清现实, 这与其说是算法基础不行,不如说是程序员码德和公司管理不行 👍🏽2 💭N/A IP 🕐2024-08-28 15:54:25
尘伊光: 这……纯粹是抽象能力不足/懒得抽象/对垃圾代码容忍度高吧[飙泪笑],好像和计算机基础知识关联不太大 👍🏽11 💭N/A IP 🕐2020-07-09 11:29:57
Raynor: struct包个head还是可以网络传输的,如果信息密度低会浪费一些带宽。head信息可以用sizeof和typeinfo自动获取。c和java通信就不能用struct了,因为java无法获取到struct的类型信息,就无法完成反射。xml等于是将类型信息包起来传输,会浪费很多带宽。所以protobuf的思想就是把类型信息预先定义和共享,并为每个语言生成对应的反射代码,从而使数据传输不用包含类型信息,网络传输只包含压缩后的必须数据,大幅减少带宽的消耗。就这个例子来说,不用pb节省网络带宽的话可以用c发送网络数据包,实现c直接的类型共享,并且java引用c转xml的模块,从而实现java反射。如果架构解藕到一定程度类型信息无法预定义共享时,考虑到通常数据传输并不需要非常丰富的类型定义,主流框架采用json完成携带有限类型信息的工作,比xml更省空间。 👍🏽9 💭N/A IP 🕐2020-05-28 01:12:02
│ └── eddy: 我国是人口大国 👍🏽0 💭N/A IP 🕐2025-02-11 13:36:47
Blunt: 不明白,序列化和反序列化是怎么扯上计算机基础知识的。顶多能批判08年的这些程序员不思进取,不能归纳抽象吧。 👍🏽10 💭N/A IP 🕐2020-05-30 12:46:16
oyoao: 从文章到评论区,全都看下来了。真的好牛逼啊。感觉这就是心目中我所想的有技术的体现。不是为了糊口,而是真正的有一技之长,不需要受人遏制,也能实现自己所想。主流都在说程序员怎么怎么社畜怎么危机,但我总是想,一个短短70年才被发明,近几十年出现的行业。真就如此不堪?而且短暂的人生中,学到了什么,然后用它来改变些什么。是否可能会比空想社会房子车子来的更加有成就感?希望两年后大学毕业的我,十年后步入三十岁的我,也能都像大佬们一样。感谢这篇回答 👍🏽10 💭N/A IP 🕐2022-03-26 22:31:21
│ └── 学点知识: 关键是没几个人能学到这个高度 👍🏽1 💭N/A IP 🕐2022-07-03 12:42:59
阿巧: 起码能编译笑死,确实常见这种逻辑 👍🏽9 💭N/A IP 🕐2020-05-27 23:39:53
林盛儿: 除非你足够强,不然就是在砸人饭碗。没有bug代码少,你让维护人员,测试人员怎么吃饭。因为你的800行,多少人没饭吃[捂脸],你还在这沾沾自喜。 👍🏽8 💭N/A IP 🕐2020-05-28 07:27:50
最后的透明: 各行各业都这样,那些差员工上班只是为了混日子根本不认真工作,一点上进心都没有 👍🏽8 💭N/A IP 🕐2020-05-27 23:12:12
lissdd: 的确如此,去年我也花了2个周写了不到600行代码,重构了2万行面条代码。合同里3个月的996工期,变成了早上跑步,上午测试,下午钓鱼,晚上火锅,爽歪歪。 👍🏽7 💭N/A IP 🕐2020-06-03 13:28:06
│ └── invalid s: https://coolshell.cn/articles/19271.html看个更帅的。 👍🏽9 💭N/A IP 🕐2020-06-03 23:24:23
│ └── 牧羊人灬风: 你这种在烂单位(比如[捂脸])就会被认为工作量不足,然后一堆有的没的就都给你做了 👍🏽0 💭N/A IP 🕐2025-03-06 08:08:17
知乎用户ISZ74m: 你这955明显工作量不饱和,再给你多安排点工作[捂嘴] 👍🏽7 💭N/A IP 🕐2020-05-28 07:02:41
冷静热心: 都是打工的,混口饭吃。水平差,跟品德无关。我觉得没必要用这种语气。 👍🏽7 💭N/A IP 🕐2020-10-23 19:13:31
小白: 其实本质就是搞个idl而已,probuf 或者TAO之类的都是这个思路, 或者搞一套反射库进来也可以解决这个问题 👍🏽5 💭N/A IP 🕐2020-05-28 01:14:54
吕鹏: 序列化和反序列化直接写一个工具类啊 👍🏽6 💭N/A IP 🕐2020-05-28 06:50:13
张欣: 虽然……但你这是砸人家饭碗[捂脸] 👍🏽4 💭N/A IP 🕐2020-05-28 08:32:38
真实: 代码一次过,没有出过问题,从不到现场解决问题,怎么体现工作量。 👍🏽5 💭N/A IP 🕐2020-05-29 20:50:58
Alice Tian: 虽然但是,最后一道算法题主要是为了考察binary lifting,暴力破解容易超时的 👍🏽5 💭N/A IP 🕐2022-10-23 05:26:51
│ └── invalid s: 嗯,没玩过这个,一下子没看出陷阱,见笑了。 👍🏽1 💭N/A IP 🕐2022-10-23 09:03:08
│ │ └── Alice Tian: 有的算法题看着简单,数据量非常大,受过训练才好熟悉里面的套路。如果是在比赛里不假思索地提交没过就罚时++了,当然也有可能运气好那题数据宽松只是吓吓你[捂脸](我有个朋友就这么拿了金牌 👍🏽1 💭N/A IP 🕐2022-10-23 13:13:49
│ └── tonton: 我一下子也都怀疑自己了 以为大佬眼中这种hard如此不值一提 暴力破解还是容易得多的 👍🏽0 💭N/A IP 🕐2024-02-23 11:27:18
│ └── tonton: 我一下子也都怀疑自己了 以为大佬眼中这种hard如此不值一提 暴力破解还是容易得多的 👍🏽0 💭N/A IP 🕐2024-02-23 11:27:28
扁担宽 板凳长: 这样子可以保障就业,程序员是真的会因为代码写太好导致一部分人失业的。 👍🏽5 💭N/A IP 🕐2020-05-28 07:19:11
张海: 互联网公司的都知道用json,高端一点用protobuf/thrift 👍🏽5 💭N/A IP 🕐2020-05-28 06:43:27
│ └── Croce: 08年,xml才是主流 👍🏽1 💭N/A IP 🕐2020-05-30 14:25:40
慕容狐: 我觉得很强,但是,没咋看懂,大佬能否单独写文章讲一下[飙泪笑] 👍🏽4 💭N/A IP 🕐2020-05-27 22:08:35
│ └── invalid s: 没必要了。思路陈旧,技术落后。看现在那些优秀的ORM或者google的protobuf实现吧,比我强的不是一点两点。 👍🏽126 💭N/A IP 🕐2020-05-27 22:12:31
│ │ └── Matrixtang: protobuf 谷歌已经用滥了(逃 👍🏽2 💭N/A IP 🕐2020-05-28 00:19:00
│ │ └── invalid s: 嗯,可惜我写那个的时候还不知道有protobuf。根据这个页面:https://baike.baidu.com/item/Protocol Buffers/3997436google 08年7月7号才把它开源;而我完成那个东西应该是在08年五六月份左右…… 👍🏽20 💭N/A IP 🕐2020-05-28 00:24:51
│ │ └── Matrixtang: 不过还是很强的啦_(:з」∠)_ 👍🏽4 💭N/A IP 🕐2020-05-28 01:26:39
│ └── paradisor: 相当于自己搞了一个protobuf。第一,这很强很nb;第二,要学习的话还是去看真的protobuf比较好 👍🏽10 💭N/A IP 🕐2020-05-28 01:07:21
│ │ └── Chen: pb还是要复杂很多的吧…… 👍🏽1 💭N/A IP 🕐2020-05-28 01:59:26
│ │ │ └── paradisor: 别跟真的pb比……跟nanopb都没法比。但是我还是要说自己搞个这个很强。 👍🏽6 💭N/A IP 🕐2020-05-28 02:05:50
│ │ └── xinhc: 是呢,现在是有了轮子,当作者不知道已有的时候自己造了一个,对作者的整体思维都是很有帮助的,作者得知后尚感慨不如之,何况还有些人(那些屎山维护团伙)不知道轮子是什么呢 👍🏽13 💭N/A IP 🕐2020-05-28 12:19:03
│ └── J.Goodtoomuch: 看了就想说这不就是protobuf的简化版吗?再一看评论原来答主已经发现了 👍🏽3 💭N/A IP 🕐2020-05-28 03:02:46
周泰西: 但是你这样搞大家都没工作量,领导很生气,手动狗头,别打我 👍🏽4 💭N/A IP 🕐2020-05-28 07:17:00
张骁: 你这个例子啊,其实还真不是什么计算机知识的问题,根本上就是人的问题,没脑子或者根本就不动脑子,这种工程师我也见过不少,死拽都拽不动,如果你对这样的人上心帮忙,到头来只会自己生气,一个不小心还把关系搞砸了。稍微引申一下,本质上就是工资低,招不到合适的人。 👍🏽2 💭N/A IP 🕐2020-05-29 10:46:02
│ └── invalid s: 嗯……您一定也在很多后来流行的某项技术出现之前,写过它们的简陋版吧? 👍🏽1 💭N/A IP 🕐2020-05-29 11:09:45
│ └── 藏玉岩: 来自技术人的傲慢与偏见, 他信任技术为王, 不会认同你的想法的,明明是人的问题,非要扯什么计算机知识的问题 👍🏽1 💭N/A IP 🕐2024-08-28 16:08:03
去我执: 你知不知道你这次优化干掉了十几个工作岗位?甚至十几个家庭的饭碗被你砸了,方便了你们老板敛财了? 👍🏽3 💭N/A IP 🕐2024-10-04 00:18:14
新世纪福报战士: 所以你离职了, 他们能一直在那拿工资[惊喜] 👍🏽3 💭N/A IP 🕐2024-08-27 09:41:40
天天向上: 以前也总想找代码最少的方法写,但是KPI每天330行… 👍🏽3 💭N/A IP 🕐2020-06-13 17:01:30
│ └── 倾尘: [思考]这属实是老板求着你们水代码了 👍🏽0 💭N/A IP 🕐2022-08-27 02:38:15
sunznx: 我他妈看到这句直接笑出来了,牛逼 “看看!编译错误!我的起码能编译!” 👍🏽3 💭N/A IP 🕐2020-06-07 14:06:10
知乎用户CmaZit: 科班出身的基础好些,因为学过理论。社会培训的程序员没有理论知识,很难写出好程序。我认识一个家伙,要从两个表中检索出特定的行,他居然是从一个表中读出一条,再用这条去另一个表匹配。我都疯了。写一条sql就解决的事啊。 👍🏽3 💭N/A IP 🕐2020-05-29 14:56:59
│ └── 汉星云: 分布式数据库就很麻烦哦 👍🏽0 💭N/A IP 🕐2020-09-09 07:16:56
飞天小女警神教: 大佬你好,看到了你文中出现的报文解析那一段彷佛看到了我刚实习的时候的样子,不断地粘贴复制自己已有的代码改改就用,却不知道从整体结构上进行优化,不过这么久过去了,却感觉自己没有多大进步,碰到那些精巧的宏,不常用的C++机制,类型等等,总感觉离自己很遥远,因为不了解也不敢去用。请问大佬是怎么一步一步学习使用这些知识的呢?或者有没有这方面必读的书籍? 👍🏽3 💭N/A IP 🕐2020-05-28 09:18:51
│ └── invalid s: 先要想去解决这个问题,然后自然就能逼自己拿出解决方案。其实用不着宏,也用不着什么奇奇怪怪的语法/机制。最大路货的分支顺序循环足够解决一切。用宏以及奇怪的语法/机制,是因为懒,不想改变使用习惯——能写到C/C++源文件里、不用修改编译流程,这样才不得不用宏。你看google的protobuf,人家敢于向编译流程动刀子,语法上就不需要创新,代码就易读易维护。总之,人总是需要逼一逼的。逼自己和业界顶尖的那伙人比,很多很多东西就无师自通了——这些东西真没什么书讲,真要讲也没什么东西,反而是一大坨无聊的细节,不会的越学越晕,会的看一眼就想吐。因为它是你认真学习基本知识、思考各种东西的思考原理、想得多就自然“内化”的东西。打个比方的话,舒马克开车那么好,是不是有什么隐秘的诀窍呢?并不是。任何车的操控系统都是那么几样。你得不断思考,我怎么才能快一丝丝,再快一丝丝……千锤百炼若干年,这些东西自然内化——内化就是不用想,本能知道最优策略——你就能在比赛中拿奖了。换句话说,这些才是硬功夫,是专业玩家日夜浸淫其中的结果。没有什么书能代替你自己的痴迷。 👍🏽132 💭N/A IP 🕐2020-05-28 09:27:29
│ │ └── 尼布甲尼撒: 这种场景用protobuf就很好。跨语言,效率高,数据体积小,还有版本管理等一堆开箱即用功能。 👍🏽0 💭N/A IP 🕐2020-05-28 12:21:41
│ │ └── invalid s: protobuf比我这个晚几个月。 👍🏽0 💭N/A IP 🕐2020-05-28 19:16:41
│ └── invalid s: 这类东西的设计思路,一般分为侵入式和非侵入式两大类。侵入式的就要求用户必须学习新知识、应用新流程、改变自己的编码;非侵入式则对用户透明,不需要学习,按平常习惯用就好。把struct声明变成宏,这其实就是一种侵入式设计;只是比连编译流程都改了的“侵入”程度要浅得多。一般来说,为了方便使用,为了降低同事们的接受门槛,应该尽量往非侵入式方向设计。侵入程度越低,其他人接受起来就越不痛苦;已有项目迁移过来也要容易得多。但非侵入式设计难度往往要比侵入式难度大,甚至可能压根做不到。这时候就要考虑侵入式设计。但为了方便推广,侵入程度越浅越好。这里就有个平衡点需要把握。 👍🏽11 💭N/A IP 🕐2020-05-28 10:01:38
│ │ └── 赵雅君: 同意,非侵入式设计弄不好就变成一个庞大的代码库,怎么说呢,相当于在项目外面造一个城堡出来,而侵入式就是造一条地道。我们公司为了实现ETL无代码化,写了整整一个框架,然后我们这些分公司做BI的就只需要填写yaml就完了,感觉对职业生涯极其不利,尤其我这种非计算机背景的。既然目前暂时没有实际问题给我解决,先解决一下leetcode的问题也可以。 👍🏽0 💭N/A IP 🕐2020-09-18 00:43:30
│ └── 随便看一下: [捂脸]这就是我了,看公司代码一堆宏完全看不懂 👍🏽0 💭N/A IP 🕐2020-05-28 11:29:52
│ └── 随便看一下: 而且也用protobuf 👍🏽0 💭N/A IP 🕐2020-05-28 11:30:09
张井淘: 你写程序都碰运气的吗?----哈哈哈哈用宏这东西只是一时爽,,,你应当看到事情的本质,宏到底是什么,会有怎样的害处? 👍🏽3 💭N/A IP 🕐2020-05-28 08:33:44
│ └── 剧情解说短视频: 有什么害处?围观(←←) 👍🏽0 💭N/A IP 🕐2020-05-28 09:35:34
│ └── Mao MD: metaprogramming增加unit test的难度,编译期前参数变多,更难完整测试。所以macro类似于砒霜,用少而精治病,用多了就是毒药了。 👍🏽1 💭N/A IP 🕐2024-10-24 19:51:24
羽戈厂长: 你写完被干掉了,人家养了整个团队,穷人才专注技术! 👍🏽3 💭N/A IP 🕐2025-03-06 09:16:58
蚍蜉撼树: 关于leetcode这题的难易,答主只怕有错误的估计。首先,对于单点的查询,很容易给出一个O(n)的解法,这算是esay难度,但是按照题目的数据规模会超时。所以要给出正解,单次查询需要是O(lgn)的。对于同一道题,复杂度往往影响到问题的难度。我来给个例子,已知斐波那契数列1, 1, 2, 3, 5…,任意给定一个n,求第n个斐波那契数的最后4位。(算法限时1s)(1)如果n∈[1, 10^6),那就是esay题(2)如果n∈[1, 10^12),那可以算middle以上了此题对于做过的人不难。如果没做过,普通智商的人应该做不出第二问。天才也许能无师自通,而对于智商平平的我们来说,得靠后天的努力来弥补。 👍🏽3 💭N/A IP 🕐2022-04-14 23:03:32
│ └── 张宽: 看来还是有人和我一样的,O(n)解法确实很简单,但是会超时的。用dp来表示倍增树,要是之前没有遇到过压根想不出来啊,怎么就简单了,我还以为是我太笨了呢[飙泪笑] 👍🏽2 💭N/A IP 🕐2022-08-04 09:35:24
月色沾衣: 优秀 👍🏽1 💭N/A IP 🕐2022-12-18 16:55:23
牧野流星: 有没有可能kpi的指标是代码量呢? 👍🏽1 💭N/A IP 🕐2022-12-06 08:42:05
farter yang: 一个更早的东西是ASN.1【 👍🏽1 💭N/A IP 🕐2024-07-27 17:04:27
│ └── fresh: 知道这个的大概率是干通信的吧 👍🏽0 💭N/A IP 🕐2024-09-17 09:49:20
唐一凡: 隔了半年多又看了一遍这篇回答。之前说实话基本看不懂写的是啥,现在看来居然遇到了同样的c++数据结构转换的问题,虽然到最后也没看懂那个宏是怎么操作的。 👍🏽1 💭N/A IP 🕐2022-05-29 20:54:40
mike chen: 你有没有考虑过,你这么干,会多很多失业人员? 👍🏽2 💭N/A IP 🕐2020-05-28 12:55:24
不知道啊: 重点在于老板对技术部是个什么样的态度,如果老板压根不懂技术,那就可能按代码行数算工作量,算KPI那800行代码就是一个偷懒耍滑的表现,而20w行代码,007加班才是老板想要的,而且很多年纪大的程序员都是这样,因为家庭或者其他原因导致不敢离职,害怕被裁员,哪怕知道这样做系统以后会稀巴烂,但是为了能一直在这公司存活,也只能按这样的方式去处理工作。其实,这种情况也有人精确的形容过,中国的大部分老板其实都不是资本家思维,而是奴隶主、地主思维,他们不在意你的产出质量多高,只要符合标准就行,更在意的是你有没有加班,有没无偿或低偿为公司付出,他花100块请你来工作8小时他能满意么?并不能,他更希望花105块请你来工作12小时,这样他觉得他赚到了,至于你的产出如何?who cares?这也是为什么国内内卷这么严重,但是国外基本不加班,但是国外的高科技公司发展的普遍比国内好的原因。重点都是环境,而一个公司环境的塑造,一般都要看老板是个什么样的人。[发呆] 👍🏽2 💭N/A IP 🕐2024-12-26 10:17:19
知乎用户c29iFZ: 以前上学的时候不懂算法老师为什么要我们学数据结构,为什么要优化代码降低复杂度,等到自己真正工作了才明白之前想着 只要能运行了就行了呗 的想法有多蠢多幼稚。 然而不付出真正的努力是达不到作者的水平的,很多人还是停留在网上抄代码复制粘贴的水平。 👍🏽2 💭N/A IP 🕐2020-05-28 20:28:01
润玉大肥猪: 感觉还是一个态度问题,态度正常的人,知道自己的问题,对工作也不是这样复制粘贴! 👍🏽2 💭N/A IP 🕐2020-05-30 12:06:36
lxglxt: 这就是有架构概念和没有的区别!问题是,很多公司只需要基础的程序员,根据业务量来堆砌代码!至少,看起来是忙碌的! 👍🏽2 💭N/A IP 🕐2020-05-28 18:09:36
shadow: 这都不是计算机基础问题,这是有脑子和没脑子的差别 👍🏽2 💭N/A IP 🕐2020-05-28 13:31:28
│ └── 藏玉岩: 感觉他技术厉害,但是搞错问题所在了 👍🏽1 💭N/A IP 🕐2024-08-28 15:56:53
开心果: 一部分吃程序员都是:能抄我就不自己写,不管怎么样写的出来就行…最后导致代码冗余…维护起来还特别恶心,有时候真的重写还比维护更容易… 👍🏽2 💭N/A IP 🕐2020-05-28 12:44:42
石灰: 这其实不是技术问题 👍🏽2 💭N/A IP 🕐2020-05-28 09:37:59
单引: 然而最后发现加不加班主要还是要看猪队友是不是坑你 👍🏽2 💭N/A IP 🕐2020-05-28 08:23:31
罗一: kth ancestor的最优解法parse table的dp,怎么着也能算是个hard吧。老哥你是用什么解法做的,觉得这个很容易? 👍🏽2 💭N/A IP 🕐2020-12-19 07:34:55
│ └── 豆哥: 数据小,随便写个倍增也够用[飙泪笑] 👍🏽0 💭N/A IP 🕐2023-08-04 11:19:31
夏天的东风: 你懂个啥,就这样一个项目,能让他一直干,优化最后把自己优化没了[捂嘴] 👍🏽2 💭N/A IP 🕐2025-02-23 06:20:42
阿赞: 然后大家都被裁了 👍🏽2 💭N/A IP 🕐2025-02-20 11:39:35
张弛: 我有时候觉得程序员的好坏就是要看这个人能把“抽象”这个概念应用到什么程度 用代码量衡量水平的人真的是无知…其实在北美很多计算机比较强的院校都是比较注重这一点的 但国内感觉还是普遍在拼数量 👍🏽2 💭N/A IP 🕐2020-09-24 06:11:18
敬嘤不吃吃罚嘤: 我刚刚入职公司的时候就是和另一个人负责的一个实验室报告系统 替代实验室以前的手工做报告 我们是做医疗检测的 类似现在的核酸检测 不过还有一些疾病和器官移植啥的 然后当时他们和我说只有一个项目 因为我也是刚进去也不清楚他们的产品都有啥 所以直接写死了一个项目的报告流程 让然后让我万万没想到的是他们居然之后又要加其他项目的流程 在后来加了两三个之后我受不了了 我直接从路由开始做起做了一套默认的公用流程 现在增加一个项目只需要在配置一下页面资源路径 然后做一些针对项目的特化 其他所以东西都走默认的公用流程 我这边加一个项目流程现在只需要十分钟左右的时间 反观另一个负责报告文件创建和报告数据解析的同事 他每次要加项目的时候都要写一大堆读数据库 格式化数据格式的代码 动辄就几百行的 实在太费劲了 我看着都痛苦 而且我加完流程还要等他创建报告文件的服务做完才能测试 而且我们最近上了一套对每个项目进行数据校验的东西 也是我写的 我直接设计了一套简单的实现继承的类结构 现在加一套数据校验我只需要编写数据采集和封装数据扔给校验接口就完事了 数据不复杂的话连十分钟都用不了 所以这种大量重复性的东西真的稍微设计一下都能节省很多时间和代码 太重要了 这些东西都是我才上一年班就知道的了 楼主这个故事里这些程序员可能只是懒 不想动屎山代码 👍🏽2 💭N/A IP 🕐2022-08-11 11:02:30
│ └── invalid s: 其实……抽象能力看似简单,却是最难训练出来的。https://www.zhihu.com/question/340415734/answer/806610719 👍🏽2 💭N/A IP 🕐2022-08-11 11:17:17
│ └── 敬嘤不吃吃罚嘤: 文章里这个姑娘已经不是抽象能力的问题了 这是对这行完全没兴趣或者完全不想学习[思考] 学生思维 习惯了填鸭式教育的 完全不去自己主动了解 就好像只知道窝在鸟巢里等着妈妈喂饭一样 长大了也不飞出去 👍🏽0 💭N/A IP 🕐2022-08-11 16:58:31
│ │ └── 花屋: 不用标点,用语句和空格说得这么清晰[飙泪笑] 👍🏽0 💭N/A IP 🕐2024-07-27 16:39:42
│ └── 一动解千愁: 逻辑和抽象才是编程能力的核心,语言都只是一个工具而已 👍🏽0 💭N/A IP 🕐2024-11-13 16:50:42
noName: 操作系统的原理、扎实的算法基础。。这些东西真的比熟悉时髦的API 、框架重要多了这才是以不变应啊 @!! 👍🏽1 💭N/A IP 🕐2022-07-29 10:55:43
北回归线: 多少程序员都是高中毕业考不上大学培训出来的?即便是985的研究生,有很多是干了5、6年还在抄代码的,我的判断,程序员这个行当,90%以上其实是不能胜任工作的。 👍🏽1 💭N/A IP 🕐2020-05-30 11:34:32
牵盏: 大佬牛批,800行干掉二三十万行。不过听你说好像这个公司也挺臭的,没有探索精神,我觉着程序员这个工作最大的责任就是写出高效整洁的作品 👍🏽1 💭N/A IP 🕐2020-06-12 16:30:21
│ └── invalid s: 嗯,稍微有点追求的公司都不会这样。所以呢,可以说这种800vs20000的事几乎每时每刻都在发生。只不过发生在不同公司,没那么触目惊心而已。 👍🏽1 💭N/A IP 🕐2020-06-12 17:23:53
Carterwade: 科班出生和培训班出生的差距就在于此。 👍🏽1 💭N/A IP 🕐2020-06-05 14:16:34
│ └── 学点知识: 科班生学好的才能达到的水平 👍🏽0 💭N/A IP 🕐2022-07-03 13:35:45
赵雅君: 虽然自己是业余的,但是还是希望能够不断地精进啊。目前在CSAPP,希望能够从打的扎实一点。 👍🏽1 💭N/A IP 🕐2020-05-29 11:23:11
Anriver: emmmm我可以理解为,这是那些没有任何基础,经培训,或者公司方面调动部门,只是简单掌握语法的人干出来这些事儿么[捂脸] 👍🏽1 💭N/A IP 🕐2020-05-28 08:58:12
kenny wu: leecode那题本身是比较简单,但是做完后得优化,不然会超时,比如加个曾祖父,即父(3)数组,父(7)的,父(13)数组减少循环次数 👍🏽1 💭N/A IP 🕐2021-02-01 23:01:33
知乎用户sAeFS4: leetcode就难了吗(codeforces傻了 👍🏽1 💭N/A IP 🕐2021-01-14 16:25:40
飞歌: 为华为搬砖中。接手的系统是一个专家写的,老专家,大概5年前写的。c c++混合型。我们平时定义一个结构体,或者类,直接用属性,稀松平常是不是?这系统不是,它的做法是,先数出来数据总长,定义这么长的char数组,一堆变量值依次写入这个数组,2个,4个,8个,10个等等不等长的变量,使用的地方再反过来读出来。要定位问题的时候,我得数那个属性位置,再去代码里数,[飙泪笑] 我滴个神仙 👍🏽1 💭N/A IP 🕐2025-05-20 22:34:45
│ └── invalid s: [捂脸] 👍🏽0 💭N/A IP 🕐2025-05-20 22:37:46
此寮当诛: 在最开始领导让我一天之内实现报文传输,说急着要,我就只能这么写。第二天又跟我说又有一种报文,一天之内必须搞完,我肯定复制粘贴。 👍🏽1 💭N/A IP 🕐2025-02-14 17:29:05
春风正可寻: 防御性编程好么 👍🏽1 💭N/A IP 🕐2024-12-25 09:39:49
liubei: 我还见过改了底层 API 入参的,然后不跟其他人说就发生产了,脚本语言加没测试[惊喜] 👍🏽1 💭N/A IP 🕐2024-09-01 16:05:52
孤寡孤寡广告歌: [大笑][酷]你本月度代码提交量为几百,人家几千上万。你是不是工作不饱和。 👍🏽1 💭N/A IP 🕐2024-08-27 08:28:41
金色海洋: 我这辈子写的代码,大概也没有四五万行。主要在写库,框架,控件上面。不是底层的,是紧挨着业务层的。喜欢json尤其是js里面的,那叫一个省事。xml是能不用就不用,太麻烦。一天1400,按十个小时算的话,一个小时140,一分钟两行多?对于打字员来说,速度慢。但是对于程序员来说,这还有没有思考时间了。码字机器吗? 👍🏽1 💭N/A IP 🕐2020-10-30 23:18:41
金大帅: 800行代码替换他8000行还能勉强信一下,你替换二三十万行代码,太夸张了吧?能把800行代码写到二三十万行,一般程序员也是不可能写出来 👍🏽1 💭N/A IP 🕐2024-02-06 08:36:45
│ └── 藏玉岩: 技术人的毛病吧, 厉害,但是傲慢自负, 搞错问题了,把问题简单说成是技术基础问题, 其实是程序员的码德和公司的管理问题 👍🏽0 💭N/A IP 🕐2024-08-28 16:01:02
takeGeneric: 你发的这个是树上倍增,随手敲第一反应不能是这个吧[思考]虽然leetcode数据弱了,但是暴力确实不是正解 👍🏽1 💭N/A IP 🕐2023-07-02 22:27:12
勇哥: 所以一个优秀的程序员跟普通的程序员的差距,根本就没法比。一个好的想法,一个优秀的设计,是完全没法用金钱衡量的!如果说一个优秀的程序员是10分,那么普通的程序员可能是负分,因为有的人做出来的活,可能藏了很多坑,他的贡献是负的! 👍🏽1 💭N/A IP 🕐2020-09-03 15:18:27
Tal Nino: 答主,你这个回答恰恰暴露了学好数据结构的缺陷了,他不创造就业啊。 👍🏽1 💭N/A IP 🕐2020-08-28 22:04:17
│ └── invalid s: 什么啊。什么时候养蛀虫和创造就业可以划等号了? 👍🏽0 💭N/A IP 🕐2020-08-29 00:24:06
│ └── Tal Nino: 六保六稳国策怎么落实,就靠这个了 👍🏽0 💭N/A IP 🕐2020-08-29 08:49:32
│ └── 学点知识: 在中国大学绝大多数本科生不可能达到你这种水准的,这又可能涉及到教育本身的一些问题了[doge] 👍🏽0 💭N/A IP 🕐2022-07-03 13:30:01
toraoh hdu: 最后举的例题还真不好。这题标hard是因为其数据范围,最多50000个节点,50000次查询。你说300节点,300次查询是easy我同意,50000节点50000查询说not hard我得打问号。极端情况,单链,如何高效查询,这个的确超出数据结构课的范围了,是算法与数据结构设计。直接写,一步步往上走,单次查询o(n);使用倍增的思想,预生成每个节点,向上2^0 2^1 2^2 … 的祖先节点的表,然后查询时利用向上跳跃,虽然空间复杂度o(nlogn),但每次查询的时间复杂度也优化到o(logn)了。 👍🏽1 💭N/A IP 🕐2022-08-28 21:18:11
子非尼莫: 我一个门外汉看的津津有味[doge] 👍🏽1 💭N/A IP 🕐2022-02-18 12:40:08
invalid s: 所以说,“玩转语言本身”这个基础的不能再基础的东西,已经足够在高级程序员(资深工程师)之间造成十倍的效率差异;而在初级-高级程序员(初级工程师和资深老鸟)之间,效率差异可达百倍。至于高级程序员和写个简单的“图书管理系统”都错漏百出的初入门者之间,效率相差千倍、万倍都很正常。然而,编程语言只是计算机领域的一个点。算法、编译原理、操作系统、网络、加解密等等等等,才是一个个大的领域。在这些领域里,那些厉害的领域专家,完全可以和初学者拉开比“玩转编程语言”本身大无数倍的距离。或者说,一辈子不可逾越的天堑。万丈高楼平地起。从C/C++/Java/python初学者到领域专家,这个距离是靠着比砖头都厚的一本本书堆起来的。里面任何一个字句没能理解透彻,将来你和别人之间就可能出现不可逾越的天堑。基础知识的差距是最难逾越的差距。所以,我对那些收入比我高成百上千倍的技术专家那是诚惶诚恐、心悦诚服。 👍🏽325 💭N/A IP 🕐2020-05-29 12:06:31
│ └── 赵雅君: 感觉差异太大了。。。领域专家一辈子是追不上了。一个国家也未必有很多。 👍🏽3 💭N/A IP 🕐2020-05-29 12:16:10
│ └── 栗子: 有时候在想,有些老是在焦虑着35岁后被辞退的程序员其实真正焦虑的是不是自己根本写不好代码。我发现程序有个特点,是可以靠代码堆积而实现跟简洁代码类似的功能,公司在野蛮生长的时候可以靠不断加人堆代码实现功能,一些不适合写代码的人被机缘巧合捧上去了,而风口过去,不适合写代码的人就摔下来了,而被拉高的生活水平和自我认知水平没那么容易下来,也没那么容易换行业或转型,从而焦虑。这算不算时代的捧杀呢?或许这些不适合写代码的人没有走上过高地,摔下来的时候是不是也不会这么疼。 👍🏽61 💭N/A IP 🕐2020-05-29 16:12:21
│ │ └── invalid s: 是的,我之前吐槽过。当时一个人鼓吹“程序员至多写3年代码”,我说他对自己的定位还是很精准的,知道自己也就能混3年。不过,等他这辈子的3年程序员混完,当个经理多半也是混子,一样是干不长的。 👍🏽20 💭N/A IP 🕐2020-05-29 16:15:36
│ │ └── 从心归零: 我有个水平很差的同事,造成的破坏比贡献多多了,每次看他的代码都恨不得全部重构,还不听人话,喜欢推卸责任,我遇到复杂的功能都抢着做,避免后期再改他代码更费劲。他写代码只考虑表面实现,还喜欢使用固定值,只考虑跑通,不考虑各种情况,从不考虑扩展性和复用性,什么效率问题并发问题就更不用说了,还犯各种低级错误,格式混乱,拼写错误,company拼成compnay逼死强迫症。所以他的功能只有最基础的情况能通过,剩下的都是测试发现后他才改,然后在项目的初期数据量少的时候勉强能运行,数据量多的时候他效率极低耗费大量资源的代码搞崩了几次服务器。但是就这,还有比他更差的,一个据说三年工作经验的程序员,干了三周连一个基础功能都做不出来,一个月就被辞了,上面那个同事至少还懂得使用轮子,虽然也只是轮子的基础功能。但是即使这样,我的工资也和他们相差无几,可能多个几千,明明我的工作量和重要性都是他好几倍,出了问题都是找我解决,所以我对人和人之间的效率差距深有感触,所以实际上薪资差距不是高了而是低了,实际上的效费比差距可能有几十上百倍。很多程序员的工作就是在填原来的坑,正负相抵。所以现在我也开始摸鱼了,每天只花一半时间工作,还是比他们做的多。也乐得轻松,但是我深知比我强的人数不胜数,我在现在的环境里是最强的,但是这反而成为我堕落的安逸环境了。我的效率是他们的十几倍,那些专家又何尝不是碾压我呢?还是应该学习啊 👍🏽108 💭N/A IP 🕐2020-09-24 11:15:03
│ │ └── 123: 咋样才能提升写代码的质量呢? 👍🏽0 💭N/A IP 🕐2022-08-04 13:16:14
│ └── 扁担宽 板凳长: 夸张了。技术很重要,但也没那么重要,就像你举的例子,就算项目烂成如此如此,那公司不还是好好的。自己努力向上是好事,但拿出来希望大家都如此,是要遭人怨恨的 👍🏽4 💭N/A IP 🕐2020-05-30 23:53:51
│ │ └── invalid s: 恨就恨呗。看不起那些庸才。 👍🏽13 💭N/A IP 🕐2020-05-30 23:55:04
│ │ └── invalid s: 技术远比你们这些庸才想象的重要。觉得没用,是因为你们没能从中得到好处。 👍🏽15 💭N/A IP 🕐2020-05-30 23:55:56
│ │ └── invalid s: 之前还有人咨询,说程序员35岁(失业)现象存在吗?肯定不是很普遍吧?我告诉他,极为普遍。那些庸才几乎100%遭遇了35岁问题。甚至于,我有位同事,当年玩二层交换机玩到全国顶尖水平。但是后来三层交换兴起,他不思进取,就那么点东西,愣是没学会。然后就被公司开了。还是公司当年的元老之一。所以三十五岁失业是必然的。对你们这种人来说。但是,别的怕你不知道,看看知乎活跃的vczh、pansz等大佬。他们何曾考虑过这个问题。很久前,当时就有人说程序员干不过三十岁、编程至多三年。我就说,他对自己的定位挺准的。但有一点不准:他绝对不可能通过转管理,在IT界再混三年。老板不傻,没人会要这种笨蛋。 👍🏽19 💭N/A IP 🕐2020-05-31 00:02:28
│ │ └── invalid s: 顺便的,哪怕同在那家奇葩的逆淘汰公司,有技术和没技术的命运也是大不一样的。我们之前的经理还真懂点,人也挺好。所以关系处的不错。后来那个是个二逼,我们结伴吃饭他去蹭饭,蹭饭不说,口头上还得占点便宜“你们程序员是蓝领,是即将淘汰的职业。现在UML已经能自动生成代码了,你们干不了几年了”。因为一个同事想和他拉近关系,让他跟着蹭了顿饭,他觉得我们想巴结他。于是一个个找上门来作威作福起来。一位新人被他气的哭,另一位愤怒的大吼大叫;华为出来那位同事抓住他一个漏洞骂的他狗血淋头;我摆事实讲道理让他承认是他自己的问题;最后一位同事最阴,“领导高明!哎呀太复杂我记不住领导给写个邮件?”他真写邮件了。凡是让他写邮件的都是低级错误。于是程序崩了,高层来了一堆人,查!一查,全都是他在邮件里白纸黑字让这么搞的。但是人有后台。只能不了了之。这是我们有技术在身。正面对抗、以理服人、反唇相讥、挖坑埋人,随便那款都治得住他。别说不怕和他闹僵。没闹僵我们还看不上这公司,要主动辞职找更好的地方呢。但没有技术,求爷爷告奶奶托关系走后门进去的呢?被人指来喝去,只能忍声吞气。人家找个借口,要求你到酒店汇报工作,去还是不去?不去?不去你掏钱欠人情好不容易争来的工作就没了。去?不用想。去酒店就是想让你在床上汇报工作的。这种事实在太多,到知乎上提问的都不是三五十几个。我有位极漂亮的女同事就是在这种单位遇到这种事,不得已辞职的。弄出心理阴影了,戒备心极强,很正常的合作交往都紧张得不得了。幸好人家聪明,水平到了。到私企那是从上到下的看重,一点委屈都舍不得她受。本来细声细气包子一样的小女孩,被我们带了两三年,带的明显自信了,偶尔还敢和我们这些老家伙开几句玩笑。 👍🏽14 💭N/A IP 🕐2020-06-01 17:08:45
│ │ └── mama3925: 想了很久,太对了。提升技术不是为了做人上人,而是不成为牛马般的牲畜。 👍🏽2 💭N/A IP 🕐2022-01-06 17:35:48
│ └── String: 压力好大,怎么成为那种人呢 👍🏽1 💭N/A IP 🕐2021-09-13 13:31:43
│ └── Radio: 谢谢你 [大哭] 👍🏽0 💭N/A IP 🕐2022-05-25 18:00:24
tearshark: 换个标题:论C++的牛逼! 👍🏽4 💭N/A IP 🕐2020-05-28 06:39:09
知乎用户EO49Uj: 他不写那么烂怎么混点,总得假装很努力 👍🏽4 💭N/A IP 🕐2020-05-28 04:19:31
YohaWoO: 没学过C++,但根据最近用gRPC的思路,大佬的DECLARE宏是不是类似于pb文件,然后针对确定的pb文件有专门的序列化和反序列化方式,这样就可以在不同类型之间或者不同系统之间保持相同的数据结构语义? 👍🏽4 💭N/A IP 🕐2020-05-27 22:14:51
│ └── invalid s: 没玩过gRPC。其实就是用offsetof宏找到每个字段的偏移(这个offsetof也是我重新发明的,把0指针强制类型转换,然后把它指向某个字段、记录其值就是偏移,后来才知道这居然是个惯用法),记录;传入的item_name其实是同时当字符串和宏展开用。时间太久,很多细节都忘了。大概思路就是把偏移、名称、数据类型都记录下来,然后有这些东西就足够写出程序完成打包/解包操作了。 👍🏽3 💭N/A IP 🕐2020-05-27 22:19:54
│ │ └── YohaWoO: 对对对,感觉这些思想的源头都可以追溯到计算机网络结构中不同层的不同协议的打包/解包[干杯] 👍🏽2 💭N/A IP 🕐2020-05-27 22:32:19
│ │ │ └── invalid s: 是的。比如著名的wireshark,几乎可以解包一切知名协议。 👍🏽1 💭N/A IP 🕐2020-05-27 22:33:51
│ │ │ └── lingdayue: 是的,grpc用的也是protobuf 👍🏽0 💭N/A IP 🕐2020-05-29 22:49:36
│ │ └── 王美丽: offsetof(…, …)是编译器提供的啊?cppreference上说这个功能是不能在c/c语言内部自行实现的呀 👍🏽0 💭N/A IP 🕐2020-05-28 00:01:05
│ │ │ └── invalid s: 可以。其实就是 &(((type *)0)->item)。 👍🏽0 💭N/A IP 🕐2020-05-28 00:11:13
│ │ │ └── invalid s: 其实就是结构体首指针到成员变量的偏移量。经常玩C的一不小心就随手敲出一个——然后编译器自动识别了。我随手敲的是C风格。这个是C风格:https://baike.baidu.com/item/offsetof/10312708 👍🏽0 💭N/A IP 🕐2020-05-28 00:14:19
│ │ │ │ └── 王美丽: msvc的实现,(从语言律师的角度讲)其实是ub(但是不妨碍能正常运行)gcc和llvm都是只给了声明,编译期让编译器实际计算完成 👍🏽0 💭N/A IP 🕐2020-05-28 00:18:24
│ │ │ └── invalid s: C版的offsetof就是个宏;它用到C项目里面会有个警告,提示它不能用于非POD类型。你看到那个应该是后来的C标准新定义的。过去它就是个宏。 👍🏽0 💭N/A IP 🕐2020-05-28 00:20:57
│ │ └── Dawn: Linux kernel里习惯用法,比如非常基础的list_entry宏 👍🏽0 💭N/A IP 🕐2020-05-28 00:57:57
│ │ └── 风月: 有的公司是按 代码行数 计算工作量,发奖金的。所以,谁TM敢用800行代码,替换我复制粘贴了大半年的几万行代码……老子跟他拼了![飙泪笑] 👍🏽0 💭N/A IP 🕐2020-05-29 07:19:42
│ │ └── 离别的拂晓: 哈哈,这个宏写Linux设备驱动经常用 👍🏽1 💭N/A IP 🕐2020-07-04 21:33:59
│ │ └── 小北: Linux Kernel里的基本操作[笑哭][笑哭] 👍🏽0 💭N/A IP 🕐2022-01-14 14:13:20
│ └── odin wu: grpc底层是google protobuf 👍🏽0 💭N/A IP 🕐2020-05-28 14:28:37
│ └── 扑尔敏: java的Unsafe类的compareAndSwap方法就是通过偏移量找到一个字段在某个实例的位置然后替换的,很多思想都是想通的(应该说是后面的借鉴前面的),就是offset+length 👍🏽0 💭N/A IP 🕐2022-03-11 10:24:28
四月天: JAVA可以直接将类转转为jason,C++也应该可以,然后逆变。 👍🏽3 💭N/A IP 🕐2020-05-28 00:18:51
│ └── 东方教主: 我同意json化,不同意楼主的搞法 👍🏽1 💭N/A IP 🕐2020-05-28 10:24:04
│ └── 知乎用户InSvzN: Jackson效率低,网络传输有时候追求效率 👍🏽0 💭N/A IP 🕐2020-05-28 11:44:42
│ └── UFO: 08年的工程界,xml才是标配 👍🏽0 💭N/A IP 🕐2020-05-28 12:11:43
Mingjing Xu: 老哥技术果然6,但是在设计这个系统的人,在系统当初是没有这么清晰的需求认识的。到你这里,需求已经非常清晰了。 👍🏽3 💭N/A IP 🕐2020-05-28 13:44:36
复生: 跪…… 👍🏽2 💭N/A IP 🕐2020-05-27 21:56:10
残风: 说句实话在我看来你那个算好的了,我一朋友遇到类似的问题,和你一样的方式去解决了,然后被排挤离职了[调皮] 👍🏽2 💭N/A IP 🕐2020-09-07 10:16:12
│ └── invalid s: 其实也不算糟。起码他离开了火坑,得到了另一次机会。 👍🏽3 💭N/A IP 🕐2020-09-07 10:40:16
│ └── 残风: 倒也是 👍🏽0 💭N/A IP 🕐2020-09-08 10:03:16
张木: 有的公司真是:考核代码量,考核BUG数量。。。 👍🏽2 💭N/A IP 🕐2020-05-28 10:23:25
吾將曳尾於塗中: 百万漕工衣食所系[捂脸] 👍🏽2 💭N/A IP 🕐2020-05-28 07:53:30
四十四: 好奇你为什么在这个公司待这么久? 👍🏽2 💭N/A IP 🕐2020-05-28 07:45:19
│ └── 晨曦: 没本事跳槽呗 👍🏽1 💭N/A IP 🕐2022-07-27 09:17:09
Ribes: 这是,面向巧合编程?[捂脸] 👍🏽2 💭N/A IP 🕐2020-05-28 06:06:27
│ └── 梭哈: 撞大运编程 👍🏽2 💭N/A IP 🕐2020-05-28 10:25:39
one-one: 为什么他们不弄个字典表呢?这样他的报文就可以简化了。NIO压力也降下来了。 👍🏽2 💭N/A IP 🕐2020-05-29 16:52:46
DsyDemo: 厉害,其实很多复杂的代码都可以用更高级的模式去简化,但他们钉子敲多了,根本没有设计。 👍🏽2 💭N/A IP 🕐2020-11-14 15:56:23
奥特曼饲养员: 没看懂 👍🏽1 💭N/A IP 🕐2020-05-28 10:44:36
│ └── jefferyi: 看不懂+1,我果然是外行 👍🏽0 💭N/A IP 🕐2020-09-09 17:28:43
愛沐: 养寇自重 👍🏽1 💭N/A IP 🕐2020-06-02 09:00:06
岚静初: 恭喜楼主为国家解决了4000人的就业问题[调皮] 👍🏽1 💭N/A IP 🕐2020-05-28 18:34:34
知乎用户ieiwTx: 见过1500个if else嵌套吗?( 👍🏽1 💭N/A IP 🕐2020-05-28 18:11:17
小鱼干: 这样不就没有KPI了[摊手] 👍🏽1 💭N/A IP 🕐2020-05-28 16:08:54
力争: 看看,编译错误,起码我的代码能编译,哈哈哈哈,笑死了 👍🏽1 💭N/A IP 🕐2020-05-28 13:33:46
戴上红帽子: 伟大的protobuf[捂脸] 👍🏽1 💭N/A IP 🕐2020-05-28 13:10:46
null: 干嘛做的那么好,做的太好会被抄,咱们得让产品能够慢慢迭(修)代(修)更(补)新(补),不然业绩怎么来呢[飙泪笑] 👍🏽1 💭N/A IP 🕐2020-05-28 12:20:56
知乎用户5OWYx7: 结构体会自动字节对齐会不会影响这个保报文解析啊。 👍🏽1 💭N/A IP 🕐2020-05-28 11:47:29
知乎用户Yhl78A: 大佬,学些什么内容能到看懂您吹逼的水平,又学到什么内容能和您一样吹逼啊,刚买了本C primer啃…… 👍🏽1 💭N/A IP 🕐2020-05-28 11:16:52
mingzi: 佩服你,果然是程序员的好苗子,但是我想问你,你是怎么做到,那么多技术,遇到问题能马上想到用哪种事最好的?真的不容易 👍🏽1 💭N/A IP 🕐2020-05-28 10:46:38
│ └── invalid s: 计算机专业有门必修课叫“数据结构与算法”,其中很大的一块内容叫“复杂度分析”。一个问题复杂度如何、它的规模和处理问题必需的步骤数大致是个什么关系、这个算法有没有多余的步骤、是不是已经达到了理论极限,这些都是可以分析的。事实上,任何学过算法与数据结构的,都不应该搞出复杂度级别上的问题——很丢人的。难分析的,是类似这两天韦易笑大佬搞的这个东西:https://zhuanlan.zhihu.com/p/144974312另一个叫软件工程。接口设计的依赖倒置原则,高扇入低扇出原则,高内聚低耦合原则,等等,这些都是这门课教的基本知识——甚至可以说是常识。不过,如果说算法方面,复杂度级别方面出问题很丢人的话;软件工程一塌糊涂,在国内反倒是……咳咳,很能在领导面前长脸的事。没错。管理水平低下,因此治未病看不出你的好;水平臭犯错多、经常无事生非,反倒在外行面前显得很敬业……当然,在合格的计算机专业人员面前,这种同样很丢人。我们已经学过相关知识了,这类错误本不该犯的——没错,正常来说,找出尽量好的方案是我们专业人员份内之事,搞砸了才丢人。但现在一群外行,只会鼓噪什么996、用加班感动自己、说服老板;反倒把“不动声色把问题解决于发生之前”的专业人员当成不积极不重要的落后分子…… 👍🏽3 💭N/A IP 🕐2020-06-01 20:20:48
蒋甬杭: 我用python从自定义的元数据上构建出了C++的打解包代码 👍🏽1 💭N/A IP 🕐2020-09-03 20:37:31
│ └── invalid s: 所以看到有人说数据结构与算法没用,俺真是惊诧莫名……尤其那些连一个leetcode链表算法都搞不定的……要搞这个打解包代码,别说链表了,树这种结构玩的滚瓜烂熟、随时随地随手根据实际需要撸出任何基于树结构的、书上没有讲过的实用性算法,这都是基本要求好吗。连这个都搞不定,他们还想搞protobuf?搞屎吧。 👍🏽3 💭N/A IP 🕐2020-09-03 21:05:16
│ └── 汉星云: 答主,我连热乎得屎都抢不到,跪求。我是学了一堆算法啊 可是一直用不上啊 能否给个明路,要怎么养成这种思维。 👍🏽0 💭N/A IP 🕐2020-09-09 07:23:16
│ │ └── invalid s: 不要学“算法本身”,学“算法的设计思路”。本科的数据结构与算法只是小学生入门课程,一定要掌握到烂熟。烂熟的意思是,提到具体的算法名字,你可以一脸茫然;但遇到需要动用类似思路才能解决的问题,你一定要手到擒来。比如,学了冒泡算法,这个算法本身你可以忘掉;但将来工作实践中遇到类似的、和某种物理过程相关/相似的需求,你可以马上自己设计一个类似算法出来——未必是冒泡,也可以是遗传、蚁群之类算法。再比如,学了快排,那么遇到任何可以分治的问题,你马上就要能想到“这个问题可以分成一个个小块逐一解决然后再合起来”。光这样还不够,还要马上想到“我可以估算出这个算法的复杂度,看看它和不分治相比是不是更快,值不值得写的这么麻烦”。换句话说,冒泡不是为了教你冒泡排序算法,而是教你为物理过程建模、教你基于日常所见的物理现象的数学原理,解决其他问题(比如模拟退火算法实际上和冒泡一脉相承);快排也不是为了教你快排,这个算法太简单也被实现太多次所以不需要你再写再记,而是为了教你分治这个设计思想……一整本算法书,看似教了一大堆东西;但归根结底都是这么几个思路。只掌握书上的算法,那自然是无用的;掌握了这几个思路,自然随时随地能拿出来用——模仿它们的思路本身就能帮你更高效的解决很多问题,更不要说推陈出新了。 👍🏽10 💭N/A IP 🕐2020-09-09 16:06:14
│ │ └── 汉星云: 谢谢答主 会一直关注您得 我继续练练 👍🏽0 💭N/A IP 🕐2020-09-09 16:30:13
│ │ └── 赵雅君: 我觉得还是得多做项目,尤其是有一定难度的中小规模项目(大项目没几个人做得了),然后就会遇到各种问题。他说的这种思路光看不练我觉得没戏。。。练的话leetcode他之所以说是基本,我觉得是因为leetcode及其简练,没有任何奇葩的需求,没有屎山,如果这么基本的东西练不下来,实际项目就会更吃力,因为leetcode实际上是帮你已经把实际的业务需求分解成代码层次的需求了,你实现就行了,而真正的困难是把现实问题建模成代码/数学问题。 👍🏽4 💭N/A IP 🕐2020-09-18 01:08:41
│ └── 学点知识: 不不不,你这已经是大成了,大多数可能连门都进不去,个体差异过大 👍🏽0 💭N/A IP 🕐2022-07-03 13:13:28
a布布: 话说到点子上 👍🏽1 💭N/A IP 🕐2020-05-28 08:43:22
海拉鲁编程客: 噫……人家把几百行的代码写成了几十万行,创造了多少人力的岗位?手动狗头[捂脸] 👍🏽1 💭N/A IP 🕐2020-05-28 08:03:55
taohongjie: 传输数据是个大麻烦,所以我用自己的序列化模块,开头日常增补,后面就省心了 👍🏽1 💭N/A IP 🕐2020-05-28 07:45:26
程哲: 有些公司考核制度是鼓励程序员加班和制造bug。 👍🏽1 💭N/A IP 🕐2020-05-28 07:40:27
Great Macro: 以完成需求然后代码量最小为考核怎么样? 👍🏽1 💭N/A IP 🕐2020-05-28 07:36:24
疯狂绅士: 感觉是亚信啥做的BOSS系统。那种报文真不是一般的烦。不过外围的的代码量还是少不了的。 👍🏽1 💭N/A IP 🕐2020-05-28 00:56:56
赵雅君: 求问如果我用json来写struct的scheme是否可行?然后我直接根据scheme来做转换,比如说scheme说是个20个byte的char数组,我就调用str2xml,等等。没写过类似的,可能是很愚蠢的想法。。。 👍🏽1 💭N/A IP 🕐2020-05-28 00:40:13
│ └── 云上比熊: 我觉得没问题,其实要是面向Web服务器,像这种报文数据归一化序列化问题也很少遇见了吧?答主这个看起来是用在移动通讯。 👍🏽1 💭N/A IP 🕐2020-06-02 10:23:07
│ └── 赵雅君: 的确。。。 👍🏽0 💭N/A IP 🕐2020-06-02 11:55:11
NecessaryChoices: 真的猛![赞] 👍🏽1 💭N/A IP 🕐2020-05-27 22:07:30
Carlo: 其实稍微及格一点的程序员都能找到更好的解决方案,但问题是他们没有去找,这才是问题 👍🏽1 💭N/A IP 🕐2020-12-02 16:23:53
│ └── 丫丫亚历克斯: 及格线是什么?4个月产出的码农及格吗?水平不够找也没思路 👍🏽1 💭N/A IP 🕐2020-12-16 21:08:38
战忽局华中局五号: [微笑] 👍🏽1 💭N/A IP 🕐2020-11-29 16:48:55
thawk: 难道当年就流行这么玩?我在07、08年左右也干过这样的事情,不过是用来测试。正式代码是用xml定义结构,推到客户端用引擎进行解析、转换,这样就不用升级客户端了。为了测试引擎的正确性就弄一个宏系统,自动生成正确结构的报文,随机填充合法数值进行比对测试。不得不说,用宏确实方便。 👍🏽1 💭N/A IP 🕐2020-11-26 14:19:30
│ └── 张超: 你这有点类似于自己写个浏览器,当然比浏览器少功能,有差别。 👍🏽0 💭N/A IP 🕐2021-09-26 16:52:02
电光火石: 暴躁老哥就是一个猛字,粉了 👍🏽1 💭N/A IP 🕐2020-11-17 16:30:27
差三岁: 说的相当对 👍🏽1 💭N/A IP 🕐2020-11-14 18:54:35
泡芙心: 厉害厉害,受教了。 👍🏽1 💭N/A IP 🕐2020-11-06 08:18:38
艾瑞: 太牛了 👍🏽1 💭N/A IP 🕐2020-11-04 02:25:33
知乎用户bLG604: 800行代码按照现在土鳖老板的开价方式,给你400块钱吧,400不行?那450. 👍🏽1 💭N/A IP 🕐2020-09-18 12:45:08
supersarah: “要知道,很多名校毕业生,写一两千行代码就得两三个月”太好混了吧[摊手] 👍🏽1 💭N/A IP 🕐2020-09-14 05:04:00
│ └── invalid s: 我有个国防科大还是哪里的同事,一个顶多两千行的简单程序写了近一年,bug还是层出不穷。 👍🏽1 💭N/A IP 🕐2020-09-19 12:08:52
│ └── supersarah: 这个倒是挺常见的… [摊手] 👍🏽0 💭N/A IP 🕐2020-09-20 20:12:24
│ └── supersarah: 问题是代码行数容易数,白薯都会代码的质量,那可真得有两把刷子才能评价呢[哈哈] 👍🏽2 💭N/A IP 🕐2020-09-20 20:14:09
│ └── 盛夏: 苕的学名,骂得好文雅[大笑] 👍🏽1 💭N/A IP 🕐2021-10-04 11:17:03
JennyVenus: 我知道不能传结构体,但我试过,都是MFC,也没事,我也知道有事怎么排除,既然没事,其他的手段我也没加。 👍🏽0 💭N/A IP 🕐2025-03-05 22:26:42
zhangqing: [思考]我一般梳理一下业务逻辑,就删了重写了。 👍🏽0 💭N/A IP 🕐2024-10-15 21:52:48
kitty19992000: 为什么要用XML 👍🏽0 💭N/A IP 🕐2025-05-22 15:42:30
bing: 回过头看,还是他们那种更能自保。 👍🏽0 💭N/A IP 🕐2025-05-18 10:47:39
Lewis: 你不知道很多公司是根据代码行数计算绩效的吗? 👍🏽0 💭N/A IP 🕐2025-04-27 02:40:00
水煮沉浮: 然后老板把你开了[捂脸] 👍🏽0 💭N/A IP 🕐2025-04-23 12:04:20
yuange: 如果可以使用RPC,基本上不用考虑数据怎么传输的报文问题,基本上直接像写函数一样。 👍🏽0 💭N/A IP 🕐2025-04-20 09:16:10
冰封神姬: 但是没工作量了,就没工作了 👍🏽0 💭N/A IP 🕐2025-04-12 23:21:49
呀哈哈: 怪不得我没加过班哈哈哈,刚毕业进一个好项目还是挺重要的。 👍🏽0 💭N/A IP 🕐2025-04-09 09:06:38
无路赛: 有没有一种可能,别人这么干纯粹是因为考核要看代码行数? 👍🏽0 💭N/A IP 🕐2025-04-05 09:41:16
知乎第一用户: 序列化不很简单嘛[捂脸] 👍🏽0 💭N/A IP 🕐2025-03-27 20:17:59
四月过去了: 这事我最近在做 👍🏽0 💭N/A IP 🕐2025-03-21 18:36:14
探索路途的程序猿: [捂脸]你领导是不是特别喜欢你?不然你怎么敢动这么大的东西的?这得动了多少人的蛋糕。。。 👍🏽0 💭N/A IP 🕐2025-03-19 12:53:22
小李今天不讲道理: 银行系统也这样 👍🏽0 💭N/A IP 🕐2025-03-19 08:40:22
lixin liu: 也没有办法 感觉我现在重读一遍计算机本科也不会有什么提升… 👍🏽0 💭N/A IP 🕐2023-06-13 05:41:14
frbf: 本质是领导屁都不懂 👍🏽0 💭N/A IP 🕐2025-03-14 09:14:46
赵高: 虽然这个话题久了点,但是要我说,除了不会的。就是不用心的,19年看一哥们编译,改一个参数休息两小时…然后我眼睁睁看着他写错了一个判定就直接编译了,然后他去吃午饭了…老子想跳脚,然后我问这里判断是不是反了?他看了一眼,是的…然后一天就白费了…所有人…公司一天成本的两万… 👍🏽0 💭N/A IP 🕐2023-08-01 15:42:57
bjyulq: 一劳永逸?凭答主这句话我都怀疑答主是否真得做过项目。代码是为项目服务的,就微软、谷歌那种级别的公司也不敢说一劳永逸。另外,在职场混,牛逼哄哄不是一件好事。就你那个 login数据结构,你敢说没有潜在问题?敢说一劳永逸?为安全起见,int型变量应放在char型前面。 👍🏽0 💭N/A IP 🕐2025-03-02 08:06:04
程序猿不爱格子衫: 看的时候觉得那几个写重复代码实在是没有程序员的基本素养,没有抽象能力或者说没有总结归纳的能力。看到你说报文问题,又写到xml,我就猜到这是历史很久远的事情了,至少pb是绝对没有的。 👍🏽0 💭N/A IP 🕐2025-02-20 20:46:07
冰冷的剑: 码农只会抄代码学渣只会抄作业 👍🏽0 💭N/A IP 🕐2023-09-24 14:36:32
肉山大魔王: 正常啦。 有的时候初始版本为了偷懒糊弄写写就过去了。 哪知道某些人偷懒到把整个接口内容都当文本赛到JSON里面去了呢。 👍🏽0 💭N/A IP 🕐2025-02-13 14:07:31
柴犬扶柯基: 与其说是计算机基础知识,不如说是用心,很多程序员计算机是很扎实的,纯粹是不用心,写代码就是糊弄,所以写出来的全是垃圾代码 👍🏽0 💭N/A IP 🕐2025-02-13 09:51:56
Helloworld gxwxk: 800行能替代二十万行代码?你用什么高级语言?它是汇编吗? 👍🏽0 💭N/A IP 🕐2025-02-12 18:45:09
包包包子: 我正在维护答主说的几万行代码的屎山。为什么我不去优化?1、首先,没答主那么夸张,数据协议解析部分仅站10%代码。2、每个接口都要重新测试后上线,工作量不小,无法跟我领导交代我干了啥。3、我懒。 👍🏽0 💭N/A IP 🕐2025-02-11 15:09:51
eddy: 中国写代码不是技术问题是政治问题,你觉得你写的规范就是好吗? 太年轻了孩纸。 👍🏽0 💭N/A IP 🕐2025-02-11 13:35:43
好日子还在后头呢: 搞网络的可能考虑TLV。 👍🏽0 💭N/A IP 🕐2025-02-10 16:28:59
vitamind3: 我也遇到过这种C++程序员,问他网络发送的报文格式,他发了个struct定义,说你把指针给send,咋这都不会[捂脸][捂脸] 👍🏽0 💭N/A IP 🕐2025-02-09 12:58:53
飞飞: 话说##不是标准C定义的宏中标识符连接符号吗,不是gcc扩展啊? 👍🏽0 💭N/A IP 🕐2025-01-24 21:11:41
飞飞: 嗯要是有这么大的贡献合同上也没写明白的话,可以给代码里偷偷塞个GPL许可() 👍🏽0 💭N/A IP 🕐2025-01-24 21:14:05
Ailurus: 膜拜大佬[赞][赞][赞] 👍🏽0 💭N/A IP 🕐2025-01-06 13:57:53
老吴不说话: 其实他们略动动脑子能做好的。不过他们的主观能动性已经彻底被干平了。他们被塑造成了一个巨大人工智能系统中的一行代码,按照一个节点结构既定的运算规则形成其他代码。你拿他们没办法的。他们是一个巨大机器的一部分,这个巨大机器虽然效率很低但是他的总体能力你是企及不到的。 👍🏽0 💭N/A IP 🕐2024-11-29 11:12:47
oatnau: 这种需求干嘛不用java?使用类定义结构体,然后序列化与反序列化进行传输接收,都是成熟并且测试完善的技术。 👍🏽0 💭N/A IP 🕐2024-11-17 20:22:51
一动解千愁: 跟基础知识没啥关系,我就算没学过算法,我看到这样的需求自然能够从中识别到冗余,稍微抽象一下也能搞个类似的方案。 纯粹就是不动脑筋,缺乏对质量的追求,只想着赶快完成眼前任务造成的 👍🏽0 💭N/A IP 🕐2024-11-13 16:38:40
董君: 我搞过很多重构,像你说的这种烂不是简单的程序员基础不过关能解释的,而主要是上层组织结构,需求管理,团队协作都存在大问题导致的 👍🏽0 💭N/A IP 🕐2024-10-31 11:22:38
Mao MD: xml有dtd file,你需要接受/传输的时候加一层validation layer。解析需要按照dtd来建立xpath。不然就会出现你说的情况,牵一发动全身。本质上xml和protobuf是同样的逻辑,都是plaintext来传输数据结构。我对于高速数据比如cpu-fpga都是用自定义binary传输。plaintext主要是给脚本语言和C语言交互的,更加兼容。因为脚本语言的ABI很难实现。 👍🏽0 💭N/A IP 🕐2024-10-24 19:47:04
六米前的水: 我在中古时期做程序员时候,是看着xml兴起的。xml其实解决的是怎么把分层数据进行网络传输,存储和解读的问题,通过定义规范又灵活的格式和结构,来把原来混乱的文本文件方式抛弃,能够传输类数据库结构的数据,并能兼容类实例的定义和数据,就已经很好了。excel和word从二进制变成xml,文件体积大大缩小。说明xml是有效的。但后期滥用,结构过于混乱复杂,反而成了阻碍。 👍🏽0 💭N/A IP 🕐2024-10-14 09:22:29
zhihujjjj: 你这种上真家伙的在知乎是少见的 `知乎一般都是卖课的多 👍🏽0 💭N/A IP 🕐2024-09-14 17:00:50
忽然间就很好: 其实这样的团队在商业公司挺吃的开的,不断有火,不断需要救火。 👍🏽0 💭N/A IP 🕐2024-08-27 16:37:11
神锋无影: 有实力的人就不会去这种公司 👍🏽0 💭N/A IP 🕐2024-08-28 02:14:38
lmy: 你这是没在一家公司长期待过,不清楚一个系统最初是什么样子,经过时间洗礼又变成了什么样子,所谓的屎山代码都不是一天两天形成的,亲身经历过一个功能,需求百变,连数据结构、操作逻辑都变,只能重写这个功能,但之前的代码又不敢删,因为他们可能会有一天要求用之前的那套操作逻辑,这些都是亲身经历过的,目前系统仍在运行中。最近刚又接到一个需求,要求把之前系统里各个业务负责人变更一下,只是因为他们换领导了,把之前的负责人换成新的领导,目前我还没同意更改[大哭] 👍🏽0 💭N/A IP 🕐2024-08-27 14:15:18
5G Sir: 好嘛,按代码行数算KPI,那你才写八百行,KPI不达标呀[doge] 👍🏽0 💭N/A IP 🕐2024-08-27 03:30:30
知乎用户OfINrV: 和有责任心的人合作最轻松,最烦只是赶快搞完就玩的。不是说快做完不好,一般有责任心的人写代码又好维护,效率又高。反而只想快点搞完的到最后堆成💩山,自己代码都不想维护了。 👍🏽0 💭N/A IP 🕐2024-08-24 16:03:21
成功研究: 答主说的很清楚,条理清晰,文字准确。就冲这个,绝对是对方的锅。 👍🏽0 💭N/A IP 🕐2024-08-12 12:16:02
Nitre: 然后就被优化了 👍🏽0 💭N/A IP 🕐2024-08-05 03:02:29
乔捷: 不就是个序列化问题么,用json比用xml好100倍,也不至于把代码变成屎山了。 👍🏽0 💭N/A IP 🕐2024-07-26 17:18:18
│ └── fresh: 可不嘛,现在一千块的手机,都比08年上万的手机智能,后视镜谁都会看 👍🏽0 💭N/A IP 🕐2024-09-17 09:50:58
项伯羽: 程序方面你说的非常对,如果是自己创业确实要这样。但是工作的话,活是干不完的,你优化的很nice,之后还有其他的活过来。你的优化优化了别人大部分的工作量。如果是自己唯一负责的模块,减少的纯是自己的工作量,确实可以如此,方便的是自己[捂脸][捂脸] 👍🏽0 💭N/A IP 🕐2024-06-29 10:13:02
│ └── fresh: 和我最近感受很一样。就是看不上的东西,心里重构一个版本就ok了(假装给自己做的产品),和人提建议有时候不够情绪消耗的。有人认知不到位,建议了也只觉得你多管闲事或者一脸狐疑,宁愿相信百度和网上的乱七八糟文章 👍🏽0 💭N/A IP 🕐2024-09-17 09:56:45