问题

那些编程水平很高的程序员是怎么训练出来的?

回答
想知道那些让人望尘莫及的高手,是怎么修炼出来的?这可不是一蹴而就的事,更像是打磨玉石,需要时间、耐心,还有点“傻劲儿”。我认识不少这样的大神,他们身上总有一些共通的特质,我试着把他们练就一身“绝世武功”的门道,给你掰扯掰扯。

1. 不止是“写代码”,更是“理解代码”:

这帮人,你让他们写个功能,那肯定是信手拈来,效率惊人。但他们的厉害之处在于,他们不只是知道怎么写,而是深入理解代码的每一个字、每一行,甚至每一个标点符号到底在干嘛。

扒代码是家常便饭: 遇到一个棘手的问题,或者看到一段别人写得特别精妙的代码,他们不会止步于“能跑就行”。他们会像侦探一样,一层一层地剥开,看它怎么工作。开源项目是他们最好的“解剖台”,读源码读到停不下来。他们会在各种上下文里看同一段代码,比如在本地环境跑,在调试器里单步跟踪,甚至能去查对应的库的官方文档,看那些“官方解释”。
“为什么”是他们的口头禅: 遇到一个bug,他们不会急着去改,而是先问“为什么会出现这个bug?”。是因为我的逻辑错了?还是底层库的问题?或者是编译器优化导致的?他们会深入到操作系统的层面,去理解内存分配、线程调度,甚至是CPU的缓存机制。这种刨根问底的精神,让他们能解决那些其他人束手无策的难题。
设计模式是工具箱,不是摆设: 他们对各种设计模式了如指掌,而且能根据实际情况,灵活运用,而不是生搬硬套。他们能一眼看出某个设计模式在这里是不是最合适的,或者能不能通过组合使用来达到更好的效果。这让他们写的代码,既稳定又易于扩展。

2. 深入的理论基础,是他们的“内功心法”:

光会写代码,只能算“花拳绣腿”。真正的高手,都有扎实的理论功底,就像武侠小说里的内功心法,让他们施展起招式来,事半功倍。

数据结构和算法是“基本功”: 这个不用多说了,但他们是真的把这些东西吃透了。不是背会时间复杂度,而是理解为什么一个算法是O(n),另一个是O(logn),以及在什么场景下用什么数据结构,能带来质的飞跃。他们能根据问题,自己设计出高效的算法。
操作系统、计算机网络、编译原理……这些“冷门”学科,他们一样门清: 很多程序员觉得这些东西离实际开发很远,但高手们知道,这些才是支撑起整个软件世界的基石。了解操作系统如何管理进程和内存,能帮助他们写出更安全、更高效的代码。理解网络协议,让他们写出来的分布式系统更可靠。甚至知道编译器的优化策略,能帮助他们写出“机器更喜欢”的代码。
数学,尤其是离散数学和线性代数,是他们的“内力”: 很多算法和数据结构,背后都有深刻的数学原理。比如图论、概率论、线性代数,这些都能帮助他们更深入地理解问题的本质,并找到最优解。

3. 持续的学习和实践,是他们“永不停止的修炼”:

编程这东西,技术更新换代太快了,高手们深知这一点。他们从不认为自己已经“毕业”了,学习是他们生命的一部分。

对新技术的“嗅觉”敏锐,但不过度追新: 他们会关注业界最新的技术趋势,但不会盲目跟风。他们会去评估新技术是否真的能解决实际问题,是否适合自己的项目。他们会花时间去研究,去尝试,而不是人云亦云。
“解决问题”是他们最原始的驱动力: 很多时候,他们开始深入研究一个东西,不是因为“流行”,而是因为遇到了一个自己解决不了的难题,或者觉得现有的方案不够好。为了解决这个问题,他们会主动去学习相关的技术,去翻阅资料,去请教别人。
刻意练习,精益求精: 他们不是简单地重复劳动,而是有意识地去提升自己的技能。比如,他们会给自己设定一些挑战,写一些小工具,解决一些有趣的问题,或者在开源社区贡献代码。他们会一遍遍地重构自己的代码,让它更简洁、更高效、更易读。

4. 良好的工程素养,是他们“武德”:

写出能跑的代码是基本,写出易于维护、可读性强、健壮可靠的代码,才是高手的境界。

代码质量高于一切: 他们注重代码的可读性,会写清晰的注释,有良好的命名习惯,遵循编码规范。他们相信,优秀的代码是程序员的“名片”。
测试是标配,不是选配: 单元测试、集成测试、端到端测试……他们会用各种测试手段来保证代码的质量。他们不害怕写测试,反而觉得测试能让他们更安心地进行重构和迭代。
工程化思维: 他们会考虑整个开发流程,包括版本控制、持续集成/持续部署(CI/CD)、项目管理等。他们明白,技术只是工具,最终目的是交付高质量的产品。

5. 抽象能力和系统思考,是他们的“格局”:

能看到事物的本质,并且能从宏观的角度去思考问题,这是区分顶尖 programmer 和普通 programmer 的一个关键点。

化繁为简的能力: 面对复杂的需求和庞大的系统,他们能从中提炼出核心的逻辑,并用最简洁的方式表达出来。他们能将复杂的问题分解成更小、更易于管理的部分。
系统性思考: 他们会考虑一个功能的改动对整个系统的影响,他们会思考如何设计一个系统,才能让它在未来能够灵活地扩展和维护。他们能看到代码之下的“大局”。

总而言之,成为一个编程水平很高的程序员,就像是在攀登一座高峰。

基础的地基要牢固: 算法、数据结构、理论知识,这些是让你不至于“地动山摇”的根基。
勤奋是攀登的动力: 持续的学习、大量的实践、解决问题的驱动力,这是让你不断前进的燃料。
悟性是关键的“临门一脚”: 理解代码的本质、抽象的能力、系统性的思考,这些是让你从“熟练工”变成“艺术家”的升华。
工程素养是“安全带”: 保证你攀登的过程中不犯大错误,让你的成果更可靠。

这过程中,没有人能给你一个“秘籍”,告诉你就这么练,就能马上变强。他们都是在一次次的尝试、一次次的失败、一次次的总结中,慢慢打磨出来的。如果你真的想往这个方向努力,那就先把“为什么”弄明白,把“怎么写”变成“为什么这么写”,然后,就闷头往前冲吧,别怕摔跤,每一次摔跤,都是一次学习的机会。

网友意见

user avatar

我最近两年都在做内存分配库的优化,已经比google tcmalloc 快了一个数量级,大约4万行源码,应该算比较优秀的程序员了。

水平暴涨,是从某天发现chinaunix c++论坛版主有一个微线程或者协程的架构的开源库,当时std库和腾讯等公司的同类库都没有开源,读完了源码和测试代码后,突然发现c++代码原来可以这样写,std库里面从来就没有这样的方案,彻底打破了对传统c++体系的崇拜。原来大厂技术高管的c++水平这么高,代码性能如此高,大约比同类场景下的普通程序员的代码快4倍,思考的是如何做一个框架,用通用高性能的方案解决某一类技术问题,从整个体系的角度来降低编程的难度,提升整个体系的性能和效率。一次编程处处可用,框架里面附带了一些常用库,优点就是一次解决bug终身解决bug, 也不用求人改库bug。

之前都白学了,之前以为熟练掌握std库的用法就是优秀的程序员。彻底放弃对熟练掌握c++语言的追求,放弃熟练掌握c++ std库的追求,彻底摆脱对std库的崇拜,有的语言装B成了一种宗教了。

开始用体系的角度思考源码,开始重构整个高性能的编程体系和库体系,将分散的技术方案整合起来,形成一个标准的随时可用的c++库,陆续在工作中,把用到的std库全部重写了一遍,发现很多函数都是60/70年代的旧技术方案,例如std string find函数,最近几十年有很多种新算法出现,最优秀的是 two way算法,于是就使用了two way算法。发现只要按照最新的技术方案重写一遍,基本上耗时最大的几个函数都是N倍的提升,于是决定在高性能c++领域发展下去,陆续把各个常用std库都写完了。日常有看到某个优秀的新算法的介绍,就加入自己的库中,陆续积累了近十多万行源码的库,很多算法都比较新,包括多线程 wait free 框架等。

摆脱对c++语言 和 std 库的盲目崇拜后,就再也没有困惑了,就不关心语言本身了,语言只是工具而已,不关心c++的某个奇怪的写法了,主要的关注点都是如何彻底解决某一类编程问题,解决后将最优的方案保存到自己的c++库中,保持随时可用的状态,代码都用最直白最易懂的方式写,最好能够被人和机器都直白的理解,完全不玩那些过多的花样了。写完了std库的常用组件后就有很多经验值了(每个组件就几百到几千行源码,慢慢就写完了),由于对性能对质量有追求,反复的优化,实践出真知,很快就能积累一堆的技巧,这些技巧在书本上是没有的,很多就是经验,刷了很多高性能的经验值。

终于技术水平的积累已经很高了,工作中某个产品比对标的某上市公司有数量级的性能优势。某一天觉得内存分配库可以优化,动手去做后,刚写完第一个版本就比 google tcmalloc 库快了大约一倍,这个库是世界级大牛的杰作,于是感觉这块有潜力可挖,继续优化三个月后已经有一个数量级的性能提升了,准备把代码写到极限,又继续优化就想看一下真正的极限到底在哪里,又是什么样的代码。只要摆脱对c++语言std库的束缚,相信编译器,各种手段一起上,反复思考每一部分的最优解,反复重写代码,留下最优解,期间陆续写或者修改过大约20万行源码,留存4万行有效代码,在工程中学习,在实践中学习,反复测试和修改源码,让项目本身成为学校,让代码成为教材,让每次修改后的最优结果成为老师,就可以快速成长。

陆续实现了各个子方向的最优解,例如 平均1ns 开销的 thread local 算法;平均1ns开销的 jump 表跳到不同的执行函数,用于处理不同大小的内存申请;平均 2.6ns 开销的bitmap pool算法;平均几ns开销的 push / pop 多生产者/多消费者 wait free queue, 用于处理跨线程的内存释放。很多新算法都是工程实践的结果,不是刻意为之,保持开放的心态,以实事求是的态度对待江湖中的每一种说法,用代码去验证,不盲从不盲信,在实践中检验,这块实验田终于开花结果,解决了很多困扰多年的想法,验证了很多种高并发的技术模型,也在实践中证明了 wait free 无锁无等待的算法是可以实现的且非常稳定可靠,更加清晰的理解了多线程极高并发下遇到的问题,理解了实质是要解决什么问题。

在两年的实践中做过大量的测试,发现某个声称要代替c++语言的新语言的思路是错误的方向,技术原型上就是错误的,那个语言的基础库里面也有多线程bug,多线程bug的特点是: 如果代码足够快问题就会暴露,如果代码足够慢就没有问题。有的人对多线程极高并发会遇到的问题实质本身是什么完全没有理解,把锅全部甩到程序员身上,企图让大家把多线程的问题理解为只是普通程序员的锅,换个限制多的语言就解决问题了,其实就那些垃圾库根本解决不了多线程极高并发下的稳定性问题,这个问题是一个体系的问题。一堆不太懂多线程的人弄了一个号称能够解决全部多线程问题的语言,一个实验性质的语言。如果真的懂多线程,明白多线程高并发下遇到的问题的实质,就会轻松实现平均开销只有几ns的多生产者/多消费者 wait free 无锁无等待队列(实质是平淡无奇的代码),也会非常容易的理解和解决各种多线程bug。实在看不过去某语言的夸大宣传,让大家付出代价去学,学一个实质上解决不了多线程高并发问题的语言。

总之就是 多实践多写代码,不盲从不轻信,有独立的思考,刷了足够的经验值了以后,就可以成为高手。

以上


========================================================================

附录: 由于内存分配库性能过高,为了避免被人误会,下面给出了详细说明。

内存分配库 目前有开放二进制so文件,测试源码,用户手册(最新大约52页,详细介绍了整体设计方案和思路,以及很多的其它内存库没有考虑过的黑科技)下载,下载链接见后。

下面这篇大约50页,写于今年年初



这篇是核心代码刚完成时的简介,两三页,写于去年年初



测试的性能情况如下,单位均为ns, 下面是性能测试截屏。

内存分配库so文件和性能测试源码 在下列地址下载


类似的话题

  • 回答
    想知道那些让人望尘莫及的高手,是怎么修炼出来的?这可不是一蹴而就的事,更像是打磨玉石,需要时间、耐心,还有点“傻劲儿”。我认识不少这样的大神,他们身上总有一些共通的特质,我试着把他们练就一身“绝世武功”的门道,给你掰扯掰扯。1. 不止是“写代码”,更是“理解代码”:这帮人,你让他们写个功能,那肯定是.............
  • 回答
    哈哈,这是一个非常有趣的问题,也道出了很多初学者对编程大佬的误解! 答案是:不,大部分编程大佬的代码也记不住,更别说不用查百度就能“啪啪啪”打出来。事实上,这个“啪啪啪”的速度和流畅度,并非来自大脑记忆力的超凡,而是源于 经验、理解、工具和习惯的综合作用。下面我将详细地为你解释:一、 为什么编程大佬.............
  • 回答
    It's a perfectly valid concern. When you're crafting code, especially in languages like Python, Java, or C++, you're often thinking about clear, descr.............
  • 回答
    这是一个非常有趣且富有想象力的问题!如果计算机和编程语言都是由中国人发明,那么编程时写代码很可能会包含大量的中文元素,但“全中文”的程度则会受多种因素影响,无法一概而论。我们可以从以下几个方面来详细探讨:1. 编程语言设计的哲学和文化影响: 汉字作为核心元素: 考虑到中华文化对文字和象形符号的重.............
  • 回答
    编程之所以没能发展出“大众一学就会”的计算机语言,并非是技术上的不可能,而更多地是由于目标受众、学习曲线、实际需求以及语言设计的内在权衡所决定的。想让每个人都能轻松掌握编程,这背后涉及的考量非常多,绝非简单地“让它更容易”就能解决的问题。首先,我们来聊聊“为什么编程会让人觉得难”。想象一下学开车。你.............
  • 回答
    数学系之所以有大量的编程课程任务,这背后有着深刻的原因,与数学学科本身的性质、发展趋势以及数学在现代社会中的应用紧密相连。下面我将从几个主要方面进行详细阐述:1. 数学理论的计算与验证: 理论的抽象性与计算的具象性: 数学理论往往是高度抽象的,例如微积分、线性代数、微分方程等。虽然这些理论有严谨.............
  • 回答
    俄罗斯程序员在编程领域表现出色的现象,确实值得深入探讨。这一现象并非偶然,而是由多方面因素共同作用的结果。以下从历史、文化、教育、技术生态等角度进行详细分析: 1. 教育体系:数学与逻辑的根基俄罗斯的高等教育体系以严谨的数学和逻辑训练著称,这为编程能力奠定了坚实基础: 数学基础扎实:俄罗斯的大学(如.............
  • 回答
    漫画平台的编辑们,听起来是个神秘又光鲜的职业,但实际上,他们每天的工作内容可不是简单地“读读漫画”这么轻松。你可以把他们想象成漫画作品的“总设计师”和“保姆”,从一个想法变成读者手中的一本本精彩漫画,背后凝结了编辑们无数的心血。咱们就来掰开了揉碎了说说,漫画平台的编辑们,他们整天到底在忙些啥。一、 .............
  • 回答
    在俄罗斯和乌克兰战争期间,一些人编段子、开玩笑甚至为战争叫好的行为,往往反映了复杂的社会心理、文化背景和信息环境。以下从多个角度详细分析这些人的心理动因: 1. 政治认同与民族主义心理 国家利益的优先性:在极端民族主义或沙文主义的背景下,部分人将战争视为国家利益的捍卫。例如,俄罗斯民众中存在“保卫家.............
  • 回答
    乾隆皇帝下令编纂《贰臣传》,其初衷是在维护大清王朝正统性、彰显统治合法性,同时警示后人勿忘“前朝旧怨”。然而,这项带有强烈政治色彩的文化工程,无疑会对被编纂者后代的心理造成复杂而深远的影响,具体感受可以从以下几个方面详细展开:一、 深深的屈辱感和历史罪人的后代标签: 身份认同的撕裂: 被冠以“贰.............
  • 回答
    关于C++能否以及在多大程度上替代C语言进行单片机编程,这确实是一个值得深入探讨的问题。就像过去汇编语言向C语言的迁移一样,技术的发展总是在不断演进,而C++的出现,也为单片机编程带来了新的可能性和一些挑战。首先,我们需要理解为什么C语言在单片机领域如此根深蒂固。单片机,顾名思义,就是集成了微处理器.............
  • 回答
    在镜头聚焦于他们之前,那些如今闪耀的名字,如你我一样,也曾是芸芸众生中的一员,怀揣着梦想,在寂寂无名中摸索前行。他们的成名前岁月,是一部充满艰辛、坚持与不懈的奋斗史,远比镁光灯下的光鲜要漫长和真实得多。导演篇:从车库到奥斯卡殿堂想象一下,史蒂文·斯皮尔伯格,这位日后定义了好莱坞科幻与冒险的巨匠,在少.............
  • 回答
    你这篇《暴裂无声》的影评,作为编导初学者的第一篇,我得说,有几处地方确实挺让人眼前一亮的,尤其是你对画面和声音的处理那部分的描述,能感受到你下了心思去琢磨。不过,咱们也得实话实说,新手嘛,总会有一些成长空间,我帮你掰扯掰扯,看看哪些地方可以再打磨打磨,让它更抓人,更有你自己的味道。1. 观影体验的“.............
  • 回答
    乐器演奏能够通过编程实现,这确实是一个令人兴奋的技术进步。然而,这并不意味着人类学习乐器的意义就此消失。恰恰相反,我认为编程实现的音乐演奏,反而更能凸显出人类学习和演奏乐器的独特价值和深层意义。首先,我们得明确,编程演奏和人演奏的本质区别在于“意图”和“情感的传达”。编程演奏,本质上是对既定指令的执.............
  • 回答
    想亲手敲打出自己的编译器,这绝对是个值得挑战的目标!除了《编译原理》这本“圣经”之外,还有很多宝贵的资源可以助你一臂之力。下面我给你扒一扒,并且一步步告诉你该怎么下手,目标是用 C/C++ 来实现。 除了《编译原理》,你还需要什么“兵器”?《编译原理》虽然是基础,但它更多的是告诉你“为什么”和“是什.............
  • 回答
    多核和分布式编程环境的出现,使得传统的单线程、顺序执行的编程范式逐渐无法满足现代计算的需求。并发编程语言的诞生,本质上是对传统编程范式的根本性重构,其核心差异体现在以下几个方面: 一、执行模型的差异 1. 传统编程语言(单线程顺序执行) 执行模式:程序按代码顺序执行,所有操作在单一线程中完成。 资源.............
  • 回答
    您好!看到您孩子是2021届的编导生,河南文科,统考分数147,文化分400分左右,并且没有校考。首先恭喜您的孩子顺利完成了编导专业统考!接下来,我们来详细分析一下,以他目前的情况,能够报考哪些院校。分析核心要素: 统考分数(147分): 这是一个关键的分数,需要参考当年河南编导类统考的合格线和.............
  • 回答
    嘿!老乡,同是河南考生,我理解你现在的心情,艺考这条路,尤其是编导和摄影摄像,确实需要好好准备。别担心,我给你唠唠,把我知道的都说出来,保证是掏心窝子的话,没有任何AI痕迹!首先,明确目标院校和专业要求!这一点是重中之重,你不能盲目准备。河南考生艺考的选择范围挺广的,但每个学校对摄影摄像专业的侧重点.............
  • 回答
    你这个问题问到点子上了!很多初学者刚接触单片机,比如STM32,都会纠结于“裸奔”和“RTOS”之间的选择,觉得RTOS听起来很厉害,但又不知道具体好在哪儿,是不是真的比直接写代码(也就是你说的“裸奔”或“裸跑”)要强一大截。这么说吧,不是“有没有”优势,而是“有多大”优势,而且这个优势是需要具体场.............
  • 回答
    我懂你的疑惑,真的太懂了。看着屏幕上那些让人脚趾抠地的尴尬,脑子里总会冒出同一个声音:“这是怎么想出来的?” 仿佛导演、编剧是外星来的,完全不接地气,或者根本不在乎观众的感受。其实,事情可能比我们想象的要复杂一些,也讽刺一些。并不是所有拍烂片的人都心安理得地在制作“垃圾”。很多时候,那些显而易见的“.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有